diff --git a/frontend/src/pages/CameraPage.tsx b/frontend/src/pages/CameraPage.tsx index 288b9a7cb..02887a503 100644 --- a/frontend/src/pages/CameraPage.tsx +++ b/frontend/src/pages/CameraPage.tsx @@ -100,6 +100,43 @@ export function CameraPage() { return () => document.removeEventListener('fullscreenchange', handleFullscreenChange); }, []); + // Save window size and position when user resizes or moves (only for popup windows) + useEffect(() => { + if (!window.opener) return; + + let saveTimeout: NodeJS.Timeout; + const saveWindowState = () => { + // Debounce to avoid saving during drag + clearTimeout(saveTimeout); + saveTimeout = setTimeout(() => { + localStorage.setItem('cameraWindowState', JSON.stringify({ + width: window.outerWidth, + height: window.outerHeight, + left: window.screenX, + top: window.screenY, + })); + }, 500); + }; + + window.addEventListener('resize', saveWindowState); + // Use interval to detect position changes (no native 'move' event) + const positionInterval = setInterval(() => { + const saved = localStorage.getItem('cameraWindowState'); + if (saved) { + const state = JSON.parse(saved); + if (state.left !== window.screenX || state.top !== window.screenY) { + saveWindowState(); + } + } + }, 1000); + + return () => { + clearTimeout(saveTimeout); + clearInterval(positionInterval); + window.removeEventListener('resize', saveWindowState); + }; + }, []); + // Clean up reconnect timers on unmount useEffect(() => { return () => { @@ -178,6 +215,28 @@ export function CameraPage() { if (countdownIntervalRef.current) { clearInterval(countdownIntervalRef.current); } + + // Auto-resize popup window to fit video content (only if no saved preference) + if (window.opener && imgRef.current && !localStorage.getItem('cameraWindowState')) { + const img = imgRef.current; + const videoWidth = img.naturalWidth; + const videoHeight = img.naturalHeight; + + if (videoWidth > 0 && videoHeight > 0) { + // Add space for header bar (~45px) and some padding + const headerHeight = 45; + const padding = 16; + + // Calculate window size (outer size includes chrome) + const chromeWidth = window.outerWidth - window.innerWidth; + const chromeHeight = window.outerHeight - window.innerHeight; + + const targetWidth = videoWidth + padding + chromeWidth; + const targetHeight = videoHeight + headerHeight + padding + chromeHeight; + + window.resizeTo(targetWidth, targetHeight); + } + } }; const stopStream = () => { diff --git a/frontend/src/pages/PrintersPage.tsx b/frontend/src/pages/PrintersPage.tsx index c2ac79b3d..06bd9ed06 100644 --- a/frontend/src/pages/PrintersPage.tsx +++ b/frontend/src/pages/PrintersPage.tsx @@ -1666,11 +1666,17 @@ function PrinterCard({ variant="secondary" size="sm" onClick={() => { - window.open( - `/camera/${printer.id}`, - `camera-${printer.id}`, - 'width=640,height=400,menubar=no,toolbar=no,location=no,status=no' - ); + // Use saved window state or defaults + const saved = localStorage.getItem('cameraWindowState'); + const state = saved ? JSON.parse(saved) : { width: 640, height: 400 }; + const features = [ + `width=${state.width}`, + `height=${state.height}`, + state.left !== undefined ? `left=${state.left}` : '', + state.top !== undefined ? `top=${state.top}` : '', + 'menubar=no,toolbar=no,location=no,status=no', + ].filter(Boolean).join(','); + window.open(`/camera/${printer.id}`, `camera-${printer.id}`, features); }} disabled={!status?.connected} title="Open camera in new window" diff --git a/static/assets/index-DhHo5MXv.js b/static/assets/index-3umWYOC3.js similarity index 94% rename from static/assets/index-DhHo5MXv.js rename to static/assets/index-3umWYOC3.js index 07955561d..121c02627 100644 --- a/static/assets/index-DhHo5MXv.js +++ b/static/assets/index-3umWYOC3.js @@ -74,7 +74,7 @@ Please change the parent to .5?u/(2-i-a):u/(i+a);const d=e/255,f=n/255,g=r/255;i===d?l=((f-g)/u+(f.85?"White":c<.15?s<.4?"Dark Gray":s>.6?"Light Gray":"Gray":l<15||l>=345?"Red":l<45?"Orange":l<70?"Yellow":l<150?"Green":l<200?"Cyan":l<260?"Blue":l<290?"Purple":l<345?"Pink":"Unknown"}function NN(t){return(t??.02).toFixed(3)}function tH({side:t}){const{mode:e}=ag(),n=e==="dark"?"#1a4d2e":"#e7f5e9";return o.jsx("span",{className:"inline-flex items-center justify-center w-4 h-4 text-[10px] font-bold rounded",style:{backgroundColor:n,color:"#00ae42"},children:t})}function nH({className:t}){return o.jsx("svg",{className:t,viewBox:"0 0 36 54",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:o.jsx("path",{d:"M17.8131 0.00538C18.4463 -0.15091 20.3648 3.14642 20.8264 3.84781C25.4187 10.816 35.3089 26.9368 35.9383 34.8694C37.4182 53.5822 11.882 61.3357 2.53721 45.3789C-1.73471 38.0791 0.016 32.2049 3.178 25.0232C6.99221 16.3662 12.6411 7.90372 17.8131 0.00538ZM18.3738 7.24807L17.5881 7.48441C14.4452 12.9431 10.917 18.2341 8.19369 23.9368C4.6808 31.29 1.18317 38.5479 7.69403 45.5657C17.3058 55.9228 34.9847 46.8808 31.4604 32.8681C29.2558 24.0969 22.4207 15.2913 18.3776 7.24807H18.3738Z",fill:"#C3C2C1"})})}function zNe({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 35 53",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("path",{d:"M17.3165 0.0038C17.932 -0.14959 19.7971 3.08645 20.2458 3.77481C24.7103 10.6135 34.3251 26.4346 34.937 34.2198C36.3757 52.5848 11.5505 60.1942 2.46584 44.534C-1.68714 37.3735 0.0148 31.6085 3.08879 24.5603C6.79681 16.0605 12.2884 7.75907 17.3165 0.0038ZM17.8615 7.11561L17.0977 7.34755C14.0423 12.7048 10.6124 17.8974 7.96483 23.4941C4.54975 30.7107 1.14949 37.8337 7.47908 44.721C16.8233 54.8856 34.01 46.0117 30.5838 32.2595C28.4405 23.6512 21.7957 15.0093 17.8652 7.11561H17.8615Z",fill:"#C3C2C1"}),o.jsx("path",{d:"M5.03547 30.112C9.64453 30.4936 11.632 35.7985 16.4154 35.791C19.6339 35.7873 20.2161 33.2283 22.3853 31.6197C31.6776 24.7286 33.5835 37.4894 27.9881 44.4254C18.1878 56.5653 -1.16063 44.6013 5.03917 30.1158L5.03547 30.112Z",fill:"#1F8FEB"})]})}function BNe({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 36 54",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("path",{d:"M17.9625 4.48059L4.77216 26.3154L2.08228 40.2175L10.0224 50.8414H23.1594L33.3246 42.1693V30.2455L17.9625 4.48059Z",fill:"#1F8FEB"}),o.jsx("path",{d:"M17.7948 0.00538C18.4273 -0.15091 20.3438 3.14642 20.8048 3.84781C25.3921 10.816 35.2715 26.9368 35.9001 34.8694C37.3784 53.5822 11.8702 61.3357 2.53562 45.3789C-1.73163 38.0829 0.0134 32.2087 3.1757 25.027C6.98574 16.3662 12.6284 7.90372 17.7948 0.00538ZM18.3549 7.24807L17.57 7.48441C14.4306 12.9431 10.9063 18.2341 8.1859 23.9368C4.67686 31.29 1.18305 38.5479 7.68679 45.5657C17.2881 55.9228 34.9476 46.8808 31.4271 32.8681C29.2249 24.0969 22.3974 15.2913 18.3587 7.24807H18.3549Z",fill:"#C3C2C1"})]})}function HNe({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"}),o.jsx("circle",{cx:"6",cy:"15",r:"2.5",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function $Ne({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("rect",{x:"4.5",y:"8",width:"3",height:"4.5",fill:"#d4a017",rx:"0.5"}),o.jsx("circle",{cx:"6",cy:"15",r:"2",fill:"#d4a017"}),o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function VNe({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("rect",{x:"4.5",y:"3",width:"3",height:"9.5",fill:"#c62828",rx:"0.5"}),o.jsx("circle",{cx:"6",cy:"15",r:"2",fill:"#c62828"}),o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function CN({className:t,color:e,isHeating:n}){const i={"text-orange-400":"#fb923c","text-blue-400":"#60a5fa","text-green-400":"#4ade80"}[e]||"#888",a=n?{filter:`drop-shadow(0 0 4px ${i}) drop-shadow(0 0 8px ${i})`}:{};return n?o.jsxs("svg",{className:t,style:a,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("rect",{x:"4.5",y:"3",width:"3",height:"9.5",fill:i,rx:"0.5"}),o.jsx("circle",{cx:"6",cy:"15",r:"2",fill:i}),o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:i,strokeWidth:"1",fill:"none"})]}):o.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:i,strokeWidth:"1",fill:"none"}),o.jsx("circle",{cx:"6",cy:"15",r:"2.5",stroke:i,strokeWidth:"1",fill:"none"})]})}function rH({humidity:t,goodThreshold:e=40,fairThreshold:n=60,onClick:r,compact:i}){const a=typeof t=="string"?parseInt(t,10):t,s=typeof e=="number"?e:40,l=typeof n=="number"?n:60;let c,u;isNaN(a)?(c="#C3C2C1",u="Unknown"):a<=s?(c="#22a352",u="Good"):a<=l?(c="#d4a017",u="Fair"):(c="#c62828",u="Bad");let d;return isNaN(a)||a<=s?d=nH:a<=l?d=zNe:d=BNe,o.jsxs("button",{type:"button",onClick:r,className:`flex items-center gap-1 ${r?"cursor-pointer hover:opacity-80 transition-opacity":""}`,title:`Humidity: ${a}% - ${u}${r?" (click for history)":""}`,children:[o.jsx(d,{className:i?"w-2.5 h-3":"w-3 h-4"}),o.jsxs("span",{className:`font-medium tabular-nums ${i?"text-[10px]":"text-xs"}`,style:{color:c},children:[a,"%"]})]})}function iH({temp:t,goodThreshold:e=28,fairThreshold:n=35,onClick:r,compact:i}){const a=typeof e=="number"?e:28,s=typeof n=="number"?n:35;let l,c,u;return t<=a?(l="#22a352",c="Good",u=HNe):t<=s?(l="#d4a017",c="Fair",u=$Ne):(l="#c62828",c="Bad",u=VNe),o.jsxs("button",{type:"button",onClick:r,className:`flex items-center gap-1 ${r?"cursor-pointer hover:opacity-80 transition-opacity":""}`,title:`Temperature: ${t}°C - ${c}${r?" (click for history)":""}`,children:[o.jsx(u,{className:i?"w-2.5 h-3":"w-3 h-4"}),o.jsxs("span",{className:`tabular-nums text-right ${i?"text-[10px] w-8":"w-12"}`,style:{color:l},children:[t,"°C"]})]})}function cm(t,e){const n=typeof t=="string"?parseInt(t,10):t,r=isNaN(n)?0:n,i=e===1,a=r>=128?r-128:r,s=String.fromCharCode(65+a);return i?`HT-${s}`:`AMS-${s}`}function aH(t){return t>50?"#00ae42":t>=15?"#f59e0b":"#ef4444"}function GNe(t){const e=Math.floor(t/3600),n=Math.floor(t%3600/60);return e>0?`${e}h ${n}m`:`${n}m`}function WNe(t){const e=new Date,n=new Date(e.getTime()+t*60*1e3),r=new Date;r.setHours(0,0,0,0);const i=new Date(n);i.setHours(0,0,0,0);const a=n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}),s=Math.floor((i.getTime()-r.getTime())/(1e3*60*60*24));return s===0?a:s===1?`Tomorrow ${a}`:n.toLocaleDateString([],{weekday:"short"})+" "+a}function qNe(t){if(!t)return"/img/printers/default.png";const e=t.toLowerCase().replace(/\s+/g,"");return e.includes("x1e")?"/img/printers/x1e.png":e.includes("x1c")||e.includes("x1carbon")||e.includes("x1")?"/img/printers/x1c.png":e.includes("h2d")||e.includes("h2c")||e.includes("h2s")?"/img/printers/h2d.png":e.includes("p2s")||e.includes("p1s")?"/img/printers/p1s.png":e.includes("p1p")?"/img/printers/p1p.png":e.includes("a1mini")?"/img/printers/a1mini.png":e.includes("a1")?"/img/printers/a1.png":"/img/printers/default.png"}function KNe(t){return t==null?{label:"",color:"text-bambu-gray",bars:0}:t>=-50?{label:"Excellent",color:"text-bambu-green",bars:4}:t>=-60?{label:"Good",color:"text-bambu-green",bars:3}:t>=-70?{label:"Fair",color:"text-yellow-400",bars:2}:t>=-80?{label:"Weak",color:"text-orange-400",bars:1}:{label:"Very weak",color:"text-red-400",bars:1}}function XNe({url:t,printName:e}){const[n,r]=M.useState(!1),[i,a]=M.useState(!1),[s,l]=M.useState(!1);return o.jsxs(o.Fragment,{children:[o.jsx("div",{className:`w-20 h-20 flex-shrink-0 rounded-lg overflow-hidden bg-bambu-dark-tertiary flex items-center justify-center ${t&&n?"cursor-pointer":""}`,onClick:()=>t&&n&&l(!0),children:t&&!i?o.jsxs(o.Fragment,{children:[o.jsx("img",{src:t,alt:"Print preview",className:`w-full h-full object-cover ${n?"block":"hidden"}`,onLoad:()=>r(!0),onError:()=>a(!0)}),!n&&o.jsx(_p,{className:"w-8 h-8 text-bambu-gray"})]}):o.jsx(_p,{className:"w-8 h-8 text-bambu-gray"})}),s&&t&&o.jsx("div",{className:"fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-8",onClick:()=>l(!1),children:o.jsxs("div",{className:"relative max-w-2xl max-h-full",children:[o.jsx("img",{src:t,alt:"Print preview",className:"max-w-full max-h-[80vh] rounded-lg shadow-2xl"}),e&&o.jsx("p",{className:"text-white text-center mt-4 text-lg",children:e})]})})]})}function YNe({printers:t}){const e=mn(),n=M.useMemo(()=>{let i=0,a=0,s=0,l=0;return t?.forEach(c=>{const u=e.getQueryData(["printerStatus",c.id]);u===void 0?l++:u.connected?u.state==="RUNNING"?i++:a++:s++}),{printing:i,idle:a,offline:s,loading:l,total:t?.length||0}},[t,e]),[,r]=M.useState(0);return M.useEffect(()=>{let i=!1;const a=e.getQueryCache().subscribe(()=>{i||(i=!0,requestAnimationFrame(()=>{r(s=>s+1),i=!1}))});return()=>a()},[e]),t?.length?o.jsxs("div",{className:"flex items-center gap-4 text-sm",children:[n.printing>0&&o.jsxs("div",{className:"flex items-center gap-1.5",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-bambu-green animate-pulse"}),o.jsxs("span",{className:"text-bambu-gray",children:[o.jsx("span",{className:"text-white font-medium",children:n.printing})," printing"]})]}),n.idle>0&&o.jsxs("div",{className:"flex items-center gap-1.5",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-blue-400"}),o.jsxs("span",{className:"text-bambu-gray",children:[o.jsx("span",{className:"text-white font-medium",children:n.idle})," idle"]})]}),n.offline>0&&o.jsxs("div",{className:"flex items-center gap-1.5",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-gray-400"}),o.jsxs("span",{className:"text-bambu-gray",children:[o.jsx("span",{className:"text-white font-medium",children:n.offline})," offline"]})]})]}):null}function sH(t,e){if(e)return e;switch(t){case"RUNNING":return"Printing";case"PAUSE":return"Paused";case"FINISH":return"Finished";case"FAILED":return"Failed";case"IDLE":return"Idle";default:return t?t.charAt(0)+t.slice(1).toLowerCase():"Idle"}}function oH({printer:t,hideIfDisconnected:e,maintenanceInfo:n,viewMode:r="expanded",amsThresholds:i}){const a=mn(),s=wb(),[l,c]=M.useState(!1),[u,d]=M.useState(!1),[f,g]=M.useState(!0),[p,x]=M.useState(!1),[v,y]=M.useState(!1),[b,E]=M.useState(!1),[w,T]=M.useState(!1),[A,C]=M.useState(!1),[N,F]=M.useState(!1),[k,R]=M.useState(null),{data:I}=gt({queryKey:["printerStatus",t.id],queryFn:()=>Se.getPrinterStatus(t.id),refetchInterval:3e4}),L=M.useMemo(()=>{const $=new Set;if(I?.ams)for(const Y of I.ams)for(const se of Y.tray||[])se.tray_info_idx&&$.add(se.tray_info_idx);return I?.vt_tray?.tray_info_idx&&$.add(I.vt_tray.tray_info_idx),Array.from($)},[I?.ams,I?.vt_tray]),{data:q}=gt({queryKey:["filamentInfo",L],queryFn:()=>Se.getFilamentInfo(L),enabled:L.length>0,staleTime:300*1e3}),[j,V]=M.useState(null);M.useEffect(()=>{I?.wifi_signal!=null&&V(I.wifi_signal)},[I?.wifi_signal]);const K=I?.wifi_signal??j,W=M.useRef(void 0);M.useEffect(()=>{I?.connected!==void 0&&(W.current=I.connected)},[I?.connected]);const J=I?.connected??W.current,ee=M.useRef({});M.useEffect(()=>{I?.ams_extruder_map&&Object.keys(I.ams_extruder_map).length>0&&(ee.current=I.ams_extruder_map)},[I?.ams_extruder_map]);const Z=I?.ams_extruder_map&&Object.keys(I.ams_extruder_map).length>0?I.ams_extruder_map:ee.current,B=M.useRef([]);M.useEffect(()=>{I?.ams&&I.ams.length>0&&(B.current=I.ams)},[I?.ams]);const G=I?.ams&&I.ams.length>0?I.ams:B.current,Q=M.useRef(255),te=I?.tray_now;te!==void 0&&te!==255&&(Q.current=te);const he=te===void 0||te===255?Q.current:te,{data:oe}=gt({queryKey:["smartPlugByPrinter",t.id],queryFn:()=>Se.getSmartPlugByPrinter(t.id)}),{data:xe}=gt({queryKey:["smartPlugStatus",oe?.id],queryFn:()=>oe?Se.getSmartPlugStatus(oe.id):null,enabled:!!oe,refetchInterval:1e4}),{data:Te}=gt({queryKey:["queue",t.id,"pending"],queryFn:()=>Se.getQueue(t.id,"pending")}),me=Te?.length||0,{data:ce}=gt({queryKey:["archives",t.id,"last"],queryFn:()=>Se.getArchives(t.id,1,0),enabled:I?.connected&&I?.state!=="RUNNING"}),Ce=ce?.[0],fe=e&&J===!1,Ie=vt({mutationFn:$=>Se.deletePrinter(t.id,$.deleteArchives),onSuccess:()=>{a.invalidateQueries({queryKey:["printers"]}),a.invalidateQueries({queryKey:["archives"]})}}),z=vt({mutationFn:()=>Se.connectPrinter(t.id),onSuccess:()=>{a.invalidateQueries({queryKey:["printerStatus",t.id]})}}),H=vt({mutationFn:$=>oe?Se.controlSmartPlug(oe.id,$):Promise.reject("No plug"),onSuccess:()=>{a.invalidateQueries({queryKey:["smartPlugStatus",oe?.id]})}}),re=vt({mutationFn:$=>oe?Se.updateSmartPlug(oe.id,{auto_off:$}):Promise.reject("No plug"),onSuccess:()=>{a.invalidateQueries({queryKey:["smartPlugByPrinter",t.id]}),a.invalidateQueries({queryKey:["smart-plugs"]})}});return fe?null:o.jsxs(wt,{className:"relative",children:[o.jsxs(Et,{children:[o.jsxs("div",{className:r==="compact"?"mb-2":"mb-4",children:[o.jsxs("div",{className:"flex items-start justify-between gap-2",children:[o.jsxs("div",{className:"flex items-center gap-3 min-w-0 flex-1",children:[o.jsx("img",{src:qNe(t.model),alt:t.model||"Printer",className:`object-contain rounded-lg bg-bambu-dark flex-shrink-0 ${r==="compact"?"w-10 h-10":"w-14 h-14"}`}),o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("h3",{className:`font-semibold text-white ${r==="compact"?"text-base truncate":"text-lg"}`,children:t.name}),r==="compact"&&o.jsx("div",{className:`w-2 h-2 rounded-full flex-shrink-0 ${I?.connected?"bg-bambu-green":"bg-red-500"}`,title:I?.connected?"Connected":"Offline"})]}),o.jsxs("p",{className:"text-sm text-bambu-gray",children:[t.model||"Unknown Model",r==="expanded"&&I?.nozzles&&I.nozzles[0]?.nozzle_diameter&&o.jsxs("span",{className:"ml-1.5 text-bambu-gray",title:I.nozzles[0].nozzle_type||"Nozzle",children:["• ",I.nozzles[0].nozzle_diameter,"mm"]}),r==="expanded"&&n&&n.total_print_hours>0&&o.jsxs("span",{className:"ml-2 text-bambu-gray",children:[o.jsx(rr,{className:"w-3 h-3 inline-block mr-1"}),Math.round(n.total_print_hours),"h"]})]})]})]}),o.jsxs("div",{className:"relative flex-shrink-0",children:[o.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>c(!l),children:o.jsx(cR,{className:"w-4 h-4"})}),l&&o.jsxs("div",{className:"absolute right-0 mt-2 w-48 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-lg z-10",children:[o.jsxs("button",{className:"w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2",onClick:()=>{x(!0),c(!1)},children:[o.jsx(Uc,{className:"w-4 h-4"}),"Edit"]}),o.jsxs("button",{className:"w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2",onClick:()=>{z.mutate(),c(!1)},children:[o.jsx(_a,{className:"w-4 h-4"}),"Reconnect"]}),o.jsxs("button",{className:"w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2",onClick:()=>{E(!0),c(!1)},children:[o.jsx(HG,{className:"w-4 h-4"}),"MQTT Debug"]}),o.jsxs("button",{className:"w-full px-4 py-2 text-left text-sm text-red-400 hover:bg-bambu-dark-tertiary flex items-center gap-2",onClick:()=>{d(!0),c(!1)},children:[o.jsx(En,{className:"w-4 h-4"}),"Delete"]})]})]})]}),r==="expanded"&&o.jsxs("div",{className:"flex flex-wrap items-center gap-2 mt-2",children:[o.jsxs("span",{className:`flex items-center gap-1.5 px-2 py-1 rounded-full text-xs ${I?.connected?"bg-bambu-green/20 text-bambu-green":"bg-red-500/20 text-red-400"}`,children:[I?.connected?o.jsx(Tb,{className:"w-3 h-3"}):o.jsx(GG,{className:"w-3 h-3"}),I?.connected?"Connected":"Offline"]}),I?.connected&&K!=null&&o.jsxs("span",{className:`flex items-center gap-1 px-2 py-1 rounded-full text-xs ${K>=-50||K>=-60?"bg-bambu-green/20 text-bambu-green":K>=-70?"bg-amber-500/20 text-amber-600":K>=-80?"bg-orange-500/20 text-orange-600":"bg-red-500/20 text-red-600"}`,title:`WiFi: ${K} dBm - ${KNe(K).label}`,children:[o.jsx(kue,{className:"w-3 h-3"}),K,"dBm"]}),I?.connected&&(()=>{const $=I.hms_errors?Hde(I.hms_errors):[];return o.jsxs("button",{onClick:()=>F(!0),className:`flex items-center gap-1 px-2 py-1 rounded-full text-xs cursor-pointer hover:opacity-80 transition-opacity ${$.length>0?$.some(Y=>Y.severity<=2)?"bg-red-500/20 text-red-400":"bg-orange-500/20 text-orange-400":"bg-bambu-green/20 text-bambu-green"}`,title:"Click to view HMS errors",children:[o.jsx(Gn,{className:"w-3 h-3"}),$.length>0?$.length:"OK"]})})(),n&&o.jsxs("button",{onClick:()=>s("/maintenance"),className:`flex items-center gap-1 px-2 py-1 rounded-full text-xs cursor-pointer hover:opacity-80 transition-opacity ${n.due_count>0?"bg-red-500/20 text-red-400":n.warning_count>0?"bg-orange-500/20 text-orange-400":"bg-bambu-green/20 text-bambu-green"}`,title:n.due_count>0||n.warning_count>0?`${n.due_count>0?`${n.due_count} maintenance due`:""}${n.due_count>0&&n.warning_count>0?", ":""}${n.warning_count>0?`${n.warning_count} due soon`:""} - Click to view`:"All maintenance up to date - Click to view",children:[o.jsx(gd,{className:"w-3 h-3"}),n.due_count>0||n.warning_count>0?n.due_count+n.warning_count:"OK"]}),me>0&&o.jsxs("button",{onClick:()=>s("/queue"),className:"flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-purple-500/20 text-purple-400 hover:opacity-80 transition-opacity",title:`${me} print${me>1?"s":""} in queue`,children:[o.jsx(pd,{className:"w-3 h-3"}),me]})]})]}),u&&o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",children:o.jsx(wt,{className:"w-full max-w-md mx-4",children:o.jsxs(Et,{children:[o.jsxs("div",{className:"flex items-start gap-3 mb-4",children:[o.jsx("div",{className:"p-2 rounded-full bg-red-500/20",children:o.jsx(Gn,{className:"w-5 h-5 text-red-400"})}),o.jsxs("div",{children:[o.jsx("h3",{className:"text-lg font-semibold text-white",children:"Delete Printer"}),o.jsxs("p",{className:"text-sm text-bambu-gray mt-1",children:['Are you sure you want to delete "',t.name,'"? This will remove all connection settings.']})]})]}),o.jsx("div",{className:"bg-bambu-dark rounded-lg p-3 mb-4",children:o.jsxs("label",{className:"flex items-start gap-3 cursor-pointer",children:[o.jsx("input",{type:"checkbox",checked:f,onChange:$=>g($.target.checked),className:"mt-0.5 w-4 h-4 rounded border-bambu-gray bg-bambu-dark-secondary text-bambu-green focus:ring-bambu-green focus:ring-offset-0"}),o.jsxs("div",{children:[o.jsx("span",{className:"text-sm text-white",children:"Delete print archives"}),o.jsx("p",{className:"text-xs text-bambu-gray mt-0.5",children:f?"All print history for this printer will be permanently deleted.":"Print history will be kept but no longer associated with this printer."})]})]})}),o.jsxs("div",{className:"flex justify-end gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:()=>{d(!1),g(!0)},children:"Cancel"}),o.jsx(ke,{variant:"danger",onClick:()=>{Ie.mutate({deleteArchives:f}),d(!1),g(!0)},children:"Delete"})]})]})})}),I?.connected&&o.jsxs(o.Fragment,{children:[r==="compact"?o.jsx("div",{className:"mt-2",children:I.state==="RUNNING"?o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("div",{className:"flex-1 bg-bambu-dark-tertiary rounded-full h-1.5",children:o.jsx("div",{className:"bg-bambu-green h-1.5 rounded-full transition-all",style:{width:`${I.progress||0}%`}})}),o.jsxs("span",{className:"text-xs text-white",children:[Math.round(I.progress||0),"%"]})]}):o.jsx("p",{className:"text-xs text-bambu-gray",children:sH(I.state,I.stg_cur_name)})}):o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"mb-4 p-3 bg-bambu-dark rounded-lg",children:o.jsxs("div",{className:"flex gap-3",children:[o.jsx(XNe,{url:I.state==="RUNNING"?I.cover_url:null,printName:I.state==="RUNNING"&&(I.subtask_name||I.current_print)||void 0}),o.jsx("div",{className:"flex-1 min-w-0",children:I.current_print&&I.state==="RUNNING"?o.jsxs(o.Fragment,{children:[o.jsx("p",{className:"text-sm text-bambu-gray mb-1",children:I.stg_cur_name||"Printing"}),o.jsx("p",{className:"text-white text-sm mb-2 truncate",children:I.subtask_name||I.current_print}),o.jsxs("div",{className:"flex items-center justify-between text-sm",children:[o.jsx("div",{className:"flex-1 bg-bambu-dark-tertiary rounded-full h-2 mr-3",children:o.jsx("div",{className:"bg-bambu-green h-2 rounded-full transition-all",style:{width:`${I.progress||0}%`}})}),o.jsxs("span",{className:"text-white",children:[Math.round(I.progress||0),"%"]})]}),o.jsxs("div",{className:"flex items-center gap-3 mt-2 text-xs text-bambu-gray",children:[I.remaining_time!=null&&I.remaining_time>0&&o.jsxs(o.Fragment,{children:[o.jsxs("span",{className:"flex items-center gap-1",children:[o.jsx(rr,{className:"w-3 h-3"}),GNe(I.remaining_time*60)]}),o.jsxs("span",{className:"text-bambu-green font-medium",title:"Estimated completion time",children:["ETA ",WNe(I.remaining_time)]})]}),I.layer_num!=null&&I.total_layers!=null&&I.total_layers>0&&o.jsxs("span",{className:"flex items-center gap-1",children:[o.jsx(pd,{className:"w-3 h-3"}),I.layer_num,"/",I.total_layers]})]})]}):o.jsxs(o.Fragment,{children:[o.jsx("p",{className:"text-sm text-bambu-gray mb-1",children:"Status"}),o.jsx("p",{className:"text-white text-sm mb-2",children:sH(I.state,I.stg_cur_name)}),o.jsxs("div",{className:"flex items-center justify-between text-sm",children:[o.jsx("div",{className:"flex-1 bg-bambu-dark-tertiary rounded-full h-2 mr-3",children:o.jsx("div",{className:"bg-bambu-dark-tertiary h-2 rounded-full"})}),o.jsx("span",{className:"text-bambu-gray",children:"—"})]}),Ce?o.jsxs("p",{className:"text-xs text-bambu-gray mt-2 truncate",title:Ce.print_name||Ce.filename,children:["Last: ",Ce.print_name||Ce.filename,Ce.completed_at&&o.jsxs("span",{className:"ml-1 text-bambu-gray/60",children:["• ",new Date(Ce.completed_at).toLocaleDateString([],{month:"short",day:"numeric"})]})]}):o.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:"Ready to print"})]})})]})}),I.state!=="RUNNING"&&o.jsx(Wde,{printerId:t.id})]}),I.temperatures&&r==="expanded"&&(()=>{const $=I.temperatures.nozzle_heating||I.temperatures.nozzle_2_heating||!1,Y=I.temperatures.bed_heating||!1,se=I.temperatures.chamber_heating||!1;return o.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[o.jsxs("div",{className:"text-center p-2 bg-bambu-dark rounded-lg",children:[o.jsx(CN,{className:"w-4 h-4 mx-auto mb-1",color:"text-orange-400",isHeating:$}),I.temperatures.nozzle_2!==void 0?o.jsxs(o.Fragment,{children:[o.jsx("p",{className:"text-xs text-bambu-gray",children:"Left / Right"}),o.jsxs("p",{className:"text-sm text-white",children:[Math.round(I.temperatures.nozzle||0),"°C / ",Math.round(I.temperatures.nozzle_2||0),"°C"]})]}):o.jsxs(o.Fragment,{children:[o.jsx("p",{className:"text-xs text-bambu-gray",children:"Nozzle"}),o.jsxs("p",{className:"text-sm text-white",children:[Math.round(I.temperatures.nozzle||0),"°C"]})]})]}),o.jsxs("div",{className:"text-center p-2 bg-bambu-dark rounded-lg",children:[o.jsx(CN,{className:"w-4 h-4 mx-auto mb-1",color:"text-blue-400",isHeating:Y}),o.jsx("p",{className:"text-xs text-bambu-gray",children:"Bed"}),o.jsxs("p",{className:"text-sm text-white",children:[Math.round(I.temperatures.bed||0),"°C"]})]}),I.temperatures.chamber!==void 0&&o.jsxs("div",{className:"text-center p-2 bg-bambu-dark rounded-lg",children:[o.jsx(CN,{className:"w-4 h-4 mx-auto mb-1",color:"text-green-400",isHeating:se}),o.jsx("p",{className:"text-xs text-bambu-gray",children:"Chamber"}),o.jsxs("p",{className:"text-sm text-white",children:[Math.round(I.temperatures.chamber||0),"°C"]})]})]})})(),G&&G.length>0&&r==="expanded"&&(()=>{const $=G.filter(ue=>ue.tray.length>1),Y=G.filter(ue=>ue.tray.length===1),se=t.nozzle_count===2||I?.temperatures?.nozzle_2!==void 0;return o.jsxs("div",{className:"mt-4 pt-3 border-t border-bambu-dark-tertiary/50",children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[o.jsx("span",{className:"text-[10px] uppercase tracking-wider text-bambu-gray font-medium",children:"Filaments"}),o.jsx("div",{className:"flex-1 h-px bg-bambu-dark-tertiary/30"})]}),o.jsxs("div",{className:"space-y-3",children:[$.length>0&&o.jsx("div",{className:"grid grid-cols-2 gap-3",children:$.map(ue=>{const Ee=Z[String(ue.id)],Me=ue.id>=128?ue.id-128:ue.id,U=Ee!==void 0?Ee:Me,O=U===1,ne=U===0;return o.jsxs("div",{className:"p-2.5 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary/30",children:[o.jsxs("div",{className:"flex items-center justify-between mb-2",children:[o.jsxs("div",{className:"flex items-center gap-1.5",children:[o.jsx("span",{className:"text-[10px] text-white font-medium",children:cm(ue.id,ue.tray.length)}),se&&(O||ne)&&o.jsx(tH,{side:O?"L":"R"})]}),(ue.humidity!=null||ue.temp!=null)&&o.jsxs("div",{className:"flex items-center gap-1.5",children:[ue.humidity!=null&&o.jsx(rH,{humidity:ue.humidity,goodThreshold:i?.humidityGood,fairThreshold:i?.humidityFair,onClick:()=>R({amsId:ue.id,amsLabel:cm(ue.id,ue.tray.length),mode:"humidity"}),compact:!0}),ue.temp!=null&&o.jsx(iH,{temp:ue.temp,goodThreshold:i?.tempGood,fairThreshold:i?.tempFair,onClick:()=>R({amsId:ue.id,amsLabel:cm(ue.id,ue.tray.length),mode:"temperature"}),compact:!0})]})]}),o.jsx("div",{className:"grid grid-cols-4 gap-1.5",children:[0,1,2,3].map(be=>{const ye=ue.tray[be]||ue.tray.find(ze=>ze.id===be),_e=ye?.tray_type&&ye.remain>=0,We=!ye?.tray_type,Ve=ue.id*4+be,Ye=he===Ve,lt=ye?.tray_info_idx?q?.[ye.tray_info_idx]:null,de=ye?.tray_type?{vendor:ye.tray_uuid?"Bambu Lab":"Generic",profile:lt?.name||ye.tray_sub_brands||ye.tray_type,colorName:TN(ye.tray_id_name)||AN(ye.tray_color),colorHex:ye.tray_color||null,kFactor:NN(ye.k),fillLevel:_e?ye.remain:null}:null,ae=o.jsxs("div",{className:`bg-bambu-dark-tertiary rounded p-1 text-center cursor-default ${We?"opacity-50":""} ${Ye?"ring-2 ring-bambu-green ring-offset-1 ring-offset-bambu-dark":""}`,children:[o.jsx("div",{className:"w-3.5 h-3.5 rounded-full mx-auto mb-0.5 border-2",style:{backgroundColor:ye?.tray_color?`#${ye.tray_color}`:ye?.tray_type?"#333":"transparent",borderColor:We?"#666":"rgba(255,255,255,0.1)",borderStyle:We?"dashed":"solid"}}),o.jsx("div",{className:"text-[9px] text-white font-bold truncate",children:ye?.tray_type||"—"}),o.jsx("div",{className:"mt-1 h-1.5 bg-black/30 rounded-full overflow-hidden",children:_e&&ye?o.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${ye.remain}%`,backgroundColor:aH(ye.remain)}}):ye?.tray_type?o.jsx("div",{className:"h-full w-full rounded-full bg-white/50 dark:bg-gray-500/40"}):null})]});return de?o.jsx(EN,{data:de,children:ae},be):o.jsx(eH,{children:ae},be)})})]},ue.id)})}),(Y.length>0||I.vt_tray&&I.vt_tray.tray_type)&&o.jsxs("div",{className:"grid grid-cols-4 gap-3",children:[Y.map(ue=>{const Ee=Z[String(ue.id)],Me=ue.id>=128?ue.id-128:ue.id,U=Ee!==void 0?Ee:Me,O=U===1,ne=U===0,be=ue.tray[0],ye=be?.tray_type&&be.remain>=0,_e=!be?.tray_type,We=ue.id*4+(be?.id??0),Ve=he===We,Ye=be?.tray_info_idx?q?.[be.tray_info_idx]:null,lt=be?.tray_type?{vendor:be.tray_uuid?"Bambu Lab":"Generic",profile:Ye?.name||be.tray_sub_brands||be.tray_type,colorName:TN(be.tray_id_name)||AN(be.tray_color),colorHex:be.tray_color||null,kFactor:NN(be.k),fillLevel:ye?be.remain:null}:null,de=o.jsxs("div",{className:`bg-bambu-dark-tertiary rounded p-1 text-center cursor-default ${_e?"opacity-50":""} ${Ve?"ring-2 ring-bambu-green ring-offset-1 ring-offset-bambu-dark":""}`,children:[o.jsx("div",{className:"w-3.5 h-3.5 rounded-full mx-auto mb-0.5 border-2",style:{backgroundColor:be?.tray_color?`#${be.tray_color}`:be?.tray_type?"#333":"transparent",borderColor:_e?"#666":"rgba(255,255,255,0.1)",borderStyle:_e?"dashed":"solid"}}),o.jsx("div",{className:"text-[9px] text-white font-bold truncate",children:be?.tray_type||"—"}),o.jsx("div",{className:"mt-1 h-1.5 bg-black/30 rounded-full overflow-hidden",children:ye?o.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${be.remain}%`,backgroundColor:aH(be.remain)}}):be?.tray_type?o.jsx("div",{className:"h-full w-full rounded-full bg-white/50 dark:bg-gray-500/40"}):null})]});return o.jsxs("div",{className:"p-2.5 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary/30",children:[o.jsxs("div",{className:"flex items-center gap-1 mb-2",children:[o.jsx("span",{className:"text-[10px] text-white font-medium",children:cm(ue.id,ue.tray.length)}),se&&(O||ne)&&o.jsx(tH,{side:O?"L":"R"})]}),o.jsxs("div",{className:"flex gap-1.5",children:[lt?o.jsx(EN,{data:lt,className:"flex-1",children:de}):o.jsx(eH,{className:"flex-1",children:de}),(ue.humidity!=null||ue.temp!=null)&&o.jsxs("div",{className:"flex flex-col justify-center gap-1 shrink-0",children:[ue.temp!=null&&o.jsx(iH,{temp:ue.temp,goodThreshold:i?.tempGood,fairThreshold:i?.tempFair,onClick:()=>R({amsId:ue.id,amsLabel:cm(ue.id,ue.tray.length),mode:"temperature"}),compact:!0}),ue.humidity!=null&&o.jsx(rH,{humidity:ue.humidity,goodThreshold:i?.humidityGood,fairThreshold:i?.humidityFair,onClick:()=>R({amsId:ue.id,amsLabel:cm(ue.id,ue.tray.length),mode:"humidity"}),compact:!0})]})]})]},ue.id)}),I.vt_tray&&I.vt_tray.tray_type&&(()=>{const ue=I.vt_tray,Ee=he===254,Me=ue.tray_info_idx?q?.[ue.tray_info_idx]:null,U={vendor:ue.tray_uuid?"Bambu Lab":"Generic",profile:Me?.name||ue.tray_sub_brands||ue.tray_type||"Unknown",colorName:TN(ue.tray_id_name)||AN(ue.tray_color),colorHex:ue.tray_color||null,kFactor:NN(ue.k),fillLevel:null},O=o.jsxs("div",{className:`bg-bambu-dark-tertiary rounded p-1 text-center cursor-default ${Ee?"ring-2 ring-bambu-green ring-offset-1 ring-offset-bambu-dark":""}`,children:[o.jsx("div",{className:"w-3.5 h-3.5 rounded-full mx-auto mb-0.5 border-2",style:{backgroundColor:ue.tray_color?`#${ue.tray_color}`:"#333",borderColor:Ee?"var(--accent)":"rgba(255,255,255,0.1)"}}),o.jsx("div",{className:"text-[9px] text-white font-bold truncate",children:ue.tray_type||"Spool"}),o.jsx("div",{className:"mt-1 h-1.5 bg-black/30 rounded-full overflow-hidden",children:o.jsx("div",{className:"h-full w-full rounded-full bg-white/50 dark:bg-gray-500/40"})})]});return o.jsxs("div",{className:"p-2.5 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary/30",children:[o.jsx("div",{className:"flex items-center gap-1 mb-2",children:o.jsx("span",{className:"text-[10px] text-white font-medium",children:"External"})}),o.jsx(EN,{data:U,children:O})]})})()]})]})]})})()]}),oe&&r==="expanded"&&o.jsx("div",{className:"mt-4 pt-4 border-t border-bambu-dark-tertiary",children:o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[o.jsx(ef,{className:"w-4 h-4 text-bambu-gray flex-shrink-0"}),o.jsx("span",{className:"text-sm text-white truncate",children:oe.name}),xe&&o.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded flex-shrink-0 ${xe.state==="ON"?"bg-bambu-green/20 text-bambu-green":xe.state==="OFF"?"bg-red-500/20 text-red-400":"bg-bambu-gray/20 text-bambu-gray"}`,children:xe.state||"?"}),xe?.energy?.power!=null&&xe.state==="ON"&&o.jsxs("span",{className:"text-xs text-yellow-400 font-medium flex-shrink-0",children:[xe.energy.power,"W"]})]}),o.jsx("div",{className:"flex-1"}),o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsxs("button",{onClick:()=>T(!0),disabled:H.isPending||xe?.state==="ON",className:`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${xe?.state==="ON"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary"}`,children:[o.jsx(kl,{className:"w-3 h-3"}),"On"]}),o.jsxs("button",{onClick:()=>C(!0),disabled:H.isPending||xe?.state==="OFF",className:`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${xe?.state==="OFF"?"bg-red-500/30 text-red-400":"bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary"}`,children:[o.jsx(JS,{className:"w-3 h-3"}),"Off"]})]}),o.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[o.jsx("span",{className:`text-xs hidden sm:inline ${oe.auto_off_executed?"text-bambu-green":"text-bambu-gray"}`,children:oe.auto_off_executed?"Auto-off done":"Auto-off"}),o.jsx("button",{onClick:()=>re.mutate(!oe.auto_off),disabled:re.isPending||oe.auto_off_executed,title:oe.auto_off_executed?"Auto-off was executed - turn printer on to reset":"Auto power-off after print",className:`relative w-9 h-5 rounded-full transition-colors flex-shrink-0 ${oe.auto_off_executed?"bg-bambu-green/50 cursor-not-allowed":oe.auto_off?"bg-bambu-green":"bg-bambu-dark-tertiary"}`,children:o.jsx("span",{className:`absolute top-[2px] left-[2px] w-4 h-4 bg-white rounded-full transition-transform ${oe.auto_off||oe.auto_off_executed?"translate-x-4":"translate-x-0"}`})})]})]})}),r==="expanded"&&o.jsxs("div",{className:"mt-4 pt-4 border-t border-bambu-dark-tertiary flex items-center justify-between",children:[o.jsxs("div",{className:"text-xs text-bambu-gray",children:[o.jsx("p",{children:t.ip_address}),o.jsx("p",{className:"truncate",children:t.serial_number})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx(ke,{variant:"secondary",size:"sm",onClick:()=>{window.open(`/camera/${t.id}`,`camera-${t.id}`,"width=640,height=400,menubar=no,toolbar=no,location=no,status=no")},disabled:!I?.connected,title:"Open camera in new window",children:o.jsx(WG,{className:"w-4 h-4"})}),o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>y(!0),title:"Browse printer files",children:[o.jsx(hR,{className:"w-4 h-4"}),"Files"]})]})]})]}),v&&o.jsx(Ude,{printerId:t.id,printerName:t.name,onClose:()=>y(!1)}),b&&o.jsx(zde,{printerId:t.id,printerName:t.name,onClose:()=>E(!1)}),w&&oe&&o.jsx(kr,{title:"Power On Printer",message:`Are you sure you want to turn ON the power for "${t.name}"?`,confirmText:"Power On",variant:"default",onConfirm:()=>{H.mutate("on"),T(!1)},onCancel:()=>T(!1)}),A&&oe&&o.jsx(kr,{title:"Power Off Printer",message:I?.state==="RUNNING"?`WARNING: "${t.name}" is currently printing! Are you sure you want to turn OFF the power? This will interrupt the print and may damage the printer.`:`Are you sure you want to turn OFF the power for "${t.name}"?`,confirmText:"Power Off",variant:"danger",onConfirm:()=>{H.mutate("off"),C(!1)},onCancel:()=>C(!1)}),N&&o.jsx(Vde,{printerName:t.name,errors:I?.hms_errors||[],onClose:()=>F(!1)}),k&&o.jsx(FNe,{isOpen:!!k,onClose:()=>R(null),printerId:t.id,printerName:t.name,amsId:k.amsId,amsLabel:k.amsLabel,initialMode:k.mode,thresholds:i}),p&&o.jsx(QNe,{printer:t,onClose:()=>x(!1)})]})}function ZNe({onClose:t,onAdd:e,existingSerials:n}){const[r,i]=M.useState({name:"",serial_number:"",ip_address:"",access_code:"",model:"",auto_archive:!0}),[a,s]=M.useState(!1),[l,c]=M.useState([]),[u,d]=M.useState(""),[f,g]=M.useState(!1),[p,x]=M.useState(!1),[v,y]=M.useState("192.168.1.0/24"),[b,E]=M.useState({scanned:0,total:0});M.useEffect(()=>{Jo.getInfo().then(N=>{x(N.is_docker)}).catch(()=>{})},[]);const w=l.filter(N=>!n.includes(N.serial)),T=async()=>{d(""),c([]),s(!0),g(!1),E({scanned:0,total:0});try{if(p){await Jo.startSubnetScan(v);const N=setInterval(async()=>{try{const F=await Jo.getScanStatus();E({scanned:F.scanned,total:F.total});const k=await Jo.getDiscoveredPrinters();c(k),F.running||(clearInterval(N),s(!1),g(!0))}catch(F){console.error("Failed to get scan status:",F)}},500)}else{await Jo.startDiscovery(10);const N=setInterval(async()=>{try{const F=await Jo.getDiscoveredPrinters();c(F)}catch(F){console.error("Failed to get discovered printers:",F)}},1e3);setTimeout(async()=>{clearInterval(N);try{await Jo.stopDiscovery()}catch{}s(!1),g(!0);try{const F=await Jo.getDiscoveredPrinters();c(F)}catch(F){console.error("Failed to get final discovered printers:",F)}},1e4)}}catch(N){console.error("Failed to start discovery:",N),d(N instanceof Error?N.message:"Failed to start discovery"),s(!1),g(!0)}},A=N=>N?{O1D:"H2D",O1C:"H2C",O1S:"H2S","BL-P001":"X1C","BL-P002":"X1","BL-P003":"X1E",C11:"P1S",C12:"P1P",C13:"P2S",N2S:"A1",N1:"A1 Mini",X1C:"X1C",X1:"X1",X1E:"X1E",P1S:"P1S",P1P:"P1P",P2S:"P2S",A1:"A1","A1 Mini":"A1 Mini",H2D:"H2D",H2C:"H2C",H2S:"H2S"}[N]||N:"",C=N=>{i({...r,name:N.name||"",serial_number:N.serial,ip_address:N.ip_address,model:A(N.model)}),c([])};return M.useEffect(()=>()=>{Jo.stopDiscovery().catch(()=>{}),Jo.stopSubnetScan().catch(()=>{})},[]),M.useEffect(()=>{const N=F=>{F.key==="Escape"&&t()};return window.addEventListener("keydown",N),()=>window.removeEventListener("keydown",N)},[t]),o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",onClick:t,children:o.jsx(wt,{className:"w-full max-w-md",onClick:N=>N.stopPropagation(),children:o.jsxs(Et,{children:[o.jsx("h2",{className:"text-xl font-semibold mb-4",children:"Add Printer"}),o.jsxs("div",{className:"mb-4 pb-4 border-b border-bambu-dark-tertiary",children:[p&&o.jsxs("div",{className:"mb-3",children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Subnet to scan"}),o.jsx("input",{type:"text",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none text-sm",value:v,onChange:N=>y(N.target.value),placeholder:"192.168.1.0/24",disabled:a}),o.jsxs("p",{className:"mt-1 text-xs text-bambu-gray",children:["Docker detected. Enter your printer's subnet in CIDR notation. Requires ",o.jsx("code",{className:"text-bambu-green",children:"network_mode: host"})," in docker-compose.yml."]})]}),o.jsx(ke,{type:"button",variant:"secondary",onClick:T,disabled:a,className:"w-full",children:a?o.jsxs(o.Fragment,{children:[o.jsx(xt,{className:"w-4 h-4 animate-spin"}),p&&b.total>0?`Scanning... ${b.scanned}/${b.total}`:"Scanning..."]}):o.jsxs(o.Fragment,{children:[o.jsx(bl,{className:"w-4 h-4"}),p?"Scan Subnet for Printers":"Discover Printers on Network"]})}),u&&o.jsx("div",{className:"mt-2 text-sm text-red-400",children:u}),w.length>0&&o.jsx("div",{className:"mt-3 space-y-2 max-h-40 overflow-y-auto",children:w.map(N=>o.jsxs("div",{className:"flex items-center justify-between p-2 bg-bambu-dark rounded-lg hover:bg-bambu-dark-secondary cursor-pointer transition-colors",onClick:()=>C(N),children:[o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsx("p",{className:"font-medium text-white text-sm truncate",children:N.name||N.serial}),o.jsxs("p",{className:"text-xs text-bambu-gray truncate",children:[A(N.model)||"Unknown"," • ",N.ip_address]})]}),o.jsx(Cl,{className:"w-4 h-4 text-bambu-gray -rotate-90 flex-shrink-0 ml-2"})]},N.serial))}),a&&o.jsx("p",{className:"mt-2 text-sm text-bambu-gray text-center",children:p?"Scanning subnet for Bambu printers...":"Scanning network..."}),f&&!a&&l.length===0&&o.jsxs("p",{className:"mt-2 text-sm text-bambu-gray text-center",children:["No printers found",p?" in the specified subnet":" on the network","."]}),f&&!a&&l.length>0&&w.length===0&&o.jsx("p",{className:"mt-2 text-sm text-bambu-gray text-center",children:"All discovered printers are already configured."})]}),o.jsxs("form",{onSubmit:N=>{N.preventDefault(),e(r)},className:"space-y-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name"}),o.jsx("input",{type:"text",required:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.name,onChange:N=>i({...r,name:N.target.value}),placeholder:"My Printer"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"IP Address"}),o.jsx("input",{type:"text",required:!0,pattern:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.ip_address,onChange:N=>i({...r,ip_address:N.target.value}),placeholder:"192.168.1.100"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Serial Number"}),o.jsx("input",{type:"text",required:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.serial_number,onChange:N=>i({...r,serial_number:N.target.value}),placeholder:"01P00A000000000"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Access Code"}),o.jsx("input",{type:"password",required:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.access_code,onChange:N=>i({...r,access_code:N.target.value}),placeholder:"From printer settings"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Model (optional)"}),o.jsxs("select",{className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.model||"",onChange:N=>i({...r,model:N.target.value}),children:[o.jsx("option",{value:"",children:"Select model..."}),o.jsxs("optgroup",{label:"H2 Series",children:[o.jsx("option",{value:"H2C",children:"H2C"}),o.jsx("option",{value:"H2D",children:"H2D"}),o.jsx("option",{value:"H2S",children:"H2S"})]}),o.jsxs("optgroup",{label:"X1 Series",children:[o.jsx("option",{value:"X1E",children:"X1E"}),o.jsx("option",{value:"X1C",children:"X1 Carbon"}),o.jsx("option",{value:"X1",children:"X1"})]}),o.jsxs("optgroup",{label:"P Series",children:[o.jsx("option",{value:"P2S",children:"P2S"}),o.jsx("option",{value:"P1S",children:"P1S"}),o.jsx("option",{value:"P1P",children:"P1P"})]}),o.jsxs("optgroup",{label:"A1 Series",children:[o.jsx("option",{value:"A1",children:"A1"}),o.jsx("option",{value:"A1 Mini",children:"A1 Mini"})]})]})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"checkbox",id:"auto_archive",checked:r.auto_archive,onChange:N=>i({...r,auto_archive:N.target.checked}),className:"rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),o.jsx("label",{htmlFor:"auto_archive",className:"text-sm text-bambu-gray",children:"Auto-archive completed prints"})]}),o.jsxs("div",{className:"flex gap-3 pt-4",children:[o.jsx(ke,{type:"button",variant:"secondary",onClick:t,className:"flex-1",children:"Cancel"}),o.jsx(ke,{type:"submit",className:"flex-1",children:"Add Printer"})]})]})]})})})}function QNe({printer:t,onClose:e}){const n=mn(),[r,i]=M.useState({name:t.name,ip_address:t.ip_address,access_code:"",model:t.model||"",location:t.location||"",auto_archive:t.auto_archive}),a=vt({mutationFn:l=>Se.updatePrinter(t.id,l),onSuccess:()=>{n.invalidateQueries({queryKey:["printers"]}),n.invalidateQueries({queryKey:["printerStatus",t.id]}),e()}});M.useEffect(()=>{const l=c=>{c.key==="Escape"&&e()};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[e]);const s=l=>{l.preventDefault();const c={name:r.name,ip_address:r.ip_address,model:r.model||void 0,location:r.location||void 0,auto_archive:r.auto_archive};r.access_code&&(c.access_code=r.access_code),a.mutate(c)};return o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",onClick:e,children:o.jsx(wt,{className:"w-full max-w-md",onClick:l=>l.stopPropagation(),children:o.jsxs(Et,{children:[o.jsx("h2",{className:"text-xl font-semibold mb-4",children:"Edit Printer"}),o.jsxs("form",{onSubmit:s,className:"space-y-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name"}),o.jsx("input",{type:"text",required:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.name,onChange:l=>i({...r,name:l.target.value}),placeholder:"My Printer"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"IP Address"}),o.jsx("input",{type:"text",required:!0,pattern:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.ip_address,onChange:l=>i({...r,ip_address:l.target.value}),placeholder:"192.168.1.100"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Serial Number"}),o.jsx("input",{type:"text",disabled:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-bambu-gray cursor-not-allowed",value:t.serial_number}),o.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Serial number cannot be changed"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Access Code"}),o.jsx("input",{type:"password",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.access_code,onChange:l=>i({...r,access_code:l.target.value}),placeholder:"Leave empty to keep current"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Model"}),o.jsxs("select",{className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.model,onChange:l=>i({...r,model:l.target.value}),children:[o.jsx("option",{value:"",children:"Select model..."}),o.jsxs("optgroup",{label:"H2 Series",children:[o.jsx("option",{value:"H2C",children:"H2C"}),o.jsx("option",{value:"H2D",children:"H2D"}),o.jsx("option",{value:"H2S",children:"H2S"})]}),o.jsxs("optgroup",{label:"X1 Series",children:[o.jsx("option",{value:"X1E",children:"X1E"}),o.jsx("option",{value:"X1C",children:"X1 Carbon"}),o.jsx("option",{value:"X1",children:"X1"})]}),o.jsxs("optgroup",{label:"P Series",children:[o.jsx("option",{value:"P2S",children:"P2S"}),o.jsx("option",{value:"P1S",children:"P1S"}),o.jsx("option",{value:"P1P",children:"P1P"})]}),o.jsxs("optgroup",{label:"A1 Series",children:[o.jsx("option",{value:"A1",children:"A1"}),o.jsx("option",{value:"A1 Mini",children:"A1 Mini"})]})]})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Location / Group"}),o.jsx("input",{type:"text",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.location,onChange:l=>i({...r,location:l.target.value}),placeholder:"e.g., Workshop, Office, Basement"}),o.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Used to group printers on the dashboard"})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"checkbox",id:"edit_auto_archive",checked:r.auto_archive,onChange:l=>i({...r,auto_archive:l.target.checked}),className:"rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),o.jsx("label",{htmlFor:"edit_auto_archive",className:"text-sm text-bambu-gray",children:"Auto-archive completed prints"})]}),o.jsxs("div",{className:"flex gap-3 pt-4",children:[o.jsx(ke,{type:"button",variant:"secondary",onClick:e,className:"flex-1",children:"Cancel"}),o.jsx(ke,{type:"submit",className:"flex-1",disabled:a.isPending,children:a.isPending?"Saving...":"Save Changes"})]})]})]})})})}function JNe(t){const{data:e}=gt({queryKey:["printerStatus",t],queryFn:()=>Se.getPrinterStatus(t),refetchInterval:3e4});return!e?.connected}function eCe({printer:t,plug:e,onPowerOn:n,isPowering:r}){const i=JNe(t.id),{data:a}=gt({queryKey:["smartPlugStatus",e.id],queryFn:()=>Se.getSmartPlugStatus(e.id),refetchInterval:1e4});return i?o.jsxs("div",{className:"flex items-center justify-between px-3 py-2 hover:bg-gray-100 dark:hover:bg-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[o.jsx("span",{className:"text-sm text-gray-900 dark:text-white truncate",children:t.name}),a&&o.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded ${a.state==="ON"?"bg-bambu-green/20 text-bambu-green":"bg-red-500/20 text-red-400"}`,children:a.state||"?"})]}),o.jsxs("button",{onClick:()=>n(e.id),disabled:r||a?.state==="ON",className:`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${a?.state==="ON"?"bg-bambu-green/20 text-bambu-green cursor-default":"bg-bambu-green/20 text-bambu-green hover:bg-bambu-green hover:text-white"}`,children:[o.jsx(kl,{className:"w-3 h-3"}),r?"...":"On"]})]}):null}function tCe(){const[t,e]=M.useState(!1),[n,r]=M.useState(()=>localStorage.getItem("hideDisconnectedPrinters")==="true"),[i,a]=M.useState(!1),[s,l]=M.useState(null),[c,u]=M.useState(()=>localStorage.getItem("printerSortBy")||"name"),[d,f]=M.useState(()=>localStorage.getItem("printerSortAsc")!=="false"),[g,p]=M.useState(()=>localStorage.getItem("printerViewMode")||"expanded"),x=mn(),{data:v,isLoading:y}=gt({queryKey:["printers"],queryFn:Se.getPrinters}),{data:b}=gt({queryKey:["settings"],queryFn:Se.getSettings}),{data:E}=gt({queryKey:["smart-plugs"],queryFn:Se.getSmartPlugs}),{data:w}=gt({queryKey:["maintenanceOverview"],queryFn:Se.getMaintenanceOverview,staleTime:60*1e3}),T=w?.reduce((j,V)=>(j[V.printer_id]={due_count:V.due_count,warning_count:V.warning_count,total_print_hours:V.total_print_hours},j),{})||{},A=E?.reduce((j,V)=>(V.printer_id&&(j[V.printer_id]=V),j),{})||{},C=vt({mutationFn:Se.createPrinter,onSuccess:()=>{x.invalidateQueries({queryKey:["printers"]}),e(!1)}}),N=vt({mutationFn:j=>Se.controlSmartPlug(j,"on"),onSuccess:()=>{x.invalidateQueries({queryKey:["smart-plugs"]}),l(null)},onError:()=>{l(null)}}),F=()=>{const j=!n;r(j),localStorage.setItem("hideDisconnectedPrinters",String(j))},k=j=>{u(j),localStorage.setItem("printerSortBy",j)},R=()=>{const j=!d;f(j),localStorage.setItem("printerSortAsc",String(j))},I=()=>{const j=g==="expanded"?"compact":"expanded";p(j),localStorage.setItem("printerViewMode",j)},L=M.useMemo(()=>{if(!v)return[];const j=[...v];switch(c){case"name":j.sort((V,K)=>V.name.localeCompare(K.name));break;case"model":j.sort((V,K)=>(V.model||"").localeCompare(K.model||""));break;case"location":j.sort((V,K)=>{const W=V.location||"",J=K.location||"";return!W&&J?1:W&&!J?-1:W.localeCompare(J)||V.name.localeCompare(K.name)});break;case"status":j.sort((V,K)=>{const W=x.getQueryData(["printerStatus",V.id]),J=x.getQueryData(["printerStatus",K.id]),ee=Z=>Z?.connected?Z.state==="RUNNING"?0:1:2;return ee(W)-ee(J)});break}return d||j.reverse(),j},[v,c,d,x]),q=M.useMemo(()=>{if(c!=="location")return null;const j={};return L.forEach(V=>{const K=V.location||"Ungrouped";j[K]||(j[K]=[]),j[K].push(V)}),j},[c,L]);return o.jsxs("div",{className:"p-4 md:p-8",children:[o.jsxs("div",{className:"flex items-center justify-between mb-6",children:[o.jsxs("div",{children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:"Printers"}),o.jsx(YNe,{printers:v})]}),o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsxs("select",{value:c,onChange:j=>k(j.target.value),className:"text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg px-2 py-1.5 text-white focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"name",children:"Name"}),o.jsx("option",{value:"status",children:"Status"}),o.jsx("option",{value:"model",children:"Model"}),o.jsx("option",{value:"location",children:"Location"})]}),o.jsx("button",{onClick:R,className:"p-1.5 rounded-lg hover:bg-bambu-dark-tertiary transition-colors",title:d?"Sort descending":"Sort ascending",children:d?o.jsx(vp,{className:"w-4 h-4 text-bambu-gray"}):o.jsx(N0,{className:"w-4 h-4 text-bambu-gray"})})]}),o.jsx("button",{onClick:I,className:"p-1.5 rounded-lg hover:bg-bambu-dark-tertiary transition-colors",title:g==="expanded"?"Switch to compact view":"Switch to expanded view",children:g==="expanded"?o.jsx(xce,{className:"w-5 h-5 text-bambu-gray"}):o.jsx(QS,{className:"w-5 h-5 text-bambu-gray"})}),o.jsx("div",{className:"w-px h-6 bg-bambu-dark-tertiary"}),o.jsxs("label",{className:"flex items-center gap-2 text-sm text-bambu-gray cursor-pointer",children:[o.jsx("input",{type:"checkbox",checked:n,onChange:F,className:"rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),"Hide offline"]}),n&&Object.keys(A).length>0&&o.jsxs("div",{className:"relative",children:[o.jsxs("button",{onClick:()=>a(!i),className:"flex items-center gap-1.5 px-3 py-1.5 text-sm bg-white dark:bg-bambu-dark-secondary border border-gray-200 dark:border-bambu-dark-tertiary rounded-lg text-gray-600 dark:text-bambu-gray hover:text-gray-900 dark:hover:text-white hover:border-bambu-green transition-colors",children:[o.jsx(kl,{className:"w-4 h-4"}),"Power On",o.jsx(Cl,{className:`w-3 h-3 transition-transform ${i?"rotate-180":""}`})]}),i&&o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"fixed inset-0 z-10",onClick:()=>a(!1)}),o.jsxs("div",{className:"absolute right-0 mt-2 w-56 bg-white dark:bg-bambu-dark-secondary border border-gray-200 dark:border-bambu-dark-tertiary rounded-lg shadow-lg z-20 py-1",children:[o.jsx("div",{className:"px-3 py-2 text-xs text-gray-500 dark:text-bambu-gray border-b border-gray-200 dark:border-bambu-dark-tertiary",children:"Offline printers with smart plugs"}),v?.filter(j=>A[j.id]).map(j=>o.jsx(eCe,{printer:j,plug:A[j.id],onPowerOn:V=>{l(V),N.mutate(V)},isPowering:s===A[j.id]?.id},j.id)),v?.filter(j=>A[j.id]).length===0&&o.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:"No printers with smart plugs"})]})]})]}),o.jsxs(ke,{onClick:()=>e(!0),children:[o.jsx(sr,{className:"w-4 h-4"}),"Add Printer"]})]})]}),y?o.jsx("div",{className:"text-center py-12 text-bambu-gray",children:"Loading printers..."}):v?.length===0?o.jsx(wt,{children:o.jsxs(Et,{className:"text-center py-12",children:[o.jsx("p",{className:"text-bambu-gray mb-4",children:"No printers configured yet"}),o.jsxs(ke,{onClick:()=>e(!0),children:[o.jsx(sr,{className:"w-4 h-4"}),"Add Your First Printer"]})]})}):q?o.jsx("div",{className:"space-y-6",children:Object.entries(q).map(([j,V])=>o.jsxs("div",{children:[o.jsxs("h2",{className:"text-lg font-semibold text-white mb-3 flex items-center gap-2",children:[o.jsx("span",{className:"w-2 h-2 rounded-full bg-bambu-green"}),j,o.jsxs("span",{className:"text-sm font-normal text-bambu-gray",children:["(",V.length,")"]})]}),o.jsx("div",{className:`grid gap-4 ${g==="compact"?"grid-cols-1 md:grid-cols-2 lg:grid-cols-4":"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"}`,children:V.map(K=>o.jsx(oH,{printer:K,hideIfDisconnected:n,maintenanceInfo:T[K.id],viewMode:g,amsThresholds:b?{humidityGood:Number(b.ams_humidity_good)||40,humidityFair:Number(b.ams_humidity_fair)||60,tempGood:Number(b.ams_temp_good)||28,tempFair:Number(b.ams_temp_fair)||35}:void 0},K.id))})]},j))}):o.jsx("div",{className:`grid gap-4 ${g==="compact"?"grid-cols-1 md:grid-cols-2 lg:grid-cols-4":"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"}`,children:L.map(j=>o.jsx(oH,{printer:j,hideIfDisconnected:n,maintenanceInfo:T[j.id],viewMode:g,amsThresholds:b?{humidityGood:Number(b.ams_humidity_good)||40,humidityFair:Number(b.ams_humidity_fair)||60,tempGood:Number(b.ams_temp_good)||28,tempFair:Number(b.ams_temp_fair)||35}:void 0},j.id))}),t&&o.jsx(ZNe,{onClose:()=>e(!1),onAdd:j=>C.mutate(j),existingSerials:v?.map(j=>j.serial_number)||[]})]})}function nCe(){const t=navigator.userAgent.toLowerCase(),e=navigator.platform?.toLowerCase()||"";return t.includes("win")||e.includes("win")?"windows":t.includes("mac")||e.includes("mac")?"macos":t.includes("linux")||e.includes("linux")?"linux":"unknown"}function rCe(){switch(nCe()){case"windows":return"bambustudio://";case"macos":case"linux":default:return"bambustudioopen://"}}function gh(t){const e=rCe();window.location.href=`${e}${encodeURIComponent(t)}`}const _O="181",dp={ROTATE:0,DOLLY:1,PAN:2},ip={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},iCe=0,lH=1,aCe=2,dZ=1,sCe=2,fc=3,wd=0,es=1,ll=2,jc=0,hp=1,cH=2,uH=3,dH=4,oCe=5,xh=100,lCe=101,cCe=102,uCe=103,dCe=104,hCe=200,fCe=201,mCe=202,pCe=203,aP=204,sP=205,gCe=206,xCe=207,bCe=208,yCe=209,vCe=210,_Ce=211,wCe=212,SCe=213,MCe=214,oP=0,lP=1,cP=2,Lp=3,uP=4,dP=5,hP=6,fP=7,wO=0,ECe=1,TCe=2,sd=0,ACe=1,NCe=2,CCe=3,kCe=4,PCe=5,jCe=6,RCe=7,hZ=300,Ip=301,Fp=302,mP=303,pP=304,YM=306,gP=1e3,Ec=1001,xP=1002,Cs=1003,DCe=1004,Gv=1005,so=1006,kN=1007,Ah=1008,Sl=1009,fZ=1010,mZ=1011,Y0=1012,SO=1013,cf=1014,Tc=1015,xg=1016,MO=1017,EO=1018,Z0=1020,pZ=35902,gZ=35899,xZ=1021,bZ=1022,Lo=1023,Q0=1026,J0=1027,yZ=1028,TO=1029,AO=1030,NO=1031,CO=1033,x1=33776,b1=33777,y1=33778,v1=33779,bP=35840,yP=35841,vP=35842,_P=35843,wP=36196,SP=37492,MP=37496,EP=37808,TP=37809,AP=37810,NP=37811,CP=37812,kP=37813,PP=37814,jP=37815,RP=37816,DP=37817,OP=37818,LP=37819,IP=37820,FP=37821,UP=36492,zP=36494,BP=36495,HP=36283,$P=36284,VP=36285,GP=36286,OCe=3200,LCe=3201,vZ=0,ICe=1,Ku="",Zs="srgb",Up="srgb-linear",zw="linear",Qn="srgb",um=7680,hH=519,FCe=512,UCe=513,zCe=514,_Z=515,BCe=516,HCe=517,$Ce=518,VCe=519,fH=35044,mH="300 es",hl=2e3,Bw=2001;function wZ(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}function Hw(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function GCe(){const t=Hw("canvas");return t.style.display="block",t}const pH={};function gH(...t){const e="THREE."+t.shift();console.log(e,...t)}function Zt(...t){const e="THREE."+t.shift();console.warn(e,...t)}function Zr(...t){const e="THREE."+t.shift();console.error(e,...t)}function eb(...t){const e=t.join(" ");e in pH||(pH[e]=!0,Zt(...t))}function WCe(t,e,n){return new Promise(function(r,i){function a(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:i();break;case t.TIMEOUT_EXPIRED:setTimeout(a,n);break;default:r()}}setTimeout(a,n)})}let Sf=class{addEventListener(e,n){this._listeners===void 0&&(this._listeners={});const r=this._listeners;r[e]===void 0&&(r[e]=[]),r[e].indexOf(n)===-1&&r[e].push(n)}hasEventListener(e,n){const r=this._listeners;return r===void 0?!1:r[e]!==void 0&&r[e].indexOf(n)!==-1}removeEventListener(e,n){const r=this._listeners;if(r===void 0)return;const i=r[e];if(i!==void 0){const a=i.indexOf(n);a!==-1&&i.splice(a,1)}}dispatchEvent(e){const n=this._listeners;if(n===void 0)return;const r=n[e.type];if(r!==void 0){e.target=this;const i=r.slice(0);for(let a=0,s=i.length;a>8&255]+ua[t>>16&255]+ua[t>>24&255]+"-"+ua[e&255]+ua[e>>8&255]+"-"+ua[e>>16&15|64]+ua[e>>24&255]+"-"+ua[n&63|128]+ua[n>>8&255]+"-"+ua[n>>16&255]+ua[n>>24&255]+ua[r&255]+ua[r>>8&255]+ua[r>>16&255]+ua[r>>24&255]).toLowerCase()}function yn(t,e,n){return Math.max(e,Math.min(n,t))}function qCe(t,e){return(t%e+e)%e}function PN(t,e,n){return(1-n)*t+n*e}function Tx(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function qa(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(t*4294967295);case Uint16Array:return Math.round(t*65535);case Uint8Array:return Math.round(t*255);case Int32Array:return Math.round(t*2147483647);case Int16Array:return Math.round(t*32767);case Int8Array:return Math.round(t*127);default:throw new Error("Invalid component type.")}}const KCe={DEG2RAD:_1};let dn=class SZ{constructor(e=0,n=0){SZ.prototype.isVector2=!0,this.x=e,this.y=n}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,n){return this.x=e,this.y=n,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const n=this.x,r=this.y,i=e.elements;return this.x=i[0]*n+i[3]*r+i[6],this.y=i[1]*n+i[4]*r+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,n){return this.x=yn(this.x,e.x,n.x),this.y=yn(this.y,e.y,n.y),this}clampScalar(e,n){return this.x=yn(this.x,e,n),this.y=yn(this.y,e,n),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(yn(r,e,n))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const n=Math.sqrt(this.lengthSq()*e.lengthSq());if(n===0)return Math.PI/2;const r=this.dot(e)/n;return Math.acos(yn(r,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y;return n*n+r*r}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e}fromBufferAttribute(e,n){return this.x=e.getX(n),this.y=e.getY(n),this}rotateAround(e,n){const r=Math.cos(n),i=Math.sin(n),a=this.x-e.x,s=this.y-e.y;return this.x=a*r-s*i+e.x,this.y=a*i+s*r+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}},uf=class{constructor(e=0,n=0,r=0,i=1){this.isQuaternion=!0,this._x=e,this._y=n,this._z=r,this._w=i}static slerpFlat(e,n,r,i,a,s,l){let c=r[i+0],u=r[i+1],d=r[i+2],f=r[i+3],g=a[s+0],p=a[s+1],x=a[s+2],v=a[s+3];if(l<=0){e[n+0]=c,e[n+1]=u,e[n+2]=d,e[n+3]=f;return}if(l>=1){e[n+0]=g,e[n+1]=p,e[n+2]=x,e[n+3]=v;return}if(f!==v||c!==g||u!==p||d!==x){let y=c*g+u*p+d*x+f*v;y<0&&(g=-g,p=-p,x=-x,v=-v,y=-y);let b=1-l;if(y<.9995){const E=Math.acos(y),w=Math.sin(E);b=Math.sin(b*E)/w,l=Math.sin(l*E)/w,c=c*b+g*l,u=u*b+p*l,d=d*b+x*l,f=f*b+v*l}else{c=c*b+g*l,u=u*b+p*l,d=d*b+x*l,f=f*b+v*l;const E=1/Math.sqrt(c*c+u*u+d*d+f*f);c*=E,u*=E,d*=E,f*=E}}e[n]=c,e[n+1]=u,e[n+2]=d,e[n+3]=f}static multiplyQuaternionsFlat(e,n,r,i,a,s){const l=r[i],c=r[i+1],u=r[i+2],d=r[i+3],f=a[s],g=a[s+1],p=a[s+2],x=a[s+3];return e[n]=l*x+d*f+c*p-u*g,e[n+1]=c*x+d*g+u*f-l*p,e[n+2]=u*x+d*p+l*g-c*f,e[n+3]=d*x-l*f-c*g-u*p,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,n,r,i){return this._x=e,this._y=n,this._z=r,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,n=!0){const r=e._x,i=e._y,a=e._z,s=e._order,l=Math.cos,c=Math.sin,u=l(r/2),d=l(i/2),f=l(a/2),g=c(r/2),p=c(i/2),x=c(a/2);switch(s){case"XYZ":this._x=g*d*f+u*p*x,this._y=u*p*f-g*d*x,this._z=u*d*x+g*p*f,this._w=u*d*f-g*p*x;break;case"YXZ":this._x=g*d*f+u*p*x,this._y=u*p*f-g*d*x,this._z=u*d*x-g*p*f,this._w=u*d*f+g*p*x;break;case"ZXY":this._x=g*d*f-u*p*x,this._y=u*p*f+g*d*x,this._z=u*d*x+g*p*f,this._w=u*d*f-g*p*x;break;case"ZYX":this._x=g*d*f-u*p*x,this._y=u*p*f+g*d*x,this._z=u*d*x-g*p*f,this._w=u*d*f+g*p*x;break;case"YZX":this._x=g*d*f+u*p*x,this._y=u*p*f+g*d*x,this._z=u*d*x-g*p*f,this._w=u*d*f-g*p*x;break;case"XZY":this._x=g*d*f-u*p*x,this._y=u*p*f-g*d*x,this._z=u*d*x+g*p*f,this._w=u*d*f+g*p*x;break;default:Zt("Quaternion: .setFromEuler() encountered an unknown order: "+s)}return n===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,n){const r=n/2,i=Math.sin(r);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(r),this._onChangeCallback(),this}setFromRotationMatrix(e){const n=e.elements,r=n[0],i=n[4],a=n[8],s=n[1],l=n[5],c=n[9],u=n[2],d=n[6],f=n[10],g=r+l+f;if(g>0){const p=.5/Math.sqrt(g+1);this._w=.25/p,this._x=(d-c)*p,this._y=(a-u)*p,this._z=(s-i)*p}else if(r>l&&r>f){const p=2*Math.sqrt(1+r-l-f);this._w=(d-c)/p,this._x=.25*p,this._y=(i+s)/p,this._z=(a+u)/p}else if(l>f){const p=2*Math.sqrt(1+l-r-f);this._w=(a-u)/p,this._x=(i+s)/p,this._y=.25*p,this._z=(c+d)/p}else{const p=2*Math.sqrt(1+f-r-l);this._w=(s-i)/p,this._x=(a+u)/p,this._y=(c+d)/p,this._z=.25*p}return this._onChangeCallback(),this}setFromUnitVectors(e,n){let r=e.dot(n)+1;return r<1e-8?(r=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=r):(this._x=0,this._y=-e.z,this._z=e.y,this._w=r)):(this._x=e.y*n.z-e.z*n.y,this._y=e.z*n.x-e.x*n.z,this._z=e.x*n.y-e.y*n.x,this._w=r),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(yn(this.dot(e),-1,1)))}rotateTowards(e,n){const r=this.angleTo(e);if(r===0)return this;const i=Math.min(1,n/r);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,n){const r=e._x,i=e._y,a=e._z,s=e._w,l=n._x,c=n._y,u=n._z,d=n._w;return this._x=r*d+s*l+i*u-a*c,this._y=i*d+s*c+a*l-r*u,this._z=a*d+s*u+r*c-i*l,this._w=s*d-r*l-i*c-a*u,this._onChangeCallback(),this}slerp(e,n){if(n<=0)return this;if(n>=1)return this.copy(e);let r=e._x,i=e._y,a=e._z,s=e._w,l=this.dot(e);l<0&&(r=-r,i=-i,a=-a,s=-s,l=-l);let c=1-n;if(l<.9995){const u=Math.acos(l),d=Math.sin(u);c=Math.sin(c*u)/d,n=Math.sin(n*u)/d,this._x=this._x*c+r*n,this._y=this._y*c+i*n,this._z=this._z*c+a*n,this._w=this._w*c+s*n,this._onChangeCallback()}else this._x=this._x*c+r*n,this._y=this._y*c+i*n,this._z=this._z*c+a*n,this._w=this._w*c+s*n,this.normalize();return this}slerpQuaternions(e,n,r){return this.copy(e).slerp(n,r)}random(){const e=2*Math.PI*Math.random(),n=2*Math.PI*Math.random(),r=Math.random(),i=Math.sqrt(1-r),a=Math.sqrt(r);return this.set(i*Math.sin(e),i*Math.cos(e),a*Math.sin(n),a*Math.cos(n))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,n=0){return this._x=e[n],this._y=e[n+1],this._z=e[n+2],this._w=e[n+3],this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._w,e}fromBufferAttribute(e,n){return this._x=e.getX(n),this._y=e.getY(n),this._z=e.getZ(n),this._w=e.getW(n),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}},it=class MZ{constructor(e=0,n=0,r=0){MZ.prototype.isVector3=!0,this.x=e,this.y=n,this.z=r}set(e,n,r){return r===void 0&&(r=this.z),this.x=e,this.y=n,this.z=r,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,n){return this.x=e.x*n.x,this.y=e.y*n.y,this.z=e.z*n.z,this}applyEuler(e){return this.applyQuaternion(xH.setFromEuler(e))}applyAxisAngle(e,n){return this.applyQuaternion(xH.setFromAxisAngle(e,n))}applyMatrix3(e){const n=this.x,r=this.y,i=this.z,a=e.elements;return this.x=a[0]*n+a[3]*r+a[6]*i,this.y=a[1]*n+a[4]*r+a[7]*i,this.z=a[2]*n+a[5]*r+a[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,a=e.elements,s=1/(a[3]*n+a[7]*r+a[11]*i+a[15]);return this.x=(a[0]*n+a[4]*r+a[8]*i+a[12])*s,this.y=(a[1]*n+a[5]*r+a[9]*i+a[13])*s,this.z=(a[2]*n+a[6]*r+a[10]*i+a[14])*s,this}applyQuaternion(e){const n=this.x,r=this.y,i=this.z,a=e.x,s=e.y,l=e.z,c=e.w,u=2*(s*i-l*r),d=2*(l*n-a*i),f=2*(a*r-s*n);return this.x=n+c*u+s*f-l*d,this.y=r+c*d+l*u-a*f,this.z=i+c*f+a*d-s*u,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const n=this.x,r=this.y,i=this.z,a=e.elements;return this.x=a[0]*n+a[4]*r+a[8]*i,this.y=a[1]*n+a[5]*r+a[9]*i,this.z=a[2]*n+a[6]*r+a[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,n){return this.x=yn(this.x,e.x,n.x),this.y=yn(this.y,e.y,n.y),this.z=yn(this.z,e.z,n.z),this}clampScalar(e,n){return this.x=yn(this.x,e,n),this.y=yn(this.y,e,n),this.z=yn(this.z,e,n),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(yn(r,e,n))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,n){const r=e.x,i=e.y,a=e.z,s=n.x,l=n.y,c=n.z;return this.x=i*c-a*l,this.y=a*s-r*c,this.z=r*l-i*s,this}projectOnVector(e){const n=e.lengthSq();if(n===0)return this.set(0,0,0);const r=e.dot(this)/n;return this.copy(e).multiplyScalar(r)}projectOnPlane(e){return jN.copy(this).projectOnVector(e),this.sub(jN)}reflect(e){return this.sub(jN.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const n=Math.sqrt(this.lengthSq()*e.lengthSq());if(n===0)return Math.PI/2;const r=this.dot(e)/n;return Math.acos(yn(r,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y,i=this.z-e.z;return n*n+r*r+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,n,r){const i=Math.sin(n)*e;return this.x=i*Math.sin(r),this.y=Math.cos(n)*e,this.z=i*Math.cos(r),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,n,r){return this.x=e*Math.sin(n),this.y=r,this.z=e*Math.cos(n),this}setFromMatrixPosition(e){const n=e.elements;return this.x=n[12],this.y=n[13],this.z=n[14],this}setFromMatrixScale(e){const n=this.setFromMatrixColumn(e,0).length(),r=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=n,this.y=r,this.z=i,this}setFromMatrixColumn(e,n){return this.fromArray(e.elements,n*4)}setFromMatrix3Column(e,n){return this.fromArray(e.elements,n*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e}fromBufferAttribute(e,n){return this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,n=Math.random()*2-1,r=Math.sqrt(1-n*n);return this.x=r*Math.cos(e),this.y=n,this.z=r*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}};const jN=new it,xH=new uf;let fn=class EZ{constructor(e,n,r,i,a,s,l,c,u){EZ.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,n,r,i,a,s,l,c,u)}set(e,n,r,i,a,s,l,c,u){const d=this.elements;return d[0]=e,d[1]=i,d[2]=l,d[3]=n,d[4]=a,d[5]=c,d[6]=r,d[7]=s,d[8]=u,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],this}extractBasis(e,n,r){return e.setFromMatrix3Column(this,0),n.setFromMatrix3Column(this,1),r.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const n=e.elements;return this.set(n[0],n[4],n[8],n[1],n[5],n[9],n[2],n[6],n[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,a=this.elements,s=r[0],l=r[3],c=r[6],u=r[1],d=r[4],f=r[7],g=r[2],p=r[5],x=r[8],v=i[0],y=i[3],b=i[6],E=i[1],w=i[4],T=i[7],A=i[2],C=i[5],N=i[8];return a[0]=s*v+l*E+c*A,a[3]=s*y+l*w+c*C,a[6]=s*b+l*T+c*N,a[1]=u*v+d*E+f*A,a[4]=u*y+d*w+f*C,a[7]=u*b+d*T+f*N,a[2]=g*v+p*E+x*A,a[5]=g*y+p*w+x*C,a[8]=g*b+p*T+x*N,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[3]*=e,n[6]*=e,n[1]*=e,n[4]*=e,n[7]*=e,n[2]*=e,n[5]*=e,n[8]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[1],i=e[2],a=e[3],s=e[4],l=e[5],c=e[6],u=e[7],d=e[8];return n*s*d-n*l*u-r*a*d+r*l*c+i*a*u-i*s*c}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],a=e[3],s=e[4],l=e[5],c=e[6],u=e[7],d=e[8],f=d*s-l*u,g=l*c-d*a,p=u*a-s*c,x=n*f+r*g+i*p;if(x===0)return this.set(0,0,0,0,0,0,0,0,0);const v=1/x;return e[0]=f*v,e[1]=(i*u-d*r)*v,e[2]=(l*r-i*s)*v,e[3]=g*v,e[4]=(d*n-i*c)*v,e[5]=(i*a-l*n)*v,e[6]=p*v,e[7]=(r*c-u*n)*v,e[8]=(s*n-r*a)*v,this}transpose(){let e;const n=this.elements;return e=n[1],n[1]=n[3],n[3]=e,e=n[2],n[2]=n[6],n[6]=e,e=n[5],n[5]=n[7],n[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const n=this.elements;return e[0]=n[0],e[1]=n[3],e[2]=n[6],e[3]=n[1],e[4]=n[4],e[5]=n[7],e[6]=n[2],e[7]=n[5],e[8]=n[8],this}setUvTransform(e,n,r,i,a,s,l){const c=Math.cos(a),u=Math.sin(a);return this.set(r*c,r*u,-r*(c*s+u*l)+s+e,-i*u,i*c,-i*(-u*s+c*l)+l+n,0,0,1),this}scale(e,n){return this.premultiply(RN.makeScale(e,n)),this}rotate(e){return this.premultiply(RN.makeRotation(-e)),this}translate(e,n){return this.premultiply(RN.makeTranslation(e,n)),this}makeTranslation(e,n){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,n,0,0,1),this}makeRotation(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,-r,0,r,n,0,0,0,1),this}makeScale(e,n){return this.set(e,0,0,0,n,0,0,0,1),this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<9;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<9;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e}clone(){return new this.constructor().fromArray(this.elements)}};const RN=new fn,bH=new fn().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),yH=new fn().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function XCe(){const t={enabled:!0,workingColorSpace:Up,spaces:{},convert:function(i,a,s){return this.enabled===!1||a===s||!a||!s||(this.spaces[a].transfer===Qn&&(i.r=Rc(i.r),i.g=Rc(i.g),i.b=Rc(i.b)),this.spaces[a].primaries!==this.spaces[s].primaries&&(i.applyMatrix3(this.spaces[a].toXYZ),i.applyMatrix3(this.spaces[s].fromXYZ)),this.spaces[s].transfer===Qn&&(i.r=fp(i.r),i.g=fp(i.g),i.b=fp(i.b))),i},workingToColorSpace:function(i,a){return this.convert(i,this.workingColorSpace,a)},colorSpaceToWorking:function(i,a){return this.convert(i,a,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===Ku?zw:this.spaces[i].transfer},getToneMappingMode:function(i){return this.spaces[i].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(i,a=this.workingColorSpace){return i.fromArray(this.spaces[a].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,a,s){return i.copy(this.spaces[a].toXYZ).multiply(this.spaces[s].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(i,a){return eb("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(i,a)},toWorkingColorSpace:function(i,a){return eb("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(i,a)}},e=[.64,.33,.3,.6,.15,.06],n=[.2126,.7152,.0722],r=[.3127,.329];return t.define({[Up]:{primaries:e,whitePoint:r,transfer:zw,toXYZ:bH,fromXYZ:yH,luminanceCoefficients:n,workingColorSpaceConfig:{unpackColorSpace:Zs},outputColorSpaceConfig:{drawingBufferColorSpace:Zs}},[Zs]:{primaries:e,whitePoint:r,transfer:Qn,toXYZ:bH,fromXYZ:yH,luminanceCoefficients:n,outputColorSpaceConfig:{drawingBufferColorSpace:Zs}}}),t}const Dn=XCe();function Rc(t){return t<.04045?t*.0773993808:Math.pow(t*.9478672986+.0521327014,2.4)}function fp(t){return t<.0031308?t*12.92:1.055*Math.pow(t,.41666)-.055}let dm,YCe=class{static getDataURL(e,n="image/png"){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let r;if(e instanceof HTMLCanvasElement)r=e;else{dm===void 0&&(dm=Hw("canvas")),dm.width=e.width,dm.height=e.height;const i=dm.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),r=dm}return r.toDataURL(n)}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const n=Hw("canvas");n.width=e.width,n.height=e.height;const r=n.getContext("2d");r.drawImage(e,0,0,e.width,e.height);const i=r.getImageData(0,0,e.width,e.height),a=i.data;for(let s=0;s1),this.pmremVersion=0}get width(){return this.source.getSize(ON).x}get height(){return this.source.getSize(ON).y}get depth(){return this.source.getSize(ON).z}get image(){return this.source.data}set image(e=null){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,n){this.updateRanges.push({start:e,count:n})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(const n in e){const r=e[n];if(r===void 0){Zt(`Texture.setValues(): parameter '${n}' has value of undefined.`);continue}const i=this[n];if(i===void 0){Zt(`Texture.setValues(): property '${n}' does not exist.`);continue}i&&r&&i.isVector2&&r.isVector2||i&&r&&i.isVector3&&r.isVector3||i&&r&&i.isMatrix3&&r.isMatrix3?i.copy(r):this[n]=r}}toJSON(e){const n=e===void 0||typeof e=="string";if(!n&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];const r={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(r.userData=this.userData),n||(e.textures[this.uuid]=r),r}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==hZ)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case gP:e.x=e.x-Math.floor(e.x);break;case Ec:e.x=e.x<0?0:1;break;case xP:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case gP:e.y=e.y-Math.floor(e.y);break;case Ec:e.y=e.y<0?0:1;break;case xP:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}};qo.DEFAULT_IMAGE=null;qo.DEFAULT_MAPPING=hZ;qo.DEFAULT_ANISOTROPY=1;let li=class TZ{constructor(e=0,n=0,r=0,i=1){TZ.prototype.isVector4=!0,this.x=e,this.y=n,this.z=r,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,n,r,i){return this.x=e,this.y=n,this.z=r,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;case 3:this.w=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this.w=e.w+n.w,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this.w+=e.w*n,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this.w=e.w-n.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,a=this.w,s=e.elements;return this.x=s[0]*n+s[4]*r+s[8]*i+s[12]*a,this.y=s[1]*n+s[5]*r+s[9]*i+s[13]*a,this.z=s[2]*n+s[6]*r+s[10]*i+s[14]*a,this.w=s[3]*n+s[7]*r+s[11]*i+s[15]*a,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const n=Math.sqrt(1-e.w*e.w);return n<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/n,this.y=e.y/n,this.z=e.z/n),this}setAxisAngleFromRotationMatrix(e){let n,r,i,a;const c=e.elements,u=c[0],d=c[4],f=c[8],g=c[1],p=c[5],x=c[9],v=c[2],y=c[6],b=c[10];if(Math.abs(d-g)<.01&&Math.abs(f-v)<.01&&Math.abs(x-y)<.01){if(Math.abs(d+g)<.1&&Math.abs(f+v)<.1&&Math.abs(x+y)<.1&&Math.abs(u+p+b-3)<.1)return this.set(1,0,0,0),this;n=Math.PI;const w=(u+1)/2,T=(p+1)/2,A=(b+1)/2,C=(d+g)/4,N=(f+v)/4,F=(x+y)/4;return w>T&&w>A?w<.01?(r=0,i=.707106781,a=.707106781):(r=Math.sqrt(w),i=C/r,a=N/r):T>A?T<.01?(r=.707106781,i=0,a=.707106781):(i=Math.sqrt(T),r=C/i,a=F/i):A<.01?(r=.707106781,i=.707106781,a=0):(a=Math.sqrt(A),r=N/a,i=F/a),this.set(r,i,a,n),this}let E=Math.sqrt((y-x)*(y-x)+(f-v)*(f-v)+(g-d)*(g-d));return Math.abs(E)<.001&&(E=1),this.x=(y-x)/E,this.y=(f-v)/E,this.z=(g-d)/E,this.w=Math.acos((u+p+b-1)/2),this}setFromMatrixPosition(e){const n=e.elements;return this.x=n[12],this.y=n[13],this.z=n[14],this.w=n[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,n){return this.x=yn(this.x,e.x,n.x),this.y=yn(this.y,e.y,n.y),this.z=yn(this.z,e.z,n.z),this.w=yn(this.w,e.w,n.w),this}clampScalar(e,n){return this.x=yn(this.x,e,n),this.y=yn(this.y,e,n),this.z=yn(this.z,e,n),this.w=yn(this.w,e,n),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(yn(r,e,n))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this.w+=(e.w-this.w)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this.w=e.w+(n.w-e.w)*r,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this.w=e[n+3],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e[n+3]=this.w,e}fromBufferAttribute(e,n){return this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this.w=e.getW(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}},JCe=class extends Sf{constructor(e=1,n=1,r={}){super(),r=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:so,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1},r),this.isRenderTarget=!0,this.width=e,this.height=n,this.depth=r.depth,this.scissor=new li(0,0,e,n),this.scissorTest=!1,this.viewport=new li(0,0,e,n);const i={width:e,height:n,depth:r.depth},a=new qo(i);this.textures=[];const s=r.count;for(let l=0;l1);this.dispose()}this.viewport.set(0,0,e,n),this.scissor.set(0,0,e,n)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let n=0,r=e.textures.length;n=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,n){return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,Mo),Mo.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let n,r;return e.normal.x>0?(n=e.normal.x*this.min.x,r=e.normal.x*this.max.x):(n=e.normal.x*this.max.x,r=e.normal.x*this.min.x),e.normal.y>0?(n+=e.normal.y*this.min.y,r+=e.normal.y*this.max.y):(n+=e.normal.y*this.max.y,r+=e.normal.y*this.min.y),e.normal.z>0?(n+=e.normal.z*this.min.z,r+=e.normal.z*this.max.z):(n+=e.normal.z*this.max.z,r+=e.normal.z*this.min.z),n<=-e.constant&&r>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(Ax),qv.subVectors(this.max,Ax),hm.subVectors(e.a,Ax),fm.subVectors(e.b,Ax),mm.subVectors(e.c,Ax),Mu.subVectors(fm,hm),Eu.subVectors(mm,fm),Qd.subVectors(hm,mm);let n=[0,-Mu.z,Mu.y,0,-Eu.z,Eu.y,0,-Qd.z,Qd.y,Mu.z,0,-Mu.x,Eu.z,0,-Eu.x,Qd.z,0,-Qd.x,-Mu.y,Mu.x,0,-Eu.y,Eu.x,0,-Qd.y,Qd.x,0];return!LN(n,hm,fm,mm,qv)||(n=[1,0,0,0,1,0,0,0,1],!LN(n,hm,fm,mm,qv))?!1:(Kv.crossVectors(Mu,Eu),n=[Kv.x,Kv.y,Kv.z],LN(n,hm,fm,mm,qv))}clampPoint(e,n){return n.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,Mo).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(Mo).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(Jl[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),Jl[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),Jl[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),Jl[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),Jl[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),Jl[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),Jl[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),Jl[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(Jl),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}};const Jl=[new it,new it,new it,new it,new it,new it,new it,new it],Mo=new it,Wv=new hf,hm=new it,fm=new it,mm=new it,Mu=new it,Eu=new it,Qd=new it,Ax=new it,qv=new it,Kv=new it,Jd=new it;function LN(t,e,n,r,i){for(let a=0,s=t.length-3;a<=s;a+=3){Jd.fromArray(t,a);const l=i.x*Math.abs(Jd.x)+i.y*Math.abs(Jd.y)+i.z*Math.abs(Jd.z),c=e.dot(Jd),u=n.dot(Jd),d=r.dot(Jd);if(Math.max(-Math.max(c,u,d),Math.min(c,u,d))>l)return!1}return!0}const tke=new hf,Nx=new it,IN=new it;let ZM=class{constructor(e=new it,n=-1){this.isSphere=!0,this.center=e,this.radius=n}set(e,n){return this.center.copy(e),this.radius=n,this}setFromPoints(e,n){const r=this.center;n!==void 0?r.copy(n):tke.setFromPoints(e).getCenter(r);let i=0;for(let a=0,s=e.length;athis.radius*this.radius&&(n.sub(this.center).normalize(),n.multiplyScalar(this.radius).add(this.center)),n}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;Nx.subVectors(e,this.center);const n=Nx.lengthSq();if(n>this.radius*this.radius){const r=Math.sqrt(n),i=(r-this.radius)*.5;this.center.addScaledVector(Nx,i/r),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(IN.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(Nx.copy(e.center).add(IN)),this.expandByPoint(Nx.copy(e.center).sub(IN))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}};const ec=new it,FN=new it,Xv=new it,Tu=new it,UN=new it,Yv=new it,zN=new it;let PO=class{constructor(e=new it,n=new it(0,0,-1)){this.origin=e,this.direction=n}set(e,n){return this.origin.copy(e),this.direction.copy(n),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,n){return n.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,ec)),this}closestPointToPoint(e,n){n.subVectors(e,this.origin);const r=n.dot(this.direction);return r<0?n.copy(this.origin):n.copy(this.origin).addScaledVector(this.direction,r)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const n=ec.subVectors(e,this.origin).dot(this.direction);return n<0?this.origin.distanceToSquared(e):(ec.copy(this.origin).addScaledVector(this.direction,n),ec.distanceToSquared(e))}distanceSqToSegment(e,n,r,i){FN.copy(e).add(n).multiplyScalar(.5),Xv.copy(n).sub(e).normalize(),Tu.copy(this.origin).sub(FN);const a=e.distanceTo(n)*.5,s=-this.direction.dot(Xv),l=Tu.dot(this.direction),c=-Tu.dot(Xv),u=Tu.lengthSq(),d=Math.abs(1-s*s);let f,g,p,x;if(d>0)if(f=s*c-l,g=s*l-c,x=a*d,f>=0)if(g>=-x)if(g<=x){const v=1/d;f*=v,g*=v,p=f*(f+s*g+2*l)+g*(s*f+g+2*c)+u}else g=a,f=Math.max(0,-(s*g+l)),p=-f*f+g*(g+2*c)+u;else g=-a,f=Math.max(0,-(s*g+l)),p=-f*f+g*(g+2*c)+u;else g<=-x?(f=Math.max(0,-(-s*a+l)),g=f>0?-a:Math.min(Math.max(-a,-c),a),p=-f*f+g*(g+2*c)+u):g<=x?(f=0,g=Math.min(Math.max(-a,-c),a),p=g*(g+2*c)+u):(f=Math.max(0,-(s*a+l)),g=f>0?a:Math.min(Math.max(-a,-c),a),p=-f*f+g*(g+2*c)+u);else g=s>0?-a:a,f=Math.max(0,-(s*g+l)),p=-f*f+g*(g+2*c)+u;return r&&r.copy(this.origin).addScaledVector(this.direction,f),i&&i.copy(FN).addScaledVector(Xv,g),p}intersectSphere(e,n){ec.subVectors(e.center,this.origin);const r=ec.dot(this.direction),i=ec.dot(ec)-r*r,a=e.radius*e.radius;if(i>a)return null;const s=Math.sqrt(a-i),l=r-s,c=r+s;return c<0?null:l<0?this.at(c,n):this.at(l,n)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const n=e.normal.dot(this.direction);if(n===0)return e.distanceToPoint(this.origin)===0?0:null;const r=-(this.origin.dot(e.normal)+e.constant)/n;return r>=0?r:null}intersectPlane(e,n){const r=this.distanceToPlane(e);return r===null?null:this.at(r,n)}intersectsPlane(e){const n=e.distanceToPoint(this.origin);return n===0||e.normal.dot(this.direction)*n<0}intersectBox(e,n){let r,i,a,s,l,c;const u=1/this.direction.x,d=1/this.direction.y,f=1/this.direction.z,g=this.origin;return u>=0?(r=(e.min.x-g.x)*u,i=(e.max.x-g.x)*u):(r=(e.max.x-g.x)*u,i=(e.min.x-g.x)*u),d>=0?(a=(e.min.y-g.y)*d,s=(e.max.y-g.y)*d):(a=(e.max.y-g.y)*d,s=(e.min.y-g.y)*d),r>s||a>i||((a>r||isNaN(r))&&(r=a),(s=0?(l=(e.min.z-g.z)*f,c=(e.max.z-g.z)*f):(l=(e.max.z-g.z)*f,c=(e.min.z-g.z)*f),r>c||l>i)||((l>r||r!==r)&&(r=l),(c=0?r:i,n)}intersectsBox(e){return this.intersectBox(e,ec)!==null}intersectTriangle(e,n,r,i,a){UN.subVectors(n,e),Yv.subVectors(r,e),zN.crossVectors(UN,Yv);let s=this.direction.dot(zN),l;if(s>0){if(i)return null;l=1}else if(s<0)l=-1,s=-s;else return null;Tu.subVectors(this.origin,e);const c=l*this.direction.dot(Yv.crossVectors(Tu,Yv));if(c<0)return null;const u=l*this.direction.dot(UN.cross(Tu));if(u<0||c+u>s)return null;const d=-l*Tu.dot(zN);return d<0?null:this.at(d/s,a)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}},hi=class qP{constructor(e,n,r,i,a,s,l,c,u,d,f,g,p,x,v,y){qP.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,n,r,i,a,s,l,c,u,d,f,g,p,x,v,y)}set(e,n,r,i,a,s,l,c,u,d,f,g,p,x,v,y){const b=this.elements;return b[0]=e,b[4]=n,b[8]=r,b[12]=i,b[1]=a,b[5]=s,b[9]=l,b[13]=c,b[2]=u,b[6]=d,b[10]=f,b[14]=g,b[3]=p,b[7]=x,b[11]=v,b[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new qP().fromArray(this.elements)}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],n[9]=r[9],n[10]=r[10],n[11]=r[11],n[12]=r[12],n[13]=r[13],n[14]=r[14],n[15]=r[15],this}copyPosition(e){const n=this.elements,r=e.elements;return n[12]=r[12],n[13]=r[13],n[14]=r[14],this}setFromMatrix3(e){const n=e.elements;return this.set(n[0],n[3],n[6],0,n[1],n[4],n[7],0,n[2],n[5],n[8],0,0,0,0,1),this}extractBasis(e,n,r){return e.setFromMatrixColumn(this,0),n.setFromMatrixColumn(this,1),r.setFromMatrixColumn(this,2),this}makeBasis(e,n,r){return this.set(e.x,n.x,r.x,0,e.y,n.y,r.y,0,e.z,n.z,r.z,0,0,0,0,1),this}extractRotation(e){const n=this.elements,r=e.elements,i=1/pm.setFromMatrixColumn(e,0).length(),a=1/pm.setFromMatrixColumn(e,1).length(),s=1/pm.setFromMatrixColumn(e,2).length();return n[0]=r[0]*i,n[1]=r[1]*i,n[2]=r[2]*i,n[3]=0,n[4]=r[4]*a,n[5]=r[5]*a,n[6]=r[6]*a,n[7]=0,n[8]=r[8]*s,n[9]=r[9]*s,n[10]=r[10]*s,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromEuler(e){const n=this.elements,r=e.x,i=e.y,a=e.z,s=Math.cos(r),l=Math.sin(r),c=Math.cos(i),u=Math.sin(i),d=Math.cos(a),f=Math.sin(a);if(e.order==="XYZ"){const g=s*d,p=s*f,x=l*d,v=l*f;n[0]=c*d,n[4]=-c*f,n[8]=u,n[1]=p+x*u,n[5]=g-v*u,n[9]=-l*c,n[2]=v-g*u,n[6]=x+p*u,n[10]=s*c}else if(e.order==="YXZ"){const g=c*d,p=c*f,x=u*d,v=u*f;n[0]=g+v*l,n[4]=x*l-p,n[8]=s*u,n[1]=s*f,n[5]=s*d,n[9]=-l,n[2]=p*l-x,n[6]=v+g*l,n[10]=s*c}else if(e.order==="ZXY"){const g=c*d,p=c*f,x=u*d,v=u*f;n[0]=g-v*l,n[4]=-s*f,n[8]=x+p*l,n[1]=p+x*l,n[5]=s*d,n[9]=v-g*l,n[2]=-s*u,n[6]=l,n[10]=s*c}else if(e.order==="ZYX"){const g=s*d,p=s*f,x=l*d,v=l*f;n[0]=c*d,n[4]=x*u-p,n[8]=g*u+v,n[1]=c*f,n[5]=v*u+g,n[9]=p*u-x,n[2]=-u,n[6]=l*c,n[10]=s*c}else if(e.order==="YZX"){const g=s*c,p=s*u,x=l*c,v=l*u;n[0]=c*d,n[4]=v-g*f,n[8]=x*f+p,n[1]=f,n[5]=s*d,n[9]=-l*d,n[2]=-u*d,n[6]=p*f+x,n[10]=g-v*f}else if(e.order==="XZY"){const g=s*c,p=s*u,x=l*c,v=l*u;n[0]=c*d,n[4]=-f,n[8]=u*d,n[1]=g*f+v,n[5]=s*d,n[9]=p*f-x,n[2]=x*f-p,n[6]=l*d,n[10]=v*f+g}return n[3]=0,n[7]=0,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromQuaternion(e){return this.compose(nke,e,rke)}lookAt(e,n,r){const i=this.elements;return xs.subVectors(e,n),xs.lengthSq()===0&&(xs.z=1),xs.normalize(),Au.crossVectors(r,xs),Au.lengthSq()===0&&(Math.abs(r.z)===1?xs.x+=1e-4:xs.z+=1e-4,xs.normalize(),Au.crossVectors(r,xs)),Au.normalize(),Zv.crossVectors(xs,Au),i[0]=Au.x,i[4]=Zv.x,i[8]=xs.x,i[1]=Au.y,i[5]=Zv.y,i[9]=xs.y,i[2]=Au.z,i[6]=Zv.z,i[10]=xs.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,a=this.elements,s=r[0],l=r[4],c=r[8],u=r[12],d=r[1],f=r[5],g=r[9],p=r[13],x=r[2],v=r[6],y=r[10],b=r[14],E=r[3],w=r[7],T=r[11],A=r[15],C=i[0],N=i[4],F=i[8],k=i[12],R=i[1],I=i[5],L=i[9],q=i[13],j=i[2],V=i[6],K=i[10],W=i[14],J=i[3],ee=i[7],Z=i[11],B=i[15];return a[0]=s*C+l*R+c*j+u*J,a[4]=s*N+l*I+c*V+u*ee,a[8]=s*F+l*L+c*K+u*Z,a[12]=s*k+l*q+c*W+u*B,a[1]=d*C+f*R+g*j+p*J,a[5]=d*N+f*I+g*V+p*ee,a[9]=d*F+f*L+g*K+p*Z,a[13]=d*k+f*q+g*W+p*B,a[2]=x*C+v*R+y*j+b*J,a[6]=x*N+v*I+y*V+b*ee,a[10]=x*F+v*L+y*K+b*Z,a[14]=x*k+v*q+y*W+b*B,a[3]=E*C+w*R+T*j+A*J,a[7]=E*N+w*I+T*V+A*ee,a[11]=E*F+w*L+T*K+A*Z,a[15]=E*k+w*q+T*W+A*B,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[4]*=e,n[8]*=e,n[12]*=e,n[1]*=e,n[5]*=e,n[9]*=e,n[13]*=e,n[2]*=e,n[6]*=e,n[10]*=e,n[14]*=e,n[3]*=e,n[7]*=e,n[11]*=e,n[15]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[4],i=e[8],a=e[12],s=e[1],l=e[5],c=e[9],u=e[13],d=e[2],f=e[6],g=e[10],p=e[14],x=e[3],v=e[7],y=e[11],b=e[15];return x*(+a*c*f-i*u*f-a*l*g+r*u*g+i*l*p-r*c*p)+v*(+n*c*p-n*u*g+a*s*g-i*s*p+i*u*d-a*c*d)+y*(+n*u*f-n*l*p-a*s*f+r*s*p+a*l*d-r*u*d)+b*(-i*l*d-n*c*f+n*l*g+i*s*f-r*s*g+r*c*d)}transpose(){const e=this.elements;let n;return n=e[1],e[1]=e[4],e[4]=n,n=e[2],e[2]=e[8],e[8]=n,n=e[6],e[6]=e[9],e[9]=n,n=e[3],e[3]=e[12],e[12]=n,n=e[7],e[7]=e[13],e[13]=n,n=e[11],e[11]=e[14],e[14]=n,this}setPosition(e,n,r){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=n,i[14]=r),this}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],a=e[3],s=e[4],l=e[5],c=e[6],u=e[7],d=e[8],f=e[9],g=e[10],p=e[11],x=e[12],v=e[13],y=e[14],b=e[15],E=f*y*u-v*g*u+v*c*p-l*y*p-f*c*b+l*g*b,w=x*g*u-d*y*u-x*c*p+s*y*p+d*c*b-s*g*b,T=d*v*u-x*f*u+x*l*p-s*v*p-d*l*b+s*f*b,A=x*f*c-d*v*c-x*l*g+s*v*g+d*l*y-s*f*y,C=n*E+r*w+i*T+a*A;if(C===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const N=1/C;return e[0]=E*N,e[1]=(v*g*a-f*y*a-v*i*p+r*y*p+f*i*b-r*g*b)*N,e[2]=(l*y*a-v*c*a+v*i*u-r*y*u-l*i*b+r*c*b)*N,e[3]=(f*c*a-l*g*a-f*i*u+r*g*u+l*i*p-r*c*p)*N,e[4]=w*N,e[5]=(d*y*a-x*g*a+x*i*p-n*y*p-d*i*b+n*g*b)*N,e[6]=(x*c*a-s*y*a-x*i*u+n*y*u+s*i*b-n*c*b)*N,e[7]=(s*g*a-d*c*a+d*i*u-n*g*u-s*i*p+n*c*p)*N,e[8]=T*N,e[9]=(x*f*a-d*v*a-x*r*p+n*v*p+d*r*b-n*f*b)*N,e[10]=(s*v*a-x*l*a+x*r*u-n*v*u-s*r*b+n*l*b)*N,e[11]=(d*l*a-s*f*a-d*r*u+n*f*u+s*r*p-n*l*p)*N,e[12]=A*N,e[13]=(d*v*i-x*f*i+x*r*g-n*v*g-d*r*y+n*f*y)*N,e[14]=(x*l*i-s*v*i-x*r*c+n*v*c+s*r*y-n*l*y)*N,e[15]=(s*f*i-d*l*i+d*r*c-n*f*c-s*r*g+n*l*g)*N,this}scale(e){const n=this.elements,r=e.x,i=e.y,a=e.z;return n[0]*=r,n[4]*=i,n[8]*=a,n[1]*=r,n[5]*=i,n[9]*=a,n[2]*=r,n[6]*=i,n[10]*=a,n[3]*=r,n[7]*=i,n[11]*=a,this}getMaxScaleOnAxis(){const e=this.elements,n=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],r=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(n,r,i))}makeTranslation(e,n,r){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,n,0,0,1,r,0,0,0,1),this}makeRotationX(e){const n=Math.cos(e),r=Math.sin(e);return this.set(1,0,0,0,0,n,-r,0,0,r,n,0,0,0,0,1),this}makeRotationY(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,0,r,0,0,1,0,0,-r,0,n,0,0,0,0,1),this}makeRotationZ(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,-r,0,0,r,n,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,n){const r=Math.cos(n),i=Math.sin(n),a=1-r,s=e.x,l=e.y,c=e.z,u=a*s,d=a*l;return this.set(u*s+r,u*l-i*c,u*c+i*l,0,u*l+i*c,d*l+r,d*c-i*s,0,u*c-i*l,d*c+i*s,a*c*c+r,0,0,0,0,1),this}makeScale(e,n,r){return this.set(e,0,0,0,0,n,0,0,0,0,r,0,0,0,0,1),this}makeShear(e,n,r,i,a,s){return this.set(1,r,a,0,e,1,s,0,n,i,1,0,0,0,0,1),this}compose(e,n,r){const i=this.elements,a=n._x,s=n._y,l=n._z,c=n._w,u=a+a,d=s+s,f=l+l,g=a*u,p=a*d,x=a*f,v=s*d,y=s*f,b=l*f,E=c*u,w=c*d,T=c*f,A=r.x,C=r.y,N=r.z;return i[0]=(1-(v+b))*A,i[1]=(p+T)*A,i[2]=(x-w)*A,i[3]=0,i[4]=(p-T)*C,i[5]=(1-(g+b))*C,i[6]=(y+E)*C,i[7]=0,i[8]=(x+w)*N,i[9]=(y-E)*N,i[10]=(1-(g+v))*N,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,n,r){const i=this.elements;let a=pm.set(i[0],i[1],i[2]).length();const s=pm.set(i[4],i[5],i[6]).length(),l=pm.set(i[8],i[9],i[10]).length();this.determinant()<0&&(a=-a),e.x=i[12],e.y=i[13],e.z=i[14],Eo.copy(this);const u=1/a,d=1/s,f=1/l;return Eo.elements[0]*=u,Eo.elements[1]*=u,Eo.elements[2]*=u,Eo.elements[4]*=d,Eo.elements[5]*=d,Eo.elements[6]*=d,Eo.elements[8]*=f,Eo.elements[9]*=f,Eo.elements[10]*=f,n.setFromRotationMatrix(Eo),r.x=a,r.y=s,r.z=l,this}makePerspective(e,n,r,i,a,s,l=hl,c=!1){const u=this.elements,d=2*a/(n-e),f=2*a/(r-i),g=(n+e)/(n-e),p=(r+i)/(r-i);let x,v;if(c)x=a/(s-a),v=s*a/(s-a);else if(l===hl)x=-(s+a)/(s-a),v=-2*s*a/(s-a);else if(l===Bw)x=-s/(s-a),v=-s*a/(s-a);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+l);return u[0]=d,u[4]=0,u[8]=g,u[12]=0,u[1]=0,u[5]=f,u[9]=p,u[13]=0,u[2]=0,u[6]=0,u[10]=x,u[14]=v,u[3]=0,u[7]=0,u[11]=-1,u[15]=0,this}makeOrthographic(e,n,r,i,a,s,l=hl,c=!1){const u=this.elements,d=2/(n-e),f=2/(r-i),g=-(n+e)/(n-e),p=-(r+i)/(r-i);let x,v;if(c)x=1/(s-a),v=s/(s-a);else if(l===hl)x=-2/(s-a),v=-(s+a)/(s-a);else if(l===Bw)x=-1/(s-a),v=-a/(s-a);else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+l);return u[0]=d,u[4]=0,u[8]=0,u[12]=g,u[1]=0,u[5]=f,u[9]=0,u[13]=p,u[2]=0,u[6]=0,u[10]=x,u[14]=v,u[3]=0,u[7]=0,u[11]=0,u[15]=1,this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<16;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<16;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e[n+9]=r[9],e[n+10]=r[10],e[n+11]=r[11],e[n+12]=r[12],e[n+13]=r[13],e[n+14]=r[14],e[n+15]=r[15],e}};const pm=new it,Eo=new hi,nke=new it(0,0,0),rke=new it(1,1,1),Au=new it,Zv=new it,xs=new it,vH=new hi,_H=new uf;let Sd=class NZ{constructor(e=0,n=0,r=0,i=NZ.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=n,this._z=r,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,n,r,i=this._order){return this._x=e,this._y=n,this._z=r,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,n=this._order,r=!0){const i=e.elements,a=i[0],s=i[4],l=i[8],c=i[1],u=i[5],d=i[9],f=i[2],g=i[6],p=i[10];switch(n){case"XYZ":this._y=Math.asin(yn(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-d,p),this._z=Math.atan2(-s,a)):(this._x=Math.atan2(g,u),this._z=0);break;case"YXZ":this._x=Math.asin(-yn(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(l,p),this._z=Math.atan2(c,u)):(this._y=Math.atan2(-f,a),this._z=0);break;case"ZXY":this._x=Math.asin(yn(g,-1,1)),Math.abs(g)<.9999999?(this._y=Math.atan2(-f,p),this._z=Math.atan2(-s,u)):(this._y=0,this._z=Math.atan2(c,a));break;case"ZYX":this._y=Math.asin(-yn(f,-1,1)),Math.abs(f)<.9999999?(this._x=Math.atan2(g,p),this._z=Math.atan2(c,a)):(this._x=0,this._z=Math.atan2(-s,u));break;case"YZX":this._z=Math.asin(yn(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(-d,u),this._y=Math.atan2(-f,a)):(this._x=0,this._y=Math.atan2(l,p));break;case"XZY":this._z=Math.asin(-yn(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(g,u),this._y=Math.atan2(l,a)):(this._x=Math.atan2(-d,p),this._y=0);break;default:Zt("Euler: .setFromRotationMatrix() encountered an unknown order: "+n)}return this._order=n,r===!0&&this._onChangeCallback(),this}setFromQuaternion(e,n,r){return vH.makeRotationFromQuaternion(e),this.setFromRotationMatrix(vH,n,r)}setFromVector3(e,n=this._order){return this.set(e.x,e.y,e.z,n)}reorder(e){return _H.setFromEuler(this),this.setFromQuaternion(_H,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}};Sd.DEFAULT_ORDER="XYZ";let CZ=class{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let n=0;n1){for(let r=0;r0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.geometryInfo=this._geometryInfo.map(l=>({...l,boundingBox:l.boundingBox?l.boundingBox.toJSON():void 0,boundingSphere:l.boundingSphere?l.boundingSphere.toJSON():void 0})),i.instanceInfo=this._instanceInfo.map(l=>({...l})),i.availableInstanceIds=this._availableInstanceIds.slice(),i.availableGeometryIds=this._availableGeometryIds.slice(),i.nextIndexStart=this._nextIndexStart,i.nextVertexStart=this._nextVertexStart,i.geometryCount=this._geometryCount,i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.matricesTexture=this._matricesTexture.toJSON(e),i.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(i.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(i.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(i.boundingBox=this.boundingBox.toJSON()));function a(l,c){return l[c.uuid]===void 0&&(l[c.uuid]=c.toJSON(e)),c.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=a(e.geometries,this.geometry);const l=this.geometry.parameters;if(l!==void 0&&l.shapes!==void 0){const c=l.shapes;if(Array.isArray(c))for(let u=0,d=c.length;u0){i.children=[];for(let l=0;l0){i.animations=[];for(let l=0;l0&&(r.geometries=l),c.length>0&&(r.materials=c),u.length>0&&(r.textures=u),d.length>0&&(r.images=d),f.length>0&&(r.shapes=f),g.length>0&&(r.skeletons=g),p.length>0&&(r.animations=p),x.length>0&&(r.nodes=x)}return r.object=i,r;function s(l){const c=[];for(const u in l){const d=l[u];delete d.metadata,c.push(d)}return c}}clone(e){return new this.constructor().copy(this,e)}copy(e,n=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),n===!0)for(let r=0;r0?i.multiplyScalar(1/Math.sqrt(a)):i.set(0,0,0)}static getBarycoord(e,n,r,i,a){To.subVectors(i,n),nc.subVectors(r,n),HN.subVectors(e,n);const s=To.dot(To),l=To.dot(nc),c=To.dot(HN),u=nc.dot(nc),d=nc.dot(HN),f=s*u-l*l;if(f===0)return a.set(0,0,0),null;const g=1/f,p=(u*c-l*d)*g,x=(s*d-l*c)*g;return a.set(1-p-x,x,p)}static containsPoint(e,n,r,i){return this.getBarycoord(e,n,r,i,rc)===null?!1:rc.x>=0&&rc.y>=0&&rc.x+rc.y<=1}static getInterpolation(e,n,r,i,a,s,l,c){return this.getBarycoord(e,n,r,i,rc)===null?(c.x=0,c.y=0,"z"in c&&(c.z=0),"w"in c&&(c.w=0),null):(c.setScalar(0),c.addScaledVector(a,rc.x),c.addScaledVector(s,rc.y),c.addScaledVector(l,rc.z),c)}static getInterpolatedAttribute(e,n,r,i,a,s){return WN.setScalar(0),qN.setScalar(0),KN.setScalar(0),WN.fromBufferAttribute(e,n),qN.fromBufferAttribute(e,r),KN.fromBufferAttribute(e,i),s.setScalar(0),s.addScaledVector(WN,a.x),s.addScaledVector(qN,a.y),s.addScaledVector(KN,a.z),s}static isFrontFacing(e,n,r,i){return To.subVectors(r,n),nc.subVectors(e,n),To.cross(nc).dot(i)<0}set(e,n,r){return this.a.copy(e),this.b.copy(n),this.c.copy(r),this}setFromPointsAndIndices(e,n,r,i){return this.a.copy(e[n]),this.b.copy(e[r]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,n,r,i){return this.a.fromBufferAttribute(e,n),this.b.fromBufferAttribute(e,r),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return To.subVectors(this.c,this.b),nc.subVectors(this.a,this.b),To.cross(nc).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return Xm.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,n){return Xm.getBarycoord(e,this.a,this.b,this.c,n)}getInterpolation(e,n,r,i,a){return Xm.getInterpolation(e,this.a,this.b,this.c,n,r,i,a)}containsPoint(e){return Xm.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return Xm.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,n){const r=this.a,i=this.b,a=this.c;let s,l;bm.subVectors(i,r),ym.subVectors(a,r),$N.subVectors(e,r);const c=bm.dot($N),u=ym.dot($N);if(c<=0&&u<=0)return n.copy(r);VN.subVectors(e,i);const d=bm.dot(VN),f=ym.dot(VN);if(d>=0&&f<=d)return n.copy(i);const g=c*f-d*u;if(g<=0&&c>=0&&d<=0)return s=c/(c-d),n.copy(r).addScaledVector(bm,s);GN.subVectors(e,a);const p=bm.dot(GN),x=ym.dot(GN);if(x>=0&&p<=x)return n.copy(a);const v=p*u-c*x;if(v<=0&&u>=0&&x<=0)return l=u/(u-x),n.copy(r).addScaledVector(ym,l);const y=d*x-p*f;if(y<=0&&f-d>=0&&p-x>=0)return AH.subVectors(a,i),l=(f-d)/(f-d+(p-x)),n.copy(i).addScaledVector(AH,l);const b=1/(y+v+g);return s=v*b,l=g*b,n.copy(r).addScaledVector(bm,s).addScaledVector(ym,l)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}};const kZ={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Nu={h:0,s:0,l:0},Jv={h:0,s:0,l:0};function XN(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+(e-t)*6*n:n<1/2?e:n<2/3?t+(e-t)*6*(2/3-n):t}let Mn=class{constructor(e,n,r){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,n,r)}set(e,n,r){if(n===void 0&&r===void 0){const i=e;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(e,n,r);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,n=Zs){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,Dn.colorSpaceToWorking(this,n),this}setRGB(e,n,r,i=Dn.workingColorSpace){return this.r=e,this.g=n,this.b=r,Dn.colorSpaceToWorking(this,i),this}setHSL(e,n,r,i=Dn.workingColorSpace){if(e=qCe(e,1),n=yn(n,0,1),r=yn(r,0,1),n===0)this.r=this.g=this.b=r;else{const a=r<=.5?r*(1+n):r+n-r*n,s=2*r-a;this.r=XN(s,a,e+1/3),this.g=XN(s,a,e),this.b=XN(s,a,e-1/3)}return Dn.colorSpaceToWorking(this,i),this}setStyle(e,n=Zs){function r(a){a!==void 0&&parseFloat(a)<1&&Zt("Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let a;const s=i[1],l=i[2];switch(s){case"rgb":case"rgba":if(a=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(l))return r(a[4]),this.setRGB(Math.min(255,parseInt(a[1],10))/255,Math.min(255,parseInt(a[2],10))/255,Math.min(255,parseInt(a[3],10))/255,n);if(a=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(l))return r(a[4]),this.setRGB(Math.min(100,parseInt(a[1],10))/100,Math.min(100,parseInt(a[2],10))/100,Math.min(100,parseInt(a[3],10))/100,n);break;case"hsl":case"hsla":if(a=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(l))return r(a[4]),this.setHSL(parseFloat(a[1])/360,parseFloat(a[2])/100,parseFloat(a[3])/100,n);break;default:Zt("Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const a=i[1],s=a.length;if(s===3)return this.setRGB(parseInt(a.charAt(0),16)/15,parseInt(a.charAt(1),16)/15,parseInt(a.charAt(2),16)/15,n);if(s===6)return this.setHex(parseInt(a,16),n);Zt("Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,n);return this}setColorName(e,n=Zs){const r=kZ[e.toLowerCase()];return r!==void 0?this.setHex(r,n):Zt("Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=Rc(e.r),this.g=Rc(e.g),this.b=Rc(e.b),this}copyLinearToSRGB(e){return this.r=fp(e.r),this.g=fp(e.g),this.b=fp(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Zs){return Dn.workingToColorSpace(da.copy(this),e),Math.round(yn(da.r*255,0,255))*65536+Math.round(yn(da.g*255,0,255))*256+Math.round(yn(da.b*255,0,255))}getHexString(e=Zs){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,n=Dn.workingColorSpace){Dn.workingToColorSpace(da.copy(this),n);const r=da.r,i=da.g,a=da.b,s=Math.max(r,i,a),l=Math.min(r,i,a);let c,u;const d=(l+s)/2;if(l===s)c=0,u=0;else{const f=s-l;switch(u=d<=.5?f/(s+l):f/(2-s-l),s){case r:c=(i-a)/f+(i0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const n in e){const r=e[n];if(r===void 0){Zt(`Material: parameter '${n}' has value of undefined.`);continue}const i=this[n];if(i===void 0){Zt(`Material: '${n}' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(r):i&&i.isVector3&&r&&r.isVector3?i.copy(r):this[n]=r}}toJSON(e){const n=e===void 0||typeof e=="string";n&&(e={textures:{},images:{}});const r={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};r.uuid=this.uuid,r.type=this.type,this.name!==""&&(r.name=this.name),this.color&&this.color.isColor&&(r.color=this.color.getHex()),this.roughness!==void 0&&(r.roughness=this.roughness),this.metalness!==void 0&&(r.metalness=this.metalness),this.sheen!==void 0&&(r.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(r.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(r.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(r.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(r.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(r.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(r.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(r.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(r.shininess=this.shininess),this.clearcoat!==void 0&&(r.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(r.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(r.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(r.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(r.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,r.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(r.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(r.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(r.dispersion=this.dispersion),this.iridescence!==void 0&&(r.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(r.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(r.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(r.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(r.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(r.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(r.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(r.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(r.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(r.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(r.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(r.lightMap=this.lightMap.toJSON(e).uuid,r.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(r.aoMap=this.aoMap.toJSON(e).uuid,r.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(r.bumpMap=this.bumpMap.toJSON(e).uuid,r.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(r.normalMap=this.normalMap.toJSON(e).uuid,r.normalMapType=this.normalMapType,r.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(r.displacementMap=this.displacementMap.toJSON(e).uuid,r.displacementScale=this.displacementScale,r.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(r.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(r.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(r.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(r.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(r.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(r.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(r.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(r.combine=this.combine)),this.envMapRotation!==void 0&&(r.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(r.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(r.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(r.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(r.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(r.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(r.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(r.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(r.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(r.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(r.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(r.size=this.size),this.shadowSide!==null&&(r.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(r.sizeAttenuation=this.sizeAttenuation),this.blending!==hp&&(r.blending=this.blending),this.side!==wd&&(r.side=this.side),this.vertexColors===!0&&(r.vertexColors=!0),this.opacity<1&&(r.opacity=this.opacity),this.transparent===!0&&(r.transparent=!0),this.blendSrc!==aP&&(r.blendSrc=this.blendSrc),this.blendDst!==sP&&(r.blendDst=this.blendDst),this.blendEquation!==xh&&(r.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(r.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(r.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(r.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(r.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(r.blendAlpha=this.blendAlpha),this.depthFunc!==Lp&&(r.depthFunc=this.depthFunc),this.depthTest===!1&&(r.depthTest=this.depthTest),this.depthWrite===!1&&(r.depthWrite=this.depthWrite),this.colorWrite===!1&&(r.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(r.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==hH&&(r.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(r.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(r.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==um&&(r.stencilFail=this.stencilFail),this.stencilZFail!==um&&(r.stencilZFail=this.stencilZFail),this.stencilZPass!==um&&(r.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(r.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(r.rotation=this.rotation),this.polygonOffset===!0&&(r.polygonOffset=!0),this.polygonOffsetFactor!==0&&(r.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(r.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(r.linewidth=this.linewidth),this.dashSize!==void 0&&(r.dashSize=this.dashSize),this.gapSize!==void 0&&(r.gapSize=this.gapSize),this.scale!==void 0&&(r.scale=this.scale),this.dithering===!0&&(r.dithering=!0),this.alphaTest>0&&(r.alphaTest=this.alphaTest),this.alphaHash===!0&&(r.alphaHash=!0),this.alphaToCoverage===!0&&(r.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(r.premultipliedAlpha=!0),this.forceSinglePass===!0&&(r.forceSinglePass=!0),this.wireframe===!0&&(r.wireframe=!0),this.wireframeLinewidth>1&&(r.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(r.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(r.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(r.flatShading=!0),this.visible===!1&&(r.visible=!1),this.toneMapped===!1&&(r.toneMapped=!1),this.fog===!1&&(r.fog=!1),Object.keys(this.userData).length>0&&(r.userData=this.userData);function i(a){const s=[];for(const l in a){const c=a[l];delete c.metadata,s.push(c)}return s}if(n){const a=i(e.textures),s=i(e.images);a.length>0&&(r.textures=a),s.length>0&&(r.images=s)}return r}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const n=e.clippingPlanes;let r=null;if(n!==null){const i=n.length;r=new Array(i);for(let a=0;a!==i;++a)r[a]=n[a].clone()}return this.clippingPlanes=r,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}},jO=class extends bg{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Mn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Sd,this.combine=wO,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}};const ai=new it,e_=new dn;let cke=0,co=class{constructor(e,n,r=!1){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:cke++}),this.name="",this.array=e,this.itemSize=n,this.count=e!==void 0?e.length/n:0,this.normalized=r,this.usage=fH,this.updateRanges=[],this.gpuType=Tc,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,n){this.updateRanges.push({start:e,count:n})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,n,r){e*=this.itemSize,r*=n.itemSize;for(let i=0,a=this.itemSize;in.count&&Zt("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),n.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new hf);const e=this.attributes.position,n=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){Zr("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new it(-1/0,-1/0,-1/0),new it(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),n)for(let r=0,i=n.length;r0&&(e.userData=this.userData),this.parameters!==void 0){const c=this.parameters;for(const u in c)c[u]!==void 0&&(e[u]=c[u]);return e}e.data={attributes:{}};const n=this.index;n!==null&&(e.data.index={type:n.array.constructor.name,array:Array.prototype.slice.call(n.array)});const r=this.attributes;for(const c in r){const u=r[c];e.data.attributes[c]=u.toJSON(e.data)}const i={};let a=!1;for(const c in this.morphAttributes){const u=this.morphAttributes[c],d=[];for(let f=0,g=u.length;f0&&(i[c]=d,a=!0)}a&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(e.data.groups=JSON.parse(JSON.stringify(s)));const l=this.boundingSphere;return l!==null&&(e.data.boundingSphere=l.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const n={};this.name=e.name;const r=e.index;r!==null&&this.setIndex(r.clone());const i=e.attributes;for(const u in i){const d=i[u];this.setAttribute(u,d.clone(n))}const a=e.morphAttributes;for(const u in a){const d=[],f=a[u];for(let g=0,p=f.length;g0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let a=0,s=i.length;a(e.far-e.near)**2))&&(NH.copy(a).invert(),eh.copy(e.ray).applyMatrix4(NH),!(r.boundingBox!==null&&eh.intersectsBox(r.boundingBox)===!1)&&this._computeIntersections(e,n,eh)))}_computeIntersections(e,n,r){let i;const a=this.geometry,s=this.material,l=a.index,c=a.attributes.position,u=a.attributes.uv,d=a.attributes.uv1,f=a.attributes.normal,g=a.groups,p=a.drawRange;if(l!==null)if(Array.isArray(s))for(let x=0,v=g.length;xn.far?null:{distance:u,point:s_.clone(),object:t}}function o_(t,e,n,r,i,a,s,l,c,u){t.getVertexPosition(l,n_),t.getVertexPosition(c,r_),t.getVertexPosition(u,i_);const d=dke(t,e,n,r,n_,r_,i_,kH);if(d){const f=new it;kx.getBarycoord(kH,n_,r_,i_,f),i&&(d.uv=kx.getInterpolatedAttribute(i,l,c,u,f,new dn)),a&&(d.uv1=kx.getInterpolatedAttribute(a,l,c,u,f,new dn)),s&&(d.normal=kx.getInterpolatedAttribute(s,l,c,u,f,new it),d.normal.dot(r.direction)>0&&d.normal.multiplyScalar(-1));const g={a:l,b:c,c:u,normal:new it,materialIndex:0};kx.getNormal(n_,r_,i_,g.normal),d.face=g,d.barycoord=f}return d}let RO=class DZ extends Dl{constructor(e=1,n=1,r=1,i=1,a=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:n,depth:r,widthSegments:i,heightSegments:a,depthSegments:s};const l=this;i=Math.floor(i),a=Math.floor(a),s=Math.floor(s);const c=[],u=[],d=[],f=[];let g=0,p=0;x("z","y","x",-1,-1,r,n,e,s,a,0),x("z","y","x",1,-1,r,n,-e,s,a,1),x("x","z","y",1,1,e,r,n,i,s,2),x("x","z","y",1,-1,e,r,-n,i,s,3),x("x","y","z",1,-1,e,n,r,i,a,4),x("x","y","z",-1,-1,e,n,-r,i,a,5),this.setIndex(c),this.setAttribute("position",new Bo(u,3)),this.setAttribute("normal",new Bo(d,3)),this.setAttribute("uv",new Bo(f,2));function x(v,y,b,E,w,T,A,C,N,F,k){const R=T/N,I=A/F,L=T/2,q=A/2,j=C/2,V=N+1,K=F+1;let W=0,J=0;const ee=new it;for(let Z=0;Z0?1:-1,d.push(ee.x,ee.y,ee.z),f.push(G/N),f.push(1-Z/F),W+=1}}for(let Z=0;Z.5?u/(2-i-a):u/(i+a);const d=e/255,f=n/255,g=r/255;i===d?l=((f-g)/u+(f.85?"White":c<.15?s<.4?"Dark Gray":s>.6?"Light Gray":"Gray":l<15||l>=345?"Red":l<45?"Orange":l<70?"Yellow":l<150?"Green":l<200?"Cyan":l<260?"Blue":l<290?"Purple":l<345?"Pink":"Unknown"}function NN(t){return(t??.02).toFixed(3)}function tH({side:t}){const{mode:e}=ag(),n=e==="dark"?"#1a4d2e":"#e7f5e9";return o.jsx("span",{className:"inline-flex items-center justify-center w-4 h-4 text-[10px] font-bold rounded",style:{backgroundColor:n,color:"#00ae42"},children:t})}function nH({className:t}){return o.jsx("svg",{className:t,viewBox:"0 0 36 54",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:o.jsx("path",{d:"M17.8131 0.00538C18.4463 -0.15091 20.3648 3.14642 20.8264 3.84781C25.4187 10.816 35.3089 26.9368 35.9383 34.8694C37.4182 53.5822 11.882 61.3357 2.53721 45.3789C-1.73471 38.0791 0.016 32.2049 3.178 25.0232C6.99221 16.3662 12.6411 7.90372 17.8131 0.00538ZM18.3738 7.24807L17.5881 7.48441C14.4452 12.9431 10.917 18.2341 8.19369 23.9368C4.6808 31.29 1.18317 38.5479 7.69403 45.5657C17.3058 55.9228 34.9847 46.8808 31.4604 32.8681C29.2558 24.0969 22.4207 15.2913 18.3776 7.24807H18.3738Z",fill:"#C3C2C1"})})}function zNe({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 35 53",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("path",{d:"M17.3165 0.0038C17.932 -0.14959 19.7971 3.08645 20.2458 3.77481C24.7103 10.6135 34.3251 26.4346 34.937 34.2198C36.3757 52.5848 11.5505 60.1942 2.46584 44.534C-1.68714 37.3735 0.0148 31.6085 3.08879 24.5603C6.79681 16.0605 12.2884 7.75907 17.3165 0.0038ZM17.8615 7.11561L17.0977 7.34755C14.0423 12.7048 10.6124 17.8974 7.96483 23.4941C4.54975 30.7107 1.14949 37.8337 7.47908 44.721C16.8233 54.8856 34.01 46.0117 30.5838 32.2595C28.4405 23.6512 21.7957 15.0093 17.8652 7.11561H17.8615Z",fill:"#C3C2C1"}),o.jsx("path",{d:"M5.03547 30.112C9.64453 30.4936 11.632 35.7985 16.4154 35.791C19.6339 35.7873 20.2161 33.2283 22.3853 31.6197C31.6776 24.7286 33.5835 37.4894 27.9881 44.4254C18.1878 56.5653 -1.16063 44.6013 5.03917 30.1158L5.03547 30.112Z",fill:"#1F8FEB"})]})}function BNe({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 36 54",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("path",{d:"M17.9625 4.48059L4.77216 26.3154L2.08228 40.2175L10.0224 50.8414H23.1594L33.3246 42.1693V30.2455L17.9625 4.48059Z",fill:"#1F8FEB"}),o.jsx("path",{d:"M17.7948 0.00538C18.4273 -0.15091 20.3438 3.14642 20.8048 3.84781C25.3921 10.816 35.2715 26.9368 35.9001 34.8694C37.3784 53.5822 11.8702 61.3357 2.53562 45.3789C-1.73163 38.0829 0.0134 32.2087 3.1757 25.027C6.98574 16.3662 12.6284 7.90372 17.7948 0.00538ZM18.3549 7.24807L17.57 7.48441C14.4306 12.9431 10.9063 18.2341 8.1859 23.9368C4.67686 31.29 1.18305 38.5479 7.68679 45.5657C17.2881 55.9228 34.9476 46.8808 31.4271 32.8681C29.2249 24.0969 22.3974 15.2913 18.3587 7.24807H18.3549Z",fill:"#C3C2C1"})]})}function HNe({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"}),o.jsx("circle",{cx:"6",cy:"15",r:"2.5",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function $Ne({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("rect",{x:"4.5",y:"8",width:"3",height:"4.5",fill:"#d4a017",rx:"0.5"}),o.jsx("circle",{cx:"6",cy:"15",r:"2",fill:"#d4a017"}),o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function VNe({className:t}){return o.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("rect",{x:"4.5",y:"3",width:"3",height:"9.5",fill:"#c62828",rx:"0.5"}),o.jsx("circle",{cx:"6",cy:"15",r:"2",fill:"#c62828"}),o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:"#C3C2C1",strokeWidth:"1",fill:"none"})]})}function CN({className:t,color:e,isHeating:n}){const i={"text-orange-400":"#fb923c","text-blue-400":"#60a5fa","text-green-400":"#4ade80"}[e]||"#888",a=n?{filter:`drop-shadow(0 0 4px ${i}) drop-shadow(0 0 8px ${i})`}:{};return n?o.jsxs("svg",{className:t,style:a,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("rect",{x:"4.5",y:"3",width:"3",height:"9.5",fill:i,rx:"0.5"}),o.jsx("circle",{cx:"6",cy:"15",r:"2",fill:i}),o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:i,strokeWidth:"1",fill:"none"})]}):o.jsxs("svg",{className:t,viewBox:"0 0 12 20",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[o.jsx("path",{d:"M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z",stroke:i,strokeWidth:"1",fill:"none"}),o.jsx("circle",{cx:"6",cy:"15",r:"2.5",stroke:i,strokeWidth:"1",fill:"none"})]})}function rH({humidity:t,goodThreshold:e=40,fairThreshold:n=60,onClick:r,compact:i}){const a=typeof t=="string"?parseInt(t,10):t,s=typeof e=="number"?e:40,l=typeof n=="number"?n:60;let c,u;isNaN(a)?(c="#C3C2C1",u="Unknown"):a<=s?(c="#22a352",u="Good"):a<=l?(c="#d4a017",u="Fair"):(c="#c62828",u="Bad");let d;return isNaN(a)||a<=s?d=nH:a<=l?d=zNe:d=BNe,o.jsxs("button",{type:"button",onClick:r,className:`flex items-center gap-1 ${r?"cursor-pointer hover:opacity-80 transition-opacity":""}`,title:`Humidity: ${a}% - ${u}${r?" (click for history)":""}`,children:[o.jsx(d,{className:i?"w-2.5 h-3":"w-3 h-4"}),o.jsxs("span",{className:`font-medium tabular-nums ${i?"text-[10px]":"text-xs"}`,style:{color:c},children:[a,"%"]})]})}function iH({temp:t,goodThreshold:e=28,fairThreshold:n=35,onClick:r,compact:i}){const a=typeof e=="number"?e:28,s=typeof n=="number"?n:35;let l,c,u;return t<=a?(l="#22a352",c="Good",u=HNe):t<=s?(l="#d4a017",c="Fair",u=$Ne):(l="#c62828",c="Bad",u=VNe),o.jsxs("button",{type:"button",onClick:r,className:`flex items-center gap-1 ${r?"cursor-pointer hover:opacity-80 transition-opacity":""}`,title:`Temperature: ${t}°C - ${c}${r?" (click for history)":""}`,children:[o.jsx(u,{className:i?"w-2.5 h-3":"w-3 h-4"}),o.jsxs("span",{className:`tabular-nums text-right ${i?"text-[10px] w-8":"w-12"}`,style:{color:l},children:[t,"°C"]})]})}function cm(t,e){const n=typeof t=="string"?parseInt(t,10):t,r=isNaN(n)?0:n,i=e===1,a=r>=128?r-128:r,s=String.fromCharCode(65+a);return i?`HT-${s}`:`AMS-${s}`}function aH(t){return t>50?"#00ae42":t>=15?"#f59e0b":"#ef4444"}function GNe(t){const e=Math.floor(t/3600),n=Math.floor(t%3600/60);return e>0?`${e}h ${n}m`:`${n}m`}function WNe(t){const e=new Date,n=new Date(e.getTime()+t*60*1e3),r=new Date;r.setHours(0,0,0,0);const i=new Date(n);i.setHours(0,0,0,0);const a=n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}),s=Math.floor((i.getTime()-r.getTime())/(1e3*60*60*24));return s===0?a:s===1?`Tomorrow ${a}`:n.toLocaleDateString([],{weekday:"short"})+" "+a}function qNe(t){if(!t)return"/img/printers/default.png";const e=t.toLowerCase().replace(/\s+/g,"");return e.includes("x1e")?"/img/printers/x1e.png":e.includes("x1c")||e.includes("x1carbon")||e.includes("x1")?"/img/printers/x1c.png":e.includes("h2d")||e.includes("h2c")||e.includes("h2s")?"/img/printers/h2d.png":e.includes("p2s")||e.includes("p1s")?"/img/printers/p1s.png":e.includes("p1p")?"/img/printers/p1p.png":e.includes("a1mini")?"/img/printers/a1mini.png":e.includes("a1")?"/img/printers/a1.png":"/img/printers/default.png"}function KNe(t){return t==null?{label:"",color:"text-bambu-gray",bars:0}:t>=-50?{label:"Excellent",color:"text-bambu-green",bars:4}:t>=-60?{label:"Good",color:"text-bambu-green",bars:3}:t>=-70?{label:"Fair",color:"text-yellow-400",bars:2}:t>=-80?{label:"Weak",color:"text-orange-400",bars:1}:{label:"Very weak",color:"text-red-400",bars:1}}function XNe({url:t,printName:e}){const[n,r]=M.useState(!1),[i,a]=M.useState(!1),[s,l]=M.useState(!1);return o.jsxs(o.Fragment,{children:[o.jsx("div",{className:`w-20 h-20 flex-shrink-0 rounded-lg overflow-hidden bg-bambu-dark-tertiary flex items-center justify-center ${t&&n?"cursor-pointer":""}`,onClick:()=>t&&n&&l(!0),children:t&&!i?o.jsxs(o.Fragment,{children:[o.jsx("img",{src:t,alt:"Print preview",className:`w-full h-full object-cover ${n?"block":"hidden"}`,onLoad:()=>r(!0),onError:()=>a(!0)}),!n&&o.jsx(_p,{className:"w-8 h-8 text-bambu-gray"})]}):o.jsx(_p,{className:"w-8 h-8 text-bambu-gray"})}),s&&t&&o.jsx("div",{className:"fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-8",onClick:()=>l(!1),children:o.jsxs("div",{className:"relative max-w-2xl max-h-full",children:[o.jsx("img",{src:t,alt:"Print preview",className:"max-w-full max-h-[80vh] rounded-lg shadow-2xl"}),e&&o.jsx("p",{className:"text-white text-center mt-4 text-lg",children:e})]})})]})}function YNe({printers:t}){const e=mn(),n=M.useMemo(()=>{let i=0,a=0,s=0,l=0;return t?.forEach(c=>{const u=e.getQueryData(["printerStatus",c.id]);u===void 0?l++:u.connected?u.state==="RUNNING"?i++:a++:s++}),{printing:i,idle:a,offline:s,loading:l,total:t?.length||0}},[t,e]),[,r]=M.useState(0);return M.useEffect(()=>{let i=!1;const a=e.getQueryCache().subscribe(()=>{i||(i=!0,requestAnimationFrame(()=>{r(s=>s+1),i=!1}))});return()=>a()},[e]),t?.length?o.jsxs("div",{className:"flex items-center gap-4 text-sm",children:[n.printing>0&&o.jsxs("div",{className:"flex items-center gap-1.5",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-bambu-green animate-pulse"}),o.jsxs("span",{className:"text-bambu-gray",children:[o.jsx("span",{className:"text-white font-medium",children:n.printing})," printing"]})]}),n.idle>0&&o.jsxs("div",{className:"flex items-center gap-1.5",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-blue-400"}),o.jsxs("span",{className:"text-bambu-gray",children:[o.jsx("span",{className:"text-white font-medium",children:n.idle})," idle"]})]}),n.offline>0&&o.jsxs("div",{className:"flex items-center gap-1.5",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-gray-400"}),o.jsxs("span",{className:"text-bambu-gray",children:[o.jsx("span",{className:"text-white font-medium",children:n.offline})," offline"]})]})]}):null}function sH(t,e){if(e)return e;switch(t){case"RUNNING":return"Printing";case"PAUSE":return"Paused";case"FINISH":return"Finished";case"FAILED":return"Failed";case"IDLE":return"Idle";default:return t?t.charAt(0)+t.slice(1).toLowerCase():"Idle"}}function oH({printer:t,hideIfDisconnected:e,maintenanceInfo:n,viewMode:r="expanded",amsThresholds:i}){const a=mn(),s=wb(),[l,c]=M.useState(!1),[u,d]=M.useState(!1),[f,g]=M.useState(!0),[p,x]=M.useState(!1),[v,y]=M.useState(!1),[b,E]=M.useState(!1),[w,T]=M.useState(!1),[A,C]=M.useState(!1),[N,F]=M.useState(!1),[k,R]=M.useState(null),{data:I}=gt({queryKey:["printerStatus",t.id],queryFn:()=>Se.getPrinterStatus(t.id),refetchInterval:3e4}),L=M.useMemo(()=>{const $=new Set;if(I?.ams)for(const Y of I.ams)for(const se of Y.tray||[])se.tray_info_idx&&$.add(se.tray_info_idx);return I?.vt_tray?.tray_info_idx&&$.add(I.vt_tray.tray_info_idx),Array.from($)},[I?.ams,I?.vt_tray]),{data:q}=gt({queryKey:["filamentInfo",L],queryFn:()=>Se.getFilamentInfo(L),enabled:L.length>0,staleTime:300*1e3}),[j,V]=M.useState(null);M.useEffect(()=>{I?.wifi_signal!=null&&V(I.wifi_signal)},[I?.wifi_signal]);const K=I?.wifi_signal??j,W=M.useRef(void 0);M.useEffect(()=>{I?.connected!==void 0&&(W.current=I.connected)},[I?.connected]);const J=I?.connected??W.current,ee=M.useRef({});M.useEffect(()=>{I?.ams_extruder_map&&Object.keys(I.ams_extruder_map).length>0&&(ee.current=I.ams_extruder_map)},[I?.ams_extruder_map]);const Z=I?.ams_extruder_map&&Object.keys(I.ams_extruder_map).length>0?I.ams_extruder_map:ee.current,B=M.useRef([]);M.useEffect(()=>{I?.ams&&I.ams.length>0&&(B.current=I.ams)},[I?.ams]);const G=I?.ams&&I.ams.length>0?I.ams:B.current,Q=M.useRef(255),te=I?.tray_now;te!==void 0&&te!==255&&(Q.current=te);const he=te===void 0||te===255?Q.current:te,{data:oe}=gt({queryKey:["smartPlugByPrinter",t.id],queryFn:()=>Se.getSmartPlugByPrinter(t.id)}),{data:xe}=gt({queryKey:["smartPlugStatus",oe?.id],queryFn:()=>oe?Se.getSmartPlugStatus(oe.id):null,enabled:!!oe,refetchInterval:1e4}),{data:Te}=gt({queryKey:["queue",t.id,"pending"],queryFn:()=>Se.getQueue(t.id,"pending")}),me=Te?.length||0,{data:ce}=gt({queryKey:["archives",t.id,"last"],queryFn:()=>Se.getArchives(t.id,1,0),enabled:I?.connected&&I?.state!=="RUNNING"}),Ce=ce?.[0],fe=e&&J===!1,Ie=vt({mutationFn:$=>Se.deletePrinter(t.id,$.deleteArchives),onSuccess:()=>{a.invalidateQueries({queryKey:["printers"]}),a.invalidateQueries({queryKey:["archives"]})}}),z=vt({mutationFn:()=>Se.connectPrinter(t.id),onSuccess:()=>{a.invalidateQueries({queryKey:["printerStatus",t.id]})}}),H=vt({mutationFn:$=>oe?Se.controlSmartPlug(oe.id,$):Promise.reject("No plug"),onSuccess:()=>{a.invalidateQueries({queryKey:["smartPlugStatus",oe?.id]})}}),re=vt({mutationFn:$=>oe?Se.updateSmartPlug(oe.id,{auto_off:$}):Promise.reject("No plug"),onSuccess:()=>{a.invalidateQueries({queryKey:["smartPlugByPrinter",t.id]}),a.invalidateQueries({queryKey:["smart-plugs"]})}});return fe?null:o.jsxs(wt,{className:"relative",children:[o.jsxs(Et,{children:[o.jsxs("div",{className:r==="compact"?"mb-2":"mb-4",children:[o.jsxs("div",{className:"flex items-start justify-between gap-2",children:[o.jsxs("div",{className:"flex items-center gap-3 min-w-0 flex-1",children:[o.jsx("img",{src:qNe(t.model),alt:t.model||"Printer",className:`object-contain rounded-lg bg-bambu-dark flex-shrink-0 ${r==="compact"?"w-10 h-10":"w-14 h-14"}`}),o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("h3",{className:`font-semibold text-white ${r==="compact"?"text-base truncate":"text-lg"}`,children:t.name}),r==="compact"&&o.jsx("div",{className:`w-2 h-2 rounded-full flex-shrink-0 ${I?.connected?"bg-bambu-green":"bg-red-500"}`,title:I?.connected?"Connected":"Offline"})]}),o.jsxs("p",{className:"text-sm text-bambu-gray",children:[t.model||"Unknown Model",r==="expanded"&&I?.nozzles&&I.nozzles[0]?.nozzle_diameter&&o.jsxs("span",{className:"ml-1.5 text-bambu-gray",title:I.nozzles[0].nozzle_type||"Nozzle",children:["• ",I.nozzles[0].nozzle_diameter,"mm"]}),r==="expanded"&&n&&n.total_print_hours>0&&o.jsxs("span",{className:"ml-2 text-bambu-gray",children:[o.jsx(rr,{className:"w-3 h-3 inline-block mr-1"}),Math.round(n.total_print_hours),"h"]})]})]})]}),o.jsxs("div",{className:"relative flex-shrink-0",children:[o.jsx(ke,{variant:"ghost",size:"sm",onClick:()=>c(!l),children:o.jsx(cR,{className:"w-4 h-4"})}),l&&o.jsxs("div",{className:"absolute right-0 mt-2 w-48 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-lg z-10",children:[o.jsxs("button",{className:"w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2",onClick:()=>{x(!0),c(!1)},children:[o.jsx(Uc,{className:"w-4 h-4"}),"Edit"]}),o.jsxs("button",{className:"w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2",onClick:()=>{z.mutate(),c(!1)},children:[o.jsx(_a,{className:"w-4 h-4"}),"Reconnect"]}),o.jsxs("button",{className:"w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2",onClick:()=>{E(!0),c(!1)},children:[o.jsx(HG,{className:"w-4 h-4"}),"MQTT Debug"]}),o.jsxs("button",{className:"w-full px-4 py-2 text-left text-sm text-red-400 hover:bg-bambu-dark-tertiary flex items-center gap-2",onClick:()=>{d(!0),c(!1)},children:[o.jsx(En,{className:"w-4 h-4"}),"Delete"]})]})]})]}),r==="expanded"&&o.jsxs("div",{className:"flex flex-wrap items-center gap-2 mt-2",children:[o.jsxs("span",{className:`flex items-center gap-1.5 px-2 py-1 rounded-full text-xs ${I?.connected?"bg-bambu-green/20 text-bambu-green":"bg-red-500/20 text-red-400"}`,children:[I?.connected?o.jsx(Tb,{className:"w-3 h-3"}):o.jsx(GG,{className:"w-3 h-3"}),I?.connected?"Connected":"Offline"]}),I?.connected&&K!=null&&o.jsxs("span",{className:`flex items-center gap-1 px-2 py-1 rounded-full text-xs ${K>=-50||K>=-60?"bg-bambu-green/20 text-bambu-green":K>=-70?"bg-amber-500/20 text-amber-600":K>=-80?"bg-orange-500/20 text-orange-600":"bg-red-500/20 text-red-600"}`,title:`WiFi: ${K} dBm - ${KNe(K).label}`,children:[o.jsx(kue,{className:"w-3 h-3"}),K,"dBm"]}),I?.connected&&(()=>{const $=I.hms_errors?Hde(I.hms_errors):[];return o.jsxs("button",{onClick:()=>F(!0),className:`flex items-center gap-1 px-2 py-1 rounded-full text-xs cursor-pointer hover:opacity-80 transition-opacity ${$.length>0?$.some(Y=>Y.severity<=2)?"bg-red-500/20 text-red-400":"bg-orange-500/20 text-orange-400":"bg-bambu-green/20 text-bambu-green"}`,title:"Click to view HMS errors",children:[o.jsx(Gn,{className:"w-3 h-3"}),$.length>0?$.length:"OK"]})})(),n&&o.jsxs("button",{onClick:()=>s("/maintenance"),className:`flex items-center gap-1 px-2 py-1 rounded-full text-xs cursor-pointer hover:opacity-80 transition-opacity ${n.due_count>0?"bg-red-500/20 text-red-400":n.warning_count>0?"bg-orange-500/20 text-orange-400":"bg-bambu-green/20 text-bambu-green"}`,title:n.due_count>0||n.warning_count>0?`${n.due_count>0?`${n.due_count} maintenance due`:""}${n.due_count>0&&n.warning_count>0?", ":""}${n.warning_count>0?`${n.warning_count} due soon`:""} - Click to view`:"All maintenance up to date - Click to view",children:[o.jsx(gd,{className:"w-3 h-3"}),n.due_count>0||n.warning_count>0?n.due_count+n.warning_count:"OK"]}),me>0&&o.jsxs("button",{onClick:()=>s("/queue"),className:"flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-purple-500/20 text-purple-400 hover:opacity-80 transition-opacity",title:`${me} print${me>1?"s":""} in queue`,children:[o.jsx(pd,{className:"w-3 h-3"}),me]})]})]}),u&&o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",children:o.jsx(wt,{className:"w-full max-w-md mx-4",children:o.jsxs(Et,{children:[o.jsxs("div",{className:"flex items-start gap-3 mb-4",children:[o.jsx("div",{className:"p-2 rounded-full bg-red-500/20",children:o.jsx(Gn,{className:"w-5 h-5 text-red-400"})}),o.jsxs("div",{children:[o.jsx("h3",{className:"text-lg font-semibold text-white",children:"Delete Printer"}),o.jsxs("p",{className:"text-sm text-bambu-gray mt-1",children:['Are you sure you want to delete "',t.name,'"? This will remove all connection settings.']})]})]}),o.jsx("div",{className:"bg-bambu-dark rounded-lg p-3 mb-4",children:o.jsxs("label",{className:"flex items-start gap-3 cursor-pointer",children:[o.jsx("input",{type:"checkbox",checked:f,onChange:$=>g($.target.checked),className:"mt-0.5 w-4 h-4 rounded border-bambu-gray bg-bambu-dark-secondary text-bambu-green focus:ring-bambu-green focus:ring-offset-0"}),o.jsxs("div",{children:[o.jsx("span",{className:"text-sm text-white",children:"Delete print archives"}),o.jsx("p",{className:"text-xs text-bambu-gray mt-0.5",children:f?"All print history for this printer will be permanently deleted.":"Print history will be kept but no longer associated with this printer."})]})]})}),o.jsxs("div",{className:"flex justify-end gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:()=>{d(!1),g(!0)},children:"Cancel"}),o.jsx(ke,{variant:"danger",onClick:()=>{Ie.mutate({deleteArchives:f}),d(!1),g(!0)},children:"Delete"})]})]})})}),I?.connected&&o.jsxs(o.Fragment,{children:[r==="compact"?o.jsx("div",{className:"mt-2",children:I.state==="RUNNING"?o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("div",{className:"flex-1 bg-bambu-dark-tertiary rounded-full h-1.5",children:o.jsx("div",{className:"bg-bambu-green h-1.5 rounded-full transition-all",style:{width:`${I.progress||0}%`}})}),o.jsxs("span",{className:"text-xs text-white",children:[Math.round(I.progress||0),"%"]})]}):o.jsx("p",{className:"text-xs text-bambu-gray",children:sH(I.state,I.stg_cur_name)})}):o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"mb-4 p-3 bg-bambu-dark rounded-lg",children:o.jsxs("div",{className:"flex gap-3",children:[o.jsx(XNe,{url:I.state==="RUNNING"?I.cover_url:null,printName:I.state==="RUNNING"&&(I.subtask_name||I.current_print)||void 0}),o.jsx("div",{className:"flex-1 min-w-0",children:I.current_print&&I.state==="RUNNING"?o.jsxs(o.Fragment,{children:[o.jsx("p",{className:"text-sm text-bambu-gray mb-1",children:I.stg_cur_name||"Printing"}),o.jsx("p",{className:"text-white text-sm mb-2 truncate",children:I.subtask_name||I.current_print}),o.jsxs("div",{className:"flex items-center justify-between text-sm",children:[o.jsx("div",{className:"flex-1 bg-bambu-dark-tertiary rounded-full h-2 mr-3",children:o.jsx("div",{className:"bg-bambu-green h-2 rounded-full transition-all",style:{width:`${I.progress||0}%`}})}),o.jsxs("span",{className:"text-white",children:[Math.round(I.progress||0),"%"]})]}),o.jsxs("div",{className:"flex items-center gap-3 mt-2 text-xs text-bambu-gray",children:[I.remaining_time!=null&&I.remaining_time>0&&o.jsxs(o.Fragment,{children:[o.jsxs("span",{className:"flex items-center gap-1",children:[o.jsx(rr,{className:"w-3 h-3"}),GNe(I.remaining_time*60)]}),o.jsxs("span",{className:"text-bambu-green font-medium",title:"Estimated completion time",children:["ETA ",WNe(I.remaining_time)]})]}),I.layer_num!=null&&I.total_layers!=null&&I.total_layers>0&&o.jsxs("span",{className:"flex items-center gap-1",children:[o.jsx(pd,{className:"w-3 h-3"}),I.layer_num,"/",I.total_layers]})]})]}):o.jsxs(o.Fragment,{children:[o.jsx("p",{className:"text-sm text-bambu-gray mb-1",children:"Status"}),o.jsx("p",{className:"text-white text-sm mb-2",children:sH(I.state,I.stg_cur_name)}),o.jsxs("div",{className:"flex items-center justify-between text-sm",children:[o.jsx("div",{className:"flex-1 bg-bambu-dark-tertiary rounded-full h-2 mr-3",children:o.jsx("div",{className:"bg-bambu-dark-tertiary h-2 rounded-full"})}),o.jsx("span",{className:"text-bambu-gray",children:"—"})]}),Ce?o.jsxs("p",{className:"text-xs text-bambu-gray mt-2 truncate",title:Ce.print_name||Ce.filename,children:["Last: ",Ce.print_name||Ce.filename,Ce.completed_at&&o.jsxs("span",{className:"ml-1 text-bambu-gray/60",children:["• ",new Date(Ce.completed_at).toLocaleDateString([],{month:"short",day:"numeric"})]})]}):o.jsx("p",{className:"text-xs text-bambu-gray mt-2",children:"Ready to print"})]})})]})}),I.state!=="RUNNING"&&o.jsx(Wde,{printerId:t.id})]}),I.temperatures&&r==="expanded"&&(()=>{const $=I.temperatures.nozzle_heating||I.temperatures.nozzle_2_heating||!1,Y=I.temperatures.bed_heating||!1,se=I.temperatures.chamber_heating||!1;return o.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[o.jsxs("div",{className:"text-center p-2 bg-bambu-dark rounded-lg",children:[o.jsx(CN,{className:"w-4 h-4 mx-auto mb-1",color:"text-orange-400",isHeating:$}),I.temperatures.nozzle_2!==void 0?o.jsxs(o.Fragment,{children:[o.jsx("p",{className:"text-xs text-bambu-gray",children:"Left / Right"}),o.jsxs("p",{className:"text-sm text-white",children:[Math.round(I.temperatures.nozzle||0),"°C / ",Math.round(I.temperatures.nozzle_2||0),"°C"]})]}):o.jsxs(o.Fragment,{children:[o.jsx("p",{className:"text-xs text-bambu-gray",children:"Nozzle"}),o.jsxs("p",{className:"text-sm text-white",children:[Math.round(I.temperatures.nozzle||0),"°C"]})]})]}),o.jsxs("div",{className:"text-center p-2 bg-bambu-dark rounded-lg",children:[o.jsx(CN,{className:"w-4 h-4 mx-auto mb-1",color:"text-blue-400",isHeating:Y}),o.jsx("p",{className:"text-xs text-bambu-gray",children:"Bed"}),o.jsxs("p",{className:"text-sm text-white",children:[Math.round(I.temperatures.bed||0),"°C"]})]}),I.temperatures.chamber!==void 0&&o.jsxs("div",{className:"text-center p-2 bg-bambu-dark rounded-lg",children:[o.jsx(CN,{className:"w-4 h-4 mx-auto mb-1",color:"text-green-400",isHeating:se}),o.jsx("p",{className:"text-xs text-bambu-gray",children:"Chamber"}),o.jsxs("p",{className:"text-sm text-white",children:[Math.round(I.temperatures.chamber||0),"°C"]})]})]})})(),G&&G.length>0&&r==="expanded"&&(()=>{const $=G.filter(ue=>ue.tray.length>1),Y=G.filter(ue=>ue.tray.length===1),se=t.nozzle_count===2||I?.temperatures?.nozzle_2!==void 0;return o.jsxs("div",{className:"mt-4 pt-3 border-t border-bambu-dark-tertiary/50",children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[o.jsx("span",{className:"text-[10px] uppercase tracking-wider text-bambu-gray font-medium",children:"Filaments"}),o.jsx("div",{className:"flex-1 h-px bg-bambu-dark-tertiary/30"})]}),o.jsxs("div",{className:"space-y-3",children:[$.length>0&&o.jsx("div",{className:"grid grid-cols-2 gap-3",children:$.map(ue=>{const Ee=Z[String(ue.id)],Me=ue.id>=128?ue.id-128:ue.id,U=Ee!==void 0?Ee:Me,O=U===1,ne=U===0;return o.jsxs("div",{className:"p-2.5 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary/30",children:[o.jsxs("div",{className:"flex items-center justify-between mb-2",children:[o.jsxs("div",{className:"flex items-center gap-1.5",children:[o.jsx("span",{className:"text-[10px] text-white font-medium",children:cm(ue.id,ue.tray.length)}),se&&(O||ne)&&o.jsx(tH,{side:O?"L":"R"})]}),(ue.humidity!=null||ue.temp!=null)&&o.jsxs("div",{className:"flex items-center gap-1.5",children:[ue.humidity!=null&&o.jsx(rH,{humidity:ue.humidity,goodThreshold:i?.humidityGood,fairThreshold:i?.humidityFair,onClick:()=>R({amsId:ue.id,amsLabel:cm(ue.id,ue.tray.length),mode:"humidity"}),compact:!0}),ue.temp!=null&&o.jsx(iH,{temp:ue.temp,goodThreshold:i?.tempGood,fairThreshold:i?.tempFair,onClick:()=>R({amsId:ue.id,amsLabel:cm(ue.id,ue.tray.length),mode:"temperature"}),compact:!0})]})]}),o.jsx("div",{className:"grid grid-cols-4 gap-1.5",children:[0,1,2,3].map(be=>{const ye=ue.tray[be]||ue.tray.find(ze=>ze.id===be),_e=ye?.tray_type&&ye.remain>=0,We=!ye?.tray_type,Ve=ue.id*4+be,Ye=he===Ve,lt=ye?.tray_info_idx?q?.[ye.tray_info_idx]:null,de=ye?.tray_type?{vendor:ye.tray_uuid?"Bambu Lab":"Generic",profile:lt?.name||ye.tray_sub_brands||ye.tray_type,colorName:TN(ye.tray_id_name)||AN(ye.tray_color),colorHex:ye.tray_color||null,kFactor:NN(ye.k),fillLevel:_e?ye.remain:null}:null,ae=o.jsxs("div",{className:`bg-bambu-dark-tertiary rounded p-1 text-center cursor-default ${We?"opacity-50":""} ${Ye?"ring-2 ring-bambu-green ring-offset-1 ring-offset-bambu-dark":""}`,children:[o.jsx("div",{className:"w-3.5 h-3.5 rounded-full mx-auto mb-0.5 border-2",style:{backgroundColor:ye?.tray_color?`#${ye.tray_color}`:ye?.tray_type?"#333":"transparent",borderColor:We?"#666":"rgba(255,255,255,0.1)",borderStyle:We?"dashed":"solid"}}),o.jsx("div",{className:"text-[9px] text-white font-bold truncate",children:ye?.tray_type||"—"}),o.jsx("div",{className:"mt-1 h-1.5 bg-black/30 rounded-full overflow-hidden",children:_e&&ye?o.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${ye.remain}%`,backgroundColor:aH(ye.remain)}}):ye?.tray_type?o.jsx("div",{className:"h-full w-full rounded-full bg-white/50 dark:bg-gray-500/40"}):null})]});return de?o.jsx(EN,{data:de,children:ae},be):o.jsx(eH,{children:ae},be)})})]},ue.id)})}),(Y.length>0||I.vt_tray&&I.vt_tray.tray_type)&&o.jsxs("div",{className:"grid grid-cols-4 gap-3",children:[Y.map(ue=>{const Ee=Z[String(ue.id)],Me=ue.id>=128?ue.id-128:ue.id,U=Ee!==void 0?Ee:Me,O=U===1,ne=U===0,be=ue.tray[0],ye=be?.tray_type&&be.remain>=0,_e=!be?.tray_type,We=ue.id*4+(be?.id??0),Ve=he===We,Ye=be?.tray_info_idx?q?.[be.tray_info_idx]:null,lt=be?.tray_type?{vendor:be.tray_uuid?"Bambu Lab":"Generic",profile:Ye?.name||be.tray_sub_brands||be.tray_type,colorName:TN(be.tray_id_name)||AN(be.tray_color),colorHex:be.tray_color||null,kFactor:NN(be.k),fillLevel:ye?be.remain:null}:null,de=o.jsxs("div",{className:`bg-bambu-dark-tertiary rounded p-1 text-center cursor-default ${_e?"opacity-50":""} ${Ve?"ring-2 ring-bambu-green ring-offset-1 ring-offset-bambu-dark":""}`,children:[o.jsx("div",{className:"w-3.5 h-3.5 rounded-full mx-auto mb-0.5 border-2",style:{backgroundColor:be?.tray_color?`#${be.tray_color}`:be?.tray_type?"#333":"transparent",borderColor:_e?"#666":"rgba(255,255,255,0.1)",borderStyle:_e?"dashed":"solid"}}),o.jsx("div",{className:"text-[9px] text-white font-bold truncate",children:be?.tray_type||"—"}),o.jsx("div",{className:"mt-1 h-1.5 bg-black/30 rounded-full overflow-hidden",children:ye?o.jsx("div",{className:"h-full rounded-full transition-all",style:{width:`${be.remain}%`,backgroundColor:aH(be.remain)}}):be?.tray_type?o.jsx("div",{className:"h-full w-full rounded-full bg-white/50 dark:bg-gray-500/40"}):null})]});return o.jsxs("div",{className:"p-2.5 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary/30",children:[o.jsxs("div",{className:"flex items-center gap-1 mb-2",children:[o.jsx("span",{className:"text-[10px] text-white font-medium",children:cm(ue.id,ue.tray.length)}),se&&(O||ne)&&o.jsx(tH,{side:O?"L":"R"})]}),o.jsxs("div",{className:"flex gap-1.5",children:[lt?o.jsx(EN,{data:lt,className:"flex-1",children:de}):o.jsx(eH,{className:"flex-1",children:de}),(ue.humidity!=null||ue.temp!=null)&&o.jsxs("div",{className:"flex flex-col justify-center gap-1 shrink-0",children:[ue.temp!=null&&o.jsx(iH,{temp:ue.temp,goodThreshold:i?.tempGood,fairThreshold:i?.tempFair,onClick:()=>R({amsId:ue.id,amsLabel:cm(ue.id,ue.tray.length),mode:"temperature"}),compact:!0}),ue.humidity!=null&&o.jsx(rH,{humidity:ue.humidity,goodThreshold:i?.humidityGood,fairThreshold:i?.humidityFair,onClick:()=>R({amsId:ue.id,amsLabel:cm(ue.id,ue.tray.length),mode:"humidity"}),compact:!0})]})]})]},ue.id)}),I.vt_tray&&I.vt_tray.tray_type&&(()=>{const ue=I.vt_tray,Ee=he===254,Me=ue.tray_info_idx?q?.[ue.tray_info_idx]:null,U={vendor:ue.tray_uuid?"Bambu Lab":"Generic",profile:Me?.name||ue.tray_sub_brands||ue.tray_type||"Unknown",colorName:TN(ue.tray_id_name)||AN(ue.tray_color),colorHex:ue.tray_color||null,kFactor:NN(ue.k),fillLevel:null},O=o.jsxs("div",{className:`bg-bambu-dark-tertiary rounded p-1 text-center cursor-default ${Ee?"ring-2 ring-bambu-green ring-offset-1 ring-offset-bambu-dark":""}`,children:[o.jsx("div",{className:"w-3.5 h-3.5 rounded-full mx-auto mb-0.5 border-2",style:{backgroundColor:ue.tray_color?`#${ue.tray_color}`:"#333",borderColor:Ee?"var(--accent)":"rgba(255,255,255,0.1)"}}),o.jsx("div",{className:"text-[9px] text-white font-bold truncate",children:ue.tray_type||"Spool"}),o.jsx("div",{className:"mt-1 h-1.5 bg-black/30 rounded-full overflow-hidden",children:o.jsx("div",{className:"h-full w-full rounded-full bg-white/50 dark:bg-gray-500/40"})})]});return o.jsxs("div",{className:"p-2.5 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary/30",children:[o.jsx("div",{className:"flex items-center gap-1 mb-2",children:o.jsx("span",{className:"text-[10px] text-white font-medium",children:"External"})}),o.jsx(EN,{data:U,children:O})]})})()]})]})]})})()]}),oe&&r==="expanded"&&o.jsx("div",{className:"mt-4 pt-4 border-t border-bambu-dark-tertiary",children:o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[o.jsx(ef,{className:"w-4 h-4 text-bambu-gray flex-shrink-0"}),o.jsx("span",{className:"text-sm text-white truncate",children:oe.name}),xe&&o.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded flex-shrink-0 ${xe.state==="ON"?"bg-bambu-green/20 text-bambu-green":xe.state==="OFF"?"bg-red-500/20 text-red-400":"bg-bambu-gray/20 text-bambu-gray"}`,children:xe.state||"?"}),xe?.energy?.power!=null&&xe.state==="ON"&&o.jsxs("span",{className:"text-xs text-yellow-400 font-medium flex-shrink-0",children:[xe.energy.power,"W"]})]}),o.jsx("div",{className:"flex-1"}),o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsxs("button",{onClick:()=>T(!0),disabled:H.isPending||xe?.state==="ON",className:`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${xe?.state==="ON"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary"}`,children:[o.jsx(kl,{className:"w-3 h-3"}),"On"]}),o.jsxs("button",{onClick:()=>C(!0),disabled:H.isPending||xe?.state==="OFF",className:`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${xe?.state==="OFF"?"bg-red-500/30 text-red-400":"bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary"}`,children:[o.jsx(JS,{className:"w-3 h-3"}),"Off"]})]}),o.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[o.jsx("span",{className:`text-xs hidden sm:inline ${oe.auto_off_executed?"text-bambu-green":"text-bambu-gray"}`,children:oe.auto_off_executed?"Auto-off done":"Auto-off"}),o.jsx("button",{onClick:()=>re.mutate(!oe.auto_off),disabled:re.isPending||oe.auto_off_executed,title:oe.auto_off_executed?"Auto-off was executed - turn printer on to reset":"Auto power-off after print",className:`relative w-9 h-5 rounded-full transition-colors flex-shrink-0 ${oe.auto_off_executed?"bg-bambu-green/50 cursor-not-allowed":oe.auto_off?"bg-bambu-green":"bg-bambu-dark-tertiary"}`,children:o.jsx("span",{className:`absolute top-[2px] left-[2px] w-4 h-4 bg-white rounded-full transition-transform ${oe.auto_off||oe.auto_off_executed?"translate-x-4":"translate-x-0"}`})})]})]})}),r==="expanded"&&o.jsxs("div",{className:"mt-4 pt-4 border-t border-bambu-dark-tertiary flex items-center justify-between",children:[o.jsxs("div",{className:"text-xs text-bambu-gray",children:[o.jsx("p",{children:t.ip_address}),o.jsx("p",{className:"truncate",children:t.serial_number})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx(ke,{variant:"secondary",size:"sm",onClick:()=>{const $=localStorage.getItem("cameraWindowState"),Y=$?JSON.parse($):{width:640,height:400},se=[`width=${Y.width}`,`height=${Y.height}`,Y.left!==void 0?`left=${Y.left}`:"",Y.top!==void 0?`top=${Y.top}`:"","menubar=no,toolbar=no,location=no,status=no"].filter(Boolean).join(",");window.open(`/camera/${t.id}`,`camera-${t.id}`,se)},disabled:!I?.connected,title:"Open camera in new window",children:o.jsx(WG,{className:"w-4 h-4"})}),o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>y(!0),title:"Browse printer files",children:[o.jsx(hR,{className:"w-4 h-4"}),"Files"]})]})]})]}),v&&o.jsx(Ude,{printerId:t.id,printerName:t.name,onClose:()=>y(!1)}),b&&o.jsx(zde,{printerId:t.id,printerName:t.name,onClose:()=>E(!1)}),w&&oe&&o.jsx(kr,{title:"Power On Printer",message:`Are you sure you want to turn ON the power for "${t.name}"?`,confirmText:"Power On",variant:"default",onConfirm:()=>{H.mutate("on"),T(!1)},onCancel:()=>T(!1)}),A&&oe&&o.jsx(kr,{title:"Power Off Printer",message:I?.state==="RUNNING"?`WARNING: "${t.name}" is currently printing! Are you sure you want to turn OFF the power? This will interrupt the print and may damage the printer.`:`Are you sure you want to turn OFF the power for "${t.name}"?`,confirmText:"Power Off",variant:"danger",onConfirm:()=>{H.mutate("off"),C(!1)},onCancel:()=>C(!1)}),N&&o.jsx(Vde,{printerName:t.name,errors:I?.hms_errors||[],onClose:()=>F(!1)}),k&&o.jsx(FNe,{isOpen:!!k,onClose:()=>R(null),printerId:t.id,printerName:t.name,amsId:k.amsId,amsLabel:k.amsLabel,initialMode:k.mode,thresholds:i}),p&&o.jsx(QNe,{printer:t,onClose:()=>x(!1)})]})}function ZNe({onClose:t,onAdd:e,existingSerials:n}){const[r,i]=M.useState({name:"",serial_number:"",ip_address:"",access_code:"",model:"",auto_archive:!0}),[a,s]=M.useState(!1),[l,c]=M.useState([]),[u,d]=M.useState(""),[f,g]=M.useState(!1),[p,x]=M.useState(!1),[v,y]=M.useState("192.168.1.0/24"),[b,E]=M.useState({scanned:0,total:0});M.useEffect(()=>{Jo.getInfo().then(N=>{x(N.is_docker)}).catch(()=>{})},[]);const w=l.filter(N=>!n.includes(N.serial)),T=async()=>{d(""),c([]),s(!0),g(!1),E({scanned:0,total:0});try{if(p){await Jo.startSubnetScan(v);const N=setInterval(async()=>{try{const F=await Jo.getScanStatus();E({scanned:F.scanned,total:F.total});const k=await Jo.getDiscoveredPrinters();c(k),F.running||(clearInterval(N),s(!1),g(!0))}catch(F){console.error("Failed to get scan status:",F)}},500)}else{await Jo.startDiscovery(10);const N=setInterval(async()=>{try{const F=await Jo.getDiscoveredPrinters();c(F)}catch(F){console.error("Failed to get discovered printers:",F)}},1e3);setTimeout(async()=>{clearInterval(N);try{await Jo.stopDiscovery()}catch{}s(!1),g(!0);try{const F=await Jo.getDiscoveredPrinters();c(F)}catch(F){console.error("Failed to get final discovered printers:",F)}},1e4)}}catch(N){console.error("Failed to start discovery:",N),d(N instanceof Error?N.message:"Failed to start discovery"),s(!1),g(!0)}},A=N=>N?{O1D:"H2D",O1C:"H2C",O1S:"H2S","BL-P001":"X1C","BL-P002":"X1","BL-P003":"X1E",C11:"P1S",C12:"P1P",C13:"P2S",N2S:"A1",N1:"A1 Mini",X1C:"X1C",X1:"X1",X1E:"X1E",P1S:"P1S",P1P:"P1P",P2S:"P2S",A1:"A1","A1 Mini":"A1 Mini",H2D:"H2D",H2C:"H2C",H2S:"H2S"}[N]||N:"",C=N=>{i({...r,name:N.name||"",serial_number:N.serial,ip_address:N.ip_address,model:A(N.model)}),c([])};return M.useEffect(()=>()=>{Jo.stopDiscovery().catch(()=>{}),Jo.stopSubnetScan().catch(()=>{})},[]),M.useEffect(()=>{const N=F=>{F.key==="Escape"&&t()};return window.addEventListener("keydown",N),()=>window.removeEventListener("keydown",N)},[t]),o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",onClick:t,children:o.jsx(wt,{className:"w-full max-w-md",onClick:N=>N.stopPropagation(),children:o.jsxs(Et,{children:[o.jsx("h2",{className:"text-xl font-semibold mb-4",children:"Add Printer"}),o.jsxs("div",{className:"mb-4 pb-4 border-b border-bambu-dark-tertiary",children:[p&&o.jsxs("div",{className:"mb-3",children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Subnet to scan"}),o.jsx("input",{type:"text",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none text-sm",value:v,onChange:N=>y(N.target.value),placeholder:"192.168.1.0/24",disabled:a}),o.jsxs("p",{className:"mt-1 text-xs text-bambu-gray",children:["Docker detected. Enter your printer's subnet in CIDR notation. Requires ",o.jsx("code",{className:"text-bambu-green",children:"network_mode: host"})," in docker-compose.yml."]})]}),o.jsx(ke,{type:"button",variant:"secondary",onClick:T,disabled:a,className:"w-full",children:a?o.jsxs(o.Fragment,{children:[o.jsx(xt,{className:"w-4 h-4 animate-spin"}),p&&b.total>0?`Scanning... ${b.scanned}/${b.total}`:"Scanning..."]}):o.jsxs(o.Fragment,{children:[o.jsx(bl,{className:"w-4 h-4"}),p?"Scan Subnet for Printers":"Discover Printers on Network"]})}),u&&o.jsx("div",{className:"mt-2 text-sm text-red-400",children:u}),w.length>0&&o.jsx("div",{className:"mt-3 space-y-2 max-h-40 overflow-y-auto",children:w.map(N=>o.jsxs("div",{className:"flex items-center justify-between p-2 bg-bambu-dark rounded-lg hover:bg-bambu-dark-secondary cursor-pointer transition-colors",onClick:()=>C(N),children:[o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsx("p",{className:"font-medium text-white text-sm truncate",children:N.name||N.serial}),o.jsxs("p",{className:"text-xs text-bambu-gray truncate",children:[A(N.model)||"Unknown"," • ",N.ip_address]})]}),o.jsx(Cl,{className:"w-4 h-4 text-bambu-gray -rotate-90 flex-shrink-0 ml-2"})]},N.serial))}),a&&o.jsx("p",{className:"mt-2 text-sm text-bambu-gray text-center",children:p?"Scanning subnet for Bambu printers...":"Scanning network..."}),f&&!a&&l.length===0&&o.jsxs("p",{className:"mt-2 text-sm text-bambu-gray text-center",children:["No printers found",p?" in the specified subnet":" on the network","."]}),f&&!a&&l.length>0&&w.length===0&&o.jsx("p",{className:"mt-2 text-sm text-bambu-gray text-center",children:"All discovered printers are already configured."})]}),o.jsxs("form",{onSubmit:N=>{N.preventDefault(),e(r)},className:"space-y-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name"}),o.jsx("input",{type:"text",required:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.name,onChange:N=>i({...r,name:N.target.value}),placeholder:"My Printer"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"IP Address"}),o.jsx("input",{type:"text",required:!0,pattern:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.ip_address,onChange:N=>i({...r,ip_address:N.target.value}),placeholder:"192.168.1.100"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Serial Number"}),o.jsx("input",{type:"text",required:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.serial_number,onChange:N=>i({...r,serial_number:N.target.value}),placeholder:"01P00A000000000"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Access Code"}),o.jsx("input",{type:"password",required:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.access_code,onChange:N=>i({...r,access_code:N.target.value}),placeholder:"From printer settings"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Model (optional)"}),o.jsxs("select",{className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.model||"",onChange:N=>i({...r,model:N.target.value}),children:[o.jsx("option",{value:"",children:"Select model..."}),o.jsxs("optgroup",{label:"H2 Series",children:[o.jsx("option",{value:"H2C",children:"H2C"}),o.jsx("option",{value:"H2D",children:"H2D"}),o.jsx("option",{value:"H2S",children:"H2S"})]}),o.jsxs("optgroup",{label:"X1 Series",children:[o.jsx("option",{value:"X1E",children:"X1E"}),o.jsx("option",{value:"X1C",children:"X1 Carbon"}),o.jsx("option",{value:"X1",children:"X1"})]}),o.jsxs("optgroup",{label:"P Series",children:[o.jsx("option",{value:"P2S",children:"P2S"}),o.jsx("option",{value:"P1S",children:"P1S"}),o.jsx("option",{value:"P1P",children:"P1P"})]}),o.jsxs("optgroup",{label:"A1 Series",children:[o.jsx("option",{value:"A1",children:"A1"}),o.jsx("option",{value:"A1 Mini",children:"A1 Mini"})]})]})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"checkbox",id:"auto_archive",checked:r.auto_archive,onChange:N=>i({...r,auto_archive:N.target.checked}),className:"rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),o.jsx("label",{htmlFor:"auto_archive",className:"text-sm text-bambu-gray",children:"Auto-archive completed prints"})]}),o.jsxs("div",{className:"flex gap-3 pt-4",children:[o.jsx(ke,{type:"button",variant:"secondary",onClick:t,className:"flex-1",children:"Cancel"}),o.jsx(ke,{type:"submit",className:"flex-1",children:"Add Printer"})]})]})]})})})}function QNe({printer:t,onClose:e}){const n=mn(),[r,i]=M.useState({name:t.name,ip_address:t.ip_address,access_code:"",model:t.model||"",location:t.location||"",auto_archive:t.auto_archive}),a=vt({mutationFn:l=>Se.updatePrinter(t.id,l),onSuccess:()=>{n.invalidateQueries({queryKey:["printers"]}),n.invalidateQueries({queryKey:["printerStatus",t.id]}),e()}});M.useEffect(()=>{const l=c=>{c.key==="Escape"&&e()};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[e]);const s=l=>{l.preventDefault();const c={name:r.name,ip_address:r.ip_address,model:r.model||void 0,location:r.location||void 0,auto_archive:r.auto_archive};r.access_code&&(c.access_code=r.access_code),a.mutate(c)};return o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",onClick:e,children:o.jsx(wt,{className:"w-full max-w-md",onClick:l=>l.stopPropagation(),children:o.jsxs(Et,{children:[o.jsx("h2",{className:"text-xl font-semibold mb-4",children:"Edit Printer"}),o.jsxs("form",{onSubmit:s,className:"space-y-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Name"}),o.jsx("input",{type:"text",required:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.name,onChange:l=>i({...r,name:l.target.value}),placeholder:"My Printer"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"IP Address"}),o.jsx("input",{type:"text",required:!0,pattern:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.ip_address,onChange:l=>i({...r,ip_address:l.target.value}),placeholder:"192.168.1.100"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Serial Number"}),o.jsx("input",{type:"text",disabled:!0,className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-bambu-gray cursor-not-allowed",value:t.serial_number}),o.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Serial number cannot be changed"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Access Code"}),o.jsx("input",{type:"password",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.access_code,onChange:l=>i({...r,access_code:l.target.value}),placeholder:"Leave empty to keep current"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Model"}),o.jsxs("select",{className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.model,onChange:l=>i({...r,model:l.target.value}),children:[o.jsx("option",{value:"",children:"Select model..."}),o.jsxs("optgroup",{label:"H2 Series",children:[o.jsx("option",{value:"H2C",children:"H2C"}),o.jsx("option",{value:"H2D",children:"H2D"}),o.jsx("option",{value:"H2S",children:"H2S"})]}),o.jsxs("optgroup",{label:"X1 Series",children:[o.jsx("option",{value:"X1E",children:"X1E"}),o.jsx("option",{value:"X1C",children:"X1 Carbon"}),o.jsx("option",{value:"X1",children:"X1"})]}),o.jsxs("optgroup",{label:"P Series",children:[o.jsx("option",{value:"P2S",children:"P2S"}),o.jsx("option",{value:"P1S",children:"P1S"}),o.jsx("option",{value:"P1P",children:"P1P"})]}),o.jsxs("optgroup",{label:"A1 Series",children:[o.jsx("option",{value:"A1",children:"A1"}),o.jsx("option",{value:"A1 Mini",children:"A1 Mini"})]})]})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Location / Group"}),o.jsx("input",{type:"text",className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",value:r.location,onChange:l=>i({...r,location:l.target.value}),placeholder:"e.g., Workshop, Office, Basement"}),o.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:"Used to group printers on the dashboard"})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"checkbox",id:"edit_auto_archive",checked:r.auto_archive,onChange:l=>i({...r,auto_archive:l.target.checked}),className:"rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),o.jsx("label",{htmlFor:"edit_auto_archive",className:"text-sm text-bambu-gray",children:"Auto-archive completed prints"})]}),o.jsxs("div",{className:"flex gap-3 pt-4",children:[o.jsx(ke,{type:"button",variant:"secondary",onClick:e,className:"flex-1",children:"Cancel"}),o.jsx(ke,{type:"submit",className:"flex-1",disabled:a.isPending,children:a.isPending?"Saving...":"Save Changes"})]})]})]})})})}function JNe(t){const{data:e}=gt({queryKey:["printerStatus",t],queryFn:()=>Se.getPrinterStatus(t),refetchInterval:3e4});return!e?.connected}function eCe({printer:t,plug:e,onPowerOn:n,isPowering:r}){const i=JNe(t.id),{data:a}=gt({queryKey:["smartPlugStatus",e.id],queryFn:()=>Se.getSmartPlugStatus(e.id),refetchInterval:1e4});return i?o.jsxs("div",{className:"flex items-center justify-between px-3 py-2 hover:bg-gray-100 dark:hover:bg-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[o.jsx("span",{className:"text-sm text-gray-900 dark:text-white truncate",children:t.name}),a&&o.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded ${a.state==="ON"?"bg-bambu-green/20 text-bambu-green":"bg-red-500/20 text-red-400"}`,children:a.state||"?"})]}),o.jsxs("button",{onClick:()=>n(e.id),disabled:r||a?.state==="ON",className:`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${a?.state==="ON"?"bg-bambu-green/20 text-bambu-green cursor-default":"bg-bambu-green/20 text-bambu-green hover:bg-bambu-green hover:text-white"}`,children:[o.jsx(kl,{className:"w-3 h-3"}),r?"...":"On"]})]}):null}function tCe(){const[t,e]=M.useState(!1),[n,r]=M.useState(()=>localStorage.getItem("hideDisconnectedPrinters")==="true"),[i,a]=M.useState(!1),[s,l]=M.useState(null),[c,u]=M.useState(()=>localStorage.getItem("printerSortBy")||"name"),[d,f]=M.useState(()=>localStorage.getItem("printerSortAsc")!=="false"),[g,p]=M.useState(()=>localStorage.getItem("printerViewMode")||"expanded"),x=mn(),{data:v,isLoading:y}=gt({queryKey:["printers"],queryFn:Se.getPrinters}),{data:b}=gt({queryKey:["settings"],queryFn:Se.getSettings}),{data:E}=gt({queryKey:["smart-plugs"],queryFn:Se.getSmartPlugs}),{data:w}=gt({queryKey:["maintenanceOverview"],queryFn:Se.getMaintenanceOverview,staleTime:60*1e3}),T=w?.reduce((j,V)=>(j[V.printer_id]={due_count:V.due_count,warning_count:V.warning_count,total_print_hours:V.total_print_hours},j),{})||{},A=E?.reduce((j,V)=>(V.printer_id&&(j[V.printer_id]=V),j),{})||{},C=vt({mutationFn:Se.createPrinter,onSuccess:()=>{x.invalidateQueries({queryKey:["printers"]}),e(!1)}}),N=vt({mutationFn:j=>Se.controlSmartPlug(j,"on"),onSuccess:()=>{x.invalidateQueries({queryKey:["smart-plugs"]}),l(null)},onError:()=>{l(null)}}),F=()=>{const j=!n;r(j),localStorage.setItem("hideDisconnectedPrinters",String(j))},k=j=>{u(j),localStorage.setItem("printerSortBy",j)},R=()=>{const j=!d;f(j),localStorage.setItem("printerSortAsc",String(j))},I=()=>{const j=g==="expanded"?"compact":"expanded";p(j),localStorage.setItem("printerViewMode",j)},L=M.useMemo(()=>{if(!v)return[];const j=[...v];switch(c){case"name":j.sort((V,K)=>V.name.localeCompare(K.name));break;case"model":j.sort((V,K)=>(V.model||"").localeCompare(K.model||""));break;case"location":j.sort((V,K)=>{const W=V.location||"",J=K.location||"";return!W&&J?1:W&&!J?-1:W.localeCompare(J)||V.name.localeCompare(K.name)});break;case"status":j.sort((V,K)=>{const W=x.getQueryData(["printerStatus",V.id]),J=x.getQueryData(["printerStatus",K.id]),ee=Z=>Z?.connected?Z.state==="RUNNING"?0:1:2;return ee(W)-ee(J)});break}return d||j.reverse(),j},[v,c,d,x]),q=M.useMemo(()=>{if(c!=="location")return null;const j={};return L.forEach(V=>{const K=V.location||"Ungrouped";j[K]||(j[K]=[]),j[K].push(V)}),j},[c,L]);return o.jsxs("div",{className:"p-4 md:p-8",children:[o.jsxs("div",{className:"flex items-center justify-between mb-6",children:[o.jsxs("div",{children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:"Printers"}),o.jsx(YNe,{printers:v})]}),o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsxs("select",{value:c,onChange:j=>k(j.target.value),className:"text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg px-2 py-1.5 text-white focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"name",children:"Name"}),o.jsx("option",{value:"status",children:"Status"}),o.jsx("option",{value:"model",children:"Model"}),o.jsx("option",{value:"location",children:"Location"})]}),o.jsx("button",{onClick:R,className:"p-1.5 rounded-lg hover:bg-bambu-dark-tertiary transition-colors",title:d?"Sort descending":"Sort ascending",children:d?o.jsx(vp,{className:"w-4 h-4 text-bambu-gray"}):o.jsx(N0,{className:"w-4 h-4 text-bambu-gray"})})]}),o.jsx("button",{onClick:I,className:"p-1.5 rounded-lg hover:bg-bambu-dark-tertiary transition-colors",title:g==="expanded"?"Switch to compact view":"Switch to expanded view",children:g==="expanded"?o.jsx(xce,{className:"w-5 h-5 text-bambu-gray"}):o.jsx(QS,{className:"w-5 h-5 text-bambu-gray"})}),o.jsx("div",{className:"w-px h-6 bg-bambu-dark-tertiary"}),o.jsxs("label",{className:"flex items-center gap-2 text-sm text-bambu-gray cursor-pointer",children:[o.jsx("input",{type:"checkbox",checked:n,onChange:F,className:"rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"}),"Hide offline"]}),n&&Object.keys(A).length>0&&o.jsxs("div",{className:"relative",children:[o.jsxs("button",{onClick:()=>a(!i),className:"flex items-center gap-1.5 px-3 py-1.5 text-sm bg-white dark:bg-bambu-dark-secondary border border-gray-200 dark:border-bambu-dark-tertiary rounded-lg text-gray-600 dark:text-bambu-gray hover:text-gray-900 dark:hover:text-white hover:border-bambu-green transition-colors",children:[o.jsx(kl,{className:"w-4 h-4"}),"Power On",o.jsx(Cl,{className:`w-3 h-3 transition-transform ${i?"rotate-180":""}`})]}),i&&o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"fixed inset-0 z-10",onClick:()=>a(!1)}),o.jsxs("div",{className:"absolute right-0 mt-2 w-56 bg-white dark:bg-bambu-dark-secondary border border-gray-200 dark:border-bambu-dark-tertiary rounded-lg shadow-lg z-20 py-1",children:[o.jsx("div",{className:"px-3 py-2 text-xs text-gray-500 dark:text-bambu-gray border-b border-gray-200 dark:border-bambu-dark-tertiary",children:"Offline printers with smart plugs"}),v?.filter(j=>A[j.id]).map(j=>o.jsx(eCe,{printer:j,plug:A[j.id],onPowerOn:V=>{l(V),N.mutate(V)},isPowering:s===A[j.id]?.id},j.id)),v?.filter(j=>A[j.id]).length===0&&o.jsx("div",{className:"px-3 py-2 text-sm text-bambu-gray",children:"No printers with smart plugs"})]})]})]}),o.jsxs(ke,{onClick:()=>e(!0),children:[o.jsx(sr,{className:"w-4 h-4"}),"Add Printer"]})]})]}),y?o.jsx("div",{className:"text-center py-12 text-bambu-gray",children:"Loading printers..."}):v?.length===0?o.jsx(wt,{children:o.jsxs(Et,{className:"text-center py-12",children:[o.jsx("p",{className:"text-bambu-gray mb-4",children:"No printers configured yet"}),o.jsxs(ke,{onClick:()=>e(!0),children:[o.jsx(sr,{className:"w-4 h-4"}),"Add Your First Printer"]})]})}):q?o.jsx("div",{className:"space-y-6",children:Object.entries(q).map(([j,V])=>o.jsxs("div",{children:[o.jsxs("h2",{className:"text-lg font-semibold text-white mb-3 flex items-center gap-2",children:[o.jsx("span",{className:"w-2 h-2 rounded-full bg-bambu-green"}),j,o.jsxs("span",{className:"text-sm font-normal text-bambu-gray",children:["(",V.length,")"]})]}),o.jsx("div",{className:`grid gap-4 ${g==="compact"?"grid-cols-1 md:grid-cols-2 lg:grid-cols-4":"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"}`,children:V.map(K=>o.jsx(oH,{printer:K,hideIfDisconnected:n,maintenanceInfo:T[K.id],viewMode:g,amsThresholds:b?{humidityGood:Number(b.ams_humidity_good)||40,humidityFair:Number(b.ams_humidity_fair)||60,tempGood:Number(b.ams_temp_good)||28,tempFair:Number(b.ams_temp_fair)||35}:void 0},K.id))})]},j))}):o.jsx("div",{className:`grid gap-4 ${g==="compact"?"grid-cols-1 md:grid-cols-2 lg:grid-cols-4":"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"}`,children:L.map(j=>o.jsx(oH,{printer:j,hideIfDisconnected:n,maintenanceInfo:T[j.id],viewMode:g,amsThresholds:b?{humidityGood:Number(b.ams_humidity_good)||40,humidityFair:Number(b.ams_humidity_fair)||60,tempGood:Number(b.ams_temp_good)||28,tempFair:Number(b.ams_temp_fair)||35}:void 0},j.id))}),t&&o.jsx(ZNe,{onClose:()=>e(!1),onAdd:j=>C.mutate(j),existingSerials:v?.map(j=>j.serial_number)||[]})]})}function nCe(){const t=navigator.userAgent.toLowerCase(),e=navigator.platform?.toLowerCase()||"";return t.includes("win")||e.includes("win")?"windows":t.includes("mac")||e.includes("mac")?"macos":t.includes("linux")||e.includes("linux")?"linux":"unknown"}function rCe(){switch(nCe()){case"windows":return"bambustudio://";case"macos":case"linux":default:return"bambustudioopen://"}}function gh(t){const e=rCe();window.location.href=`${e}${encodeURIComponent(t)}`}const _O="181",dp={ROTATE:0,DOLLY:1,PAN:2},ip={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},iCe=0,lH=1,aCe=2,dZ=1,sCe=2,fc=3,wd=0,es=1,ll=2,jc=0,hp=1,cH=2,uH=3,dH=4,oCe=5,xh=100,lCe=101,cCe=102,uCe=103,dCe=104,hCe=200,fCe=201,mCe=202,pCe=203,aP=204,sP=205,gCe=206,xCe=207,bCe=208,yCe=209,vCe=210,_Ce=211,wCe=212,SCe=213,MCe=214,oP=0,lP=1,cP=2,Lp=3,uP=4,dP=5,hP=6,fP=7,wO=0,ECe=1,TCe=2,sd=0,ACe=1,NCe=2,CCe=3,kCe=4,PCe=5,jCe=6,RCe=7,hZ=300,Ip=301,Fp=302,mP=303,pP=304,YM=306,gP=1e3,Ec=1001,xP=1002,Cs=1003,DCe=1004,Gv=1005,so=1006,kN=1007,Ah=1008,Sl=1009,fZ=1010,mZ=1011,Y0=1012,SO=1013,cf=1014,Tc=1015,xg=1016,MO=1017,EO=1018,Z0=1020,pZ=35902,gZ=35899,xZ=1021,bZ=1022,Lo=1023,Q0=1026,J0=1027,yZ=1028,TO=1029,AO=1030,NO=1031,CO=1033,x1=33776,b1=33777,y1=33778,v1=33779,bP=35840,yP=35841,vP=35842,_P=35843,wP=36196,SP=37492,MP=37496,EP=37808,TP=37809,AP=37810,NP=37811,CP=37812,kP=37813,PP=37814,jP=37815,RP=37816,DP=37817,OP=37818,LP=37819,IP=37820,FP=37821,UP=36492,zP=36494,BP=36495,HP=36283,$P=36284,VP=36285,GP=36286,OCe=3200,LCe=3201,vZ=0,ICe=1,Ku="",Zs="srgb",Up="srgb-linear",zw="linear",Qn="srgb",um=7680,hH=519,FCe=512,UCe=513,zCe=514,_Z=515,BCe=516,HCe=517,$Ce=518,VCe=519,fH=35044,mH="300 es",hl=2e3,Bw=2001;function wZ(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}function Hw(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function GCe(){const t=Hw("canvas");return t.style.display="block",t}const pH={};function gH(...t){const e="THREE."+t.shift();console.log(e,...t)}function Zt(...t){const e="THREE."+t.shift();console.warn(e,...t)}function Zr(...t){const e="THREE."+t.shift();console.error(e,...t)}function eb(...t){const e=t.join(" ");e in pH||(pH[e]=!0,Zt(...t))}function WCe(t,e,n){return new Promise(function(r,i){function a(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:i();break;case t.TIMEOUT_EXPIRED:setTimeout(a,n);break;default:r()}}setTimeout(a,n)})}let Sf=class{addEventListener(e,n){this._listeners===void 0&&(this._listeners={});const r=this._listeners;r[e]===void 0&&(r[e]=[]),r[e].indexOf(n)===-1&&r[e].push(n)}hasEventListener(e,n){const r=this._listeners;return r===void 0?!1:r[e]!==void 0&&r[e].indexOf(n)!==-1}removeEventListener(e,n){const r=this._listeners;if(r===void 0)return;const i=r[e];if(i!==void 0){const a=i.indexOf(n);a!==-1&&i.splice(a,1)}}dispatchEvent(e){const n=this._listeners;if(n===void 0)return;const r=n[e.type];if(r!==void 0){e.target=this;const i=r.slice(0);for(let a=0,s=i.length;a>8&255]+ua[t>>16&255]+ua[t>>24&255]+"-"+ua[e&255]+ua[e>>8&255]+"-"+ua[e>>16&15|64]+ua[e>>24&255]+"-"+ua[n&63|128]+ua[n>>8&255]+"-"+ua[n>>16&255]+ua[n>>24&255]+ua[r&255]+ua[r>>8&255]+ua[r>>16&255]+ua[r>>24&255]).toLowerCase()}function yn(t,e,n){return Math.max(e,Math.min(n,t))}function qCe(t,e){return(t%e+e)%e}function PN(t,e,n){return(1-n)*t+n*e}function Tx(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function qa(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(t*4294967295);case Uint16Array:return Math.round(t*65535);case Uint8Array:return Math.round(t*255);case Int32Array:return Math.round(t*2147483647);case Int16Array:return Math.round(t*32767);case Int8Array:return Math.round(t*127);default:throw new Error("Invalid component type.")}}const KCe={DEG2RAD:_1};let dn=class SZ{constructor(e=0,n=0){SZ.prototype.isVector2=!0,this.x=e,this.y=n}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,n){return this.x=e,this.y=n,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const n=this.x,r=this.y,i=e.elements;return this.x=i[0]*n+i[3]*r+i[6],this.y=i[1]*n+i[4]*r+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,n){return this.x=yn(this.x,e.x,n.x),this.y=yn(this.y,e.y,n.y),this}clampScalar(e,n){return this.x=yn(this.x,e,n),this.y=yn(this.y,e,n),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(yn(r,e,n))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const n=Math.sqrt(this.lengthSq()*e.lengthSq());if(n===0)return Math.PI/2;const r=this.dot(e)/n;return Math.acos(yn(r,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y;return n*n+r*r}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e}fromBufferAttribute(e,n){return this.x=e.getX(n),this.y=e.getY(n),this}rotateAround(e,n){const r=Math.cos(n),i=Math.sin(n),a=this.x-e.x,s=this.y-e.y;return this.x=a*r-s*i+e.x,this.y=a*i+s*r+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}},uf=class{constructor(e=0,n=0,r=0,i=1){this.isQuaternion=!0,this._x=e,this._y=n,this._z=r,this._w=i}static slerpFlat(e,n,r,i,a,s,l){let c=r[i+0],u=r[i+1],d=r[i+2],f=r[i+3],g=a[s+0],p=a[s+1],x=a[s+2],v=a[s+3];if(l<=0){e[n+0]=c,e[n+1]=u,e[n+2]=d,e[n+3]=f;return}if(l>=1){e[n+0]=g,e[n+1]=p,e[n+2]=x,e[n+3]=v;return}if(f!==v||c!==g||u!==p||d!==x){let y=c*g+u*p+d*x+f*v;y<0&&(g=-g,p=-p,x=-x,v=-v,y=-y);let b=1-l;if(y<.9995){const E=Math.acos(y),w=Math.sin(E);b=Math.sin(b*E)/w,l=Math.sin(l*E)/w,c=c*b+g*l,u=u*b+p*l,d=d*b+x*l,f=f*b+v*l}else{c=c*b+g*l,u=u*b+p*l,d=d*b+x*l,f=f*b+v*l;const E=1/Math.sqrt(c*c+u*u+d*d+f*f);c*=E,u*=E,d*=E,f*=E}}e[n]=c,e[n+1]=u,e[n+2]=d,e[n+3]=f}static multiplyQuaternionsFlat(e,n,r,i,a,s){const l=r[i],c=r[i+1],u=r[i+2],d=r[i+3],f=a[s],g=a[s+1],p=a[s+2],x=a[s+3];return e[n]=l*x+d*f+c*p-u*g,e[n+1]=c*x+d*g+u*f-l*p,e[n+2]=u*x+d*p+l*g-c*f,e[n+3]=d*x-l*f-c*g-u*p,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,n,r,i){return this._x=e,this._y=n,this._z=r,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,n=!0){const r=e._x,i=e._y,a=e._z,s=e._order,l=Math.cos,c=Math.sin,u=l(r/2),d=l(i/2),f=l(a/2),g=c(r/2),p=c(i/2),x=c(a/2);switch(s){case"XYZ":this._x=g*d*f+u*p*x,this._y=u*p*f-g*d*x,this._z=u*d*x+g*p*f,this._w=u*d*f-g*p*x;break;case"YXZ":this._x=g*d*f+u*p*x,this._y=u*p*f-g*d*x,this._z=u*d*x-g*p*f,this._w=u*d*f+g*p*x;break;case"ZXY":this._x=g*d*f-u*p*x,this._y=u*p*f+g*d*x,this._z=u*d*x+g*p*f,this._w=u*d*f-g*p*x;break;case"ZYX":this._x=g*d*f-u*p*x,this._y=u*p*f+g*d*x,this._z=u*d*x-g*p*f,this._w=u*d*f+g*p*x;break;case"YZX":this._x=g*d*f+u*p*x,this._y=u*p*f+g*d*x,this._z=u*d*x-g*p*f,this._w=u*d*f-g*p*x;break;case"XZY":this._x=g*d*f-u*p*x,this._y=u*p*f-g*d*x,this._z=u*d*x+g*p*f,this._w=u*d*f+g*p*x;break;default:Zt("Quaternion: .setFromEuler() encountered an unknown order: "+s)}return n===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,n){const r=n/2,i=Math.sin(r);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(r),this._onChangeCallback(),this}setFromRotationMatrix(e){const n=e.elements,r=n[0],i=n[4],a=n[8],s=n[1],l=n[5],c=n[9],u=n[2],d=n[6],f=n[10],g=r+l+f;if(g>0){const p=.5/Math.sqrt(g+1);this._w=.25/p,this._x=(d-c)*p,this._y=(a-u)*p,this._z=(s-i)*p}else if(r>l&&r>f){const p=2*Math.sqrt(1+r-l-f);this._w=(d-c)/p,this._x=.25*p,this._y=(i+s)/p,this._z=(a+u)/p}else if(l>f){const p=2*Math.sqrt(1+l-r-f);this._w=(a-u)/p,this._x=(i+s)/p,this._y=.25*p,this._z=(c+d)/p}else{const p=2*Math.sqrt(1+f-r-l);this._w=(s-i)/p,this._x=(a+u)/p,this._y=(c+d)/p,this._z=.25*p}return this._onChangeCallback(),this}setFromUnitVectors(e,n){let r=e.dot(n)+1;return r<1e-8?(r=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=r):(this._x=0,this._y=-e.z,this._z=e.y,this._w=r)):(this._x=e.y*n.z-e.z*n.y,this._y=e.z*n.x-e.x*n.z,this._z=e.x*n.y-e.y*n.x,this._w=r),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(yn(this.dot(e),-1,1)))}rotateTowards(e,n){const r=this.angleTo(e);if(r===0)return this;const i=Math.min(1,n/r);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,n){const r=e._x,i=e._y,a=e._z,s=e._w,l=n._x,c=n._y,u=n._z,d=n._w;return this._x=r*d+s*l+i*u-a*c,this._y=i*d+s*c+a*l-r*u,this._z=a*d+s*u+r*c-i*l,this._w=s*d-r*l-i*c-a*u,this._onChangeCallback(),this}slerp(e,n){if(n<=0)return this;if(n>=1)return this.copy(e);let r=e._x,i=e._y,a=e._z,s=e._w,l=this.dot(e);l<0&&(r=-r,i=-i,a=-a,s=-s,l=-l);let c=1-n;if(l<.9995){const u=Math.acos(l),d=Math.sin(u);c=Math.sin(c*u)/d,n=Math.sin(n*u)/d,this._x=this._x*c+r*n,this._y=this._y*c+i*n,this._z=this._z*c+a*n,this._w=this._w*c+s*n,this._onChangeCallback()}else this._x=this._x*c+r*n,this._y=this._y*c+i*n,this._z=this._z*c+a*n,this._w=this._w*c+s*n,this.normalize();return this}slerpQuaternions(e,n,r){return this.copy(e).slerp(n,r)}random(){const e=2*Math.PI*Math.random(),n=2*Math.PI*Math.random(),r=Math.random(),i=Math.sqrt(1-r),a=Math.sqrt(r);return this.set(i*Math.sin(e),i*Math.cos(e),a*Math.sin(n),a*Math.cos(n))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,n=0){return this._x=e[n],this._y=e[n+1],this._z=e[n+2],this._w=e[n+3],this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._w,e}fromBufferAttribute(e,n){return this._x=e.getX(n),this._y=e.getY(n),this._z=e.getZ(n),this._w=e.getW(n),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}},it=class MZ{constructor(e=0,n=0,r=0){MZ.prototype.isVector3=!0,this.x=e,this.y=n,this.z=r}set(e,n,r){return r===void 0&&(r=this.z),this.x=e,this.y=n,this.z=r,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,n){return this.x=e.x*n.x,this.y=e.y*n.y,this.z=e.z*n.z,this}applyEuler(e){return this.applyQuaternion(xH.setFromEuler(e))}applyAxisAngle(e,n){return this.applyQuaternion(xH.setFromAxisAngle(e,n))}applyMatrix3(e){const n=this.x,r=this.y,i=this.z,a=e.elements;return this.x=a[0]*n+a[3]*r+a[6]*i,this.y=a[1]*n+a[4]*r+a[7]*i,this.z=a[2]*n+a[5]*r+a[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,a=e.elements,s=1/(a[3]*n+a[7]*r+a[11]*i+a[15]);return this.x=(a[0]*n+a[4]*r+a[8]*i+a[12])*s,this.y=(a[1]*n+a[5]*r+a[9]*i+a[13])*s,this.z=(a[2]*n+a[6]*r+a[10]*i+a[14])*s,this}applyQuaternion(e){const n=this.x,r=this.y,i=this.z,a=e.x,s=e.y,l=e.z,c=e.w,u=2*(s*i-l*r),d=2*(l*n-a*i),f=2*(a*r-s*n);return this.x=n+c*u+s*f-l*d,this.y=r+c*d+l*u-a*f,this.z=i+c*f+a*d-s*u,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const n=this.x,r=this.y,i=this.z,a=e.elements;return this.x=a[0]*n+a[4]*r+a[8]*i,this.y=a[1]*n+a[5]*r+a[9]*i,this.z=a[2]*n+a[6]*r+a[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,n){return this.x=yn(this.x,e.x,n.x),this.y=yn(this.y,e.y,n.y),this.z=yn(this.z,e.z,n.z),this}clampScalar(e,n){return this.x=yn(this.x,e,n),this.y=yn(this.y,e,n),this.z=yn(this.z,e,n),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(yn(r,e,n))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,n){const r=e.x,i=e.y,a=e.z,s=n.x,l=n.y,c=n.z;return this.x=i*c-a*l,this.y=a*s-r*c,this.z=r*l-i*s,this}projectOnVector(e){const n=e.lengthSq();if(n===0)return this.set(0,0,0);const r=e.dot(this)/n;return this.copy(e).multiplyScalar(r)}projectOnPlane(e){return jN.copy(this).projectOnVector(e),this.sub(jN)}reflect(e){return this.sub(jN.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const n=Math.sqrt(this.lengthSq()*e.lengthSq());if(n===0)return Math.PI/2;const r=this.dot(e)/n;return Math.acos(yn(r,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const n=this.x-e.x,r=this.y-e.y,i=this.z-e.z;return n*n+r*r+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,n,r){const i=Math.sin(n)*e;return this.x=i*Math.sin(r),this.y=Math.cos(n)*e,this.z=i*Math.cos(r),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,n,r){return this.x=e*Math.sin(n),this.y=r,this.z=e*Math.cos(n),this}setFromMatrixPosition(e){const n=e.elements;return this.x=n[12],this.y=n[13],this.z=n[14],this}setFromMatrixScale(e){const n=this.setFromMatrixColumn(e,0).length(),r=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=n,this.y=r,this.z=i,this}setFromMatrixColumn(e,n){return this.fromArray(e.elements,n*4)}setFromMatrix3Column(e,n){return this.fromArray(e.elements,n*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e}fromBufferAttribute(e,n){return this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,n=Math.random()*2-1,r=Math.sqrt(1-n*n);return this.x=r*Math.cos(e),this.y=n,this.z=r*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}};const jN=new it,xH=new uf;let fn=class EZ{constructor(e,n,r,i,a,s,l,c,u){EZ.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,n,r,i,a,s,l,c,u)}set(e,n,r,i,a,s,l,c,u){const d=this.elements;return d[0]=e,d[1]=i,d[2]=l,d[3]=n,d[4]=a,d[5]=c,d[6]=r,d[7]=s,d[8]=u,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],this}extractBasis(e,n,r){return e.setFromMatrix3Column(this,0),n.setFromMatrix3Column(this,1),r.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const n=e.elements;return this.set(n[0],n[4],n[8],n[1],n[5],n[9],n[2],n[6],n[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,a=this.elements,s=r[0],l=r[3],c=r[6],u=r[1],d=r[4],f=r[7],g=r[2],p=r[5],x=r[8],v=i[0],y=i[3],b=i[6],E=i[1],w=i[4],T=i[7],A=i[2],C=i[5],N=i[8];return a[0]=s*v+l*E+c*A,a[3]=s*y+l*w+c*C,a[6]=s*b+l*T+c*N,a[1]=u*v+d*E+f*A,a[4]=u*y+d*w+f*C,a[7]=u*b+d*T+f*N,a[2]=g*v+p*E+x*A,a[5]=g*y+p*w+x*C,a[8]=g*b+p*T+x*N,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[3]*=e,n[6]*=e,n[1]*=e,n[4]*=e,n[7]*=e,n[2]*=e,n[5]*=e,n[8]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[1],i=e[2],a=e[3],s=e[4],l=e[5],c=e[6],u=e[7],d=e[8];return n*s*d-n*l*u-r*a*d+r*l*c+i*a*u-i*s*c}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],a=e[3],s=e[4],l=e[5],c=e[6],u=e[7],d=e[8],f=d*s-l*u,g=l*c-d*a,p=u*a-s*c,x=n*f+r*g+i*p;if(x===0)return this.set(0,0,0,0,0,0,0,0,0);const v=1/x;return e[0]=f*v,e[1]=(i*u-d*r)*v,e[2]=(l*r-i*s)*v,e[3]=g*v,e[4]=(d*n-i*c)*v,e[5]=(i*a-l*n)*v,e[6]=p*v,e[7]=(r*c-u*n)*v,e[8]=(s*n-r*a)*v,this}transpose(){let e;const n=this.elements;return e=n[1],n[1]=n[3],n[3]=e,e=n[2],n[2]=n[6],n[6]=e,e=n[5],n[5]=n[7],n[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const n=this.elements;return e[0]=n[0],e[1]=n[3],e[2]=n[6],e[3]=n[1],e[4]=n[4],e[5]=n[7],e[6]=n[2],e[7]=n[5],e[8]=n[8],this}setUvTransform(e,n,r,i,a,s,l){const c=Math.cos(a),u=Math.sin(a);return this.set(r*c,r*u,-r*(c*s+u*l)+s+e,-i*u,i*c,-i*(-u*s+c*l)+l+n,0,0,1),this}scale(e,n){return this.premultiply(RN.makeScale(e,n)),this}rotate(e){return this.premultiply(RN.makeRotation(-e)),this}translate(e,n){return this.premultiply(RN.makeTranslation(e,n)),this}makeTranslation(e,n){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,n,0,0,1),this}makeRotation(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,-r,0,r,n,0,0,0,1),this}makeScale(e,n){return this.set(e,0,0,0,n,0,0,0,1),this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<9;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<9;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e}clone(){return new this.constructor().fromArray(this.elements)}};const RN=new fn,bH=new fn().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),yH=new fn().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function XCe(){const t={enabled:!0,workingColorSpace:Up,spaces:{},convert:function(i,a,s){return this.enabled===!1||a===s||!a||!s||(this.spaces[a].transfer===Qn&&(i.r=Rc(i.r),i.g=Rc(i.g),i.b=Rc(i.b)),this.spaces[a].primaries!==this.spaces[s].primaries&&(i.applyMatrix3(this.spaces[a].toXYZ),i.applyMatrix3(this.spaces[s].fromXYZ)),this.spaces[s].transfer===Qn&&(i.r=fp(i.r),i.g=fp(i.g),i.b=fp(i.b))),i},workingToColorSpace:function(i,a){return this.convert(i,this.workingColorSpace,a)},colorSpaceToWorking:function(i,a){return this.convert(i,a,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===Ku?zw:this.spaces[i].transfer},getToneMappingMode:function(i){return this.spaces[i].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(i,a=this.workingColorSpace){return i.fromArray(this.spaces[a].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,a,s){return i.copy(this.spaces[a].toXYZ).multiply(this.spaces[s].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(i,a){return eb("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(i,a)},toWorkingColorSpace:function(i,a){return eb("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(i,a)}},e=[.64,.33,.3,.6,.15,.06],n=[.2126,.7152,.0722],r=[.3127,.329];return t.define({[Up]:{primaries:e,whitePoint:r,transfer:zw,toXYZ:bH,fromXYZ:yH,luminanceCoefficients:n,workingColorSpaceConfig:{unpackColorSpace:Zs},outputColorSpaceConfig:{drawingBufferColorSpace:Zs}},[Zs]:{primaries:e,whitePoint:r,transfer:Qn,toXYZ:bH,fromXYZ:yH,luminanceCoefficients:n,outputColorSpaceConfig:{drawingBufferColorSpace:Zs}}}),t}const Dn=XCe();function Rc(t){return t<.04045?t*.0773993808:Math.pow(t*.9478672986+.0521327014,2.4)}function fp(t){return t<.0031308?t*12.92:1.055*Math.pow(t,.41666)-.055}let dm,YCe=class{static getDataURL(e,n="image/png"){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let r;if(e instanceof HTMLCanvasElement)r=e;else{dm===void 0&&(dm=Hw("canvas")),dm.width=e.width,dm.height=e.height;const i=dm.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),r=dm}return r.toDataURL(n)}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const n=Hw("canvas");n.width=e.width,n.height=e.height;const r=n.getContext("2d");r.drawImage(e,0,0,e.width,e.height);const i=r.getImageData(0,0,e.width,e.height),a=i.data;for(let s=0;s1),this.pmremVersion=0}get width(){return this.source.getSize(ON).x}get height(){return this.source.getSize(ON).y}get depth(){return this.source.getSize(ON).z}get image(){return this.source.data}set image(e=null){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,n){this.updateRanges.push({start:e,count:n})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(const n in e){const r=e[n];if(r===void 0){Zt(`Texture.setValues(): parameter '${n}' has value of undefined.`);continue}const i=this[n];if(i===void 0){Zt(`Texture.setValues(): property '${n}' does not exist.`);continue}i&&r&&i.isVector2&&r.isVector2||i&&r&&i.isVector3&&r.isVector3||i&&r&&i.isMatrix3&&r.isMatrix3?i.copy(r):this[n]=r}}toJSON(e){const n=e===void 0||typeof e=="string";if(!n&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];const r={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(r.userData=this.userData),n||(e.textures[this.uuid]=r),r}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==hZ)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case gP:e.x=e.x-Math.floor(e.x);break;case Ec:e.x=e.x<0?0:1;break;case xP:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case gP:e.y=e.y-Math.floor(e.y);break;case Ec:e.y=e.y<0?0:1;break;case xP:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}};qo.DEFAULT_IMAGE=null;qo.DEFAULT_MAPPING=hZ;qo.DEFAULT_ANISOTROPY=1;let li=class TZ{constructor(e=0,n=0,r=0,i=1){TZ.prototype.isVector4=!0,this.x=e,this.y=n,this.z=r,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,n,r,i){return this.x=e,this.y=n,this.z=r,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,n){switch(e){case 0:this.x=n;break;case 1:this.y=n;break;case 2:this.z=n;break;case 3:this.w=n;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this.w=e.w+n.w,this}addScaledVector(e,n){return this.x+=e.x*n,this.y+=e.y*n,this.z+=e.z*n,this.w+=e.w*n,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this.w=e.w-n.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const n=this.x,r=this.y,i=this.z,a=this.w,s=e.elements;return this.x=s[0]*n+s[4]*r+s[8]*i+s[12]*a,this.y=s[1]*n+s[5]*r+s[9]*i+s[13]*a,this.z=s[2]*n+s[6]*r+s[10]*i+s[14]*a,this.w=s[3]*n+s[7]*r+s[11]*i+s[15]*a,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const n=Math.sqrt(1-e.w*e.w);return n<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/n,this.y=e.y/n,this.z=e.z/n),this}setAxisAngleFromRotationMatrix(e){let n,r,i,a;const c=e.elements,u=c[0],d=c[4],f=c[8],g=c[1],p=c[5],x=c[9],v=c[2],y=c[6],b=c[10];if(Math.abs(d-g)<.01&&Math.abs(f-v)<.01&&Math.abs(x-y)<.01){if(Math.abs(d+g)<.1&&Math.abs(f+v)<.1&&Math.abs(x+y)<.1&&Math.abs(u+p+b-3)<.1)return this.set(1,0,0,0),this;n=Math.PI;const w=(u+1)/2,T=(p+1)/2,A=(b+1)/2,C=(d+g)/4,N=(f+v)/4,F=(x+y)/4;return w>T&&w>A?w<.01?(r=0,i=.707106781,a=.707106781):(r=Math.sqrt(w),i=C/r,a=N/r):T>A?T<.01?(r=.707106781,i=0,a=.707106781):(i=Math.sqrt(T),r=C/i,a=F/i):A<.01?(r=.707106781,i=.707106781,a=0):(a=Math.sqrt(A),r=N/a,i=F/a),this.set(r,i,a,n),this}let E=Math.sqrt((y-x)*(y-x)+(f-v)*(f-v)+(g-d)*(g-d));return Math.abs(E)<.001&&(E=1),this.x=(y-x)/E,this.y=(f-v)/E,this.z=(g-d)/E,this.w=Math.acos((u+p+b-1)/2),this}setFromMatrixPosition(e){const n=e.elements;return this.x=n[12],this.y=n[13],this.z=n[14],this.w=n[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,n){return this.x=yn(this.x,e.x,n.x),this.y=yn(this.y,e.y,n.y),this.z=yn(this.z,e.z,n.z),this.w=yn(this.w,e.w,n.w),this}clampScalar(e,n){return this.x=yn(this.x,e,n),this.y=yn(this.y,e,n),this.z=yn(this.z,e,n),this.w=yn(this.w,e,n),this}clampLength(e,n){const r=this.length();return this.divideScalar(r||1).multiplyScalar(yn(r,e,n))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,n){return this.x+=(e.x-this.x)*n,this.y+=(e.y-this.y)*n,this.z+=(e.z-this.z)*n,this.w+=(e.w-this.w)*n,this}lerpVectors(e,n,r){return this.x=e.x+(n.x-e.x)*r,this.y=e.y+(n.y-e.y)*r,this.z=e.z+(n.z-e.z)*r,this.w=e.w+(n.w-e.w)*r,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,n=0){return this.x=e[n],this.y=e[n+1],this.z=e[n+2],this.w=e[n+3],this}toArray(e=[],n=0){return e[n]=this.x,e[n+1]=this.y,e[n+2]=this.z,e[n+3]=this.w,e}fromBufferAttribute(e,n){return this.x=e.getX(n),this.y=e.getY(n),this.z=e.getZ(n),this.w=e.getW(n),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}},JCe=class extends Sf{constructor(e=1,n=1,r={}){super(),r=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:so,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1},r),this.isRenderTarget=!0,this.width=e,this.height=n,this.depth=r.depth,this.scissor=new li(0,0,e,n),this.scissorTest=!1,this.viewport=new li(0,0,e,n);const i={width:e,height:n,depth:r.depth},a=new qo(i);this.textures=[];const s=r.count;for(let l=0;l1);this.dispose()}this.viewport.set(0,0,e,n),this.scissor.set(0,0,e,n)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let n=0,r=e.textures.length;n=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,n){return n.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,Mo),Mo.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let n,r;return e.normal.x>0?(n=e.normal.x*this.min.x,r=e.normal.x*this.max.x):(n=e.normal.x*this.max.x,r=e.normal.x*this.min.x),e.normal.y>0?(n+=e.normal.y*this.min.y,r+=e.normal.y*this.max.y):(n+=e.normal.y*this.max.y,r+=e.normal.y*this.min.y),e.normal.z>0?(n+=e.normal.z*this.min.z,r+=e.normal.z*this.max.z):(n+=e.normal.z*this.max.z,r+=e.normal.z*this.min.z),n<=-e.constant&&r>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(Ax),qv.subVectors(this.max,Ax),hm.subVectors(e.a,Ax),fm.subVectors(e.b,Ax),mm.subVectors(e.c,Ax),Mu.subVectors(fm,hm),Eu.subVectors(mm,fm),Qd.subVectors(hm,mm);let n=[0,-Mu.z,Mu.y,0,-Eu.z,Eu.y,0,-Qd.z,Qd.y,Mu.z,0,-Mu.x,Eu.z,0,-Eu.x,Qd.z,0,-Qd.x,-Mu.y,Mu.x,0,-Eu.y,Eu.x,0,-Qd.y,Qd.x,0];return!LN(n,hm,fm,mm,qv)||(n=[1,0,0,0,1,0,0,0,1],!LN(n,hm,fm,mm,qv))?!1:(Kv.crossVectors(Mu,Eu),n=[Kv.x,Kv.y,Kv.z],LN(n,hm,fm,mm,qv))}clampPoint(e,n){return n.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,Mo).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(Mo).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(Jl[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),Jl[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),Jl[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),Jl[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),Jl[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),Jl[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),Jl[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),Jl[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(Jl),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}};const Jl=[new it,new it,new it,new it,new it,new it,new it,new it],Mo=new it,Wv=new hf,hm=new it,fm=new it,mm=new it,Mu=new it,Eu=new it,Qd=new it,Ax=new it,qv=new it,Kv=new it,Jd=new it;function LN(t,e,n,r,i){for(let a=0,s=t.length-3;a<=s;a+=3){Jd.fromArray(t,a);const l=i.x*Math.abs(Jd.x)+i.y*Math.abs(Jd.y)+i.z*Math.abs(Jd.z),c=e.dot(Jd),u=n.dot(Jd),d=r.dot(Jd);if(Math.max(-Math.max(c,u,d),Math.min(c,u,d))>l)return!1}return!0}const tke=new hf,Nx=new it,IN=new it;let ZM=class{constructor(e=new it,n=-1){this.isSphere=!0,this.center=e,this.radius=n}set(e,n){return this.center.copy(e),this.radius=n,this}setFromPoints(e,n){const r=this.center;n!==void 0?r.copy(n):tke.setFromPoints(e).getCenter(r);let i=0;for(let a=0,s=e.length;athis.radius*this.radius&&(n.sub(this.center).normalize(),n.multiplyScalar(this.radius).add(this.center)),n}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;Nx.subVectors(e,this.center);const n=Nx.lengthSq();if(n>this.radius*this.radius){const r=Math.sqrt(n),i=(r-this.radius)*.5;this.center.addScaledVector(Nx,i/r),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(IN.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(Nx.copy(e.center).add(IN)),this.expandByPoint(Nx.copy(e.center).sub(IN))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}};const ec=new it,FN=new it,Xv=new it,Tu=new it,UN=new it,Yv=new it,zN=new it;let PO=class{constructor(e=new it,n=new it(0,0,-1)){this.origin=e,this.direction=n}set(e,n){return this.origin.copy(e),this.direction.copy(n),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,n){return n.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,ec)),this}closestPointToPoint(e,n){n.subVectors(e,this.origin);const r=n.dot(this.direction);return r<0?n.copy(this.origin):n.copy(this.origin).addScaledVector(this.direction,r)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const n=ec.subVectors(e,this.origin).dot(this.direction);return n<0?this.origin.distanceToSquared(e):(ec.copy(this.origin).addScaledVector(this.direction,n),ec.distanceToSquared(e))}distanceSqToSegment(e,n,r,i){FN.copy(e).add(n).multiplyScalar(.5),Xv.copy(n).sub(e).normalize(),Tu.copy(this.origin).sub(FN);const a=e.distanceTo(n)*.5,s=-this.direction.dot(Xv),l=Tu.dot(this.direction),c=-Tu.dot(Xv),u=Tu.lengthSq(),d=Math.abs(1-s*s);let f,g,p,x;if(d>0)if(f=s*c-l,g=s*l-c,x=a*d,f>=0)if(g>=-x)if(g<=x){const v=1/d;f*=v,g*=v,p=f*(f+s*g+2*l)+g*(s*f+g+2*c)+u}else g=a,f=Math.max(0,-(s*g+l)),p=-f*f+g*(g+2*c)+u;else g=-a,f=Math.max(0,-(s*g+l)),p=-f*f+g*(g+2*c)+u;else g<=-x?(f=Math.max(0,-(-s*a+l)),g=f>0?-a:Math.min(Math.max(-a,-c),a),p=-f*f+g*(g+2*c)+u):g<=x?(f=0,g=Math.min(Math.max(-a,-c),a),p=g*(g+2*c)+u):(f=Math.max(0,-(s*a+l)),g=f>0?a:Math.min(Math.max(-a,-c),a),p=-f*f+g*(g+2*c)+u);else g=s>0?-a:a,f=Math.max(0,-(s*g+l)),p=-f*f+g*(g+2*c)+u;return r&&r.copy(this.origin).addScaledVector(this.direction,f),i&&i.copy(FN).addScaledVector(Xv,g),p}intersectSphere(e,n){ec.subVectors(e.center,this.origin);const r=ec.dot(this.direction),i=ec.dot(ec)-r*r,a=e.radius*e.radius;if(i>a)return null;const s=Math.sqrt(a-i),l=r-s,c=r+s;return c<0?null:l<0?this.at(c,n):this.at(l,n)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const n=e.normal.dot(this.direction);if(n===0)return e.distanceToPoint(this.origin)===0?0:null;const r=-(this.origin.dot(e.normal)+e.constant)/n;return r>=0?r:null}intersectPlane(e,n){const r=this.distanceToPlane(e);return r===null?null:this.at(r,n)}intersectsPlane(e){const n=e.distanceToPoint(this.origin);return n===0||e.normal.dot(this.direction)*n<0}intersectBox(e,n){let r,i,a,s,l,c;const u=1/this.direction.x,d=1/this.direction.y,f=1/this.direction.z,g=this.origin;return u>=0?(r=(e.min.x-g.x)*u,i=(e.max.x-g.x)*u):(r=(e.max.x-g.x)*u,i=(e.min.x-g.x)*u),d>=0?(a=(e.min.y-g.y)*d,s=(e.max.y-g.y)*d):(a=(e.max.y-g.y)*d,s=(e.min.y-g.y)*d),r>s||a>i||((a>r||isNaN(r))&&(r=a),(s=0?(l=(e.min.z-g.z)*f,c=(e.max.z-g.z)*f):(l=(e.max.z-g.z)*f,c=(e.min.z-g.z)*f),r>c||l>i)||((l>r||r!==r)&&(r=l),(c=0?r:i,n)}intersectsBox(e){return this.intersectBox(e,ec)!==null}intersectTriangle(e,n,r,i,a){UN.subVectors(n,e),Yv.subVectors(r,e),zN.crossVectors(UN,Yv);let s=this.direction.dot(zN),l;if(s>0){if(i)return null;l=1}else if(s<0)l=-1,s=-s;else return null;Tu.subVectors(this.origin,e);const c=l*this.direction.dot(Yv.crossVectors(Tu,Yv));if(c<0)return null;const u=l*this.direction.dot(UN.cross(Tu));if(u<0||c+u>s)return null;const d=-l*Tu.dot(zN);return d<0?null:this.at(d/s,a)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}},hi=class qP{constructor(e,n,r,i,a,s,l,c,u,d,f,g,p,x,v,y){qP.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,n,r,i,a,s,l,c,u,d,f,g,p,x,v,y)}set(e,n,r,i,a,s,l,c,u,d,f,g,p,x,v,y){const b=this.elements;return b[0]=e,b[4]=n,b[8]=r,b[12]=i,b[1]=a,b[5]=s,b[9]=l,b[13]=c,b[2]=u,b[6]=d,b[10]=f,b[14]=g,b[3]=p,b[7]=x,b[11]=v,b[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new qP().fromArray(this.elements)}copy(e){const n=this.elements,r=e.elements;return n[0]=r[0],n[1]=r[1],n[2]=r[2],n[3]=r[3],n[4]=r[4],n[5]=r[5],n[6]=r[6],n[7]=r[7],n[8]=r[8],n[9]=r[9],n[10]=r[10],n[11]=r[11],n[12]=r[12],n[13]=r[13],n[14]=r[14],n[15]=r[15],this}copyPosition(e){const n=this.elements,r=e.elements;return n[12]=r[12],n[13]=r[13],n[14]=r[14],this}setFromMatrix3(e){const n=e.elements;return this.set(n[0],n[3],n[6],0,n[1],n[4],n[7],0,n[2],n[5],n[8],0,0,0,0,1),this}extractBasis(e,n,r){return e.setFromMatrixColumn(this,0),n.setFromMatrixColumn(this,1),r.setFromMatrixColumn(this,2),this}makeBasis(e,n,r){return this.set(e.x,n.x,r.x,0,e.y,n.y,r.y,0,e.z,n.z,r.z,0,0,0,0,1),this}extractRotation(e){const n=this.elements,r=e.elements,i=1/pm.setFromMatrixColumn(e,0).length(),a=1/pm.setFromMatrixColumn(e,1).length(),s=1/pm.setFromMatrixColumn(e,2).length();return n[0]=r[0]*i,n[1]=r[1]*i,n[2]=r[2]*i,n[3]=0,n[4]=r[4]*a,n[5]=r[5]*a,n[6]=r[6]*a,n[7]=0,n[8]=r[8]*s,n[9]=r[9]*s,n[10]=r[10]*s,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromEuler(e){const n=this.elements,r=e.x,i=e.y,a=e.z,s=Math.cos(r),l=Math.sin(r),c=Math.cos(i),u=Math.sin(i),d=Math.cos(a),f=Math.sin(a);if(e.order==="XYZ"){const g=s*d,p=s*f,x=l*d,v=l*f;n[0]=c*d,n[4]=-c*f,n[8]=u,n[1]=p+x*u,n[5]=g-v*u,n[9]=-l*c,n[2]=v-g*u,n[6]=x+p*u,n[10]=s*c}else if(e.order==="YXZ"){const g=c*d,p=c*f,x=u*d,v=u*f;n[0]=g+v*l,n[4]=x*l-p,n[8]=s*u,n[1]=s*f,n[5]=s*d,n[9]=-l,n[2]=p*l-x,n[6]=v+g*l,n[10]=s*c}else if(e.order==="ZXY"){const g=c*d,p=c*f,x=u*d,v=u*f;n[0]=g-v*l,n[4]=-s*f,n[8]=x+p*l,n[1]=p+x*l,n[5]=s*d,n[9]=v-g*l,n[2]=-s*u,n[6]=l,n[10]=s*c}else if(e.order==="ZYX"){const g=s*d,p=s*f,x=l*d,v=l*f;n[0]=c*d,n[4]=x*u-p,n[8]=g*u+v,n[1]=c*f,n[5]=v*u+g,n[9]=p*u-x,n[2]=-u,n[6]=l*c,n[10]=s*c}else if(e.order==="YZX"){const g=s*c,p=s*u,x=l*c,v=l*u;n[0]=c*d,n[4]=v-g*f,n[8]=x*f+p,n[1]=f,n[5]=s*d,n[9]=-l*d,n[2]=-u*d,n[6]=p*f+x,n[10]=g-v*f}else if(e.order==="XZY"){const g=s*c,p=s*u,x=l*c,v=l*u;n[0]=c*d,n[4]=-f,n[8]=u*d,n[1]=g*f+v,n[5]=s*d,n[9]=p*f-x,n[2]=x*f-p,n[6]=l*d,n[10]=v*f+g}return n[3]=0,n[7]=0,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,this}makeRotationFromQuaternion(e){return this.compose(nke,e,rke)}lookAt(e,n,r){const i=this.elements;return xs.subVectors(e,n),xs.lengthSq()===0&&(xs.z=1),xs.normalize(),Au.crossVectors(r,xs),Au.lengthSq()===0&&(Math.abs(r.z)===1?xs.x+=1e-4:xs.z+=1e-4,xs.normalize(),Au.crossVectors(r,xs)),Au.normalize(),Zv.crossVectors(xs,Au),i[0]=Au.x,i[4]=Zv.x,i[8]=xs.x,i[1]=Au.y,i[5]=Zv.y,i[9]=xs.y,i[2]=Au.z,i[6]=Zv.z,i[10]=xs.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,n){const r=e.elements,i=n.elements,a=this.elements,s=r[0],l=r[4],c=r[8],u=r[12],d=r[1],f=r[5],g=r[9],p=r[13],x=r[2],v=r[6],y=r[10],b=r[14],E=r[3],w=r[7],T=r[11],A=r[15],C=i[0],N=i[4],F=i[8],k=i[12],R=i[1],I=i[5],L=i[9],q=i[13],j=i[2],V=i[6],K=i[10],W=i[14],J=i[3],ee=i[7],Z=i[11],B=i[15];return a[0]=s*C+l*R+c*j+u*J,a[4]=s*N+l*I+c*V+u*ee,a[8]=s*F+l*L+c*K+u*Z,a[12]=s*k+l*q+c*W+u*B,a[1]=d*C+f*R+g*j+p*J,a[5]=d*N+f*I+g*V+p*ee,a[9]=d*F+f*L+g*K+p*Z,a[13]=d*k+f*q+g*W+p*B,a[2]=x*C+v*R+y*j+b*J,a[6]=x*N+v*I+y*V+b*ee,a[10]=x*F+v*L+y*K+b*Z,a[14]=x*k+v*q+y*W+b*B,a[3]=E*C+w*R+T*j+A*J,a[7]=E*N+w*I+T*V+A*ee,a[11]=E*F+w*L+T*K+A*Z,a[15]=E*k+w*q+T*W+A*B,this}multiplyScalar(e){const n=this.elements;return n[0]*=e,n[4]*=e,n[8]*=e,n[12]*=e,n[1]*=e,n[5]*=e,n[9]*=e,n[13]*=e,n[2]*=e,n[6]*=e,n[10]*=e,n[14]*=e,n[3]*=e,n[7]*=e,n[11]*=e,n[15]*=e,this}determinant(){const e=this.elements,n=e[0],r=e[4],i=e[8],a=e[12],s=e[1],l=e[5],c=e[9],u=e[13],d=e[2],f=e[6],g=e[10],p=e[14],x=e[3],v=e[7],y=e[11],b=e[15];return x*(+a*c*f-i*u*f-a*l*g+r*u*g+i*l*p-r*c*p)+v*(+n*c*p-n*u*g+a*s*g-i*s*p+i*u*d-a*c*d)+y*(+n*u*f-n*l*p-a*s*f+r*s*p+a*l*d-r*u*d)+b*(-i*l*d-n*c*f+n*l*g+i*s*f-r*s*g+r*c*d)}transpose(){const e=this.elements;let n;return n=e[1],e[1]=e[4],e[4]=n,n=e[2],e[2]=e[8],e[8]=n,n=e[6],e[6]=e[9],e[9]=n,n=e[3],e[3]=e[12],e[12]=n,n=e[7],e[7]=e[13],e[13]=n,n=e[11],e[11]=e[14],e[14]=n,this}setPosition(e,n,r){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=n,i[14]=r),this}invert(){const e=this.elements,n=e[0],r=e[1],i=e[2],a=e[3],s=e[4],l=e[5],c=e[6],u=e[7],d=e[8],f=e[9],g=e[10],p=e[11],x=e[12],v=e[13],y=e[14],b=e[15],E=f*y*u-v*g*u+v*c*p-l*y*p-f*c*b+l*g*b,w=x*g*u-d*y*u-x*c*p+s*y*p+d*c*b-s*g*b,T=d*v*u-x*f*u+x*l*p-s*v*p-d*l*b+s*f*b,A=x*f*c-d*v*c-x*l*g+s*v*g+d*l*y-s*f*y,C=n*E+r*w+i*T+a*A;if(C===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const N=1/C;return e[0]=E*N,e[1]=(v*g*a-f*y*a-v*i*p+r*y*p+f*i*b-r*g*b)*N,e[2]=(l*y*a-v*c*a+v*i*u-r*y*u-l*i*b+r*c*b)*N,e[3]=(f*c*a-l*g*a-f*i*u+r*g*u+l*i*p-r*c*p)*N,e[4]=w*N,e[5]=(d*y*a-x*g*a+x*i*p-n*y*p-d*i*b+n*g*b)*N,e[6]=(x*c*a-s*y*a-x*i*u+n*y*u+s*i*b-n*c*b)*N,e[7]=(s*g*a-d*c*a+d*i*u-n*g*u-s*i*p+n*c*p)*N,e[8]=T*N,e[9]=(x*f*a-d*v*a-x*r*p+n*v*p+d*r*b-n*f*b)*N,e[10]=(s*v*a-x*l*a+x*r*u-n*v*u-s*r*b+n*l*b)*N,e[11]=(d*l*a-s*f*a-d*r*u+n*f*u+s*r*p-n*l*p)*N,e[12]=A*N,e[13]=(d*v*i-x*f*i+x*r*g-n*v*g-d*r*y+n*f*y)*N,e[14]=(x*l*i-s*v*i-x*r*c+n*v*c+s*r*y-n*l*y)*N,e[15]=(s*f*i-d*l*i+d*r*c-n*f*c-s*r*g+n*l*g)*N,this}scale(e){const n=this.elements,r=e.x,i=e.y,a=e.z;return n[0]*=r,n[4]*=i,n[8]*=a,n[1]*=r,n[5]*=i,n[9]*=a,n[2]*=r,n[6]*=i,n[10]*=a,n[3]*=r,n[7]*=i,n[11]*=a,this}getMaxScaleOnAxis(){const e=this.elements,n=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],r=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(n,r,i))}makeTranslation(e,n,r){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,n,0,0,1,r,0,0,0,1),this}makeRotationX(e){const n=Math.cos(e),r=Math.sin(e);return this.set(1,0,0,0,0,n,-r,0,0,r,n,0,0,0,0,1),this}makeRotationY(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,0,r,0,0,1,0,0,-r,0,n,0,0,0,0,1),this}makeRotationZ(e){const n=Math.cos(e),r=Math.sin(e);return this.set(n,-r,0,0,r,n,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,n){const r=Math.cos(n),i=Math.sin(n),a=1-r,s=e.x,l=e.y,c=e.z,u=a*s,d=a*l;return this.set(u*s+r,u*l-i*c,u*c+i*l,0,u*l+i*c,d*l+r,d*c-i*s,0,u*c-i*l,d*c+i*s,a*c*c+r,0,0,0,0,1),this}makeScale(e,n,r){return this.set(e,0,0,0,0,n,0,0,0,0,r,0,0,0,0,1),this}makeShear(e,n,r,i,a,s){return this.set(1,r,a,0,e,1,s,0,n,i,1,0,0,0,0,1),this}compose(e,n,r){const i=this.elements,a=n._x,s=n._y,l=n._z,c=n._w,u=a+a,d=s+s,f=l+l,g=a*u,p=a*d,x=a*f,v=s*d,y=s*f,b=l*f,E=c*u,w=c*d,T=c*f,A=r.x,C=r.y,N=r.z;return i[0]=(1-(v+b))*A,i[1]=(p+T)*A,i[2]=(x-w)*A,i[3]=0,i[4]=(p-T)*C,i[5]=(1-(g+b))*C,i[6]=(y+E)*C,i[7]=0,i[8]=(x+w)*N,i[9]=(y-E)*N,i[10]=(1-(g+v))*N,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,n,r){const i=this.elements;let a=pm.set(i[0],i[1],i[2]).length();const s=pm.set(i[4],i[5],i[6]).length(),l=pm.set(i[8],i[9],i[10]).length();this.determinant()<0&&(a=-a),e.x=i[12],e.y=i[13],e.z=i[14],Eo.copy(this);const u=1/a,d=1/s,f=1/l;return Eo.elements[0]*=u,Eo.elements[1]*=u,Eo.elements[2]*=u,Eo.elements[4]*=d,Eo.elements[5]*=d,Eo.elements[6]*=d,Eo.elements[8]*=f,Eo.elements[9]*=f,Eo.elements[10]*=f,n.setFromRotationMatrix(Eo),r.x=a,r.y=s,r.z=l,this}makePerspective(e,n,r,i,a,s,l=hl,c=!1){const u=this.elements,d=2*a/(n-e),f=2*a/(r-i),g=(n+e)/(n-e),p=(r+i)/(r-i);let x,v;if(c)x=a/(s-a),v=s*a/(s-a);else if(l===hl)x=-(s+a)/(s-a),v=-2*s*a/(s-a);else if(l===Bw)x=-s/(s-a),v=-s*a/(s-a);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+l);return u[0]=d,u[4]=0,u[8]=g,u[12]=0,u[1]=0,u[5]=f,u[9]=p,u[13]=0,u[2]=0,u[6]=0,u[10]=x,u[14]=v,u[3]=0,u[7]=0,u[11]=-1,u[15]=0,this}makeOrthographic(e,n,r,i,a,s,l=hl,c=!1){const u=this.elements,d=2/(n-e),f=2/(r-i),g=-(n+e)/(n-e),p=-(r+i)/(r-i);let x,v;if(c)x=1/(s-a),v=s/(s-a);else if(l===hl)x=-2/(s-a),v=-(s+a)/(s-a);else if(l===Bw)x=-1/(s-a),v=-a/(s-a);else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+l);return u[0]=d,u[4]=0,u[8]=0,u[12]=g,u[1]=0,u[5]=f,u[9]=0,u[13]=p,u[2]=0,u[6]=0,u[10]=x,u[14]=v,u[3]=0,u[7]=0,u[11]=0,u[15]=1,this}equals(e){const n=this.elements,r=e.elements;for(let i=0;i<16;i++)if(n[i]!==r[i])return!1;return!0}fromArray(e,n=0){for(let r=0;r<16;r++)this.elements[r]=e[r+n];return this}toArray(e=[],n=0){const r=this.elements;return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],e[n+4]=r[4],e[n+5]=r[5],e[n+6]=r[6],e[n+7]=r[7],e[n+8]=r[8],e[n+9]=r[9],e[n+10]=r[10],e[n+11]=r[11],e[n+12]=r[12],e[n+13]=r[13],e[n+14]=r[14],e[n+15]=r[15],e}};const pm=new it,Eo=new hi,nke=new it(0,0,0),rke=new it(1,1,1),Au=new it,Zv=new it,xs=new it,vH=new hi,_H=new uf;let Sd=class NZ{constructor(e=0,n=0,r=0,i=NZ.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=n,this._z=r,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,n,r,i=this._order){return this._x=e,this._y=n,this._z=r,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,n=this._order,r=!0){const i=e.elements,a=i[0],s=i[4],l=i[8],c=i[1],u=i[5],d=i[9],f=i[2],g=i[6],p=i[10];switch(n){case"XYZ":this._y=Math.asin(yn(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-d,p),this._z=Math.atan2(-s,a)):(this._x=Math.atan2(g,u),this._z=0);break;case"YXZ":this._x=Math.asin(-yn(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(l,p),this._z=Math.atan2(c,u)):(this._y=Math.atan2(-f,a),this._z=0);break;case"ZXY":this._x=Math.asin(yn(g,-1,1)),Math.abs(g)<.9999999?(this._y=Math.atan2(-f,p),this._z=Math.atan2(-s,u)):(this._y=0,this._z=Math.atan2(c,a));break;case"ZYX":this._y=Math.asin(-yn(f,-1,1)),Math.abs(f)<.9999999?(this._x=Math.atan2(g,p),this._z=Math.atan2(c,a)):(this._x=0,this._z=Math.atan2(-s,u));break;case"YZX":this._z=Math.asin(yn(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(-d,u),this._y=Math.atan2(-f,a)):(this._x=0,this._y=Math.atan2(l,p));break;case"XZY":this._z=Math.asin(-yn(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(g,u),this._y=Math.atan2(l,a)):(this._x=Math.atan2(-d,p),this._y=0);break;default:Zt("Euler: .setFromRotationMatrix() encountered an unknown order: "+n)}return this._order=n,r===!0&&this._onChangeCallback(),this}setFromQuaternion(e,n,r){return vH.makeRotationFromQuaternion(e),this.setFromRotationMatrix(vH,n,r)}setFromVector3(e,n=this._order){return this.set(e.x,e.y,e.z,n)}reorder(e){return _H.setFromEuler(this),this.setFromQuaternion(_H,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],n=0){return e[n]=this._x,e[n+1]=this._y,e[n+2]=this._z,e[n+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}};Sd.DEFAULT_ORDER="XYZ";let CZ=class{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let n=0;n1){for(let r=0;r0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.geometryInfo=this._geometryInfo.map(l=>({...l,boundingBox:l.boundingBox?l.boundingBox.toJSON():void 0,boundingSphere:l.boundingSphere?l.boundingSphere.toJSON():void 0})),i.instanceInfo=this._instanceInfo.map(l=>({...l})),i.availableInstanceIds=this._availableInstanceIds.slice(),i.availableGeometryIds=this._availableGeometryIds.slice(),i.nextIndexStart=this._nextIndexStart,i.nextVertexStart=this._nextVertexStart,i.geometryCount=this._geometryCount,i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.matricesTexture=this._matricesTexture.toJSON(e),i.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(i.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(i.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(i.boundingBox=this.boundingBox.toJSON()));function a(l,c){return l[c.uuid]===void 0&&(l[c.uuid]=c.toJSON(e)),c.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=a(e.geometries,this.geometry);const l=this.geometry.parameters;if(l!==void 0&&l.shapes!==void 0){const c=l.shapes;if(Array.isArray(c))for(let u=0,d=c.length;u0){i.children=[];for(let l=0;l0){i.animations=[];for(let l=0;l0&&(r.geometries=l),c.length>0&&(r.materials=c),u.length>0&&(r.textures=u),d.length>0&&(r.images=d),f.length>0&&(r.shapes=f),g.length>0&&(r.skeletons=g),p.length>0&&(r.animations=p),x.length>0&&(r.nodes=x)}return r.object=i,r;function s(l){const c=[];for(const u in l){const d=l[u];delete d.metadata,c.push(d)}return c}}clone(e){return new this.constructor().copy(this,e)}copy(e,n=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),n===!0)for(let r=0;r0?i.multiplyScalar(1/Math.sqrt(a)):i.set(0,0,0)}static getBarycoord(e,n,r,i,a){To.subVectors(i,n),nc.subVectors(r,n),HN.subVectors(e,n);const s=To.dot(To),l=To.dot(nc),c=To.dot(HN),u=nc.dot(nc),d=nc.dot(HN),f=s*u-l*l;if(f===0)return a.set(0,0,0),null;const g=1/f,p=(u*c-l*d)*g,x=(s*d-l*c)*g;return a.set(1-p-x,x,p)}static containsPoint(e,n,r,i){return this.getBarycoord(e,n,r,i,rc)===null?!1:rc.x>=0&&rc.y>=0&&rc.x+rc.y<=1}static getInterpolation(e,n,r,i,a,s,l,c){return this.getBarycoord(e,n,r,i,rc)===null?(c.x=0,c.y=0,"z"in c&&(c.z=0),"w"in c&&(c.w=0),null):(c.setScalar(0),c.addScaledVector(a,rc.x),c.addScaledVector(s,rc.y),c.addScaledVector(l,rc.z),c)}static getInterpolatedAttribute(e,n,r,i,a,s){return WN.setScalar(0),qN.setScalar(0),KN.setScalar(0),WN.fromBufferAttribute(e,n),qN.fromBufferAttribute(e,r),KN.fromBufferAttribute(e,i),s.setScalar(0),s.addScaledVector(WN,a.x),s.addScaledVector(qN,a.y),s.addScaledVector(KN,a.z),s}static isFrontFacing(e,n,r,i){return To.subVectors(r,n),nc.subVectors(e,n),To.cross(nc).dot(i)<0}set(e,n,r){return this.a.copy(e),this.b.copy(n),this.c.copy(r),this}setFromPointsAndIndices(e,n,r,i){return this.a.copy(e[n]),this.b.copy(e[r]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,n,r,i){return this.a.fromBufferAttribute(e,n),this.b.fromBufferAttribute(e,r),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return To.subVectors(this.c,this.b),nc.subVectors(this.a,this.b),To.cross(nc).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return Xm.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,n){return Xm.getBarycoord(e,this.a,this.b,this.c,n)}getInterpolation(e,n,r,i,a){return Xm.getInterpolation(e,this.a,this.b,this.c,n,r,i,a)}containsPoint(e){return Xm.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return Xm.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,n){const r=this.a,i=this.b,a=this.c;let s,l;bm.subVectors(i,r),ym.subVectors(a,r),$N.subVectors(e,r);const c=bm.dot($N),u=ym.dot($N);if(c<=0&&u<=0)return n.copy(r);VN.subVectors(e,i);const d=bm.dot(VN),f=ym.dot(VN);if(d>=0&&f<=d)return n.copy(i);const g=c*f-d*u;if(g<=0&&c>=0&&d<=0)return s=c/(c-d),n.copy(r).addScaledVector(bm,s);GN.subVectors(e,a);const p=bm.dot(GN),x=ym.dot(GN);if(x>=0&&p<=x)return n.copy(a);const v=p*u-c*x;if(v<=0&&u>=0&&x<=0)return l=u/(u-x),n.copy(r).addScaledVector(ym,l);const y=d*x-p*f;if(y<=0&&f-d>=0&&p-x>=0)return AH.subVectors(a,i),l=(f-d)/(f-d+(p-x)),n.copy(i).addScaledVector(AH,l);const b=1/(y+v+g);return s=v*b,l=g*b,n.copy(r).addScaledVector(bm,s).addScaledVector(ym,l)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}};const kZ={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Nu={h:0,s:0,l:0},Jv={h:0,s:0,l:0};function XN(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+(e-t)*6*n:n<1/2?e:n<2/3?t+(e-t)*6*(2/3-n):t}let Mn=class{constructor(e,n,r){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,n,r)}set(e,n,r){if(n===void 0&&r===void 0){const i=e;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(e,n,r);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,n=Zs){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,Dn.colorSpaceToWorking(this,n),this}setRGB(e,n,r,i=Dn.workingColorSpace){return this.r=e,this.g=n,this.b=r,Dn.colorSpaceToWorking(this,i),this}setHSL(e,n,r,i=Dn.workingColorSpace){if(e=qCe(e,1),n=yn(n,0,1),r=yn(r,0,1),n===0)this.r=this.g=this.b=r;else{const a=r<=.5?r*(1+n):r+n-r*n,s=2*r-a;this.r=XN(s,a,e+1/3),this.g=XN(s,a,e),this.b=XN(s,a,e-1/3)}return Dn.colorSpaceToWorking(this,i),this}setStyle(e,n=Zs){function r(a){a!==void 0&&parseFloat(a)<1&&Zt("Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let a;const s=i[1],l=i[2];switch(s){case"rgb":case"rgba":if(a=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(l))return r(a[4]),this.setRGB(Math.min(255,parseInt(a[1],10))/255,Math.min(255,parseInt(a[2],10))/255,Math.min(255,parseInt(a[3],10))/255,n);if(a=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(l))return r(a[4]),this.setRGB(Math.min(100,parseInt(a[1],10))/100,Math.min(100,parseInt(a[2],10))/100,Math.min(100,parseInt(a[3],10))/100,n);break;case"hsl":case"hsla":if(a=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(l))return r(a[4]),this.setHSL(parseFloat(a[1])/360,parseFloat(a[2])/100,parseFloat(a[3])/100,n);break;default:Zt("Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const a=i[1],s=a.length;if(s===3)return this.setRGB(parseInt(a.charAt(0),16)/15,parseInt(a.charAt(1),16)/15,parseInt(a.charAt(2),16)/15,n);if(s===6)return this.setHex(parseInt(a,16),n);Zt("Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,n);return this}setColorName(e,n=Zs){const r=kZ[e.toLowerCase()];return r!==void 0?this.setHex(r,n):Zt("Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=Rc(e.r),this.g=Rc(e.g),this.b=Rc(e.b),this}copyLinearToSRGB(e){return this.r=fp(e.r),this.g=fp(e.g),this.b=fp(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=Zs){return Dn.workingToColorSpace(da.copy(this),e),Math.round(yn(da.r*255,0,255))*65536+Math.round(yn(da.g*255,0,255))*256+Math.round(yn(da.b*255,0,255))}getHexString(e=Zs){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,n=Dn.workingColorSpace){Dn.workingToColorSpace(da.copy(this),n);const r=da.r,i=da.g,a=da.b,s=Math.max(r,i,a),l=Math.min(r,i,a);let c,u;const d=(l+s)/2;if(l===s)c=0,u=0;else{const f=s-l;switch(u=d<=.5?f/(s+l):f/(2-s-l),s){case r:c=(i-a)/f+(i0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const n in e){const r=e[n];if(r===void 0){Zt(`Material: parameter '${n}' has value of undefined.`);continue}const i=this[n];if(i===void 0){Zt(`Material: '${n}' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(r):i&&i.isVector3&&r&&r.isVector3?i.copy(r):this[n]=r}}toJSON(e){const n=e===void 0||typeof e=="string";n&&(e={textures:{},images:{}});const r={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};r.uuid=this.uuid,r.type=this.type,this.name!==""&&(r.name=this.name),this.color&&this.color.isColor&&(r.color=this.color.getHex()),this.roughness!==void 0&&(r.roughness=this.roughness),this.metalness!==void 0&&(r.metalness=this.metalness),this.sheen!==void 0&&(r.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(r.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(r.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(r.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(r.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(r.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(r.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(r.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(r.shininess=this.shininess),this.clearcoat!==void 0&&(r.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(r.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(r.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(r.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(r.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,r.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(r.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(r.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(r.dispersion=this.dispersion),this.iridescence!==void 0&&(r.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(r.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(r.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(r.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(r.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(r.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(r.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(r.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(r.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(r.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(r.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(r.lightMap=this.lightMap.toJSON(e).uuid,r.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(r.aoMap=this.aoMap.toJSON(e).uuid,r.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(r.bumpMap=this.bumpMap.toJSON(e).uuid,r.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(r.normalMap=this.normalMap.toJSON(e).uuid,r.normalMapType=this.normalMapType,r.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(r.displacementMap=this.displacementMap.toJSON(e).uuid,r.displacementScale=this.displacementScale,r.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(r.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(r.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(r.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(r.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(r.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(r.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(r.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(r.combine=this.combine)),this.envMapRotation!==void 0&&(r.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(r.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(r.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(r.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(r.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(r.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(r.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(r.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(r.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(r.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(r.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(r.size=this.size),this.shadowSide!==null&&(r.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(r.sizeAttenuation=this.sizeAttenuation),this.blending!==hp&&(r.blending=this.blending),this.side!==wd&&(r.side=this.side),this.vertexColors===!0&&(r.vertexColors=!0),this.opacity<1&&(r.opacity=this.opacity),this.transparent===!0&&(r.transparent=!0),this.blendSrc!==aP&&(r.blendSrc=this.blendSrc),this.blendDst!==sP&&(r.blendDst=this.blendDst),this.blendEquation!==xh&&(r.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(r.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(r.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(r.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(r.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(r.blendAlpha=this.blendAlpha),this.depthFunc!==Lp&&(r.depthFunc=this.depthFunc),this.depthTest===!1&&(r.depthTest=this.depthTest),this.depthWrite===!1&&(r.depthWrite=this.depthWrite),this.colorWrite===!1&&(r.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(r.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==hH&&(r.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(r.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(r.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==um&&(r.stencilFail=this.stencilFail),this.stencilZFail!==um&&(r.stencilZFail=this.stencilZFail),this.stencilZPass!==um&&(r.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(r.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(r.rotation=this.rotation),this.polygonOffset===!0&&(r.polygonOffset=!0),this.polygonOffsetFactor!==0&&(r.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(r.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(r.linewidth=this.linewidth),this.dashSize!==void 0&&(r.dashSize=this.dashSize),this.gapSize!==void 0&&(r.gapSize=this.gapSize),this.scale!==void 0&&(r.scale=this.scale),this.dithering===!0&&(r.dithering=!0),this.alphaTest>0&&(r.alphaTest=this.alphaTest),this.alphaHash===!0&&(r.alphaHash=!0),this.alphaToCoverage===!0&&(r.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(r.premultipliedAlpha=!0),this.forceSinglePass===!0&&(r.forceSinglePass=!0),this.wireframe===!0&&(r.wireframe=!0),this.wireframeLinewidth>1&&(r.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(r.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(r.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(r.flatShading=!0),this.visible===!1&&(r.visible=!1),this.toneMapped===!1&&(r.toneMapped=!1),this.fog===!1&&(r.fog=!1),Object.keys(this.userData).length>0&&(r.userData=this.userData);function i(a){const s=[];for(const l in a){const c=a[l];delete c.metadata,s.push(c)}return s}if(n){const a=i(e.textures),s=i(e.images);a.length>0&&(r.textures=a),s.length>0&&(r.images=s)}return r}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const n=e.clippingPlanes;let r=null;if(n!==null){const i=n.length;r=new Array(i);for(let a=0;a!==i;++a)r[a]=n[a].clone()}return this.clippingPlanes=r,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}},jO=class extends bg{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Mn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Sd,this.combine=wO,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}};const ai=new it,e_=new dn;let cke=0,co=class{constructor(e,n,r=!1){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:cke++}),this.name="",this.array=e,this.itemSize=n,this.count=e!==void 0?e.length/n:0,this.normalized=r,this.usage=fH,this.updateRanges=[],this.gpuType=Tc,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,n){this.updateRanges.push({start:e,count:n})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,n,r){e*=this.itemSize,r*=n.itemSize;for(let i=0,a=this.itemSize;in.count&&Zt("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),n.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new hf);const e=this.attributes.position,n=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){Zr("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new it(-1/0,-1/0,-1/0),new it(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),n)for(let r=0,i=n.length;r0&&(e.userData=this.userData),this.parameters!==void 0){const c=this.parameters;for(const u in c)c[u]!==void 0&&(e[u]=c[u]);return e}e.data={attributes:{}};const n=this.index;n!==null&&(e.data.index={type:n.array.constructor.name,array:Array.prototype.slice.call(n.array)});const r=this.attributes;for(const c in r){const u=r[c];e.data.attributes[c]=u.toJSON(e.data)}const i={};let a=!1;for(const c in this.morphAttributes){const u=this.morphAttributes[c],d=[];for(let f=0,g=u.length;f0&&(i[c]=d,a=!0)}a&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(e.data.groups=JSON.parse(JSON.stringify(s)));const l=this.boundingSphere;return l!==null&&(e.data.boundingSphere=l.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const n={};this.name=e.name;const r=e.index;r!==null&&this.setIndex(r.clone());const i=e.attributes;for(const u in i){const d=i[u];this.setAttribute(u,d.clone(n))}const a=e.morphAttributes;for(const u in a){const d=[],f=a[u];for(let g=0,p=f.length;g0){const i=n[r[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let a=0,s=i.length;a(e.far-e.near)**2))&&(NH.copy(a).invert(),eh.copy(e.ray).applyMatrix4(NH),!(r.boundingBox!==null&&eh.intersectsBox(r.boundingBox)===!1)&&this._computeIntersections(e,n,eh)))}_computeIntersections(e,n,r){let i;const a=this.geometry,s=this.material,l=a.index,c=a.attributes.position,u=a.attributes.uv,d=a.attributes.uv1,f=a.attributes.normal,g=a.groups,p=a.drawRange;if(l!==null)if(Array.isArray(s))for(let x=0,v=g.length;xn.far?null:{distance:u,point:s_.clone(),object:t}}function o_(t,e,n,r,i,a,s,l,c,u){t.getVertexPosition(l,n_),t.getVertexPosition(c,r_),t.getVertexPosition(u,i_);const d=dke(t,e,n,r,n_,r_,i_,kH);if(d){const f=new it;kx.getBarycoord(kH,n_,r_,i_,f),i&&(d.uv=kx.getInterpolatedAttribute(i,l,c,u,f,new dn)),a&&(d.uv1=kx.getInterpolatedAttribute(a,l,c,u,f,new dn)),s&&(d.normal=kx.getInterpolatedAttribute(s,l,c,u,f,new it),d.normal.dot(r.direction)>0&&d.normal.multiplyScalar(-1));const g={a:l,b:c,c:u,normal:new it,materialIndex:0};kx.getNormal(n_,r_,i_,g.normal),d.face=g,d.barycoord=f}return d}let RO=class DZ extends Dl{constructor(e=1,n=1,r=1,i=1,a=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:n,depth:r,widthSegments:i,heightSegments:a,depthSegments:s};const l=this;i=Math.floor(i),a=Math.floor(a),s=Math.floor(s);const c=[],u=[],d=[],f=[];let g=0,p=0;x("z","y","x",-1,-1,r,n,e,s,a,0),x("z","y","x",1,-1,r,n,-e,s,a,1),x("x","z","y",1,1,e,r,n,i,s,2),x("x","z","y",1,-1,e,r,-n,i,s,3),x("x","y","z",1,-1,e,n,r,i,a,4),x("x","y","z",-1,-1,e,n,-r,i,a,5),this.setIndex(c),this.setAttribute("position",new Bo(u,3)),this.setAttribute("normal",new Bo(d,3)),this.setAttribute("uv",new Bo(f,2));function x(v,y,b,E,w,T,A,C,N,F,k){const R=T/N,I=A/F,L=T/2,q=A/2,j=C/2,V=N+1,K=F+1;let W=0,J=0;const ee=new it;for(let Z=0;Z0?1:-1,d.push(ee.x,ee.y,ee.z),f.push(G/N),f.push(1-Z/F),W+=1}}for(let Z=0;Zn+" "+JSON.stringify(a)+": "+Kj(s,e+1)).join(`, `)+` -`+n+"}"}return String(t)}function sWe({setting:t,onClose:e,onDeleted:n,onDuplicate:r,onEdit:i}){const{showToast:a}=Sr(),s=mn(),[l,c]=M.useState(!1),{data:u,isLoading:d}=gt({queryKey:["cloudSettingDetail",t.setting_id],queryFn:()=>Se.getCloudSettingDetail(t.setting_id)}),f=vt({mutationFn:()=>Se.deleteCloudSetting(t.setting_id),onSuccess:()=>{a("Preset deleted"),s.invalidateQueries({queryKey:["cloudSettings"]}),n()},onError:x=>a(x.message,"error")}),g=yb(t.setting_id),p=HL(t.name,u?.setting?.inherits);return o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:o.jsx(wt,{className:"w-full max-w-3xl max-h-[90vh] flex flex-col overflow-hidden",children:o.jsxs(Et,{className:"p-0 flex flex-col min-h-0 flex-1",children:[o.jsxs("div",{className:"flex-shrink-0 flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("h2",{className:"text-xl font-semibold text-white truncate",children:t.name}),g&&o.jsx("span",{className:"px-2 py-0.5 text-xs font-medium bg-bambu-green/20 text-bambu-green rounded-full",children:"Editable"})]}),o.jsxs("div",{className:"flex items-center gap-2 mt-1 text-sm text-bambu-gray",children:[o.jsxs("span",{className:"capitalize",children:[t.type," preset"]}),p.printer&&o.jsxs(o.Fragment,{children:[o.jsx("span",{children:"•"}),o.jsx("span",{children:p.printer})]})]})]}),o.jsx("button",{onClick:e,className:"p-2 text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary rounded-lg transition-colors",children:o.jsx(Gt,{className:"w-5 h-5"})})]}),o.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto p-4",children:d?o.jsx("div",{className:"flex items-center justify-center py-16",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})}):u?o.jsx("pre",{className:"text-xs text-bambu-gray font-mono whitespace-pre-wrap break-all bg-bambu-dark p-4 rounded-lg border border-bambu-dark-tertiary overflow-x-auto max-w-full",children:Kj(u)}):o.jsx("div",{className:"text-center py-16 text-bambu-gray",children:"Failed to load preset details"})}),l?o.jsxs("div",{className:"flex-shrink-0 p-4 border-t border-bambu-dark-tertiary bg-red-500/5",children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3 text-red-400",children:[o.jsx(Gn,{className:"w-5 h-5"}),o.jsx("span",{className:"font-medium",children:"Delete this preset?"})]}),o.jsxs("p",{className:"text-sm text-bambu-gray mb-4",children:['This will permanently delete "',t.name,'" from Bambu Cloud. This cannot be undone.']}),o.jsxs("div",{className:"flex gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:()=>c(!1),disabled:f.isPending,className:"flex-1",children:"Cancel"}),o.jsxs(ke,{variant:"danger",onClick:()=>f.mutate(),disabled:f.isPending,className:"flex-1",children:[f.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin"}):o.jsx(En,{className:"w-4 h-4"}),"Delete"]})]})]}):o.jsx("div",{className:"flex-shrink-0 p-4 border-t border-bambu-dark-tertiary",children:o.jsxs("div",{className:"flex gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:e,className:"flex-1",children:"Close"}),o.jsxs(ke,{variant:"secondary",onClick:r,children:[o.jsx(md,{className:"w-4 h-4"}),"Duplicate"]}),g&&o.jsxs(o.Fragment,{children:[o.jsxs(ke,{variant:"secondary",onClick:i,disabled:d||!u,children:[o.jsx(Uc,{className:"w-4 h-4"}),"Edit"]}),o.jsx(ke,{variant:"danger",onClick:()=>c(!0),children:o.jsx(En,{className:"w-4 h-4"})})]})]})})]})})})}function $te(){try{const t=localStorage.getItem("bambusy_preset_templates");return t?JSON.parse(t):[]}catch{return[]}}function Vte(t){localStorage.setItem("bambusy_preset_templates",JSON.stringify(t))}function oWe({onClose:t,onApply:e}){const{showToast:n}=Sr(),[r,i]=M.useState($te),[a,s]=M.useState("all"),[l,c]=M.useState(null),[u,d]=M.useState(""),[f,g]=M.useState(""),[p,x]=M.useState("{}"),[v,y]=M.useState(null),[b,E]=M.useState(null),w=a==="all"?r:r.filter(L=>L.type===a),T=L=>{i(L),Vte(L)},A=L=>{const q=r.filter(j=>j.id!==L);T(q),E(null),n("Template deleted")},C=L=>{c(L.id),d(L.name),g(L.description),x(JSON.stringify(L.settings,null,2)),y(null)},N=()=>{if(!(!l||!u.trim()))try{const L=JSON.parse(p),q=r.map(j=>j.id===l?{...j,name:u.trim(),description:f.trim(),settings:L}:j);T(q),c(null),n("Template updated")}catch(L){y(L.message)}},F=()=>{c(null),d(""),g(""),x("{}"),y(null)},k=L=>{const q=r.map(j=>j.id===L?{...j,showInModal:!j.showInModal}:j);T(q)},R={filament:{label:"Filament",icon:oR,color:"text-amber-400"},print:{label:"Process",icon:eM,color:"text-blue-400"},printer:{label:"Printer",icon:Vi,color:"text-purple-400"}},I=b?r.find(L=>L.id===b):null;return M.useEffect(()=>{const L=q=>{q.key==="Escape"&&(b?E(null):l?F():t())};return window.addEventListener("keydown",L),()=>window.removeEventListener("keydown",L)},[b,l,t]),o.jsxs("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:[I&&o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-60",children:o.jsx(wt,{className:"w-full max-w-md",children:o.jsxs(Et,{className:"p-6",children:[o.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[o.jsx("div",{className:"p-2 bg-red-500/20 rounded-lg",children:o.jsx(Gn,{className:"w-6 h-6 text-red-400"})}),o.jsxs("div",{children:[o.jsx("h3",{className:"text-lg font-semibold text-white",children:"Delete Template"}),o.jsx("p",{className:"text-sm text-bambu-gray",children:"This action cannot be undone"})]})]}),o.jsxs("p",{className:"text-white mb-6",children:['Are you sure you want to delete "',o.jsx("span",{className:"font-medium",children:I.name}),'"?']}),o.jsxs("div",{className:"flex gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:()=>E(null),className:"flex-1",children:"Cancel"}),o.jsxs(ke,{onClick:()=>A(b),className:"flex-1 bg-red-500 hover:bg-red-600",children:[o.jsx(En,{className:"w-4 h-4"}),"Delete"]})]})]})})}),o.jsx(wt,{className:"w-full max-w-2xl max-h-[80vh] flex flex-col",children:o.jsxs(Et,{className:"p-0 flex flex-col h-full",children:[o.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(j0,{className:"w-5 h-5 text-amber-400"}),"Quick Templates"]}),o.jsx("button",{onClick:t,className:"text-bambu-gray hover:text-white",children:o.jsx(Gt,{className:"w-5 h-5"})})]}),o.jsxs("div",{className:"flex items-center gap-2 p-4 border-b border-bambu-dark-tertiary",children:[o.jsx("span",{className:"text-sm text-bambu-gray",children:"Type:"}),["all","filament","print","printer"].map(L=>o.jsx("button",{onClick:()=>s(L),className:`px-3 py-1 text-sm rounded-lg transition-colors ${a===L?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:L==="all"?"All":R[L].label},L))]}),o.jsx("div",{className:"flex-1 overflow-y-auto p-4",children:w.length===0?o.jsxs("div",{className:"text-center py-12 text-bambu-gray",children:[o.jsx(j0,{className:"w-12 h-12 mx-auto mb-4 opacity-30"}),o.jsx("p",{children:"No templates yet"}),o.jsx("p",{className:"text-sm mt-1",children:"Create templates from the preset editor"})]}):o.jsx("div",{className:"space-y-2",children:w.map(L=>{const q=R[L.type],j=q.icon;return l===L.id?o.jsxs("div",{className:"p-4 bg-bambu-dark rounded-lg border border-bambu-green",children:[o.jsxs("div",{className:"grid grid-cols-2 gap-3 mb-3",children:[o.jsx("input",{type:"text",value:u,onChange:V=>d(V.target.value),placeholder:"Template name",className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none",autoFocus:!0}),o.jsx("input",{type:"text",value:f,onChange:V=>g(V.target.value),placeholder:"Description",className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"})]}),o.jsxs("div",{className:"mb-3",children:[o.jsx("label",{className:"text-xs text-bambu-gray mb-1 block",children:"Settings (JSON)"}),o.jsx("textarea",{value:p,onChange:V=>{x(V.target.value),y(null)},rows:6,className:`w-full px-3 py-2 bg-bambu-dark-secondary border rounded text-white text-sm font-mono focus:outline-none ${v?"border-red-500":"border-bambu-dark-tertiary focus:border-bambu-green"}`}),v&&o.jsx("p",{className:"text-xs text-red-400 mt-1",children:v})]}),o.jsxs("div",{className:"flex gap-2",children:[o.jsxs(ke,{size:"sm",onClick:N,disabled:!u.trim(),children:[o.jsx(Ts,{className:"w-4 h-4"}),"Save"]}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:F,children:"Cancel"})]})]},L.id):o.jsxs("div",{className:"flex items-center gap-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary hover:border-bambu-gray-dark transition-colors",children:[o.jsx(j,{className:`w-5 h-5 ${q.color} flex-shrink-0`}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("p",{className:"text-sm font-medium text-white",children:L.name}),o.jsx("p",{className:"text-xs text-bambu-gray truncate",children:L.description})]}),o.jsxs("span",{className:"text-xs text-bambu-gray-dark px-2 py-1 bg-bambu-dark-secondary rounded",children:[Object.keys(L.settings).length," fields"]}),o.jsx("button",{onClick:()=>k(L.id),className:`p-1 transition-colors ${L.showInModal?"text-bambu-green hover:text-bambu-green/70":"text-bambu-gray hover:text-white"}`,title:L.showInModal?"Shown in modals":"Hidden in modals",children:L.showInModal?o.jsx(Zh,{className:"w-4 h-4"}):o.jsx(YS,{className:"w-4 h-4"})}),o.jsx("button",{onClick:()=>e(L),className:"px-3 py-1 text-xs bg-bambu-green/20 text-bambu-green rounded hover:bg-bambu-green/30 transition-colors",children:"Apply"}),o.jsx("button",{onClick:()=>C(L),className:"p-1 text-bambu-gray hover:text-white",title:"Edit",children:o.jsx(Uc,{className:"w-4 h-4"})}),o.jsx("button",{onClick:()=>E(L.id),className:"p-1 text-bambu-gray hover:text-red-400",title:"Delete",children:o.jsx(En,{className:"w-4 h-4"})})]},L.id)})})})]})})]})}function Gte({onClose:t,leftPreset:e,rightPreset:n,leftLabel:r,rightLabel:i}){const[a,s]=M.useState("changes"),[l,c]=M.useState(""),u=M.useMemo(()=>{const p=new Set([...Object.keys(e),...Object.keys(n)]),x=[];for(const v of p){if(v==="inherits"||v==="version")continue;const y=e[v],b=n[v],E=v in e,w=v in n;let T;!E&&w?T="added":E&&!w?T="removed":JSON.stringify(y)!==JSON.stringify(b)?T="changed":T="same",x.push({key:v,left:y,right:b,status:T})}return x.sort((v,y)=>{const b={changed:0,added:1,removed:2,same:3};return b[v.status]!==b[y.status]?b[v.status]-b[y.status]:v.key.localeCompare(y.key)})},[e,n]),d=M.useMemo(()=>{let p=[...u];if(a==="changes"&&(p=p.filter(x=>x.status!=="same")),l){const x=l.toLowerCase();p=p.filter(v=>v.key.toLowerCase().includes(x)||String(v.left).toLowerCase().includes(x)||String(v.right).toLowerCase().includes(x))}return p},[u,a,l]),f=M.useMemo(()=>({added:u.filter(p=>p.status==="added").length,removed:u.filter(p=>p.status==="removed").length,changed:u.filter(p=>p.status==="changed").length,same:u.filter(p=>p.status==="same").length}),[u]),g=p=>{if(p===void 0)return"—";if(p===null)return"null";if(Array.isArray(p))return p.length===0?"[]":p.length===1?String(p[0]):p.join(", ");if(typeof p=="object")return JSON.stringify(p);const x=String(p);if(x.includes("\\n")||x.length>100){const v=x.split("\\n").length;if(v>1)return`[${v} lines of G-code/script]`;if(x.length>100)return x.substring(0,100)+"…"}return x};return M.useEffect(()=>{const p=x=>{x.key==="Escape"&&t()};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[t]),o.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:o.jsx(wt,{className:"w-full max-w-4xl max-h-[85vh] flex flex-col overflow-hidden",children:o.jsxs(Et,{className:"p-0 flex flex-col min-h-0 flex-1",children:[o.jsxs("div",{className:"flex-shrink-0 flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(op,{className:"w-5 h-5 text-blue-400"}),"Compare Presets"]}),o.jsx("button",{onClick:t,className:"text-bambu-gray hover:text-white",children:o.jsx(Gt,{className:"w-5 h-5"})})]}),o.jsxs("div",{className:"flex-shrink-0 grid grid-cols-2 gap-4 p-4 border-b border-bambu-dark-tertiary bg-bambu-dark",children:[o.jsxs("div",{className:"text-center",children:[o.jsx("span",{className:"text-sm text-bambu-gray",children:"Left:"}),o.jsx("p",{className:"text-white font-medium truncate",children:r})]}),o.jsxs("div",{className:"text-center",children:[o.jsx("span",{className:"text-sm text-bambu-gray",children:"Right:"}),o.jsx("p",{className:"text-white font-medium truncate",children:i})]})]}),o.jsxs("div",{className:"flex-shrink-0 flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center gap-4 text-sm",children:[o.jsxs("span",{className:"flex items-center gap-1 text-green-400",children:[o.jsx(sr,{className:"w-3.5 h-3.5"}),f.added," added"]}),o.jsxs("span",{className:"flex items-center gap-1 text-red-400",children:[o.jsx(Qk,{className:"w-3.5 h-3.5"}),f.removed," removed"]}),o.jsxs("span",{className:"flex items-center gap-1 text-amber-400",children:[o.jsx(Wk,{className:"w-3.5 h-3.5"}),f.changed," changed"]}),o.jsxs("span",{className:"flex items-center gap-1 text-bambu-gray",children:[o.jsx(GT,{className:"w-3.5 h-3.5"}),f.same," same"]})]}),o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs("div",{className:"relative",children:[o.jsx(bl,{className:"absolute left-2 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray"}),o.jsx("input",{type:"text",value:l,onChange:p=>c(p.target.value),placeholder:"Search fields...",className:"pl-8 pr-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none w-48"})]}),f.same>0&&o.jsxs("div",{className:"flex rounded overflow-hidden border border-bambu-dark-tertiary",children:[o.jsx("button",{onClick:()=>s("changes"),className:`px-3 py-1.5 text-sm transition-colors ${a==="changes"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:"Changes"}),o.jsx("button",{onClick:()=>s("all"),className:`px-3 py-1.5 text-sm transition-colors ${a==="all"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:"All"})]})]})]}),o.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto",children:d.length===0?o.jsxs("div",{className:"text-center py-12 text-bambu-gray",children:[o.jsx(GT,{className:"w-12 h-12 mx-auto mb-4 opacity-30"}),o.jsx("p",{children:a==="changes"?"No differences found":"No fields match the search"})]}):o.jsxs("table",{className:"w-full",children:[o.jsx("thead",{className:"sticky top-0 bg-bambu-dark-secondary",children:o.jsxs("tr",{className:"text-sm text-bambu-gray border-b border-bambu-dark-tertiary",children:[o.jsx("th",{className:"text-left p-3 w-1/3",children:"Field"}),o.jsx("th",{className:"text-left p-3 w-1/3",children:r}),o.jsx("th",{className:"text-left p-3 w-1/3",children:i})]})}),o.jsx("tbody",{children:d.map(p=>{const x={added:"bg-green-500/10",removed:"bg-red-500/10",changed:"bg-amber-500/10",same:""}[p.status],v={added:o.jsx(sr,{className:"w-3.5 h-3.5 text-green-400"}),removed:o.jsx(Qk,{className:"w-3.5 h-3.5 text-red-400"}),changed:o.jsx(Wk,{className:"w-3.5 h-3.5 text-amber-400"}),same:o.jsx(GT,{className:"w-3.5 h-3.5 text-bambu-gray-dark"})}[p.status];return o.jsxs("tr",{className:`border-b border-bambu-dark-tertiary ${x}`,children:[o.jsx("td",{className:"p-3",children:o.jsxs("div",{className:"flex items-center gap-2",children:[v,o.jsx("span",{className:"text-sm text-white font-mono",children:p.key})]})}),o.jsx("td",{className:"p-3",children:o.jsx("span",{className:`text-sm font-mono break-all ${p.status==="removed"?"text-red-300":p.status==="changed"?"text-white":"text-bambu-gray"}`,children:g(p.left)})}),o.jsx("td",{className:"p-3",children:o.jsx("span",{className:`text-sm font-mono break-all ${p.status==="added"?"text-green-300":p.status==="changed"?"text-white":"text-bambu-gray"}`,children:g(p.right)})})]},p.key)})})]})})]})})})}function lWe({onClose:t,initialData:e,allPresets:n}){const{showToast:r}=Sr(),i=mn(),a=!!e?.setting_id,[s,l]=M.useState("common"),[c,u]=M.useState(e?.type||"filament"),[d,f]=M.useState(e?.name?a?e.name:`${e.name} (Copy)`:""),[g,p]=M.useState(e?.base_id||""),[x,v]=M.useState(""),[y,b]=M.useState(e?.setting||{inherits:""}),[E,w]=M.useState(JSON.stringify(e?.setting||{inherits:""},null,2)),[T,A]=M.useState(null),[C,N]=M.useState(""),[F,k]=M.useState(!1),[R,I]=M.useState(""),[L,q]=M.useState(!1),[j,V]=M.useState($te),[K,W]=M.useState(!1),[J,ee]=M.useState(""),[Z,B]=M.useState(""),[G,Q]=M.useState(!0),[te,he]=M.useState(null),[oe,xe]=M.useState(!1),Te=M.useMemo(()=>({filament:n.filament,print:n.process,printer:n.printer})[c]||[],[n,c]),me=M.useMemo(()=>Te.filter(ae=>yb(ae.setting_id)),[Te]),{data:ce}=gt({queryKey:["cloudFields",c],queryFn:()=>Se.getCloudFields(c==="print"?"process":c),staleTime:1e3*60*60}),{data:Ce}=gt({queryKey:["allPresetDetails",c,me.map(ae=>ae.setting_id).join(",")],queryFn:async()=>{const ae={};for(let Ue=0;Ue{try{const nt=await Se.getCloudSettingDetail(pe.setting_id);return{id:pe.setting_id,detail:nt}}catch{return null}}))).forEach(pe=>{pe&&(ae[pe.id]=pe.detail)})}return ae},enabled:me.length>0,staleTime:1e3*60*10}),{data:fe,isLoading:Ie}=gt({queryKey:["cloudSettingDetail",g],queryFn:()=>Se.getCloudSettingDetail(g),enabled:!!g});M.useEffect(()=>{s!=="json"&&w(JSON.stringify(y,null,2))},[y,s]);const z=M.useMemo(()=>({filament:n.filament,print:n.process,printer:n.printer}[c]||[]).filter(ze=>!yb(ze.setting_id)).sort((ze,Ue)=>ze.name.localeCompare(Ue.name)),[n,c]);M.useEffect(()=>{if(!g)return;const ae=z.find(ze=>ze.setting_id===g);ae&&(v(ae.name),a||(b({inherits:ae.name}),w(JSON.stringify({inherits:ae.name},null,2))))},[g,z,a]);const H=M.useMemo(()=>{const ae=ce?.fields||[],ze=new Set(ae.map(pe=>pe.key)),Ue=new Set,et=new Set(["inherits","updated_time","compatible_printers","compatible_prints"]);Ce&&Object.values(Ce).forEach(pe=>{pe?.setting&&Object.keys(pe.setting).forEach(nt=>{!ze.has(nt)&&!et.has(nt)&&Ue.add(nt)})}),Object.keys(y).forEach(pe=>{!ze.has(pe)&&!et.has(pe)&&Ue.add(pe)});const dt=Array.from(Ue).sort().map(pe=>({key:pe,label:pe.replace(/_/g," ").replace(/\b\w/g,nt=>nt.toUpperCase()),type:"text",category:"discovered",description:"Discovered from presets"}));return[...ae,...dt]},[ce,Ce,y]),re=H.filter(ae=>ae.label.toLowerCase().includes(C.toLowerCase())||ae.key.toLowerCase().includes(C.toLowerCase())),$=()=>{if(R.trim()){const ae=R.trim().toLowerCase().replace(/\s+/g,"_");Y(ae,""),I(""),q(!1),r(`Field "${ae}" added`)}},Y=(ae,ze)=>{b(Ue=>{const et={...Ue};return ze===""||ze===void 0?delete et[ae]:et[ae]=ze,et})},se=ae=>{b(ze=>({...ze,...ae.settings})),he(ae.name),r("Template applied")},ue=()=>{if(!J.trim())return;const ae={...y};if(delete ae.inherits,Object.keys(ae).length===0){r("No overrides to save","error");return}const ze={id:Date.now().toString(),name:J.trim(),description:Z.trim()||"Custom template",type:c,settings:ae,showInModal:G},Ue=[...j,ze];V(Ue),Vte(Ue),W(!1),ee(""),B(""),Q(!0),r("Template saved")},Ee=M.useMemo(()=>j.filter(ae=>ae.type===c&&ae.showInModal),[c,j]),Me=ae=>{w(ae);try{const ze=JSON.parse(ae);b(ze),A(null)}catch(ze){A(ze.message)}},U=ae=>{ae.preventDefault(),k(!1);const ze=ae.dataTransfer.files[0];if(ze&&ze.name.endsWith(".json")){const Ue=new FileReader;Ue.onload=et=>{try{const dt=et.target?.result,pe=JSON.parse(dt),nt=pe.setting||pe;b(ve=>({...ve,...nt})),w(JSON.stringify({...y,...nt},null,2)),r("File imported successfully")}catch{r("Invalid JSON file","error")}},Ue.readAsText(ze)}},O=vt({mutationFn:()=>{const ae={...y},ze=c==="filament"?"filament_settings_id":c==="print"?"print_settings_id":"printer_settings_id";ae[ze]=`"${d}"`;const Ue={type:c,name:d,base_id:g,setting:ae};return Se.createCloudSetting(Ue)},onSuccess:async()=>{r("Preset created successfully"),await i.refetchQueries({queryKey:["cloudSettings"]}),t()},onError:ae=>r(ae.message,"error")}),ne=vt({mutationFn:()=>{if(!e?.setting_id)throw new Error("No setting ID for update");return Se.updateCloudSetting(e.setting_id,{name:d,setting:y})},onSuccess:async()=>{r("Preset updated successfully"),i.removeQueries({queryKey:["cloudSettingDetail"]}),await i.refetchQueries({queryKey:["cloudSettings"]}),t()},onError:ae=>r(ae.message,"error")}),be=a?ne:O,ye=fe?.setting?.inherits,_e=ye?z.find(ae=>ae.name===ye):void 0,{data:We}=gt({queryKey:["cloudSettingDetail",_e?.setting_id],queryFn:()=>Se.getCloudSettingDetail(_e.setting_id),enabled:!!_e?.setting_id}),Ve=M.useMemo(()=>{const ae=We?.setting||{},ze=fe?.setting||{},Ue=g&&Ce?.[g]?.setting?Ce[g].setting:{};return{...ae,...ze,...Ue}},[g,fe,We,Ce]),Ye=ae=>{if(ae==null)return"";if(Array.isArray(ae)){const ze=[...new Set(ae.map(Ue=>String(Ue)))];return ze.length===1?ze[0]:ae.join(", ")}return String(ae)},lt=ae=>{const ze=y[ae.key],Ue=Ve[ae.key],et=Ye(Ue),dt=Ie?"Loading...":et||"",pe="w-full px-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none";if(ae.type==="boolean"){const nt=ze==="1"||ze===void 0&&Ue==="1";return o.jsx("button",{type:"button",onClick:()=>Y(ae.key,ze==="1"?"0":"1"),className:`w-8 h-5 rounded-full transition-colors ${nt?"bg-bambu-green":"bg-bambu-dark-tertiary"}`,children:o.jsx("div",{className:`w-4 h-4 rounded-full bg-white shadow transition-transform ${nt?"translate-x-3.5":"translate-x-0.5"}`})})}return ae.type==="select"?o.jsxs("select",{value:ze||"",onChange:nt=>Y(ae.key,nt.target.value),className:pe,children:[o.jsx("option",{value:"",children:dt}),ae.options?.map(nt=>o.jsx("option",{value:nt.value,children:nt.label},nt.value))]}):o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:ae.type==="number"?"number":"text",value:ze!==void 0?String(ze):"",onChange:nt=>Y(ae.key,nt.target.value),step:ae.step,min:ae.min,max:ae.max,placeholder:dt,className:pe}),ae.unit&&o.jsx("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:ae.unit})]})},de=M.useMemo(()=>fe?.setting?fe.setting:{},[fe]);return o.jsxs("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",onDragOver:ae=>{ae.preventDefault(),k(!0)},onDragLeave:()=>k(!1),onDrop:U,children:[oe&&g&&o.jsx(Gte,{onClose:()=>xe(!1),leftPreset:de,rightPreset:y,leftLabel:`Base: ${x||g}`,rightLabel:`Current: ${d||"New Preset"}`}),o.jsx(wt,{className:"w-full max-w-6xl max-h-[90vh] flex flex-col",children:o.jsxs(Et,{className:"p-0 flex flex-col h-full",children:[o.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("div",{children:[o.jsx("h2",{className:"text-xl font-semibold text-white",children:a?"Edit Preset":e?"Duplicate Preset":"Create New Preset"}),o.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:"Customize settings for your new preset"})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[g&&o.jsxs("button",{onClick:()=>xe(!0),className:"flex items-center gap-2 px-3 py-2 text-sm text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary rounded-lg transition-colors",title:"Compare with base preset",children:[o.jsx(op,{className:"w-4 h-4"}),"Compare"]}),o.jsx("button",{onClick:t,className:"p-2 text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary rounded-lg transition-colors",children:o.jsx(Gt,{className:"w-5 h-5"})})]})]}),F&&o.jsx("div",{className:"absolute inset-0 bg-bambu-green/10 border-2 border-dashed border-bambu-green rounded-lg flex items-center justify-center z-10",children:o.jsxs("div",{className:"text-center",children:[o.jsx(oa,{className:"w-12 h-12 text-bambu-green mx-auto mb-2"}),o.jsx("p",{className:"text-bambu-green font-medium",children:"Drop JSON file to import"})]})}),o.jsxs("div",{className:"p-4 border-b border-bambu-dark-tertiary space-y-3",children:[o.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Type"}),o.jsxs("select",{value:c,onChange:ae=>{u(ae.target.value),p("")},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"filament",children:"Filament"}),o.jsx("option",{value:"print",children:"Process"}),o.jsx("option",{value:"printer",children:"Printer"})]})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Base Preset"}),o.jsxs("select",{value:g,onChange:ae=>p(ae.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"",children:"Select base preset..."}),z.map(ae=>o.jsx("option",{value:ae.setting_id,children:ae.name},ae.setting_id))]})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Preset Name"}),o.jsx("input",{type:"text",value:d,onChange:ae=>f(ae.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",placeholder:"My Custom Preset"})]})]}),x&&o.jsx("div",{className:"text-xs text-bambu-gray",children:o.jsxs("p",{className:"flex items-center gap-1",children:[o.jsx(xl,{className:"w-3 h-3 text-bambu-green"}),"Inherits from: ",o.jsx("span",{className:"text-white",children:x}),Ie&&o.jsx(xt,{className:"w-3 h-3 animate-spin ml-1"})]})})]}),o.jsxs("div",{className:"flex border-b border-bambu-dark-tertiary",children:[o.jsxs("button",{onClick:()=>l("common"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${s==="common"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(wU,{className:"w-4 h-4"}),"Common"]}),o.jsxs("button",{onClick:()=>l("fields"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${s==="fields"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(fR,{className:"w-4 h-4"}),"All Fields"]}),o.jsxs("button",{onClick:()=>l("json"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${s==="json"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(DG,{className:"w-4 h-4"}),"JSON",T&&o.jsx(mo,{className:"w-3 h-3 text-red-400"})]}),o.jsx("div",{className:"flex-1"}),o.jsxs("button",{onClick:()=>{const ae={name:d,type:c,base_id:g,setting:y},ze=new Blob([JSON.stringify(ae,null,2)],{type:"application/json"}),Ue=URL.createObjectURL(ze),et=document.createElement("a");et.href=Ue,et.download=`${d||"preset"}.json`,document.body.appendChild(et),et.click(),document.body.removeChild(et),URL.revokeObjectURL(Ue),r("Preset exported")},className:"flex items-center gap-2 px-4 py-3 text-sm text-bambu-gray hover:text-white transition-colors",title:"Export current settings to JSON file",children:[o.jsx(is,{className:"w-4 h-4"}),"Export"]}),o.jsxs("button",{onClick:()=>document.getElementById("file-import")?.click(),className:"flex items-center gap-2 px-4 py-3 text-sm text-bambu-gray hover:text-white transition-colors",title:"Import settings from JSON file",children:[o.jsx(oa,{className:"w-4 h-4"}),"Import"]}),o.jsx("input",{id:"file-import",type:"file",accept:".json",className:"hidden",onChange:ae=>{const ze=ae.target.files?.[0];if(ze){const Ue=new FileReader;Ue.onload=et=>{try{const dt=JSON.parse(et.target?.result),pe=dt.setting||dt;b(nt=>({...nt,...pe})),r("File imported")}catch{r("Invalid JSON","error")}},Ue.readAsText(ze)}}})]}),o.jsxs("div",{className:"flex-1 overflow-y-auto p-4",children:[s==="common"&&o.jsxs("div",{className:"space-y-6",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsxs("h3",{className:"text-sm font-medium text-white flex items-center gap-2",children:[o.jsx(j0,{className:"w-4 h-4 text-amber-400"}),"Quick Templates"]}),Object.keys(y).filter(ae=>ae!=="inherits").length>0&&o.jsxs("button",{onClick:()=>W(!K),className:"text-xs text-bambu-gray hover:text-white flex items-center gap-1 transition-colors",children:[o.jsx(Ts,{className:"w-3 h-3"}),"Save as template"]})]}),K&&o.jsxs("div",{className:"mb-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"grid grid-cols-2 gap-2 mb-2",children:[o.jsx("input",{type:"text",value:J,onChange:ae=>ee(ae.target.value),placeholder:"Template name",className:"px-3 py-1.5 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none",autoFocus:!0}),o.jsx("input",{type:"text",value:Z,onChange:ae=>B(ae.target.value),placeholder:"Description (optional)",className:"px-3 py-1.5 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"})]}),o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{className:"flex gap-2",children:[o.jsxs(ke,{size:"sm",onClick:ue,disabled:!J.trim(),children:[o.jsx(Ts,{className:"w-3 h-3"}),"Save"]}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>W(!1),children:"Cancel"})]}),o.jsxs("button",{onClick:()=>Q(!G),className:`flex items-center gap-1.5 text-xs transition-colors ${G?"text-bambu-green":"text-bambu-gray hover:text-white"}`,children:[G?o.jsx(Zh,{className:"w-3.5 h-3.5"}):o.jsx(YS,{className:"w-3.5 h-3.5"}),G?"Show in modals":"Hidden in modals"]})]})]}),te&&o.jsxs("div",{className:"mb-3 px-3 py-2 bg-bambu-green/10 border border-bambu-green/30 rounded-lg flex items-center gap-2",children:[o.jsx(xl,{className:"w-4 h-4 text-bambu-green"}),o.jsxs("span",{className:"text-sm text-bambu-green",children:["Template applied: ",o.jsx("span",{className:"font-medium",children:te})]}),o.jsx("button",{onClick:()=>he(null),className:"ml-auto text-bambu-green/70 hover:text-bambu-green",children:o.jsx(Gt,{className:"w-4 h-4"})})]}),o.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[Ee.map(ae=>o.jsxs("button",{onClick:()=>se(ae),className:"p-3 text-left bg-bambu-dark border border-bambu-dark-tertiary rounded-lg hover:border-bambu-gray-dark transition-colors",children:[o.jsx("p",{className:"text-sm font-medium text-white",children:ae.name}),o.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:ae.description})]},ae.id)),Ee.length===0&&o.jsx("p",{className:"col-span-3 text-center text-bambu-gray text-sm py-4",children:"No templates selected. Use the Templates button to enable templates for quick access."})]}),o.jsx("p",{className:"text-xs text-bambu-gray-dark mt-2 text-center",children:"Manage templates via the Templates button on the main page"})]}),o.jsxs("div",{children:[o.jsx("h3",{className:"text-sm font-medium text-white mb-3",children:"Common Settings"}),o.jsx("div",{className:"grid grid-cols-2 gap-x-6 gap-y-3",children:H.slice(0,10).map(ae=>o.jsxs("div",{className:"flex items-center justify-between gap-4",children:[o.jsx("label",{className:"text-sm text-bambu-gray flex-shrink-0",children:ae.label}),o.jsx("div",{className:"w-48",children:lt(ae)})]},ae.key))})]}),Object.keys(y).length>1&&o.jsxs("div",{children:[o.jsx("h3",{className:"text-sm font-medium text-white mb-3",children:"Current Overrides"}),o.jsx("div",{className:"flex flex-wrap gap-2",children:Object.entries(y).filter(([ae])=>ae!=="inherits").map(([ae,ze])=>o.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 bg-bambu-green/10 text-bambu-green text-xs rounded",children:[ae,": ",String(ze).slice(0,20),o.jsx("button",{onClick:()=>Y(ae,void 0),className:"hover:text-white",children:o.jsx(Gt,{className:"w-3 h-3"})})]},ae))})]})]}),s==="fields"&&o.jsxs("div",{className:"grid grid-cols-2 gap-6",style:{height:"400px"},children:[o.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3 flex-shrink-0",children:[o.jsx("h3",{className:"text-sm font-medium text-white",children:"Available Fields"}),o.jsx("span",{className:"text-xs text-bambu-gray",children:Ce?`${H.length} fields`:"Loading..."})]}),o.jsxs("div",{className:"relative mb-3 flex-shrink-0",children:[o.jsx(bl,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray"}),o.jsx("input",{type:"text",value:C,onChange:ae=>N(ae.target.value),placeholder:"Search fields...",className:"w-full pl-10 pr-4 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none"})]}),o.jsxs("div",{className:"flex-1 overflow-y-auto space-y-1 pr-2 min-h-0",children:[re.filter(ae=>!(ae.key in y)).map(ae=>{const ze=Ve[ae.key],Ue=Ye(ze);return o.jsxs("div",{onClick:()=>{b(et=>({...et,[ae.key]:Ue||""}))},className:"flex items-center justify-between gap-2 p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors cursor-pointer group",children:[o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsx("p",{className:"text-sm text-white truncate",children:ae.label}),o.jsx("p",{className:"text-xs text-bambu-gray-dark truncate",children:ae.key})]}),o.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[Ue&&o.jsxs("span",{className:"text-xs text-bambu-gray bg-bambu-dark px-2 py-0.5 rounded max-w-32 truncate",title:Ue,children:[Ue.slice(0,20),Ue.length>20?"...":""]}),o.jsx("div",{className:"w-6 h-6 flex items-center justify-center rounded bg-bambu-dark-tertiary group-hover:bg-bambu-green/20 transition-colors",children:o.jsx(sr,{className:"w-4 h-4 text-bambu-gray group-hover:text-bambu-green transition-colors"})})]})]},ae.key)}),re.filter(ae=>!(ae.key in y)).length===0&&o.jsx("p",{className:"text-center text-bambu-gray py-4 text-sm",children:C?"No matching fields":"All fields added"})]}),o.jsx("div",{className:"pt-3 mt-3 border-t border-bambu-dark-tertiary flex-shrink-0",children:L?o.jsxs("div",{className:"flex gap-2",children:[o.jsx("input",{type:"text",value:R,onChange:ae=>I(ae.target.value),onKeyDown:ae=>ae.key==="Enter"&&$(),placeholder:"custom_field_name",className:"flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white font-mono text-sm placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none",autoFocus:!0}),o.jsx(ke,{size:"sm",onClick:$,disabled:!R.trim(),children:o.jsx(sr,{className:"w-4 h-4"})}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>{q(!1),I("")},children:o.jsx(Gt,{className:"w-4 h-4"})})]}):o.jsxs("button",{onClick:()=>q(!0),className:"w-full flex items-center justify-center gap-2 p-2 text-sm text-bambu-gray hover:text-white border border-dashed border-bambu-dark-tertiary hover:border-bambu-gray-dark rounded-lg transition-colors",children:[o.jsx(sr,{className:"w-4 h-4"}),"Add custom field"]})})]}),o.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3 flex-shrink-0",children:[o.jsx("h3",{className:"text-sm font-medium text-white",children:"Your Overrides"}),o.jsxs("span",{className:"text-xs text-bambu-gray",children:[Object.keys(y).filter(ae=>ae!=="inherits").length," fields"]})]}),o.jsxs("div",{className:"flex-1 overflow-y-auto space-y-2 pr-2 min-h-0",children:[Object.entries(y).filter(([ae])=>ae!=="inherits").map(([ae,ze])=>{const Ue=H.find(et=>et.key===ae);return o.jsxs("div",{className:"p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center justify-between mb-2",children:[o.jsxs("div",{children:[o.jsx("p",{className:"text-sm font-medium text-white",children:Ue?.label||ae}),o.jsx("p",{className:"text-xs text-bambu-gray-dark",children:ae})]}),o.jsx("button",{onClick:()=>Y(ae,void 0),className:"p-1 text-bambu-gray hover:text-red-400 transition-colors",children:o.jsx(Gt,{className:"w-4 h-4"})})]}),Ue?lt(Ue):o.jsx("input",{type:"text",value:String(ze),onChange:et=>Y(ae,et.target.value),className:"w-full px-3 py-1.5 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"})]},ae)}),Object.keys(y).filter(ae=>ae!=="inherits").length===0&&o.jsxs("div",{className:"text-center py-8 text-bambu-gray",children:[o.jsx(wU,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),o.jsx("p",{className:"text-sm",children:"No overrides yet"}),o.jsx("p",{className:"text-xs mt-1",children:"Click fields on the left to add them"})]})]}),Object.keys(y).filter(ae=>ae!=="inherits").length>0&&o.jsx("div",{className:"pt-3 mt-3 border-t border-bambu-dark-tertiary flex-shrink-0",children:o.jsxs("button",{onClick:()=>{W(!0),l("common")},className:"w-full flex items-center justify-center gap-2 p-2 text-sm text-bambu-gray hover:text-white border border-dashed border-bambu-dark-tertiary hover:border-bambu-gray-dark rounded-lg transition-colors",children:[o.jsx(Ts,{className:"w-4 h-4"}),"Save as template"]})})]})]}),s==="json"&&o.jsxs("div",{className:"space-y-2",children:[T&&o.jsxs("div",{className:"flex items-center gap-2 text-red-400 text-sm",children:[o.jsx(mo,{className:"w-4 h-4"}),T]}),o.jsx("textarea",{value:E,onChange:ae=>Me(ae.target.value),className:`w-full h-80 px-3 py-2 bg-bambu-dark border rounded-lg text-white text-xs font-mono focus:outline-none resize-none ${T?"border-red-500 focus:border-red-500":"border-bambu-dark-tertiary focus:border-bambu-green"}`,spellCheck:!1}),o.jsx("p",{className:"text-xs text-bambu-gray",children:"Tip: Drag & drop a .json file anywhere on this modal to import settings"})]})]}),o.jsxs("div",{className:"p-4 border-t border-bambu-dark-tertiary flex gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:t,className:"flex-1",children:"Cancel"}),o.jsxs(ke,{onClick:()=>be.mutate(),disabled:be.isPending||!d.trim()||!a&&!g||!!T,className:"flex-1",children:[be.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin"}):a?o.jsx(Ts,{className:"w-4 h-4"}):o.jsx(sr,{className:"w-4 h-4"}),a?"Save":e?"Duplicate":"Create"]})]})]})})]})}function cWe({settings:t,lastSyncTime:e,onRefresh:n,isRefreshing:r,printers:i}){const[a,s]=M.useState(""),[l,c]=M.useState("all"),[u,d]=M.useState("all"),[f,g]=M.useState("all"),[p,x]=M.useState("all"),[v,y]=M.useState("all"),[b,E]=M.useState("all"),[w,T]=M.useState(null),[A,C]=M.useState(!1),[N,F]=M.useState(!1),[k,R]=M.useState(null),[I,L]=M.useState(null),[q,j]=M.useState(null),[V,K]=M.useState(!1),[W,J]=M.useState([null,null]),[ee,Z]=M.useState(!1),[B,G]=M.useState(null),Q=mn(),te=M.useMemo(()=>[...t.filament.map(re=>({...re,type:"filament"})),...t.printer.map(re=>({...re,type:"printer"})),...t.process.map(re=>({...re,type:"process"}))].map(re=>({...re,meta:HL(re.name)})),[t]),he=M.useMemo(()=>{const H=new Set,re=new Set,$=new Set;return te.forEach(Y=>{Y.meta.nozzle&&H.add(Y.meta.nozzle),Y.meta.filamentType&&re.add(Y.meta.filamentType),Y.meta.layerHeight&&$.add(Y.meta.layerHeight)}),{printers:i.map(Y=>({id:Y.id.toString(),name:Y.name})),nozzles:Array.from(H).sort((Y,se)=>parseFloat(Y)-parseFloat(se)),filaments:Array.from(re).sort(),layerHeights:Array.from($).sort((Y,se)=>parseFloat(Y)-parseFloat(se))}},[te,i]),oe=M.useMemo(()=>f==="all"?null:i.find(re=>re.id.toString()===f)?.model||null,[f,i]),xe=M.useMemo(()=>te.filter(H=>l==="all"||H.type===l).filter(H=>{if(u==="all")return!0;const re=yb(H.setting_id);return u==="custom"?re:!re}).filter(H=>{if(f==="all"||!oe)return!0;const re=H.meta.printer?.toLowerCase()||"",$=oe.toLowerCase();return re.includes($)||$.includes(re)}).filter(H=>p==="all"||H.meta.nozzle===p).filter(H=>v==="all"||H.meta.filamentType===v).filter(H=>b==="all"||H.meta.layerHeight===b).filter(H=>a===""||H.name.toLowerCase().includes(a.toLowerCase())).sort((H,re)=>H.name.localeCompare(re.name)),[te,l,u,f,oe,p,v,b,a]),Te=H=>{if(V){const re=W[0]?.setting_id===H.setting_id,$=W[1]?.setting_id===H.setting_id;if(re)J([W[1],null]);else if($)J([W[0],null]);else if(!W[0])J([H,null]);else if(W[1]){if(W[0].type!==H.type)return;J([W[0],H])}else{if(W[0].type!==H.type)return;J([W[0],H])}}else T(H)},me=H=>{if(W[0]?.setting_id===H.setting_id)return 0;if(W[1]?.setting_id===H.setting_id)return 1},ce=async H=>{try{const re=await Se.getCloudSettingDetail(H.setting_id),$=H.type==="process"?"print":H.type;R({type:$,name:H.name,base_id:re.base_id||"GFSA00",setting:re.setting||{}}),T(null)}catch(re){console.error("Failed to fetch preset details for duplication:",re)}},Ce=async H=>{try{Q.removeQueries({queryKey:["cloudSettingDetail",H.setting_id]});const re=await Se.getCloudSettingDetail(H.setting_id),$=H.type==="process"?"print":H.type;L({type:$,name:H.name,base_id:re.base_id||"GFSA00",setting:re.setting||{},setting_id:H.setting_id}),T(null)}catch(re){console.error("Failed to fetch preset details for editing:",re)}},fe=()=>{c("all"),d("all"),g("all"),x("all"),y("all"),E("all"),s("")},Ie=l!=="all"||u!=="all"||f!=="all"||p!=="all"||v!=="all"||b!=="all"||a!=="",z=t.filament.length+t.printer.length+t.process.length;return o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"space-y-4 mb-6",children:[o.jsxs("div",{className:"flex flex-col sm:flex-row gap-3",children:[o.jsxs("div",{className:"relative flex-1",children:[o.jsx(bl,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray"}),o.jsx("input",{type:"text",value:a,onChange:H=>s(H.target.value),placeholder:"Search presets...",className:"w-full pl-10 pr-4 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none"})]}),o.jsxs("div",{className:"flex gap-2",children:[o.jsxs(ke,{variant:V?"primary":"secondary",onClick:()=>{V?(K(!1),J([null,null])):K(!0)},children:[o.jsx(op,{className:"w-4 h-4"}),V?"Cancel":"Compare"]}),o.jsxs(ke,{variant:"secondary",onClick:()=>F(!0),children:[o.jsx(j0,{className:"w-4 h-4"}),"Templates"]}),o.jsxs(ke,{variant:"secondary",onClick:n,disabled:r,children:[o.jsx(_a,{className:`w-4 h-4 ${r?"animate-spin":""}`}),"Refresh"]}),o.jsxs(ke,{onClick:()=>C(!0),children:[o.jsx(sr,{className:"w-4 h-4"}),"New Preset"]})]})]}),o.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[o.jsx(dR,{className:"w-4 h-4 text-bambu-gray"}),o.jsx(Wm,{label:"Type",value:l,options:[{value:"all",label:"All",count:z},{value:"filament",label:"Filament",count:t.filament.length},{value:"printer",label:"Printer",count:t.printer.length},{value:"process",label:"Process",count:t.process.length}],onChange:H=>c(H)}),o.jsx(Wm,{label:"Owner",value:u,options:[{value:"all",label:"All"},{value:"custom",label:"My Presets"},{value:"builtin",label:"Built-in"}],onChange:H=>d(H)}),he.printers.length>0&&o.jsx(Wm,{label:"Printer",value:f,options:[{value:"all",label:"All"},...he.printers.map(H=>({value:H.id,label:H.name}))],onChange:g}),he.nozzles.length>0&&o.jsx(Wm,{label:"Nozzle",value:p,options:[{value:"all",label:"All"},...he.nozzles.map(H=>({value:H,label:H}))],onChange:x}),he.filaments.length>0&&(l==="all"||l==="filament")&&o.jsx(Wm,{label:"Filament",value:v,options:[{value:"all",label:"All"},...he.filaments.map(H=>({value:H,label:H}))],onChange:y}),he.layerHeights.length>0&&(l==="all"||l==="process")&&o.jsx(Wm,{label:"Layer",value:b,options:[{value:"all",label:"All"},...he.layerHeights.map(H=>({value:H,label:H}))],onChange:E}),Ie&&o.jsx("button",{onClick:fe,className:"px-3 py-2 text-sm text-bambu-gray hover:text-white transition-colors",children:"Clear filters"})]})]}),V&&o.jsx("div",{className:"mb-4 p-3 bg-blue-500/10 border border-blue-500/30 rounded-lg",children:o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{className:"flex items-center gap-4",children:[o.jsx(op,{className:"w-5 h-5 text-blue-400"}),o.jsx("span",{className:"text-white font-medium",children:"Compare Mode"}),o.jsx("span",{className:"text-bambu-gray",children:W[0]?`Select another ${W[0].type} preset`:"Click two presets of the same type to compare"})]}),o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("span",{className:`px-2 py-1 text-sm rounded truncate max-w-[200px] ${W[0]?"bg-blue-500/30 text-blue-700 dark:text-blue-300":"bg-bambu-dark text-bambu-gray"}`,children:W[0]?W[0].name:"1. Select first"}),o.jsx(Wk,{className:"w-4 h-4 text-bambu-gray"}),o.jsx("span",{className:`px-2 py-1 text-sm rounded truncate max-w-[200px] ${W[1]?"bg-blue-500/30 text-blue-700 dark:text-blue-300":"bg-bambu-dark text-bambu-gray"}`,children:W[1]?W[1].name:"2. Select second"})]}),W[0]&&W[1]&&o.jsxs(ke,{size:"sm",onClick:async()=>{try{const[H,re]=await Promise.all([Se.getCloudSettingDetail(W[0].setting_id),Se.getCloudSettingDetail(W[1].setting_id)]);G([H.setting||{},re.setting||{}]),Z(!0)}catch{}},children:[o.jsx(op,{className:"w-4 h-4"}),"Compare Now"]})]})]})}),o.jsxs("div",{className:"flex flex-wrap items-center gap-4 mb-4 text-sm text-bambu-gray",children:[e&&o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsx(rr,{className:"w-3 h-3"}),"Last synced: ",rWe(e.toISOString())]}),o.jsxs("span",{children:["Showing ",xe.length," of ",z," presets"]}),o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-bambu-green"}),o.jsx("span",{children:"= My preset (editable)"})]})]}),xe.length===0?o.jsxs("div",{className:"text-center py-16",children:[o.jsx(pd,{className:"w-12 h-12 text-bambu-gray-dark mx-auto mb-4"}),o.jsx("p",{className:"text-bambu-gray",children:"No presets found"}),Ie&&o.jsx("button",{onClick:fe,className:"mt-2 text-sm text-bambu-green hover:text-bambu-green-light",children:"Clear filters"})]}):o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3 px-1",children:[o.jsx(oR,{className:"w-4 h-4 text-amber-400"}),o.jsx("h3",{className:"text-sm font-medium text-bambu-gray",children:"Filament"}),o.jsxs("span",{className:"text-xs text-bambu-gray-dark",children:["(",xe.filter(H=>H.type==="filament").length,")"]})]}),o.jsxs("div",{className:"space-y-1 max-h-[calc(100vh-320px)] overflow-y-auto pr-1",children:[xe.filter(H=>H.type==="filament").map(H=>o.jsx(kk,{setting:H,onClick:()=>Te(H),onDuplicate:()=>ce(H),compareMode:V,isCompareSelected:me(H)!==void 0,compareIndex:me(H),compareDisabled:V&&!!W[0]&&W[0].type!==H.type},H.setting_id)),xe.filter(H=>H.type==="filament").length===0&&o.jsx("p",{className:"text-xs text-bambu-gray-dark px-3 py-2",children:"No filament presets"})]})]}),o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3 px-1",children:[o.jsx(eM,{className:"w-4 h-4 text-blue-400"}),o.jsx("h3",{className:"text-sm font-medium text-bambu-gray",children:"Process"}),o.jsxs("span",{className:"text-xs text-bambu-gray-dark",children:["(",xe.filter(H=>H.type==="process").length,")"]})]}),o.jsxs("div",{className:"space-y-1 max-h-[calc(100vh-320px)] overflow-y-auto pr-1",children:[xe.filter(H=>H.type==="process").map(H=>o.jsx(kk,{setting:H,onClick:()=>Te(H),onDuplicate:()=>ce(H),compareMode:V,isCompareSelected:me(H)!==void 0,compareIndex:me(H),compareDisabled:V&&!!W[0]&&W[0].type!==H.type},H.setting_id)),xe.filter(H=>H.type==="process").length===0&&o.jsx("p",{className:"text-xs text-bambu-gray-dark px-3 py-2",children:"No process presets"})]})]}),o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3 px-1",children:[o.jsx(Vi,{className:"w-4 h-4 text-purple-400"}),o.jsx("h3",{className:"text-sm font-medium text-bambu-gray",children:"Printer"}),o.jsxs("span",{className:"text-xs text-bambu-gray-dark",children:["(",xe.filter(H=>H.type==="printer").length,")"]})]}),o.jsxs("div",{className:"space-y-1 max-h-[calc(100vh-320px)] overflow-y-auto pr-1",children:[xe.filter(H=>H.type==="printer").map(H=>o.jsx(kk,{setting:H,onClick:()=>Te(H),onDuplicate:()=>ce(H),compareMode:V,isCompareSelected:me(H)!==void 0,compareIndex:me(H),compareDisabled:V&&!!W[0]&&W[0].type!==H.type},H.setting_id)),xe.filter(H=>H.type==="printer").length===0&&o.jsx("p",{className:"text-xs text-bambu-gray-dark px-3 py-2",children:"No printer presets"})]})]})]}),w&&o.jsx(sWe,{setting:w,onClose:()=>T(null),onDeleted:()=>T(null),onDuplicate:()=>ce(w),onEdit:()=>Ce(w)}),(A||k||I||q)&&o.jsx(lWe,{onClose:()=>{C(!1),R(null),L(null),j(null)},initialData:I||k||(q?{type:q.type,name:"",base_id:"",setting:q.setting}:void 0),allPresets:t}),N&&o.jsx(oWe,{onClose:()=>F(!1),onApply:H=>{j({type:H.type,setting:H.settings}),F(!1)}}),ee&&B&&W[0]&&W[1]&&o.jsx(Gte,{onClose:()=>{Z(!1),G(null)},leftPreset:B[0],rightPreset:B[1],leftLabel:W[0].name,rightLabel:W[1].name})]})}function uWe(){const t=mn(),{showToast:e}=Sr(),[n,r]=M.useState("cloud"),[i,a]=M.useState(),{data:s,isLoading:l}=gt({queryKey:["cloudStatus"],queryFn:Se.getCloudStatus}),{data:c=[]}=gt({queryKey:["printers"],queryFn:Se.getPrinters}),{data:u,isLoading:d,refetch:f,dataUpdatedAt:g}=gt({queryKey:["cloudSettings"],queryFn:()=>Se.getCloudSettings(),enabled:!!s?.is_authenticated,retry:!1,staleTime:1e3*60*5});M.useEffect(()=>{g&&a(new Date(g))},[g]);const p=vt({mutationFn:Se.cloudLogout,onSuccess:()=>{t.invalidateQueries({queryKey:["cloudStatus"]}),t.removeQueries({queryKey:["cloudSettings"]}),e("Logged out")}}),x=()=>{t.invalidateQueries({queryKey:["cloudStatus"]})};return l?o.jsx("div",{className:"p-4 md:p-8 flex items-center justify-center min-h-[400px]",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})}):o.jsxs("div",{className:"p-6 lg:p-8",children:[o.jsxs("div",{className:"mb-6",children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:"Profiles"}),o.jsx("p",{className:"text-bambu-gray",children:"Manage your slicer presets and pressure advance calibrations"})]}),o.jsxs("div",{className:"flex border-b border-bambu-dark-tertiary mb-6",children:[o.jsxs("button",{onClick:()=>r("cloud"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${n==="cloud"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(XS,{className:"w-4 h-4"}),"Cloud Profiles"]}),o.jsxs("button",{onClick:()=>r("kprofiles"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${n==="kprofiles"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(ZS,{className:"w-4 h-4"}),"K-Profiles"]})]}),n==="cloud"&&o.jsxs(o.Fragment,{children:[s?.is_authenticated&&o.jsxs("div",{className:"flex items-center justify-between p-3 mb-6 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-bambu-green animate-pulse"}),o.jsxs("span",{className:"text-sm text-bambu-gray",children:["Connected as ",o.jsx("span",{className:"text-white",children:s.email})]})]}),o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>p.mutate(),disabled:p.isPending,children:[o.jsx(Nce,{className:"w-4 h-4"}),"Logout"]})]}),s?.is_authenticated?d?o.jsx("div",{className:"flex items-center justify-center py-16",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})}):u?o.jsx(cWe,{settings:u,lastSyncTime:i,onRefresh:()=>f(),isRefreshing:d,printers:c}):o.jsxs("div",{className:"text-center py-16",children:[o.jsx("p",{className:"text-bambu-gray mb-4",children:"Failed to load profiles"}),o.jsx(ke,{onClick:()=>f(),children:"Retry"})]}):o.jsx(iWe,{onSuccess:x})]}),n==="kprofiles"&&o.jsx(nWe,{}),o.jsx(aWe,{})]})}const t0={Droplet:oR,Flame:Ble,Ruler:pue,Sparkles:j0,Square:Ep,Cable:Uoe,Wrench:gd,Calendar:Qr,Timer:Zu,Cog:ple,Fan:Ple,Zap:ef,Wind:xde,Thermometer:tM,Layers:pd,Box:_p,Target:BG,RefreshCw:_a,Settings:xR,Filter:dR,CircleDot:nle};function M0(t){return t&&t0[t]||gd}function qm(t,e){if(e==="days")return t<1?"Today":t===1?"1 day":t<7?`${Math.round(t)} days`:t<180?`${Math.round(t/7)} weeks`:`${Math.round(t/30)} months`;{if(t<1)return`${Math.round(t*60)}m`;if(t<24)return`${t<10?t.toFixed(1):Math.round(t)}h`;const n=t/24;if(n<7)return`${n<2?n.toFixed(1):Math.round(n)}d`;const r=n/7;return r<12?`${r<2?r.toFixed(1):Math.round(r)}w`:`${Math.round(r/4)}mo`}}function Pk(t,e){return e==="days"?t===1?"1 day":t===7?"1 week":t===14?"2 weeks":t===30?"1 month":t===60?"2 months":t===90?"3 months":t===180?"6 months":t===365?"1 year":`${t} days`:`${t}h`}function dWe({item:t,onPerform:e,onToggle:n}){const r=M0(t.maintenance_type_icon),i=t.interval_type||"hours",s=(()=>{if(i==="days"){const f=t.days_since_maintenance??0;return Math.max(0,Math.min(100,f/t.interval_hours*100))}return Math.max(0,Math.min(100,(t.interval_hours-t.hours_until_due)/t.interval_hours*100))})(),l=()=>t.enabled?t.is_due?"text-red-400":t.is_warning?"text-amber-400":"text-bambu-green":"text-bambu-gray",c=()=>t.enabled?t.is_due?"bg-red-500":t.is_warning?"bg-amber-500":"bg-bambu-green":"bg-bambu-gray/30",u=()=>t.enabled?t.is_due?"bg-red-500/5 border-red-500/20":t.is_warning?"bg-amber-500/5 border-amber-500/20":"bg-bambu-dark-secondary border-bambu-dark-tertiary":"bg-bambu-dark-secondary/50",d=()=>{if(!t.enabled)return"Disabled";if(i==="days"){const f=t.days_until_due??0;return t.is_due?`Overdue by ${qm(Math.abs(f),"days")}`:t.is_warning?`Due in ${qm(f,"days")}`:`${qm(f,"days")} left`}else return t.is_due?`Overdue by ${qm(Math.abs(t.hours_until_due),"hours")}`:t.is_warning?`Due in ${qm(t.hours_until_due,"hours")}`:`${qm(t.hours_until_due,"hours")} left`};return o.jsx("div",{className:`rounded-xl border p-4 transition-all ${u()}`,children:o.jsxs("div",{className:"flex items-start gap-3",children:[o.jsxs("div",{className:`relative p-2.5 rounded-lg ${t.is_due?"bg-red-500/20":t.is_warning?"bg-amber-500/20":t.enabled?"bg-bambu-dark":"bg-bambu-dark/50"}`,children:[o.jsx(r,{className:`w-5 h-5 ${l()}`}),t.enabled&&(t.is_due||t.is_warning)&&o.jsx("span",{className:`absolute -top-1 -right-1 w-2.5 h-2.5 rounded-full ${t.is_due?"bg-red-500":"bg-amber-500"} animate-pulse`})]}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("h3",{className:`font-medium truncate ${t.enabled?"text-white":"text-bambu-gray"}`,children:t.maintenance_type_name}),i==="days"&&o.jsx("span",{title:"Time-based interval",children:o.jsx(Qr,{className:"w-3.5 h-3.5 text-bambu-gray shrink-0"})})]}),o.jsx("div",{className:"mt-2 mb-1.5",children:o.jsx("div",{className:"w-full h-1.5 bg-bambu-dark rounded-full overflow-hidden",children:o.jsx("div",{className:`h-full rounded-full transition-all duration-500 ${c()}`,style:{width:`${s}%`}})})}),o.jsxs("div",{className:`text-xs flex items-center gap-1 ${l()}`,children:[t.is_due&&o.jsx(Gn,{className:"w-3 h-3"}),t.is_warning&&!t.is_due&&o.jsx(rr,{className:"w-3 h-3"}),!t.is_due&&!t.is_warning&&t.enabled&&o.jsx(xl,{className:"w-3 h-3"}),d()]})]}),o.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[o.jsx(In,{checked:t.enabled,onChange:f=>n(t.id,f)}),o.jsxs(ke,{size:"sm",variant:t.is_due?"primary":"secondary",onClick:()=>e(t.id),disabled:!t.enabled,className:"!px-3",children:[o.jsx(ig,{className:"w-3.5 h-3.5"}),"Reset"]})]})]})})}function hWe({overview:t,onPerform:e,onToggle:n,onSetHours:r}){const[i,a]=M.useState(!0),[s,l]=M.useState(!1),[c,u]=M.useState(t.total_print_hours.toFixed(1)),d=[...t.maintenance_items].sort((p,x)=>p.is_due&&!x.is_due?-1:!p.is_due&&x.is_due?1:p.is_warning&&!x.is_warning?-1:!p.is_warning&&x.is_warning?1:p.maintenance_type_id-x.maintenance_type_id),f=d.find(p=>p.enabled&&(p.is_due||p.is_warning)),g=()=>{const p=parseFloat(c);!isNaN(p)&&p>=0&&(r(t.printer_id,p),l(!1))};return o.jsxs(wt,{className:"overflow-hidden",children:[o.jsxs("div",{className:"p-5",children:[o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{className:"flex items-center gap-4",children:[o.jsx("h2",{className:"text-xl font-semibold text-white",children:t.printer_name}),o.jsxs("div",{className:"flex items-center gap-2",children:[t.due_count>0&&o.jsxs("span",{className:"px-2.5 py-1 bg-red-500/20 text-red-400 text-xs font-medium rounded-full flex items-center gap-1.5",children:[o.jsx(Gn,{className:"w-3 h-3"}),t.due_count," overdue"]}),t.warning_count>0&&o.jsxs("span",{className:"px-2.5 py-1 bg-amber-500/20 text-amber-400 text-xs font-medium rounded-full flex items-center gap-1.5",children:[o.jsx(rr,{className:"w-3 h-3"}),t.warning_count," due soon"]}),t.due_count===0&&t.warning_count===0&&o.jsxs("span",{className:"px-2.5 py-1 bg-bambu-green/20 text-bambu-green text-xs font-medium rounded-full flex items-center gap-1.5",children:[o.jsx(xl,{className:"w-3 h-3"}),"All good"]})]})]}),o.jsxs("button",{onClick:()=>a(!i),className:"flex items-center gap-1.5 px-3 py-1.5 text-sm text-bambu-gray hover:text-white hover:bg-bambu-dark rounded-lg transition-colors",children:[i?o.jsx(Mb,{className:"w-4 h-4"}):o.jsx(Cl,{className:"w-4 h-4"}),i?"Collapse":"Expand"]})]}),o.jsxs("div",{className:"flex items-center gap-6 mt-4",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"p-2 bg-bambu-dark/50 rounded-lg",children:o.jsx(Zu,{className:"w-4 h-4 text-bambu-gray"})}),s?o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"number",value:c,onChange:p=>u(p.target.value),onKeyDown:p=>{p.key==="Enter"&&g(),p.key==="Escape"&&l(!1)},className:"w-24 px-2 py-1 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm",min:"0",step:"1",autoFocus:!0}),o.jsx("span",{className:"text-xs text-bambu-gray",children:"hours"}),o.jsx(ke,{size:"sm",onClick:g,children:"Save"}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>l(!1),children:"Cancel"})]}):o.jsxs("button",{onClick:()=>{u(Math.round(t.total_print_hours).toString()),l(!0)},className:"group",children:[o.jsxs("div",{className:"text-sm font-medium text-white group-hover:text-bambu-green transition-colors flex items-center gap-1",children:[Math.round(t.total_print_hours)," hours",o.jsx(Qh,{className:"w-3 h-3 text-bambu-gray group-hover:text-bambu-green"})]}),o.jsx("div",{className:"text-xs text-bambu-gray",children:"Total print time"})]})]}),o.jsx("div",{className:"w-px h-10 bg-bambu-dark-tertiary"}),f&&o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:`p-2 rounded-lg ${f.is_due?"bg-red-500/20":"bg-amber-500/20"}`,children:(()=>{const p=M0(f.maintenance_type_icon);return o.jsx(p,{className:`w-4 h-4 ${f.is_due?"text-red-400":"text-amber-400"}`})})()}),o.jsxs("div",{children:[o.jsx("div",{className:`text-sm font-medium ${f.is_due?"text-red-400":"text-amber-400"}`,children:f.maintenance_type_name}),o.jsx("div",{className:`text-xs ${f.is_due?"text-red-400/70":"text-amber-400/70"}`,children:f.is_due?"Overdue":"Due soon"})]})]})]})]}),i&&o.jsx(Et,{className:"pt-0 border-t border-bambu-dark-tertiary",children:o.jsx("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3 pt-4",children:d.map(p=>o.jsx(dWe,{item:p,onPerform:e,onToggle:n},p.id))})})]})}function fWe({overview:t,types:e,onUpdateInterval:n,onAddType:r,onUpdateType:i,onDeleteType:a,onAssignType:s,onRemoveItem:l}){const[c,u]=M.useState(null),[d,f]=M.useState(""),[g,p]=M.useState("hours"),[x,v]=M.useState(!1),[y,b]=M.useState(""),[E,w]=M.useState("100"),[T,A]=M.useState("hours"),[C,N]=M.useState("Wrench"),[F,k]=M.useState(new Set),[R,I]=M.useState(null),L=M.useMemo(()=>t?t.map(Ie=>({id:Ie.printer_id,name:Ie.printer_name})):[],[t]),q=Ie=>t?t.filter(z=>z.maintenance_items.some(H=>H.maintenance_type_id===Ie)).map(z=>({printerId:z.printer_id,printerName:z.printer_name,itemId:z.maintenance_items.find(H=>H.maintenance_type_id===Ie)?.id})):[],j=Ie=>{if(!t)return[];const z=new Set(q(Ie).map(H=>H.printerId));return L.filter(H=>!z.has(H.id))},[V,K]=M.useState(null),[W,J]=M.useState(""),[ee,Z]=M.useState(""),[B,G]=M.useState("hours"),[Q,te]=M.useState("Wrench"),he=Ie=>{K(Ie),J(Ie.name),Z(Ie.default_interval_hours.toString()),G(Ie.interval_type||"hours"),te(Ie.icon||"Wrench")},oe=()=>{V&&W.trim()&&parseFloat(ee)>0&&(i(V.id,{name:W.trim(),default_interval_hours:parseFloat(ee),interval_type:B,icon:Q}),K(null))},xe=(Ie,z,H)=>{const re=parseFloat(d);if(!isNaN(re)&&re>0){const $=Math.abs(re-z)<.01?null:re;n(Ie,{custom_interval_hours:$,custom_interval_type:g!==H?g:null})}u(null)},Te=Ie=>{Ie.preventDefault(),y.trim()&&parseFloat(E)>0&&F.size>0&&(r({name:y.trim(),default_interval_hours:parseFloat(E),interval_type:T,icon:C},Array.from(F)),b(""),w("100"),A("hours"),k(new Set),v(!1))},me=Ie=>{k(z=>{const H=new Set(z);return H.has(Ie)?H.delete(Ie):H.add(Ie),H})},ce=t?.map(Ie=>({printerId:Ie.printer_id,printerName:Ie.printer_name,items:Ie.maintenance_items.sort((z,H)=>z.maintenance_type_id-H.maintenance_type_id)})).sort((Ie,z)=>Ie.printerName.localeCompare(z.printerName))||[],Ce=e.filter(Ie=>Ie.is_system),fe=e.filter(Ie=>!Ie.is_system);return o.jsxs("div",{className:"space-y-8",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center justify-between mb-4",children:[o.jsxs("div",{children:[o.jsx("h2",{className:"text-lg font-semibold text-white",children:"Maintenance Types"}),o.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:"System types and your custom maintenance tasks"})]}),o.jsxs(ke,{onClick:()=>v(!x),children:[o.jsx(sr,{className:"w-4 h-4"}),"Add Custom Type"]})]}),x&&o.jsx(wt,{className:"mb-6",children:o.jsx(Et,{className:"py-4",children:o.jsxs("form",{onSubmit:Te,children:[o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[o.jsxs("div",{className:"lg:col-span-2",children:[o.jsx("label",{className:"block text-xs text-bambu-gray mb-1.5",children:"Name"}),o.jsx("input",{type:"text",value:y,onChange:Ie=>b(Ie.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",placeholder:"e.g., Replace HEPA Filter",autoFocus:!0})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-xs text-bambu-gray mb-1.5",children:"Interval Type"}),o.jsxs("select",{value:T,onChange:Ie=>{A(Ie.target.value),Ie.target.value==="days"?w("30"):w("100")},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"hours",children:"Print Hours"}),o.jsx("option",{value:"days",children:"Calendar Days"})]})]}),o.jsxs("div",{children:[o.jsxs("label",{className:"block text-xs text-bambu-gray mb-1.5",children:["Interval (",T==="days"?"days":"hours",")"]}),o.jsx("input",{type:"number",value:E,onChange:Ie=>w(Ie.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",min:"1"})]})]}),o.jsx("div",{className:"mt-4 flex items-end justify-between",children:o.jsxs("div",{children:[o.jsx("label",{className:"block text-xs text-bambu-gray mb-1.5",children:"Icon"}),o.jsx("div",{className:"flex gap-1",children:Object.keys(t0).map(Ie=>{const z=t0[Ie];return o.jsx("button",{type:"button",onClick:()=>N(Ie),className:`p-2 rounded-lg transition-colors ${C===Ie?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary"}`,children:o.jsx(z,{className:"w-4 h-4"})},Ie)})})]})}),o.jsxs("div",{className:"mt-4",children:[o.jsx("label",{className:"block text-xs text-bambu-gray mb-1.5",children:"Assign to Printers"}),o.jsx("div",{className:"flex flex-wrap gap-2",children:L.map(Ie=>o.jsx("button",{type:"button",onClick:()=>me(Ie.id),className:`px-3 py-1.5 rounded-lg text-sm transition-colors ${F.has(Ie.id)?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary"}`,children:Ie.name},Ie.id))}),F.size===0&&o.jsx("p",{className:"text-xs text-orange-400 mt-1",children:"Select at least one printer"})]}),o.jsxs("div",{className:"mt-4 flex justify-end gap-2",children:[o.jsx(ke,{type:"button",variant:"secondary",onClick:()=>{v(!1),k(new Set)},children:"Cancel"}),o.jsx(ke,{type:"submit",disabled:!y.trim()||F.size===0,children:"Add Type"})]})]})})}),o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3",children:[Ce.map(Ie=>{const z=M0(Ie.icon),H=Ie.interval_type||"hours";return o.jsx("div",{className:"bg-bambu-dark-secondary rounded-xl p-4 border border-bambu-dark-tertiary",children:o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"p-2.5 bg-bambu-dark rounded-lg",children:o.jsx(z,{className:"w-5 h-5 text-bambu-gray"})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("div",{className:"text-sm font-medium text-white truncate",children:Ie.name}),o.jsxs("div",{className:"text-xs text-bambu-gray mt-0.5 flex items-center gap-1",children:[H==="days"?o.jsx(Qr,{className:"w-3 h-3"}):o.jsx(Zu,{className:"w-3 h-3"}),Pk(Ie.default_interval_hours,H)]})]})]})},Ie.id)}),fe.map(Ie=>{const z=M0(Ie.icon),H=Ie.interval_type||"hours";if(V?.id===Ie.id)return o.jsx("div",{className:"bg-bambu-dark-secondary rounded-xl p-4 border border-bambu-green",children:o.jsxs("div",{className:"space-y-3",children:[o.jsx("input",{type:"text",value:W,onChange:ue=>J(ue.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",placeholder:"Name",autoFocus:!0}),o.jsxs("div",{className:"flex gap-2",children:[o.jsxs("select",{value:B,onChange:ue=>G(ue.target.value),className:"flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"hours",children:"Print Hours"}),o.jsx("option",{value:"days",children:"Calendar Days"})]}),o.jsx("input",{type:"number",value:ee,onChange:ue=>Z(ue.target.value),className:"w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",min:"1"})]}),o.jsx("div",{className:"flex flex-wrap gap-1",children:Object.keys(t0).map(ue=>{const Ee=t0[ue];return o.jsx("button",{type:"button",onClick:()=>te(ue),className:`p-1.5 rounded transition-colors ${Q===ue?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:o.jsx(Ee,{className:"w-3.5 h-3.5"})},ue)})}),o.jsxs("div",{className:"flex gap-2",children:[o.jsx(ke,{size:"sm",onClick:oe,disabled:!W.trim(),children:"Save"}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>K(null),children:"Cancel"})]})]})},Ie.id);const $=q(Ie.id),Y=j(Ie.id),se=R===Ie.id;return o.jsxs("div",{className:"bg-bambu-dark-secondary rounded-xl p-4 border border-bambu-green/30",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"p-2.5 bg-bambu-green/20 rounded-lg",children:o.jsx(z,{className:"w-5 h-5 text-bambu-green"})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("span",{className:"text-sm font-medium text-white truncate",children:Ie.name}),o.jsx("span",{className:"px-1.5 py-0.5 bg-bambu-green/20 text-bambu-green text-[10px] font-medium rounded",children:"Custom"})]}),o.jsxs("div",{className:"text-xs text-bambu-gray mt-0.5 flex items-center gap-1",children:[H==="days"?o.jsx(Qr,{className:"w-3 h-3"}):o.jsx(Zu,{className:"w-3 h-3"}),Pk(Ie.default_interval_hours,H)]})]}),o.jsxs("button",{onClick:()=>I(se?null:Ie.id),className:`px-2 py-1 rounded-lg border transition-colors flex items-center gap-1 ${$.length>0?"border-bambu-green/50 bg-bambu-green/10 text-bambu-green hover:bg-bambu-green/20":"border-orange-400/50 bg-orange-400/10 text-orange-400 hover:bg-orange-400/20"}`,title:`${$.length} printer(s) assigned - click to manage`,children:[o.jsx(Vi,{className:"w-3 h-3"}),o.jsx("span",{className:"text-xs font-medium",children:$.length}),o.jsx(Cl,{className:`w-3 h-3 transition-transform ${se?"rotate-180":""}`})]}),o.jsx("button",{onClick:()=>he(Ie),className:"p-2 rounded-lg hover:bg-bambu-dark text-bambu-gray hover:text-white transition-colors",children:o.jsx(Qh,{className:"w-4 h-4"})}),o.jsx("button",{onClick:()=>{confirm(`Delete "${Ie.name}"?`)&&a(Ie.id)},className:"p-2 rounded-lg hover:bg-bambu-dark text-bambu-gray hover:text-red-400 transition-colors",children:o.jsx(En,{className:"w-4 h-4"})})]}),se&&o.jsxs("div",{className:"mt-3 pt-3 border-t border-bambu-dark-tertiary",children:[o.jsx("p",{className:"text-xs text-bambu-gray mb-2",children:"Assigned to printers:"}),$.length===0?o.jsx("p",{className:"text-xs text-orange-400",children:"No printers assigned"}):o.jsx("div",{className:"flex flex-wrap gap-1 mb-2",children:$.map(ue=>o.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 bg-bambu-dark rounded text-xs text-white",children:[ue.printerName,o.jsx("button",{onClick:()=>ue.itemId&&l(ue.itemId),className:"hover:text-red-400 ml-1",title:"Remove from this printer",children:"×"})]},ue.printerId))}),Y.length>0&&o.jsxs("div",{className:"flex flex-wrap gap-1",children:[o.jsx("span",{className:"text-xs text-bambu-gray mr-1",children:"Add:"}),Y.map(ue=>o.jsxs("button",{onClick:()=>s(ue.id,Ie.id),className:"px-2 py-1 bg-bambu-dark hover:bg-bambu-green/20 rounded text-xs text-bambu-gray hover:text-bambu-green transition-colors",children:["+ ",ue.name]},ue.id))]})]})]},Ie.id)})]})]}),ce.length>0&&o.jsxs("div",{children:[o.jsxs("div",{className:"mb-4",children:[o.jsx("h2",{className:"text-lg font-semibold text-white",children:"Interval Overrides"}),o.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:"Customize intervals for specific printers"})]}),o.jsx("div",{className:"space-y-4",children:ce.map(Ie=>o.jsx(wt,{children:o.jsxs(Et,{className:"py-4",children:[o.jsx("h3",{className:"text-sm font-medium text-white mb-3",children:Ie.printerName}),o.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2",children:Ie.items.map(z=>{const H=M0(z.maintenance_type_icon),re=e.find(Ee=>Ee.id===z.maintenance_type_id),$=re?.default_interval_hours||z.interval_hours,Y=re?.interval_type||"hours",se=z.interval_type||"hours",ue=c===z.id;return o.jsxs("div",{className:"flex items-center gap-2 p-2.5 bg-bambu-dark rounded-lg",children:[o.jsx(H,{className:"w-4 h-4 text-bambu-gray shrink-0"}),o.jsx("span",{className:"text-xs text-bambu-gray flex-1 truncate",children:z.maintenance_type_name}),ue?o.jsxs("div",{className:"flex items-center gap-1",children:[g==="days"?o.jsx(Qr,{className:"w-3.5 h-3.5 text-bambu-gray shrink-0"}):o.jsx(Zu,{className:"w-3.5 h-3.5 text-bambu-gray shrink-0"}),o.jsxs("select",{value:g,onChange:Ee=>p(Ee.target.value),className:"px-1.5 py-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-xs",children:[o.jsx("option",{value:"hours",children:"Print Hours"}),o.jsx("option",{value:"days",children:"Calendar Days"})]}),o.jsx("input",{type:"number",value:d,onChange:Ee=>f(Ee.target.value),onKeyDown:Ee=>{Ee.key==="Enter"&&xe(z.id,$,Y),Ee.key==="Escape"&&u(null)},className:"w-16 px-2 py-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-xs",min:"1"}),o.jsx(ke,{size:"sm",onClick:()=>xe(z.id,$,Y),children:"OK"})]}):o.jsxs("button",{onClick:()=>{u(z.id),f(z.interval_hours.toString()),p(se)},className:"px-2 py-1 bg-bambu-dark-tertiary hover:bg-bambu-dark-secondary border border-bambu-dark-tertiary hover:border-bambu-green rounded text-xs font-medium text-white transition-colors flex items-center gap-1",children:[se==="days"?o.jsx(Qr,{className:"w-3 h-3"}):o.jsx(Zu,{className:"w-3 h-3"}),Pk(z.interval_hours,se),o.jsx(Qh,{className:"w-3 h-3 text-bambu-gray"})]})]},z.id)})})]})},Ie.printerId))})]}),ce.length===0&&o.jsx(wt,{children:o.jsxs(Et,{className:"text-center py-12",children:[o.jsx(rr,{className:"w-12 h-12 mx-auto mb-4 text-bambu-gray/30"}),o.jsx("p",{className:"text-bambu-gray",children:"No printers configured"}),o.jsx("p",{className:"text-sm text-bambu-gray/70 mt-1",children:"Add printers to configure maintenance intervals"})]})})]})}function mWe(){const t=mn(),{showToast:e}=Sr(),[n,r]=M.useState("status"),{data:i,isLoading:a}=gt({queryKey:["maintenanceOverview"],queryFn:Se.getMaintenanceOverview}),{data:s}=gt({queryKey:["maintenanceTypes"],queryFn:Se.getMaintenanceTypes}),l=vt({mutationFn:({id:w,notes:T})=>Se.performMaintenance(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]}),t.invalidateQueries({queryKey:["maintenanceSummary"]}),e("Maintenance marked as complete")},onError:w=>{e(w.message,"error")}}),c=vt({mutationFn:({id:w,data:T})=>Se.updateMaintenanceItem(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]})},onError:w=>{e(w.message,"error")}}),u=vt({mutationFn:({id:w,data:T})=>Se.updateMaintenanceType(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceTypes"]}),t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Maintenance type updated")},onError:w=>{e(w.message,"error")}}),d=vt({mutationFn:Se.deleteMaintenanceType,onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceTypes"]}),t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Maintenance type deleted")},onError:w=>{e(w.message,"error")}}),f=vt({mutationFn:({printerId:w,hours:T})=>Se.setPrinterHours(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]}),t.invalidateQueries({queryKey:["maintenanceSummary"]}),e("Print hours updated")},onError:w=>{e(w.message,"error")}}),g=vt({mutationFn:({printerId:w,typeId:T})=>Se.assignMaintenanceType(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Printer assigned")},onError:w=>{e(w.message,"error")}}),p=vt({mutationFn:Se.removeMaintenanceItem,onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Printer removed")},onError:w=>{e(w.message,"error")}}),x=w=>{l.mutate({id:w})},v=(w,T)=>{c.mutate({id:w,data:{enabled:T}})},y=(w,T)=>{f.mutate({printerId:w,hours:T})};if(a)return o.jsx("div",{className:"p-4 md:p-8 flex justify-center",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})});const b=i?.reduce((w,T)=>w+T.due_count,0)||0,E=i?.reduce((w,T)=>w+T.warning_count,0)||0;return o.jsxs("div",{className:"p-4 md:p-8",children:[o.jsxs("div",{className:"mb-6",children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:"Maintenance"}),o.jsx("p",{className:"text-bambu-gray text-sm mt-1",children:n==="status"?o.jsxs(o.Fragment,{children:[b>0&&o.jsxs("span",{className:"text-red-400",children:[b," task",b!==1?"s":""," overdue"]}),b>0&&E>0&&" · ",E>0&&o.jsxs("span",{className:"text-amber-400",children:[E," due soon"]}),b===0&&E===0&&o.jsx("span",{className:"text-bambu-green",children:"All maintenance up to date"})]}):"Configure maintenance types and intervals"})]}),o.jsxs("div",{className:"flex gap-1 mb-6 border-b border-bambu-dark-tertiary",children:[o.jsx("button",{onClick:()=>r("status"),className:`px-4 py-2 text-sm font-medium border-b-2 -mb-px transition-colors ${n==="status"?"text-bambu-green border-bambu-green":"text-bambu-gray border-transparent hover:text-white"}`,children:"Status"}),o.jsx("button",{onClick:()=>r("settings"),className:`px-4 py-2 text-sm font-medium border-b-2 -mb-px transition-colors ${n==="settings"?"text-bambu-green border-bambu-green":"text-bambu-gray border-transparent hover:text-white"}`,children:"Settings"})]}),n==="status"?o.jsx("div",{className:"space-y-6",children:i&&i.length>0?[...i].sort((w,T)=>{const A=w.due_count*10+w.warning_count,C=T.due_count*10+T.warning_count;return A!==C?C-A:w.printer_name.localeCompare(T.printer_name)}).map(w=>o.jsx(hWe,{overview:w,onPerform:x,onToggle:v,onSetHours:y},w.printer_id)):o.jsx(wt,{children:o.jsxs(Et,{className:"text-center py-16",children:[o.jsx(gd,{className:"w-16 h-16 mx-auto mb-4 text-bambu-gray/30"}),o.jsx("p",{className:"text-lg font-medium text-white mb-2",children:"No printers configured"}),o.jsx("p",{className:"text-bambu-gray",children:"Add printers to start tracking maintenance"})]})})}):o.jsx(fWe,{overview:i,types:s||[],onUpdateInterval:(w,T)=>c.mutate({id:w,data:T}),onAddType:async(w,T)=>{const A=await Se.createMaintenanceType(w);for(const C of T)await Se.assignMaintenanceType(C,A.id);t.invalidateQueries({queryKey:["maintenanceTypes"]}),t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Maintenance type added")},onUpdateType:(w,T)=>u.mutate({id:w,data:T}),onDeleteType:w=>d.mutate(w),onAssignType:(w,T)=>g.mutate({printerId:w,typeId:T}),onRemoveItem:w=>p.mutate(w)})]})}const q9=["#ef4444","#f97316","#eab308","#22c55e","#06b6d4","#3b82f6","#8b5cf6","#ec4899","#6b7280"];function Wte({project:t,onClose:e,onSave:n,isLoading:r}){const[i,a]=M.useState(t?.name||""),[s,l]=M.useState(t?.description||""),[c,u]=M.useState(t?.color||q9[0]),[d,f]=M.useState(t?.target_count?.toString()||""),[g,p]=M.useState(t?.status||"active"),[x,v]=M.useState(t?.tags||""),[y,b]=M.useState(t?.due_date?.split("T")[0]||""),[E,w]=M.useState(t?.priority||"normal"),T=A=>{A.preventDefault(),n({name:i.trim(),description:s.trim()||void 0,color:c,target_count:d?parseInt(d,10):void 0,tags:x.trim()||void 0,due_date:y||void 0,priority:E,...t&&{status:g}})};return o.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:o.jsxs("div",{className:"bg-bambu-dark-secondary rounded-lg w-full max-w-md border border-bambu-dark-tertiary",children:[o.jsx("div",{className:"p-4 border-b border-bambu-dark-tertiary",children:o.jsx("h2",{className:"text-lg font-semibold text-white",children:t?"Edit Project":"New Project"})}),o.jsxs("form",{onSubmit:T,className:"p-4 space-y-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Name"}),o.jsx("input",{type:"text",value:i,onChange:A=>a(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"e.g., Voron 2.4 Build",required:!0})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Description"}),o.jsx("textarea",{value:s,onChange:A=>l(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green resize-none",placeholder:"Optional description...",rows:2})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Color"}),o.jsx("div",{className:"flex gap-2 flex-wrap",children:q9.map(A=>o.jsx("button",{type:"button",onClick:()=>u(A),className:`w-8 h-8 rounded-full transition-transform ${c===A?"ring-2 ring-white ring-offset-2 ring-offset-bambu-dark-secondary scale-110":""}`,style:{backgroundColor:A}},A))})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Target Print Count (optional)"}),o.jsx("input",{type:"number",value:d,onChange:A=>f(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"e.g., 50 parts to print",min:"1"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Tags (comma-separated)"}),o.jsx("input",{type:"text",value:x,onChange:A=>v(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"e.g., voron, functional, gift"})]}),o.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Due Date"}),o.jsx("input",{type:"date",value:y,onChange:A=>b(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white focus:outline-none focus:border-bambu-green"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Priority"}),o.jsxs("select",{value:E,onChange:A=>w(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white focus:outline-none focus:border-bambu-green",children:[o.jsx("option",{value:"low",children:"Low"}),o.jsx("option",{value:"normal",children:"Normal"}),o.jsx("option",{value:"high",children:"High"}),o.jsx("option",{value:"urgent",children:"Urgent"})]})]})]}),t&&o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Status"}),o.jsxs("select",{value:g,onChange:A=>p(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white focus:outline-none focus:border-bambu-green",children:[o.jsx("option",{value:"active",children:"Active"}),o.jsx("option",{value:"completed",children:"Completed"}),o.jsx("option",{value:"archived",children:"Archived"})]})]}),o.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[o.jsx(ke,{type:"button",variant:"secondary",onClick:e,children:"Cancel"}),o.jsx(ke,{type:"submit",disabled:!i.trim()||r,children:r?o.jsx(xt,{className:"w-4 h-4 animate-spin"}):t?"Save":"Create"})]})]})]})})}function pWe({project:t,onClick:e,onEdit:n,onDelete:r}){const i=t.progress_percent??0,a=t.status==="completed",s=t.status==="archived",[l,c]=M.useState(!1),d=a?{icon:sR,color:"text-bambu-green",bg:"bg-bambu-green/10"}:s?{icon:oo,color:"text-bambu-gray",bg:"bg-bambu-gray/10"}:t.queue_count>0?{icon:rr,color:"text-blue-400",bg:"bg-blue-400/10"}:{icon:Uo,color:"text-bambu-gray",bg:"bg-bambu-gray/10"};return o.jsxs("div",{className:"group relative bg-gradient-to-br from-bambu-card to-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary hover:border-bambu-green/50 hover:shadow-lg hover:shadow-bambu-green/5 transition-all duration-300 cursor-pointer overflow-hidden",onClick:e,children:[o.jsx("div",{className:"absolute top-0 left-0 w-1.5 h-full",style:{backgroundColor:t.color||"#6b7280",boxShadow:`0 0 12px ${t.color||"#6b7280"}40`}}),o.jsxs("div",{className:"p-5 pl-6",children:[o.jsxs("div",{className:"flex items-start justify-between mb-4",children:[o.jsxs("div",{className:"flex items-center gap-3 min-w-0 flex-1",children:[o.jsx("div",{className:`p-2 rounded-lg ${d.bg} flex-shrink-0`,children:o.jsx(d.icon,{className:`w-5 h-5 ${d.color}`})}),o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[o.jsx("h3",{className:"font-semibold text-white truncate",children:t.name}),t.target_count?o.jsxs("span",{className:`text-xs px-2 py-0.5 rounded-full whitespace-nowrap font-medium ${i>=100?"bg-bambu-green/20 text-bambu-green":"bg-bambu-dark text-bambu-gray"}`,children:[t.archive_count,"/",t.target_count," parts"]}):t.archive_count>0?o.jsxs("span",{className:"text-xs px-2 py-0.5 rounded-full whitespace-nowrap font-medium bg-bambu-dark text-bambu-gray",children:[t.archive_count," print",t.archive_count!==1?"s":""]}):null,a&&o.jsx("span",{className:"text-xs bg-bambu-green/20 text-bambu-green px-2 py-0.5 rounded-full whitespace-nowrap",children:"Done"}),s&&o.jsx("span",{className:"text-xs bg-bambu-gray/20 text-bambu-gray px-2 py-0.5 rounded-full whitespace-nowrap",children:"Archived"})]}),t.description&&o.jsx("p",{className:"text-sm text-bambu-gray/70 mt-1 line-clamp-1",children:t.description}),t.archives&&t.archives.length>0&&(()=>{const f=[...new Set(t.archives.map(p=>p.filament_type).filter(Boolean))],g=[...new Set(t.archives.map(p=>p.filament_color).filter(Boolean))];return f.length===0&&g.length===0?null:o.jsxs("div",{className:"flex items-center gap-2 mt-1.5",children:[f.slice(0,3).map(p=>o.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-bambu-dark text-bambu-gray rounded",children:p},p)),g.length>0&&o.jsxs("div",{className:"flex items-center gap-0.5",children:[g.slice(0,5).map(p=>o.jsx("div",{className:"w-3 h-3 rounded-full border border-white/20",style:{backgroundColor:p.startsWith("#")?p:`#${p}`},title:p},p)),g.length>5&&o.jsxs("span",{className:"text-[10px] text-bambu-gray ml-0.5",children:["+",g.length-5]})]})]})})()]})]}),o.jsxs("div",{className:"relative",onClick:f=>f.stopPropagation(),children:[o.jsx("button",{className:"p-1.5 rounded-lg hover:bg-bambu-dark text-bambu-gray hover:text-white transition-colors opacity-0 group-hover:opacity-100",onClick:()=>c(!l),children:o.jsx(cR,{className:"w-4 h-4"})}),l&&o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"fixed inset-0 z-10",onClick:()=>c(!1)}),o.jsxs("div",{className:"absolute right-0 top-8 z-20 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl py-1 min-w-[120px]",children:[o.jsxs("button",{className:"w-full px-3 py-2 text-left text-sm text-white hover:bg-bambu-dark flex items-center gap-2",onClick:()=>{n(),c(!1)},children:[o.jsx(Qh,{className:"w-4 h-4"}),"Edit"]}),o.jsxs("button",{className:"w-full px-3 py-2 text-left text-sm text-red-400 hover:bg-bambu-dark flex items-center gap-2",onClick:()=>{r(),c(!1)},children:[o.jsx(En,{className:"w-4 h-4"}),"Delete"]})]})]})]})]}),o.jsx("div",{className:"mb-4",children:t.target_count?o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"flex items-center justify-between text-xs mb-2",children:[o.jsx("span",{className:"text-bambu-gray",children:"Progress"}),o.jsxs("span",{className:i>=100?"text-bambu-green font-medium":"text-white",children:[t.archive_count," / ",t.target_count]})]}),o.jsx("div",{className:"h-2.5 bg-bambu-dark/80 rounded-full overflow-hidden backdrop-blur-sm",children:o.jsx("div",{className:"h-full transition-all duration-500 ease-out rounded-full relative",style:{width:`${Math.min(i,100)}%`,background:i>=100?"linear-gradient(90deg, #22c55e, #4ade80)":`linear-gradient(90deg, ${t.color||"#6b7280"}, ${t.color||"#6b7280"}cc)`,boxShadow:`0 0 8px ${i>=100?"#22c55e":t.color||"#6b7280"}60`}})}),o.jsxs("div",{className:"text-right text-xs text-bambu-gray/60 mt-1",children:[i.toFixed(0),"% complete"]})]}):t.archive_count>0?o.jsxs("div",{className:"flex items-center gap-4 text-xs",children:[o.jsxs("div",{className:"flex items-center gap-1.5 text-bambu-gray",children:[o.jsx(oo,{className:"w-3.5 h-3.5"}),o.jsxs("span",{children:[t.archive_count," print",t.archive_count!==1?"s":""," completed"]})]}),t.queue_count>0&&o.jsxs("div",{className:"flex items-center gap-1.5 text-blue-400",children:[o.jsx(rr,{className:"w-3.5 h-3.5"}),o.jsxs("span",{children:[t.queue_count," in queue"]})]})]}):o.jsx("div",{className:"text-xs text-bambu-gray/60 italic",children:"No prints yet"})}),t.archives&&t.archives.length>0&&o.jsxs("div",{className:"mb-4",children:[o.jsx("div",{className:"grid grid-cols-4 gap-1.5",children:t.archives.slice(0,4).map(f=>o.jsxs("div",{className:"relative aspect-square rounded-lg bg-bambu-dark overflow-hidden border border-bambu-dark-tertiary",title:f.print_name||"Unknown",children:[f.thumbnail_path?o.jsx("img",{src:Se.getArchiveThumbnail(f.id),alt:f.print_name||"",className:"w-full h-full object-cover"}):o.jsx("div",{className:"w-full h-full flex items-center justify-center text-bambu-gray/50",children:o.jsx(Fc,{className:"w-6 h-6"})}),f.status==="failed"&&o.jsx("div",{className:"absolute inset-0 bg-red-500/40 flex items-center justify-center",children:o.jsx(Gn,{className:"w-4 h-4 text-white"})})]},f.id))}),t.archive_count>4&&o.jsxs("p",{className:"text-xs text-bambu-gray mt-1.5 text-center",children:["+",t.archive_count-4," more"]})]}),o.jsxs("div",{className:"flex items-center justify-between pt-3 border-t border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center gap-4 text-xs text-bambu-gray",children:[o.jsxs("div",{className:"flex items-center gap-1.5",title:"Completed prints",children:[o.jsx(oo,{className:"w-3.5 h-3.5"}),o.jsx("span",{children:t.archive_count})]}),t.queue_count>0&&o.jsxs("div",{className:"flex items-center gap-1.5 text-blue-400",title:"In queue",children:[o.jsx(Zk,{className:"w-3.5 h-3.5"}),o.jsx("span",{children:t.queue_count})]})]}),o.jsx(Xc,{className:"w-4 h-4 text-bambu-gray/50 group-hover:text-bambu-gray transition-colors"})]})]})]})}function gWe(){const t=wb(),e=mn(),{showToast:n}=Sr(),[r,i]=M.useState(!1),[a,s]=M.useState(),[l,c]=M.useState("active"),[u,d]=M.useState(null),{data:f,isLoading:g}=gt({queryKey:["projects",l==="all"?void 0:l],queryFn:()=>Se.getProjects(l==="all"?void 0:l)}),p=vt({mutationFn:C=>Se.createProject(C),onSuccess:()=>{e.invalidateQueries({queryKey:["projects"]}),i(!1),n("Project created","success")},onError:C=>{n(C.message,"error")}}),x=vt({mutationFn:({id:C,data:N})=>Se.updateProject(C,N),onSuccess:()=>{e.invalidateQueries({queryKey:["projects"]}),i(!1),s(void 0),n("Project updated","success")},onError:C=>{n(C.message,"error")}}),v=vt({mutationFn:C=>Se.deleteProject(C),onSuccess:()=>{e.invalidateQueries({queryKey:["projects"]}),d(null),n("Project deleted","success")},onError:C=>{n(C.message,"error")}}),y=C=>{a?x.mutate({id:a.id,data:C}):p.mutate(C)},b=C=>{s(C),i(!0)},E=C=>{t(`/projects/${C.id}`)},w=C=>{d(C)},T=()=>{u!==null&&v.mutate(u)},A=f?.reduce((C,N)=>(C[N.status]=(C[N.status]||0)+1,C.all=(C.all||0)+1,C),{})||{};return o.jsxs("div",{className:"p-4 md:p-8 space-y-8",children:[o.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[o.jsxs("div",{children:[o.jsxs("h1",{className:"text-2xl font-bold text-white flex items-center gap-3",children:[o.jsx("div",{className:"p-2.5 bg-bambu-green/10 rounded-xl",children:o.jsx(Uo,{className:"w-6 h-6 text-bambu-green"})}),"Projects"]}),o.jsx("p",{className:"text-sm text-bambu-gray mt-2 ml-14",children:"Organize and track your 3D printing projects"})]}),o.jsxs(ke,{onClick:()=>i(!0),className:"sm:w-auto w-full",children:[o.jsx(sr,{className:"w-4 h-4 mr-2"}),"New Project"]})]}),o.jsx("div",{className:"flex gap-1 p-1 bg-bambu-dark rounded-xl w-fit",children:[{key:"active",label:"Active",icon:rr},{key:"completed",label:"Completed",icon:sR},{key:"archived",label:"Archived",icon:oo},{key:"all",label:"All",icon:Uo}].map(({key:C,label:N,icon:F})=>o.jsxs("button",{onClick:()=>c(C),className:`flex items-center gap-2 px-4 py-2 text-sm rounded-lg transition-all ${l===C?"bg-bambu-card text-white shadow-sm":"text-bambu-gray hover:text-white"}`,children:[o.jsx(F,{className:"w-4 h-4"}),o.jsx("span",{children:N}),A[C]>0&&o.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded-full ${l===C?"bg-bambu-green/20 text-bambu-green":"bg-bambu-dark-tertiary"}`,children:A[C]})]},C))}),g?o.jsx("div",{className:"flex items-center justify-center py-20",children:o.jsxs("div",{className:"flex flex-col items-center gap-3",children:[o.jsx(xt,{className:"w-8 h-8 animate-spin text-bambu-green"}),o.jsx("p",{className:"text-sm text-bambu-gray",children:"Loading projects..."})]})}):f?.length===0?o.jsxs("div",{className:"flex flex-col items-center justify-center py-20 px-4",children:[o.jsx("div",{className:"p-4 bg-bambu-dark rounded-2xl mb-4",children:o.jsx(Uo,{className:"w-12 h-12 text-bambu-gray/50"})}),o.jsx("h3",{className:"text-lg font-medium text-white mb-2",children:l==="all"?"No projects yet":`No ${l} projects`}),o.jsx("p",{className:"text-bambu-gray text-center max-w-md mb-6",children:l==="all"?"Create your first project to start organizing related prints, tracking progress, and managing your builds.":`You don't have any ${l} projects. Projects will appear here when their status changes.`}),l==="all"&&o.jsxs(ke,{onClick:()=>i(!0),children:[o.jsx(sr,{className:"w-4 h-4 mr-2"}),"Create Your First Project"]})]}):o.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-8",children:f?.map(C=>o.jsx(pWe,{project:C,onClick:()=>E(C),onEdit:()=>b(C),onDelete:()=>w(C.id)},C.id))}),u!==null&&o.jsx(kr,{title:"Delete Project",message:"Are you sure you want to delete this project? Archives and queue items will be unlinked but not deleted.",confirmText:"Delete Project",variant:"danger",onConfirm:T,onCancel:()=>d(null)}),r&&o.jsx(Wte,{project:a,onClose:()=>{i(!1),s(void 0)},onSave:y,isLoading:p.isPending||x.isPending})]})}function xWe(t){if(t<1)return`${Math.round(t*60)}m`;const e=Math.floor(t),n=Math.round((t-e)*60);return n>0?`${e}h ${n}m`:`${e}h`}function bWe(t){return t>=1e3?`${(t/1e3).toFixed(2)}kg`:`${Math.round(t)}g`}function yWe({status:t}){const e={active:"bg-bambu-green/20 text-bambu-green",completed:"bg-blue-500/20 text-blue-400",archived:"bg-bambu-gray/20 text-bambu-gray"},n=e[t]||e.active;return o.jsx("span",{className:`px-2 py-1 rounded text-sm font-medium ${n}`,children:t.charAt(0).toUpperCase()+t.slice(1)})}function o1({icon:t,label:e,value:n,subValue:r,color:i="text-bambu-gray"}){return o.jsx(wt,{children:o.jsx(Et,{className:"p-4",children:o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:`p-2 rounded-lg bg-bambu-dark ${i}`,children:o.jsx(t,{className:"w-5 h-5"})}),o.jsxs("div",{children:[o.jsx("p",{className:"text-sm text-bambu-gray",children:e}),o.jsx("p",{className:"text-xl font-semibold text-white",children:n}),r&&o.jsx("p",{className:"text-xs text-bambu-gray/70",children:r})]})]})})})}function vWe({archives:t}){return t.length===0?o.jsxs("div",{className:"text-center py-8 text-bambu-gray",children:[o.jsx(Fc,{className:"w-12 h-12 mx-auto mb-2 opacity-50"}),o.jsx("p",{children:"No prints in this project yet"})]}):o.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 gap-3",children:t.map(e=>o.jsxs(_c,{to:`/archives?search=${encodeURIComponent(e.print_name||"")}`,className:"group relative aspect-square rounded-lg bg-bambu-dark border border-bambu-dark-tertiary overflow-hidden hover:border-bambu-green transition-colors",children:[e.thumbnail_path?o.jsx("img",{src:Se.getArchiveThumbnail(e.id),alt:e.print_name||"Print",className:"w-full h-full object-cover"}):o.jsx("div",{className:"w-full h-full flex items-center justify-center text-bambu-gray",children:o.jsx(Fc,{className:"w-8 h-8"})}),e.status==="failed"&&o.jsx("div",{className:"absolute inset-0 bg-red-500/30 flex items-center justify-center",children:o.jsx(Pa,{className:"w-8 h-8 text-white"})}),e.status==="completed"&&o.jsx("div",{className:"absolute top-1 right-1",children:o.jsx(Cr,{className:"w-4 h-4 text-bambu-green"})}),o.jsx("div",{className:"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 to-transparent p-2 opacity-0 group-hover:opacity-100 transition-opacity",children:o.jsx("p",{className:"text-xs text-white truncate",children:e.print_name||"Unknown"})})]},e.id))})}function _We({priority:t}){const e={low:{color:"bg-gray-500/20 text-gray-400",label:"Low"},normal:{color:"bg-blue-500/20 text-blue-400",label:"Normal"},high:{color:"bg-orange-500/20 text-orange-400",label:"High"},urgent:{color:"bg-red-500/20 text-red-400",label:"Urgent"}},{color:n,label:r}=e[t]||e.normal;return o.jsxs("span",{className:`px-2 py-1 rounded text-xs font-medium flex items-center gap-1 ${n}`,children:[t==="urgent"&&o.jsx(Gn,{className:"w-3 h-3"}),r]})}function wWe(t){return t?new Date(t).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"}):""}function jk(t){if(!t)return null;const e=new Date(t),n=new Date,r=Math.ceil((e.getTime()-n.getTime())/(1e3*60*60*24));return r<0?{color:"text-red-400",label:"Overdue"}:r===0?{color:"text-orange-400",label:"Due today"}:r<=3?{color:"text-yellow-400",label:`${r} days left`}:{color:"text-bambu-gray",label:`${r} days left`}}function SWe(){const{id:t}=Zj(),e=wb(),n=mn(),{showToast:r}=Sr(),[i,a]=M.useState(!1),[s,l]=M.useState(!1),[c,u]=M.useState(""),[d,f]=M.useState(!1),g=M.useRef(null),p=parseInt(t||"0",10),{data:x,isLoading:v,error:y}=gt({queryKey:["project",p],queryFn:()=>Se.getProject(p),enabled:p>0}),{data:b,isLoading:E}=gt({queryKey:["project-archives",p],queryFn:()=>Se.getProjectArchives(p),enabled:p>0}),{data:w,isLoading:T}=gt({queryKey:["project-bom",p],queryFn:()=>Se.getProjectBOM(p),enabled:p>0}),{data:A,isLoading:C}=gt({queryKey:["project-timeline",p],queryFn:()=>Se.getProjectTimeline(p,20),enabled:p>0}),{data:N}=gt({queryKey:["settings"],queryFn:Se.getSettings}),F=N?.currency||"$",k=vt({mutationFn:U=>Se.updateProject(p,U),onSuccess:()=>{n.invalidateQueries({queryKey:["project",p]}),n.invalidateQueries({queryKey:["projects"]}),a(!1),l(!1),r("Project updated","success")},onError:U=>{r(U.message,"error")}}),R=()=>{u(x?.notes||""),l(!0)},I=()=>{k.mutate({notes:c})},L=()=>{l(!1),u("")},q=async U=>{const O=U.target.files?.[0];if(O){f(!0);try{const ne=await Se.uploadProjectAttachment(p,O);n.invalidateQueries({queryKey:["project",p]}),r(`Uploaded: ${ne.original_name}`,"success")}catch(ne){r(ne.message,"error")}finally{f(!1),g.current&&(g.current.value="")}}},j=(U,O)=>{Ce({isOpen:!0,title:"Delete Attachment",message:`Are you sure you want to delete "${O}"?`,onConfirm:async()=>{Ce(ne=>({...ne,isOpen:!1}));try{await Se.deleteProjectAttachment(p,U),n.invalidateQueries({queryKey:["project",p]}),r("Attachment deleted","success")}catch(ne){r(ne.message,"error")}}})},V=U=>U<1024?`${U} B`:U<1024*1024?`${(U/1024).toFixed(1)} KB`:`${(U/(1024*1024)).toFixed(1)} MB`,[K,W]=M.useState(""),[J,ee]=M.useState(1),[Z,B]=M.useState(""),[G,Q]=M.useState(""),[te,he]=M.useState(""),[oe,xe]=M.useState(!1),[Te,me]=M.useState(!1),[ce,Ce]=M.useState({isOpen:!1,title:"",message:"",onConfirm:()=>{}}),fe=vt({mutationFn:U=>Se.createBOMItem(p,U),onSuccess:()=>{n.invalidateQueries({queryKey:["project-bom",p]}),n.invalidateQueries({queryKey:["project",p]}),W(""),ee(1),B(""),Q(""),he(""),xe(!1),r("Part added","success")},onError:U=>r(U.message,"error")}),Ie=vt({mutationFn:({itemId:U,data:O})=>Se.updateBOMItem(p,U,O),onSuccess:()=>{n.invalidateQueries({queryKey:["project-bom",p]}),n.invalidateQueries({queryKey:["project",p]})},onError:U=>r(U.message,"error")}),z=vt({mutationFn:U=>Se.deleteBOMItem(p,U),onSuccess:()=>{n.invalidateQueries({queryKey:["project-bom",p]}),n.invalidateQueries({queryKey:["project",p]}),r("Part removed","success")},onError:U=>r(U.message,"error")}),H=U=>{U.preventDefault(),K.trim()&&fe.mutate({name:K.trim(),quantity_needed:J,unit_price:Z?parseFloat(Z):void 0,sourcing_url:G.trim()||void 0,remarks:te.trim()||void 0})},re=U=>{const O=U.is_complete?0:U.quantity_needed;Ie.mutate({itemId:U.id,data:{quantity_acquired:O}})},$=(U,O)=>{Ce({isOpen:!0,title:"Delete Part",message:`Are you sure you want to delete "${O}"?`,onConfirm:()=>{Ce(ne=>({...ne,isOpen:!1})),z.mutate(U)}})},Y=vt({mutationFn:()=>Se.createTemplateFromProject(p),onSuccess:()=>{n.invalidateQueries({queryKey:["projects"]}),r("Template created","success")},onError:U=>r(U.message,"error")}),se=U=>new Date(U).toLocaleDateString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"});if(v)return o.jsx("div",{className:"flex items-center justify-center py-24",children:o.jsx(xt,{className:"w-8 h-8 animate-spin text-bambu-green"})});if(y||!x)return o.jsxs("div",{className:"text-center py-24",children:[o.jsx("p",{className:"text-bambu-gray",children:y?`Error: ${y.message}`:"Project not found"}),o.jsx(ke,{variant:"secondary",className:"mt-4",onClick:()=>e("/projects"),children:"Back to Projects"})]});const ue=x.stats,Ee=ue?.progress_percent??0,Me=ue&&ue.total_archives>0?(ue.completed_prints/ue.total_archives*100).toFixed(0):null;return o.jsxs("div",{className:"p-4 md:p-8 space-y-8",children:[o.jsxs("div",{className:"flex items-center gap-2 text-sm text-bambu-gray",children:[o.jsx(_c,{to:"/projects",className:"hover:text-white transition-colors",children:"Projects"}),o.jsx(Xc,{className:"w-4 h-4"}),o.jsx("span",{className:"text-white",children:x.name})]}),o.jsxs("div",{className:"flex items-start justify-between",children:[o.jsxs("div",{className:"flex items-center gap-4",children:[o.jsx("button",{onClick:()=>e("/projects"),className:"p-2 rounded-lg bg-bambu-card hover:bg-bambu-dark-tertiary transition-colors",children:o.jsx(Eoe,{className:"w-5 h-5 text-bambu-gray"})}),o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-4 h-4 rounded-full flex-shrink-0",style:{backgroundColor:x.color||"#6b7280"}}),o.jsxs("div",{children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:x.name}),x.description&&o.jsx("p",{className:"text-bambu-gray mt-1",children:x.description})]})]}),o.jsx(yWe,{status:x.status})]}),o.jsxs(ke,{onClick:()=>a(!0),children:[o.jsx(Qh,{className:"w-4 h-4 mr-2"}),"Edit"]})]}),x.target_count&&o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-2",children:[o.jsx("span",{className:"text-sm text-bambu-gray",children:"Progress"}),o.jsxs("span",{className:"text-sm font-medium text-white",children:[ue?.completed_prints||0," / ",x.target_count," prints"]})]}),o.jsx("div",{className:"h-3 bg-bambu-dark rounded-full overflow-hidden",children:o.jsx("div",{className:"h-full transition-all duration-500",style:{width:`${Math.min(Ee,100)}%`,backgroundColor:Ee>=100?"#22c55e":x.color||"#6b7280"}})}),o.jsxs("div",{className:"flex justify-between mt-1",children:[o.jsxs("span",{className:"text-xs text-bambu-gray/70",children:[Ee.toFixed(0),"% complete"]}),x.target_count-(ue?.completed_prints||0)>0&&o.jsxs("span",{className:"text-xs text-bambu-gray/70",children:[x.target_count-(ue?.completed_prints||0)," remaining"]})]})]})}),ue&&o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[o.jsx(o1,{icon:Fc,label:"Total Prints",value:ue.total_archives,subValue:Me?`${Me}% success rate`:void 0,color:"text-bambu-green"}),o.jsx(o1,{icon:Cr,label:"Completed",value:ue.completed_prints,subValue:ue.failed_prints>0?`${ue.failed_prints} failed`:void 0,color:"text-blue-400"}),o.jsx(o1,{icon:rr,label:"Print Time",value:xWe(ue.total_print_time_hours),color:"text-yellow-400"}),o.jsx(o1,{icon:Vi,label:"Filament Used",value:bWe(ue.total_filament_grams),color:"text-purple-400"})]}),ue&&(ue.estimated_cost>0||x.budget)&&o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsx("h2",{className:"text-lg font-semibold text-white mb-3",children:"Cost Tracking"}),o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[o.jsxs("div",{children:[o.jsx("p",{className:"text-xs text-bambu-gray uppercase",children:"Filament Cost"}),o.jsxs("p",{className:"text-lg font-semibold text-white",children:[F,ue.estimated_cost.toFixed(2)]})]}),ue.total_energy_kwh>0&&o.jsxs("div",{children:[o.jsx("p",{className:"text-xs text-bambu-gray uppercase",children:"Energy"}),o.jsxs("p",{className:"text-lg font-semibold text-white",children:[ue.total_energy_kwh.toFixed(2)," kWh",ue.total_energy_cost>0&&o.jsxs("span",{className:"text-sm text-bambu-gray ml-1",children:["(",F,ue.total_energy_cost.toFixed(2),")"]})]})]}),x.budget&&o.jsxs(o.Fragment,{children:[o.jsxs("div",{children:[o.jsx("p",{className:"text-xs text-bambu-gray uppercase",children:"Budget"}),o.jsxs("p",{className:"text-lg font-semibold text-white",children:[F,x.budget.toFixed(2)]})]}),o.jsxs("div",{children:[o.jsx("p",{className:"text-xs text-bambu-gray uppercase",children:"Remaining"}),o.jsxs("p",{className:`text-lg font-semibold ${x.budget-ue.estimated_cost>=0?"text-bambu-green":"text-red-400"}`,children:[F,(x.budget-ue.estimated_cost).toFixed(2)]})]})]})]})]})}),x.children&&x.children.length>0&&o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2 mb-3",children:[o.jsx(Wle,{className:"w-5 h-5"}),"Sub-projects (",x.children.length,")"]}),o.jsx("div",{className:"space-y-2",children:x.children.map(U=>o.jsxs(_c,{to:`/projects/${U.id}`,className:"flex items-center justify-between p-3 bg-bambu-dark rounded-lg hover:bg-bambu-dark-tertiary transition-colors",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-3 h-3 rounded-full",style:{backgroundColor:U.color||"#6b7280"}}),o.jsx("span",{className:"text-white",children:U.name}),o.jsx("span",{className:`text-xs px-2 py-0.5 rounded ${U.status==="completed"?"bg-bambu-green/20 text-bambu-green":U.status==="archived"?"bg-bambu-gray/20 text-bambu-gray":"bg-blue-500/20 text-blue-400"}`,children:U.status})]}),U.progress_percent!==null&&o.jsxs("span",{className:"text-sm text-bambu-gray",children:[U.progress_percent.toFixed(0),"%"]})]},U.id))})]})}),x.parent_id&&x.parent_name&&o.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[o.jsx(pd,{className:"w-4 h-4 text-bambu-gray"}),o.jsx("span",{className:"text-bambu-gray",children:"Part of:"}),o.jsx(_c,{to:`/projects/${x.parent_id}`,className:"text-bambu-green hover:underline",children:x.parent_name})]}),(x.tags||x.due_date||x.priority!=="normal")&&o.jsxs("div",{className:"flex flex-wrap items-center gap-4",children:[x.priority&&x.priority!=="normal"&&o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("span",{className:"text-xs text-bambu-gray uppercase",children:"Priority:"}),o.jsx(_We,{priority:x.priority})]}),x.due_date&&o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx(Qr,{className:"w-4 h-4 text-bambu-gray"}),o.jsx("span",{className:"text-sm text-white",children:wWe(x.due_date)}),jk(x.due_date)&&o.jsxs("span",{className:`text-xs ${jk(x.due_date).color}`,children:["(",jk(x.due_date).label,")"]})]}),x.tags&&o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx(Ap,{className:"w-4 h-4 text-bambu-gray"}),o.jsx("div",{className:"flex flex-wrap gap-1",children:x.tags.split(",").map((U,O)=>o.jsx("span",{className:"px-2 py-0.5 bg-bambu-dark-tertiary text-bambu-gray text-xs rounded",children:U.trim()},O))})]})]}),o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(Es,{className:"w-5 h-5"}),"Notes"]}),s?o.jsxs("div",{className:"flex gap-2",children:[o.jsxs(ke,{variant:"secondary",size:"sm",onClick:L,disabled:k.isPending,children:[o.jsx(Gt,{className:"w-4 h-4 mr-1"}),"Cancel"]}),o.jsxs(ke,{size:"sm",onClick:I,disabled:k.isPending,children:[k.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin mr-1"}):o.jsx(Ts,{className:"w-4 h-4 mr-1"}),"Save"]})]}):o.jsxs(ke,{variant:"secondary",size:"sm",onClick:R,children:[o.jsx(Qh,{className:"w-4 h-4 mr-1"}),"Edit"]})]}),s?o.jsx(zj,{content:c,onChange:u,placeholder:"Add notes about this project..."}):x.notes?o.jsx("div",{className:"prose prose-invert prose-sm max-w-none",dangerouslySetInnerHTML:{__html:x.notes}}):o.jsx("p",{className:"text-bambu-gray/70 text-sm italic",children:"No notes yet. Click Edit to add notes."})]})}),o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(Zce,{className:"w-5 h-5"}),"Attachments (",x.attachments?.length||0,")"]}),o.jsxs("div",{children:[o.jsx("input",{ref:g,type:"file",onChange:q,className:"hidden"}),o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>g.current?.click(),disabled:d,children:[d?o.jsx(xt,{className:"w-4 h-4 animate-spin mr-1"}):o.jsx(oa,{className:"w-4 h-4 mr-1"}),"Upload"]})]})]}),o.jsx("p",{className:"text-xs text-bambu-gray mb-3",children:"Upload any file: images (PNG, JPG), PDFs, STL files, or documents."}),x.attachments&&x.attachments.length>0?o.jsx("div",{className:"space-y-2",children:x.attachments.map(U=>o.jsxs("div",{className:"flex items-center justify-between p-3 bg-bambu-dark rounded-lg",children:[o.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[o.jsx(uR,{className:"w-5 h-5 text-bambu-gray flex-shrink-0"}),o.jsxs("div",{className:"min-w-0",children:[o.jsx("p",{className:"text-sm text-white truncate",children:U.original_name}),o.jsx("p",{className:"text-xs text-bambu-gray",children:V(U.size)})]})]}),o.jsxs("div",{className:"flex items-center gap-1 flex-shrink-0",children:[o.jsx("a",{href:Se.getProjectAttachmentUrl(p,U.filename),download:U.original_name,className:"p-2 rounded hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray hover:text-white",title:"Download",children:o.jsx(is,{className:"w-4 h-4"})}),o.jsx("button",{onClick:()=>j(U.filename,U.original_name),className:"p-2 rounded hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray hover:text-red-400",title:"Delete",children:o.jsx(En,{className:"w-4 h-4"})})]})]},U.filename))}):o.jsx("p",{className:"text-bambu-gray/70 text-sm italic",children:"No attachments yet. Click Upload to add files."})]})}),o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-4",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(UG,{className:"w-5 h-5"}),"Bill of Materials",ue&&ue.bom_total_items>0&&o.jsxs("span",{className:"text-sm font-normal text-bambu-gray",children:["(",ue.bom_completed_items,"/",ue.bom_total_items," acquired)"]})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[w&&w.some(U=>U.is_complete)&&o.jsx("button",{onClick:()=>me(!Te),className:`text-xs px-2 py-1 rounded transition-colors ${Te?"bg-bambu-green/20 text-bambu-green":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:Te?"Show all":"Hide done"}),!oe&&o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>xe(!0),children:[o.jsx(sr,{className:"w-4 h-4 mr-1"}),"Add Part"]})]})]}),oe&&o.jsxs("form",{onSubmit:H,className:"bg-bambu-dark rounded-lg p-4 mb-4 space-y-3",children:[o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:[o.jsx("input",{type:"text",value:K,onChange:U=>W(U.target.value),className:"bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"Part name (e.g., M3x8 screws)",autoFocus:!0}),o.jsxs("div",{className:"flex gap-2",children:[o.jsx("input",{type:"number",value:J,onChange:U=>ee(parseInt(U.target.value)||1),className:"w-20 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white focus:outline-none focus:border-bambu-green",min:"1",placeholder:"Qty"}),o.jsx("input",{type:"number",step:"0.01",value:Z,onChange:U=>B(U.target.value),className:"flex-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:`Price (${F})`})]})]}),o.jsx("input",{type:"url",value:G,onChange:U=>Q(U.target.value),className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"Sourcing URL (optional)"}),o.jsx("input",{type:"text",value:te,onChange:U=>he(U.target.value),className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"Remarks (optional)"}),o.jsxs("div",{className:"flex justify-end gap-2",children:[o.jsx(ke,{type:"button",variant:"secondary",size:"sm",onClick:()=>xe(!1),children:"Cancel"}),o.jsx(ke,{type:"submit",size:"sm",disabled:!K.trim()||fe.isPending,children:fe.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin"}):"Add Part"})]})]}),T?o.jsx("div",{className:"flex items-center justify-center py-4",children:o.jsx(xt,{className:"w-6 h-6 animate-spin text-bambu-green"})}):w&&w.length>0?o.jsxs("div",{className:"space-y-2",children:[w.filter(U=>!Te||!U.is_complete).map(U=>o.jsx("div",{className:`p-3 rounded-lg transition-colors ${U.is_complete?"bg-bambu-green/10":"bg-bambu-dark"}`,children:o.jsxs("div",{className:"flex items-start gap-3",children:[o.jsx("button",{onClick:()=>re(U),disabled:Ie.isPending,className:`w-5 h-5 mt-0.5 rounded border-2 flex items-center justify-center transition-colors flex-shrink-0 ${U.is_complete?"bg-bambu-green border-bambu-green text-white":"border-bambu-gray hover:border-bambu-green"}`,children:U.is_complete&&o.jsx(Cr,{className:"w-3 h-3"})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center justify-between gap-2",children:[o.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[o.jsxs("p",{className:`text-sm font-medium ${U.is_complete?"text-bambu-gray line-through":"text-white"}`,children:[U.name,o.jsxs("span",{className:"text-bambu-gray font-normal ml-2",children:["x",U.quantity_needed]})]}),U.unit_price!==null&&o.jsxs("span",{className:"text-xs text-bambu-green whitespace-nowrap",children:[F,(U.unit_price*U.quantity_needed).toFixed(2)]})]}),o.jsx("button",{onClick:()=>$(U.id,U.name),className:"p-1 rounded hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-red-400 transition-colors flex-shrink-0",title:"Delete",children:o.jsx(En,{className:"w-4 h-4"})})]}),U.sourcing_url&&o.jsxs("a",{href:U.sourcing_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 mt-1 text-xs text-blue-400 hover:text-blue-300 transition-colors",onClick:O=>O.stopPropagation(),children:[o.jsx(ba,{className:"w-3 h-3 flex-shrink-0"}),o.jsx("span",{className:"truncate",children:(()=>{try{return new URL(U.sourcing_url).hostname.replace("www.","")}catch{return U.sourcing_url}})()})]}),U.remarks&&o.jsx("p",{className:"mt-1 text-xs text-bambu-gray/80 italic",children:U.remarks})]})]})},U.id)),w.some(U=>U.unit_price!==null)&&o.jsxs("div",{className:"pt-2 mt-2 border-t border-bambu-dark-tertiary flex justify-between text-sm",children:[o.jsx("span",{className:"text-bambu-gray",children:"Total cost:"}),o.jsxs("span",{className:"text-white font-medium",children:[F,w.reduce((U,O)=>U+(O.unit_price||0)*O.quantity_needed,0).toFixed(2)]})]})]}):o.jsx("p",{className:"text-bambu-gray/70 text-sm italic",children:"No parts in the bill of materials. Add hardware, electronics, or other components to track what needs to be sourced."})]})}),o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsx("div",{className:"flex items-center justify-between mb-3",children:o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(U1,{className:"w-5 h-5"}),"Activity Timeline"]})}),C?o.jsx("div",{className:"flex items-center justify-center py-4",children:o.jsx(xt,{className:"w-6 h-6 animate-spin text-bambu-green"})}):A&&A.length>0?o.jsx("div",{className:"space-y-3",children:A.slice(0,10).map((U,O)=>o.jsxs("div",{className:"flex gap-3",children:[o.jsxs("div",{className:`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 ${U.event_type==="print_completed"?"bg-bambu-green/20 text-bambu-green":U.event_type==="print_failed"?"bg-red-500/20 text-red-400":U.event_type==="print_started"?"bg-yellow-500/20 text-yellow-400":"bg-bambu-dark-tertiary text-bambu-gray"}`,children:[U.event_type==="print_completed"&&o.jsx(Cr,{className:"w-4 h-4"}),U.event_type==="print_failed"&&o.jsx(Pa,{className:"w-4 h-4"}),U.event_type==="print_started"&&o.jsx(Vi,{className:"w-4 h-4"}),U.event_type==="queued"&&o.jsx(Zk,{className:"w-4 h-4"}),U.event_type==="project_created"&&o.jsx(sr,{className:"w-4 h-4"})]}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("p",{className:"text-sm text-white",children:U.title}),U.description&&o.jsx("p",{className:"text-xs text-bambu-gray truncate",children:U.description}),o.jsx("p",{className:"text-xs text-bambu-gray/70",children:se(U.timestamp)})]})]},O))}):o.jsx("p",{className:"text-bambu-gray/70 text-sm italic",children:"No activity yet."})]})}),!x.is_template&&o.jsx("div",{className:"flex justify-end",children:o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>Y.mutate(),disabled:Y.isPending,children:[Y.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin mr-2"}):o.jsx(md,{className:"w-4 h-4 mr-2"}),"Save as Template"]})}),ue&&(ue.queued_prints>0||ue.in_progress_prints>0)&&o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(Zk,{className:"w-5 h-5"}),"Queue"]}),o.jsx(_c,{to:`/queue?project=${p}`,className:"text-sm text-bambu-green hover:underline",children:"View all"})]}),o.jsxs("div",{className:"flex items-center gap-4 text-sm",children:[ue.in_progress_prints>0&&o.jsxs("span",{className:"text-yellow-400",children:[ue.in_progress_prints," printing"]}),ue.queued_prints>0&&o.jsxs("span",{className:"text-bambu-gray",children:[ue.queued_prints," queued"]})]})]})}),o.jsxs("div",{children:[o.jsx("div",{className:"flex items-center justify-between mb-4",children:o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(Fc,{className:"w-5 h-5"}),"Prints (",b?.length||0,")"]})}),E?o.jsx("div",{className:"flex items-center justify-center py-8",children:o.jsx(xt,{className:"w-6 h-6 animate-spin text-bambu-green"})}):o.jsx(vWe,{archives:b||[]})]}),i&&o.jsx(Wte,{project:{...x,archive_count:ue?.total_archives||0,queue_count:ue?.queued_prints||0,progress_percent:ue?.progress_percent||null,archives:[]},onClose:()=>a(!1),onSave:U=>k.mutate(U),isLoading:k.isPending}),ce.isOpen&&o.jsx(kr,{title:ce.title,message:ce.message,confirmText:"Delete",variant:"danger",onConfirm:ce.onConfirm,onCancel:()=>Ce(U=>({...U,isOpen:!1}))})]})}const Rk=5,MWe=2e3,EWe=3e4;function TWe(){const{printerId:t}=Zj(),e=parseInt(t||"0",10),[n,r]=M.useState("stream"),[i,a]=M.useState(!1),[s,l]=M.useState(!0),[c,u]=M.useState(Date.now()),[d,f]=M.useState(!1),[g,p]=M.useState(!1),[x,v]=M.useState(0),[y,b]=M.useState(!1),[E,w]=M.useState(0),T=M.useRef(null),A=M.useRef(null),C=M.useRef(null),N=M.useRef(null),{data:F}=gt({queryKey:["printer",e],queryFn:()=>Se.getPrinter(e),enabled:e>0});M.useEffect(()=>(F&&(document.title=`${F.name} - Camera`),()=>{document.title="Bambuddy"}),[F]),M.useEffect(()=>{const J=`/api/v1/printers/${e}/camera/stop`,ee=()=>{e>0&&navigator.sendBeacon(J)},Z=()=>{document.visibilityState==="hidden"&&e>0&&navigator.sendBeacon(J)};return window.addEventListener("beforeunload",ee),document.addEventListener("visibilitychange",Z),()=>{window.removeEventListener("beforeunload",ee),document.removeEventListener("visibilitychange",Z),T.current&&(T.current.src=""),e>0&&navigator.sendBeacon(J)}},[e]),M.useEffect(()=>{if(s&&!d){const ee=setTimeout(()=>{l(!1)},n==="stream"?3e3:2e4);return()=>clearTimeout(ee)}},[n,s,c,d]),M.useEffect(()=>{const J=()=>{p(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",J),()=>document.removeEventListener("fullscreenchange",J)},[]),M.useEffect(()=>()=>{C.current&&clearTimeout(C.current),N.current&&clearInterval(N.current)},[]);const k=M.useCallback(()=>{if(x>=Rk){b(!1),a(!0);return}const J=Math.min(MWe*Math.pow(2,x),EWe);b(!0),w(Math.ceil(J/1e3)),N.current=setInterval(()=>{w(ee=>ee<=1?(N.current&&clearInterval(N.current),0):ee-1)},1e3),C.current=setTimeout(()=>{v(ee=>ee+1),b(!1),l(!0),a(!1),T.current&&(T.current.src=""),u(Date.now())},J)},[x]),R=()=>{l(!1),n==="stream"&&x{l(!1),a(!1),v(0),b(!1),C.current&&clearTimeout(C.current),N.current&&clearInterval(N.current)},L=()=>{e>0&&fetch(`/api/v1/printers/${e}/camera/stop`).catch(()=>{})},q=J=>{n===J||d||(f(!0),l(!0),a(!1),v(0),b(!1),C.current&&clearTimeout(C.current),N.current&&clearInterval(N.current),T.current&&(T.current.src=""),n==="stream"&&L(),setTimeout(()=>{r(J),u(Date.now()),f(!1)},100))},j=()=>{d||(f(!0),l(!0),a(!1),v(0),b(!1),C.current&&clearTimeout(C.current),N.current&&clearInterval(N.current),T.current&&(T.current.src=""),n==="stream"&&L(),setTimeout(()=>{u(Date.now()),f(!1)},100))},V=()=>{A.current&&(document.fullscreenElement?document.exitFullscreen():A.current.requestFullscreen())},K=d?"":n==="stream"?`/api/v1/printers/${e}/camera/stream?fps=10&t=${c}`:`/api/v1/printers/${e}/camera/snapshot?t=${c}`,W=s||d||y;return e?o.jsxs("div",{ref:A,className:"min-h-screen bg-black flex flex-col",children:[o.jsxs("div",{className:"flex items-center justify-between px-4 py-2 bg-bambu-dark-secondary border-b border-bambu-dark-tertiary",children:[o.jsxs("h1",{className:"text-sm font-medium text-white flex items-center gap-2",children:[o.jsx(C0,{className:"w-4 h-4"}),F?.name||`Printer ${e}`]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsxs("div",{className:"flex bg-bambu-dark rounded p-0.5",children:[o.jsx("button",{onClick:()=>q("stream"),disabled:W,className:`px-3 py-1 text-xs rounded transition-colors ${n==="stream"?"bg-bambu-green text-white":"text-bambu-gray hover:text-white disabled:opacity-50"}`,children:"Live"}),o.jsx("button",{onClick:()=>q("snapshot"),disabled:W,className:`px-3 py-1 text-xs rounded transition-colors ${n==="snapshot"?"bg-bambu-green text-white":"text-bambu-gray hover:text-white disabled:opacity-50"}`,children:"Snapshot"})]}),o.jsx("button",{onClick:j,disabled:W,className:"p-1.5 hover:bg-bambu-dark-tertiary rounded disabled:opacity-50",title:n==="stream"?"Restart stream":"Refresh snapshot",children:o.jsx(_a,{className:`w-4 h-4 text-bambu-gray ${W?"animate-spin":""}`})}),o.jsx("button",{onClick:V,className:"p-1.5 hover:bg-bambu-dark-tertiary rounded",title:g?"Exit fullscreen":"Fullscreen",children:g?o.jsx(Vce,{className:"w-4 h-4 text-bambu-gray"}):o.jsx(Lce,{className:"w-4 h-4 text-bambu-gray"})})]})]}),o.jsx("div",{className:"flex-1 flex items-center justify-center p-2",children:o.jsxs("div",{className:"relative w-full h-full flex items-center justify-center",children:[(s||d)&&!y&&o.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/50 z-10",children:o.jsxs("div",{className:"text-center",children:[o.jsx(_a,{className:"w-8 h-8 text-bambu-gray animate-spin mx-auto mb-2"}),o.jsx("p",{className:"text-sm text-bambu-gray",children:n==="stream"?"Connecting to camera...":"Capturing snapshot..."})]})}),y&&o.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/80 z-10",children:o.jsxs("div",{className:"text-center p-4",children:[o.jsx(Ab,{className:"w-10 h-10 text-orange-400 mx-auto mb-3"}),o.jsx("p",{className:"text-white mb-2",children:"Connection lost"}),o.jsxs("p",{className:"text-sm text-bambu-gray mb-3",children:["Reconnecting in ",E,"s... (attempt ",x+1,"/",Rk,")"]}),o.jsx("button",{onClick:j,className:"px-4 py-2 bg-bambu-green text-white text-sm rounded hover:bg-bambu-green/80 transition-colors",children:"Reconnect now"})]})}),i&&!y&&o.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black z-10",children:o.jsxs("div",{className:"text-center p-4",children:[o.jsx(Gn,{className:"w-12 h-12 text-orange-400 mx-auto mb-3"}),o.jsx("p",{className:"text-white mb-2",children:"Camera unavailable"}),o.jsx("p",{className:"text-xs text-bambu-gray mb-4 max-w-md",children:"Make sure the printer is powered on and connected."}),o.jsx("button",{onClick:j,className:"px-4 py-2 bg-bambu-green text-white rounded hover:bg-bambu-green/80 transition-colors",children:"Retry"})]})}),o.jsx("img",{ref:T,src:K,alt:"Camera stream",className:"max-w-full max-h-full object-contain",onError:K?R:void 0,onLoad:K?I:void 0},c)]})})]}):o.jsx("div",{className:"min-h-screen bg-black flex items-center justify-center",children:o.jsx("p",{className:"text-white",children:"Invalid printer ID"})})}function AWe(){const{id:t}=Zj(),{mode:e}=ag(),{data:n,isLoading:r,error:i}=gt({queryKey:["external-link",t],queryFn:()=>Se.getExternalLink(Number(t)),enabled:!!t});return r?o.jsx("div",{className:"flex items-center justify-center h-full",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})}):i||!n?o.jsxs("div",{className:"flex flex-col items-center justify-center h-full gap-4 text-bambu-gray",children:[o.jsx(Gn,{className:"w-12 h-12"}),o.jsx("p",{children:"Link not found"})]}):o.jsx("iframe",{src:n.url,className:"h-full w-full border-0",style:{colorScheme:e},title:n.name,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox"})}function Xr({icon:t,label:e,value:n,subValue:r,color:i="text-bambu-green"}){return o.jsxs("div",{className:"flex items-start gap-3 p-4 bg-bambu-dark rounded-lg",children:[o.jsx("div",{className:`p-2 rounded-lg bg-bambu-dark-tertiary ${i}`,children:o.jsx(t,{className:"w-5 h-5"})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("p",{className:"text-sm text-bambu-gray",children:e}),o.jsx("p",{className:"text-lg font-semibold text-white truncate",children:n}),r&&o.jsx("p",{className:"text-xs text-bambu-gray mt-0.5",children:r})]})]})}function K9({percent:t,color:e="bg-bambu-green"}){return o.jsx("div",{className:"w-full h-2 bg-bambu-dark rounded-full overflow-hidden",children:o.jsx("div",{className:`h-full ${e} transition-all duration-300`,style:{width:`${Math.min(100,t)}%`}})})}function uh({title:t,icon:e,children:n}){return o.jsxs(wt,{className:"p-6",children:[o.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[o.jsx(e,{className:"w-5 h-5 text-bambu-green"}),o.jsx("h2",{className:"text-lg font-semibold text-white",children:t})]}),n]})}function NWe(){const{t}=eg(),{data:e,isLoading:n,refetch:r,isFetching:i}=gt({queryKey:["systemInfo"],queryFn:Se.getSystemInfo,refetchInterval:3e4});if(n)return o.jsx("div",{className:"flex items-center justify-center h-64",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})});if(!e)return o.jsx("div",{className:"p-6 text-center text-bambu-gray",children:t("system.failedToLoad","Failed to load system information")});const a=e.storage.disk_percent_used>90?"bg-red-500":e.storage.disk_percent_used>75?"bg-yellow-500":"bg-bambu-green",s=e.memory.percent_used>90?"bg-red-500":e.memory.percent_used>75?"bg-yellow-500":"bg-bambu-green";return o.jsxs("div",{className:"p-6 space-y-6",children:[o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:t("system.title","System Information")}),o.jsx("p",{className:"text-bambu-gray mt-1",children:t("system.subtitle","Monitor system resources and database statistics")})]}),o.jsxs("button",{onClick:()=>r(),disabled:i,className:"flex items-center gap-2 px-4 py-2 bg-bambu-dark-secondary hover:bg-bambu-dark-tertiary rounded-lg transition-colors disabled:opacity-50",children:[o.jsx(_a,{className:`w-4 h-4 ${i?"animate-spin":""}`}),t("common.refresh","Refresh")]})]}),o.jsx(uh,{title:t("system.application","Application"),icon:dh,children:o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[o.jsx(Xr,{icon:dh,label:t("system.version","Version"),value:`v${e.app.version}`}),o.jsx(Xr,{icon:rr,label:t("system.uptime","System Uptime"),value:e.system.uptime_formatted}),o.jsx(Xr,{icon:dh,label:t("system.hostname","Hostname"),value:e.system.hostname})]})}),o.jsxs(uh,{title:t("system.database","Database"),icon:wp,children:[o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 mb-4",children:[o.jsx(Xr,{icon:oo,label:t("system.totalArchives","Total Archives"),value:e.database.archives}),o.jsx(Xr,{icon:sR,label:t("system.completed","Completed"),value:e.database.archives_completed,color:"text-green-500"}),o.jsx(Xr,{icon:Pa,label:t("system.failed","Failed"),value:e.database.archives_failed,color:"text-red-500"}),o.jsx(Xr,{icon:xt,label:t("system.printing","Printing"),value:e.database.archives_printing,color:"text-yellow-500"})]}),o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[o.jsx(Xr,{icon:Vi,label:t("system.printers","Printers"),value:e.database.printers}),o.jsx(Xr,{icon:mR,label:t("system.filaments","Filaments"),value:e.database.filaments}),o.jsx(Xr,{icon:Uo,label:t("system.projects","Projects"),value:e.database.projects}),o.jsx(Xr,{icon:lo,label:t("system.smartPlugs","Smart Plugs"),value:e.database.smart_plugs})]}),o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4",children:[o.jsx(Xr,{icon:rr,label:t("system.totalPrintTime","Total Print Time"),value:e.database.total_print_time_formatted}),o.jsx(Xr,{icon:oo,label:t("system.totalFilament","Total Filament Used"),value:`${e.database.total_filament_kg} kg`,subValue:`${e.database.total_filament_grams.toLocaleString()} g`})]})]}),o.jsxs(uh,{title:t("system.connectedPrinters","Connected Printers"),icon:Vi,children:[o.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[o.jsx("div",{className:"text-3xl font-bold text-bambu-green",children:e.printers.connected}),o.jsx("div",{className:"text-bambu-gray",children:t("system.ofTotal","of {{total}} printers connected",{total:e.printers.total})})]}),e.printers.connected_list.length>0?o.jsx("div",{className:"space-y-2",children:e.printers.connected_list.map(l=>o.jsxs("div",{className:"flex items-center justify-between p-3 bg-bambu-dark rounded-lg",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-bambu-green"}),o.jsx("span",{className:"font-medium text-white",children:l.name})]}),o.jsxs("div",{className:"flex items-center gap-4 text-sm text-bambu-gray",children:[o.jsx("span",{children:l.model}),o.jsx("span",{className:`px-2 py-0.5 rounded ${l.state==="RUNNING"?"bg-bambu-green/20 text-bambu-green":l.state==="IDLE"?"bg-blue-500/20 text-blue-400":"bg-bambu-dark-tertiary"}`,children:l.state})]})]},l.id))}):o.jsx("p",{className:"text-bambu-gray",children:t("system.noPrintersConnected","No printers connected")})]}),o.jsx(uh,{title:t("system.storage","Storage"),icon:hR,children:o.jsxs("div",{className:"space-y-4",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[o.jsx("span",{className:"text-bambu-gray",children:t("system.diskUsage","Disk Usage")}),o.jsxs("span",{className:"text-white",children:[e.storage.disk_used_formatted," / ",e.storage.disk_total_formatted]})]}),o.jsx(K9,{percent:e.storage.disk_percent_used,color:a}),o.jsxs("p",{className:"text-xs text-bambu-gray mt-1",children:[e.storage.disk_free_formatted," ",t("system.free","free")," (",(100-e.storage.disk_percent_used).toFixed(1),"%)"]})]}),o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[o.jsx(Xr,{icon:oo,label:t("system.archiveStorage","Archive Storage"),value:e.storage.archive_size_formatted}),o.jsx(Xr,{icon:wp,label:t("system.databaseSize","Database Size"),value:e.storage.database_size_formatted})]})]})}),o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[o.jsx(uh,{title:t("system.memory","Memory"),icon:Fce,children:o.jsx("div",{className:"space-y-4",children:o.jsxs("div",{children:[o.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[o.jsx("span",{className:"text-bambu-gray",children:t("system.memoryUsage","Memory Usage")}),o.jsxs("span",{className:"text-white",children:[e.memory.used_formatted," / ",e.memory.total_formatted]})]}),o.jsx(K9,{percent:e.memory.percent_used,color:s}),o.jsxs("p",{className:"text-xs text-bambu-gray mt-1",children:[e.memory.available_formatted," ",t("system.available","available")]})]})})}),o.jsx(uh,{title:t("system.cpu","CPU"),icon:Tv,children:o.jsx("div",{className:"space-y-4",children:o.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[o.jsx(Xr,{icon:Tv,label:t("system.cores","Cores"),value:e.cpu.count,subValue:`${e.cpu.count_logical} logical`}),o.jsx(Xr,{icon:Tv,label:t("system.usage","Usage"),value:`${e.cpu.percent}%`})]})})})]}),o.jsx(uh,{title:t("system.systemDetails","System Details"),icon:dh,children:o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[o.jsx(Xr,{icon:dh,label:t("system.os","Operating System"),value:e.system.platform,subValue:e.system.platform_release}),o.jsx(Xr,{icon:Tv,label:t("system.architecture","Architecture"),value:e.system.architecture}),o.jsx(Xr,{icon:dh,label:t("system.python","Python"),value:e.system.python_version}),o.jsx(Xr,{icon:rr,label:t("system.bootTime","Boot Time"),value:new Date(e.system.boot_time).toLocaleString()})]})})]})}function CWe(){const t=M.useRef(null),e=M.useRef(null),n=mn(),[r,i]=M.useState(!1),a=M.useRef(new Set),s=M.useRef(null),l=M.useRef(new Map),c=M.useRef(null),u=M.useRef([]),d=M.useRef(!1),f=M.useRef(()=>{}),g=M.useCallback(()=>{if(d.current||u.current.length===0)return;d.current=!0;const E=()=>{const w=u.current.shift();w?requestAnimationFrame(()=>{f.current(w),u.current.length>0?setTimeout(E,16):d.current=!1}):d.current=!1};E()},[]),p=M.useCallback(()=>{if(t.current?.readyState===WebSocket.OPEN)return;const w=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/v1/ws`,T=new WebSocket(w);let A=null;T.onopen=()=>{console.log("[WebSocket] Connected"),i(!0),A=window.setInterval(()=>{T.readyState===WebSocket.OPEN&&T.send(JSON.stringify({type:"ping"}))},3e4)},T.onmessage=C=>{try{const N=JSON.parse(C.data);N.type==="printer_status"&&N.printer_id!==void 0&&N.data?f.current(N):(u.current.push(N),g())}catch{}},T.onclose=C=>{console.log("[WebSocket] Closed",C.code,C.reason),A&&(clearInterval(A),A=null),i(!1),t.current=null,e.current=window.setTimeout(()=>{p()},3e3)},T.onerror=C=>{console.error("[WebSocket] Error",C),T.close()},t.current=T},[]),x=M.useCallback((E,w)=>{const T=l.current.get(E)||{};l.current.set(E,{...T,...w}),c.current||(c.current=window.setTimeout(()=>{const A=new Map(l.current);l.current.clear(),c.current=null,requestAnimationFrame(()=>{A.forEach((C,N)=>{n.setQueryData(["printerStatus",N],F=>{const k={...F,...C};return k.wifi_signal==null&&F?.wifi_signal!=null&&(k.wifi_signal=F.wifi_signal),k})})})},100))},[n]),v=M.useCallback(E=>{a.current.add(E),s.current&&clearTimeout(s.current),s.current=window.setTimeout(()=>{const w=Array.from(a.current);a.current.clear(),s.current=null;let T=0;w.forEach(A=>{setTimeout(()=>{requestAnimationFrame(()=>{n.invalidateQueries({queryKey:[A]})})},T),T+=500})},3e3)},[n]),y=M.useCallback(E=>{switch(E.type){case"printer_status":E.printer_id!==void 0&&E.data&&x(E.printer_id,E.data);break;case"print_complete":v("archives"),v("archiveStats");break;case"archive_created":v("archives"),v("archiveStats");break;case"archive_updated":v("archives");break}},[n,v,x]);M.useEffect(()=>{f.current=y},[y]),M.useEffect(()=>(p(),()=>{e.current&&clearTimeout(e.current),s.current&&clearTimeout(s.current),c.current&&clearTimeout(c.current),t.current&&t.current.close()}),[p]);const b=M.useCallback(E=>{t.current?.readyState===WebSocket.OPEN&&t.current.send(JSON.stringify(E))},[]);return{isConnected:r,sendMessage:b}}const kWe=new ioe({defaultOptions:{queries:{staleTime:1e3*60,retry:1}}});function PWe({children:t}){return CWe(),o.jsx(o.Fragment,{children:t})}function jWe(){return o.jsx(Ede,{children:o.jsx(Lde,{children:o.jsx(aoe,{client:kWe,children:o.jsx(PWe,{children:o.jsx(Tse,{children:o.jsxs(rse,{children:[o.jsx(Xa,{path:"/camera/:printerId",element:o.jsx(TWe,{})}),o.jsxs(Xa,{path:"/",element:o.jsx(Rde,{}),children:[o.jsx(Xa,{index:!0,element:o.jsx(tCe,{})}),o.jsx(Xa,{path:"archives",element:o.jsx(O7e,{})}),o.jsx(Xa,{path:"queue",element:o.jsx(vGe,{})}),o.jsx(Xa,{path:"stats",element:o.jsx(DGe,{})}),o.jsx(Xa,{path:"profiles",element:o.jsx(uWe,{})}),o.jsx(Xa,{path:"maintenance",element:o.jsx(mWe,{})}),o.jsx(Xa,{path:"projects",element:o.jsx(gWe,{})}),o.jsx(Xa,{path:"projects/:id",element:o.jsx(SWe,{})}),o.jsx(Xa,{path:"settings",element:o.jsx(JGe,{})}),o.jsx(Xa,{path:"system",element:o.jsx(NWe,{})}),o.jsx(Xa,{path:"external/:id",element:o.jsx(AWe,{})})]})]})})})})})})}oie.createRoot(document.getElementById("root")).render(o.jsx(M.StrictMode,{children:o.jsx(jWe,{})})); +`+n+"}"}return String(t)}function sWe({setting:t,onClose:e,onDeleted:n,onDuplicate:r,onEdit:i}){const{showToast:a}=Sr(),s=mn(),[l,c]=M.useState(!1),{data:u,isLoading:d}=gt({queryKey:["cloudSettingDetail",t.setting_id],queryFn:()=>Se.getCloudSettingDetail(t.setting_id)}),f=vt({mutationFn:()=>Se.deleteCloudSetting(t.setting_id),onSuccess:()=>{a("Preset deleted"),s.invalidateQueries({queryKey:["cloudSettings"]}),n()},onError:x=>a(x.message,"error")}),g=yb(t.setting_id),p=HL(t.name,u?.setting?.inherits);return o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",children:o.jsx(wt,{className:"w-full max-w-3xl max-h-[90vh] flex flex-col overflow-hidden",children:o.jsxs(Et,{className:"p-0 flex flex-col min-h-0 flex-1",children:[o.jsxs("div",{className:"flex-shrink-0 flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("h2",{className:"text-xl font-semibold text-white truncate",children:t.name}),g&&o.jsx("span",{className:"px-2 py-0.5 text-xs font-medium bg-bambu-green/20 text-bambu-green rounded-full",children:"Editable"})]}),o.jsxs("div",{className:"flex items-center gap-2 mt-1 text-sm text-bambu-gray",children:[o.jsxs("span",{className:"capitalize",children:[t.type," preset"]}),p.printer&&o.jsxs(o.Fragment,{children:[o.jsx("span",{children:"•"}),o.jsx("span",{children:p.printer})]})]})]}),o.jsx("button",{onClick:e,className:"p-2 text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary rounded-lg transition-colors",children:o.jsx(Gt,{className:"w-5 h-5"})})]}),o.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto p-4",children:d?o.jsx("div",{className:"flex items-center justify-center py-16",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})}):u?o.jsx("pre",{className:"text-xs text-bambu-gray font-mono whitespace-pre-wrap break-all bg-bambu-dark p-4 rounded-lg border border-bambu-dark-tertiary overflow-x-auto max-w-full",children:Kj(u)}):o.jsx("div",{className:"text-center py-16 text-bambu-gray",children:"Failed to load preset details"})}),l?o.jsxs("div",{className:"flex-shrink-0 p-4 border-t border-bambu-dark-tertiary bg-red-500/5",children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3 text-red-400",children:[o.jsx(Gn,{className:"w-5 h-5"}),o.jsx("span",{className:"font-medium",children:"Delete this preset?"})]}),o.jsxs("p",{className:"text-sm text-bambu-gray mb-4",children:['This will permanently delete "',t.name,'" from Bambu Cloud. This cannot be undone.']}),o.jsxs("div",{className:"flex gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:()=>c(!1),disabled:f.isPending,className:"flex-1",children:"Cancel"}),o.jsxs(ke,{variant:"danger",onClick:()=>f.mutate(),disabled:f.isPending,className:"flex-1",children:[f.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin"}):o.jsx(En,{className:"w-4 h-4"}),"Delete"]})]})]}):o.jsx("div",{className:"flex-shrink-0 p-4 border-t border-bambu-dark-tertiary",children:o.jsxs("div",{className:"flex gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:e,className:"flex-1",children:"Close"}),o.jsxs(ke,{variant:"secondary",onClick:r,children:[o.jsx(md,{className:"w-4 h-4"}),"Duplicate"]}),g&&o.jsxs(o.Fragment,{children:[o.jsxs(ke,{variant:"secondary",onClick:i,disabled:d||!u,children:[o.jsx(Uc,{className:"w-4 h-4"}),"Edit"]}),o.jsx(ke,{variant:"danger",onClick:()=>c(!0),children:o.jsx(En,{className:"w-4 h-4"})})]})]})})]})})})}function $te(){try{const t=localStorage.getItem("bambusy_preset_templates");return t?JSON.parse(t):[]}catch{return[]}}function Vte(t){localStorage.setItem("bambusy_preset_templates",JSON.stringify(t))}function oWe({onClose:t,onApply:e}){const{showToast:n}=Sr(),[r,i]=M.useState($te),[a,s]=M.useState("all"),[l,c]=M.useState(null),[u,d]=M.useState(""),[f,g]=M.useState(""),[p,x]=M.useState("{}"),[v,y]=M.useState(null),[b,E]=M.useState(null),w=a==="all"?r:r.filter(L=>L.type===a),T=L=>{i(L),Vte(L)},A=L=>{const q=r.filter(j=>j.id!==L);T(q),E(null),n("Template deleted")},C=L=>{c(L.id),d(L.name),g(L.description),x(JSON.stringify(L.settings,null,2)),y(null)},N=()=>{if(!(!l||!u.trim()))try{const L=JSON.parse(p),q=r.map(j=>j.id===l?{...j,name:u.trim(),description:f.trim(),settings:L}:j);T(q),c(null),n("Template updated")}catch(L){y(L.message)}},F=()=>{c(null),d(""),g(""),x("{}"),y(null)},k=L=>{const q=r.map(j=>j.id===L?{...j,showInModal:!j.showInModal}:j);T(q)},R={filament:{label:"Filament",icon:oR,color:"text-amber-400"},print:{label:"Process",icon:eM,color:"text-blue-400"},printer:{label:"Printer",icon:Vi,color:"text-purple-400"}},I=b?r.find(L=>L.id===b):null;return M.useEffect(()=>{const L=q=>{q.key==="Escape"&&(b?E(null):l?F():t())};return window.addEventListener("keydown",L),()=>window.removeEventListener("keydown",L)},[b,l,t]),o.jsxs("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:[I&&o.jsx("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-60",children:o.jsx(wt,{className:"w-full max-w-md",children:o.jsxs(Et,{className:"p-6",children:[o.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[o.jsx("div",{className:"p-2 bg-red-500/20 rounded-lg",children:o.jsx(Gn,{className:"w-6 h-6 text-red-400"})}),o.jsxs("div",{children:[o.jsx("h3",{className:"text-lg font-semibold text-white",children:"Delete Template"}),o.jsx("p",{className:"text-sm text-bambu-gray",children:"This action cannot be undone"})]})]}),o.jsxs("p",{className:"text-white mb-6",children:['Are you sure you want to delete "',o.jsx("span",{className:"font-medium",children:I.name}),'"?']}),o.jsxs("div",{className:"flex gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:()=>E(null),className:"flex-1",children:"Cancel"}),o.jsxs(ke,{onClick:()=>A(b),className:"flex-1 bg-red-500 hover:bg-red-600",children:[o.jsx(En,{className:"w-4 h-4"}),"Delete"]})]})]})})}),o.jsx(wt,{className:"w-full max-w-2xl max-h-[80vh] flex flex-col",children:o.jsxs(Et,{className:"p-0 flex flex-col h-full",children:[o.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(j0,{className:"w-5 h-5 text-amber-400"}),"Quick Templates"]}),o.jsx("button",{onClick:t,className:"text-bambu-gray hover:text-white",children:o.jsx(Gt,{className:"w-5 h-5"})})]}),o.jsxs("div",{className:"flex items-center gap-2 p-4 border-b border-bambu-dark-tertiary",children:[o.jsx("span",{className:"text-sm text-bambu-gray",children:"Type:"}),["all","filament","print","printer"].map(L=>o.jsx("button",{onClick:()=>s(L),className:`px-3 py-1 text-sm rounded-lg transition-colors ${a===L?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:L==="all"?"All":R[L].label},L))]}),o.jsx("div",{className:"flex-1 overflow-y-auto p-4",children:w.length===0?o.jsxs("div",{className:"text-center py-12 text-bambu-gray",children:[o.jsx(j0,{className:"w-12 h-12 mx-auto mb-4 opacity-30"}),o.jsx("p",{children:"No templates yet"}),o.jsx("p",{className:"text-sm mt-1",children:"Create templates from the preset editor"})]}):o.jsx("div",{className:"space-y-2",children:w.map(L=>{const q=R[L.type],j=q.icon;return l===L.id?o.jsxs("div",{className:"p-4 bg-bambu-dark rounded-lg border border-bambu-green",children:[o.jsxs("div",{className:"grid grid-cols-2 gap-3 mb-3",children:[o.jsx("input",{type:"text",value:u,onChange:V=>d(V.target.value),placeholder:"Template name",className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none",autoFocus:!0}),o.jsx("input",{type:"text",value:f,onChange:V=>g(V.target.value),placeholder:"Description",className:"px-3 py-2 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"})]}),o.jsxs("div",{className:"mb-3",children:[o.jsx("label",{className:"text-xs text-bambu-gray mb-1 block",children:"Settings (JSON)"}),o.jsx("textarea",{value:p,onChange:V=>{x(V.target.value),y(null)},rows:6,className:`w-full px-3 py-2 bg-bambu-dark-secondary border rounded text-white text-sm font-mono focus:outline-none ${v?"border-red-500":"border-bambu-dark-tertiary focus:border-bambu-green"}`}),v&&o.jsx("p",{className:"text-xs text-red-400 mt-1",children:v})]}),o.jsxs("div",{className:"flex gap-2",children:[o.jsxs(ke,{size:"sm",onClick:N,disabled:!u.trim(),children:[o.jsx(Ts,{className:"w-4 h-4"}),"Save"]}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:F,children:"Cancel"})]})]},L.id):o.jsxs("div",{className:"flex items-center gap-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary hover:border-bambu-gray-dark transition-colors",children:[o.jsx(j,{className:`w-5 h-5 ${q.color} flex-shrink-0`}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("p",{className:"text-sm font-medium text-white",children:L.name}),o.jsx("p",{className:"text-xs text-bambu-gray truncate",children:L.description})]}),o.jsxs("span",{className:"text-xs text-bambu-gray-dark px-2 py-1 bg-bambu-dark-secondary rounded",children:[Object.keys(L.settings).length," fields"]}),o.jsx("button",{onClick:()=>k(L.id),className:`p-1 transition-colors ${L.showInModal?"text-bambu-green hover:text-bambu-green/70":"text-bambu-gray hover:text-white"}`,title:L.showInModal?"Shown in modals":"Hidden in modals",children:L.showInModal?o.jsx(Zh,{className:"w-4 h-4"}):o.jsx(YS,{className:"w-4 h-4"})}),o.jsx("button",{onClick:()=>e(L),className:"px-3 py-1 text-xs bg-bambu-green/20 text-bambu-green rounded hover:bg-bambu-green/30 transition-colors",children:"Apply"}),o.jsx("button",{onClick:()=>C(L),className:"p-1 text-bambu-gray hover:text-white",title:"Edit",children:o.jsx(Uc,{className:"w-4 h-4"})}),o.jsx("button",{onClick:()=>E(L.id),className:"p-1 text-bambu-gray hover:text-red-400",title:"Delete",children:o.jsx(En,{className:"w-4 h-4"})})]},L.id)})})})]})})]})}function Gte({onClose:t,leftPreset:e,rightPreset:n,leftLabel:r,rightLabel:i}){const[a,s]=M.useState("changes"),[l,c]=M.useState(""),u=M.useMemo(()=>{const p=new Set([...Object.keys(e),...Object.keys(n)]),x=[];for(const v of p){if(v==="inherits"||v==="version")continue;const y=e[v],b=n[v],E=v in e,w=v in n;let T;!E&&w?T="added":E&&!w?T="removed":JSON.stringify(y)!==JSON.stringify(b)?T="changed":T="same",x.push({key:v,left:y,right:b,status:T})}return x.sort((v,y)=>{const b={changed:0,added:1,removed:2,same:3};return b[v.status]!==b[y.status]?b[v.status]-b[y.status]:v.key.localeCompare(y.key)})},[e,n]),d=M.useMemo(()=>{let p=[...u];if(a==="changes"&&(p=p.filter(x=>x.status!=="same")),l){const x=l.toLowerCase();p=p.filter(v=>v.key.toLowerCase().includes(x)||String(v.left).toLowerCase().includes(x)||String(v.right).toLowerCase().includes(x))}return p},[u,a,l]),f=M.useMemo(()=>({added:u.filter(p=>p.status==="added").length,removed:u.filter(p=>p.status==="removed").length,changed:u.filter(p=>p.status==="changed").length,same:u.filter(p=>p.status==="same").length}),[u]),g=p=>{if(p===void 0)return"—";if(p===null)return"null";if(Array.isArray(p))return p.length===0?"[]":p.length===1?String(p[0]):p.join(", ");if(typeof p=="object")return JSON.stringify(p);const x=String(p);if(x.includes("\\n")||x.length>100){const v=x.split("\\n").length;if(v>1)return`[${v} lines of G-code/script]`;if(x.length>100)return x.substring(0,100)+"…"}return x};return M.useEffect(()=>{const p=x=>{x.key==="Escape"&&t()};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[t]),o.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:o.jsx(wt,{className:"w-full max-w-4xl max-h-[85vh] flex flex-col overflow-hidden",children:o.jsxs(Et,{className:"p-0 flex flex-col min-h-0 flex-1",children:[o.jsxs("div",{className:"flex-shrink-0 flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(op,{className:"w-5 h-5 text-blue-400"}),"Compare Presets"]}),o.jsx("button",{onClick:t,className:"text-bambu-gray hover:text-white",children:o.jsx(Gt,{className:"w-5 h-5"})})]}),o.jsxs("div",{className:"flex-shrink-0 grid grid-cols-2 gap-4 p-4 border-b border-bambu-dark-tertiary bg-bambu-dark",children:[o.jsxs("div",{className:"text-center",children:[o.jsx("span",{className:"text-sm text-bambu-gray",children:"Left:"}),o.jsx("p",{className:"text-white font-medium truncate",children:r})]}),o.jsxs("div",{className:"text-center",children:[o.jsx("span",{className:"text-sm text-bambu-gray",children:"Right:"}),o.jsx("p",{className:"text-white font-medium truncate",children:i})]})]}),o.jsxs("div",{className:"flex-shrink-0 flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center gap-4 text-sm",children:[o.jsxs("span",{className:"flex items-center gap-1 text-green-400",children:[o.jsx(sr,{className:"w-3.5 h-3.5"}),f.added," added"]}),o.jsxs("span",{className:"flex items-center gap-1 text-red-400",children:[o.jsx(Qk,{className:"w-3.5 h-3.5"}),f.removed," removed"]}),o.jsxs("span",{className:"flex items-center gap-1 text-amber-400",children:[o.jsx(Wk,{className:"w-3.5 h-3.5"}),f.changed," changed"]}),o.jsxs("span",{className:"flex items-center gap-1 text-bambu-gray",children:[o.jsx(GT,{className:"w-3.5 h-3.5"}),f.same," same"]})]}),o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs("div",{className:"relative",children:[o.jsx(bl,{className:"absolute left-2 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray"}),o.jsx("input",{type:"text",value:l,onChange:p=>c(p.target.value),placeholder:"Search fields...",className:"pl-8 pr-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none w-48"})]}),f.same>0&&o.jsxs("div",{className:"flex rounded overflow-hidden border border-bambu-dark-tertiary",children:[o.jsx("button",{onClick:()=>s("changes"),className:`px-3 py-1.5 text-sm transition-colors ${a==="changes"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:"Changes"}),o.jsx("button",{onClick:()=>s("all"),className:`px-3 py-1.5 text-sm transition-colors ${a==="all"?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:"All"})]})]})]}),o.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto",children:d.length===0?o.jsxs("div",{className:"text-center py-12 text-bambu-gray",children:[o.jsx(GT,{className:"w-12 h-12 mx-auto mb-4 opacity-30"}),o.jsx("p",{children:a==="changes"?"No differences found":"No fields match the search"})]}):o.jsxs("table",{className:"w-full",children:[o.jsx("thead",{className:"sticky top-0 bg-bambu-dark-secondary",children:o.jsxs("tr",{className:"text-sm text-bambu-gray border-b border-bambu-dark-tertiary",children:[o.jsx("th",{className:"text-left p-3 w-1/3",children:"Field"}),o.jsx("th",{className:"text-left p-3 w-1/3",children:r}),o.jsx("th",{className:"text-left p-3 w-1/3",children:i})]})}),o.jsx("tbody",{children:d.map(p=>{const x={added:"bg-green-500/10",removed:"bg-red-500/10",changed:"bg-amber-500/10",same:""}[p.status],v={added:o.jsx(sr,{className:"w-3.5 h-3.5 text-green-400"}),removed:o.jsx(Qk,{className:"w-3.5 h-3.5 text-red-400"}),changed:o.jsx(Wk,{className:"w-3.5 h-3.5 text-amber-400"}),same:o.jsx(GT,{className:"w-3.5 h-3.5 text-bambu-gray-dark"})}[p.status];return o.jsxs("tr",{className:`border-b border-bambu-dark-tertiary ${x}`,children:[o.jsx("td",{className:"p-3",children:o.jsxs("div",{className:"flex items-center gap-2",children:[v,o.jsx("span",{className:"text-sm text-white font-mono",children:p.key})]})}),o.jsx("td",{className:"p-3",children:o.jsx("span",{className:`text-sm font-mono break-all ${p.status==="removed"?"text-red-300":p.status==="changed"?"text-white":"text-bambu-gray"}`,children:g(p.left)})}),o.jsx("td",{className:"p-3",children:o.jsx("span",{className:`text-sm font-mono break-all ${p.status==="added"?"text-green-300":p.status==="changed"?"text-white":"text-bambu-gray"}`,children:g(p.right)})})]},p.key)})})]})})]})})})}function lWe({onClose:t,initialData:e,allPresets:n}){const{showToast:r}=Sr(),i=mn(),a=!!e?.setting_id,[s,l]=M.useState("common"),[c,u]=M.useState(e?.type||"filament"),[d,f]=M.useState(e?.name?a?e.name:`${e.name} (Copy)`:""),[g,p]=M.useState(e?.base_id||""),[x,v]=M.useState(""),[y,b]=M.useState(e?.setting||{inherits:""}),[E,w]=M.useState(JSON.stringify(e?.setting||{inherits:""},null,2)),[T,A]=M.useState(null),[C,N]=M.useState(""),[F,k]=M.useState(!1),[R,I]=M.useState(""),[L,q]=M.useState(!1),[j,V]=M.useState($te),[K,W]=M.useState(!1),[J,ee]=M.useState(""),[Z,B]=M.useState(""),[G,Q]=M.useState(!0),[te,he]=M.useState(null),[oe,xe]=M.useState(!1),Te=M.useMemo(()=>({filament:n.filament,print:n.process,printer:n.printer})[c]||[],[n,c]),me=M.useMemo(()=>Te.filter(ae=>yb(ae.setting_id)),[Te]),{data:ce}=gt({queryKey:["cloudFields",c],queryFn:()=>Se.getCloudFields(c==="print"?"process":c),staleTime:1e3*60*60}),{data:Ce}=gt({queryKey:["allPresetDetails",c,me.map(ae=>ae.setting_id).join(",")],queryFn:async()=>{const ae={};for(let Ue=0;Ue{try{const nt=await Se.getCloudSettingDetail(pe.setting_id);return{id:pe.setting_id,detail:nt}}catch{return null}}))).forEach(pe=>{pe&&(ae[pe.id]=pe.detail)})}return ae},enabled:me.length>0,staleTime:1e3*60*10}),{data:fe,isLoading:Ie}=gt({queryKey:["cloudSettingDetail",g],queryFn:()=>Se.getCloudSettingDetail(g),enabled:!!g});M.useEffect(()=>{s!=="json"&&w(JSON.stringify(y,null,2))},[y,s]);const z=M.useMemo(()=>({filament:n.filament,print:n.process,printer:n.printer}[c]||[]).filter(ze=>!yb(ze.setting_id)).sort((ze,Ue)=>ze.name.localeCompare(Ue.name)),[n,c]);M.useEffect(()=>{if(!g)return;const ae=z.find(ze=>ze.setting_id===g);ae&&(v(ae.name),a||(b({inherits:ae.name}),w(JSON.stringify({inherits:ae.name},null,2))))},[g,z,a]);const H=M.useMemo(()=>{const ae=ce?.fields||[],ze=new Set(ae.map(pe=>pe.key)),Ue=new Set,et=new Set(["inherits","updated_time","compatible_printers","compatible_prints"]);Ce&&Object.values(Ce).forEach(pe=>{pe?.setting&&Object.keys(pe.setting).forEach(nt=>{!ze.has(nt)&&!et.has(nt)&&Ue.add(nt)})}),Object.keys(y).forEach(pe=>{!ze.has(pe)&&!et.has(pe)&&Ue.add(pe)});const dt=Array.from(Ue).sort().map(pe=>({key:pe,label:pe.replace(/_/g," ").replace(/\b\w/g,nt=>nt.toUpperCase()),type:"text",category:"discovered",description:"Discovered from presets"}));return[...ae,...dt]},[ce,Ce,y]),re=H.filter(ae=>ae.label.toLowerCase().includes(C.toLowerCase())||ae.key.toLowerCase().includes(C.toLowerCase())),$=()=>{if(R.trim()){const ae=R.trim().toLowerCase().replace(/\s+/g,"_");Y(ae,""),I(""),q(!1),r(`Field "${ae}" added`)}},Y=(ae,ze)=>{b(Ue=>{const et={...Ue};return ze===""||ze===void 0?delete et[ae]:et[ae]=ze,et})},se=ae=>{b(ze=>({...ze,...ae.settings})),he(ae.name),r("Template applied")},ue=()=>{if(!J.trim())return;const ae={...y};if(delete ae.inherits,Object.keys(ae).length===0){r("No overrides to save","error");return}const ze={id:Date.now().toString(),name:J.trim(),description:Z.trim()||"Custom template",type:c,settings:ae,showInModal:G},Ue=[...j,ze];V(Ue),Vte(Ue),W(!1),ee(""),B(""),Q(!0),r("Template saved")},Ee=M.useMemo(()=>j.filter(ae=>ae.type===c&&ae.showInModal),[c,j]),Me=ae=>{w(ae);try{const ze=JSON.parse(ae);b(ze),A(null)}catch(ze){A(ze.message)}},U=ae=>{ae.preventDefault(),k(!1);const ze=ae.dataTransfer.files[0];if(ze&&ze.name.endsWith(".json")){const Ue=new FileReader;Ue.onload=et=>{try{const dt=et.target?.result,pe=JSON.parse(dt),nt=pe.setting||pe;b(ve=>({...ve,...nt})),w(JSON.stringify({...y,...nt},null,2)),r("File imported successfully")}catch{r("Invalid JSON file","error")}},Ue.readAsText(ze)}},O=vt({mutationFn:()=>{const ae={...y},ze=c==="filament"?"filament_settings_id":c==="print"?"print_settings_id":"printer_settings_id";ae[ze]=`"${d}"`;const Ue={type:c,name:d,base_id:g,setting:ae};return Se.createCloudSetting(Ue)},onSuccess:async()=>{r("Preset created successfully"),await i.refetchQueries({queryKey:["cloudSettings"]}),t()},onError:ae=>r(ae.message,"error")}),ne=vt({mutationFn:()=>{if(!e?.setting_id)throw new Error("No setting ID for update");return Se.updateCloudSetting(e.setting_id,{name:d,setting:y})},onSuccess:async()=>{r("Preset updated successfully"),i.removeQueries({queryKey:["cloudSettingDetail"]}),await i.refetchQueries({queryKey:["cloudSettings"]}),t()},onError:ae=>r(ae.message,"error")}),be=a?ne:O,ye=fe?.setting?.inherits,_e=ye?z.find(ae=>ae.name===ye):void 0,{data:We}=gt({queryKey:["cloudSettingDetail",_e?.setting_id],queryFn:()=>Se.getCloudSettingDetail(_e.setting_id),enabled:!!_e?.setting_id}),Ve=M.useMemo(()=>{const ae=We?.setting||{},ze=fe?.setting||{},Ue=g&&Ce?.[g]?.setting?Ce[g].setting:{};return{...ae,...ze,...Ue}},[g,fe,We,Ce]),Ye=ae=>{if(ae==null)return"";if(Array.isArray(ae)){const ze=[...new Set(ae.map(Ue=>String(Ue)))];return ze.length===1?ze[0]:ae.join(", ")}return String(ae)},lt=ae=>{const ze=y[ae.key],Ue=Ve[ae.key],et=Ye(Ue),dt=Ie?"Loading...":et||"",pe="w-full px-3 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none";if(ae.type==="boolean"){const nt=ze==="1"||ze===void 0&&Ue==="1";return o.jsx("button",{type:"button",onClick:()=>Y(ae.key,ze==="1"?"0":"1"),className:`w-8 h-5 rounded-full transition-colors ${nt?"bg-bambu-green":"bg-bambu-dark-tertiary"}`,children:o.jsx("div",{className:`w-4 h-4 rounded-full bg-white shadow transition-transform ${nt?"translate-x-3.5":"translate-x-0.5"}`})})}return ae.type==="select"?o.jsxs("select",{value:ze||"",onChange:nt=>Y(ae.key,nt.target.value),className:pe,children:[o.jsx("option",{value:"",children:dt}),ae.options?.map(nt=>o.jsx("option",{value:nt.value,children:nt.label},nt.value))]}):o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:ae.type==="number"?"number":"text",value:ze!==void 0?String(ze):"",onChange:nt=>Y(ae.key,nt.target.value),step:ae.step,min:ae.min,max:ae.max,placeholder:dt,className:pe}),ae.unit&&o.jsx("span",{className:"text-xs text-bambu-gray whitespace-nowrap",children:ae.unit})]})},de=M.useMemo(()=>fe?.setting?fe.setting:{},[fe]);return o.jsxs("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4",onDragOver:ae=>{ae.preventDefault(),k(!0)},onDragLeave:()=>k(!1),onDrop:U,children:[oe&&g&&o.jsx(Gte,{onClose:()=>xe(!1),leftPreset:de,rightPreset:y,leftLabel:`Base: ${x||g}`,rightLabel:`Current: ${d||"New Preset"}`}),o.jsx(wt,{className:"w-full max-w-6xl max-h-[90vh] flex flex-col",children:o.jsxs(Et,{className:"p-0 flex flex-col h-full",children:[o.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-bambu-dark-tertiary",children:[o.jsxs("div",{children:[o.jsx("h2",{className:"text-xl font-semibold text-white",children:a?"Edit Preset":e?"Duplicate Preset":"Create New Preset"}),o.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:"Customize settings for your new preset"})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[g&&o.jsxs("button",{onClick:()=>xe(!0),className:"flex items-center gap-2 px-3 py-2 text-sm text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary rounded-lg transition-colors",title:"Compare with base preset",children:[o.jsx(op,{className:"w-4 h-4"}),"Compare"]}),o.jsx("button",{onClick:t,className:"p-2 text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary rounded-lg transition-colors",children:o.jsx(Gt,{className:"w-5 h-5"})})]})]}),F&&o.jsx("div",{className:"absolute inset-0 bg-bambu-green/10 border-2 border-dashed border-bambu-green rounded-lg flex items-center justify-center z-10",children:o.jsxs("div",{className:"text-center",children:[o.jsx(oa,{className:"w-12 h-12 text-bambu-green mx-auto mb-2"}),o.jsx("p",{className:"text-bambu-green font-medium",children:"Drop JSON file to import"})]})}),o.jsxs("div",{className:"p-4 border-b border-bambu-dark-tertiary space-y-3",children:[o.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Type"}),o.jsxs("select",{value:c,onChange:ae=>{u(ae.target.value),p("")},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"filament",children:"Filament"}),o.jsx("option",{value:"print",children:"Process"}),o.jsx("option",{value:"printer",children:"Printer"})]})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Base Preset"}),o.jsxs("select",{value:g,onChange:ae=>p(ae.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"",children:"Select base preset..."}),z.map(ae=>o.jsx("option",{value:ae.setting_id,children:ae.name},ae.setting_id))]})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm text-bambu-gray mb-1",children:"Preset Name"}),o.jsx("input",{type:"text",value:d,onChange:ae=>f(ae.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none",placeholder:"My Custom Preset"})]})]}),x&&o.jsx("div",{className:"text-xs text-bambu-gray",children:o.jsxs("p",{className:"flex items-center gap-1",children:[o.jsx(xl,{className:"w-3 h-3 text-bambu-green"}),"Inherits from: ",o.jsx("span",{className:"text-white",children:x}),Ie&&o.jsx(xt,{className:"w-3 h-3 animate-spin ml-1"})]})})]}),o.jsxs("div",{className:"flex border-b border-bambu-dark-tertiary",children:[o.jsxs("button",{onClick:()=>l("common"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${s==="common"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(wU,{className:"w-4 h-4"}),"Common"]}),o.jsxs("button",{onClick:()=>l("fields"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${s==="fields"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(fR,{className:"w-4 h-4"}),"All Fields"]}),o.jsxs("button",{onClick:()=>l("json"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${s==="json"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(DG,{className:"w-4 h-4"}),"JSON",T&&o.jsx(mo,{className:"w-3 h-3 text-red-400"})]}),o.jsx("div",{className:"flex-1"}),o.jsxs("button",{onClick:()=>{const ae={name:d,type:c,base_id:g,setting:y},ze=new Blob([JSON.stringify(ae,null,2)],{type:"application/json"}),Ue=URL.createObjectURL(ze),et=document.createElement("a");et.href=Ue,et.download=`${d||"preset"}.json`,document.body.appendChild(et),et.click(),document.body.removeChild(et),URL.revokeObjectURL(Ue),r("Preset exported")},className:"flex items-center gap-2 px-4 py-3 text-sm text-bambu-gray hover:text-white transition-colors",title:"Export current settings to JSON file",children:[o.jsx(is,{className:"w-4 h-4"}),"Export"]}),o.jsxs("button",{onClick:()=>document.getElementById("file-import")?.click(),className:"flex items-center gap-2 px-4 py-3 text-sm text-bambu-gray hover:text-white transition-colors",title:"Import settings from JSON file",children:[o.jsx(oa,{className:"w-4 h-4"}),"Import"]}),o.jsx("input",{id:"file-import",type:"file",accept:".json",className:"hidden",onChange:ae=>{const ze=ae.target.files?.[0];if(ze){const Ue=new FileReader;Ue.onload=et=>{try{const dt=JSON.parse(et.target?.result),pe=dt.setting||dt;b(nt=>({...nt,...pe})),r("File imported")}catch{r("Invalid JSON","error")}},Ue.readAsText(ze)}}})]}),o.jsxs("div",{className:"flex-1 overflow-y-auto p-4",children:[s==="common"&&o.jsxs("div",{className:"space-y-6",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsxs("h3",{className:"text-sm font-medium text-white flex items-center gap-2",children:[o.jsx(j0,{className:"w-4 h-4 text-amber-400"}),"Quick Templates"]}),Object.keys(y).filter(ae=>ae!=="inherits").length>0&&o.jsxs("button",{onClick:()=>W(!K),className:"text-xs text-bambu-gray hover:text-white flex items-center gap-1 transition-colors",children:[o.jsx(Ts,{className:"w-3 h-3"}),"Save as template"]})]}),K&&o.jsxs("div",{className:"mb-3 p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"grid grid-cols-2 gap-2 mb-2",children:[o.jsx("input",{type:"text",value:J,onChange:ae=>ee(ae.target.value),placeholder:"Template name",className:"px-3 py-1.5 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none",autoFocus:!0}),o.jsx("input",{type:"text",value:Z,onChange:ae=>B(ae.target.value),placeholder:"Description (optional)",className:"px-3 py-1.5 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"})]}),o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{className:"flex gap-2",children:[o.jsxs(ke,{size:"sm",onClick:ue,disabled:!J.trim(),children:[o.jsx(Ts,{className:"w-3 h-3"}),"Save"]}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>W(!1),children:"Cancel"})]}),o.jsxs("button",{onClick:()=>Q(!G),className:`flex items-center gap-1.5 text-xs transition-colors ${G?"text-bambu-green":"text-bambu-gray hover:text-white"}`,children:[G?o.jsx(Zh,{className:"w-3.5 h-3.5"}):o.jsx(YS,{className:"w-3.5 h-3.5"}),G?"Show in modals":"Hidden in modals"]})]})]}),te&&o.jsxs("div",{className:"mb-3 px-3 py-2 bg-bambu-green/10 border border-bambu-green/30 rounded-lg flex items-center gap-2",children:[o.jsx(xl,{className:"w-4 h-4 text-bambu-green"}),o.jsxs("span",{className:"text-sm text-bambu-green",children:["Template applied: ",o.jsx("span",{className:"font-medium",children:te})]}),o.jsx("button",{onClick:()=>he(null),className:"ml-auto text-bambu-green/70 hover:text-bambu-green",children:o.jsx(Gt,{className:"w-4 h-4"})})]}),o.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[Ee.map(ae=>o.jsxs("button",{onClick:()=>se(ae),className:"p-3 text-left bg-bambu-dark border border-bambu-dark-tertiary rounded-lg hover:border-bambu-gray-dark transition-colors",children:[o.jsx("p",{className:"text-sm font-medium text-white",children:ae.name}),o.jsx("p",{className:"text-xs text-bambu-gray mt-1",children:ae.description})]},ae.id)),Ee.length===0&&o.jsx("p",{className:"col-span-3 text-center text-bambu-gray text-sm py-4",children:"No templates selected. Use the Templates button to enable templates for quick access."})]}),o.jsx("p",{className:"text-xs text-bambu-gray-dark mt-2 text-center",children:"Manage templates via the Templates button on the main page"})]}),o.jsxs("div",{children:[o.jsx("h3",{className:"text-sm font-medium text-white mb-3",children:"Common Settings"}),o.jsx("div",{className:"grid grid-cols-2 gap-x-6 gap-y-3",children:H.slice(0,10).map(ae=>o.jsxs("div",{className:"flex items-center justify-between gap-4",children:[o.jsx("label",{className:"text-sm text-bambu-gray flex-shrink-0",children:ae.label}),o.jsx("div",{className:"w-48",children:lt(ae)})]},ae.key))})]}),Object.keys(y).length>1&&o.jsxs("div",{children:[o.jsx("h3",{className:"text-sm font-medium text-white mb-3",children:"Current Overrides"}),o.jsx("div",{className:"flex flex-wrap gap-2",children:Object.entries(y).filter(([ae])=>ae!=="inherits").map(([ae,ze])=>o.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 bg-bambu-green/10 text-bambu-green text-xs rounded",children:[ae,": ",String(ze).slice(0,20),o.jsx("button",{onClick:()=>Y(ae,void 0),className:"hover:text-white",children:o.jsx(Gt,{className:"w-3 h-3"})})]},ae))})]})]}),s==="fields"&&o.jsxs("div",{className:"grid grid-cols-2 gap-6",style:{height:"400px"},children:[o.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3 flex-shrink-0",children:[o.jsx("h3",{className:"text-sm font-medium text-white",children:"Available Fields"}),o.jsx("span",{className:"text-xs text-bambu-gray",children:Ce?`${H.length} fields`:"Loading..."})]}),o.jsxs("div",{className:"relative mb-3 flex-shrink-0",children:[o.jsx(bl,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray"}),o.jsx("input",{type:"text",value:C,onChange:ae=>N(ae.target.value),placeholder:"Search fields...",className:"w-full pl-10 pr-4 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none"})]}),o.jsxs("div",{className:"flex-1 overflow-y-auto space-y-1 pr-2 min-h-0",children:[re.filter(ae=>!(ae.key in y)).map(ae=>{const ze=Ve[ae.key],Ue=Ye(ze);return o.jsxs("div",{onClick:()=>{b(et=>({...et,[ae.key]:Ue||""}))},className:"flex items-center justify-between gap-2 p-2 rounded-lg hover:bg-bambu-dark-tertiary transition-colors cursor-pointer group",children:[o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsx("p",{className:"text-sm text-white truncate",children:ae.label}),o.jsx("p",{className:"text-xs text-bambu-gray-dark truncate",children:ae.key})]}),o.jsxs("div",{className:"flex items-center gap-2 flex-shrink-0",children:[Ue&&o.jsxs("span",{className:"text-xs text-bambu-gray bg-bambu-dark px-2 py-0.5 rounded max-w-32 truncate",title:Ue,children:[Ue.slice(0,20),Ue.length>20?"...":""]}),o.jsx("div",{className:"w-6 h-6 flex items-center justify-center rounded bg-bambu-dark-tertiary group-hover:bg-bambu-green/20 transition-colors",children:o.jsx(sr,{className:"w-4 h-4 text-bambu-gray group-hover:text-bambu-green transition-colors"})})]})]},ae.key)}),re.filter(ae=>!(ae.key in y)).length===0&&o.jsx("p",{className:"text-center text-bambu-gray py-4 text-sm",children:C?"No matching fields":"All fields added"})]}),o.jsx("div",{className:"pt-3 mt-3 border-t border-bambu-dark-tertiary flex-shrink-0",children:L?o.jsxs("div",{className:"flex gap-2",children:[o.jsx("input",{type:"text",value:R,onChange:ae=>I(ae.target.value),onKeyDown:ae=>ae.key==="Enter"&&$(),placeholder:"custom_field_name",className:"flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white font-mono text-sm placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none",autoFocus:!0}),o.jsx(ke,{size:"sm",onClick:$,disabled:!R.trim(),children:o.jsx(sr,{className:"w-4 h-4"})}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>{q(!1),I("")},children:o.jsx(Gt,{className:"w-4 h-4"})})]}):o.jsxs("button",{onClick:()=>q(!0),className:"w-full flex items-center justify-center gap-2 p-2 text-sm text-bambu-gray hover:text-white border border-dashed border-bambu-dark-tertiary hover:border-bambu-gray-dark rounded-lg transition-colors",children:[o.jsx(sr,{className:"w-4 h-4"}),"Add custom field"]})})]}),o.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3 flex-shrink-0",children:[o.jsx("h3",{className:"text-sm font-medium text-white",children:"Your Overrides"}),o.jsxs("span",{className:"text-xs text-bambu-gray",children:[Object.keys(y).filter(ae=>ae!=="inherits").length," fields"]})]}),o.jsxs("div",{className:"flex-1 overflow-y-auto space-y-2 pr-2 min-h-0",children:[Object.entries(y).filter(([ae])=>ae!=="inherits").map(([ae,ze])=>{const Ue=H.find(et=>et.key===ae);return o.jsxs("div",{className:"p-3 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center justify-between mb-2",children:[o.jsxs("div",{children:[o.jsx("p",{className:"text-sm font-medium text-white",children:Ue?.label||ae}),o.jsx("p",{className:"text-xs text-bambu-gray-dark",children:ae})]}),o.jsx("button",{onClick:()=>Y(ae,void 0),className:"p-1 text-bambu-gray hover:text-red-400 transition-colors",children:o.jsx(Gt,{className:"w-4 h-4"})})]}),Ue?lt(Ue):o.jsx("input",{type:"text",value:String(ze),onChange:et=>Y(ae,et.target.value),className:"w-full px-3 py-1.5 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-sm focus:border-bambu-green focus:outline-none"})]},ae)}),Object.keys(y).filter(ae=>ae!=="inherits").length===0&&o.jsxs("div",{className:"text-center py-8 text-bambu-gray",children:[o.jsx(wU,{className:"w-8 h-8 mx-auto mb-2 opacity-50"}),o.jsx("p",{className:"text-sm",children:"No overrides yet"}),o.jsx("p",{className:"text-xs mt-1",children:"Click fields on the left to add them"})]})]}),Object.keys(y).filter(ae=>ae!=="inherits").length>0&&o.jsx("div",{className:"pt-3 mt-3 border-t border-bambu-dark-tertiary flex-shrink-0",children:o.jsxs("button",{onClick:()=>{W(!0),l("common")},className:"w-full flex items-center justify-center gap-2 p-2 text-sm text-bambu-gray hover:text-white border border-dashed border-bambu-dark-tertiary hover:border-bambu-gray-dark rounded-lg transition-colors",children:[o.jsx(Ts,{className:"w-4 h-4"}),"Save as template"]})})]})]}),s==="json"&&o.jsxs("div",{className:"space-y-2",children:[T&&o.jsxs("div",{className:"flex items-center gap-2 text-red-400 text-sm",children:[o.jsx(mo,{className:"w-4 h-4"}),T]}),o.jsx("textarea",{value:E,onChange:ae=>Me(ae.target.value),className:`w-full h-80 px-3 py-2 bg-bambu-dark border rounded-lg text-white text-xs font-mono focus:outline-none resize-none ${T?"border-red-500 focus:border-red-500":"border-bambu-dark-tertiary focus:border-bambu-green"}`,spellCheck:!1}),o.jsx("p",{className:"text-xs text-bambu-gray",children:"Tip: Drag & drop a .json file anywhere on this modal to import settings"})]})]}),o.jsxs("div",{className:"p-4 border-t border-bambu-dark-tertiary flex gap-2",children:[o.jsx(ke,{variant:"secondary",onClick:t,className:"flex-1",children:"Cancel"}),o.jsxs(ke,{onClick:()=>be.mutate(),disabled:be.isPending||!d.trim()||!a&&!g||!!T,className:"flex-1",children:[be.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin"}):a?o.jsx(Ts,{className:"w-4 h-4"}):o.jsx(sr,{className:"w-4 h-4"}),a?"Save":e?"Duplicate":"Create"]})]})]})})]})}function cWe({settings:t,lastSyncTime:e,onRefresh:n,isRefreshing:r,printers:i}){const[a,s]=M.useState(""),[l,c]=M.useState("all"),[u,d]=M.useState("all"),[f,g]=M.useState("all"),[p,x]=M.useState("all"),[v,y]=M.useState("all"),[b,E]=M.useState("all"),[w,T]=M.useState(null),[A,C]=M.useState(!1),[N,F]=M.useState(!1),[k,R]=M.useState(null),[I,L]=M.useState(null),[q,j]=M.useState(null),[V,K]=M.useState(!1),[W,J]=M.useState([null,null]),[ee,Z]=M.useState(!1),[B,G]=M.useState(null),Q=mn(),te=M.useMemo(()=>[...t.filament.map(re=>({...re,type:"filament"})),...t.printer.map(re=>({...re,type:"printer"})),...t.process.map(re=>({...re,type:"process"}))].map(re=>({...re,meta:HL(re.name)})),[t]),he=M.useMemo(()=>{const H=new Set,re=new Set,$=new Set;return te.forEach(Y=>{Y.meta.nozzle&&H.add(Y.meta.nozzle),Y.meta.filamentType&&re.add(Y.meta.filamentType),Y.meta.layerHeight&&$.add(Y.meta.layerHeight)}),{printers:i.map(Y=>({id:Y.id.toString(),name:Y.name})),nozzles:Array.from(H).sort((Y,se)=>parseFloat(Y)-parseFloat(se)),filaments:Array.from(re).sort(),layerHeights:Array.from($).sort((Y,se)=>parseFloat(Y)-parseFloat(se))}},[te,i]),oe=M.useMemo(()=>f==="all"?null:i.find(re=>re.id.toString()===f)?.model||null,[f,i]),xe=M.useMemo(()=>te.filter(H=>l==="all"||H.type===l).filter(H=>{if(u==="all")return!0;const re=yb(H.setting_id);return u==="custom"?re:!re}).filter(H=>{if(f==="all"||!oe)return!0;const re=H.meta.printer?.toLowerCase()||"",$=oe.toLowerCase();return re.includes($)||$.includes(re)}).filter(H=>p==="all"||H.meta.nozzle===p).filter(H=>v==="all"||H.meta.filamentType===v).filter(H=>b==="all"||H.meta.layerHeight===b).filter(H=>a===""||H.name.toLowerCase().includes(a.toLowerCase())).sort((H,re)=>H.name.localeCompare(re.name)),[te,l,u,f,oe,p,v,b,a]),Te=H=>{if(V){const re=W[0]?.setting_id===H.setting_id,$=W[1]?.setting_id===H.setting_id;if(re)J([W[1],null]);else if($)J([W[0],null]);else if(!W[0])J([H,null]);else if(W[1]){if(W[0].type!==H.type)return;J([W[0],H])}else{if(W[0].type!==H.type)return;J([W[0],H])}}else T(H)},me=H=>{if(W[0]?.setting_id===H.setting_id)return 0;if(W[1]?.setting_id===H.setting_id)return 1},ce=async H=>{try{const re=await Se.getCloudSettingDetail(H.setting_id),$=H.type==="process"?"print":H.type;R({type:$,name:H.name,base_id:re.base_id||"GFSA00",setting:re.setting||{}}),T(null)}catch(re){console.error("Failed to fetch preset details for duplication:",re)}},Ce=async H=>{try{Q.removeQueries({queryKey:["cloudSettingDetail",H.setting_id]});const re=await Se.getCloudSettingDetail(H.setting_id),$=H.type==="process"?"print":H.type;L({type:$,name:H.name,base_id:re.base_id||"GFSA00",setting:re.setting||{},setting_id:H.setting_id}),T(null)}catch(re){console.error("Failed to fetch preset details for editing:",re)}},fe=()=>{c("all"),d("all"),g("all"),x("all"),y("all"),E("all"),s("")},Ie=l!=="all"||u!=="all"||f!=="all"||p!=="all"||v!=="all"||b!=="all"||a!=="",z=t.filament.length+t.printer.length+t.process.length;return o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"space-y-4 mb-6",children:[o.jsxs("div",{className:"flex flex-col sm:flex-row gap-3",children:[o.jsxs("div",{className:"relative flex-1",children:[o.jsx(bl,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-bambu-gray"}),o.jsx("input",{type:"text",value:a,onChange:H=>s(H.target.value),placeholder:"Search presets...",className:"w-full pl-10 pr-4 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white placeholder-bambu-gray-dark focus:border-bambu-green focus:outline-none"})]}),o.jsxs("div",{className:"flex gap-2",children:[o.jsxs(ke,{variant:V?"primary":"secondary",onClick:()=>{V?(K(!1),J([null,null])):K(!0)},children:[o.jsx(op,{className:"w-4 h-4"}),V?"Cancel":"Compare"]}),o.jsxs(ke,{variant:"secondary",onClick:()=>F(!0),children:[o.jsx(j0,{className:"w-4 h-4"}),"Templates"]}),o.jsxs(ke,{variant:"secondary",onClick:n,disabled:r,children:[o.jsx(_a,{className:`w-4 h-4 ${r?"animate-spin":""}`}),"Refresh"]}),o.jsxs(ke,{onClick:()=>C(!0),children:[o.jsx(sr,{className:"w-4 h-4"}),"New Preset"]})]})]}),o.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[o.jsx(dR,{className:"w-4 h-4 text-bambu-gray"}),o.jsx(Wm,{label:"Type",value:l,options:[{value:"all",label:"All",count:z},{value:"filament",label:"Filament",count:t.filament.length},{value:"printer",label:"Printer",count:t.printer.length},{value:"process",label:"Process",count:t.process.length}],onChange:H=>c(H)}),o.jsx(Wm,{label:"Owner",value:u,options:[{value:"all",label:"All"},{value:"custom",label:"My Presets"},{value:"builtin",label:"Built-in"}],onChange:H=>d(H)}),he.printers.length>0&&o.jsx(Wm,{label:"Printer",value:f,options:[{value:"all",label:"All"},...he.printers.map(H=>({value:H.id,label:H.name}))],onChange:g}),he.nozzles.length>0&&o.jsx(Wm,{label:"Nozzle",value:p,options:[{value:"all",label:"All"},...he.nozzles.map(H=>({value:H,label:H}))],onChange:x}),he.filaments.length>0&&(l==="all"||l==="filament")&&o.jsx(Wm,{label:"Filament",value:v,options:[{value:"all",label:"All"},...he.filaments.map(H=>({value:H,label:H}))],onChange:y}),he.layerHeights.length>0&&(l==="all"||l==="process")&&o.jsx(Wm,{label:"Layer",value:b,options:[{value:"all",label:"All"},...he.layerHeights.map(H=>({value:H,label:H}))],onChange:E}),Ie&&o.jsx("button",{onClick:fe,className:"px-3 py-2 text-sm text-bambu-gray hover:text-white transition-colors",children:"Clear filters"})]})]}),V&&o.jsx("div",{className:"mb-4 p-3 bg-blue-500/10 border border-blue-500/30 rounded-lg",children:o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{className:"flex items-center gap-4",children:[o.jsx(op,{className:"w-5 h-5 text-blue-400"}),o.jsx("span",{className:"text-white font-medium",children:"Compare Mode"}),o.jsx("span",{className:"text-bambu-gray",children:W[0]?`Select another ${W[0].type} preset`:"Click two presets of the same type to compare"})]}),o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("span",{className:`px-2 py-1 text-sm rounded truncate max-w-[200px] ${W[0]?"bg-blue-500/30 text-blue-700 dark:text-blue-300":"bg-bambu-dark text-bambu-gray"}`,children:W[0]?W[0].name:"1. Select first"}),o.jsx(Wk,{className:"w-4 h-4 text-bambu-gray"}),o.jsx("span",{className:`px-2 py-1 text-sm rounded truncate max-w-[200px] ${W[1]?"bg-blue-500/30 text-blue-700 dark:text-blue-300":"bg-bambu-dark text-bambu-gray"}`,children:W[1]?W[1].name:"2. Select second"})]}),W[0]&&W[1]&&o.jsxs(ke,{size:"sm",onClick:async()=>{try{const[H,re]=await Promise.all([Se.getCloudSettingDetail(W[0].setting_id),Se.getCloudSettingDetail(W[1].setting_id)]);G([H.setting||{},re.setting||{}]),Z(!0)}catch{}},children:[o.jsx(op,{className:"w-4 h-4"}),"Compare Now"]})]})]})}),o.jsxs("div",{className:"flex flex-wrap items-center gap-4 mb-4 text-sm text-bambu-gray",children:[e&&o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsx(rr,{className:"w-3 h-3"}),"Last synced: ",rWe(e.toISOString())]}),o.jsxs("span",{children:["Showing ",xe.length," of ",z," presets"]}),o.jsxs("div",{className:"flex items-center gap-1",children:[o.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-bambu-green"}),o.jsx("span",{children:"= My preset (editable)"})]})]}),xe.length===0?o.jsxs("div",{className:"text-center py-16",children:[o.jsx(pd,{className:"w-12 h-12 text-bambu-gray-dark mx-auto mb-4"}),o.jsx("p",{className:"text-bambu-gray",children:"No presets found"}),Ie&&o.jsx("button",{onClick:fe,className:"mt-2 text-sm text-bambu-green hover:text-bambu-green-light",children:"Clear filters"})]}):o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3 px-1",children:[o.jsx(oR,{className:"w-4 h-4 text-amber-400"}),o.jsx("h3",{className:"text-sm font-medium text-bambu-gray",children:"Filament"}),o.jsxs("span",{className:"text-xs text-bambu-gray-dark",children:["(",xe.filter(H=>H.type==="filament").length,")"]})]}),o.jsxs("div",{className:"space-y-1 max-h-[calc(100vh-320px)] overflow-y-auto pr-1",children:[xe.filter(H=>H.type==="filament").map(H=>o.jsx(kk,{setting:H,onClick:()=>Te(H),onDuplicate:()=>ce(H),compareMode:V,isCompareSelected:me(H)!==void 0,compareIndex:me(H),compareDisabled:V&&!!W[0]&&W[0].type!==H.type},H.setting_id)),xe.filter(H=>H.type==="filament").length===0&&o.jsx("p",{className:"text-xs text-bambu-gray-dark px-3 py-2",children:"No filament presets"})]})]}),o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3 px-1",children:[o.jsx(eM,{className:"w-4 h-4 text-blue-400"}),o.jsx("h3",{className:"text-sm font-medium text-bambu-gray",children:"Process"}),o.jsxs("span",{className:"text-xs text-bambu-gray-dark",children:["(",xe.filter(H=>H.type==="process").length,")"]})]}),o.jsxs("div",{className:"space-y-1 max-h-[calc(100vh-320px)] overflow-y-auto pr-1",children:[xe.filter(H=>H.type==="process").map(H=>o.jsx(kk,{setting:H,onClick:()=>Te(H),onDuplicate:()=>ce(H),compareMode:V,isCompareSelected:me(H)!==void 0,compareIndex:me(H),compareDisabled:V&&!!W[0]&&W[0].type!==H.type},H.setting_id)),xe.filter(H=>H.type==="process").length===0&&o.jsx("p",{className:"text-xs text-bambu-gray-dark px-3 py-2",children:"No process presets"})]})]}),o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center gap-2 mb-3 px-1",children:[o.jsx(Vi,{className:"w-4 h-4 text-purple-400"}),o.jsx("h3",{className:"text-sm font-medium text-bambu-gray",children:"Printer"}),o.jsxs("span",{className:"text-xs text-bambu-gray-dark",children:["(",xe.filter(H=>H.type==="printer").length,")"]})]}),o.jsxs("div",{className:"space-y-1 max-h-[calc(100vh-320px)] overflow-y-auto pr-1",children:[xe.filter(H=>H.type==="printer").map(H=>o.jsx(kk,{setting:H,onClick:()=>Te(H),onDuplicate:()=>ce(H),compareMode:V,isCompareSelected:me(H)!==void 0,compareIndex:me(H),compareDisabled:V&&!!W[0]&&W[0].type!==H.type},H.setting_id)),xe.filter(H=>H.type==="printer").length===0&&o.jsx("p",{className:"text-xs text-bambu-gray-dark px-3 py-2",children:"No printer presets"})]})]})]}),w&&o.jsx(sWe,{setting:w,onClose:()=>T(null),onDeleted:()=>T(null),onDuplicate:()=>ce(w),onEdit:()=>Ce(w)}),(A||k||I||q)&&o.jsx(lWe,{onClose:()=>{C(!1),R(null),L(null),j(null)},initialData:I||k||(q?{type:q.type,name:"",base_id:"",setting:q.setting}:void 0),allPresets:t}),N&&o.jsx(oWe,{onClose:()=>F(!1),onApply:H=>{j({type:H.type,setting:H.settings}),F(!1)}}),ee&&B&&W[0]&&W[1]&&o.jsx(Gte,{onClose:()=>{Z(!1),G(null)},leftPreset:B[0],rightPreset:B[1],leftLabel:W[0].name,rightLabel:W[1].name})]})}function uWe(){const t=mn(),{showToast:e}=Sr(),[n,r]=M.useState("cloud"),[i,a]=M.useState(),{data:s,isLoading:l}=gt({queryKey:["cloudStatus"],queryFn:Se.getCloudStatus}),{data:c=[]}=gt({queryKey:["printers"],queryFn:Se.getPrinters}),{data:u,isLoading:d,refetch:f,dataUpdatedAt:g}=gt({queryKey:["cloudSettings"],queryFn:()=>Se.getCloudSettings(),enabled:!!s?.is_authenticated,retry:!1,staleTime:1e3*60*5});M.useEffect(()=>{g&&a(new Date(g))},[g]);const p=vt({mutationFn:Se.cloudLogout,onSuccess:()=>{t.invalidateQueries({queryKey:["cloudStatus"]}),t.removeQueries({queryKey:["cloudSettings"]}),e("Logged out")}}),x=()=>{t.invalidateQueries({queryKey:["cloudStatus"]})};return l?o.jsx("div",{className:"p-4 md:p-8 flex items-center justify-center min-h-[400px]",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})}):o.jsxs("div",{className:"p-6 lg:p-8",children:[o.jsxs("div",{className:"mb-6",children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:"Profiles"}),o.jsx("p",{className:"text-bambu-gray",children:"Manage your slicer presets and pressure advance calibrations"})]}),o.jsxs("div",{className:"flex border-b border-bambu-dark-tertiary mb-6",children:[o.jsxs("button",{onClick:()=>r("cloud"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${n==="cloud"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(XS,{className:"w-4 h-4"}),"Cloud Profiles"]}),o.jsxs("button",{onClick:()=>r("kprofiles"),className:`flex items-center gap-2 px-4 py-3 text-sm font-medium transition-colors border-b-2 -mb-px ${n==="kprofiles"?"text-bambu-green border-bambu-green":"text-bambu-gray hover:text-white border-transparent"}`,children:[o.jsx(ZS,{className:"w-4 h-4"}),"K-Profiles"]})]}),n==="cloud"&&o.jsxs(o.Fragment,{children:[s?.is_authenticated&&o.jsxs("div",{className:"flex items-center justify-between p-3 mb-6 bg-bambu-dark rounded-lg border border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-bambu-green animate-pulse"}),o.jsxs("span",{className:"text-sm text-bambu-gray",children:["Connected as ",o.jsx("span",{className:"text-white",children:s.email})]})]}),o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>p.mutate(),disabled:p.isPending,children:[o.jsx(Nce,{className:"w-4 h-4"}),"Logout"]})]}),s?.is_authenticated?d?o.jsx("div",{className:"flex items-center justify-center py-16",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})}):u?o.jsx(cWe,{settings:u,lastSyncTime:i,onRefresh:()=>f(),isRefreshing:d,printers:c}):o.jsxs("div",{className:"text-center py-16",children:[o.jsx("p",{className:"text-bambu-gray mb-4",children:"Failed to load profiles"}),o.jsx(ke,{onClick:()=>f(),children:"Retry"})]}):o.jsx(iWe,{onSuccess:x})]}),n==="kprofiles"&&o.jsx(nWe,{}),o.jsx(aWe,{})]})}const t0={Droplet:oR,Flame:Ble,Ruler:pue,Sparkles:j0,Square:Ep,Cable:Uoe,Wrench:gd,Calendar:Qr,Timer:Zu,Cog:ple,Fan:Ple,Zap:ef,Wind:xde,Thermometer:tM,Layers:pd,Box:_p,Target:BG,RefreshCw:_a,Settings:xR,Filter:dR,CircleDot:nle};function M0(t){return t&&t0[t]||gd}function qm(t,e){if(e==="days")return t<1?"Today":t===1?"1 day":t<7?`${Math.round(t)} days`:t<180?`${Math.round(t/7)} weeks`:`${Math.round(t/30)} months`;{if(t<1)return`${Math.round(t*60)}m`;if(t<24)return`${t<10?t.toFixed(1):Math.round(t)}h`;const n=t/24;if(n<7)return`${n<2?n.toFixed(1):Math.round(n)}d`;const r=n/7;return r<12?`${r<2?r.toFixed(1):Math.round(r)}w`:`${Math.round(r/4)}mo`}}function Pk(t,e){return e==="days"?t===1?"1 day":t===7?"1 week":t===14?"2 weeks":t===30?"1 month":t===60?"2 months":t===90?"3 months":t===180?"6 months":t===365?"1 year":`${t} days`:`${t}h`}function dWe({item:t,onPerform:e,onToggle:n}){const r=M0(t.maintenance_type_icon),i=t.interval_type||"hours",s=(()=>{if(i==="days"){const f=t.days_since_maintenance??0;return Math.max(0,Math.min(100,f/t.interval_hours*100))}return Math.max(0,Math.min(100,(t.interval_hours-t.hours_until_due)/t.interval_hours*100))})(),l=()=>t.enabled?t.is_due?"text-red-400":t.is_warning?"text-amber-400":"text-bambu-green":"text-bambu-gray",c=()=>t.enabled?t.is_due?"bg-red-500":t.is_warning?"bg-amber-500":"bg-bambu-green":"bg-bambu-gray/30",u=()=>t.enabled?t.is_due?"bg-red-500/5 border-red-500/20":t.is_warning?"bg-amber-500/5 border-amber-500/20":"bg-bambu-dark-secondary border-bambu-dark-tertiary":"bg-bambu-dark-secondary/50",d=()=>{if(!t.enabled)return"Disabled";if(i==="days"){const f=t.days_until_due??0;return t.is_due?`Overdue by ${qm(Math.abs(f),"days")}`:t.is_warning?`Due in ${qm(f,"days")}`:`${qm(f,"days")} left`}else return t.is_due?`Overdue by ${qm(Math.abs(t.hours_until_due),"hours")}`:t.is_warning?`Due in ${qm(t.hours_until_due,"hours")}`:`${qm(t.hours_until_due,"hours")} left`};return o.jsx("div",{className:`rounded-xl border p-4 transition-all ${u()}`,children:o.jsxs("div",{className:"flex items-start gap-3",children:[o.jsxs("div",{className:`relative p-2.5 rounded-lg ${t.is_due?"bg-red-500/20":t.is_warning?"bg-amber-500/20":t.enabled?"bg-bambu-dark":"bg-bambu-dark/50"}`,children:[o.jsx(r,{className:`w-5 h-5 ${l()}`}),t.enabled&&(t.is_due||t.is_warning)&&o.jsx("span",{className:`absolute -top-1 -right-1 w-2.5 h-2.5 rounded-full ${t.is_due?"bg-red-500":"bg-amber-500"} animate-pulse`})]}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("h3",{className:`font-medium truncate ${t.enabled?"text-white":"text-bambu-gray"}`,children:t.maintenance_type_name}),i==="days"&&o.jsx("span",{title:"Time-based interval",children:o.jsx(Qr,{className:"w-3.5 h-3.5 text-bambu-gray shrink-0"})})]}),o.jsx("div",{className:"mt-2 mb-1.5",children:o.jsx("div",{className:"w-full h-1.5 bg-bambu-dark rounded-full overflow-hidden",children:o.jsx("div",{className:`h-full rounded-full transition-all duration-500 ${c()}`,style:{width:`${s}%`}})})}),o.jsxs("div",{className:`text-xs flex items-center gap-1 ${l()}`,children:[t.is_due&&o.jsx(Gn,{className:"w-3 h-3"}),t.is_warning&&!t.is_due&&o.jsx(rr,{className:"w-3 h-3"}),!t.is_due&&!t.is_warning&&t.enabled&&o.jsx(xl,{className:"w-3 h-3"}),d()]})]}),o.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[o.jsx(In,{checked:t.enabled,onChange:f=>n(t.id,f)}),o.jsxs(ke,{size:"sm",variant:t.is_due?"primary":"secondary",onClick:()=>e(t.id),disabled:!t.enabled,className:"!px-3",children:[o.jsx(ig,{className:"w-3.5 h-3.5"}),"Reset"]})]})]})})}function hWe({overview:t,onPerform:e,onToggle:n,onSetHours:r}){const[i,a]=M.useState(!0),[s,l]=M.useState(!1),[c,u]=M.useState(t.total_print_hours.toFixed(1)),d=[...t.maintenance_items].sort((p,x)=>p.is_due&&!x.is_due?-1:!p.is_due&&x.is_due?1:p.is_warning&&!x.is_warning?-1:!p.is_warning&&x.is_warning?1:p.maintenance_type_id-x.maintenance_type_id),f=d.find(p=>p.enabled&&(p.is_due||p.is_warning)),g=()=>{const p=parseFloat(c);!isNaN(p)&&p>=0&&(r(t.printer_id,p),l(!1))};return o.jsxs(wt,{className:"overflow-hidden",children:[o.jsxs("div",{className:"p-5",children:[o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{className:"flex items-center gap-4",children:[o.jsx("h2",{className:"text-xl font-semibold text-white",children:t.printer_name}),o.jsxs("div",{className:"flex items-center gap-2",children:[t.due_count>0&&o.jsxs("span",{className:"px-2.5 py-1 bg-red-500/20 text-red-400 text-xs font-medium rounded-full flex items-center gap-1.5",children:[o.jsx(Gn,{className:"w-3 h-3"}),t.due_count," overdue"]}),t.warning_count>0&&o.jsxs("span",{className:"px-2.5 py-1 bg-amber-500/20 text-amber-400 text-xs font-medium rounded-full flex items-center gap-1.5",children:[o.jsx(rr,{className:"w-3 h-3"}),t.warning_count," due soon"]}),t.due_count===0&&t.warning_count===0&&o.jsxs("span",{className:"px-2.5 py-1 bg-bambu-green/20 text-bambu-green text-xs font-medium rounded-full flex items-center gap-1.5",children:[o.jsx(xl,{className:"w-3 h-3"}),"All good"]})]})]}),o.jsxs("button",{onClick:()=>a(!i),className:"flex items-center gap-1.5 px-3 py-1.5 text-sm text-bambu-gray hover:text-white hover:bg-bambu-dark rounded-lg transition-colors",children:[i?o.jsx(Mb,{className:"w-4 h-4"}):o.jsx(Cl,{className:"w-4 h-4"}),i?"Collapse":"Expand"]})]}),o.jsxs("div",{className:"flex items-center gap-6 mt-4",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"p-2 bg-bambu-dark/50 rounded-lg",children:o.jsx(Zu,{className:"w-4 h-4 text-bambu-gray"})}),s?o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("input",{type:"number",value:c,onChange:p=>u(p.target.value),onKeyDown:p=>{p.key==="Enter"&&g(),p.key==="Escape"&&l(!1)},className:"w-24 px-2 py-1 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm",min:"0",step:"1",autoFocus:!0}),o.jsx("span",{className:"text-xs text-bambu-gray",children:"hours"}),o.jsx(ke,{size:"sm",onClick:g,children:"Save"}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>l(!1),children:"Cancel"})]}):o.jsxs("button",{onClick:()=>{u(Math.round(t.total_print_hours).toString()),l(!0)},className:"group",children:[o.jsxs("div",{className:"text-sm font-medium text-white group-hover:text-bambu-green transition-colors flex items-center gap-1",children:[Math.round(t.total_print_hours)," hours",o.jsx(Qh,{className:"w-3 h-3 text-bambu-gray group-hover:text-bambu-green"})]}),o.jsx("div",{className:"text-xs text-bambu-gray",children:"Total print time"})]})]}),o.jsx("div",{className:"w-px h-10 bg-bambu-dark-tertiary"}),f&&o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:`p-2 rounded-lg ${f.is_due?"bg-red-500/20":"bg-amber-500/20"}`,children:(()=>{const p=M0(f.maintenance_type_icon);return o.jsx(p,{className:`w-4 h-4 ${f.is_due?"text-red-400":"text-amber-400"}`})})()}),o.jsxs("div",{children:[o.jsx("div",{className:`text-sm font-medium ${f.is_due?"text-red-400":"text-amber-400"}`,children:f.maintenance_type_name}),o.jsx("div",{className:`text-xs ${f.is_due?"text-red-400/70":"text-amber-400/70"}`,children:f.is_due?"Overdue":"Due soon"})]})]})]})]}),i&&o.jsx(Et,{className:"pt-0 border-t border-bambu-dark-tertiary",children:o.jsx("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3 pt-4",children:d.map(p=>o.jsx(dWe,{item:p,onPerform:e,onToggle:n},p.id))})})]})}function fWe({overview:t,types:e,onUpdateInterval:n,onAddType:r,onUpdateType:i,onDeleteType:a,onAssignType:s,onRemoveItem:l}){const[c,u]=M.useState(null),[d,f]=M.useState(""),[g,p]=M.useState("hours"),[x,v]=M.useState(!1),[y,b]=M.useState(""),[E,w]=M.useState("100"),[T,A]=M.useState("hours"),[C,N]=M.useState("Wrench"),[F,k]=M.useState(new Set),[R,I]=M.useState(null),L=M.useMemo(()=>t?t.map(Ie=>({id:Ie.printer_id,name:Ie.printer_name})):[],[t]),q=Ie=>t?t.filter(z=>z.maintenance_items.some(H=>H.maintenance_type_id===Ie)).map(z=>({printerId:z.printer_id,printerName:z.printer_name,itemId:z.maintenance_items.find(H=>H.maintenance_type_id===Ie)?.id})):[],j=Ie=>{if(!t)return[];const z=new Set(q(Ie).map(H=>H.printerId));return L.filter(H=>!z.has(H.id))},[V,K]=M.useState(null),[W,J]=M.useState(""),[ee,Z]=M.useState(""),[B,G]=M.useState("hours"),[Q,te]=M.useState("Wrench"),he=Ie=>{K(Ie),J(Ie.name),Z(Ie.default_interval_hours.toString()),G(Ie.interval_type||"hours"),te(Ie.icon||"Wrench")},oe=()=>{V&&W.trim()&&parseFloat(ee)>0&&(i(V.id,{name:W.trim(),default_interval_hours:parseFloat(ee),interval_type:B,icon:Q}),K(null))},xe=(Ie,z,H)=>{const re=parseFloat(d);if(!isNaN(re)&&re>0){const $=Math.abs(re-z)<.01?null:re;n(Ie,{custom_interval_hours:$,custom_interval_type:g!==H?g:null})}u(null)},Te=Ie=>{Ie.preventDefault(),y.trim()&&parseFloat(E)>0&&F.size>0&&(r({name:y.trim(),default_interval_hours:parseFloat(E),interval_type:T,icon:C},Array.from(F)),b(""),w("100"),A("hours"),k(new Set),v(!1))},me=Ie=>{k(z=>{const H=new Set(z);return H.has(Ie)?H.delete(Ie):H.add(Ie),H})},ce=t?.map(Ie=>({printerId:Ie.printer_id,printerName:Ie.printer_name,items:Ie.maintenance_items.sort((z,H)=>z.maintenance_type_id-H.maintenance_type_id)})).sort((Ie,z)=>Ie.printerName.localeCompare(z.printerName))||[],Ce=e.filter(Ie=>Ie.is_system),fe=e.filter(Ie=>!Ie.is_system);return o.jsxs("div",{className:"space-y-8",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex items-center justify-between mb-4",children:[o.jsxs("div",{children:[o.jsx("h2",{className:"text-lg font-semibold text-white",children:"Maintenance Types"}),o.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:"System types and your custom maintenance tasks"})]}),o.jsxs(ke,{onClick:()=>v(!x),children:[o.jsx(sr,{className:"w-4 h-4"}),"Add Custom Type"]})]}),x&&o.jsx(wt,{className:"mb-6",children:o.jsx(Et,{className:"py-4",children:o.jsxs("form",{onSubmit:Te,children:[o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[o.jsxs("div",{className:"lg:col-span-2",children:[o.jsx("label",{className:"block text-xs text-bambu-gray mb-1.5",children:"Name"}),o.jsx("input",{type:"text",value:y,onChange:Ie=>b(Ie.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",placeholder:"e.g., Replace HEPA Filter",autoFocus:!0})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-xs text-bambu-gray mb-1.5",children:"Interval Type"}),o.jsxs("select",{value:T,onChange:Ie=>{A(Ie.target.value),Ie.target.value==="days"?w("30"):w("100")},className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"hours",children:"Print Hours"}),o.jsx("option",{value:"days",children:"Calendar Days"})]})]}),o.jsxs("div",{children:[o.jsxs("label",{className:"block text-xs text-bambu-gray mb-1.5",children:["Interval (",T==="days"?"days":"hours",")"]}),o.jsx("input",{type:"number",value:E,onChange:Ie=>w(Ie.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",min:"1"})]})]}),o.jsx("div",{className:"mt-4 flex items-end justify-between",children:o.jsxs("div",{children:[o.jsx("label",{className:"block text-xs text-bambu-gray mb-1.5",children:"Icon"}),o.jsx("div",{className:"flex gap-1",children:Object.keys(t0).map(Ie=>{const z=t0[Ie];return o.jsx("button",{type:"button",onClick:()=>N(Ie),className:`p-2 rounded-lg transition-colors ${C===Ie?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary"}`,children:o.jsx(z,{className:"w-4 h-4"})},Ie)})})]})}),o.jsxs("div",{className:"mt-4",children:[o.jsx("label",{className:"block text-xs text-bambu-gray mb-1.5",children:"Assign to Printers"}),o.jsx("div",{className:"flex flex-wrap gap-2",children:L.map(Ie=>o.jsx("button",{type:"button",onClick:()=>me(Ie.id),className:`px-3 py-1.5 rounded-lg text-sm transition-colors ${F.has(Ie.id)?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary"}`,children:Ie.name},Ie.id))}),F.size===0&&o.jsx("p",{className:"text-xs text-orange-400 mt-1",children:"Select at least one printer"})]}),o.jsxs("div",{className:"mt-4 flex justify-end gap-2",children:[o.jsx(ke,{type:"button",variant:"secondary",onClick:()=>{v(!1),k(new Set)},children:"Cancel"}),o.jsx(ke,{type:"submit",disabled:!y.trim()||F.size===0,children:"Add Type"})]})]})})}),o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3",children:[Ce.map(Ie=>{const z=M0(Ie.icon),H=Ie.interval_type||"hours";return o.jsx("div",{className:"bg-bambu-dark-secondary rounded-xl p-4 border border-bambu-dark-tertiary",children:o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"p-2.5 bg-bambu-dark rounded-lg",children:o.jsx(z,{className:"w-5 h-5 text-bambu-gray"})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("div",{className:"text-sm font-medium text-white truncate",children:Ie.name}),o.jsxs("div",{className:"text-xs text-bambu-gray mt-0.5 flex items-center gap-1",children:[H==="days"?o.jsx(Qr,{className:"w-3 h-3"}):o.jsx(Zu,{className:"w-3 h-3"}),Pk(Ie.default_interval_hours,H)]})]})]})},Ie.id)}),fe.map(Ie=>{const z=M0(Ie.icon),H=Ie.interval_type||"hours";if(V?.id===Ie.id)return o.jsx("div",{className:"bg-bambu-dark-secondary rounded-xl p-4 border border-bambu-green",children:o.jsxs("div",{className:"space-y-3",children:[o.jsx("input",{type:"text",value:W,onChange:ue=>J(ue.target.value),className:"w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",placeholder:"Name",autoFocus:!0}),o.jsxs("div",{className:"flex gap-2",children:[o.jsxs("select",{value:B,onChange:ue=>G(ue.target.value),className:"flex-1 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",children:[o.jsx("option",{value:"hours",children:"Print Hours"}),o.jsx("option",{value:"days",children:"Calendar Days"})]}),o.jsx("input",{type:"number",value:ee,onChange:ue=>Z(ue.target.value),className:"w-24 px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white text-sm focus:border-bambu-green focus:outline-none",min:"1"})]}),o.jsx("div",{className:"flex flex-wrap gap-1",children:Object.keys(t0).map(ue=>{const Ee=t0[ue];return o.jsx("button",{type:"button",onClick:()=>te(ue),className:`p-1.5 rounded transition-colors ${Q===ue?"bg-bambu-green text-white":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:o.jsx(Ee,{className:"w-3.5 h-3.5"})},ue)})}),o.jsxs("div",{className:"flex gap-2",children:[o.jsx(ke,{size:"sm",onClick:oe,disabled:!W.trim(),children:"Save"}),o.jsx(ke,{size:"sm",variant:"secondary",onClick:()=>K(null),children:"Cancel"})]})]})},Ie.id);const $=q(Ie.id),Y=j(Ie.id),se=R===Ie.id;return o.jsxs("div",{className:"bg-bambu-dark-secondary rounded-xl p-4 border border-bambu-green/30",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"p-2.5 bg-bambu-green/20 rounded-lg",children:o.jsx(z,{className:"w-5 h-5 text-bambu-green"})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("span",{className:"text-sm font-medium text-white truncate",children:Ie.name}),o.jsx("span",{className:"px-1.5 py-0.5 bg-bambu-green/20 text-bambu-green text-[10px] font-medium rounded",children:"Custom"})]}),o.jsxs("div",{className:"text-xs text-bambu-gray mt-0.5 flex items-center gap-1",children:[H==="days"?o.jsx(Qr,{className:"w-3 h-3"}):o.jsx(Zu,{className:"w-3 h-3"}),Pk(Ie.default_interval_hours,H)]})]}),o.jsxs("button",{onClick:()=>I(se?null:Ie.id),className:`px-2 py-1 rounded-lg border transition-colors flex items-center gap-1 ${$.length>0?"border-bambu-green/50 bg-bambu-green/10 text-bambu-green hover:bg-bambu-green/20":"border-orange-400/50 bg-orange-400/10 text-orange-400 hover:bg-orange-400/20"}`,title:`${$.length} printer(s) assigned - click to manage`,children:[o.jsx(Vi,{className:"w-3 h-3"}),o.jsx("span",{className:"text-xs font-medium",children:$.length}),o.jsx(Cl,{className:`w-3 h-3 transition-transform ${se?"rotate-180":""}`})]}),o.jsx("button",{onClick:()=>he(Ie),className:"p-2 rounded-lg hover:bg-bambu-dark text-bambu-gray hover:text-white transition-colors",children:o.jsx(Qh,{className:"w-4 h-4"})}),o.jsx("button",{onClick:()=>{confirm(`Delete "${Ie.name}"?`)&&a(Ie.id)},className:"p-2 rounded-lg hover:bg-bambu-dark text-bambu-gray hover:text-red-400 transition-colors",children:o.jsx(En,{className:"w-4 h-4"})})]}),se&&o.jsxs("div",{className:"mt-3 pt-3 border-t border-bambu-dark-tertiary",children:[o.jsx("p",{className:"text-xs text-bambu-gray mb-2",children:"Assigned to printers:"}),$.length===0?o.jsx("p",{className:"text-xs text-orange-400",children:"No printers assigned"}):o.jsx("div",{className:"flex flex-wrap gap-1 mb-2",children:$.map(ue=>o.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 bg-bambu-dark rounded text-xs text-white",children:[ue.printerName,o.jsx("button",{onClick:()=>ue.itemId&&l(ue.itemId),className:"hover:text-red-400 ml-1",title:"Remove from this printer",children:"×"})]},ue.printerId))}),Y.length>0&&o.jsxs("div",{className:"flex flex-wrap gap-1",children:[o.jsx("span",{className:"text-xs text-bambu-gray mr-1",children:"Add:"}),Y.map(ue=>o.jsxs("button",{onClick:()=>s(ue.id,Ie.id),className:"px-2 py-1 bg-bambu-dark hover:bg-bambu-green/20 rounded text-xs text-bambu-gray hover:text-bambu-green transition-colors",children:["+ ",ue.name]},ue.id))]})]})]},Ie.id)})]})]}),ce.length>0&&o.jsxs("div",{children:[o.jsxs("div",{className:"mb-4",children:[o.jsx("h2",{className:"text-lg font-semibold text-white",children:"Interval Overrides"}),o.jsx("p",{className:"text-sm text-bambu-gray mt-1",children:"Customize intervals for specific printers"})]}),o.jsx("div",{className:"space-y-4",children:ce.map(Ie=>o.jsx(wt,{children:o.jsxs(Et,{className:"py-4",children:[o.jsx("h3",{className:"text-sm font-medium text-white mb-3",children:Ie.printerName}),o.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2",children:Ie.items.map(z=>{const H=M0(z.maintenance_type_icon),re=e.find(Ee=>Ee.id===z.maintenance_type_id),$=re?.default_interval_hours||z.interval_hours,Y=re?.interval_type||"hours",se=z.interval_type||"hours",ue=c===z.id;return o.jsxs("div",{className:"flex items-center gap-2 p-2.5 bg-bambu-dark rounded-lg",children:[o.jsx(H,{className:"w-4 h-4 text-bambu-gray shrink-0"}),o.jsx("span",{className:"text-xs text-bambu-gray flex-1 truncate",children:z.maintenance_type_name}),ue?o.jsxs("div",{className:"flex items-center gap-1",children:[g==="days"?o.jsx(Qr,{className:"w-3.5 h-3.5 text-bambu-gray shrink-0"}):o.jsx(Zu,{className:"w-3.5 h-3.5 text-bambu-gray shrink-0"}),o.jsxs("select",{value:g,onChange:Ee=>p(Ee.target.value),className:"px-1.5 py-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-xs",children:[o.jsx("option",{value:"hours",children:"Print Hours"}),o.jsx("option",{value:"days",children:"Calendar Days"})]}),o.jsx("input",{type:"number",value:d,onChange:Ee=>f(Ee.target.value),onKeyDown:Ee=>{Ee.key==="Enter"&&xe(z.id,$,Y),Ee.key==="Escape"&&u(null)},className:"w-16 px-2 py-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded text-white text-xs",min:"1"}),o.jsx(ke,{size:"sm",onClick:()=>xe(z.id,$,Y),children:"OK"})]}):o.jsxs("button",{onClick:()=>{u(z.id),f(z.interval_hours.toString()),p(se)},className:"px-2 py-1 bg-bambu-dark-tertiary hover:bg-bambu-dark-secondary border border-bambu-dark-tertiary hover:border-bambu-green rounded text-xs font-medium text-white transition-colors flex items-center gap-1",children:[se==="days"?o.jsx(Qr,{className:"w-3 h-3"}):o.jsx(Zu,{className:"w-3 h-3"}),Pk(z.interval_hours,se),o.jsx(Qh,{className:"w-3 h-3 text-bambu-gray"})]})]},z.id)})})]})},Ie.printerId))})]}),ce.length===0&&o.jsx(wt,{children:o.jsxs(Et,{className:"text-center py-12",children:[o.jsx(rr,{className:"w-12 h-12 mx-auto mb-4 text-bambu-gray/30"}),o.jsx("p",{className:"text-bambu-gray",children:"No printers configured"}),o.jsx("p",{className:"text-sm text-bambu-gray/70 mt-1",children:"Add printers to configure maintenance intervals"})]})})]})}function mWe(){const t=mn(),{showToast:e}=Sr(),[n,r]=M.useState("status"),{data:i,isLoading:a}=gt({queryKey:["maintenanceOverview"],queryFn:Se.getMaintenanceOverview}),{data:s}=gt({queryKey:["maintenanceTypes"],queryFn:Se.getMaintenanceTypes}),l=vt({mutationFn:({id:w,notes:T})=>Se.performMaintenance(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]}),t.invalidateQueries({queryKey:["maintenanceSummary"]}),e("Maintenance marked as complete")},onError:w=>{e(w.message,"error")}}),c=vt({mutationFn:({id:w,data:T})=>Se.updateMaintenanceItem(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]})},onError:w=>{e(w.message,"error")}}),u=vt({mutationFn:({id:w,data:T})=>Se.updateMaintenanceType(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceTypes"]}),t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Maintenance type updated")},onError:w=>{e(w.message,"error")}}),d=vt({mutationFn:Se.deleteMaintenanceType,onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceTypes"]}),t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Maintenance type deleted")},onError:w=>{e(w.message,"error")}}),f=vt({mutationFn:({printerId:w,hours:T})=>Se.setPrinterHours(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]}),t.invalidateQueries({queryKey:["maintenanceSummary"]}),e("Print hours updated")},onError:w=>{e(w.message,"error")}}),g=vt({mutationFn:({printerId:w,typeId:T})=>Se.assignMaintenanceType(w,T),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Printer assigned")},onError:w=>{e(w.message,"error")}}),p=vt({mutationFn:Se.removeMaintenanceItem,onSuccess:()=>{t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Printer removed")},onError:w=>{e(w.message,"error")}}),x=w=>{l.mutate({id:w})},v=(w,T)=>{c.mutate({id:w,data:{enabled:T}})},y=(w,T)=>{f.mutate({printerId:w,hours:T})};if(a)return o.jsx("div",{className:"p-4 md:p-8 flex justify-center",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})});const b=i?.reduce((w,T)=>w+T.due_count,0)||0,E=i?.reduce((w,T)=>w+T.warning_count,0)||0;return o.jsxs("div",{className:"p-4 md:p-8",children:[o.jsxs("div",{className:"mb-6",children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:"Maintenance"}),o.jsx("p",{className:"text-bambu-gray text-sm mt-1",children:n==="status"?o.jsxs(o.Fragment,{children:[b>0&&o.jsxs("span",{className:"text-red-400",children:[b," task",b!==1?"s":""," overdue"]}),b>0&&E>0&&" · ",E>0&&o.jsxs("span",{className:"text-amber-400",children:[E," due soon"]}),b===0&&E===0&&o.jsx("span",{className:"text-bambu-green",children:"All maintenance up to date"})]}):"Configure maintenance types and intervals"})]}),o.jsxs("div",{className:"flex gap-1 mb-6 border-b border-bambu-dark-tertiary",children:[o.jsx("button",{onClick:()=>r("status"),className:`px-4 py-2 text-sm font-medium border-b-2 -mb-px transition-colors ${n==="status"?"text-bambu-green border-bambu-green":"text-bambu-gray border-transparent hover:text-white"}`,children:"Status"}),o.jsx("button",{onClick:()=>r("settings"),className:`px-4 py-2 text-sm font-medium border-b-2 -mb-px transition-colors ${n==="settings"?"text-bambu-green border-bambu-green":"text-bambu-gray border-transparent hover:text-white"}`,children:"Settings"})]}),n==="status"?o.jsx("div",{className:"space-y-6",children:i&&i.length>0?[...i].sort((w,T)=>{const A=w.due_count*10+w.warning_count,C=T.due_count*10+T.warning_count;return A!==C?C-A:w.printer_name.localeCompare(T.printer_name)}).map(w=>o.jsx(hWe,{overview:w,onPerform:x,onToggle:v,onSetHours:y},w.printer_id)):o.jsx(wt,{children:o.jsxs(Et,{className:"text-center py-16",children:[o.jsx(gd,{className:"w-16 h-16 mx-auto mb-4 text-bambu-gray/30"}),o.jsx("p",{className:"text-lg font-medium text-white mb-2",children:"No printers configured"}),o.jsx("p",{className:"text-bambu-gray",children:"Add printers to start tracking maintenance"})]})})}):o.jsx(fWe,{overview:i,types:s||[],onUpdateInterval:(w,T)=>c.mutate({id:w,data:T}),onAddType:async(w,T)=>{const A=await Se.createMaintenanceType(w);for(const C of T)await Se.assignMaintenanceType(C,A.id);t.invalidateQueries({queryKey:["maintenanceTypes"]}),t.invalidateQueries({queryKey:["maintenanceOverview"]}),e("Maintenance type added")},onUpdateType:(w,T)=>u.mutate({id:w,data:T}),onDeleteType:w=>d.mutate(w),onAssignType:(w,T)=>g.mutate({printerId:w,typeId:T}),onRemoveItem:w=>p.mutate(w)})]})}const q9=["#ef4444","#f97316","#eab308","#22c55e","#06b6d4","#3b82f6","#8b5cf6","#ec4899","#6b7280"];function Wte({project:t,onClose:e,onSave:n,isLoading:r}){const[i,a]=M.useState(t?.name||""),[s,l]=M.useState(t?.description||""),[c,u]=M.useState(t?.color||q9[0]),[d,f]=M.useState(t?.target_count?.toString()||""),[g,p]=M.useState(t?.status||"active"),[x,v]=M.useState(t?.tags||""),[y,b]=M.useState(t?.due_date?.split("T")[0]||""),[E,w]=M.useState(t?.priority||"normal"),T=A=>{A.preventDefault(),n({name:i.trim(),description:s.trim()||void 0,color:c,target_count:d?parseInt(d,10):void 0,tags:x.trim()||void 0,due_date:y||void 0,priority:E,...t&&{status:g}})};return o.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:o.jsxs("div",{className:"bg-bambu-dark-secondary rounded-lg w-full max-w-md border border-bambu-dark-tertiary",children:[o.jsx("div",{className:"p-4 border-b border-bambu-dark-tertiary",children:o.jsx("h2",{className:"text-lg font-semibold text-white",children:t?"Edit Project":"New Project"})}),o.jsxs("form",{onSubmit:T,className:"p-4 space-y-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Name"}),o.jsx("input",{type:"text",value:i,onChange:A=>a(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"e.g., Voron 2.4 Build",required:!0})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Description"}),o.jsx("textarea",{value:s,onChange:A=>l(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green resize-none",placeholder:"Optional description...",rows:2})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Color"}),o.jsx("div",{className:"flex gap-2 flex-wrap",children:q9.map(A=>o.jsx("button",{type:"button",onClick:()=>u(A),className:`w-8 h-8 rounded-full transition-transform ${c===A?"ring-2 ring-white ring-offset-2 ring-offset-bambu-dark-secondary scale-110":""}`,style:{backgroundColor:A}},A))})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Target Print Count (optional)"}),o.jsx("input",{type:"number",value:d,onChange:A=>f(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"e.g., 50 parts to print",min:"1"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Tags (comma-separated)"}),o.jsx("input",{type:"text",value:x,onChange:A=>v(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"e.g., voron, functional, gift"})]}),o.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Due Date"}),o.jsx("input",{type:"date",value:y,onChange:A=>b(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white focus:outline-none focus:border-bambu-green"})]}),o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Priority"}),o.jsxs("select",{value:E,onChange:A=>w(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white focus:outline-none focus:border-bambu-green",children:[o.jsx("option",{value:"low",children:"Low"}),o.jsx("option",{value:"normal",children:"Normal"}),o.jsx("option",{value:"high",children:"High"}),o.jsx("option",{value:"urgent",children:"Urgent"})]})]})]}),t&&o.jsxs("div",{children:[o.jsx("label",{className:"block text-sm font-medium text-white mb-1",children:"Status"}),o.jsxs("select",{value:g,onChange:A=>p(A.target.value),className:"w-full bg-bambu-dark border border-bambu-dark-tertiary rounded px-3 py-2 text-white focus:outline-none focus:border-bambu-green",children:[o.jsx("option",{value:"active",children:"Active"}),o.jsx("option",{value:"completed",children:"Completed"}),o.jsx("option",{value:"archived",children:"Archived"})]})]}),o.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[o.jsx(ke,{type:"button",variant:"secondary",onClick:e,children:"Cancel"}),o.jsx(ke,{type:"submit",disabled:!i.trim()||r,children:r?o.jsx(xt,{className:"w-4 h-4 animate-spin"}):t?"Save":"Create"})]})]})]})})}function pWe({project:t,onClick:e,onEdit:n,onDelete:r}){const i=t.progress_percent??0,a=t.status==="completed",s=t.status==="archived",[l,c]=M.useState(!1),d=a?{icon:sR,color:"text-bambu-green",bg:"bg-bambu-green/10"}:s?{icon:oo,color:"text-bambu-gray",bg:"bg-bambu-gray/10"}:t.queue_count>0?{icon:rr,color:"text-blue-400",bg:"bg-blue-400/10"}:{icon:Uo,color:"text-bambu-gray",bg:"bg-bambu-gray/10"};return o.jsxs("div",{className:"group relative bg-gradient-to-br from-bambu-card to-bambu-dark-secondary rounded-xl border border-bambu-dark-tertiary hover:border-bambu-green/50 hover:shadow-lg hover:shadow-bambu-green/5 transition-all duration-300 cursor-pointer overflow-hidden",onClick:e,children:[o.jsx("div",{className:"absolute top-0 left-0 w-1.5 h-full",style:{backgroundColor:t.color||"#6b7280",boxShadow:`0 0 12px ${t.color||"#6b7280"}40`}}),o.jsxs("div",{className:"p-5 pl-6",children:[o.jsxs("div",{className:"flex items-start justify-between mb-4",children:[o.jsxs("div",{className:"flex items-center gap-3 min-w-0 flex-1",children:[o.jsx("div",{className:`p-2 rounded-lg ${d.bg} flex-shrink-0`,children:o.jsx(d.icon,{className:`w-5 h-5 ${d.color}`})}),o.jsxs("div",{className:"min-w-0 flex-1",children:[o.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[o.jsx("h3",{className:"font-semibold text-white truncate",children:t.name}),t.target_count?o.jsxs("span",{className:`text-xs px-2 py-0.5 rounded-full whitespace-nowrap font-medium ${i>=100?"bg-bambu-green/20 text-bambu-green":"bg-bambu-dark text-bambu-gray"}`,children:[t.archive_count,"/",t.target_count," parts"]}):t.archive_count>0?o.jsxs("span",{className:"text-xs px-2 py-0.5 rounded-full whitespace-nowrap font-medium bg-bambu-dark text-bambu-gray",children:[t.archive_count," print",t.archive_count!==1?"s":""]}):null,a&&o.jsx("span",{className:"text-xs bg-bambu-green/20 text-bambu-green px-2 py-0.5 rounded-full whitespace-nowrap",children:"Done"}),s&&o.jsx("span",{className:"text-xs bg-bambu-gray/20 text-bambu-gray px-2 py-0.5 rounded-full whitespace-nowrap",children:"Archived"})]}),t.description&&o.jsx("p",{className:"text-sm text-bambu-gray/70 mt-1 line-clamp-1",children:t.description}),t.archives&&t.archives.length>0&&(()=>{const f=[...new Set(t.archives.map(p=>p.filament_type).filter(Boolean))],g=[...new Set(t.archives.map(p=>p.filament_color).filter(Boolean))];return f.length===0&&g.length===0?null:o.jsxs("div",{className:"flex items-center gap-2 mt-1.5",children:[f.slice(0,3).map(p=>o.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-bambu-dark text-bambu-gray rounded",children:p},p)),g.length>0&&o.jsxs("div",{className:"flex items-center gap-0.5",children:[g.slice(0,5).map(p=>o.jsx("div",{className:"w-3 h-3 rounded-full border border-white/20",style:{backgroundColor:p.startsWith("#")?p:`#${p}`},title:p},p)),g.length>5&&o.jsxs("span",{className:"text-[10px] text-bambu-gray ml-0.5",children:["+",g.length-5]})]})]})})()]})]}),o.jsxs("div",{className:"relative",onClick:f=>f.stopPropagation(),children:[o.jsx("button",{className:"p-1.5 rounded-lg hover:bg-bambu-dark text-bambu-gray hover:text-white transition-colors opacity-0 group-hover:opacity-100",onClick:()=>c(!l),children:o.jsx(cR,{className:"w-4 h-4"})}),l&&o.jsxs(o.Fragment,{children:[o.jsx("div",{className:"fixed inset-0 z-10",onClick:()=>c(!1)}),o.jsxs("div",{className:"absolute right-0 top-8 z-20 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-xl py-1 min-w-[120px]",children:[o.jsxs("button",{className:"w-full px-3 py-2 text-left text-sm text-white hover:bg-bambu-dark flex items-center gap-2",onClick:()=>{n(),c(!1)},children:[o.jsx(Qh,{className:"w-4 h-4"}),"Edit"]}),o.jsxs("button",{className:"w-full px-3 py-2 text-left text-sm text-red-400 hover:bg-bambu-dark flex items-center gap-2",onClick:()=>{r(),c(!1)},children:[o.jsx(En,{className:"w-4 h-4"}),"Delete"]})]})]})]})]}),o.jsx("div",{className:"mb-4",children:t.target_count?o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"flex items-center justify-between text-xs mb-2",children:[o.jsx("span",{className:"text-bambu-gray",children:"Progress"}),o.jsxs("span",{className:i>=100?"text-bambu-green font-medium":"text-white",children:[t.archive_count," / ",t.target_count]})]}),o.jsx("div",{className:"h-2.5 bg-bambu-dark/80 rounded-full overflow-hidden backdrop-blur-sm",children:o.jsx("div",{className:"h-full transition-all duration-500 ease-out rounded-full relative",style:{width:`${Math.min(i,100)}%`,background:i>=100?"linear-gradient(90deg, #22c55e, #4ade80)":`linear-gradient(90deg, ${t.color||"#6b7280"}, ${t.color||"#6b7280"}cc)`,boxShadow:`0 0 8px ${i>=100?"#22c55e":t.color||"#6b7280"}60`}})}),o.jsxs("div",{className:"text-right text-xs text-bambu-gray/60 mt-1",children:[i.toFixed(0),"% complete"]})]}):t.archive_count>0?o.jsxs("div",{className:"flex items-center gap-4 text-xs",children:[o.jsxs("div",{className:"flex items-center gap-1.5 text-bambu-gray",children:[o.jsx(oo,{className:"w-3.5 h-3.5"}),o.jsxs("span",{children:[t.archive_count," print",t.archive_count!==1?"s":""," completed"]})]}),t.queue_count>0&&o.jsxs("div",{className:"flex items-center gap-1.5 text-blue-400",children:[o.jsx(rr,{className:"w-3.5 h-3.5"}),o.jsxs("span",{children:[t.queue_count," in queue"]})]})]}):o.jsx("div",{className:"text-xs text-bambu-gray/60 italic",children:"No prints yet"})}),t.archives&&t.archives.length>0&&o.jsxs("div",{className:"mb-4",children:[o.jsx("div",{className:"grid grid-cols-4 gap-1.5",children:t.archives.slice(0,4).map(f=>o.jsxs("div",{className:"relative aspect-square rounded-lg bg-bambu-dark overflow-hidden border border-bambu-dark-tertiary",title:f.print_name||"Unknown",children:[f.thumbnail_path?o.jsx("img",{src:Se.getArchiveThumbnail(f.id),alt:f.print_name||"",className:"w-full h-full object-cover"}):o.jsx("div",{className:"w-full h-full flex items-center justify-center text-bambu-gray/50",children:o.jsx(Fc,{className:"w-6 h-6"})}),f.status==="failed"&&o.jsx("div",{className:"absolute inset-0 bg-red-500/40 flex items-center justify-center",children:o.jsx(Gn,{className:"w-4 h-4 text-white"})})]},f.id))}),t.archive_count>4&&o.jsxs("p",{className:"text-xs text-bambu-gray mt-1.5 text-center",children:["+",t.archive_count-4," more"]})]}),o.jsxs("div",{className:"flex items-center justify-between pt-3 border-t border-bambu-dark-tertiary",children:[o.jsxs("div",{className:"flex items-center gap-4 text-xs text-bambu-gray",children:[o.jsxs("div",{className:"flex items-center gap-1.5",title:"Completed prints",children:[o.jsx(oo,{className:"w-3.5 h-3.5"}),o.jsx("span",{children:t.archive_count})]}),t.queue_count>0&&o.jsxs("div",{className:"flex items-center gap-1.5 text-blue-400",title:"In queue",children:[o.jsx(Zk,{className:"w-3.5 h-3.5"}),o.jsx("span",{children:t.queue_count})]})]}),o.jsx(Xc,{className:"w-4 h-4 text-bambu-gray/50 group-hover:text-bambu-gray transition-colors"})]})]})]})}function gWe(){const t=wb(),e=mn(),{showToast:n}=Sr(),[r,i]=M.useState(!1),[a,s]=M.useState(),[l,c]=M.useState("active"),[u,d]=M.useState(null),{data:f,isLoading:g}=gt({queryKey:["projects",l==="all"?void 0:l],queryFn:()=>Se.getProjects(l==="all"?void 0:l)}),p=vt({mutationFn:C=>Se.createProject(C),onSuccess:()=>{e.invalidateQueries({queryKey:["projects"]}),i(!1),n("Project created","success")},onError:C=>{n(C.message,"error")}}),x=vt({mutationFn:({id:C,data:N})=>Se.updateProject(C,N),onSuccess:()=>{e.invalidateQueries({queryKey:["projects"]}),i(!1),s(void 0),n("Project updated","success")},onError:C=>{n(C.message,"error")}}),v=vt({mutationFn:C=>Se.deleteProject(C),onSuccess:()=>{e.invalidateQueries({queryKey:["projects"]}),d(null),n("Project deleted","success")},onError:C=>{n(C.message,"error")}}),y=C=>{a?x.mutate({id:a.id,data:C}):p.mutate(C)},b=C=>{s(C),i(!0)},E=C=>{t(`/projects/${C.id}`)},w=C=>{d(C)},T=()=>{u!==null&&v.mutate(u)},A=f?.reduce((C,N)=>(C[N.status]=(C[N.status]||0)+1,C.all=(C.all||0)+1,C),{})||{};return o.jsxs("div",{className:"p-4 md:p-8 space-y-8",children:[o.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-4",children:[o.jsxs("div",{children:[o.jsxs("h1",{className:"text-2xl font-bold text-white flex items-center gap-3",children:[o.jsx("div",{className:"p-2.5 bg-bambu-green/10 rounded-xl",children:o.jsx(Uo,{className:"w-6 h-6 text-bambu-green"})}),"Projects"]}),o.jsx("p",{className:"text-sm text-bambu-gray mt-2 ml-14",children:"Organize and track your 3D printing projects"})]}),o.jsxs(ke,{onClick:()=>i(!0),className:"sm:w-auto w-full",children:[o.jsx(sr,{className:"w-4 h-4 mr-2"}),"New Project"]})]}),o.jsx("div",{className:"flex gap-1 p-1 bg-bambu-dark rounded-xl w-fit",children:[{key:"active",label:"Active",icon:rr},{key:"completed",label:"Completed",icon:sR},{key:"archived",label:"Archived",icon:oo},{key:"all",label:"All",icon:Uo}].map(({key:C,label:N,icon:F})=>o.jsxs("button",{onClick:()=>c(C),className:`flex items-center gap-2 px-4 py-2 text-sm rounded-lg transition-all ${l===C?"bg-bambu-card text-white shadow-sm":"text-bambu-gray hover:text-white"}`,children:[o.jsx(F,{className:"w-4 h-4"}),o.jsx("span",{children:N}),A[C]>0&&o.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded-full ${l===C?"bg-bambu-green/20 text-bambu-green":"bg-bambu-dark-tertiary"}`,children:A[C]})]},C))}),g?o.jsx("div",{className:"flex items-center justify-center py-20",children:o.jsxs("div",{className:"flex flex-col items-center gap-3",children:[o.jsx(xt,{className:"w-8 h-8 animate-spin text-bambu-green"}),o.jsx("p",{className:"text-sm text-bambu-gray",children:"Loading projects..."})]})}):f?.length===0?o.jsxs("div",{className:"flex flex-col items-center justify-center py-20 px-4",children:[o.jsx("div",{className:"p-4 bg-bambu-dark rounded-2xl mb-4",children:o.jsx(Uo,{className:"w-12 h-12 text-bambu-gray/50"})}),o.jsx("h3",{className:"text-lg font-medium text-white mb-2",children:l==="all"?"No projects yet":`No ${l} projects`}),o.jsx("p",{className:"text-bambu-gray text-center max-w-md mb-6",children:l==="all"?"Create your first project to start organizing related prints, tracking progress, and managing your builds.":`You don't have any ${l} projects. Projects will appear here when their status changes.`}),l==="all"&&o.jsxs(ke,{onClick:()=>i(!0),children:[o.jsx(sr,{className:"w-4 h-4 mr-2"}),"Create Your First Project"]})]}):o.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-8",children:f?.map(C=>o.jsx(pWe,{project:C,onClick:()=>E(C),onEdit:()=>b(C),onDelete:()=>w(C.id)},C.id))}),u!==null&&o.jsx(kr,{title:"Delete Project",message:"Are you sure you want to delete this project? Archives and queue items will be unlinked but not deleted.",confirmText:"Delete Project",variant:"danger",onConfirm:T,onCancel:()=>d(null)}),r&&o.jsx(Wte,{project:a,onClose:()=>{i(!1),s(void 0)},onSave:y,isLoading:p.isPending||x.isPending})]})}function xWe(t){if(t<1)return`${Math.round(t*60)}m`;const e=Math.floor(t),n=Math.round((t-e)*60);return n>0?`${e}h ${n}m`:`${e}h`}function bWe(t){return t>=1e3?`${(t/1e3).toFixed(2)}kg`:`${Math.round(t)}g`}function yWe({status:t}){const e={active:"bg-bambu-green/20 text-bambu-green",completed:"bg-blue-500/20 text-blue-400",archived:"bg-bambu-gray/20 text-bambu-gray"},n=e[t]||e.active;return o.jsx("span",{className:`px-2 py-1 rounded text-sm font-medium ${n}`,children:t.charAt(0).toUpperCase()+t.slice(1)})}function o1({icon:t,label:e,value:n,subValue:r,color:i="text-bambu-gray"}){return o.jsx(wt,{children:o.jsx(Et,{className:"p-4",children:o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:`p-2 rounded-lg bg-bambu-dark ${i}`,children:o.jsx(t,{className:"w-5 h-5"})}),o.jsxs("div",{children:[o.jsx("p",{className:"text-sm text-bambu-gray",children:e}),o.jsx("p",{className:"text-xl font-semibold text-white",children:n}),r&&o.jsx("p",{className:"text-xs text-bambu-gray/70",children:r})]})]})})})}function vWe({archives:t}){return t.length===0?o.jsxs("div",{className:"text-center py-8 text-bambu-gray",children:[o.jsx(Fc,{className:"w-12 h-12 mx-auto mb-2 opacity-50"}),o.jsx("p",{children:"No prints in this project yet"})]}):o.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 gap-3",children:t.map(e=>o.jsxs(_c,{to:`/archives?search=${encodeURIComponent(e.print_name||"")}`,className:"group relative aspect-square rounded-lg bg-bambu-dark border border-bambu-dark-tertiary overflow-hidden hover:border-bambu-green transition-colors",children:[e.thumbnail_path?o.jsx("img",{src:Se.getArchiveThumbnail(e.id),alt:e.print_name||"Print",className:"w-full h-full object-cover"}):o.jsx("div",{className:"w-full h-full flex items-center justify-center text-bambu-gray",children:o.jsx(Fc,{className:"w-8 h-8"})}),e.status==="failed"&&o.jsx("div",{className:"absolute inset-0 bg-red-500/30 flex items-center justify-center",children:o.jsx(Pa,{className:"w-8 h-8 text-white"})}),e.status==="completed"&&o.jsx("div",{className:"absolute top-1 right-1",children:o.jsx(Cr,{className:"w-4 h-4 text-bambu-green"})}),o.jsx("div",{className:"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 to-transparent p-2 opacity-0 group-hover:opacity-100 transition-opacity",children:o.jsx("p",{className:"text-xs text-white truncate",children:e.print_name||"Unknown"})})]},e.id))})}function _We({priority:t}){const e={low:{color:"bg-gray-500/20 text-gray-400",label:"Low"},normal:{color:"bg-blue-500/20 text-blue-400",label:"Normal"},high:{color:"bg-orange-500/20 text-orange-400",label:"High"},urgent:{color:"bg-red-500/20 text-red-400",label:"Urgent"}},{color:n,label:r}=e[t]||e.normal;return o.jsxs("span",{className:`px-2 py-1 rounded text-xs font-medium flex items-center gap-1 ${n}`,children:[t==="urgent"&&o.jsx(Gn,{className:"w-3 h-3"}),r]})}function wWe(t){return t?new Date(t).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"}):""}function jk(t){if(!t)return null;const e=new Date(t),n=new Date,r=Math.ceil((e.getTime()-n.getTime())/(1e3*60*60*24));return r<0?{color:"text-red-400",label:"Overdue"}:r===0?{color:"text-orange-400",label:"Due today"}:r<=3?{color:"text-yellow-400",label:`${r} days left`}:{color:"text-bambu-gray",label:`${r} days left`}}function SWe(){const{id:t}=Zj(),e=wb(),n=mn(),{showToast:r}=Sr(),[i,a]=M.useState(!1),[s,l]=M.useState(!1),[c,u]=M.useState(""),[d,f]=M.useState(!1),g=M.useRef(null),p=parseInt(t||"0",10),{data:x,isLoading:v,error:y}=gt({queryKey:["project",p],queryFn:()=>Se.getProject(p),enabled:p>0}),{data:b,isLoading:E}=gt({queryKey:["project-archives",p],queryFn:()=>Se.getProjectArchives(p),enabled:p>0}),{data:w,isLoading:T}=gt({queryKey:["project-bom",p],queryFn:()=>Se.getProjectBOM(p),enabled:p>0}),{data:A,isLoading:C}=gt({queryKey:["project-timeline",p],queryFn:()=>Se.getProjectTimeline(p,20),enabled:p>0}),{data:N}=gt({queryKey:["settings"],queryFn:Se.getSettings}),F=N?.currency||"$",k=vt({mutationFn:U=>Se.updateProject(p,U),onSuccess:()=>{n.invalidateQueries({queryKey:["project",p]}),n.invalidateQueries({queryKey:["projects"]}),a(!1),l(!1),r("Project updated","success")},onError:U=>{r(U.message,"error")}}),R=()=>{u(x?.notes||""),l(!0)},I=()=>{k.mutate({notes:c})},L=()=>{l(!1),u("")},q=async U=>{const O=U.target.files?.[0];if(O){f(!0);try{const ne=await Se.uploadProjectAttachment(p,O);n.invalidateQueries({queryKey:["project",p]}),r(`Uploaded: ${ne.original_name}`,"success")}catch(ne){r(ne.message,"error")}finally{f(!1),g.current&&(g.current.value="")}}},j=(U,O)=>{Ce({isOpen:!0,title:"Delete Attachment",message:`Are you sure you want to delete "${O}"?`,onConfirm:async()=>{Ce(ne=>({...ne,isOpen:!1}));try{await Se.deleteProjectAttachment(p,U),n.invalidateQueries({queryKey:["project",p]}),r("Attachment deleted","success")}catch(ne){r(ne.message,"error")}}})},V=U=>U<1024?`${U} B`:U<1024*1024?`${(U/1024).toFixed(1)} KB`:`${(U/(1024*1024)).toFixed(1)} MB`,[K,W]=M.useState(""),[J,ee]=M.useState(1),[Z,B]=M.useState(""),[G,Q]=M.useState(""),[te,he]=M.useState(""),[oe,xe]=M.useState(!1),[Te,me]=M.useState(!1),[ce,Ce]=M.useState({isOpen:!1,title:"",message:"",onConfirm:()=>{}}),fe=vt({mutationFn:U=>Se.createBOMItem(p,U),onSuccess:()=>{n.invalidateQueries({queryKey:["project-bom",p]}),n.invalidateQueries({queryKey:["project",p]}),W(""),ee(1),B(""),Q(""),he(""),xe(!1),r("Part added","success")},onError:U=>r(U.message,"error")}),Ie=vt({mutationFn:({itemId:U,data:O})=>Se.updateBOMItem(p,U,O),onSuccess:()=>{n.invalidateQueries({queryKey:["project-bom",p]}),n.invalidateQueries({queryKey:["project",p]})},onError:U=>r(U.message,"error")}),z=vt({mutationFn:U=>Se.deleteBOMItem(p,U),onSuccess:()=>{n.invalidateQueries({queryKey:["project-bom",p]}),n.invalidateQueries({queryKey:["project",p]}),r("Part removed","success")},onError:U=>r(U.message,"error")}),H=U=>{U.preventDefault(),K.trim()&&fe.mutate({name:K.trim(),quantity_needed:J,unit_price:Z?parseFloat(Z):void 0,sourcing_url:G.trim()||void 0,remarks:te.trim()||void 0})},re=U=>{const O=U.is_complete?0:U.quantity_needed;Ie.mutate({itemId:U.id,data:{quantity_acquired:O}})},$=(U,O)=>{Ce({isOpen:!0,title:"Delete Part",message:`Are you sure you want to delete "${O}"?`,onConfirm:()=>{Ce(ne=>({...ne,isOpen:!1})),z.mutate(U)}})},Y=vt({mutationFn:()=>Se.createTemplateFromProject(p),onSuccess:()=>{n.invalidateQueries({queryKey:["projects"]}),r("Template created","success")},onError:U=>r(U.message,"error")}),se=U=>new Date(U).toLocaleDateString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"});if(v)return o.jsx("div",{className:"flex items-center justify-center py-24",children:o.jsx(xt,{className:"w-8 h-8 animate-spin text-bambu-green"})});if(y||!x)return o.jsxs("div",{className:"text-center py-24",children:[o.jsx("p",{className:"text-bambu-gray",children:y?`Error: ${y.message}`:"Project not found"}),o.jsx(ke,{variant:"secondary",className:"mt-4",onClick:()=>e("/projects"),children:"Back to Projects"})]});const ue=x.stats,Ee=ue?.progress_percent??0,Me=ue&&ue.total_archives>0?(ue.completed_prints/ue.total_archives*100).toFixed(0):null;return o.jsxs("div",{className:"p-4 md:p-8 space-y-8",children:[o.jsxs("div",{className:"flex items-center gap-2 text-sm text-bambu-gray",children:[o.jsx(_c,{to:"/projects",className:"hover:text-white transition-colors",children:"Projects"}),o.jsx(Xc,{className:"w-4 h-4"}),o.jsx("span",{className:"text-white",children:x.name})]}),o.jsxs("div",{className:"flex items-start justify-between",children:[o.jsxs("div",{className:"flex items-center gap-4",children:[o.jsx("button",{onClick:()=>e("/projects"),className:"p-2 rounded-lg bg-bambu-card hover:bg-bambu-dark-tertiary transition-colors",children:o.jsx(Eoe,{className:"w-5 h-5 text-bambu-gray"})}),o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-4 h-4 rounded-full flex-shrink-0",style:{backgroundColor:x.color||"#6b7280"}}),o.jsxs("div",{children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:x.name}),x.description&&o.jsx("p",{className:"text-bambu-gray mt-1",children:x.description})]})]}),o.jsx(yWe,{status:x.status})]}),o.jsxs(ke,{onClick:()=>a(!0),children:[o.jsx(Qh,{className:"w-4 h-4 mr-2"}),"Edit"]})]}),x.target_count&&o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-2",children:[o.jsx("span",{className:"text-sm text-bambu-gray",children:"Progress"}),o.jsxs("span",{className:"text-sm font-medium text-white",children:[ue?.completed_prints||0," / ",x.target_count," prints"]})]}),o.jsx("div",{className:"h-3 bg-bambu-dark rounded-full overflow-hidden",children:o.jsx("div",{className:"h-full transition-all duration-500",style:{width:`${Math.min(Ee,100)}%`,backgroundColor:Ee>=100?"#22c55e":x.color||"#6b7280"}})}),o.jsxs("div",{className:"flex justify-between mt-1",children:[o.jsxs("span",{className:"text-xs text-bambu-gray/70",children:[Ee.toFixed(0),"% complete"]}),x.target_count-(ue?.completed_prints||0)>0&&o.jsxs("span",{className:"text-xs text-bambu-gray/70",children:[x.target_count-(ue?.completed_prints||0)," remaining"]})]})]})}),ue&&o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[o.jsx(o1,{icon:Fc,label:"Total Prints",value:ue.total_archives,subValue:Me?`${Me}% success rate`:void 0,color:"text-bambu-green"}),o.jsx(o1,{icon:Cr,label:"Completed",value:ue.completed_prints,subValue:ue.failed_prints>0?`${ue.failed_prints} failed`:void 0,color:"text-blue-400"}),o.jsx(o1,{icon:rr,label:"Print Time",value:xWe(ue.total_print_time_hours),color:"text-yellow-400"}),o.jsx(o1,{icon:Vi,label:"Filament Used",value:bWe(ue.total_filament_grams),color:"text-purple-400"})]}),ue&&(ue.estimated_cost>0||x.budget)&&o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsx("h2",{className:"text-lg font-semibold text-white mb-3",children:"Cost Tracking"}),o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[o.jsxs("div",{children:[o.jsx("p",{className:"text-xs text-bambu-gray uppercase",children:"Filament Cost"}),o.jsxs("p",{className:"text-lg font-semibold text-white",children:[F,ue.estimated_cost.toFixed(2)]})]}),ue.total_energy_kwh>0&&o.jsxs("div",{children:[o.jsx("p",{className:"text-xs text-bambu-gray uppercase",children:"Energy"}),o.jsxs("p",{className:"text-lg font-semibold text-white",children:[ue.total_energy_kwh.toFixed(2)," kWh",ue.total_energy_cost>0&&o.jsxs("span",{className:"text-sm text-bambu-gray ml-1",children:["(",F,ue.total_energy_cost.toFixed(2),")"]})]})]}),x.budget&&o.jsxs(o.Fragment,{children:[o.jsxs("div",{children:[o.jsx("p",{className:"text-xs text-bambu-gray uppercase",children:"Budget"}),o.jsxs("p",{className:"text-lg font-semibold text-white",children:[F,x.budget.toFixed(2)]})]}),o.jsxs("div",{children:[o.jsx("p",{className:"text-xs text-bambu-gray uppercase",children:"Remaining"}),o.jsxs("p",{className:`text-lg font-semibold ${x.budget-ue.estimated_cost>=0?"text-bambu-green":"text-red-400"}`,children:[F,(x.budget-ue.estimated_cost).toFixed(2)]})]})]})]})]})}),x.children&&x.children.length>0&&o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2 mb-3",children:[o.jsx(Wle,{className:"w-5 h-5"}),"Sub-projects (",x.children.length,")"]}),o.jsx("div",{className:"space-y-2",children:x.children.map(U=>o.jsxs(_c,{to:`/projects/${U.id}`,className:"flex items-center justify-between p-3 bg-bambu-dark rounded-lg hover:bg-bambu-dark-tertiary transition-colors",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-3 h-3 rounded-full",style:{backgroundColor:U.color||"#6b7280"}}),o.jsx("span",{className:"text-white",children:U.name}),o.jsx("span",{className:`text-xs px-2 py-0.5 rounded ${U.status==="completed"?"bg-bambu-green/20 text-bambu-green":U.status==="archived"?"bg-bambu-gray/20 text-bambu-gray":"bg-blue-500/20 text-blue-400"}`,children:U.status})]}),U.progress_percent!==null&&o.jsxs("span",{className:"text-sm text-bambu-gray",children:[U.progress_percent.toFixed(0),"%"]})]},U.id))})]})}),x.parent_id&&x.parent_name&&o.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[o.jsx(pd,{className:"w-4 h-4 text-bambu-gray"}),o.jsx("span",{className:"text-bambu-gray",children:"Part of:"}),o.jsx(_c,{to:`/projects/${x.parent_id}`,className:"text-bambu-green hover:underline",children:x.parent_name})]}),(x.tags||x.due_date||x.priority!=="normal")&&o.jsxs("div",{className:"flex flex-wrap items-center gap-4",children:[x.priority&&x.priority!=="normal"&&o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx("span",{className:"text-xs text-bambu-gray uppercase",children:"Priority:"}),o.jsx(_We,{priority:x.priority})]}),x.due_date&&o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx(Qr,{className:"w-4 h-4 text-bambu-gray"}),o.jsx("span",{className:"text-sm text-white",children:wWe(x.due_date)}),jk(x.due_date)&&o.jsxs("span",{className:`text-xs ${jk(x.due_date).color}`,children:["(",jk(x.due_date).label,")"]})]}),x.tags&&o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsx(Ap,{className:"w-4 h-4 text-bambu-gray"}),o.jsx("div",{className:"flex flex-wrap gap-1",children:x.tags.split(",").map((U,O)=>o.jsx("span",{className:"px-2 py-0.5 bg-bambu-dark-tertiary text-bambu-gray text-xs rounded",children:U.trim()},O))})]})]}),o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(Es,{className:"w-5 h-5"}),"Notes"]}),s?o.jsxs("div",{className:"flex gap-2",children:[o.jsxs(ke,{variant:"secondary",size:"sm",onClick:L,disabled:k.isPending,children:[o.jsx(Gt,{className:"w-4 h-4 mr-1"}),"Cancel"]}),o.jsxs(ke,{size:"sm",onClick:I,disabled:k.isPending,children:[k.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin mr-1"}):o.jsx(Ts,{className:"w-4 h-4 mr-1"}),"Save"]})]}):o.jsxs(ke,{variant:"secondary",size:"sm",onClick:R,children:[o.jsx(Qh,{className:"w-4 h-4 mr-1"}),"Edit"]})]}),s?o.jsx(zj,{content:c,onChange:u,placeholder:"Add notes about this project..."}):x.notes?o.jsx("div",{className:"prose prose-invert prose-sm max-w-none",dangerouslySetInnerHTML:{__html:x.notes}}):o.jsx("p",{className:"text-bambu-gray/70 text-sm italic",children:"No notes yet. Click Edit to add notes."})]})}),o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(Zce,{className:"w-5 h-5"}),"Attachments (",x.attachments?.length||0,")"]}),o.jsxs("div",{children:[o.jsx("input",{ref:g,type:"file",onChange:q,className:"hidden"}),o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>g.current?.click(),disabled:d,children:[d?o.jsx(xt,{className:"w-4 h-4 animate-spin mr-1"}):o.jsx(oa,{className:"w-4 h-4 mr-1"}),"Upload"]})]})]}),o.jsx("p",{className:"text-xs text-bambu-gray mb-3",children:"Upload any file: images (PNG, JPG), PDFs, STL files, or documents."}),x.attachments&&x.attachments.length>0?o.jsx("div",{className:"space-y-2",children:x.attachments.map(U=>o.jsxs("div",{className:"flex items-center justify-between p-3 bg-bambu-dark rounded-lg",children:[o.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[o.jsx(uR,{className:"w-5 h-5 text-bambu-gray flex-shrink-0"}),o.jsxs("div",{className:"min-w-0",children:[o.jsx("p",{className:"text-sm text-white truncate",children:U.original_name}),o.jsx("p",{className:"text-xs text-bambu-gray",children:V(U.size)})]})]}),o.jsxs("div",{className:"flex items-center gap-1 flex-shrink-0",children:[o.jsx("a",{href:Se.getProjectAttachmentUrl(p,U.filename),download:U.original_name,className:"p-2 rounded hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray hover:text-white",title:"Download",children:o.jsx(is,{className:"w-4 h-4"})}),o.jsx("button",{onClick:()=>j(U.filename,U.original_name),className:"p-2 rounded hover:bg-bambu-dark-tertiary transition-colors text-bambu-gray hover:text-red-400",title:"Delete",children:o.jsx(En,{className:"w-4 h-4"})})]})]},U.filename))}):o.jsx("p",{className:"text-bambu-gray/70 text-sm italic",children:"No attachments yet. Click Upload to add files."})]})}),o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-4",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(UG,{className:"w-5 h-5"}),"Bill of Materials",ue&&ue.bom_total_items>0&&o.jsxs("span",{className:"text-sm font-normal text-bambu-gray",children:["(",ue.bom_completed_items,"/",ue.bom_total_items," acquired)"]})]}),o.jsxs("div",{className:"flex items-center gap-2",children:[w&&w.some(U=>U.is_complete)&&o.jsx("button",{onClick:()=>me(!Te),className:`text-xs px-2 py-1 rounded transition-colors ${Te?"bg-bambu-green/20 text-bambu-green":"bg-bambu-dark text-bambu-gray hover:text-white"}`,children:Te?"Show all":"Hide done"}),!oe&&o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>xe(!0),children:[o.jsx(sr,{className:"w-4 h-4 mr-1"}),"Add Part"]})]})]}),oe&&o.jsxs("form",{onSubmit:H,className:"bg-bambu-dark rounded-lg p-4 mb-4 space-y-3",children:[o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:[o.jsx("input",{type:"text",value:K,onChange:U=>W(U.target.value),className:"bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"Part name (e.g., M3x8 screws)",autoFocus:!0}),o.jsxs("div",{className:"flex gap-2",children:[o.jsx("input",{type:"number",value:J,onChange:U=>ee(parseInt(U.target.value)||1),className:"w-20 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white focus:outline-none focus:border-bambu-green",min:"1",placeholder:"Qty"}),o.jsx("input",{type:"number",step:"0.01",value:Z,onChange:U=>B(U.target.value),className:"flex-1 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:`Price (${F})`})]})]}),o.jsx("input",{type:"url",value:G,onChange:U=>Q(U.target.value),className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"Sourcing URL (optional)"}),o.jsx("input",{type:"text",value:te,onChange:U=>he(U.target.value),className:"w-full bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded px-3 py-2 text-sm text-white placeholder-bambu-gray focus:outline-none focus:border-bambu-green",placeholder:"Remarks (optional)"}),o.jsxs("div",{className:"flex justify-end gap-2",children:[o.jsx(ke,{type:"button",variant:"secondary",size:"sm",onClick:()=>xe(!1),children:"Cancel"}),o.jsx(ke,{type:"submit",size:"sm",disabled:!K.trim()||fe.isPending,children:fe.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin"}):"Add Part"})]})]}),T?o.jsx("div",{className:"flex items-center justify-center py-4",children:o.jsx(xt,{className:"w-6 h-6 animate-spin text-bambu-green"})}):w&&w.length>0?o.jsxs("div",{className:"space-y-2",children:[w.filter(U=>!Te||!U.is_complete).map(U=>o.jsx("div",{className:`p-3 rounded-lg transition-colors ${U.is_complete?"bg-bambu-green/10":"bg-bambu-dark"}`,children:o.jsxs("div",{className:"flex items-start gap-3",children:[o.jsx("button",{onClick:()=>re(U),disabled:Ie.isPending,className:`w-5 h-5 mt-0.5 rounded border-2 flex items-center justify-center transition-colors flex-shrink-0 ${U.is_complete?"bg-bambu-green border-bambu-green text-white":"border-bambu-gray hover:border-bambu-green"}`,children:U.is_complete&&o.jsx(Cr,{className:"w-3 h-3"})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsxs("div",{className:"flex items-center justify-between gap-2",children:[o.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[o.jsxs("p",{className:`text-sm font-medium ${U.is_complete?"text-bambu-gray line-through":"text-white"}`,children:[U.name,o.jsxs("span",{className:"text-bambu-gray font-normal ml-2",children:["x",U.quantity_needed]})]}),U.unit_price!==null&&o.jsxs("span",{className:"text-xs text-bambu-green whitespace-nowrap",children:[F,(U.unit_price*U.quantity_needed).toFixed(2)]})]}),o.jsx("button",{onClick:()=>$(U.id,U.name),className:"p-1 rounded hover:bg-bambu-dark-tertiary text-bambu-gray hover:text-red-400 transition-colors flex-shrink-0",title:"Delete",children:o.jsx(En,{className:"w-4 h-4"})})]}),U.sourcing_url&&o.jsxs("a",{href:U.sourcing_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 mt-1 text-xs text-blue-400 hover:text-blue-300 transition-colors",onClick:O=>O.stopPropagation(),children:[o.jsx(ba,{className:"w-3 h-3 flex-shrink-0"}),o.jsx("span",{className:"truncate",children:(()=>{try{return new URL(U.sourcing_url).hostname.replace("www.","")}catch{return U.sourcing_url}})()})]}),U.remarks&&o.jsx("p",{className:"mt-1 text-xs text-bambu-gray/80 italic",children:U.remarks})]})]})},U.id)),w.some(U=>U.unit_price!==null)&&o.jsxs("div",{className:"pt-2 mt-2 border-t border-bambu-dark-tertiary flex justify-between text-sm",children:[o.jsx("span",{className:"text-bambu-gray",children:"Total cost:"}),o.jsxs("span",{className:"text-white font-medium",children:[F,w.reduce((U,O)=>U+(O.unit_price||0)*O.quantity_needed,0).toFixed(2)]})]})]}):o.jsx("p",{className:"text-bambu-gray/70 text-sm italic",children:"No parts in the bill of materials. Add hardware, electronics, or other components to track what needs to be sourced."})]})}),o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsx("div",{className:"flex items-center justify-between mb-3",children:o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(U1,{className:"w-5 h-5"}),"Activity Timeline"]})}),C?o.jsx("div",{className:"flex items-center justify-center py-4",children:o.jsx(xt,{className:"w-6 h-6 animate-spin text-bambu-green"})}):A&&A.length>0?o.jsx("div",{className:"space-y-3",children:A.slice(0,10).map((U,O)=>o.jsxs("div",{className:"flex gap-3",children:[o.jsxs("div",{className:`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 ${U.event_type==="print_completed"?"bg-bambu-green/20 text-bambu-green":U.event_type==="print_failed"?"bg-red-500/20 text-red-400":U.event_type==="print_started"?"bg-yellow-500/20 text-yellow-400":"bg-bambu-dark-tertiary text-bambu-gray"}`,children:[U.event_type==="print_completed"&&o.jsx(Cr,{className:"w-4 h-4"}),U.event_type==="print_failed"&&o.jsx(Pa,{className:"w-4 h-4"}),U.event_type==="print_started"&&o.jsx(Vi,{className:"w-4 h-4"}),U.event_type==="queued"&&o.jsx(Zk,{className:"w-4 h-4"}),U.event_type==="project_created"&&o.jsx(sr,{className:"w-4 h-4"})]}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("p",{className:"text-sm text-white",children:U.title}),U.description&&o.jsx("p",{className:"text-xs text-bambu-gray truncate",children:U.description}),o.jsx("p",{className:"text-xs text-bambu-gray/70",children:se(U.timestamp)})]})]},O))}):o.jsx("p",{className:"text-bambu-gray/70 text-sm italic",children:"No activity yet."})]})}),!x.is_template&&o.jsx("div",{className:"flex justify-end",children:o.jsxs(ke,{variant:"secondary",size:"sm",onClick:()=>Y.mutate(),disabled:Y.isPending,children:[Y.isPending?o.jsx(xt,{className:"w-4 h-4 animate-spin mr-2"}):o.jsx(md,{className:"w-4 h-4 mr-2"}),"Save as Template"]})}),ue&&(ue.queued_prints>0||ue.in_progress_prints>0)&&o.jsx(wt,{children:o.jsxs(Et,{className:"p-4",children:[o.jsxs("div",{className:"flex items-center justify-between mb-3",children:[o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(Zk,{className:"w-5 h-5"}),"Queue"]}),o.jsx(_c,{to:`/queue?project=${p}`,className:"text-sm text-bambu-green hover:underline",children:"View all"})]}),o.jsxs("div",{className:"flex items-center gap-4 text-sm",children:[ue.in_progress_prints>0&&o.jsxs("span",{className:"text-yellow-400",children:[ue.in_progress_prints," printing"]}),ue.queued_prints>0&&o.jsxs("span",{className:"text-bambu-gray",children:[ue.queued_prints," queued"]})]})]})}),o.jsxs("div",{children:[o.jsx("div",{className:"flex items-center justify-between mb-4",children:o.jsxs("h2",{className:"text-lg font-semibold text-white flex items-center gap-2",children:[o.jsx(Fc,{className:"w-5 h-5"}),"Prints (",b?.length||0,")"]})}),E?o.jsx("div",{className:"flex items-center justify-center py-8",children:o.jsx(xt,{className:"w-6 h-6 animate-spin text-bambu-green"})}):o.jsx(vWe,{archives:b||[]})]}),i&&o.jsx(Wte,{project:{...x,archive_count:ue?.total_archives||0,queue_count:ue?.queued_prints||0,progress_percent:ue?.progress_percent||null,archives:[]},onClose:()=>a(!1),onSave:U=>k.mutate(U),isLoading:k.isPending}),ce.isOpen&&o.jsx(kr,{title:ce.title,message:ce.message,confirmText:"Delete",variant:"danger",onConfirm:ce.onConfirm,onCancel:()=>Ce(U=>({...U,isOpen:!1}))})]})}const Rk=5,MWe=2e3,EWe=3e4;function TWe(){const{printerId:t}=Zj(),e=parseInt(t||"0",10),[n,r]=M.useState("stream"),[i,a]=M.useState(!1),[s,l]=M.useState(!0),[c,u]=M.useState(Date.now()),[d,f]=M.useState(!1),[g,p]=M.useState(!1),[x,v]=M.useState(0),[y,b]=M.useState(!1),[E,w]=M.useState(0),T=M.useRef(null),A=M.useRef(null),C=M.useRef(null),N=M.useRef(null),{data:F}=gt({queryKey:["printer",e],queryFn:()=>Se.getPrinter(e),enabled:e>0});M.useEffect(()=>(F&&(document.title=`${F.name} - Camera`),()=>{document.title="Bambuddy"}),[F]),M.useEffect(()=>{const J=`/api/v1/printers/${e}/camera/stop`,ee=()=>{e>0&&navigator.sendBeacon(J)},Z=()=>{document.visibilityState==="hidden"&&e>0&&navigator.sendBeacon(J)};return window.addEventListener("beforeunload",ee),document.addEventListener("visibilitychange",Z),()=>{window.removeEventListener("beforeunload",ee),document.removeEventListener("visibilitychange",Z),T.current&&(T.current.src=""),e>0&&navigator.sendBeacon(J)}},[e]),M.useEffect(()=>{if(s&&!d){const ee=setTimeout(()=>{l(!1)},n==="stream"?3e3:2e4);return()=>clearTimeout(ee)}},[n,s,c,d]),M.useEffect(()=>{const J=()=>{p(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",J),()=>document.removeEventListener("fullscreenchange",J)},[]),M.useEffect(()=>{if(!window.opener)return;let J;const ee=()=>{clearTimeout(J),J=setTimeout(()=>{localStorage.setItem("cameraWindowState",JSON.stringify({width:window.outerWidth,height:window.outerHeight,left:window.screenX,top:window.screenY}))},500)};window.addEventListener("resize",ee);const Z=setInterval(()=>{const B=localStorage.getItem("cameraWindowState");if(B){const G=JSON.parse(B);(G.left!==window.screenX||G.top!==window.screenY)&&ee()}},1e3);return()=>{clearTimeout(J),clearInterval(Z),window.removeEventListener("resize",ee)}},[]),M.useEffect(()=>()=>{C.current&&clearTimeout(C.current),N.current&&clearInterval(N.current)},[]);const k=M.useCallback(()=>{if(x>=Rk){b(!1),a(!0);return}const J=Math.min(MWe*Math.pow(2,x),EWe);b(!0),w(Math.ceil(J/1e3)),N.current=setInterval(()=>{w(ee=>ee<=1?(N.current&&clearInterval(N.current),0):ee-1)},1e3),C.current=setTimeout(()=>{v(ee=>ee+1),b(!1),l(!0),a(!1),T.current&&(T.current.src=""),u(Date.now())},J)},[x]),R=()=>{l(!1),n==="stream"&&x{if(l(!1),a(!1),v(0),b(!1),C.current&&clearTimeout(C.current),N.current&&clearInterval(N.current),window.opener&&T.current&&!localStorage.getItem("cameraWindowState")){const J=T.current,ee=J.naturalWidth,Z=J.naturalHeight;if(ee>0&&Z>0){const Q=window.outerWidth-window.innerWidth,te=window.outerHeight-window.innerHeight,he=ee+16+Q,oe=Z+45+16+te;window.resizeTo(he,oe)}}},L=()=>{e>0&&fetch(`/api/v1/printers/${e}/camera/stop`).catch(()=>{})},q=J=>{n===J||d||(f(!0),l(!0),a(!1),v(0),b(!1),C.current&&clearTimeout(C.current),N.current&&clearInterval(N.current),T.current&&(T.current.src=""),n==="stream"&&L(),setTimeout(()=>{r(J),u(Date.now()),f(!1)},100))},j=()=>{d||(f(!0),l(!0),a(!1),v(0),b(!1),C.current&&clearTimeout(C.current),N.current&&clearInterval(N.current),T.current&&(T.current.src=""),n==="stream"&&L(),setTimeout(()=>{u(Date.now()),f(!1)},100))},V=()=>{A.current&&(document.fullscreenElement?document.exitFullscreen():A.current.requestFullscreen())},K=d?"":n==="stream"?`/api/v1/printers/${e}/camera/stream?fps=10&t=${c}`:`/api/v1/printers/${e}/camera/snapshot?t=${c}`,W=s||d||y;return e?o.jsxs("div",{ref:A,className:"min-h-screen bg-black flex flex-col",children:[o.jsxs("div",{className:"flex items-center justify-between px-4 py-2 bg-bambu-dark-secondary border-b border-bambu-dark-tertiary",children:[o.jsxs("h1",{className:"text-sm font-medium text-white flex items-center gap-2",children:[o.jsx(C0,{className:"w-4 h-4"}),F?.name||`Printer ${e}`]}),o.jsxs("div",{className:"flex items-center gap-2",children:[o.jsxs("div",{className:"flex bg-bambu-dark rounded p-0.5",children:[o.jsx("button",{onClick:()=>q("stream"),disabled:W,className:`px-3 py-1 text-xs rounded transition-colors ${n==="stream"?"bg-bambu-green text-white":"text-bambu-gray hover:text-white disabled:opacity-50"}`,children:"Live"}),o.jsx("button",{onClick:()=>q("snapshot"),disabled:W,className:`px-3 py-1 text-xs rounded transition-colors ${n==="snapshot"?"bg-bambu-green text-white":"text-bambu-gray hover:text-white disabled:opacity-50"}`,children:"Snapshot"})]}),o.jsx("button",{onClick:j,disabled:W,className:"p-1.5 hover:bg-bambu-dark-tertiary rounded disabled:opacity-50",title:n==="stream"?"Restart stream":"Refresh snapshot",children:o.jsx(_a,{className:`w-4 h-4 text-bambu-gray ${W?"animate-spin":""}`})}),o.jsx("button",{onClick:V,className:"p-1.5 hover:bg-bambu-dark-tertiary rounded",title:g?"Exit fullscreen":"Fullscreen",children:g?o.jsx(Vce,{className:"w-4 h-4 text-bambu-gray"}):o.jsx(Lce,{className:"w-4 h-4 text-bambu-gray"})})]})]}),o.jsx("div",{className:"flex-1 flex items-center justify-center p-2",children:o.jsxs("div",{className:"relative w-full h-full flex items-center justify-center",children:[(s||d)&&!y&&o.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/50 z-10",children:o.jsxs("div",{className:"text-center",children:[o.jsx(_a,{className:"w-8 h-8 text-bambu-gray animate-spin mx-auto mb-2"}),o.jsx("p",{className:"text-sm text-bambu-gray",children:n==="stream"?"Connecting to camera...":"Capturing snapshot..."})]})}),y&&o.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black/80 z-10",children:o.jsxs("div",{className:"text-center p-4",children:[o.jsx(Ab,{className:"w-10 h-10 text-orange-400 mx-auto mb-3"}),o.jsx("p",{className:"text-white mb-2",children:"Connection lost"}),o.jsxs("p",{className:"text-sm text-bambu-gray mb-3",children:["Reconnecting in ",E,"s... (attempt ",x+1,"/",Rk,")"]}),o.jsx("button",{onClick:j,className:"px-4 py-2 bg-bambu-green text-white text-sm rounded hover:bg-bambu-green/80 transition-colors",children:"Reconnect now"})]})}),i&&!y&&o.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-black z-10",children:o.jsxs("div",{className:"text-center p-4",children:[o.jsx(Gn,{className:"w-12 h-12 text-orange-400 mx-auto mb-3"}),o.jsx("p",{className:"text-white mb-2",children:"Camera unavailable"}),o.jsx("p",{className:"text-xs text-bambu-gray mb-4 max-w-md",children:"Make sure the printer is powered on and connected."}),o.jsx("button",{onClick:j,className:"px-4 py-2 bg-bambu-green text-white rounded hover:bg-bambu-green/80 transition-colors",children:"Retry"})]})}),o.jsx("img",{ref:T,src:K,alt:"Camera stream",className:"max-w-full max-h-full object-contain",onError:K?R:void 0,onLoad:K?I:void 0},c)]})})]}):o.jsx("div",{className:"min-h-screen bg-black flex items-center justify-center",children:o.jsx("p",{className:"text-white",children:"Invalid printer ID"})})}function AWe(){const{id:t}=Zj(),{mode:e}=ag(),{data:n,isLoading:r,error:i}=gt({queryKey:["external-link",t],queryFn:()=>Se.getExternalLink(Number(t)),enabled:!!t});return r?o.jsx("div",{className:"flex items-center justify-center h-full",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})}):i||!n?o.jsxs("div",{className:"flex flex-col items-center justify-center h-full gap-4 text-bambu-gray",children:[o.jsx(Gn,{className:"w-12 h-12"}),o.jsx("p",{children:"Link not found"})]}):o.jsx("iframe",{src:n.url,className:"h-full w-full border-0",style:{colorScheme:e},title:n.name,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox"})}function Xr({icon:t,label:e,value:n,subValue:r,color:i="text-bambu-green"}){return o.jsxs("div",{className:"flex items-start gap-3 p-4 bg-bambu-dark rounded-lg",children:[o.jsx("div",{className:`p-2 rounded-lg bg-bambu-dark-tertiary ${i}`,children:o.jsx(t,{className:"w-5 h-5"})}),o.jsxs("div",{className:"flex-1 min-w-0",children:[o.jsx("p",{className:"text-sm text-bambu-gray",children:e}),o.jsx("p",{className:"text-lg font-semibold text-white truncate",children:n}),r&&o.jsx("p",{className:"text-xs text-bambu-gray mt-0.5",children:r})]})]})}function K9({percent:t,color:e="bg-bambu-green"}){return o.jsx("div",{className:"w-full h-2 bg-bambu-dark rounded-full overflow-hidden",children:o.jsx("div",{className:`h-full ${e} transition-all duration-300`,style:{width:`${Math.min(100,t)}%`}})})}function uh({title:t,icon:e,children:n}){return o.jsxs(wt,{className:"p-6",children:[o.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[o.jsx(e,{className:"w-5 h-5 text-bambu-green"}),o.jsx("h2",{className:"text-lg font-semibold text-white",children:t})]}),n]})}function NWe(){const{t}=eg(),{data:e,isLoading:n,refetch:r,isFetching:i}=gt({queryKey:["systemInfo"],queryFn:Se.getSystemInfo,refetchInterval:3e4});if(n)return o.jsx("div",{className:"flex items-center justify-center h-64",children:o.jsx(xt,{className:"w-8 h-8 text-bambu-green animate-spin"})});if(!e)return o.jsx("div",{className:"p-6 text-center text-bambu-gray",children:t("system.failedToLoad","Failed to load system information")});const a=e.storage.disk_percent_used>90?"bg-red-500":e.storage.disk_percent_used>75?"bg-yellow-500":"bg-bambu-green",s=e.memory.percent_used>90?"bg-red-500":e.memory.percent_used>75?"bg-yellow-500":"bg-bambu-green";return o.jsxs("div",{className:"p-6 space-y-6",children:[o.jsxs("div",{className:"flex items-center justify-between",children:[o.jsxs("div",{children:[o.jsx("h1",{className:"text-2xl font-bold text-white",children:t("system.title","System Information")}),o.jsx("p",{className:"text-bambu-gray mt-1",children:t("system.subtitle","Monitor system resources and database statistics")})]}),o.jsxs("button",{onClick:()=>r(),disabled:i,className:"flex items-center gap-2 px-4 py-2 bg-bambu-dark-secondary hover:bg-bambu-dark-tertiary rounded-lg transition-colors disabled:opacity-50",children:[o.jsx(_a,{className:`w-4 h-4 ${i?"animate-spin":""}`}),t("common.refresh","Refresh")]})]}),o.jsx(uh,{title:t("system.application","Application"),icon:dh,children:o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[o.jsx(Xr,{icon:dh,label:t("system.version","Version"),value:`v${e.app.version}`}),o.jsx(Xr,{icon:rr,label:t("system.uptime","System Uptime"),value:e.system.uptime_formatted}),o.jsx(Xr,{icon:dh,label:t("system.hostname","Hostname"),value:e.system.hostname})]})}),o.jsxs(uh,{title:t("system.database","Database"),icon:wp,children:[o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4 mb-4",children:[o.jsx(Xr,{icon:oo,label:t("system.totalArchives","Total Archives"),value:e.database.archives}),o.jsx(Xr,{icon:sR,label:t("system.completed","Completed"),value:e.database.archives_completed,color:"text-green-500"}),o.jsx(Xr,{icon:Pa,label:t("system.failed","Failed"),value:e.database.archives_failed,color:"text-red-500"}),o.jsx(Xr,{icon:xt,label:t("system.printing","Printing"),value:e.database.archives_printing,color:"text-yellow-500"})]}),o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[o.jsx(Xr,{icon:Vi,label:t("system.printers","Printers"),value:e.database.printers}),o.jsx(Xr,{icon:mR,label:t("system.filaments","Filaments"),value:e.database.filaments}),o.jsx(Xr,{icon:Uo,label:t("system.projects","Projects"),value:e.database.projects}),o.jsx(Xr,{icon:lo,label:t("system.smartPlugs","Smart Plugs"),value:e.database.smart_plugs})]}),o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4",children:[o.jsx(Xr,{icon:rr,label:t("system.totalPrintTime","Total Print Time"),value:e.database.total_print_time_formatted}),o.jsx(Xr,{icon:oo,label:t("system.totalFilament","Total Filament Used"),value:`${e.database.total_filament_kg} kg`,subValue:`${e.database.total_filament_grams.toLocaleString()} g`})]})]}),o.jsxs(uh,{title:t("system.connectedPrinters","Connected Printers"),icon:Vi,children:[o.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[o.jsx("div",{className:"text-3xl font-bold text-bambu-green",children:e.printers.connected}),o.jsx("div",{className:"text-bambu-gray",children:t("system.ofTotal","of {{total}} printers connected",{total:e.printers.total})})]}),e.printers.connected_list.length>0?o.jsx("div",{className:"space-y-2",children:e.printers.connected_list.map(l=>o.jsxs("div",{className:"flex items-center justify-between p-3 bg-bambu-dark rounded-lg",children:[o.jsxs("div",{className:"flex items-center gap-3",children:[o.jsx("div",{className:"w-2 h-2 rounded-full bg-bambu-green"}),o.jsx("span",{className:"font-medium text-white",children:l.name})]}),o.jsxs("div",{className:"flex items-center gap-4 text-sm text-bambu-gray",children:[o.jsx("span",{children:l.model}),o.jsx("span",{className:`px-2 py-0.5 rounded ${l.state==="RUNNING"?"bg-bambu-green/20 text-bambu-green":l.state==="IDLE"?"bg-blue-500/20 text-blue-400":"bg-bambu-dark-tertiary"}`,children:l.state})]})]},l.id))}):o.jsx("p",{className:"text-bambu-gray",children:t("system.noPrintersConnected","No printers connected")})]}),o.jsx(uh,{title:t("system.storage","Storage"),icon:hR,children:o.jsxs("div",{className:"space-y-4",children:[o.jsxs("div",{children:[o.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[o.jsx("span",{className:"text-bambu-gray",children:t("system.diskUsage","Disk Usage")}),o.jsxs("span",{className:"text-white",children:[e.storage.disk_used_formatted," / ",e.storage.disk_total_formatted]})]}),o.jsx(K9,{percent:e.storage.disk_percent_used,color:a}),o.jsxs("p",{className:"text-xs text-bambu-gray mt-1",children:[e.storage.disk_free_formatted," ",t("system.free","free")," (",(100-e.storage.disk_percent_used).toFixed(1),"%)"]})]}),o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[o.jsx(Xr,{icon:oo,label:t("system.archiveStorage","Archive Storage"),value:e.storage.archive_size_formatted}),o.jsx(Xr,{icon:wp,label:t("system.databaseSize","Database Size"),value:e.storage.database_size_formatted})]})]})}),o.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[o.jsx(uh,{title:t("system.memory","Memory"),icon:Fce,children:o.jsx("div",{className:"space-y-4",children:o.jsxs("div",{children:[o.jsxs("div",{className:"flex justify-between text-sm mb-1",children:[o.jsx("span",{className:"text-bambu-gray",children:t("system.memoryUsage","Memory Usage")}),o.jsxs("span",{className:"text-white",children:[e.memory.used_formatted," / ",e.memory.total_formatted]})]}),o.jsx(K9,{percent:e.memory.percent_used,color:s}),o.jsxs("p",{className:"text-xs text-bambu-gray mt-1",children:[e.memory.available_formatted," ",t("system.available","available")]})]})})}),o.jsx(uh,{title:t("system.cpu","CPU"),icon:Tv,children:o.jsx("div",{className:"space-y-4",children:o.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[o.jsx(Xr,{icon:Tv,label:t("system.cores","Cores"),value:e.cpu.count,subValue:`${e.cpu.count_logical} logical`}),o.jsx(Xr,{icon:Tv,label:t("system.usage","Usage"),value:`${e.cpu.percent}%`})]})})})]}),o.jsx(uh,{title:t("system.systemDetails","System Details"),icon:dh,children:o.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[o.jsx(Xr,{icon:dh,label:t("system.os","Operating System"),value:e.system.platform,subValue:e.system.platform_release}),o.jsx(Xr,{icon:Tv,label:t("system.architecture","Architecture"),value:e.system.architecture}),o.jsx(Xr,{icon:dh,label:t("system.python","Python"),value:e.system.python_version}),o.jsx(Xr,{icon:rr,label:t("system.bootTime","Boot Time"),value:new Date(e.system.boot_time).toLocaleString()})]})})]})}function CWe(){const t=M.useRef(null),e=M.useRef(null),n=mn(),[r,i]=M.useState(!1),a=M.useRef(new Set),s=M.useRef(null),l=M.useRef(new Map),c=M.useRef(null),u=M.useRef([]),d=M.useRef(!1),f=M.useRef(()=>{}),g=M.useCallback(()=>{if(d.current||u.current.length===0)return;d.current=!0;const E=()=>{const w=u.current.shift();w?requestAnimationFrame(()=>{f.current(w),u.current.length>0?setTimeout(E,16):d.current=!1}):d.current=!1};E()},[]),p=M.useCallback(()=>{if(t.current?.readyState===WebSocket.OPEN)return;const w=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/api/v1/ws`,T=new WebSocket(w);let A=null;T.onopen=()=>{console.log("[WebSocket] Connected"),i(!0),A=window.setInterval(()=>{T.readyState===WebSocket.OPEN&&T.send(JSON.stringify({type:"ping"}))},3e4)},T.onmessage=C=>{try{const N=JSON.parse(C.data);N.type==="printer_status"&&N.printer_id!==void 0&&N.data?f.current(N):(u.current.push(N),g())}catch{}},T.onclose=C=>{console.log("[WebSocket] Closed",C.code,C.reason),A&&(clearInterval(A),A=null),i(!1),t.current=null,e.current=window.setTimeout(()=>{p()},3e3)},T.onerror=C=>{console.error("[WebSocket] Error",C),T.close()},t.current=T},[]),x=M.useCallback((E,w)=>{const T=l.current.get(E)||{};l.current.set(E,{...T,...w}),c.current||(c.current=window.setTimeout(()=>{const A=new Map(l.current);l.current.clear(),c.current=null,requestAnimationFrame(()=>{A.forEach((C,N)=>{n.setQueryData(["printerStatus",N],F=>{const k={...F,...C};return k.wifi_signal==null&&F?.wifi_signal!=null&&(k.wifi_signal=F.wifi_signal),k})})})},100))},[n]),v=M.useCallback(E=>{a.current.add(E),s.current&&clearTimeout(s.current),s.current=window.setTimeout(()=>{const w=Array.from(a.current);a.current.clear(),s.current=null;let T=0;w.forEach(A=>{setTimeout(()=>{requestAnimationFrame(()=>{n.invalidateQueries({queryKey:[A]})})},T),T+=500})},3e3)},[n]),y=M.useCallback(E=>{switch(E.type){case"printer_status":E.printer_id!==void 0&&E.data&&x(E.printer_id,E.data);break;case"print_complete":v("archives"),v("archiveStats");break;case"archive_created":v("archives"),v("archiveStats");break;case"archive_updated":v("archives");break}},[n,v,x]);M.useEffect(()=>{f.current=y},[y]),M.useEffect(()=>(p(),()=>{e.current&&clearTimeout(e.current),s.current&&clearTimeout(s.current),c.current&&clearTimeout(c.current),t.current&&t.current.close()}),[p]);const b=M.useCallback(E=>{t.current?.readyState===WebSocket.OPEN&&t.current.send(JSON.stringify(E))},[]);return{isConnected:r,sendMessage:b}}const kWe=new ioe({defaultOptions:{queries:{staleTime:1e3*60,retry:1}}});function PWe({children:t}){return CWe(),o.jsx(o.Fragment,{children:t})}function jWe(){return o.jsx(Ede,{children:o.jsx(Lde,{children:o.jsx(aoe,{client:kWe,children:o.jsx(PWe,{children:o.jsx(Tse,{children:o.jsxs(rse,{children:[o.jsx(Xa,{path:"/camera/:printerId",element:o.jsx(TWe,{})}),o.jsxs(Xa,{path:"/",element:o.jsx(Rde,{}),children:[o.jsx(Xa,{index:!0,element:o.jsx(tCe,{})}),o.jsx(Xa,{path:"archives",element:o.jsx(O7e,{})}),o.jsx(Xa,{path:"queue",element:o.jsx(vGe,{})}),o.jsx(Xa,{path:"stats",element:o.jsx(DGe,{})}),o.jsx(Xa,{path:"profiles",element:o.jsx(uWe,{})}),o.jsx(Xa,{path:"maintenance",element:o.jsx(mWe,{})}),o.jsx(Xa,{path:"projects",element:o.jsx(gWe,{})}),o.jsx(Xa,{path:"projects/:id",element:o.jsx(SWe,{})}),o.jsx(Xa,{path:"settings",element:o.jsx(JGe,{})}),o.jsx(Xa,{path:"system",element:o.jsx(NWe,{})}),o.jsx(Xa,{path:"external/:id",element:o.jsx(AWe,{})})]})]})})})})})})}oie.createRoot(document.getElementById("root")).render(o.jsx(M.StrictMode,{children:o.jsx(jWe,{})})); diff --git a/static/index.html b/static/index.html index 9c83232fa..951b6603c 100644 --- a/static/index.html +++ b/static/index.html @@ -23,7 +23,7 @@ - +