efficient-shell 4.165.0 → 4.166.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 (56) hide show
  1. package/README.md +75 -2
  2. package/dist/{Browser-ZX5GWPSM.js → Browser-2MBG34IR.js} +14 -14
  3. package/dist/Calculator-R3WJTNZ6.js +29 -0
  4. package/dist/ConfirmDialog-ZDVMT74Y.js +1 -0
  5. package/dist/{CurrencyConverter-7OPRFA5D.js → CurrencyConverter-PEXSQQUK.js} +7 -7
  6. package/dist/{Documents-QV63346J.js → Documents-YL4RIOZO.js} +15 -15
  7. package/dist/{Files-BU5V56YF.js → Files-3ZRUTRSB.js} +22 -22
  8. package/dist/Notepad-3ZM2FR6C.js +25 -0
  9. package/dist/{PomodoroTimer-FJV6MGE3.js → PomodoroTimer-5QHA5UOY.js} +14 -14
  10. package/dist/{Preview-PMQKG6FH.js → Preview-32F4DTCK.js} +9 -9
  11. package/dist/{Sidebar-E6GLVCJL.js → Sidebar-QQSRLMJG.js} +22 -22
  12. package/dist/Spreadsheet-GOZI7I4L.js +37 -0
  13. package/dist/{Stock-SSNUY34E.js → Stock-XJFITZZA.js} +4 -4
  14. package/dist/{Weather-T5WM66B2.js → Weather-BDC633GV.js} +16 -16
  15. package/dist/{WorldClock-C3GT27AV.js → WorldClock-ROOVRRCJ.js} +7 -7
  16. package/dist/apps/index.js +1 -1
  17. package/dist/brand.css +1 -1
  18. package/dist/{chunk-QTPVA26D.js → chunk-7TQ7NMT3.js} +1 -1
  19. package/dist/{chunk-PLX2N4N6.js → chunk-7YFAFXQG.js} +2 -2
  20. package/dist/chunk-AFYQTVZO.js +1 -0
  21. package/dist/chunk-BKDE67DB.js +12 -0
  22. package/dist/{chunk-A7Q4BCPI.js → chunk-CRI4UFBU.js} +5 -5
  23. package/dist/{chunk-DJ6UVHAZ.js → chunk-DTRXR6JQ.js} +11 -11
  24. package/dist/chunk-G5J6YSN5.js +5 -0
  25. package/dist/{chunk-YWXYBJ5Y.js → chunk-HA2WG27U.js} +2 -2
  26. package/dist/{chunk-D7EJSASN.js → chunk-HGG5M5AB.js} +1 -1
  27. package/dist/chunk-HZZNJHRH.js +1 -0
  28. package/dist/chunk-JKVDTKBE.js +988 -0
  29. package/dist/chunk-M4DB7UBZ.js +29 -0
  30. package/dist/{chunk-RKEHUV7U.js → chunk-QASZIYLG.js} +1 -1
  31. package/dist/chunk-SOI4LR67.js +27 -0
  32. package/dist/chunk-UVZIPXIA.js +10 -0
  33. package/dist/chunk-VRHUY4P4.js +1 -0
  34. package/dist/{chunk-ZLJCWBDF.js → chunk-VXBJNMAA.js} +60 -60
  35. package/dist/chunk-X4FJ54PP.js +1 -0
  36. package/dist/{index-DRkpyISn.d.ts → index-DcLqfJX3.d.ts} +182 -13
  37. package/dist/index.d.ts +3 -13
  38. package/dist/index.js +83 -83
  39. package/dist/map/index.js +3 -3
  40. package/dist/page-tabs/index.js +5 -5
  41. package/dist/ui/index.d.ts +1 -1
  42. package/dist/ui/index.js +1 -1
  43. package/package.json +1 -1
  44. package/dist/Calculator-NZH4FVRW.js +0 -29
  45. package/dist/ConfirmDialog-WEVZTFLU.js +0 -1
  46. package/dist/Notepad-KZIJ5ZTF.js +0 -25
  47. package/dist/Spreadsheet-DE5HPVE2.js +0 -37
  48. package/dist/chunk-4UCRT4ST.js +0 -5
  49. package/dist/chunk-ELSUXC3N.js +0 -1
  50. package/dist/chunk-FGPWGHNT.js +0 -27
  51. package/dist/chunk-KRTZFHYW.js +0 -29
  52. package/dist/chunk-MAIHBBWT.js +0 -1
  53. package/dist/chunk-SHVGZW2J.js +0 -1
  54. package/dist/chunk-SQ7BPUZG.js +0 -9
  55. package/dist/chunk-VDL2RLZG.js +0 -10
  56. package/dist/chunk-XYITV4EC.js +0 -983
@@ -0,0 +1,25 @@
1
+ import{getNumberingConfigs as e}from"./chunk-7TQ7NMT3.js";import{SidebarLayout as t}from"./chunk-G5J6YSN5.js";import{AboutApp as r}from"./chunk-HGG5M5AB.js";import{toast_default as n}from"./chunk-KSSAVLO7.js";import"./chunk-VRHUY4P4.js";import{useWindowManager as o,client_default as i}from"./chunk-VXBJNMAA.js";import{useShellPrefs as s}from"./chunk-CRI4UFBU.js";import"./chunk-DSSLOQDW.js";import"./chunk-5A7MWTXX.js";import{timeAgo as l}from"./chunk-S2AZZGFF.js";import"./chunk-BKDE67DB.js";import"./chunk-6KO2U66R.js";import"./chunk-M4DB7UBZ.js";import"./chunk-UVZIPXIA.js";import"./chunk-AFYQTVZO.js";import"./chunk-HZZNJHRH.js";import"./chunk-D65T4H6J.js";import"./chunk-X4FJ54PP.js";import"./chunk-NCQLGQYR.js";import{useRef as c,useEffect as a,useState as d,useCallback as p}from"react";import{useQuery as u}from"@tanstack/react-query";import{jsxs as m,Fragment as h,jsx as g}from"react/jsx-runtime";var x=[{key:"yellow",bg:"bg-yellow-100",border:"border-yellow-300",text:"text-yellow-900",dot:"bg-yellow-400"},{key:"blue",bg:"bg-blue-100",border:"border-blue-300",text:"text-blue-900",dot:"bg-blue-400"},{key:"green",bg:"bg-green-100",border:"border-green-300",text:"text-green-900",dot:"bg-green-400"},{key:"pink",bg:"bg-pink-100",border:"border-pink-300",text:"text-pink-900",dot:"bg-pink-400"},{key:"purple",bg:"bg-purple-100",border:"border-purple-300",text:"text-purple-900",dot:"bg-purple-400"},{key:"orange",bg:"bg-orange-100",border:"border-orange-300",text:"text-orange-900",dot:"bg-orange-400"},{key:"white",bg:"bg-white",border:"border-gray-300",text:"text-gray-900",dot:"bg-gray-300"}];var y={sales_order:{entityType:"order",endpoint:"/orders/sales-orders/"},purchase_order:{entityType:"purchase_order",endpoint:"/purchase-orders/"},invoice:{entityType:"invoice",endpoint:"/invoicing/invoices/"},vendor_invoice:{entityType:"vendor_invoice",endpoint:"/invoicing/vendor-invoices/"},shipment:{entityType:"shipment",endpoint:"/shipments/delivery-notes/"},receipt:{entityType:"payment",endpoint:"/invoicing/payments/"},vendor_payment:{entityType:"vendor_payment",endpoint:"/invoicing/vendor-payments/"},vendor_price_sheet:{entityType:"vendor_price_sheet",endpoint:"/pricing/manufacturer-price-sheets/"},client_price_sheet:{entityType:"price_sheet",endpoint:"/pricing/price-sheets/"},qc_report:{entityType:"qc_report",endpoint:"/qc-reports/"},warranty_claim:{entityType:"warranty_claim",endpoint:"/warranty-claims/claims/"},vendor_shipment:{entityType:"vendor_shipment",endpoint:"/shipments/goods-receipts/"}},b=/\[([ xX]?)\]/g;function f(){const{openEntity:f}=o(),{prefs:k,save:v}=s(),{data:N}=u({queryKey:["numbering-configs"],queryFn:()=>e(),retry:!1}),w=c({});a(()=>{if(!N)return;const e={};for(const t of N){const r=y[t.entity_type];if(!r)continue;const n=(t.prefix||"").replace("#","").toUpperCase();if(n&&(e[n]={...r,prefix:t.prefix}),t.alt_prefix){const n=t.alt_prefix.replace("#","").toUpperCase();n&&(e[n]={...r,prefix:t.alt_prefix})}}w.current=e},[N]);const _=k.notepad_notes||[],[j,T]=d(null),[C,L]=d(""),[$,S]=d(""),[B,M]=d("yellow"),[X,W]=d(!1),[A,D]=d(!1),O=c(null),H=c(),U=_.find(e=>e.id===j);a(()=>{if(!j&&_.length>0){const e=_[0];T(e.id),L(e.title),S(e.content),M(e.color)}},[_.length]);const V=p(e=>{v({notepad_notes:e})},[v]),I=p(()=>{if(!j||!X)return;const e=_.map(e=>e.id===j?{...e,title:C,content:$,color:B,updated_at:/* @__PURE__ */(new Date).toISOString()}:e);V(e),W(!1)},[j,X,C,$,B,_,V]);a(()=>{if(X)return H.current&&clearTimeout(H.current),H.current=setTimeout(I,800),()=>{H.current&&clearTimeout(H.current)}},[X,I]),a(()=>()=>{X&&I()},[]);const P=e=>{X&&I(),T(e.id),L(e.title),S(e.content),M(e.color),W(!1),D(!1)},Z=e=>{const t=$.slice(0,e),r=$.slice(e).match(/^\[([ xX]?)\]/);if(!r)return;const n="x"===r[1]||"X"===r[1]?"[ ]":"[x]",o=$.slice(e+r[0].length);S(t+n+o),W(!0)},F=async(e,t)=>{const r=w.current[e];if(!r)return;const o=`${e}#${t}`;try{const{data:e}=await i.get(r.endpoint,{params:{search:o,page_size:1}}),t=(e?.results??e??[])[0];t?f(r.entityType,t.id,t,o):n.error(`${o} not found`)}catch{n.error(`Failed to look up ${o}`)}},R="Start writing...\n\nTips:\n [] Type [] for a checkbox, click to toggle\n SO#35001 Type XX#NNNNN to link entities (SO, PO, CI, VI, PL, etc.)",q=/* @__PURE__ */m(h,{children:[
2
+ /* @__PURE__ */g("div",{className:"p-2 border-b border-gray-200",children:/* @__PURE__ */m("button",{onClick:()=>{X&&I();const e={id:`note-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,title:"",content:"",color:"yellow",sticky:!1,updated_at:/* @__PURE__ */(new Date).toISOString()},t=[e,..._];V(t),T(e.id),L(""),S(""),M("yellow"),W(!1),D(!0),setTimeout(()=>O.current?.focus(),50)},className:"w-full flex items-center justify-center gap-1.5 rounded-lg bg-blue-600 text-white px-3 py-1.5 text-sm font-medium hover:bg-blue-700 transition-colors",children:[
3
+ /* @__PURE__ */g("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:/* @__PURE__ */g("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4.5v15m7.5-7.5h-15"})}),"New Note"]})}),
4
+ /* @__PURE__ */g("div",{className:"flex-1 overflow-y-auto",children:0===_.length?/* @__PURE__ */g("p",{className:"text-sm text-gray-400 text-center py-8 px-4",children:"No notes yet. Create one to get started."}):_.map(e=>{const t=(r=e.color,x.find(e=>e.key===r)||x[0]);var r;/* @__PURE__ */
5
+ return m("button",{onClick:()=>P(e),className:"w-full text-left px-3 py-2.5 border-b border-gray-100 transition-colors "+(j===e.id?"bg-blue-50":"hover:bg-gray-50"),children:[
6
+ /* @__PURE__ */m("div",{className:"flex items-center gap-2",children:[
7
+ /* @__PURE__ */g("div",{className:`w-2.5 h-2.5 rounded-full shrink-0 ${t.dot}`}),
8
+ /* @__PURE__ */g("span",{className:"text-sm font-medium text-gray-900 truncate flex-1",children:e.title||"Untitled"}),e.sticky&&/* @__PURE__ */g("svg",{className:"h-3 w-3 text-amber-500 shrink-0",fill:"currentColor",viewBox:"0 0 24 24",children:/* @__PURE__ */g("path",{d:"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z"})})]}),
9
+ /* @__PURE__ */g("p",{className:"text-xs text-gray-400 mt-0.5 truncate ml-4.5",children:e.content.replace(/\[[ xX]?\]/g,"").slice(0,60)||"Empty note"}),
10
+ /* @__PURE__ */g("p",{className:"text-[10px] text-gray-300 mt-0.5 ml-4.5",children:l(e.updated_at)})]},e.id)})})]});/* @__PURE__ */
11
+ return m("div",{className:"h-full",children:[
12
+ /* @__PURE__ */g(r,{app:"notepad"}),
13
+ /* @__PURE__ */g(t,{sidebar:q,storageKey:"notepad.sidebarWidth",defaultWidth:224,minWidth:180,maxWidth:360,children:j?/* @__PURE__ */m("div",{className:"flex-1 flex flex-col min-w-0",children:[
14
+ /* @__PURE__ */m("div",{className:"flex items-center gap-2 px-4 py-2 border-b border-gray-200",children:[
15
+ /* @__PURE__ */g("input",{value:C,onChange:e=>{L(e.target.value),W(!0)},placeholder:"Note title...",className:"flex-1 text-lg font-semibold text-gray-900 outline-none bg-transparent placeholder:text-gray-300"}),
16
+ /* @__PURE__ */g("div",{className:"flex gap-1",children:x.map(e=>/* @__PURE__ */g("button",{onClick:()=>{M(e.key),W(!0)},className:`w-5 h-5 rounded-full border-2 transition-all ${e.dot} ${B===e.key?"border-gray-600 scale-110":"border-transparent hover:border-gray-400"}`,title:e.key},e.key))}),
17
+ /* @__PURE__ */g("button",{onClick:()=>(e=>{const t=_.map(t=>t.id===e?{...t,sticky:!t.sticky}:t);V(t);const r=t.find(t=>t.id===e);n.success(r?.sticky?"Pinned to desktop":"Removed from desktop")})(j),title:U?.sticky?"Remove from desktop":"Pin to desktop",className:"p-1 rounded transition-colors "+(U?.sticky?"text-amber-500 hover:text-amber-600":"text-gray-300 hover:text-amber-400"),children:/* @__PURE__ */g("svg",{className:"h-4 w-4",fill:U?.sticky?"currentColor":"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */g("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z"})})}),
18
+ /* @__PURE__ */g("button",{onClick:()=>(e=>{const t=_.filter(t=>t.id!==e);if(V(t),j===e){const e=t[0];e?P(e):(T(null),L(""),S(""))}})(j),title:"Delete note",className:"p-1 rounded text-gray-300 hover:text-red-500 transition-colors",children:/* @__PURE__ */g("svg",{className:"h-4 w-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:/* @__PURE__ */g("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"})})})]}),A?/* @__PURE__ */g("textarea",{ref:O,value:$,onChange:e=>{S(e.target.value),W(!0)},onBlur:()=>{D(!1),X&&I()},placeholder:R,className:"flex-1 p-4 text-sm text-gray-700 outline-none resize-none bg-transparent leading-relaxed placeholder:text-gray-300 font-mono"}):/* @__PURE__ */g("div",{onClick:()=>{D(!0),setTimeout(()=>O.current?.focus(),50)},className:"flex-1 p-4 text-sm text-gray-700 overflow-y-auto leading-relaxed cursor-text",children:$?(e=>{if(!e)return[];const t=e.split("\n");return t.map((e,r)=>{const n=[];let o=0;const i=[],s=/([A-Z]{2,4})#(\d{4,6})/g;let l;for(;null!==(l=s.exec(e));){const e=l[1],t=l[2];if(w.current[e]){const n=l.index,o=l[0];i.push({idx:n,len:o.length,render:()=>/* @__PURE__ */g("button",{onClick:()=>F(e,t),className:"text-blue-600 hover:text-blue-800 hover:underline font-medium cursor-pointer",children:o},`ref-${r}-${n}`)})}}b.lastIndex=0;let c=0;for(let e=0;e<r;e++)c+=t[e].length+1;for(;null!==(l=b.exec(e));){const e="x"===l[1]||"X"===l[1],t=l.index,n=c+t;i.push({idx:t,len:l[0].length,render:()=>/* @__PURE__ */g("button",{onClick:()=>Z(n),className:`inline-flex items-center justify-center w-4 h-4 rounded border ${e?"bg-blue-500 border-blue-500 text-white":"border-gray-400 bg-white hover:border-blue-400"} cursor-pointer align-text-bottom mr-0.5`,children:e&&/* @__PURE__ */g("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:3,children:/* @__PURE__ */g("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M4.5 12.75l6 6 9-13.5"})})},`cb-${r}-${t}`)})}i.sort((e,t)=>e.idx-t.idx);for(const t of i)t.idx>o&&n.push(/* @__PURE__ */g("span",{children:e.slice(o,t.idx)},`t-${r}-${o}`)),n.push(t.render()),o=t.idx+t.len;o<e.length&&n.push(/* @__PURE__ */g("span",{children:e.slice(o)},`t-${r}-${o}`)),0===n.length&&n.push(/* @__PURE__ */g("span",{children:"​"},`empty-${r}`));const a=/^\[x\]/i.test(e.trimStart());/* @__PURE__ */
19
+ return g("div",{className:a?"line-through text-gray-400":"",children:n},r)})})($):/* @__PURE__ */g("p",{className:"text-gray-300 whitespace-pre-line",children:R})}),
20
+ /* @__PURE__ */m("div",{className:"px-4 py-1.5 border-t border-gray-100 flex items-center gap-4 text-[10px] text-gray-400",children:[
21
+ /* @__PURE__ */g("span",{children:"[] checkbox"}),
22
+ /* @__PURE__ */g("span",{children:"SO#35001 entity link"}),
23
+ /* @__PURE__ */g("span",{className:"ml-auto",children:A?"Editing":"Click to edit"})]})]}):/* @__PURE__ */g("div",{className:"flex-1 flex items-center justify-center",children:/* @__PURE__ */m("div",{className:"text-center text-gray-400",children:[
24
+ /* @__PURE__ */g("svg",{className:"h-12 w-12 mx-auto mb-3 text-gray-300",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1,children:/* @__PURE__ */g("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"})}),
25
+ /* @__PURE__ */g("p",{className:"text-sm",children:"Select a note or create a new one"})]})})})]})}export{f as default};
@@ -1,9 +1,9 @@
1
- import{loadAppearance as e,WidgetSettingsModal as t}from"./chunk-RKEHUV7U.js";import{subscribePomo as a,getPomoSnapshot as o,setPomoDurations as r,setPomoAlarm as n,setPomoAlarmConfig as l,setPomoBehaviour as s,setPomoFocusSound as i,useTodoTasks as c,migratePomodoroTasksOnce as d,pomoSwitchMode as u,pomoPause as m,pomoStart as h,ALARM_OPTIONS as g,playAlarm as p,FOCUS_SOUND_OPTIONS as f,previewFocusSound as b}from"./chunk-YWXYBJ5Y.js";import"./chunk-KSSAVLO7.js";import{useWidgetSettings as x}from"./chunk-ZLJCWBDF.js";import{useShellPrefs as k}from"./chunk-A7Q4BCPI.js";import"./chunk-DSSLOQDW.js";import"./chunk-5A7MWTXX.js";import"./chunk-4UCRT4ST.js";import"./chunk-6KO2U66R.js";import"./chunk-KRTZFHYW.js";import"./chunk-VDL2RLZG.js";import"./chunk-ELSUXC3N.js";import"./chunk-MAIHBBWT.js";import"./chunk-NCQLGQYR.js";import"./chunk-D65T4H6J.js";import{useSyncExternalStore as v,useEffect as y,useMemo as N,useState as w,useRef as C,useCallback as S}from"react";import{jsxs as B,Fragment as M,jsx as T}from"react/jsx-runtime";var j="pomodoro_appearance",P="pomodoro_active_task_id",I={focus:"Pomodoro",short:"Short Break",long:"Long Break"},L={focus:"#0f172a",short:"#508a52",long:"#5b7898"};var A=25,$=5,D=15,V=!1,R=!1,W=4,_=!0,E=!0,F="bell",O=100,U=1,K="none",z=50,H=(e,t,a,o)=>"number"==typeof e&&isFinite(e)?Math.max(t,Math.min(a,Math.round(e))):o;function Y(){const t=v(a,o,o),{prefs:p,save:b}=k(),Y=function(e){const t=e&&"object"==typeof e?e:{};return{focusMinutes:H(t.focusMinutes,1,120,A),shortBreakMinutes:H(t.shortBreakMinutes,1,120,$),longBreakMinutes:H(t.longBreakMinutes,1,120,D),autoStartBreaks:"boolean"==typeof t.autoStartBreaks?t.autoStartBreaks:V,autoStartPomodoros:"boolean"==typeof t.autoStartPomodoros?t.autoStartPomodoros:R,longBreakInterval:H(t.longBreakInterval,1,20,W),autoCheckTasks:"boolean"==typeof t.autoCheckTasks?t.autoCheckTasks:_,checkToBottom:"boolean"==typeof t.checkToBottom?t.checkToBottom:E,alarmSound:g.some(e=>e.id===t.alarmSound)?t.alarmSound:F,alarmVolume:H(t.alarmVolume,0,100,O),alarmRepeat:H(t.alarmRepeat,1,5,U),focusSound:f.some(e=>e.id===t.focusSound)?t.focusSound:K,focusVolume:H(t.focusVolume,0,100,z)}}(p.pomodoro_settings);y(()=>{r({focus:60*Y.focusMinutes,short:60*Y.shortBreakMinutes,long:60*Y.longBreakMinutes})},[Y.focusMinutes,Y.shortBreakMinutes,Y.longBreakMinutes]),y(()=>{n(Y.alarmSound),l(Y.alarmVolume,Y.alarmRepeat)},[Y.alarmSound,Y.alarmVolume,Y.alarmRepeat]),y(()=>{s({autoStartBreaks:Y.autoStartBreaks,autoStartPomodoros:Y.autoStartPomodoros,longBreakInterval:Y.longBreakInterval})},[Y.autoStartBreaks,Y.autoStartPomodoros,Y.longBreakInterval]),y(()=>{i(Y.focusSound,Y.focusVolume)},[Y.focusSound,Y.focusVolume]),y(()=>{if("undefined"!=typeof Notification&&"default"===Notification.permission)try{Notification.requestPermission()}catch{}},[]);const Q=c(),X=Q.tasks,Z=N(()=>/* @__PURE__ */(new Date).toISOString().slice(0,10),[]),G=function(e,t){return N(()=>t?(e=>{const t=[],a=[];for(const o of e)(o.done?a:t).push(o);return[...t,...a]})(e):e,[e,t])}(N(()=>X.filter(e=>!!e.dueDate&&(e.dueDate===Z||e.dueDate<Z&&!e.done)),[X,Z]),Y.checkToBottom),[q,ee]=w(()=>localStorage.getItem(P)),[te,ae]=w(!1),[oe,re]=w(null),ne=C(!1);y(()=>{ne.current||(ne.current=!0,d(X,Q.setAllTasks))},[]),y(()=>{try{q?localStorage.setItem(P,q):localStorage.removeItem(P)}catch{}},[q]),y(()=>{if(!oe)return;const e=()=>re(null),t=setTimeout(()=>document.addEventListener("click",e),0);return()=>{clearTimeout(t),document.removeEventListener("click",e)}},[oe]);const se=C(t.streak);y(()=>{if(t.streak>se.current&&q){const e=X.find(e=>e.id===q);if(e){const t=(e.completed??0)+1,a=e.estimated??0,o=Y.autoCheckTasks&&a>0&&t>=a;Q.updateTask(q,{completed:t,done:e.done||o})}}se.current=t.streak},[t.streak,q,Y.autoCheckTasks,X,Q]);const ie=G.reduce((e,t)=>e+(t.completed??0),0),ce=G.reduce((e,t)=>e+Math.max(t.estimated??0,t.completed??0),0),de=G.reduce((e,t)=>t.done?e:e+Math.max(0,(t.estimated??0)-(t.completed??0)),0),ue=t.running&&"focus"===t.mode?t.remaining:0,me=de*Y.focusMinutes*60+ue,he=new Date(Date.now()+1e3*me).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}),ge=(me/3600).toFixed(1),pe=q?X.find(e=>e.id===q)??null:null,fe=String(Math.floor(t.remaining/60)).padStart(2,"0"),be=String(t.remaining%60).padStart(2,"0"),[xe,ke]=w(()=>e(j)),[ve,ye]=w(!1),[Ne,we]=w(xe),[Ce,Se]=w(Y);x(S(()=>{we({...xe}),Se({...Y}),ye(!0)},[xe,Y]));const Be="focus"!==t.mode,Me=L[t.mode],Te=Be?(je=Me,Pe=xe.activeOpacity/100,`rgba(${parseInt(je.slice(1,3),16)}, ${parseInt(je.slice(3,5),16)}, ${parseInt(je.slice(5,7),16)}, ${Pe})`):`rgb(var(--taskbar-bg-rgb, 243 244 246) / ${xe.activeOpacity/100})`;var je,Pe;const Ie={primary:Be?"text-white":"text-gray-900",secondary:Be?"text-white/85":"text-gray-700",muted:Be?"text-white/65":"text-gray-500",tabActive:Be?"bg-white/15 text-white":"bg-gray-200 text-gray-900",tabInactive:Be?"text-white/75 hover:bg-white/10":"text-gray-500 hover:bg-gray-200",divider:Be?"border-white/30":"border-gray-200",softDivider:Be?"border-white/20":"border-gray-200",iconBtn:Be?"bg-black/15 hover:bg-black/25 text-white/85":"bg-gray-200 hover:bg-gray-300 text-gray-600",addTaskBtn:Be?"border-white/45 text-white/90 hover:bg-white/[0.06]":"border-gray-300 text-gray-500 hover:bg-gray-200/50"},Le=Be?Me:"#0f172a";/* @__PURE__ */
1
+ import{loadAppearance as e,WidgetSettingsModal as t}from"./chunk-QASZIYLG.js";import{subscribePomo as a,getPomoSnapshot as o,setPomoDurations as r,setPomoAlarm as n,setPomoAlarmConfig as l,setPomoBehaviour as s,setPomoFocusSound as i,useTodoTasks as c,migratePomodoroTasksOnce as d,pomoSwitchMode as u,pomoPause as m,pomoStart as h,ALARM_OPTIONS as g,playAlarm as p,FOCUS_SOUND_OPTIONS as f,previewFocusSound as b}from"./chunk-HA2WG27U.js";import"./chunk-KSSAVLO7.js";import{useWidgetSettings as x}from"./chunk-VXBJNMAA.js";import{useShellPrefs as k}from"./chunk-CRI4UFBU.js";import"./chunk-DSSLOQDW.js";import"./chunk-5A7MWTXX.js";import"./chunk-BKDE67DB.js";import"./chunk-6KO2U66R.js";import"./chunk-M4DB7UBZ.js";import"./chunk-UVZIPXIA.js";import"./chunk-AFYQTVZO.js";import"./chunk-HZZNJHRH.js";import"./chunk-D65T4H6J.js";import"./chunk-X4FJ54PP.js";import"./chunk-NCQLGQYR.js";import{useSyncExternalStore as v,useEffect as y,useMemo as N,useState as w,useRef as C,useCallback as S}from"react";import{jsxs as B,Fragment as M,jsx as T}from"react/jsx-runtime";var j="pomodoro_appearance",P="pomodoro_active_task_id",I={focus:"Pomodoro",short:"Short Break",long:"Long Break"},A={focus:"#0f172a",short:"#508a52",long:"#5b7898"};var L=25,$=5,D=15,V=!1,R=!1,_=4,W=!0,F=!0,O="bell",E=100,U=1,H="none",Z=50,z=(e,t,a,o)=>"number"==typeof e&&isFinite(e)?Math.max(t,Math.min(a,Math.round(e))):o;function J(){const t=v(a,o,o),{prefs:p,save:b}=k(),J=function(e){const t=e&&"object"==typeof e?e:{};return{focusMinutes:z(t.focusMinutes,1,120,L),shortBreakMinutes:z(t.shortBreakMinutes,1,120,$),longBreakMinutes:z(t.longBreakMinutes,1,120,D),autoStartBreaks:"boolean"==typeof t.autoStartBreaks?t.autoStartBreaks:V,autoStartPomodoros:"boolean"==typeof t.autoStartPomodoros?t.autoStartPomodoros:R,longBreakInterval:z(t.longBreakInterval,1,20,_),autoCheckTasks:"boolean"==typeof t.autoCheckTasks?t.autoCheckTasks:W,checkToBottom:"boolean"==typeof t.checkToBottom?t.checkToBottom:F,alarmSound:g.some(e=>e.id===t.alarmSound)?t.alarmSound:O,alarmVolume:z(t.alarmVolume,0,100,E),alarmRepeat:z(t.alarmRepeat,1,5,U),focusSound:f.some(e=>e.id===t.focusSound)?t.focusSound:H,focusVolume:z(t.focusVolume,0,100,Z)}}(p.pomodoro_settings);y(()=>{r({focus:60*J.focusMinutes,short:60*J.shortBreakMinutes,long:60*J.longBreakMinutes})},[J.focusMinutes,J.shortBreakMinutes,J.longBreakMinutes]),y(()=>{n(J.alarmSound),l(J.alarmVolume,J.alarmRepeat)},[J.alarmSound,J.alarmVolume,J.alarmRepeat]),y(()=>{s({autoStartBreaks:J.autoStartBreaks,autoStartPomodoros:J.autoStartPomodoros,longBreakInterval:J.longBreakInterval})},[J.autoStartBreaks,J.autoStartPomodoros,J.longBreakInterval]),y(()=>{i(J.focusSound,J.focusVolume)},[J.focusSound,J.focusVolume]),y(()=>{if("undefined"!=typeof Notification&&"default"===Notification.permission)try{Notification.requestPermission()}catch{}},[]);const Q=c(),X=Q.tasks,G=N(()=>/* @__PURE__ */(new Date).toISOString().slice(0,10),[]),Y=function(e,t){return N(()=>t?(e=>{const t=[],a=[];for(const o of e)(o.done?a:t).push(o);return[...t,...a]})(e):e,[e,t])}(N(()=>X.filter(e=>!!e.dueDate&&(e.dueDate===G||e.dueDate<G&&!e.done)),[X,G]),J.checkToBottom),[q,ee]=w(()=>localStorage.getItem(P)),[te,ae]=w(!1),[oe,re]=w(null),ne=C(!1);y(()=>{ne.current||(ne.current=!0,d(X,Q.setAllTasks))},[]),y(()=>{try{q?localStorage.setItem(P,q):localStorage.removeItem(P)}catch{}},[q]),y(()=>{if(!oe)return;const e=()=>re(null),t=setTimeout(()=>document.addEventListener("click",e),0);return()=>{clearTimeout(t),document.removeEventListener("click",e)}},[oe]);const se=C(t.streak);y(()=>{if(t.streak>se.current&&q){const e=X.find(e=>e.id===q);if(e){const t=(e.completed??0)+1,a=e.estimated??0,o=J.autoCheckTasks&&a>0&&t>=a;Q.updateTask(q,{completed:t,done:e.done||o})}}se.current=t.streak},[t.streak,q,J.autoCheckTasks,X,Q]);const ie=Y.reduce((e,t)=>e+(t.completed??0),0),ce=Y.reduce((e,t)=>e+Math.max(t.estimated??0,t.completed??0),0),de=Y.reduce((e,t)=>t.done?e:e+Math.max(0,(t.estimated??0)-(t.completed??0)),0),ue=t.running&&"focus"===t.mode?t.remaining:0,me=de*J.focusMinutes*60+ue,he=new Date(Date.now()+1e3*me).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}),ge=(me/3600).toFixed(1),pe=q?X.find(e=>e.id===q)??null:null,fe=String(Math.floor(t.remaining/60)).padStart(2,"0"),be=String(t.remaining%60).padStart(2,"0"),[xe,ke]=w(()=>e(j)),[ve,ye]=w(!1),[Ne,we]=w(xe),[Ce,Se]=w(J);x(S(()=>{we({...xe}),Se({...J}),ye(!0)},[xe,J]));const Be="focus"!==t.mode,Me=A[t.mode],Te=Be?(je=Me,Pe=xe.activeOpacity/100,`rgba(${parseInt(je.slice(1,3),16)}, ${parseInt(je.slice(3,5),16)}, ${parseInt(je.slice(5,7),16)}, ${Pe})`):`rgb(var(--taskbar-bg-rgb, 243 244 246) / ${xe.activeOpacity/100})`;var je,Pe;const Ie={primary:Be?"text-white":"text-gray-900",secondary:Be?"text-white/85":"text-gray-700",muted:Be?"text-white/65":"text-gray-500",tabActive:Be?"bg-white/15 text-white":"bg-gray-200 text-gray-900",tabInactive:Be?"text-white/75 hover:bg-white/10":"text-gray-500 hover:bg-gray-200",divider:Be?"border-white/30":"border-gray-200",softDivider:Be?"border-white/20":"border-gray-200",iconBtn:Be?"bg-black/15 hover:bg-black/25 text-white/85":"bg-gray-200 hover:bg-gray-300 text-gray-600",addTaskBtn:Be?"border-white/45 text-white/90 hover:bg-white/[0.06]":"border-gray-300 text-gray-500 hover:bg-gray-200/50"},Ae=Be?Me:"#0f172a";/* @__PURE__ */
2
2
  return B(M,{children:[
3
3
  /* @__PURE__ */B("div",{className:`flex flex-col h-full select-none transition-colors duration-300 ${Ie.primary}`,style:{backgroundColor:Te,backdropFilter:xe.activeBlur>0?`blur(${xe.activeBlur}px)`:void 0},children:[
4
4
  /* @__PURE__ */T("div",{className:"px-3 pt-3 flex justify-center gap-1.5",children:["focus","short","long"].map(e=>/* @__PURE__ */T("button",{onClick:()=>u(e),className:`px-2.5 py-1 text-[13px] font-bold rounded transition-colors ${t.mode===e?Ie.tabActive:Ie.tabInactive}`,children:I[e]},e))}),
5
5
  /* @__PURE__ */B("div",{className:"text-center font-bold tabular-nums leading-none tracking-tight mt-3",style:{fontSize:"4.5rem"},children:[fe,":",be]}),
6
- /* @__PURE__ */T("div",{className:"flex justify-center mt-3 mb-2",children:/* @__PURE__ */T("button",{onClick:()=>t.running?m():h(),className:"bg-white px-12 py-2.5 rounded-md font-bold text-base shadow-[0_4px_0_rgba(0,0,0,0.12)] hover:shadow-[0_3px_0_rgba(0,0,0,0.12)] active:translate-y-1 active:shadow-none transition-all",style:{color:Le,letterSpacing:"0.08em"},children:t.running?"PAUSE":"START"})}),
6
+ /* @__PURE__ */T("div",{className:"flex justify-center mt-3 mb-2",children:/* @__PURE__ */T("button",{onClick:()=>t.running?m():h(),className:"bg-white px-12 py-2.5 rounded-md font-bold text-base shadow-[0_4px_0_rgba(0,0,0,0.12)] hover:shadow-[0_3px_0_rgba(0,0,0,0.12)] active:translate-y-1 active:shadow-none transition-all",style:{color:Ae,letterSpacing:"0.08em"},children:t.running?"PAUSE":"START"})}),
7
7
  /* @__PURE__ */T("div",{className:"px-3 py-3 text-center",children:pe?/* @__PURE__ */B(M,{children:[
8
8
  /* @__PURE__ */B("div",{className:`text-xs leading-tight ${Ie.muted}`,children:["#",(pe.completed??0)+1]}),
9
9
  /* @__PURE__ */T("div",{className:`text-[15px] font-medium leading-tight truncate mt-0.5 ${Ie.primary}`,children:pe.name})]}):/* @__PURE__ */T("div",{className:`text-xs italic ${Ie.muted}`,children:"No task selected"})}),
@@ -14,9 +14,9 @@ return B(M,{children:[
14
14
  /* @__PURE__ */T("circle",{cx:"12",cy:"12",r:"1.4"}),
15
15
  /* @__PURE__ */T("circle",{cx:"12",cy:"19",r:"1.4"})]})})]}),
16
16
  /* @__PURE__ */T("div",{className:`border-t mx-3 mt-2 ${Ie.divider}`}),
17
- /* @__PURE__ */B("div",{className:"flex-1 px-3 py-3 space-y-2 overflow-y-auto",children:[G.map(e=>{const t=e.id===q;/* @__PURE__ */
17
+ /* @__PURE__ */B("div",{className:"flex-1 px-3 py-3 space-y-2 overflow-y-auto",children:[Y.map(e=>{const t=e.id===q;/* @__PURE__ */
18
18
  return B("div",{onClick:()=>ee(e.id),className:"bg-white text-gray-800 rounded-md flex items-center pr-2 py-2.5 shadow-sm cursor-pointer transition-shadow hover:shadow-md "+(t?"border-l-4 border-gray-700 pl-2":"pl-3 border-l-4 border-transparent"),children:[
19
- /* @__PURE__ */T("button",{onClick:t=>{var a;t.stopPropagation(),a=e.id,Q.toggleDone(a)},className:"shrink-0",children:e.done?/* @__PURE__ */T("svg",{className:"h-5 w-5",fill:"currentColor",viewBox:"0 0 20 20",style:{color:Le},children:/* @__PURE__ */T("path",{d:"M10 0a10 10 0 100 20 10 10 0 000-20zm-1 14.5l-4.5-4.5 1.4-1.4 3.1 3.1 6.1-6.1 1.4 1.4z"})}):/* @__PURE__ */T("svg",{className:"h-5 w-5 text-gray-300",fill:"none",stroke:"currentColor",strokeWidth:2,viewBox:"0 0 24 24",children:/* @__PURE__ */T("circle",{cx:"12",cy:"12",r:"10"})})}),
19
+ /* @__PURE__ */T("button",{onClick:t=>{var a;t.stopPropagation(),a=e.id,Q.toggleDone(a)},className:"shrink-0",children:e.done?/* @__PURE__ */T("svg",{className:"h-5 w-5",fill:"currentColor",viewBox:"0 0 20 20",style:{color:Ae},children:/* @__PURE__ */T("path",{d:"M10 0a10 10 0 100 20 10 10 0 000-20zm-1 14.5l-4.5-4.5 1.4-1.4 3.1 3.1 6.1-6.1 1.4 1.4z"})}):/* @__PURE__ */T("svg",{className:"h-5 w-5 text-gray-300",fill:"none",stroke:"currentColor",strokeWidth:2,viewBox:"0 0 24 24",children:/* @__PURE__ */T("circle",{cx:"12",cy:"12",r:"10"})})}),
20
20
  /* @__PURE__ */T("span",{className:"ml-3 flex-1 font-semibold truncate "+(e.done?"line-through text-gray-400":"text-gray-800"),children:e.name}),
21
21
  /* @__PURE__ */B("span",{className:"text-sm tabular-nums mr-1.5 shrink-0",children:[
22
22
  /* @__PURE__ */T("span",{className:"font-bold text-gray-500",children:e.completed??0}),
@@ -26,7 +26,7 @@ return B("div",{onClick:()=>ee(e.id),className:"bg-white text-gray-800 rounded-m
26
26
  /* @__PURE__ */T("button",{onClick:t=>{t.stopPropagation(),re(oe===e.id?null:e.id)},className:"rounded p-1 bg-gray-100 hover:bg-gray-200",children:/* @__PURE__ */B("svg",{className:"h-4 w-4 text-gray-500",viewBox:"0 0 24 24",fill:"currentColor",children:[
27
27
  /* @__PURE__ */T("circle",{cx:"12",cy:"5",r:"1.4"}),
28
28
  /* @__PURE__ */T("circle",{cx:"12",cy:"12",r:"1.4"}),
29
- /* @__PURE__ */T("circle",{cx:"12",cy:"19",r:"1.4"})]})}),oe===e.id&&/* @__PURE__ */T("div",{className:"absolute right-0 top-full mt-1 bg-white text-gray-800 rounded shadow-lg border border-gray-200 z-10 min-w-[110px] overflow-hidden",onClick:e=>e.stopPropagation(),children:/* @__PURE__ */T("button",{onClick:t=>{var a;t.stopPropagation(),a=e.id,Q.removeTask(a),q===a&&ee(null),re(null)},className:"block w-full px-3 py-1.5 text-sm text-left hover:bg-red-50 text-red-600",children:"Delete"})})]})]},e.id)}),te?/* @__PURE__ */T(le,{onSubmit:(e,t)=>{const a=e.trim();if(!a)return;const o=Q.addTask({name:a,estimated:t,completed:0,dueDate:Z});q||ee(o),ae(!1)},onCancel:()=>ae(!1),accentColor:Le}):/* @__PURE__ */B("button",{onClick:()=>ae(!0),className:`w-full border-2 border-dashed rounded-md py-3 font-semibold flex items-center justify-center gap-2 transition-colors ${Ie.addTaskBtn}`,children:[
29
+ /* @__PURE__ */T("circle",{cx:"12",cy:"19",r:"1.4"})]})}),oe===e.id&&/* @__PURE__ */T("div",{className:"absolute right-0 top-full mt-1 bg-white text-gray-800 rounded shadow-lg border border-gray-200 z-10 min-w-[110px] overflow-hidden",onClick:e=>e.stopPropagation(),children:/* @__PURE__ */T("button",{onClick:t=>{var a;t.stopPropagation(),a=e.id,Q.removeTask(a),q===a&&ee(null),re(null)},className:"block w-full px-3 py-1.5 text-sm text-left hover:bg-red-50 text-red-600",children:"Delete"})})]})]},e.id)}),te?/* @__PURE__ */T(le,{onSubmit:(e,t)=>{const a=e.trim();if(!a)return;const o=Q.addTask({name:a,estimated:t,completed:0,dueDate:G});q||ee(o),ae(!1)},onCancel:()=>ae(!1),accentColor:Ae}):/* @__PURE__ */B("button",{onClick:()=>ae(!0),className:`w-full border-2 border-dashed rounded-md py-3 font-semibold flex items-center justify-center gap-2 transition-colors ${Ie.addTaskBtn}`,children:[
30
30
  /* @__PURE__ */B("svg",{className:"h-5 w-5",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,children:[
31
31
  /* @__PURE__ */T("circle",{cx:"12",cy:"12",r:"10"}),
32
32
  /* @__PURE__ */T("path",{strokeLinecap:"round",d:"M8 12h8M12 8v8"})]}),"Add Task"]})]}),
@@ -37,15 +37,15 @@ return B("div",{onClick:()=>ee(e.id),className:"bg-white text-gray-800 rounded-m
37
37
  /* @__PURE__ */T("span",{className:`font-bold ${Ie.primary}`,children:ce})]}),me>0&&/* @__PURE__ */B("span",{className:Ie.secondary,children:["Finish At: ",
38
38
  /* @__PURE__ */T("span",{className:`font-bold ${Ie.primary}`,children:he}),
39
39
  /* @__PURE__ */B("span",{className:Ie.muted,children:[" (",ge,"h)"]})]})]})]}),
40
- /* @__PURE__ */T(J,{open:ve,onClose:()=>ye(!1),onSave:()=>{ke(Ne),localStorage.setItem(j,JSON.stringify(Ne)),b({pomodoro_settings:Ce}),ye(!1)},configAppearance:Ne,setConfigAppearance:we,configPrefs:Ce,setConfigPrefs:Se})]})}function J({open:e,onClose:a,onSave:o,configAppearance:r,setConfigAppearance:n,configPrefs:l,setConfigPrefs:s}){const i=(e,t)=>s(a=>({...a,[e]:t}));/* @__PURE__ */
40
+ /* @__PURE__ */T(K,{open:ve,onClose:()=>ye(!1),onSave:()=>{ke(Ne),localStorage.setItem(j,JSON.stringify(Ne)),b({pomodoro_settings:Ce}),ye(!1)},configAppearance:Ne,setConfigAppearance:we,configPrefs:Ce,setConfigPrefs:Se})]})}function K({open:e,onClose:a,onSave:o,configAppearance:r,setConfigAppearance:n,configPrefs:l,setConfigPrefs:s}){const i=(e,t)=>s(a=>({...a,[e]:t}));/* @__PURE__ */
41
41
  return B(t,{open:e,onClose:a,title:"Pomodoro Settings",appearance:r,onAppearanceChange:n,onSave:o,children:[
42
42
  /* @__PURE__ */B(Q,{icon:/* @__PURE__ */T(oe,{}),label:"TIMER",children:[
43
43
  /* @__PURE__ */B("div",{children:[
44
44
  /* @__PURE__ */T("p",{className:"text-sm font-bold text-gray-800 mb-2",children:"Time (minutes)"}),
45
45
  /* @__PURE__ */B("div",{className:"grid grid-cols-3 gap-3",children:[
46
- /* @__PURE__ */T(G,{label:"Pomodoro",value:l.focusMinutes,onChange:e=>i("focusMinutes",e),max:120}),
47
- /* @__PURE__ */T(G,{label:"Short Break",value:l.shortBreakMinutes,onChange:e=>i("shortBreakMinutes",e),max:120}),
48
- /* @__PURE__ */T(G,{label:"Long Break",value:l.longBreakMinutes,onChange:e=>i("longBreakMinutes",e),max:120})]})]}),
46
+ /* @__PURE__ */T(Y,{label:"Pomodoro",value:l.focusMinutes,onChange:e=>i("focusMinutes",e),max:120}),
47
+ /* @__PURE__ */T(Y,{label:"Short Break",value:l.shortBreakMinutes,onChange:e=>i("shortBreakMinutes",e),max:120}),
48
+ /* @__PURE__ */T(Y,{label:"Long Break",value:l.longBreakMinutes,onChange:e=>i("longBreakMinutes",e),max:120})]})]}),
49
49
  /* @__PURE__ */T(X,{label:"Auto Start Breaks",children:/* @__PURE__ */T(te,{checked:l.autoStartBreaks,onChange:e=>i("autoStartBreaks",e)})}),
50
50
  /* @__PURE__ */T(X,{label:"Auto Start Pomodoros",children:/* @__PURE__ */T(te,{checked:l.autoStartPomodoros,onChange:e=>i("autoStartPomodoros",e)})}),
51
51
  /* @__PURE__ */T(X,{label:"Long Break interval",children:/* @__PURE__ */T(q,{value:l.longBreakInterval,onChange:e=>i("longBreakInterval",e),min:1,max:20,className:"w-14 text-center"})})]}),
@@ -55,11 +55,11 @@ return B(t,{open:e,onClose:a,title:"Pomodoro Settings",appearance:r,onAppearance
55
55
  /* @__PURE__ */B(Q,{icon:/* @__PURE__ */T(ne,{}),label:"SOUND",children:[
56
56
  /* @__PURE__ */T(X,{label:"Alarm Sound",children:/* @__PURE__ */B("div",{className:"flex items-center gap-2",children:[
57
57
  /* @__PURE__ */T(ee,{value:l.alarmSound,onChange:e=>i("alarmSound",e),options:g.map(e=>({id:e.id,label:e.label}))}),"off"!==l.alarmSound&&/* @__PURE__ */T("button",{type:"button",onClick:()=>p(l.alarmSound,{volume:l.alarmVolume,repeat:1}),className:"px-2 py-1 text-[11px] rounded border border-gray-300 text-gray-600 hover:bg-gray-100",children:"Play"})]})}),
58
- /* @__PURE__ */T(Z,{value:l.alarmVolume,onChange:e=>i("alarmVolume",e)}),
58
+ /* @__PURE__ */T(G,{value:l.alarmVolume,onChange:e=>i("alarmVolume",e)}),
59
59
  /* @__PURE__ */T(X,{label:"repeat",children:/* @__PURE__ */T(q,{value:l.alarmRepeat,onChange:e=>i("alarmRepeat",e),min:1,max:5,className:"w-14 text-center"})}),
60
60
  /* @__PURE__ */T(X,{label:"Focus Sound",children:/* @__PURE__ */B("div",{className:"flex items-center gap-2",children:[
61
61
  /* @__PURE__ */T(ee,{value:l.focusSound,onChange:e=>i("focusSound",e),options:f}),"none"!==l.focusSound&&/* @__PURE__ */T("button",{type:"button",onClick:()=>b(l.focusSound,l.focusVolume),className:"px-2 py-1 text-[11px] rounded border border-gray-300 text-gray-600 hover:bg-gray-100",children:"Play"})]})}),
62
- /* @__PURE__ */T(Z,{value:l.focusVolume,onChange:e=>i("focusVolume",e)})]})]})}function Q({icon:e,label:t,children:a}){/* @__PURE__ */
62
+ /* @__PURE__ */T(G,{value:l.focusVolume,onChange:e=>i("focusVolume",e)})]})]})}function Q({icon:e,label:t,children:a}){/* @__PURE__ */
63
63
  return B("div",{className:"border-t border-gray-200 pt-3 first:border-0 first:pt-0",children:[
64
64
  /* @__PURE__ */B("div",{className:"flex items-center gap-1.5 mb-3 text-gray-400",children:[e,
65
65
  /* @__PURE__ */T("span",{className:"text-xs font-bold tracking-[0.15em]",children:t})]}),
@@ -67,10 +67,10 @@ return B("div",{className:"border-t border-gray-200 pt-3 first:border-0 first:pt
67
67
  return B("div",{className:"flex items-center justify-between gap-3",children:[
68
68
  /* @__PURE__ */B("div",{className:"flex items-center gap-1.5 min-w-0",children:[
69
69
  /* @__PURE__ */T("span",{className:"text-sm font-semibold text-gray-800",children:e}),t&&/* @__PURE__ */T(ae,{title:t})]}),
70
- /* @__PURE__ */T("div",{className:"shrink-0",children:a})]})}function Z({value:e,onChange:t}){/* @__PURE__ */
70
+ /* @__PURE__ */T("div",{className:"shrink-0",children:a})]})}function G({value:e,onChange:t}){/* @__PURE__ */
71
71
  return B("div",{className:"flex items-center justify-end gap-3",children:[
72
72
  /* @__PURE__ */T("span",{className:"text-xs text-gray-400 w-7 text-right tabular-nums",children:e}),
73
- /* @__PURE__ */T("input",{type:"range",min:0,max:100,value:e,onChange:e=>t(parseInt(e.target.value,10)),className:"w-40 accent-blue-500"})]})}function G({label:e,value:t,onChange:a,min:o=1,max:r=99}){/* @__PURE__ */
73
+ /* @__PURE__ */T("input",{type:"range",min:0,max:100,value:e,onChange:e=>t(parseInt(e.target.value,10)),className:"w-40 accent-blue-500"})]})}function Y({label:e,value:t,onChange:a,min:o=1,max:r=99}){/* @__PURE__ */
74
74
  return B("label",{className:"flex flex-col",children:[
75
75
  /* @__PURE__ */T("span",{className:"text-xs font-semibold text-gray-500 mb-1",children:e}),
76
76
  /* @__PURE__ */T(q,{value:t,onChange:a,min:o,max:r})]})}function q({value:e,onChange:t,min:a=1,max:o=99,className:r=""}){/* @__PURE__ */
@@ -96,4 +96,4 @@ return B("div",{className:"bg-white text-gray-800 rounded-md p-3 shadow-md",chil
96
96
  /* @__PURE__ */T("input",{type:"number",min:1,max:20,value:n,onChange:e=>l(Math.max(1,Math.min(20,parseInt(e.target.value,10)||1))),className:"w-16 bg-gray-100 rounded px-2 py-1 text-sm text-right border-0 focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),
97
97
  /* @__PURE__ */B("div",{className:"flex gap-2 mt-3 justify-end",children:[
98
98
  /* @__PURE__ */T("button",{onClick:t,className:"px-3 py-1 text-sm text-gray-500 hover:bg-gray-100 rounded",children:"Cancel"}),
99
- /* @__PURE__ */T("button",{onClick:s,className:"px-4 py-1 text-sm font-semibold text-white rounded shadow-sm",style:{backgroundColor:a},children:"Save"})]})]})}export{Y as default};
99
+ /* @__PURE__ */T("button",{onClick:s,className:"px-4 py-1 text-sm font-semibold text-white rounded shadow-sm",style:{backgroundColor:a},children:"Save"})]})]})}export{J as default};
@@ -1,4 +1,4 @@
1
- import{PdfViewer as e,ToolbarSlotContext as t,PanelActions as n}from"./chunk-3U47BTEV.js";import{ImageAnnotator_default as r}from"./chunk-4P3IWZUC.js";import{AboutApp as i}from"./chunk-D7EJSASN.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-KSSAVLO7.js";import"./chunk-SHVGZW2J.js";import{WindowTitle as c,getActiveModalId as d}from"./chunk-ZLJCWBDF.js";import"./chunk-A7Q4BCPI.js";import"./chunk-DSSLOQDW.js";import"./chunk-5A7MWTXX.js";import"./chunk-4UCRT4ST.js";import"./chunk-6KO2U66R.js";import"./chunk-KRTZFHYW.js";import"./chunk-VDL2RLZG.js";import{registerModalEscapeInterceptor as u}from"./chunk-ELSUXC3N.js";import"./chunk-MAIHBBWT.js";import"./chunk-NCQLGQYR.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 B=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}))},P=/* @__PURE__ */x("div",{className:"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0",children:[
1
+ import{PdfViewer as e,ToolbarSlotContext as t,PanelActions as n}from"./chunk-3U47BTEV.js";import{ImageAnnotator_default as r}from"./chunk-4P3IWZUC.js";import{AboutApp as i}from"./chunk-HGG5M5AB.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-KSSAVLO7.js";import"./chunk-VRHUY4P4.js";import{WindowTitle as c,getActiveModalId as d}from"./chunk-VXBJNMAA.js";import"./chunk-CRI4UFBU.js";import"./chunk-DSSLOQDW.js";import"./chunk-5A7MWTXX.js";import"./chunk-BKDE67DB.js";import"./chunk-6KO2U66R.js";import"./chunk-M4DB7UBZ.js";import"./chunk-UVZIPXIA.js";import"./chunk-AFYQTVZO.js";import"./chunk-HZZNJHRH.js";import"./chunk-D65T4H6J.js";import{registerModalEscapeInterceptor as u}from"./chunk-X4FJ54PP.js";import"./chunk-NCQLGQYR.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 B=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}))},P=/* @__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
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&&B(t),L.current&&(L.current.value="")},className:"hidden"}),
3
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
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"]}),
@@ -34,7 +34,7 @@ return x("div",{className:"flex flex-col items-center justify-center h-full bg-g
34
34
  /* @__PURE__ */y("div",{className:"text-base font-semibold tracking-wide text-gray-700 uppercase",children:t||"Converting file"}),
35
35
  /* @__PURE__ */y("div",{className:"text-xs text-gray-400 truncate max-w-md",children:e})]}),
36
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),[B,P]=h(null),[H,W]=h(""),O=p(D),V=p(B);m(()=>{O.current=D},[D]),m(()=>{V.current=B},[B]);const X=p(null),U=p(null),$=p(null),[G,_]=h(""),[Y,Z]=h(null),q=p(""),K=p(null),J=p(null),Q=p(null);m(()=>{let t=!1,n=null;return l(!0),g(null),w([]),(async()=>{let r;try{r=(await(import("dxf-viewer"))).DxfViewer}catch(e){return void(t||(g("dxf-viewer is not installed in this app."),l(!1)))}if(!t&&o.current)try{if(await new Promise(e=>{const t=()=>{const n=o.current?.getBoundingClientRect();n&&n.width>4&&n.height>4?e():requestAnimationFrame(t)};t()}),t||!o.current)return;const i={autoResize:!0},a=r.DefaultOptions?.clearColor;"function"==typeof a?.clone&&(i.clearColor=a.clone().setHex(16777215)),n=new r(o.current,i),s.current=n;const c="undefined"!=typeof window&&window.__REACT_OS_SHELL_DXF_FONTS__||k;if(await n.Load({url:e,fonts:c,workerFactory:null}),t)return;try{const e=n.GetLayers?.()??[];Array.isArray(e)&&w(e.map(e=>({name:e.name,displayName:e.displayName??e.name,color:"number"==typeof e.color?e.color:void 0,visible:!0})))}catch{}const d=()=>{try{const e=o.current?.getBoundingClientRect();e&&e.width>0&&e.height>0&&n.SetSize?.(Math.round(e.width),Math.round(e.height));const t=n.GetBounds?.(),r=n.GetOrigin?.();t&&r&&n.FitView(t.minX-r.x,t.maxX-r.x,t.minY-r.y,t.maxY-r.y),n.Render?.()}catch(e){console.warn("[Preview] DXF refit failed",e)}};d(),requestAnimationFrame(d),l(!1)}catch(e){t||(g(e?.message||"Failed to render DXF."),l(!1))}})(),()=>{t=!0;try{n?.Destroy?.()}catch{}s.current=null}},[e]),m(()=>{if(!A||a)return;const e=setTimeout(()=>M(!1),5e3);return()=>clearTimeout(e)},[A,a]);const ee=b.map(e=>e.visible?"1":"0").join("");m(()=>{const e=s.current;if(a||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 B=(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 P=(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},W=(e,t,n)=>{const r=B(t,n);e.style.left=`${r.x}px`,e.style.top=`${r.y}px`},G=()=>{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=O.current;if(null===r||!Number.isFinite(r)||"horizontal"!==i&&"vertical"!==i)e.picks[1]={x:n.x,y:n.y};else if("horizontal"===i){const i=n.x>=t.x?1:-1;e.picks[1]={x:t.x+i*Math.abs(r),y:n.y}}else{const i=n.y>=t.y?1:-1;e.picks[1]={x:n.x,y:t.y+i*Math.abs(r)}}},_=(e,t)=>{const n=O.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;G();const t=O.current,n=V.current,i=null!==n&&Number.isFinite(n)&&("horizontal"===t||"vertical"===t);e.markers[0]&&W(e.markers[0],e.picks[0].x,e.picks[0].y),e.markers[1]&&W(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=B(o.x,o.y),d=B(o.x+n.dx,o.y+n.dy),u=l/(Math.hypot(d.x-c.x,d.y-c.y)||1),p=B(o.x-n.dx*u,o.y-n.dy*u),h=B(o.x+n.dx*u,o.y+n.dy*u);t.setAttribute("x1",String(p.x)),t.setAttribute("y1",String(p.y)),t.setAttribute("x2",String(h.x)),t.setAttribute("y2",String(h.y)),t.style.display=""};let s="horizontal"===t,a="vertical"===t;if("auto"===t)if(e.picks.length>=2){const t=_(e.picks[0],e.picks[1]);s="horizontal"===t,a="vertical"===t}else s=!0,a=!0;if(o(e.refLine,{dx:1,dy:0},s),o(e.refLineV,{dx:0,dy:1},a),2===e.picks.length){const t=e.picks[0],o=e.picks[1],s=_(t,o),a=(()=>{const e=Q.current,t=e.picks[0],n=e.picks[1],r=_(t,n),i=O.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=B(a.from.x,a.from.y),c=B(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=B(t.x,t.y),l=B(i.x,i.y);e.fixedLine.setAttribute("x1",String(a.x)),e.fixedLine.setAttribute("y1",String(a.y)),e.fixedLine.setAttribute("x2",String(l.x)),e.fixedLine.setAttribute("y2",String(l.y)),e.fixedLine.setAttribute("marker-start","url(#dxf-measure-arrow)"),e.fixedLine.setAttribute("marker-end","url(#dxf-measure-arrow)"),e.fixedLine.style.display="";const c=q();c.textContent=z(Math.abs(n));const d=(a.x+l.x)/2,u=(a.y+l.y)/2;c.style.left=`${d}px`,c.style.top=`${u}px`;const p=r.clientWidth,h=r.clientHeight;c.style.display=d<0||u<0||d>p||u>h?"none":""}else e.fixedLine&&(e.fixedLine.style.display="none"),e.fixedLabel&&(e.fixedLabel.style.display="none");const u=e.extLineA,p=e.extLineB;if(!i&&"horizontal"===s&&Math.abs(o.y-t.y)>1e-9){const e=B(o.x,t.y),n=B(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=B(t.x,o.y),n=B(o.x,o.y);p.setAttribute("x1",String(e.x)),p.setAttribute("y1",String(e.y)),p.setAttribute("x2",String(n.x)),p.setAttribute("y2",String(n.y)),p.style.display="",u.style.display="none"}else u.style.display="none",p.style.display="none";if(e.label){const t=(l.x+c.x)/2,n=(l.y+c.y)/2;e.label.style.left=`${t}px`,e.label.style.top=`${n}px`;const i=r.clientWidth,o=r.clientHeight;e.label.style.display=t<0||n<0||t>i||n>o?"none":"",d<=.5&&(e.label.style.display="none")}}else e.line.style.display="none",e.fixedLine&&(e.fixedLine.style.display="none"),e.fixedLabel&&(e.fixedLabel.style.display="none"),e.extLineA&&(e.extLineA.style.display="none"),e.extLineB&&(e.extLineB.style.display="none")},q=()=>{const e=Q.current;if(e.fixedLabel)return e.fixedLabel;const t=document.createElement("div");return t.style.cssText="position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.75);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;",l.appendChild(t),e.fixedLabel=t,t};let K=0,J=0,ee=0,te=!1,ne=!1,re=null;const ie=e=>{const t=e?.detail;t&&0===t.domEvent?.button&&(K=t.canvasCoord.x,J=t.canvasCoord.y,ee=performance.now(),ne=!1,te=!0)},oe=e=>{const t=r.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;te&&(n-K)**2+(i-J)**2>16&&(ne=!0);const o=Q.current;var s;if(o&&o.snap)if(te&&ne)o.snap.style.display="none";else if(re=((e,t)=>{const n=Q.current;if(!n||!F||!n.segs)return null;const r=B(0,0),i=B(1,0),o=B(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=P(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=B(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;G();const t=e.picks[0],n=e.picks[1],r=O.current,i=_(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),Z(c);const m=(()=>{const e=Q.current;if(e.label)return e.label;const t=document.createElement("div");return t.style.cssText="position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.95);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;",l.appendChild(t),e.label=t,t})();m.style.opacity="1",m.textContent=`${z(a)}${d}`};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)}};U.current=ce,$.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,U.current=null,$.current=null,i(),T(null),I(null)}},[E,a,c,ee]),m(()=>{X.current?.()},[D,B]);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(G),ie=p(E);m(()=>{re.current=G},[G]),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?(_(""),Z("*Cancel*"),!0):!!ie.current&&(S(!1),Z("Measure off."),!0))}),[]);const oe="px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1";/* @__PURE__ */
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),[B,P]=h(null),[H,O]=h(""),V=p(D),W=p(B);m(()=>{V.current=D},[D]),m(()=>{W.current=B},[B]);const X=p(null),U=p(null),$=p(null),[G,_]=h(""),[Y,Z]=h(null),q=p(""),K=p(null),J=p(null),Q=p(null);m(()=>{let t=!1,n=null;return l(!0),g(null),w([]),(async()=>{let r;try{r=(await(import("dxf-viewer"))).DxfViewer}catch(e){return void(t||(g("dxf-viewer is not installed in this app."),l(!1)))}if(!t&&o.current)try{if(await new Promise(e=>{const t=()=>{const n=o.current?.getBoundingClientRect();n&&n.width>4&&n.height>4?e():requestAnimationFrame(t)};t()}),t||!o.current)return;const i={autoResize:!0},a=r.DefaultOptions?.clearColor;"function"==typeof a?.clone&&(i.clearColor=a.clone().setHex(16777215)),n=new r(o.current,i),s.current=n;const c="undefined"!=typeof window&&window.__REACT_OS_SHELL_DXF_FONTS__||k;if(await n.Load({url:e,fonts:c,workerFactory:null}),t)return;try{const e=n.GetLayers?.()??[];Array.isArray(e)&&w(e.map(e=>({name:e.name,displayName:e.displayName??e.name,color:"number"==typeof e.color?e.color:void 0,visible:!0})))}catch{}const d=()=>{try{const e=o.current?.getBoundingClientRect();e&&e.width>0&&e.height>0&&n.SetSize?.(Math.round(e.width),Math.round(e.height));const t=n.GetBounds?.(),r=n.GetOrigin?.();t&&r&&n.FitView(t.minX-r.x,t.maxX-r.x,t.minY-r.y,t.maxY-r.y),n.Render?.()}catch(e){console.warn("[Preview] DXF refit failed",e)}};d(),requestAnimationFrame(d),l(!1)}catch(e){t||(g(e?.message||"Failed to render DXF."),l(!1))}})(),()=>{t=!0;try{n?.Destroy?.()}catch{}s.current=null}},[e]),m(()=>{if(!A||a)return;const e=setTimeout(()=>M(!1),5e3);return()=>clearTimeout(e)},[A,a]);const ee=b.map(e=>e.visible?"1":"0").join("");m(()=>{const e=s.current;if(a||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 B=(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 P=(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=B(t,n);e.style.left=`${r.x}px`,e.style.top=`${r.y}px`},G=()=>{const e=Q.current;if(!e||!e.rawSecondClick||e.picks.length<2)return;const t=e.picks[0],n=e.rawSecondClick,r=W.current,i=V.current;if(null===r||!Number.isFinite(r)||"horizontal"!==i&&"vertical"!==i)e.picks[1]={x:n.x,y:n.y};else if("horizontal"===i){const i=n.x>=t.x?1:-1;e.picks[1]={x:t.x+i*Math.abs(r),y:n.y}}else{const i=n.y>=t.y?1:-1;e.picks[1]={x:n.x,y:t.y+i*Math.abs(r)}}},_=(e,t)=>{const n=V.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;G();const t=V.current,n=W.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=B(o.x,o.y),d=B(o.x+n.dx,o.y+n.dy),u=l/(Math.hypot(d.x-c.x,d.y-c.y)||1),p=B(o.x-n.dx*u,o.y-n.dy*u),h=B(o.x+n.dx*u,o.y+n.dy*u);t.setAttribute("x1",String(p.x)),t.setAttribute("y1",String(p.y)),t.setAttribute("x2",String(h.x)),t.setAttribute("y2",String(h.y)),t.style.display=""};let s="horizontal"===t,a="vertical"===t;if("auto"===t)if(e.picks.length>=2){const t=_(e.picks[0],e.picks[1]);s="horizontal"===t,a="vertical"===t}else s=!0,a=!0;if(o(e.refLine,{dx:1,dy:0},s),o(e.refLineV,{dx:0,dy:1},a),2===e.picks.length){const t=e.picks[0],o=e.picks[1],s=_(t,o),a=(()=>{const e=Q.current,t=e.picks[0],n=e.picks[1],r=_(t,n),i=V.current,o=W.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=B(a.from.x,a.from.y),c=B(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=B(t.x,t.y),l=B(i.x,i.y);e.fixedLine.setAttribute("x1",String(a.x)),e.fixedLine.setAttribute("y1",String(a.y)),e.fixedLine.setAttribute("x2",String(l.x)),e.fixedLine.setAttribute("y2",String(l.y)),e.fixedLine.setAttribute("marker-start","url(#dxf-measure-arrow)"),e.fixedLine.setAttribute("marker-end","url(#dxf-measure-arrow)"),e.fixedLine.style.display="";const c=q();c.textContent=z(Math.abs(n));const d=(a.x+l.x)/2,u=(a.y+l.y)/2;c.style.left=`${d}px`,c.style.top=`${u}px`;const p=r.clientWidth,h=r.clientHeight;c.style.display=d<0||u<0||d>p||u>h?"none":""}else e.fixedLine&&(e.fixedLine.style.display="none"),e.fixedLabel&&(e.fixedLabel.style.display="none");const u=e.extLineA,p=e.extLineB;if(!i&&"horizontal"===s&&Math.abs(o.y-t.y)>1e-9){const e=B(o.x,t.y),n=B(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=B(t.x,o.y),n=B(o.x,o.y);p.setAttribute("x1",String(e.x)),p.setAttribute("y1",String(e.y)),p.setAttribute("x2",String(n.x)),p.setAttribute("y2",String(n.y)),p.style.display="",u.style.display="none"}else u.style.display="none",p.style.display="none";if(e.label){const t=(l.x+c.x)/2,n=(l.y+c.y)/2;e.label.style.left=`${t}px`,e.label.style.top=`${n}px`;const i=r.clientWidth,o=r.clientHeight;e.label.style.display=t<0||n<0||t>i||n>o?"none":"",d<=.5&&(e.label.style.display="none")}}else e.line.style.display="none",e.fixedLine&&(e.fixedLine.style.display="none"),e.fixedLabel&&(e.fixedLabel.style.display="none"),e.extLineA&&(e.extLineA.style.display="none"),e.extLineB&&(e.extLineB.style.display="none")},q=()=>{const e=Q.current;if(e.fixedLabel)return e.fixedLabel;const t=document.createElement("div");return t.style.cssText="position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.75);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;",l.appendChild(t),e.fixedLabel=t,t};let K=0,J=0,ee=0,te=!1,ne=!1,re=null;const ie=e=>{const t=e?.detail;t&&0===t.domEvent?.button&&(K=t.canvasCoord.x,J=t.canvasCoord.y,ee=performance.now(),ne=!1,te=!0)},oe=e=>{const t=r.getBoundingClientRect(),n=e.clientX-t.left,i=e.clientY-t.top;te&&(n-K)**2+(i-J)**2>16&&(ne=!0);const o=Q.current;var s;if(o&&o.snap)if(te&&ne)o.snap.style.display="none";else if(re=((e,t)=>{const n=Q.current;if(!n||!F||!n.segs)return null;const r=B(0,0),i=B(1,0),o=B(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=P(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=B(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;G();const t=e.picks[0],n=e.picks[1],r=V.current,i=_(t,n),o=W.current,s=null!==o&&Number.isFinite(o)&&("horizontal"===r||"vertical"===r);let a,c,d="",u=i;const p=Math.abs(n.x-t.x),h=Math.abs(n.y-t.y);if(s&&"horizontal"===r?(a=h,d=" ↕",u="vertical",c=`ΔY = ${z(h)} with ΔX locked to ${z(Math.abs(o))}`):s&&"vertical"===r?(a=p,d=" ↔",u="horizontal",c=`ΔX = ${z(p)} with ΔY locked to ${z(Math.abs(o))}`):"horizontal"===i?(a=p,d=" ↔",c=`Linear dimension = ${z(p)} (ΔX)`):"vertical"===i?(a=h,d=" ↕",c=`Linear dimension = ${z(h)} (ΔY)`):(a=Math.hypot(n.x-t.x,n.y-t.y),c=`Distance = ${z(a)} ΔX = ${z(p)} ΔY = ${z(h)}`),!Number.isFinite(a))return T(null),I(null),void(e.label&&(e.label.style.opacity="0"));T(a),I(u),Z(c);const m=(()=>{const e=Q.current;if(e.label)return e.label;const t=document.createElement("div");return t.style.cssText="position:absolute;left:-9999px;top:-9999px;transform:translate(-50%,-50%);padding:2px 6px;font-size:11px;font-weight:600;font-family:system-ui,-apple-system,sans-serif;background:rgba(255,136,0,0.95);color:#fff;border-radius:4px;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,0.25);pointer-events:none;",l.appendChild(t),e.label=t,t})();m.style.opacity="1",m.textContent=`${z(a)}${d}`};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)}};U.current=ce,$.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,U.current=null,$.current=null,i(),T(null),I(null)}},[E,a,c,ee]),m(()=>{X.current?.()},[D,B]);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(G),ie=p(E);m(()=>{re.current=G},[G]),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?(_(""),Z("*Cancel*"),!0):!!ie.current&&(S(!1),Z("Measure off."),!0))}),[]);const oe="px-2 py-1 rounded hover:bg-gray-200 transition-colors text-gray-600 flex items-center gap-1";/* @__PURE__ */
38
38
  return x("div",{ref:J,className:"flex flex-col h-full",children:[
39
39
  /* @__PURE__ */x(n,{children:[
40
40
  /* @__PURE__ */x("button",{onClick:()=>C(e=>!e),className:oe+(v?" bg-gray-200":""),title:"Toggle layer visibility",disabled:0===b.length,children:[
@@ -49,7 +49,7 @@ return x("div",{ref:J,className:"flex flex-col h-full",children:[
49
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
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
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(W(t),""===t.trim())P(null);else{const e=parseFloat(t);P(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!==B&&/* @__PURE__ */y("button",{onClick:()=>{P(null),W("")},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?" ↕":""]}),
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())P(null);else{const e=parseFloat(t);P(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!==B&&/* @__PURE__ */y("button",{onClick:()=>{P(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
53
  /* @__PURE__ */y("button",{onClick:ne,className:oe,title:"Fit drawing to view",children:"Fit"}),
54
54
  /* @__PURE__ */x("button",{onClick:r??(()=>{const n=document.createElement("a");n.href=e,n.download=t,n.click()}),className:oe,children:[
55
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:[
@@ -80,7 +80,7 @@ return x("div",{ref:J,className:"flex flex-col h-full",children:[
80
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
81
  /* @__PURE__ */x("div",{className:"flex items-center gap-1.5 px-2.5 h-7",children:[
82
82
  /* @__PURE__ */y("span",{className:"text-[11px] font-mono font-semibold text-gray-400 select-none",children:">"}),
83
- /* @__PURE__ */y("input",{ref:K,value:G,onChange:e=>_(e.target.value),onKeyDown:e=>{"Enter"===e.key||" "===e.key?(e.preventDefault(),(e=>{const t=e.trim()||q.current;if(_(""),!t)return;const n=t.toLowerCase().split(/\s+/)[0],r=()=>{q.current=t},i=(e,t)=>{S(!0),j(e),U.current?.(),Z(t),r()};if(/^-?(\d+\.?\d*|\.\d+)$/.test(n))if(!E||"horizontal"!==D&&"vertical"!==D)Z("Fixed distances apply in H or V mode — type H or V first.");else{const e=parseFloat(n);e?(W(n),P(e),Z(`Δ${"horizontal"===D?"X":"Y"} locked to ${z(Math.abs(e))} — the label shows the perpendicular distance`)):(W(""),P(null),Z("Fixed distance cleared."))}else switch(n){case"di":case"dist":case"mea":case"measuregeom":i("point","DIST — click two points; straight-line distance (Esc to exit)");break;case"dim":case"dli":case"dimlin":case"dimlinear":i("auto","DIMLINEAR — click two points; measures ΔX or ΔY, whichever is larger (H / V to force)");break;case"h":case"hor":case"horizontal":S(!0),j("horizontal"),Z("Horizontal — ΔX between the two picks"),r();break;case"v":case"ver":case"vertical":S(!0),j("vertical"),Z("Vertical — ΔY between the two picks"),r();break;case"au":case"auto":S(!0),j("auto"),Z("Auto (DIMLINEAR) — measures along the dominant axis of the two picks"),r();break;case"measure":S(!E),Z(E?"Measure off.":"Measure on — click two points."),r();break;case"u":case"undo":$.current?.(),Z("Last pick removed."),r();break;case"z":case"ze":case"zoom":case"fit":case"zoomextents":ne(),Z("Zoom extents."),r();break;case"la":case"layer":case"layers":C(e=>!e),Z("Layer panel toggled."),r();break;case"off":case"clear":P(null),W(""),U.current?.(),Z("Measurement cleared."),r();break;case"?":case"help":Z(L);break;default:{const e=N[n];Z(e?`${e} is a drawing command — Preview is a read-only viewer. Measuring: DI, DIM, H, V (? for help)`:`Unknown command "${n.toUpperCase()}" — try DI, DIM, H, V, Z, LA (? for help)`)}}})(G)):"Escape"===e.key&&(G?(e.stopPropagation(),_(""),Z("*Cancel*")):e.target.blur())},placeholder:"Type a command — DI, DIM, H, V, Z, LA (? for help)",spellCheck:!1,autoComplete:"off",className:"flex-1 min-w-0 bg-transparent text-[11px] font-mono text-gray-700 focus:outline-none placeholder:text-gray-300"})]})]})]})}var A="https://cdn.jsdelivr.net/npm/online-3d-viewer@0.18.0/libs/";function M(e,t=0){return{id:e.GetId?.()??0,name:e.GetName?.()||(0===t?"Root":"Node"),isMeshNode:!!e.IsMeshNode?.(),meshIndices:e.GetMeshIndices?.()??[],children:(e.GetChildNodes?.()??[]).map(e=>M(e,t+1))}}function E(e,t){t.add(e.id);for(const n of e.children)E(n,t)}function S(e,t){const n=/^#?([0-9a-f]{6})$/i.exec(t),r=n?parseInt(n[1],16):0;return new e.RGBColor(r>>16&255,r>>8&255,255&r)}function z(e){return e>=1e3?`${(e/1e3).toFixed(3)} m`:`${e.toFixed(2)} mm`}function D({url:e,filename:t,onDownload:r,onEmail:i}){const o=p(null),s=p(null),a=p(null),[l,c]=h(!0),[d,u]=h(null),[f,b]=h(!0),[w,v]=h(null),[k,N]=h({}),[L,C]=h(/* @__PURE__ */new Set),[D,j]=h("#f5f6f8"),[R,T]=h(!0),[F,I]=h("#000000"),[B,P]=h(1),[H,W]=h(!1),[O,V]=h(!1),[X,U]=h(!1),[$,G]=h(!1),[_,Y]=h("x"),[Z,q]=h(!1),[K,J]=h(.5),[Q,ee]=h(0),[te,ne]=h(!1),[re,ie]=h("point"),[oe,se]=h(null),ae=p(null),le=p(null);m(()=>{let n=!1,r=null,i=null;return c(!0),u(null),v(null),N({}),C(/* @__PURE__ */new Set),(async()=>{let l;try{l=await(import("online-3d-viewer"))}catch{return void(n||(u("online-3d-viewer is not installed in this app. Add it to enable 3D file viewing."),c(!1)))}if(a.current=l,!n&&o.current&&(await new Promise(e=>{const t=()=>{const n=o.current?.getBoundingClientRect();n&&n.width>4&&n.height>4?e():requestAnimationFrame(t)};t()}),!n&&o.current))try{const a="undefined"!=typeof window&&window.__REACT_OS_SHELL_O3DV_LIBS__||A;l.SetExternalLibLocation?.(a),function(){if(g)return;if("undefined"==typeof HTMLCanvasElement)return;g=!0;const e=HTMLCanvasElement.prototype.getContext;HTMLCanvasElement.prototype.getContext=function(t,n){return"webgl"!==t&&"webgl2"!==t&&"experimental-webgl"!==t||(n={...n||{},stencil:!0}),e.call(this,t,n)},console.info("[Preview] section: canvas getContext patched (force stencil=true)")}(),r=new l.EmbeddedViewer(o.current,{backgroundColor:new l.RGBAColor(245,246,248,255),defaultColor:new l.RGBColor(180,188,200),edgeSettings:new l.EdgeSettings(!0,new l.RGBColor(0,0,0),1),onModelLoaded:()=>{if(!n){try{const e=r.GetModel?.(),t=e?.GetRootNode?.();if(t){const e=M(t);v(e);const n={[e.id]:!0};for(const t of e.children)n[t.id]=!0;N(n)}}catch(e){console.warn("[Preview] mesh tree extraction failed",e)}c(!1)}},onModelLoadFailed:()=>{n||(u("Failed to load 3D model."),c(!1))}}),s.current=r;const d=new l.InputFile(t,l.FileSource.Url,e);r.LoadModelFromInputFiles([d]),o.current&&"undefined"!=typeof ResizeObserver&&(i=new ResizeObserver(()=>{try{const e=s.current;e?.Resize?e.Resize():e?.viewer?.Resize&&e.viewer.Resize(),e?.viewer?.Render?.()}catch{}}),i.observe(o.current))}catch(e){n||(u(e?.message||"Failed to load 3D model."),c(!1))}})(),()=>{n=!0;try{i?.disconnect()}catch{}try{r?.Destroy?.()}catch{}s.current=null}},[e,t]),m(()=>{const e=s.current;if(e?.viewer)try{const t=e=>{if(e.userData?.__sectionHelper)return;const t=e.userData?.originalMeshInstance??e.userData,n=t?.id?.nodeId??t?.nodeId;"number"==typeof n&&(e.visible=!L.has(n))};e.viewer.mainModel?.EnumerateMeshesAndLines?.(t),e.viewer.mainModel?.EnumerateEdges?.(t),e.viewer.Render?.()}catch(e){console.warn("[Preview] visibility update failed",e)}},[L,w]),m(()=>{const e=a.current,t=s.current;if(e&&t?.viewer)try{t.viewer.SetEdgeSettings(new e.EdgeSettings(R,S(e,F),B));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,B]),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(!$)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?.()},[$,l,w]),m(()=>{const e=s.current,t=le.current;if(e?.viewer&&t&&$)try{const n=t.bbox,r="x"===_?0:"y"===_?1:2,i=[n.min.x,n.min.y,n.min.z][r],o=i+([n.max.x,n.max.y,n.max.z][r]-i)*K,s=Q*Math.PI/180,a=Math.cos(s),l=Math.sin(s),c=Z?-1:1;let d=0,u=0,p=0;"x"===_?(d=c*a,p=c*l):"y"===_?(u=c*a,d=c*l):(p=c*a,u=c*l);const h={x:(n.min.x+n.max.x)/2,y:(n.min.y+n.max.y)/2,z:(n.min.z+n.max.z)/2},m="x"===_?o:h.x,x="y"===_?o:h.y,y="z"===_?o:h.z;if(t.plane.normal.x=d,t.plane.normal.y=u,t.plane.normal.z=p,t.plane.constant=-(d*m+u*x+p*y),t.capMesh){const e=h.x,n=h.y,r=h.z,i=d*e+u*n+p*r+t.plane.constant,o=e-d*i,s=n-u*i,a=r-p*i;t.capMesh.position.set(o,s,a),t.capMesh.lookAt?.(o+d,s+u,a+p)}e.viewer.Render?.()}catch(e){console.warn("[Preview] section update failed",e)}},[$,_,Z,K,Q]),m(()=>{const e=s.current;if(!e?.viewer||l||!o.current)return;const t=e.viewer.renderer,n=e.viewer.scene,r=t?.domElement;if(!t||!n||!r)return;let i=null;if(e.viewer.mainModel?.EnumerateMeshes?.(e=>{i||e.userData?.__sectionHelper||e.userData?.__measureHelper||(i=e)}),!i)return;const c=i.position.constructor,d=i.constructor,u=(Array.isArray(i.material)?i.material[0]:i.material)?.constructor,p=i.geometry.constructor,h=i.geometry.attributes?.position?.constructor;if(!(c&&d&&u&&p&&h))return;let m=null,x=null;n.traverse(e=>{if(m&&x)return;if(!e?.isLineSegments)return;m=e.constructor;const t=Array.isArray(e.material)?e.material[0]:e.material;t?.constructor&&(x=t.constructor)});const y=()=>{const t=ae.current;if(t){null!==t.rafId&&cancelAnimationFrame(t.rafId);for(const e of t.markers)n.remove(e),e.geometry?.dispose?.(),e.material?.dispose?.();t.line&&(n.remove(t.line),t.line.geometry?.dispose?.(),t.line.material?.dispose?.()),t.label&&t.label.parentElement&&t.label.parentElement.removeChild(t.label),ae.current=null,e.viewer.Render?.()}};if(!te)return y(),void se(null);ae.current={points:[],normals:[],markers:[],line:null,label:null,rafId:null};const f=a.current,g=f?.IntersectionMode?.MeshOnly??1,b=e.viewer.GetBoundingBox?.(()=>!0),w=b?Math.sqrt((b.max.x-b.min.x)**2+(b.max.y-b.min.y)**2+(b.max.z-b.min.z)**2):100,v=Math.max(.005*w,.2),k=e=>{const t=[],r=[];for(let e=0;e<=12;e++){const n=e/12*Math.PI;for(let e=0;e<=16;e++){const r=e/16*Math.PI*2;t.push(v*Math.sin(n)*Math.cos(r),v*Math.cos(n),v*Math.sin(n)*Math.sin(r))}}for(let e=0;e<12;e++)for(let t=0;t<16;t++){const n=17*e+t,i=n+16+1;r.push(n,i,n+1,i,i+1,n+1)}const i=new p;i.setAttribute("position",new h(new Float32Array(t),3)),i.setIndex(r),i.computeVertexNormals?.();const o=new u;o.color?.setHex?.(16746496),o.depthTest=!1,o.depthWrite=!1,o.transparent=!0,o.opacity=.95;const s=new d(i,o);return s.position.copy(e),s.renderOrder=9999,s.userData.__measureHelper=!0,n.add(s),s},N=()=>{const t=ae.current;t&&((()=>{const t=ae.current;if(!t||t.points.length<2||!t.label)return;const n=e.viewer.camera;if(!n)return;const i=t.points[0],o=t.points[1],s=new c((i.x+o.x)/2,(i.y+o.y)/2,(i.z+o.z)/2).clone();s.project?.(n);const a=r.getBoundingClientRect(),l=(s.x+1)/2*a.width,d=(1-s.y)/2*a.height;t.label.style.left=`${l}px`,t.label.style.top=`${d}px`;const u=l<0||d<0||l>a.width||d>a.height;t.label.style.opacity=s.z>1||u?"0":"1"})(),t.rafId=requestAnimationFrame(N))};ae.current.rafId=requestAnimationFrame(N);let L=0,C=0,A=0,M=!1,E=!1;const S=t=>{if(!e.viewer.camera)return;const i=r.getBoundingClientRect(),s={x:t.clientX-i.left,y:t.clientY-i.top},a=e.viewer.GetMeshIntersectionUnderMouse?.(g,s);if(!a)return;const l=ae.current,y=new c(a.point.x,a.point.y,a.point.z),f=(e=>{const t=e?.face?.normal,n=e?.object;if(!t||!n)return null;try{const e=new c(t.x,t.y,t.z);return e.transformDirection?.(n.matrixWorld),{x:e.x,y:e.y,z:e.z}}catch{return{x:t.x,y:t.y,z:t.z}}})(a);if(2===l.points.length){for(const e of l.markers)n.remove(e),e.geometry?.dispose?.(),e.material?.dispose?.();l.line&&(n.remove(l.line),l.line.geometry?.dispose?.(),l.line.material?.dispose?.()),l.label&&(l.label.style.opacity="0"),l.points=[],l.markers=[],l.line=null,l.normals=[],se(null)}if(l.points.push(y),l.normals.push(f),"perp"===re){const e=((e,t)=>{const r=e?.geometry,i=r?.attributes?.position;if(!r||!i||!t?.face?.normal)return null;const o=i.array,s=r.index?r.index.array:null,a=new c(t.point.x,t.point.y,t.point.z);e.worldToLocal?.(a);const l=t.face.normal,m=-(l.x*a.x+l.y*a.y+l.z*a.z);r.computeBoundingBox?.();const x=r.boundingBox,y=x?Math.sqrt((x.max.x-x.min.x)**2+(x.max.y-x.min.y)**2+(x.max.z-x.min.z)**2):100,f=Math.max(.001*y,.005),g=s?s.length/3:i.count/3,b=[],w=new c;for(let t=0;t<g;t++){const n=s?s[3*t]:3*t,r=s?s[3*t+1]:3*t+1,i=s?s[3*t+2]:3*t+2,a=o[3*n],c=o[3*n+1],d=o[3*n+2],u=o[3*r],p=o[3*r+1],h=o[3*r+2],x=o[3*i],y=o[3*i+1],g=o[3*i+2],v=u-a,k=p-c,N=h-d,L=x-a,C=y-c,A=g-d;let M=k*A-N*C,E=N*L-v*A,S=v*C-k*L;const z=Math.sqrt(M*M+E*E+S*S);if(0===z)continue;if(M/=z,E/=z,S/=z,M*l.x+E*l.y+S*l.z<.9995)continue;const D=(a+u+x)/3,j=(c+p+y)/3,R=(d+h+g)/3;if(!(Math.abs(l.x*D+l.y*j+l.z*R+m)>f))for(const[t,n,r]of[[a,c,d],[u,p,h],[x,y,g]])w.set?.(t,n,r),e.localToWorld?.(w),b.push(w.x,w.y,w.z)}if(0===b.length)return null;const v=new p;v.setAttribute("position",new h(new Float32Array(b),3)),v.computeVertexNormals?.();const k=new u;k.color?.setHex?.(16746496),k.transparent=!0,k.opacity=.45,k.depthWrite=!1,k.polygonOffset=!0,k.polygonOffsetFactor=-2,k.polygonOffsetUnits=-2;const N=new d(v,k);return N.renderOrder=9998,N.userData.__measureHelper=!0,n.add(N),N})(a.object,a);l.markers.push(e??k(y))}else l.markers.push(k(y));if(2===l.points.length){const e=l.points[0];let t,r=l.points[1],i="";if("perp"===re){const n=l.normals[0]??l.normals[1];if(n){const o=Math.sqrt(n.x*n.x+n.y*n.y+n.z*n.z)||1,s=n.x/o,a=n.y/o,d=n.z/o,u=(r.x-e.x)*s+(r.y-e.y)*a+(r.z-e.z)*d,p=new c(e.x+s*u,e.y+a*u,e.z+d*u);l.points[1]=p,r=p,t=Math.abs(u),i=" ⊥"}else{const n=r.x-e.x,i=r.y-e.y,o=r.z-e.z;t=Math.sqrt(n*n+i*i+o*o)}}else{const n=r.x-e.x,i=r.y-e.y,o=r.z-e.z;t=Math.sqrt(n*n+i*i+o*o)}l.line=((e,t)=>{const r=new p;r.setAttribute("position",new h(new Float32Array([e.x,e.y,e.z,t.x,t.y,t.z]),3));const i=new(m??d)(r,new(x??u)({color:16746496,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.95}));return i.renderOrder=9998,i.userData.__measureHelper=!0,n.add(i),i})(e,r),se(t);const s=(()=>{const e=ae.current;if(e.label)return e.label;const t=document.createElement("div");return t.style.position="absolute",t.style.left="-9999px",t.style.top="-9999px",t.style.transform="translate(-50%, -50%)",t.style.padding="2px 6px",t.style.fontSize="11px",t.style.fontWeight="600",t.style.fontFamily="system-ui, -apple-system, sans-serif",t.style.background="rgba(255, 136, 0, 0.95)",t.style.color="#fff",t.style.borderRadius="4px",t.style.pointerEvents="none",t.style.whiteSpace="nowrap",t.style.boxShadow="0 1px 4px rgba(0,0,0,0.25)",t.style.zIndex="5",o.current.appendChild(t),e.label=t,t})();s.textContent=`${z(t)}${i}`}e.viewer.Render?.()},D=e=>{0===e.button&&(L=e.clientX,C=e.clientY,A=performance.now(),M=!1,E=!0)},j=e=>{if(!E)return;const t=e.clientX-L,n=e.clientY-C;t*t+n*n>16&&(M=!0)},R=e=>{if(0!==e.button||!E)return;const t=performance.now()-A;E=!1,!M&&t<350&&S(e)},T=e=>{"Escape"===e.key&&ne(!1)};return r.style.cursor="crosshair",r.addEventListener("pointerdown",D),r.addEventListener("pointermove",j),r.addEventListener("pointerup",R),r.addEventListener("pointercancel",R),window.addEventListener("keydown",T),()=>{r.style.cursor="",r.removeEventListener("pointerdown",D),r.removeEventListener("pointermove",j),r.removeEventListener("pointerup",R),r.removeEventListener("pointercancel",R),window.removeEventListener("keydown",T),y(),se(null)}},[te,re,l,w]),m(()=>{if(!f||l)return;const e=setTimeout(()=>b(!1),5e3);return()=>clearTimeout(e)},[f,l]);const ce=e=>{const t=/* @__PURE__ */new Set;E(e,t),C(e=>{const n=new Set(e),r=[...t].some(e=>!n.has(e));for(const e of t)r?n.add(e):n.delete(e);return n})},de=()=>{try{const e=s.current,t=e?.viewer?.GetBoundingSphere?.(()=>!0);t&&e.viewer.FitSphereToWindow(t,!0),e?.viewer?.Render?.()}catch{}};m(()=>{const e=a.current,t=s.current;if(e&&t?.viewer&&!l)try{t.viewer.SetProjectionMode(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__ */
83
+ /* @__PURE__ */y("input",{ref:K,value:G,onChange:e=>_(e.target.value),onKeyDown:e=>{"Enter"===e.key||" "===e.key?(e.preventDefault(),(e=>{const t=e.trim()||q.current;if(_(""),!t)return;const n=t.toLowerCase().split(/\s+/)[0],r=()=>{q.current=t},i=(e,t)=>{S(!0),j(e),U.current?.(),Z(t),r()};if(/^-?(\d+\.?\d*|\.\d+)$/.test(n))if(!E||"horizontal"!==D&&"vertical"!==D)Z("Fixed distances apply in H or V mode — type H or V first.");else{const e=parseFloat(n);e?(O(n),P(e),Z(`Δ${"horizontal"===D?"X":"Y"} locked to ${z(Math.abs(e))} — the label shows the perpendicular distance`)):(O(""),P(null),Z("Fixed distance cleared."))}else switch(n){case"di":case"dist":case"mea":case"measuregeom":i("point","DIST — click two points; straight-line distance (Esc to exit)");break;case"dim":case"dli":case"dimlin":case"dimlinear":i("auto","DIMLINEAR — click two points; measures ΔX or ΔY, whichever is larger (H / V to force)");break;case"h":case"hor":case"horizontal":S(!0),j("horizontal"),Z("Horizontal — ΔX between the two picks"),r();break;case"v":case"ver":case"vertical":S(!0),j("vertical"),Z("Vertical — ΔY between the two picks"),r();break;case"au":case"auto":S(!0),j("auto"),Z("Auto (DIMLINEAR) — measures along the dominant axis of the two picks"),r();break;case"measure":S(!E),Z(E?"Measure off.":"Measure on — click two points."),r();break;case"u":case"undo":$.current?.(),Z("Last pick removed."),r();break;case"z":case"ze":case"zoom":case"fit":case"zoomextents":ne(),Z("Zoom extents."),r();break;case"la":case"layer":case"layers":C(e=>!e),Z("Layer panel toggled."),r();break;case"off":case"clear":P(null),O(""),U.current?.(),Z("Measurement cleared."),r();break;case"?":case"help":Z(L);break;default:{const e=N[n];Z(e?`${e} is a drawing command — Preview is a read-only viewer. Measuring: DI, DIM, H, V (? for help)`:`Unknown command "${n.toUpperCase()}" — try DI, DIM, H, V, Z, LA (? for help)`)}}})(G)):"Escape"===e.key&&(G?(e.stopPropagation(),_(""),Z("*Cancel*")):e.target.blur())},placeholder:"Type a command — DI, DIM, H, V, Z, LA (? for help)",spellCheck:!1,autoComplete:"off",className:"flex-1 min-w-0 bg-transparent text-[11px] font-mono text-gray-700 focus:outline-none placeholder:text-gray-300"})]})]})]})}var A="https://cdn.jsdelivr.net/npm/online-3d-viewer@0.18.0/libs/";function M(e,t=0){return{id:e.GetId?.()??0,name:e.GetName?.()||(0===t?"Root":"Node"),isMeshNode:!!e.IsMeshNode?.(),meshIndices:e.GetMeshIndices?.()??[],children:(e.GetChildNodes?.()??[]).map(e=>M(e,t+1))}}function E(e,t){t.add(e.id);for(const n of e.children)E(n,t)}function S(e,t){const n=/^#?([0-9a-f]{6})$/i.exec(t),r=n?parseInt(n[1],16):0;return new e.RGBColor(r>>16&255,r>>8&255,255&r)}function z(e){return e>=1e3?`${(e/1e3).toFixed(3)} m`:`${e.toFixed(2)} mm`}function D({url:e,filename:t,onDownload:r,onEmail:i}){const o=p(null),s=p(null),a=p(null),[l,c]=h(!0),[d,u]=h(null),[f,b]=h(!0),[w,v]=h(null),[k,N]=h({}),[L,C]=h(/* @__PURE__ */new Set),[D,j]=h("#f5f6f8"),[R,T]=h(!0),[F,I]=h("#000000"),[B,P]=h(1),[H,O]=h(!1),[V,W]=h(!1),[X,U]=h(!1),[$,G]=h(!1),[_,Y]=h("x"),[Z,q]=h(!1),[K,J]=h(.5),[Q,ee]=h(0),[te,ne]=h(!1),[re,ie]=h("point"),[oe,se]=h(null),ae=p(null),le=p(null);m(()=>{let n=!1,r=null,i=null;return c(!0),u(null),v(null),N({}),C(/* @__PURE__ */new Set),(async()=>{let l;try{l=await(import("online-3d-viewer"))}catch{return void(n||(u("online-3d-viewer is not installed in this app. Add it to enable 3D file viewing."),c(!1)))}if(a.current=l,!n&&o.current&&(await new Promise(e=>{const t=()=>{const n=o.current?.getBoundingClientRect();n&&n.width>4&&n.height>4?e():requestAnimationFrame(t)};t()}),!n&&o.current))try{const a="undefined"!=typeof window&&window.__REACT_OS_SHELL_O3DV_LIBS__||A;l.SetExternalLibLocation?.(a),function(){if(g)return;if("undefined"==typeof HTMLCanvasElement)return;g=!0;const e=HTMLCanvasElement.prototype.getContext;HTMLCanvasElement.prototype.getContext=function(t,n){return"webgl"!==t&&"webgl2"!==t&&"experimental-webgl"!==t||(n={...n||{},stencil:!0}),e.call(this,t,n)},console.info("[Preview] section: canvas getContext patched (force stencil=true)")}(),r=new l.EmbeddedViewer(o.current,{backgroundColor:new l.RGBAColor(245,246,248,255),defaultColor:new l.RGBColor(180,188,200),edgeSettings:new l.EdgeSettings(!0,new l.RGBColor(0,0,0),1),onModelLoaded:()=>{if(!n){try{const e=r.GetModel?.(),t=e?.GetRootNode?.();if(t){const e=M(t);v(e);const n={[e.id]:!0};for(const t of e.children)n[t.id]=!0;N(n)}}catch(e){console.warn("[Preview] mesh tree extraction failed",e)}c(!1)}},onModelLoadFailed:()=>{n||(u("Failed to load 3D model."),c(!1))}}),s.current=r;const d=new l.InputFile(t,l.FileSource.Url,e);r.LoadModelFromInputFiles([d]),o.current&&"undefined"!=typeof ResizeObserver&&(i=new ResizeObserver(()=>{try{const e=s.current;e?.Resize?e.Resize():e?.viewer?.Resize&&e.viewer.Resize(),e?.viewer?.Render?.()}catch{}}),i.observe(o.current))}catch(e){n||(u(e?.message||"Failed to load 3D model."),c(!1))}})(),()=>{n=!0;try{i?.disconnect()}catch{}try{r?.Destroy?.()}catch{}s.current=null}},[e,t]),m(()=>{const e=s.current;if(e?.viewer)try{const t=e=>{if(e.userData?.__sectionHelper)return;const t=e.userData?.originalMeshInstance??e.userData,n=t?.id?.nodeId??t?.nodeId;"number"==typeof n&&(e.visible=!L.has(n))};e.viewer.mainModel?.EnumerateMeshesAndLines?.(t),e.viewer.mainModel?.EnumerateEdges?.(t),e.viewer.Render?.()}catch(e){console.warn("[Preview] visibility update failed",e)}},[L,w]),m(()=>{const e=a.current,t=s.current;if(e&&t?.viewer)try{t.viewer.SetEdgeSettings(new e.EdgeSettings(R,S(e,F),B));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,B]),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(!$)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?.()},[$,l,w]),m(()=>{const e=s.current,t=le.current;if(e?.viewer&&t&&$)try{const n=t.bbox,r="x"===_?0:"y"===_?1:2,i=[n.min.x,n.min.y,n.min.z][r],o=i+([n.max.x,n.max.y,n.max.z][r]-i)*K,s=Q*Math.PI/180,a=Math.cos(s),l=Math.sin(s),c=Z?-1:1;let d=0,u=0,p=0;"x"===_?(d=c*a,p=c*l):"y"===_?(u=c*a,d=c*l):(p=c*a,u=c*l);const h={x:(n.min.x+n.max.x)/2,y:(n.min.y+n.max.y)/2,z:(n.min.z+n.max.z)/2},m="x"===_?o:h.x,x="y"===_?o:h.y,y="z"===_?o:h.z;if(t.plane.normal.x=d,t.plane.normal.y=u,t.plane.normal.z=p,t.plane.constant=-(d*m+u*x+p*y),t.capMesh){const e=h.x,n=h.y,r=h.z,i=d*e+u*n+p*r+t.plane.constant,o=e-d*i,s=n-u*i,a=r-p*i;t.capMesh.position.set(o,s,a),t.capMesh.lookAt?.(o+d,s+u,a+p)}e.viewer.Render?.()}catch(e){console.warn("[Preview] section update failed",e)}},[$,_,Z,K,Q]),m(()=>{const e=s.current;if(!e?.viewer||l||!o.current)return;const t=e.viewer.renderer,n=e.viewer.scene,r=t?.domElement;if(!t||!n||!r)return;let i=null;if(e.viewer.mainModel?.EnumerateMeshes?.(e=>{i||e.userData?.__sectionHelper||e.userData?.__measureHelper||(i=e)}),!i)return;const c=i.position.constructor,d=i.constructor,u=(Array.isArray(i.material)?i.material[0]:i.material)?.constructor,p=i.geometry.constructor,h=i.geometry.attributes?.position?.constructor;if(!(c&&d&&u&&p&&h))return;let m=null,x=null;n.traverse(e=>{if(m&&x)return;if(!e?.isLineSegments)return;m=e.constructor;const t=Array.isArray(e.material)?e.material[0]:e.material;t?.constructor&&(x=t.constructor)});const y=()=>{const t=ae.current;if(t){null!==t.rafId&&cancelAnimationFrame(t.rafId);for(const e of t.markers)n.remove(e),e.geometry?.dispose?.(),e.material?.dispose?.();t.line&&(n.remove(t.line),t.line.geometry?.dispose?.(),t.line.material?.dispose?.()),t.label&&t.label.parentElement&&t.label.parentElement.removeChild(t.label),ae.current=null,e.viewer.Render?.()}};if(!te)return y(),void se(null);ae.current={points:[],normals:[],markers:[],line:null,label:null,rafId:null};const f=a.current,g=f?.IntersectionMode?.MeshOnly??1,b=e.viewer.GetBoundingBox?.(()=>!0),w=b?Math.sqrt((b.max.x-b.min.x)**2+(b.max.y-b.min.y)**2+(b.max.z-b.min.z)**2):100,v=Math.max(.005*w,.2),k=e=>{const t=[],r=[];for(let e=0;e<=12;e++){const n=e/12*Math.PI;for(let e=0;e<=16;e++){const r=e/16*Math.PI*2;t.push(v*Math.sin(n)*Math.cos(r),v*Math.cos(n),v*Math.sin(n)*Math.sin(r))}}for(let e=0;e<12;e++)for(let t=0;t<16;t++){const n=17*e+t,i=n+16+1;r.push(n,i,n+1,i,i+1,n+1)}const i=new p;i.setAttribute("position",new h(new Float32Array(t),3)),i.setIndex(r),i.computeVertexNormals?.();const o=new u;o.color?.setHex?.(16746496),o.depthTest=!1,o.depthWrite=!1,o.transparent=!0,o.opacity=.95;const s=new d(i,o);return s.position.copy(e),s.renderOrder=9999,s.userData.__measureHelper=!0,n.add(s),s},N=()=>{const t=ae.current;t&&((()=>{const t=ae.current;if(!t||t.points.length<2||!t.label)return;const n=e.viewer.camera;if(!n)return;const i=t.points[0],o=t.points[1],s=new c((i.x+o.x)/2,(i.y+o.y)/2,(i.z+o.z)/2).clone();s.project?.(n);const a=r.getBoundingClientRect(),l=(s.x+1)/2*a.width,d=(1-s.y)/2*a.height;t.label.style.left=`${l}px`,t.label.style.top=`${d}px`;const u=l<0||d<0||l>a.width||d>a.height;t.label.style.opacity=s.z>1||u?"0":"1"})(),t.rafId=requestAnimationFrame(N))};ae.current.rafId=requestAnimationFrame(N);let L=0,C=0,A=0,M=!1,E=!1;const S=t=>{if(!e.viewer.camera)return;const i=r.getBoundingClientRect(),s={x:t.clientX-i.left,y:t.clientY-i.top},a=e.viewer.GetMeshIntersectionUnderMouse?.(g,s);if(!a)return;const l=ae.current,y=new c(a.point.x,a.point.y,a.point.z),f=(e=>{const t=e?.face?.normal,n=e?.object;if(!t||!n)return null;try{const e=new c(t.x,t.y,t.z);return e.transformDirection?.(n.matrixWorld),{x:e.x,y:e.y,z:e.z}}catch{return{x:t.x,y:t.y,z:t.z}}})(a);if(2===l.points.length){for(const e of l.markers)n.remove(e),e.geometry?.dispose?.(),e.material?.dispose?.();l.line&&(n.remove(l.line),l.line.geometry?.dispose?.(),l.line.material?.dispose?.()),l.label&&(l.label.style.opacity="0"),l.points=[],l.markers=[],l.line=null,l.normals=[],se(null)}if(l.points.push(y),l.normals.push(f),"perp"===re){const e=((e,t)=>{const r=e?.geometry,i=r?.attributes?.position;if(!r||!i||!t?.face?.normal)return null;const o=i.array,s=r.index?r.index.array:null,a=new c(t.point.x,t.point.y,t.point.z);e.worldToLocal?.(a);const l=t.face.normal,m=-(l.x*a.x+l.y*a.y+l.z*a.z);r.computeBoundingBox?.();const x=r.boundingBox,y=x?Math.sqrt((x.max.x-x.min.x)**2+(x.max.y-x.min.y)**2+(x.max.z-x.min.z)**2):100,f=Math.max(.001*y,.005),g=s?s.length/3:i.count/3,b=[],w=new c;for(let t=0;t<g;t++){const n=s?s[3*t]:3*t,r=s?s[3*t+1]:3*t+1,i=s?s[3*t+2]:3*t+2,a=o[3*n],c=o[3*n+1],d=o[3*n+2],u=o[3*r],p=o[3*r+1],h=o[3*r+2],x=o[3*i],y=o[3*i+1],g=o[3*i+2],v=u-a,k=p-c,N=h-d,L=x-a,C=y-c,A=g-d;let M=k*A-N*C,E=N*L-v*A,S=v*C-k*L;const z=Math.sqrt(M*M+E*E+S*S);if(0===z)continue;if(M/=z,E/=z,S/=z,M*l.x+E*l.y+S*l.z<.9995)continue;const D=(a+u+x)/3,j=(c+p+y)/3,R=(d+h+g)/3;if(!(Math.abs(l.x*D+l.y*j+l.z*R+m)>f))for(const[t,n,r]of[[a,c,d],[u,p,h],[x,y,g]])w.set?.(t,n,r),e.localToWorld?.(w),b.push(w.x,w.y,w.z)}if(0===b.length)return null;const v=new p;v.setAttribute("position",new h(new Float32Array(b),3)),v.computeVertexNormals?.();const k=new u;k.color?.setHex?.(16746496),k.transparent=!0,k.opacity=.45,k.depthWrite=!1,k.polygonOffset=!0,k.polygonOffsetFactor=-2,k.polygonOffsetUnits=-2;const N=new d(v,k);return N.renderOrder=9998,N.userData.__measureHelper=!0,n.add(N),N})(a.object,a);l.markers.push(e??k(y))}else l.markers.push(k(y));if(2===l.points.length){const e=l.points[0];let t,r=l.points[1],i="";if("perp"===re){const n=l.normals[0]??l.normals[1];if(n){const o=Math.sqrt(n.x*n.x+n.y*n.y+n.z*n.z)||1,s=n.x/o,a=n.y/o,d=n.z/o,u=(r.x-e.x)*s+(r.y-e.y)*a+(r.z-e.z)*d,p=new c(e.x+s*u,e.y+a*u,e.z+d*u);l.points[1]=p,r=p,t=Math.abs(u),i=" ⊥"}else{const n=r.x-e.x,i=r.y-e.y,o=r.z-e.z;t=Math.sqrt(n*n+i*i+o*o)}}else{const n=r.x-e.x,i=r.y-e.y,o=r.z-e.z;t=Math.sqrt(n*n+i*i+o*o)}l.line=((e,t)=>{const r=new p;r.setAttribute("position",new h(new Float32Array([e.x,e.y,e.z,t.x,t.y,t.z]),3));const i=new(m??d)(r,new(x??u)({color:16746496,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.95}));return i.renderOrder=9998,i.userData.__measureHelper=!0,n.add(i),i})(e,r),se(t);const s=(()=>{const e=ae.current;if(e.label)return e.label;const t=document.createElement("div");return t.style.position="absolute",t.style.left="-9999px",t.style.top="-9999px",t.style.transform="translate(-50%, -50%)",t.style.padding="2px 6px",t.style.fontSize="11px",t.style.fontWeight="600",t.style.fontFamily="system-ui, -apple-system, sans-serif",t.style.background="rgba(255, 136, 0, 0.95)",t.style.color="#fff",t.style.borderRadius="4px",t.style.pointerEvents="none",t.style.whiteSpace="nowrap",t.style.boxShadow="0 1px 4px rgba(0,0,0,0.25)",t.style.zIndex="5",o.current.appendChild(t),e.label=t,t})();s.textContent=`${z(t)}${i}`}e.viewer.Render?.()},D=e=>{0===e.button&&(L=e.clientX,C=e.clientY,A=performance.now(),M=!1,E=!0)},j=e=>{if(!E)return;const t=e.clientX-L,n=e.clientY-C;t*t+n*n>16&&(M=!0)},R=e=>{if(0!==e.button||!E)return;const t=performance.now()-A;E=!1,!M&&t<350&&S(e)},T=e=>{"Escape"===e.key&&ne(!1)};return r.style.cursor="crosshair",r.addEventListener("pointerdown",D),r.addEventListener("pointermove",j),r.addEventListener("pointerup",R),r.addEventListener("pointercancel",R),window.addEventListener("keydown",T),()=>{r.style.cursor="",r.removeEventListener("pointerdown",D),r.removeEventListener("pointermove",j),r.removeEventListener("pointerup",R),r.removeEventListener("pointercancel",R),window.removeEventListener("keydown",T),y(),se(null)}},[te,re,l,w]),m(()=>{if(!f||l)return;const e=setTimeout(()=>b(!1),5e3);return()=>clearTimeout(e)},[f,l]);const ce=e=>{const t=/* @__PURE__ */new Set;E(e,t),C(e=>{const n=new Set(e),r=[...t].some(e=>!n.has(e));for(const e of t)r?n.add(e):n.delete(e);return n})},de=()=>{try{const e=s.current,t=e?.viewer?.GetBoundingSphere?.(()=>!0);t&&e.viewer.FitSphereToWindow(t,!0),e?.viewer?.Render?.()}catch{}};m(()=>{const e=a.current,t=s.current;if(e&&t?.viewer&&!l)try{t.viewer.SetProjectionMode(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
84
  return x("div",{children:[
85
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
86
  /* @__PURE__ */y("span",{className:"flex-1 truncate "+(i?"":"opacity-40"),title:e.name,children:e.name}),
@@ -108,8 +108,8 @@ return x("div",{className:"flex flex-col h-full bg-white",children:[
108
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
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
110
  /* @__PURE__ */y("div",{className:ye}),
111
- /* @__PURE__ */y("button",{onClick:()=>W(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:O?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:[
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:()=>W(e=>!e),className:V?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
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
114
  /* @__PURE__ */y("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]})}),
115
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"})})})]}),
@@ -117,7 +117,7 @@ return x("div",{className:"flex flex-col h-full bg-white",children:[
117
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
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
119
  /* @__PURE__ */y("span",{className:"font-medium text-gray-700",children:"Meshes"}),
120
- /* @__PURE__ */y("button",{onClick:()=>W(!1),className:"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600",title:"Close",children:"×"})]}),
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
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
122
  /* @__PURE__ */y("span",{children:"Drag to rotate"}),
123
123
  /* @__PURE__ */y("span",{className:"text-white/40",children:"•"}),
@@ -127,10 +127,10 @@ return x("div",{className:"flex flex-col h-full bg-white",children:[
127
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
128
  /* @__PURE__ */y("circle",{cx:"12",cy:"12",r:"10",strokeOpacity:"0.2"}),
129
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}),O&&/* @__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:[
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}),V&&/* @__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
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
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:"×"})]}),
133
+ /* @__PURE__ */y("button",{onClick:()=>W(!1),className:"px-1.5 py-0.5 rounded hover:bg-gray-200 text-gray-600",title:"Close",children:"×"})]}),
134
134
  /* @__PURE__ */x("div",{className:"flex-1 overflow-y-auto px-3 py-3 space-y-3 text-[12px] text-gray-700",children:[
135
135
  /* @__PURE__ */x("label",{className:"flex items-center justify-between gap-2",children:[
136
136
  /* @__PURE__ */y("span",{children:"Background Color"}),