From d3686a1b6025965d37240d318b1d9bc565bacac6 Mon Sep 17 00:00:00 2001 From: maziggy Date: Thu, 1 Jan 2026 12:21:12 +0100 Subject: [PATCH] - Fixed maintenance interval display on status page --- frontend/src/pages/MaintenancePage.tsx | 16 +++++++++++++--- .../{index-CA7HMY_J.js => index-DhHo5MXv.js} | 2 +- static/index.html | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) rename static/assets/{index-CA7HMY_J.js => index-DhHo5MXv.js} (97%) diff --git a/frontend/src/pages/MaintenancePage.tsx b/frontend/src/pages/MaintenancePage.tsx index b59b572d7..4dfce21ec 100644 --- a/frontend/src/pages/MaintenancePage.tsx +++ b/frontend/src/pages/MaintenancePage.tsx @@ -76,12 +76,22 @@ function formatDuration(value: number, type: 'hours' | 'days'): string { if (value < 1) return 'Today'; if (value === 1) return '1 day'; if (value < 7) return `${Math.round(value)} days`; - if (value < 30) return `${Math.round(value / 7)} weeks`; + // Show weeks for anything under 6 months for better precision + if (value < 180) return `${Math.round(value / 7)} weeks`; + // 6+ months show as months return `${Math.round(value / 30)} months`; } else { + // Print hours - convert to readable units if (value < 1) return `${Math.round(value * 60)}m`; - if (value < 10) return `${value.toFixed(1)}h`; - return `${Math.round(value)}h`; + if (value < 24) return `${value < 10 ? value.toFixed(1) : Math.round(value)}h`; + // 24+ hours: show as days of print time + const days = value / 24; + if (days < 7) return `${days < 2 ? days.toFixed(1) : Math.round(days)}d`; + // 7+ days: show as weeks of print time + const weeks = days / 7; + if (weeks < 12) return `${weeks < 2 ? weeks.toFixed(1) : Math.round(weeks)}w`; + // 12+ weeks: show as months of print time + return `${Math.round(weeks / 4)}mo`; } } diff --git a/static/assets/index-CA7HMY_J.js b/static/assets/index-DhHo5MXv.js similarity index 97% rename from static/assets/index-CA7HMY_J.js rename to static/assets/index-DhHo5MXv.js index 5b870cf76..07955561d 100644 --- a/static/assets/index-CA7HMY_J.js +++ b/static/assets/index-DhHo5MXv.js @@ -8647,4 +8647,4 @@ Accuracy: ${t.time_accuracy.toFixed(0)}%`:t.actual_time_seconds?`Actual: ${Hx(t. `+n+"]";if(typeof t=="object"){const r=Object.entries(t);return r.length===0?"{}":`{ `+r.map(([a,s])=>n+" "+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){return e==="days"?t<1?"Today":t===1?"1 day":t<7?`${Math.round(t)} days`:t<30?`${Math.round(t/7)} weeks`:`${Math.round(t/30)} months`:t<1?`${Math.round(t*60)}m`:t<10?`${t.toFixed(1)}h`:`${Math.round(t)}h`}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(()=>()=>{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,{})})); diff --git a/static/index.html b/static/index.html index b7503c6de..9c83232fa 100644 --- a/static/index.html +++ b/static/index.html @@ -23,7 +23,7 @@ - +