@mlightcad/cad-simple-viewer-cli 1.7.8-preview.2 → 1.7.8-preview.3

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.
@@ -0,0 +1,1564 @@
1
+ import{D as Vr,E as Gt,O as Xr,R as Yr,F as He,G as Gr,H as $e,I as Wr,J as ut,K as Kr,L as Jr,f as Zr,N as qr,P as Pa,Q as Qr,S as tn,U as en,V as za,W as an,Y as rn,Z as nn,_ as je,a0 as on,a1 as sn,a2 as ln,a3 as cn,a4 as dn,a5 as un,a6 as ue,a7 as mn,a8 as pn,a9 as hn,aa as fn,ab as gn,ac as bn,ad as wn,ae as xn,af as yn,ag as vn,ah as kn,ai as An,aj as Mn,ak as Cn,al as Bn,am as Sn,an as Fn,ao as In,ap as En,aq as Ln,ar as V,as as Pn,at as lt,au as Da,av as zn,aw as me,n as Dn,ax as Un,ay as Nn,az as _n,aA as Tn,X as Rn,$ as On,aB as pt,h as x,v as Z,aC as B,aD as Hn,aE as $n,a as j,aF as jn,q as Ve,aG as Vn}from"./index-9p3u2GX4.js";import{aH as Il,aI as El}from"./index-9p3u2GX4.js";var z=Uint8Array,N=Uint16Array,pe=Int32Array,he=new z([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 z([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]),Xe=new z([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ua=function(t,e){for(var a=new N(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}},Na=Ua(he,2),Xn=Na.b,qt=Na.r;Xn[28]=258,qt[258]=28;var Yn=Ua(fe,0),Ye=Yn.r,Qt=new N(32768);for(var M=0;M<32768;++M){var K=(M&43690)>>1|(M&21845)<<1;K=(K&52428)>>2|(K&13107)<<2,K=(K&61680)>>4|(K&3855)<<4,Qt[M]=((K&65280)>>8|(K&255)<<8)>>1}var wt=(function(t,e,a){for(var r=t.length,n=0,i=new N(e);n<r;++n)t[n]&&++i[t[n]-1];var o=new N(e);for(n=1;n<e;++n)o[n]=o[n-1]+i[n-1]<<1;var s;if(a){s=new N(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,m=u|(1<<d)-1;u<=m;++u)s[Qt[u]>>l]=c}else for(s=new N(r),n=0;n<r;++n)t[n]&&(s[n]=Qt[o[t[n]-1]++]>>15-t[n]);return s}),tt=new z(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 Ft=new z(32);for(var M=0;M<32;++M)Ft[M]=5;var Gn=wt(tt,9,0),Wn=wt(Ft,5,0),_a=function(t){return(t+7)/8|0},Ta=function(t,e,a){return(a==null||a>t.length)&&(a=t.length),new z(t.subarray(e,a))},Kn=["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"],_t=function(t,e,a){var r=new Error(e||Kn[t]);if(r.code=t,Error.captureStackTrace&&Error.captureStackTrace(r,_t),!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},ht=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},Wt=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:Oa,l:0};if(n==1){var o=new z(a[0].s+1);return o[a[0].s]=1,{t:o,l:1}}a.sort(function(F,S){return F.f-S.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 m=i[0].s,r=1;r<n;++r)i[r].s>m&&(m=i[r].s);var p=new N(m+1),h=te(a[d-1],p,0);if(h>e){var r=0,f=0,g=h-e,w=1<<g;for(i.sort(function(S,C){return p[C.s]-p[S.s]||S.f-C.f});r<n;++r){var b=i[r].s;if(p[b]>e)f+=w-(1<<h-p[b]),p[b]=e;else break}for(f>>=g;f>0;){var A=i[r].s;p[A]<e?f-=1<<e-p[A]++-1:++r}for(;r>=0&&f;--r){var y=i[r].s;p[y]==e&&(--p[y],++f)}h=e}return{t:new z(p),l:h}},te=function(t,e,a){return t.s==-1?Math.max(te(t.l,e,a+1),te(t.r,e,a+1)):e[t.s]=a},Ge=function(t){for(var e=t.length;e&&!t[--e];);for(var a=new N(++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}},ft=function(t,e){for(var a=0,r=0;r<e.length;++r)a+=t[r]*e[r];return a},Ra=function(t,e,a){var r=a.length,n=_a(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},We=function(t,e,a,r,n,i,o,s,l,c,d){Y(e,d++,a),++n[256];for(var u=Wt(n,15),m=u.t,p=u.l,h=Wt(i,15),f=h.t,g=h.l,w=Ge(m),b=w.c,A=w.n,y=Ge(f),F=y.c,S=y.n,C=new N(19),v=0;v<b.length;++v)++C[b[v]&31];for(var v=0;v<F.length;++v)++C[F[v]&31];for(var k=Wt(C,7),D=k.t,rt=k.l,U=19;U>4&&!D[Xe[U-1]];--U);var nt=c+5<<3,_=ft(n,tt)+ft(i,Ft)+o,T=ft(n,m)+ft(i,f)+o+14+3*U+ft(C,D)+2*C[16]+3*C[17]+7*C[18];if(l>=0&&nt<=_&&nt<=T)return Ra(e,d,t.subarray(l,l+c));var O,L,R,W;if(Y(e,d,1+(T<_)),d+=2,T<_){O=wt(m,p,0),L=m,R=wt(f,g,0),W=f;var jt=wt(D,rt,0);Y(e,d,A-257),Y(e,d+5,S-1),Y(e,d+10,U-4),d+=14;for(var v=0;v<U;++v)Y(e,d+3*v,D[Xe[v]]);d+=3*U;for(var H=[b,F],mt=0;mt<2;++mt)for(var it=H[mt],v=0;v<it.length;++v){var $=it[v]&31;Y(e,d,jt[$]),d+=D[$],$>15&&(Y(e,d,it[v]>>5&127),d+=it[v]>>12)}}else O=Gn,L=tt,R=Wn,W=Ft;for(var v=0;v<s;++v){var P=r[v];if(P>255){var $=P>>18&31;ht(e,d,O[$+257]),d+=L[$+257],$>7&&(Y(e,d,P>>23&31),d+=he[$]);var ot=P&31;ht(e,d,R[ot]),d+=W[ot],ot>3&&(ht(e,d,P>>5&8191),d+=fe[ot])}else ht(e,d,O[P]),d+=L[P]}return ht(e,d,O[256]),d+L[256]},Jn=new pe([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Oa=new z(0),Zn=function(t,e,a,r,n,i){var o=i.z||t.length,s=new z(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=Jn[e-1],m=u>>13,p=u&8191,h=(1<<a)-1,f=i.p||new N(32768),g=i.h||new N(h+1),w=Math.ceil(a/3),b=2*w,A=function(Yt){return(t[Yt]^t[Yt+1]<<w^t[Yt+2]<<b)&h},y=new pe(25e3),F=new N(288),S=new N(32),C=0,v=0,k=i.i||0,D=0,rt=i.w||0,U=0;k+2<o;++k){var nt=A(k),_=k&32767,T=g[nt];if(f[_]=T,g[nt]=_,rt<=k){var O=o-k;if((C>7e3||D>24576)&&(O>423||!c)){d=We(t,l,0,y,F,S,v,D,U,k-U,d),D=C=v=0,U=k;for(var L=0;L<286;++L)F[L]=0;for(var L=0;L<30;++L)S[L]=0}var R=2,W=0,jt=p,H=_-T&32767;if(O>2&&nt==A(k-H))for(var mt=Math.min(m,O)-1,it=Math.min(32767,k),$=Math.min(258,O);H<=it&&--jt&&_!=T;){if(t[k+R]==t[k+R-H]){for(var P=0;P<$&&t[k+P]==t[k+P-H];++P);if(P>R){if(R=P,W=H,P>mt)break;for(var ot=Math.min(H,P-2),_e=0,L=0;L<ot;++L){var Vt=k-H+L&32767,jr=f[Vt],Te=Vt-jr&32767;Te>_e&&(_e=Te,T=Vt)}}}_=T,T=f[_],H+=_-T&32767}if(W){y[D++]=268435456|qt[R]<<18|Ye[W];var Re=qt[R]&31,Oe=Ye[W]&31;v+=he[Re]+fe[Oe],++F[257+Re],++S[Oe],rt=k+R,++C}else y[D++]=t[k],++F[t[k]]}}for(k=Math.max(k,rt);k<o;++k)y[D++]=t[k],++F[t[k]];d=We(t,l,c,y,F,S,v,D,U,k-U,d),c||(i.r=d&7|l[d/8|0]<<3,d-=7,i.h=g,i.p=f,i.i=k,i.w=rt)}else{for(var k=i.w||0;k<o+c;k+=65535){var Xt=k+65535;Xt>=o&&(l[d/8|0]=c,Xt=o),d=Ra(l,d+1,t.subarray(k,Xt))}i.i=o}return Ta(s,0,r+_a(d)+n)},qn=(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})(),Ha=function(){var t=-1;return{p:function(e){for(var a=t,r=0;r<e.length;++r)a=qn[a&255^e[r]]^a>>>8;t=a},d:function(){return~t}}},$a=function(t,e,a,r,n){if(!n&&(n={l:1},e.dictionary)){var i=e.dictionary.subarray(-32768),o=new z(i.length+t.length);o.set(i),o.set(t,i.length),t=o,n.w=i.length}return Zn(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)},ja=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},I=function(t,e,a){for(;a;++e)t[e]=a,a>>>=8},Qn=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&&I(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)}},ti=function(t){return 10+(t.filename?t.filename.length+1:0)};function ei(t,e){return $a(t,e||{},0,0)}function ai(t,e){e||(e={});var a=Ha(),r=t.length;a.p(t);var n=$a(t,e,ti(e),8),i=n.length;return Qn(n,e),I(n,i-8,a.d()),I(n,i-4,r),n}var Va=function(t,e,a,r){for(var n in t){var i=t[n],o=e+n,s=r;Array.isArray(i)&&(s=ja(r,i[1]),i=i[0]),i instanceof z?a[o]=[i,s]:(a[o+="/"]=[new z(0),s],Va(i,o,a,r))}},Ke=typeof TextEncoder<"u"&&new TextEncoder,ri=typeof TextDecoder<"u"&&new TextDecoder,ni=0;try{ri.decode(Oa,{stream:!0}),ni=1}catch{}function vt(t,e){var a;if(Ke)return Ke.encode(t);for(var r=t.length,n=new z(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 z(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 Ta(n,0,i)}var ee=function(t){var e=0;if(t)for(var a in t){var r=t[a].length;r>65535&&_t(9),e+=r+4}return e},Je=function(t,e,a,r,n,i,o,s){var l=r.length,c=a.extra,d=s&&s.length,u=ee(c);I(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 m=new Date(a.mtime==null?Date.now():a.mtime),p=m.getFullYear()-1980;if((p<0||p>119)&&_t(10),I(t,e,p<<25|m.getMonth()+1<<21|m.getDate()<<16|m.getHours()<<11|m.getMinutes()<<5|m.getSeconds()>>1),e+=4,i!=-1&&(I(t,e,a.crc),I(t,e+4,i<0?-i-2:i),I(t,e+8,a.size)),I(t,e+12,l),I(t,e+14,u),e+=16,o!=null&&(I(t,e,d),I(t,e+6,a.attrs),I(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;I(t,e,+h),I(t,e+2,g),t.set(f,e+4),e+=4+g}return d&&(t.set(s,e),e+=d),e},ii=function(t,e,a,r,n){I(t,e,101010256),I(t,e+8,a),I(t,e+10,a),I(t,e+12,r),I(t,e+16,n)};function oi(t,e){e||(e={});var a={},r=[];Va(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=vt(o),m=u.length,p=c.comment,h=p&&vt(p),f=h&&h.length,g=ee(c.extra);m>65535&&_t(11);var w=d?ei(l,c):l,b=w.length,A=Ha();A.p(l),r.push(ja(c,{size:l.length,crc:A.d(),c:w,f:u,m:h,u:m!=o.length||h&&p.length!=f,o:n,compression:d})),n+=30+m+g+b,i+=76+2*(m+g)+(f||0)+b}for(var y=new z(i+22),F=n,S=i-n,C=0;C<r.length;++C){var u=r[C];Je(y,u.o,u,u.f,u.u,u.c.length);var v=30+u.f.length+ee(u.extra);y.set(u.c,u.o+v),Je(y,n,u,u.f,u.u,u.c.length,u.o,u.m),n+=16+v+(u.m?u.m.length:0)}return ii(y,n,r.length,S,F),y}class ge{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=vt(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 X=4,Xa="gzip";function ae(t){return{bytes:ai(t),compression:Xa}}async function Ya(t){if(typeof CompressionStream>"u")return ae(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:Xa}}catch{return ae(t)}}const It="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%()*+,-.;=?@[]^_{|}~",re=new Int16Array(128).fill(-1);for(let t=0;t<It.length;t++)re[It.charCodeAt(t)]=t;function Tt(t,e){return e==="base85"?li(t):ui(t)}function si(t,e){const a=t.length>0&&(t.charCodeAt(0)<=32||t.charCodeAt(t.length-1)<=32)?t.trim():t;return e==="base85"?ci(a):mi(a)}function li(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 m=new Array(5);for(let p=4;p>=0;p--)m[p]=u%85,u=u/85|0;for(let p=0;p<5;p++)n.push(It[m[p]])}const i=Math.ceil(e*5/4);return n.slice(0,i).join("")}function ci(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=It.length-1;let l=0;for(let c=0;c<i;c+=5){let d=0;for(let u=0;u<5;u++){const m=c+u<a?di(e.charCodeAt(c+u)):s;d=d*85+m}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 di(t){if(t<0||t>=re.length)throw new Error("Invalid base85 character");const e=re[t];if(e<0)throw new Error("Invalid base85 character");return e}function ui(t){let e="";for(let a=0;a<t.length;a++)e+=String.fromCharCode(t[a]);return btoa(e)}function mi(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 Ze=1,qe=2,Qe=4,ta=8,ea=16,pi=32,aa=1,ra=2,na=4,ia=8,oa=16,hi=32,sa=64,la=128;function be(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 we(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 Ga(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.linePattern&&(a|=qe),e.lineDistances&&e.lineDistances.length>0&&(a|=Qe),e.lineWidth!=null&&e.lineWidth>0&&(a|=ta),e.renderOrder!=null&&e.renderOrder!==0&&(a|=ea),e.excludeFromOsnap&&(a|=pi),t.writeU8(a),a&Ze&&t.writeUint32Array(e.indices),a&qe&&t.writeJson(e.linePattern),a&Qe&&t.writeFloat32Array(e.lineDistances),a&ta&&t.writeF32(e.lineWidth),a&ea&&t.writeI32(e.renderOrder)}function Wa(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|=aa),e.hatchPattern&&(a|=ra),e.gradientFill&&(a|=na),e.gradientPositions&&e.gradientPositions.length>0&&(a|=ia),e.side!=null&&(a|=oa),e.points&&(a|=hi),e.renderOrder!=null&&e.renderOrder!==0&&(a|=sa),e.texture&&e.texture.bytes.length>0&&e.uvs&&e.uvs.length>=2&&(a|=la),t.writeU8(a),a&aa&&t.writeUint32Array(e.indices),a&ra&&t.writeJson(e.hatchPattern),a&na&&t.writeJson(e.gradientFill),a&ia&&t.writeFloat32Array(e.gradientPositions),a&oa&&t.writeU8(e.side),a&sa&&t.writeI32(e.renderOrder),a&la&&(t.writeFloat32Array(e.uvs),t.writeString(e.texture.mimeType||"image/png"),t.writeU32(e.texture.bytes.byteLength),t.writeBytes(e.texture.bytes))}const fi=1329939265,gi=1,bi=1,wi=2,xi=3,yi=4,vi=5,ki=6,Ai=7;function Ka(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 Mi(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=Ka(o);r.length>0&&n+s>e&&i(),r.push(o),n+=s}return i(),a}function xe(t){const e=new ge;e.writeU32(fi),e.writeU8(gi),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)Bi(e,i,n(i.layer));return e.toUint8Array()}async function Ci(t){const e=xe(t),a=(await Ya(e)).bytes;return{uncompressed:e,compressed:a}}function Kt(t,e){t.writeU8(e<0?0:1)}function gt(t,e){t.writeU32(e.length);for(const a of e)t.writeF64(a)}function Bi(t,e,a){switch(e.kind){case"line":t.writeU8(bi),t.writeU32(a),t.writeF64(e.x0),t.writeF64(e.y0),t.writeF64(e.x1),t.writeF64(e.y1);return;case"circle":t.writeU8(wi),t.writeU32(a),t.writeF64(e.cx),t.writeF64(e.cy),t.writeF64(e.r),Kt(t,e.normalSign);return;case"arc":t.writeU8(xi),t.writeU32(a),t.writeF64(e.cx),t.writeF64(e.cy),t.writeF64(e.r),t.writeF64(e.startAngle),t.writeF64(e.endAngle),Kt(t,e.normalSign);return;case"ellipse":t.writeU8(yi),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),Kt(t,e.normalSign??1);return;case"spline":t.writeU8(vi),t.writeU32(a),gt(t,e.controlPoints),t.writeU32(e.degree),gt(t,e.knots),gt(t,e.weights),t.writeU8(e.closed?1:0),gt(t,e.fitPoints??[]);return;case"point":t.writeU8(ki),t.writeU32(a),t.writeF64(e.x),t.writeF64(e.y);return;case"path":t.writeU8(Ai),t.writeU32(a),t.writeU8(e.closed?1:0),gt(t,e.vertices);return;default:{const r=e;throw new Error(`Unsupported osnap primitive: ${String(r)}`)}}}const Si=1480934209;function Fi(t){if(t.version!==X)throw new Error(`Unsupported snapshot version: ${t.version}`);const e=new ge;e.writeU32(Si),e.writeU8(X),e.writeU8(0),e.writeU8(0),e.writeU8(0),e.writeJson(Ii(t)),e.writeJson(t.layers),e.writeString(t.activeLayoutBtrId),e.writeU32(t.layouts.length);for(const a of t.layouts)Ei(e,a);return e.toUint8Array()}function Ii(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 Ei(t,e){t.writeString(e.btrId),t.writeString(e.name),t.writeU8(e.isModelSpace?1:0),Li(t,e.osnap),t.writeJson(e.viewports??null),t.writeU32(e.lineBatches.length);for(const a of e.lineBatches)Ga(t,a);t.writeU32(e.meshBatches.length);for(const a of e.meshBatches)Wa(t,a)}function Li(t,e){if(!e||e.primitives.length===0){t.writeU32(0);return}const a=xe(e);t.writeU32(a.length),t.writeBytes(a)}const Pi="application/vnd.mlightcad.acex-snapshot+binary";function Ja(t){if(t.version!==X)throw new Error(`Unsupported snapshot version: ${t.version}`);const e=Fi(t),a=ae(e);return{payload:Tt(a.bytes,"base85"),compression:a.compression}}function zi(){return Pi}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 Di(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 Za(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 ca(t,e){return t+e}const st={x:0,y:0,z:0};function Ui(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 da(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 m=!0;for(let p=0;p<e;p++){const h=i[u+p];if(h<0||h>=r||!da(a,h)){m=!1;break}}if(m)for(let p=0;p<e;p++)s.push(i[u+p])}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 m=s[u];let p=l[m];if(p<0){p=c.length/3,l[m]=p;const h=m*3;c.push(a[h],a[h+1],a[h+2])}d[u]=p}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(!da(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 m=e[u],p=e[u+1],h=e[u+2];!Number.isFinite(m)||!Number.isFinite(p)||!Number.isFinite(h)||(l++,a=Math.min(a,m),r=Math.min(r,p),n=Math.min(n,h),i=Math.max(i,m),o=Math.max(o,p),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 m=e[u],p=e[u+1],h=e[u+2];if(!Number.isFinite(m)||!Number.isFinite(p)||!Number.isFinite(h)){d[u]=0,d[u+1]=0,d[u+2]=0;continue}d[u]=m-c[0],d[u+1]=p-c[1],d[u+2]=h-c[2]}return{slice:{positions:d,indices:t.indices?new Uint32Array(t.indices):void 0},offset:c}}function Ni(t,e,a={}){t.updateMatrixWorld(!0);const r=ye(e,t.matrixWorld);return ve(r)}function _i(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(Ri(e)){a.width=e.width,a.height=e.height;const l=Hi(e.data,e.width*e.height),c=new ImageData(new Uint8ClampedArray(l),e.width,e.height);r.putImageData(c,0,0)}else if(Ti(e)){const l=Oi(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 Ti(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 Ri(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 Oi(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 Hi(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 $i(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 qa(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 ji(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 Vi(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(Yi)}}function Xi(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 Yi(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,m=c-o;a[r+1]=a[r]+Math.sqrt(d*d+u*u+m*m)}return a}function Gi(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 ua(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=(m,p)=>[a*m+n*p+o,r*m+i*p+s],d=(m,p)=>[a*m+n*p,r*m+i*p],u=(m,p,h)=>{const f=Math.cos(h),g=Math.sin(h);return[f*m-g*p,g*m+f*p]};return{patternAngle:t.patternAngle,patternLines:t.patternLines.map(m=>{const p=m.angle+t.patternAngle,h=m.angle+l,f=h+t.patternAngle,[g,w]=d(Math.cos(p),Math.sin(p)),b=Math.hypot(g,w),[A,y]=u(m.offset[0],m.offset[1],p),[F,S]=d(A,y),C=u(F,S,-f);return{angle:h,base:c(m.base[0],m.base[1]),offset:C,dashLengths:m.dashLengths.map(v=>v*b),patternLength:m.patternLength*b}})}}function Wi(t,e){return{patternAngle:t.patternAngle,patternLines:t.patternLines.map(a=>{const r=new je(a.base[0]-e[0],a.base[1]-e[1]),n=new je(a.offset[0],a.offset[1]);return on(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 ne(t,e){return!Number.isFinite(t)||t<0?0:Math.min(Math.floor(t),e)}function ie(t,e,a){const r=Math.max(0,e-a);return!Number.isFinite(t)||t<=0?r:Math.min(Math.floor(t),r)}function Et(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=ne(a.start,i.count),u=ie(a.count,i.count,d),m=Di(c,d,u);return Za(l,m)}const o=ne(a.start,e.count),s=ie(a.count,e.count,o);return{positions:et(r,o*n,s*n)}}function Lt(t){return En(t.flags)&&Ln(t.flags)}function Qa(t){const{count:e}=t.mappingStats;for(let a=0;a<e;a++){let r;try{r=t.getGeometryRangeAt(a)}catch{continue}if(Lt(r)&&r.bboxIntersectionCheck)return!0}return!1}function oe(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),m=i.array;let p=0;const h=[];for(let w=0;w<o;w++){let b;try{b=t.getGeometryRangeAt(w)}catch{continue}const A=b.indexStart??0,y=b.indexCount??0;!Lt(b)||y<=0||(h.push({start:A,count:y}),p+=y)}if(p===0)return{positions:new Float32Array(0)};const f=new Uint32Array(p);let g=0;for(const w of h)for(let b=0;b<w.count;b++)f[g++]=m[w.start+b];return Za(u,f)}let s=0;const l=[];for(let u=0;u<o;u++){let m;try{m=t.getGeometryRangeAt(u)}catch{continue}if(!Lt(m)||m.vertexCount<=0)continue;const p=m.vertexCount*r;l.push({start:m.vertexStart*r,floatCount:p}),s+=p}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 m=0;m<u.floatCount;m++)c[d++]=n[u.start+m];return{positions:c}}function ma(t,e,a){t.push(e.getX(a),e.getY(a),e.getZ(a))}function Ki(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(!Lt(s)||s.vertexCount<=0)continue;const l=s.vertexStart,c=l+s.vertexCount;for(let d=l;d<c;d++)ma(i,a,d),ma(i,r,d)}return{positions:new Float32Array(i)}}function Ji(t,e){const a=t.instanceCount;if(Number.isFinite(a)&&a>=0)return Math.min(Math.floor(a),e);const r=t.drawRange,n=ne(r.start,e);return ie(r.count,e,n)}function Zi(t){const e=t.getAttribute("instanceStart"),a=t.getAttribute("instanceEnd");if(!e||!a||e.count===0)return{positions:new Float32Array(0)};const r=Ji(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 Ct(t,e){let a=t;for(;a&&a!==e;){if(a.visible===!1)return!1;a=a.parent}return!0}function tr(t){if(t instanceof rn)return t.linewidth}function xt(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=za(t),r=a.layer??"0",n=t;let i=n.color!=null?n.color.getHex():a.color??16777215;const o=ji(t),s=Vi(t),l=Xi(t);if(t instanceof an||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 qi(t,e){const a=za(e).drawOrder??t.renderOrder;return a===0?void 0:a}function dt(t,e,a){const r=qi(e,a);r!=null&&(t.renderOrder=r)}function Qi(t,e){if(!e)return;const a=t.userData.bakedWorldMatrix;return a&&a.length>=16?ua(e,a):(t.updateMatrixWorld(!0),ua(e,Array.from(t.matrixWorld.elements)))}function Rt(t){return Ui(t)}function Jt(t,e,a={}){const r=Ni(t,e,a);return{...r.slice,offset:r.offset}}function to(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 kt(t,e,a,r,n,i=!1){i&&(r=to(r));const o=at(e),s=Qi(a,o.hatchPattern),l=s?Wi(s,n):void 0,c=o.gradientFill?Gi(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 m=_i(u.map),p=$i(t,r.positions);if(!m||!p)return;d.texture=m,d.uvs=p,d.color=16777215,d.side=nn}return dt(d,a,e),d}function eo(t){const e=Ki(t,t.geometry);if(e.positions.length===0)return;const{color:a,layer:r}=at(t.material),n=tr(t.material),i={layer:r,color:a,offset:Rt(t),lineWidth:n,...e};return Qa(t)&&(i.excludeFromOsnap=!0),dt(i,t,t.material),i}function ao(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:Rt(t),linePattern:n,lineDistances:i,...e};return Qa(t)&&(o.excludeFromOsnap=!0),dt(o,t,t.material),o}function ro(t){const e=Me(t,t.geometry);if(e.positions.length!==0)return kt(t.geometry,t.material,t,e,Rt(t),!0)}function no(t){const e=Me(t,t.geometry);if(e.positions.length===0)return;const a=kt(t.geometry,t.material,t,e,Rt(t));if(a)return{points:!0,...a}}const q=new ut,Pt=new ut,bt=new Tn;bt.matrixAutoUpdate=!1;function io(t){const e=t;return e.isInstancedMesh===!0&&e.instanceMatrix!=null&&typeof e.count=="number"&&e.geometry!=null}function oo(t){return t.renderOrder<1e4||t.isInstancedMesh===!0?!1:Pa(t).sharesTemplateGeometry===!0}function se(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 er(t,e){var a;const r=ct(Et(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 p=0;p<t.count;p++)q.fromArray(i,p*16),se(q)&&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 p=0;p<t.count;p++){if(q.fromArray(i,p*16),!se(q))continue;Pt.multiplyMatrices(t.matrixWorld,q);const h=ye(r,Pt);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 m=ve(ct({positions:l,indices:c},e));if(m.slice.positions.length!==0)return{slice:m.slice,offset:m.offset}}function so(t){const e=at(t),a=t;return!!(e.hatchPattern||e.gradientFill||a.map)}function lo(t,e){t.updateMatrixWorld(!0);const a=t.instanceMatrix.array;for(let r=0;r<t.count;r++)q.fromArray(a,r*16),se(q)&&(Pt.multiplyMatrices(t.matrixWorld,q),e(Pt))}function co(t,e){const a=er(t,2);if(!a)return;const r=xt(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};oe(t)&&(l.excludeFromOsnap=!0),dt(l,t,r),e.push(l)}function pa(t,e,a){const r=xt(t);if(!a&&qa(r))return;if(!a&&so(r)){const o=ct(Et(t.geometry),3);if(o.positions.length===0)return;lo(t,s=>{const l=ct(ye(o,s),3);if(l.positions.length===0)return;const c=ve(l);bt.matrix.copy(s),bt.matrixWorld.copy(s),bt.matrixWorldNeedsUpdate=!1;const d=kt(t.geometry,r,bt,c.slice,c.offset,!0);d&&e.push(d)});return}const n=er(t,a?1:3);if(!n)return;const i=kt(t.geometry,r,t,n.slice,n.offset,!a);i&&e.push(a?{...i,points:!0}:i)}function Bt(t){const e=t;return t instanceof tn||e.isLineSegments2===!0||t.type==="LineSegments2"}function ha(t){const e=t;return t instanceof Qr||e.isLineSegments===!0||t.type==="LineSegments"}function fa(t){const e=t;return t instanceof en||e.isMesh===!0||e.isInstancedMesh===!0||t.type==="Mesh"}function uo(t){const e=[],a=[];return t.traverse(r=>{if(!(Xr(r)||Yr(r)||oo(r))){if(io(r)){if(!Ct(r,t))return;r.isPoints===!0?pa(r,a,!0):ha(r)&&!Bt(r)?co(r,e):fa(r)&&!Bt(r)&&pa(r,a,!1);return}if(r instanceof He){const n=ao(r);n&&e.push(n);return}if(r instanceof Gr){const n=eo(r);n&&e.push(n);return}if(r instanceof $e){const n=ro(r);n&&a.push(n);return}if(r instanceof Wr){const n=no(r);n&&a.push(n);return}if(Bt(r)){if(!Ct(r,t))return;const n=Zi(r.geometry);if(n.positions.length===0)return;const i=xt(r),{color:o,layer:s}=at(i),{offset:l,...c}=Jt(r,n),d={layer:s,color:o,offset:l,lineWidth:tr(i),...c};oe(r)&&(d.excludeFromOsnap=!0),dt(d,r,i),e.push(d)}else if(ha(r)&&!(r instanceof He)){if(!Ct(r,t))return;const n=ct(Et(r.geometry),2);if(n.positions.length===0)return;const i=xt(r),{color:o,layer:s,linePattern:l}=at(i),{offset:c,...d}=Jt(r,n),u=l?Ae(d.positions):void 0,m={layer:s,color:o,offset:c,linePattern:l,lineDistances:u,...d};oe(r)&&(m.excludeFromOsnap=!0),dt(m,r,i),e.push(m)}else if(fa(r)&&!Bt(r)&&!(r instanceof $e)){if(!Ct(r,t))return;const n=xt(r);if(qa(n))return;const i=ct(Et(r.geometry),3);if(i.positions.length===0)return;const{offset:o,...s}=Jt(r,i),l=kt(r.geometry,n,r,s,o,!0);l&&a.push(l)}}}),{lineBatches:e,meshBatches:a}}const ga={size:8,colorCss:"#0080ff",hotColorCss:"#ff0000"};function ba(t){const e=new Zr(qr.ByACI,t);return e.cssColor??`rgb(${e.red}, ${e.green}, ${e.blue})`}function mo(t){try{const e=Vr.instance(),a=e.getVar(Gt.GRIPSIZE,t),r=e.getVar(Gt.GRIPCOLOR,t),n=e.getVar(Gt.GRIPHOT,t);return!(a>0)||!Number.isFinite(a)?ga:{size:a,colorCss:ba(r),hotColorCss:ba(n)}}catch{return ga}}function ar(t,e){const a=t.extmin,r=t.extmax,n=mo(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 wa(t,e,a,r,n){return Math.atan2(r-e,n*(a-t))}function Ce(t){return t.z>=0?1:-1}function rr(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:wa(n,i,a.startPoint.x,a.startPoint.y,r),endAngle:wa(n,i,a.endPoint.x,a.endPoint.y,r),normalSign:r})}function E(t,e){const a=new V(e.x,e.y,e.z??0).applyMatrix4(t);return{x:a.x,y:a.y}}function po(t){const e=t.elements;return new ut(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 zt(t,e){return new ut().multiplyMatrices(t,po(e))}function nr(t,e){const a=new V(e.x,e.y,e.z??0).transformDirection(t).normalize();return{x:a.x,y:a.y}}function le(t){const e=new V(t.elements[0],t.elements[1],t.elements[2]).length(),a=new V(t.elements[4],t.elements[5],t.elements[6]).length();return lt.equal(e,a,Da*Math.max(e,a,1))}function ho(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 fo(t){if(t instanceof Pn)return!0;const e=t;return(e.type==="LINE"||e.type==="Line")&&e.startPoint!=null&&e.endPoint!=null}function go(t,e,a,r){r.startPoint,r.endPoint}function ir(t,e){return t.blockTableRecord??(t.blockName?e.tables.blockTable.getAt(t.blockName):void 0)}function bo(t,e){const a=t.dimBlockId;return a?e.tables.blockTable.getAt(a):void 0}function wo(t,e){const a=ir(t,e);if(a)return a;const r=t.owningBlockRecordId;return r?e.tables.blockTable.getAt(r):void 0}function or(t){return t.getFullInsertionTransform()}function xo(t){for(const e of t.newIterator())return!0;return!1}function yo(t){return typeof t.getFullInsertionTransform=="function"&&"blockTableRecord"in t}function Q(t,e,a,r,n){if(r.length<2)return;const i=le(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=E(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 sr(t,e){return lt.equal(t.x,e.x)&&lt.equal(t.y,e.y)}function vo(t){return(t.clockwise?-1:1)*Math.tan(t.deltaAngle/4)}function xa(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];sr(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 ya(t){return t.length>=2&&sr(t[0],t[t.length-1])&&t.pop(),t}function yt(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 ko(t,e,a,r){const n=[r.startPosition];for(const i of r.segments)n.push(i.position);yt(t,e,a,n,r.closed)}function Ao(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)<=Da?a.vertices:[r,n]}function Mo(t,e,a,r){var n,i;for(const s of r.leaders)for(const l of s.leaderLines){const c=Ao(r,s,l);yt(t,e,a,c,!1)}const o=s=>{if(!s)return;const l=E(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 Co(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},m={x:c.x,y:c.y,z:i};if(lt.isPositive(Math.abs(d))){const p=E(a,u),h=E(a,m);rr(t,e,new me(p,h,d))}}}function Bo(t,e,a,r,n,i){const o=E(a,r),s=new V(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:Ce(i)};t.push(l)}function So(t,e,a,r){const n=E(a,r.center),i=new V(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:Ce(r.normal)};t.push(o)}function Zt(t,e,a,r){const n=E(a,r.center),i=r._geo,o=(i==null?void 0:i.majorAxis)??{x:1,y:0,z:0},s=nr(a,o),l=Math.hypot(s.x,s.y)||1,c=new V(a.elements[0],a.elements[1],a.elements[2]).length(),d=new V(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:Ce(r.normal)};t.push(u)}function Fo(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=E(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=E(a,c);l.fitPoints.push(d.x,d.y)}}t.push(l)}const va=1e-6;function Io(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 Eo(t){return t.some(e=>{const a=Math.max(0,e.startWidth??0),r=Math.max(0,e.endWidth??0);return a>va||r>va})}function Lo(t,e,a,r){const n=Io(r),i=n.length;if(i<2)return;if(Eo(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=E(a,l),m=E(a,c);rr(t,e,new me(u,m,d))}}}function Po(t,e,a,r,n){const i=E(a,{x:r.center.x,y:r.center.y,z:n}),o=nr(a,{x:Math.cos(r.rotation),y:Math.sin(r.rotation),z:0}),s=Math.hypot(o.x,o.y)||1,l=new V(a.elements[0],a.elements[1],a.elements[2]).length(),c=new V(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 zo(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 Do(t,e,a,r,n){if(r instanceof Dn){zo(t,e,a,r,n);return}if(!(r instanceof Un))return;const i=[];let o=!1;const s=()=>{const c=ya(i);c.length>=2&&Q(t,e,a,c,!1),i.length=0};for(const c of r.curves)c instanceof Nn?xa(i,{x:c.startPoint.x,y:c.startPoint.y,z:n},{x:c.endPoint.x,y:c.endPoint.y,z:n},0):c instanceof me?xa(i,{x:c.startPoint.x,y:c.startPoint.y,z:n},{x:c.endPoint.x,y:c.endPoint.y,z:n},vo(c)):c instanceof _n&&(o=!0,s(),Po(t,e,a,c,n));const l=ya(i);l.length>=2&&Q(t,e,a,l,!o)}function Uo(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)Do(t,e,a,s,o)}function No(t,e,a,r){zt(a,or(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 _o(t,e,a,r,n,i,o,s=!0){const l=ce(t.layer,a);if(o&&!o(l))return;const c=wo(t,i);if(c&&!n.has(c.objectId)&&xo(c)){n.add(c.objectId);const u=zt(e,or(t));Dt(c,u,l,r,n,i,o,s),n.delete(c.objectId);return}No(r,l,e,t);const d=E(e,t.position);r.push({kind:"point",layer:l,x:d.x,y:d.y})}function To(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=E(a,r.position);t.push({kind:"point",layer:e,x:i.x,y:i.y})}function Ro(t,e,a,r){const n=r.position();Q(t,e,a,[n.upperLeft,n.upperRight,n.lowerRight,n.lowerLeft],!0);const i=E(a,r.getLocation());t.push({kind:"point",layer:e,x:i.x,y:i.y})}function Oo(t){var e;const a=(e=t.attributeIterator)==null?void 0:e.call(t);return a?typeof a.toArray=="function"?a.toArray():[...a]:[]}function ce(t,e){return t==="0"?e:t}function lr(t,e,a,r,n,i,o,s=!0){if(!t.visibility)return;const l=ce(t.layer,a);if(!(o&&!o(l))){if(t instanceof sn){_o(t,e,a,r,n,i,o,s);return}if(yo(t)){const c=ir(t,i);if(!c||n.has(c.objectId))return;n.add(c.objectId);const d=t.getFullInsertionTransform(),u=Math.max(1,t.columnCount??1),m=Math.max(1,t.rowCount??1),p=t.columnSpacing??0,h=t.rowSpacing??0,f=ce(t.layer,a);for(let g=0;g<m;g++)for(let w=0;w<u;w++){const b=zt(e,d);(w!==0||g!==0)&&b.multiply(new ut().makeTranslation(w*p,g*h,0));const A=E(b,{x:0,y:0,z:0});r.push({kind:"point",layer:f,x:A.x,y:A.y}),Dt(c,b,f,r,n,i,o,s)}for(const g of Oo(t))g instanceof ln,g.isInvisible||lr(g,e,f,r,n,i,o,s);n.delete(c.objectId);return}if(t instanceof cn){const c=t,d=bo(c,i);if(!d||n.has(d.objectId))return;n.add(d.objectId);const u=zt(e,c.getFullDimBlockTransform());Dt(d,u,l,r,n,i,o,!0),n.delete(d.objectId);return}if(fo(t)){go(r,l,e,t);return}if(t instanceof dn){le(e)?Bo(r,l,e,t.center,t.radius,t.normal):Zt(r,l,e,Ho(t));return}if(t instanceof un){le(e)?So(r,l,e,t):Zt(r,l,e,$o(t));return}if(t instanceof ue){Zt(r,l,e,t);return}if(t instanceof mn){Fo(r,l,e,t);return}if(t instanceof pn){Lo(r,l,e,t);return}if(t instanceof hn){Co(r,l,e,t);return}if(t instanceof fn){const c=[];for(let d=0;d<t.numberOfVertices;d++)c.push(t.getPointAt(d));yt(r,l,e,c,t.closed);return}if(t instanceof gn){s&&Uo(r,l,e,t);return}if(t instanceof bn){t.basePoint,t.unitDir;return}if(t instanceof wn){t.basePoint,t.unitDir;return}if(t instanceof xn){Q(r,l,e,[t.getPointAt(0),t.getPointAt(1),t.getPointAt(3),t.getPointAt(2)],!0);return}if(t instanceof yn){s&&Q(r,l,e,[t.getPointAt(0),t.getPointAt(1),t.getPointAt(3),t.getPointAt(2)],!0);return}if(t instanceof vn){const c=t.subGetGripPoints();c.length>=2&&yt(r,l,e,c,c.length>=3);return}if(t instanceof kn){const c=t.vertices;c.length>=2&&yt(r,l,e,c,!1);return}if(t instanceof An){ko(r,l,e,t);return}if(t instanceof Mn){Mo(r,l,e,t);return}if(t instanceof Cn){const c=E(e,t.position);r.push({kind:"point",layer:l,x:c.x,y:c.y});return}if(t instanceof Bn){const c=E(e,t.location);r.push({kind:"point",layer:l,x:c.x,y:c.y});return}if(t instanceof Sn){s&&Ro(r,l,e,t);return}if(t instanceof Fn){s&&To(r,l,e,t);return}if(t instanceof In){const c=E(e,t.position);r.push({kind:"point",layer:l,x:c.x,y:c.y})}}}function Dt(t,e,a,r,n,i,o,s=!0){for(const l of t.newIterator())lr(l,e,a,r,n,i,o,s)}function Ho(t){return new ue(t.center,t.normal,{x:1,y:0,z:0},t.radius,t.radius,0,zn)}function $o(t){return new ue(t.center,t.normal,{x:1,y:0,z:0},t.radius,t.radius,t.startAngle,t.endAngle)}function jo(t,e,a={}){const r=ho(t,e);if(!r)return{primitives:[]};const n=[],i=new ut;return Dt(r,i,"0",n,new Set,t,a.includeLayer),{primitives:n.filter(o=>o.kind!=="line"&&Vo(o))}}function Vo(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 Xo=["en","zh","cs","tr","ar"];function Be(t){if(t==null||t==="")return null;const e=t.toLowerCase().replace("_","-");for(const a of Xo)if(e===a||e.startsWith(`${a}-`))return a;return null}const Yo=1128612673;function cr(t){if(t.version!==X)throw new Error(`Unsupported chunk version: ${t.version}`);const e=new ge;e.writeU32(Yo),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)Ga(e,a);e.writeU32(t.meshBatches.length);for(const a of t.meshBatches)Wa(e,a);return e.toUint8Array()}async function Go(t){const e=cr(t),a=(await Ya(e)).bytes;return{uncompressed:e,compressed:a}}const Wo=1,dr=2*1024*1024,Ot=2*1024*1024,Ko=8*1024*1024,ka=12*1024*1024,Jo=2*1024*1024,Ht="drawing.acex.json",Zo=`./${Ht}`;function Se(...t){return`<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 1024 1024">${t.map(e=>`<path fill="currentColor" d="${e}"/>`).join("")}</svg>`}Se("M624 475.968V640h144a128 128 0 0 1 128 128H128a128 128 0 0 1 128-128h144V475.968a192 192 0 1 1 224 0M128 896v-64h768v64z");Se("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");Se("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 qo='<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>',Qo='<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>',ts='<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>',de={layerOn:Qo,layerOff:ts,chevronDown:qo},es=[90,45,30,23,18,10,5];function as(){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
+ ${es.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 rs=600,ns=960,Fe=`
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: ${rs}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: ${ns}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 Ie(t,e="measure",a=!0){const r=e==="measure"?`${as()}${os()}${is()}`:"";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
+ ${Ee("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
+ ${de.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
+ ${de.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 Ee(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}">${de.chevronDown}</button>
1439
+ </div>`}function is(){return`<div id="mlcad-review-drawer" role="dialog" data-i18n-attr="aria-label" data-i18n-key="review.title" aria-label="Review" hidden>
1440
+ ${Ee("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 os(){return`<div id="mlcad-measure-drawer" role="dialog" data-i18n-attr="aria-label" data-i18n-key="measurePanel.title" aria-label="Measurements" hidden>
1489
+ ${Ee("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 ss(t,e){var a;const r=e.title??t.meta.title??"CAD Drawing",n=e.encoded??Ja(t),i=e.viewerRuntime,o=zi(),s=n.compression,l=((a=e.accessManifest)==null?void 0:a.encrypted)===!0,c=`#${t.meta.background.toString(16).padStart(6,"0")}`,d=Be(t.meta.locale)??"en",u=t.meta.viewerMode??"measure",m=t.meta.exportLayouts!==!1,p=e.accessManifest?` <script id="mlcad-access" type="application/json">${pr(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>${ur(r)}</title>
1524
+ <style>${Fe}</style>
1525
+ </head>
1526
+ <body>
1527
+ ${Ie(c,u,m)}
1528
+ ${p} <script id="mlcad-snapshot" type="${h}">${n.payload}<\/script>
1529
+ <script>${mr(i)}<\/script>
1530
+ </body>
1531
+ </html>`}function ls(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=Be(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!==Zo?{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>${ur(r)}</title>
1538
+ <style>${Fe}</style>
1539
+ </head>
1540
+ <body>
1541
+ ${Ie(i,s,l)}
1542
+ <script id="mlcad-package" type="application/json">${pr(d)}<\/script>
1543
+ <script>${mr(n)}<\/script>
1544
+ </body>
1545
+ </html>`}function ur(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function mr(t){return t.replace(/<\/script/gi,"<\\/script")}function pr(t){return t.replace(/</g,"\\u003c")}const cs=1,ds=1e5,us=16,ms=12;function ps(t,e=Date.now(),a){return t==="never"?null:t==="custom"?a??null:e+t*24*60*60*1e3}function hr(t){var e;const a=!!((e=t.password)!=null&&e.trim());return t.expiresAt!=null||a}function Ut(t){var e;if(!hr(t))return;const a=!!((e=t.password)!=null&&e.trim());return{v:cs,expiresAt:t.expiresAt,encrypted:a,...a&&t.salt?{salt:t.salt}:{}}}async function fr(t,e){const a=crypto.getRandomValues(new Uint8Array(us));return{key:await bs(t,a),salt:gr(a)}}async function Le(t,e){const a=crypto.getRandomValues(new Uint8Array(ms)),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 hs(t,e,a="base85"){const{key:r,salt:n}=await fr(t),i=si(e,a),o=await Le(r,i);return{encryptedPayload:Tt(o,a),salt:n}}function fs(t){return gr(t)}async function gs(t,e){var a;if(!hr(e))return{encoded:t};const r=(a=e.password)==null?void 0:a.trim();if(r){const{encryptedPayload:n,salt:i}=await hs(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 bs(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:ds,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}function gr(t){let e="";for(let a=0;a<t.length;a++)e+=String.fromCharCode(t[a]);return btoa(e)}const ws=256;function xs(t,e=Ot){return!(e>0)||be(t)<=e?[t]:t.indices&&t.indices.length>=2?ks(t,e):vs(t,e)}function ys(t,e=Ot){return t.texture?[t]:!(e>0)||we(t)<=e?[t]:t.points?Ms(t,e):!t.indices||t.indices.length<3?wr(t,e):Bs(t,e)}function br(t){return t.linePattern?64+t.linePattern.pattern.length*8:0}function Pe(t){return(t.hatchPattern?128:0)+(t.gradientFill?64:0)}function Mt(t,e,a){const r=t-ws-e;return r<a?1:Math.max(1,Math.floor(r/a))}function vs(t,e){var a;const r=(((a=t.lineDistances)==null?void 0:a.length)??0)>=2,n=24+(r?8:0),i=Mt(e,br(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(vr(t,u),r&&t.lineDistances){const m=l*2;u.lineDistances=t.lineDistances.slice(m,m+c*2)}s.push(u)}return s.length>0?s:[t]}function ks(t,e){var a;const r=t.indices,n=32+((((a=t.lineDistances)==null?void 0:a.length)??0)>0?8:0),i=Mt(e,br(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(As(t,s,c)),s+=c}return o.length>0?o:[t]}function As(t,e,a){const r=yr(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 vr(t,n),r.attributes[0]&&r.attributes[0].length>0&&(n.lineDistances=r.attributes[0]),n}function Ms(t,e){return t.indices&&t.indices.length>0?Cs(t,e):wr(t,e)}function Cs(t,e){const a=t.indices,r=16+(t.uvs?8:0)+(t.gradientPositions?8:0),n=Mt(e,Pe(t),r),i=[];for(let o=0;o<a.length;){const s=Math.min(n,a.length-o);if(s<1)break;i.push(xr(t,o,s)),o+=s}return i.length>0?i:[t]}function wr(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=Mt(e,Pe(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(Ss(t,l,d))}return s.length>0?s:[t]}function Bs(t,e){const a=t.indices,r=48+(t.uvs?24:0)+(t.gradientPositions?24:0),n=Mt(e,Pe(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(xr(t,o,l)),o+=l}return i.length>0?i:[t]}function Ss(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 kr(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 xr(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=yr(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};kr(t,o);let s=0;return t.uvs&&(o.uvs=i.attributes[s++]),t.gradientPositions&&(o.gradientPositions=i.attributes[s]),o}function yr(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 m=0;m<a.length;m++){const p=r[m],h=a[m],f=c*p;for(let g=0;g<p;g++)s[m].push(h[f+g]??0)}}o[l]=d}return{positions:Float32Array.from(i),indices:o,attributes:s.map(l=>Float32Array.from(l))}}function vr(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 kr(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 Fs(t,e,a=Ot){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=be(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=we(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 xs(c,l))o(d);for(const c of t.meshBatches)for(const d of ys(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 Is(t,e){if(t.version!==X)throw new Error(`Unsupported snapshot version: ${t.version}`);const a=e.maxChunkBytes??dr,r=e.maxBatchBytes??Ot,n=e.maxOsnapChunkBytes??a,i=e.compressChunks!==!1,o=i?"acex.gz":"acex",s=i?"osnap.gz":"osnap",l=Ht,c=zs(t.layouts,t.activeLayoutBtrId),d=[],u=[],m=new Map;return c.forEach((p,h)=>{var f;m.set(p.btrId,h);const g=Fs(p,a,r),w=[];g.forEach((y,F)=>{const S=`L${h}-${String(F).padStart(3,"0")}`,C=`chunks/${S}.${o}`;w.push(S),d.push({kind:"geometry",id:S,href:C,layoutBtrId:p.btrId,lineBatchCount:y.lineBatches.length,meshBatchCount:y.meshBatches.length,chunk:{version:X,layoutBtrId:p.btrId,lineBatches:y.lineBatches,meshBatches:y.meshBatches}})});const b={btrId:p.btrId,name:p.name,isModelSpace:p.isModelSpace,viewports:p.viewports,...p.savedView?{savedView:p.savedView}:{},chunkIds:w},A=(f=p.osnap)==null?void 0:f.primitives;if(A&&A.length>0){const y=Mi(A,n),F=[];y.forEach((S,C)=>{const v=`L${h}-osnap-${String(C).padStart(3,"0")}`,k=`chunks/${v}.${s}`;F.push(v),d.push({kind:"osnap",id:v,href:k,layoutBtrId:p.btrId,primitiveCount:S.length,primitives:S})}),b.osnapChunkIds=F}u.push(b)}),{jobs:d,layoutRefs:u,layoutIndexByBtrId:m,manifestFileName:l,compressChunks:i}}function Es(t,e,a,r,n){var i,o;const s=[],l=[],c=[];for(const w of n){const{job:b,uncompressedByteLength:A,compressed:y}=w;c.push({path:b.href,bytes:y}),b.kind==="geometry"?s.push({id:b.id,href:b.href,layoutBtrId:b.layoutBtrId,byteLength:A,compressedByteLength:y.byteLength,lineBatchCount:b.lineBatchCount,meshBatchCount:b.meshBatchCount}):l.push({id:b.id,href:b.href,layoutBtrId:b.layoutBtrId,byteLength:A,compressedByteLength:y.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)??[]),m=[...s.filter(w=>u.has(w.id)),...s.filter(w=>!u.has(w.id))],p=new Set(((o=d.find(w=>w.btrId===t.activeLayoutBtrId))==null?void 0:o.osnapChunkIds)??[]),h=[...l.filter(w=>p.has(w.id)),...l.filter(w=>!p.has(w.id))],f={format:"acex-package",packageVersion:Wo,snapshotVersion:X,meta:t.meta,layers:t.layers,activeLayoutBtrId:t.activeLayoutBtrId,layouts:d,chunks:m,...h.length>0?{osnapChunks:h}:{}},g=`${JSON.stringify(f)}
1546
+ `;return c.unshift({path:r,bytes:vt(g)}),{manifest:f,manifestFileName:r,files:c}}async function Ls(t,e){if(t.kind==="geometry"){if(!e){const o=cr(t.chunk);return{job:t,uncompressedByteLength:o.byteLength,compressed:o}}const{uncompressed:n,compressed:i}=await Go(t.chunk);return{job:t,uncompressedByteLength:n.byteLength,compressed:i}}if(!e){const n=xe({primitives:t.primitives});return{job:t,uncompressedByteLength:n.byteLength,compressed:n}}const{uncompressed:a,compressed:r}=await Ci({primitives:t.primitives});return{job:t,uncompressedByteLength:a.byteLength,compressed:r}}async function Ar(t,e={}){const{jobs:a,layoutRefs:r,layoutIndexByBtrId:n,manifestFileName:i,compressChunks:o}=Is(t,e),s=await Promise.all(a.map(l=>Ls(l,o)));return Es(t,r,n,i,s)}async function Ps(t,e){const a=await Ar(t,e),r=ls(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:vt(r)},...a.files]}}function zs(t,e){const a=t.find(n=>n.btrId===e),r=t.filter(n=>n.btrId!==e);return a?[a,...r]:[...t]}const Ds="application/vnd.mlightcad.acex-chunk;base85",Us="application/vnd.mlightcad.acex-chunk+aes-gcm;base85",Mr="data-acex-href";function Ns(t){var e;let a=0;for(const r of t.layouts){for(const i of r.lineBatches)a+=be(i);for(const i of r.meshBatches)a+=we(i);const n=(e=r.osnap)==null?void 0:e.primitives;if(n)for(const i of n)a+=Ka(i)}return a}function _s(t,e=Ko){return Ns(t)>=e}async function Ts(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=Be(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??ka,maxBatchBytes:e.maxBatchBytes??e.maxChunkBytes??ka,maxOsnapChunkBytes:e.maxOsnapChunkBytes??Jo},m=await Ar(t,u);let p,h,f;if(d){const{key:w,salt:b}=await fr(d);p=Ut({expiresAt:c,password:d,salt:b});const A=new TextEncoder().encode(`${JSON.stringify(m.manifest)}
1547
+ `),y=await Le(w,A);h={mode:"embedded",encrypted:!0,encryptedManifest:fs(y)},f=await Os(m.files,w)}else p=Ut({expiresAt:c}),h={mode:"embedded",manifest:m.manifest},f=Rs(m.files);const g=p?` <script id="mlcad-access" type="application/json">${Aa(JSON.stringify(p))}<\/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>${Cr(r)}</title>
1555
+ <style>${Fe}</style>
1556
+ </head>
1557
+ <body>
1558
+ ${Ie(i,s,l)}
1559
+ ${g} <script id="mlcad-package" type="application/json">${Aa(JSON.stringify(h))}<\/script>
1560
+ ${f} <script>${Hs(n)}<\/script>
1561
+ </body>
1562
+ </html>`}function Rs(t){const e=[];for(const a of t)a.path!==Ht&&e.push(` <script type="${Ds}" ${Mr}="${Br(a.path)}">${Tt(a.bytes,"base85")}<\/script>
1563
+ `);return e.join("")}async function Os(t,e){const a=[];for(const r of t){if(r.path===Ht)continue;const n=await Le(e,r.bytes);a.push(` <script type="${Us}" ${Mr}="${Br(r.path)}">${Tt(n,"base85")}<\/script>
1564
+ `)}return a.join("")}function Cr(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Br(t){return Cr(t).replace(/'/g,"&#39;")}function Hs(t){return t.replace(/<\/script/gi,"<\\/script")}function Aa(t){return t.replace(/</g,"\\u003c")}function $s(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 js(t){return t.endsWith(".gz")}function Vs(t){const e={};for(const a of t.files){if(!$s(a.path))throw new Error(`Unsafe package path: ${a.path}`);js(a.path)?e[a.path]=[a.bytes,{level:0}]:e[a.path]=[a.bytes,{level:6}]}return oi(e)}const $t=0,ze=16777215;function Sr(t){return t==="white"||t==="space"?t:"black"}function Xs(t){return t==="white"?ze:$t}function Ma(t,e,a){return t==="space"?e?$t:ze:a>>>0}function Ca(t){const e=t>>>0,a=e>>16&255,r=e>>8&255,n=e&255;return(a*299+r*587+n*114)/1e3>=128}function Ys(t){const e=t>>>0,a=e>>16&255,r=e>>8&255,n=e&255,i=Math.max(a,r,n),o=Math.min(a,r,n);return i-o>16?null:i<=40?ze:o>=215?$t:null}function St(t){return Ys(t)??t}function Fr(t,e,a){if(Ca(e)!==Ca(a)){for(const r of t.lineBatches)r.color=St(r.color);for(const r of t.meshBatches){if(r.texture)continue;r.color=St(r.color);const n=r.gradientFill;n&&(n.startColor=St(n.startColor),n.endColor=St(n.endColor))}}}function Gs(t,e,a){const r=a>>>0;t.meta.background=r;for(const n of t.layouts)Fr(n,e,r)}function Ws(t,e,a){const r=Sr(a);if(t.meta.backgroundMode=r,r==="space"){for(const i of t.layouts)Fr(i,e,Ma("space",i.isModelSpace,0));const n=t.layouts.find(i=>i.btrId===t.activeLayoutBtrId);t.meta.background=Ma("space",n==null||n.isModelSpace,$t);return}Gs(t,e,Xs(r)),t.meta.backgroundMode=r}const Ir="https://mlightcad.com/cad-viewer/docs/";let Er=Pr(Ir);function Lr(){return Er}function Ks(t){Er=Pr(t)}function Pr(t){const e=t.trim();return e?e.replace(/\/+$/,""):Ir.replace(/\/+$/,"")}function Js(){return{minX:0,minY:0,maxX:0,maxY:0,valid:!1}}function Zs(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=ca(e[i],r),s=ca(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 Ba(t,e){Zs(t,e.positions,e.offset)}function qs(t){return t.valid?{minX:t.minX,minY:t.minY,maxX:t.maxX,maxY:t.maxY}:null}function Qs(t,e){const a=Js();for(const r of t)Ba(a,r);for(const r of e)Ba(a,r);return qs(a)}function zr(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 tl(t){if(!t||t.length===0)return null;let e=null;for(const a of t)e=zr(e,a.paper);return e}function el(t){return zr(Qs(t.lineBatches,t.meshBatches),tl(t.viewports))}function al(t,e,a){if(a)return;const r=nl(t,e);if(!(r!=null&&r.newIterator))return;const n=[];for(const i of r.newIterator()){if(!(i instanceof Kr)||Jr.isDefaultPaperSpaceViewport(i)||typeof i.toGiViewport!="function")continue;const o=i.toGiViewport(),s=o.box,l=o.viewBox,c=Sa(s),d=Sa(l);if(!c||!d)continue;const u=Number.isFinite(o.viewTwistAngle)?o.viewTwistAngle:i.viewTwistAngle,m=rl(o,i),p={paper:c,model:d};Number.isFinite(u)&&Math.abs(u)>1e-12&&(p.twist=u),m.length>0&&(p.frozenLayers=m),n.push(p)}return n.length>0?n:void 0}function rl(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 Sa(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 nl(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 Fa=16/9;function il(t,e,a,r=Fa){var n,i,o,s;const l=Number.isFinite(r)&&r>0?r:Fa;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 Ia(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 Ia(d.limits)}}function Ia(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}}function Dr(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 ol(t,e,a={}){return ll(t,e,a)}async function sl(t,e,a={}){const r=a.yieldBetweenLayouts;r&&await r();const n=a.exportInvisibleLayers!==!1,i=a.exportLayouts!==!1,o=n?void 0:h=>De(e,h,n),s=ar(t,{title:a.title,background:a.background}),l=Ur(e,n),c=Dr(t),d=new Map(c.map(h=>[h.blockTableRecordId,h.name])),u=Tr(e,i),m=_r(e,c,i),p=[];for(const h of m)p.push(Rr(t,e,h,d,a,o)),r&&await r();return{version:X,meta:Nr(s,a,p,u),layers:l,layouts:p,activeLayoutBtrId:u}}function ll(t,e,a){const r=a.exportInvisibleLayers!==!1,n=a.exportLayouts!==!1,i=r?void 0:p=>De(e,p,r),o=ar(t,{title:a.title,background:a.background}),s=Ur(e,r),l=Dr(t),c=new Map(l.map(p=>[p.blockTableRecordId,p.name])),d=Tr(e,n),u=_r(e,l,n),m=[];for(const p of u)m.push(Rr(t,e,p,c,a,i));return{version:X,meta:Nr(o,a,m,d),layers:s,layouts:m,activeLayoutBtrId:d}}function Ur(t,e){const a=[];for(const r of t.layers)De(t,r.name,e)&&a.push({name:r.name,color:r.color,visible:r.visible});return a}function Nr(t,e,a,r){const n=a.find(s=>s.btrId===r)??a[0],i=n?el(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??"en",initialView:o,viewState:o==="current"?e.viewState:void 0,viewerMode:e.viewerMode??"measure",exportLayouts:e.exportLayouts!==!1,docsBaseUrl:e.docsBaseUrl??Lr()}}function cl(t){return(t.viewerMode??"measure")==="measure"}function De(t,e,a){if(a)return!0;const r=t.layers.find(n=>n.name===e);return r?r.visible:!0}function _r(t,e,a){if(!a){const o=t.layouts.find(s=>s.btrId===t.modelSpaceBtrId);return o?[o]:[]}const r=new Map(t.layouts.map(o=>[o.btrId,o])),n=new Set,i=[];for(const o of e){if(n.has(o.blockTableRecordId))continue;n.add(o.blockTableRecordId);const s=r.get(o.blockTableRecordId);i.push(s??{btrId:o.blockTableRecordId,name:o.name,isModelSpace:o.blockTableRecordId===t.modelSpaceBtrId,layers:[]})}for(const o of t.layouts)n.has(o.btrId)||(n.add(o.btrId),i.push(o));return i}function Tr(t,e){return e&&t.activeLayoutBtrId||t.modelSpaceBtrId}function Rr(t,e,a,r,n,i){const o=[],s=[];for(const u of a.layers){if(i&&!i(u.name))continue;const m=uo(u.root);o.push(...m.lineBatches),s.push(...m.meshBatches)}const l=a.isModelSpace||a.btrId===e.modelSpaceBtrId,c=il(t,a.btrId,l,n.canvasAspectRatio);let d;if(cl(n)){const u=performance.now();d=jo(t,a.btrId,{includeLayer:i}),console.log(`[chtml] osnap catalog ${r.get(a.btrId)??a.name??a.btrId}: ${(performance.now()-u).toFixed(0)} ms (${(d==null?void 0:d.primitives.length)??0} primitives)`)}return{btrId:a.btrId,name:r.get(a.btrId)??a.name??dl(t,a.btrId),isModelSpace:l,lineBatches:o,meshBatches:s,osnap:d,viewports:al(t,a.btrId,l),...c?{savedView:c}:{}}}function dl(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}const ul=400,Ue=10,Ne=1,Or=64;function Nt(t){return Math.floor(t)*1024*1024}function Hr(t){return Math.max(Ne,Math.round(t/(1024*1024)))}function $r(t){return Number.isFinite(t)?Math.min(Or,Math.max(Ne,Math.floor(t))):Ue}function G(t={}){var e;const a=t.exportFormat==="multi"?"multi":"single",r=a==="multi"?Nt($r(t.maxChunkBytes!=null?Hr(t.maxChunkBytes):Ue)):dr;return{exportFormat:a,exportInvisibleLayers:t.exportInvisibleLayers!==!1,exportLayouts:t.exportLayouts!==!1,background:Sr(t.background),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 ml(t){const e=t.maxChunkBytes??Nt(Ue),a=t.compressChunks!==!1;return{maxChunkBytes:e,maxBatchBytes:e,maxOsnapChunkBytes:e,compressChunks:a}}function pl(t){const e=t.activeLayoutView,a=e.center,r=e.trCamera.zoom,n=Math.max(e.height,1),i=r*(2*ul)/n;return{centerX:a.x,centerY:a.y,zoom:i}}const hl="./viewer-runtime.iife.js";let At={};function fl(t){At={...At,...t}}function gl(){return{...At}}function bl(t){return t!=null?String(t):At.viewerRuntimeUrl!=null?String(At.viewerRuntimeUrl):hl}class wl{build(e,a,r={}){return ol(a,La(e),Ea(r))}async buildAsync(e,a,r={}){return sl(a,La(e),{...Ea(r),yieldBetweenLayouts:()=>j()})}}function Ea(t){return{title:t.title,background:t.background,locale:t.locale??x.currentLocale,exportInvisibleLayers:t.exportInvisibleLayers,exportLayouts:t.exportLayouts,initialView:t.initialView,viewState:t.viewState,viewerMode:t.viewerMode,canvasAspectRatio:t.canvasAspectRatio,docsBaseUrl:xl()}}function xl(){try{Ks(Vn())}catch{}return Lr()}function La(t){const e=[...t.layers.values()].map(r=>({name:r.name,color:r.color.RGB??16777215,visible:!r.isOff&&!r.isFrozen})),a=[...t.layouts.entries()].map(([r,n])=>({btrId:r,isModelSpace:r===t.modelSpaceBtrId,layers:[...n.layers.values()].map(i=>({name:i.name,root:i.internalObject}))}));return{layers:e,layouts:a,activeLayoutBtrId:t.activeLayoutBtrId||t.modelSpaceBtrId,modelSpaceBtrId:t.modelSpaceBtrId}}function J(t,e){console.log(`[chtml] ${t}: ${e.toFixed(0)} ms`)}class yl{constructor(e={}){this.options=e,this._snapshotBuilder=new wl}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 $n))throw new Error("HTML export requires a 2D CAD view. Open a drawing before exporting.");const r=G(a),n={includeInvisibleLayers:r.exportInvisibleLayers,includeLayouts:r.exportLayouts};return await e.ensureEntitiesConvertedForExport(n),await j(),e}async convert(e,a={},r){const n=Z.instance,i=G(a),o=performance.now();await n.withBusyIndicator(async()=>{await j();const s=n.curDocument;let l=performance.now();const c=await this.prepareAcTrView2dForHtmlExport(r??n.curView,i);J("prepare (missing entities)",performance.now()-l);const d=e||s.fileName||s.docTitle,u=jn(d);l=performance.now();const m=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)?pl(c):void 0,canvasAspectRatio:c.width/Math.max(c.height,1)});Ws(m,c.backgroundColor,i.background),J("snapshot build",performance.now()-l),await j(),l=performance.now();const p=await this.loadViewerRuntime();if(J("load viewer runtime",performance.now()-l),await j(),i.exportFormat==="multi"){l=performance.now();const g=ml(i),w=await Ps(m,{viewerRuntime:p,...g});J(g.compressChunks?"package + gzip chunks":"package chunks",performance.now()-l),l=performance.now();const b=Vs(w);J("zip package",performance.now()-l),await j(),this.downloadBytes(b,Ve(d,"zip"),"application/zip"),J("chtml total",performance.now()-o);return}const h=ps(i.expiryDays,Date.now(),i.expiresAt);l=performance.now();const f=await this.packSelfContainedHtml(m,p,{expiresAt:h,password:i.password||void 0});J("pack self-contained html",performance.now()-l),await j(),this.downloadHtml(f,Ve(d,"html")),J("chtml total",performance.now()-o)})}async packSnapshot(e,a){await Z.instance.withBusyIndicator(async()=>{await j();const r=await this.loadViewerRuntime();await j();const n=await this.packSelfContainedHtml(e,r,{expiresAt:null});await j(),this.downloadHtml(n,a)})}async packSelfContainedHtml(e,a,r){if(_s(e))return Ts(e,{title:e.meta.title,viewerRuntime:a,expiresAt:r.expiresAt,password:r.password});const n=await gs(Ja(e),{expiresAt:r.expiresAt,password:r.password});return ss(e,{title:e.meta.title,viewerRuntime:a,encoded:n.encoded,accessManifest:n.manifest})}async loadViewerRuntime(){const e=bl(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 vl extends On{constructor(e={}){super(),this.pluginOptions=e}async execute(e){const a=await this.promptOptions();a&&await new yl(this.pluginOptions).convert(e.doc.fileName||e.doc.docTitle,a,e.view)}async promptOptions(){const e=G(),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.promptBackground();if(i===void 0)return;const o=await this.promptInitialView();if(o===void 0)return;const s=await this.promptViewerMode();if(s===void 0)return;let l,c;if(!(a==="multi"&&(l=await this.promptChunkSizeMiB(),l===void 0||(c=await this.promptYesNo("jig.chtml.compressChunks",e.compressChunks),c===void 0))))return G({exportFormat:a,exportInvisibleLayers:r,exportLayouts:n,background:i,initialView:o,viewerMode:s,...a==="multi"?{maxChunkBytes:l,compressChunks:c}:{}})}async promptExportFormat(){const e=G(),a=new pt(x.t("jig.chtml.exportFormat"));a.allowNone=!0;const r=a.keywords.add(x.t("jig.chtml.keywords.single.display"),x.t("jig.chtml.keywords.single.global"),x.t("jig.chtml.keywords.single.local")),n=a.keywords.add(x.t("jig.chtml.keywords.multi.display"),x.t("jig.chtml.keywords.multi.global"),x.t("jig.chtml.keywords.multi.local"));a.keywords.default=e.exportFormat==="multi"?n:r;const i=await Z.instance.editor.getKeywords(a);if(i.status!==B.Cancel){if(i.status===B.None)return e.exportFormat;if(i.status===B.OK||i.status===B.Keyword)return i.stringResult?i.stringResult==="Multi"?"multi":"single":e.exportFormat}}async promptYesNo(e,a){const r=new pt(x.t(e));r.allowNone=!0;const n=r.keywords.add(x.t("jig.chtml.keywords.yes.display"),x.t("jig.chtml.keywords.yes.global"),x.t("jig.chtml.keywords.yes.local")),i=r.keywords.add(x.t("jig.chtml.keywords.no.display"),x.t("jig.chtml.keywords.no.global"),x.t("jig.chtml.keywords.no.local"));r.keywords.default=a?n:i;const o=await Z.instance.editor.getKeywords(r);if(o.status!==B.Cancel){if(o.status===B.None)return a;if(o.status===B.OK||o.status===B.Keyword)return o.stringResult?o.stringResult==="Yes":a}}async promptChunkSizeMiB(){const e=G({exportFormat:"multi"}),a=Hr(e.maxChunkBytes),r=new Hn(x.t("jig.chtml.chunkSizeMiB"),Ne,Or);r.allowNone=!0,r.allowZero=!1,r.allowNegative=!1,r.useDefaultValue=!0,r.defaultValue=a;const n=await Z.instance.editor.getInteger(r);if(n.status!==B.Cancel){if(n.status===B.None)return Nt(a);if(n.status===B.OK){const i=$r(n.value??a);return Nt(i)}}}async promptBackground(){const e=G(),a=new pt(x.t("jig.chtml.background"));a.allowNone=!0;const r=a.keywords.add(x.t("jig.chtml.keywords.black.display"),x.t("jig.chtml.keywords.black.global"),x.t("jig.chtml.keywords.black.local")),n=a.keywords.add(x.t("jig.chtml.keywords.white.display"),x.t("jig.chtml.keywords.white.global"),x.t("jig.chtml.keywords.white.local")),i=a.keywords.add(x.t("jig.chtml.keywords.space.display"),x.t("jig.chtml.keywords.space.global"),x.t("jig.chtml.keywords.space.local"));a.keywords.default=e.background==="white"?n:e.background==="space"?i:r;const o=await Z.instance.editor.getKeywords(a);if(o.status!==B.Cancel){if(o.status===B.None)return e.background;if(o.status===B.OK||o.status===B.Keyword)return o.stringResult?o.stringResult==="White"?"white":o.stringResult==="Space"?"space":"black":e.background}}async promptInitialView(){const e=G(),a=new pt(x.t("jig.chtml.initialView"));a.allowNone=!0;const r=a.keywords.add(x.t("jig.chtml.keywords.extents.display"),x.t("jig.chtml.keywords.extents.global"),x.t("jig.chtml.keywords.extents.local")),n=a.keywords.add(x.t("jig.chtml.keywords.current.display"),x.t("jig.chtml.keywords.current.global"),x.t("jig.chtml.keywords.current.local"));a.keywords.default=e.initialView==="current"?n:r;const i=await Z.instance.editor.getKeywords(a);if(i.status!==B.Cancel){if(i.status===B.None)return e.initialView;if(i.status===B.OK||i.status===B.Keyword)return i.stringResult?i.stringResult==="Current"?"current":"fit":e.initialView}}async promptViewerMode(){const e=G(),a=new pt(x.t("jig.chtml.viewerMode"));a.allowNone=!0;const r=a.keywords.add(x.t("jig.chtml.keywords.view.display"),x.t("jig.chtml.keywords.view.global"),x.t("jig.chtml.keywords.view.local")),n=a.keywords.add(x.t("jig.chtml.keywords.measure.display"),x.t("jig.chtml.keywords.measure.global"),x.t("jig.chtml.keywords.measure.local"));a.keywords.default=e.viewerMode==="view"?r:n;const i=await Z.instance.editor.getKeywords(a);if(i.status!==B.Cancel){if(i.status===B.None)return e.viewerMode;if(i.status===B.OK||i.status===B.Keyword)return i.stringResult?i.stringResult==="View"?"view":"measure":e.viewerMode}}}const kl="1.7.8-preview.3",Al={version:kl};class Ml{constructor(e={}){this.options=e,this.name="HtmlPlugin",this.version=Al.version,this.description="HTML export (-chtml) command",this.registeredCommands=[]}onLoad(e,a){const r=Rn.SYSTEMT_COMMAND_GROUP_NAME,n=new vl(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 Bl(t={}){return t.viewerRuntimeUrl!=null&&fl(t),new Ml(gl())}export{Yo as ACEC_CHUNK_MAGIC,fi as ACEO_OSNAP_MAGIC,gi as ACEO_OSNAP_VERSION,dr as ACEX_DEFAULT_CHUNK_MAX_BYTES,Ue as ACEX_DEFAULT_CHUNK_SIZE_MIB,Ir as ACEX_DEFAULT_DOCS_BASE_URL,Ht as ACEX_DEFAULT_MANIFEST_FILE,Zo as ACEX_DEFAULT_MANIFEST_HREF,Us as ACEX_EMBEDDED_CHUNK_ENCRYPTED_MIME,Mr as ACEX_EMBEDDED_CHUNK_HREF_ATTR,ka as ACEX_EMBEDDED_CHUNK_MAX_BYTES,Ds as ACEX_EMBEDDED_CHUNK_MIME,Ko as ACEX_EMBEDDED_CHUNK_THRESHOLD_BYTES,Jo as ACEX_EMBEDDED_OSNAP_CHUNK_MAX_BYTES,$t as ACEX_HTML_BACKGROUND_BLACK,ze as ACEX_HTML_BACKGROUND_WHITE,Xo as ACEX_HTML_LOCALES,Fe as ACEX_HTML_SHELL_CSS,Or as ACEX_MAX_CHUNK_SIZE_MIB,Ot as ACEX_MAX_GEOMETRY_BATCH_BYTES,Ne as ACEX_MIN_CHUNK_SIZE_MIB,Wo as ACEX_PACKAGE_VERSION,es as ACEX_POLAR_ANGLE_INCREMENTS,Xa as ACEX_SNAPSHOT_COMPRESSION,X as ACEX_SNAPSHOT_VERSION,vl as AcApExportHtmlCmd,yl as AcApHtmlConvertor,wl as AcApHtmlSnapshotBuilder,ge as AcExBinaryWriter,de as AcExHtmlIcons,hl as DEFAULT_HTML_VIEWER_RUNTIME_URL,Qe as F_LINE_DISTANCES,pi as F_LINE_EXCLUDE_OSNAP,Ze as F_LINE_INDICES,qe as F_LINE_PATTERN,ea as F_LINE_RENDER_ORDER,ta as F_LINE_WIDTH,na as F_MESH_GRADIENT_FILL,ia as F_MESH_GRADIENT_POS,ra as F_MESH_HATCH,aa as F_MESH_INDICES,hi as F_MESH_POINTS,sa as F_MESH_RENDER_ORDER,oa as F_MESH_SIDE,la as F_MESH_TEXTURE,Il as HTML_PLUGIN_NAME,El as HTML_PLUGIN_TRIGGERS,ns as ML_UI_COMPACT_MAX_WIDTH,rs as ML_UI_MOBILE_MAX_WIDTH,Xs as acExHtmlBackgroundRgb,ci as acExHtmlBase85ToBytes,fs as acExHtmlBytesToBase64,li as acExHtmlBytesToBase85,Tt as acExHtmlBytesToText,Ma as acExHtmlLayoutBackground,si as acExHtmlTextToBytes,Hr as acexChunkSizeBytesToMiB,Nt as acexChunkSizeMiBToBytes,Lr as acexGetDocsBaseUrl,Ks as acexSetDocsBaseUrl,Ws as applyAcExHtmlBackground,ye as bakePlainDrawableSlice,Ut as buildAcExHtmlAccessManifest,as as buildAcExHtmlPolarAnglesPanel,Ie as buildAcExHtmlShellBody,Ps as buildAcExPackageAsync,Ar as buildAcExPackageDataAsync,jo as buildOsnapCatalog,ol as buildSnapshotFromExportScene,sl as buildSnapshotFromExportSceneAsync,ar as buildViewerMetadata,pl as captureAcApHtmlViewState,il as captureAcExSavedViewExtents,$r as clampAcApHtmlChunkSizeMiB,uo as collectBatchesFromObject3D,al as collectLayoutViewports,Za as compactIndexedSlice,ae as compressSnapshotBinary,Ya as compressSnapshotBinaryAsync,Qs as computeLayoutExtents,el as computeLayoutViewExtents,Ae as computeLineDistancesForSegments,tl as computeViewportPaperExtents,fl as configureHtmlPlugin,et as copyFloat32Range,Di as copyUint32Range,fr as createAcExHtmlAccessKey,Js as createEmptyExtents,Bl as createHtmlPlugin,cr as encodeChunkBinary,xe as encodeOsnapCatalogBinary,Ja as encodeSnapshot,Fi as encodeSnapshotBinary,_i as encodeTextureForExport,Le as encryptAcExHtmlBytes,hs as encryptAcExHtmlSnapshotPayload,Ns as estimateAcExSnapshotGeometryBytes,be as estimateLineBatchBytes,we as estimateMeshBatchBytes,Ka as estimateOsnapPrimitiveBytes,Ba as expandExtentsFromBatch,Zs as expandExtentsFromPositions,Ki as exportActiveBatchedLine2Slice,Me as exportActiveBatchedSlice,Et as exportBufferGeometrySlice,Ni as exportPlainDrawableSlice,$i as exportUvsForPositionSlice,Gi as exportVertexAttributeSlice,Xi as extractGradientFill,Vi as extractHatchPattern,ji as extractLinePattern,gl as getHtmlPluginOptions,qa as isTransparentImagePlaceholder,Dr as listDatabaseLayouts,hr as needsAcExHtmlAccessControl,Pr as normalizeAcExDocsBaseUrl,ct as omitNonFinitePrimitives,ss as packHtml,Ts as packHtmlEmbeddedPackage,ls as packHtmlPackage,gs as protectAcExHtmlEncodedSnapshot,Ui as readBatchWorldOffset,Wi as rebaseHatchPatternToLocalOffset,ve as rebasePlainDrawableSliceAroundCentroid,Gs as remapAcExSnapshotForegroundForBackground,ps as resolveAcApHtmlExpiresAt,G as resolveAcApHtmlExportOptions,ml as resolveAcApHtmlPackageBuildOptions,Sr as resolveAcExHtmlBackground,Be as resolveAcExHtmlLocale,bl as resolveViewerRuntimeUrl,_s as shouldEmbedAcExChunks,zi as snapshotMimeType,Fs as splitLayoutIntoSlices,xs as splitLineBatch,ys as splitMeshBatch,Mi as splitOsnapPrimitives,qs as toExtents,ca as toWcsCoord,ua as transformHatchPatternToWorldSpace,zr as unionExtents,wa as wcsPointToOcsArcAngle,Ga as writeLineBatch,Wa as writeMeshBatch,Vs as zipAcExPackageFiles};