@mlightcad/cad-simple-viewer-cli 1.7.3 → 1.7.5

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.
Files changed (31) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +159 -159
  3. package/dist/runHeadless.js +237 -134
  4. package/dist/runHeadless.js.map +1 -1
  5. package/dist-runner/assets/cad-html-plugin-DQwlPjG4.js +1564 -0
  6. package/dist-runner/assets/cad-pdf-plugin-Ch3nwhN6.js +212 -0
  7. package/dist-runner/assets/cad-svg-plugin-C84nxL1t.js +16 -0
  8. package/dist-runner/assets/index-DXwRjL3l.js +7339 -0
  9. package/dist-runner/index.html +12 -12
  10. package/dist-runner/viewer-runtime.iife.js +213 -213
  11. package/dist-runner/workers/libredwg-parser-worker.js +1 -1
  12. package/dist-runner/workers/mtext-renderer-worker.js +2191 -2124
  13. package/examples/batch-export-html-multi-preview.mjs +306 -236
  14. package/examples/batch-export-html.mjs +105 -105
  15. package/examples/batch-export-png.mjs +103 -103
  16. package/examples/create-drawing-dxf.scr +15 -15
  17. package/examples/create-drawing-png.scr +19 -19
  18. package/examples/create-shapes-dxf.scr +17 -17
  19. package/examples/export-dxf.scr +5 -5
  20. package/examples/export-html-multi-preview.scr +18 -18
  21. package/examples/export-html-multi.scr +13 -13
  22. package/examples/export-html.scr +12 -12
  23. package/examples/export-pdf.scr +9 -9
  24. package/examples/export-png.scr +9 -9
  25. package/examples/freeze-layer-png.scr +15 -15
  26. package/examples/index.json +114 -114
  27. package/package.json +9 -9
  28. package/dist-runner/assets/cad-html-plugin-DeHxlaul.js +0 -1547
  29. package/dist-runner/assets/cad-pdf-plugin-2fqpe-xS.js +0 -212
  30. package/dist-runner/assets/cad-svg-plugin-BWNwucA7.js +0 -16
  31. package/dist-runner/assets/index-B3SgHAxA.js +0 -7313
@@ -0,0 +1,1564 @@
1
+ import{W as or,G as sr,L as wt,h as k,v as it,C as L,D as lr,a as $,Z as cr,Y as ke,E as dr,F as Ut,H as ur,I as mr,J as Ae,K as pr,N as ze,O as hr,P as fr,Q as C,R as gr,V as br,S as wr,g as xr,U as vr,X as yr,_ as ua,$ as kr,a0 as Ar,a1 as zr,a2 as Mr,a3 as Cr,a4 as Pr,a5 as Sr,a6 as Fr,a7 as Zt,a8 as Ir,a9 as Br,aa as Lr,ab as Er,ac as Ur,ad as Dr,ae as Nr,af as Tr,ag as Or,ah as Rr,ai as _r,aj as $r,ak as jr,al as Hr,am as Vr,an as Yr,ao as Xr,ap as Gr,aq as Wr,ar as Kr,as as Jr,at as ot,au as ma,av as Zr,aw as qt,o as qr,ax as Qr,ay as tn,az as en}from"./index-DXwRjL3l.js";import{aA as Ps,aB as Ss}from"./index-DXwRjL3l.js";function Qt(...t){return`<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 1024 1024">${t.map(a=>`<path fill="currentColor" d="${a}"/>`).join("")}</svg>`}Qt("M624 475.968V640h144a128 128 0 0 1 128 128H128a128 128 0 0 1 128-128h144V475.968a192 192 0 1 1 224 0M128 896v-64h768v64z");Qt("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");Qt("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 an='<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>',rn='<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>',nn='<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>',Y=4;var E=Uint8Array,T=Uint16Array,te=Int32Array,ee=new E([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]),ae=new E([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]),Me=new E([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),pa=function(t,e){for(var a=new T(31),r=0;r<31;++r)a[r]=e+=1<<t[r-1];for(var n=new te(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}},ha=pa(ee,2),on=ha.b,$t=ha.r;on[28]=258,$t[258]=28;var sn=pa(ae,0),Ce=sn.r,jt=new T(32768);for(var z=0;z<32768;++z){var W=(z&43690)>>1|(z&21845)<<1;W=(W&52428)>>2|(W&13107)<<2,W=(W&61680)>>4|(W&3855)<<4,jt[z]=((W&65280)>>8|(W&255)<<8)>>1}var ut=(function(t,e,a){for(var r=t.length,n=0,i=new T(e);n<r;++n)t[n]&&++i[t[n]-1];var o=new T(e);for(n=1;n<e;++n)o[n]=o[n-1]+i[n-1]<<1;var l;if(a){l=new T(1<<e);var s=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)l[jt[u]>>s]=c}else for(l=new T(r),n=0;n<r;++n)t[n]&&(l[n]=jt[o[t[n]-1]++]>>15-t[n]);return l}),q=new E(288);for(var z=0;z<144;++z)q[z]=8;for(var z=144;z<256;++z)q[z]=9;for(var z=256;z<280;++z)q[z]=7;for(var z=280;z<288;++z)q[z]=8;var vt=new E(32);for(var z=0;z<32;++z)vt[z]=5;var ln=ut(q,9,0),cn=ut(vt,5,0),fa=function(t){return(t+7)/8|0},ga=function(t,e,a){return(a==null||a>t.length)&&(a=t.length),new E(t.subarray(e,a))},dn=["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"],Ct=function(t,e,a){var r=new Error(e||dn[t]);if(r.code=t,Error.captureStackTrace&&Error.captureStackTrace(r,Ct),!a)throw r;return r},X=function(t,e,a){a<<=e&7;var r=e/8|0;t[r]|=a,t[r+1]|=a>>8},lt=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},Dt=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:wa,l:0};if(n==1){var o=new E(a[0].s+1);return o[a[0].s]=1,{t:o,l:1}}a.sort(function(S,U){return S.f-U.f}),a.push({s:-1,f:25001});var l=a[0],s=a[1],c=0,d=1,u=2;for(a[0]={s:-1,f:l.f+s.f,l,r:s};d!=n-1;)l=a[a[c].f<a[u].f?c++:u++],s=a[c!=d&&a[c].f<a[u].f?c++:u++],a[d++]={s:-1,f:l.f+s.f,l,r:s};for(var m=i[0].s,r=1;r<n;++r)i[r].s>m&&(m=i[r].s);var p=new T(m+1),b=Ht(a[d-1],p,0);if(b>e){var r=0,g=0,w=b-e,h=1<<w;for(i.sort(function(U,F){return p[F.s]-p[U.s]||U.f-F.f});r<n;++r){var f=i[r].s;if(p[f]>e)g+=h-(1<<b-p[f]),p[f]=e;else break}for(g>>=w;g>0;){var A=i[r].s;p[A]<e?g-=1<<e-p[A]++-1:++r}for(;r>=0&&g;--r){var v=i[r].s;p[v]==e&&(--p[v],++g)}b=e}return{t:new E(p),l:b}},Ht=function(t,e,a){return t.s==-1?Math.max(Ht(t.l,e,a+1),Ht(t.r,e,a+1)):e[t.s]=a},Pe=function(t){for(var e=t.length;e&&!t[--e];);for(var a=new T(++e),r=0,n=t[0],i=1,o=function(s){a[r++]=s},l=1;l<=e;++l)if(t[l]==n&&l!=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[l]}return{c:a.subarray(0,r),n:e}},ct=function(t,e){for(var a=0,r=0;r<e.length;++r)a+=t[r]*e[r];return a},ba=function(t,e,a){var r=a.length,n=fa(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},Se=function(t,e,a,r,n,i,o,l,s,c,d){X(e,d++,a),++n[256];for(var u=Dt(n,15),m=u.t,p=u.l,b=Dt(i,15),g=b.t,w=b.l,h=Pe(m),f=h.c,A=h.n,v=Pe(g),S=v.c,U=v.n,F=new T(19),y=0;y<f.length;++y)++F[f[y]&31];for(var y=0;y<S.length;++y)++F[S[y]&31];for(var x=Dt(F,7),D=x.t,tt=x.l,N=19;N>4&&!D[Me[N-1]];--N);var et=c+5<<3,O=ct(n,q)+ct(i,vt)+o,R=ct(n,m)+ct(i,g)+o+14+3*N+ct(F,D)+2*F[16]+3*F[17]+7*F[18];if(s>=0&&et<=O&&et<=R)return ba(e,d,t.subarray(s,s+c));var j,I,_,G;if(X(e,d,1+(R<O)),d+=2,R<O){j=ut(m,p,0),I=m,_=ut(g,w,0),G=g;var It=ut(D,tt,0);X(e,d,A-257),X(e,d+5,U-1),X(e,d+10,N-4),d+=14;for(var y=0;y<N;++y)X(e,d+3*y,D[Me[y]]);d+=3*N;for(var H=[f,S],st=0;st<2;++st)for(var at=H[st],y=0;y<at.length;++y){var V=at[y]&31;X(e,d,It[V]),d+=D[V],V>15&&(X(e,d,at[y]>>5&127),d+=at[y]>>12)}}else j=ln,I=q,_=cn,G=vt;for(var y=0;y<l;++y){var B=r[y];if(B>255){var V=B>>18&31;lt(e,d,j[V+257]),d+=I[V+257],V>7&&(X(e,d,B>>23&31),d+=ee[V]);var rt=B&31;lt(e,d,_[rt]),d+=G[rt],rt>3&&(lt(e,d,B>>5&8191),d+=ae[rt])}else lt(e,d,j[B]),d+=I[B]}return lt(e,d,j[256]),d+I[256]},un=new te([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),wa=new E(0),mn=function(t,e,a,r,n,i){var o=i.z||t.length,l=new E(r+o+5*(1+Math.ceil(o/7e3))+n),s=l.subarray(r,l.length-n),c=i.l,d=(i.r||0)&7;if(e){d&&(s[0]=i.r>>3);for(var u=un[e-1],m=u>>13,p=u&8191,b=(1<<a)-1,g=i.p||new T(32768),w=i.h||new T(b+1),h=Math.ceil(a/3),f=2*h,A=function(Et){return(t[Et]^t[Et+1]<<h^t[Et+2]<<f)&b},v=new te(25e3),S=new T(288),U=new T(32),F=0,y=0,x=i.i||0,D=0,tt=i.w||0,N=0;x+2<o;++x){var et=A(x),O=x&32767,R=w[et];if(g[O]=R,w[et]=O,tt<=x){var j=o-x;if((F>7e3||D>24576)&&(j>423||!c)){d=Se(t,s,0,v,S,U,y,D,N,x-N,d),D=F=y=0,N=x;for(var I=0;I<286;++I)S[I]=0;for(var I=0;I<30;++I)U[I]=0}var _=2,G=0,It=p,H=O-R&32767;if(j>2&&et==A(x-H))for(var st=Math.min(m,j)-1,at=Math.min(32767,x),V=Math.min(258,j);H<=at&&--It&&O!=R;){if(t[x+_]==t[x+_-H]){for(var B=0;B<V&&t[x+B]==t[x+B-H];++B);if(B>_){if(_=B,G=H,B>st)break;for(var rt=Math.min(H,B-2),we=0,I=0;I<rt;++I){var Bt=x-H+I&32767,ir=g[Bt],xe=Bt-ir&32767;xe>we&&(we=xe,R=Bt)}}}O=R,R=g[O],H+=O-R&32767}if(G){v[D++]=268435456|$t[_]<<18|Ce[G];var ve=$t[_]&31,ye=Ce[G]&31;y+=ee[ve]+ae[ye],++S[257+ve],++U[ye],tt=x+_,++F}else v[D++]=t[x],++S[t[x]]}}for(x=Math.max(x,tt);x<o;++x)v[D++]=t[x],++S[t[x]];d=Se(t,s,c,v,S,U,y,D,N,x-N,d),c||(i.r=d&7|s[d/8|0]<<3,d-=7,i.h=w,i.p=g,i.i=x,i.w=tt)}else{for(var x=i.w||0;x<o+c;x+=65535){var Lt=x+65535;Lt>=o&&(s[d/8|0]=c,Lt=o),d=ba(s,d+1,t.subarray(x,Lt))}i.i=o}return ga(l,0,r+fa(d)+n)},pn=(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})(),xa=function(){var t=-1;return{p:function(e){for(var a=t,r=0;r<e.length;++r)a=pn[a&255^e[r]]^a>>>8;t=a},d:function(){return~t}}},va=function(t,e,a,r,n){if(!n&&(n={l:1},e.dictionary)){var i=e.dictionary.subarray(-32768),o=new E(i.length+t.length);o.set(i),o.set(t,i.length),t=o,n.w=i.length}return mn(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)},ya=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},M=function(t,e,a){for(;a;++e)t[e]=a,a>>>=8},hn=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&&M(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)}},fn=function(t){return 10+(t.filename?t.filename.length+1:0)};function gn(t,e){return va(t,e||{},0,0)}function bn(t,e){e||(e={});var a=xa(),r=t.length;a.p(t);var n=va(t,e,fn(e),8),i=n.length;return hn(n,e),M(n,i-8,a.d()),M(n,i-4,r),n}var ka=function(t,e,a,r){for(var n in t){var i=t[n],o=e+n,l=r;Array.isArray(i)&&(l=ya(r,i[1]),i=i[0]),i instanceof E?a[o]=[i,l]:(a[o+="/"]=[new E(0),l],ka(i,o,a,r))}},Fe=typeof TextEncoder<"u"&&new TextEncoder,wn=typeof TextDecoder<"u"&&new TextDecoder,xn=0;try{wn.decode(wa,{stream:!0}),xn=1}catch{}function pt(t,e){var a;if(Fe)return Fe.encode(t);for(var r=t.length,n=new E(t.length+(t.length>>1)),i=0,o=function(d){n[i++]=d},a=0;a<r;++a){if(i+5>n.length){var l=new E(i+8+(r-a<<1));l.set(n),n=l}var s=t.charCodeAt(a);s<128||e?o(s):s<2048?(o(192|s>>6),o(128|s&63)):s>55295&&s<57344?(s=65536+(s&1047552)|t.charCodeAt(++a)&1023,o(240|s>>18),o(128|s>>12&63),o(128|s>>6&63),o(128|s&63)):(o(224|s>>12),o(128|s>>6&63),o(128|s&63))}return ga(n,0,i)}var Vt=function(t){var e=0;if(t)for(var a in t){var r=t[a].length;r>65535&&Ct(9),e+=r+4}return e},Ie=function(t,e,a,r,n,i,o,l){var s=r.length,c=a.extra,d=l&&l.length,u=Vt(c);M(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)&&Ct(10),M(t,e,p<<25|m.getMonth()+1<<21|m.getDate()<<16|m.getHours()<<11|m.getMinutes()<<5|m.getSeconds()>>1),e+=4,i!=-1&&(M(t,e,a.crc),M(t,e+4,i<0?-i-2:i),M(t,e+8,a.size)),M(t,e+12,s),M(t,e+14,u),e+=16,o!=null&&(M(t,e,d),M(t,e+6,a.attrs),M(t,e+10,o),e+=14),t.set(r,e),e+=s,u)for(var b in c){var g=c[b],w=g.length;M(t,e,+b),M(t,e+2,w),t.set(g,e+4),e+=4+w}return d&&(t.set(l,e),e+=d),e},vn=function(t,e,a,r,n){M(t,e,101010256),M(t,e+8,a),M(t,e+10,a),M(t,e+12,r),M(t,e+16,n)};function yn(t,e){e||(e={});var a={},r=[];ka(t,"",a,e);var n=0,i=0;for(var o in a){var l=a[o],s=l[0],c=l[1],d=c.level==0?0:8,u=pt(o),m=u.length,p=c.comment,b=p&&pt(p),g=b&&b.length,w=Vt(c.extra);m>65535&&Ct(11);var h=d?gn(s,c):s,f=h.length,A=xa();A.p(s),r.push(ya(c,{size:s.length,crc:A.d(),c:h,f:u,m:b,u:m!=o.length||b&&p.length!=g,o:n,compression:d})),n+=30+m+w+f,i+=76+2*(m+w)+(g||0)+f}for(var v=new E(i+22),S=n,U=i-n,F=0;F<r.length;++F){var u=r[F];Ie(v,u.o,u,u.f,u.u,u.c.length);var y=30+u.f.length+Vt(u.extra);v.set(u.c,u.o+y),Ie(v,n,u,u.f,u.u,u.c.length,u.o,u.m),n+=16+y+(u.m?u.m.length:0)}return vn(v,n,r.length,U,S),v}const Aa="gzip";function Yt(t){return{bytes:bn(t),compression:Aa}}async function za(t){if(typeof CompressionStream>"u")return Yt(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:Aa}}catch{return Yt(t)}}const Be=1,Le=2,Ee=4,Ue=8,De=16,kn=32,Ne=1,Te=2,Oe=4,Re=8,_e=16,An=32,$e=64,je=128;function re(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 ne(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 Ma(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|=Be),e.linePattern&&(a|=Le),e.lineDistances&&e.lineDistances.length>0&&(a|=Ee),e.lineWidth!=null&&e.lineWidth>0&&(a|=Ue),e.renderOrder!=null&&e.renderOrder!==0&&(a|=De),e.excludeFromOsnap&&(a|=kn),t.writeU8(a),a&Be&&t.writeUint32Array(e.indices),a&Le&&t.writeJson(e.linePattern),a&Ee&&t.writeFloat32Array(e.lineDistances),a&Ue&&t.writeF32(e.lineWidth),a&De&&t.writeI32(e.renderOrder)}function Ca(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|=Ne),e.hatchPattern&&(a|=Te),e.gradientFill&&(a|=Oe),e.gradientPositions&&e.gradientPositions.length>0&&(a|=Re),e.side!=null&&(a|=_e),e.points&&(a|=An),e.renderOrder!=null&&e.renderOrder!==0&&(a|=$e),e.texture&&e.texture.bytes.length>0&&e.uvs&&e.uvs.length>=2&&(a|=je),t.writeU8(a),a&Ne&&t.writeUint32Array(e.indices),a&Te&&t.writeJson(e.hatchPattern),a&Oe&&t.writeJson(e.gradientFill),a&Re&&t.writeFloat32Array(e.gradientPositions),a&_e&&t.writeU8(e.side),a&$e&&t.writeI32(e.renderOrder),a&je&&(t.writeFloat32Array(e.uvs),t.writeString(e.texture.mimeType||"image/png"),t.writeU32(e.texture.bytes.byteLength),t.writeBytes(e.texture.bytes))}class ie{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=pt(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 zn=1329939265,Mn=1,Cn=1,Pn=2,Sn=3,Fn=4,In=5,Bn=6,Ln=7;function Pa(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 En(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 l=Pa(o);r.length>0&&n+l>e&&i(),r.push(o),n+=l}return i(),a}function Sa(t){const e=new ie;e.writeU32(zn),e.writeU8(Mn),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 l=a.length;return a.push(i),r.set(i,l),l};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)Dn(e,i,n(i.layer));return e.toUint8Array()}async function Un(t){const e=Sa(t),a=(await za(e)).bytes;return{uncompressed:e,compressed:a}}function Nt(t,e){t.writeU8(e<0?0:1)}function dt(t,e){t.writeU32(e.length);for(const a of e)t.writeF64(a)}function Dn(t,e,a){switch(e.kind){case"line":t.writeU8(Cn),t.writeU32(a),t.writeF64(e.x0),t.writeF64(e.y0),t.writeF64(e.x1),t.writeF64(e.y1);return;case"circle":t.writeU8(Pn),t.writeU32(a),t.writeF64(e.cx),t.writeF64(e.cy),t.writeF64(e.r),Nt(t,e.normalSign);return;case"arc":t.writeU8(Sn),t.writeU32(a),t.writeF64(e.cx),t.writeF64(e.cy),t.writeF64(e.r),t.writeF64(e.startAngle),t.writeF64(e.endAngle),Nt(t,e.normalSign);return;case"ellipse":t.writeU8(Fn),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),Nt(t,e.normalSign??1);return;case"spline":t.writeU8(In),t.writeU32(a),dt(t,e.controlPoints),t.writeU32(e.degree),dt(t,e.knots),dt(t,e.weights),t.writeU8(e.closed?1:0),dt(t,e.fitPoints??[]);return;case"point":t.writeU8(Bn),t.writeU32(a),t.writeF64(e.x),t.writeF64(e.y);return;case"path":t.writeU8(Ln),t.writeU32(a),t.writeU8(e.closed?1:0),dt(t,e.vertices);return;default:{const r=e;throw new Error(`Unsupported osnap primitive: ${String(r)}`)}}}const Nn=1480934209;function Tn(t){if(t.version!==Y)throw new Error(`Unsupported snapshot version: ${t.version}`);const e=new ie;e.writeU32(Nn),e.writeU8(Y),e.writeU8(0),e.writeU8(0),e.writeU8(0),e.writeJson(On(t)),e.writeJson(t.layers),e.writeString(t.activeLayoutBtrId),e.writeU32(t.layouts.length);for(const a of t.layouts)Rn(e,a);return e.toUint8Array()}function On(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 Rn(t,e){t.writeString(e.btrId),t.writeString(e.name),t.writeU8(e.isModelSpace?1:0),_n(t,e.osnap),t.writeJson(e.viewports??null),t.writeU32(e.lineBatches.length);for(const a of e.lineBatches)Ma(t,a);t.writeU32(e.meshBatches.length);for(const a of e.meshBatches)Ca(t,a)}function _n(t,e){if(!e||e.primitives.length===0){t.writeU32(0);return}const a=Sa(e);t.writeU32(a.length),t.writeBytes(a)}const $n="application/vnd.mlightcad.acex-snapshot+binary";function Fa(t){if(t.version!==Y)throw new Error(`Unsupported snapshot version: ${t.version}`);const e=Tn(t),a=Yt(e);return{payload:Hn(a.bytes),compression:a.compression}}function jn(){return $n}function Hn(t){let e="";for(let a=0;a<t.length;a++)e+=String.fromCharCode(t[a]);return btoa(e)}function Q(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 Vn(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 Ia(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:Q(t,0,r),indices:e}}function He(t,e){return t+e}const nt={x:0,y:0,z:0};function Yn(t){t.updateMatrixWorld(!0);const e=t.matrixWorld.elements;return nt.x=e[12],nt.y=e[13],nt.z=e[14],[nt.x,nt.y,nt.z]}function Xn(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],l=r[i+1],s=r[i+2];n[i]=a[0]*o+a[4]*l+a[8]*s+a[12],n[i+1]=a[1]*o+a[5]*l+a[9]*s+a[13],n[i+2]=a[2]*o+a[6]*l+a[10]*s+a[14]}return{positions:n,indices:t.indices?new Uint32Array(t.indices):void 0}}function Gn(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,l=-1/0;for(let d=0;d<e.length;d+=3){const u=e[d],m=e[d+1],p=e[d+2];a=Math.min(a,u),r=Math.min(r,m),n=Math.min(n,p),i=Math.max(i,u),o=Math.max(o,m),l=Math.max(l,p)}const s=[(a+i)/2,(r+o)/2,(n+l)/2],c=new Float32Array(e.length);for(let d=0;d<e.length;d+=3)c[d]=e[d]-s[0],c[d+1]=e[d+1]-s[1],c[d+2]=e[d+2]-s[2];return{slice:{positions:c,indices:t.indices?new Uint32Array(t.indices):void 0},offset:s}}function Wn(t,e,a={}){t.updateMatrixWorld(!0);const r=Xn(e,t.matrixWorld);return Gn(r)}function Kn(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(Zn(e)){a.width=e.width,a.height=e.height;const s=Qn(e.data,e.width*e.height),c=new ImageData(new Uint8ClampedArray(s),e.width,e.height);r.putImageData(c,0,0)}else if(Jn(e)){const s=qn(e);if(!s)return;a.width=s.width,a.height=s.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)),l=new Uint8Array(o.length);for(let s=0;s<o.length;s++)l[s]=o.charCodeAt(s);return{mimeType:"image/png",bytes:l}}function Jn(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 Zn(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 qn(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 Qn(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,l=i*4;r[l]=t[o],r[l+1]=t[o+1],r[l+2]=t[o+2],r[l+3]=255}return r}function ti(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 Q(n,0,r)}function ei(t){const e=t;return e.map?!1:e.transparent===!0&&typeof e.opacity=="number"&&e.opacity<.01}function oe(t){const e=t;if(e.isShaderMaterial===!0||t.type==="ShaderMaterial")return e}function ai(t){var e;const a=oe(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 ri(t){var e;const a=oe(t);if(!a)return;const r=a.uniforms.u_patternLines;if(!r)return;const n=r.value;if(!(!Array.isArray(n)||n.length===0))return{patternAngle:Number(((e=a.uniforms.u_patternAngle)==null?void 0:e.value)??0),patternLines:n.map(ii)}}function ni(t){var e,a,r,n,i;const o=oe(t);if(!o||o.uniforms.u_patternLines)return;const l=(e=o.uniforms.u_startColor)==null?void 0:e.value,s=(a=o.uniforms.u_endColor)==null?void 0:a.value,c=o.uniforms.u_gradientType;if(!(!(l!=null&&l.getHex)||c==null))return{startColor:l.getHex(),endColor:((r=s==null?void 0:s.getHex)==null?void 0:r.call(s))??l.getHex(),angle:Number(((n=o.uniforms.u_angle)==null?void 0:n.value)??0),shift:Number(((i=o.uniforms.u_shift)==null?void 0:i.value)??0),gradientType:Number(c.value)}}function ii(t){return{angle:t.angle,base:[t.base.x,t.base.y],offset:[t.offset.x,t.offset.y],dashLengths:[...t.dashLengths],patternLength:t.patternLength}}function Ba(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,l=t[(r+1)*3],s=t[(r+1)*3+1],c=t[(r+1)*3+2]??0,d=l-n,u=s-i,m=c-o;a[r+1]=a[r]+Math.sqrt(d*d+u*u+m*m)}return a}function oi(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 Q(d,0,a.count*r)}const n=t.drawRange,i=a.count,o=Math.max(0,Math.min(Math.floor(n.start),i)),l=Math.max(0,i-o),s=!Number.isFinite(n.count)||n.count<=0?l:Math.min(Math.floor(n.count),l);if(s<=0)return;const c=a.array;return Q(c,o*r,s*r)}function Ve(t,e){const a=Math.atan2(e[1],e[0]),r=(i,o)=>[e[0]*i+e[4]*o+e[12],e[1]*i+e[5]*o+e[13]],n=(i,o)=>[e[0]*i+e[4]*o,e[1]*i+e[5]*o];return{patternAngle:t.patternAngle+a,patternLines:t.patternLines.map(i=>({angle:i.angle+a,base:r(i.base[0],i.base[1]),offset:n(i.offset[0],i.offset[1]),dashLengths:[...i.dashLengths],patternLength:i.patternLength}))}}function si(t,e){return{patternAngle:t.patternAngle,patternLines:t.patternLines.map(a=>{const r=new C.Vector2(a.base[0]-e[0],a.base[1]-e[1]),n=new C.Vector2(a.offset[0],a.offset[1]);return zr(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 Xt(t,e){return!Number.isFinite(t)||t<0?0:Math.min(Math.floor(t),e)}function Gt(t,e,a){const r=Math.max(0,e-a);return!Number.isFinite(t)||t<=0?r:Math.min(Math.floor(t),r)}function Ye(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 s=Q(r,0,e.count*n),c=i.array,d=Xt(a.start,i.count),u=Gt(a.count,i.count,d),m=Vn(c,d,u);return Ia(s,m)}const o=Xt(a.start,e.count),l=Gt(a.count,e.count,o);return{positions:Q(r,o*n,l*n)}}function yt(t){return Wr(t.flags)&&Kr(t.flags)}function La(t){const{count:e}=t.mappingStats;for(let a=0;a<e;a++){let r;try{r=t.getGeometryRangeAt(a)}catch{continue}if(yt(r)&&r.bboxIntersectionCheck)return!0}return!1}function Xe(t){return Ar(t).bboxIntersectionCheck===!0}function se(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=Q(n,0,a.count*r),m=i.array;let p=0;const b=[];for(let h=0;h<o;h++){let f;try{f=t.getGeometryRangeAt(h)}catch{continue}const A=f.indexStart??0,v=f.indexCount??0;!yt(f)||v<=0||(b.push({start:A,count:v}),p+=v)}if(p===0)return{positions:new Float32Array(0)};const g=new Uint32Array(p);let w=0;for(const h of b)for(let f=0;f<h.count;f++)g[w++]=m[h.start+f];return Ia(u,g)}let l=0;const s=[];for(let u=0;u<o;u++){let m;try{m=t.getGeometryRangeAt(u)}catch{continue}if(!yt(m)||m.vertexCount<=0)continue;const p=m.vertexCount*r;s.push({start:m.vertexStart*r,floatCount:p}),l+=p}if(l===0)return{positions:new Float32Array(0)};const c=new Float32Array(l);let d=0;if(n instanceof Float32Array)for(const u of s)c.set(n.subarray(u.start,u.start+u.floatCount),d),d+=u.floatCount;else for(const u of s)for(let m=0;m<u.floatCount;m++)c[d++]=n[u.start+m];return{positions:c}}function kt(t,e,a){t.push(e.getX(a),e.getY(a),e.getZ(a))}function li(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 l;try{l=t.getGeometryRangeAt(o)}catch{continue}if(!yt(l)||l.vertexCount<=0)continue;const s=l.vertexStart,c=s+l.vertexCount;for(let d=s;d<c;d++)kt(i,a,d),kt(i,r,d)}return{positions:new Float32Array(i)}}function ci(t,e){const a=t.instanceCount;if(Number.isFinite(a)&&a>=0)return Math.min(Math.floor(a),e);const r=t.drawRange,n=Xt(r.start,e);return Gt(r.count,e,n)}function di(t){const e=t.getAttribute("instanceStart"),a=t.getAttribute("instanceEnd");if(!e||!a||e.count===0)return{positions:new Float32Array(0)};const r=ci(t,e.count);if(r<=0)return{positions:new Float32Array(0)};const n=[];for(let i=0;i<r;i++)kt(n,e,i),kt(n,a,i);return{positions:new Float32Array(n)}}function Tt(t){return yr(t)}function Ea(t){if(t instanceof kr)return t.linewidth}function Ot(t){if("material"in t){const e=t.userData.originalMaterial??t.material;return Array.isArray(e)?e[0]:e}return t.material}function ht(t){var e;const a=ua(t),r=a.layer??"0",n=t;let i=n.color!=null?n.color.getHex():a.color??16777215;const o=ai(t),l=ri(t),s=ni(t);if(t instanceof C.ShaderMaterial||t.type==="ShaderMaterial"){const c=(e=t.uniforms.u_color)==null?void 0:e.value;c!=null&&c.getHex?i=c.getHex():s&&(i=s.startColor)}return{color:i,layer:r,linePattern:o,hatchPattern:l,gradientFill:s,side:l||s?t.side:void 0}}function ui(t,e){const a=ua(e).drawOrder??t.renderOrder;return a===0?void 0:a}function ft(t,e,a){const r=ui(e,a);r!=null&&(t.renderOrder=r)}function mi(t,e){if(!e)return;const a=t.userData.bakedWorldMatrix;return a&&a.length>=16?Ve(e,a):(t.updateMatrixWorld(!0),Ve(e,Array.from(t.matrixWorld.elements)))}function Pt(t){return Yn(t)}function Rt(t,e,a={}){const r=Wn(t,e,a);return{...r.slice,offset:r.offset}}function le(t,e,a,r,n){const i=ht(e),o=mi(a,i.hatchPattern),l=o?si(o,n):void 0,s=i.gradientFill?oi(t,"gradientPosition"):void 0,c={layer:i.layer,color:i.color,offset:n,hatchPattern:l,gradientFill:i.gradientFill,gradientPositions:s,side:i.side,...r},d=e;if(d.map){const u=Kn(d.map),m=ti(t,r.positions);if(!u||!m)return;c.texture=u,c.uvs=m,c.color=16777215,c.side=C.DoubleSide}return ft(c,a,e),c}function pi(t){const e=li(t,t.geometry);if(e.positions.length===0)return;const{color:a,layer:r}=ht(t.material),n=Ea(t.material),i={layer:r,color:a,offset:Pt(t),lineWidth:n,...e};return La(t)&&(i.excludeFromOsnap=!0),ft(i,t,t.material),i}function hi(t){const e=se(t,t.geometry);if(e.positions.length===0)return;const{color:a,layer:r,linePattern:n}=ht(t.material),i=n?Ba(e.positions):void 0,o={layer:r,color:a,offset:Pt(t),linePattern:n,lineDistances:i,...e};return La(t)&&(o.excludeFromOsnap=!0),ft(o,t,t.material),o}function fi(t){const e=se(t,t.geometry);if(e.positions.length!==0)return le(t.geometry,t.material,t,e,Pt(t))}function gi(t){const e=se(t,t.geometry);if(e.positions.length===0)return;const a=le(t.geometry,t.material,t,e,Pt(t));if(a)return{points:!0,...a}}function bi(t){const e=[],a=[];return t.traverse(r=>{if(!(ur(r)||mr(r))){if(r instanceof Ae){const n=hi(r);n&&e.push(n);return}if(r instanceof pr){const n=pi(r);n&&e.push(n);return}if(r instanceof ze){const n=fi(r);n&&a.push(n);return}if(r instanceof hr){const n=gi(r);n&&a.push(n);return}if(r instanceof fr){if(!Tt(r))return;const n=di(r.geometry);if(n.positions.length===0)return;const i=Ot(r),{color:o,layer:l}=ht(i),{offset:s,...c}=Rt(r,n),d={layer:l,color:o,offset:s,lineWidth:Ea(i),...c};Xe(r)&&(d.excludeFromOsnap=!0),ft(d,r,i),e.push(d)}else if(r instanceof C.LineSegments&&!(r instanceof Ae)){if(!Tt(r))return;const n=Ye(r.geometry);if(n.positions.length===0)return;const i=Ot(r),{color:o,layer:l,linePattern:s}=ht(i),{offset:c,...d}=Rt(r,n),u=s?Ba(d.positions):void 0,m={layer:l,color:o,offset:c,linePattern:s,lineDistances:u,...d};Xe(r)&&(m.excludeFromOsnap=!0),ft(m,r,i),e.push(m)}else if(r instanceof C.Mesh&&!(r instanceof ze)){if(!Tt(r))return;const n=Ot(r);if(ei(n))return;const i=Ye(r.geometry);if(i.positions.length===0)return;const{offset:o,...l}=Rt(r,i),s=le(r.geometry,n,r,l,o);s&&a.push(s)}}}),{lineBatches:e,meshBatches:a}}const Ge={size:8,colorCss:"#0080ff",hotColorCss:"#ff0000"};function We(t){const e=new xr(vr.ByACI,t);return e.cssColor??`rgb(${e.red}, ${e.green}, ${e.blue})`}function wi(t){try{const e=dr.instance(),a=e.getVar(Ut.GRIPSIZE,t),r=e.getVar(Ut.GRIPCOLOR,t),n=e.getVar(Ut.GRIPHOT,t);return!(a>0)||!Number.isFinite(a)?Ge:{size:a,colorCss:We(r),hotColorCss:We(n)}}catch{return Ge}}function Ke(t,e){const a=t.extmin,r=t.extmax,n=wi(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 Je(t,e,a,r,n){return Math.atan2(r-e,n*(a-t))}function ce(t){return t.z>=0?1:-1}function Ua(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:Je(n,i,a.startPoint.x,a.startPoint.y,r),endAngle:Je(n,i,a.endPoint.x,a.endPoint.y,r),normalSign:r})}function P(t,e){const a=new C.Vector3(e.x,e.y,e.z??0).applyMatrix4(t);return{x:a.x,y:a.y}}function xi(t){const e=t.elements;return new C.Matrix4(e[0],e[4],e[8],e[12],e[1],e[5],e[9],e[13],e[2],e[6],e[10],e[14],e[3],e[7],e[11],e[15])}function At(t,e){return new C.Matrix4().multiplyMatrices(t,xi(e))}function Da(t,e){const a=new C.Vector3(e.x,e.y,e.z??0).transformDirection(t).normalize();return{x:a.x,y:a.y}}function Wt(t){const e=new C.Vector3(t.elements[0],t.elements[1],t.elements[2]).length(),a=new C.Vector3(t.elements[4],t.elements[5],t.elements[6]).length();return ot.equal(e,a,ma*Math.max(e,a,1))}function vi(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 yi(t){if(t instanceof Jr)return!0;const e=t;return(e.type==="LINE"||e.type==="Line")&&e.startPoint!=null&&e.endPoint!=null}function ki(t,e,a,r){r.startPoint,r.endPoint}function Na(t,e){return t.blockTableRecord??(t.blockName?e.tables.blockTable.getAt(t.blockName):void 0)}function Ai(t,e){const a=t.dimBlockId;return a?e.tables.blockTable.getAt(a):void 0}function zi(t,e){const a=Na(t,e);if(a)return a;const r=t.owningBlockRecordId;return r?e.tables.blockTable.getAt(r):void 0}function Ta(t){return t.getFullInsertionTransform()}function Mi(t){for(const e of t.newIterator())return!0;return!1}function Ci(t){return typeof t.getFullInsertionTransform=="function"&&"blockTableRecord"in t}function J(t,e,a,r,n){if(r.length<2)return;const i=Wt(a),o=a.elements[0]*a.elements[5]-a.elements[4]*a.elements[1]<0?-1:1,l=[];for(const s of r){const c=P(a,s);let d=s.bulge??0;ot.isPositive(Math.abs(d))&&(d=i?d*o:0),l.push(c.x,c.y,d)}t.push({kind:"path",layer:e,closed:n,vertices:l})}function Oa(t,e){return ot.equal(t.x,e.x)&&ot.equal(t.y,e.y)}function Pi(t){return(t.clockwise?-1:1)*Math.tan(t.deltaAngle/4)}function Ze(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];Oa(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 qe(t){return t.length>=2&&Oa(t[0],t[t.length-1])&&t.pop(),t}function mt(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 Si(t,e,a,r){const n=[r.startPosition];for(const i of r.segments)n.push(i.position);mt(t,e,a,n,r.closed)}function Fi(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,l=(r.z??0)-(n.z??0);return Math.hypot(i,o,l)<=ma?a.vertices:[r,n]}function Ii(t,e,a,r){var n,i;for(const l of r.leaders)for(const s of l.leaderLines){const c=Fi(r,l,s);mt(t,e,a,c,!1)}const o=l=>{if(!l)return;const s=P(a,l);t.push({kind:"point",layer:e,x:s.x,y:s.y})};o(r.contentBasePosition),o((n=r.mtextContent)==null?void 0:n.anchorPoint),o((i=r.blockContent)==null?void 0:i.position)}function Bi(t,e,a,r){const n=r.numberOfVertices;if(n<2)return;const i=r.elevation,o=r.closed?n:n-1;for(let l=0;l<o;l++){const s=r.getPointAt(l),c=r.getPointAt((l+1)%n),d=r.getBulgeAt(l),u={x:s.x,y:s.y,z:i},m={x:c.x,y:c.y,z:i};if(ot.isPositive(Math.abs(d))){const p=P(a,u),b=P(a,m);Ua(t,e,new qt(p,b,d))}}}function Li(t,e,a,r,n,i){const o=P(a,r),l=new C.Vector3(a.elements[0],a.elements[1],a.elements[2]).length(),s={kind:"circle",layer:e,cx:o.x,cy:o.y,r:n*l,normalSign:ce(i)};t.push(s)}function Ei(t,e,a,r){const n=P(a,r.center),i=new C.Vector3(a.elements[0],a.elements[1],a.elements[2]).length(),o={kind:"arc",layer:e,cx:n.x,cy:n.y,r:r.radius*i,startAngle:r.startAngle,endAngle:r.endAngle,normalSign:ce(r.normal)};t.push(o)}function _t(t,e,a,r){const n=P(a,r.center),i=r._geo,o=(i==null?void 0:i.majorAxis)??{x:1,y:0,z:0},l=Da(a,o),s=Math.hypot(l.x,l.y)||1,c=new C.Vector3(a.elements[0],a.elements[1],a.elements[2]).length(),d=new C.Vector3(a.elements[4],a.elements[5],a.elements[6]).length(),u={kind:"ellipse",layer:e,cx:n.x,cy:n.y,majorX:l.x/s,majorY:l.y/s,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 Ui(t,e,a,r){var n,i;const o=r._geo;if(!((n=o==null?void 0:o.controlPoints)!=null&&n.length))return;const l=[];for(const c of o.controlPoints){const d=P(a,c);l.push(d.x,d.y)}const s={kind:"spline",layer:e,controlPoints:l,degree:o.degree??3,knots:[...o.knots??[]],weights:[...o.weights??[]],closed:o.closed??!1};if((i=o.fitPoints)!=null&&i.length){s.fitPoints=[];for(const c of o.fitPoints){const d=P(a,c);s.fitPoints.push(d.x,d.y)}}t.push(s)}const Qe=1e-6;function Di(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 Ni(t){return t.some(e=>{const a=Math.max(0,e.startWidth??0),r=Math.max(0,e.endWidth??0);return a>Qe||r>Qe})}function Ti(t,e,a,r){const n=Di(r),i=n.length;if(i<2)return;if(Ni(n)){J(t,e,a,n,r.closed);return}const o=r.closed?i:i-1;for(let l=0;l<o;l++){const s=n[l],c=n[(l+1)%i],d=s.bulge??0;if(ot.isPositive(Math.abs(d))){const u=P(a,s),m=P(a,c);Ua(t,e,new qt(u,m,d))}}}function Oi(t,e,a,r,n){const i=P(a,{x:r.center.x,y:r.center.y,z:n}),o=Da(a,{x:Math.cos(r.rotation),y:Math.sin(r.rotation),z:0}),l=Math.hypot(o.x,o.y)||1,s=new C.Vector3(a.elements[0],a.elements[1],a.elements[2]).length(),c=new C.Vector3(a.elements[4],a.elements[5],a.elements[6]).length();t.push({kind:"ellipse",layer:e,cx:i.x,cy:i.y,majorX:o.x/l,majorY:o.y/l,majorR:r.majorAxisRadius*s,minorR:r.minorAxisRadius*c,startAngle:r.startAngle,endAngle:r.endAngle,closed:!1,normalSign:r.clockwise?-1:1})}function Ri(t,e,a,r,n){var i;const o=r.numberOfVertices;if(o<2)return;const l=[];for(let s=0;s<o;s++){const c=r.getPointAt(s);l.push({x:c.x,y:c.y,z:n,bulge:((i=r.vertices[s])==null?void 0:i.bulge)??0})}J(t,e,a,l,r.closed)}function _i(t,e,a,r,n){if(r instanceof qr){Ri(t,e,a,r,n);return}if(!(r instanceof Qr))return;const i=[];let o=!1;const l=()=>{const c=qe(i);c.length>=2&&J(t,e,a,c,!1),i.length=0};for(const c of r.curves)c instanceof tn?Ze(i,{x:c.startPoint.x,y:c.startPoint.y,z:n},{x:c.endPoint.x,y:c.endPoint.y,z:n},0):c instanceof qt?Ze(i,{x:c.startPoint.x,y:c.startPoint.y,z:n},{x:c.endPoint.x,y:c.endPoint.y,z:n},Pi(c)):c instanceof en&&(o=!0,l(),Oi(t,e,a,c,n));const s=qe(i);s.length>=2&&J(t,e,a,s,!o)}function $i(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 l of i)_i(t,e,a,l,o)}function ji(t,e,a,r){At(a,Ta(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 Hi(t,e,a,r,n,i,o,l=!0){const s=Kt(t.layer,a);if(o&&!o(s))return;const c=zi(t,i);if(c&&!n.has(c.objectId)&&Mi(c)){n.add(c.objectId);const u=At(e,Ta(t));zt(c,u,s,r,n,i,o,l),n.delete(c.objectId);return}ji(r,s,e,t);const d=P(e,t.position);r.push({kind:"point",layer:s,x:d.x,y:d.y})}function Vi(t,e,a,r){let n=r.boundaryPath();if(n.length>1){const o=n[0],l=n[n.length-1];o.x===l.x&&o.y===l.y&&(o.z??0)===(l.z??0)&&(n=n.slice(0,-1))}n.length>=2&&J(t,e,a,n,!0);const i=P(a,r.position);t.push({kind:"point",layer:e,x:i.x,y:i.y})}function Yi(t,e,a,r){const n=r.position();J(t,e,a,[n.upperLeft,n.upperRight,n.lowerRight,n.lowerLeft],!0);const i=P(a,r.getLocation());t.push({kind:"point",layer:e,x:i.x,y:i.y})}function Xi(t){var e;const a=(e=t.attributeIterator)==null?void 0:e.call(t);return a?typeof a.toArray=="function"?a.toArray():[...a]:[]}function Kt(t,e){return t==="0"?e:t}function Ra(t,e,a,r,n,i,o,l=!0){if(!t.visibility)return;const s=Kt(t.layer,a);if(!(o&&!o(s))){if(t instanceof Mr){Hi(t,e,a,r,n,i,o,l);return}if(Ci(t)){const c=Na(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,b=t.rowSpacing??0,g=Kt(t.layer,a);for(let w=0;w<m;w++)for(let h=0;h<u;h++){const f=At(e,d);(h!==0||w!==0)&&f.multiply(new C.Matrix4().makeTranslation(h*p,w*b,0));const A=P(f,{x:0,y:0,z:0});r.push({kind:"point",layer:g,x:A.x,y:A.y}),zt(c,f,g,r,n,i,o,l)}for(const w of Xi(t))w instanceof Cr,w.isInvisible||Ra(w,e,g,r,n,i,o,l);n.delete(c.objectId);return}if(t instanceof Pr){const c=t,d=Ai(c,i);if(!d||n.has(d.objectId))return;n.add(d.objectId);const u=At(e,c.getFullDimBlockTransform());zt(d,u,s,r,n,i,o,!0),n.delete(d.objectId);return}if(yi(t)){ki(r,s,e,t);return}if(t instanceof Sr){Wt(e)?Li(r,s,e,t.center,t.radius,t.normal):_t(r,s,e,Gi(t));return}if(t instanceof Fr){Wt(e)?Ei(r,s,e,t):_t(r,s,e,Wi(t));return}if(t instanceof Zt){_t(r,s,e,t);return}if(t instanceof Ir){Ui(r,s,e,t);return}if(t instanceof Br){Ti(r,s,e,t);return}if(t instanceof Lr){Bi(r,s,e,t);return}if(t instanceof Er){const c=[];for(let d=0;d<t.numberOfVertices;d++)c.push(t.getPointAt(d));mt(r,s,e,c,t.closed);return}if(t instanceof Ur){l&&$i(r,s,e,t);return}if(t instanceof Dr){t.basePoint,t.unitDir;return}if(t instanceof Nr){t.basePoint,t.unitDir;return}if(t instanceof Tr){J(r,s,e,[t.getPointAt(0),t.getPointAt(1),t.getPointAt(3),t.getPointAt(2)],!0);return}if(t instanceof Or){l&&J(r,s,e,[t.getPointAt(0),t.getPointAt(1),t.getPointAt(3),t.getPointAt(2)],!0);return}if(t instanceof Rr){const c=t.subGetGripPoints();c.length>=2&&mt(r,s,e,c,c.length>=3);return}if(t instanceof _r){const c=t.vertices;c.length>=2&&mt(r,s,e,c,!1);return}if(t instanceof $r){Si(r,s,e,t);return}if(t instanceof jr){Ii(r,s,e,t);return}if(t instanceof Hr){const c=P(e,t.position);r.push({kind:"point",layer:s,x:c.x,y:c.y});return}if(t instanceof Vr){const c=P(e,t.location);r.push({kind:"point",layer:s,x:c.x,y:c.y});return}if(t instanceof Yr){l&&Yi(r,s,e,t);return}if(t instanceof Xr){l&&Vi(r,s,e,t);return}if(t instanceof Gr){const c=P(e,t.position);r.push({kind:"point",layer:s,x:c.x,y:c.y})}}}function zt(t,e,a,r,n,i,o,l=!0){for(const s of t.newIterator())Ra(s,e,a,r,n,i,o,l)}function Gi(t){return new Zt(t.center,t.normal,{x:1,y:0,z:0},t.radius,t.radius,0,Zr)}function Wi(t){return new Zt(t.center,t.normal,{x:1,y:0,z:0},t.radius,t.radius,t.startAngle,t.endAngle)}function Ki(t,e,a={}){const r=vi(t,e);if(!r)return{primitives:[]};const n=[],i=new C.Matrix4;return zt(r,i,"0",n,new Set,t,a.includeLayer),{primitives:n.filter(o=>o.kind!=="line"&&Ji(o))}}function Ji(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 Zi=["en","zh","cs","tr","ar"];function de(t){if(t==null||t==="")return null;const e=t.toLowerCase().replace("_","-");for(const a of Zi)if(e===a||e.startsWith(`${a}-`))return a;return null}const qi=1128612673;function Qi(t){if(t.version!==Y)throw new Error(`Unsupported chunk version: ${t.version}`);const e=new ie;e.writeU32(qi),e.writeU8(Y),e.writeU8(0),e.writeU8(0),e.writeU8(0),e.writeString(t.layoutBtrId),e.writeU32(t.lineBatches.length);for(const a of t.lineBatches)Ma(e,a);e.writeU32(t.meshBatches.length);for(const a of t.meshBatches)Ca(e,a);return e.toUint8Array()}async function to(t){const e=Qi(t),a=(await za(e)).bytes;return{uncompressed:e,compressed:a}}const eo=1,ao=2*1024*1024,St=2*1024*1024,ro=512*1024,no=8*1024*1024,ta=12*1024*1024,io=2*1024*1024,Ft="drawing.acex.json",oo=`./${Ft}`,Jt={layerOn:rn,layerOff:nn,chevronDown:an},so=[90,45,30,23,18,10,5];function lo(){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
+ ${so.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 co=600,uo=960,ue=`
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: ${co}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: ${uo}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 me(t,e="measure",a=!0){const r=e==="measure"?`${lo()}${po()}${mo()}`:"";return`
1386
+ <div id="mlcad-loading" aria-hidden="true" style="background:${t}">
1387
+ <div class="mlcad-loading-spinner"></div>
1388
+ <div id="mlcad-access-gate" hidden>
1389
+ <form id="mlcad-access-form" class="mlcad-access-card">
1390
+ <h2 class="mlcad-access-title" data-i18n-key="access.title" data-i18n-text>Protected drawing</h2>
1391
+ <p class="mlcad-access-hint" data-i18n-key="access.passwordPrompt" data-i18n-text>Enter the password to open this file.</p>
1392
+ <p id="mlcad-access-expiry" class="mlcad-access-expiry" hidden></p>
1393
+ <div class="mlcad-access-field">
1394
+ <input
1395
+ id="mlcad-access-password"
1396
+ type="password"
1397
+ autocomplete="off"
1398
+ data-i18n-key="access.passwordPlaceholder"
1399
+ data-i18n-attr="placeholder aria-label"
1400
+ placeholder="Password"
1401
+ aria-label="Password"
1402
+ />
1403
+ </div>
1404
+ <button type="submit" class="mlcad-access-submit" data-i18n-key="access.unlock" data-i18n-text>Unlock</button>
1405
+ <p id="mlcad-access-error" class="mlcad-access-error" hidden></p>
1406
+ </form>
1407
+ </div>
1408
+ </div>
1409
+ <div id="mlcad-root">
1410
+ <div id="mlcad-canvas-host">
1411
+ <div id="mlcad-top-chrome">
1412
+ <footer id="mlcad-status-bar" aria-live="polite" hidden></footer>
1413
+ </div>
1414
+ </div>
1415
+ <aside id="mlcad-sidebar">
1416
+ <nav id="mlcad-toolbar" data-i18n-attr="aria-label" data-i18n-key="toolbar.viewerTools" aria-label="Viewer tools"></nav>
1417
+ ${r}
1418
+ <div id="mlcad-layer-drawer" role="dialog" data-i18n-attr="aria-label" data-i18n-key="layers.title" aria-label="Layers" hidden>
1419
+ ${pe("mlcad-layer-sheet-close","layers.close","Close layers")}
1420
+ <div class="mlcad-drawer-header">
1421
+ <span data-i18n-key="layers.title" data-i18n-text>Layers</span>
1422
+ <button type="button" class="mlcad-drawer-close" id="mlcad-layer-close" data-i18n-key="layers.close" data-i18n-attr="aria-label" aria-label="Close layers">×</button>
1423
+ </div>
1424
+ <div class="mlcad-layer-actions">
1425
+ <button type="button" class="mlcad-layer-action-btn" id="mlcad-layer-show-all">
1426
+ ${Jt.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
+ ${Jt.layerOff}<span data-i18n-key="layers.hideAll" data-i18n-text>Hide all</span>
1430
+ </button>
1431
+ </div>
1432
+ <div id="mlcad-layer-list"></div>
1433
+ </div>
1434
+ </aside>
1435
+ </div>
1436
+ `}function pe(t,e,a){return`<div class="mlcad-drawer-sheet-chrome">
1437
+ <div class="mlcad-drawer-grabber" role="separator" aria-orientation="horizontal"></div>
1438
+ <button type="button" class="mlcad-drawer-sheet-close" id="${t}" data-i18n-key="${e}" data-i18n-attr="aria-label" aria-label="${a}">${Jt.chevronDown}</button>
1439
+ </div>`}function mo(){return`<div id="mlcad-review-drawer" role="dialog" data-i18n-attr="aria-label" data-i18n-key="review.title" aria-label="Review" hidden>
1440
+ ${pe("mlcad-review-sheet-close","review.close","Close review")}
1441
+ <div class="mlcad-drawer-header">
1442
+ <span data-i18n-key="review.title" data-i18n-text>Review</span>
1443
+ <button type="button" class="mlcad-drawer-close" id="mlcad-review-close" data-i18n-key="review.close" data-i18n-attr="aria-label" aria-label="Close review">×</button>
1444
+ </div>
1445
+ <div class="mlcad-review-toolbar">
1446
+ <input type="search" class="mlcad-review-search" data-i18n-key="review.searchPlaceholder" data-i18n-attr="placeholder" placeholder="Search markups" />
1447
+ <button type="button" class="mlcad-review-clear" data-i18n-key="review.clear" data-i18n-text>Clear all</button>
1448
+ </div>
1449
+ <div class="mlcad-review-table-wrap">
1450
+ <table class="mlcad-review-table">
1451
+ <thead>
1452
+ <tr>
1453
+ <th data-review-col="type" data-i18n-key="review.type" data-i18n-text>Type</th>
1454
+ <th data-review-col="status" data-i18n-key="review.status" data-i18n-text>Status</th>
1455
+ <th data-review-col="author" data-i18n-key="review.author" data-i18n-text>Author</th>
1456
+ <th data-review-col="summary" data-i18n-key="review.summary" data-i18n-text>Summary</th>
1457
+ </tr>
1458
+ </thead>
1459
+ <tbody></tbody>
1460
+ </table>
1461
+ </div>
1462
+ <div class="mlcad-review-detail" hidden>
1463
+ <div class="mlcad-review-detail-header">
1464
+ <div class="mlcad-review-detail-title" data-i18n-key="review.details" data-i18n-text>Details</div>
1465
+ <button type="button" class="mlcad-review-detail-close" data-i18n-key="review.closeDetails" data-i18n-attr="title aria-label" title="Close details" aria-label="Close details">×</button>
1466
+ </div>
1467
+ <div class="mlcad-review-field">
1468
+ <label class="mlcad-review-field-label" data-review-field="status" data-i18n-key="review.status" data-i18n-text>Status</label>
1469
+ <select class="mlcad-review-status"></select>
1470
+ </div>
1471
+ <div class="mlcad-review-field">
1472
+ <label class="mlcad-review-field-label" data-review-field="author" data-i18n-key="review.author" data-i18n-text>Author</label>
1473
+ <input type="text" class="mlcad-review-author" disabled />
1474
+ </div>
1475
+ <div class="mlcad-review-field">
1476
+ <label class="mlcad-review-field-label" data-review-field="label" data-i18n-key="review.label" data-i18n-text>Label</label>
1477
+ <input type="text" class="mlcad-review-text" />
1478
+ </div>
1479
+ <div class="mlcad-review-field">
1480
+ <label class="mlcad-review-field-label" data-review-field="comment" data-i18n-key="review.comment" data-i18n-text>Comment</label>
1481
+ <textarea class="mlcad-review-comment" rows="2"></textarea>
1482
+ </div>
1483
+ <div class="mlcad-review-detail-actions">
1484
+ <button type="button" class="mlcad-review-zoom" data-i18n-key="review.zoomTo" data-i18n-text>Zoom to</button>
1485
+ <button type="button" class="mlcad-review-delete" data-i18n-key="review.delete" data-i18n-text>Delete</button>
1486
+ </div>
1487
+ </div>
1488
+ </div>`}function po(){return`<div id="mlcad-measure-drawer" role="dialog" data-i18n-attr="aria-label" data-i18n-key="measurePanel.title" aria-label="Measurements" hidden>
1489
+ ${pe("mlcad-measure-sheet-close","measurePanel.close","Close measurements")}
1490
+ <div class="mlcad-drawer-header">
1491
+ <span data-i18n-key="measurePanel.title" data-i18n-text>Measurements</span>
1492
+ <button type="button" class="mlcad-drawer-close" id="mlcad-measure-close" data-i18n-key="measurePanel.close" data-i18n-attr="aria-label" aria-label="Close measurements">×</button>
1493
+ </div>
1494
+ <div class="mlcad-measure-toolbar">
1495
+ <div class="mlcad-measure-filter" role="group" data-i18n-key="measurePanel.filterGroup" data-i18n-attr="aria-label" aria-label="Filter by type">
1496
+ <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="distance" aria-pressed="false" data-i18n-key="measurePanel.filterDistance" data-i18n-text data-i18n-attr="title aria-label" title="Distance">Distance</button>
1497
+ <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="arc" aria-pressed="false" data-i18n-key="measurePanel.filterArc" data-i18n-text data-i18n-attr="title aria-label" title="Arc">Arc</button>
1498
+ <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="radius" aria-pressed="false" data-i18n-key="measurePanel.filterRadius" data-i18n-text data-i18n-attr="title aria-label" title="Radius">Radius</button>
1499
+ <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="angle" aria-pressed="false" data-i18n-key="measurePanel.filterAngle" data-i18n-text data-i18n-attr="title aria-label" title="Angle">Angle</button>
1500
+ <button type="button" class="mlcad-measure-filter-btn" data-measure-filter="area" aria-pressed="false" data-i18n-key="measurePanel.filterArea" data-i18n-text data-i18n-attr="title aria-label" title="Area">Area</button>
1501
+ </div>
1502
+ <button type="button" class="mlcad-measure-clear" data-i18n-key="measurePanel.clear" data-i18n-text>Clear all</button>
1503
+ </div>
1504
+ <div class="mlcad-measure-table-wrap">
1505
+ <table class="mlcad-measure-table">
1506
+ <thead>
1507
+ <tr>
1508
+ <th data-measure-col="type" data-i18n-key="measurePanel.type" data-i18n-text>Type</th>
1509
+ <th data-measure-col="value" data-i18n-key="measurePanel.value" data-i18n-text>Value</th>
1510
+ <th></th>
1511
+ </tr>
1512
+ </thead>
1513
+ <tbody></tbody>
1514
+ </table>
1515
+ </div>
1516
+ </div>`}function ho(t,e){var a;const r=e.title??t.meta.title??"CAD Drawing",n=e.encoded??Fa(t),i=e.viewerRuntime,o=jn(),l=n.compression,s=((a=e.accessManifest)==null?void 0:a.encrypted)===!0,c=`#${t.meta.background.toString(16).padStart(6,"0")}`,d=de(t.meta.locale)??"en",u=t.meta.viewerMode??"measure",m=t.meta.exportLayouts!==!1,p=e.accessManifest?` <script id="mlcad-access" type="application/json">${ja(JSON.stringify(e.accessManifest))}<\/script>
1517
+ `:"",b=s?`${o}+aes-gcm;base64`:`${o}+${l};base64`;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>${_a(r)}</title>
1524
+ <style>${ue}</style>
1525
+ </head>
1526
+ <body>
1527
+ ${me(c,u,m)}
1528
+ ${p} <script id="mlcad-snapshot" type="${b}">${n.payload}<\/script>
1529
+ <script>${$a(i)}<\/script>
1530
+ </body>
1531
+ </html>`}function fo(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=de(t.meta.locale)??"en",l=t.meta.viewerMode??"measure",s=t.meta.exportLayouts!==!1,c=(a=e.manifestUrl)==null?void 0:a.trim(),d=JSON.stringify(c&&c!==oo?{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>${_a(r)}</title>
1538
+ <style>${ue}</style>
1539
+ </head>
1540
+ <body>
1541
+ ${me(i,l,s)}
1542
+ <script id="mlcad-package" type="application/json">${ja(d)}<\/script>
1543
+ <script>${$a(n)}<\/script>
1544
+ </body>
1545
+ </html>`}function _a(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function $a(t){return t.replace(/<\/script/gi,"<\\/script")}function ja(t){return t.replace(/</g,"\\u003c")}const go=1,bo=1e5,wo=16,xo=12;function vo(t,e=Date.now(),a){return t==="never"?null:t==="custom"?a??null:e+t*24*60*60*1e3}function Ha(t){var e;const a=!!((e=t.password)!=null&&e.trim());return t.expiresAt!=null||a}function Mt(t){var e;if(!Ha(t))return;const a=!!((e=t.password)!=null&&e.trim());return{v:go,expiresAt:t.expiresAt,encrypted:a,...a&&t.salt?{salt:t.salt}:{}}}async function Va(t,e){const a=crypto.getRandomValues(new Uint8Array(wo));return{key:await Ao(t,a),salt:ge(a)}}async function he(t,e){const a=crypto.getRandomValues(new Uint8Array(xo)),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 yo(t,e){const{key:a,salt:r}=await Va(t),n=new Uint8Array(zo(e)),i=await he(a,n);return{encryptedPayload:ge(i),salt:r}}function fe(t){return ge(t)}async function ko(t,e){var a;if(!Ha(e))return{encoded:t};const r=(a=e.password)==null?void 0:a.trim();if(r){const{encryptedPayload:n,salt:i}=await yo(r,t.payload);return{encoded:{payload:n,compression:t.compression},manifest:Mt({expiresAt:e.expiresAt,password:r,salt:i})}}return{encoded:t,manifest:Mt({expiresAt:e.expiresAt})}}async function Ao(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:bo,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}function ge(t){let e="";for(let a=0;a<t.length;a++)e+=String.fromCharCode(t[a]);return btoa(e)}function zo(t){const e=atob(t.trim()),a=new Uint8Array(e.length);for(let r=0;r<e.length;r++)a[r]=e.charCodeAt(r);return a}const Mo=256;function Co(t,e=St){return!(e>0)||re(t)<=e?[t]:t.indices&&t.indices.length>=2?Fo(t,e):So(t,e)}function Po(t,e=St){return t.texture?[t]:!(e>0)||ne(t)<=e?[t]:t.points?Bo(t,e):!t.indices||t.indices.length<3?Xa(t,e):Eo(t,e)}function Ya(t){return t.linePattern?64+t.linePattern.pattern.length*8:0}function be(t){return(t.hatchPattern?128:0)+(t.gradientFill?64:0)}function bt(t,e,a){const r=t-Mo-e;return r<a?1:Math.max(1,Math.floor(r/a))}function So(t,e){var a;const r=(((a=t.lineDistances)==null?void 0:a.length)??0)>=2,n=24+(r?8:0),i=bt(e,Ya(t),n),o=t.positions.length/6|0;if(o<=1)return[t];const l=[];for(let s=0;s<o;s+=i){const c=Math.min(i,o-s),d=s*6,u={layer:t.layer,color:t.color,offset:t.offset,positions:t.positions.slice(d,d+c*6)};if(Ka(t,u),r&&t.lineDistances){const m=s*2;u.lineDistances=t.lineDistances.slice(m,m+c*2)}l.push(u)}return l.length>0?l:[t]}function Fo(t,e){var a;const r=t.indices,n=32+((((a=t.lineDistances)==null?void 0:a.length)??0)>0?8:0),i=bt(e,Ya(t),n),o=[];for(let l=0;l+1<r.length;){const s=Math.min(i*2,r.length-l),c=s-s%2;if(c<2)break;o.push(Io(t,l,c)),l+=c}return o.length>0?o:[t]}function Io(t,e,a){const r=Wa(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 Ka(t,n),r.attributes[0]&&r.attributes[0].length>0&&(n.lineDistances=r.attributes[0]),n}function Bo(t,e){return t.indices&&t.indices.length>0?Lo(t,e):Xa(t,e)}function Lo(t,e){const a=t.indices,r=16+(t.uvs?8:0)+(t.gradientPositions?8:0),n=bt(e,be(t),r),i=[];for(let o=0;o<a.length;){const l=Math.min(n,a.length-o);if(l<1)break;i.push(Ga(t,o,l)),o+=l}return i.length>0?i:[t]}function Xa(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=bt(e,be(t),r),i=t.points?1:3,o=Math.max(i,n-n%i),l=[];for(let s=0;s<a;s+=o){const c=Math.min(o,a-s),d=c-c%i;if(d<i)break;l.push(Uo(t,s,d))}return l.length>0?l:[t]}function Eo(t,e){const a=t.indices,r=48+(t.uvs?24:0)+(t.gradientPositions?24:0),n=bt(e,be(t),r),i=[];for(let o=0;o+2<a.length;){const l=Math.min(n*3,a.length-o),s=l-l%3;if(s<3)break;i.push(Ga(t,o,s)),o+=s}return i.length>0?i:[t]}function Uo(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 Ja(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 Ga(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=Wa(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};Ja(t,o);let l=0;return t.uvs&&(o.uvs=i.attributes[l++]),t.gradientPositions&&(o.gradientPositions=i.attributes[l]),o}function Wa(t,e,a,r){const n=new Map,i=[],o=new Uint32Array(e.length),l=a.map(()=>[]);for(let s=0;s<e.length;s++){const c=e[s];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],b=a[m],g=c*p;for(let w=0;w<p;w++)l[m].push(b[g+w]??0)}}o[s]=d}return{positions:Float32Array.from(i),indices:o,attributes:l.map(s=>Float32Array.from(s))}}function Ka(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 Ja(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 Do(t,e,a=St){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=re(c);n.estimatedBytes+d>e&&(n.lineBatches.length>0||n.meshBatches.length>0)&&i(),n.lineBatches.push(c),n.estimatedBytes+=d},l=c=>{const d=ne(c);n.estimatedBytes+d>e&&(n.lineBatches.length>0||n.meshBatches.length>0)&&i(),n.meshBatches.push(c),n.estimatedBytes+=d},s=Math.min(e,a);for(const c of t.lineBatches)for(const d of Co(c,s))o(d);for(const c of t.meshBatches)for(const d of Po(c,s))l(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 No(t,e){if(t.version!==Y)throw new Error(`Unsupported snapshot version: ${t.version}`);const a=e.maxChunkBytes??ao,r=e.maxBatchBytes??St,n=e.maxOsnapChunkBytes??ro,i=Ft,o=Ro(t.layouts,t.activeLayoutBtrId),l=[],s=[],c=new Map;return o.forEach((d,u)=>{var m;c.set(d.btrId,u);const p=Do(d,a,r),b=[];p.forEach((h,f)=>{const A=`L${u}-${String(f).padStart(3,"0")}`,v=`chunks/${A}.acex.gz`;b.push(A),l.push({kind:"geometry",id:A,href:v,layoutBtrId:d.btrId,lineBatchCount:h.lineBatches.length,meshBatchCount:h.meshBatches.length,chunk:{version:Y,layoutBtrId:d.btrId,lineBatches:h.lineBatches,meshBatches:h.meshBatches}})});const g={btrId:d.btrId,name:d.name,isModelSpace:d.isModelSpace,viewports:d.viewports,...d.savedView?{savedView:d.savedView}:{},chunkIds:b},w=(m=d.osnap)==null?void 0:m.primitives;if(w&&w.length>0){const h=En(w,n),f=[];h.forEach((A,v)=>{const S=`L${u}-osnap-${String(v).padStart(3,"0")}`,U=`chunks/${S}.osnap.gz`;f.push(S),l.push({kind:"osnap",id:S,href:U,layoutBtrId:d.btrId,primitiveCount:A.length,primitives:A})}),g.osnapChunkIds=f}s.push(g)}),{jobs:l,layoutRefs:s,layoutIndexByBtrId:c,manifestFileName:i}}function To(t,e,a,r,n){var i,o;const l=[],s=[],c=[];for(const h of n){const{job:f,uncompressed:A,compressed:v}=h;c.push({path:f.href,bytes:v}),f.kind==="geometry"?l.push({id:f.id,href:f.href,layoutBtrId:f.layoutBtrId,byteLength:A.byteLength,compressedByteLength:v.byteLength,lineBatchCount:f.lineBatchCount,meshBatchCount:f.meshBatchCount}):s.push({id:f.id,href:f.href,layoutBtrId:f.layoutBtrId,byteLength:A.byteLength,compressedByteLength:v.byteLength,primitiveCount:f.primitiveCount})}const d=t.layouts.map(h=>{const f=a.get(h.btrId);return e[f]}),u=new Set(((i=d.find(h=>h.btrId===t.activeLayoutBtrId))==null?void 0:i.chunkIds)??[]),m=[...l.filter(h=>u.has(h.id)),...l.filter(h=>!u.has(h.id))],p=new Set(((o=d.find(h=>h.btrId===t.activeLayoutBtrId))==null?void 0:o.osnapChunkIds)??[]),b=[...s.filter(h=>p.has(h.id)),...s.filter(h=>!p.has(h.id))],g={format:"acex-package",packageVersion:eo,snapshotVersion:Y,meta:t.meta,layers:t.layers,activeLayoutBtrId:t.activeLayoutBtrId,layouts:d,chunks:m,...b.length>0?{osnapChunks:b}:{}},w=`${JSON.stringify(g)}
1546
+ `;return c.unshift({path:r,bytes:pt(w)}),{manifest:g,manifestFileName:r,files:c}}async function Za(t,e={}){const{jobs:a,layoutRefs:r,layoutIndexByBtrId:n,manifestFileName:i}=No(t,e),o=await Promise.all(a.map(async l=>{if(l.kind==="geometry"){const{uncompressed:d,compressed:u}=await to(l.chunk);return{job:l,uncompressed:d,compressed:u}}const{uncompressed:s,compressed:c}=await Un({primitives:l.primitives});return{job:l,uncompressed:s,compressed:c}}));return To(t,r,n,i,o)}async function Oo(t,e){const a=await Za(t,e),r=fo(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:pt(r)},...a.files]}}function Ro(t,e){const a=t.find(n=>n.btrId===e),r=t.filter(n=>n.btrId!==e);return a?[a,...r]:[...t]}const _o="application/vnd.mlightcad.acex-chunk;base64",$o="application/vnd.mlightcad.acex-chunk+aes-gcm;base64",qa="data-acex-href";function jo(t){var e;let a=0;for(const r of t.layouts){for(const i of r.lineBatches)a+=re(i);for(const i of r.meshBatches)a+=ne(i);const n=(e=r.osnap)==null?void 0:e.primitives;if(n)for(const i of n)a+=Pa(i)}return a}function Ho(t,e=no){return jo(t)>=e}async function Vo(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=de(t.meta.locale)??"en",l=t.meta.viewerMode??"measure",s=t.meta.exportLayouts!==!1,c=e.expiresAt??null,d=((a=e.password)==null?void 0:a.trim())||void 0,u={maxChunkBytes:e.maxChunkBytes??ta,maxBatchBytes:e.maxBatchBytes??e.maxChunkBytes??ta,maxOsnapChunkBytes:e.maxOsnapChunkBytes??io},m=await Za(t,u);let p,b,g;if(d){const{key:h,salt:f}=await Va(d);p=Mt({expiresAt:c,password:d,salt:f});const A=new TextEncoder().encode(`${JSON.stringify(m.manifest)}
1547
+ `),v=await he(h,A);b={mode:"embedded",encrypted:!0,encryptedManifest:fe(v)},g=await Xo(m.files,h)}else p=Mt({expiresAt:c}),b={mode:"embedded",manifest:m.manifest},g=Yo(m.files);const w=p?` <script id="mlcad-access" type="application/json">${ea(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>${Qa(r)}</title>
1555
+ <style>${ue}</style>
1556
+ </head>
1557
+ <body>
1558
+ ${me(i,l,s)}
1559
+ ${w} <script id="mlcad-package" type="application/json">${ea(JSON.stringify(b))}<\/script>
1560
+ ${g} <script>${Go(n)}<\/script>
1561
+ </body>
1562
+ </html>`}function Yo(t){const e=[];for(const a of t)a.path!==Ft&&e.push(` <script type="${_o}" ${qa}="${tr(a.path)}">${fe(a.bytes)}<\/script>
1563
+ `);return e.join("")}async function Xo(t,e){const a=[];for(const r of t){if(r.path===Ft)continue;const n=await he(e,r.bytes);a.push(` <script type="${$o}" ${qa}="${tr(r.path)}">${fe(n)}<\/script>
1564
+ `)}return a.join("")}function Qa(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function tr(t){return Qa(t).replace(/'/g,"&#39;")}function Go(t){return t.replace(/<\/script/gi,"<\\/script")}function ea(t){return t.replace(/</g,"\\u003c")}function Wo(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 Ko(t){return t.endsWith(".gz")}function Jo(t){const e={};for(const a of t.files){if(!Wo(a.path))throw new Error(`Unsafe package path: ${a.path}`);Ko(a.path)?e[a.path]=[a.bytes,{level:0}]:e[a.path]=[a.bytes,{level:6}]}return yn(e)}const Zo=400;function Z(t={}){var e;const a=t.exportFormat==="multi"?"multi":"single";return{exportFormat:a,exportInvisibleLayers:t.exportInvisibleLayers!==!1,exportLayouts:t.exportLayouts!==!1,initialView:t.initialView??"fit",viewerMode:t.viewerMode??"measure",expiryDays:a==="multi"?"never":t.expiryDays??"never",expiresAt:a==="multi"?null:t.expiresAt??null,password:a==="multi"?"":((e=t.password)==null?void 0:e.trim())??""}}function qo(t){const e=t.activeLayoutView,a=e.center,r=e.trCamera.zoom,n=Math.max(e.height,1),i=r*(2*Zo)/n;return{centerX:a.x,centerY:a.y,zoom:i}}const Qo="./viewer-runtime.iife.js";let gt={};function ts(t){gt={...gt,...t}}function es(){return{...gt}}function as(t){return t!=null?String(t):gt.viewerRuntimeUrl!=null?String(gt.viewerRuntimeUrl):Qo}const er="https://mlightcad.com/cad-viewer/docs/";let ar=rr(er);function rs(){return ar}function ns(t){ar=rr(t)}function rr(t){const e=t.trim();return e?e.replace(/\/+$/,""):er.replace(/\/+$/,"")}function is(){return{minX:0,minY:0,maxX:0,maxY:0,valid:!1}}function os(t,e,a){if(e.length<3)return;const r=a[0],n=a[1];for(let i=0;i+2<e.length;i+=3){const o=He(e[i],r),l=He(e[i+1],n);t.valid?(o<t.minX&&(t.minX=o),o>t.maxX&&(t.maxX=o),l<t.minY&&(t.minY=l),l>t.maxY&&(t.maxY=l)):(t.minX=t.maxX=o,t.minY=t.maxY=l,t.valid=!0)}}function aa(t,e){os(t,e.positions,e.offset)}function ss(t){return t.valid?{minX:t.minX,minY:t.minY,maxX:t.maxX,maxY:t.maxY}:null}function ls(t,e){const a=is();for(const r of t)aa(a,r);for(const r of e)aa(a,r);return ss(a)}function nr(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 cs(t){if(!t||t.length===0)return null;let e=null;for(const a of t)e=nr(e,a.paper);return e}function ds(t){return nr(ls(t.lineBatches,t.meshBatches),cs(t.viewports))}function us(t,e,a){if(a)return;const r=ms(t,e);if(!(r!=null&&r.newIterator))return;const n=[];for(const i of r.newIterator()){if(!(i instanceof gr)||br.isDefaultPaperSpaceViewport(i)||typeof i.toGiViewport!="function")continue;const o=i.toGiViewport(),l=o.box,s=o.viewBox,c=ra(l),d=ra(s);if(!c||!d)continue;const u=Number.isFinite(o.viewTwistAngle)?o.viewTwistAngle:i.viewTwistAngle;n.push(Number.isFinite(u)&&Math.abs(u)>1e-12?{paper:c,model:d,twist:u}:{paper:c,model:d})}return n.length>0?n:void 0}function ra(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 ms(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 na=16/9;function ps(t,e,a,r=na){var n,i,o,l;const s=Number.isFinite(r)&&r>0?r:na;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,s);return ia(d)}const c=(l=t.objects)==null?void 0:l.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}}class hs{build(e,a,r={}){return this.buildSync(e,a,r)}async buildAsync(e,a,r={}){await $();const n=r.exportInvisibleLayers!==!1,i=r.exportLayouts!==!1,o=n?void 0:p=>xt(e,p,n),l=Ke(a,{title:r.title,background:r.background}),s=[];e.layers.forEach(p=>{xt(e,p.name,n)&&s.push({name:p.name,color:p.color.RGB??16777215,visible:!p.isOff&&!p.isFrozen})});const c=sa(a),d=new Map(c.map(p=>[p.blockTableRecordId,p.name])),u=ca(e,i),m=[];for(const p of la(e,c,i))m.push(da(e,a,p,d,r,o)),await $();return{version:Y,meta:oa(l,r,m,u),layers:s,layouts:m,activeLayoutBtrId:u}}buildSync(e,a,r){const n=r.exportInvisibleLayers!==!1,i=r.exportLayouts!==!1,o=n?void 0:p=>xt(e,p,n),l=Ke(a,{title:r.title,background:r.background}),s=[];e.layers.forEach(p=>{xt(e,p.name,n)&&s.push({name:p.name,color:p.color.RGB??16777215,visible:!p.isOff&&!p.isFrozen})});const c=sa(a),d=new Map(c.map(p=>[p.blockTableRecordId,p.name])),u=ca(e,i),m=[];for(const p of la(e,c,i))m.push(da(e,a,p,d,r,o));return{version:Y,meta:oa(l,r,m,u),layers:s,layouts:m,activeLayoutBtrId:u}}}function oa(t,e,a,r){const n=a.find(l=>l.btrId===r)??a[0],i=n?ds(n):null,o=e.initialView??"fit";return{title:t.title,createdAt:new Date().toISOString(),extents:t.extents,viewExtents:i??void 0,units:t.units,grip:t.grip,background:t.background,locale:e.locale??k.currentLocale,initialView:o,viewState:o==="current"?e.viewState:void 0,viewerMode:e.viewerMode??"measure",exportLayouts:e.exportLayouts!==!1,docsBaseUrl:fs()}}function fs(){try{ns(wr())}catch{}return rs()}function gs(t){return(t.viewerMode??"measure")==="measure"}function xt(t,e,a){if(a)return!0;const r=t.layers.get(e);return r?!r.isOff&&!r.isFrozen:!0}function sa(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 la(t,e,a){if(!a)return t.modelSpaceBtrId?[t.modelSpaceBtrId]:[];const r=new Set,n=[];for(const i of e)r.has(i.blockTableRecordId)||(r.add(i.blockTableRecordId),n.push(i.blockTableRecordId));for(const i of t.layouts.keys())r.has(i)||(r.add(i),n.push(i));return n}function ca(t,e){return e&&t.activeLayoutBtrId||t.modelSpaceBtrId}function da(t,e,a,r,n,i){const o=[],l=[],s=t.layouts.get(a);if(s)for(const[,m]of s.layers){if(i&&!i(m.name))continue;const p=bi(m.internalObject);o.push(...p.lineBatches),l.push(...p.meshBatches)}const c=a===t.modelSpaceBtrId,d=ps(e,a,c,n.canvasAspectRatio);let u;if(gs(n)){const m=performance.now();u=Ki(e,a,{includeLayer:i}),console.log(`[chtml] osnap catalog ${r.get(a)??a}: ${(performance.now()-m).toFixed(0)} ms (${(u==null?void 0:u.primitives.length)??0} primitives)`)}return{btrId:a,name:r.get(a)??bs(e,a),isModelSpace:c,lineBatches:o,meshBatches:l,osnap:u,viewports:us(e,a,c),...d?{savedView:d}:{}}}function bs(t,e){var a;const r=(a=t.tables)==null?void 0:a.blockTable;if(r!=null&&r.newIterator){for(const n of r.newIterator())if(n.objectId===e)return n.name}return e}function K(t,e){console.log(`[chtml] ${t}: ${e.toFixed(0)} ms`)}class ws{constructor(e={}){this.options=e,this._snapshotBuilder=new hs}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 lr))throw new Error("HTML export requires a 2D CAD view. Open a drawing before exporting.");const r=Z(a),n={includeInvisibleLayers:r.exportInvisibleLayers,includeLayouts:r.exportLayouts};return await e.ensureEntitiesConvertedForExport(n),await $(),e}async convert(e,a={},r){const n=it.instance,i=Z(a),o=performance.now();await n.withBusyIndicator(async()=>{await $();const l=n.curDocument;let s=performance.now();const c=await this.prepareAcTrView2dForHtmlExport(r??n.curView,i);K("prepare (missing entities)",performance.now()-s);const d=e||l.fileName||l.docTitle,u=cr(d);s=performance.now();const m=await this._snapshotBuilder.buildAsync(c.cadScene,l.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)?qo(c):void 0,canvasAspectRatio:c.width/Math.max(c.height,1)});K("snapshot build",performance.now()-s),await $(),s=performance.now();const p=await this.loadViewerRuntime();if(K("load viewer runtime",performance.now()-s),await $(),i.exportFormat==="multi"){s=performance.now();const w=await Oo(m,{viewerRuntime:p});K("package + gzip chunks",performance.now()-s),s=performance.now();const h=Jo(w);K("zip package",performance.now()-s),await $(),this.downloadBytes(h,ke(d,"zip"),"application/zip"),K("chtml total",performance.now()-o);return}const b=vo(i.expiryDays,Date.now(),i.expiresAt);s=performance.now();const g=await this.packSelfContainedHtml(m,p,{expiresAt:b,password:i.password||void 0});K("pack self-contained html",performance.now()-s),await $(),this.downloadHtml(g,ke(d,"html")),K("chtml total",performance.now()-o)})}async packSnapshot(e,a){await it.instance.withBusyIndicator(async()=>{await $();const r=await this.loadViewerRuntime();await $();const n=await this.packSelfContainedHtml(e,r,{expiresAt:null});await $(),this.downloadHtml(n,a)})}async packSelfContainedHtml(e,a,r){if(Ho(e))return Vo(e,{title:e.meta.title,viewerRuntime:a,expiresAt:r.expiresAt,password:r.password});const n=await ko(Fa(e),{expiresAt:r.expiresAt,password:r.password});return ho(e,{title:e.meta.title,viewerRuntime:a,encoded:n.encoded,accessManifest:n.manifest})}async loadViewerRuntime(){const e=as(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),l=document.createElement("a");l.href=o,l.download=a,document.body.appendChild(l),l.click(),document.body.removeChild(l),window.setTimeout(()=>URL.revokeObjectURL(o),6e4)}}class xs extends sr{constructor(e={}){super(),this.pluginOptions=e}async execute(e){const a=await this.promptOptions();a&&await new ws(this.pluginOptions).convert(e.doc.fileName||e.doc.docTitle,a,e.view)}async promptOptions(){const e=Z(),a=await this.promptExportFormat();if(a===void 0)return;const r=await this.promptYesNo("jig.chtml.exportInvisibleLayers",e.exportInvisibleLayers);if(r===void 0)return;const n=await this.promptYesNo("jig.chtml.exportLayouts",e.exportLayouts);if(n===void 0)return;const i=await this.promptInitialView();if(i===void 0)return;const o=await this.promptViewerMode();if(o!==void 0)return Z({exportFormat:a,exportInvisibleLayers:r,exportLayouts:n,initialView:i,viewerMode:o})}async promptExportFormat(){const e=Z(),a=new wt(k.t("jig.chtml.exportFormat"));a.allowNone=!0;const r=a.keywords.add(k.t("jig.chtml.keywords.single.display"),k.t("jig.chtml.keywords.single.global"),k.t("jig.chtml.keywords.single.local")),n=a.keywords.add(k.t("jig.chtml.keywords.multi.display"),k.t("jig.chtml.keywords.multi.global"),k.t("jig.chtml.keywords.multi.local"));a.keywords.default=e.exportFormat==="multi"?n:r;const i=await it.instance.editor.getKeywords(a);if(i.status!==L.Cancel){if(i.status===L.None)return e.exportFormat;if(i.status===L.OK||i.status===L.Keyword)return i.stringResult?i.stringResult==="Multi"?"multi":"single":e.exportFormat}}async promptYesNo(e,a){const r=new wt(k.t(e));r.allowNone=!0;const n=r.keywords.add(k.t("jig.chtml.keywords.yes.display"),k.t("jig.chtml.keywords.yes.global"),k.t("jig.chtml.keywords.yes.local")),i=r.keywords.add(k.t("jig.chtml.keywords.no.display"),k.t("jig.chtml.keywords.no.global"),k.t("jig.chtml.keywords.no.local"));r.keywords.default=a?n:i;const o=await it.instance.editor.getKeywords(r);if(o.status!==L.Cancel){if(o.status===L.None)return a;if(o.status===L.OK||o.status===L.Keyword)return o.stringResult?o.stringResult==="Yes":a}}async promptInitialView(){const e=Z(),a=new wt(k.t("jig.chtml.initialView"));a.allowNone=!0;const r=a.keywords.add(k.t("jig.chtml.keywords.extents.display"),k.t("jig.chtml.keywords.extents.global"),k.t("jig.chtml.keywords.extents.local")),n=a.keywords.add(k.t("jig.chtml.keywords.current.display"),k.t("jig.chtml.keywords.current.global"),k.t("jig.chtml.keywords.current.local"));a.keywords.default=e.initialView==="current"?n:r;const i=await it.instance.editor.getKeywords(a);if(i.status!==L.Cancel){if(i.status===L.None)return e.initialView;if(i.status===L.OK||i.status===L.Keyword)return i.stringResult?i.stringResult==="Current"?"current":"fit":e.initialView}}async promptViewerMode(){const e=Z(),a=new wt(k.t("jig.chtml.viewerMode"));a.allowNone=!0;const r=a.keywords.add(k.t("jig.chtml.keywords.view.display"),k.t("jig.chtml.keywords.view.global"),k.t("jig.chtml.keywords.view.local")),n=a.keywords.add(k.t("jig.chtml.keywords.measure.display"),k.t("jig.chtml.keywords.measure.global"),k.t("jig.chtml.keywords.measure.local"));a.keywords.default=e.viewerMode==="view"?r:n;const i=await it.instance.editor.getKeywords(a);if(i.status!==L.Cancel){if(i.status===L.None)return e.viewerMode;if(i.status===L.OK||i.status===L.Keyword)return i.stringResult?i.stringResult==="View"?"view":"measure":e.viewerMode}}}const vs="1.7.5",ys={version:vs};class ks{constructor(e={}){this.options=e,this.name="HtmlPlugin",this.version=ys.version,this.description="HTML export (-chtml) command",this.registeredCommands=[]}onLoad(e,a){const r=or.SYSTEMT_COMMAND_GROUP_NAME,n=new xs(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 zs(t={}){return t.viewerRuntimeUrl!=null&&ts(t),new ks(es())}export{qi as ACEC_CHUNK_MAGIC,zn as ACEO_OSNAP_MAGIC,Mn as ACEO_OSNAP_VERSION,ao as ACEX_DEFAULT_CHUNK_MAX_BYTES,Ft as ACEX_DEFAULT_MANIFEST_FILE,oo as ACEX_DEFAULT_MANIFEST_HREF,ro as ACEX_DEFAULT_OSNAP_CHUNK_MAX_BYTES,$o as ACEX_EMBEDDED_CHUNK_ENCRYPTED_MIME,qa as ACEX_EMBEDDED_CHUNK_HREF_ATTR,ta as ACEX_EMBEDDED_CHUNK_MAX_BYTES,_o as ACEX_EMBEDDED_CHUNK_MIME,no as ACEX_EMBEDDED_CHUNK_THRESHOLD_BYTES,io as ACEX_EMBEDDED_OSNAP_CHUNK_MAX_BYTES,St as ACEX_MAX_GEOMETRY_BATCH_BYTES,eo as ACEX_PACKAGE_VERSION,Aa as ACEX_SNAPSHOT_COMPRESSION,Y as ACEX_SNAPSHOT_VERSION,xs as AcApExportHtmlCmd,ws as AcApHtmlConvertor,hs as AcApHtmlSnapshotBuilder,Qo as DEFAULT_HTML_VIEWER_RUNTIME_URL,Ps as HTML_PLUGIN_NAME,Ss as HTML_PLUGIN_TRIGGERS,fe as acExHtmlBytesToBase64,Mt as buildAcExHtmlAccessManifest,Oo as buildAcExPackageAsync,Za as buildAcExPackageDataAsync,Ki as buildOsnapCatalog,Ke as buildViewerMetadata,qo as captureAcApHtmlViewState,bi as collectBatchesFromObject3D,Yt as compressSnapshotBinary,za as compressSnapshotBinaryAsync,ts as configureHtmlPlugin,Va as createAcExHtmlAccessKey,zs as createHtmlPlugin,Qi as encodeChunkBinary,Sa as encodeOsnapCatalogBinary,Fa as encodeSnapshot,Tn as encodeSnapshotBinary,he as encryptAcExHtmlBytes,yo as encryptAcExHtmlSnapshotPayload,jo as estimateAcExSnapshotGeometryBytes,Pa as estimateOsnapPrimitiveBytes,li as exportActiveBatchedLine2Slice,se as exportActiveBatchedSlice,Ye as exportBufferGeometrySlice,es as getHtmlPluginOptions,sa as listDatabaseLayouts,Ha as needsAcExHtmlAccessControl,ho as packHtml,Vo as packHtmlEmbeddedPackage,fo as packHtmlPackage,ko as protectAcExHtmlEncodedSnapshot,vo as resolveAcApHtmlExpiresAt,Z as resolveAcApHtmlExportOptions,de as resolveAcExHtmlLocale,as as resolveViewerRuntimeUrl,Ho as shouldEmbedAcExChunks,jn as snapshotMimeType,Do as splitLayoutIntoSlices,En as splitOsnapPrimitives,Jo as zipAcExPackageFiles};