efficient-shell 4.137.0 → 4.145.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 (176) hide show
  1. package/LICENSE +6 -17
  2. package/README.md +80 -12
  3. package/dist/Browser-24YNRTKT.js +43 -0
  4. package/dist/Calculator-LER6KUQC.js +29 -0
  5. package/dist/ConfirmDialog-GAYETRMG.js +1 -0
  6. package/dist/CurrencyConverter-Y35GFDFF.js +21 -0
  7. package/dist/Documents-7FYX2CGT.js +52 -0
  8. package/dist/Files-RZOML2N6.js +89 -0
  9. package/dist/Notepad-VVDCBDUA.js +25 -0
  10. package/dist/PdfViewer-CvLb2j_l.d.ts +40 -0
  11. package/dist/PdfViewer-ZCT3PYXU.js +1 -0
  12. package/dist/PomodoroTimer-VAM3AJOX.js +99 -0
  13. package/dist/Preview-HZ37D7QJ.js +187 -0
  14. package/dist/Sidebar-CVF7C6BO.js +23 -0
  15. package/dist/Spreadsheet-6WX3P6AB.js +37 -0
  16. package/dist/Stock-AUWI3TUX.js +16 -0
  17. package/dist/Weather-HU75TH7T.js +60 -0
  18. package/dist/WorldClock-T64MDRMJ.js +32 -0
  19. package/dist/apps/index.d.ts +3 -23
  20. package/dist/apps/index.js +1 -151
  21. package/dist/brand.css +1 -1
  22. package/dist/chunk-2RHMSFZV.js +9 -0
  23. package/dist/chunk-4FS742BM.js +1 -0
  24. package/dist/chunk-57MIENLJ.js +1 -0
  25. package/dist/chunk-7DAQ3WVP.js +106 -0
  26. package/dist/chunk-BR22X7E5.js +1 -0
  27. package/dist/chunk-BUTSU7FO.js +1 -0
  28. package/dist/chunk-CVTOZCM3.js +24 -0
  29. package/dist/chunk-D65T4H6J.js +1 -0
  30. package/dist/chunk-ESL5TDNA.js +1 -0
  31. package/dist/chunk-FBDZGO3V.js +1 -0
  32. package/dist/chunk-FHTLC7HH.js +1 -0
  33. package/dist/chunk-GDSGXDET.js +34 -0
  34. package/dist/chunk-I55UMU3R.js +6 -0
  35. package/dist/chunk-KKOHUQPF.js +1 -0
  36. package/dist/chunk-L7TEFXIS.js +69 -0
  37. package/dist/chunk-LVDRBRYU.js +1 -0
  38. package/dist/chunk-LVFMK5OQ.js +29 -0
  39. package/dist/chunk-LWLCNQY7.js +1 -0
  40. package/dist/chunk-MAIHBBWT.js +1 -0
  41. package/dist/chunk-MU5H2CDL.js +2 -0
  42. package/dist/chunk-NBBOFQPL.js +947 -0
  43. package/dist/chunk-NPJH5MD7.js +13 -0
  44. package/dist/chunk-OCSOMMY2.js +1 -0
  45. package/dist/chunk-PH3PRIFP.js +5 -0
  46. package/dist/chunk-RJ4LACFH.js +9 -0
  47. package/dist/chunk-SLCR26NK.js +4 -0
  48. package/dist/chunk-TFKB2WEB.js +19 -0
  49. package/dist/chunk-TR6PLN7W.js +1 -0
  50. package/dist/chunk-TWV42Q3K.js +1 -0
  51. package/dist/chunk-UB22J6EF.js +1 -0
  52. package/dist/chunk-UB4JIOLD.js +2 -0
  53. package/dist/chunk-V453E4KU.js +11 -0
  54. package/dist/chunk-VTVSMRFX.js +1 -0
  55. package/dist/file-intake/index.js +1 -4
  56. package/dist/{index-DVI9DMSu.d.ts → index-NhR7frRu.d.ts} +189 -17
  57. package/dist/index.d.ts +2 -2
  58. package/dist/index.js +639 -7473
  59. package/dist/map/index.d.ts +266 -13
  60. package/dist/map/index.js +22 -540
  61. package/dist/markdown/index.js +6 -184
  62. package/dist/markup/index.js +1 -135
  63. package/dist/page-tabs/index.js +21 -709
  64. package/dist/pdf/index.d.ts +9 -0
  65. package/dist/pdf/index.js +2 -0
  66. package/dist/sounds-OMHXVVQ4.js +1 -0
  67. package/dist/ui/index.d.ts +1 -1
  68. package/dist/ui/index.js +1 -19
  69. package/dist/ui.css +7 -0
  70. package/package.json +9 -3
  71. package/dist/Browser-ZNX4WFUH.js +0 -482
  72. package/dist/Browser-ZNX4WFUH.js.map +0 -1
  73. package/dist/Calculator-6FGNKOXU.js +0 -192
  74. package/dist/Calculator-6FGNKOXU.js.map +0 -1
  75. package/dist/ConfirmDialog-NPQMIGUR.js +0 -4
  76. package/dist/ConfirmDialog-NPQMIGUR.js.map +0 -1
  77. package/dist/CurrencyConverter-FF7EXRYL.js +0 -236
  78. package/dist/CurrencyConverter-FF7EXRYL.js.map +0 -1
  79. package/dist/Documents-H3R7XSBH.js +0 -441
  80. package/dist/Documents-H3R7XSBH.js.map +0 -1
  81. package/dist/Files-ZHJIAUC2.js +0 -805
  82. package/dist/Files-ZHJIAUC2.js.map +0 -1
  83. package/dist/Notepad-VE7ISWRQ.js +0 -410
  84. package/dist/Notepad-VE7ISWRQ.js.map +0 -1
  85. package/dist/PdfViewer-SQBFYAGW.js +0 -5
  86. package/dist/PdfViewer-SQBFYAGW.js.map +0 -1
  87. package/dist/PomodoroTimer-IR3WREED.js +0 -633
  88. package/dist/PomodoroTimer-IR3WREED.js.map +0 -1
  89. package/dist/Preview-DAQGRNRM.js +0 -2959
  90. package/dist/Preview-DAQGRNRM.js.map +0 -1
  91. package/dist/Sidebar-YW6H4NDJ.js +0 -291
  92. package/dist/Sidebar-YW6H4NDJ.js.map +0 -1
  93. package/dist/Spreadsheet-HOCPHJOC.js +0 -519
  94. package/dist/Spreadsheet-HOCPHJOC.js.map +0 -1
  95. package/dist/Stock-LVRQPURG.js +0 -158
  96. package/dist/Stock-LVRQPURG.js.map +0 -1
  97. package/dist/Weather-LZQGVDJL.js +0 -431
  98. package/dist/Weather-LZQGVDJL.js.map +0 -1
  99. package/dist/WorldClock-XPD7WOZT.js +0 -202
  100. package/dist/WorldClock-XPD7WOZT.js.map +0 -1
  101. package/dist/apps/index.js.map +0 -1
  102. package/dist/chunk-5O42JXQE.js +0 -26
  103. package/dist/chunk-5O42JXQE.js.map +0 -1
  104. package/dist/chunk-5RPTS3BT.js +0 -70
  105. package/dist/chunk-5RPTS3BT.js.map +0 -1
  106. package/dist/chunk-6XJEJWNJ.js +0 -61
  107. package/dist/chunk-6XJEJWNJ.js.map +0 -1
  108. package/dist/chunk-7CCHEEYC.js +0 -94
  109. package/dist/chunk-7CCHEEYC.js.map +0 -1
  110. package/dist/chunk-BE7FZOFU.js +0 -17
  111. package/dist/chunk-BE7FZOFU.js.map +0 -1
  112. package/dist/chunk-COWYSHG2.js +0 -79
  113. package/dist/chunk-COWYSHG2.js.map +0 -1
  114. package/dist/chunk-D7PYW2QS.js +0 -265
  115. package/dist/chunk-D7PYW2QS.js.map +0 -1
  116. package/dist/chunk-DVZWYWSD.js +0 -26
  117. package/dist/chunk-DVZWYWSD.js.map +0 -1
  118. package/dist/chunk-E7TB6WD2.js +0 -153
  119. package/dist/chunk-E7TB6WD2.js.map +0 -1
  120. package/dist/chunk-FIHOGVUP.js +0 -416
  121. package/dist/chunk-FIHOGVUP.js.map +0 -1
  122. package/dist/chunk-GA35NEND.js +0 -56
  123. package/dist/chunk-GA35NEND.js.map +0 -1
  124. package/dist/chunk-HUBJAUGG.js +0 -316
  125. package/dist/chunk-HUBJAUGG.js.map +0 -1
  126. package/dist/chunk-I2TAAJHS.js +0 -465
  127. package/dist/chunk-I2TAAJHS.js.map +0 -1
  128. package/dist/chunk-ICTRCKUE.js +0 -3710
  129. package/dist/chunk-ICTRCKUE.js.map +0 -1
  130. package/dist/chunk-IPXN646P.js +0 -14
  131. package/dist/chunk-IPXN646P.js.map +0 -1
  132. package/dist/chunk-IRWSRJ4K.js +0 -48
  133. package/dist/chunk-IRWSRJ4K.js.map +0 -1
  134. package/dist/chunk-JOPU6WPY.js +0 -504
  135. package/dist/chunk-JOPU6WPY.js.map +0 -1
  136. package/dist/chunk-MGGY74RY.js +0 -14
  137. package/dist/chunk-MGGY74RY.js.map +0 -1
  138. package/dist/chunk-PVPPAWVM.js +0 -46
  139. package/dist/chunk-PVPPAWVM.js.map +0 -1
  140. package/dist/chunk-R7QGMK6N.js +0 -102
  141. package/dist/chunk-R7QGMK6N.js.map +0 -1
  142. package/dist/chunk-RT6DSB5Y.js +0 -143
  143. package/dist/chunk-RT6DSB5Y.js.map +0 -1
  144. package/dist/chunk-TRCWINHF.js +0 -105
  145. package/dist/chunk-TRCWINHF.js.map +0 -1
  146. package/dist/chunk-TW7LPMVR.js +0 -16
  147. package/dist/chunk-TW7LPMVR.js.map +0 -1
  148. package/dist/chunk-UTYKLGGT.js +0 -195
  149. package/dist/chunk-UTYKLGGT.js.map +0 -1
  150. package/dist/chunk-VNJJCH5A.js +0 -822
  151. package/dist/chunk-VNJJCH5A.js.map +0 -1
  152. package/dist/chunk-XJHZWSKV.js +0 -1103
  153. package/dist/chunk-XJHZWSKV.js.map +0 -1
  154. package/dist/chunk-Y3GYJ7YR.js +0 -549
  155. package/dist/chunk-Y3GYJ7YR.js.map +0 -1
  156. package/dist/chunk-YA4EE7ST.js +0 -14107
  157. package/dist/chunk-YA4EE7ST.js.map +0 -1
  158. package/dist/chunk-YDHXWCCJ.js +0 -145
  159. package/dist/chunk-YDHXWCCJ.js.map +0 -1
  160. package/dist/chunk-YE6GUDGP.js +0 -548
  161. package/dist/chunk-YE6GUDGP.js.map +0 -1
  162. package/dist/chunk-YNKK7NE3.js +0 -171
  163. package/dist/chunk-YNKK7NE3.js.map +0 -1
  164. package/dist/chunk-YPO6RDMX.js +0 -20
  165. package/dist/chunk-YPO6RDMX.js.map +0 -1
  166. package/dist/chunk-ZS7PMGUW.js +0 -7
  167. package/dist/chunk-ZS7PMGUW.js.map +0 -1
  168. package/dist/file-intake/index.js.map +0 -1
  169. package/dist/index.js.map +0 -1
  170. package/dist/map/index.js.map +0 -1
  171. package/dist/markdown/index.js.map +0 -1
  172. package/dist/markup/index.js.map +0 -1
  173. package/dist/page-tabs/index.js.map +0 -1
  174. package/dist/sounds-NT4DEZGD.js +0 -3
  175. package/dist/sounds-NT4DEZGD.js.map +0 -1
  176. package/dist/ui/index.js.map +0 -1
@@ -0,0 +1,187 @@
1
+ import{PdfViewer as e,ToolbarSlotContext as t,PanelActions as n}from"./chunk-CVTOZCM3.js";import{ImageAnnotator_default as r}from"./chunk-L7TEFXIS.js";import{AboutApp as i}from"./chunk-RJ4LACFH.js";import{peekPdfPreviewStage as o,claimPdfPreviewStage as s,PDF_PREVIEW_UPDATE_EVENT as a}from"./chunk-ESL5TDNA.js";import{toast_default as l}from"./chunk-KKOHUQPF.js";import"./chunk-TWV42Q3K.js";import{WindowTitle as c,getActiveModalId as d}from"./chunk-7DAQ3WVP.js";import"./chunk-V453E4KU.js";import"./chunk-UB4JIOLD.js";import"./chunk-PH3PRIFP.js";import"./chunk-2RHMSFZV.js";import{registerModalEscapeInterceptor as u}from"./chunk-LVFMK5OQ.js";import"./chunk-57MIENLJ.js";import"./chunk-MAIHBBWT.js";import"./chunk-TR6PLN7W.js";import"./chunk-D65T4H6J.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||d()===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?l.error("DWG files need server-side conversion. Convert to PDF or DXF first."):l.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(c,{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),[c,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),V=p(P);m(()=>{W.current=D},[D]),m(()=>{V.current=P},[P]);const X=p(null),$=p(null),U=p(null),[_,G]=h(""),[Y,q]=h(null),Z=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||c||!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 d=document.createElementNS("http://www.w3.org/2000/svg","svg");d.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),d.appendChild(u),l.appendChild(d);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",d.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",d.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",d.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",d.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",d.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:d,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`},_=()=>{const e=Q.current;if(!e||!e.rawSecondClick||e.picks.length<2)return;const t=e.picks[0],n=e.rawSecondClick,r=V.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)}}},G=(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"},Y=()=>{const e=Q.current;if(!e)return;_();const t=W.current,n=V.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=G(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=G(t,o),a=(()=>{const e=Q.current,t=e.picks[0],n=e.picks[1],r=G(t,n),i=W.current,o=V.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=Z();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")},Z=()=>{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;_();const t=e.picks[0],n=e.picks[1],r=W.current,i=G(t,n),o=V.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),q(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}`};X.current=()=>{ae(),Y()};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),Y()};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()),Y())},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",Y)}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",Y)}catch{}r.removeEventListener("pointermove",oe),window.removeEventListener("keydown",ue),X.current=null,$.current=null,U.current=null,i(),T(null),I(null)}},[E,a,c,ee]),m(()=>{X.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&&d()!==r.dataset.modalId||K.current?.focus()};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]);const re=p(_),ie=p(E);m(()=>{re.current=_},[_]),m(()=>{ie.current=E},[E]),m(()=>u(()=>{const e=J.current;if(!e)return!1;const t=e.closest("[data-modal-id]");return!(!t||d()!==t.dataset.modalId)&&(re.current?(G(""),q("*Cancel*"),!0):!!ie.current&&(S(!1),q("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&&!c&&/* @__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…"}),c&&/* @__PURE__ */y("div",{className:"absolute inset-0 flex items-center justify-center text-sm text-red-600 px-6 text-center",children:c})]}),
80
+ /* @__PURE__ */x("div",{className:"shrink-0 border-t border-gray-200 bg-gray-50",children:[Y&&/* @__PURE__ */y("div",{className:"px-2.5 pt-1 text-[11px] font-mono text-gray-500 truncate",title:Y,children:Y}),
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:_,onChange:e=>G(e.target.value),onKeyDown:e=>{"Enter"===e.key||" "===e.key?(e.preventDefault(),(e=>{const t=e.trim()||Z.current;if(G(""),!t)return;const n=t.toLowerCase().split(/\s+/)[0],r=()=>{Z.current=t},i=(e,t)=>{S(!0),j(e),$.current?.(),q(t),r()};if(/^-?(\d+\.?\d*|\.\d+)$/.test(n))if(!E||"horizontal"!==D&&"vertical"!==D)q("Fixed distances apply in H or V mode — type H or V first.");else{const e=parseFloat(n);e?(O(n),B(e),q(`Δ${"horizontal"===D?"X":"Y"} locked to ${z(Math.abs(e))} — the label shows the perpendicular distance`)):(O(""),B(null),q("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"),q("Horizontal — ΔX between the two picks"),r();break;case"v":case"ver":case"vertical":S(!0),j("vertical"),q("Vertical — ΔY between the two picks"),r();break;case"au":case"auto":S(!0),j("auto"),q("Auto (DIMLINEAR) — measures along the dominant axis of the two picks"),r();break;case"measure":S(!E),q(E?"Measure off.":"Measure on — click two points."),r();break;case"u":case"undo":U.current?.(),q("Last pick removed."),r();break;case"z":case"ze":case"zoom":case"fit":case"zoomextents":ne(),q("Zoom extents."),r();break;case"la":case"layer":case"layers":C(e=>!e),q("Layer panel toggled."),r();break;case"off":case"clear":B(null),O(""),$.current?.(),q("Measurement cleared."),r();break;case"?":case"help":q(L);break;default:{const e=N[n];q(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)`)}}})(_)):"Escape"===e.key&&(_?(e.stopPropagation(),G(""),q("*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,V]=h(!1),[X,$]=h(!1),[U,_]=h(!1),[G,Y]=h("x"),[q,Z]=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"===G?0:"y"===G?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=q?-1:1;let d=0,u=0,p=0;"x"===G?(d=c*a,p=c*l):"y"===G?(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"===G?o:h.x,x="y"===G?o:h.y,y="z"===G?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,G,q,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(X?e.ProjectionMode.Perspective:e.ProjectionMode.Orthographic)}catch{}},[X,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:X?"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:X?"Switch to orthographic view":"Switch to perspective view",children:/* @__PURE__ */y("span",{className:"text-[11px] font-semibold whitespace-nowrap",children:X?"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:()=>V(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:()=>V(!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:()=>_(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:()=>Z(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:q?"← flipped":"flip →"})]}),
163
+ /* @__PURE__ */y("div",{className:"grid grid-cols-3 gap-1",children:["x","y","z"].map(e=>/* @__PURE__ */y("button",{onClick:()=>Y(e),className:"py-1 rounded text-[11px] font-semibold "+(G===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),_(!1),Y("x"),Z(!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),[c,d]=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{l.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:c?/* @__PURE__ */y("div",{className:"text-sm text-red-600",children:"Failed to load image."}):/* @__PURE__ */y("img",{src:e,alt:t,onError:()=>d(!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};
@@ -0,0 +1,23 @@
1
+ import{useAuth as e}from"./chunk-LVDRBRYU.js";import{BrandMark as t}from"./chunk-OCSOMMY2.js";import{startMenuCategories as r,navVisible as n,navSections as a,isSection as o,isReachable as l,navIcons as s,sectionIcons as i,visibleChildren as c}from"./chunk-UB4JIOLD.js";import{glassStyle as d,GLASS_INPUT_BG as h}from"./chunk-57MIENLJ.js";import"./chunk-MAIHBBWT.js";import{useState as m,useRef as u,useMemo as p,useEffect as f,isValidElement as v,cloneElement as x}from"react";import{jsxs as b,jsx as g,Fragment as N}from"react/jsx-runtime";function k({width:k,openPage:w,profile:y,user:L,onLogout:A,onNavigate:C,navSections:j=a,navIcons:S=s,sectionIcons:M=i,categories:I=r,productName:B,productIcon:E,adaptiveLogo:$=!1,logoHasAlpha:_=null,logoIsLight:W=null}){const{hasAnyPerm:O}=e(),P=new Set(I.erp),T=new Set(I.system),U=new Set(I.footer??[]),z=(I.footerItems??[]).filter(e=>n(e,O)),D=I.virtual??[],[H,R]=m(""),[V,J]=m(/* @__PURE__ */new Set),Y=u(null),X=e=>{J(t=>{const r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r})},q=j.filter(e=>!o(e)).filter(e=>n(e,O)&&l(e,O)),F=j.filter(e=>o(e)&&P.has(e.label)),G=j.filter(e=>o(e)&&T.has(e.label)),K=j.filter(e=>o(e)&&U.has(e.label)),Q=e=>n(e,O)?e.items.filter(e=>n(e,O)).filter(e=>l(e,O)):[],Z=(e,t)=>{if(!n(e,O))return[];if(!l(e,O))return[];const r=[];e.label.toLowerCase().includes(t)&&r.push(e);for(const n of c(e,O))r.push(...Z(n,t));return r},ee=p(()=>{if(H.length<2)return[];const e=H.toLowerCase();return[...j.flatMap(t=>o(t)?Q(t).flatMap(t=>Z(t,e)):Z(t,e)),...z.flatMap(t=>Z(t,e))]},[H,j,z,O]);f(()=>{const e=e=>{"Escape"===e.key?(J(/* @__PURE__ */new Set),R("")):"/"===e.key&&"INPUT"!==document.activeElement?.tagName&&"TEXTAREA"!==document.activeElement?.tagName&&(e.preventDefault(),Y.current?.focus())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]);const te=e=>{C(e),ne()},re=e=>{if(e.onSelect)return e.onSelect(),void ne();te(e.to)},ne=()=>{R("")},ae="w-full flex items-center gap-2 rounded-lg px-3 py-2 text-sm",oe=d(),le=e=>{const t=S[e];return t&&v(t)?x(t,{className:"h-4 w-4 shrink-0 text-gray-500"}):/* @__PURE__ */g("span",{className:"h-4 w-4 shrink-0"})},se=e=>{const t=M[e];return t&&v(t)?x(t,{className:"h-4 w-4 shrink-0 text-gray-500"}):/* @__PURE__ */g("span",{className:"h-4 w-4 shrink-0"})},ie=e=>/* @__PURE__ */b("div",{children:[
2
+ /* @__PURE__ */b("button",{onClick:()=>re(e),className:`${ae} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,children:[le(e.to),
3
+ /* @__PURE__ */g("span",{className:"truncate",children:e.label})]}),e.dividerAfter&&/* @__PURE__ */g("div",{className:"border-t border-white/20 my-1.5 mx-2"})]},e.to),ce=e=>{const t=c(e,O).filter(e=>l(e,O));if(0===t.length)return ie(e);const r=`child:${e.to}`,n=V.has(r);/* @__PURE__ */
4
+ return b("div",{children:[
5
+ /* @__PURE__ */b("button",{onClick:()=>X(r),"aria-expanded":n,className:`${ae} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,children:[le(e.to),
6
+ /* @__PURE__ */g("span",{className:"truncate",children:e.label}),
7
+ /* @__PURE__ */g("svg",{className:"h-3.5 w-3.5 ml-auto text-gray-500 transition-transform "+(n?"rotate-90":""),fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */g("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8.25 4.5l7.5 7.5-7.5 7.5"})})]}),n&&/* @__PURE__ */g("div",{className:"pl-4 mt-0.5 mb-1 space-y-0.5",children:t.map(e=>ce(e))}),e.dividerAfter&&/* @__PURE__ */g("div",{className:"border-t border-white/20 my-1.5 mx-2"})]},e.to)},de=(e,t,r=!1)=>{const n=r?e.items:Q(e);if(0===n.length)return null;const a=V.has(e.label);/* @__PURE__ */
8
+ return b("div",{children:[
9
+ /* @__PURE__ */b("button",{onClick:()=>X(e.label),"aria-expanded":a,className:`${ae} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,children:["icon"in e&&e.icon?e.icon:se(e.label),
10
+ /* @__PURE__ */g("span",{className:"truncate "+(t?"font-medium":""),children:e.label}),
11
+ /* @__PURE__ */g("svg",{className:"h-3.5 w-3.5 ml-auto text-gray-500 transition-transform "+(a?"rotate-90":""),fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */g("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8.25 4.5l7.5 7.5-7.5 7.5"})})]}),a&&/* @__PURE__ */g("div",{className:"pl-4 mt-0.5 mb-1 space-y-0.5",children:n.map(e=>ce(e))}),"dividerAfter"in e&&e.dividerAfter&&/* @__PURE__ */g("div",{className:"border-t border-white/20 my-1.5 mx-2"})]},e.label)};/* @__PURE__ */
12
+ return b("div",{className:"fixed top-0 left-0 bottom-0 z-[260] flex flex-col rounded-r-2xl overflow-hidden",style:{width:k,...oe},children:[
13
+ /* @__PURE__ */b("div",{className:"flex items-center gap-2 px-4 py-3 border-b border-white/15 shrink-0",children:[E&&/* @__PURE__ */g(t,{src:E,alt:"",slot:"compact",surface:"light",adaptive:$,hasAlpha:_,isLight:W,size:20,decorative:!0,className:"opacity-80"}),
14
+ /* @__PURE__ */g("span",{className:"text-sm font-semibold text-gray-800 truncate",children:B??"Apps"})]}),
15
+ /* @__PURE__ */g("div",{className:"px-3 pt-3 pb-2 shrink-0",children:/* @__PURE__ */b("div",{className:`flex items-center gap-2 ${h} rounded-lg px-2.5 py-1.5`,children:[
16
+ /* @__PURE__ */g("svg",{className:"h-3.5 w-3.5 text-gray-400 shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */g("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.607z"})}),
17
+ /* @__PURE__ */g("input",{ref:Y,value:H,onChange:e=>R(e.target.value),placeholder:"Search...",className:"flex-1 bg-transparent text-xs outline-none placeholder-gray-400"}),H&&/* @__PURE__ */g("button",{onClick:()=>R(""),className:"text-gray-400 hover:text-gray-600 text-xs",children:"×"})]})}),
18
+ /* @__PURE__ */g("div",{className:"flex-1 overflow-y-auto px-1 pb-1",children:H.length>=2?
19
+ /* @__PURE__ */g("div",{children:0===ee.length?/* @__PURE__ */g("div",{className:"px-3 py-6 text-center text-xs text-gray-400",children:"No matches"}):ee.map(e=>/* @__PURE__ */b("button",{onClick:()=>re(e),className:`${ae} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`,children:[le(e.to),
20
+ /* @__PURE__ */g("span",{className:"truncate",children:e.label})]},e.to))}):/* @__PURE__ */b(N,{children:[q.map(ie),q.length>0&&(F.length>0||G.length>0||D.length>0)&&/* @__PURE__ */g("div",{className:"border-t border-white/15 my-1.5 mx-2"}),F.map(e=>de(e,!0)),G.map(e=>de(e,!1)),D.map(e=>de(e,!1,!0)),(K.length>0||z.length>0)&&/* @__PURE__ */g("div",{className:"border-t border-white/15 my-1.5 mx-2"}),K.map(e=>de(e,!1)),z.map(ie)]})}),
21
+ /* @__PURE__ */g("div",{className:"border-t border-white/15 p-1 shrink-0",children:/* @__PURE__ */b("div",{onClick:()=>te("/profile"),className:"rounded-lg px-2 py-1.5 flex items-center gap-2.5 hover:bg-blue-50 hover:text-blue-700 transition-colors cursor-pointer",children:[y?.avatar_url?/* @__PURE__ */g("img",{src:y.avatar_url,alt:"",className:"h-8 w-8 rounded-full object-cover border border-white/20 shrink-0"}):/* @__PURE__ */g("div",{className:"h-8 w-8 rounded-full bg-blue-100 flex items-center justify-center text-sm font-bold text-blue-700 shrink-0",children:(y?.first_name?.charAt(0)||L?.email?.charAt(0)||"?").toUpperCase()}),
22
+ /* @__PURE__ */g("p",{className:"flex-1 min-w-0 text-sm font-medium text-gray-900 truncate",children:y?.first_name?`${y.first_name} ${y.last_name||""}`.trim():L?.email}),
23
+ /* @__PURE__ */g("button",{onClick:e=>{e.stopPropagation(),A()},title:"Sign Out",className:"shrink-0 p-1.5 rounded-md text-gray-500 hover:text-red-600 hover:bg-red-50 transition-colors",children:/* @__PURE__ */g("svg",{className:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */g("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9"})})})]})})]})}export{k as default};
@@ -0,0 +1,37 @@
1
+ import{EditableGrid as e}from"./chunk-TFKB2WEB.js";import"./chunk-BR22X7E5.js";import{AboutApp as t}from"./chunk-RJ4LACFH.js";import{peekSpreadsheetPreviewStage as r,claimSpreadsheetPreviewStage as n,SPREADSHEET_PREVIEW_UPDATE_EVENT as o}from"./chunk-VTVSMRFX.js";import"./chunk-TWV42Q3K.js";import{WindowTitle as a}from"./chunk-7DAQ3WVP.js";import"./chunk-V453E4KU.js";import"./chunk-UB4JIOLD.js";import"./chunk-PH3PRIFP.js";import"./chunk-2RHMSFZV.js";import"./chunk-LVFMK5OQ.js";import"./chunk-57MIENLJ.js";import"./chunk-MAIHBBWT.js";import"./chunk-TR6PLN7W.js";import"./chunk-D65T4H6J.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 w(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 k(){const m=l(null),g=l(void 0);void 0===g.current&&(g.current=r());const k=l(g.current?.data??null),N=(()=>{const e=g.current;if(!e)return null;const t=w(e.data.csv,"Sheet 1");if(!t)return null;return{sheet:t,title:e.data.filename.replace(/\.(csv|tsv|txt)$/i,"")}})(),[C,S]=s(N?[N.sheet]:[f("Sheet 1")]),[j,M]=s(0),$=l([]),E=l(C),U=l(!1);c(()=>{U.current?U.current=!1:E.current!==C&&($.current.push(E.current),$.current.length>50&&$.current.shift()),E.current=C},[C]);const L=i(()=>{const e=$.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(),L())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[L]);const[A,D]=s(N?.title??"Untitled"),[F,R]=s(()=>g.current?.data.onEmail),B=i(e=>{const t=w(e.csv,"Sheet 1");t&&(S([t]),M(0),D(e.filename.replace(/\.(csv|tsv|txt)$/i,"")),R(()=>e.onEmail))},[]);c(()=>{const e=g.current;null!=e&&(n(e),e.data!==k.current&&B(e.data))},[]),c(()=>{const e=g.current?.token;if(null==e)return;const t=t=>{const r=t.detail;r&&r.token===e&&B(r.data)};return window.addEventListener(o,t),()=>window.removeEventListener(o,t)},[]);const[I,K]=s(!1),[V,H]=s(null),[P,T]=s(""),O=l(null),[W,J]=s("1"),[z,Q]=s("10"),X=C[j]||C[0],Z=X.data,_=X.columns,G=X.cellStyles??{},[Y,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 Y?[Y]:[]},[ee,Y]),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}:Y,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!==_.length?se({data:e,columns:y(t)}):se({data:e})},[se,_.length]),ie=(e,t)=>{S(r=>r.map((r,n)=>n===e?{...r,name:t}:r)),H(null)},ue=()=>Z.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=[];Z.forEach(e=>e.forEach(e=>{const t=parseFloat(e);!isNaN(t)&&e.trim()&&de.push(t)}));const he=Z.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=A||"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:[I?/* @__PURE__ */d("input",{type:"text",value:A,onChange:e=>D(e.target.value),onBlur:()=>K(!1),onKeyDown:e=>{"Enter"===e.key&&K(!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:()=>K(!0),className:"text-sm font-medium text-gray-900 hover:text-blue-600 truncate max-w-[200px]",title:"Click to rename",children:A||"Untitled"}),
6
+ /* @__PURE__ */d("div",{className:"h-4 w-px bg-gray-300"}),
7
+ /* @__PURE__ */d("input",{ref:O,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),M(0),D(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}),D(r)}O.current&&(O.current.value="")},className:"hidden"}),
8
+ /* @__PURE__ */d("button",{onClick:()=>O.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=`${A||"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(),`${A||"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:W,onChange:e=>J(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=_.length+e;se({columns:y(t),data:Z.map(t=>[...t,...Array(e).fill("")])})})(parseInt(W)||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:z,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(z)||10,void se({data:[...Z,...Array.from({length:e},()=>Array(_.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:_,data:Z,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:[C.map((e,t)=>/* @__PURE__ */d("button",{onClick:()=>M(t),onDoubleClick:()=>{H(t),T(e.name)},onContextMenu:e=>{e.preventDefault(),C.length>1&&(e=>{C.length<=1||(S(t=>t.filter((t,r)=>r!==e)),j>=e&&j>0&&M(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:V===t?/* @__PURE__ */d("input",{type:"text",value:P,onChange:e=>T(e.target.value),onBlur:()=>ie(t,P||e.name),onKeyDown:r=>{"Enter"===r.key&&ie(t,P||e.name),"Escape"===r.key&&H(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 ${C.length+1}`;S(t=>[...t,f(e)]),M(C.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:[Z.length," × ",_.length]})]})]})]});var me}export{k as default};
@@ -0,0 +1,16 @@
1
+ import{loadAppearance as e,WidgetSettingsModal as t}from"./chunk-GDSGXDET.js";import{useWidgetSettings as a}from"./chunk-7DAQ3WVP.js";import"./chunk-V453E4KU.js";import"./chunk-UB4JIOLD.js";import"./chunk-PH3PRIFP.js";import"./chunk-2RHMSFZV.js";import"./chunk-LVFMK5OQ.js";import"./chunk-57MIENLJ.js";import"./chunk-MAIHBBWT.js";import"./chunk-TR6PLN7W.js";import"./chunk-D65T4H6J.js";import{useState as r,useCallback as n}from"react";import{jsxs as c,Fragment as s,jsx as i}from"react/jsx-runtime";var l=["AAPL","MSFT","GOOGL","TSLA","NVDA"],o="stock_symbols",m="stock_appearance",d={AAPL:{price:229.87,change:1.42,changePct:.62},MSFT:{price:451.16,change:-2.31,changePct:-.51},GOOGL:{price:178.34,change:.89,changePct:.5},AMZN:{price:201.45,change:-1.08,changePct:-.53},TSLA:{price:248.92,change:6.74,changePct:2.78},NVDA:{price:134.81,change:-3.12,changePct:-2.26},META:{price:563.27,change:4.55,changePct:.81}},g=Object.keys(d);function p(){try{const e=JSON.parse(localStorage.getItem(o)||"");if(Array.isArray(e)&&e.length)return e.slice(0,8)}catch{}return l}var h=e=>`${e>=0?"+":""}${e.toFixed(2)}`;function x(){const[l,x]=r(p),[u,y]=r(()=>e(m)),[b,f]=r(!1),[N,v]=r([]),[k,A]=r(u),[S,j]=r(""),P=n(()=>{v([...l]),A({...u}),j(""),f(!0)},[l,u]);a(P);const D=()=>{const e=S.trim().toUpperCase();!e||N.includes(e)||N.length>=8||(v(t=>[...t,e]),j(""))},L=g.filter(e=>!N.includes(e));/* @__PURE__ */
2
+ return c(s,{children:[
3
+ /* @__PURE__ */i("div",{style:{backgroundColor:`rgb(var(--taskbar-bg-rgb, 243 244 246) / ${u.activeOpacity/100})`,backdropFilter:u.activeBlur>0?`blur(${u.activeBlur}px)`:void 0},children:/* @__PURE__ */i("div",{className:"px-4 py-3",children:0===l.length?/* @__PURE__ */i("div",{className:"text-xs text-gray-500 text-center py-6",children:"No symbols yet — add some in settings."}):/* @__PURE__ */i("div",{className:"space-y-0.5",children:l.map(e=>{const t=d[e],a=(t?.change??0)>=0,r=t?t.change>0?"text-green-600":t.change<0?"text-red-600":"text-gray-500":"text-gray-400";/* @__PURE__ */
4
+ return c("div",{className:"flex items-center justify-between px-2 py-2 border-b border-gray-200 last:border-0",children:[
5
+ /* @__PURE__ */i("span",{className:"text-sm font-bold text-gray-800 tracking-tight",children:e}),t?/* @__PURE__ */c("div",{className:"flex flex-col items-end leading-tight",children:[
6
+ /* @__PURE__ */i("span",{className:"text-sm font-mono font-semibold text-gray-900 tabular-nums",children:(n=t.price,`$${n.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2})}`)}),
7
+ /* @__PURE__ */c("span",{className:`text-[11px] font-medium tabular-nums ${r}`,children:[a?"▲":"▼"," ",h(t.change)," (",h(t.changePct),"%)"]})]}):/* @__PURE__ */i("span",{className:"text-sm font-mono text-gray-400 tabular-nums",children:"—"})]},e);var n})})})}),
8
+ /* @__PURE__ */i(t,{open:b,onClose:()=>f(!1),title:"Stock Settings",appearance:k,onAppearanceChange:A,onSave:()=>{const e=N.map(e=>e.toUpperCase()).slice(0,8);x(e),y(k),localStorage.setItem(o,JSON.stringify(e)),localStorage.setItem(m,JSON.stringify(k)),f(!1)},children:/* @__PURE__ */c("div",{children:[
9
+ /* @__PURE__ */c("h3",{className:"text-sm font-semibold text-gray-700 mb-2",children:["Symbols ",
10
+ /* @__PURE__ */c("span",{className:"text-[11px] font-normal text-gray-400",children:["(",N.length,"/",8,")"]})]}),
11
+ /* @__PURE__ */c("div",{className:"space-y-1 mb-2",children:[N.map((e,t)=>/* @__PURE__ */c("div",{className:"flex items-center justify-between py-1 px-2 bg-gray-50 rounded",children:[
12
+ /* @__PURE__ */i("span",{className:"text-sm font-semibold text-gray-700",children:e}),
13
+ /* @__PURE__ */i("button",{onClick:()=>v(e=>e.filter((e,a)=>a!==t)),className:"text-red-400 hover:text-red-600",children:"×"})]},t)),0===N.length&&/* @__PURE__ */i("p",{className:"text-[11px] text-gray-400 italic",children:"No symbols — add a ticker below."})]}),N.length<8?/* @__PURE__ */c("div",{className:"flex items-center gap-2",children:[
14
+ /* @__PURE__ */i("input",{value:S,onChange:e=>j(e.target.value),onKeyDown:e=>{"Enter"===e.key&&D()},placeholder:"e.g. NVDA",className:"flex-1 bg-gray-50 border border-gray-200 rounded px-2 py-1 text-sm uppercase focus:outline-none focus:ring-1 focus:ring-blue-500"}),
15
+ /* @__PURE__ */i("button",{onClick:D,className:"text-sm font-medium text-blue-600 hover:text-blue-800 px-2",children:"+ Add"})]}):/* @__PURE__ */c("p",{className:"text-[11px] text-gray-400 italic",children:["Max ",8," symbols — remove one to add another."]}),L.length>0&&N.length<8&&/* @__PURE__ */i("div",{className:"flex flex-wrap gap-1.5 mt-2",children:L.map(e=>/* @__PURE__ */i("button",{onClick:()=>v(t=>t.length<8?[...t,e]:t),className:"text-[11px] font-medium text-gray-600 bg-gray-100 hover:bg-gray-200 rounded px-2 py-0.5 transition-colors",children:e},e))}),
16
+ /* @__PURE__ */i("p",{className:"text-[11px] text-gray-400 mt-2",children:"Demo prices — static sample data, no live feed."})]})})]})}export{x as default};