1import"../chunks/DsnmJJEf.js";import{e as xe,a as A,b as l,p as ct,L as vt,i as e,h as R,c as ut,f as m,d as a,r,s,g as o,t as j,X as Q,u as x,aK as de,aA as Je,bb as We,Y as Pt}from"../chunks/Bw6NNokM.js";import{d as mt,s as F,e as Qe}from"../chunks/DPnjm8Mh.js";import{l as ft,s as pt,p as Bt,i as k}from"../chunks/DDwgwxRv.js";import{I as bt,s as xt,b as Oe,r as Ve,a as gt}from"../chunks/DywSlzmA.js";import{t as Ze,a as At,f as Ft,s as Mt}from"../chunks/DE3iVKio.js";import{b as rt,a as _t}from"../chunks/B9pUsoIk.js";import{b as ht}from"../chunks/wMzm2EAH.js";import{p as Nt}from"../chunks/CfVTYGoZ.js";import{g as Ht}from"../chunks/BJ4Stx4L.js";import{m as Vt,r as Ut,d as y,c as Gt,l as it}from"../chunks/D5hKTQIS.js";import{s as st}from"../chunks/DHwkFcuK.js";import{f as nt}from"../chunks/BM3PIZza.js";import{logtoClient as $e}from"../chunks/Dd9EqP-e.js";import{B as qt,s as Kt,r as Xt}from"../chunks/CUSaNOdD.js";import{o as Yt}from"../chunks/CE2RvNGp.js";import{a as lt,p as Jt,m as Wt}from"../chunks/B_L5zhP3.js";import{c as Qt}from"../chunks/CvmYViMX.js";import{X as yt}from"../chunks/z_SB-SXA.js";import{T as Zt}from"../chunks/DDmpsVrd.js";import{E as $t}from"../chunks/oV8K-2L2.js";import{C as ea,B as ta}from"../chunks/BTH5hKNO.js";import{L as et}from"../chunks/CiyQF1Xc.js";import"../chunks/zDUQPp1S.js";import{s as ot}from"../chunks/BlOVf5CT.js";import{a as aa,g as ra}from"../chunks/Dyr3n1g9.js";import{C as ia}from"../chunks/CtIZZedw.js";import{C as Xe}from"../chunks/CNfzHkWv.js";import{D as sa}from"../chunks/CLmHvfCf.js";import{t as Ye}from"../chunks/BpCLYGGY.js";import{C as dt}from"../chunks/DtWaGgpU.js";function na(G,d){const D=ft(d,["children","$$slots","$$events","$$legacy"]);const M=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"}],["path",{d:"m15 5 4 4"}]];bt(G,pt({name:"pencil"},()=>D,{get iconNode(){return M},children:(q,z)=>{var i=xe(),S=A(i);xt(S,d,"default",{}),l(q,i)},$$slots:{default:!0}}))}function kt(G,d){const D=ft(d,["children","$$slots","$$events","$$legacy"]);const M=[["path",{d:"M10 11v6"}],["path",{d:"M14 11v6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"}],["path",{d:"M3 6h18"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}]];bt(G,pt({name:"trash-2"},()=>D,{get iconNode(){return M},children:(q,z)=>{var i=xe(),S=A(i);xt(S,d,"default",{}),l(q,i)},$$slots:{default:!0}}))}const la=async()=>({}),oa=!1,da=!1,yr=Object.freeze(Object.defineProperty({__proto__:null,load:la,prerender:oa,ssr:da},Symbol.toStringTag,{value:"Module"}));var ca=m(`<h2 id="deregister-modal-title" class="pr-10 text-[1.125rem] font-semibold tracking-[-0.01em] text-[var(--sl-text-1)]">Before you deregister</h2> <div class="mt-3 flex items-start gap-2.5 rounded-xl border border-red-500/25 bg-red-500/5 px-4 py-3 dark:bg-red-500/10"><!> <p class="text-[0.8125rem] leading-relaxed text-red-700 dark:text-red-300"><span class="font-medium">This is destructive and permanent.</span> Deregistering removes 2 this device from your account and is irreversible.</p></div> <p class="mt-4 text-[0.875rem] leading-relaxed text-[var(--sl-text-2)]">Most issues â device offline, settings not syncing, login problems â don't require a 3 deregister. Reporting a bug on the community forum is almost always the right first step.</p> <a target="_blank" rel="noopener" class="mt-5 inline-flex h-11 w-full items-center justify-center gap-1.5 rounded-lg bg-primary px-4 text-[0.875rem] font-medium text-white transition-all duration-100 hover:opacity-90 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary active:scale-[0.98] active:opacity-85"><span>Report an issue on the forum</span> <!></a> <button type="button" class="mt-2 inline-flex h-11 w-full items-center justify-center rounded-lg border border-[var(--sl-border)] bg-transparent px-4 text-[0.875rem] font-medium text-[var(--sl-text-2)] transition-all duration-100 hover:bg-[var(--sl-bg-elevated)] hover:text-[var(--sl-text-1)] focus-visible:outline-2 focus-visible:outline-primary active:scale-[0.98] active:bg-[var(--sl-bg-subtle)]">Continue anyway</button>`,1),va=m('<div class="mt-4 rounded-lg border border-red-500/30 bg-red-500/10 px-3 py-2.5 text-[0.8125rem] text-red-700 dark:text-red-300" role="alert"> </div>'),ua=m("<!> <span>Deregisteringâ¦</span>",1),ma=m("<!> <span>Deregister device</span>",1),fa=m(`<div class="mb-1 flex items-center gap-1"><button type="button" class="-ml-2 inline-flex h-9 w-9 items-center justify-center rounded-md text-[var(--sl-text-3)] transition-all duration-100 hover:bg-[var(--sl-bg-elevated)] hover:text-[var(--sl-text-1)] focus-visible:outline-2 focus-visible:outline-primary active:scale-[0.9] active:bg-[var(--sl-bg-subtle)] disabled:opacity-50 disabled:active:scale-100" aria-label="Back"><!></button> <span class="text-[0.75rem] text-[var(--sl-text-3)]">Step 2 of 2</span></div> <h2 id="deregister-modal-title" class="pr-10 text-[1.125rem] font-semibold tracking-[-0.01em] text-[var(--sl-text-1)]">Confirm deregister</h2> <p class="mt-2 text-[0.8125rem] text-[var(--sl-text-2)]">You're about to deregister:</p> <div class="mt-2 rounded-lg border border-[var(--sl-border)] bg-[var(--sl-bg-elevated)]/60 px-3 py-2.5"><p class="truncate text-[0.9375rem] font-semibold text-[var(--sl-text-1)]"> </p> <dl class="mt-1 flex flex-col gap-0.5"><div class="flex items-baseline gap-2"><dt class="shrink-0 text-[0.6875rem] text-[var(--sl-text-3)]">sunnylink Device ID</dt> <dd class="min-w-0 flex-1 truncate text-right text-[0.6875rem] text-[var(--sl-text-2)]"> </dd></div></dl></div> <div class="mt-4 space-y-2.5"><label class="flex cursor-pointer items-start gap-2.5 rounded-lg border border-[var(--sl-border)] bg-[var(--sl-bg-elevated)]/40 px-3 py-2.5 transition-colors hover:bg-[var(--sl-bg-elevated)]/70"><input type="checkbox" class="mt-0.5 h-4 w-4 shrink-0 cursor-pointer rounded border-[var(--sl-border)] text-primary accent-primary focus-visible:outline-2 focus-visible:outline-primary"/> <span class="text-[0.8125rem] leading-relaxed text-[var(--sl-text-2)]">I understand this is <span class="font-medium text-[var(--sl-text-1)]">
3permanent</span> and cannot be undone.</span></label> <label class="flex cursor-pointer items-start gap-2.5 rounded-lg border border-[var(--sl-border)] bg-[var(--sl-bg-elevated)]/40 px-3 py-2.5 transition-colors hover:bg-[var(--sl-bg-elevated)]/70"><input type="checkbox" class="mt-0.5 h-4 w-4 shrink-0 cursor-pointer rounded border-[var(--sl-border)] text-primary accent-primary focus-visible:outline-2 focus-visible:outline-primary"/> <span class="text-[0.8125rem] leading-relaxed text-[var(--sl-text-2)]">I want to <span class="font-medium text-[var(--sl-text-1)]">deregister</span> this device 4 from my account.</span></label></div> <div class="mt-4"><label for="deregister-confirm" class="block text-[0.8125rem] text-[var(--sl-text-2)]">Type <span class="font-mono font-semibold text-[var(--sl-text-1)]"></span> to confirm:</label> <input id="deregister-confirm" type="text" autocomplete="off" autocapitalize="none" autocorrect="off" spellcheck="false" class="mt-1.5 w-full rounded-lg border border-[var(--sl-border)] bg-[var(--sl-bg-input)] px-3 py-2 font-mono text-[0.875rem] text-[var(--sl-text-1)] focus:border-red-500 focus-visible:outline-2 focus-visible:outline-red-500"/></div> <!> <button type="button" class="mt-5 inline-flex h-11 w-full items-center justify-center gap-1.5 rounded-lg bg-red-600 px-4 text-[0.875rem] font-medium text-white transition-all duration-100 hover:bg-red-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600 active:scale-[0.98] active:bg-red-800 disabled:cursor-not-allowed disabled:bg-red-600/50 disabled:active:scale-100 dark:bg-red-500 dark:hover:bg-red-600"><!></button>`,1),pa=m('<div class="fixed inset-0 z-[10000] flex items-center justify-center bg-[var(--sl-overlay)] px-4 py-6 sm:py-0" style="padding-top: max(env(safe-area-inset-top), 1.5rem); padding-bottom: max(env(safe-area-inset-bottom), 1.5rem);" role="dialog" aria-modal="true" aria-labelledby="deregister-modal-title" tabindex="-1"><div class="relative max-h-full w-full max-w-md overflow-y-auto rounded-2xl border border-[var(--sl-border)] bg-[var(--sl-bg-surface)] p-6 shadow-xl"><button type="button" class="absolute top-3 right-3 inline-flex h-9 w-9 items-center justify-center rounded-md text-[var(--sl-text-3)] transition-all duration-100 hover:bg-[var(--sl-bg-elevated)] hover:text-[var(--sl-text-1)] focus-visible:outline-2 focus-visible:outline-primary active:scale-[0.9] active:bg-[var(--sl-bg-subtle)] disabled:opacity-50 disabled:active:scale-100" aria-label="Dismiss"><!></button> <!></div></div>');function ba(G,d){ct(d,!0);let D=Bt(d,"open",15,!1);const M="permanent deregister",q="https://community.sunnypilot.ai/c/bug-reports/8";let z=R(1),i=R(""),S=R(!1),p=R(!1),C=R(!1),O=R(null),E=R(!1);function c(){o(z,1),o(i,""),o(S,!1),o(p,!1),o(C,!1),o(O,null),o(E,!1)}function u(){e(C)||(D(!1),setTimeout(c,250))}function f(L){L.preventDefault()}function I(){o(z,2)}function H(){e(C)||o(z,1)}let P=x(()=>e(S)&&e(p)&&e(i).trim()===M);async function re(){if(!(!e(P)||e(C))){o(C,!0),o(O,null),o(E,!1);try{const L=await $e?.getIdToken();if(!L)throw new Error("Not authenticated");try{await Vt(d.deviceId,L)}catch(X){console.error("Deregistration failed:",X),o(E,!0),o(O,"Deregistration failed. Please contact support before retrying â do not attempt to remove the user manually."),o(C,!1);return}await Ut(d.deviceId,"self",L),d.onDeregistered?.(),u()}catch(L){console.error("User removal failed:",L),o(O,"Failed to remove user from device, but the device may have been deregistered. Refresh and check."),o(C,!1)}}}function V(L){L.key==="Escape"&&D()&&u()}let ce=R(null);vt(()=>{D()&&e(ce)?.focus()}),Yt(()=>(window.addEventListener("keydown",V),()=>
4window.removeEventListener("keydown",V)));var ge=xe(),_e=A(ge);{var Se=L=>{var X=pa();X.__click=B=>{B.target===B.currentTarget&&u()};var Ce=a(X),ve=a(Ce);ve.__click=u;var Ue=a(ve);yt(Ue,{size:16}),r(ve);var ue=s(ve,2);{var Ge=B=>{var ie=ca(),$=s(A(ie),2),ee=a($);Zt(ee,{size:16,class:"mt-0.5 shrink-0 text-red-600 dark:text-red-400","aria-hidden":"true"}),Q(2),r($);var se=s($,4);Oe(se,"href",q);var me=s(a(se),2);$t(me,{size:14,"aria-hidden":"true"}),r(se);var J=s(se,2);J.__click=I,l(B,ie)},Re=B=>{var ie=fa(),$=A(ie),ee=a($);ee.__click=H;var se=a(ee);ea(se,{size:16}),r(ee),Q(2),r($);var me=s($,6),J=a(me),Ee=a(J,!0);r(J);var ne=s(J,2),he=a(ne),Te=s(a(he),2),qe=a(Te,!0);r(Te),r(he),r(ne),r(me);var ye=s(me,2),fe=a(ye),je=a(fe);Ve(je),Q(2),r(fe);var ze=s(fe,2),Pe=a(ze);Ve(Pe),Q(2),r(ze),r(ye);var pe=s(ye,2),ke=a(pe),Be=s(a(ke));Be.textContent="permanent deregister",Q(),r(ke);var le=s(ke,2);Ve(le),Oe(le,"placeholder",M),r(pe);var Ie=s(pe,2);{var Ae=T=>{var W=va(),te=a(W,!0);r(W),j(()=>F(te,e(O))),l(T,W)};k(Ie,T=>{e(O)&&T(Ae)})}var be=s(Ie,2);be.__click=re;var Fe=a(be);{var Me=T=>{var W=ua(),te=A(W);et(te,{size:14,class:"animate-spin","aria-hidden":"true"}),Q(2),l(T,W)},Ne=T=>{var W=ma(),te=A(W);kt(te,{size:14,"aria-hidden":"true"}),Q(2),l(T,W)};k(Fe,T=>{e(C)?T(Me):T(Ne,!1)})}r(be),j(()=>{ee.disabled=e(C),F(Ee,d.alias||d.deviceId),F(qe,d.deviceId),be.disabled=!e(P)||e(C)||e(E)}),rt(je,()=>e(S),T=>o(S,T)),rt(Pe,()=>e(p),T=>o(p,T)),Qe("paste",le,f),Qe("drop",le,f),_t(le,()=>e(i),T=>o(i,T)),l(B,ie)};k(ue,B=>{e(z)===1?B(Ge):B(Re,!1)})}r(Ce),r(X),ht(X,B=>o(ce,B),()=>e(ce)),lt(X,B=>Jt?.(B)),lt(X,B=>Wt?.()),j(()=>ve.disabled=e(C)),Ze(3,Ce,()=>At,()=>({y:8,duration:150,easing:Qt,opacity:0})),Ze(3,X,()=>Ft,()=>({duration:200})),l(L,X)};k(_e,L=>{D()&&L(Se)})}l(G,ge),ut()}mt(["click"]);var xa=m('<h1 class="text-[24px] leading-[32px] font-medium tracking-[-0.16px] text-[var(--sl-text-1)]"> </h1>'),ga=m('<div class="mt-1"><!></div>'),_a=m('<p class="mt-1 text-[0.8125rem] font-[450] text-[var(--sl-text-2)]"> </p>'),ha=m('<div><!> <div class="px-4"><!> <!></div></div>');function ya(G,d){var D=ha(),M=a(D);{var q=c=>{ta(c,{get label(){return d.backLabel},get fallback(){return d.backHref}})};k(M,c=>{d.backLabel&&d.backHref&&c(q)})}var z=s(M,2),i=a(z);{var S=c=>{var u=xe(),f=A(u);ot(f,()=>d.titleSnippet),l(c,u)},p=c=>{var u=xe(),f=A(u);{var I=H=>{var P=xa(),re=a(P,!0);r(P),j(()=>F(re,d.title)),l(H,P)};k(f,H=>{d.title&&H(I)},!0)}l(c,u)};k(i,c=>{d.titleSnippet?c(S):c(p,!1)})}var C=s(i,2);{var O=c=>{var u=ga(),f=a(u);ot(f,()=>d.subtitleSnippet),r(u),l(c,u)},E=c=>{var u=xe(),f=A(u);{var I=H=>{var P=_a(),re=a(P,!0);r(P),j(()=>F(re,d.subtitle)),l(H,P)};k(f,H=>{d.subtitle&&H(I)},!0)}l(c,u)};k(C,c=>{d.subtitleSnippet?c(O):c(E,!1)})}r(z),r(D),l(G,D)}const De=(G,d=de,D=de,M,q)=>{let z=Je(()=>We(M?.(),!1)),i=Je(()=>We(q?.(),!0));var S=Da(),p=a(S),C=a(p,!0);r(p);var O=s(p,2),E=a(O);{var c=f=>{var I=wa(),H=s(A(I),2),P=a(H);r(H),j(()=>F(P,`Loading ${d()??""}`)),l(f,I)},u=f=>{var I=Pt();j(()=>F(I,D()??"â")),l(f,I)};k(E,f=>{e(i)?f(u,!1):f(c)})}r(O),r(S),j(()=>{F(C,d()),gt(O,1,`truncate text-right text-[0.8125rem] font-medium text-[var(--sl-text-1)] ${e(z)?"font-mono":""}`)}),l(G,S)},ka=(G,d=de,D=de,M)=>{let q=Je(()=>We(M?.(),!0));var z=za(),i=a(z),S=a(i,!0);r(i);var p=s(i,2),C=a(p);{var O=c=>{var u=Ta(),f=s(A(u),2),I=a(f);r(f),j(()=>F(I,`Loading ${d()??""}`)),l(c,u)},E=c=>{var u=ja(),f=a(u,!0);r(u),j(()=>F(f,D()??"â")),l(c,u)};k(C,c=>{e(q)?c(E,!1):c(O)})}r(p),r(z),j(()=>F(S,d())),l(G,z)};var wa=m('<span class="inline-block h-3 w-20 animate-pulse rounded bg-[var(--sl-bg-elevated)]" aria-hidden="true"></span> <span class="sr-only"> </span>',1),Da=m('<div class="flex items-center justify-between gap-4 px-4 py-3"><dt class="text-[0.8125rem] text-[var(--sl-text-3)]"> </dt> <dd><!></dd></div>'),Sa=m("<span> </span>"),Ca=m('<div class="flex items-center justify-between gap-4 px-4 py-3"><dt class="text-[0.8125rem] text-[var(--sl-text-3)]">Status</dt> <dd class="flex flex-wrap items-center justify-end gap-1.5"><!> <!></dd></div>'),Ta=m('<span class="inline-block h-3 w-32 animate-pulse rounded bg-[var(--sl-bg-elevated)]" aria-hidden="true"></span> <span class="sr-only"> </span>',1),ja=m('<span class="text-[0.8125rem] font-medium text-[var(--sl-text-1)]"> </span>'),za=m('<div class="flex items-center justify-between gap-4 px-4 py-3"><dt class="shrink-0 text-[0.8125rem] text-[var(--sl-text-3)]"> </dt> <dd class="min-w-0 flex-1 overflow-x-auto text-right whitespace-nowrap"><!></dd></div>'),Ia=m('<span class="inline-block h-3 w-16 animate-pulse rounded bg-[var(--sl-bg-elevated)]" aria-hidden="true"></span> <span class="sr-only">Loading commit hash</span>',1),La=m('<span class="overflow-x-auto text-[0.8125rem] font-medium whitespace-nowrap text-[var(--sl-text-1)]"> </span>'),Oa=m('<button type="button" class="inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-[var(--sl-text-3)] transition-all duration-100 hover:bg-[var(--sl-bg-elevated)] hover:text-[var(--sl-text-1)] focus-visible:outline-2 focus-visible:outline-primary active:scale-[0.88] active:bg-[var(--sl-bg-subtle)]" aria-label="Copy commit hash"><!></button>'),Ra=m('<div class="flex items-center justify-between gap-4 px-4 py-3"><dt class="shrink-0 text-[0.8125rem] text-[var(--sl-text-3)]">Commit</dt> <dd class="flex min-w-0 flex-1 items-center justify-end gap-2"><!> <!></dd></div>'),Ea=m('<button type="button" class="inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-[var(--sl-text-3)] transition-all duration-100 hover:bg-[var(--sl-bg-elevated)] hover:text-[var(--sl-text-1)] focus-visible:outline-2 focus-visible:outline-primary active:scale-[0.88] active:bg-[var(--sl-bg-subtle)]"><!></button>'),Pa=m('<div class="flex items-center justify-between gap-4 px-4 py-3"><dt class="shrink-0 text-[0.8125rem] text-[var(--sl-text-3)]"> </dt> <dd class="flex min-w-0 flex-1 items-center justify-end gap-2"><span class="overflow-x-auto text-[0.8125rem] whitespace-nowrap text-[var(--sl-text-1)]"> </span> <!></dd></div>'),Ba=m('<div class="flex items-stretch gap-2"><input id="alias-rename-input" type="text" placeholder="Device alias (optional)" class="min-w-0 flex-1 rounded-md border border-primary/50 bg-[var(--sl-bg-input)] px-3 text-[24px] leading-[32px] font-medium tracking-[-0.16px] text-[var(--sl-text-1)] focus:border-primary focus:outline-none" aria-label="Device alias"/> <button type="button" data-rename-action="" class="flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-primary text-white transition-all duration-100 hover:opacity-90 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary active:scale-[0.9] active:bg-primary/80 disabled:opacity-50" aria-label="Save alias"><!></button> <button type="button" data-rename-action="" class="flex h-10 w-10 shrink-0 items-center justify-center rounded-md border border-[var(--sl-border)] text-[var(--sl-text-2)] transition-all duration-100 hover:bg-[var(--sl-bg-elevated)] hover:text-[var(--sl-text-1)] focus-visible:outline-2 focus-visible:outline-primary active:scale-[0.9] active:bg-[var(--sl-bg-subtle)]" aria-label="Cancel rename"><!></button></div>'),Aa=m('<div class="flex items-center gap-2"><h1 class="min-w-0 truncate text-[24px] leading-[32px] font-medium tracking-[-0.16px] text-[var(--sl-text-1)]"> </h1> <button type="button" class="flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-[var(--sl-text-3)] transition-all duration-100 hover:bg-[var(--sl-bg-elevated)] hover:text-[var(--sl-text-1)] focus-visible:bg-[var(--sl-bg-elevated)] focus-visible:outline-none active:scale-[0.88] active:bg-[var(--sl-bg-subtle)]" aria-label="Rename device"><!></button> <!></div>'),Fa=m('<div class="mt-6 rounded-lg border border-red-500/30 bg-red-500/5 px-4 py-3 text-[0.8125rem] text-red-700 dark:text-red-400" role="alert">Device not found in paired list.</div>'),Ma=m("<!> <span>Backing upâ¦</span>",1),Na=m("<!> <span>Download</span>",1),Ha=m('<div id="advanced-section" class="mt-3 rounded-xl border border-red-500/20 bg-red-500/5 p-4"><p class="text-[0.8125rem] font-medium text-red-700 dark:text-red-400">Danger zone</p> <div class="mt-3 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between sm:gap-4"><div class="min-w-0 flex-1"><p class="text-[0.875rem] font-medium text-[var(--sl-text-1)]">Deregister device</p> <p class="mt-0.5 text-[0.8125rem] text-[var(--sl-text-2)]">Permanently remove this device from your account. This cannot be undone.</p></div> <button type="button" class="inline-flex h-10 shrink-0 items-center justify-center gap-1.5 rounded-lg border border-red-500/40 bg-red-500/10 px-4 text-[0.8125rem] font-medium text-red-700 transition-all duration-100 hover:bg-red-500/20 focus-visible:outline-2 focus-visible:outline-red-500 active:scale-[0.97] active:bg-red-500/30 disabled:cursor-not-allowed disabled:opacity-60 disabled:active:scale-100 dar
4k:text-red-400"><!> <span>Deregister</span></button></div></div>'),Va=m('<p class="mt-4 text-center text-[0.75rem] text-[var(--sl-text-3)]" aria-live="polite">Loading device detailsâ¦</p>'),Ua=m(`<div class="mx-auto w-full max-w-2xl xl:max-w-3xl"><!> <!> <dl class="mt-6 divide-y divide-[var(--sl-border)] rounded-xl border border-[var(--sl-border)] bg-[var(--sl-bg-surface)]"><!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!></dl> <section class="mt-8" aria-labelledby="actions-heading"><h2 id="actions-heading" class="px-4 text-[1rem] leading-snug font-medium tracking-[-0.01em] text-[var(--sl-text-1)]">Actions</h2> <div class="mt-3 flex flex-col gap-2 rounded-xl border border-[var(--sl-border)] bg-[var(--sl-bg-surface)] p-4 sm:flex-row sm:items-center sm:justify-between sm:gap-4"><div class="min-w-0 flex-1"><p class="text-[0.875rem] font-medium text-[var(--sl-text-1)]">Download backup</p> <p class="mt-0.5 text-[0.8125rem] text-[var(--sl-text-2)]">Save this device's settings as a JSON file you can restore later.</p></div> <button type="button" class="inline-flex h-10 shrink-0 items-center justify-center gap-1.5 rounded-lg border border-[var(--sl-border)] bg-[var(--sl-bg-elevated)] px-4 text-[0.8125rem] font-medium text-[var(--sl-text-1)] transition-all duration-100 hover:bg-[var(--sl-bg-subtle)] focus-visible:outline-2 focus-visible:outline-primary active:scale-[0.97] active:bg-[var(--sl-bg-subtle)] disabled:cursor-not-allowed disabled:opacity-60 disabled:active:scale-100"><!></button></div></section> <section class="mt-8" aria-labelledby="advanced-heading"><button type="button" class="flex w-full items-center justify-between rounded-lg px-4 py-1 text-left transition-all duration-100 focus-visible:outline-2 focus-visible:outline-primary active:scale-[0.995] active:bg-[var(--sl-bg-elevated)]" aria-controls="advanced-section"><span id="advanced-heading" class="text-[1rem] leading-snug font-medium tracking-[-0.01em] text-[var(--sl-text-1)]">Advanced settings</span> <!></button> <!></section> <!></div> <!> <!>`,1);function kr(G,d){ct(d,!0);const D=(t,n=de)=>{var v=Sa(),b=a(v,!0);r(v),j(()=>{gt(v,1,`inline-flex items-center rounded-full px-2 py-[3px] text-[0.6875rem] leading-none font-medium whitespace-nowrap ${se[n().tone]??""}`),F(b,n().label)}),l(t,v)},M=t=>{var n=Ca(),v=s(a(n),2),b=a(v);D(b,()=>e($));var h=s(b,2);{var N=U=>{D(U,()=>e(ee))};k(h,U=>{e(ee)&&U(N)})}r(v),r(n),l(t,n)},q=t=>{var n=Ra(),v=s(a(n),2),b=a(v);{var h=g=>{var w=Ia();Q(2),l(g,w)},N=g=>{var w=La(),K=a(w,!0);r(w),j(()=>{Oe(w,"title",e(ue)??""),F(K,e(Ge)??"â")}),l(g,w)};k(b,g=>{e(L)?g(N,!1):g(h)})}var U=s(b,2);{var Y=g=>{var w=Oa();w.__click=()=>Ee("commit",e(ue));var K=a(w);{var Z=_=>{Xe(_,{size:12,class:"text-emerald-600 dark:text-emerald-400","aria-hidden":"true"})},ae=_=>{dt(_,{size:12,"aria-hidden":"true"})};k(K,_=>{e(J)==="commit"?_(Z):_(ae,!1)})}r(w),l(g,w)};k(U,g=>{e(ue)&&g(Y)})}r(v),r(n),l(t,n)},z=(t,n=de,v=de,b=de)=>{var h=Pa(),N=a(h),U=a(N,!0);r(N);var Y=s(N,2),g=a(Y),w=a(g,!0);r(g);var K=s(g,2);{var Z=ae=>{var _=Ea();_.__click=()=>Ee(b(),v());var oe=a(_);{var Rt=we=>{Xe(we,{size:12,class:"text-emerald-600 dark:text-emerald-400","aria-hidden":"true"})},Et=we=>{dt(we,{size:12,"aria-hidden":"true"})};k(oe,we=>{e(J)===b()?we(Rt):we(Et,!1)})}r(_),j(()=>Oe(_,"aria-label",`Copy ${n()??""}`)),l(ae,_)};k(K,ae=>{v()&&ae(Z)})}r(Y),r(h),j(()=>{F(U,n()),F(w,v()??"â")}),l(t,h)};let i=x(()=>Nt.params.id),S=R(null);vt(()=>{!e(i)||e(S)===e(i)||(o(S,e(i),!0),(async()=>{const t=await $e?.getIdToken();if(!t)return;const n=[];y.onlineStatuses[e(i)]===void 0&&n.push(Gt(e(i),t));const v=y.pairedDevices.find(b=>b.device_id===e(i));(!v||!v.alias)&&n.push((async()=>{const h=(await it.GET("/device/{deviceId}",{params:{path:{deviceId:e(i)}},headers:{Authorization:`Bearer ${t}`}})).data;h&&h.device_id&&(y.pairedDevices=y.pairedDevices.map(N=>N.device_id===h.device_id?{...N,...h}:N),h.alias&&!y.aliases[h.device_id]&&(y.aliases={...y.aliases,[h.device_id]:h.alias}))})()),await Promise.allSettled(n)})())});let p=x(()=>(y.pairedDevices??[]).find(t=>t.device_id===e(i))??null),C=x(()=>y.pairedDevicesLoaded&&!e(p)),O=x(()=>ra(e(i),e(p)?.alias)),E=R(!1),c=R(""),u=R(""),f=R(!1),I=R(null);function H(){if(!e(i))return;const t=y.aliases[e(i)];o(u,t&&t.trim()?t:e(p)?.alias??"",!0),o(c,e(u),!0),o(E,!0),requestAnimationFrame(()=>{setTimeout(()=>{e(I)?.focus(),e(I)?.select()},30)})}function P(){o(E,!1),o(c,e(u),!0)}async function re(){if(!e(i))return;const t=e(c).trim();if(t===e(u).trim()){o(E,!1);return}o(E,!1),o(f,!0);try{const n=await $e?.getIdToken();if(!n)throw new Error("Not authenticated");const v=t?{alias:t}:{alias:null},b=await it.PATCH("/device/{deviceId}",{params:{path:{deviceId:e(i)}},body:v,headers:{Authorization:`Bearer ${n}`}});if(b.error){const h=b.error,N=typeof h=="object"&&h!==null&&h.detail||"Unknown error";throw new Error(N)}y.updateAlias(e(i),t||null),t?Ye.success(`Renamed to "${t}"`):Ye.success("Alias cleared")}catch(n){console.error("Rename failed",n),Ye.error(n.message||"Failed to rename device")}finally{o(f,!1)}}let V=x(()=>e(i)?y.onlineStatuses[e(i)]:void 0),ce=x(()=>e(i)?y.offroadStatuses[e(i)]:void 0),ge=x(()=>e(i)?y.deviceTelemetry[e(i)]:void 0),_e=x(()=>e(i)?y.deviceValues[e(i)]:void 0),Se=x(()=>!!e(V)&&e(V)!=="loading"&&(!!e(ge)||e(V)!=="online")),L=x(()=>!!e(i)&&(y.infoFetchComplete[e(i)]===!0||e(V)==="offline"||e(V)==="error")),X=x(()=>aa(e(ge)?.deviceType)),Ce=x(()=>{const t=e(ge)?.networkType;return!t||t==="unknown"?null:{wifi:"WiFi",cellular:"Cellular",ethernet:"Ethernet"}[t.toLowerCase()]??t}),ve=x(()=>e(_e)?.Version??null),Ue=x(()=>e(_e)?.GitBranch??null),ue=x(()=>e(_e)?.GitCommit??null),Ge=x(()=>e(ue)?e(ue).slice(0,7):null),Re=x(()=>{const t=e(_e)?.GitCommitDate;if(!t)return null;const v=t.replace(/^'|'$/g,"").trim().split(/\s+/)[0],b=Number(v);return!Number.isFinite(b)||b<=0?null:b*1e3}),B=x(()=>e(Re)?(st.tickCounter,nt(e(Re))):null),ie=x(()=>e(i)?e(V)==="online"?y.lastStatusCheck[e(i)]:y.lastSeenOnline[e(i)]:null),$=x(()=>
4!e(V)||e(V)==="loading"?{label:"Checkingâ¦",tone:"gray"}:e(V)==="error"?{label:"Error",tone:"red"}:e(V)==="offline"?{label:"Offline",tone:"red"}:{label:"Online",tone:"green"}),ee=x(()=>e(V)!=="online"?null:e(ce)?.forceOffroad?{label:"Always Offroad",tone:"amber"}:e(ce)?.isOffroad===!1?{label:"Onroad",tone:"cyan"}:e(ce)?.isOffroad===!0?{label:"Offroad",tone:"gray"}:null);const se={green:"bg-emerald-500/10 text-emerald-700 ring-1 ring-inset ring-emerald-500/30 dark:text-emerald-400",red:"bg-red-500/10 text-red-700 ring-1 ring-inset ring-red-500/30 dark:text-red-400",amber:"bg-amber-500/10 text-amber-700 ring-1 ring-inset ring-amber-500/30 dark:text-amber-400",cyan:"bg-cyan-500/10 text-cyan-700 ring-1 ring-inset ring-cyan-500/30 dark:text-cyan-400",gray:"bg-[var(--sl-bg-elevated)] text-[var(--sl-text-2)] ring-1 ring-inset ring-[var(--sl-border)]"};let me=x(()=>{if(!e(p)?.created_at)return null;const t=typeof e(p).created_at=="number"?e(p).created_at*1e3:e(p).created_at;try{return new Date(t).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})}catch{return String(e(p).created_at)}}),J=R(null);async function Ee(t,n){if(n)try{await navigator.clipboard.writeText(n),o(J,t,!0),setTimeout(()=>{e(J)===t&&o(J,null)},2e3)}catch{}}let ne=R(!1),he=R(!1);async function Te(t=!1){e(i)&&await Kt(e(i),t)}function qe(){o(he,!0)}var ye=Ua(),fe=A(ye),je=a(fe);ya(je,{backHref:"/dashboard",backLabel:"Home",titleSnippet:n=>{var v=xe(),b=A(v);{var h=U=>{var Y=Ba(),g=a(Y);Ve(g),g.__keydown=_=>{_.key==="Enter"?(_.preventDefault(),re()):_.key==="Escape"&&(_.preventDefault(),P())},ht(g,_=>o(I,_),()=>e(I));var w=s(g,2);w.__click=()=>void re();var K=a(w);Xe(K,{size:16}),r(w);var Z=s(w,2);Z.__click=P;var ae=a(Z);yt(ae,{size:16}),r(Z),r(Y),j(()=>{w.disabled=e(f),Z.disabled=e(f)}),Qe("blur",g,_=>{const oe=_.relatedTarget;oe&&oe.closest("[data-rename-action]")||P()}),_t(g,()=>e(c),_=>o(c,_)),l(U,Y)},N=U=>{var Y=Aa(),g=a(Y),w=a(g,!0);r(g);var K=s(g,2);K.__click=H;var Z=a(K);na(Z,{size:14}),r(K);var ae=s(K,2);{var _=oe=>{et(oe,{size:14,class:"shrink-0 animate-spin text-[var(--sl-text-3)]","aria-label":"Saving alias"})};k(ae,oe=>{e(f)&&oe(_)})}r(Y),j(()=>{F(w,e(O)),K.disabled=e(f)}),l(U,Y)};k(b,U=>{e(E)?U(h):U(N,!1)})}l(n,v)}});var ze=s(je,2);{var Pe=t=>{var n=Fa();l(t,n)};k(ze,t=>{e(C)&&t(Pe)})}var pe=s(ze,2),ke=a(pe);M(ke);var Be=s(ke,2);De(Be,()=>"Device type",()=>e(X),()=>!1,()=>e(Se));var le=s(Be,2);De(le,()=>"Network",()=>e(Ce),()=>!1,()=>e(Se));var Ie=s(le,2);{let t=x(()=>e(ie)?(st.tickCounter,nt(e(ie))):null);De(Ie,()=>"Last seen",()=>e(t),()=>!1,()=>e(Se))}var Ae=s(Ie,2);De(Ae,()=>"Paired date",()=>e(me));var be=s(Ae,2);De(be,()=>"Version",()=>e(ve),()=>!1,()=>e(L));var Fe=s(be,2);De(Fe,()=>"Date",()=>e(B),()=>!1,()=>e(L));var Me=s(Fe,2);ka(Me,()=>"Branch",()=>e(Ue),()=>e(L));var Ne=s(Me,2);q(Ne);var T=s(Ne,2);z(T,()=>"sunnylink Device ID",()=>e(i)??null,()=>"sunnylink");var W=s(T,2);z(W,()=>"comma Dongle ID",()=>e(p)?.comma_dongle_id??null,()=>"dongle"),r(pe);var te=s(pe,2),tt=s(a(te),2),He=s(a(tt),2);He.__click=()=>Te(!1);var wt=a(He);{var Dt=t=>{var n=Ma(),v=A(n);et(v,{size:14,class:"animate-spin","aria-hidden":"true"}),Q(2),l(t,n)},St=t=>{var n=Na(),v=A(n);sa(v,{size:14,"aria-hidden":"true"}),Q(2),l(t,n)};k(wt,t=>{y.backupState.isDownloading&&y.backupState.deviceId===e(i)?t(Dt):t(St,!1)})}r(He),r(tt),r(te);var Ke=s(te,2),Le=a(Ke);Le.__click=()=>o(ne,!e(ne));var Ct=s(a(Le),2);{let t=x(()=>e(ne)?"rotate-180":"");ia(Ct,{size:16,get class(){return`shrink-0 text-[var(--sl-text-3)] transition-transform duration-150 ${e(t)??""}`},"aria-hidden":"true"})}r(Le);var Tt=s(Le,2);{var jt=t=>{var n=Ha(),v=s(a(n),2),b=s(a(v),2);b.__click=qe;var h=a(b);kt(h,{size:14,"aria-hidden":"true"}),Q(2),r(b),r(v),r(n),j(()=>b.disabled=!e(i)||!e(p)),Ze(3,n,()=>Mt,()=>({duration:180})),l(t,n)};k(Tt,t=>{e(ne)&&t(jt)})}r(Ke);var zt=s(Ke,2);{var It=t=>{var n=Va();l(t,n)};k(zt,t=>{!y.pairedDevicesLoaded&&!e(p)&&t(It)})}r(fe);var at=s(fe,2);qt(at,{get onRetry(){return Xt},onFullBackup:()=>{y.backupState.deviceId&&Te(!0)}});var Lt=s(at,2);{var Ot=t=>{{let n=x(()=>y.onlineStatuses[e(i)]==="online");ba(t,{get deviceId(){return e(i)},get alias(){return e(O)},get pairedAt(){return e(p).created_at},get isOnline(){return e(n)},onDeregistered:()=>Ht("/dashboard/devices"),get open(){return e(he)},set open(v){o(he,v,!0)}})}};k(Lt,t=>{e(i)&&e(p)&&t(Ot)})}j(()=>{He.disabled=!e(i)||y.backupState.isDownloading,Oe(Le,"aria-expanded",e(ne))}),l(G,ye),ut()}mt(["click","keydown"]);export{kr as component,yr as universal};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.