efficient-shell 4.177.0 → 4.180.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +384 -7
  2. package/dist/{Browser-MFFTBGEB.js → Browser-RZFOKBSF.js} +14 -14
  3. package/dist/Calculator-R5OEHQ67.js +29 -0
  4. package/dist/ConfirmDialog-CMNQZQA3.js +1 -0
  5. package/dist/{CurrencyConverter-KZPE7ZCC.js → CurrencyConverter-AMXUOQR2.js} +7 -7
  6. package/dist/{Documents-ZD227WZC.js → Documents-VD32HWDQ.js} +7 -7
  7. package/dist/{Files-BLGT4RLF.js → Files-NAY3WK6O.js} +31 -31
  8. package/dist/{Notepad-LUK2IFHD.js → Notepad-AHRPMF57.js} +10 -10
  9. package/dist/PdfViewer-3SC3LE4U.js +1 -0
  10. package/dist/{PomodoroTimer-LHPV6QXG.js → PomodoroTimer-LE6J2KUU.js} +26 -26
  11. package/dist/Preview-OKR5QRQP.js +188 -0
  12. package/dist/{Sidebar-4GIZSTD5.js → Sidebar-BQ4P5LBI.js} +21 -21
  13. package/dist/Spreadsheet-RME4IQ43.js +37 -0
  14. package/dist/{Stock-XSDFN7U2.js → Stock-GWVG2INU.js} +4 -4
  15. package/dist/{Weather-7YDUDMCO.js → Weather-APBCG4TO.js} +14 -14
  16. package/dist/{WorldClock-Q2JHBKLS.js → WorldClock-2LMZYKWR.js} +7 -7
  17. package/dist/apps/index.d.ts +4 -2
  18. package/dist/apps/index.js +1 -1
  19. package/dist/bin/ui-check.js +1 -1
  20. package/dist/{chunk-L3U2R7DH.js → chunk-3DGTIWZP.js} +1 -1
  21. package/dist/{chunk-AZO5NPB4.js → chunk-4VTHXNGZ.js} +625 -625
  22. package/dist/{chunk-KS7OSQ3Y.js → chunk-5ZDM6WIC.js} +11 -11
  23. package/dist/{chunk-E2D54MVV.js → chunk-6CFBF543.js} +2 -2
  24. package/dist/{chunk-LCTSBQBJ.js → chunk-7WZEFHPS.js} +1 -1
  25. package/dist/chunk-BSJIBRWC.js +1 -0
  26. package/dist/chunk-C3QOHMR6.js +1 -0
  27. package/dist/{chunk-YJRC6IKD.js → chunk-CIXQKCFA.js} +4 -4
  28. package/dist/{chunk-Q7UGGJ5X.js → chunk-FORN7LG7.js} +1 -1
  29. package/dist/chunk-J3LIIIHJ.js +1 -0
  30. package/dist/{chunk-7H6Q5TNN.js → chunk-KDRAU4XQ.js} +8 -8
  31. package/dist/{chunk-ZOPYAOUP.js → chunk-KVOFUFPP.js} +1 -1
  32. package/dist/{chunk-KDHXRJIX.js → chunk-LK7V32MR.js} +1 -1
  33. package/dist/{chunk-TZ2BPFCT.js → chunk-N6STBYXR.js} +111 -111
  34. package/dist/{chunk-54OP3M3K.js → chunk-NHIGOEZF.js} +1 -1
  35. package/dist/{chunk-PE6MTNFO.js → chunk-PE4F4MJE.js} +4 -4
  36. package/dist/chunk-R7EBJKN2.js +69 -0
  37. package/dist/chunk-RQOP5JAJ.js +9 -0
  38. package/dist/{chunk-AI6HQ55O.js → chunk-SVO3ES2E.js} +1 -1
  39. package/dist/{chunk-RKR5V4QR.js → chunk-T4CFSGSL.js} +6 -6
  40. package/dist/{chunk-N6BJG6AL.js → chunk-UAIVAA5X.js} +11 -11
  41. package/dist/{chunk-REXHKIIJ.js → chunk-WNEO7TSP.js} +1 -1
  42. package/dist/{chunk-XJYXKO7K.js → chunk-ZAE6ROV7.js} +15 -15
  43. package/dist/file-intake/index.js +1 -1
  44. package/dist/i18n/index.d.ts +3 -2
  45. package/dist/i18n/index.js +1 -1
  46. package/dist/{index-BS_HzJCc.d.ts → index-HAwjA-hn.d.ts} +25 -4
  47. package/dist/index.d.ts +3 -3
  48. package/dist/index.js +656 -656
  49. package/dist/locales/zh-Hans.d.ts +59 -0
  50. package/dist/locales/zh-Hans.js +1 -0
  51. package/dist/map/index.js +3 -3
  52. package/dist/page-tabs/index.js +4 -4
  53. package/dist/pdf/index.js +1 -1
  54. package/dist/{strings-C3kt6WTH.d.ts → strings-ZbotP_I6.d.ts} +368 -0
  55. package/dist/ui/index.d.ts +2 -2
  56. package/dist/ui/index.js +1 -1
  57. package/package.json +6 -1
  58. package/dist/Calculator-AGQQYMMZ.js +0 -29
  59. package/dist/ConfirmDialog-6PVUVYXZ.js +0 -1
  60. package/dist/PdfViewer-RKRGO7Q2.js +0 -1
  61. package/dist/Preview-5CALO6PW.js +0 -187
  62. package/dist/Spreadsheet-F3VBCPHF.js +0 -37
  63. package/dist/chunk-3YTHR7IC.js +0 -1
  64. package/dist/chunk-4PCIZFDR.js +0 -9
  65. package/dist/chunk-MFXG5BWL.js +0 -1
  66. package/dist/chunk-VIIBZ6DE.js +0 -69
@@ -1,187 +0,0 @@
1
- import{PdfViewer as e,ToolbarSlotContext as t,PanelActions as n}from"./chunk-KS7OSQ3Y.js";import{ImageAnnotator_default as r}from"./chunk-VIIBZ6DE.js";import{AboutApp as i}from"./chunk-4PCIZFDR.js";import{peekPdfPreviewStage as o,claimPdfPreviewStage as s,PDF_PREVIEW_UPDATE_EVENT as a}from"./chunk-ESL5TDNA.js";import{WindowTitle as l,getActiveModalId as c}from"./chunk-TZ2BPFCT.js";import"./chunk-DSSLOQDW.js";import"./chunk-ZOPYAOUP.js";import"./chunk-MFXG5BWL.js";import{toast_default as d}from"./chunk-L3U2R7DH.js";import"./chunk-YJRC6IKD.js";import"./chunk-5A7MWTXX.js";import"./chunk-OGXU7QFW.js";import"./chunk-XJYXKO7K.js";import"./chunk-AA4TMQOS.js";import"./chunk-AFYQTVZO.js";import"./chunk-HZZNJHRH.js";import{registerModalEscapeInterceptor as u}from"./chunk-X4FJ54PP.js";import"./chunk-D65T4H6J.js";import"./chunk-3YTHR7IC.js";import"./chunk-YKZHOXI4.js";import{useRef as p,useState as h,useEffect as m}from"react";import{jsxs as x,jsx as y,Fragment as f}from"react/jsx-runtime";var g=!1;function b(e,t){return e?.url&&e.url!==t.url&&e.url.startsWith("blob:")&&URL.revokeObjectURL(e.url),t}function w(){const n=p(void 0);void 0===n.current&&(n.current=o());const[r,u]=h(n.current?.data??null);m(()=>{const e=n.current;null!=e&&(s(e),u(t=>t===e.data?t:b(t,e.data)))},[]),m(()=>{const e=n.current?.token;if(null==e)return;const t=t=>{const n=t.detail;n&&n.token===e&&u(e=>b(e,n.data))};return window.addEventListener(a,t),()=>window.removeEventListener(a,t)},[]);const g=p(void 0);m(()=>{g.current=r?.url},[r?.url]);const w=p(null);m(()=>(null!==w.current&&(clearTimeout(w.current),w.current=null),()=>{const e=g.current;e?.startsWith("blob:")&&(w.current=setTimeout(()=>URL.revokeObjectURL(e),0))}),[]);const k=r?.filename?(N=r.filename).length>24?`${N.slice(0,23)}…`:N:"Untitled";var N;const L=p(null),A=p(null),[M,E]=h(null),[S,z]=h(!1),R=p(0),T=()=>L.current?.click(),F=()=>{R.current=0,z(!1)},I=e=>{const t=e.closest("[data-modal-id]");return!t||c()===t.dataset.modalId};m(()=>{const e=()=>F(),t=()=>F(),n=e=>{"Escape"===e.key&&F()};return window.addEventListener("dragend",e),window.addEventListener("drop",t),window.addEventListener("keydown",n),()=>{window.removeEventListener("dragend",e),window.removeEventListener("drop",t),window.removeEventListener("keydown",n)}},[]);const P=e=>{const t=(e.name.split(".").pop()||"").toLowerCase(),n="pdf"===t?"pdf":"dxf"===t?"dxf":["jpg","jpeg","png","gif","webp","svg","avif","bmp"].includes(t)?"image":["stp","step","stl","obj","gltf","glb","3mf","iges","igs","ply","fbx"].includes(t)?"3d":void 0;if(!n)return void("dwg"===t?d.error("DWG files need server-side conversion. Convert to PDF or DXF first."):d.error(`Unsupported file type: .${t||"unknown"}`));const r=URL.createObjectURL(e);u(t=>(t?.url?.startsWith("blob:")&&t.url!==r&&URL.revokeObjectURL(t.url),{url:r,filename:e.name,kind:n}))},B=/* @__PURE__ */x("div",{className:"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0",children:[
2
- /* @__PURE__ */y("input",{ref:L,type:"file",accept:".pdf,.dxf,.jpg,.jpeg,.png,.gif,.webp,.svg,.avif,.bmp,.stp,.step,.stl,.obj,.gltf,.glb,.3mf,.iges,.igs,.ply,.fbx",onChange:e=>{const t=e.target.files?.[0];t&&P(t),L.current&&(L.current.value="")},className:"hidden"}),
3
- /* @__PURE__ */x("button",{onClick:T,className:"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors flex items-center gap-1",children:[
4
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776"})}),"Open"]}),
5
- /* @__PURE__ */y("span",{className:"text-[10px] text-gray-400 ml-1",children:"PDF · DXF · 3D · Images"}),r?.filename&&/* @__PURE__ */x(f,{children:[
6
- /* @__PURE__ */y("div",{className:"h-4 w-px bg-gray-300 mx-1"}),
7
- /* @__PURE__ */y("span",{className:"text-xs font-medium text-gray-700 truncate max-w-[200px]",title:r.filename,children:r.filename})]}),
8
- /* @__PURE__ */y("div",{ref:E,className:"ml-auto flex items-center gap-1 text-xs"})]});let H;return H=r?r.converting||!r.url?/* @__PURE__ */y(v,{filename:r.filename,message:r.convertingMessage}):"dxf"===r.kind?/* @__PURE__ */y(C,{url:r.url,filename:r.filename,onDownload:r.onDownload,onEmail:r.onEmail},r.url):"3d"===r.kind?/* @__PURE__ */y(D,{url:r.url,filename:r.filename,onDownload:r.onDownload,onEmail:r.onEmail},r.url):"image"===r.kind?/* @__PURE__ */y(j,{url:r.url,filename:r.filename,onDownload:r.onDownload,onEmail:r.onEmail},r.url):/* @__PURE__ */y(e,{url:r.url,filename:r.filename,onDownload:r.onDownload,onEmail:r.onEmail},r.url):/* @__PURE__ */x("div",{className:"flex flex-1 flex-col items-center justify-center text-gray-500 text-sm gap-3 p-8 text-center",children:[
9
- /* @__PURE__ */y("svg",{className:"h-12 w-12 text-gray-300",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z"})}),
10
- /* @__PURE__ */x("p",{className:"font-medium text-gray-700",children:["Drop a file here, or click ",
11
- /* @__PURE__ */y("button",{onClick:T,className:"text-blue-600 hover:underline",children:"Open"}),"."]}),
12
- /* @__PURE__ */x("div",{className:"text-xs text-gray-500 max-w-sm",children:[
13
- /* @__PURE__ */y("p",{className:"font-semibold uppercase tracking-wide text-[10px] text-gray-400 mb-1",children:"Supported formats"}),
14
- /* @__PURE__ */x("ul",{className:"space-y-0.5",children:[
15
- /* @__PURE__ */x("li",{children:[
16
- /* @__PURE__ */y("span",{className:"font-mono text-gray-700",children:".pdf"})," — multi-page document viewer"]}),
17
- /* @__PURE__ */x("li",{children:[
18
- /* @__PURE__ */y("span",{className:"font-mono text-gray-700",children:".dxf"})," — vector CAD drawings (optional ",
19
- /* @__PURE__ */y("span",{className:"font-mono",children:"dxf-viewer"})," peer dep)"]}),
20
- /* @__PURE__ */x("li",{children:[
21
- /* @__PURE__ */y("span",{className:"font-mono text-gray-700",children:".stp .step .stl .obj .gltf .glb .3mf .iges"})," — 3D models (optional ",
22
- /* @__PURE__ */y("span",{className:"font-mono",children:"online-3d-viewer"})," peer dep)"]}),
23
- /* @__PURE__ */x("li",{children:[
24
- /* @__PURE__ */y("span",{className:"font-mono text-gray-700",children:".jpg .jpeg .png .gif .webp .svg .avif .bmp"})," — raster images"]})]}),
25
- /* @__PURE__ */y("p",{className:"mt-2 text-[11px] text-gray-400 italic",children:"DWG files need to be converted to PDF or DXF first (server-side)."})]})]}),/* @__PURE__ */x("div",{className:"relative flex flex-col h-full",ref:A,onDragEnter:e=>{e.dataTransfer?.types?.includes?.("Files")&&I(e.currentTarget)&&(e.preventDefault(),R.current++,S||z(!0))},onDragOver:e=>{e.dataTransfer?.types?.includes?.("Files")&&I(e.currentTarget)&&e.preventDefault()},onDragLeave:()=>{R.current>0&&R.current--,0===R.current&&z(!1)},onDrop:e=>{I(e.currentTarget)?(e=>{e.preventDefault(),F();const t=e.dataTransfer.files?.[0];t&&P(t)})(e):F()},children:[
26
- /* @__PURE__ */y(l,{title:`${k} - Preview`}),
27
- /* @__PURE__ */y(i,{app:"preview"}),B,
28
- /* @__PURE__ */y(t.Provider,{value:M,children:/* @__PURE__ */y("div",{className:"flex-1 min-h-0",children:H})}),S&&/* @__PURE__ */y("div",{className:"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20",children:/* @__PURE__ */y("div",{className:"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg",children:"Drop to open"})})]})}function v({filename:e,message:t}){/* @__PURE__ */
29
- return x("div",{className:"flex flex-col items-center justify-center h-full bg-gray-100 gap-4 px-8",children:[
30
- /* @__PURE__ */x("div",{className:"flex flex-col items-center gap-3",children:[
31
- /* @__PURE__ */x("svg",{className:"h-12 w-12 text-blue-500 animate-spin",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,children:[
32
- /* @__PURE__ */y("circle",{cx:"12",cy:"12",r:"10",strokeOpacity:"0.2"}),
33
- /* @__PURE__ */y("path",{d:"M22 12a10 10 0 0 1-10 10",strokeLinecap:"round"})]}),
34
- /* @__PURE__ */y("div",{className:"text-base font-semibold tracking-wide text-gray-700 uppercase",children:t||"Converting file"}),
35
- /* @__PURE__ */y("div",{className:"text-xs text-gray-400 truncate max-w-md",children:e})]}),
36
- /* @__PURE__ */y("div",{className:"w-72 h-1.5 rounded-full bg-gray-200 overflow-hidden",children:/* @__PURE__ */y("div",{className:"h-full w-1/3 bg-blue-500 rounded-full animate-pulse",style:{animation:"preview-bar 1.4s ease-in-out infinite"}})}),
37
- /* @__PURE__ */y("style",{children:"@keyframes preview-bar { 0% { transform: translateX(-110%); } 100% { transform: translateX(310%); } }"})]})}var k=["https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/Roboto-LightItalic.ttf","https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NotoSansDisplay-SemiCondensedLightItalic.ttf","https://cdn.jsdelivr.net/gh/vagran/dxf-viewer-example-src@master/src/assets/fonts/NanumGothic-Regular.ttf"],N={l:"LINE",line:"LINE",pl:"PLINE",pline:"PLINE",ex:"EXTEND",extend:"EXTEND",tr:"TRIM",trim:"TRIM",e:"ERASE",erase:"ERASE",m:"MOVE",move:"MOVE",co:"COPY",cp:"COPY",copy:"COPY",o:"OFFSET",offset:"OFFSET",f:"FILLET",fillet:"FILLET",cha:"CHAMFER",chamfer:"CHAMFER",x:"EXPLODE",explode:"EXPLODE",mi:"MIRROR",mirror:"MIRROR",ro:"ROTATE",rotate:"ROTATE",sc:"SCALE",scale:"SCALE",s:"STRETCH",stretch:"STRETCH",ar:"ARRAY",array:"ARRAY",rec:"RECTANG",rectang:"RECTANG",rectangle:"RECTANG",c:"CIRCLE",circle:"CIRCLE",a:"ARC",arc:"ARC",el:"ELLIPSE",ellipse:"ELLIPSE",t:"MTEXT",mt:"MTEXT",mtext:"MTEXT",text:"TEXT",b:"BLOCK",block:"BLOCK",i:"INSERT",insert:"INSERT",ha:"HATCH",hatch:"HATCH"},L="Commands: DI distance · DIM/DLI linear dim · H / V force axis · <number> lock Δ · U undo pick · Z fit · LA layers · Esc exit";function C({url:e,filename:t,onDownload:r,onEmail:i}){const o=p(null),s=p(null),[a,l]=h(!0),[d,g]=h(null),[b,w]=h([]),[v,C]=h(!1),[A,M]=h(!0),[E,S]=h(!1),[D,j]=h("auto"),[R,T]=h(null),[F,I]=h(null),[P,B]=h(null),[H,O]=h(""),W=p(D),X=p(P);m(()=>{W.current=D},[D]),m(()=>{X.current=P},[P]);const V=p(null),$=p(null),U=p(null),[Y,_]=h(""),[G,Z]=h(null),q=p(""),K=p(null),J=p(null),Q=p(null);m(()=>{let t=!1,n=null;return l(!0),g(null),w([]),(async()=>{let r;try{r=(await(import("dxf-viewer"))).DxfViewer}catch(e){return void(t||(g("dxf-viewer is not installed in this app."),l(!1)))}if(!t&&o.current)try{if(await new Promise(e=>{const t=()=>{const n=o.current?.getBoundingClientRect();n&&n.width>4&&n.height>4?e():requestAnimationFrame(t)};t()}),t||!o.current)return;const i={autoResize:!0},a=r.DefaultOptions?.clearColor;"function"==typeof a?.clone&&(i.clearColor=a.clone().setHex(16777215)),n=new r(o.current,i),s.current=n;const c="undefined"!=typeof window&&window.__REACT_OS_SHELL_DXF_FONTS__||k;if(await n.Load({url:e,fonts:c,workerFactory:null}),t)return;try{const e=n.GetLayers?.()??[];Array.isArray(e)&&w(e.map(e=>({name:e.name,displayName:e.displayName??e.name,color:"number"==typeof e.color?e.color:void 0,visible:!0})))}catch{}const d=()=>{try{const e=o.current?.getBoundingClientRect();e&&e.width>0&&e.height>0&&n.SetSize?.(Math.round(e.width),Math.round(e.height));const t=n.GetBounds?.(),r=n.GetOrigin?.();t&&r&&n.FitView(t.minX-r.x,t.maxX-r.x,t.minY-r.y,t.maxY-r.y),n.Render?.()}catch(e){console.warn("[Preview] DXF refit failed",e)}};d(),requestAnimationFrame(d),l(!1)}catch(e){t||(g(e?.message||"Failed to render DXF."),l(!1))}})(),()=>{t=!0;try{n?.Destroy?.()}catch{}s.current=null}},[e]),m(()=>{if(!A||a)return;const e=setTimeout(()=>M(!1),5e3);return()=>clearTimeout(e)},[A,a]);const ee=b.map(e=>e.visible?"1":"0").join("");m(()=>{const e=s.current;if(a||d||!e)return;const t=e.GetScene?.(),n=e.GetCamera?.(),r=e.GetCanvas?.();if(!(t&&n&&r&&o.current))return;const i=()=>{const e=Q.current;e&&(e.overlay&&e.overlay.parentElement&&e.overlay.parentElement.removeChild(e.overlay),Q.current=null)};if(!E)return i(),T(null),void I(null);const l=document.createElement("div");l.style.cssText="position:absolute;inset:0;pointer-events:none;z-index:5;",o.current.appendChild(l);const c=document.createElementNS("http://www.w3.org/2000/svg","svg");c.setAttribute("style","position:absolute;inset:0;width:100%;height:100%;pointer-events:none;");const u=document.createElementNS("http://www.w3.org/2000/svg","defs"),p=document.createElementNS("http://www.w3.org/2000/svg","marker");p.setAttribute("id","dxf-measure-arrow"),p.setAttribute("viewBox","0 0 10 10"),p.setAttribute("refX","9"),p.setAttribute("refY","5"),p.setAttribute("markerWidth","6"),p.setAttribute("markerHeight","6"),p.setAttribute("orient","auto-start-reverse");const h=document.createElementNS("http://www.w3.org/2000/svg","path");h.setAttribute("d","M 0 0 L 10 5 L 0 10 z"),h.setAttribute("fill","#ff8800"),p.appendChild(h),u.appendChild(p),c.appendChild(u),l.appendChild(c);const m=()=>{const e=document.createElementNS("http://www.w3.org/2000/svg","line");return e.setAttribute("stroke","#ff8800"),e.setAttribute("stroke-width","1"),e.setAttribute("stroke-dasharray","6,4"),e.setAttribute("opacity","0.55"),e.style.display="none",c.appendChild(e),e},x=m(),y=m(),f=document.createElementNS("http://www.w3.org/2000/svg","line");f.setAttribute("stroke","#ff8800"),f.setAttribute("stroke-width","1"),f.setAttribute("opacity","0.85"),f.style.display="none",c.appendChild(f);const g=document.createElementNS("http://www.w3.org/2000/svg","line");g.setAttribute("stroke","#ff8800"),g.setAttribute("stroke-width","1"),g.setAttribute("opacity","0.85"),g.style.display="none",c.appendChild(g);const b=document.createElementNS("http://www.w3.org/2000/svg","line");b.setAttribute("stroke","#ff8800"),b.setAttribute("stroke-width","1.5"),b.setAttribute("stroke-linecap","round"),b.style.display="none",c.appendChild(b);const w=document.createElementNS("http://www.w3.org/2000/svg","line");w.setAttribute("stroke","#ff8800"),w.setAttribute("stroke-width","1.5"),w.setAttribute("stroke-linecap","round"),w.style.display="none",c.appendChild(w);const v=document.createElement("div");v.style.cssText="position:absolute;transform:translate(-50%,-50%);pointer-events:none;display:none;";const k="http://www.w3.org/2000/svg",N=document.createElementNS(k,"svg");N.setAttribute("width","22"),N.setAttribute("height","22"),N.setAttribute("viewBox","0 0 22 22"),N.setAttribute("style","overflow:visible;display:block"),v.appendChild(N);const L=e=>{const t=document.createElementNS(k,"g");return e(t),t.style.display="none",N.appendChild(t),t},C=L(e=>{const t=document.createElementNS(k,"rect");t.setAttribute("x","4"),t.setAttribute("y","4"),t.setAttribute("width","14"),t.setAttribute("height","14"),t.setAttribute("fill","rgba(255,255,255,0.9)"),t.setAttribute("stroke","#ff8800"),t.setAttribute("stroke-width","1.8"),e.appendChild(t)}),A=L(e=>{const t=(e,t,n,r)=>{const i=document.createElementNS(k,"line");return i.setAttribute("x1",String(e)),i.setAttribute("y1",String(t)),i.setAttribute("x2",String(n)),i.setAttribute("y2",String(r)),i.setAttribute("stroke","#ff8800"),i.setAttribute("stroke-width","2.2"),i.setAttribute("stroke-linecap","round"),i};e.appendChild(t(4,4,18,18)),e.appendChild(t(18,4,4,18))}),M=L(e=>{const t=document.createElementNS(k,"polygon");t.setAttribute("points","4,4 18,4 4,18 18,18"),t.setAttribute("fill","rgba(255,255,255,0.9)"),t.setAttribute("stroke","#ff8800"),t.setAttribute("stroke-width","1.8"),t.setAttribute("stroke-linejoin","round"),e.appendChild(t)}),D=L(e=>{const t=document.createElementNS(k,"polygon");t.setAttribute("points","11,3 19,18 3,18"),t.setAttribute("fill","rgba(255,255,255,0.9)"),t.setAttribute("stroke","#ff8800"),t.setAttribute("stroke-width","1.8"),t.setAttribute("stroke-linejoin","round"),e.appendChild(t)}),j=L(e=>{const t=document.createElementNS(k,"circle");t.setAttribute("cx","11"),t.setAttribute("cy","11"),t.setAttribute("r","7"),t.setAttribute("fill","rgba(255,255,255,0.9)"),t.setAttribute("stroke","#ff8800"),t.setAttribute("stroke-width","1.8"),e.appendChild(t);const n=(e,t,n,r)=>{const i=document.createElementNS(k,"line");return i.setAttribute("x1",String(e)),i.setAttribute("y1",String(t)),i.setAttribute("x2",String(n)),i.setAttribute("y2",String(r)),i.setAttribute("stroke","#ff8800"),i.setAttribute("stroke-width","1.6"),i.setAttribute("stroke-linecap","round"),i};e.appendChild(n(6.5,6.5,15.5,15.5)),e.appendChild(n(15.5,6.5,6.5,15.5))});l.appendChild(v),Q.current={picks:[],rawSecondClick:null,overlay:l,svg:c,line:b,fixedLine:w,fixedLabel:null,refLine:x,refLineV:y,extLineA:f,extLineB:g,markers:[],label:null,snap:v,segs:null,nodes:null};const R=n?.position?.constructor??t?.position?.constructor??null;let F=!1;const P=(e,t)=>{if(!R)return{x:0,y:0};const i=new R(e,t,0).project(n),o=r.clientWidth,s=r.clientHeight;return{x:(i.x+1)/2*o,y:(1-i.y)/2*s}};(()=>{try{const e=Q.current;if(!e)return;const n=[],r=[];let i=!1;const o=e=>{const t=e?.attributes?.instanceTransform0,n=e?.attributes?.instanceTransform1;if(t&&n){const e=[],r=Math.min(t.count,n.count);for(let i=0;i<r;i++)e.push([t.getX(i),t.getY(i),t.getZ(i),n.getX(i),n.getY(i),n.getZ(i)]);return e}const r=e?.attributes?.instanceTransform;if(r){const e=[];for(let t=0;t<r.count;t++)e.push([1,0,r.getX(t),0,1,r.getY(t)]);return e}return[[1,0,0,0,1,0]]},s=e=>{const t=!!e?.isLineSegments;if(!t&&!!!e?.isPoints)return;const s=e.geometry,a=s?.attributes?.position;if(!a)return;const l=o(s);if(t){const e=s.index,t=Math.floor((e?e.count:a.count)/2);for(let r=0;r<t;r++){const t=e?e.getX(2*r):2*r,o=e?e.getX(2*r+1):2*r+1,s=a.getX(t),c=a.getY(t),d=a.getX(o),u=a.getY(o);if(Number.isFinite(s+c+d+u))for(const e of l){if(n.length>=16e5)return void(i=!0);const t=e[0]*s+e[1]*c+e[2],r=e[3]*s+e[4]*c+e[5],o=e[0]*d+e[1]*u+e[2],a=e[3]*d+e[4]*u+e[5];t===o&&r===a||n.push(t,r,o,a)}}}else for(let e=0;e<a.count;e++){const t=a.getX(e),n=a.getY(e);if(Number.isFinite(t+n))for(const e of l)r.push(e[0]*t+e[1]*n+e[2],e[3]*t+e[4]*n+e[5])}};"function"==typeof t.traverseVisible?t.traverseVisible(s):t.traverse(s),e.segs=new Float64Array(n),e.nodes=new Float64Array(r),i&&console.warn("[Preview] DXF snap cache truncated at 400000 segments — snapping may miss some geometry."),F=!0}catch{}})();const B=(e,t,n,r,i,o,s,a)=>{const l=(n-e)*(a-o)-(r-t)*(s-i);if(Math.abs(l)<1e-9)return null;const c=((i-e)*(a-o)-(o-t)*(s-i))/l,d=((i-e)*(r-t)-(o-t)*(n-e))/l,u=1e-4;return c<-u||c>1+u||d<-u||d>1+u?null:{px:e+c*(n-e),py:t+c*(r-t),t:c}},H=()=>{const e=document.createElement("div");return e.style.cssText="position:absolute;width:10px;height:10px;border-radius:50%;background:#ff8800;border:2px solid #fff;box-shadow:0 0 0 1px rgba(0,0,0,0.25);transform:translate(-50%,-50%);pointer-events:none;",l.appendChild(e),e},O=(e,t,n)=>{const r=P(t,n);e.style.left=`${r.x}px`,e.style.top=`${r.y}px`},Y=()=>{const e=Q.current;if(!e||!e.rawSecondClick||e.picks.length<2)return;const t=e.picks[0],n=e.rawSecondClick,r=X.current,i=W.current;if(null===r||!Number.isFinite(r)||"horizontal"!==i&&"vertical"!==i)e.picks[1]={x:n.x,y:n.y};else if("horizontal"===i){const i=n.x>=t.x?1:-1;e.picks[1]={x:t.x+i*Math.abs(r),y:n.y}}else{const i=n.y>=t.y?1:-1;e.picks[1]={x:n.x,y:t.y+i*Math.abs(r)}}},_=(e,t)=>{const n=W.current;return"auto"!==n?n:e&&t?Math.abs(t.x-e.x)>=Math.abs(t.y-e.y)?"horizontal":"vertical":"horizontal"},G=()=>{const e=Q.current;if(!e)return;Y();const t=W.current,n=X.current,i=null!==n&&Number.isFinite(n)&&("horizontal"===t||"vertical"===t);e.markers[0]&&O(e.markers[0],e.picks[0].x,e.picks[0].y),e.markers[1]&&O(e.markers[1],e.picks[1].x,e.picks[1].y);const o=(t,n,i)=>{if(!t)return;if(!i||e.picks.length<1)return void(t.style.display="none");const o=e.picks[0],s=r.clientWidth,a=r.clientHeight,l=4*Math.hypot(s,a),c=P(o.x,o.y),d=P(o.x+n.dx,o.y+n.dy),u=l/(Math.hypot(d.x-c.x,d.y-c.y)||1),p=P(o.x-n.dx*u,o.y-n.dy*u),h=P(o.x+n.dx*u,o.y+n.dy*u);t.setAttribute("x1",String(p.x)),t.setAttribute("y1",String(p.y)),t.setAttribute("x2",String(h.x)),t.setAttribute("y2",String(h.y)),t.style.display=""};let s="horizontal"===t,a="vertical"===t;if("auto"===t)if(e.picks.length>=2){const t=_(e.picks[0],e.picks[1]);s="horizontal"===t,a="vertical"===t}else s=!0,a=!0;if(o(e.refLine,{dx:1,dy:0},s),o(e.refLineV,{dx:0,dy:1},a),2===e.picks.length){const t=e.picks[0],o=e.picks[1],s=_(t,o),a=(()=>{const e=Q.current,t=e.picks[0],n=e.picks[1],r=_(t,n),i=W.current,o=X.current;return null!==o&&Number.isFinite(o)&&"horizontal"===i?{from:{x:n.x,y:t.y},to:{x:n.x,y:n.y}}:null!==o&&Number.isFinite(o)&&"vertical"===i?{from:{x:t.x,y:n.y},to:{x:n.x,y:n.y}}:"horizontal"===r?{from:t,to:{x:n.x,y:t.y}}:"vertical"===r?{from:t,to:{x:t.x,y:n.y}}:{from:t,to:n}})(),l=P(a.from.x,a.from.y),c=P(a.to.x,a.to.y);e.line.setAttribute("x1",String(l.x)),e.line.setAttribute("y1",String(l.y)),e.line.setAttribute("x2",String(c.x)),e.line.setAttribute("y2",String(c.y)),e.line.setAttribute("marker-start","url(#dxf-measure-arrow)"),e.line.setAttribute("marker-end","url(#dxf-measure-arrow)");const d=Math.hypot(c.x-l.x,c.y-l.y);if(e.line.style.display=d>.5?"":"none",i&&e.fixedLine){const i="horizontal"===s?{x:o.x,y:t.y}:{x:t.x,y:o.y},a=P(t.x,t.y),l=P(i.x,i.y);e.fixedLine.setAttribute("x1",String(a.x)),e.fixedLine.setAttribute("y1",String(a.y)),e.fixedLine.setAttribute("x2",String(l.x)),e.fixedLine.setAttribute("y2",String(l.y)),e.fixedLine.setAttribute("marker-start","url(#dxf-measure-arrow)"),e.fixedLine.setAttribute("marker-end","url(#dxf-measure-arrow)"),e.fixedLine.style.display="";const c=q();c.textContent=z(Math.abs(n));const d=(a.x+l.x)/2,u=(a.y+l.y)/2;c.style.left=`${d}px`,c.style.top=`${u}px`;const p=r.clientWidth,h=r.clientHeight;c.style.display=d<0||u<0||d>p||u>h?"none":""}else e.fixedLine&&(e.fixedLine.style.display="none"),e.fixedLabel&&(e.fixedLabel.style.display="none");const u=e.extLineA,p=e.extLineB;if(!i&&"horizontal"===s&&Math.abs(o.y-t.y)>1e-9){const e=P(o.x,t.y),n=P(o.x,o.y);p.setAttribute("x1",String(e.x)),p.setAttribute("y1",String(e.y)),p.setAttribute("x2",String(n.x)),p.setAttribute("y2",String(n.y)),p.style.display="",u.style.display="none"}else if(!i&&"vertical"===s&&Math.abs(o.x-t.x)>1e-9){const e=P(t.x,o.y),n=P(o.x,o.y);p.setAttribute("x1",String(e.x)),p.setAttribute("y1",String(e.y)),p.setAttribute("x2",String(n.x)),p.setAttribute("y2",String(n.y)),p.style.display="",u.style.display="none"}else u.style.display="none",p.style.display="none";if(e.label){const t=(l.x+c.x)/2,n=(l.y+c.y)/2;e.label.style.left=`${t}px`,e.label.style.top=`${n}px`;const i=r.clientWidth,o=r.clientHeight;e.label.style.display=t<0||n<0||t>i||n>o?"none":"",d<=.5&&(e.label.style.display="none")}}else e.line.style.display="none",e.fixedLine&&(e.fixedLine.style.display="none"),e.fixedLabel&&(e.fixedLabel.style.display="none"),e.extLineA&&(e.extLineA.style.display="none"),e.extLineB&&(e.extLineB.style.display="none")},q=()=>{const e=Q.current;if(e.fixedLabel)return e.fixedLabel;const t=document.createElement("div");return t.style.cssText="position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.75);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;",l.appendChild(t),e.fixedLabel=t,t};let K=0,J=0,ee=0,te=!1,ne=!1,re=null;const ie=e=>{const t=e?.detail;t&&0===t.domEvent?.button&&(K=t.canvasCoord.x,J=t.canvasCoord.y,ee=performance.now(),ne=!1,te=!0)},oe=e=>{const t=r.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;te&&(n-K)**2+(i-J)**2>16&&(ne=!0);const o=Q.current;var s;if(o&&o.snap)if(te&&ne)o.snap.style.display="none";else if(re=((e,t)=>{const n=Q.current;if(!n||!F||!n.segs)return null;const r=P(0,0),i=P(1,0),o=P(0,1),s=i.x-r.x,a=i.y-r.y,l=o.x-r.x,c=o.y-r.y,d=s*c-l*a;if(!d)return null;const u=((e-r.x)*c-(t-r.y)*l)/d,p=((t-r.y)*s-(e-r.x)*a)/d,h=18/(Math.hypot(s,a)||1),m=18/(Math.hypot(l,c)||1),x=u-h,y=u+h,f=p-m,g=p+m,b=324;let w=null,v=b,k=null,N=b,L=null,C=b,A=null,M=b;const E=[],S=n.segs;for(let n=0;n<S.length;n+=4){const i=S[n],o=S[n+1],d=S[n+2],u=S[n+3];if(i<x&&d<x||i>y&&d>y||o<f&&u<f||o>g&&u>g)continue;const p=r.x+s*i+l*o,h=r.y+a*i+c*o,m=r.x+s*d+l*u,A=r.y+a*d+c*u;let M=!1,z=e-p,D=t-h,j=z*z+D*D;j<b&&(M=!0,j<v&&(v=j,w={sx:i,sy:o,type:"endpoint"})),z=e-m,D=t-A,j=z*z+D*D,j<b&&(M=!0,j<v&&(v=j,w={sx:d,sy:u,type:"endpoint"})),z=e-(p+m)/2,D=t-(h+A)/2,j=z*z+D*D,j<b&&(M=!0,j<N&&(N=j,k={sx:(i+d)/2,sy:(o+u)/2,type:"midpoint"}));const R=m-p,T=A-h,F=R*R+T*T;if(F>0){const n=((e-p)*R+(t-h)*T)/F;n>0&&n<1&&(z=e-(p+n*R),D=t-(h+n*T),j=z*z+D*D,j<b&&(M=!0,j<C&&(C=j,L={sx:i+n*(d-i),sy:o+n*(u-o),type:"line"})))}M&&E.push({ax:i,ay:o,bx:d,by:u,apx:p,apy:h,bpx:m,bpy:A})}const z=n.nodes;if(z)for(let n=0;n<z.length;n+=2){const i=z[n],o=z[n+1];if(i<x||i>y||o<f||o>g)continue;const d=e-(r.x+s*i+l*o),u=t-(r.y+a*i+c*o),p=d*d+u*u;p<v&&(v=p,w={sx:i,sy:o,type:"node"})}for(let n=0;n<E.length;n++){const r=E[n];for(let i=n+1;i<E.length;i++){const n=E[i],o=B(r.apx,r.apy,r.bpx,r.bpy,n.apx,n.apy,n.bpx,n.bpy);if(!o)continue;const s=e-o.px,a=t-o.py,l=s*s+a*a;l>=b||l>=M||(M=l,A={sx:r.ax+o.t*(r.bx-r.ax),sy:r.ay+o.t*(r.by-r.ay),type:"intersection"})}}return(A&&w?M<v-1?A:w:A??w)??k??L})(n,i),re){const e=P(re.sx,re.sy);o.snap.style.left=`${e.x}px`,o.snap.style.top=`${e.y}px`,o.snap.style.display="",s=re.type,C.style.display="endpoint"===s?"":"none",A.style.display="intersection"===s?"":"none",M.style.display="line"===s?"":"none",D.style.display="midpoint"===s?"":"none",j.style.display="node"===s?"":"none"}else o.snap.style.display="none"},se=e=>{if(!te)return;te=!1;const t=performance.now()-ee;if(ne||t>350)return;const n=e?.detail?.position;if(!n)return;const r=re?{x:re.sx,y:re.sy}:{x:n.x,y:n.y};de(r)},ae=()=>{const e=Q.current;if(!e||2!==e.picks.length)return;Y();const t=e.picks[0],n=e.picks[1],r=W.current,i=_(t,n),o=X.current,s=null!==o&&Number.isFinite(o)&&("horizontal"===r||"vertical"===r);let a,c,d="",u=i;const p=Math.abs(n.x-t.x),h=Math.abs(n.y-t.y);if(s&&"horizontal"===r?(a=h,d=" ↕",u="vertical",c=`ΔY = ${z(h)} with ΔX locked to ${z(Math.abs(o))}`):s&&"vertical"===r?(a=p,d=" ↔",u="horizontal",c=`ΔX = ${z(p)} with ΔY locked to ${z(Math.abs(o))}`):"horizontal"===i?(a=p,d=" ↔",c=`Linear dimension = ${z(p)} (ΔX)`):"vertical"===i?(a=h,d=" ↕",c=`Linear dimension = ${z(h)} (ΔY)`):(a=Math.hypot(n.x-t.x,n.y-t.y),c=`Distance = ${z(a)} ΔX = ${z(p)} ΔY = ${z(h)}`),!Number.isFinite(a))return T(null),I(null),void(e.label&&(e.label.style.opacity="0"));T(a),I(u),Z(c);const m=(()=>{const e=Q.current;if(e.label)return e.label;const t=document.createElement("div");return t.style.cssText="position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.95);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;",l.appendChild(t),e.label=t,t})();m.style.opacity="1",m.textContent=`${z(a)}${d}`};V.current=()=>{ae(),G()};const le=e=>{e.line.style.display="none",e.fixedLine&&(e.fixedLine.style.display="none"),e.fixedLabel&&(e.fixedLabel.style.display="none"),e.extLineA&&(e.extLineA.style.display="none"),e.extLineB&&(e.extLineB.style.display="none"),e.label&&(e.label.style.opacity="0"),T(null),I(null)},ce=()=>{const e=Q.current;if(e){for(const t of e.markers)t.parentElement?.removeChild(t);e.markers=[],e.picks=[],e.rawSecondClick=null,e.refLine&&(e.refLine.style.display="none"),e.refLineV&&(e.refLineV.style.display="none"),le(e)}};$.current=ce,U.current=()=>{const e=Q.current;if(!e||0===e.picks.length)return;e.picks.pop();const t=e.markers.pop();t?.parentElement?.removeChild(t),e.rawSecondClick=null,le(e),G()};const de=e=>{const t=Q.current;t&&(2===t.picks.length&&ce(),0===t.picks.length?(t.picks.push({x:e.x,y:e.y}),t.markers.push(H())):(t.rawSecondClick={x:e.x,y:e.y},t.picks.push({x:e.x,y:e.y}),t.markers.push(H()),ae()),G())},ue=e=>{"Escape"===e.key&&S(!1)};r.style.cursor="crosshair";try{e.Subscribe?.("pointerdown",ie)}catch{}try{e.Subscribe?.("pointerup",se)}catch{}try{e.Subscribe?.("viewChanged",G)}catch{}return r.addEventListener("pointermove",oe),window.addEventListener("keydown",ue),()=>{r.style.cursor="";try{e.Unsubscribe?.("pointerdown",ie)}catch{}try{e.Unsubscribe?.("pointerup",se)}catch{}try{e.Unsubscribe?.("viewChanged",G)}catch{}r.removeEventListener("pointermove",oe),window.removeEventListener("keydown",ue),V.current=null,$.current=null,U.current=null,i(),T(null),I(null)}},[E,a,d,ee]),m(()=>{V.current?.()},[D,P]);const te=e=>{w(t=>t.map(t=>{if(t.visible===e)return t;try{s.current?.ShowLayer?.(t.name,e)}catch{}return{...t,visible:e}}))},ne=()=>{try{const e=s.current,t=e?.GetBounds?.(),n=e?.GetOrigin?.();t&&n?e.FitView(t.minX-n.x,t.maxX-n.x,t.minY-n.y,t.maxY-n.y):e?.FitView?.(),e?.Render?.()}catch{}};m(()=>{const e=e=>{if(e.defaultPrevented||e.metaKey||e.ctrlKey||e.altKey)return;if(1!==e.key.length||" "===e.key)return;const t=e.target;if(t&&("INPUT"===t.tagName||"TEXTAREA"===t.tagName||t.isContentEditable))return;const n=J.current;if(!n)return;const r=n.closest("[data-modal-id]");r&&c()!==r.dataset.modalId||K.current?.focus()};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]);const re=p(Y),ie=p(E);m(()=>{re.current=Y},[Y]),m(()=>{ie.current=E},[E]),m(()=>u(()=>{const e=J.current;if(!e)return!1;const t=e.closest("[data-modal-id]");return!(!t||c()!==t.dataset.modalId)&&(re.current?(_(""),Z("*Cancel*"),!0):!!ie.current&&(S(!1),Z("Measure off."),!0))}),[]);const oe="px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1";/* @__PURE__ */
38
- return x("div",{ref:J,className:"flex flex-col h-full",children:[
39
- /* @__PURE__ */x(n,{children:[
40
- /* @__PURE__ */x("button",{onClick:()=>C(e=>!e),className:oe+(v?" bg-gray-200":""),title:"Toggle layer visibility",disabled:0===b.length,children:[
41
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6.429 9.75L2.25 12l4.179 2.25m0-4.5l5.571 3 5.571-3m-11.142 0L2.25 7.5 12 2.25l9.75 5.25-4.179 2.25m0 0L21.75 12l-4.179 2.25m0 0l4.179 2.25L12 21.75 2.25 16.5l4.179-2.25m11.142 0l-5.571 3-5.571-3"})}),"Layers ",b.length>0&&/* @__PURE__ */x("span",{className:"text-gray-400",children:["(",b.filter(e=>e.visible).length,"/",b.length,")"]})]}),
42
- /* @__PURE__ */y("button",{onClick:()=>M(e=>!e),className:oe,title:"How to navigate",children:/* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z"})})}),
43
- /* @__PURE__ */x("button",{onClick:()=>S(e=>!e),className:oe+(E?" bg-gray-200":""),title:E?"Stop measuring (Esc)":"Measure distance — click two points on the drawing, or type DI / DIM below",children:[
44
- /* @__PURE__ */x("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:[
45
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 14.25l6-6 6 6 4.5-4.5M9.75 8.25v3M12.75 11.25v3M15.75 14.25v3"}),
46
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.25 18.75h19.5"})]}),"Measure"]}),E&&/* @__PURE__ */x(f,{children:[
47
- /* @__PURE__ */x("div",{className:"flex items-stretch h-7 rounded border border-gray-200 overflow-hidden text-[11px] font-semibold",children:[
48
- /* @__PURE__ */y("button",{onClick:()=>j("auto"),className:"px-2 transition-colors "+("auto"===D?"bg-orange-500 text-white":"bg-white text-gray-600 hover:bg-gray-50"),title:"Auto — AutoCAD DIMLINEAR: measures ΔX or ΔY, whichever is larger between the two picks",children:"Auto"}),
49
- /* @__PURE__ */y("button",{onClick:()=>j("horizontal"),className:"px-2 transition-colors "+("horizontal"===D?"bg-orange-500 text-white":"bg-white text-gray-600 hover:bg-gray-50"),title:"Horizontal — distance along the X axis between two picks (AutoCAD DIMLINEAR horizontal)",children:"H"}),
50
- /* @__PURE__ */y("button",{onClick:()=>j("vertical"),className:"px-2 transition-colors "+("vertical"===D?"bg-orange-500 text-white":"bg-white text-gray-600 hover:bg-gray-50"),title:"Vertical — distance along the Y axis between two picks (AutoCAD DIMLINEAR vertical)",children:"V"}),
51
- /* @__PURE__ */y("button",{onClick:()=>j("point"),className:"px-2 transition-colors "+("point"===D?"bg-orange-500 text-white":"bg-white text-gray-600 hover:bg-gray-50"),title:"Point — straight-line (Euclidean) distance between two picks (AutoCAD DIST)",children:"Point"})]}),("horizontal"===D||"vertical"===D)&&/* @__PURE__ */x("div",{className:"flex items-center gap-1",children:[
52
- /* @__PURE__ */y("input",{type:"number",inputMode:"decimal",step:"any",value:H,placeholder:"horizontal"===D?"fix Δx":"fix Δy",onChange:e=>{const t=e.target.value;if(O(t),""===t.trim())B(null);else{const e=parseFloat(t);B(Number.isFinite(e)&&0!==e?e:null)}},className:"h-7 w-20 px-1.5 text-[11px] font-mono rounded border border-gray-200 bg-white text-gray-700 focus:outline-none focus:border-orange-400",title:"Lock the second pick's axis coord to first pick + this value (mm). The reported measurement becomes the perpendicular distance."}),null!==P&&/* @__PURE__ */y("button",{onClick:()=>{B(null),O("")},className:"text-gray-400 hover:text-gray-600 text-[11px] px-1",title:"Clear fixed distance",children:"×"})]})]}),E&&null!==R&&/* @__PURE__ */x("div",{className:"px-2 py-1 text-[11px] font-mono font-semibold text-orange-600 bg-orange-50 border border-orange-200 rounded whitespace-nowrap",title:"horizontal"===F?"Horizontal distance (Δx) between the two picked points"+("auto"===D?" — Auto resolved to the X axis":""):"vertical"===F?"Vertical distance (Δy) between the two picked points"+("auto"===D?" — Auto resolved to the Y axis":""):"Straight-line distance between the two picked points",children:[z(R),"horizontal"===F?" ↔":"vertical"===F?" ↕":""]}),
53
- /* @__PURE__ */y("button",{onClick:ne,className:oe,title:"Fit drawing to view",children:"Fit"}),
54
- /* @__PURE__ */x("button",{onClick:r??(()=>{const n=document.createElement("a");n.href=e,n.download=t,n.click()}),className:oe,children:[
55
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"})}),"Download"]}),i&&/* @__PURE__ */x("button",{onClick:i,className:oe,children:[
56
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75"})}),"Email"]})]}),
57
- /* @__PURE__ */x("div",{className:"relative flex-1 bg-white min-h-0",children:[
58
- /* @__PURE__ */y("div",{ref:o,style:{width:"100%",height:"100%"}}),v&&b.length>0&&/* @__PURE__ */x("div",{className:"absolute top-2 right-2 w-64 max-h-[70%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs",children:[
59
- /* @__PURE__ */x("div",{className:"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50",children:[
60
- /* @__PURE__ */y("span",{className:"font-medium text-gray-700",children:"Layers"}),
61
- /* @__PURE__ */x("div",{className:"flex items-center gap-1",children:[
62
- /* @__PURE__ */y("button",{onClick:()=>te(!0),className:"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600",children:"All"}),
63
- /* @__PURE__ */y("button",{onClick:()=>te(!1),className:"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600",children:"None"}),
64
- /* @__PURE__ */y("button",{onClick:()=>C(!1),className:"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600",title:"Close",children:"×"})]})]}),
65
- /* @__PURE__ */y("div",{className:"overflow-y-auto py-1",children:b.map(e=>{/* @__PURE__ */return x("label",{className:"flex items-center gap-2 px-2 py-1 hover:bg-gray-100 cursor-pointer",children:[
66
- /* @__PURE__ */y("input",{type:"checkbox",checked:e.visible,onChange:()=>{return t=e.name,void w(e=>e.map(e=>{if(e.name!==t)return e;const n=!e.visible;try{s.current?.ShowLayer?.(t,n)}catch{}return{...e,visible:n}}));var t},className:"h-3.5 w-3.5"}),
67
- /* @__PURE__ */y("span",{className:"inline-block h-3 w-3 rounded-sm border border-gray-300 shrink-0",style:{background:(t=e.color,"number"!=typeof t?"#999":"#"+t.toString(16).padStart(6,"0"))}}),
68
- /* @__PURE__ */y("span",{className:"truncate text-gray-700",title:e.displayName,children:e.displayName||e.name})]},e.name);var t})})]}),A&&!a&&!d&&/* @__PURE__ */x("div",{className:"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none",children:[
69
- /* @__PURE__ */x("span",{className:"flex items-center gap-1",children:[
70
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122"})}),"Drag to pan"]}),
71
- /* @__PURE__ */y("span",{className:"text-white/40",children:"•"}),
72
- /* @__PURE__ */x("span",{className:"flex items-center gap-1",children:[
73
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.8,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6"})}),"Scroll to zoom"]}),
74
- /* @__PURE__ */y("span",{className:"text-white/40",children:"•"}),
75
- /* @__PURE__ */y("span",{children:"Fit to reset"}),
76
- /* @__PURE__ */y("span",{className:"text-white/40",children:"•"}),
77
- /* @__PURE__ */x("span",{children:["Type ",
78
- /* @__PURE__ */y("span",{className:"font-mono font-semibold",children:"DI"})," / ",
79
- /* @__PURE__ */y("span",{className:"font-mono font-semibold",children:"DIM"})," to measure"]})]}),a&&/* @__PURE__ */y("div",{className:"absolute inset-0 flex items-center justify-center bg-white/80 text-sm text-gray-500",children:"Loading drawing…"}),d&&/* @__PURE__ */y("div",{className:"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center",children:d})]}),
80
- /* @__PURE__ */x("div",{className:"shrink-0 border-t border-gray-200 bg-gray-50",children:[G&&/* @__PURE__ */y("div",{className:"px-2.5 pt-1 text-[11px] font-mono text-gray-500 truncate",title:G,children:G}),
81
- /* @__PURE__ */x("div",{className:"flex items-center gap-1.5 px-2.5 h-7",children:[
82
- /* @__PURE__ */y("span",{className:"text-[11px] font-mono font-semibold text-gray-400 select-none",children:">"}),
83
- /* @__PURE__ */y("input",{ref:K,value:Y,onChange:e=>_(e.target.value),onKeyDown:e=>{"Enter"===e.key||" "===e.key?(e.preventDefault(),(e=>{const t=e.trim()||q.current;if(_(""),!t)return;const n=t.toLowerCase().split(/\s+/)[0],r=()=>{q.current=t},i=(e,t)=>{S(!0),j(e),$.current?.(),Z(t),r()};if(/^-?(\d+\.?\d*|\.\d+)$/.test(n))if(!E||"horizontal"!==D&&"vertical"!==D)Z("Fixed distances apply in H or V mode — type H or V first.");else{const e=parseFloat(n);e?(O(n),B(e),Z(`Δ${"horizontal"===D?"X":"Y"} locked to ${z(Math.abs(e))} — the label shows the perpendicular distance`)):(O(""),B(null),Z("Fixed distance cleared."))}else switch(n){case"di":case"dist":case"mea":case"measuregeom":i("point","DIST — click two points; straight-line distance (Esc to exit)");break;case"dim":case"dli":case"dimlin":case"dimlinear":i("auto","DIMLINEAR — click two points; measures ΔX or ΔY, whichever is larger (H / V to force)");break;case"h":case"hor":case"horizontal":S(!0),j("horizontal"),Z("Horizontal — ΔX between the two picks"),r();break;case"v":case"ver":case"vertical":S(!0),j("vertical"),Z("Vertical — ΔY between the two picks"),r();break;case"au":case"auto":S(!0),j("auto"),Z("Auto (DIMLINEAR) — measures along the dominant axis of the two picks"),r();break;case"measure":S(!E),Z(E?"Measure off.":"Measure on — click two points."),r();break;case"u":case"undo":U.current?.(),Z("Last pick removed."),r();break;case"z":case"ze":case"zoom":case"fit":case"zoomextents":ne(),Z("Zoom extents."),r();break;case"la":case"layer":case"layers":C(e=>!e),Z("Layer panel toggled."),r();break;case"off":case"clear":B(null),O(""),$.current?.(),Z("Measurement cleared."),r();break;case"?":case"help":Z(L);break;default:{const e=N[n];Z(e?`${e} is a drawing command — Preview is a read-only viewer. Measuring: DI, DIM, H, V (? for help)`:`Unknown command "${n.toUpperCase()}" — try DI, DIM, H, V, Z, LA (? for help)`)}}})(Y)):"Escape"===e.key&&(Y?(e.stopPropagation(),_(""),Z("*Cancel*")):e.target.blur())},placeholder:"Type a command — DI, DIM, H, V, Z, LA (? for help)",spellCheck:!1,autoComplete:"off",className:"flex-1 min-w-0 bg-transparent text-[11px] font-mono text-gray-700 focus:outline-none placeholder:text-gray-300"})]})]})]})}var A="https://cdn.jsdelivr.net/npm/online-3d-viewer@0.18.0/libs/";function M(e,t=0){return{id:e.GetId?.()??0,name:e.GetName?.()||(0===t?"Root":"Node"),isMeshNode:!!e.IsMeshNode?.(),meshIndices:e.GetMeshIndices?.()??[],children:(e.GetChildNodes?.()??[]).map(e=>M(e,t+1))}}function E(e,t){t.add(e.id);for(const n of e.children)E(n,t)}function S(e,t){const n=/^#?([0-9a-f]{6})$/i.exec(t),r=n?parseInt(n[1],16):0;return new e.RGBColor(r>>16&255,r>>8&255,255&r)}function z(e){return e>=1e3?`${(e/1e3).toFixed(3)} m`:`${e.toFixed(2)} mm`}function D({url:e,filename:t,onDownload:r,onEmail:i}){const o=p(null),s=p(null),a=p(null),[l,c]=h(!0),[d,u]=h(null),[f,b]=h(!0),[w,v]=h(null),[k,N]=h({}),[L,C]=h(/* @__PURE__ */new Set),[D,j]=h("#f5f6f8"),[R,T]=h(!0),[F,I]=h("#000000"),[P,B]=h(1),[H,O]=h(!1),[W,X]=h(!1),[V,$]=h(!1),[U,Y]=h(!1),[_,G]=h("x"),[Z,q]=h(!1),[K,J]=h(.5),[Q,ee]=h(0),[te,ne]=h(!1),[re,ie]=h("point"),[oe,se]=h(null),ae=p(null),le=p(null);m(()=>{let n=!1,r=null,i=null;return c(!0),u(null),v(null),N({}),C(/* @__PURE__ */new Set),(async()=>{let l;try{l=await(import("online-3d-viewer"))}catch{return void(n||(u("online-3d-viewer is not installed in this app. Add it to enable 3D file viewing."),c(!1)))}if(a.current=l,!n&&o.current&&(await new Promise(e=>{const t=()=>{const n=o.current?.getBoundingClientRect();n&&n.width>4&&n.height>4?e():requestAnimationFrame(t)};t()}),!n&&o.current))try{const a="undefined"!=typeof window&&window.__REACT_OS_SHELL_O3DV_LIBS__||A;l.SetExternalLibLocation?.(a),function(){if(g)return;if("undefined"==typeof HTMLCanvasElement)return;g=!0;const e=HTMLCanvasElement.prototype.getContext;HTMLCanvasElement.prototype.getContext=function(t,n){return"webgl"!==t&&"webgl2"!==t&&"experimental-webgl"!==t||(n={...n||{},stencil:!0}),e.call(this,t,n)},console.info("[Preview] section: canvas getContext patched (force stencil=true)")}(),r=new l.EmbeddedViewer(o.current,{backgroundColor:new l.RGBAColor(245,246,248,255),defaultColor:new l.RGBColor(180,188,200),edgeSettings:new l.EdgeSettings(!0,new l.RGBColor(0,0,0),1),onModelLoaded:()=>{if(!n){try{const e=r.GetModel?.(),t=e?.GetRootNode?.();if(t){const e=M(t);v(e);const n={[e.id]:!0};for(const t of e.children)n[t.id]=!0;N(n)}}catch(e){console.warn("[Preview] mesh tree extraction failed",e)}c(!1)}},onModelLoadFailed:()=>{n||(u("Failed to load 3D model."),c(!1))}}),s.current=r;const d=new l.InputFile(t,l.FileSource.Url,e);r.LoadModelFromInputFiles([d]),o.current&&"undefined"!=typeof ResizeObserver&&(i=new ResizeObserver(()=>{try{const e=s.current;e?.Resize?e.Resize():e?.viewer?.Resize&&e.viewer.Resize(),e?.viewer?.Render?.()}catch{}}),i.observe(o.current))}catch(e){n||(u(e?.message||"Failed to load 3D model."),c(!1))}})(),()=>{n=!0;try{i?.disconnect()}catch{}try{r?.Destroy?.()}catch{}s.current=null}},[e,t]),m(()=>{const e=s.current;if(e?.viewer)try{const t=e=>{if(e.userData?.__sectionHelper)return;const t=e.userData?.originalMeshInstance??e.userData,n=t?.id?.nodeId??t?.nodeId;"number"==typeof n&&(e.visible=!L.has(n))};e.viewer.mainModel?.EnumerateMeshesAndLines?.(t),e.viewer.mainModel?.EnumerateEdges?.(t),e.viewer.Render?.()}catch(e){console.warn("[Preview] visibility update failed",e)}},[L,w]),m(()=>{const e=a.current,t=s.current;if(e&&t?.viewer)try{t.viewer.SetEdgeSettings(new e.EdgeSettings(R,S(e,F),P));const n=le.current;if(n){const e=[];t.viewer.mainModel?.EnumerateEdges?.(t=>{t.userData?.__sectionHelper&&e.push(t)});for(const t of e)t.parent?.remove(t),t.geometry?.dispose?.(),t.material?.dispose?.();const r=n.plane,i=e=>{e&&!n.materialState.has(e)&&(n.materialState.set(e,{clippingPlanes:e.clippingPlanes,clipShadows:e.clipShadows}),e.clippingPlanes=[r],e.clipShadows=!0,e.needsUpdate=!0)};t.viewer.mainModel?.EnumerateEdges?.(e=>{const t=e.material;if(Array.isArray(t))for(const e of t)i(e);else i(t)})}t.viewer.Render?.()}catch{}},[R,F,P]),m(()=>{const e=a.current,t=s.current;if(e&&t?.viewer)try{const n=S(e,D);t.viewer.SetBackgroundColor(new e.RGBAColor(n.r,n.g,n.b,255)),t.viewer.Render?.()}catch{}},[D]),m(()=>{const e=s.current;if(!e?.viewer||l)return;const t=e.viewer.renderer,n=e.viewer.scene;if(!t||!n)return;if(le.current){const e=le.current;for(const[t,n]of e.materialState.entries())t.clippingPlanes=n.clippingPlanes,t.clipShadows=n.clipShadows,t.needsUpdate=!0;for(const t of e.helpers)t.parent?.remove(t),t.material?.dispose?.();e.capMesh&&(n.remove(e.capMesh),e.capMesh.geometry?.dispose?.(),e.capMesh.material?.dispose?.()),le.current=null}if(!U)return t.localClippingEnabled=!1,void e.viewer.Render?.();const r=e.viewer.GetBoundingBox?.(()=>!0);if(!r)return;const i=[];if(e.viewer.mainModel?.EnumerateMeshes?.(e=>{e.userData?.__sectionHelper||i.push(e)}),!i.length)return t.localClippingEnabled=!1,void e.viewer.Render?.();const o=i[0],a=o.constructor,c=o.material?.constructor,d=o.geometry?.constructor,u=o.geometry?.attributes?.position?.constructor;a&&c&&d&&u||console.warn("[Preview] section: missing THREE constructors, falling back to no cap");const p=7681;let h=!0;try{const e=t.getContext?.(),n=e?.getContextAttributes?.();h=!1!==n?.stencil,t.autoClearStencil=!0,console.info("[Preview] section: stencil buffer =",h,"targets =",i.length)}catch{}t.localClippingEnabled=!0;const m={normal:{x:0,y:0,z:-1},constant:0,clone:function e(){const t={normal:{x:this.normal.x,y:this.normal.y,z:this.normal.z},constant:this.constant};return t.clone=e,t}},x=[],y=/* @__PURE__ */new Map,f=e=>{e&&!y.has(e)&&(y.set(e,{clippingPlanes:e.clippingPlanes,clipShadows:e.clipShadows}),e.clippingPlanes=[m],e.clipShadows=!0,e.needsUpdate=!0)};for(const e of i){const t=e.material;if(Array.isArray(t))for(const e of t)f(e);else f(t);const n=Array.isArray(t)?t[0]:t;if(a&&h&&n?.clone){const t=(t,r)=>{const i=n.clone();i.depthWrite=!1,i.depthTest=!1,i.colorWrite=!1,i.stencilWrite=!0,i.stencilFunc=519,i.stencilFail=r,i.stencilZFail=r,i.stencilZPass=r,i.side=t,i.transparent=!1,i.clippingPlanes=[m],i.clipShadows=!0,i.needsUpdate=!0;const o=new a(e.geometry,i);o.matrixAutoUpdate=!1,o.renderOrder=1,o.userData.__sectionHelper=!0,e.add(o),x.push(o)};t(1,7682),t(0,7683)}}e.viewer.mainModel?.EnumerateEdges?.(e=>{const t=e.material;if(Array.isArray(t))for(const e of t)f(e);else f(t)});let g=null;const b=i[0]?.material&&(Array.isArray(i[0].material)?i[0].material[0]:i[0].material);if(h&&a&&d&&u&&b?.clone){const e=r.max.x-r.min.x,t=r.max.y-r.min.y,i=r.max.z-r.min.z,o=2*Math.max(e,t,i,1)/2,s=new d,l=new Float32Array([-o,-o,0,o,-o,0,o,o,0,-o,o,0]),c=new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1]);s.setAttribute("position",new u(l,3)),s.setAttribute("normal",new u(c,3)),s.setIndex([0,1,2,0,2,3]);const h=b.clone(),m=b.color?.getHex?.()??11844808;h.emissive?.setHex?.(m),"emissiveIntensity"in h&&(h.emissiveIntensity=.25),h.side=2,h.transparent=!1,h.opacity=1,h.stencilWrite=!0,h.stencilRef=0,h.stencilFunc=517,h.stencilFail=p,h.stencilZFail=p,h.stencilZPass=p,h.clippingPlanes=[],h.polygonOffset=!0,h.polygonOffsetFactor=-1,h.polygonOffsetUnits=-1,h.needsUpdate=!0,g=new a(s,h),g.renderOrder=2,g.userData.__sectionHelper=!0,n.add(g)}le.current={plane:m,capMesh:g,helpers:x,materialState:y,bbox:r},console.info("[Preview] section: helpers =",x.length,"cap =",!!g),e.viewer.Render?.()},[U,l,w]),m(()=>{const e=s.current,t=le.current;if(e?.viewer&&t&&U)try{const n=t.bbox,r="x"===_?0:"y"===_?1:2,i=[n.min.x,n.min.y,n.min.z][r],o=i+([n.max.x,n.max.y,n.max.z][r]-i)*K,s=Q*Math.PI/180,a=Math.cos(s),l=Math.sin(s),c=Z?-1:1;let d=0,u=0,p=0;"x"===_?(d=c*a,p=c*l):"y"===_?(u=c*a,d=c*l):(p=c*a,u=c*l);const h={x:(n.min.x+n.max.x)/2,y:(n.min.y+n.max.y)/2,z:(n.min.z+n.max.z)/2},m="x"===_?o:h.x,x="y"===_?o:h.y,y="z"===_?o:h.z;if(t.plane.normal.x=d,t.plane.normal.y=u,t.plane.normal.z=p,t.plane.constant=-(d*m+u*x+p*y),t.capMesh){const e=h.x,n=h.y,r=h.z,i=d*e+u*n+p*r+t.plane.constant,o=e-d*i,s=n-u*i,a=r-p*i;t.capMesh.position.set(o,s,a),t.capMesh.lookAt?.(o+d,s+u,a+p)}e.viewer.Render?.()}catch(e){console.warn("[Preview] section update failed",e)}},[U,_,Z,K,Q]),m(()=>{const e=s.current;if(!e?.viewer||l||!o.current)return;const t=e.viewer.renderer,n=e.viewer.scene,r=t?.domElement;if(!t||!n||!r)return;let i=null;if(e.viewer.mainModel?.EnumerateMeshes?.(e=>{i||e.userData?.__sectionHelper||e.userData?.__measureHelper||(i=e)}),!i)return;const c=i.position.constructor,d=i.constructor,u=(Array.isArray(i.material)?i.material[0]:i.material)?.constructor,p=i.geometry.constructor,h=i.geometry.attributes?.position?.constructor;if(!(c&&d&&u&&p&&h))return;let m=null,x=null;n.traverse(e=>{if(m&&x)return;if(!e?.isLineSegments)return;m=e.constructor;const t=Array.isArray(e.material)?e.material[0]:e.material;t?.constructor&&(x=t.constructor)});const y=()=>{const t=ae.current;if(t){null!==t.rafId&&cancelAnimationFrame(t.rafId);for(const e of t.markers)n.remove(e),e.geometry?.dispose?.(),e.material?.dispose?.();t.line&&(n.remove(t.line),t.line.geometry?.dispose?.(),t.line.material?.dispose?.()),t.label&&t.label.parentElement&&t.label.parentElement.removeChild(t.label),ae.current=null,e.viewer.Render?.()}};if(!te)return y(),void se(null);ae.current={points:[],normals:[],markers:[],line:null,label:null,rafId:null};const f=a.current,g=f?.IntersectionMode?.MeshOnly??1,b=e.viewer.GetBoundingBox?.(()=>!0),w=b?Math.sqrt((b.max.x-b.min.x)**2+(b.max.y-b.min.y)**2+(b.max.z-b.min.z)**2):100,v=Math.max(.005*w,.2),k=e=>{const t=[],r=[];for(let e=0;e<=12;e++){const n=e/12*Math.PI;for(let e=0;e<=16;e++){const r=e/16*Math.PI*2;t.push(v*Math.sin(n)*Math.cos(r),v*Math.cos(n),v*Math.sin(n)*Math.sin(r))}}for(let e=0;e<12;e++)for(let t=0;t<16;t++){const n=17*e+t,i=n+16+1;r.push(n,i,n+1,i,i+1,n+1)}const i=new p;i.setAttribute("position",new h(new Float32Array(t),3)),i.setIndex(r),i.computeVertexNormals?.();const o=new u;o.color?.setHex?.(16746496),o.depthTest=!1,o.depthWrite=!1,o.transparent=!0,o.opacity=.95;const s=new d(i,o);return s.position.copy(e),s.renderOrder=9999,s.userData.__measureHelper=!0,n.add(s),s},N=()=>{const t=ae.current;t&&((()=>{const t=ae.current;if(!t||t.points.length<2||!t.label)return;const n=e.viewer.camera;if(!n)return;const i=t.points[0],o=t.points[1],s=new c((i.x+o.x)/2,(i.y+o.y)/2,(i.z+o.z)/2).clone();s.project?.(n);const a=r.getBoundingClientRect(),l=(s.x+1)/2*a.width,d=(1-s.y)/2*a.height;t.label.style.left=`${l}px`,t.label.style.top=`${d}px`;const u=l<0||d<0||l>a.width||d>a.height;t.label.style.opacity=s.z>1||u?"0":"1"})(),t.rafId=requestAnimationFrame(N))};ae.current.rafId=requestAnimationFrame(N);let L=0,C=0,A=0,M=!1,E=!1;const S=t=>{if(!e.viewer.camera)return;const i=r.getBoundingClientRect(),s={x:t.clientX-i.left,y:t.clientY-i.top},a=e.viewer.GetMeshIntersectionUnderMouse?.(g,s);if(!a)return;const l=ae.current,y=new c(a.point.x,a.point.y,a.point.z),f=(e=>{const t=e?.face?.normal,n=e?.object;if(!t||!n)return null;try{const e=new c(t.x,t.y,t.z);return e.transformDirection?.(n.matrixWorld),{x:e.x,y:e.y,z:e.z}}catch{return{x:t.x,y:t.y,z:t.z}}})(a);if(2===l.points.length){for(const e of l.markers)n.remove(e),e.geometry?.dispose?.(),e.material?.dispose?.();l.line&&(n.remove(l.line),l.line.geometry?.dispose?.(),l.line.material?.dispose?.()),l.label&&(l.label.style.opacity="0"),l.points=[],l.markers=[],l.line=null,l.normals=[],se(null)}if(l.points.push(y),l.normals.push(f),"perp"===re){const e=((e,t)=>{const r=e?.geometry,i=r?.attributes?.position;if(!r||!i||!t?.face?.normal)return null;const o=i.array,s=r.index?r.index.array:null,a=new c(t.point.x,t.point.y,t.point.z);e.worldToLocal?.(a);const l=t.face.normal,m=-(l.x*a.x+l.y*a.y+l.z*a.z);r.computeBoundingBox?.();const x=r.boundingBox,y=x?Math.sqrt((x.max.x-x.min.x)**2+(x.max.y-x.min.y)**2+(x.max.z-x.min.z)**2):100,f=Math.max(.001*y,.005),g=s?s.length/3:i.count/3,b=[],w=new c;for(let t=0;t<g;t++){const n=s?s[3*t]:3*t,r=s?s[3*t+1]:3*t+1,i=s?s[3*t+2]:3*t+2,a=o[3*n],c=o[3*n+1],d=o[3*n+2],u=o[3*r],p=o[3*r+1],h=o[3*r+2],x=o[3*i],y=o[3*i+1],g=o[3*i+2],v=u-a,k=p-c,N=h-d,L=x-a,C=y-c,A=g-d;let M=k*A-N*C,E=N*L-v*A,S=v*C-k*L;const z=Math.sqrt(M*M+E*E+S*S);if(0===z)continue;if(M/=z,E/=z,S/=z,M*l.x+E*l.y+S*l.z<.9995)continue;const D=(a+u+x)/3,j=(c+p+y)/3,R=(d+h+g)/3;if(!(Math.abs(l.x*D+l.y*j+l.z*R+m)>f))for(const[t,n,r]of[[a,c,d],[u,p,h],[x,y,g]])w.set?.(t,n,r),e.localToWorld?.(w),b.push(w.x,w.y,w.z)}if(0===b.length)return null;const v=new p;v.setAttribute("position",new h(new Float32Array(b),3)),v.computeVertexNormals?.();const k=new u;k.color?.setHex?.(16746496),k.transparent=!0,k.opacity=.45,k.depthWrite=!1,k.polygonOffset=!0,k.polygonOffsetFactor=-2,k.polygonOffsetUnits=-2;const N=new d(v,k);return N.renderOrder=9998,N.userData.__measureHelper=!0,n.add(N),N})(a.object,a);l.markers.push(e??k(y))}else l.markers.push(k(y));if(2===l.points.length){const e=l.points[0];let t,r=l.points[1],i="";if("perp"===re){const n=l.normals[0]??l.normals[1];if(n){const o=Math.sqrt(n.x*n.x+n.y*n.y+n.z*n.z)||1,s=n.x/o,a=n.y/o,d=n.z/o,u=(r.x-e.x)*s+(r.y-e.y)*a+(r.z-e.z)*d,p=new c(e.x+s*u,e.y+a*u,e.z+d*u);l.points[1]=p,r=p,t=Math.abs(u),i=" ⊥"}else{const n=r.x-e.x,i=r.y-e.y,o=r.z-e.z;t=Math.sqrt(n*n+i*i+o*o)}}else{const n=r.x-e.x,i=r.y-e.y,o=r.z-e.z;t=Math.sqrt(n*n+i*i+o*o)}l.line=((e,t)=>{const r=new p;r.setAttribute("position",new h(new Float32Array([e.x,e.y,e.z,t.x,t.y,t.z]),3));const i=new(m??d)(r,new(x??u)({color:16746496,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.95}));return i.renderOrder=9998,i.userData.__measureHelper=!0,n.add(i),i})(e,r),se(t);const s=(()=>{const e=ae.current;if(e.label)return e.label;const t=document.createElement("div");return t.style.position="absolute",t.style.left="-9999px",t.style.top="-9999px",t.style.transform="translate(-50%, -50%)",t.style.padding="2px 6px",t.style.fontSize="11px",t.style.fontWeight="600",t.style.fontFamily="system-ui, -apple-system, sans-serif",t.style.background="rgba(255, 136, 0, 0.95)",t.style.color="#fff",t.style.borderRadius="4px",t.style.pointerEvents="none",t.style.whiteSpace="nowrap",t.style.boxShadow="0 1px 4px rgba(0,0,0,0.25)",t.style.zIndex="5",o.current.appendChild(t),e.label=t,t})();s.textContent=`${z(t)}${i}`}e.viewer.Render?.()},D=e=>{0===e.button&&(L=e.clientX,C=e.clientY,A=performance.now(),M=!1,E=!0)},j=e=>{if(!E)return;const t=e.clientX-L,n=e.clientY-C;t*t+n*n>16&&(M=!0)},R=e=>{if(0!==e.button||!E)return;const t=performance.now()-A;E=!1,!M&&t<350&&S(e)},T=e=>{"Escape"===e.key&&ne(!1)};return r.style.cursor="crosshair",r.addEventListener("pointerdown",D),r.addEventListener("pointermove",j),r.addEventListener("pointerup",R),r.addEventListener("pointercancel",R),window.addEventListener("keydown",T),()=>{r.style.cursor="",r.removeEventListener("pointerdown",D),r.removeEventListener("pointermove",j),r.removeEventListener("pointerup",R),r.removeEventListener("pointercancel",R),window.removeEventListener("keydown",T),y(),se(null)}},[te,re,l,w]),m(()=>{if(!f||l)return;const e=setTimeout(()=>b(!1),5e3);return()=>clearTimeout(e)},[f,l]);const ce=e=>{const t=/* @__PURE__ */new Set;E(e,t),C(e=>{const n=new Set(e),r=[...t].some(e=>!n.has(e));for(const e of t)r?n.add(e):n.delete(e);return n})},de=()=>{try{const e=s.current,t=e?.viewer?.GetBoundingSphere?.(()=>!0);t&&e.viewer.FitSphereToWindow(t,!0),e?.viewer?.Render?.()}catch{}};m(()=>{const e=a.current,t=s.current;if(e&&t?.viewer&&!l)try{t.viewer.SetProjectionMode(V?e.ProjectionMode.Perspective:e.ProjectionMode.Orthographic)}catch{}},[V,l]);const ue=e=>{const t=a.current,n=s.current;if(t&&n?.viewer)try{const r=n.viewer.GetBoundingSphere?.(()=>!0);if(!r)return;const i=r.center,o=3*(r.radius||1),s=i.x??0,a=i.y??0,l=i.z??0;let c,d;switch(e){case"top":c=new t.Coord3D(s,a,l+o),d=new t.Coord3D(0,1,0);break;case"front":c=new t.Coord3D(s,a-o,l),d=new t.Coord3D(0,0,1);break;case"side":c=new t.Coord3D(s+o,a,l),d=new t.Coord3D(0,0,1);break;default:{const e=o/Math.sqrt(3);c=new t.Coord3D(s+e,a-e,l+e),d=new t.Coord3D(0,0,1);break}}const u=new t.Coord3D(s,a,l),p=new t.Camera(c,u,d,45);n.viewer.SetCamera(p),n.viewer.AdjustClippingPlanesToSphere?.(r),n.viewer.Render?.()}catch{}},pe=(t.split(".").pop()||"").toUpperCase(),he=(e,t=0)=>{const n=e.children.length>0,r=!1!==k[e.id],i=!L.has(e.id);/* @__PURE__ */
84
- return x("div",{children:[
85
- /* @__PURE__ */x("div",{className:"group flex items-center gap-1 px-1.5 py-1 hover:bg-gray-100 cursor-default text-[12px] text-gray-700",style:{paddingLeft:12*t+6+"px"},children:[n?/* @__PURE__ */y("button",{onClick:()=>{return t=e.id,void N(e=>({...e,[t]:!e[t]}));var t},className:"h-4 w-4 shrink-0 flex items-center justify-center text-gray-500 hover:text-gray-900",title:r?"Collapse":"Expand",children:/* @__PURE__ */y("svg",{className:"h-3 w-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:r?"M19.5 8.25l-7.5 7.5-7.5-7.5":"M8.25 4.5l7.5 7.5-7.5 7.5"})})}):/* @__PURE__ */y("span",{className:"h-4 w-4 shrink-0 flex items-center justify-center",children:/* @__PURE__ */y("span",{className:"h-1 w-1 rounded-full bg-gray-400"})}),
86
- /* @__PURE__ */y("span",{className:"flex-1 truncate "+(i?"":"opacity-40"),title:e.name,children:e.name}),
87
- /* @__PURE__ */y("button",{onClick:()=>{de()},className:"h-4 w-4 shrink-0 text-gray-400 hover:text-gray-900 opacity-0 group-hover:opacity-100 transition-opacity",title:"Fit to view",children:/* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15"})})}),
88
- /* @__PURE__ */y("button",{onClick:()=>ce(e),className:"h-4 w-4 shrink-0 text-gray-500 hover:text-gray-900",title:i?"Hide":"Show",children:i?/* @__PURE__ */x("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:[
89
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z"}),
90
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]}):/* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88"})})})]}),r&&n&&/* @__PURE__ */y("div",{children:e.children.map(e=>he(e,t+1))})]},e.id)},me="h-8 w-8 shrink-0 flex items-center justify-center rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors",xe="h-8 w-8 shrink-0 flex items-center justify-center rounded bg-gray-200 text-gray-900",ye="h-5 w-px bg-gray-300 mx-1";/* @__PURE__ */
91
- return x("div",{className:"flex flex-col h-full bg-white",children:[
92
- /* @__PURE__ */x(n,{children:[
93
- /* @__PURE__ */y("button",{onClick:de,className:me,title:"Fit to view",children:/* @__PURE__ */y("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15"})})}),
94
- /* @__PURE__ */y("div",{className:ye}),
95
- /* @__PURE__ */y("button",{onClick:()=>ue("iso"),className:me,title:"Isometric view",children:/* @__PURE__ */y("span",{className:"text-[10px] font-semibold",children:"ISO"})}),
96
- /* @__PURE__ */y("button",{onClick:()=>ue("top"),className:me,title:"Top view",children:/* @__PURE__ */y("span",{className:"text-[10px] font-semibold",children:"TOP"})}),
97
- /* @__PURE__ */y("button",{onClick:()=>ue("front"),className:me,title:"Front view",children:/* @__PURE__ */y("span",{className:"text-[10px] font-semibold",children:"FRT"})}),
98
- /* @__PURE__ */y("button",{onClick:()=>ue("side"),className:me,title:"Side view",children:/* @__PURE__ */y("span",{className:"text-[10px] font-semibold",children:"SDE"})}),
99
- /* @__PURE__ */y("button",{onClick:()=>$(e=>!e),className:V?"h-8 shrink-0 flex items-center justify-center px-2 rounded bg-gray-200 text-gray-900":"h-8 shrink-0 flex items-center justify-center px-2 rounded text-gray-600 hover:bg-gray-200 hover:text-gray-900 transition-colors",title:V?"Switch to orthographic view":"Switch to perspective view",children:/* @__PURE__ */y("span",{className:"text-[11px] font-semibold whitespace-nowrap",children:V?"Perspective":"Orthographic"})}),
100
- /* @__PURE__ */y("div",{className:ye}),
101
- /* @__PURE__ */y("button",{onClick:()=>{try{const e=s.current,n=e?.viewer?.GetCanvasSize?.()??{width:1280,height:720},r=e?.viewer?.GetImageAsDataUrl?.(n.width,n.height,!1);if(!r)return;const i=document.createElement("a");i.href=r,i.download=`${t.replace(/\.[^.]+$/,"")}-snapshot.png`,i.click()}catch{}},className:me,title:"Save snapshot as PNG",children:/* @__PURE__ */x("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:[
102
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z"}),
103
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z"})]})}),
104
- /* @__PURE__ */y("button",{onClick:()=>b(e=>!e),className:me,title:"How to navigate",children:/* @__PURE__ */y("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z"})})}),
105
- /* @__PURE__ */y("button",{onClick:()=>ne(e=>!e),className:te?xe:me,title:te?"Stop measuring (Esc)":"Measure distance — click two points on the model",children:/* @__PURE__ */x("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:[
106
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 14.25l6-6 6 6 4.5-4.5M9.75 8.25v3M12.75 11.25v3M15.75 14.25v3"}),
107
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.25 18.75h19.5"})]})}),te&&/* @__PURE__ */x("div",{className:"flex items-stretch h-8 rounded border border-gray-200 overflow-hidden",children:[
108
- /* @__PURE__ */y("button",{onClick:()=>ie("point"),className:"px-2 text-[11px] font-semibold transition-colors "+("point"===re?"bg-orange-500 text-white":"bg-white text-gray-600 hover:bg-gray-50"),title:"Point — measure straight-line distance between two picked points",children:"Point"}),
109
- /* @__PURE__ */y("button",{onClick:()=>ie("perp"),className:"px-2 text-[12px] font-semibold transition-colors "+("perp"===re?"bg-orange-500 text-white":"bg-white text-gray-600 hover:bg-gray-50"),title:"Perpendicular — pick two surfaces and measure the perpendicular gap between them",children:"⊥"})]}),te&&null!==oe&&/* @__PURE__ */x("div",{className:"px-2 py-1 text-[11px] font-mono font-semibold text-orange-600 bg-orange-50 border border-orange-200 rounded whitespace-nowrap",title:"perp"===re?"Perpendicular distance between the two picked surfaces":"Straight-line distance between the two picked points",children:[z(oe),"perp"===re?" ⊥":""]}),
110
- /* @__PURE__ */y("div",{className:ye}),
111
- /* @__PURE__ */y("button",{onClick:()=>O(e=>!e),className:H?xe:me,title:"Toggle meshes panel",children:/* @__PURE__ */y("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"})})}),
112
- /* @__PURE__ */y("button",{onClick:()=>X(e=>!e),className:W?xe:me,title:"Toggle display panel",children:/* @__PURE__ */x("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:[
113
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z"}),
114
- /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]})}),
115
- /* @__PURE__ */y("button",{onClick:r??(()=>{const n=document.createElement("a");n.href=e,n.download=t,n.click()}),className:me,title:"Download original file",children:/* @__PURE__ */y("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"})})}),i&&/* @__PURE__ */y("button",{onClick:i,className:me,title:"Email",children:/* @__PURE__ */y("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75"})})})]}),
116
- /* @__PURE__ */y("div",{className:"flex-1 flex min-h-0",children:/* @__PURE__ */x("div",{className:"relative flex-1 min-w-0",style:{background:D},children:[
117
- /* @__PURE__ */y("div",{ref:o,style:{width:"100%",height:"100%"}}),H&&/* @__PURE__ */x("div",{className:"absolute top-2 left-2 w-64 max-h-[80%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs",children:[
118
- /* @__PURE__ */x("div",{className:"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50",children:[
119
- /* @__PURE__ */y("span",{className:"font-medium text-gray-700",children:"Meshes"}),
120
- /* @__PURE__ */y("button",{onClick:()=>O(!1),className:"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600",title:"Close",children:"×"})]}),
121
- /* @__PURE__ */y("div",{className:"flex-1 overflow-y-auto py-1",children:w?he(w):/* @__PURE__ */y("div",{className:"px-3 py-3 text-[11px] text-gray-500 italic",children:l?"Reading model…":"No structure available"})}),w&&/* @__PURE__ */y("div",{className:"px-3 py-1.5 text-[10px] text-gray-500 border-t border-gray-200",children:0===L.size?"All visible":`${L.size} hidden`})]}),f&&!l&&!d&&/* @__PURE__ */x("div",{className:"absolute bottom-3 left-1/2 -translate-x-1/2 bg-gray-900/85 text-white text-[11px] px-3 py-1.5 rounded-full shadow-lg flex items-center gap-3 z-10 pointer-events-none",children:[
122
- /* @__PURE__ */y("span",{children:"Drag to rotate"}),
123
- /* @__PURE__ */y("span",{className:"text-white/40",children:"•"}),
124
- /* @__PURE__ */y("span",{children:"Right-click drag to pan"}),
125
- /* @__PURE__ */y("span",{className:"text-white/40",children:"•"}),
126
- /* @__PURE__ */y("span",{children:"Scroll to zoom"})]}),l&&/* @__PURE__ */x("div",{className:"absolute inset-0 flex flex-col items-center justify-center bg-white/85 text-sm text-gray-600 gap-2",children:[
127
- /* @__PURE__ */x("svg",{className:"h-6 w-6 text-blue-500 animate-spin",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,children:[
128
- /* @__PURE__ */y("circle",{cx:"12",cy:"12",r:"10",strokeOpacity:"0.2"}),
129
- /* @__PURE__ */y("path",{d:"M22 12a10 10 0 0 1-10 10",strokeLinecap:"round"})]}),
130
- /* @__PURE__ */y("span",{children:"Loading 3D model…"}),"STP"===pe||"STEP"===pe?/* @__PURE__ */y("span",{className:"text-[10px] text-gray-400",children:"STEP files load OpenCascade WASM (~5 MB) on first use."}):null]}),d&&/* @__PURE__ */y("div",{className:"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center bg-white/85",children:d}),W&&/* @__PURE__ */x("div",{className:"absolute top-2 right-2 w-64 max-h-[80%] flex flex-col bg-white/95 backdrop-blur border border-gray-200 rounded-md shadow-xl z-10 text-xs",children:[
131
- /* @__PURE__ */x("div",{className:"flex items-center justify-between px-2 py-1.5 border-b border-gray-200 bg-gray-50",children:[
132
- /* @__PURE__ */y("span",{className:"font-medium text-gray-700",children:"Model Display"}),
133
- /* @__PURE__ */y("button",{onClick:()=>X(!1),className:"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600",title:"Close",children:"×"})]}),
134
- /* @__PURE__ */x("div",{className:"flex-1 overflow-y-auto px-3 py-3 space-y-3 text-[12px] text-gray-700",children:[
135
- /* @__PURE__ */x("label",{className:"flex items-center justify-between gap-2",children:[
136
- /* @__PURE__ */y("span",{children:"Background Color"}),
137
- /* @__PURE__ */y("input",{type:"color",value:D,onChange:e=>j(e.target.value),className:"h-6 w-10 rounded border border-gray-300 bg-white"})]}),
138
- /* @__PURE__ */x("label",{className:"flex items-center justify-between gap-2",children:[
139
- /* @__PURE__ */y("span",{children:"Show Edges"}),
140
- /* @__PURE__ */y("button",{onClick:()=>T(e=>!e),role:"switch","aria-checked":R,className:"relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors "+(R?"bg-blue-500":"bg-gray-300"),children:/* @__PURE__ */y("span",{className:"inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform "+(R?"translate-x-[18px]":"translate-x-0.5")})})]}),
141
- /* @__PURE__ */x("label",{className:"flex items-center justify-between gap-2",children:[
142
- /* @__PURE__ */y("span",{className:R?"":"opacity-40",children:"Edge Color"}),
143
- /* @__PURE__ */y("input",{type:"color",value:F,onChange:e=>I(e.target.value),disabled:!R,className:"h-6 w-10 rounded border border-gray-300 bg-white disabled:opacity-40"})]}),
144
- /* @__PURE__ */x("div",{className:R?"":"opacity-40 pointer-events-none",children:[
145
- /* @__PURE__ */x("div",{className:"flex items-center justify-between gap-2 mb-1",children:[
146
- /* @__PURE__ */y("span",{children:"Edge Threshold"}),
147
- /* @__PURE__ */x("span",{className:"text-gray-500 tabular-nums",children:[P,"°"]})]}),
148
- /* @__PURE__ */y("input",{type:"range",min:0,max:45,step:1,value:P,onChange:e=>B(Number(e.target.value)),className:"w-full accent-blue-500"})]}),
149
- /* @__PURE__ */x("div",{className:"border-t border-gray-200 -mx-3 px-3 pt-3 mt-1",children:[
150
- /* @__PURE__ */x("label",{className:"flex items-center justify-between gap-2",children:[
151
- /* @__PURE__ */y("span",{className:"font-medium",children:"Section View"}),
152
- /* @__PURE__ */y("button",{onClick:()=>Y(e=>!e),role:"switch","aria-checked":U,className:"relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors "+(U?"bg-blue-500":"bg-gray-300"),children:/* @__PURE__ */y("span",{className:"inline-block h-4 w-4 rounded-full bg-white shadow-sm transition-transform "+(U?"translate-x-[18px]":"translate-x-0.5")})})]}),
153
- /* @__PURE__ */x("div",{className:U?"mt-2 space-y-2":"mt-2 space-y-2 opacity-40 pointer-events-none",children:[
154
- /* @__PURE__ */x("div",{children:[
155
- /* @__PURE__ */x("div",{className:"flex items-center justify-between gap-2 mb-1",children:[
156
- /* @__PURE__ */y("span",{children:"Angle"}),
157
- /* @__PURE__ */x("span",{className:"text-gray-500 tabular-nums",children:[Q,"°"]})]}),
158
- /* @__PURE__ */y("input",{type:"range",min:0,max:180,step:1,value:Q,onChange:e=>ee(Number(e.target.value)),className:"w-full accent-blue-500"})]}),
159
- /* @__PURE__ */x("div",{children:[
160
- /* @__PURE__ */x("div",{className:"flex items-center justify-between gap-2 mb-1",children:[
161
- /* @__PURE__ */y("span",{children:"Axis"}),
162
- /* @__PURE__ */y("button",{onClick:()=>q(e=>!e),className:"text-[10px] text-gray-600 hover:text-gray-900 px-1.5 py-0.5 rounded bg-gray-100 hover:bg-gray-200",title:"Flip section direction",children:Z?"← flipped":"flip →"})]}),
163
- /* @__PURE__ */y("div",{className:"grid grid-cols-3 gap-1",children:["x","y","z"].map(e=>/* @__PURE__ */y("button",{onClick:()=>G(e),className:"py-1 rounded text-[11px] font-semibold "+(_===e?"bg-blue-500 text-white":"bg-gray-100 text-gray-700 hover:bg-gray-200"),children:e.toUpperCase()},e))})]}),
164
- /* @__PURE__ */x("div",{children:[
165
- /* @__PURE__ */x("div",{className:"flex items-center justify-between gap-2 mb-1",children:[
166
- /* @__PURE__ */y("span",{children:"Position"}),
167
- /* @__PURE__ */x("span",{className:"text-gray-500 tabular-nums",children:[Math.round(100*K),"%"]})]}),
168
- /* @__PURE__ */y("input",{type:"range",min:0,max:1,step:.01,value:K,onChange:e=>J(Number(e.target.value)),className:"w-full accent-blue-500"})]})]})]})]}),
169
- /* @__PURE__ */y("div",{className:"px-3 py-2 border-t border-gray-200",children:/* @__PURE__ */y("button",{onClick:()=>{j("#f5f6f8"),T(!0),I("#000000"),B(1),Y(!1),G("x"),q(!1),J(.5),ee(0)},className:"w-full text-[11px] text-gray-700 bg-gray-100 hover:bg-gray-200 rounded py-1.5 transition-colors",children:"Reset to Default"})})]})]})})]})}function j({url:e,filename:t,onDownload:i,onEmail:o}){const[s,a]=h(1),[l,c]=h(!1),[u,m]=h(!1),g=p(null),b="px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1";/* @__PURE__ */
170
- return x("div",{className:"flex flex-col h-full",children:[
171
- /* @__PURE__ */x(n,{children:[!u&&/* @__PURE__ */x(f,{children:[
172
- /* @__PURE__ */y("button",{onClick:()=>a(e=>Math.max(.1,Math.round(100*(e-.25))/100)),className:b,children:"−"}),
173
- /* @__PURE__ */x("span",{className:"text-gray-500 w-12 text-center tabular-nums",children:[Math.round(100*s),"%"]}),
174
- /* @__PURE__ */y("button",{onClick:()=>a(e=>Math.min(8,Math.round(100*(e+.25))/100)),className:b,children:"+"}),
175
- /* @__PURE__ */y("button",{onClick:()=>a(1),className:b,children:"1:1"}),
176
- /* @__PURE__ */y("div",{className:"h-4 w-px bg-gray-300 mx-1"}),
177
- /* @__PURE__ */x("button",{onClick:()=>m(!0),className:b,title:"Annotate this image",children:[
178
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"})}),"Annotate"]})]}),u&&/* @__PURE__ */x(f,{children:[
179
- /* @__PURE__ */x("button",{onClick:()=>m(!1),className:b,title:"Back to viewer",children:[
180
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 19.5L8.25 12l7.5-7.5"})}),"View"]}),
181
- /* @__PURE__ */x("button",{onClick:()=>g.current?.copy(),className:b,children:[
182
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.75"})}),"Copy"]}),
183
- /* @__PURE__ */x("button",{onClick:()=>g.current?.save(),className:b,children:[
184
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"})}),"Save"]})]}),
185
- /* @__PURE__ */x("button",{onClick:i??(async()=>{if(e.startsWith("blob:")||e.startsWith("data:")){const n=document.createElement("a");return n.href=e,n.download=t,void n.click()}const n=async t=>{const n=await fetch(e,t);if(!n.ok)throw new Error(`HTTP ${n.status}`);return n.blob()};try{let e;try{e=await n({credentials:"include"})}catch{e=await n({credentials:"omit"})}const r=URL.createObjectURL(e),i=document.createElement("a");i.href=r,i.download=t,i.click(),setTimeout(()=>URL.revokeObjectURL(r),1e3)}catch{d.error("Download failed — couldn't reach the file.")}}),className:b,children:[
186
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"})}),"Download"]}),o&&/* @__PURE__ */x("button",{onClick:o,className:b,children:[
187
- /* @__PURE__ */y("svg",{className:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75"})}),"Email"]})]}),u?/* @__PURE__ */y(r,{ref:g,src:e,filename:t}):/* @__PURE__ */y("div",{className:"flex-1 overflow-auto bg-gray-100 flex items-center justify-center p-4",children:l?/* @__PURE__ */y("div",{className:"text-sm text-red-600",children:"Failed to load image."}):/* @__PURE__ */y("img",{src:e,alt:t,onError:()=>c(!0),style:{transform:`scale(${s})`,transformOrigin:"center center",transition:"transform 120ms ease"},className:"max-w-full max-h-full shadow-lg rounded bg-white"})})]})}export{w as default};
@@ -1,37 +0,0 @@
1
- import{EditableGrid as e}from"./chunk-RKR5V4QR.js";import"./chunk-BR22X7E5.js";import{AboutApp as t}from"./chunk-4PCIZFDR.js";import{peekSpreadsheetPreviewStage as r,claimSpreadsheetPreviewStage as n,SPREADSHEET_PREVIEW_UPDATE_EVENT as o}from"./chunk-VTVSMRFX.js";import{WindowTitle as a}from"./chunk-TZ2BPFCT.js";import"./chunk-DSSLOQDW.js";import"./chunk-ZOPYAOUP.js";import"./chunk-MFXG5BWL.js";import"./chunk-YJRC6IKD.js";import"./chunk-5A7MWTXX.js";import"./chunk-OGXU7QFW.js";import"./chunk-XJYXKO7K.js";import"./chunk-AA4TMQOS.js";import"./chunk-AFYQTVZO.js";import"./chunk-HZZNJHRH.js";import"./chunk-X4FJ54PP.js";import"./chunk-D65T4H6J.js";import"./chunk-3YTHR7IC.js";import"./chunk-YKZHOXI4.js";import{useRef as l,useState as s,useEffect as c,useCallback as i}from"react";import{jsxs as u,jsx as d,Fragment as h}from"react/jsx-runtime";var m="ABCDEFGHIJKLMNOPQRSTUVWXYZ",p=10,x=30;function g(e){return e<26?m[e]:m[Math.floor(e/26)-1]+m[e%26]}function y(e){return Array.from({length:e},(e,t)=>({key:`col_${t}`,title:g(t),width:100}))}function b(e,t){return Array.from({length:e},()=>Array(t).fill(""))}function f(e){return{id:crypto.randomUUID(),name:e,columns:y(p),data:b(x,p),cellStyles:{}}}function v(e){return e.split("\n").map(e=>{if(e.includes("\t"))return e.split("\t").map(e=>e.trim());const t=[];let r="",n=!1;for(const o of e)'"'!==o?","!==o||n?r+=o:(t.push(r.trim()),r=""):n=!n;return t.push(r.trim()),t}).filter(e=>e.some(e=>e.trim()))}function k(e,t){const r=v(e);if(0===r.length)return null;const n=Math.max(p,r.reduce((e,t)=>Math.max(e,t.length),0)),o=r.map(e=>{for(;e.length<n;)e.push("");return e});for(;o.length<x;)o.push(Array(n).fill(""));return{id:crypto.randomUUID(),name:t,columns:y(n),data:o,cellStyles:{}}}function w(){const m=l(null),g=l(void 0);void 0===g.current&&(g.current=r());const w=l(g.current?.data??null),C=(()=>{const e=g.current;if(!e)return null;const t=k(e.data.csv,"Sheet 1");if(!t)return null;return{sheet:t,title:e.data.filename.replace(/\.(csv|tsv|txt)$/i,"")}})(),[N,S]=s(C?[C.sheet]:[f("Sheet 1")]),[j,$]=s(0),M=l([]),A=l(N),U=l(!1);c(()=>{U.current?U.current=!1:A.current!==N&&(M.current.push(A.current),M.current.length>50&&M.current.shift()),A.current=N},[N]);const D=i(()=>{const e=M.current.pop();e&&(U.current=!0,S(e))},[]);c(()=>{const e=e=>{if(!m.current?.contains(document.activeElement)&&!m.current?.matches(":focus-within"))return;(e.ctrlKey||e.metaKey)&&!e.shiftKey&&("z"===e.key||"Z"===e.key)&&(e.preventDefault(),D())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[D]);const[E,R]=s(C?.title??"Untitled"),[F,L]=s(()=>g.current?.data.onEmail),O=i(e=>{const t=k(e.csv,"Sheet 1");t&&(S([t]),$(0),R(e.filename.replace(/\.(csv|tsv|txt)$/i,"")),L(()=>e.onEmail))},[]);c(()=>{const e=g.current;null!=e&&(n(e),e.data!==w.current&&O(e.data))},[]),c(()=>{const e=g.current?.token;if(null==e)return;const t=t=>{const r=t.detail;r&&r.token===e&&O(r.data)};return window.addEventListener(o,t),()=>window.removeEventListener(o,t)},[]);const[X,I]=s(!1),[K,B]=s(null),[T,Z]=s(""),H=l(null),[P,Y]=s("1"),[J,Q]=s("10"),V=N[j]||N[0],W=V.data,z=V.columns,G=V.cellStyles??{},[_,q]=s(null),[ee,te]=s(null),re=i(()=>{if(ee){const e=Math.min(ee.anchor.row,ee.end.row),t=Math.max(ee.anchor.row,ee.end.row),r=Math.min(ee.anchor.col,ee.end.col),n=Math.max(ee.anchor.col,ee.end.col),o=[];for(let a=e;a<=t;a++)for(let e=r;e<=n;e++)o.push({row:a,col:e});return o}return _?[_]:[]},[ee,_]),ne=i((e,t)=>{const r=re();0!==r.length&&S(n=>n.map((n,o)=>{if(o!==j)return n;const a={...n.cellStyles??{}},l=`${r[0].row}:${r[0].col}`,s=void 0!==t?t:!(a[l]??{})[e];for(const{row:t,col:n}of r){const r=`${t}:${n}`;a[r]={...a[r]??{},[e]:s}}return{...n,cellStyles:a}}))},[re,j]),oe=ee?{row:ee.anchor.row,col:ee.anchor.col}:_,ae=oe?G[`${oe.row}:${oe.col}`]??{}:{},le=!!oe,se=i(e=>{S(t=>t.map((t,r)=>r===j?{...t,...e}:t))},[j]),ce=i(e=>{const t=e.reduce((e,t)=>Math.max(e,t.length),0);t!==z.length?se({data:e,columns:y(t)}):se({data:e})},[se,z.length]),ie=(e,t)=>{S(r=>r.map((r,n)=>n===e?{...r,name:t}:r)),B(null)},ue=()=>W.filter(e=>e.some(e=>e.trim())).map(e=>e.map(e=>e.includes(",")||e.includes('"')||e.includes("\n")?`"${e.replace(/"/g,'""')}"`:e).join(",")).join("\n"),de=[];W.forEach(e=>e.forEach(e=>{const t=parseFloat(e);!isNaN(t)&&e.trim()&&de.push(t)}));const he=W.reduce((e,t)=>e+t.filter(e=>e.trim()).length,0);/* @__PURE__ */
2
- return u("div",{ref:m,className:"flex flex-col h-full",children:[
3
- /* @__PURE__ */d(a,{title:`${me=E||"Untitled",me.length>24?`${me.slice(0,23)}…`:me} - Spreadsheets`}),
4
- /* @__PURE__ */d(t,{app:"spreadsheet"}),
5
- /* @__PURE__ */u("div",{className:"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0",children:[X?/* @__PURE__ */d("input",{type:"text",value:E,onChange:e=>R(e.target.value),onBlur:()=>I(!1),onKeyDown:e=>{"Enter"===e.key&&I(!1)},autoFocus:!0,className:"text-sm font-medium text-gray-900 border border-gray-300 rounded px-2 py-0.5 w-40 focus:border-blue-500 focus:ring-blue-500"}):/* @__PURE__ */d("button",{onClick:()=>I(!0),className:"text-sm font-medium text-gray-900 hover:text-blue-600 truncate max-w-[200px]",title:"Click to rename",children:E||"Untitled"}),
6
- /* @__PURE__ */d("div",{className:"h-4 w-px bg-gray-300"}),
7
- /* @__PURE__ */d("input",{ref:H,type:"file",accept:".csv,.tsv,.txt,.xlsx,.xls,.ods",onChange:async e=>{const t=e.target.files?.[0];if(!t)return;const r=t.name.replace(/\.(csv|tsv|txt|xlsx|xls|ods)$/i,"");if(/\.(xlsx|xls|ods)$/i.test(t.name)){const e=new Uint8Array(await t.arrayBuffer()),n=await(import("xlsx")),o=n.read(e,{type:"array"}),a=o.SheetNames.map(e=>{const t=n.utils.sheet_to_json(o.Sheets[e],{header:1,defval:""}),r=Math.max(p,t.reduce((e,t)=>Math.max(e,t.length),0)),a=t.map(e=>{const t=e.map(e=>String(e??""));for(;t.length<r;)t.push("");return t});for(;a.length<x;)a.push(Array(r).fill(""));return{id:crypto.randomUUID(),name:e,columns:y(r),data:a}});S(a),$(0),R(r)}else{const e=v(await t.text());if(0===e.length)return;const n=Math.max(p,e.reduce((e,t)=>Math.max(e,t.length),0)),o=e.map(e=>{for(;e.length<n;)e.push("");return e});for(;o.length<x;)o.push(Array(n).fill(""));se({columns:y(n),data:o}),R(r)}H.current&&(H.current.value="")},className:"hidden"}),
8
- /* @__PURE__ */d("button",{onClick:()=>H.current?.click(),className:"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors",children:"Open"}),
9
- /* @__PURE__ */d("button",{onClick:()=>{const e=new Blob([ue()],{type:"text/csv"}),t=URL.createObjectURL(e),r=document.createElement("a");r.href=t,r.download=`${E||"spreadsheet"}.csv`,r.click(),URL.revokeObjectURL(t)},className:"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors",children:"Save CSV"}),F&&/* @__PURE__ */d("button",{onClick:()=>F(ue(),`${E||"spreadsheet"}.csv`),className:"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors",children:"Email"}),
10
- /* @__PURE__ */d("div",{className:"h-4 w-px bg-gray-300"}),
11
- /* @__PURE__ */u("div",{className:"flex items-center gap-1",children:[
12
- /* @__PURE__ */d("input",{type:"number",min:"1",max:"50",value:P,onChange:e=>Y(e.target.value),className:"w-10 text-xs text-center border border-gray-300 rounded px-1 py-0.5 focus:border-blue-500 focus:ring-blue-500"}),
13
- /* @__PURE__ */d("button",{onClick:()=>(e=>{const t=z.length+e;se({columns:y(t),data:W.map(t=>[...t,...Array(e).fill("")])})})(parseInt(P)||1),className:"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors",children:"+ Col"})]}),
14
- /* @__PURE__ */u("div",{className:"flex items-center gap-1",children:[
15
- /* @__PURE__ */d("input",{type:"number",min:"1",max:"500",value:J,onChange:e=>Q(e.target.value),className:"w-10 text-xs text-center border border-gray-300 rounded px-1 py-0.5 focus:border-blue-500 focus:ring-blue-500"}),
16
- /* @__PURE__ */d("button",{onClick:()=>{return e=parseInt(J)||10,void se({data:[...W,...Array.from({length:e},()=>Array(z.length).fill(""))]});var e},className:"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors",children:"+ Row"})]}),
17
- /* @__PURE__ */d("div",{className:"h-4 w-px bg-gray-300"}),
18
- /* @__PURE__ */d("button",{onClick:()=>{se({columns:y(p),data:b(x,p)})},className:"text-xs text-gray-600 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors",children:"Clear"}),
19
- /* @__PURE__ */d("div",{className:"h-4 w-px bg-gray-300"}),
20
- /* @__PURE__ */u("div",{className:"flex items-center gap-0.5",title:le?"":"Click a cell first",children:[
21
- /* @__PURE__ */d("button",{onClick:()=>ne("bold"),disabled:!le,className:`px-2 py-1 text-xs rounded transition-colors font-bold ${ae.bold?"bg-blue-100 text-blue-700":"text-gray-600 hover:bg-gray-200"} disabled:opacity-40 disabled:cursor-not-allowed`,children:"B"}),
22
- /* @__PURE__ */d("button",{onClick:()=>ne("italic"),disabled:!le,className:`px-2 py-1 text-xs rounded transition-colors italic ${ae.italic?"bg-blue-100 text-blue-700":"text-gray-600 hover:bg-gray-200"} disabled:opacity-40 disabled:cursor-not-allowed`,children:"I"}),
23
- /* @__PURE__ */d("button",{onClick:()=>ne("underline"),disabled:!le,className:`px-2 py-1 text-xs rounded transition-colors underline ${ae.underline?"bg-blue-100 text-blue-700":"text-gray-600 hover:bg-gray-200"} disabled:opacity-40 disabled:cursor-not-allowed`,children:"U"}),
24
- /* @__PURE__ */u("select",{value:ae.fontSize??"base",onChange:e=>ne("fontSize",e.target.value),disabled:!le,className:"ml-1 text-xs border border-gray-300 rounded px-1 py-0.5 bg-white disabled:opacity-40 disabled:cursor-not-allowed",children:[
25
- /* @__PURE__ */d("option",{value:"sm",children:"XS"}),
26
- /* @__PURE__ */d("option",{value:"base",children:"S"}),
27
- /* @__PURE__ */d("option",{value:"lg",children:"M"}),
28
- /* @__PURE__ */d("option",{value:"xl",children:"L"})]})]})]}),
29
- /* @__PURE__ */d("div",{className:"flex-1 min-h-0",children:/* @__PURE__ */d(e,{columns:z,data:W,onChange:ce,onColumnsChange:e=>se({columns:e}),cellStyles:G,onFocusChange:q,onSelectionChange:te,minRows:x,maxHeight:"100%"})}),
30
- /* @__PURE__ */u("div",{className:"flex items-center border-t border-gray-200 bg-gray-50 shrink-0",children:[
31
- /* @__PURE__ */u("div",{className:"flex items-center gap-0.5 px-1 py-1 overflow-x-auto flex-1 min-w-0",children:[N.map((e,t)=>/* @__PURE__ */d("button",{onClick:()=>$(t),onDoubleClick:()=>{B(t),Z(e.name)},onContextMenu:e=>{e.preventDefault(),N.length>1&&(e=>{N.length<=1||(S(t=>t.filter((t,r)=>r!==e)),j>=e&&j>0&&$(j-1))})(t)},className:"px-3 py-1 text-xs font-medium rounded-b whitespace-nowrap transition-colors "+(t===j?"bg-white text-blue-700 border border-t-0 border-gray-300 -mt-px relative z-10":"text-gray-500 hover:text-gray-700 hover:bg-gray-100"),children:K===t?/* @__PURE__ */d("input",{type:"text",value:T,onChange:e=>Z(e.target.value),onBlur:()=>ie(t,T||e.name),onKeyDown:r=>{"Enter"===r.key&&ie(t,T||e.name),"Escape"===r.key&&B(null)},onClick:e=>e.stopPropagation(),autoFocus:!0,className:"w-20 text-xs border border-blue-400 rounded px-1 py-0 focus:ring-0 focus:outline-none"}):e.name},e.id)),
32
- /* @__PURE__ */d("button",{onClick:()=>{const e=`Sheet ${N.length+1}`;S(t=>[...t,f(e)]),$(N.length)},className:"px-2 py-1 text-xs text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded",title:"Add sheet",children:"+"})]}),
33
- /* @__PURE__ */u("div",{className:"flex items-center gap-4 px-3 py-1 text-xs text-gray-500 shrink-0 border-l border-gray-200",children:[
34
- /* @__PURE__ */u("span",{children:[he," cells"]}),de.length>0&&/* @__PURE__ */u(h,{children:[
35
- /* @__PURE__ */u("span",{children:["Sum: ",de.reduce((e,t)=>e+t,0).toLocaleString(void 0,{maximumFractionDigits:2})]}),
36
- /* @__PURE__ */u("span",{children:["Avg: ",(de.reduce((e,t)=>e+t,0)/de.length).toLocaleString(void 0,{maximumFractionDigits:2})]})]}),
37
- /* @__PURE__ */u("span",{children:[W.length," × ",z.length]})]})]})]});var me}export{w as default};
@@ -1 +0,0 @@
1
- import{createContext as e,useContext as o,useMemo as t,useEffect as a}from"react";import{jsx as n}from"react/jsx-runtime";var i=/* @__PURE__ */new Map;function r(e,o){const t=`${e}|${JSON.stringify(o)}`;let a=i.get(t);return a||(a=new Intl.NumberFormat(e,o),i.set(t,a)),a}function s(e,o){return o?r(o,{maximumFractionDigits:20}).format(e):String(e)}function l(e,o,t){return t?r(t,{minimumFractionDigits:o,maximumFractionDigits:o}).format(e):e.toFixed(o)}function d(e,o,t){return t?r(t,{style:"percent",minimumFractionDigits:o,maximumFractionDigits:o}).format(e/100):`${e.toFixed(o)}%`}function c(e){const o=o=>s(o,e),t=o=>function(e,o){return o?r(o,{}).format(e):e.toLocaleString()}(o,e),a=(o,t)=>l(o,t,e),n=(o,t)=>d(o,t,e);return{window:{minimize:"Minimize",restore:"Restore",maximize:"Maximize",windowed:"Windowed",pinOnTop:"Pin on top",unpin:"Unpin from top",close:"Close",windowSuffix:"window",prev:"Prev",next:"Next",snapLayouts:"Snap layouts",snapLeft:"Snap left half",snapRight:"Snap right half",snapTopLeft:"Snap top-left quarter",snapTopRight:"Snap top-right quarter",snapBottomLeft:"Snap bottom-left quarter",snapBottomRight:"Snap bottom-right quarter"},taskbar:{closeWindow:"Close window",offscreenHint:"This window is off screen — click to bring it back",offscreenDot:"Off screen — click to bring this window back",expose:"Exposé — show all open windows as thumbnails",addToDesktop:"Add to desktop",removeFromDesktop:"Remove from desktop",minimizeAllWindows:"Minimize all",restoreAllWindows:"Restore all",closeAllWindows:"Close all"},logout:{goodbye:"Goodbye",seeYou:"See you next time"},about:{aboutPrefix:"About",thisApp:"this app",openSourceLicenses:"Open Source Licenses",whatsNew:"What's New",noChangelog:"No changelog available."},table:{empty:"Nothing to show",loading:"Loading",selectAll:"Select all rows",selectRow:"Select row"},select:{none:"— None —",noMatches:"No matches",allSelected:"All options selected",clear:"Clear selection",remove:"Remove"},notifications:{title:"Notifications",markAllRead:"Mark all read",dnd:"Do not disturb",dndOn:"Do not disturb is on",caughtUp:"All caught up",empty:"No notifications yet",viewAll:"View all notifications",cardLabel:"Notification",dismiss:"Dismiss notification"},form:{errorSummaryTitle:"There is a problem"},help:{title:"Help",searchPlaceholder:"Search help…",empty:"No help articles yet.",noResults:"No articles match your search.",loading:"Loading…",pickArticle:"Pick a help article from the left.",noBody:"This article has no body yet.",draft:"Draft",newArticle:"+ New",edit:"Edit"},update:{available:"A new version is available.",refreshNow:"Refresh now"},pageTabs:{label:"Open pages",close:"Close",closeOthers:"Close other tabs",closeRight:"Close tabs to the right",closeAll:"Close all tabs",unsaved:"Unsaved changes",copy:e=>`Copy ${e}`,copied:"Copied",tabMenu:"Window menu",discardTitle:"Discard unsaved changes?",discardOne:"This page has changes that have not been saved. Close it anyway?",discardMany:"pages have changes that have not been saved. Close them anyway?",discardConfirm:"Discard and close",keepEditing:"Keep editing"},dialog:{close:"Close",cancel:"Cancel",ok:"OK",confirmTitle:"Confirm",destructiveTitle:"Confirm Action",destructiveCancel:"Dismiss",destructiveConfirm:"Delete",typeToConfirm:e=>`Type ${e} to confirm:`,promptTitle:"Enter a value"},calendar:{previousMonth:"Previous month",nextMonth:"Next month",previousYear:"Previous year",nextYear:"Next year",previousYears:"Previous years",nextYears:"Next years",monthPanel:"Choose a month",yearPanel:"Choose a year",chooseMonth:e=>`Choose a month, currently ${e}`,chooseYear:e=>`Choose a year, currently ${e}`},datePicker:{placeholder:"Select a date",dialog:"Choose a date",clear:"Clear",today:"Today",required:"Required"},dateRange:{placeholder:"Date Range",clearRange:"Clear date range",dialog:"Date range",from:"From",to:"To",start:"Start",end:"End",fromOnly:e=>`From ${e}`,toOnly:e=>`To ${e}`,range:(e,o)=>`${e} to ${o}`,required:"Required",last2Weeks:"Last 2 Weeks",lastMonth:"Last Month",last3Months:"Last 3 Months",last6Months:"Last 6 Months",last12Months:"Last 12 Months",custom:"Custom",clear:"Clear",cancel:"Cancel",apply:"Apply"},pagination:{label:"Pagination",first:"First page",previous:"Previous page",next:"Next page",last:"Last page"},list:{selected:e=>`${o(e)} selected`,selectedNotShown:(e,t)=>`${o(e)} selected, ${o(t)} not shown`,allLoaded:(e,o)=>`All ${t(e)} ${o} loaded`,count:(e,o)=>`${t(e)} ${o}`,loadedOf:(e,o,a)=>`${t(e)} of ${t(o)} ${a}`,loadingMore:"Loading more...",loadError:"Couldn't load this list",loadErrorMessage:"Something went wrong fetching these records. Check your connection and try again.",retry:"Try again"},kanban:{loading:"Loading…",empty:"No items.",dropHere:"Drop here",addItem:"Add item"},files:{attach:"Attach files",drop:"Drop files to attach",remove:e=>`Remove ${e}`,chooseMany:"Choose files",chooseOne:"Choose a file",dragMany:"or drag them here",dragOne:"or drag it here",notAccepted:(e,o)=>`${e} is not an accepted file type${o?` (${o})`:""}`,tooLarge:(e,o,t)=>`${e} is ${o} — the limit is ${t}`,tooMany:(e,t)=>`${e} was not added — ${o(t)} ${1===t?"file":"files"} is the limit`,bytes:e=>`${o(e)} B`,kilobytes:e=>`${o(e)} KB`,megabytes:e=>`${a(e,1)} MB`},media:{uploadImage:"Upload an image",uploadVideo:"Upload a video",uploadFile:"Upload a file",upload:"Upload media",cta:"Choose from library or upload",replace:"Replace",remove:"Remove",uploading:"Uploading…",cover:"Cover",add:"Add",addMedia:"Add media",empty:"No media.",removeItem:e=>`Remove ${e}`,reorder:(e,t,a)=>`${e}, item ${o(t)} of ${o(a)}. Use arrow keys to reorder.`},brandAsset:{save:e=>`Save ${e}`,remove:e=>`Remove ${e}`,discard:"Discard change",saveFailed:e=>`Could not save ${e}.`,removeFailed:e=>`Could not remove ${e}.`,region:(e,o)=>`${e} for ${o}`,usedFor:e=>`Used for ${e}.`,previews:e=>`${e} previews`,preview:"Preview",alt:(e,o)=>`${e} ${o}`},copy:{copy:"Copy",copyLabel:e=>`Copy ${e}`,copied:"Copied",copyValue:e=>`Copy ${e}`,copiedValue:"Copied!",copiedLabel:e=>`${e} copied`,failed:"Could not copy to the clipboard"},keypad:{backspace:"Backspace",enter:"Enter"},banner:{dismiss:"Dismiss"},badge:{remove:"Remove",removeItem:e=>`Remove ${e}`},breadcrumbs:{label:"Breadcrumb",hidden:"Hidden crumbs"},emptyState:{message:"Nothing here yet."},errors:{notFound:"Page not found",notFoundBody:"The page you're looking for doesn't exist or was moved.",forbidden:"Access denied",forbiddenBody:"You don't have permission to view this page.",noAccess:"You don't have access to this",serverError:"Something went wrong",serverErrorBody:"An unexpected error occurred. Please try again.",retry:"Try again",details:"Error details"},search:{placeholder:"Search...",escBadge:"ESC",searching:"Searching...",noResults:"No results found.",minChars:e=>`Type at least ${o(e)} characters to search...`,navigate:"navigate",open:"open",close:"close",enterKey:"Enter",escKey:"Esc",recent:"Recent",favorites:"Favorites",actions:"Actions",listLabel:"Search results",groupCount:(e,t)=>`${o(e)}${t?"+":""}`,groupLabel:(e,t,a)=>`${e}, ${o(t)}${a?"+":""}`,seeAll:e=>`See all ${e}`,searchFailed:"Search failed — check your connection and try again.",partialFailure:"Some results could not be loaded.",tabKey:"Tab",nextGroup:"next group"},grid:{selectAll:"Select all",insertRowAbove:"Insert row above",insertRowBelow:"Insert row below",deleteRow:e=>`Delete row ${e}`,insertColumnLeft:"Insert column left",insertColumnRight:"Insert column right",deleteColumn:e=>`Delete column ${e}`,resize:"Drag to resize · double-click to auto-fit",fill:"Drag to fill"},sidebar:{resize:"Drag to resize · double-click to reset"},resizeHandle:{label:"Resize panel",hint:"Drag to resize · double-click to reset"},number:{increase:"Increase",decrease:"Decrease"},slider:{value:e=>`${e} value`},color:{swatch:(e,o)=>`${e}: ${o}`,none:"None",panel:e=>`${e} picker`,square:"Saturation and brightness",squareValue:(e,o)=>`Saturation ${n(e,0)}, brightness ${n(o,0)}`,hue:"Hue",hex:e=>`${e} hex code`,presets:"Presets",clear:"No color"},tree:{empty:"Nothing here yet",dropHere:"Drop here",dragHint:"Drag to move",moveHint:"Alt+Arrow Up or Alt+Arrow Down moves it",insertHere:"Insert here"},layout:{desktop:"Desktop",sidebar:"Sidebar",switchToDesktop:"Switch to Desktop",switchToSidebar:"Switch to Sidebar",collapseSidebar:"Collapse sidebar",expandSidebar:"Expand sidebar",search:"Search…",navLabel:"Main menu",openWindows:"Open windows",pageResult:"Page",accountMenu:e=>`Account menu for ${e}`,profile:"My Profile",notifications:"Notifications",reportIssue:"Suggestion or Bug",signOut:"Sign Out",signOutTitle:"Sign Out",signOutMessage:"Do you want to log out? All windows will reopen when you log back in."},markdown:{screenshot:"Screenshot"},severity:{success:"ok",warning:"warning",danger:"critical",unrecognised:e=>`unrecognised severity ${e}`},meter:{noData:"no data",warningAt:e=>`warning ≥ ${o(e)}`,criticalAt:e=>`critical ≥ ${o(e)}`,noReading:"no reading",noBudget:"no budget",ofBudget:e=>`${e} of budget`,budget:"budget",hoursMinutes:(e,t)=>`${o(e)}h ${o(t)}m`,minutesSeconds:(e,t)=>`${o(e)}m ${o(t)}s`,seconds:e=>`${o(e)}s`},charts:{showTable:"Show the data as a table",loading:"Loading chart data",noData:"No data in this window.",windowStart:"Window start",windowEnd:"Window end",window:(e,t,a)=>`Time window — showing ${e} to ${t} of ${o(a)} intervals`,overIntervals:(e,t)=>`${e.join(", ")} over ${o(t)} intervals`,acrossCategories:(e,t)=>`${e.join(", ")} across ${o(t)} categories`,acrossMeasures:(e,t)=>`${e.join(", ")} across ${o(t)} measures`,breakdown:(e,t)=>`Breakdown of ${e} across ${o(t)} segments`,funnel:(e,t,a)=>`Funnel of ${o(e)} stages, ${t} down to ${a}`,radialTrack:e=>`${o(e)} categories, as concentric proportions`,radialCycle:e=>`${o(e)} categories, around a cycle`,tableFrom:"From",tableTo:"To",tableItem:"Item",tableLevel:"Level",tableSeries:"Series",inBucket:e=>`${e} in this bucket`,inCategory:e=>`${e} in this category`,value:"Value",share:"Share",count:"Count",flow:"Flow",totalFlow:"Total flow",throughput:"Throughput",open:"Open",high:"High",low:"Low",close:"Close",maximum:"Maximum",q3:"Q3",median:"Median",q1:"Q1",minimum:"Minimum",distribution:"Distribution",fiveNumber:(e,t)=>`${e}: five-number summary for ${o(t)} categories`,outliers:e=>`${o(e)} outlier${e>1?"s":""} beyond the whiskers`,price:"Price",ohlc:(e,t)=>`${e}: open, high, low and close across ${o(t)} periods`,closedAbove:"Closed above its open",closedBelow:"Closed below its open",noFlows:"No flows to chart.",chord:e=>`Flows between ${o(e)} participants`,noStages:"No stages to chart.",ofFirstStage:"Of first stage",droppedHere:"Dropped here",intensity:"Intensity",noActivity:"No activity in this window.",heatmap:(e,t,a)=>`${e} across ${o(t)} rows and ${o(a)} columns`,countAxis:"count",histogram:(e,t,a)=>`${e}: ${o(t)} bins over ${o(a)} observations`,observations:"Observations",notEnough:"Not enough eligible requests to judge.",objectiveMet:e=>`objective ${e} met`,objectiveMissed:e=>`objective ${e} missed`,nothingToPlot:"Nothing to plot.",nothingToCompare:"Nothing to compare.",other:"Other",nothingToBreakDown:"Nothing to break down.",range:"Range",rangeLabel:(e,t)=>`${e}: low and high across ${o(t)} categories`,nothingToRank:"Nothing to rank in this window.",emphasised:"(emphasised)",sankey:(e,t)=>`Flow between ${o(e)} nodes over ${o(t)} links`,noObservations:"No observations in this window.",xAxis:"x",yAxis:"y",size:"Size",scatter:(e,o,t)=>`${e.join(", ")}: ${o} against ${t}`,outsideRange:e=>`${o(e)} ${1===e?"point":"points"} outside the shown range`,waterfall:(e,t,a)=>`Waterfall of ${o(e)} steps from ${t} to ${a}`,balance:"Balance",increase:"Increase",decrease:"Decrease",runningTotal:"Running total",sunburst:(e,t)=>`Hierarchy of ${e} across ${o(t)} levels`,treemap:e=>`Treemap of ${o(e)} items`,trendUp:"up",trendDown:"down",trendFlat:"flat"},timeline:{days:e=>`${t(e)} days`,daysToToday:e=>`${t(e)} days to today`,notReached:"Not yet reached",next:"Next",more:e=>`+${o(e)} more`,today:"Today",todayTitle:e=>`Today — ${e}`,open:e=>`Open ${e}`,openButton:"Open",scrub:"Scrub the timeline",alsoToCome:e=>`Also to come: ${e.join(", ")}`,start:e=>`Start · ${e}`,events:(e,t)=>`${o(e)} events · ${t.join(", ")}`,started:e=>`started ${e}`,duration:e=>`${t(e)} day${1===e?"":"s"}`,reached:(e,t)=>`${o(e)} of ${o(t)} milestones`,milestones:e=>`${e} milestones`},production:{heading:"Production progress",start:"Start",estimated:"Estimated",estimatedCompletion:"Estimated completion",estDone:"Est. done",play:"Play",pause:"Pause",playTitle:"Play the timeline, report by report",backTo:e=>`Back to ${e}`,showing:e=>`Showing ${e}`,overall:e=>`${n(e,0)} overall`,inStock:e=>`${t(e)} pc in stock`,noReport:"No production report filed yet",leadTime:e=>`${t(e)} day${1===e?"":"s"} lead time`,report:"Production report",shipment:"Shipment",inspection:"Inspection",invoice:"Invoice",scrub:"Scrub the production timeline",label:(e,o)=>`Production reports and events, ${e} to ${o}`},containers:{items:e=>`${o(e)} items`,pieces:e=>`${o(e)} pcs`,split:(e,t)=>`(${o(e)} instr / ${o(t)} loaded)`,added:(e,t)=>`${o(e)} new (${o(t)} pcs)`,fill:(e,t)=>`${a(e,1)} / ${o(t)} m³`,total:"Total:",instructed:e=>`${a(e,2)} m³ instruction`,loaded:e=>`${a(e,2)} m³ loaded`,volume:e=>`${a(e,2)} m³`,noVolume:"Volume: N/A (no volume data for these part numbers)"},toast:{notification:"Notification"},map:{failed:"The map could not be drawn here. The list has everything it shows.",approximate:e=>`${e}, approximate location`,approximateTitle:e=>`${e} (approximate)`,places:e=>1===e?"place":"places",group:(e,t)=>`${o(e)} ${t} here`,stops:e=>`Stops ${e}`,closeBy:(e,t)=>`${o(e)} more ${t} close by, drawn when the map is closer`,spread:"Press to see them apart",cycle:"They stand on one spot: press for the next of them",fullScreen:"Full screen",leaveFullScreen:"Leave full screen",chosen:e=>`${e}, chosen on the map`,closeCard:"Close",openRecord:"Open"},pdf:{previousPage:"Previous page",nextPage:"Next page",pageOf:(e,t)=>`${o(e)} / ${o(t)}`,zoomOut:"Zoom out",zoomIn:"Zoom in",zoom:"Zoom",fitWidth:"Fit width",fitPage:"Fit page",fit:"Fit",fitHint:"Fit to the pane: follows its size until you zoom by hand",print:"Print",download:"Download",email:"Email",loading:"Loading PDF…",loadFailed:"Failed to load PDF",allowPopups:"Allow popups to print"},loading:{label:"Loading..."},language:{title:"Language",description:"The language of menus, labels and messages.",reloadNote:"The page reloads when you change the language."},entityList:{open:"Open",copy:"Copy",copyColumn:e=>`Copy ${e}`,copyRows:e=>1===e?"Copy row":`Copy ${o(e)} rows`,exportSelected:"Export selected to CSV",selectAll:"Select all",selectAllLoaded:e=>`Select all ${o(e)} loaded`,clearSelection:"Clear selection",refresh:"Refresh",copiedText:"Text",copiedRows:e=>1===e?"Row":`${o(e)} rows`,exported:e=>`Exported ${o(e)} ${1===e?"row":"rows"}.`,exportTruncated:(e,t)=>`Exported ${o(e)} of ${o(t)} rows. The server capped this export, so the file is incomplete.`,exportTruncatedUnknown:e=>`Exported only some of the ${o(e)} rows. The server capped this export, so the file is incomplete.`,exportFailed:"CSV export failed."},columns:{choose:"Choose columns",heading:"Columns",reset:"Reset",saveDefault:"Save as default for all users",savedDefault:"Saved as default",select:"Select",selectDone:"Done",showSelection:"Show selection column",hideSelection:"Hide selection column"},record:{loading:"Loading record…",signInRequired:"Sign in required",signInBody:"Your session may have expired. Sign in again to open this record.",notFound:"Record not found",loadFailed:"Couldn't load record",checkConnection:"Check your connection and try again.",rejected:"The server rejected this request.",retry:"Try again"},password:{current:"Current Password",newPassword:"New Password",confirm:"Confirm Password",submit:"Change Password",submitting:"Changing...",done:"Done",currentRequired:"Current password is required.",tooShort:e=>`New password must be at least ${o(e)} characters.`,mismatch:"Passwords do not match.",failed:"Failed to change password.",changed:"Your password has been changed successfully."},pdfAction:{label:"PDF",loading:"Loading...",preview:"Preview",download:"Download",email:"Send by Email",downloaded:e=>`${e} downloaded.`,tookTooLong:e=>`${e} took too long to load. Please try again.`,previewLoading:"LOADING PDF",previewTookTooLong:"This document took too long to load. Close this window and try again.",previewFailed:"Failed to load PDF."},undo:{undo:"Undo",redo:"Redo",undoStep:(e,o)=>`Undo ${e} (${o})`,redoStep:(e,o)=>`Redo ${e} (${o})`,nothingToUndo:"Nothing to undo",nothingToRedo:"Nothing to redo"},sounds:{title:"Sounds",enable:"Sound effects",autosave:"Changes are saved automatically",choice:(e,o)=>`${e} — ${o}`,packClassic:"Classic",packMinimal:"Minimal",packRetro:"Retro",packSoft:"Soft",packArcade:"Arcade",packSilent:"Silent",eventClick:"Click",eventSuccess:"Success",eventError:"Error",eventNotification:"Notification",eventStartup:"Startup",eventTimerDone:"Timer",eventLogout:"Logout"}}}var p=c(),u=/* @__PURE__ */new Map;var h=e(p),m=e(null),g=/* @__PURE__ */new Set;var $=p,w={};function f(){return $}function y({value:e=w,locale:i,children:r}){const s=o(m),l=t(()=>function(e){if(e)try{return Intl.getCanonicalLocales(e)[0]}catch{return void(g.has(e)||(g.add(e),console.error(`[efficient-shell] ShellStringsProvider: locale="${e}" is not a BCP 47 language tag, so it is ignored and numbers and dates keep their default formatting. Pass a tag such as "de-DE" or "ja".`)))}}(i),[i]),d=void 0===i?s?.locale:l,f=t(()=>{const o=function(e){if(!e)return p;let o=u.get(e);return o||(o=c(e),u.set(e,o)),o}(d),t={};for(const a of Object.keys(o))t[a]={...o[a],...e[a]??{}};return t},[e,d]),y=t(()=>({locale:d}),[d]),v=null!==s;return a(()=>{if(!v)return $=f,()=>{$===f&&($=p)}},[f,v]),/* @__PURE__ */n(m.Provider,{value:y,children:/* @__PURE__ */n(h.Provider,{value:f,children:r})})}function v(){return o(h)}function b(){return o(m)?.locale}function S(e){const[o="",...t]=e("\0").split("\0");return[o,t.join("")]}export{p as DEFAULT_SHELL_STRINGS,y as ShellStringsProvider,f as currentShellStrings,l as formatFixed,d as formatPercent,s as formatPlain,S as splitAround,b as useShellLocale,v as useShellStrings};
@@ -1,9 +0,0 @@
1
- import{useWindowMenuItem as e,Modal as t}from"./chunk-TZ2BPFCT.js";import{navIcons as r}from"./chunk-DSSLOQDW.js";import{VERSION as o}from"./chunk-MFXG5BWL.js";import{useState as n,useCallback as s,isValidElement as i,cloneElement as a}from"react";import{jsx as l,jsxs as d}from"react/jsx-runtime";var c={spreadsheet:{name:"Spreadsheets",version:"1.1.3",route:"/spreadsheet",description:"Multi-sheet spreadsheet editor with CSV / TSV import and export."},notepad:{name:"Notepad",version:"1.0.1",route:"/notepad",description:"Color-coded notes with checklists, desktop stickies and entity autolinking."},documents:{name:"Documents",version:"1.1.0",route:"/documents",description:"Letter-page editor for Word documents and plain-text files — images, lists, alignment."},preview:{name:"Preview",version:"1.4.1",route:"/preview",description:"Viewer for PDF documents, images, DXF drawings and 3D models — CAD-style measuring with object snap and an AutoCAD-like command bar."},files:{name:"Files",version:"1.1.1",route:"/files",description:"Personal file manager with folders, uploads, quota, trash and desktop shortcut folders."},browser:{name:"Browser",version:"1.0.1",route:"/browser",description:"Minimal web browser with bookmarks, history and navigation bar."}},m=/* @__PURE__ */l("svg",{className:"h-4 w-4 text-gray-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */l("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"})}),p=/* @__PURE__ */l("svg",{className:"h-9 w-9",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */l("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M3.75 6.75A2.25 2.25 0 016 4.5h12a2.25 2.25 0 012.25 2.25v10.5A2.25 2.25 0 0118 19.5H6a2.25 2.25 0 01-2.25-2.25V6.75z M3.75 9h16.5"})});function h({app:h}){const u=c[h],[x,f]=n(!1),g=s(()=>f(!0),[]);if(e(`About ${u.name}`,g,m),!x)return null;const v=r[u.route],w=i(v)?a(v,{className:"h-9 w-9"}):p;/* @__PURE__ */
2
- return l(t,{open:!0,onClose:()=>f(!1),title:`About ${u.name}`,size:"sm",compact:!0,bodyScroll:!1,autoHeight:!0,dimensions:[320,320],children:/* @__PURE__ */d("div",{className:"flex flex-col items-center text-center px-5 pt-5 pb-4",children:[
3
- /* @__PURE__ */l("div",{className:"flex h-16 w-16 items-center justify-center rounded-2xl bg-gray-100 text-gray-600 shrink-0",children:w}),
4
- /* @__PURE__ */l("h2",{className:"mt-3 text-lg font-bold text-gray-900",children:u.name}),
5
- /* @__PURE__ */d("p",{className:"text-[11px] font-mono text-gray-400",children:["Version ",u.version]}),
6
- /* @__PURE__ */l("p",{className:"mt-2 text-xs text-gray-500 leading-relaxed",children:u.description}),
7
- /* @__PURE__ */d("div",{className:"mt-4 pt-3 border-t border-gray-200 w-full",children:[
8
- /* @__PURE__ */d("p",{className:"text-[11px] text-gray-500",children:["Part of the ",
9
- /* @__PURE__ */l("span",{className:"font-medium text-gray-700",children:"efficient-shell"})," desktop environment"]}),o&&/* @__PURE__ */d("p",{className:"mt-0.5 text-[10px] font-mono text-gray-400",children:["shell v",o]})]})]})})}export{h as AboutApp,c as BUILTIN_APP_INFO};
@@ -1 +0,0 @@
1
- var r="4.177.0",a=r;export{a as APP_VERSION,r as VERSION};