livedesk 0.1.619 → 0.1.621
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/hub/src/server.js +26 -18
- package/hub/src/settings/settings-schema.js +13 -8
- package/hub/src/settings/settings-store.js +16 -6
- package/package.json +1 -1
- package/web/dist/app.webmanifest +1 -1
- package/web/dist/assets/LiveDeskApp-DIq0K1le.js +179 -0
- package/web/dist/assets/{index-7sOb6udB.js → index-DCjdwnVX.js} +2 -2
- package/web/dist/assets/{index-D7YfukrQ.css → index-Dp70stjV.css} +1 -1
- package/web/dist/index.html +2 -2
- package/web/dist/livedesk-build-evidence.json +20 -20
- package/web/dist/sw.js +1 -1
- package/web/dist/assets/LiveDeskApp-BNIX6XXG.js +0 -179
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LiveDeskApp-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LiveDeskApp-DIq0K1le.js","assets/icons-GaObu1Hf.js","assets/supabase-C7qjtLN3.js","assets/react-BF-iFH2F.js","assets/LiveDeskApp-ChGXEkMA.css"])))=>i.map(i=>d[i]);
|
|
2
2
|
import{r as Ov,a as jn,A as Ut,M as Uv,C as Cd,S as _v,E as Bd,b as Sf,c as Wd,L as Mf,T as Nf,d as ku,e as $d,f as $u,W as Hv,R as Cv,g as Bv,D as Dt,N as Fd,h as qv,i as Rv,j as qd,k as wv,G as Id,l as Yv}from"./icons-GaObu1Hf.js";import{r as Gv}from"./react-BF-iFH2F.js";(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const T of document.querySelectorAll('link[rel="modulepreload"]'))s(T);new MutationObserver(T=>{for(const E of T)if(E.type==="childList")for(const A of E.addedNodes)A.tagName==="LINK"&&A.rel==="modulepreload"&&s(A)}).observe(document,{childList:!0,subtree:!0});function v(T){const E={};return T.integrity&&(E.integrity=T.integrity),T.referrerPolicy&&(E.referrerPolicy=T.referrerPolicy),T.crossOrigin==="use-credentials"?E.credentials="include":T.crossOrigin==="anonymous"?E.credentials="omit":E.credentials="same-origin",E}function s(T){if(T.ep)return;T.ep=!0;const E=v(T);fetch(T.href,E)}})();const Lv="modulepreload",Xv=function(d){return"/"+d},Rd={},Qv=function(r,v,s){let T=Promise.resolve();if(v&&v.length>0){let C=function(w){return Promise.all(w.map(ll=>Promise.resolve(ll).then(D=>({status:"fulfilled",value:D}),D=>({status:"rejected",reason:D}))))};document.getElementsByTagName("link");const A=document.querySelector("meta[property=csp-nonce]"),H=A?.nonce||A?.getAttribute("nonce");T=C(v.map(w=>{if(w=Xv(w),w in Rd)return;Rd[w]=!0;const ll=w.endsWith(".css"),D=ll?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${w}"]${D}`))return;const K=document.createElement("link");if(K.rel=ll?"stylesheet":Lv,ll||(K.as="script"),K.crossOrigin="",K.href=w,H&&K.setAttribute("nonce",H),document.head.appendChild(K),ll)return new Promise((Zl,Cl)=>{K.addEventListener("load",Zl),K.addEventListener("error",()=>Cl(new Error(`Unable to preload CSS for ${w}`)))})}))}function E(A){const H=new Event("vite:preloadError",{cancelable:!0});if(H.payload=A,window.dispatchEvent(H),!H.defaultPrevented)throw A}return T.then(A=>{for(const H of A||[])H.status==="rejected"&&E(H.reason);return r().catch(E)})};var bf={exports:{}},Sn={};var wd;function Vv(){if(wd)return Sn;wd=1;var d=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function v(s,T,E){var A=null;if(E!==void 0&&(A=""+E),T.key!==void 0&&(A=""+T.key),"key"in T){E={};for(var H in T)H!=="key"&&(E[H]=T[H])}else E=T;return T=E.ref,{$$typeof:d,type:s,key:A,ref:T!==void 0?T:null,props:E}}return Sn.Fragment=r,Sn.jsx=v,Sn.jsxs=v,Sn}var Yd;function Zv(){return Yd||(Yd=1,bf.exports=Vv()),bf.exports}var c=Zv(),pf={exports:{}},bn={},xf={exports:{}},jf={};var Gd;function Kv(){return Gd||(Gd=1,(function(d){function r(j,M){var B=j.length;j.push(M);l:for(;0<B;){var tl=B-1>>>1,al=j[tl];if(0<T(al,M))j[tl]=M,j[B]=al,B=tl;else break l}}function v(j){return j.length===0?null:j[0]}function s(j){if(j.length===0)return null;var M=j[0],B=j.pop();if(B!==M){j[0]=B;l:for(var tl=0,al=j.length,El=al>>>1;tl<El;){var cl=2*(tl+1)-1,k=j[cl],gl=cl+1,re=j[gl];if(0>T(k,B))gl<al&&0>T(re,k)?(j[tl]=re,j[gl]=B,tl=gl):(j[tl]=k,j[cl]=B,tl=cl);else if(gl<al&&0>T(re,B))j[tl]=re,j[gl]=B,tl=gl;else break l}}return M}function T(j,M){var B=j.sortIndex-M.sortIndex;return B!==0?B:j.id-M.id}if(d.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var E=performance;d.unstable_now=function(){return E.now()}}else{var A=Date,H=A.now();d.unstable_now=function(){return A.now()-H}}var C=[],w=[],ll=1,D=null,K=3,Zl=!1,Cl=!1,Kl=!1,Ht=!1,Ct=typeof setTimeout=="function"?setTimeout:null,za=typeof clearTimeout=="function"?clearTimeout:null,Jl=typeof setImmediate<"u"?setImmediate:null;function qe(j){for(var M=v(w);M!==null;){if(M.callback===null)s(w);else if(M.startTime<=j)s(w),M.sortIndex=M.expirationTime,r(C,M);else break;M=v(w)}}function st(j){if(Kl=!1,qe(j),!Cl)if(v(C)!==null)Cl=!0,oe||(oe=!0,kl());else{var M=v(w);M!==null&&ge(st,M.startTime-j)}}var oe=!1,ye=-1,ue=5,Bt=-1;function An(){return Ht?!0:!(d.unstable_now()-Bt<ue)}function qt(){if(Ht=!1,oe){var j=d.unstable_now();Bt=j;var M=!0;try{l:{Cl=!1,Kl&&(Kl=!1,za(ye),ye=-1),Zl=!0;var B=K;try{e:{for(qe(j),D=v(C);D!==null&&!(D.expirationTime>j&&An());){var tl=D.callback;if(typeof tl=="function"){D.callback=null,K=D.priorityLevel;var al=tl(D.expirationTime<=j);if(j=d.unstable_now(),typeof al=="function"){D.callback=al,qe(j),M=!0;break e}D===v(C)&&s(C),qe(j)}else s(C);D=v(C)}if(D!==null)M=!0;else{var El=v(w);El!==null&&ge(st,El.startTime-j),M=!1}}break l}finally{D=null,K=B,Zl=!1}M=void 0}}finally{M?kl():oe=!1}}}var kl;if(typeof Jl=="function")kl=function(){Jl(qt)};else if(typeof MessageChannel<"u"){var Mn=new MessageChannel,Ta=Mn.port2;Mn.port1.onmessage=qt,kl=function(){Ta.postMessage(null)}}else kl=function(){Ct(qt,0)};function ge(j,M){ye=Ct(function(){j(d.unstable_now())},M)}d.unstable_IdlePriority=5,d.unstable_ImmediatePriority=1,d.unstable_LowPriority=4,d.unstable_NormalPriority=3,d.unstable_Profiling=null,d.unstable_UserBlockingPriority=2,d.unstable_cancelCallback=function(j){j.callback=null},d.unstable_forceFrameRate=function(j){0>j||125<j?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):ue=0<j?Math.floor(1e3/j):5},d.unstable_getCurrentPriorityLevel=function(){return K},d.unstable_next=function(j){switch(K){case 1:case 2:case 3:var M=3;break;default:M=K}var B=K;K=M;try{return j()}finally{K=B}},d.unstable_requestPaint=function(){Ht=!0},d.unstable_runWithPriority=function(j,M){switch(j){case 1:case 2:case 3:case 4:case 5:break;default:j=3}var B=K;K=j;try{return M()}finally{K=B}},d.unstable_scheduleCallback=function(j,M,B){var tl=d.unstable_now();switch(typeof B=="object"&&B!==null?(B=B.delay,B=typeof B=="number"&&0<B?tl+B:tl):B=tl,j){case 1:var al=-1;break;case 2:al=250;break;case 5:al=1073741823;break;case 4:al=1e4;break;default:al=5e3}return al=B+al,j={id:ll++,callback:M,priorityLevel:j,startTime:B,expirationTime:al,sortIndex:-1},B>tl?(j.sortIndex=B,r(w,j),v(C)===null&&j===v(w)&&(Kl?(za(ye),ye=-1):Kl=!0,ge(st,B-tl))):(j.sortIndex=al,r(C,j),Cl||Zl||(Cl=!0,oe||(oe=!0,kl()))),j},d.unstable_shouldYield=An,d.unstable_wrapCallback=function(j){var M=K;return function(){var B=K;K=M;try{return j.apply(this,arguments)}finally{K=B}}}})(jf)),jf}var Ld;function Jv(){return Ld||(Ld=1,xf.exports=Kv()),xf.exports}var Xd;function kv(){if(Xd)return bn;Xd=1;var d=Jv(),r=Ov(),v=Gv();function s(l){var e="https://react.dev/errors/"+l;if(1<arguments.length){e+="?args[]="+encodeURIComponent(arguments[1]);for(var t=2;t<arguments.length;t++)e+="&args[]="+encodeURIComponent(arguments[t])}return"Minified React error #"+l+"; visit "+e+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function T(l){return!(!l||l.nodeType!==1&&l.nodeType!==9&&l.nodeType!==11)}function E(l){var e=l,t=l;if(l.alternate)for(;e.return;)e=e.return;else{l=e;do e=l,(e.flags&4098)!==0&&(t=e.return),l=e.return;while(l)}return e.tag===3?t:null}function A(l){if(l.tag===13){var e=l.memoizedState;if(e===null&&(l=l.alternate,l!==null&&(e=l.memoizedState)),e!==null)return e.dehydrated}return null}function H(l){if(l.tag===31){var e=l.memoizedState;if(e===null&&(l=l.alternate,l!==null&&(e=l.memoizedState)),e!==null)return e.dehydrated}return null}function C(l){if(E(l)!==l)throw Error(s(188))}function w(l){var e=l.alternate;if(!e){if(e=E(l),e===null)throw Error(s(188));return e!==l?null:l}for(var t=l,a=e;;){var n=t.return;if(n===null)break;var u=n.alternate;if(u===null){if(a=n.return,a!==null){t=a;continue}break}if(n.child===u.child){for(u=n.child;u;){if(u===t)return C(n),l;if(u===a)return C(n),e;u=u.sibling}throw Error(s(188))}if(t.return!==a.return)t=n,a=u;else{for(var i=!1,f=n.child;f;){if(f===t){i=!0,t=n,a=u;break}if(f===a){i=!0,a=n,t=u;break}f=f.sibling}if(!i){for(f=u.child;f;){if(f===t){i=!0,t=u,a=n;break}if(f===a){i=!0,a=u,t=n;break}f=f.sibling}if(!i)throw Error(s(189))}}if(t.alternate!==a)throw Error(s(190))}if(t.tag!==3)throw Error(s(188));return t.stateNode.current===t?l:e}function ll(l){var e=l.tag;if(e===5||e===26||e===27||e===6)return l;for(l=l.child;l!==null;){if(e=ll(l),e!==null)return e;l=l.sibling}return null}var D=Object.assign,K=Symbol.for("react.element"),Zl=Symbol.for("react.transitional.element"),Cl=Symbol.for("react.portal"),Kl=Symbol.for("react.fragment"),Ht=Symbol.for("react.strict_mode"),Ct=Symbol.for("react.profiler"),za=Symbol.for("react.consumer"),Jl=Symbol.for("react.context"),qe=Symbol.for("react.forward_ref"),st=Symbol.for("react.suspense"),oe=Symbol.for("react.suspense_list"),ye=Symbol.for("react.memo"),ue=Symbol.for("react.lazy"),Bt=Symbol.for("react.activity"),An=Symbol.for("react.memo_cache_sentinel"),qt=Symbol.iterator;function kl(l){return l===null||typeof l!="object"?null:(l=qt&&l[qt]||l["@@iterator"],typeof l=="function"?l:null)}var Mn=Symbol.for("react.client.reference");function Ta(l){if(l==null)return null;if(typeof l=="function")return l.$$typeof===Mn?null:l.displayName||l.name||null;if(typeof l=="string")return l;switch(l){case Kl:return"Fragment";case Ct:return"Profiler";case Ht:return"StrictMode";case st:return"Suspense";case oe:return"SuspenseList";case Bt:return"Activity"}if(typeof l=="object")switch(l.$$typeof){case Cl:return"Portal";case Jl:return l.displayName||"Context";case za:return(l._context.displayName||"Context")+".Consumer";case qe:var e=l.render;return l=l.displayName,l||(l=e.displayName||e.name||"",l=l!==""?"ForwardRef("+l+")":"ForwardRef"),l;case ye:return e=l.displayName||null,e!==null?e:Ta(l.type)||"Memo";case ue:e=l._payload,l=l._init;try{return Ta(l(e))}catch{}}return null}var ge=Array.isArray,j=r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,M=v.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,B={pending:!1,data:null,method:null,action:null},tl=[],al=-1;function El(l){return{current:l}}function cl(l){0>al||(l.current=tl[al],tl[al]=null,al--)}function k(l,e){al++,tl[al]=l.current,l.current=e}var gl=El(null),re=El(null),Re=El(null),Nn=El(null);function Dn(l,e){switch(k(Re,e),k(re,l),k(gl,null),e.nodeType){case 9:case 11:l=(l=e.documentElement)&&(l=l.namespaceURI)?ad(l):0;break;default:if(l=e.tagName,e=e.namespaceURI)e=ad(e),l=nd(e,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}cl(gl),k(gl,l)}function Rt(){cl(gl),cl(re),cl(Re)}function Iu(l){l.memoizedState!==null&&k(Nn,l);var e=gl.current,t=nd(e,l.type);e!==t&&(k(re,l),k(gl,t))}function On(l){re.current===l&&(cl(gl),cl(re)),Nn.current===l&&(cl(Nn),mn._currentValue=B)}var Pu,_f;function ot(l){if(Pu===void 0)try{throw Error()}catch(t){var e=t.stack.trim().match(/\n( *(at )?)/);Pu=e&&e[1]||"",_f=-1<t.stack.indexOf(`
|
|
3
3
|
at`)?" (<anonymous>)":-1<t.stack.indexOf("@")?"@unknown:0:0":""}return`
|
|
4
4
|
`+Pu+l+_f}var li=!1;function ei(l,e){if(!l||li)return"";li=!0;var t=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var a={DetermineComponentFrameRoot:function(){try{if(e){var z=function(){throw Error()};if(Object.defineProperty(z.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(z,[])}catch(b){var S=b}Reflect.construct(l,[],z)}else{try{z.call()}catch(b){S=b}l.call(z.prototype)}}else{try{throw Error()}catch(b){S=b}(z=l())&&typeof z.catch=="function"&&z.catch(function(){})}}catch(b){if(b&&S&&typeof b.stack=="string")return[b.stack,S.stack]}return[null,null]}};a.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var n=Object.getOwnPropertyDescriptor(a.DetermineComponentFrameRoot,"name");n&&n.configurable&&Object.defineProperty(a.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=a.DetermineComponentFrameRoot(),i=u[0],f=u[1];if(i&&f){var o=i.split(`
|
|
@@ -11,4 +11,4 @@ Error generating stack: `+a.message+`
|
|
|
11
11
|
${this.session.accessToken}`:"",s=r?`${r.user.id}
|
|
12
12
|
${r.accessToken}`:"";this.session=r,v!==s&&this.disconnect("console-session-replaced")}preferRelay(){this.relayPreferred=!0}markDirectReachable(){this.relayPreferred=!1}resume(){this.session&&this.disconnect("console-resume")}shouldUseRelay(){return this.relayPreferred&&!!this.session?.accessToken}disconnect(r){const v=this.connectOwner;this.connectOwner=null,this.connectGeneration+=1,this.ready=!1,this.connectPromise=null;const s=this.socket;this.socket=null,v?.reject(new Error(r));try{s?.close(1e3,r)}catch{}this.failPending(new Error(r)),this.closeChannels(1006,r)}failPending(r){for(const[v,s]of this.pendingHttp)window.clearTimeout(s.timeout),s.detachAbort(),s.reject(r),this.pendingHttp.delete(v)}closeChannels(r,v){for(const s of[...this.channels.values()])s.relayClosed(r,v);this.channels.clear()}handleTextMessage(r){let v;try{v=JSON.parse(r)}catch{return}if(v.type==="relay-ready"&&v.role==="console"){this.ready=!0;return}if(v.type==="hub-offline"){this.closeChannels(1012,"hub-offline");return}const s=String(v.channelId||"");if(!s)return;const T=this.pendingHttp.get(s);if(v.type==="http-response"&&T){this.pendingHttp.delete(s),window.clearTimeout(T.timeout),T.detachAbort();const E=Number(v.status||502),A=v.bodyBase64?uy(v.bodyBase64):new TextEncoder().encode(JSON.stringify({ok:!1,error:v.error||"console-relay-failed"}));T.resolve(new Response(A,{status:E,statusText:String(v.statusText||""),headers:v.headers||{"content-type":"application/json"}}));return}if(v.type==="relay-error"&&T){this.pendingHttp.delete(s),window.clearTimeout(T.timeout),T.detachAbort(),T.reject(new Error(v.error||"console-relay-failed"));return}this.channels.get(s)?.relayMessage(v)}handleBinaryMessage(r){if(r.byteLength<zf)return;const v=new TextDecoder().decode(new Uint8Array(r,0,zf));if(v[0]!=="B")return;const s=v.slice(37,73);this.channels.get(s)?.relayBinary(r.slice(zf))}async connect(){if(this.socket?.readyState===WebSocket.OPEN&&this.ready)return;if(this.connectPromise)return this.connectPromise;const r=String(this.session?.accessToken||"");if(!r)throw new Error("Sign in before using the mobile Console relay.");const v=++this.connectGeneration,s=Pv();this.connectOwner=s,this.connectPromise=s.promise.finally(()=>{this.connectOwner===s&&(this.connectOwner=null),v===this.connectGeneration&&(this.connectPromise=null)});try{const T=new WebSocket(ay(),[Pd,`${ey}${r}`]);T.binaryType="arraybuffer",this.socket=T;const E=window.setTimeout(()=>{if(!s.settled){try{T.close(1e3,"console-relay-connect-timeout")}catch{}s.reject(new Error("Mobile Console relay connection timed out."))}},ty);s.bindTimeout(E),T.addEventListener("message",A=>{if(!(v!==this.connectGeneration||this.socket!==T))if(typeof A.data=="string"){this.handleTextMessage(A.data);let H=null;try{H=JSON.parse(A.data)}catch{H=null}!s.settled&&H?.type==="relay-ready"&&H.role==="console"&&s.resolve()}else A.data instanceof ArrayBuffer&&this.handleBinaryMessage(A.data)}),T.addEventListener("error",()=>{s.reject(new Error("Mobile Console relay connection failed."))}),T.addEventListener("close",A=>{v!==this.connectGeneration||this.socket!==T||(this.socket=null,this.ready=!1,this.connectPromise=null,this.failPending(new Error(`Mobile Console relay closed (${A.code}).`)),this.closeChannels(A.code||1006,A.reason||"console-relay-closed"),s.reject(new Error(`Mobile Console relay closed (${A.code}).`)))})}catch(T){s.reject(T)}return this.connectPromise}send(r){if(!this.socket||this.socket.readyState!==WebSocket.OPEN||!this.ready)throw new Error("Mobile Console relay is not connected.");this.socket.send(JSON.stringify(r))}async fetch(r,v,s){await this.connect();const T=crypto.randomUUID(),E=await iy(v?.body),A=new Promise((H,C)=>{const w=()=>{const D=this.pendingHttp.get(T);D&&(this.pendingHttp.delete(T),window.clearTimeout(D.timeout),C(v?.signal?.reason instanceof Error?v.signal.reason:new Error("Mobile Console request cancelled.")))};v?.signal?.addEventListener("abort",w,{once:!0});const ll=window.setTimeout(()=>{const D=this.pendingHttp.get(T);D&&(this.pendingHttp.delete(T),D.detachAbort(),C(new Error("Mobile Console request timed out.")))},s);this.pendingHttp.set(T,{resolve:H,reject:C,timeout:ll,detachAbort:()=>v?.signal?.removeEventListener("abort",w)})});try{this.send({type:"http-request",channelId:T,method:String(v?.method||"GET").toUpperCase(),path:r,headers:cy(v),bodyBase64:E.byteLength>0?ny(E):""})}catch(H){const C=this.pendingHttp.get(T);C&&(this.pendingHttp.delete(T),window.clearTimeout(C.timeout),C.detachAbort(),C.reject(H instanceof Error?H:new Error(String(H))))}return A}openWebSocket(r){const v=new sy(this,r);return this.channels.set(v.channelId,v),this.connect().then(()=>{this.channels.get(v.channelId)===v&&this.send({type:"ws-open",channelId:v.channelId,path:r})}).catch(s=>v.relayError(s instanceof Error?s.message:String(s))),v}removeChannel(r){this.channels.delete(r)}bufferedAmount(){return Number(this.socket?.bufferedAmount||0)}}class sy extends EventTarget{constructor(r,v){super(),this.relay=r,this.url=v}relay;channelId=crypto.randomUUID();url;protocol=Pd;extensions="";binaryType="blob";readyState=WebSocket.CONNECTING;onopen=null;onmessage=null;onerror=null;onclose=null;get bufferedAmount(){return this.relay.bufferedAmount()}emit(r,v){(r==="open"?this.onopen:this.onerror)?.call(this,v),this.dispatchEvent(v)}emitMessage(r){const v=new MessageEvent("message",{data:r});this.onmessage?.call(this,v),this.dispatchEvent(v)}emitClose(r,v){if(this.readyState===WebSocket.CLOSED)return;this.readyState=WebSocket.CLOSED,this.relay.removeChannel(this.channelId);const s=new CloseEvent("close",{code:r,reason:v,wasClean:r===1e3});this.onclose?.call(this,s),this.dispatchEvent(s)}send(r){if(this.readyState!==WebSocket.OPEN)throw new DOMException("WebSocket is not open.","InvalidStateError");if(typeof r!="string")throw new DOMException("Mobile Console input messages must be text.","NotSupportedError");this.relay.send({type:"ws-send",channelId:this.channelId,data:r})}close(r=1e3,v=""){if(this.readyState===WebSocket.CLOSED||this.readyState===WebSocket.CLOSING)return;const s=this.readyState===WebSocket.OPEN;if(this.readyState=WebSocket.CLOSING,s)try{this.relay.send({type:"ws-close",channelId:this.channelId,code:r,reason:v})}catch{}this.emitClose(r,v)}relayMessage(r){if(r.type==="ws-opened"){if(this.readyState!==WebSocket.CONNECTING)return;this.readyState=WebSocket.OPEN,this.emit("open",new Event("open"))}else r.type==="ws-message"?this.emitMessage(String(r.data||"")):r.type==="ws-error"||r.type==="relay-error"?this.relayError(r.error||"console-websocket-error"):r.type==="ws-closed"&&this.emitClose(Number(r.code||1e3),String(r.reason||""))}relayBinary(r){this.emitMessage(this.binaryType==="arraybuffer"?r:new Blob([r]))}relayError(r){this.readyState!==WebSocket.CLOSED&&(this.emit("error",new Event("error")),this.emitClose(1011,"console-websocket-error"))}relayClosed(r,v){this.emitClose(r,v)}}const _t=new fy;function oy(d){_t.configure(d)}function ry(){_t.markDirectReachable()}function Ky(){_t.resume()}function Zd(d,r,v){return _t.preferRelay(),_t.fetch(d,r,v)}function Jy(d,r){return _t.shouldUseRelay()?_t.openWebSocket(r):new WebSocket(d)}const pn=5179,zn=Tn(`http://127.0.0.1:${pn}`);function dy(d){const r=d.split(".").map(v=>Number(v));return r.length===4&&r.every(v=>Number.isInteger(v)&&v>=0&&v<=255)?r:[]}function lh(d){const r=d.trim().toLowerCase();return r==="localhost"||r==="127.0.0.1"||r==="::1"||r==="[::1]"}function hy(d){const r=d.trim().toLowerCase();return!r||r==="0.0.0.0"||r==="::"||r==="[::]"}function eh(d){const r=dy(d);return r.length===0?!1:r[0]===10||r[0]===172&&r[1]>=16&&r[1]<=31||r[0]===192&&r[1]===168}function my(d){return d.includes(":")&&!d.startsWith("[")?`[${d}]`:d}function vy(d){const r=String(d||"").trim();if(!r)return null;const v=/^[a-z][a-z\d+.-]*:\/\//i.test(r)?r:`tcp://${r}`;try{const s=new URL(v),T=s.hostname.replace(/^\[|\]$/g,""),E=Number(s.port);return!T||!Number.isInteger(E)||E<1||E>65535||hy(T)?null:{host:T,port:E}}catch{return null}}function Tn(d){const r=String(d||"").trim()||`http://127.0.0.1:${pn}`,v=/^[a-z][a-z\d+.-]*:\/\//i.test(r)?r:`http://${r}`;try{const s=new URL(v);return s.port||(s.port=String(pn)),s.hash="",s.search="",s.toString().replace(/\/+$/,"")}catch{return`http://127.0.0.1:${pn}`}}function yy(d){const r=vy(d);return r?Tn(`http://${my(r.host)}:${pn}`):""}function ky(d){const v=[d?.endpoint,...Array.isArray(d?.endpoint_candidates)?d.endpoint_candidates:[]].map(s=>yy(String(s||""))).filter(Boolean);return[...new Set(v)]}function gy(d=zn){if(!(typeof window>"u"||window.location.protocol!=="https:"))try{const r=new URL(d);if(r.protocol!=="http:")return;if(lh(r.hostname))return"loopback";if(eh(r.hostname))return"local"}catch{return}}function Wy(d,r=zn){const v=new URL(d,Tn(r));return v.protocol=v.protocol==="https:"?"wss:":"ws:",v.toString()}let xn=null,Kd="";const ja=new Map,Wu=new Map;function $y(d){const r=d?.accessToken&&d?.refreshToken&&d?.user?.id?d:null,v=r?`${r.user.id}
|
|
13
13
|
${r.accessToken}
|
|
14
|
-
${r.expiresAt||0}`:"";v!==Kd&&(ja.clear(),Wu.clear(),Kd=v),xn=r,oy(r?{accessToken:r.accessToken,user:{id:r.user.id}}:null)}function Sy(){if(typeof window>"u"||window.location.protocol!=="https:")return!1;const d=window.location.hostname.replace(/^\[|\]$/g,"");return!lh(d)&&!eh(d)}function Tf(d){const r=d.split("?")[0];return r==="/api/health"||r==="/api/runtime/status"||r==="/api/auth/status"||r==="/api/auth/session"}async function Df(d,r,v,s,T){const E=gy(v);return E&&(r.targetAddressSpace=E),Iv(T,s,async A=>{r.signal=A;try{return await fetch(`${v}${d}`,r)}catch(H){throw!A.aborted&&E?new Error("VuvoDesk Hub is not reachable at this local network address. If Chrome shows a local network prompt, allow it; otherwise restart the Hub so port 5179 is open on the network."):H}})}async function Jd(d,r=!1){const v=ja.get(d);if(!r&&v&&v.expiresAt>Date.now()+3e4)return;r&&ja.delete(d);const s=Wu.get(d);if(s)return s;const T=xn;if(!T)return;const E=(async()=>{const A=await Df("/api/auth/session",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accessToken:T.accessToken,refreshToken:T.refreshToken,expiresAt:T.expiresAt,user:T.user}),credentials:"include",cache:"no-store"},d,Fu),H=await A.json().catch(()=>null);if(!A.ok)throw new Error(`${A.status} ${H?.error||A.statusText}`);const C=String(H?.uiSession?.csrfToken||"").trim(),w=Number(H?.uiSession?.expiresAt||0);if(!C||!Number.isFinite(w)||w<=Date.now())throw new Error("VuvoDesk Hub did not issue a valid UI session.");ja.set(d,{csrfToken:C,expiresAt:w})})().finally(()=>{Wu.delete(d)});return Wu.set(d,E),E}async function by(d,r,v=zn){const s=Tn(v),{timeoutMs:T=Fu,signal:E,transport:A="auto",...H}=r||{},C=!Tf(d),w=()=>{const ll=String(H.method||"GET").toUpperCase(),D=ja.get(s)?.csrfToken||"";return{...H,headers:{...H.headers||{},...!["GET","HEAD","OPTIONS"].includes(ll)&&D?{"X-LiveDesk-CSRF":D}:{}},credentials:"include",cache:"no-store"}};if(A==="relay"){if(E?.aborted)throw E.reason||new Error("VuvoDesk Hub request cancelled.");if(!xn||Tf(d))throw new Error("Mobile Console relay requires an authenticated management request.");return Zd(d,w(),T)}try{C&&await Jd(s);let ll=await Df(d,w(),s,T,E);if(ry(),C&&ll.status===401&&xn){const D=await ll.clone().json().catch(()=>null);/^hub-ui-session-(required|expired)$/.test(String(D?.error||""))&&(await Jd(s,!0),ll=await Df(d,w(),s,T,E))}return ll}catch(ll){if(E?.aborted||!xn||Tf(d))throw ll;return Zd(d,w(),T)}}async function py(d,r,v=zn){const s=Tn(v),T=await by(d,{...r||{},headers:{"Content-Type":"application/json",...r?.headers||{}}},v);let E=null;try{E=await T.json()}catch(A){if(r?.signal?.aborted)throw A;E=null}if(T.ok&&d.split("?")[0]==="/api/auth/session"&&E&&typeof E=="object"){const A=E.uiSession,H=String(A?.csrfToken||"").trim(),C=Number(A?.expiresAt||0);H&&Number.isFinite(C)&&C>Date.now()&&ja.set(s,{csrfToken:H,expiresAt:C})}if(!T.ok){const A=E&&typeof E=="object"&&"error"in E?String(E.error||""):"";throw new Error(`${T.status} ${A||T.statusText}`)}return E}async function Fy({baseUrl:d=zn,targetRole:r,previousRuntimePid:v=0,allowedStates:s=["running","waiting-auth"],timeoutMs:T=3e4}){const E=Date.now()+T;let A=null;for(;Date.now()<E;){try{const C=await py("/api/runtime/status",void 0,d),w=String(C.role||"").toLowerCase(),ll=String(C.state||"").toLowerCase(),D=Number(C.runtimePid||0),K=v>1?D>1&&D!==v:D>1;if(w===r&&s.map(Zl=>Zl.toLowerCase()).includes(ll)&&K)return C}catch(C){A=C}await new Promise(C=>setTimeout(C,300))}const H=A instanceof Error?` ${A.message}`:"";throw new Error(`VuvoDesk runtime did not become ${r} with a new process.${H}`)}function Iy(d,r=120){if(typeof window>"u")return;const v=new URL(window.location.href);v.port=String(d),v.pathname="/",v.search="",v.hash="";const s=v.toString();let T=0;const E=()=>{fetch(s,{cache:"no-store",mode:"no-cors"}).then(()=>window.location.replace(s)).catch(()=>{if(T+=1,T>=r){window.location.replace(s);return}window.setTimeout(E,250)})};E()}function Py(d){if(!d)return"-";const r=Date.now()-Date.parse(d);return Number.isFinite(r)?r<1e3?"now":r<6e4?`${Math.round(r/1e3)}s`:r<36e5?`${Math.round(r/6e4)}m`:`${Math.round(r/36e5)}h`:"-"}async function l0(d){await navigator.clipboard.writeText(d)}const th=5,Of=30,xy=Number.POSITIVE_INFINITY,se={free:{name:"Free",price:"$0",limit:th,audience:"Personal, ad-supported",note:"Up to 5 personal devices supported by a standard banner."},ltd:{name:"Plus",price:"$5",ltd:"$79 LTD",limit:Of,audience:"Creators and homelabs",note:"30 devices, no ads, personal use."},pro:{name:"Pro",price:"$15",ltd:"$199 LTD",limit:xy,audience:"Business and studios",note:"Commercial use and larger Client walls."}},jy="0.1.618",zy={version:jy},Ty=String(zy.version).trim();function ah({size:d=22}){return c.jsxs("svg",{width:d,height:d,viewBox:"0 0 28 28",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[c.jsx("rect",{x:"2.5",y:"4",width:"14",height:"9",rx:"1.5",stroke:"currentColor",strokeWidth:"1.7",opacity:"0.42"}),c.jsx("path",{d:"M7 16v1.5h5",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round",opacity:"0.42"}),c.jsx("rect",{x:"10.5",y:"2.5",width:"14",height:"9",rx:"1.5",stroke:"currentColor",strokeWidth:"1.7",opacity:"0.62"}),c.jsx("path",{d:"M15 14.5V16h5",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round",opacity:"0.62"}),c.jsx("rect",{x:"6.5",y:"8.5",width:"15",height:"10",rx:"1.7",fill:"currentColor",fillOpacity:"0.12",stroke:"currentColor",strokeWidth:"1.9"}),c.jsx("path",{d:"M12 21v1.5H9.5M16 21v1.5h2.5M9.5 22.5h9",stroke:"currentColor",strokeWidth:"1.9",strokeLinecap:"round"})]})}const kd="npx -y --prefer-online livedesk@latest",En="https://livedesk-desktop-updates.lovecrdm.workers.dev/download/dev",Ey=`${En}/windows/x64`,Ay=`${En}/macos/x64`,My=`${En}/macos/arm64`,Ny=`${En}/linux/x64`,Dy=`${En}/linux/x64/deb`;function Oy(){if(typeof window>"u")return"home";const d=window.location.pathname.replace(/\/+$/,"")||"/";return d==="/"?"home":d==="/download"?"download":d==="/pricing"?"pricing":"not-found"}function nh(){return c.jsxs("a",{className:"site-brand",href:"/","aria-label":"VuvoDesk home",children:[c.jsx("span",{className:"site-brand-mark",children:c.jsx(ah,{size:25})}),c.jsx("span",{children:"VuvoDesk"})]})}function Uy({page:d}){const r=[{label:"Product",href:"/#product",active:d==="home"},{label:"Pricing",href:"/pricing",active:d==="pricing"},{label:"Download",href:"/download",active:d==="download"},{label:"Support",href:"/support",active:!1}];return c.jsx("header",{className:"site-header",children:c.jsxs("div",{className:"site-header-inner",children:[c.jsx(nh,{}),c.jsx("nav",{className:"site-nav","aria-label":"Main navigation",children:r.map(v=>c.jsx("a",{className:v.active?"active":"",href:v.href,children:v.label},v.label))}),c.jsxs("div",{className:"site-header-actions",children:[c.jsx("a",{className:"site-text-link",href:"/app",children:"Open web console"}),c.jsxs("a",{className:"site-button site-button-small",href:"/download",children:["Get VuvoDesk ",c.jsx(Ut,{size:15})]})]}),c.jsxs("details",{className:"site-mobile-menu",children:[c.jsx("summary",{"aria-label":"Open navigation",children:c.jsx(Uv,{size:22})}),c.jsxs("nav",{"aria-label":"Mobile navigation",children:[r.map(v=>c.jsxs("a",{href:v.href,children:[v.label,c.jsx(Cd,{size:15})]},v.label)),c.jsxs("a",{href:"/app",children:["Open web console",c.jsx(Cd,{size:15})]})]})]})]})})}function _y(){return c.jsxs("footer",{className:"site-footer",children:[c.jsxs("div",{className:"site-footer-main",children:[c.jsxs("div",{children:[c.jsx(nh,{}),c.jsx("p",{children:"One calm command center for every computer you manage."})]}),c.jsxs("div",{className:"site-footer-links",children:[c.jsxs("div",{children:[c.jsx("strong",{children:"Product"}),c.jsx("a",{href:"/#product",children:"Overview"}),c.jsx("a",{href:"/pricing",children:"Pricing"}),c.jsx("a",{href:"/download",children:"Download"})]}),c.jsxs("div",{children:[c.jsx("strong",{children:"Use VuvoDesk"}),c.jsx("a",{href:"/app",children:"Web console"}),c.jsx("a",{href:"/support",children:"Support"})]}),c.jsxs("div",{children:[c.jsx("strong",{children:"Platforms"}),c.jsx("span",{children:"Windows"}),c.jsx("span",{children:"macOS"}),c.jsx("span",{children:"Linux"}),c.jsx("span",{children:"Mobile PWA"})]})]})]}),c.jsxs("div",{className:"site-footer-bottom",children:[c.jsx("span",{children:"© 2026 VuvoDesk"}),c.jsx("span",{children:"Built for people who run real work across many screens."})]})]})}function Hy(){const d=[{name:"Studio-01",status:"Online",className:"screen-blue",cpu:"42%",ram:"61%"},{name:"Render-Mac",status:"Online",className:"screen-purple",cpu:"67%",ram:"74%"},{name:"Linux-Build",status:"Online",className:"screen-green",cpu:"29%",ram:"48%"},{name:"Office-PC",status:"Idle",className:"screen-orange",cpu:"18%",ram:"37%"}];return c.jsxs("div",{className:"product-mockup","aria-label":"VuvoDesk screen wall preview",children:[c.jsxs("div",{className:"mockup-window-bar",children:[c.jsxs("div",{children:[c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{})]}),c.jsx("span",{children:"VuvoDesk · Wall"}),c.jsxs("span",{className:"mockup-online",children:[c.jsx("i",{})," 4 online"]})]}),c.jsxs("div",{className:"mockup-body",children:[c.jsxs("aside",{className:"mockup-rail","aria-hidden":"true",children:[c.jsx("span",{className:"active",children:c.jsx($d,{size:17})}),c.jsx("span",{children:c.jsx($u,{size:17})}),c.jsx("span",{children:c.jsx(Fd,{size:17})}),c.jsx("span",{children:c.jsx(Id,{size:17})})]}),c.jsx("div",{className:"mockup-wall",children:d.map(r=>c.jsxs("article",{className:"mockup-screen",children:[c.jsxs("div",{className:`mockup-screen-image ${r.className}`,children:[c.jsx("span",{className:"mockup-code-line wide"}),c.jsx("span",{className:"mockup-code-line"}),c.jsx("span",{className:"mockup-code-line short"}),c.jsx("span",{className:"mockup-panel-block"})]}),c.jsxs("div",{className:"mockup-screen-title",children:[c.jsx("strong",{children:r.name}),c.jsxs("span",{children:[c.jsx("i",{})," ",r.status]})]}),c.jsxs("div",{className:"mockup-metrics",children:[c.jsxs("span",{children:["CPU ",c.jsx("b",{children:r.cpu})]}),c.jsxs("span",{children:["RAM ",c.jsx("b",{children:r.ram})]})]})]},r.name))})]}),c.jsxs("div",{className:"mockup-control-card",children:[c.jsx($u,{size:18}),c.jsxs("span",{children:[c.jsx("small",{children:"Selected computer"}),c.jsx("strong",{children:"Render-Mac"})]}),c.jsx("button",{type:"button",children:"Control"})]})]})}function uh({compact:d=!1}){const r=[{key:"free",name:se.free.name,price:se.free.price,suffix:"forever",audience:se.free.audience,description:"A practical personal wall, supported by a standard banner.",features:[`Up to ${th} devices`,"Live wall and focused control","Standard banner"],action:"Start free",href:"/app"},{key:"plus",name:se.ltd.name,price:se.ltd.price,suffix:"/ month",audience:se.ltd.audience,description:"A clean personal command center for creators and homelabs.",features:[`Up to ${Of} devices`,"No standard banner","Personal use"],ltd:se.ltd.ltd,action:"Choose Plus",href:"/app?view=pricing"},{key:"pro",name:se.pro.name,price:se.pro.price,suffix:"/ month",audience:se.pro.audience,description:"Commercial monitoring for studios, offices, and growing fleets.",features:[`More than ${Of} Clients`,"Ad-free commercial use","Large screen walls"],ltd:se.pro.ltd,action:"Choose Pro",href:"/app?view=pricing"}];return c.jsx("div",{className:`site-pricing-grid ${d?"compact":""}`,children:r.map(v=>c.jsxs("article",{className:`site-price-card ${v.key==="plus"?"featured":""}`,children:[c.jsxs("div",{className:"site-price-heading",children:[c.jsx("span",{children:v.name}),v.key==="plus"&&c.jsx("em",{children:"Most popular"})]}),c.jsx("p",{className:"site-price-audience",children:v.audience}),c.jsxs("div",{className:"site-price",children:[c.jsx("strong",{children:v.price}),c.jsx("small",{children:v.suffix})]}),c.jsx("p",{children:v.description}),c.jsx("ul",{children:v.features.map(s=>c.jsxs("li",{children:[c.jsx(Yv,{size:16})," ",s]},s))}),v.ltd&&c.jsxs("div",{className:"site-ltd",children:[c.jsxs("span",{children:[v.name," LTD"]}),c.jsx("strong",{children:v.ltd.replace(" LTD","")}),c.jsx("small",{children:"one-time · available now"})]}),c.jsxs("a",{className:`site-price-action ${v.key==="plus"?"primary":""}`,href:v.href,children:[v.action,c.jsx(Ut,{size:15})]})]},v.key))})}function Cy(){return c.jsx(c.Fragment,{children:c.jsxs("main",{children:[c.jsxs("section",{className:"site-hero",children:[c.jsxs("div",{className:"site-hero-copy",children:[c.jsxs("span",{className:"site-kicker",children:[c.jsx(_v,{size:15})," The screen wall for real work"]}),c.jsxs("h1",{children:["Every computer.",c.jsx("br",{}),c.jsx("span",{children:"One calm command center."})]}),c.jsx("p",{children:"See every screen, focus the computer that needs you, and keep work moving from your desk or phone."}),c.jsxs("div",{className:"site-hero-actions",children:[c.jsxs("a",{className:"site-button",href:"/download",children:["Download VuvoDesk ",c.jsx(Ut,{size:17})]}),c.jsxs("a",{className:"site-button site-button-secondary",href:"/app",children:["Open web console ",c.jsx(Bd,{size:17})]})]}),c.jsxs("div",{className:"site-hero-notes",children:[c.jsxs("span",{children:[c.jsx(Sf,{size:15})," Free for 5 devices"]}),c.jsxs("span",{children:[c.jsx(Sf,{size:15})," No credit card"]}),c.jsxs("span",{children:[c.jsx(Sf,{size:15})," Windows · macOS · Linux"]})]})]}),c.jsxs("div",{className:"site-hero-visual",children:[c.jsx("div",{className:"site-orbit site-orbit-one"}),c.jsx("div",{className:"site-orbit site-orbit-two"}),c.jsx(Hy,{})]})]}),c.jsxs("section",{className:"platform-strip","aria-label":"Supported platforms",children:[c.jsx("span",{children:"Built for the computers you already run"}),c.jsxs("div",{children:[c.jsxs("strong",{children:[c.jsx(Wd,{size:18})," Windows"]}),c.jsxs("strong",{children:[c.jsx(Mf,{size:18})," macOS"]}),c.jsxs("strong",{children:[c.jsx(Nf,{size:18})," Linux"]}),c.jsxs("strong",{children:[c.jsx(ku,{size:18})," iPhone & Android"]}),c.jsxs("strong",{children:[c.jsx(Bd,{size:18})," Any browser"]})]})]}),c.jsxs("section",{className:"site-section site-value-section",id:"product",children:[c.jsxs("div",{className:"site-section-heading",children:[c.jsx("span",{children:"Why VuvoDesk"}),c.jsxs("h2",{children:["Spend less time finding the problem.",c.jsx("br",{}),"Spend more time fixing it."]}),c.jsx("p",{children:"VuvoDesk keeps the fleet visible without turning your desktop into a pile of remote windows."})]}),c.jsxs("div",{className:"site-value-grid",children:[c.jsxs("article",{className:"site-value-card large blue",children:[c.jsx("span",{className:"site-feature-icon",children:c.jsx($d,{size:23})}),c.jsx("h3",{children:"A wall that stays readable"}),c.jsx("p",{children:"Move from a compact list to large live previews. Keep the signal you need and hide the noise you do not."}),c.jsxs("div",{className:"feature-wall-demo",children:[c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{})]})]}),c.jsxs("article",{className:"site-value-card mint",children:[c.jsx("span",{className:"site-feature-icon",children:c.jsx($u,{size:23})}),c.jsx("h3",{children:"Control without losing context"}),c.jsx("p",{children:"Jump from Wall to focused Control, then return to the same fleet view."}),c.jsxs("div",{className:"feature-cursor-demo",children:[c.jsx($u,{size:31}),c.jsx("span",{children:"Direct control"})]})]}),c.jsxs("article",{className:"site-value-card violet",children:[c.jsx("span",{className:"site-feature-icon",children:c.jsx(Hv,{size:23})}),c.jsx("h3",{children:"Your fleet in your pocket"}),c.jsx("p",{children:"Install the PWA on iPhone or Android and check the room before you walk back to it."}),c.jsxs("div",{className:"feature-phone-demo",children:[c.jsx("span",{}),c.jsxs("div",{children:[c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{})]})]})]}),c.jsxs("article",{className:"site-value-card wide dark",children:[c.jsxs("div",{children:[c.jsxs("span",{className:"site-kicker dark",children:[c.jsx(Cv,{size:14})," Local-first when possible"]}),c.jsx("h3",{children:"Fast where you work. Reachable when you leave."}),c.jsx("p",{children:"VuvoDesk prefers the shortest useful route and keeps the current screen moving instead of building a stale queue."})]}),c.jsxs("div",{className:"feature-route",children:[c.jsxs("span",{children:[c.jsx(Mf,{size:19})," Hub"]}),c.jsx("i",{}),c.jsxs("span",{children:[c.jsx(Bv,{size:19})," Clients"]}),c.jsx("i",{}),c.jsxs("span",{children:[c.jsx(ku,{size:19})," PWA"]})]})]})]})]}),c.jsxs("section",{className:"site-section site-workflow",children:[c.jsxs("div",{className:"site-section-heading centered",children:[c.jsx("span",{children:"Start in three steps"}),c.jsx("h2",{children:"From zero to a live wall in minutes."})]}),c.jsxs("div",{className:"workflow-grid",children:[c.jsxs("article",{children:[c.jsx("b",{children:"01"}),c.jsx("span",{children:c.jsx(Dt,{size:21})}),c.jsx("h3",{children:"Install the Hub"}),c.jsx("p",{children:"Choose the computer that will organize your VuvoDesk fleet."})]}),c.jsxs("article",{children:[c.jsx("b",{children:"02"}),c.jsx("span",{children:c.jsx(Fd,{size:21})}),c.jsx("h3",{children:"Connect Clients"}),c.jsx("p",{children:"Use one PIN to add the Windows, Mac, and Linux computers you manage."})]}),c.jsxs("article",{children:[c.jsx("b",{children:"03"}),c.jsx("span",{children:c.jsx(ku,{size:21})}),c.jsx("h3",{children:"Manage from anywhere"}),c.jsx("p",{children:"Open the web console or install the mobile PWA and keep every screen close."})]})]})]}),c.jsxs("section",{className:"site-section site-pricing-section",children:[c.jsxs("div",{className:"site-section-heading centered",children:[c.jsx("span",{children:"Simple pricing"}),c.jsx("h2",{children:"Start free. Upgrade when the wall earns its place."}),c.jsx("p",{children:"Monthly prices stay easy to understand. Lifetime offers are available separately below each paid plan."})]}),c.jsx(uh,{compact:!0}),c.jsxs("a",{className:"site-inline-link",href:"/pricing",children:["Compare every plan ",c.jsx(Ut,{size:15})]})]}),c.jsxs("section",{className:"site-final-cta",children:[c.jsxs("div",{children:[c.jsxs("span",{className:"site-kicker dark",children:[c.jsx(qv,{size:14})," Your fleet, one glance away"]}),c.jsxs("h2",{children:["Give every computer",c.jsx("br",{}),"one clear place to report."]})]}),c.jsxs("div",{children:[c.jsx("p",{children:"Start with five devices for free. Install the Hub, connect a Client, and open your first live wall."}),c.jsxs("div",{children:[c.jsxs("a",{className:"site-button light",href:"/download",children:["Get VuvoDesk ",c.jsx(Ut,{size:17})]}),c.jsx("a",{className:"site-button ghost",href:"/app",children:"Open console"})]})]})]})]})})}function By(){const[d,r]=jn.useState(!1),v=async()=>{try{await navigator.clipboard.writeText(kd),r(!0),window.setTimeout(()=>r(!1),1800)}catch{r(!1)}};return c.jsxs("main",{className:"site-subpage",children:[c.jsxs("section",{className:"site-subpage-hero download-hero",children:[c.jsxs("span",{className:"site-kicker",children:[c.jsx(Dt,{size:15})," Download VuvoDesk"]}),c.jsxs("h1",{children:["Turn one computer into",c.jsx("br",{}),c.jsx("span",{children:"your command center."})]}),c.jsx("p",{children:"Use the latest temporary installer for your computer. These preview links always follow the newest matching file published to the VuvoDesk download channel."})]}),c.jsxs("section",{className:"download-grid",children:[c.jsxs("article",{id:"windows",children:[c.jsx("span",{className:"download-platform-icon windows",children:c.jsx(Wd,{size:27})}),c.jsxs("div",{children:[c.jsx("small",{children:"Windows"}),c.jsx("span",{className:"download-version",children:"Latest temporary build · x64 Electron"}),c.jsx("span",{className:"download-preview-note",children:"Temporary installer · unsigned"}),c.jsx("h2",{children:"Install VuvoDesk for Windows"}),c.jsx("p",{children:"Download the normal Electron setup program. Windows SmartScreen may warn about this preview until code signing is ready."})]}),c.jsxs("a",{className:"download-installer-link",href:Ey,children:["Download Windows installer ",c.jsx(Dt,{size:16})]})]}),c.jsxs("article",{id:"macos",children:[c.jsx("span",{className:"download-platform-icon mac",children:c.jsx(Mf,{size:27})}),c.jsxs("div",{children:[c.jsx("small",{children:"macOS"}),c.jsx("span",{className:"download-version",children:"Latest temporary build · Intel & Apple silicon"}),c.jsx("span",{className:"download-preview-note",children:"Temporary installer · ad-hoc signed · not notarized"}),c.jsx("h2",{children:"Install VuvoDesk for macOS"}),c.jsx("p",{children:"Choose the chip in your Mac. On first launch, macOS may require Open Anyway in Privacy & Security because this preview is not Apple-notarized."})]}),c.jsxs("div",{className:"download-actions",children:[c.jsxs("a",{className:"download-installer-link",href:My,children:["Apple silicon ",c.jsx(Dt,{size:16})]}),c.jsxs("a",{className:"download-installer-link secondary",href:Ay,children:["Intel Mac ",c.jsx(Dt,{size:16})]})]})]}),c.jsxs("article",{id:"linux",children:[c.jsx("span",{className:"download-platform-icon linux",children:c.jsx(Nf,{size:27})}),c.jsxs("div",{children:[c.jsx("small",{children:"Linux"}),c.jsx("span",{className:"download-version",children:"Latest temporary build · x64 · X11"}),c.jsx("span",{className:"download-preview-note",children:"Temporary installer"}),c.jsx("h2",{children:"Install VuvoDesk for Linux"}),c.jsx("p",{children:"Use the DEB package on Ubuntu, Debian, or Mint. For other distributions, download AppImage, mark it executable, then open it."})]}),c.jsxs("div",{className:"download-actions",children:[c.jsxs("a",{className:"download-installer-link",href:Dy,children:["Download .deb ",c.jsx(Dt,{size:16})]}),c.jsxs("a",{className:"download-installer-link secondary",href:Ny,children:["Download AppImage ",c.jsx(Dt,{size:16})]})]})]})]}),c.jsxs("section",{className:"install-command-card",id:"install-command",children:[c.jsxs("div",{children:[c.jsxs("span",{children:[c.jsx(Nf,{size:18})," One command install"]}),c.jsx("h2",{children:"Terminal fallback and advanced setup"}),c.jsx("p",{children:"Use the npm package when you prefer a command-line install or the temporary desktop package does not suit your system."})]}),c.jsxs("div",{className:"install-command",children:[c.jsx("code",{children:kd}),c.jsxs("button",{type:"button",onClick:()=>{v()},children:[c.jsx(Rv,{size:17})," ",d?"Copied":"Copy"]})]}),c.jsxs("ol",{children:[c.jsxs("li",{children:[c.jsx("b",{children:"1"}),c.jsx("span",{children:"Run the command on the computer that will be your Hub."})]}),c.jsxs("li",{children:[c.jsx("b",{children:"2"}),c.jsx("span",{children:"Open Settings and create a Hub PIN."})]}),c.jsxs("li",{children:[c.jsx("b",{children:"3"}),c.jsx("span",{children:"Run the same package as a Client on the other computers."})]})]})]}),c.jsxs("section",{className:"mobile-install-section",id:"mobile",children:[c.jsxs("div",{className:"mobile-install-heading",children:[c.jsx("span",{children:c.jsx(ku,{size:26})}),c.jsxs("div",{children:[c.jsxs("small",{children:["iPhone & Android · PWA ",Ty]}),c.jsx("h2",{children:"No app store required."}),c.jsx("p",{children:"Open the public web address, sign in, then install VuvoDesk on the Home Screen. The PWA always starts directly in the console."})]})]}),c.jsxs("div",{className:"mobile-web-address",children:[c.jsx("span",{children:"Mobile web address"}),c.jsx("a",{href:"https://vuvodesk.com/app",children:"https://vuvodesk.com/app"}),c.jsxs("a",{className:"site-button",href:"/app",children:["Open mobile console ",c.jsx(Ut,{size:16})]})]}),c.jsxs("div",{className:"pwa-guide-grid",children:[c.jsxs("article",{children:[c.jsx("strong",{children:"iPhone & iPad"}),c.jsxs("ol",{children:[c.jsx("li",{children:"Open the address in Safari."}),c.jsx("li",{children:"Tap Share, then Add to Home Screen."}),c.jsx("li",{children:"Choose Open as Web App and add VuvoDesk."})]})]}),c.jsxs("article",{children:[c.jsx("strong",{children:"Android"}),c.jsxs("ol",{children:[c.jsx("li",{children:"Open the address in Chrome."}),c.jsx("li",{children:"Open the browser menu and tap Install app."}),c.jsx("li",{children:"Launch VuvoDesk from the Home Screen."})]})]})]})]})]})}function qy(){return c.jsxs("main",{className:"site-subpage pricing-subpage",children:[c.jsxs("section",{className:"site-subpage-hero",children:[c.jsxs("span",{className:"site-kicker",children:[c.jsx(qd,{size:15})," VuvoDesk pricing"]}),c.jsxs("h1",{children:["Clear plans for",c.jsx("br",{}),c.jsx("span",{children:"growing screen walls."})]}),c.jsx("p",{children:"Use VuvoDesk free on five personal computers. Choose Plus for a larger ad-free personal wall, or Pro for commercial work."})]}),c.jsx(uh,{}),c.jsxs("section",{className:"pricing-explainer",children:[c.jsxs("article",{children:[c.jsx(wv,{size:21}),c.jsxs("div",{children:[c.jsx("h3",{children:"Free stays useful"}),c.jsx("p",{children:"The standard banner helps keep a five-device personal wall available without a subscription."})]})]}),c.jsxs("article",{children:[c.jsx(qd,{size:21}),c.jsxs("div",{children:[c.jsx("h3",{children:"Monthly and lifetime are separate"}),c.jsx("p",{children:"$5 and $15 are monthly plan prices. Plus LTD $79 and Pro LTD $199 are one-time offers shown separately."})]})]}),c.jsxs("article",{children:[c.jsx(Id,{size:21}),c.jsxs("div",{children:[c.jsx("h3",{children:"Upgrade inside VuvoDesk"}),c.jsx("p",{children:"Sign in to the console, open Pricing, and choose the plan that matches the way you use the fleet."})]})]})]}),c.jsxs("section",{className:"pricing-bottom-cta",children:[c.jsxs("div",{children:[c.jsx("h2",{children:"Start with the computers you have today."}),c.jsx("p",{children:"No credit card is needed for Free."})]}),c.jsxs("a",{className:"site-button",href:"/app",children:["Start free ",c.jsx(Ut,{size:16})]})]})]})}function Ry(){return c.jsxs("main",{className:"site-not-found",children:[c.jsx("span",{className:"site-brand-mark",children:c.jsx(ah,{size:25})}),c.jsx("small",{children:"404"}),c.jsx("h1",{children:"This screen is not on the wall."}),c.jsx("p",{children:"The page may have moved, but your VuvoDesk console is still here."}),c.jsxs("div",{children:[c.jsx("a",{className:"site-button",href:"/",children:"VuvoDesk home"}),c.jsx("a",{className:"site-button site-button-secondary",href:"/app",children:"Open console"})]})]})}function wy(){const d=Oy();return jn.useEffect(()=>{const r={home:"VuvoDesk — Every computer. One calm command center.",download:"Download VuvoDesk — Windows, macOS, and Linux",pricing:"VuvoDesk Pricing — Free, Plus, and Pro","not-found":"Page not found — VuvoDesk"};return document.title=r[d],document.documentElement.classList.add("livedesk-marketing-active"),()=>document.documentElement.classList.remove("livedesk-marketing-active")},[d]),c.jsxs("div",{className:"marketing-site",children:[c.jsx(Uy,{page:d}),d==="home"?c.jsx(Cy,{}):d==="download"?c.jsx(By,{}):d==="pricing"?c.jsx(qy,{}):c.jsx(Ry,{}),c.jsx(_y,{})]})}function Yy(d){return!!d.navigatorStandalone||!!d.displayModeStandalone||!!d.displayModeFullscreen}function Gy({publicOrigin:d,electron:r,pathname:v,search:s="",navigatorStandalone:T=!1,displayModeStandalone:E=!1,displayModeFullscreen:A=!1,marketingPreview:H=!1}){if(r||!d&&!H)return{kind:"app",redirectPath:""};const C=new URLSearchParams(s),w=C.has("pwa")||Yy({navigatorStandalone:T,displayModeStandalone:E,displayModeFullscreen:A}),ll=v==="/app"||v.startsWith("/app/"),D=v==="/support"||v.startsWith("/support/"),K=C.has("checkout");return w||K?{kind:"app",redirectPath:ll?"":"/app"}:ll||D?{kind:"app",redirectPath:""}:{kind:"site",redirectPath:""}}const Ly=jn.lazy(()=>Qv(()=>import("./LiveDeskApp-BNIX6XXG.js"),__vite__mapDeps([0,1,2,3,4])).then(d=>({default:d.LiveDeskApp})));window.liveDesk&&document.documentElement.classList.add("livedesk-electron-desktop");const Ot=new URL(window.location.href),Xy=!!window.navigator.standalone,Uf=Gy({publicOrigin:Sy(),electron:!!window.liveDesk,pathname:Ot.pathname,search:Ot.search,navigatorStandalone:Xy,displayModeStandalone:window.matchMedia("(display-mode: standalone)").matches,displayModeFullscreen:window.matchMedia("(display-mode: fullscreen)").matches,marketingPreview:Ot.searchParams.get("site")==="1"});Uf.redirectPath&&(Ot.pathname=Uf.redirectPath,window.history.replaceState({},"",`${Ot.pathname}${Ot.search}${Ot.hash}`));$v.createRoot(document.getElementById("root")).render(c.jsx(jn.StrictMode,{children:Uf.kind==="site"?c.jsx(wy,{}):c.jsx(jn.Suspense,{fallback:c.jsx("main",{className:"runtime-role-boot","aria-label":"Starting VuvoDesk",children:c.jsx("strong",{children:"Starting VuvoDesk"})}),children:c.jsx(Ly,{})})}));const ih="serviceWorker"in navigator&&window.isSecureContext&&window.location.protocol==="https:";let Ef=null;function Af(){!ih||Ef||(Ef=(async()=>{await(await navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"})).update();const r=await fetch(`/sw.js?pwa-release-check=${Date.now()}`,{cache:"no-store"});if(!r.ok)return;const s=(await r.text()).match(/const PWA_RELEASE = ['"](\d+\.\d+\.\d+)['"];/)?.[1],T=new URL(window.location.href);if(!s||!T.searchParams.has("pwa"))return;const E=T.pathname!=="/app",A=T.searchParams.get("pwa")!==s;!E&&!A||(T.pathname="/app",T.searchParams.set("pwa",s),window.location.replace(T.toString()))})().catch(d=>{console.warn("[VuvoDesk] PWA update check failed.",d)}).finally(()=>{Ef=null}))}ih&&(Af(),window.addEventListener("pageshow",Af),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&Af()}));export{zn as D,th as F,ah as M,Of as P,Wy as a,Ky as b,Jy as c,Iy as d,l0 as e,Py as f,gy as g,py as h,Sy as i,c as j,by as k,$y as l,ky as m,Tn as n,se as p,Zy as r,Fy as w};
|
|
14
|
+
${r.expiresAt||0}`:"";v!==Kd&&(ja.clear(),Wu.clear(),Kd=v),xn=r,oy(r?{accessToken:r.accessToken,user:{id:r.user.id}}:null)}function Sy(){if(typeof window>"u"||window.location.protocol!=="https:")return!1;const d=window.location.hostname.replace(/^\[|\]$/g,"");return!lh(d)&&!eh(d)}function Tf(d){const r=d.split("?")[0];return r==="/api/health"||r==="/api/runtime/status"||r==="/api/auth/status"||r==="/api/auth/session"}async function Df(d,r,v,s,T){const E=gy(v);return E&&(r.targetAddressSpace=E),Iv(T,s,async A=>{r.signal=A;try{return await fetch(`${v}${d}`,r)}catch(H){throw!A.aborted&&E?new Error("VuvoDesk Hub is not reachable at this local network address. If Chrome shows a local network prompt, allow it; otherwise restart the Hub so port 5179 is open on the network."):H}})}async function Jd(d,r=!1){const v=ja.get(d);if(!r&&v&&v.expiresAt>Date.now()+3e4)return;r&&ja.delete(d);const s=Wu.get(d);if(s)return s;const T=xn;if(!T)return;const E=(async()=>{const A=await Df("/api/auth/session",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({accessToken:T.accessToken,refreshToken:T.refreshToken,expiresAt:T.expiresAt,user:T.user}),credentials:"include",cache:"no-store"},d,Fu),H=await A.json().catch(()=>null);if(!A.ok)throw new Error(`${A.status} ${H?.error||A.statusText}`);const C=String(H?.uiSession?.csrfToken||"").trim(),w=Number(H?.uiSession?.expiresAt||0);if(!C||!Number.isFinite(w)||w<=Date.now())throw new Error("VuvoDesk Hub did not issue a valid UI session.");ja.set(d,{csrfToken:C,expiresAt:w})})().finally(()=>{Wu.delete(d)});return Wu.set(d,E),E}async function by(d,r,v=zn){const s=Tn(v),{timeoutMs:T=Fu,signal:E,transport:A="auto",...H}=r||{},C=!Tf(d),w=()=>{const ll=String(H.method||"GET").toUpperCase(),D=ja.get(s)?.csrfToken||"";return{...H,headers:{...H.headers||{},...!["GET","HEAD","OPTIONS"].includes(ll)&&D?{"X-LiveDesk-CSRF":D}:{}},credentials:"include",cache:"no-store"}};if(A==="relay"){if(E?.aborted)throw E.reason||new Error("VuvoDesk Hub request cancelled.");if(!xn||Tf(d))throw new Error("Mobile Console relay requires an authenticated management request.");return Zd(d,w(),T)}try{C&&await Jd(s);let ll=await Df(d,w(),s,T,E);if(ry(),C&&ll.status===401&&xn){const D=await ll.clone().json().catch(()=>null);/^hub-ui-session-(required|expired)$/.test(String(D?.error||""))&&(await Jd(s,!0),ll=await Df(d,w(),s,T,E))}return ll}catch(ll){if(E?.aborted||!xn||Tf(d))throw ll;return Zd(d,w(),T)}}async function py(d,r,v=zn){const s=Tn(v),T=await by(d,{...r||{},headers:{"Content-Type":"application/json",...r?.headers||{}}},v);let E=null;try{E=await T.json()}catch(A){if(r?.signal?.aborted)throw A;E=null}if(T.ok&&d.split("?")[0]==="/api/auth/session"&&E&&typeof E=="object"){const A=E.uiSession,H=String(A?.csrfToken||"").trim(),C=Number(A?.expiresAt||0);H&&Number.isFinite(C)&&C>Date.now()&&ja.set(s,{csrfToken:H,expiresAt:C})}if(!T.ok){const A=E&&typeof E=="object"&&"error"in E?String(E.error||""):"";throw new Error(`${T.status} ${A||T.statusText}`)}return E}async function Fy({baseUrl:d=zn,targetRole:r,previousRuntimePid:v=0,allowedStates:s=["running","waiting-auth"],timeoutMs:T=3e4}){const E=Date.now()+T;let A=null;for(;Date.now()<E;){try{const C=await py("/api/runtime/status",void 0,d),w=String(C.role||"").toLowerCase(),ll=String(C.state||"").toLowerCase(),D=Number(C.runtimePid||0),K=v>1?D>1&&D!==v:D>1;if(w===r&&s.map(Zl=>Zl.toLowerCase()).includes(ll)&&K)return C}catch(C){A=C}await new Promise(C=>setTimeout(C,300))}const H=A instanceof Error?` ${A.message}`:"";throw new Error(`VuvoDesk runtime did not become ${r} with a new process.${H}`)}function Iy(d,r=120){if(typeof window>"u")return;const v=new URL(window.location.href);v.port=String(d),v.pathname="/",v.search="",v.hash="";const s=v.toString();let T=0;const E=()=>{fetch(s,{cache:"no-store",mode:"no-cors"}).then(()=>window.location.replace(s)).catch(()=>{if(T+=1,T>=r){window.location.replace(s);return}window.setTimeout(E,250)})};E()}function Py(d){if(!d)return"-";const r=Date.now()-Date.parse(d);return Number.isFinite(r)?r<1e3?"now":r<6e4?`${Math.round(r/1e3)}s`:r<36e5?`${Math.round(r/6e4)}m`:`${Math.round(r/36e5)}h`:"-"}async function l0(d){await navigator.clipboard.writeText(d)}const th=5,Of=30,xy=Number.POSITIVE_INFINITY,se={free:{name:"Free",price:"$0",limit:th,audience:"Personal, ad-supported",note:"Up to 5 personal devices supported by a standard banner."},ltd:{name:"Plus",price:"$5",ltd:"$79 LTD",limit:Of,audience:"Creators and homelabs",note:"30 devices, no ads, personal use."},pro:{name:"Pro",price:"$15",ltd:"$199 LTD",limit:xy,audience:"Business and studios",note:"Commercial use and larger Client walls."}},jy="0.1.620",zy={version:jy},Ty=String(zy.version).trim();function ah({size:d=22}){return c.jsxs("svg",{width:d,height:d,viewBox:"0 0 28 28",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",children:[c.jsx("rect",{x:"2.5",y:"4",width:"14",height:"9",rx:"1.5",stroke:"currentColor",strokeWidth:"1.7",opacity:"0.42"}),c.jsx("path",{d:"M7 16v1.5h5",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round",opacity:"0.42"}),c.jsx("rect",{x:"10.5",y:"2.5",width:"14",height:"9",rx:"1.5",stroke:"currentColor",strokeWidth:"1.7",opacity:"0.62"}),c.jsx("path",{d:"M15 14.5V16h5",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round",opacity:"0.62"}),c.jsx("rect",{x:"6.5",y:"8.5",width:"15",height:"10",rx:"1.7",fill:"currentColor",fillOpacity:"0.12",stroke:"currentColor",strokeWidth:"1.9"}),c.jsx("path",{d:"M12 21v1.5H9.5M16 21v1.5h2.5M9.5 22.5h9",stroke:"currentColor",strokeWidth:"1.9",strokeLinecap:"round"})]})}const kd="npx -y --prefer-online livedesk@latest",En="https://livedesk-desktop-updates.lovecrdm.workers.dev/download/dev",Ey=`${En}/windows/x64`,Ay=`${En}/macos/x64`,My=`${En}/macos/arm64`,Ny=`${En}/linux/x64`,Dy=`${En}/linux/x64/deb`;function Oy(){if(typeof window>"u")return"home";const d=window.location.pathname.replace(/\/+$/,"")||"/";return d==="/"?"home":d==="/download"?"download":d==="/pricing"?"pricing":"not-found"}function nh(){return c.jsxs("a",{className:"site-brand",href:"/","aria-label":"VuvoDesk home",children:[c.jsx("span",{className:"site-brand-mark",children:c.jsx(ah,{size:25})}),c.jsx("span",{children:"VuvoDesk"})]})}function Uy({page:d}){const r=[{label:"Product",href:"/#product",active:d==="home"},{label:"Pricing",href:"/pricing",active:d==="pricing"},{label:"Download",href:"/download",active:d==="download"},{label:"Support",href:"/support",active:!1}];return c.jsx("header",{className:"site-header",children:c.jsxs("div",{className:"site-header-inner",children:[c.jsx(nh,{}),c.jsx("nav",{className:"site-nav","aria-label":"Main navigation",children:r.map(v=>c.jsx("a",{className:v.active?"active":"",href:v.href,children:v.label},v.label))}),c.jsxs("div",{className:"site-header-actions",children:[c.jsx("a",{className:"site-text-link",href:"/app",children:"Open web console"}),c.jsxs("a",{className:"site-button site-button-small",href:"/download",children:["Get VuvoDesk ",c.jsx(Ut,{size:15})]})]}),c.jsxs("details",{className:"site-mobile-menu",children:[c.jsx("summary",{"aria-label":"Open navigation",children:c.jsx(Uv,{size:22})}),c.jsxs("nav",{"aria-label":"Mobile navigation",children:[r.map(v=>c.jsxs("a",{href:v.href,children:[v.label,c.jsx(Cd,{size:15})]},v.label)),c.jsxs("a",{href:"/app",children:["Open web console",c.jsx(Cd,{size:15})]})]})]})]})})}function _y(){return c.jsxs("footer",{className:"site-footer",children:[c.jsxs("div",{className:"site-footer-main",children:[c.jsxs("div",{children:[c.jsx(nh,{}),c.jsx("p",{children:"One calm command center for every computer you manage."})]}),c.jsxs("div",{className:"site-footer-links",children:[c.jsxs("div",{children:[c.jsx("strong",{children:"Product"}),c.jsx("a",{href:"/#product",children:"Overview"}),c.jsx("a",{href:"/pricing",children:"Pricing"}),c.jsx("a",{href:"/download",children:"Download"})]}),c.jsxs("div",{children:[c.jsx("strong",{children:"Use VuvoDesk"}),c.jsx("a",{href:"/app",children:"Web console"}),c.jsx("a",{href:"/support",children:"Support"})]}),c.jsxs("div",{children:[c.jsx("strong",{children:"Platforms"}),c.jsx("span",{children:"Windows"}),c.jsx("span",{children:"macOS"}),c.jsx("span",{children:"Linux"}),c.jsx("span",{children:"Mobile PWA"})]})]})]}),c.jsxs("div",{className:"site-footer-bottom",children:[c.jsx("span",{children:"© 2026 VuvoDesk"}),c.jsx("span",{children:"Built for people who run real work across many screens."})]})]})}function Hy(){const d=[{name:"Studio-01",status:"Online",className:"screen-blue",cpu:"42%",ram:"61%"},{name:"Render-Mac",status:"Online",className:"screen-purple",cpu:"67%",ram:"74%"},{name:"Linux-Build",status:"Online",className:"screen-green",cpu:"29%",ram:"48%"},{name:"Office-PC",status:"Idle",className:"screen-orange",cpu:"18%",ram:"37%"}];return c.jsxs("div",{className:"product-mockup","aria-label":"VuvoDesk screen wall preview",children:[c.jsxs("div",{className:"mockup-window-bar",children:[c.jsxs("div",{children:[c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{})]}),c.jsx("span",{children:"VuvoDesk · Wall"}),c.jsxs("span",{className:"mockup-online",children:[c.jsx("i",{})," 4 online"]})]}),c.jsxs("div",{className:"mockup-body",children:[c.jsxs("aside",{className:"mockup-rail","aria-hidden":"true",children:[c.jsx("span",{className:"active",children:c.jsx($d,{size:17})}),c.jsx("span",{children:c.jsx($u,{size:17})}),c.jsx("span",{children:c.jsx(Fd,{size:17})}),c.jsx("span",{children:c.jsx(Id,{size:17})})]}),c.jsx("div",{className:"mockup-wall",children:d.map(r=>c.jsxs("article",{className:"mockup-screen",children:[c.jsxs("div",{className:`mockup-screen-image ${r.className}`,children:[c.jsx("span",{className:"mockup-code-line wide"}),c.jsx("span",{className:"mockup-code-line"}),c.jsx("span",{className:"mockup-code-line short"}),c.jsx("span",{className:"mockup-panel-block"})]}),c.jsxs("div",{className:"mockup-screen-title",children:[c.jsx("strong",{children:r.name}),c.jsxs("span",{children:[c.jsx("i",{})," ",r.status]})]}),c.jsxs("div",{className:"mockup-metrics",children:[c.jsxs("span",{children:["CPU ",c.jsx("b",{children:r.cpu})]}),c.jsxs("span",{children:["RAM ",c.jsx("b",{children:r.ram})]})]})]},r.name))})]}),c.jsxs("div",{className:"mockup-control-card",children:[c.jsx($u,{size:18}),c.jsxs("span",{children:[c.jsx("small",{children:"Selected computer"}),c.jsx("strong",{children:"Render-Mac"})]}),c.jsx("button",{type:"button",children:"Control"})]})]})}function uh({compact:d=!1}){const r=[{key:"free",name:se.free.name,price:se.free.price,suffix:"forever",audience:se.free.audience,description:"A practical personal wall, supported by a standard banner.",features:[`Up to ${th} devices`,"Live wall and focused control","Standard banner"],action:"Start free",href:"/app"},{key:"plus",name:se.ltd.name,price:se.ltd.price,suffix:"/ month",audience:se.ltd.audience,description:"A clean personal command center for creators and homelabs.",features:[`Up to ${Of} devices`,"No standard banner","Personal use"],ltd:se.ltd.ltd,action:"Choose Plus",href:"/app?view=pricing"},{key:"pro",name:se.pro.name,price:se.pro.price,suffix:"/ month",audience:se.pro.audience,description:"Commercial monitoring for studios, offices, and growing fleets.",features:[`More than ${Of} Clients`,"Ad-free commercial use","Large screen walls"],ltd:se.pro.ltd,action:"Choose Pro",href:"/app?view=pricing"}];return c.jsx("div",{className:`site-pricing-grid ${d?"compact":""}`,children:r.map(v=>c.jsxs("article",{className:`site-price-card ${v.key==="plus"?"featured":""}`,children:[c.jsxs("div",{className:"site-price-heading",children:[c.jsx("span",{children:v.name}),v.key==="plus"&&c.jsx("em",{children:"Most popular"})]}),c.jsx("p",{className:"site-price-audience",children:v.audience}),c.jsxs("div",{className:"site-price",children:[c.jsx("strong",{children:v.price}),c.jsx("small",{children:v.suffix})]}),c.jsx("p",{children:v.description}),c.jsx("ul",{children:v.features.map(s=>c.jsxs("li",{children:[c.jsx(Yv,{size:16})," ",s]},s))}),v.ltd&&c.jsxs("div",{className:"site-ltd",children:[c.jsxs("span",{children:[v.name," LTD"]}),c.jsx("strong",{children:v.ltd.replace(" LTD","")}),c.jsx("small",{children:"one-time · available now"})]}),c.jsxs("a",{className:`site-price-action ${v.key==="plus"?"primary":""}`,href:v.href,children:[v.action,c.jsx(Ut,{size:15})]})]},v.key))})}function Cy(){return c.jsx(c.Fragment,{children:c.jsxs("main",{children:[c.jsxs("section",{className:"site-hero",children:[c.jsxs("div",{className:"site-hero-copy",children:[c.jsxs("span",{className:"site-kicker",children:[c.jsx(_v,{size:15})," The screen wall for real work"]}),c.jsxs("h1",{children:["Every computer.",c.jsx("br",{}),c.jsx("span",{children:"One calm command center."})]}),c.jsx("p",{children:"See every screen, focus the computer that needs you, and keep work moving from your desk or phone."}),c.jsxs("div",{className:"site-hero-actions",children:[c.jsxs("a",{className:"site-button",href:"/download",children:["Download VuvoDesk ",c.jsx(Ut,{size:17})]}),c.jsxs("a",{className:"site-button site-button-secondary",href:"/app",children:["Open web console ",c.jsx(Bd,{size:17})]})]}),c.jsxs("div",{className:"site-hero-notes",children:[c.jsxs("span",{children:[c.jsx(Sf,{size:15})," Free for 5 devices"]}),c.jsxs("span",{children:[c.jsx(Sf,{size:15})," No credit card"]}),c.jsxs("span",{children:[c.jsx(Sf,{size:15})," Windows · macOS · Linux"]})]})]}),c.jsxs("div",{className:"site-hero-visual",children:[c.jsx("div",{className:"site-orbit site-orbit-one"}),c.jsx("div",{className:"site-orbit site-orbit-two"}),c.jsx(Hy,{})]})]}),c.jsxs("section",{className:"platform-strip","aria-label":"Supported platforms",children:[c.jsx("span",{children:"Built for the computers you already run"}),c.jsxs("div",{children:[c.jsxs("strong",{children:[c.jsx(Wd,{size:18})," Windows"]}),c.jsxs("strong",{children:[c.jsx(Mf,{size:18})," macOS"]}),c.jsxs("strong",{children:[c.jsx(Nf,{size:18})," Linux"]}),c.jsxs("strong",{children:[c.jsx(ku,{size:18})," iPhone & Android"]}),c.jsxs("strong",{children:[c.jsx(Bd,{size:18})," Any browser"]})]})]}),c.jsxs("section",{className:"site-section site-value-section",id:"product",children:[c.jsxs("div",{className:"site-section-heading",children:[c.jsx("span",{children:"Why VuvoDesk"}),c.jsxs("h2",{children:["Spend less time finding the problem.",c.jsx("br",{}),"Spend more time fixing it."]}),c.jsx("p",{children:"VuvoDesk keeps the fleet visible without turning your desktop into a pile of remote windows."})]}),c.jsxs("div",{className:"site-value-grid",children:[c.jsxs("article",{className:"site-value-card large blue",children:[c.jsx("span",{className:"site-feature-icon",children:c.jsx($d,{size:23})}),c.jsx("h3",{children:"A wall that stays readable"}),c.jsx("p",{children:"Move from a compact list to large live previews. Keep the signal you need and hide the noise you do not."}),c.jsxs("div",{className:"feature-wall-demo",children:[c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{})]})]}),c.jsxs("article",{className:"site-value-card mint",children:[c.jsx("span",{className:"site-feature-icon",children:c.jsx($u,{size:23})}),c.jsx("h3",{children:"Control without losing context"}),c.jsx("p",{children:"Jump from Wall to focused Control, then return to the same fleet view."}),c.jsxs("div",{className:"feature-cursor-demo",children:[c.jsx($u,{size:31}),c.jsx("span",{children:"Direct control"})]})]}),c.jsxs("article",{className:"site-value-card violet",children:[c.jsx("span",{className:"site-feature-icon",children:c.jsx(Hv,{size:23})}),c.jsx("h3",{children:"Your fleet in your pocket"}),c.jsx("p",{children:"Install the PWA on iPhone or Android and check the room before you walk back to it."}),c.jsxs("div",{className:"feature-phone-demo",children:[c.jsx("span",{}),c.jsxs("div",{children:[c.jsx("i",{}),c.jsx("i",{}),c.jsx("i",{})]})]})]}),c.jsxs("article",{className:"site-value-card wide dark",children:[c.jsxs("div",{children:[c.jsxs("span",{className:"site-kicker dark",children:[c.jsx(Cv,{size:14})," Local-first when possible"]}),c.jsx("h3",{children:"Fast where you work. Reachable when you leave."}),c.jsx("p",{children:"VuvoDesk prefers the shortest useful route and keeps the current screen moving instead of building a stale queue."})]}),c.jsxs("div",{className:"feature-route",children:[c.jsxs("span",{children:[c.jsx(Mf,{size:19})," Hub"]}),c.jsx("i",{}),c.jsxs("span",{children:[c.jsx(Bv,{size:19})," Clients"]}),c.jsx("i",{}),c.jsxs("span",{children:[c.jsx(ku,{size:19})," PWA"]})]})]})]})]}),c.jsxs("section",{className:"site-section site-workflow",children:[c.jsxs("div",{className:"site-section-heading centered",children:[c.jsx("span",{children:"Start in three steps"}),c.jsx("h2",{children:"From zero to a live wall in minutes."})]}),c.jsxs("div",{className:"workflow-grid",children:[c.jsxs("article",{children:[c.jsx("b",{children:"01"}),c.jsx("span",{children:c.jsx(Dt,{size:21})}),c.jsx("h3",{children:"Install the Hub"}),c.jsx("p",{children:"Choose the computer that will organize your VuvoDesk fleet."})]}),c.jsxs("article",{children:[c.jsx("b",{children:"02"}),c.jsx("span",{children:c.jsx(Fd,{size:21})}),c.jsx("h3",{children:"Connect Clients"}),c.jsx("p",{children:"Use one PIN to add the Windows, Mac, and Linux computers you manage."})]}),c.jsxs("article",{children:[c.jsx("b",{children:"03"}),c.jsx("span",{children:c.jsx(ku,{size:21})}),c.jsx("h3",{children:"Manage from anywhere"}),c.jsx("p",{children:"Open the web console or install the mobile PWA and keep every screen close."})]})]})]}),c.jsxs("section",{className:"site-section site-pricing-section",children:[c.jsxs("div",{className:"site-section-heading centered",children:[c.jsx("span",{children:"Simple pricing"}),c.jsx("h2",{children:"Start free. Upgrade when the wall earns its place."}),c.jsx("p",{children:"Monthly prices stay easy to understand. Lifetime offers are available separately below each paid plan."})]}),c.jsx(uh,{compact:!0}),c.jsxs("a",{className:"site-inline-link",href:"/pricing",children:["Compare every plan ",c.jsx(Ut,{size:15})]})]}),c.jsxs("section",{className:"site-final-cta",children:[c.jsxs("div",{children:[c.jsxs("span",{className:"site-kicker dark",children:[c.jsx(qv,{size:14})," Your fleet, one glance away"]}),c.jsxs("h2",{children:["Give every computer",c.jsx("br",{}),"one clear place to report."]})]}),c.jsxs("div",{children:[c.jsx("p",{children:"Start with five devices for free. Install the Hub, connect a Client, and open your first live wall."}),c.jsxs("div",{children:[c.jsxs("a",{className:"site-button light",href:"/download",children:["Get VuvoDesk ",c.jsx(Ut,{size:17})]}),c.jsx("a",{className:"site-button ghost",href:"/app",children:"Open console"})]})]})]})]})})}function By(){const[d,r]=jn.useState(!1),v=async()=>{try{await navigator.clipboard.writeText(kd),r(!0),window.setTimeout(()=>r(!1),1800)}catch{r(!1)}};return c.jsxs("main",{className:"site-subpage",children:[c.jsxs("section",{className:"site-subpage-hero download-hero",children:[c.jsxs("span",{className:"site-kicker",children:[c.jsx(Dt,{size:15})," Download VuvoDesk"]}),c.jsxs("h1",{children:["Turn one computer into",c.jsx("br",{}),c.jsx("span",{children:"your command center."})]}),c.jsx("p",{children:"Use the latest temporary installer for your computer. These preview links always follow the newest matching file published to the VuvoDesk download channel."})]}),c.jsxs("section",{className:"download-grid",children:[c.jsxs("article",{id:"windows",children:[c.jsx("span",{className:"download-platform-icon windows",children:c.jsx(Wd,{size:27})}),c.jsxs("div",{children:[c.jsx("small",{children:"Windows"}),c.jsx("span",{className:"download-version",children:"Latest temporary build · x64 Electron"}),c.jsx("span",{className:"download-preview-note",children:"Temporary installer · unsigned"}),c.jsx("h2",{children:"Install VuvoDesk for Windows"}),c.jsx("p",{children:"Download the normal Electron setup program. Windows SmartScreen may warn about this preview until code signing is ready."})]}),c.jsxs("a",{className:"download-installer-link",href:Ey,children:["Download Windows installer ",c.jsx(Dt,{size:16})]})]}),c.jsxs("article",{id:"macos",children:[c.jsx("span",{className:"download-platform-icon mac",children:c.jsx(Mf,{size:27})}),c.jsxs("div",{children:[c.jsx("small",{children:"macOS"}),c.jsx("span",{className:"download-version",children:"Latest temporary build · Intel & Apple silicon"}),c.jsx("span",{className:"download-preview-note",children:"Temporary installer · ad-hoc signed · not notarized"}),c.jsx("h2",{children:"Install VuvoDesk for macOS"}),c.jsx("p",{children:"Choose the chip in your Mac. On first launch, macOS may require Open Anyway in Privacy & Security because this preview is not Apple-notarized."})]}),c.jsxs("div",{className:"download-actions",children:[c.jsxs("a",{className:"download-installer-link",href:My,children:["Apple silicon ",c.jsx(Dt,{size:16})]}),c.jsxs("a",{className:"download-installer-link secondary",href:Ay,children:["Intel Mac ",c.jsx(Dt,{size:16})]})]})]}),c.jsxs("article",{id:"linux",children:[c.jsx("span",{className:"download-platform-icon linux",children:c.jsx(Nf,{size:27})}),c.jsxs("div",{children:[c.jsx("small",{children:"Linux"}),c.jsx("span",{className:"download-version",children:"Latest temporary build · x64 · X11"}),c.jsx("span",{className:"download-preview-note",children:"Temporary installer"}),c.jsx("h2",{children:"Install VuvoDesk for Linux"}),c.jsx("p",{children:"Use the DEB package on Ubuntu, Debian, or Mint. For other distributions, download AppImage, mark it executable, then open it."})]}),c.jsxs("div",{className:"download-actions",children:[c.jsxs("a",{className:"download-installer-link",href:Dy,children:["Download .deb ",c.jsx(Dt,{size:16})]}),c.jsxs("a",{className:"download-installer-link secondary",href:Ny,children:["Download AppImage ",c.jsx(Dt,{size:16})]})]})]})]}),c.jsxs("section",{className:"install-command-card",id:"install-command",children:[c.jsxs("div",{children:[c.jsxs("span",{children:[c.jsx(Nf,{size:18})," One command install"]}),c.jsx("h2",{children:"Terminal fallback and advanced setup"}),c.jsx("p",{children:"Use the npm package when you prefer a command-line install or the temporary desktop package does not suit your system."})]}),c.jsxs("div",{className:"install-command",children:[c.jsx("code",{children:kd}),c.jsxs("button",{type:"button",onClick:()=>{v()},children:[c.jsx(Rv,{size:17})," ",d?"Copied":"Copy"]})]}),c.jsxs("ol",{children:[c.jsxs("li",{children:[c.jsx("b",{children:"1"}),c.jsx("span",{children:"Run the command on the computer that will be your Hub."})]}),c.jsxs("li",{children:[c.jsx("b",{children:"2"}),c.jsx("span",{children:"Open Settings and create a Hub PIN."})]}),c.jsxs("li",{children:[c.jsx("b",{children:"3"}),c.jsx("span",{children:"Run the same package as a Client on the other computers."})]})]})]}),c.jsxs("section",{className:"mobile-install-section",id:"mobile",children:[c.jsxs("div",{className:"mobile-install-heading",children:[c.jsx("span",{children:c.jsx(ku,{size:26})}),c.jsxs("div",{children:[c.jsxs("small",{children:["iPhone & Android · PWA ",Ty]}),c.jsx("h2",{children:"No app store required."}),c.jsx("p",{children:"Open the public web address, sign in, then install VuvoDesk on the Home Screen. The PWA always starts directly in the console."})]})]}),c.jsxs("div",{className:"mobile-web-address",children:[c.jsx("span",{children:"Mobile web address"}),c.jsx("a",{href:"https://vuvodesk.com/app",children:"https://vuvodesk.com/app"}),c.jsxs("a",{className:"site-button",href:"/app",children:["Open mobile console ",c.jsx(Ut,{size:16})]})]}),c.jsxs("div",{className:"pwa-guide-grid",children:[c.jsxs("article",{children:[c.jsx("strong",{children:"iPhone & iPad"}),c.jsxs("ol",{children:[c.jsx("li",{children:"Open the address in Safari."}),c.jsx("li",{children:"Tap Share, then Add to Home Screen."}),c.jsx("li",{children:"Choose Open as Web App and add VuvoDesk."})]})]}),c.jsxs("article",{children:[c.jsx("strong",{children:"Android"}),c.jsxs("ol",{children:[c.jsx("li",{children:"Open the address in Chrome."}),c.jsx("li",{children:"Open the browser menu and tap Install app."}),c.jsx("li",{children:"Launch VuvoDesk from the Home Screen."})]})]})]})]})]})}function qy(){return c.jsxs("main",{className:"site-subpage pricing-subpage",children:[c.jsxs("section",{className:"site-subpage-hero",children:[c.jsxs("span",{className:"site-kicker",children:[c.jsx(qd,{size:15})," VuvoDesk pricing"]}),c.jsxs("h1",{children:["Clear plans for",c.jsx("br",{}),c.jsx("span",{children:"growing screen walls."})]}),c.jsx("p",{children:"Use VuvoDesk free on five personal computers. Choose Plus for a larger ad-free personal wall, or Pro for commercial work."})]}),c.jsx(uh,{}),c.jsxs("section",{className:"pricing-explainer",children:[c.jsxs("article",{children:[c.jsx(wv,{size:21}),c.jsxs("div",{children:[c.jsx("h3",{children:"Free stays useful"}),c.jsx("p",{children:"The standard banner helps keep a five-device personal wall available without a subscription."})]})]}),c.jsxs("article",{children:[c.jsx(qd,{size:21}),c.jsxs("div",{children:[c.jsx("h3",{children:"Monthly and lifetime are separate"}),c.jsx("p",{children:"$5 and $15 are monthly plan prices. Plus LTD $79 and Pro LTD $199 are one-time offers shown separately."})]})]}),c.jsxs("article",{children:[c.jsx(Id,{size:21}),c.jsxs("div",{children:[c.jsx("h3",{children:"Upgrade inside VuvoDesk"}),c.jsx("p",{children:"Sign in to the console, open Pricing, and choose the plan that matches the way you use the fleet."})]})]})]}),c.jsxs("section",{className:"pricing-bottom-cta",children:[c.jsxs("div",{children:[c.jsx("h2",{children:"Start with the computers you have today."}),c.jsx("p",{children:"No credit card is needed for Free."})]}),c.jsxs("a",{className:"site-button",href:"/app",children:["Start free ",c.jsx(Ut,{size:16})]})]})]})}function Ry(){return c.jsxs("main",{className:"site-not-found",children:[c.jsx("span",{className:"site-brand-mark",children:c.jsx(ah,{size:25})}),c.jsx("small",{children:"404"}),c.jsx("h1",{children:"This screen is not on the wall."}),c.jsx("p",{children:"The page may have moved, but your VuvoDesk console is still here."}),c.jsxs("div",{children:[c.jsx("a",{className:"site-button",href:"/",children:"VuvoDesk home"}),c.jsx("a",{className:"site-button site-button-secondary",href:"/app",children:"Open console"})]})]})}function wy(){const d=Oy();return jn.useEffect(()=>{const r={home:"VuvoDesk — Every computer. One calm command center.",download:"Download VuvoDesk — Windows, macOS, and Linux",pricing:"VuvoDesk Pricing — Free, Plus, and Pro","not-found":"Page not found — VuvoDesk"};return document.title=r[d],document.documentElement.classList.add("livedesk-marketing-active"),()=>document.documentElement.classList.remove("livedesk-marketing-active")},[d]),c.jsxs("div",{className:"marketing-site",children:[c.jsx(Uy,{page:d}),d==="home"?c.jsx(Cy,{}):d==="download"?c.jsx(By,{}):d==="pricing"?c.jsx(qy,{}):c.jsx(Ry,{}),c.jsx(_y,{})]})}function Yy(d){return!!d.navigatorStandalone||!!d.displayModeStandalone||!!d.displayModeFullscreen}function Gy({publicOrigin:d,electron:r,pathname:v,search:s="",navigatorStandalone:T=!1,displayModeStandalone:E=!1,displayModeFullscreen:A=!1,marketingPreview:H=!1}){if(r||!d&&!H)return{kind:"app",redirectPath:""};const C=new URLSearchParams(s),w=C.has("pwa")||Yy({navigatorStandalone:T,displayModeStandalone:E,displayModeFullscreen:A}),ll=v==="/app"||v.startsWith("/app/"),D=v==="/support"||v.startsWith("/support/"),K=C.has("checkout");return w||K?{kind:"app",redirectPath:ll?"":"/app"}:ll||D?{kind:"app",redirectPath:""}:{kind:"site",redirectPath:""}}const Ly=jn.lazy(()=>Qv(()=>import("./LiveDeskApp-DIq0K1le.js"),__vite__mapDeps([0,1,2,3,4])).then(d=>({default:d.LiveDeskApp})));window.liveDesk&&document.documentElement.classList.add("livedesk-electron-desktop");const Ot=new URL(window.location.href),Xy=!!window.navigator.standalone,Uf=Gy({publicOrigin:Sy(),electron:!!window.liveDesk,pathname:Ot.pathname,search:Ot.search,navigatorStandalone:Xy,displayModeStandalone:window.matchMedia("(display-mode: standalone)").matches,displayModeFullscreen:window.matchMedia("(display-mode: fullscreen)").matches,marketingPreview:Ot.searchParams.get("site")==="1"});Uf.redirectPath&&(Ot.pathname=Uf.redirectPath,window.history.replaceState({},"",`${Ot.pathname}${Ot.search}${Ot.hash}`));$v.createRoot(document.getElementById("root")).render(c.jsx(jn.StrictMode,{children:Uf.kind==="site"?c.jsx(wy,{}):c.jsx(jn.Suspense,{fallback:c.jsx("main",{className:"runtime-role-boot","aria-label":"Starting VuvoDesk",children:c.jsx("strong",{children:"Starting VuvoDesk"})}),children:c.jsx(Ly,{})})}));const ih="serviceWorker"in navigator&&window.isSecureContext&&window.location.protocol==="https:";let Ef=null;function Af(){!ih||Ef||(Ef=(async()=>{await(await navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"})).update();const r=await fetch(`/sw.js?pwa-release-check=${Date.now()}`,{cache:"no-store"});if(!r.ok)return;const s=(await r.text()).match(/const PWA_RELEASE = ['"](\d+\.\d+\.\d+)['"];/)?.[1],T=new URL(window.location.href);if(!s||!T.searchParams.has("pwa"))return;const E=T.pathname!=="/app",A=T.searchParams.get("pwa")!==s;!E&&!A||(T.pathname="/app",T.searchParams.set("pwa",s),window.location.replace(T.toString()))})().catch(d=>{console.warn("[VuvoDesk] PWA update check failed.",d)}).finally(()=>{Ef=null}))}ih&&(Af(),window.addEventListener("pageshow",Af),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&Af()}));export{zn as D,th as F,ah as M,Of as P,Wy as a,Ky as b,Jy as c,Iy as d,l0 as e,Py as f,gy as g,py as h,Sy as i,c as j,by as k,$y as l,ky as m,Tn as n,se as p,Zy as r,Fy as w};
|