@mlightcad/cad-simple-viewer-cli 1.7.6 → 1.7.7-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,1564 +0,0 @@
1
- import{G as Lr,a as Ir,E as At,h as k,x as Q,F as S,H as Er,I as Ur,b as $,J as Nr,r as Te,K as Dr,L as Xt,S as Tr,N as Or,O as Oe,P as jr,Q as je,R as _r,U as C,V as $r,W as Rr,X as Hr,i as Vr,Y as Xr,Z as Pa,_ as Yr,$ as Gr,a0 as Sa,a1 as Wr,a2 as Kr,a3 as Jr,a4 as Zr,a5 as qr,a6 as Qr,a7 as tn,a8 as de,a9 as en,aa as an,ab as rn,ac as nn,ad as on,ae as sn,af as ln,ag as cn,ah as dn,ai as un,aj as mn,ak as pn,al as hn,am as fn,an as gn,ao as bn,ap as wn,aq as xn,ar as yn,as as vn,at as kn,au as lt,av as La,aw as An,ax as ue,p as Mn,ay as Fn,az as Cn,aA as zn}from"./index-mwPW-JP3.js";import{aB as ol,aC as sl}from"./index-mwPW-JP3.js";function me(...t){return`<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 1024 1024">${t.map(a=>`<path fill="currentColor" d="${a}"/>`).join("")}</svg>`}me("M624 475.968V640h144a128 128 0 0 1 128 128H128a128 128 0 0 1 128-128h144V475.968a192 192 0 1 1 224 0M128 896v-64h768v64z");me("M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352m0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288m0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448m0 64a160.19 160.19 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160");me("M876.8 156.8c0-9.6-3.2-16-9.6-22.4s-12.8-9.6-22.4-9.6-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176S0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4s3.2 16 9.6 22.4 12.8 9.6 22.4 9.6 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4m-646.4 528Q115.2 579.2 76.8 512q43.2-72 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4m140.8-96Q352 555.2 352 512c0-44.8 16-83.2 48-112s67.2-48 112-48c28.8 0 54.4 6.4 73.6 19.2zM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6q-43.2 72-153.6 172.8c-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176S1024 528 1024 512s-48.001-73.6-134.401-176","M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112s-67.2 48-112 48");const Bn='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" aria-hidden="true"><path fill="currentColor" d="M10 13.5 14.5 9h-9L10 13.5Z"/></svg>',Pn='<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 20 20"><path fill="currentColor" d="M10.09 3.53 16.09 6.97 10.09 10.29 4.18 7 10.09 3.56M10.09 2.4 2.17 7 3.31 7.65 10.09 11.45 17 7.62 18.17 7 10.08 2.37 10.09 2.4Z"/><path fill="currentColor" d="M10.25 14.83 18.17 10.22 17 9.57 10.22 13.57 3.32 9.59 2.17 10.22 10.25 14.83Z"/><path fill="currentColor" d="M10.25 17.63 18.17 13 17 12.37 10.22 16.37 3.32 12.38 2.17 13 10.25 17.63Z"/></svg>',Sn='<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 20 20"><path fill="currentColor" d="M10.09 5.15 16.09 8.59 10.09 11.91 4.18 8.59 10.09 5.15ZM10.09 4 2.17 8.61 3.31 9.25 10.09 13.06 17 9.24 18.16 8.61 10.08 4 10.09 4Z"/><path fill="currentColor" d="M10.25 16.46 18.17 11.85 17 11.2 10.22 15.2 3.32 11.21 2.17 11.85 10.25 16.46Z"/><path fill="none" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" d="M3.5 3.5 16.5 16.5"/></svg>',X=4;var U=Uint8Array,T=Uint16Array,pe=Int32Array,he=new U([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),fe=new U([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),_e=new U([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ia=function(t,e){for(var a=new T(31),r=0;r<31;++r)a[r]=e+=1<<t[r-1];for(var n=new pe(a[30]),r=1;r<30;++r)for(var i=a[r];i<a[r+1];++i)n[i]=i-a[r]<<5|r;return{b:a,r:n}},Ea=Ia(he,2),Ln=Ea.b,Jt=Ea.r;Ln[28]=258,Jt[258]=28;var In=Ia(fe,0),$e=In.r,Zt=new T(32768);for(var M=0;M<32768;++M){var W=(M&43690)>>1|(M&21845)<<1;W=(W&52428)>>2|(W&13107)<<2,W=(W&61680)>>4|(W&3855)<<4,Zt[M]=((W&65280)>>8|(W&255)<<8)>>1}var gt=(function(t,e,a){for(var r=t.length,n=0,i=new T(e);n<r;++n)t[n]&&++i[t[n]-1];var o=new T(e);for(n=1;n<e;++n)o[n]=o[n-1]+i[n-1]<<1;var s;if(a){s=new T(1<<e);var l=15-e;for(n=0;n<r;++n)if(t[n])for(var c=n<<4|t[n],d=e-t[n],u=o[t[n]-1]++<<d,p=u|(1<<d)-1;u<=p;++u)s[Zt[u]>>l]=c}else for(s=new T(r),n=0;n<r;++n)t[n]&&(s[n]=Zt[o[t[n]-1]++]>>15-t[n]);return s}),tt=new U(288);for(var M=0;M<144;++M)tt[M]=8;for(var M=144;M<256;++M)tt[M]=9;for(var M=256;M<280;++M)tt[M]=7;for(var M=280;M<288;++M)tt[M]=8;var zt=new U(32);for(var M=0;M<32;++M)zt[M]=5;var En=gt(tt,9,0),Un=gt(zt,5,0),Ua=function(t){return(t+7)/8|0},Na=function(t,e,a){return(a==null||a>t.length)&&(a=t.length),new U(t.subarray(e,a))},Nn=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],Nt=function(t,e,a){var r=new Error(e||Nn[t]);if(r.code=t,Error.captureStackTrace&&Error.captureStackTrace(r,Nt),!a)throw r;return r},Y=function(t,e,a){a<<=e&7;var r=e/8|0;t[r]|=a,t[r+1]|=a>>8},mt=function(t,e,a){a<<=e&7;var r=e/8|0;t[r]|=a,t[r+1]|=a>>8,t[r+2]|=a>>16},Yt=function(t,e){for(var a=[],r=0;r<t.length;++r)t[r]&&a.push({s:r,f:t[r]});var n=a.length,i=a.slice();if(!n)return{t:Ta,l:0};if(n==1){var o=new U(a[0].s+1);return o[a[0].s]=1,{t:o,l:1}}a.sort(function(B,z){return B.f-z.f}),a.push({s:-1,f:25001});var s=a[0],l=a[1],c=0,d=1,u=2;for(a[0]={s:-1,f:s.f+l.f,l:s,r:l};d!=n-1;)s=a[a[c].f<a[u].f?c++:u++],l=a[c!=d&&a[c].f<a[u].f?c++:u++],a[d++]={s:-1,f:s.f+l.f,l:s,r:l};for(var p=i[0].s,r=1;r<n;++r)i[r].s>p&&(p=i[r].s);var m=new T(p+1),h=qt(a[d-1],m,0);if(h>e){var r=0,f=0,g=h-e,w=1<<g;for(i.sort(function(z,F){return m[F.s]-m[z.s]||z.f-F.f});r<n;++r){var b=i[r].s;if(m[b]>e)f+=w-(1<<h-m[b]),m[b]=e;else break}for(f>>=g;f>0;){var A=i[r].s;m[A]<e?f-=1<<e-m[A]++-1:++r}for(;r>=0&&f;--r){var x=i[r].s;m[x]==e&&(--m[x],++f)}h=e}return{t:new U(m),l:h}},qt=function(t,e,a){return t.s==-1?Math.max(qt(t.l,e,a+1),qt(t.r,e,a+1)):e[t.s]=a},Re=function(t){for(var e=t.length;e&&!t[--e];);for(var a=new T(++e),r=0,n=t[0],i=1,o=function(l){a[r++]=l},s=1;s<=e;++s)if(t[s]==n&&s!=e)++i;else{if(!n&&i>2){for(;i>138;i-=138)o(32754);i>2&&(o(i>10?i-11<<5|28690:i-3<<5|12305),i=0)}else if(i>3){for(o(n),--i;i>6;i-=6)o(8304);i>2&&(o(i-3<<5|8208),i=0)}for(;i--;)o(n);i=1,n=t[s]}return{c:a.subarray(0,r),n:e}},pt=function(t,e){for(var a=0,r=0;r<e.length;++r)a+=t[r]*e[r];return a},Da=function(t,e,a){var r=a.length,n=Ua(e+2);t[n]=r&255,t[n+1]=r>>8,t[n+2]=t[n]^255,t[n+3]=t[n+1]^255;for(var i=0;i<r;++i)t[n+i+4]=a[i];return(n+4+r)*8},He=function(t,e,a,r,n,i,o,s,l,c,d){Y(e,d++,a),++n[256];for(var u=Yt(n,15),p=u.t,m=u.l,h=Yt(i,15),f=h.t,g=h.l,w=Re(p),b=w.c,A=w.n,x=Re(f),B=x.c,z=x.n,F=new T(19),y=0;y<b.length;++y)++F[b[y]&31];for(var y=0;y<B.length;++y)++F[B[y]&31];for(var v=Yt(F,7),N=v.t,rt=v.l,D=19;D>4&&!N[_e[D-1]];--D);var nt=c+5<<3,O=pt(n,tt)+pt(i,zt)+o,j=pt(n,p)+pt(i,f)+o+14+3*D+pt(F,N)+2*F[16]+3*F[17]+7*F[18];if(l>=0&&nt<=O&&nt<=j)return Da(e,d,t.subarray(l,l+c));var R,I,_,G;if(Y(e,d,1+(j<O)),d+=2,j<O){R=gt(p,m,0),I=p,_=gt(f,g,0),G=f;var $t=gt(N,rt,0);Y(e,d,A-257),Y(e,d+5,z-1),Y(e,d+10,D-4),d+=14;for(var y=0;y<D;++y)Y(e,d+3*y,N[_e[y]]);d+=3*D;for(var H=[b,B],ut=0;ut<2;++ut)for(var it=H[ut],y=0;y<it.length;++y){var V=it[y]&31;Y(e,d,$t[V]),d+=N[V],V>15&&(Y(e,d,it[y]>>5&127),d+=it[y]>>12)}}else R=En,I=tt,_=Un,G=zt;for(var y=0;y<s;++y){var E=r[y];if(E>255){var V=E>>18&31;mt(e,d,R[V+257]),d+=I[V+257],V>7&&(Y(e,d,E>>23&31),d+=he[V]);var ot=E&31;mt(e,d,_[ot]),d+=G[ot],ot>3&&(mt(e,d,E>>5&8191),d+=fe[ot])}else mt(e,d,R[E]),d+=I[E]}return mt(e,d,R[256]),d+I[256]},Dn=new pe([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Ta=new U(0),Tn=function(t,e,a,r,n,i){var o=i.z||t.length,s=new U(r+o+5*(1+Math.ceil(o/7e3))+n),l=s.subarray(r,s.length-n),c=i.l,d=(i.r||0)&7;if(e){d&&(l[0]=i.r>>3);for(var u=Dn[e-1],p=u>>13,m=u&8191,h=(1<<a)-1,f=i.p||new T(32768),g=i.h||new T(h+1),w=Math.ceil(a/3),b=2*w,A=function(Vt){return(t[Vt]^t[Vt+1]<<w^t[Vt+2]<<b)&h},x=new pe(25e3),B=new T(288),z=new T(32),F=0,y=0,v=i.i||0,N=0,rt=i.w||0,D=0;v+2<o;++v){var nt=A(v),O=v&32767,j=g[nt];if(f[O]=j,g[nt]=O,rt<=v){var R=o-v;if((F>7e3||N>24576)&&(R>423||!c)){d=He(t,l,0,x,B,z,y,N,D,v-D,d),N=F=y=0,D=v;for(var I=0;I<286;++I)B[I]=0;for(var I=0;I<30;++I)z[I]=0}var _=2,G=0,$t=m,H=O-j&32767;if(R>2&&nt==A(v-H))for(var ut=Math.min(p,R)-1,it=Math.min(32767,v),V=Math.min(258,R);H<=it&&--$t&&O!=j;){if(t[v+_]==t[v+_-H]){for(var E=0;E<V&&t[v+E]==t[v+E-H];++E);if(E>_){if(_=E,G=H,E>ut)break;for(var ot=Math.min(H,E-2),Ee=0,I=0;I<ot;++I){var Rt=v-H+I&32767,Sr=f[Rt],Ue=Rt-Sr&32767;Ue>Ee&&(Ee=Ue,j=Rt)}}}O=j,j=f[O],H+=O-j&32767}if(G){x[N++]=268435456|Jt[_]<<18|$e[G];var Ne=Jt[_]&31,De=$e[G]&31;y+=he[Ne]+fe[De],++B[257+Ne],++z[De],rt=v+_,++F}else x[N++]=t[v],++B[t[v]]}}for(v=Math.max(v,rt);v<o;++v)x[N++]=t[v],++B[t[v]];d=He(t,l,c,x,B,z,y,N,D,v-D,d),c||(i.r=d&7|l[d/8|0]<<3,d-=7,i.h=g,i.p=f,i.i=v,i.w=rt)}else{for(var v=i.w||0;v<o+c;v+=65535){var Ht=v+65535;Ht>=o&&(l[d/8|0]=c,Ht=o),d=Da(l,d+1,t.subarray(v,Ht))}i.i=o}return Na(s,0,r+Ua(d)+n)},On=(function(){for(var t=new Int32Array(256),e=0;e<256;++e){for(var a=e,r=9;--r;)a=(a&1&&-306674912)^a>>>1;t[e]=a}return t})(),Oa=function(){var t=-1;return{p:function(e){for(var a=t,r=0;r<e.length;++r)a=On[a&255^e[r]]^a>>>8;t=a},d:function(){return~t}}},ja=function(t,e,a,r,n){if(!n&&(n={l:1},e.dictionary)){var i=e.dictionary.subarray(-32768),o=new U(i.length+t.length);o.set(i),o.set(t,i.length),t=o,n.w=i.length}return Tn(t,e.level==null?6:e.level,e.mem==null?n.l?Math.ceil(Math.max(8,Math.min(13,Math.log(t.length)))*1.5):20:12+e.mem,a,r,n)},_a=function(t,e){var a={};for(var r in t)a[r]=t[r];for(var r in e)a[r]=e[r];return a},P=function(t,e,a){for(;a;++e)t[e]=a,a>>>=8},jn=function(t,e){var a=e.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=e.level<2?4:e.level==9?2:0,t[9]=3,e.mtime!=0&&P(t,4,Math.floor(new Date(e.mtime||Date.now())/1e3)),a){t[3]=8;for(var r=0;r<=a.length;++r)t[r+10]=a.charCodeAt(r)}},_n=function(t){return 10+(t.filename?t.filename.length+1:0)};function $n(t,e){return ja(t,e||{},0,0)}function Rn(t,e){e||(e={});var a=Oa(),r=t.length;a.p(t);var n=ja(t,e,_n(e),8),i=n.length;return jn(n,e),P(n,i-8,a.d()),P(n,i-4,r),n}var $a=function(t,e,a,r){for(var n in t){var i=t[n],o=e+n,s=r;Array.isArray(i)&&(s=_a(r,i[1]),i=i[0]),i instanceof U?a[o]=[i,s]:(a[o+="/"]=[new U(0),s],$a(i,o,a,r))}},Ve=typeof TextEncoder<"u"&&new TextEncoder,Hn=typeof TextDecoder<"u"&&new TextDecoder,Vn=0;try{Hn.decode(Ta,{stream:!0}),Vn=1}catch{}function xt(t,e){var a;if(Ve)return Ve.encode(t);for(var r=t.length,n=new U(t.length+(t.length>>1)),i=0,o=function(d){n[i++]=d},a=0;a<r;++a){if(i+5>n.length){var s=new U(i+8+(r-a<<1));s.set(n),n=s}var l=t.charCodeAt(a);l<128||e?o(l):l<2048?(o(192|l>>6),o(128|l&63)):l>55295&&l<57344?(l=65536+(l&1047552)|t.charCodeAt(++a)&1023,o(240|l>>18),o(128|l>>12&63),o(128|l>>6&63),o(128|l&63)):(o(224|l>>12),o(128|l>>6&63),o(128|l&63))}return Na(n,0,i)}var Qt=function(t){var e=0;if(t)for(var a in t){var r=t[a].length;r>65535&&Nt(9),e+=r+4}return e},Xe=function(t,e,a,r,n,i,o,s){var l=r.length,c=a.extra,d=s&&s.length,u=Qt(c);P(t,e,o!=null?33639248:67324752),e+=4,o!=null&&(t[e++]=20,t[e++]=a.os),t[e]=20,e+=2,t[e++]=a.flag<<1|(i<0&&8),t[e++]=n&&8,t[e++]=a.compression&255,t[e++]=a.compression>>8;var p=new Date(a.mtime==null?Date.now():a.mtime),m=p.getFullYear()-1980;if((m<0||m>119)&&Nt(10),P(t,e,m<<25|p.getMonth()+1<<21|p.getDate()<<16|p.getHours()<<11|p.getMinutes()<<5|p.getSeconds()>>1),e+=4,i!=-1&&(P(t,e,a.crc),P(t,e+4,i<0?-i-2:i),P(t,e+8,a.size)),P(t,e+12,l),P(t,e+14,u),e+=16,o!=null&&(P(t,e,d),P(t,e+6,a.attrs),P(t,e+10,o),e+=14),t.set(r,e),e+=l,u)for(var h in c){var f=c[h],g=f.length;P(t,e,+h),P(t,e+2,g),t.set(f,e+4),e+=4+g}return d&&(t.set(s,e),e+=d),e},Xn=function(t,e,a,r,n){P(t,e,101010256),P(t,e+8,a),P(t,e+10,a),P(t,e+12,r),P(t,e+16,n)};function Yn(t,e){e||(e={});var a={},r=[];$a(t,"",a,e);var n=0,i=0;for(var o in a){var s=a[o],l=s[0],c=s[1],d=c.level==0?0:8,u=xt(o),p=u.length,m=c.comment,h=m&&xt(m),f=h&&h.length,g=Qt(c.extra);p>65535&&Nt(11);var w=d?$n(l,c):l,b=w.length,A=Oa();A.p(l),r.push(_a(c,{size:l.length,crc:A.d(),c:w,f:u,m:h,u:p!=o.length||h&&m.length!=f,o:n,compression:d})),n+=30+p+g+b,i+=76+2*(p+g)+(f||0)+b}for(var x=new U(i+22),B=n,z=i-n,F=0;F<r.length;++F){var u=r[F];Xe(x,u.o,u,u.f,u.u,u.c.length);var y=30+u.f.length+Qt(u.extra);x.set(u.c,u.o+y),Xe(x,n,u,u.f,u.u,u.c.length,u.o,u.m),n+=16+y+(u.m?u.m.length:0)}return Xn(x,n,r.length,z,B),x}const Ra="gzip";function te(t){return{bytes:Rn(t),compression:Ra}}async function Ha(t){if(typeof CompressionStream>"u")return te(t);try{const e=new Uint8Array(t.byteLength);e.set(t);const a=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return{bytes:new Uint8Array(await new Response(a).arrayBuffer()),compression:Ra}}catch{return te(t)}}const Bt="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%()*+,-.;=?@[]^_{|}~",ee=new Int16Array(128).fill(-1);for(let t=0;t<Bt.length;t++)ee[Bt.charCodeAt(t)]=t;function Dt(t,e){return e==="base85"?Wn(t):Zn(t)}function Gn(t,e){const a=t.length>0&&(t.charCodeAt(0)<=32||t.charCodeAt(t.length-1)<=32)?t.trim():t;return e==="base85"?Kn(a):qn(a)}function Wn(t){const e=t.length;if(e===0)return"";const a=(4-e%4)%4,r=e+a,n=[];for(let o=0;o<r;o+=4){const s=t[o]??0,l=o+1<e?t[o+1]:0,c=o+2<e?t[o+2]:0,d=o+3<e?t[o+3]:0;let u=(s<<24>>>0)+(l<<16)+(c<<8)+d;const p=new Array(5);for(let m=4;m>=0;m--)p[m]=u%85,u=u/85|0;for(let m=0;m<5;m++)n.push(Bt[p[m]])}const i=Math.ceil(e*5/4);return n.slice(0,i).join("")}function Kn(t){const e=t.replace(/\s+/g,""),a=e.length;if(a===0)return new Uint8Array(0);const r=Math.floor(a*4/5),n=(5-a%5)%5,i=a+n,o=new Uint8Array(i/5*4),s=Bt.length-1;let l=0;for(let c=0;c<i;c+=5){let d=0;for(let u=0;u<5;u++){const p=c+u<a?Jn(e.charCodeAt(c+u)):s;d=d*85+p}o[l++]=d>>>24&255,o[l++]=d>>>16&255,o[l++]=d>>>8&255,o[l++]=d&255}return o.subarray(0,r)}function Jn(t){if(t<0||t>=ee.length)throw new Error("Invalid base85 character");const e=ee[t];if(e<0)throw new Error("Invalid base85 character");return e}function Zn(t){let e="";for(let a=0;a<t.length;a++)e+=String.fromCharCode(t[a]);return btoa(e)}function qn(t){const e=atob(t),a=new Uint8Array(e.length);for(let r=0;r<e.length;r++)a[r]=e.charCodeAt(r);return a}const Ye=1,Ge=2,We=4,Ke=8,Je=16,Qn=32,Ze=1,qe=2,Qe=4,ta=8,ea=16,ti=32,aa=64,ra=128;function ge(t){let e=256+t.positions.byteLength;return t.indices&&(e+=t.indices.byteLength),t.lineDistances&&(e+=t.lineDistances.byteLength),t.linePattern&&(e+=64+t.linePattern.pattern.length*8),e}function be(t){let e=256+t.positions.byteLength;return t.indices&&(e+=t.indices.byteLength),t.gradientPositions&&(e+=t.gradientPositions.byteLength),t.uvs&&(e+=t.uvs.byteLength),t.texture&&(e+=t.texture.bytes.byteLength+64),t.hatchPattern&&(e+=128),t.gradientFill&&(e+=64),e}function Va(t,e){t.writeString(e.layer),t.writeU32(e.color>>>0),t.writeF64(e.offset[0]),t.writeF64(e.offset[1]),t.writeF64(e.offset[2]),t.writeFloat32Array(e.positions);let a=0;e.indices&&e.indices.length>0&&(a|=Ye),e.linePattern&&(a|=Ge),e.lineDistances&&e.lineDistances.length>0&&(a|=We),e.lineWidth!=null&&e.lineWidth>0&&(a|=Ke),e.renderOrder!=null&&e.renderOrder!==0&&(a|=Je),e.excludeFromOsnap&&(a|=Qn),t.writeU8(a),a&Ye&&t.writeUint32Array(e.indices),a&Ge&&t.writeJson(e.linePattern),a&We&&t.writeFloat32Array(e.lineDistances),a&Ke&&t.writeF32(e.lineWidth),a&Je&&t.writeI32(e.renderOrder)}function Xa(t,e){t.writeString(e.layer),t.writeU32(e.color>>>0),t.writeF64(e.offset[0]),t.writeF64(e.offset[1]),t.writeF64(e.offset[2]),t.writeFloat32Array(e.positions);let a=0;e.indices&&e.indices.length>0&&(a|=Ze),e.hatchPattern&&(a|=qe),e.gradientFill&&(a|=Qe),e.gradientPositions&&e.gradientPositions.length>0&&(a|=ta),e.side!=null&&(a|=ea),e.points&&(a|=ti),e.renderOrder!=null&&e.renderOrder!==0&&(a|=aa),e.texture&&e.texture.bytes.length>0&&e.uvs&&e.uvs.length>=2&&(a|=ra),t.writeU8(a),a&Ze&&t.writeUint32Array(e.indices),a&qe&&t.writeJson(e.hatchPattern),a&Qe&&t.writeJson(e.gradientFill),a&ta&&t.writeFloat32Array(e.gradientPositions),a&ea&&t.writeU8(e.side),a&aa&&t.writeI32(e.renderOrder),a&ra&&(t.writeFloat32Array(e.uvs),t.writeString(e.texture.mimeType||"image/png"),t.writeU32(e.texture.bytes.byteLength),t.writeBytes(e.texture.bytes))}class we{constructor(){this.chunks=[],this.length=0}writeU8(e){const a=new Uint8Array(1);a[0]=e&255,this.chunks.push(a),this.length+=1}writeU32(e){const a=new Uint8Array(4);new DataView(a.buffer).setUint32(0,e>>>0,!0),this.chunks.push(a),this.length+=4}writeI32(e){const a=new Uint8Array(4);new DataView(a.buffer).setInt32(0,e|0,!0),this.chunks.push(a),this.length+=4}writeF32(e){const a=new Uint8Array(4);new DataView(a.buffer).setFloat32(0,e,!0),this.chunks.push(a),this.length+=4}writeF64(e){const a=new Uint8Array(8);new DataView(a.buffer).setFloat64(0,e,!0),this.chunks.push(a),this.length+=8}writeBytes(e){this.chunks.push(e),this.length+=e.length}writeString(e){const a=xt(e);this.writeU32(a.length),this.writeBytes(a)}writeJson(e){this.writeString(JSON.stringify(e))}writeFloat32Array(e){this.alignTo(4);const a=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);this.writeU32(a.length),this.writeBytes(a)}writeUint32Array(e){this.alignTo(4);const a=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);this.writeU32(a.length),this.writeBytes(a)}alignTo(e){const a=this.length%e;if(a===0)return;const r=e-a;for(let n=0;n<r;n++)this.writeU8(0)}toUint8Array(){const e=new Uint8Array(this.length);let a=0;for(const r of this.chunks)e.set(r,a),a+=r.length;return e}}const ei=1329939265,ai=1,ri=1,ni=2,ii=3,oi=4,si=5,li=6,ci=7;function Ya(t){var e;switch(t.kind){case"line":return 37;case"circle":return 30;case"arc":return 46;case"ellipse":return 71;case"point":return 21;case"path":return 10+t.vertices.length*8;case"spline":return 10+(t.controlPoints.length+t.knots.length+t.weights.length+(((e=t.fitPoints)==null?void 0:e.length)??0))*8+16;default:return t}}function di(t,e){if(t.length===0)return[];const a=[];let r=[],n=64;const i=()=>{r.length!==0&&(a.push(r),r=[],n=64)};for(const o of t){const s=Ya(o);r.length>0&&n+s>e&&i(),r.push(o),n+=s}return i(),a}function xe(t){const e=new we;e.writeU32(ei),e.writeU8(ai),e.writeU8(0),e.writeU8(0),e.writeU8(0);const a=[],r=new Map,n=i=>{const o=r.get(i);if(o!=null)return o;const s=a.length;return a.push(i),r.set(i,s),s};for(const i of t.primitives)n(i.layer);e.writeU32(a.length);for(const i of a)e.writeString(i);e.writeU32(t.primitives.length);for(const i of t.primitives)mi(e,i,n(i.layer));return e.toUint8Array()}async function ui(t){const e=xe(t),a=(await Ha(e)).bytes;return{uncompressed:e,compressed:a}}function Gt(t,e){t.writeU8(e<0?0:1)}function ht(t,e){t.writeU32(e.length);for(const a of e)t.writeF64(a)}function mi(t,e,a){switch(e.kind){case"line":t.writeU8(ri),t.writeU32(a),t.writeF64(e.x0),t.writeF64(e.y0),t.writeF64(e.x1),t.writeF64(e.y1);return;case"circle":t.writeU8(ni),t.writeU32(a),t.writeF64(e.cx),t.writeF64(e.cy),t.writeF64(e.r),Gt(t,e.normalSign);return;case"arc":t.writeU8(ii),t.writeU32(a),t.writeF64(e.cx),t.writeF64(e.cy),t.writeF64(e.r),t.writeF64(e.startAngle),t.writeF64(e.endAngle),Gt(t,e.normalSign);return;case"ellipse":t.writeU8(oi),t.writeU32(a),t.writeF64(e.cx),t.writeF64(e.cy),t.writeF64(e.majorX),t.writeF64(e.majorY),t.writeF64(e.majorR),t.writeF64(e.minorR),t.writeF64(e.startAngle),t.writeF64(e.endAngle),t.writeU8(e.closed?1:0),Gt(t,e.normalSign??1);return;case"spline":t.writeU8(si),t.writeU32(a),ht(t,e.controlPoints),t.writeU32(e.degree),ht(t,e.knots),ht(t,e.weights),t.writeU8(e.closed?1:0),ht(t,e.fitPoints??[]);return;case"point":t.writeU8(li),t.writeU32(a),t.writeF64(e.x),t.writeF64(e.y);return;case"path":t.writeU8(ci),t.writeU32(a),t.writeU8(e.closed?1:0),ht(t,e.vertices);return;default:{const r=e;throw new Error(`Unsupported osnap primitive: ${String(r)}`)}}}const pi=1480934209;function hi(t){if(t.version!==X)throw new Error(`Unsupported snapshot version: ${t.version}`);const e=new we;e.writeU32(pi),e.writeU8(X),e.writeU8(0),e.writeU8(0),e.writeU8(0),e.writeJson(fi(t)),e.writeJson(t.layers),e.writeString(t.activeLayoutBtrId),e.writeU32(t.layouts.length);for(const a of t.layouts)gi(e,a);return e.toUint8Array()}function fi(t){const e={...t.meta.savedViews??{}};for(const a of t.layouts)a.savedView&&(e[a.btrId]=a.savedView);if(Object.keys(e).length===0){if(t.meta.savedViews==null)return t.meta;const{savedViews:a,...r}=t.meta;return r}return{...t.meta,savedViews:e}}function gi(t,e){t.writeString(e.btrId),t.writeString(e.name),t.writeU8(e.isModelSpace?1:0),bi(t,e.osnap),t.writeJson(e.viewports??null),t.writeU32(e.lineBatches.length);for(const a of e.lineBatches)Va(t,a);t.writeU32(e.meshBatches.length);for(const a of e.meshBatches)Xa(t,a)}function bi(t,e){if(!e||e.primitives.length===0){t.writeU32(0);return}const a=xe(e);t.writeU32(a.length),t.writeBytes(a)}const wi="application/vnd.mlightcad.acex-snapshot+binary";function Ga(t){if(t.version!==X)throw new Error(`Unsupported snapshot version: ${t.version}`);const e=hi(t),a=te(e);return{payload:Dt(a.bytes,"base85"),compression:a.compression}}function xi(){return wi}function et(t,e,a){if(a<=0)return new Float32Array(0);if(t instanceof Float32Array)return t.subarray(e,e+a).slice();const r=new Float32Array(a);for(let n=0;n<a;n++)r[n]=t[e+n];return r}function yi(t,e,a){if(a<=0)return new Uint32Array(0);const r=new Uint32Array(a);for(let n=0;n<a;n++)r[n]=t[e+n];return r}function Wa(t,e){if(e.length===0)return{positions:t,indices:e};let a=0;for(let n=0;n<e.length;n++){const i=e[n];i>a&&(a=i)}const r=(a+1)*3;return r>=t.length?{positions:t,indices:e}:{positions:et(t,0,r),indices:e}}function na(t,e){return t+e}const st={x:0,y:0,z:0};function vi(t){t.updateMatrixWorld(!0);const e=t.matrixWorld.elements;return st.x=e[12],st.y=e[13],st.z=e[14],[st.x,st.y,st.z]}function ye(t,e){const a=e.elements,r=t.positions;if(r.length===0)return{positions:new Float32Array(0),indices:t.indices};const n=new Float32Array(r.length);for(let i=0;i<r.length;i+=3){const o=r[i],s=r[i+1],l=r[i+2];n[i]=a[0]*o+a[4]*s+a[8]*l+a[12],n[i+1]=a[1]*o+a[5]*s+a[9]*l+a[13],n[i+2]=a[2]*o+a[6]*s+a[10]*l+a[14]}return{positions:n,indices:t.indices?new Uint32Array(t.indices):void 0}}function ia(t,e){const a=e*3;return Number.isFinite(t[a])&&Number.isFinite(t[a+1])&&Number.isFinite(t[a+2])}function ct(t,e){const a=t.positions,r=a.length/3|0;if(r===0||e<=0)return t;let n=!1;for(let s=0;s<a.length;s++)if(!Number.isFinite(a[s])){n=!0;break}if(!n)return t;const i=t.indices;if(i&&i.length>0){const s=[];for(let u=0;u+e<=i.length;u+=e){let p=!0;for(let m=0;m<e;m++){const h=i[u+m];if(h<0||h>=r||!ia(a,h)){p=!1;break}}if(p)for(let m=0;m<e;m++)s.push(i[u+m])}if(s.length===0)return{positions:new Float32Array(0)};const l=new Int32Array(r);l.fill(-1);const c=[],d=new Uint32Array(s.length);for(let u=0;u<s.length;u++){const p=s[u];let m=l[p];if(m<0){m=c.length/3,l[p]=m;const h=p*3;c.push(a[h],a[h+1],a[h+2])}d[u]=m}return{positions:Float32Array.from(c),indices:d}}const o=[];for(let s=0;s+e<=r;s+=e){let l=!0;for(let c=0;c<e;c++)if(!ia(a,s+c)){l=!1;break}if(l)for(let c=0;c<e;c++){const d=(s+c)*3;o.push(a[d],a[d+1],a[d+2])}}return o.length===0?{positions:new Float32Array(0)}:{positions:Float32Array.from(o)}}function ve(t){const e=t.positions;if(e.length<3)return{slice:t,offset:[0,0,0]};let a=1/0,r=1/0,n=1/0,i=-1/0,o=-1/0,s=-1/0,l=0;for(let u=0;u<e.length;u+=3){const p=e[u],m=e[u+1],h=e[u+2];!Number.isFinite(p)||!Number.isFinite(m)||!Number.isFinite(h)||(l++,a=Math.min(a,p),r=Math.min(r,m),n=Math.min(n,h),i=Math.max(i,p),o=Math.max(o,m),s=Math.max(s,h))}if(l===0)return{slice:{positions:new Float32Array(0)},offset:[0,0,0]};const c=[(a+i)/2,(r+o)/2,(n+s)/2],d=new Float32Array(e.length);for(let u=0;u<e.length;u+=3){const p=e[u],m=e[u+1],h=e[u+2];if(!Number.isFinite(p)||!Number.isFinite(m)||!Number.isFinite(h)){d[u]=0,d[u+1]=0,d[u+2]=0;continue}d[u]=p-c[0],d[u+1]=m-c[1],d[u+2]=h-c[2]}return{slice:{positions:d,indices:t.indices?new Uint32Array(t.indices):void 0},offset:c}}function ki(t,e,a={}){t.updateMatrixWorld(!0);const r=ye(e,t.matrixWorld);return ve(r)}function Ai(t){const e=t.image;if(!e||typeof document>"u")return;const a=document.createElement("canvas"),r=a.getContext("2d");if(!r)return;try{if(e instanceof ImageData)a.width=e.width,a.height=e.height,r.putImageData(e,0,0);else if(Fi(e)){a.width=e.width,a.height=e.height;const l=zi(e.data,e.width*e.height),c=new ImageData(new Uint8ClampedArray(l),e.width,e.height);r.putImageData(c,0,0)}else if(Mi(e)){const l=Ci(e);if(!l)return;a.width=l.width,a.height=l.height,r.drawImage(e,0,0)}else return}catch{return}const n=a.toDataURL("image/png"),i=n.indexOf(",");if(i<0)return;const o=atob(n.slice(i+1)),s=new Uint8Array(o.length);for(let l=0;l<o.length;l++)s[l]=o.charCodeAt(l);return{mimeType:"image/png",bytes:s}}function Mi(t){return t instanceof HTMLImageElement||t instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&t instanceof OffscreenCanvas||typeof ImageBitmap<"u"&&t instanceof ImageBitmap||typeof HTMLVideoElement<"u"&&t instanceof HTMLVideoElement}function Fi(t){if(!t||typeof t!="object")return!1;const e=t;return e.data!=null&&typeof e.width=="number"&&typeof e.height=="number"&&e.width>=1&&e.height>=1}function Ci(t){let e=Number(t.width),a=Number(t.height);if(t instanceof HTMLImageElement?(e=t.naturalWidth||t.width,a=t.naturalHeight||t.height):typeof HTMLVideoElement<"u"&&t instanceof HTMLVideoElement&&(e=t.videoWidth||t.width,a=t.videoHeight||t.height),!(!Number.isFinite(e)||!Number.isFinite(a)||e<1||a<1))return{width:e,height:a}}function zi(t,e){const a=e*4;if(t instanceof Uint8ClampedArray&&t.length>=a)return t.length===a?t:t.subarray(0,a);const r=new Uint8ClampedArray(a),n=Math.min(a,t.length);for(let i=0;i<n;i++)r[i]=t[i];if(t.length>=e*3&&t.length<a)for(let i=e-1;i>=0;i--){const o=i*3,s=i*4;r[s]=t[o],r[s+1]=t[o+1],r[s+2]=t[o+2],r[s+3]=255}return r}function Bi(t,e){const a=t.getAttribute("uv");if(!a||a.count===0||a.itemSize<2)return;const r=Math.floor(e.length/3)*2;if(r<=0)return;const n=a.array;if(!(a.count*a.itemSize<r))return et(n,0,r)}function Ka(t){const e=t;return e.map?!1:e.transparent===!0&&typeof e.opacity=="number"&&e.opacity<.01}function ke(t){const e=t;if(e.isShaderMaterial===!0||t.type==="ShaderMaterial")return e}function Pi(t){var e;const a=ke(t);if(!a)return;const r=a.uniforms.pattern,n=a.uniforms.patternLength;if(!r||!n)return;const i=r.value;if(!(!Array.isArray(i)||i.length===0))return{pattern:[...i],patternLength:Number(n.value),viewportScale:Number(((e=a.uniforms.u_viewportScale)==null?void 0:e.value)??1)}}function Si(t){var e;const a=ke(t);if(!a)return;const r=a.uniforms.u_patternLines;if(!r)return;const n=r.value;if(!(!Array.isArray(n)||n.length===0))return{patternAngle:Number(((e=a.uniforms.u_patternAngle)==null?void 0:e.value)??0),patternLines:n.map(Ii)}}function Li(t){var e,a,r,n,i;const o=ke(t);if(!o||o.uniforms.u_patternLines)return;const s=(e=o.uniforms.u_startColor)==null?void 0:e.value,l=(a=o.uniforms.u_endColor)==null?void 0:a.value,c=o.uniforms.u_gradientType;if(!(!(s!=null&&s.getHex)||c==null))return{startColor:s.getHex(),endColor:((r=l==null?void 0:l.getHex)==null?void 0:r.call(l))??s.getHex(),angle:Number(((n=o.uniforms.u_angle)==null?void 0:n.value)??0),shift:Number(((i=o.uniforms.u_shift)==null?void 0:i.value)??0),gradientType:Number(c.value)}}function Ii(t){return{angle:t.angle,base:[t.base.x,t.base.y],offset:[t.offset.x,t.offset.y],dashLengths:[...t.dashLengths],patternLength:t.patternLength}}function Ae(t){const e=t.length/3;if(e<2)return new Float32Array(0);const a=new Float32Array(e);for(let r=0;r<e;r+=2){r===0?a[r]=0:a[r]=a[r-1];const n=t[r*3],i=t[r*3+1],o=t[r*3+2]??0,s=t[(r+1)*3],l=t[(r+1)*3+1],c=t[(r+1)*3+2]??0,d=s-n,u=l-i,p=c-o;a[r+1]=a[r]+Math.sqrt(d*d+u*u+p*p)}return a}function Ei(t,e){const a=t.getAttribute(e);if(!a||a.count===0)return;const r=a.itemSize;if(t.getIndex()){const d=a.array;return et(d,0,a.count*r)}const n=t.drawRange,i=a.count,o=Math.max(0,Math.min(Math.floor(n.start),i)),s=Math.max(0,i-o),l=!Number.isFinite(n.count)||n.count<=0?s:Math.min(Math.floor(n.count),s);if(l<=0)return;const c=a.array;return et(c,o*r,l*r)}function oa(t,e){const a=e[0],r=e[1],n=e[4],i=e[5],o=e[12],s=e[13],l=Math.atan2(r,a),c=(p,m)=>[a*p+n*m+o,r*p+i*m+s],d=(p,m)=>[a*p+n*m,r*p+i*m],u=(p,m,h)=>{const f=Math.cos(h),g=Math.sin(h);return[f*p-g*m,g*p+f*m]};return{patternAngle:t.patternAngle,patternLines:t.patternLines.map(p=>{const m=p.angle+t.patternAngle,h=p.angle+l,f=h+t.patternAngle,[g,w]=d(Math.cos(m),Math.sin(m)),b=Math.hypot(g,w),[A,x]=u(p.offset[0],p.offset[1],m),[B,z]=d(A,x),F=u(B,z,-f);return{angle:h,base:c(p.base[0],p.base[1]),offset:F,dashLengths:p.dashLengths.map(y=>y*b),patternLength:p.patternLength*b}})}}function Ui(t,e){return{patternAngle:t.patternAngle,patternLines:t.patternLines.map(a=>{const r=new C.Vector2(a.base[0]-e[0],a.base[1]-e[1]),n=new C.Vector2(a.offset[0],a.offset[1]);return Kr(r,n,a.angle,t.patternAngle,a.patternLength),{angle:a.angle,base:[r.x,r.y],offset:[a.offset[0],a.offset[1]],dashLengths:[...a.dashLengths],patternLength:a.patternLength}})}}function ae(t,e){return!Number.isFinite(t)||t<0?0:Math.min(Math.floor(t),e)}function re(t,e,a){const r=Math.max(0,e-a);return!Number.isFinite(t)||t<=0?r:Math.min(Math.floor(t),r)}function Pt(t){const e=t.getAttribute("position");if(!e)return{positions:new Float32Array(0)};const a=t.drawRange,r=e.array,n=e.itemSize,i=t.getIndex();if(i){const l=et(r,0,e.count*n),c=i.array,d=ae(a.start,i.count),u=re(a.count,i.count,d),p=yi(c,d,u);return Wa(l,p)}const o=ae(a.start,e.count),s=re(a.count,e.count,o);return{positions:et(r,o*n,s*n)}}function St(t){return yn(t.flags)&&vn(t.flags)}function Ja(t){const{count:e}=t.mappingStats;for(let a=0;a<e;a++){let r;try{r=t.getGeometryRangeAt(a)}catch{continue}if(St(r)&&r.bboxIntersectionCheck)return!0}return!1}function ne(t){return Pa(t).bboxIntersectionCheck===!0}function Me(t,e){const a=e.getAttribute("position");if(!a)return{positions:new Float32Array(0)};const r=a.itemSize,n=a.array,i=e.getIndex(),{count:o}=t.mappingStats;if(i){const u=et(n,0,a.count*r),p=i.array;let m=0;const h=[];for(let w=0;w<o;w++){let b;try{b=t.getGeometryRangeAt(w)}catch{continue}const A=b.indexStart??0,x=b.indexCount??0;!St(b)||x<=0||(h.push({start:A,count:x}),m+=x)}if(m===0)return{positions:new Float32Array(0)};const f=new Uint32Array(m);let g=0;for(const w of h)for(let b=0;b<w.count;b++)f[g++]=p[w.start+b];return Wa(u,f)}let s=0;const l=[];for(let u=0;u<o;u++){let p;try{p=t.getGeometryRangeAt(u)}catch{continue}if(!St(p)||p.vertexCount<=0)continue;const m=p.vertexCount*r;l.push({start:p.vertexStart*r,floatCount:m}),s+=m}if(s===0)return{positions:new Float32Array(0)};const c=new Float32Array(s);let d=0;if(n instanceof Float32Array)for(const u of l)c.set(n.subarray(u.start,u.start+u.floatCount),d),d+=u.floatCount;else for(const u of l)for(let p=0;p<u.floatCount;p++)c[d++]=n[u.start+p];return{positions:c}}function sa(t,e,a){t.push(e.getX(a),e.getY(a),e.getZ(a))}function Ni(t,e){const a=e.getAttribute("instanceStart"),r=e.getAttribute("instanceEnd");if(!a||!r)return{positions:new Float32Array(0)};const{count:n}=t.mappingStats,i=[];for(let o=0;o<n;o++){let s;try{s=t.getGeometryRangeAt(o)}catch{continue}if(!St(s)||s.vertexCount<=0)continue;const l=s.vertexStart,c=l+s.vertexCount;for(let d=l;d<c;d++)sa(i,a,d),sa(i,r,d)}return{positions:new Float32Array(i)}}function Di(t,e){const a=t.instanceCount;if(Number.isFinite(a)&&a>=0)return Math.min(Math.floor(a),e);const r=t.drawRange,n=ae(r.start,e);return re(r.count,e,n)}function Ti(t){const e=t.getAttribute("instanceStart"),a=t.getAttribute("instanceEnd");if(!e||!a||e.count===0)return{positions:new Float32Array(0)};const r=Di(t,e.count);if(r<=0)return{positions:new Float32Array(0)};const n=[];for(let i=0;i<r;i++){const o=[e.getX(i),e.getY(i),e.getZ(i)],s=[a.getX(i),a.getY(i),a.getZ(i)];!o.every(Number.isFinite)||!s.every(Number.isFinite)||n.push(o[0],o[1],o[2],s[0],s[1],s[2])}return{positions:new Float32Array(n)}}function Mt(t){return Yr(t)}function Za(t){if(t instanceof Wr)return t.linewidth}function bt(t){if("material"in t){const e=t.userData.originalMaterial??t.material;return Array.isArray(e)?e[0]:e}return t.material}function at(t){var e;const a=Sa(t),r=a.layer??"0",n=t;let i=n.color!=null?n.color.getHex():a.color??16777215;const o=Pi(t),s=Si(t),l=Li(t);if(t instanceof C.ShaderMaterial||t.type==="ShaderMaterial"){const c=(e=t.uniforms.u_color)==null?void 0:e.value;c!=null&&c.getHex?i=c.getHex():l&&(i=l.startColor)}return{color:i,layer:r,linePattern:o,hatchPattern:s,gradientFill:l,side:s||l?t.side:void 0}}function Oi(t,e){const a=Sa(e).drawOrder??t.renderOrder;return a===0?void 0:a}function dt(t,e,a){const r=Oi(e,a);r!=null&&(t.renderOrder=r)}function ji(t,e){if(!e)return;const a=t.userData.bakedWorldMatrix;return a&&a.length>=16?oa(e,a):(t.updateMatrixWorld(!0),oa(e,Array.from(t.matrixWorld.elements)))}function Tt(t){return vi(t)}function Wt(t,e,a={}){const r=ki(t,e,a);return{...r.slice,offset:r.offset}}function _i(t){if(t.indices&&t.indices.length>=3)return t;const e=t.positions.length/3|0;if(e<3||e%3!==0)return t;const a=new Uint32Array(e);for(let r=0;r<e;r++)a[r]=r;return{...t,indices:a}}function yt(t,e,a,r,n,i=!1){i&&(r=_i(r));const o=at(e),s=ji(a,o.hatchPattern),l=s?Ui(s,n):void 0,c=o.gradientFill?Ei(t,"gradientPosition"):void 0,d={layer:o.layer,color:o.color,offset:n,hatchPattern:l,gradientFill:o.gradientFill,gradientPositions:c,side:o.side,...r},u=e;if(u.map){const p=Ai(u.map),m=Bi(t,r.positions);if(!p||!m)return;d.texture=p,d.uvs=m,d.color=16777215,d.side=C.DoubleSide}return dt(d,a,e),d}function $i(t){const e=Ni(t,t.geometry);if(e.positions.length===0)return;const{color:a,layer:r}=at(t.material),n=Za(t.material),i={layer:r,color:a,offset:Tt(t),lineWidth:n,...e};return Ja(t)&&(i.excludeFromOsnap=!0),dt(i,t,t.material),i}function Ri(t){const e=Me(t,t.geometry);if(e.positions.length===0)return;const{color:a,layer:r,linePattern:n}=at(t.material),i=n?Ae(e.positions):void 0,o={layer:r,color:a,offset:Tt(t),linePattern:n,lineDistances:i,...e};return Ja(t)&&(o.excludeFromOsnap=!0),dt(o,t,t.material),o}function Hi(t){const e=Me(t,t.geometry);if(e.positions.length!==0)return yt(t.geometry,t.material,t,e,Tt(t),!0)}function Vi(t){const e=Me(t,t.geometry);if(e.positions.length===0)return;const a=yt(t.geometry,t.material,t,e,Tt(t));if(a)return{points:!0,...a}}const Z=new C.Matrix4,Lt=new C.Matrix4,ft=new C.Object3D;ft.matrixAutoUpdate=!1;function Xi(t){const e=t;return e.isInstancedMesh===!0&&e.instanceMatrix!=null&&typeof e.count=="number"&&e.geometry!=null}function Yi(t){return t.renderOrder<1e4||t.isInstancedMesh===!0?!1:Pa(t).sharesTemplateGeometry===!0}function ie(t){const e=t.elements;for(let i=0;i<16;i++)if(!Number.isFinite(e[i]))return!1;const a=Math.hypot(e[0],e[1],e[2]),r=Math.hypot(e[4],e[5],e[6]),n=Math.hypot(e[8],e[9],e[10]);return a+r+n>=1e-8}function qa(t,e){var a;const r=ct(Pt(t.geometry),e),n=r.positions.length;if(n===0)return;t.updateMatrixWorld(!0);const i=t.instanceMatrix.array,o=((a=r.indices)==null?void 0:a.length)??0;let s=0;for(let m=0;m<t.count;m++)Z.fromArray(i,m*16),ie(Z)&&s++;if(s===0)return;const l=new Float32Array(s*n),c=r.indices!=null?new Uint32Array(s*o):void 0,d=n/3;let u=0;for(let m=0;m<t.count;m++){if(Z.fromArray(i,m*16),!ie(Z))continue;Lt.multiplyMatrices(t.matrixWorld,Z);const h=ye(r,Lt);if(l.set(h.positions,u*n),c&&h.indices){const f=u*d;for(let g=0;g<h.indices.length;g++)c[u*o+g]=h.indices[g]+f}u++}const p=ve(ct({positions:l,indices:c},e));if(p.slice.positions.length!==0)return{slice:p.slice,offset:p.offset}}function Gi(t){const e=at(t),a=t;return!!(e.hatchPattern||e.gradientFill||a.map)}function Wi(t,e){t.updateMatrixWorld(!0);const a=t.instanceMatrix.array;for(let r=0;r<t.count;r++)Z.fromArray(a,r*16),ie(Z)&&(Lt.multiplyMatrices(t.matrixWorld,Z),e(Lt))}function Ki(t,e){const a=qa(t,2);if(!a)return;const r=bt(t),{color:n,layer:i,linePattern:o}=at(r),s=o?Ae(a.slice.positions):void 0,l={layer:i,color:n,offset:a.offset,linePattern:o,lineDistances:s,...a.slice};ne(t)&&(l.excludeFromOsnap=!0),dt(l,t,r),e.push(l)}function la(t,e,a){const r=bt(t);if(!a&&Ka(r))return;if(!a&&Gi(r)){const o=ct(Pt(t.geometry),3);if(o.positions.length===0)return;Wi(t,s=>{const l=ct(ye(o,s),3);if(l.positions.length===0)return;const c=ve(l);ft.matrix.copy(s),ft.matrixWorld.copy(s),ft.matrixWorldNeedsUpdate=!1;const d=yt(t.geometry,r,ft,c.slice,c.offset,!0);d&&e.push(d)});return}const n=qa(t,a?1:3);if(!n)return;const i=yt(t.geometry,r,t,n.slice,n.offset,!a);i&&e.push(a?{...i,points:!0}:i)}function Ft(t){const e=t;return t instanceof Gr||e.isLineSegments2===!0||t.type==="LineSegments2"}function ca(t){const e=t;return t instanceof C.LineSegments||e.isLineSegments===!0||t.type==="LineSegments"}function da(t){const e=t;return t instanceof C.Mesh||e.isMesh===!0||e.isInstancedMesh===!0||t.type==="Mesh"}function Ji(t){const e=[],a=[];return t.traverse(r=>{if(!(Tr(r)||Or(r)||Yi(r))){if(Xi(r)){if(!Mt(r))return;r.isPoints===!0?la(r,a,!0):ca(r)&&!Ft(r)?Ki(r,e):da(r)&&!Ft(r)&&la(r,a,!1);return}if(r instanceof Oe){const n=Ri(r);n&&e.push(n);return}if(r instanceof jr){const n=$i(r);n&&e.push(n);return}if(r instanceof je){const n=Hi(r);n&&a.push(n);return}if(r instanceof _r){const n=Vi(r);n&&a.push(n);return}if(Ft(r)){if(!Mt(r))return;const n=Ti(r.geometry);if(n.positions.length===0)return;const i=bt(r),{color:o,layer:s}=at(i),{offset:l,...c}=Wt(r,n),d={layer:s,color:o,offset:l,lineWidth:Za(i),...c};ne(r)&&(d.excludeFromOsnap=!0),dt(d,r,i),e.push(d)}else if(ca(r)&&!(r instanceof Oe)){if(!Mt(r))return;const n=ct(Pt(r.geometry),2);if(n.positions.length===0)return;const i=bt(r),{color:o,layer:s,linePattern:l}=at(i),{offset:c,...d}=Wt(r,n),u=l?Ae(d.positions):void 0,p={layer:s,color:o,offset:c,linePattern:l,lineDistances:u,...d};ne(r)&&(p.excludeFromOsnap=!0),dt(p,r,i),e.push(p)}else if(da(r)&&!Ft(r)&&!(r instanceof je)){if(!Mt(r))return;const n=bt(r);if(Ka(n))return;const i=ct(Pt(r.geometry),3);if(i.positions.length===0)return;const{offset:o,...s}=Wt(r,i),l=yt(r.geometry,n,r,s,o,!0);l&&a.push(l)}}}),{lineBatches:e,meshBatches:a}}const ua={size:8,colorCss:"#0080ff",hotColorCss:"#ff0000"};function ma(t){const e=new Vr(Xr.ByACI,t);return e.cssColor??`rgb(${e.red}, ${e.green}, ${e.blue})`}function Zi(t){try{const e=Dr.instance(),a=e.getVar(Xt.GRIPSIZE,t),r=e.getVar(Xt.GRIPCOLOR,t),n=e.getVar(Xt.GRIPHOT,t);return!(a>0)||!Number.isFinite(a)?ua:{size:a,colorCss:ma(r),hotColorCss:ma(n)}}catch{return ua}}function pa(t,e){const a=t.extmin,r=t.extmax,n=Zi(t);return{title:e==null?void 0:e.title,extents:{minX:a.x,minY:a.y,maxX:r.x,maxY:r.y},units:{insunits:t.insunits,lunits:t.lunits,luprec:t.luprec,aunits:t.aunits,auprec:t.auprec,measurement:t.measurement,ltscale:t.ltscale,angbase:t.angbase,angdir:t.angdir},grip:n,background:(e==null?void 0:e.background)??0}}function ha(t,e,a,r,n){return Math.atan2(r-e,n*(a-t))}function Fe(t){return t.z>=0?1:-1}function Qa(t,e,a){if(!(a.radius>0)||!Number.isFinite(a.radius))return;const r=a.clockwise?-1:1,n=a.center.x,i=a.center.y;t.push({kind:"arc",layer:e,cx:n,cy:i,r:a.radius,startAngle:ha(n,i,a.startPoint.x,a.startPoint.y,r),endAngle:ha(n,i,a.endPoint.x,a.endPoint.y,r),normalSign:r})}function L(t,e){const a=new C.Vector3(e.x,e.y,e.z??0).applyMatrix4(t);return{x:a.x,y:a.y}}function qi(t){const e=t.elements;return new C.Matrix4(e[0],e[4],e[8],e[12],e[1],e[5],e[9],e[13],e[2],e[6],e[10],e[14],e[3],e[7],e[11],e[15])}function It(t,e){return new C.Matrix4().multiplyMatrices(t,qi(e))}function tr(t,e){const a=new C.Vector3(e.x,e.y,e.z??0).transformDirection(t).normalize();return{x:a.x,y:a.y}}function oe(t){const e=new C.Vector3(t.elements[0],t.elements[1],t.elements[2]).length(),a=new C.Vector3(t.elements[4],t.elements[5],t.elements[6]).length();return lt.equal(e,a,La*Math.max(e,a,1))}function Qi(t,e){const a=t.tables.blockTable.getIdAt(e);if(a)return a;for(const n of t.tables.blockTable.newIterator())if(n.objectId===e)return n;const r=t.tables.blockTable.modelSpace;if(r.objectId===e)return r}function to(t){if(t instanceof kn)return!0;const e=t;return(e.type==="LINE"||e.type==="Line")&&e.startPoint!=null&&e.endPoint!=null}function eo(t,e,a,r){r.startPoint,r.endPoint}function er(t,e){return t.blockTableRecord??(t.blockName?e.tables.blockTable.getAt(t.blockName):void 0)}function ao(t,e){const a=t.dimBlockId;return a?e.tables.blockTable.getAt(a):void 0}function ro(t,e){const a=er(t,e);if(a)return a;const r=t.owningBlockRecordId;return r?e.tables.blockTable.getAt(r):void 0}function ar(t){return t.getFullInsertionTransform()}function no(t){for(const e of t.newIterator())return!0;return!1}function io(t){return typeof t.getFullInsertionTransform=="function"&&"blockTableRecord"in t}function q(t,e,a,r,n){if(r.length<2)return;const i=oe(a),o=a.elements[0]*a.elements[5]-a.elements[4]*a.elements[1]<0?-1:1,s=[];for(const l of r){const c=L(a,l);let d=l.bulge??0;lt.isPositive(Math.abs(d))&&(d=i?d*o:0),s.push(c.x,c.y,d)}t.push({kind:"path",layer:e,closed:n,vertices:s})}function rr(t,e){return lt.equal(t.x,e.x)&&lt.equal(t.y,e.y)}function oo(t){return(t.clockwise?-1:1)*Math.tan(t.deltaAngle/4)}function fa(t,e,a,r){if(t.length===0){t.push({x:e.x,y:e.y,z:e.z??0,bulge:r}),t.push({x:a.x,y:a.y,z:a.z??0,bulge:0});return}const n=t[t.length-1];rr(n,e)?n.bulge=r:(n.bulge=0,t.push({x:e.x,y:e.y,z:e.z??0,bulge:r})),t.push({x:a.x,y:a.y,z:a.z??0,bulge:0})}function ga(t){return t.length>=2&&rr(t[0],t[t.length-1])&&t.pop(),t}function wt(t,e,a,r,n){if(r.length<2)return;const i=n?r.length:r.length-1;for(let o=0;o<i;o++)r[o],r[(o+1)%r.length]}function so(t,e,a,r){const n=[r.startPosition];for(const i of r.segments)n.push(i.position);wt(t,e,a,n,r.closed)}function lo(t,e,a){if(a.vertices.length>=2)return a.vertices;if(a.vertices.length===0)return[];const r=a.vertices[0],n=e.lastLeaderLinePoint??e.landingPoint??t.landingPoint??t.contentBasePosition;if(!n)return a.vertices;const i=r.x-n.x,o=r.y-n.y,s=(r.z??0)-(n.z??0);return Math.hypot(i,o,s)<=La?a.vertices:[r,n]}function co(t,e,a,r){var n,i;for(const s of r.leaders)for(const l of s.leaderLines){const c=lo(r,s,l);wt(t,e,a,c,!1)}const o=s=>{if(!s)return;const l=L(a,s);t.push({kind:"point",layer:e,x:l.x,y:l.y})};o(r.contentBasePosition),o((n=r.mtextContent)==null?void 0:n.anchorPoint),o((i=r.blockContent)==null?void 0:i.position)}function uo(t,e,a,r){const n=r.numberOfVertices;if(n<2)return;const i=r.elevation,o=r.closed?n:n-1;for(let s=0;s<o;s++){const l=r.getPointAt(s),c=r.getPointAt((s+1)%n),d=r.getBulgeAt(s),u={x:l.x,y:l.y,z:i},p={x:c.x,y:c.y,z:i};if(lt.isPositive(Math.abs(d))){const m=L(a,u),h=L(a,p);Qa(t,e,new ue(m,h,d))}}}function mo(t,e,a,r,n,i){const o=L(a,r),s=new C.Vector3(a.elements[0],a.elements[1],a.elements[2]).length(),l={kind:"circle",layer:e,cx:o.x,cy:o.y,r:n*s,normalSign:Fe(i)};t.push(l)}function po(t,e,a,r){const n=L(a,r.center),i=new C.Vector3(a.elements[0],a.elements[1],a.elements[2]).length(),o={kind:"arc",layer:e,cx:n.x,cy:n.y,r:r.radius*i,startAngle:r.startAngle,endAngle:r.endAngle,normalSign:Fe(r.normal)};t.push(o)}function Kt(t,e,a,r){const n=L(a,r.center),i=r._geo,o=(i==null?void 0:i.majorAxis)??{x:1,y:0,z:0},s=tr(a,o),l=Math.hypot(s.x,s.y)||1,c=new C.Vector3(a.elements[0],a.elements[1],a.elements[2]).length(),d=new C.Vector3(a.elements[4],a.elements[5],a.elements[6]).length(),u={kind:"ellipse",layer:e,cx:n.x,cy:n.y,majorX:s.x/l,majorY:s.y/l,majorR:r.majorAxisRadius*c,minorR:r.minorAxisRadius*d,startAngle:r.startAngle,endAngle:r.endAngle,closed:r.closed,normalSign:Fe(r.normal)};t.push(u)}function ho(t,e,a,r){var n,i;const o=r._geo;if(!((n=o==null?void 0:o.controlPoints)!=null&&n.length))return;const s=[];for(const c of o.controlPoints){const d=L(a,c);s.push(d.x,d.y)}const l={kind:"spline",layer:e,controlPoints:s,degree:o.degree??3,knots:[...o.knots??[]],weights:[...o.weights??[]],closed:o.closed??!1};if((i=o.fitPoints)!=null&&i.length){l.fitPoints=[];for(const c of o.fitPoints){const d=L(a,c);l.fitPoints.push(d.x,d.y)}}t.push(l)}const ba=1e-6;function fo(t){var e;const a=t.elevation,r=(e=t._geo)==null?void 0:e.vertices;return r&&r.length>1?r.map(n=>({x:n.x,y:n.y,z:a,bulge:n.bulge,startWidth:n.startWidth,endWidth:n.endWidth})):Array.from({length:t.numberOfVertices},(n,i)=>{const o=t.getPoint2dAt(i);return{x:o.x,y:o.y,z:a,bulge:0}})}function go(t){return t.some(e=>{const a=Math.max(0,e.startWidth??0),r=Math.max(0,e.endWidth??0);return a>ba||r>ba})}function bo(t,e,a,r){const n=fo(r),i=n.length;if(i<2)return;if(go(n)){q(t,e,a,n,r.closed);return}const o=r.closed?i:i-1;for(let s=0;s<o;s++){const l=n[s],c=n[(s+1)%i],d=l.bulge??0;if(lt.isPositive(Math.abs(d))){const u=L(a,l),p=L(a,c);Qa(t,e,new ue(u,p,d))}}}function wo(t,e,a,r,n){const i=L(a,{x:r.center.x,y:r.center.y,z:n}),o=tr(a,{x:Math.cos(r.rotation),y:Math.sin(r.rotation),z:0}),s=Math.hypot(o.x,o.y)||1,l=new C.Vector3(a.elements[0],a.elements[1],a.elements[2]).length(),c=new C.Vector3(a.elements[4],a.elements[5],a.elements[6]).length();t.push({kind:"ellipse",layer:e,cx:i.x,cy:i.y,majorX:o.x/s,majorY:o.y/s,majorR:r.majorAxisRadius*l,minorR:r.minorAxisRadius*c,startAngle:r.startAngle,endAngle:r.endAngle,closed:!1,normalSign:r.clockwise?-1:1})}function xo(t,e,a,r,n){var i;const o=r.numberOfVertices;if(o<2)return;const s=[];for(let l=0;l<o;l++){const c=r.getPointAt(l);s.push({x:c.x,y:c.y,z:n,bulge:((i=r.vertices[l])==null?void 0:i.bulge)??0})}q(t,e,a,s,r.closed)}function yo(t,e,a,r,n){if(r instanceof Mn){xo(t,e,a,r,n);return}if(!(r instanceof Fn))return;const i=[];let o=!1;const s=()=>{const c=ga(i);c.length>=2&&q(t,e,a,c,!1),i.length=0};for(const c of r.curves)c instanceof Cn?fa(i,{x:c.startPoint.x,y:c.startPoint.y,z:n},{x:c.endPoint.x,y:c.endPoint.y,z:n},0):c instanceof ue?fa(i,{x:c.startPoint.x,y:c.startPoint.y,z:n},{x:c.endPoint.x,y:c.endPoint.y,z:n},oo(c)):c instanceof zn&&(o=!0,s(),wo(t,e,a,c,n));const l=ga(i);l.length>=2&&q(t,e,a,l,!o)}function vo(t,e,a,r){var n;const i=(n=r._geo)==null?void 0:n.loops;if(!(i!=null&&i.length))return;const o=r.elevation;for(const s of i)yo(t,e,a,s,o)}function ko(t,e,a,r){It(a,ar(r));const n=[0];for(let o=0;o<r.numColumns;o++)n.push(n[o]+r.columnWidth(o));const i=[0];for(let o=0;o<r.numRows;o++)i.push(i[o]-r.rowHeight(o));n[n.length-1],i[i.length-1];for(const o of i);for(const o of n);}function Ao(t,e,a,r,n,i,o,s=!0){const l=se(t.layer,a);if(o&&!o(l))return;const c=ro(t,i);if(c&&!n.has(c.objectId)&&no(c)){n.add(c.objectId);const u=It(e,ar(t));Et(c,u,l,r,n,i,o,s),n.delete(c.objectId);return}ko(r,l,e,t);const d=L(e,t.position);r.push({kind:"point",layer:l,x:d.x,y:d.y})}function Mo(t,e,a,r){let n=r.boundaryPath();if(n.length>1){const o=n[0],s=n[n.length-1];o.x===s.x&&o.y===s.y&&(o.z??0)===(s.z??0)&&(n=n.slice(0,-1))}n.length>=2&&q(t,e,a,n,!0);const i=L(a,r.position);t.push({kind:"point",layer:e,x:i.x,y:i.y})}function Fo(t,e,a,r){const n=r.position();q(t,e,a,[n.upperLeft,n.upperRight,n.lowerRight,n.lowerLeft],!0);const i=L(a,r.getLocation());t.push({kind:"point",layer:e,x:i.x,y:i.y})}function Co(t){var e;const a=(e=t.attributeIterator)==null?void 0:e.call(t);return a?typeof a.toArray=="function"?a.toArray():[...a]:[]}function se(t,e){return t==="0"?e:t}function nr(t,e,a,r,n,i,o,s=!0){if(!t.visibility)return;const l=se(t.layer,a);if(!(o&&!o(l))){if(t instanceof Jr){Ao(t,e,a,r,n,i,o,s);return}if(io(t)){const c=er(t,i);if(!c||n.has(c.objectId))return;n.add(c.objectId);const d=t.getFullInsertionTransform(),u=Math.max(1,t.columnCount??1),p=Math.max(1,t.rowCount??1),m=t.columnSpacing??0,h=t.rowSpacing??0,f=se(t.layer,a);for(let g=0;g<p;g++)for(let w=0;w<u;w++){const b=It(e,d);(w!==0||g!==0)&&b.multiply(new C.Matrix4().makeTranslation(w*m,g*h,0));const A=L(b,{x:0,y:0,z:0});r.push({kind:"point",layer:f,x:A.x,y:A.y}),Et(c,b,f,r,n,i,o,s)}for(const g of Co(t))g instanceof Zr,g.isInvisible||nr(g,e,f,r,n,i,o,s);n.delete(c.objectId);return}if(t instanceof qr){const c=t,d=ao(c,i);if(!d||n.has(d.objectId))return;n.add(d.objectId);const u=It(e,c.getFullDimBlockTransform());Et(d,u,l,r,n,i,o,!0),n.delete(d.objectId);return}if(to(t)){eo(r,l,e,t);return}if(t instanceof Qr){oe(e)?mo(r,l,e,t.center,t.radius,t.normal):Kt(r,l,e,zo(t));return}if(t instanceof tn){oe(e)?po(r,l,e,t):Kt(r,l,e,Bo(t));return}if(t instanceof de){Kt(r,l,e,t);return}if(t instanceof en){ho(r,l,e,t);return}if(t instanceof an){bo(r,l,e,t);return}if(t instanceof rn){uo(r,l,e,t);return}if(t instanceof nn){const c=[];for(let d=0;d<t.numberOfVertices;d++)c.push(t.getPointAt(d));wt(r,l,e,c,t.closed);return}if(t instanceof on){s&&vo(r,l,e,t);return}if(t instanceof sn){t.basePoint,t.unitDir;return}if(t instanceof ln){t.basePoint,t.unitDir;return}if(t instanceof cn){q(r,l,e,[t.getPointAt(0),t.getPointAt(1),t.getPointAt(3),t.getPointAt(2)],!0);return}if(t instanceof dn){s&&q(r,l,e,[t.getPointAt(0),t.getPointAt(1),t.getPointAt(3),t.getPointAt(2)],!0);return}if(t instanceof un){const c=t.subGetGripPoints();c.length>=2&&wt(r,l,e,c,c.length>=3);return}if(t instanceof mn){const c=t.vertices;c.length>=2&&wt(r,l,e,c,!1);return}if(t instanceof pn){so(r,l,e,t);return}if(t instanceof hn){co(r,l,e,t);return}if(t instanceof fn){const c=L(e,t.position);r.push({kind:"point",layer:l,x:c.x,y:c.y});return}if(t instanceof gn){const c=L(e,t.location);r.push({kind:"point",layer:l,x:c.x,y:c.y});return}if(t instanceof bn){s&&Fo(r,l,e,t);return}if(t instanceof wn){s&&Mo(r,l,e,t);return}if(t instanceof xn){const c=L(e,t.position);r.push({kind:"point",layer:l,x:c.x,y:c.y})}}}function Et(t,e,a,r,n,i,o,s=!0){for(const l of t.newIterator())nr(l,e,a,r,n,i,o,s)}function zo(t){return new de(t.center,t.normal,{x:1,y:0,z:0},t.radius,t.radius,0,An)}function Bo(t){return new de(t.center,t.normal,{x:1,y:0,z:0},t.radius,t.radius,t.startAngle,t.endAngle)}function Po(t,e,a={}){const r=Qi(t,e);if(!r)return{primitives:[]};const n=[],i=new C.Matrix4;return Et(r,i,"0",n,new Set,t,a.includeLayer),{primitives:n.filter(o=>o.kind!=="line"&&So(o))}}function So(t){switch(t.kind){case"line":return Number.isFinite(t.x0)&&Number.isFinite(t.y0)&&Number.isFinite(t.x1)&&Number.isFinite(t.y1);case"circle":return Number.isFinite(t.cx)&&Number.isFinite(t.cy)&&Number.isFinite(t.r);case"arc":return Number.isFinite(t.cx)&&Number.isFinite(t.cy)&&Number.isFinite(t.r)&&Number.isFinite(t.startAngle)&&Number.isFinite(t.endAngle);case"ellipse":return Number.isFinite(t.cx)&&Number.isFinite(t.cy)&&Number.isFinite(t.majorX)&&Number.isFinite(t.majorY)&&Number.isFinite(t.majorR)&&Number.isFinite(t.minorR)&&Number.isFinite(t.startAngle)&&Number.isFinite(t.endAngle);case"spline":return t.controlPoints.every(e=>Number.isFinite(e))&&t.knots.every(e=>Number.isFinite(e))&&t.weights.every(e=>Number.isFinite(e));case"point":return Number.isFinite(t.x)&&Number.isFinite(t.y);case"path":return t.vertices.length>=6&&t.vertices.length%3===0&&t.vertices.every(e=>Number.isFinite(e));default:return t}}const Lo=["en","zh","cs","tr","ar"];function Ce(t){if(t==null||t==="")return null;const e=t.toLowerCase().replace("_","-");for(const a of Lo)if(e===a||e.startsWith(`${a}-`))return a;return null}const Io=1128612673;function ir(t){if(t.version!==X)throw new Error(`Unsupported chunk version: ${t.version}`);const e=new we;e.writeU32(Io),e.writeU8(X),e.writeU8(0),e.writeU8(0),e.writeU8(0),e.writeString(t.layoutBtrId),e.writeU32(t.lineBatches.length);for(const a of t.lineBatches)Va(e,a);e.writeU32(t.meshBatches.length);for(const a of t.meshBatches)Xa(e,a);return e.toUint8Array()}async function Eo(t){const e=ir(t),a=(await Ha(e)).bytes;return{uncompressed:e,compressed:a}}const Uo=1,Ot=2*1024*1024,jt=2*1024*1024,No=8*1024*1024,wa=12*1024*1024,Do=2*1024*1024,_t="drawing.acex.json",To=`./${_t}`,le={layerOn:Pn,layerOff:Sn,chevronDown:Bn},Oo=[90,45,30,23,18,10,5];function jo(){return`<div id="mlcad-polar-angles" role="group" data-i18n-attr="aria-label" data-i18n-key="settings.polarAngles" aria-label="Polar tracking angles" hidden>
2
- ${Oo.map(t=>`<button type="button" class="mlcad-tool-btn mlcad-settings-option-btn mlcad-polar-angle-btn" data-polar-ang="${t}" title="${t}°" aria-label="${t}°"><span class="mlcad-settings-option-indicator" aria-hidden="true"></span><span class="mlcad-settings-option-text">${t}°</span></button>`).join("")}
3
- </div>`}const _o=600,$o=960,ze=`
4
- :root {
5
- --mlcad-ui-bg: rgba(24, 26, 30, 0.94);
6
- --mlcad-ui-bg-elevated: rgba(32, 35, 40, 0.98);
7
- --mlcad-ui-border: rgba(255, 255, 255, 0.1);
8
- --mlcad-ui-text: #e8eaed;
9
- --mlcad-ui-muted: #9aa0a6;
10
- --mlcad-accent: #08e8de;
11
- --mlcad-accent-active: #1a8cff;
12
- /* Shared measure-tool SVGs read --el-color-primary (Element Plus in cad-viewer). */
13
- --el-color-primary: var(--mlcad-accent);
14
- --ml-ui-accent: var(--mlcad-accent);
15
- --ml-ui-bg: var(--mlcad-ui-bg);
16
- --ml-ui-bg-elevated: var(--mlcad-ui-bg-elevated);
17
- --ml-ui-border: var(--mlcad-ui-border);
18
- --ml-ui-text: var(--mlcad-ui-text);
19
- --ml-ui-muted: var(--mlcad-ui-muted);
20
- --mlcad-tool-btn-active-border: rgba(26, 140, 255, 0.55);
21
- --mlcad-tool-btn-active-bg: rgba(26, 140, 255, 0.22);
22
- --mlcad-measure-accent: #08e8de;
23
- --mlcad-measure-accent-border: rgba(8, 232, 222, 0.45);
24
- --mlcad-measure-accent-fill: rgba(8, 232, 222, 0.2);
25
- --mlcad-markup-accent: #e53935;
26
- --mlcad-markup-accent-border: rgba(229, 57, 53, 0.45);
27
- --mlcad-shadow: 0 8px 28px rgba(0, 0, 0, 0.45);
28
- --mlcad-toolbar-width: 44px;
29
- --mlcad-drawer-width: 220px;
30
- --mlcad-drawer-gap: 8px;
31
- --mlcad-ui-inset: 12px;
32
- --mlcad-review-max-height: calc(100vh - 2 * var(--mlcad-ui-inset) - 48px);
33
- --mlcad-z-chrome: 7;
34
- /* Drawing overlays stay under chrome, session panel, and modal dialogs. */
35
- --mlcad-z-measure: 1;
36
- --mlcad-z-markup: 2;
37
- --ml-ui-grip-size: 8px;
38
- --ml-ui-grip-normal: #0080ff;
39
- --ml-ui-grip-hot: #ff0000;
40
- }
41
- html, body {
42
- margin: 0; height: 100%; overflow: hidden;
43
- background: #121418;
44
- font-family: "Segoe UI", system-ui, -apple-system, sans-serif;
45
- color: var(--mlcad-ui-text);
46
- }
47
- #mlcad-root { position: relative; width: 100%; height: 100%; }
48
- #mlcad-canvas-host {
49
- position: absolute;
50
- inset: 0;
51
- min-width: 0;
52
- min-height: 0;
53
- -webkit-touch-callout: none;
54
- -webkit-tap-highlight-color: transparent;
55
- }
56
- #mlcad-canvas-host canvas,
57
- #mlcad-root > canvas {
58
- display: block;
59
- width: 100%;
60
- height: 100%;
61
- touch-action: none;
62
- -webkit-user-select: none;
63
- user-select: none;
64
- -webkit-touch-callout: none;
65
- -webkit-tap-highlight-color: transparent;
66
- }
67
-
68
- .mlcad-snap-loupe {
69
- position: absolute;
70
- left: 8px;
71
- top: 8px;
72
- width: 128px;
73
- height: 128px;
74
- box-sizing: border-box;
75
- border: 2px solid var(--mlcad-measure-accent, #08e8de);
76
- border-radius: 2px;
77
- pointer-events: none;
78
- z-index: 8;
79
- overflow: hidden;
80
- box-shadow: var(--mlcad-shadow);
81
- }
82
-
83
- html[data-mlcad-theme="light"] {
84
- --mlcad-ui-bg: rgba(255, 255, 255, 0.94);
85
- --mlcad-ui-bg-elevated: rgba(248, 249, 250, 0.98);
86
- --mlcad-ui-border: rgba(0, 0, 0, 0.12);
87
- --mlcad-ui-text: #202124;
88
- --mlcad-ui-muted: #5f6368;
89
- --mlcad-shadow: 0 8px 28px rgba(0, 0, 0, 0.18);
90
- }
91
- html[data-mlcad-theme="light"],
92
- html[data-mlcad-theme="light"] body {
93
- background: #e8eaed;
94
- color: var(--mlcad-ui-text);
95
- }
96
-
97
- #mlcad-sidebar {
98
- position: absolute;
99
- left: var(--mlcad-ui-inset);
100
- top: 50%;
101
- z-index: var(--mlcad-z-chrome);
102
- transform: translateY(-50%);
103
- display: flex;
104
- align-items: flex-start;
105
- gap: var(--mlcad-drawer-gap);
106
- max-width: calc(100% - 2 * var(--mlcad-ui-inset));
107
- box-sizing: border-box;
108
- pointer-events: none;
109
- }
110
- #mlcad-sidebar > * { pointer-events: auto; }
111
-
112
- #mlcad-toolbar {
113
- flex-shrink: 0;
114
- display: flex;
115
- flex-direction: column;
116
- align-items: stretch;
117
- padding: 0;
118
- background: transparent;
119
- border: none;
120
- border-radius: 0;
121
- box-shadow: none;
122
- backdrop-filter: none;
123
- }
124
- /* AcUiToolbar chrome replaces the old .mlcad-tool-btn shell styles. */
125
- #mlcad-toolbar .ml-ex-ui-toolbar {
126
- position: relative !important;
127
- inset: auto !important;
128
- left: auto !important;
129
- top: auto !important;
130
- right: auto !important;
131
- bottom: auto !important;
132
- transform: none !important;
133
- background: var(--mlcad-ui-bg);
134
- border: 1px solid var(--mlcad-ui-border);
135
- border-radius: 8px;
136
- box-shadow: var(--mlcad-shadow);
137
- backdrop-filter: blur(12px);
138
- --ml-ex-ui-toolbar-btn-size: var(--mlcad-toolbar-width);
139
- }
140
- #mlcad-toolbar .ml-ex-ui-toolbar.is-left,
141
- #mlcad-toolbar .ml-ex-ui-toolbar.is-right {
142
- flex-direction: column;
143
- }
144
- #mlcad-toolbar .ml-ex-ui-toolbar.is-bottom,
145
- #mlcad-toolbar .ml-ex-ui-toolbar.is-top {
146
- flex-direction: row;
147
- width: 100%;
148
- box-sizing: border-box;
149
- }
150
- #mlcad-sidebar > #mlcad-toolbar.ml-ex-ui-toolbar-host {
151
- display: flex;
152
- flex-direction: column;
153
- align-items: stretch;
154
- }
155
- /* Phone strips mount on #mlcad-root so they can sit above the bottom bar. */
156
- #mlcad-root > .ml-ex-ui-subtoolbar {
157
- z-index: calc(var(--mlcad-z-chrome) + 1);
158
- }
159
- .mlcad-tool-btn {
160
- position: relative;
161
- display: flex; flex-direction: column; align-items: center; justify-content: center;
162
- gap: 2px;
163
- width: var(--mlcad-toolbar-width); height: var(--mlcad-toolbar-width);
164
- margin: 0; padding: 0;
165
- border: 1px solid transparent;
166
- border-radius: 6px;
167
- background: transparent;
168
- color: var(--mlcad-ui-text);
169
- cursor: pointer;
170
- transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
171
- }
172
- .mlcad-tool-btn:hover {
173
- background: rgba(255, 255, 255, 0.08);
174
- border-color: var(--mlcad-ui-border);
175
- }
176
- .mlcad-tool-btn.active,
177
- .mlcad-tool-btn.is-menu-open {
178
- background: var(--mlcad-tool-btn-active-bg);
179
- border-color: var(--mlcad-tool-btn-active-border);
180
- color: #fff;
181
- }
182
- .mlcad-tool-btn-icon {
183
- display: inline-flex;
184
- align-items: center;
185
- justify-content: center;
186
- width: 20px;
187
- height: 20px;
188
- flex-shrink: 0;
189
- }
190
- .mlcad-tool-btn-icon svg,
191
- .mlcad-tool-btn svg {
192
- width: 20px; height: 20px; display: block; flex-shrink: 0;
193
- }
194
- .mlcad-tool-btn-label {
195
- display: none;
196
- max-width: 100%;
197
- overflow: hidden;
198
- text-overflow: ellipsis;
199
- white-space: nowrap;
200
- font-size: 10px;
201
- line-height: 1.2;
202
- text-align: center;
203
- pointer-events: none;
204
- }
205
- /* Settings is always on the bar (desktop/pad/phone); language lives under it. */
206
- /* Flyout mark: opaque corner triangle (cad-simple-ui-plugin is-left style). */
207
- .mlcad-tool-btn.has-children::after {
208
- content: '';
209
- position: absolute;
210
- right: 1px;
211
- bottom: 1px;
212
- width: 6px;
213
- height: 6px;
214
- background: currentColor;
215
- clip-path: polygon(100% 100%, 0 100%, 100% 0);
216
- pointer-events: none;
217
- }
218
- .mlcad-dropdown {
219
- position: fixed;
220
- z-index: 40;
221
- min-width: 180px;
222
- max-width: min(280px, calc(100vw - 24px));
223
- max-height: min(360px, calc(100vh - 24px));
224
- overflow-y: auto;
225
- padding: 4px;
226
- background: var(--mlcad-ui-bg-elevated);
227
- border: 1px solid var(--mlcad-ui-border);
228
- border-radius: 8px;
229
- box-shadow: var(--mlcad-shadow);
230
- backdrop-filter: blur(12px);
231
- }
232
- .mlcad-dropdown-item {
233
- display: flex;
234
- align-items: center;
235
- gap: 8px;
236
- width: 100%;
237
- box-sizing: border-box;
238
- margin: 0;
239
- padding: 6px 8px;
240
- border: none;
241
- border-radius: 5px;
242
- background: transparent;
243
- color: var(--mlcad-ui-text);
244
- font-size: 12px;
245
- font-weight: 500;
246
- text-align: left;
247
- cursor: pointer;
248
- }
249
- .mlcad-dropdown-item:hover {
250
- background: rgba(255, 255, 255, 0.08);
251
- }
252
- .mlcad-dropdown-item.active,
253
- .mlcad-dropdown-item.is-toggled {
254
- background: rgba(26, 140, 255, 0.22);
255
- color: #fff;
256
- }
257
- .mlcad-dropdown-icon {
258
- display: inline-flex;
259
- width: 18px;
260
- height: 18px;
261
- flex-shrink: 0;
262
- align-items: center;
263
- justify-content: center;
264
- }
265
- .mlcad-dropdown-icon svg {
266
- width: 18px;
267
- height: 18px;
268
- display: block;
269
- }
270
- .mlcad-dropdown-label {
271
- overflow: hidden;
272
- text-overflow: ellipsis;
273
- white-space: nowrap;
274
- }
275
- .mlcad-dropdown-separator {
276
- height: 1px;
277
- margin: 4px 6px;
278
- background: var(--mlcad-ui-border);
279
- }
280
- #mlcad-toolbar-toggle {
281
- height: calc(var(--mlcad-toolbar-width) / 2);
282
- margin-top: -4px;
283
- margin-bottom: -4px;
284
- border-radius: 4px;
285
- }
286
- #mlcad-toolbar-toggle svg {
287
- width: calc(var(--mlcad-toolbar-width) / 2);
288
- height: calc(var(--mlcad-toolbar-width) / 2);
289
- }
290
- .mlcad-tool-separator {
291
- height: 1px;
292
- margin: 4px 8px;
293
- background: var(--mlcad-ui-border);
294
- }
295
- .mlcad-locale-option-badge {
296
- display: inline-flex;
297
- align-items: center;
298
- justify-content: center;
299
- width: 100%;
300
- height: 100%;
301
- font-size: 12px;
302
- font-weight: 700;
303
- line-height: 1;
304
- letter-spacing: -0.04em;
305
- user-select: none;
306
- }
307
- #mlcad-zoom-window-rect,
308
- #mlcad-selection-rect {
309
- position: fixed;
310
- z-index: 25;
311
- box-sizing: border-box;
312
- pointer-events: none;
313
- border: 1px dashed var(--mlcad-accent, #08e8de);
314
- background: rgba(8, 232, 222, 0.12);
315
- }
316
- #mlcad-zoom-window-rect[hidden],
317
- #mlcad-selection-rect[hidden] { display: none; }
318
- #mlcad-selection-rect[data-mode='window'] {
319
- border-style: solid;
320
- border-color: #00ff5a;
321
- background: rgba(64, 158, 255, 0.12);
322
- }
323
- #mlcad-selection-rect[data-mode='crossing'] {
324
- border-style: dashed;
325
- border-color: #00d1ff;
326
- background: rgba(64, 158, 255, 0.12);
327
- }
328
-
329
- #mlcad-layer-drawer,
330
- #mlcad-review-drawer,
331
- #mlcad-measure-drawer {
332
- flex-shrink: 1;
333
- min-width: 0;
334
- width: var(--mlcad-drawer-width);
335
- max-height: min(420px, var(--mlcad-review-max-height));
336
- display: flex; flex-direction: column;
337
- background: var(--mlcad-ui-bg-elevated);
338
- border: 1px solid var(--mlcad-ui-border);
339
- border-radius: 8px;
340
- box-shadow: var(--mlcad-shadow);
341
- backdrop-filter: blur(12px);
342
- overflow: hidden;
343
- box-sizing: border-box;
344
- }
345
- #mlcad-markup-strip-wrap {
346
- position: relative;
347
- }
348
- #mlcad-review-drawer {
349
- position: absolute;
350
- left: 100%;
351
- top: 0;
352
- margin-left: var(--mlcad-drawer-gap);
353
- width: min(320px, calc(100vw - 2 * var(--mlcad-ui-inset) - var(--mlcad-toolbar-width) - var(--mlcad-drawer-gap)));
354
- height: 100%;
355
- max-height: var(--mlcad-review-max-height);
356
- }
357
- #mlcad-layer-drawer[hidden],
358
- #mlcad-review-drawer[hidden],
359
- #mlcad-measure-drawer[hidden] { display: none; }
360
-
361
- .mlcad-drawer-header {
362
- display: flex; align-items: center; justify-content: space-between;
363
- gap: 6px; padding: 8px 10px;
364
- border-bottom: 1px solid var(--mlcad-ui-border);
365
- font-size: 13px; font-weight: 600;
366
- }
367
- .mlcad-drawer-close {
368
- width: 28px; height: 28px; padding: 0;
369
- border: none; border-radius: 4px;
370
- background: transparent; color: var(--mlcad-ui-muted);
371
- cursor: pointer; font-size: 18px; line-height: 1;
372
- }
373
- .mlcad-drawer-close:hover {
374
- background: rgba(255, 255, 255, 0.08); color: var(--mlcad-ui-text);
375
- }
376
-
377
- .mlcad-drawer-sheet-chrome {
378
- display: none;
379
- position: relative;
380
- }
381
- .mlcad-drawer-grabber {
382
- flex: 1 1 auto;
383
- display: flex;
384
- align-items: center;
385
- justify-content: center;
386
- min-height: 20px;
387
- cursor: ns-resize;
388
- touch-action: none;
389
- }
390
- .mlcad-drawer-grabber::before {
391
- content: '';
392
- position: absolute;
393
- left: 50%;
394
- top: 50%;
395
- transform: translate(-50%, -50%);
396
- width: 36px;
397
- height: 4px;
398
- border-radius: 2px;
399
- background: var(--mlcad-ui-muted);
400
- opacity: 0.75;
401
- }
402
- .mlcad-drawer-sheet-close {
403
- width: 36px; height: 28px; padding: 0;
404
- border: none; background: transparent;
405
- color: var(--mlcad-ui-muted); cursor: pointer;
406
- display: inline-flex; align-items: center; justify-content: center;
407
- flex: 0 0 auto;
408
- position: relative;
409
- z-index: 1;
410
- }
411
- .mlcad-drawer-sheet-close:hover { color: var(--mlcad-ui-text); }
412
- .mlcad-drawer-sheet-close svg { width: 18px; height: 18px; }
413
-
414
- .mlcad-layer-actions {
415
- display: flex; gap: 4px; padding: 6px 8px;
416
- border-bottom: 1px solid var(--mlcad-ui-border);
417
- }
418
- .mlcad-layer-action-btn {
419
- flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
420
- min-height: 30px; padding: 4px 8px;
421
- border: 1px solid var(--mlcad-ui-border);
422
- border-radius: 5px;
423
- background: rgba(255, 255, 255, 0.04);
424
- color: var(--mlcad-ui-text);
425
- font-size: 12px; cursor: pointer;
426
- }
427
- .mlcad-layer-action-btn:hover { background: rgba(255, 255, 255, 0.1); }
428
- .mlcad-layer-action-btn svg { width: 14px; height: 14px; flex-shrink: 0; }
429
-
430
- #mlcad-layer-list {
431
- flex: 1; overflow: auto; padding: 4px 0;
432
- }
433
- .mlcad-layer-item {
434
- display: grid;
435
- grid-template-columns: auto auto 1fr auto;
436
- align-items: center; gap: 6px;
437
- padding: 5px 8px;
438
- font-size: 12px; cursor: pointer;
439
- }
440
- .mlcad-layer-item:hover { background: rgba(255, 255, 255, 0.05); }
441
- .mlcad-layer-item input { margin: 0; cursor: pointer; }
442
- .mlcad-layer-swatch {
443
- width: 12px; height: 12px; border-radius: 2px;
444
- border: 1px solid rgba(255, 255, 255, 0.28);
445
- }
446
- .mlcad-layer-name {
447
- overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
448
- }
449
- .mlcad-layer-zoom {
450
- display: flex; align-items: center; justify-content: center;
451
- width: 22px; height: 22px; padding: 0;
452
- border: 1px solid transparent; border-radius: 4px;
453
- background: transparent; color: var(--mlcad-ui-muted);
454
- cursor: pointer;
455
- }
456
- .mlcad-layer-zoom svg {
457
- width: 14px; height: 14px; display: block;
458
- }
459
- .mlcad-layer-zoom:hover:not(:disabled) {
460
- color: var(--mlcad-accent);
461
- border-color: var(--mlcad-ui-border);
462
- background: rgba(255, 255, 255, 0.06);
463
- }
464
- .mlcad-layer-zoom:disabled { opacity: 0.35; cursor: not-allowed; }
465
-
466
- .mlcad-review-toolbar {
467
- display: flex; gap: 6px; align-items: center;
468
- padding: 6px 8px;
469
- border-bottom: 1px solid var(--mlcad-ui-border);
470
- }
471
- .mlcad-review-search {
472
- flex: 1; min-width: 0;
473
- box-sizing: border-box;
474
- padding: 4px 8px;
475
- border: 1px solid var(--mlcad-ui-border);
476
- border-radius: 4px;
477
- background: rgba(255, 255, 255, 0.04);
478
- color: var(--mlcad-ui-text);
479
- font-size: 12px;
480
- }
481
- .mlcad-review-clear,
482
- .mlcad-review-zoom,
483
- .mlcad-review-delete {
484
- flex: 0 0 auto;
485
- padding: 4px 8px;
486
- border: 1px solid var(--mlcad-ui-border);
487
- border-radius: 4px;
488
- background: rgba(255, 255, 255, 0.04);
489
- color: var(--mlcad-ui-text);
490
- font-size: 12px; cursor: pointer;
491
- }
492
- .mlcad-review-clear:disabled { opacity: 0.5; cursor: default; }
493
- .mlcad-review-delete { color: #f56c6c; border-color: rgba(245, 108, 108, 0.55); }
494
- .mlcad-review-table-wrap { flex: 1 1 auto; min-height: 0; overflow: auto; }
495
- .mlcad-review-table {
496
- width: 100%; border-collapse: collapse; font-size: 12px;
497
- }
498
- .mlcad-review-table th,
499
- .mlcad-review-table td {
500
- padding: 4px 8px; text-align: left;
501
- border-bottom: 1px solid var(--mlcad-ui-border);
502
- overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
503
- max-width: 90px;
504
- }
505
- .mlcad-review-table tr.is-selected td {
506
- background: rgba(26, 140, 255, 0.22);
507
- }
508
- .mlcad-review-table tr { cursor: pointer; }
509
- .mlcad-review-empty td { text-align: center; color: var(--mlcad-ui-muted); cursor: default; }
510
- .mlcad-review-detail {
511
- flex: 0 1 auto;
512
- max-height: 52%;
513
- overflow: auto;
514
- border-top: 1px solid var(--mlcad-ui-border);
515
- padding: 8px 10px 14px;
516
- display: flex; flex-direction: column; gap: 6px;
517
- box-sizing: border-box;
518
- }
519
- .mlcad-review-detail[hidden] { display: none; }
520
- .mlcad-review-detail-header {
521
- display: flex; align-items: center; justify-content: space-between; gap: 4px;
522
- }
523
- .mlcad-review-detail-title { font-weight: 600; font-size: 12px; }
524
- .mlcad-review-detail-close {
525
- flex-shrink: 0;
526
- width: 24px; height: 24px; padding: 0;
527
- border: none; border-radius: 4px;
528
- background: transparent; color: var(--mlcad-ui-muted);
529
- cursor: pointer; font-size: 16px; line-height: 1;
530
- }
531
- .mlcad-review-detail-close:hover {
532
- background: rgba(255, 255, 255, 0.08); color: var(--mlcad-ui-text);
533
- }
534
- .mlcad-review-field { display: flex; flex-direction: column; gap: 2px; }
535
- .mlcad-review-field-label { font-size: 11px; color: var(--mlcad-ui-muted); }
536
- .mlcad-review-status,
537
- .mlcad-review-author,
538
- .mlcad-review-text,
539
- .mlcad-review-comment {
540
- box-sizing: border-box; width: 100%;
541
- padding: 4px 6px;
542
- border: 1px solid var(--mlcad-ui-border);
543
- border-radius: 4px;
544
- background: rgba(255, 255, 255, 0.04);
545
- color: var(--mlcad-ui-text);
546
- font-size: 12px;
547
- }
548
- .mlcad-review-author:disabled { opacity: 0.7; }
549
- .mlcad-review-comment { min-height: 44px; resize: vertical; }
550
- .mlcad-review-detail-actions { display: flex; gap: 6px; margin-top: 2px; }
551
-
552
- .mlcad-measure-toolbar {
553
- display: flex; gap: 8px; align-items: center;
554
- padding: 8px 10px; border-bottom: 1px solid var(--mlcad-ui-border);
555
- }
556
- .mlcad-measure-filter {
557
- flex: 1 1 auto; min-width: 0;
558
- display: flex; overflow: hidden;
559
- border: 1px solid var(--mlcad-ui-border); border-radius: 4px;
560
- }
561
- .mlcad-measure-filter-btn {
562
- flex: 1 1 0; min-width: 0; padding: 4px 2px;
563
- border: none; border-right: 1px solid var(--mlcad-ui-border);
564
- background: transparent; color: var(--mlcad-ui-text);
565
- font: inherit; font-size: 11px; cursor: pointer;
566
- white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
567
- }
568
- .mlcad-measure-filter-btn:last-child { border-right: none; }
569
- .mlcad-measure-filter-btn:hover:not(.is-active) {
570
- background: rgba(255, 255, 255, 0.06);
571
- }
572
- .mlcad-measure-filter-btn.is-active {
573
- background: rgba(8, 232, 222, 0.18);
574
- }
575
- .mlcad-measure-clear,
576
- .mlcad-measure-row-delete {
577
- border: 1px solid var(--mlcad-ui-border); border-radius: 4px;
578
- background: rgba(255, 255, 255, 0.04); color: var(--mlcad-ui-text);
579
- padding: 4px 8px; font-size: 12px; cursor: pointer;
580
- }
581
- .mlcad-measure-clear:disabled { opacity: 0.5; cursor: default; }
582
- .mlcad-measure-row-delete { color: #f56c6c; border-color: rgba(245, 108, 108, 0.55); padding: 2px 6px; font-size: 11px; }
583
- .mlcad-measure-table-wrap { flex: 1 1 auto; min-height: 0; overflow: auto; }
584
- .mlcad-measure-table { width: 100%; border-collapse: collapse; table-layout: fixed; }
585
- .mlcad-measure-table th,
586
- .mlcad-measure-table td {
587
- padding: 6px 8px; text-align: left; font-size: 12px;
588
- border-bottom: 1px solid var(--mlcad-ui-border);
589
- overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
590
- }
591
- .mlcad-measure-table tr.is-selected td {
592
- background: rgba(8, 232, 222, 0.12);
593
- }
594
- .mlcad-measure-table tr { cursor: pointer; }
595
- .mlcad-measure-empty td { text-align: center; color: var(--mlcad-ui-muted); cursor: default; }
596
- #mlcad-measure-strip-wrap { position: relative; }
597
- #mlcad-measure-drawer {
598
- position: absolute;
599
- left: 100%;
600
- top: 0;
601
- margin-left: var(--mlcad-drawer-gap);
602
- width: min(320px, calc(100vw - 2 * var(--mlcad-ui-inset) - var(--mlcad-toolbar-width) - var(--mlcad-drawer-gap)));
603
- height: 100%;
604
- max-height: var(--mlcad-review-max-height);
605
- }
606
-
607
- /*
608
- * Top canvas chrome: message bar + expiry share one row. Shortcut toolbar
609
- * and snap loupe stack below (see AcExHtmlTopChrome / ShortCutToolbar /
610
- * SnapLoupeMath).
611
- */
612
- #mlcad-top-chrome {
613
- position: absolute;
614
- left: 12px;
615
- right: 12px;
616
- top: 10px;
617
- z-index: var(--mlcad-z-chrome);
618
- display: flex;
619
- align-items: flex-start;
620
- gap: 8px;
621
- box-sizing: border-box;
622
- pointer-events: none;
623
- }
624
- #mlcad-status-bar {
625
- position: relative;
626
- flex: 1 1 auto;
627
- min-width: 0;
628
- /* Block layout so text-overflow: ellipsis works on direct textContent. */
629
- display: block;
630
- min-height: 28px;
631
- line-height: 28px;
632
- padding: 0 12px;
633
- border: 1px solid rgba(0, 0, 0, 0.12);
634
- border-radius: 6px;
635
- background: var(--mlcad-accent);
636
- color: #0b1f1e;
637
- font-size: 12px;
638
- font-weight: 600;
639
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.35);
640
- backdrop-filter: blur(10px);
641
- pointer-events: none;
642
- opacity: 1;
643
- transform: translateY(0);
644
- transition: opacity 0.18s ease, transform 0.18s ease;
645
- /* Shrink before the expiry badge; clip with an ellipsis when too narrow. */
646
- overflow: hidden;
647
- white-space: nowrap;
648
- text-overflow: ellipsis;
649
- }
650
- #mlcad-status-bar:empty,
651
- #mlcad-status-bar[hidden] {
652
- display: none;
653
- opacity: 0;
654
- transform: translateY(-6px);
655
- }
656
-
657
- /* Session panel DOM/CSS comes from shared AcUiMobileSessionPanel. */
658
- #mlcad-root {
659
- --ml-mobile-cmd-collapsed-height: var(--mlcad-toolbar-phone-height, 56px);
660
- }
661
- .ml-mobile-cmd-panel {
662
- z-index: calc(var(--mlcad-z-chrome) + 3);
663
- }
664
-
665
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-snap-strip-wrap,
666
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-measure-strip-wrap,
667
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-markup-strip-wrap,
668
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-zoom-strip-wrap,
669
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-settings-strip-wrap,
670
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-locale-strip-wrap,
671
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-layer-drawer,
672
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-review-drawer,
673
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-measure-drawer {
674
- display: none !important;
675
- }
676
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-toolbar .mlcad-tool-btn:not(#mlcad-toolbar-toggle) {
677
- display: none;
678
- }
679
- #mlcad-sidebar.mlcad-sidebar--collapsed #mlcad-toolbar .mlcad-tool-separator {
680
- display: none;
681
- }
682
-
683
- #mlcad-snap-strip-wrap,
684
- #mlcad-measure-strip-wrap,
685
- #mlcad-markup-strip-wrap,
686
- #mlcad-zoom-strip-wrap,
687
- #mlcad-settings-strip-wrap,
688
- #mlcad-locale-strip-wrap {
689
- flex-shrink: 0;
690
- min-width: 0;
691
- display: flex;
692
- flex-direction: row;
693
- align-items: flex-start;
694
- gap: var(--mlcad-drawer-gap);
695
- }
696
- #mlcad-snap-strip-wrap[hidden],
697
- #mlcad-measure-strip-wrap[hidden],
698
- #mlcad-markup-strip-wrap[hidden],
699
- #mlcad-zoom-strip-wrap[hidden],
700
- #mlcad-settings-strip-wrap[hidden],
701
- #mlcad-locale-strip-wrap[hidden] { display: none; }
702
-
703
- #mlcad-snap-strip,
704
- #mlcad-measure-strip,
705
- #mlcad-markup-strip,
706
- #mlcad-zoom-strip,
707
- #mlcad-settings-strip,
708
- #mlcad-locale-strip {
709
- flex-shrink: 0;
710
- display: flex;
711
- flex-direction: column;
712
- align-items: stretch;
713
- gap: 4px;
714
- padding: 6px;
715
- background: var(--mlcad-ui-bg);
716
- border: 1px solid var(--mlcad-ui-border);
717
- border-radius: 8px;
718
- box-shadow: var(--mlcad-shadow);
719
- backdrop-filter: blur(12px);
720
- }
721
- /* Pad/desktop: same button size as the parent bar so a vertical strip
722
- matches its width and a horizontal strip matches its height. */
723
- #mlcad-snap-strip .mlcad-tool-btn,
724
- #mlcad-measure-strip .mlcad-tool-btn,
725
- #mlcad-markup-strip .mlcad-tool-btn,
726
- #mlcad-zoom-strip .mlcad-tool-btn,
727
- #mlcad-settings-strip .mlcad-tool-btn,
728
- #mlcad-locale-strip .mlcad-tool-btn {
729
- width: var(--mlcad-toolbar-width);
730
- height: var(--mlcad-toolbar-width);
731
- }
732
- #mlcad-measure-strip .mlcad-tool-separator,
733
- #mlcad-markup-strip .mlcad-tool-separator {
734
- margin: 2px 4px;
735
- }
736
-
737
- #mlcad-polar-angles {
738
- flex-shrink: 0;
739
- display: inline-flex;
740
- flex-direction: column;
741
- align-items: stretch;
742
- gap: 4px;
743
- padding: 6px;
744
- max-width: min(280px, calc(100vw - 2 * var(--mlcad-ui-inset) - 3 * var(--mlcad-toolbar-width) - 3 * var(--mlcad-drawer-gap)));
745
- background: var(--mlcad-ui-bg);
746
- border: 1px solid var(--mlcad-ui-border);
747
- border-radius: 8px;
748
- box-shadow: var(--mlcad-shadow);
749
- backdrop-filter: blur(12px);
750
- }
751
- #mlcad-polar-angles[hidden] { display: none; }
752
-
753
- .mlcad-color-input {
754
- position: absolute;
755
- width: 0;
756
- height: 0;
757
- opacity: 0;
758
- pointer-events: none;
759
- }
760
- .mlcad-settings-option-btn {
761
- width: 100%;
762
- box-sizing: border-box;
763
- height: var(--mlcad-toolbar-width);
764
- justify-content: flex-start;
765
- gap: 8px;
766
- padding: 0 10px;
767
- font-size: 11px;
768
- font-weight: 500;
769
- }
770
- .mlcad-settings-option-indicator {
771
- flex-shrink: 0;
772
- width: 10px;
773
- height: 10px;
774
- border: 1px solid var(--mlcad-ui-muted);
775
- border-radius: 2px;
776
- box-sizing: border-box;
777
- transition: background 0.15s ease, border-color 0.15s ease;
778
- }
779
- .mlcad-settings-option-btn.active .mlcad-settings-option-indicator {
780
- background: var(--mlcad-accent);
781
- border-color: var(--mlcad-accent);
782
- }
783
- .mlcad-settings-option-text {
784
- overflow: hidden;
785
- text-overflow: ellipsis;
786
- white-space: nowrap;
787
- pointer-events: none;
788
- line-height: 1.2;
789
- }
790
-
791
- #mlcad-measure-overlays {
792
- position: absolute;
793
- inset: 0;
794
- pointer-events: none;
795
- z-index: var(--mlcad-z-measure);
796
- overflow: hidden;
797
- }
798
- .mlcad-measure-canvas {
799
- position: absolute;
800
- left: 0;
801
- top: 0;
802
- z-index: 1;
803
- pointer-events: none;
804
- }
805
- .mlcad-measure-dot {
806
- position: absolute;
807
- z-index: 3;
808
- /* em size tracks the paired badge font-size (set inline on the dot) */
809
- font-size: 12px;
810
- width: 0.55em;
811
- height: 0.55em;
812
- min-width: 5px;
813
- min-height: 5px;
814
- border-radius: 50%;
815
- background: var(--mlcad-measure-accent);
816
- border: 0.12em solid rgba(255, 255, 255, 0.9);
817
- box-sizing: border-box;
818
- transform: translate(-50%, -50%);
819
- visibility: hidden;
820
- pointer-events: none;
821
- cursor: grab;
822
- }
823
- .mlcad-measure-dot.mlcad-measure-selected {
824
- visibility: visible;
825
- pointer-events: auto;
826
- /* Hard ring at half original em thickness + soft glow */
827
- box-shadow:
828
- 0 0 0 0.06em rgba(255, 213, 79, 0.75),
829
- 0 0 0.35em rgba(255, 213, 79, 0.9),
830
- 0 0 0.7em rgba(255, 213, 79, 0.5);
831
- }
832
- #mlcad-measure-overlays.mlcad-grip-dragging .mlcad-measure-dot {
833
- visibility: hidden !important;
834
- pointer-events: none !important;
835
- }
836
- .mlcad-measure-badge {
837
- position: absolute;
838
- z-index: 2;
839
- /* em padding/radius/border so the capsule scales with font-size */
840
- padding: 0.25em 0.833em;
841
- border-radius: 1.167em;
842
- background: var(--mlcad-ui-bg-elevated);
843
- border: 0.083em solid var(--mlcad-measure-accent-border);
844
- color: var(--mlcad-measure-accent);
845
- font-size: 12px;
846
- font-weight: 600;
847
- white-space: nowrap;
848
- transform: translate(-50%, -50%);
849
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
850
- pointer-events: none;
851
- }
852
- .mlcad-measure-badge--coordinate {
853
- transform: translate(-50%, calc(-50% - 16px));
854
- }
855
- .mlcad-measure-badge.mlcad-measure-selected {
856
- /* Hard ring at half original em thickness + soft glow */
857
- outline: 0.075em solid rgba(255, 213, 79, 0.85);
858
- outline-offset: 0.04em;
859
- box-shadow:
860
- 0 0 0 0.075em rgba(255, 213, 79, 0.4),
861
- 0 0 0.45em rgba(255, 213, 79, 0.85),
862
- 0 0 0.9em rgba(255, 213, 79, 0.55),
863
- 0 2px 8px rgba(0, 0, 0, 0.35);
864
- }
865
- .mlcad-measure-canvas.mlcad-measure-selected {
866
- /* font-size is seeded from the paired badge so em tracks text size */
867
- filter:
868
- drop-shadow(0 0 0.12em #ffd54f)
869
- drop-shadow(0 0 0.3em rgba(255, 213, 79, 0.95))
870
- drop-shadow(0 0 0.6em rgba(255, 213, 79, 0.55));
871
- }
872
-
873
- #mlcad-markup-overlays {
874
- position: absolute;
875
- inset: 0;
876
- pointer-events: none;
877
- z-index: var(--mlcad-z-markup);
878
- overflow: hidden;
879
- }
880
- .mlcad-markup-canvas {
881
- position: absolute;
882
- left: 0;
883
- top: 0;
884
- z-index: 1;
885
- pointer-events: none;
886
- }
887
- .mlcad-markup-badge,
888
- .mlcad-markup-stamp {
889
- position: absolute;
890
- z-index: 2;
891
- padding: 3px 10px;
892
- border-radius: 14px;
893
- background: var(--mlcad-ui-bg-elevated);
894
- border: 1px solid var(--mlcad-markup-accent-border);
895
- color: var(--mlcad-markup-accent);
896
- font-size: 12px;
897
- font-weight: 600;
898
- white-space: pre-wrap;
899
- max-width: 240px;
900
- min-width: 80px;
901
- min-height: 1.75em;
902
- box-sizing: border-box;
903
- transform: translate(-50%, -50%);
904
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
905
- pointer-events: auto;
906
- cursor: grab;
907
- touch-action: none;
908
- user-select: none;
909
- }
910
- .mlcad-markup-stamp {
911
- border-radius: 4px;
912
- border-width: 2px;
913
- text-transform: uppercase;
914
- letter-spacing: 0.04em;
915
- font-size: 11px;
916
- white-space: nowrap;
917
- min-width: 0;
918
- }
919
- .mlcad-markup-preview-dot {
920
- position: absolute;
921
- font-size: 12px;
922
- width: 0.55em;
923
- height: 0.55em;
924
- min-width: 5px;
925
- min-height: 5px;
926
- border-radius: 50%;
927
- background: var(--mlcad-markup-accent);
928
- border: 0.12em solid rgba(255, 255, 255, 0.9);
929
- box-sizing: border-box;
930
- transform: translate(-50%, -50%);
931
- pointer-events: none;
932
- }
933
- .mlcad-markup-dot {
934
- position: absolute;
935
- z-index: 3;
936
- font-size: 12px;
937
- width: 0.55em;
938
- height: 0.55em;
939
- min-width: 5px;
940
- min-height: 5px;
941
- border-radius: 50%;
942
- background: var(--mlcad-markup-accent);
943
- border: 0.12em solid rgba(255, 255, 255, 0.9);
944
- box-sizing: border-box;
945
- transform: translate(-50%, -50%);
946
- visibility: hidden;
947
- pointer-events: none;
948
- cursor: grab;
949
- }
950
- .mlcad-markup-dot.mlcad-markup-selected {
951
- visibility: visible;
952
- pointer-events: auto;
953
- box-shadow:
954
- 0 0 0 0.06em rgba(255, 213, 79, 0.75),
955
- 0 0 0.35em rgba(255, 213, 79, 0.9),
956
- 0 0 0.7em rgba(255, 213, 79, 0.5);
957
- }
958
- #mlcad-markup-overlays.mlcad-grip-dragging .mlcad-markup-dot {
959
- visibility: hidden !important;
960
- pointer-events: none !important;
961
- }
962
- .mlcad-markup-badge.mlcad-markup-selected,
963
- .mlcad-markup-stamp.mlcad-markup-selected {
964
- outline: 0.075em solid rgba(255, 213, 79, 0.85);
965
- outline-offset: 0.04em;
966
- box-shadow:
967
- 0 0 0 0.075em rgba(255, 213, 79, 0.4),
968
- 0 0 0.45em rgba(255, 213, 79, 0.85),
969
- 0 0 0.9em rgba(255, 213, 79, 0.55),
970
- 0 2px 8px rgba(0, 0, 0, 0.35);
971
- }
972
- .mlcad-markup-canvas.mlcad-markup-selected {
973
- filter:
974
- drop-shadow(0 0 0.12em #ffd54f)
975
- drop-shadow(0 0 0.3em rgba(255, 213, 79, 0.95))
976
- drop-shadow(0 0 0.6em rgba(255, 213, 79, 0.55));
977
- }
978
-
979
- #mlcad-loading {
980
- position: fixed; inset: 0; z-index: 100;
981
- display: flex; align-items: center; justify-content: center;
982
- background: #121418;
983
- transition: opacity 0.35s ease, visibility 0.35s ease;
984
- }
985
- #mlcad-loading.mlcad-loading--done {
986
- opacity: 0; visibility: hidden; pointer-events: none;
987
- }
988
- #mlcad-loading.mlcad-loading--gate .mlcad-loading-spinner {
989
- display: none;
990
- }
991
- .mlcad-loading-spinner {
992
- width: 48px; height: 48px; box-sizing: border-box;
993
- border: 3px solid rgba(255, 255, 255, 0.12);
994
- border-top-color: var(--mlcad-accent);
995
- border-radius: 50%;
996
- animation: mlcad-spin 0.85s linear infinite;
997
- }
998
- @keyframes mlcad-spin { to { transform: rotate(360deg); } }
999
-
1000
- #mlcad-access-gate {
1001
- display: flex;
1002
- align-items: center;
1003
- justify-content: center;
1004
- width: 100%;
1005
- max-width: 360px;
1006
- padding: 0 20px;
1007
- box-sizing: border-box;
1008
- }
1009
- #mlcad-access-gate[hidden] {
1010
- display: none !important;
1011
- }
1012
- .mlcad-access-card {
1013
- width: 100%;
1014
- padding: 24px 20px;
1015
- border-radius: 10px;
1016
- border: 1px solid var(--mlcad-ui-border);
1017
- background: var(--mlcad-ui-bg-elevated);
1018
- box-shadow: var(--mlcad-shadow);
1019
- box-sizing: border-box;
1020
- }
1021
- .mlcad-access-title {
1022
- margin: 0 0 8px;
1023
- font-size: 16px;
1024
- font-weight: 600;
1025
- color: var(--mlcad-ui-text);
1026
- text-align: center;
1027
- }
1028
- .mlcad-access-hint {
1029
- margin: 0 0 16px;
1030
- font-size: 13px;
1031
- line-height: 1.45;
1032
- color: var(--mlcad-ui-muted);
1033
- text-align: center;
1034
- }
1035
- .mlcad-access-expiry {
1036
- margin: -8px 0 16px;
1037
- font-size: 12px;
1038
- line-height: 1.4;
1039
- color: var(--mlcad-ui-muted);
1040
- text-align: center;
1041
- }
1042
- .mlcad-access-expiry[hidden] {
1043
- display: none;
1044
- }
1045
- .mlcad-access-expiry.mlcad-expiry-countdown {
1046
- width: fit-content;
1047
- max-width: 100%;
1048
- margin-left: auto;
1049
- margin-right: auto;
1050
- margin-bottom: 16px;
1051
- padding: 6px 10px;
1052
- border-radius: 6px;
1053
- box-sizing: border-box;
1054
- }
1055
- .mlcad-access-field {
1056
- display: flex;
1057
- gap: 8px;
1058
- margin-bottom: 12px;
1059
- }
1060
- .mlcad-access-field input {
1061
- flex: 1 1 auto;
1062
- min-width: 0;
1063
- height: 36px;
1064
- padding: 0 12px;
1065
- border-radius: 6px;
1066
- border: 1px solid var(--mlcad-ui-border);
1067
- background: rgba(0, 0, 0, 0.25);
1068
- color: var(--mlcad-ui-text);
1069
- font: inherit;
1070
- box-sizing: border-box;
1071
- }
1072
- .mlcad-access-field input:focus {
1073
- outline: none;
1074
- border-color: rgba(26, 140, 255, 0.65);
1075
- box-shadow: 0 0 0 2px rgba(26, 140, 255, 0.2);
1076
- }
1077
- .mlcad-access-submit {
1078
- width: 100%;
1079
- height: 36px;
1080
- border: 1px solid rgba(26, 140, 255, 0.55);
1081
- border-radius: 6px;
1082
- background: rgba(26, 140, 255, 0.22);
1083
- color: #fff;
1084
- font: inherit;
1085
- font-weight: 600;
1086
- cursor: pointer;
1087
- }
1088
- .mlcad-access-submit:hover {
1089
- background: rgba(26, 140, 255, 0.32);
1090
- }
1091
- .mlcad-access-error {
1092
- margin: 0;
1093
- font-size: 12px;
1094
- line-height: 1.4;
1095
- color: #ff8a80;
1096
- text-align: center;
1097
- }
1098
- .mlcad-access-error[hidden] {
1099
- display: none;
1100
- }
1101
- .mlcad-access-gate--locked .mlcad-access-submit:disabled,
1102
- .mlcad-access-gate--locked .mlcad-access-field input:disabled {
1103
- opacity: 0.55;
1104
- cursor: not-allowed;
1105
- }
1106
- .mlcad-access-field[hidden],
1107
- .mlcad-access-submit[hidden],
1108
- .mlcad-access-gate--expired .mlcad-access-field,
1109
- .mlcad-access-gate--expired .mlcad-access-submit,
1110
- .mlcad-access-gate--expired #mlcad-access-expiry,
1111
- .mlcad-access-gate--expired #mlcad-access-error {
1112
- display: none !important;
1113
- }
1114
- .mlcad-expiry-badge {
1115
- position: relative;
1116
- flex: 0 0 auto;
1117
- margin-left: auto;
1118
- max-width: none;
1119
- padding: 8px 12px;
1120
- border-radius: 6px;
1121
- border: 1px solid var(--mlcad-ui-border);
1122
- background: var(--mlcad-ui-bg-elevated);
1123
- box-shadow: var(--mlcad-shadow);
1124
- color: var(--mlcad-ui-text);
1125
- font-size: 12px;
1126
- line-height: 1.4;
1127
- white-space: nowrap;
1128
- pointer-events: none;
1129
- box-sizing: border-box;
1130
- }
1131
- .mlcad-expiry-badge[hidden] {
1132
- display: none !important;
1133
- }
1134
- .mlcad-expiry-countdown {
1135
- border-color: rgba(255, 152, 0, 0.55);
1136
- background: rgba(255, 152, 0, 0.16);
1137
- color: #ffcc80;
1138
- font-variant-numeric: tabular-nums;
1139
- }
1140
-
1141
- @media (max-width: ${_o}px) {
1142
- :root {
1143
- --mlcad-drawer-width: min(280px, calc(100vw - 16px));
1144
- --mlcad-ui-inset: 0px;
1145
- --mlcad-toolbar-phone-height: 56px;
1146
- /* Portrait min width (narrower than simple-ui's height - 4). */
1147
- --mlcad-toolbar-phone-btn-size: max(
1148
- 24px,
1149
- calc(var(--mlcad-toolbar-phone-height) - 16px)
1150
- );
1151
- }
1152
- #mlcad-root {
1153
- display: flex;
1154
- flex-direction: column;
1155
- }
1156
- #mlcad-canvas-host {
1157
- position: relative;
1158
- flex: 1 1 auto;
1159
- inset: auto;
1160
- width: 100%;
1161
- min-height: 0;
1162
- }
1163
- #mlcad-sidebar {
1164
- position: relative;
1165
- left: auto;
1166
- top: auto;
1167
- right: auto;
1168
- transform: none;
1169
- width: 100%;
1170
- max-width: none;
1171
- flex: 0 0 auto;
1172
- flex-direction: column-reverse;
1173
- align-items: stretch;
1174
- gap: 0;
1175
- overflow: visible;
1176
- }
1177
- #mlcad-toolbar {
1178
- flex-direction: row;
1179
- width: 100%;
1180
- box-sizing: border-box;
1181
- gap: 0;
1182
- padding: 4px 0;
1183
- border-radius: 0;
1184
- border-left: none;
1185
- border-right: none;
1186
- border-bottom: none;
1187
- }
1188
- #mlcad-toolbar .mlcad-tool-btn {
1189
- flex: 1 1 0;
1190
- width: auto;
1191
- min-width: 0;
1192
- height: auto;
1193
- min-height: var(--mlcad-toolbar-phone-height);
1194
- border-radius: 0;
1195
- padding: 4px 2px;
1196
- }
1197
- #mlcad-toolbar .mlcad-tool-btn-label,
1198
- #mlcad-zoom-strip .mlcad-tool-btn-label,
1199
- #mlcad-measure-strip .mlcad-tool-btn-label,
1200
- #mlcad-markup-strip .mlcad-tool-btn-label,
1201
- #mlcad-settings-strip .mlcad-tool-btn-label,
1202
- #mlcad-locale-strip .mlcad-tool-btn-label,
1203
- #mlcad-snap-strip .mlcad-tool-btn-label {
1204
- display: block;
1205
- max-width: 100%;
1206
- overflow: hidden;
1207
- text-overflow: ellipsis;
1208
- white-space: nowrap;
1209
- }
1210
- /* Drop sticky :focus / touch :hover chrome after closing a strip. */
1211
- #mlcad-toolbar .mlcad-tool-btn:focus,
1212
- #mlcad-toolbar .mlcad-tool-btn:focus-visible {
1213
- outline: none;
1214
- }
1215
- #mlcad-toolbar .mlcad-tool-btn:focus:not(.active):not(.is-menu-open),
1216
- #mlcad-toolbar .mlcad-tool-btn:focus-visible:not(.active):not(.is-menu-open) {
1217
- background: transparent;
1218
- border-color: transparent;
1219
- }
1220
- @media (hover: none) {
1221
- #mlcad-toolbar .mlcad-tool-btn:hover:not(.active):not(.is-menu-open) {
1222
- background: transparent;
1223
- border-color: transparent;
1224
- }
1225
- }
1226
- .mlcad-tool-btn.has-children::after {
1227
- display: none;
1228
- }
1229
- #mlcad-toolbar-toggle,
1230
- #mlcad-toolbar .mlcad-tool-separator {
1231
- display: none !important;
1232
- }
1233
- /* Float above the bottom bar so the wrap does not occupy an in-flow
1234
- rectangle of page background around the rounded strip. */
1235
- #mlcad-sidebar > #mlcad-snap-strip-wrap,
1236
- #mlcad-sidebar > #mlcad-measure-strip-wrap,
1237
- #mlcad-sidebar > #mlcad-markup-strip-wrap,
1238
- #mlcad-sidebar > #mlcad-zoom-strip-wrap,
1239
- #mlcad-sidebar > #mlcad-settings-strip-wrap,
1240
- #mlcad-sidebar > #mlcad-locale-strip-wrap {
1241
- position: absolute;
1242
- left: 0;
1243
- right: 0;
1244
- bottom: 100%;
1245
- width: auto;
1246
- flex-direction: column;
1247
- align-items: stretch;
1248
- background: none;
1249
- box-shadow: none;
1250
- backdrop-filter: none;
1251
- overflow: visible;
1252
- pointer-events: none;
1253
- z-index: calc(var(--mlcad-z-chrome) + 1);
1254
- }
1255
- #mlcad-settings-strip-wrap:not([hidden]) {
1256
- display: flex !important;
1257
- }
1258
- #mlcad-snap-strip,
1259
- #mlcad-measure-strip,
1260
- #mlcad-markup-strip,
1261
- #mlcad-zoom-strip,
1262
- #mlcad-settings-strip,
1263
- #mlcad-locale-strip {
1264
- display: grid;
1265
- /* Fallback before wrap-pack JS: auto-fit stretches a short strip evenly.
1266
- JS then sets an explicit column count so wrapped last rows stay narrow. */
1267
- grid-template-columns: repeat(
1268
- auto-fit,
1269
- minmax(var(--mlcad-toolbar-phone-btn-size), 1fr)
1270
- );
1271
- justify-content: start;
1272
- align-content: flex-start;
1273
- width: auto;
1274
- box-sizing: border-box;
1275
- gap: 0;
1276
- margin: 4px 8px 8px;
1277
- padding: 4px 0;
1278
- border-radius: 8px;
1279
- /* Match active toolbar button outline. */
1280
- border: 1px solid var(--mlcad-tool-btn-active-border);
1281
- box-shadow: none;
1282
- backdrop-filter: none;
1283
- overflow: hidden;
1284
- isolation: isolate;
1285
- clip-path: inset(0 round 8px);
1286
- pointer-events: auto;
1287
- }
1288
- #mlcad-snap-strip .mlcad-tool-btn,
1289
- #mlcad-measure-strip .mlcad-tool-btn,
1290
- #mlcad-markup-strip .mlcad-tool-btn,
1291
- #mlcad-zoom-strip .mlcad-tool-btn,
1292
- #mlcad-settings-strip .mlcad-tool-btn,
1293
- #mlcad-locale-strip .mlcad-tool-btn {
1294
- width: 100%;
1295
- min-width: 0;
1296
- height: auto;
1297
- min-height: var(--mlcad-toolbar-phone-height);
1298
- border-radius: 0;
1299
- padding: 4px 2px;
1300
- box-sizing: border-box;
1301
- }
1302
- #mlcad-measure-strip .mlcad-tool-separator,
1303
- #mlcad-markup-strip .mlcad-tool-separator {
1304
- display: none;
1305
- }
1306
- #mlcad-polar-angles {
1307
- flex-direction: row;
1308
- flex-wrap: wrap;
1309
- max-width: none;
1310
- width: 100%;
1311
- box-sizing: border-box;
1312
- border-radius: 0;
1313
- pointer-events: auto;
1314
- }
1315
- #mlcad-layer-drawer,
1316
- #mlcad-review-drawer,
1317
- #mlcad-measure-drawer {
1318
- position: fixed;
1319
- left: 0;
1320
- right: 0;
1321
- bottom: var(--mlcad-phone-drawer-bottom, var(--mlcad-toolbar-phone-height));
1322
- top: auto;
1323
- margin: 0;
1324
- width: 100%;
1325
- max-width: none;
1326
- height: min(42vh, calc(100vh - var(--mlcad-phone-drawer-bottom, var(--mlcad-toolbar-phone-height)) - 12px));
1327
- max-height: calc(100vh - var(--mlcad-phone-drawer-bottom, var(--mlcad-toolbar-phone-height)) - 12px);
1328
- z-index: calc(var(--mlcad-z-chrome) + 1);
1329
- border-radius: 12px 12px 0 0;
1330
- pointer-events: auto;
1331
- }
1332
- #mlcad-layer-drawer .mlcad-drawer-sheet-chrome,
1333
- #mlcad-review-drawer .mlcad-drawer-sheet-chrome,
1334
- #mlcad-measure-drawer .mlcad-drawer-sheet-chrome {
1335
- display: flex;
1336
- align-items: center;
1337
- flex: 0 0 auto;
1338
- min-height: 28px;
1339
- }
1340
- #mlcad-layer-drawer .mlcad-drawer-header,
1341
- #mlcad-review-drawer .mlcad-drawer-header,
1342
- #mlcad-measure-drawer .mlcad-drawer-header {
1343
- display: none;
1344
- }
1345
- .mlcad-layer-action-btn {
1346
- min-height: 28px;
1347
- padding: 3px 6px;
1348
- font-size: 11px;
1349
- gap: 4px;
1350
- }
1351
- .mlcad-layer-action-btn svg { width: 12px; height: 12px; }
1352
- .mlcad-layer-zoom {
1353
- width: 20px;
1354
- height: 20px;
1355
- }
1356
- .mlcad-layer-zoom svg {
1357
- width: 12px;
1358
- height: 12px;
1359
- }
1360
- #mlcad-top-chrome {
1361
- left: 8px;
1362
- right: 8px;
1363
- top: 8px;
1364
- }
1365
-
1366
- }
1367
-
1368
- /* Pad / coarse pointer: same toolbar as desktop, minus select and pan. */
1369
- @media (max-width: ${$o}px), (pointer: coarse) {
1370
- #mlcad-toolbar [data-action="select"],
1371
- #mlcad-toolbar [data-action="pan"] {
1372
- display: none !important;
1373
- }
1374
- }
1375
-
1376
- /*
1377
- * Hide toolbar chrome during measure / markup without changing canvas size.
1378
- * On phone the sidebar is in the flex column; display:none would expand
1379
- * #mlcad-canvas-host and shift the drawing. Session panel floats on top.
1380
- */
1381
- #mlcad-root.mlcad-session-active #mlcad-sidebar {
1382
- visibility: hidden !important;
1383
- pointer-events: none !important;
1384
- }
1385
- `;function Be(t,e="measure",a=!0){const r=e==="measure"?`${jo()}${Ho()}${Ro()}`:"";return`
1386
- <div id="mlcad-loading" aria-hidden="true" style="background:${t}">
1387
- <div class="mlcad-loading-spinner"></div>
1388
- <div id="mlcad-access-gate" hidden>
1389
- <form id="mlcad-access-form" class="mlcad-access-card">
1390
- <h2 class="mlcad-access-title" data-i18n-key="access.title" data-i18n-text>Protected drawing</h2>
1391
- <p class="mlcad-access-hint" data-i18n-key="access.passwordPrompt" data-i18n-text>Enter the password to open this file.</p>
1392
- <p id="mlcad-access-expiry" class="mlcad-access-expiry" hidden></p>
1393
- <div class="mlcad-access-field">
1394
- <input
1395
- id="mlcad-access-password"
1396
- type="password"
1397
- autocomplete="off"
1398
- data-i18n-key="access.passwordPlaceholder"
1399
- data-i18n-attr="placeholder aria-label"
1400
- placeholder="Password"
1401
- aria-label="Password"
1402
- />
1403
- </div>
1404
- <button type="submit" class="mlcad-access-submit" data-i18n-key="access.unlock" data-i18n-text>Unlock</button>
1405
- <p id="mlcad-access-error" class="mlcad-access-error" hidden></p>
1406
- </form>
1407
- </div>
1408
- </div>
1409
- <div id="mlcad-root">
1410
- <div id="mlcad-canvas-host">
1411
- <div id="mlcad-top-chrome">
1412
- <footer id="mlcad-status-bar" aria-live="polite" hidden></footer>
1413
- </div>
1414
- </div>
1415
- <aside id="mlcad-sidebar">
1416
- <nav id="mlcad-toolbar" data-i18n-attr="aria-label" data-i18n-key="toolbar.viewerTools" aria-label="Viewer tools"></nav>
1417
- ${r}
1418
- <div id="mlcad-layer-drawer" role="dialog" data-i18n-attr="aria-label" data-i18n-key="layers.title" aria-label="Layers" hidden>
1419
- ${Pe("mlcad-layer-sheet-close","layers.close","Close layers")}
1420
- <div class="mlcad-drawer-header">
1421
- <span data-i18n-key="layers.title" data-i18n-text>Layers</span>
1422
- <button type="button" class="mlcad-drawer-close" id="mlcad-layer-close" data-i18n-key="layers.close" data-i18n-attr="aria-label" aria-label="Close layers">×</button>
1423
- </div>
1424
- <div class="mlcad-layer-actions">
1425
- <button type="button" class="mlcad-layer-action-btn" id="mlcad-layer-show-all">
1426
- ${le.layerOn}<span data-i18n-key="layers.showAll" data-i18n-text>Show all</span>
1427
- </button>
1428
- <button type="button" class="mlcad-layer-action-btn" id="mlcad-layer-hide-all">
1429
- ${le.layerOff}<span data-i18n-key="layers.hideAll" data-i18n-text>Hide all</span>
1430
- </button>
1431
- </div>
1432
- <div id="mlcad-layer-list"></div>
1433
- </div>
1434
- </aside>
1435
- </div>
1436
- `}function Pe(t,e,a){return`<div class="mlcad-drawer-sheet-chrome">
1437
- <div class="mlcad-drawer-grabber" role="separator" aria-orientation="horizontal"></div>
1438
- <button type="button" class="mlcad-drawer-sheet-close" id="${t}" data-i18n-key="${e}" data-i18n-attr="aria-label" aria-label="${a}">${le.chevronDown}</button>
1439
- </div>`}function Ro(){return`<div id="mlcad-review-drawer" role="dialog" data-i18n-attr="aria-label" data-i18n-key="review.title" aria-label="Review" hidden>
1440
- ${Pe("mlcad-review-sheet-close","review.close","Close review")}
1441
- <div class="mlcad-drawer-header">
1442
- <span data-i18n-key="review.title" data-i18n-text>Review</span>
1443
- <button type="button" class="mlcad-drawer-close" id="mlcad-review-close" data-i18n-key="review.close" data-i18n-attr="aria-label" aria-label="Close review">×</button>
1444
- </div>
1445
- <div class="mlcad-review-toolbar">
1446
- <input type="search" class="mlcad-review-search" data-i18n-key="review.searchPlaceholder" data-i18n-attr="placeholder" placeholder="Search markups" />
1447
- <button type="button" class="mlcad-review-clear" data-i18n-key="review.clear" data-i18n-text>Clear all</button>
1448
- </div>
1449
- <div class="mlcad-review-table-wrap">
1450
- <table class="mlcad-review-table">
1451
- <thead>
1452
- <tr>
1453
- <th data-review-col="type" data-i18n-key="review.type" data-i18n-text>Type</th>
1454
- <th data-review-col="status" data-i18n-key="review.status" data-i18n-text>Status</th>
1455
- <th data-review-col="author" data-i18n-key="review.author" data-i18n-text>Author</th>
1456
- <th data-review-col="summary" data-i18n-key="review.summary" data-i18n-text>Summary</th>
1457
- </tr>
1458
- </thead>
1459
- <tbody></tbody>
1460
- </table>
1461
- </div>
1462
- <div class="mlcad-review-detail" hidden>
1463
- <div class="mlcad-review-detail-header">
1464
- <div class="mlcad-review-detail-title" data-i18n-key="review.details" data-i18n-text>Details</div>
1465
- <button type="button" class="mlcad-review-detail-close" data-i18n-key="review.closeDetails" data-i18n-attr="title aria-label" title="Close details" aria-label="Close details">×</button>
1466
- </div>
1467
- <div class="mlcad-review-field">
1468
- <label class="mlcad-review-field-label" data-review-field="status" data-i18n-key="review.status" data-i18n-text>Status</label>
1469
- <select class="mlcad-review-status"></select>
1470
- </div>
1471
- <div class="mlcad-review-field">
1472
- <label class="mlcad-review-field-label" data-review-field="author" data-i18n-key="review.author" data-i18n-text>Author</label>
1473
- <input type="text" class="mlcad-review-author" disabled />
1474
- </div>
1475
- <div class="mlcad-review-field">
1476
- <label class="mlcad-review-field-label" data-review-field="label" data-i18n-key="review.label" data-i18n-text>Label</label>
1477
- <input type="text" class="mlcad-review-text" />
1478
- </div>
1479
- <div class="mlcad-review-field">
1480
- <label class="mlcad-review-field-label" data-review-field="comment" data-i18n-key="review.comment" data-i18n-text>Comment</label>
1481
- <textarea class="mlcad-review-comment" rows="2"></textarea>
1482
- </div>
1483
- <div class="mlcad-review-detail-actions">
1484
- <button type="button" class="mlcad-review-zoom" data-i18n-key="review.zoomTo" data-i18n-text>Zoom to</button>
1485
- <button type="button" class="mlcad-review-delete" data-i18n-key="review.delete" data-i18n-text>Delete</button>
1486
- </div>
1487
- </div>
1488
- </div>`}function Ho(){return`<div id="mlcad-measure-drawer" role="dialog" data-i18n-attr="aria-label" data-i18n-key="measurePanel.title" aria-label="Measurements" hidden>
1489
- ${Pe("mlcad-measure-sheet-close","measurePanel.close","Close measurements")}
1490
- <div class="mlcad-drawer-header">
1491
- <span data-i18n-key="measurePanel.title" data-i18n-text>Measurements</span>
1492
- <button type="button" class="mlcad-drawer-close" id="mlcad-measure-close" data-i18n-key="measurePanel.close" data-i18n-attr="aria-label" aria-label="Close measurements">×</button>
1493
- </div>
1494
- <div class="mlcad-measure-toolbar">
1495
- <div class="mlcad-measure-filter" role="group" data-i18n-key="measurePanel.filterGroup" data-i18n-attr="aria-label" aria-label="Filter by type">
1496
- <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="distance" aria-pressed="false" data-i18n-key="measurePanel.filterDistance" data-i18n-text data-i18n-attr="title aria-label" title="Distance">Distance</button>
1497
- <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="arc" aria-pressed="false" data-i18n-key="measurePanel.filterArc" data-i18n-text data-i18n-attr="title aria-label" title="Arc">Arc</button>
1498
- <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="radius" aria-pressed="false" data-i18n-key="measurePanel.filterRadius" data-i18n-text data-i18n-attr="title aria-label" title="Radius">Radius</button>
1499
- <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="angle" aria-pressed="false" data-i18n-key="measurePanel.filterAngle" data-i18n-text data-i18n-attr="title aria-label" title="Angle">Angle</button>
1500
- <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="area" aria-pressed="false" data-i18n-key="measurePanel.filterArea" data-i18n-text data-i18n-attr="title aria-label" title="Area">Area</button>
1501
- </div>
1502
- <button type="button" class="mlcad-measure-clear" data-i18n-key="measurePanel.clear" data-i18n-text>Clear all</button>
1503
- </div>
1504
- <div class="mlcad-measure-table-wrap">
1505
- <table class="mlcad-measure-table">
1506
- <thead>
1507
- <tr>
1508
- <th data-measure-col="type" data-i18n-key="measurePanel.type" data-i18n-text>Type</th>
1509
- <th data-measure-col="value" data-i18n-key="measurePanel.value" data-i18n-text>Value</th>
1510
- <th></th>
1511
- </tr>
1512
- </thead>
1513
- <tbody></tbody>
1514
- </table>
1515
- </div>
1516
- </div>`}function Vo(t,e){var a;const r=e.title??t.meta.title??"CAD Drawing",n=e.encoded??Ga(t),i=e.viewerRuntime,o=xi(),s=n.compression,l=((a=e.accessManifest)==null?void 0:a.encrypted)===!0,c=`#${t.meta.background.toString(16).padStart(6,"0")}`,d=Ce(t.meta.locale)??"en",u=t.meta.viewerMode??"measure",p=t.meta.exportLayouts!==!1,m=e.accessManifest?` <script id="mlcad-access" type="application/json">${lr(JSON.stringify(e.accessManifest))}<\/script>
1517
- `:"",h=l?`${o}+aes-gcm;base85`:`${o}+${s};base85`;return`<!DOCTYPE html>
1518
- <html lang="${d}">
1519
- <head>
1520
- <meta charset="utf-8" />
1521
- <meta name="viewport" content="width=device-width, initial-scale=1" />
1522
- <meta name="generator" content="mlightcad-cad-html-plugin" />
1523
- <title>${or(r)}</title>
1524
- <style>${ze}</style>
1525
- </head>
1526
- <body>
1527
- ${Be(c,u,p)}
1528
- ${m} <script id="mlcad-snapshot" type="${h}">${n.payload}<\/script>
1529
- <script>${sr(i)}<\/script>
1530
- </body>
1531
- </html>`}function Xo(t,e){var a;const r=e.title??t.meta.title??"CAD Drawing",n=e.viewerRuntime,i=`#${t.meta.background.toString(16).padStart(6,"0")}`,o=Ce(t.meta.locale)??"en",s=t.meta.viewerMode??"measure",l=t.meta.exportLayouts!==!1,c=(a=e.manifestUrl)==null?void 0:a.trim(),d=JSON.stringify(c&&c!==To?{manifestUrl:c}:{});return`<!DOCTYPE html>
1532
- <html lang="${o}">
1533
- <head>
1534
- <meta charset="utf-8" />
1535
- <meta name="viewport" content="width=device-width, initial-scale=1" />
1536
- <meta name="generator" content="mlightcad-cad-html-plugin" />
1537
- <title>${or(r)}</title>
1538
- <style>${ze}</style>
1539
- </head>
1540
- <body>
1541
- ${Be(i,s,l)}
1542
- <script id="mlcad-package" type="application/json">${lr(d)}<\/script>
1543
- <script>${sr(n)}<\/script>
1544
- </body>
1545
- </html>`}function or(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function sr(t){return t.replace(/<\/script/gi,"<\\/script")}function lr(t){return t.replace(/</g,"\\u003c")}const Yo=1,Go=1e5,Wo=16,Ko=12;function Jo(t,e=Date.now(),a){return t==="never"?null:t==="custom"?a??null:e+t*24*60*60*1e3}function cr(t){var e;const a=!!((e=t.password)!=null&&e.trim());return t.expiresAt!=null||a}function Ut(t){var e;if(!cr(t))return;const a=!!((e=t.password)!=null&&e.trim());return{v:Yo,expiresAt:t.expiresAt,encrypted:a,...a&&t.salt?{salt:t.salt}:{}}}async function dr(t,e){const a=crypto.getRandomValues(new Uint8Array(Wo));return{key:await ts(t,a),salt:ur(a)}}async function Se(t,e){const a=crypto.getRandomValues(new Uint8Array(Ko)),r=new Uint8Array(e),n=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:a},t,r)),i=new Uint8Array(a.length+n.length);return i.set(a,0),i.set(n,a.length),i}async function Zo(t,e,a="base85"){const{key:r,salt:n}=await dr(t),i=Gn(e,a),o=await Se(r,i);return{encryptedPayload:Dt(o,a),salt:n}}function qo(t){return ur(t)}async function Qo(t,e){var a;if(!cr(e))return{encoded:t};const r=(a=e.password)==null?void 0:a.trim();if(r){const{encryptedPayload:n,salt:i}=await Zo(r,t.payload);return{encoded:{payload:n,compression:t.compression},manifest:Ut({expiresAt:e.expiresAt,password:r,salt:i})}}return{encoded:t,manifest:Ut({expiresAt:e.expiresAt})}}async function ts(t,e){const a=new TextEncoder,r=await crypto.subtle.importKey("raw",a.encode(t),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:new Uint8Array(e),iterations:Go,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}function ur(t){let e="";for(let a=0;a<t.length;a++)e+=String.fromCharCode(t[a]);return btoa(e)}const es=256;function as(t,e=jt){return!(e>0)||ge(t)<=e?[t]:t.indices&&t.indices.length>=2?is(t,e):ns(t,e)}function rs(t,e=jt){return t.texture?[t]:!(e>0)||be(t)<=e?[t]:t.points?ss(t,e):!t.indices||t.indices.length<3?pr(t,e):cs(t,e)}function mr(t){return t.linePattern?64+t.linePattern.pattern.length*8:0}function Le(t){return(t.hatchPattern?128:0)+(t.gradientFill?64:0)}function kt(t,e,a){const r=t-es-e;return r<a?1:Math.max(1,Math.floor(r/a))}function ns(t,e){var a;const r=(((a=t.lineDistances)==null?void 0:a.length)??0)>=2,n=24+(r?8:0),i=kt(e,mr(t),n),o=t.positions.length/6|0;if(o<=1)return[t];const s=[];for(let l=0;l<o;l+=i){const c=Math.min(i,o-l),d=l*6,u={layer:t.layer,color:t.color,offset:t.offset,positions:t.positions.slice(d,d+c*6)};if(gr(t,u),r&&t.lineDistances){const p=l*2;u.lineDistances=t.lineDistances.slice(p,p+c*2)}s.push(u)}return s.length>0?s:[t]}function is(t,e){var a;const r=t.indices,n=32+((((a=t.lineDistances)==null?void 0:a.length)??0)>0?8:0),i=kt(e,mr(t),n),o=[];for(let s=0;s+1<r.length;){const l=Math.min(i*2,r.length-s),c=l-l%2;if(c<2)break;o.push(os(t,s,c)),s+=c}return o.length>0?o:[t]}function os(t,e,a){const r=fr(t.positions,t.indices.subarray(e,e+a),t.lineDistances?[t.lineDistances]:[],[1]),n={layer:t.layer,color:t.color,offset:t.offset,positions:r.positions,indices:r.indices};return gr(t,n),r.attributes[0]&&r.attributes[0].length>0&&(n.lineDistances=r.attributes[0]),n}function ss(t,e){return t.indices&&t.indices.length>0?ls(t,e):pr(t,e)}function ls(t,e){const a=t.indices,r=16+(t.uvs?8:0)+(t.gradientPositions?8:0),n=kt(e,Le(t),r),i=[];for(let o=0;o<a.length;){const s=Math.min(n,a.length-o);if(s<1)break;i.push(hr(t,o,s)),o+=s}return i.length>0?i:[t]}function pr(t,e){const a=t.positions.length/3|0;if(a<=1)return[t];const r=12+(t.uvs?8:0)+(t.gradientPositions?8:0),n=kt(e,Le(t),r),i=t.points?1:3,o=Math.max(i,n-n%i),s=[];for(let l=0;l<a;l+=o){const c=Math.min(o,a-l),d=c-c%i;if(d<i)break;s.push(ds(t,l,d))}return s.length>0?s:[t]}function cs(t,e){const a=t.indices,r=48+(t.uvs?24:0)+(t.gradientPositions?24:0),n=kt(e,Le(t),r),i=[];for(let o=0;o+2<a.length;){const s=Math.min(n*3,a.length-o),l=s-s%3;if(l<3)break;i.push(hr(t,o,l)),o+=l}return i.length>0?i:[t]}function ds(t,e,a){const r=e*3,n={layer:t.layer,color:t.color,offset:t.offset,positions:t.positions.slice(r,r+a*3)};return br(t,n),t.uvs&&(n.uvs=t.uvs.slice(e*2,(e+a)*2)),t.gradientPositions&&(n.gradientPositions=t.gradientPositions.slice(e*2,(e+a)*2)),n}function hr(t,e,a){const r=[],n=[];t.uvs&&(r.push(t.uvs),n.push(2)),t.gradientPositions&&(r.push(t.gradientPositions),n.push(2));const i=fr(t.positions,t.indices.subarray(e,e+a),r,n),o={layer:t.layer,color:t.color,offset:t.offset,positions:i.positions,indices:i.indices};br(t,o);let s=0;return t.uvs&&(o.uvs=i.attributes[s++]),t.gradientPositions&&(o.gradientPositions=i.attributes[s]),o}function fr(t,e,a,r){const n=new Map,i=[],o=new Uint32Array(e.length),s=a.map(()=>[]);for(let l=0;l<e.length;l++){const c=e[l];let d=n.get(c);if(d==null){d=n.size,n.set(c,d);const u=c*3;i.push(t[u]??0,t[u+1]??0,t[u+2]??0);for(let p=0;p<a.length;p++){const m=r[p],h=a[p],f=c*m;for(let g=0;g<m;g++)s[p].push(h[f+g]??0)}}o[l]=d}return{positions:Float32Array.from(i),indices:o,attributes:s.map(l=>Float32Array.from(l))}}function gr(t,e){t.linePattern&&(e.linePattern=t.linePattern),t.lineWidth!=null&&(e.lineWidth=t.lineWidth),t.renderOrder!=null&&(e.renderOrder=t.renderOrder),t.excludeFromOsnap&&(e.excludeFromOsnap=!0)}function br(t,e){t.hatchPattern&&(e.hatchPattern=t.hatchPattern),t.gradientFill&&(e.gradientFill=t.gradientFill),t.side!=null&&(e.side=t.side),t.renderOrder!=null&&(e.renderOrder=t.renderOrder),t.points&&(e.points=!0)}function us(t,e,a=jt){const r=[];let n={lineBatches:[],meshBatches:[],estimatedBytes:64};const i=()=>{n.lineBatches.length===0&&n.meshBatches.length===0&&r.length>0||(r.push(n),n={lineBatches:[],meshBatches:[],estimatedBytes:64})},o=c=>{const d=ge(c);n.estimatedBytes+d>e&&(n.lineBatches.length>0||n.meshBatches.length>0)&&i(),n.lineBatches.push(c),n.estimatedBytes+=d},s=c=>{const d=be(c);n.estimatedBytes+d>e&&(n.lineBatches.length>0||n.meshBatches.length>0)&&i(),n.meshBatches.push(c),n.estimatedBytes+=d},l=Math.min(e,a);for(const c of t.lineBatches)for(const d of as(c,l))o(d);for(const c of t.meshBatches)for(const d of rs(c,l))s(d);return(r.length===0||n.lineBatches.length>0||n.meshBatches.length>0)&&i(),r.length===0&&r.push({lineBatches:[],meshBatches:[],estimatedBytes:64}),r}function ms(t,e){if(t.version!==X)throw new Error(`Unsupported snapshot version: ${t.version}`);const a=e.maxChunkBytes??Ot,r=e.maxBatchBytes??jt,n=e.maxOsnapChunkBytes??a,i=e.compressChunks!==!1,o=i?"acex.gz":"acex",s=i?"osnap.gz":"osnap",l=_t,c=gs(t.layouts,t.activeLayoutBtrId),d=[],u=[],p=new Map;return c.forEach((m,h)=>{var f;p.set(m.btrId,h);const g=us(m,a,r),w=[];g.forEach((x,B)=>{const z=`L${h}-${String(B).padStart(3,"0")}`,F=`chunks/${z}.${o}`;w.push(z),d.push({kind:"geometry",id:z,href:F,layoutBtrId:m.btrId,lineBatchCount:x.lineBatches.length,meshBatchCount:x.meshBatches.length,chunk:{version:X,layoutBtrId:m.btrId,lineBatches:x.lineBatches,meshBatches:x.meshBatches}})});const b={btrId:m.btrId,name:m.name,isModelSpace:m.isModelSpace,viewports:m.viewports,...m.savedView?{savedView:m.savedView}:{},chunkIds:w},A=(f=m.osnap)==null?void 0:f.primitives;if(A&&A.length>0){const x=di(A,n),B=[];x.forEach((z,F)=>{const y=`L${h}-osnap-${String(F).padStart(3,"0")}`,v=`chunks/${y}.${s}`;B.push(y),d.push({kind:"osnap",id:y,href:v,layoutBtrId:m.btrId,primitiveCount:z.length,primitives:z})}),b.osnapChunkIds=B}u.push(b)}),{jobs:d,layoutRefs:u,layoutIndexByBtrId:p,manifestFileName:l,compressChunks:i}}function ps(t,e,a,r,n){var i,o;const s=[],l=[],c=[];for(const w of n){const{job:b,uncompressed:A,compressed:x}=w;c.push({path:b.href,bytes:x}),b.kind==="geometry"?s.push({id:b.id,href:b.href,layoutBtrId:b.layoutBtrId,byteLength:A.byteLength,compressedByteLength:x.byteLength,lineBatchCount:b.lineBatchCount,meshBatchCount:b.meshBatchCount}):l.push({id:b.id,href:b.href,layoutBtrId:b.layoutBtrId,byteLength:A.byteLength,compressedByteLength:x.byteLength,primitiveCount:b.primitiveCount})}const d=t.layouts.map(w=>{const b=a.get(w.btrId);return e[b]}),u=new Set(((i=d.find(w=>w.btrId===t.activeLayoutBtrId))==null?void 0:i.chunkIds)??[]),p=[...s.filter(w=>u.has(w.id)),...s.filter(w=>!u.has(w.id))],m=new Set(((o=d.find(w=>w.btrId===t.activeLayoutBtrId))==null?void 0:o.osnapChunkIds)??[]),h=[...l.filter(w=>m.has(w.id)),...l.filter(w=>!m.has(w.id))],f={format:"acex-package",packageVersion:Uo,snapshotVersion:X,meta:t.meta,layers:t.layers,activeLayoutBtrId:t.activeLayoutBtrId,layouts:d,chunks:p,...h.length>0?{osnapChunks:h}:{}},g=`${JSON.stringify(f)}
1546
- `;return c.unshift({path:r,bytes:xt(g)}),{manifest:f,manifestFileName:r,files:c}}async function hs(t,e){if(t.kind==="geometry"){if(!e){const o=ir(t.chunk);return{job:t,uncompressed:o,compressed:o}}const{uncompressed:n,compressed:i}=await Eo(t.chunk);return{job:t,uncompressed:n,compressed:i}}if(!e){const n=xe({primitives:t.primitives});return{job:t,uncompressed:n,compressed:n}}const{uncompressed:a,compressed:r}=await ui({primitives:t.primitives});return{job:t,uncompressed:a,compressed:r}}async function wr(t,e={}){const{jobs:a,layoutRefs:r,layoutIndexByBtrId:n,manifestFileName:i,compressChunks:o}=ms(t,e),s=await Promise.all(a.map(l=>hs(l,o)));return ps(t,r,n,i,s)}async function fs(t,e){const a=await wr(t,e),r=Xo(t,{title:t.meta.title,viewerRuntime:e.viewerRuntime,...e.manifestUrl?{manifestUrl:e.manifestUrl}:{}});return{html:r,manifest:a.manifest,manifestFileName:a.manifestFileName,files:[{path:"viewer.html",bytes:xt(r)},...a.files]}}function gs(t,e){const a=t.find(n=>n.btrId===e),r=t.filter(n=>n.btrId!==e);return a?[a,...r]:[...t]}const bs="application/vnd.mlightcad.acex-chunk;base85",ws="application/vnd.mlightcad.acex-chunk+aes-gcm;base85",xr="data-acex-href";function xs(t){var e;let a=0;for(const r of t.layouts){for(const i of r.lineBatches)a+=ge(i);for(const i of r.meshBatches)a+=be(i);const n=(e=r.osnap)==null?void 0:e.primitives;if(n)for(const i of n)a+=Ya(i)}return a}function ys(t,e=No){return xs(t)>=e}async function vs(t,e){var a;const r=e.title??t.meta.title??"CAD Drawing",n=e.viewerRuntime,i=`#${t.meta.background.toString(16).padStart(6,"0")}`,o=Ce(t.meta.locale)??"en",s=t.meta.viewerMode??"measure",l=t.meta.exportLayouts!==!1,c=e.expiresAt??null,d=((a=e.password)==null?void 0:a.trim())||void 0,u={maxChunkBytes:e.maxChunkBytes??wa,maxBatchBytes:e.maxBatchBytes??e.maxChunkBytes??wa,maxOsnapChunkBytes:e.maxOsnapChunkBytes??Do},p=await wr(t,u);let m,h,f;if(d){const{key:w,salt:b}=await dr(d);m=Ut({expiresAt:c,password:d,salt:b});const A=new TextEncoder().encode(`${JSON.stringify(p.manifest)}
1547
- `),x=await Se(w,A);h={mode:"embedded",encrypted:!0,encryptedManifest:qo(x)},f=await As(p.files,w)}else m=Ut({expiresAt:c}),h={mode:"embedded",manifest:p.manifest},f=ks(p.files);const g=m?` <script id="mlcad-access" type="application/json">${xa(JSON.stringify(m))}<\/script>
1548
- `:"";return`<!DOCTYPE html>
1549
- <html lang="${o}">
1550
- <head>
1551
- <meta charset="utf-8" />
1552
- <meta name="viewport" content="width=device-width, initial-scale=1" />
1553
- <meta name="generator" content="mlightcad-cad-html-plugin" />
1554
- <title>${yr(r)}</title>
1555
- <style>${ze}</style>
1556
- </head>
1557
- <body>
1558
- ${Be(i,s,l)}
1559
- ${g} <script id="mlcad-package" type="application/json">${xa(JSON.stringify(h))}<\/script>
1560
- ${f} <script>${Ms(n)}<\/script>
1561
- </body>
1562
- </html>`}function ks(t){const e=[];for(const a of t)a.path!==_t&&e.push(` <script type="${bs}" ${xr}="${vr(a.path)}">${Dt(a.bytes,"base85")}<\/script>
1563
- `);return e.join("")}async function As(t,e){const a=[];for(const r of t){if(r.path===_t)continue;const n=await Se(e,r.bytes);a.push(` <script type="${ws}" ${xr}="${vr(r.path)}">${Dt(n,"base85")}<\/script>
1564
- `)}return a.join("")}function yr(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function vr(t){return yr(t).replace(/'/g,"&#39;")}function Ms(t){return t.replace(/<\/script/gi,"<\\/script")}function xa(t){return t.replace(/</g,"\\u003c")}function Fs(t){return!t||t.startsWith("/")||t.includes("\\")||t.includes("\0")?!1:t.split("/").every(e=>e.length>0&&e!=="."&&e!==".."&&/^[A-Za-z0-9._-]+$/.test(e))}function Cs(t){return t.endsWith(".gz")}function zs(t){const e={};for(const a of t.files){if(!Fs(a.path))throw new Error(`Unsafe package path: ${a.path}`);Cs(a.path)?e[a.path]=[a.bytes,{level:0}]:e[a.path]=[a.bytes,{level:6}]}return Yn(e)}const Bs=400,kr=Ot/(1024*1024),Ie=1,Ar=64;function ce(t){return Math.floor(t)*1024*1024}function Mr(t){return Math.max(Ie,Math.round(t/(1024*1024)))}function Fr(t){return Number.isFinite(t)?Math.min(Ar,Math.max(Ie,Math.floor(t))):kr}function J(t={}){var e;const a=t.exportFormat==="multi"?"multi":"single",r=a==="multi"?ce(Fr(t.maxChunkBytes!=null?Mr(t.maxChunkBytes):kr)):Ot;return{exportFormat:a,exportInvisibleLayers:t.exportInvisibleLayers!==!1,exportLayouts:t.exportLayouts!==!1,initialView:t.initialView??"fit",viewerMode:t.viewerMode??"measure",expiryDays:a==="multi"?"never":t.expiryDays??"never",expiresAt:a==="multi"?null:t.expiresAt??null,password:a==="multi"?"":((e=t.password)==null?void 0:e.trim())??"",maxChunkBytes:r,compressChunks:a==="multi"?t.compressChunks!==!1:!0}}function Ps(t){const e=t.maxChunkBytes??Ot,a=t.compressChunks!==!1;return{maxChunkBytes:e,maxBatchBytes:e,maxOsnapChunkBytes:e,compressChunks:a}}function Ss(t){const e=t.activeLayoutView,a=e.center,r=e.trCamera.zoom,n=Math.max(e.height,1),i=r*(2*Bs)/n;return{centerX:a.x,centerY:a.y,zoom:i}}const Ls="./viewer-runtime.iife.js";let vt={};function Is(t){vt={...vt,...t}}function Es(){return{...vt}}function Us(t){return t!=null?String(t):vt.viewerRuntimeUrl!=null?String(vt.viewerRuntimeUrl):Ls}const Cr="https://mlightcad.com/cad-viewer/docs/";let zr=Br(Cr);function Ns(){return zr}function Ds(t){zr=Br(t)}function Br(t){const e=t.trim();return e?e.replace(/\/+$/,""):Cr.replace(/\/+$/,"")}function Ts(){return{minX:0,minY:0,maxX:0,maxY:0,valid:!1}}function Os(t,e,a){if(e.length<3)return;const r=a[0],n=a[1];for(let i=0;i+2<e.length;i+=3){const o=na(e[i],r),s=na(e[i+1],n);t.valid?(o<t.minX&&(t.minX=o),o>t.maxX&&(t.maxX=o),s<t.minY&&(t.minY=s),s>t.maxY&&(t.maxY=s)):(t.minX=t.maxX=o,t.minY=t.maxY=s,t.valid=!0)}}function ya(t,e){Os(t,e.positions,e.offset)}function js(t){return t.valid?{minX:t.minX,minY:t.minY,maxX:t.maxX,maxY:t.maxY}:null}function _s(t,e){const a=Ts();for(const r of t)ya(a,r);for(const r of e)ya(a,r);return js(a)}function Pr(t,e){return t?e?{minX:Math.min(t.minX,e.minX),minY:Math.min(t.minY,e.minY),maxX:Math.max(t.maxX,e.maxX),maxY:Math.max(t.maxY,e.maxY)}:t:e??null}function $s(t){if(!t||t.length===0)return null;let e=null;for(const a of t)e=Pr(e,a.paper);return e}function Rs(t){return Pr(_s(t.lineBatches,t.meshBatches),$s(t.viewports))}function Hs(t,e,a){if(a)return;const r=Xs(t,e);if(!(r!=null&&r.newIterator))return;const n=[];for(const i of r.newIterator()){if(!(i instanceof $r)||Rr.isDefaultPaperSpaceViewport(i)||typeof i.toGiViewport!="function")continue;const o=i.toGiViewport(),s=o.box,l=o.viewBox,c=va(s),d=va(l);if(!c||!d)continue;const u=Number.isFinite(o.viewTwistAngle)?o.viewTwistAngle:i.viewTwistAngle,p=Vs(o,i),m={paper:c,model:d};Number.isFinite(u)&&Math.abs(u)>1e-12&&(m.twist=u),p.length>0&&(m.frozenLayers=p),n.push(m)}return n.length>0?n:void 0}function Vs(t,e){var a;const r=t.frozenLayers;if(r&&r.length>0)return[...r];const n=e.frozenLayerIds;if(!(n!=null&&n.length))return[];const i=(a=e.database)==null?void 0:a.tables.layerTable;if(!i)return[];const o=[];for(const s of n){const l=i.getIdAt(s);l&&o.push(l.name)}return o}function va(t){if(typeof t.isEmpty=="function"&&t.isEmpty())return;const e=t.min.x,a=t.min.y,r=t.max.x,n=t.max.y;if(!(!Number.isFinite(e)||!Number.isFinite(a)||!Number.isFinite(r)||!Number.isFinite(n)||r-e<=0||n-a<=0))return{minX:e,minY:a,maxX:r,maxY:n}}function Xs(t,e){var a;const r=(a=t.tables)==null?void 0:a.blockTable;if(!r)return;const n=typeof r.getIdAt=="function"?r.getIdAt(e):void 0;if(n)return n;if(typeof r.newIterator=="function"){for(const o of r.newIterator())if(o.objectId===e)return o}const i=r.modelSpace;if((i==null?void 0:i.objectId)===e)return i}const ka=16/9;function Ys(t,e,a,r=ka){var n,i,o,s;const l=Number.isFinite(r)&&r>0?r:ka;if(a){const d=(o=(i=(n=t.tables)==null?void 0:n.viewportTable)==null?void 0:i.getActiveVportBox)==null?void 0:o.call(i,l);return Aa(d)}const c=(s=t.objects)==null?void 0:s.layout;if(c!=null&&c.newIterator){for(const d of c.newIterator())if(d.blockTableRecordId===e)return Aa(d.limits)}}function Aa(t){if(!t||typeof t.isEmpty=="function"&&t.isEmpty())return;const e=t.min.x,a=t.min.y,r=t.max.x,n=t.max.y;if(!(!Number.isFinite(e)||!Number.isFinite(a)||!Number.isFinite(r)||!Number.isFinite(n)||r-e<=0||n-a<=0))return{minX:e,minY:a,maxX:r,maxY:n}}class Gs{build(e,a,r={}){return this.buildSync(e,a,r)}async buildAsync(e,a,r={}){await $();const n=r.exportInvisibleLayers!==!1,i=r.exportLayouts!==!1,o=n?void 0:m=>Ct(e,m,n),s=pa(a,{title:r.title,background:r.background}),l=[];e.layers.forEach(m=>{Ct(e,m.name,n)&&l.push({name:m.name,color:m.color.RGB??16777215,visible:!m.isOff&&!m.isFrozen})});const c=Fa(a),d=new Map(c.map(m=>[m.blockTableRecordId,m.name])),u=za(e,i),p=[];for(const m of Ca(e,c,i))p.push(Ba(e,a,m,d,r,o)),await $();return{version:X,meta:Ma(s,r,p,u),layers:l,layouts:p,activeLayoutBtrId:u}}buildSync(e,a,r){const n=r.exportInvisibleLayers!==!1,i=r.exportLayouts!==!1,o=n?void 0:m=>Ct(e,m,n),s=pa(a,{title:r.title,background:r.background}),l=[];e.layers.forEach(m=>{Ct(e,m.name,n)&&l.push({name:m.name,color:m.color.RGB??16777215,visible:!m.isOff&&!m.isFrozen})});const c=Fa(a),d=new Map(c.map(m=>[m.blockTableRecordId,m.name])),u=za(e,i),p=[];for(const m of Ca(e,c,i))p.push(Ba(e,a,m,d,r,o));return{version:X,meta:Ma(s,r,p,u),layers:l,layouts:p,activeLayoutBtrId:u}}}function Ma(t,e,a,r){const n=a.find(s=>s.btrId===r)??a[0],i=n?Rs(n):null,o=e.initialView??"fit";return{title:t.title,createdAt:new Date().toISOString(),extents:t.extents,viewExtents:i??void 0,units:t.units,grip:t.grip,background:t.background,locale:e.locale??k.currentLocale,initialView:o,viewState:o==="current"?e.viewState:void 0,viewerMode:e.viewerMode??"measure",exportLayouts:e.exportLayouts!==!1,docsBaseUrl:Ws()}}function Ws(){try{Ds(Hr())}catch{}return Ns()}function Ks(t){return(t.viewerMode??"measure")==="measure"}function Ct(t,e,a){if(a)return!0;const r=t.layers.get(e);return r?!r.isOff&&!r.isFrozen:!0}function Fa(t){var e;const a=(e=t.objects)==null?void 0:e.layout;if(!(a!=null&&a.newIterator))return[];const r=[];for(const n of a.newIterator()){const i=n.blockTableRecordId;i&&r.push({name:n.layoutName||i,tabOrder:n.tabOrder??0,blockTableRecordId:i})}return r.sort((n,i)=>n.tabOrder-i.tabOrder),r}function Ca(t,e,a){if(!a)return t.modelSpaceBtrId?[t.modelSpaceBtrId]:[];const r=new Set,n=[];for(const i of e)r.has(i.blockTableRecordId)||(r.add(i.blockTableRecordId),n.push(i.blockTableRecordId));for(const i of t.layouts.keys())r.has(i)||(r.add(i),n.push(i));return n}function za(t,e){return e&&t.activeLayoutBtrId||t.modelSpaceBtrId}function Ba(t,e,a,r,n,i){const o=[],s=[],l=t.layouts.get(a);if(l)for(const[,p]of l.layers){if(i&&!i(p.name))continue;const m=Ji(p.internalObject);o.push(...m.lineBatches),s.push(...m.meshBatches)}const c=a===t.modelSpaceBtrId,d=Ys(e,a,c,n.canvasAspectRatio);let u;if(Ks(n)){const p=performance.now();u=Po(e,a,{includeLayer:i}),console.log(`[chtml] osnap catalog ${r.get(a)??a}: ${(performance.now()-p).toFixed(0)} ms (${(u==null?void 0:u.primitives.length)??0} primitives)`)}return{btrId:a,name:r.get(a)??Js(e,a),isModelSpace:c,lineBatches:o,meshBatches:s,osnap:u,viewports:Hs(e,a,c),...d?{savedView:d}:{}}}function Js(t,e){var a;const r=(a=t.tables)==null?void 0:a.blockTable;if(r!=null&&r.newIterator){for(const n of r.newIterator())if(n.objectId===e)return n.name}return e}function K(t,e){console.log(`[chtml] ${t}: ${e.toFixed(0)} ms`)}class Zs{constructor(e={}){this.options=e,this._snapshotBuilder=new Gs}async prepareAcTrView2dForHtmlExport(e,a={}){if(!e||!("cadScene"in e)||!e.cadScene)throw new Error("CAD scene is not available. Open a drawing before exporting to HTML.");if(!(e instanceof Ur))throw new Error("HTML export requires a 2D CAD view. Open a drawing before exporting.");const r=J(a),n={includeInvisibleLayers:r.exportInvisibleLayers,includeLayouts:r.exportLayouts};return await e.ensureEntitiesConvertedForExport(n),await $(),e}async convert(e,a={},r){const n=Q.instance,i=J(a),o=performance.now();await n.withBusyIndicator(async()=>{await $();const s=n.curDocument;let l=performance.now();const c=await this.prepareAcTrView2dForHtmlExport(r??n.curView,i);K("prepare (missing entities)",performance.now()-l);const d=e||s.fileName||s.docTitle,u=Nr(d);l=performance.now();const p=await this._snapshotBuilder.buildAsync(c.cadScene,s.database,{title:u,background:c.backgroundColor,exportInvisibleLayers:i.exportInvisibleLayers,exportLayouts:i.exportLayouts,initialView:i.initialView,viewerMode:i.viewerMode,viewState:i.initialView==="current"&&(i.exportLayouts||c.activeLayoutBtrId===c.modelSpaceBtrId)?Ss(c):void 0,canvasAspectRatio:c.width/Math.max(c.height,1)});K("snapshot build",performance.now()-l),await $(),l=performance.now();const m=await this.loadViewerRuntime();if(K("load viewer runtime",performance.now()-l),await $(),i.exportFormat==="multi"){l=performance.now();const g=Ps(i),w=await fs(p,{viewerRuntime:m,...g});K(g.compressChunks?"package + gzip chunks":"package chunks",performance.now()-l),l=performance.now();const b=zs(w);K("zip package",performance.now()-l),await $(),this.downloadBytes(b,Te(d,"zip"),"application/zip"),K("chtml total",performance.now()-o);return}const h=Jo(i.expiryDays,Date.now(),i.expiresAt);l=performance.now();const f=await this.packSelfContainedHtml(p,m,{expiresAt:h,password:i.password||void 0});K("pack self-contained html",performance.now()-l),await $(),this.downloadHtml(f,Te(d,"html")),K("chtml total",performance.now()-o)})}async packSnapshot(e,a){await Q.instance.withBusyIndicator(async()=>{await $();const r=await this.loadViewerRuntime();await $();const n=await this.packSelfContainedHtml(e,r,{expiresAt:null});await $(),this.downloadHtml(n,a)})}async packSelfContainedHtml(e,a,r){if(ys(e))return vs(e,{title:e.meta.title,viewerRuntime:a,expiresAt:r.expiresAt,password:r.password});const n=await Qo(Ga(e),{expiresAt:r.expiresAt,password:r.password});return Vo(e,{title:e.meta.title,viewerRuntime:a,encoded:n.encoded,accessManifest:n.manifest})}async loadViewerRuntime(){const e=Us(this.options.viewerRuntimeUrl),a=await fetch(e);if(!a.ok)throw new Error(`Failed to load HTML viewer runtime from "${e}" (${a.status}). Install @mlightcad/cad-html-plugin, copy viewer-runtime.iife.js to your app assets, and set viewerRuntimeUrl on registerLazyHtmlPlugin / createHtmlPlugin / AcApHtmlConvertor.`);return a.text()}downloadHtml(e,a){this.downloadBytes(new TextEncoder().encode(e),a,"text/html;charset=utf-8")}downloadBytes(e,a,r){const n=new Uint8Array(e.byteLength);n.set(e);const i=new Blob([n],{type:r}),o=URL.createObjectURL(i),s=document.createElement("a");s.href=o,s.download=a,document.body.appendChild(s),s.click(),document.body.removeChild(s),window.setTimeout(()=>URL.revokeObjectURL(o),6e4)}}class qs extends Ir{constructor(e={}){super(),this.pluginOptions=e}async execute(e){const a=await this.promptOptions();a&&await new Zs(this.pluginOptions).convert(e.doc.fileName||e.doc.docTitle,a,e.view)}async promptOptions(){const e=J(),a=await this.promptExportFormat();if(a===void 0)return;const r=await this.promptYesNo("jig.chtml.exportInvisibleLayers",e.exportInvisibleLayers);if(r===void 0)return;const n=await this.promptYesNo("jig.chtml.exportLayouts",e.exportLayouts);if(n===void 0)return;const i=await this.promptInitialView();if(i===void 0)return;const o=await this.promptViewerMode();if(o===void 0)return;let s,l;if(!(a==="multi"&&(s=await this.promptChunkSizeMiB(),s===void 0||(l=await this.promptYesNo("jig.chtml.compressChunks",e.compressChunks),l===void 0))))return J({exportFormat:a,exportInvisibleLayers:r,exportLayouts:n,initialView:i,viewerMode:o,...a==="multi"?{maxChunkBytes:s,compressChunks:l}:{}})}async promptExportFormat(){const e=J(),a=new At(k.t("jig.chtml.exportFormat"));a.allowNone=!0;const r=a.keywords.add(k.t("jig.chtml.keywords.single.display"),k.t("jig.chtml.keywords.single.global"),k.t("jig.chtml.keywords.single.local")),n=a.keywords.add(k.t("jig.chtml.keywords.multi.display"),k.t("jig.chtml.keywords.multi.global"),k.t("jig.chtml.keywords.multi.local"));a.keywords.default=e.exportFormat==="multi"?n:r;const i=await Q.instance.editor.getKeywords(a);if(i.status!==S.Cancel){if(i.status===S.None)return e.exportFormat;if(i.status===S.OK||i.status===S.Keyword)return i.stringResult?i.stringResult==="Multi"?"multi":"single":e.exportFormat}}async promptYesNo(e,a){const r=new At(k.t(e));r.allowNone=!0;const n=r.keywords.add(k.t("jig.chtml.keywords.yes.display"),k.t("jig.chtml.keywords.yes.global"),k.t("jig.chtml.keywords.yes.local")),i=r.keywords.add(k.t("jig.chtml.keywords.no.display"),k.t("jig.chtml.keywords.no.global"),k.t("jig.chtml.keywords.no.local"));r.keywords.default=a?n:i;const o=await Q.instance.editor.getKeywords(r);if(o.status!==S.Cancel){if(o.status===S.None)return a;if(o.status===S.OK||o.status===S.Keyword)return o.stringResult?o.stringResult==="Yes":a}}async promptChunkSizeMiB(){const e=J({exportFormat:"multi"}),a=Mr(e.maxChunkBytes),r=new Er(k.t("jig.chtml.chunkSizeMiB"),Ie,Ar);r.allowNone=!0,r.allowZero=!1,r.allowNegative=!1,r.useDefaultValue=!0,r.defaultValue=a;const n=await Q.instance.editor.getInteger(r);if(n.status!==S.Cancel){if(n.status===S.None)return ce(a);if(n.status===S.OK){const i=Fr(n.value??a);return ce(i)}}}async promptInitialView(){const e=J(),a=new At(k.t("jig.chtml.initialView"));a.allowNone=!0;const r=a.keywords.add(k.t("jig.chtml.keywords.extents.display"),k.t("jig.chtml.keywords.extents.global"),k.t("jig.chtml.keywords.extents.local")),n=a.keywords.add(k.t("jig.chtml.keywords.current.display"),k.t("jig.chtml.keywords.current.global"),k.t("jig.chtml.keywords.current.local"));a.keywords.default=e.initialView==="current"?n:r;const i=await Q.instance.editor.getKeywords(a);if(i.status!==S.Cancel){if(i.status===S.None)return e.initialView;if(i.status===S.OK||i.status===S.Keyword)return i.stringResult?i.stringResult==="Current"?"current":"fit":e.initialView}}async promptViewerMode(){const e=J(),a=new At(k.t("jig.chtml.viewerMode"));a.allowNone=!0;const r=a.keywords.add(k.t("jig.chtml.keywords.view.display"),k.t("jig.chtml.keywords.view.global"),k.t("jig.chtml.keywords.view.local")),n=a.keywords.add(k.t("jig.chtml.keywords.measure.display"),k.t("jig.chtml.keywords.measure.global"),k.t("jig.chtml.keywords.measure.local"));a.keywords.default=e.viewerMode==="view"?r:n;const i=await Q.instance.editor.getKeywords(a);if(i.status!==S.Cancel){if(i.status===S.None)return e.viewerMode;if(i.status===S.OK||i.status===S.Keyword)return i.stringResult?i.stringResult==="View"?"view":"measure":e.viewerMode}}}const Qs="1.7.6",tl={version:Qs};class el{constructor(e={}){this.options=e,this.name="HtmlPlugin",this.version=tl.version,this.description="HTML export (-chtml) command",this.registeredCommands=[]}onLoad(e,a){const r=Lr.SYSTEMT_COMMAND_GROUP_NAME,n=new qs(this.options);a.addCommand(r,"-chtml","-chtml",n),this.registeredCommands.push({group:r,name:"-chtml"}),a.lookupGlobalCmd("chtml")||(a.addCommand(r,"chtml","chtml",n),this.registeredCommands.push({group:r,name:"chtml"}))}onUnload(e,a){for(const r of this.registeredCommands)a.removeCmd(r.group,r.name);this.registeredCommands=[]}}async function rl(t={}){return t.viewerRuntimeUrl!=null&&Is(t),new el(Es())}export{Io as ACEC_CHUNK_MAGIC,ei as ACEO_OSNAP_MAGIC,ai as ACEO_OSNAP_VERSION,Ot as ACEX_DEFAULT_CHUNK_MAX_BYTES,kr as ACEX_DEFAULT_CHUNK_SIZE_MIB,_t as ACEX_DEFAULT_MANIFEST_FILE,To as ACEX_DEFAULT_MANIFEST_HREF,ws as ACEX_EMBEDDED_CHUNK_ENCRYPTED_MIME,xr as ACEX_EMBEDDED_CHUNK_HREF_ATTR,wa as ACEX_EMBEDDED_CHUNK_MAX_BYTES,bs as ACEX_EMBEDDED_CHUNK_MIME,No as ACEX_EMBEDDED_CHUNK_THRESHOLD_BYTES,Do as ACEX_EMBEDDED_OSNAP_CHUNK_MAX_BYTES,Ar as ACEX_MAX_CHUNK_SIZE_MIB,jt as ACEX_MAX_GEOMETRY_BATCH_BYTES,Ie as ACEX_MIN_CHUNK_SIZE_MIB,Uo as ACEX_PACKAGE_VERSION,Ra as ACEX_SNAPSHOT_COMPRESSION,X as ACEX_SNAPSHOT_VERSION,qs as AcApExportHtmlCmd,Zs as AcApHtmlConvertor,Gs as AcApHtmlSnapshotBuilder,Ls as DEFAULT_HTML_VIEWER_RUNTIME_URL,ol as HTML_PLUGIN_NAME,sl as HTML_PLUGIN_TRIGGERS,Kn as acExHtmlBase85ToBytes,qo as acExHtmlBytesToBase64,Wn as acExHtmlBytesToBase85,Dt as acExHtmlBytesToText,Gn as acExHtmlTextToBytes,Mr as acexChunkSizeBytesToMiB,ce as acexChunkSizeMiBToBytes,Ut as buildAcExHtmlAccessManifest,fs as buildAcExPackageAsync,wr as buildAcExPackageDataAsync,Po as buildOsnapCatalog,pa as buildViewerMetadata,Ss as captureAcApHtmlViewState,Fr as clampAcApHtmlChunkSizeMiB,Ji as collectBatchesFromObject3D,te as compressSnapshotBinary,Ha as compressSnapshotBinaryAsync,Is as configureHtmlPlugin,dr as createAcExHtmlAccessKey,rl as createHtmlPlugin,ir as encodeChunkBinary,xe as encodeOsnapCatalogBinary,Ga as encodeSnapshot,hi as encodeSnapshotBinary,Se as encryptAcExHtmlBytes,Zo as encryptAcExHtmlSnapshotPayload,xs as estimateAcExSnapshotGeometryBytes,Ya as estimateOsnapPrimitiveBytes,Ni as exportActiveBatchedLine2Slice,Me as exportActiveBatchedSlice,Pt as exportBufferGeometrySlice,Es as getHtmlPluginOptions,Fa as listDatabaseLayouts,cr as needsAcExHtmlAccessControl,Vo as packHtml,vs as packHtmlEmbeddedPackage,Xo as packHtmlPackage,Qo as protectAcExHtmlEncodedSnapshot,Jo as resolveAcApHtmlExpiresAt,J as resolveAcApHtmlExportOptions,Ps as resolveAcApHtmlPackageBuildOptions,Ce as resolveAcExHtmlLocale,Us as resolveViewerRuntimeUrl,ys as shouldEmbedAcExChunks,xi as snapshotMimeType,us as splitLayoutIntoSlices,di as splitOsnapPrimitives,zs as zipAcExPackageFiles};