livedesk 0.1.656 → 0.1.658
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/remote-hub.js +47 -24
- package/hub/src/server.js +200 -13
- package/hub/src/shared-wall-profile-contract.mjs +40 -0
- package/hub/src/shared-wall-profile-contract.test.mjs +38 -0
- package/package.json +1 -1
- package/web/dist/app.html +5 -11
- package/web/dist/app.webmanifest +1 -1
- package/web/dist/assets/AgentSettingsTab-8WnOGkVa.js +1 -0
- package/web/dist/assets/{AgentsPage-DEdUBoe0.js → AgentsPage-CCO7AwAO.js} +6 -6
- package/web/dist/assets/CaptureGallery-7NXD-vaQ.js +1 -0
- package/web/dist/assets/DesktopUpdatePanel-CiGXFhqj.js +1 -0
- package/web/dist/assets/{App-DK9GZcvU.js → HubApp-AhKLyz3K.js} +13 -13
- package/web/dist/assets/MonitorStackIcon-DBuXI_Oa.js +8 -0
- package/web/dist/assets/SettingsPage-DnOdy3MQ.js +1 -0
- package/web/dist/assets/SettingsTabs-DfjoCvK4.js +1 -0
- package/web/dist/assets/{ShareFilesPage-BiCS0Nyd.js → ShareFilesPage-C3Jv7EII.js} +3 -3
- package/web/dist/assets/SupportPage-B16Jl8Jq.js +2 -0
- package/web/dist/assets/VuvoDeskApp-CU4N6t3c.js +1 -0
- package/web/dist/assets/app--miKlon3.js +2 -0
- package/web/dist/assets/client-8jUbxy3j.js +1 -0
- package/web/dist/assets/icons-CuXJn-Hz.js +1 -0
- package/web/dist/assets/main-DVNv6hc-.js +2 -0
- package/web/dist/assets/preload-helper-DD1OZmLC.js +1 -0
- package/web/dist/assets/pwa-bootstrap-BCid3CYk.js +1 -0
- package/web/dist/assets/pwa-startup-xxamnV7P.js +1 -0
- package/web/dist/assets/react-rvm9rmed.js +9 -0
- package/web/dist/index.html +11 -7
- package/web/dist/sw.js +14 -4
- package/web/dist/vuvodesk-build-evidence.json +93 -73
- package/web/dist/assets/AgentSettingsTab-D0271Ynp.js +0 -1
- package/web/dist/assets/CaptureGallery-C0xqFLap.js +0 -1
- package/web/dist/assets/DesktopUpdatePanel-uMaTnBsl.js +0 -1
- package/web/dist/assets/SettingsPage-BoFLQBfH.js +0 -1
- package/web/dist/assets/SettingsTabs-D0zQN-Mo.js +0 -1
- package/web/dist/assets/SupportPage-D241Vkb1.js +0 -2
- package/web/dist/assets/VuvoDeskApp-36bRXXS2.js +0 -1
- package/web/dist/assets/app-hMd5uyvT.js +0 -1
- package/web/dist/assets/icons-CacEbnZu.js +0 -1
- package/web/dist/assets/main-DT492iHt.js +0 -2
- package/web/dist/assets/react-Cfedt3N5.js +0 -1
- package/web/dist/assets/styles-Ba1tPFHg.js +0 -16
- /package/web/dist/assets/{App-DFLBNvIi.css → HubApp-DFLBNvIi.css} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./pwa-startup-xxamnV7P.js";import{r as c,k as X,S as T,R as xe,x as Ke,y as ye,X as G,z as be,G as ee,I as je,L as V,J as Xe,N as et,O as ve,Q as _e,U as tt,D as st,o as at,V as it,Y as nt,Z as rt,_ as ot}from"./icons-CuXJn-Hz.js";import{s as u}from"./HubApp-AhKLyz3K.js";import"./pwa-bootstrap-BCid3CYk.js";import"./preload-helper-DD1OZmLC.js";import"./MonitorStackIcon-DBuXI_Oa.js";import"./supabase-C7qjtLN3.js";import"./frame-lifecycle-esOdP-EY.js";const ct=new Set(["browserLanguage","platform","online","viewport","timezone","screen"]),lt={id:"browser-safe-v1",collect(){if(typeof navigator>"u")return{};const s={browserLanguage:navigator.language||"",platform:navigator.platform||"",online:navigator.onLine,timezone:typeof Intl>"u"?"":Intl.DateTimeFormat().resolvedOptions().timeZone||"",viewport:typeof window>"u"?void 0:{width:window.innerWidth,height:window.innerHeight},screen:typeof window>"u"?void 0:{width:window.screen.width,height:window.screen.height}};return Object.fromEntries(Object.entries(s).filter(([i,n])=>ct.has(i)&&n!==void 0))}};function dt(s,i="Support request failed."){if(s&&typeof s=="object"&&"message"in s){const n=String(s.message||"").trim();if(n)return n.replace(/^.*Support request failed:\s*/i,"")}return s instanceof Error?s.message:i}function pt(s=lt){return s.collect()}async function ut(s,i="livedesk"){const{data:n,error:d}=await u.from("app_admins").select("role").eq("user_id",s).limit(1);if(d)throw d;const o=n?.[0]?.role||"user";if(o!=="owner"){const{error:x}=await u.rpc("register_product_access",{p_product_key:i,p_access_type:"free"});if(x)throw x}const[y,m,P]=await Promise.all([u.from("products").select("id, product_key, name, description, sort_order").order("sort_order"),u.from("product_admins").select("product_id, role").eq("user_id",s),u.from("user_products").select("product_id").eq("user_id",s).eq("is_active",!0)]);if(y.error)throw y.error;if(m.error)throw m.error;if(P.error)throw P.error;const j=y.data||[],z=(m.data||[]).map(x=>String(x.product_id)),L=(P.data||[]).map(x=>String(x.product_id)),S=o==="owner",k=S?j.map(x=>x.id):[...new Set([...z,...L])];return{products:j,access:{userId:s,globalRole:o,accessibleProductIds:k,managedProductIds:S?j.map(x=>x.id):z,canViewAllProducts:S,canViewAllPrivatePosts:S,canManageAllProducts:S,canCreateAnnouncements:S||z.length>0}}}async function ht(s=""){const{data:i,error:n}=await u.rpc("search_support_posts",{p_query:s.trim()||null,p_limit:250});if(n)throw n;return i||[]}async function mt(s){const{data:i,error:n}=await u.from("support_attachments").select("*").eq("post_id",s).order("created_at");if(n)throw n;const d=i||[];return Promise.all(d.map(async o=>{const y=await u.storage.from("support-attachments").createSignedUrl(o.storage_path,3600);return{...o,signed_url:y.data?.signedUrl||void 0}}))}async function ft(){const{data:s,error:i}=await u.from("support_notifications").select("*").order("created_at",{ascending:!1}).limit(30);if(i)throw i;return s||[]}async function xt(s){const{error:i}=await u.rpc("mark_support_notification_read",{p_notification_id:s});if(i)throw i}async function ge(s){const{data:i,error:n}=await u.from("support_comments").select("*").eq("post_id",s).order("created_at");if(n)throw n;return i||[]}async function yt(s){const{data:i,error:n}=await u.from("support_votes").select("post_id").eq("user_id",s);if(n)throw n;return new Set((i||[]).map(d=>String(d.post_id)))}async function bt(s){const{data:i,error:n}=await u.rpc("create_support_post",{p_product_id:s.productId,p_post_type:s.postType,p_title:s.title,p_body:s.body,p_visibility:s.visibility,p_app_version:s.appVersion||null,p_platform:typeof navigator>"u"?null:navigator.platform||null,p_os_version:typeof navigator>"u"?null:navigator.platform||null,p_environment:s.includeEnvironment?pt():{}});if(n)throw n;const d=Array.isArray(i)?i[0]?.post_id:i?.post_id;if(!d)throw new Error("Support post was not created.");return String(d)}const jt=new Set(["image/png","image/jpeg","image/webp","text/plain","text/markdown","application/json","application/pdf"]);async function vt(s,i){if(!jt.has(i.type))throw new Error("This file type is not allowed.");if(i.size<=0||i.size>10*1024*1024)throw new Error("Attachments must be smaller than 10 MB.");const n=i.name.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"attachment",d=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`${Date.now()}-${Math.random().toString(16).slice(2)}`,o=`${s}/${d}-${n}`,y=await u.storage.from("support-attachments").upload(o,i,{contentType:i.type,upsert:!1});if(y.error)throw y.error;const{data:m,error:P}=await u.rpc("add_support_attachment",{p_post_id:s,p_storage_path:o,p_file_name:n,p_mime_type:i.type,p_size_bytes:i.size});if(P)throw await u.storage.from("support-attachments").remove([o]),P;const j=Array.isArray(m)?m[0]?.attachment_id:m?.attachment_id;if(!j)throw new Error("Attachment metadata was not created.");return String(j)}async function _t(s,i,n,d){const{error:o}=await u.rpc("update_support_post",{p_post_id:s,p_title:i,p_body:n,p_visibility:d});if(o)throw o}async function gt(s,i){const{error:n}=await u.rpc("add_support_comment",{p_post_id:s,p_body:i});if(n)throw n}async function wt(s){const{data:i,error:n}=await u.rpc("toggle_support_vote",{p_post_id:s});if(n)throw n;const d=Array.isArray(i)?i[0]:i;return{voted:!!d?.voted,totalVotes:Number(d?.total_votes||0)}}async function St(s,i){const{error:n}=await u.rpc("change_support_post_status",{p_post_id:s,p_target_status:i});if(n)throw n}async function Nt(s){const{error:i}=await u.rpc("set_support_post_hidden",{p_post_id:s,p_hidden:!0});if(i)throw i}async function Pt(s,i){const{error:n}=await u.rpc("set_support_post_locked",{p_post_id:s,p_locked:i});if(n)throw n}async function kt(s,i){const{error:n}=await u.rpc("set_support_post_pinned",{p_post_id:s,p_pinned:i});if(n)throw n}async function Ct(s,i){const{error:n}=await u.rpc("mark_support_duplicate",{p_post_id:s,p_duplicate_of_post_id:i});if(n)throw n}async function At(s,i){const{error:n}=await u.rpc("accept_support_answer",{p_post_id:s,p_comment_id:i});if(n)throw n}async function qt(s,i=!0){const{error:n}=await u.rpc("hide_support_comment",{p_comment_id:s,p_hidden:i});if(n)throw n}const ae=[{id:"question",label:"Questions",shortLabel:"Question"},{id:"issue",label:"Issues",shortLabel:"Issue"},{id:"feature",label:"Feature Requests",shortLabel:"Feature"},{id:"announcement",label:"Announcements",shortLabel:"Announcement"}],zt=[{id:"all",label:"All statuses"},{id:"needs-response",label:"Needs response"},{id:"open",label:"Open"},{id:"needs-info",label:"Needs more information"},{id:"in-progress",label:"In progress"},{id:"planned",label:"Planned"},{id:"released",label:"Released"},{id:"closed",label:"Closed"}],Et={question:["open","answered","resolved","closed"],issue:["open","needs-info","confirmed","in-progress","fixed","closed"],feature:["under-review","planned","in-progress","released","declined","closed"],announcement:["published","archived"]},Tt={type:"all",product:"",status:"all",visibility:"all",sort:"recent",query:""};function te(){if(typeof window>"u")return Tt;const s=new URLSearchParams(window.location.search),i=window.location.pathname.match(/^\/support\/(questions|issues|features|announcements)$/)?.[1],n=s.get("type")||i||"",d=n==="questions"||n==="question"?"question":n==="issues"||n==="issue"?"issue":n==="features"||n==="feature"?"feature":n==="announcements"||n==="announcement"?"announcement":"all",o=s.get("visibility"),y=s.get("sort");return{type:d,product:s.get("product")||"",status:s.get("status")||"all",visibility:o==="public"||o==="private"?o:"all",sort:y==="votes"||y==="newest"?y:"recent",query:s.get("q")||""}}function It(s){return s==="all"?"":s==="question"?"questions":s==="issue"?"issues":s==="feature"?"features":"announcements"}function Dt(s,i){const n={...s,...i},d=new URLSearchParams;n.product&&d.set("product",n.product),n.status!=="all"&&d.set("status",n.status),n.visibility!=="all"&&d.set("visibility",n.visibility),n.sort!=="recent"&&d.set("sort",n.sort),n.query&&d.set("q",n.query);const o=It(n.type),y=d.toString();return`/support${o?`/${o}`:""}${y?`?${y}`:""}`}function Q(s){const i=new Date(s);return Number.isFinite(i.getTime())?i.toLocaleString(void 0,{dateStyle:"medium",timeStyle:"short"}):s}function se(s){return s.replaceAll("-"," ").replace(/\b\w/g,i=>i.toUpperCase())}function we(s){return s==="question"?it:s==="issue"?nt:s==="feature"?rt:ot}function Se(s){return ae.find(i=>i.id===s)?.shortLabel||s}function b(s){const i=dt(s);return/relation .* does not exist|function .* does not exist|schema cache/i.test(i)?"Support Board database is not installed yet. Apply the latest Supabase migration first.":/not-authenticated|jwt/i.test(i)?"Sign in again to use Support.":/product-access-denied|product-not-found/i.test(i)?"You do not have access to this product.":i}function Yt({session:s,currentProductKey:i="livedesk",appVersion:n="",onSignIn:d}){const[o,y]=c.useState(()=>te()),[m,P]=c.useState(null),[j,z]=c.useState([]),[L,S]=c.useState([]),[k,x]=c.useState(""),[R,U]=c.useState([]),[$,ie]=c.useState([]),[M,W]=c.useState([]),[ne,re]=c.useState(()=>new Set),[Z,J]=c.useState(!0),[v,f]=c.useState(""),[oe,p]=c.useState(""),[Ne,O]=c.useState(!1),[Pe,B]=c.useState(!1),[F,ce]=c.useState(""),[le,K]=c.useState(()=>te().query),[ke,de]=c.useState(!1),[Ce,Ae]=c.useState(!1),[qe,ze]=c.useState(""),[pe,Ee]=c.useState(""),[Te,Ie]=c.useState("free"),[De,Ve]=c.useState(""),[ue,Le]=c.useState(""),[Re,Ue]=c.useState("admin"),[I,he]=c.useState(""),[me,Vt]=c.useState(""),[Y,fe]=c.useState([]),[h,A]=c.useState({productId:"",postType:"question",title:"",body:"",visibility:"public",includeEnvironment:!0,files:[]}),N=c.useCallback(t=>{const r={...o,...t};y(r),typeof window<"u"&&window.history.pushState({},"",Dt(o,t))},[o]);c.useEffect(()=>{const t=()=>y(te());return window.addEventListener("popstate",t),()=>window.removeEventListener("popstate",t)},[]);const _=c.useCallback(async()=>{const t=await ht(o.query);return S(t),s?.user.id&&re(await yt(s.user.id)),t},[o.query,s?.user.id]),H=c.useCallback(async()=>{if(!s?.user.id){P(null),z([]),S([]),x(""),W([]),J(!1);return}J(!0),p("");try{const t=await ut(s.user.id,i);P(t.access),z(t.products),await _(),W(await ft())}catch(t){p(b(t))}finally{J(!1)}},[i,_,s?.user.id]);c.useEffect(()=>{H()},[H]);const g=c.useMemo(()=>{if(!m)return[];const t=j.find(r=>r.product_key===i);return t?m.canViewAllProducts||m.accessibleProductIds.includes(t.id)?[t]:[]:[]},[m,i,j]),D=g[0]?.id||"",q=c.useMemo(()=>{const t=new Map(j.map(l=>[l.id,l.product_key]));return[...L.filter(l=>o.type!=="all"&&l.post_type!==o.type||!D||l.product_id!==D||o.status==="needs-response"&&!["open","needs-info"].includes(l.status)||o.status!=="all"&&o.status!=="needs-response"&&l.status!==o.status||o.visibility!=="all"&&l.visibility!==o.visibility?!1:t.has(l.product_id))].sort((l,w)=>o.sort==="votes"?w.vote_count-l.vote_count||w.updated_at.localeCompare(l.updated_at):o.sort==="newest"?w.created_at.localeCompare(l.created_at):Number(w.is_pinned)-Number(l.is_pinned)||w.updated_at.localeCompare(l.updated_at))},[L,j,o.sort,o.status,o.type,o.visibility,D]),a=q.find(t=>t.id===k)||q[0]||null,E=!!(a&&m&&(m.canViewAllProducts||m.managedProductIds.includes(a.product_id))),$e=!!(a&&s?.user.id===a.author_id)||E;c.useEffect(()=>{if(!a){x(""),U([]),B(!1);return}a.id!==k&&x(a.id)},[a,k]),c.useEffect(()=>{let t=!0;return k?(ge(k).then(r=>{t&&U(r)}).catch(r=>{t&&p(b(r))}),mt(k).then(r=>{t&&ie(r)}).catch(r=>{t&&p(b(r))}),()=>{t=!1}):(U([]),ie([]),()=>{t=!1})},[k]),c.useEffect(()=>{!h.productId&&g[0]&&A(t=>({...t,productId:D||g[0].id}))},[g,h.productId,D]),c.useEffect(()=>{K(o.query)},[o.query]),c.useEffect(()=>{!pe&&g[0]&&Ee(g[0].id),!ue&&g[0]&&Le(g[0].id)},[g,pe,ue]);const C=t=>{a&&S(r=>r.map(l=>l.id===a.id?{...l,...t}:l))},Me=async t=>{if(t.preventDefault(),!(!s||!h.productId)){f("create"),p("");try{const r=await bt({productId:h.productId,postType:h.postType,title:h.title,body:h.body,visibility:h.postType==="announcement"?"public":h.visibility,appVersion:n,includeEnvironment:h.postType==="issue"&&h.includeEnvironment});for(const w of Y)await vt(r,w);const l=await _();O(!1),fe([]),A(w=>({...w,title:"",body:"",files:[]})),x(r),l.some(w=>w.id===r)||await H()}catch(r){p(b(r))}finally{f("")}}},Oe=async t=>{if(t.preventDefault(),!!a){f("edit"),p("");try{await _t(a.id,a.title,a.body,a.visibility),B(!1),await _()}catch(r){p(b(r))}finally{f("")}}},Be=async t=>{if(t.preventDefault(),!(!a||!F.trim())){f("comment"),p("");try{await gt(a.id,F),ce(""),U(await ge(a.id)),await _()}catch(r){p(b(r))}finally{f("")}}},Fe=async()=>{if(!(!a||a.post_type!=="feature")){f("vote"),p("");try{const t=await wt(a.id);re(r=>{const l=new Set(r);return t.voted?l.add(a.id):l.delete(a.id),l}),C({vote_count:t.totalVotes})}catch(t){p(b(t))}finally{f("")}}},Ye=async t=>{if(a){f("status"),p("");try{await St(a.id,t),C({status:t}),await _()}catch(r){p(b(r))}finally{f("")}}},He=async()=>{if(!(!a||!window.confirm("Hide this Support post from the board?"))){f("hide"),p("");try{await Nt(a.id),x(""),await _()}catch(t){p(b(t))}finally{f("")}}},Ge=async()=>{if(a){f("lock"),p("");try{await Pt(a.id,!a.is_locked),C({is_locked:!a.is_locked}),await _()}catch(t){p(b(t))}finally{f("")}}},Qe=async()=>{if(a){f("pin"),p("");try{await kt(a.id,!a.is_pinned),C({is_pinned:!a.is_pinned}),await _()}catch(t){p(b(t))}finally{f("")}}},We=async t=>{if(a){f(`accept-${t}`),p("");try{await At(a.id,t),C({accepted_comment_id:t,status:a.post_type==="question"?"answered":a.status}),await _()}catch(r){p(b(r))}finally{f("")}}},Ze=async()=>{if(!(!a||!I||I===a.id)){f("duplicate"),p("");try{await Ct(a.id,I),x(""),he(""),await _()}catch(t){p(b(t))}finally{f("")}}},Je=async t=>{if(!t.read_at)try{await xt(t.id),W(r=>r.map(l=>l.id===t.id?{...l,read_at:new Date().toISOString()}:l))}catch(r){p(b(r))}t.post_id&&x(t.post_id),de(!1)};return s?Z&&!m?e.jsxs("section",{className:"support-page support-loading",children:[e.jsx(xe,{className:"support-spin",size:23})," Loading Support Board..."]}):e.jsxs("section",{className:"support-page",children:[e.jsx("header",{className:"support-page-header support-page-actions-only",children:e.jsxs("div",{className:"support-header-actions",children:[e.jsxs("div",{className:"support-notification-wrap",children:[e.jsxs("button",{className:"support-secondary-button",type:"button",onClick:()=>de(t=>!t),title:"Notifications",children:[e.jsx(Ke,{size:16})," ",M.filter(t=>!t.read_at).length>0&&e.jsx("b",{children:M.filter(t=>!t.read_at).length})]}),ke&&e.jsxs("div",{className:"support-notification-popover",children:[e.jsx("strong",{children:"Notifications"}),M.length===0?e.jsx("span",{className:"support-muted",children:"No notifications yet."}):M.map(t=>e.jsxs("button",{type:"button",className:t.read_at?"":"unread",onClick:()=>{Je(t)},children:[e.jsx("b",{children:t.title}),e.jsx("span",{children:t.body}),e.jsx("small",{children:Q(t.created_at)})]},t.id))]})]}),m?.canViewAllProducts&&e.jsxs("button",{className:"support-secondary-button",type:"button",onClick:()=>Ae(t=>!t),children:[e.jsx(T,{size:16})," Admin"]}),e.jsxs("button",{className:"support-secondary-button",type:"button",onClick:()=>{H()},disabled:Z,children:[e.jsx(xe,{size:16,className:Z?"support-spin":""})," Refresh"]}),e.jsxs("button",{className:"support-primary-button",type:"button",onClick:()=>O(!0),disabled:g.length===0,children:[e.jsx(ye,{size:17})," New request"]})]})}),oe&&e.jsxs("div",{className:"support-error",role:"alert",children:[e.jsx(G,{size:17})," ",e.jsx("span",{children:oe}),e.jsx("button",{type:"button",onClick:()=>p(""),"aria-label":"Dismiss error",children:e.jsx(G,{size:15})})]}),Ne&&e.jsxs("form",{className:"support-composer",onSubmit:t=>{Me(t)},children:[e.jsxs("div",{className:"support-section-heading",children:[e.jsxs("div",{children:[e.jsx("span",{children:"New Support request"}),e.jsx("strong",{children:"Describe one actionable problem or idea."})]}),e.jsx("button",{className:"support-icon-button",type:"button",onClick:()=>O(!1),"aria-label":"Close composer",children:e.jsx(G,{size:18})})]}),e.jsxs("div",{className:"support-form-grid",children:[e.jsxs("label",{children:[e.jsx("span",{children:"Type"}),e.jsx("select",{value:h.postType,onChange:t=>A(r=>({...r,postType:t.target.value})),children:ae.filter(t=>t.id!=="announcement"||m?.canCreateAnnouncements).map(t=>e.jsx("option",{value:t.id,children:t.label},t.id))})]}),e.jsxs("label",{className:"support-form-wide",children:[e.jsx("span",{children:"Title"}),e.jsx("input",{required:!0,minLength:3,maxLength:180,value:h.title,onChange:t=>A(r=>({...r,title:t.target.value})),placeholder:"A short, searchable summary"})]}),e.jsxs("label",{className:"support-form-wide",children:[e.jsx("span",{children:h.postType==="issue"?"What happened?":h.postType==="feature"?"Describe the desired behavior":h.postType==="announcement"?"Announcement":"Question"}),e.jsx("textarea",{required:!0,value:h.body,onChange:t=>A(r=>({...r,body:t.target.value})),placeholder:"Include the context another person needs to respond.",rows:6})]}),e.jsxs("label",{children:[e.jsx("span",{children:"Visibility"}),e.jsxs("select",{value:h.visibility,disabled:h.postType==="announcement",onChange:t=>A(r=>({...r,visibility:t.target.value})),children:[e.jsx("option",{value:"public",children:"Public"}),e.jsx("option",{value:"private",children:"Private"})]})]}),h.postType==="issue"&&e.jsxs("label",{className:"support-checkbox",children:[e.jsx("input",{type:"checkbox",checked:h.includeEnvironment,onChange:t=>A(r=>({...r,includeEnvironment:t.target.checked}))}),e.jsx("span",{children:"Attach safe browser/runtime details"})]}),e.jsxs("label",{className:"support-form-wide",children:[e.jsx("span",{children:"Attachments"}),e.jsx("input",{type:"file",multiple:!0,accept:"image/png,image/jpeg,image/webp,text/plain,text/markdown,application/json,application/pdf",onChange:t=>fe(Array.from(t.target.files||[]).slice(0,5))}),e.jsx("small",{className:"support-muted",children:"Up to 5 files, 10 MB each. Images, text, JSON, Markdown, and PDF."})]})]}),e.jsxs("div",{className:"support-composer-footer",children:[e.jsx("span",{children:Y.length>0?`${Y.length} attachment${Y.length===1?"":"s"} selected.`:"Private posts are visible only to you and VuvoDesk Support."}),e.jsxs("button",{className:"support-primary-button",type:"submit",disabled:v==="create",children:[e.jsx(be,{size:16})," ",v==="create"?"Submitting...":"Submit request"]})]})]}),e.jsxs("div",{className:"support-tabs",role:"tablist","aria-label":"Support post type",children:[e.jsx("button",{className:o.type==="all"?"active":"",type:"button",onClick:()=>N({type:"all"}),children:"All"}),ae.map(t=>{const r=we(t.id);return e.jsxs("button",{className:o.type===t.id?"active":"",type:"button",onClick:()=>N({type:t.id}),children:[e.jsx(r,{size:15})," ",t.label]},t.id)})]}),Ce&&m?.canViewAllProducts&&e.jsxs("section",{className:"support-admin-panel",children:[e.jsxs("div",{className:"support-section-heading",children:[e.jsxs("div",{children:[e.jsx("span",{children:"VuvoDesk owner controls"}),e.jsx("strong",{children:"Manage VuvoDesk support access and staff roles by email."})]}),e.jsx(T,{size:19})]}),e.jsxs("div",{className:"support-admin-grid",children:[e.jsxs("form",{onSubmit:t=>{},children:[e.jsx("strong",{children:"Grant VuvoDesk access"}),e.jsx("input",{type:"email",required:!0,placeholder:"User email",value:qe,onChange:t=>ze(t.target.value)}),e.jsxs("select",{value:Te,onChange:t=>Ie(t.target.value),children:[e.jsx("option",{value:"free",children:"Free"}),e.jsx("option",{value:"user",children:"User"}),e.jsx("option",{value:"paid",children:"Paid"}),e.jsx("option",{value:"beta",children:"Beta"}),e.jsx("option",{value:"staff",children:"Staff"})]}),e.jsxs("button",{className:"support-secondary-button",type:"submit",disabled:me==="access",children:[e.jsx(ee,{size:15})," Grant access"]})]}),e.jsxs("form",{onSubmit:t=>{},children:[e.jsx("strong",{children:"Assign VuvoDesk staff"}),e.jsx("input",{type:"email",required:!0,placeholder:"Staff email",value:De,onChange:t=>Ve(t.target.value)}),e.jsxs("select",{value:Re,onChange:t=>Ue(t.target.value),children:[e.jsx("option",{value:"admin",children:"Admin"}),e.jsx("option",{value:"support",children:"Support"}),e.jsx("option",{value:"moderator",children:"Moderator"})]}),e.jsxs("button",{className:"support-secondary-button",type:"submit",disabled:me==="product-admin",children:[e.jsx(T,{size:15})," Assign staff"]})]})]})]}),e.jsxs("form",{className:"support-search-bar",onSubmit:t=>{t.preventDefault(),N({query:le.trim()})},children:[e.jsxs("label",{children:[e.jsx("span",{children:"Search Support"}),e.jsx("input",{value:le,onChange:t=>K(t.target.value),placeholder:"Search titles and request details"})]}),e.jsxs("button",{className:"support-secondary-button",type:"submit",children:[e.jsx(je,{size:15})," Search"]}),o.query&&e.jsx("button",{className:"support-icon-button",type:"button",onClick:()=>{K(""),N({query:""})},"aria-label":"Clear search",children:e.jsx(G,{size:16})})]}),e.jsxs("div",{className:"support-filter-bar",children:[e.jsxs("div",{className:"support-filter-title",children:[e.jsx(je,{size:16}),e.jsx("span",{children:"Filter"})]}),e.jsxs("label",{children:[e.jsx("span",{children:"Status"}),e.jsx("select",{value:o.status,onChange:t=>N({status:t.target.value}),children:zt.map(t=>e.jsx("option",{value:t.id,children:t.label},t.id))})]}),e.jsxs("label",{children:[e.jsx("span",{children:"Visibility"}),e.jsxs("select",{value:o.visibility,onChange:t=>N({visibility:t.target.value}),children:[e.jsx("option",{value:"all",children:"All visibility"}),e.jsx("option",{value:"public",children:"Public"}),e.jsx("option",{value:"private",children:"Private"})]})]}),e.jsxs("label",{children:[e.jsx("span",{children:"Sort"}),e.jsxs("select",{value:o.sort,onChange:t=>N({sort:t.target.value}),children:[e.jsx("option",{value:"recent",children:"Recently updated"}),e.jsx("option",{value:"newest",children:"Newest"}),e.jsx("option",{value:"votes",children:"Most votes"})]})]})]}),m?.canViewAllProducts&&e.jsxs("div",{className:"support-admin-shortcuts",children:[e.jsxs("span",{children:[e.jsx(T,{size:15})," VuvoDesk owner"]}),e.jsx("button",{type:"button",onClick:()=>N({status:"needs-response"}),children:"Needs response"}),e.jsx("button",{type:"button",onClick:()=>N({visibility:"private"}),children:"Private requests"}),e.jsx("button",{type:"button",onClick:()=>N({type:"feature",status:"all",sort:"votes"}),children:"High-vote features"})]}),e.jsxs("div",{className:"support-board-layout",children:[e.jsxs("section",{className:"support-post-list","aria-label":"Support posts",children:[e.jsxs("div",{className:"support-list-heading",children:[e.jsxs("span",{children:[q.length," request",q.length===1?"":"s"]}),e.jsx("small",{children:"VuvoDesk"})]}),q.length===0?e.jsxs("div",{className:"support-list-empty",children:[e.jsx(X,{size:25}),e.jsx("strong",{children:"No posts match these filters."}),e.jsx("span",{children:"Start with a focused question, issue report, or feature request."}),g.length>0&&e.jsxs("button",{className:"support-secondary-button",type:"button",onClick:()=>O(!0),children:[e.jsx(ye,{size:16})," Create the first request"]})]}):q.map(t=>{const r=we(t.post_type);return e.jsxs("button",{type:"button",className:`support-post-row ${t.id===a?.id?"active":""}`,onClick:()=>{x(t.id),B(!1)},children:[e.jsx("span",{className:"support-post-row-icon",children:e.jsx(r,{size:17})}),e.jsxs("span",{className:"support-post-row-copy",children:[e.jsxs("span",{className:"support-post-row-meta",children:[e.jsx("em",{children:Se(t.post_type)}),t.visibility==="private"&&e.jsx(V,{size:13})]}),e.jsx("strong",{children:t.title}),e.jsxs("small",{children:[se(t.status)," · ",Q(t.updated_at)," · ",t.comment_count," comments"]})]}),t.post_type==="feature"&&e.jsxs("span",{className:"support-vote-count",children:[e.jsx(Xe,{size:14})," ",t.vote_count]})]},t.id)})]}),e.jsx("section",{className:"support-post-detail","aria-label":"Support post detail",children:a?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"support-detail-head",children:[e.jsxs("div",{className:"support-detail-badges",children:[e.jsx("span",{className:"support-type-badge",children:Se(a.post_type)}),e.jsx("span",{className:`support-status-badge status-${a.status}`,children:se(a.status)}),a.visibility==="private"&&e.jsxs("span",{className:"support-private-badge",children:[e.jsx(V,{size:13})," Private"]})]}),e.jsxs("div",{className:"support-detail-actions",children:[$e&&e.jsx("button",{className:"support-icon-button",type:"button",onClick:()=>B(t=>!t),title:"Edit post",children:e.jsx(et,{size:16})}),E&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"support-icon-button",type:"button",onClick:()=>{Qe()},disabled:v==="pin",title:a.is_pinned?"Unpin post":"Pin post",children:e.jsx(ve,{size:16})}),e.jsx("button",{className:"support-icon-button",type:"button",onClick:()=>{Ge()},disabled:v==="lock",title:a.is_locked?"Unlock post":"Lock post",children:e.jsx(V,{size:16})}),e.jsx("button",{className:"support-icon-button danger",type:"button",onClick:()=>{He()},disabled:v==="hide",title:"Hide post",children:e.jsx(_e,{size:16})})]})]})]}),Pe?e.jsxs("form",{className:"support-edit-form",onSubmit:t=>{Oe(t)},children:[e.jsx("input",{value:a.title,onChange:t=>C({title:t.target.value}),minLength:3,maxLength:180,required:!0}),e.jsx("textarea",{value:a.body,onChange:t=>C({body:t.target.value}),rows:9,required:!0}),e.jsxs("div",{className:"support-edit-actions",children:[e.jsxs("select",{value:a.visibility,onChange:t=>C({visibility:t.target.value}),children:[e.jsx("option",{value:"public",children:"Public"}),e.jsx("option",{value:"private",children:"Private"})]}),e.jsxs("button",{className:"support-primary-button",type:"submit",disabled:v==="edit",children:[e.jsx(ee,{size:16})," Save changes"]})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("h3",{children:a.title}),e.jsx("div",{className:"support-detail-body",children:a.body.split(`
|
|
2
|
+
`).map((t,r)=>e.jsx("p",{children:t||" "},`${a.id}-body-${r}`))})]}),e.jsxs("div",{className:"support-detail-meta",children:[e.jsxs("span",{children:["Opened ",Q(a.created_at)]}),a.app_version&&e.jsxs("span",{children:["Version ",a.app_version]}),a.platform&&e.jsx("span",{children:a.platform}),a.is_locked&&e.jsxs("span",{children:[e.jsx(V,{size:13})," Locked"]}),a.is_pinned&&e.jsxs("span",{children:[e.jsx(ve,{size:13})," Pinned"]})]}),e.jsxs("div",{className:"support-detail-controls",children:[a.post_type==="feature"&&e.jsxs("button",{className:`support-vote-button ${ne.has(a.id)?"voted":""}`,type:"button",onClick:()=>{Fe()},disabled:v==="vote",children:[e.jsx(tt,{size:16})," ",ne.has(a.id)?"Voted":"Vote"," ",e.jsx("b",{children:a.vote_count})]}),E&&e.jsxs("label",{className:"support-status-control",children:[e.jsx("span",{children:"Change status"}),e.jsx("select",{value:a.status,onChange:t=>{Ye(t.target.value)},disabled:v==="status",children:(Et[a.post_type]||[]).map(t=>e.jsx("option",{value:t,children:se(t)},t))})]}),E&&e.jsxs(e.Fragment,{children:[e.jsxs("select",{className:"support-status-control",value:I,onChange:t=>he(t.target.value),children:[e.jsx("option",{value:"",children:"Duplicate of..."}),q.filter(t=>t.id!==a.id&&t.product_id===a.product_id).map(t=>e.jsx("option",{value:t.id,children:t.title.slice(0,55)},t.id))]}),e.jsx("button",{className:"support-secondary-button",type:"button",onClick:()=>{Ze()},disabled:!I||v==="duplicate",children:"Merge duplicate"})]})]}),$.length>0&&e.jsxs("div",{className:"support-attachments",children:[e.jsx("div",{className:"support-section-heading",children:e.jsxs("div",{children:[e.jsx("span",{children:"Attachments"}),e.jsxs("strong",{children:[$.length," file",$.length===1?"":"s"]})]})}),$.map(t=>e.jsxs("a",{href:t.signed_url,target:"_blank",rel:"noreferrer",children:[e.jsx(st,{size:14})," ",t.file_name,e.jsxs("small",{children:[Math.ceil(t.size_bytes/1024)," KB"]})]},t.id))]}),e.jsxs("div",{className:"support-comments",children:[e.jsxs("div",{className:"support-section-heading",children:[e.jsxs("div",{children:[e.jsx("span",{children:"Discussion"}),e.jsxs("strong",{children:[R.length," comment",R.length===1?"":"s"]})]}),a.is_locked&&e.jsxs("span",{className:"support-locked-label",children:[e.jsx(V,{size:14})," Locked"]})]}),R.length===0?e.jsx("p",{className:"support-muted",children:"No response yet. Keep the conversation focused on this request."}):e.jsx("div",{className:"support-comment-list",children:R.map(t=>e.jsxs("article",{className:`support-comment ${t.is_staff_answer?"staff":""} ${a.accepted_comment_id===t.id?"accepted":""}`,children:[e.jsxs("div",{className:"support-comment-head",children:[e.jsx("strong",{children:t.is_staff_answer?"VuvoDesk Support":t.author_id===s.user.id?"You":"Support user"}),t.is_staff_answer&&e.jsxs("span",{children:[e.jsx(T,{size:13})," Staff answer"]}),a.accepted_comment_id===t.id&&e.jsxs("span",{children:[e.jsx(at,{size:13})," Accepted"]}),e.jsx("time",{children:Q(t.created_at)})]}),e.jsx("p",{children:t.body}),e.jsxs("div",{className:"support-comment-actions",children:[(s.user.id===a.author_id||E)&&a.post_type==="question"&&a.accepted_comment_id!==t.id&&e.jsxs("button",{className:"support-secondary-button",type:"button",onClick:()=>{We(t.id)},disabled:v===`accept-${t.id}`,children:[e.jsx(ee,{size:14})," Accept answer"]}),E&&e.jsx("button",{className:"support-icon-button danger",type:"button",onClick:()=>{qt(t.id)},title:"Hide comment",children:e.jsx(_e,{size:14})})]})]},t.id))}),!a.is_locked&&e.jsxs("form",{className:"support-comment-form",onSubmit:t=>{Be(t)},children:[e.jsx("textarea",{value:F,onChange:t=>ce(t.target.value),placeholder:"Add a focused reply...",rows:3}),e.jsxs("button",{className:"support-primary-button",type:"submit",disabled:v==="comment"||!F.trim(),children:[e.jsx(be,{size:15})," Reply"]})]})]})]}):e.jsxs("div",{className:"support-detail-empty",children:[e.jsx(X,{size:28}),e.jsx("strong",{children:"Select a Support request"}),e.jsx("span",{children:"Its discussion and staff actions will appear here."})]})})]})]}):e.jsx("section",{className:"support-page support-auth-page",children:e.jsxs("div",{className:"support-empty-hero",children:[e.jsx("span",{className:"support-hero-icon",children:e.jsx(X,{size:28})}),e.jsx("p",{className:"support-eyebrow",children:"VuvoDesk Support"}),e.jsx("h2",{children:"Get help, report issues, and shape the product."}),e.jsx("p",{children:"Sign in to view VuvoDesk support and submit a private or public request."}),e.jsxs("button",{className:"support-primary-button",type:"button",onClick:d,children:[e.jsx(T,{size:17})," Sign in with Google"]})]})})}export{Yt as SupportPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e}from"./pwa-startup-xxamnV7P.js";import{r,j as te,M as ce,B as Je,k as Ye,C as Qe,l as De,m as Ie,X as Se,S as $e,n as Ze,o as Fe,p as et,q as ke,s as tt,t as nt,H as Ne,W as st,u as it,v as rt,w as at,A as ot,K as ct}from"./icons-CuXJn-Hz.js";import{SupportPage as lt}from"./SupportPage-B16Jl8Jq.js";import{s as V,g as Ce,n as ut,r as dt,a as Ee,b as ht,f as Te,A as mt,H as ft}from"./HubApp-AhKLyz3K.js";import{DesktopUpdatePanel as pt}from"./DesktopUpdatePanel-CiGXFhqj.js";import{M as gt,w as bt,i as wt,D as ne,r as vt,h as xt}from"./MonitorStackIcon-DBuXI_Oa.js";import"./pwa-bootstrap-BCid3CYk.js";import"./preload-helper-DD1OZmLC.js";import"./supabase-C7qjtLN3.js";import"./frame-lifecycle-esOdP-EY.js";function yt(i=[]){return[...new Set(i.filter(t=>typeof t=="string").map(t=>t.trim()).filter(Boolean))]}function jt(i=[],t=new Set){return i.find(c=>!t.has(c))||""}function St(i=[],t=new Set){const c=new Set(i);return new Set([...t].filter(o=>c.has(o)))}const kt="client-runtime-connection-unavailable",Nt="VuvoDesk Client is reconnecting to the service on this computer.",Ct=/failed to fetch|fetch failed|network request failed|networkerror when attempting to fetch resource|load failed|signal timed out|operation was aborted due to timeout|the operation timed out/i;function Oe(i,t){if(!i||typeof i!="object")return"";const c=i[t];return typeof c=="string"?c.trim():""}function le(i){return typeof i=="string"?i.trim():Oe(i,"message")||String(i??"").trim()}function Re(i){return/supabase-user-verification-failed:(401|403)/i.test(i)?"Saved sign-in needs refresh. VuvoDesk will retry it automatically.":i}function Ae(i){const t=le(i)||"Client status could not be refreshed.",c=Oe(i,"name").toLowerCase();return c==="timeouterror"||c==="aborterror"||Ct.test(t)?{key:kt,message:Nt}:{key:`client-status-poll:${t}`,message:t}}function Et({actionError:i="",discoveryWakeError:t=null,statusPollError:c=null,runtimeError:o=""}={}){const u=le(i);if(u)return{key:`client-action:${u}`,message:Re(u)};if(t?.key&&t?.message)return t;if(c?.key&&c?.message)return c;const p=le(o);return p?{key:`client-runtime:${p}`,message:Re(p)}:null}function Tt(i,t){if(!t?.message)return{nextKey:"",message:null};const c=String(t.key||t.message).trim();return String(i||"")===c?{nextKey:c,message:null}:{nextKey:c,message:t.message}}const Rt=[{id:"docs",label:"Doc",icon:Je},{id:"support",label:"Support",icon:Ye},{id:"pricing",label:"Pricing",icon:Qe},{id:"settings",label:"Settings",icon:De}],Pe=[0,1e3,2e3,5e3,1e4,2e4,3e4],At=15e3;function Pt(i=""){const t=i.trim().replace(/\/+$/,"");return t||(typeof window>"u"?"":window.location.port==="5179"?window.location.origin:"http://127.0.0.1:5179")}async function H(i,t=!1){const c=t?"":sessionStorage.getItem("livedesk.client.csrf");if(c)return c;const o=await fetch(`${i}/api/runtime/status`,{cache:"no-store"}),u=await o.json().catch(()=>({}));if(!o.ok)throw new Error(u.error||`Client runtime returned HTTP ${o.status}.`);const p=String(u.csrfToken||"");return p&&sessionStorage.setItem("livedesk.client.csrf",p),p}function ue(i){return`${Math.max(0,Math.min(100,Number(i||0))).toFixed(0)}%`}function oe(i){return Number.isFinite(i)?`${Math.max(0,Math.min(100,Number(i))).toFixed(0)}%`:"—"}function Me(i){return Number.isFinite(i)?ue(Number(i)):"0%"}function U(i){const t=Number(i);return!Number.isFinite(t)||t<0?"—":t>=1024**4?`${(t/1024**4).toFixed(t>=10*1024**4?0:1)} TB`:t>=1024**3?`${(t/1024**3).toFixed(t>=10*1024**3?0:1)} GB`:`${(t/1024**2).toFixed(0)} MB`}function Le(i){const t=Math.max(0,Number(i||0));return t>=1024**3?`${(t/1024**3).toFixed(1)} GB/s`:t>=1024**2?`${(t/1024**2).toFixed(1)} MB/s`:t>=1024?`${(t/1024).toFixed(1)} KB/s`:`${t.toFixed(0)} B/s`}function Lt(i,t){const c=Number(i||0)/1073741824,o=Number(t||0)/1024**3;return o>0?`${c.toFixed(1)} / ${o.toFixed(1)} GB`:"Checking..."}function Dt(i,t){return!Number.isFinite(t)||Number(t)<=0?"Dedicated memory unavailable":Number.isFinite(i)?`${U(i)} / ${U(t)}`:`${U(t)} available`}function It(i){const t=Math.max(0,Math.floor(Number(i||0)/60)),c=Math.floor(t/1440),o=Math.floor(t%1440/60),u=t%60;return c>0?`${c}d ${o}h`:o>0?`${o}h ${u}m`:`${u}m`}function ee({icon:i,label:t,value:c,detail:o,percent:u}){return e.jsxs("article",{className:"client-resource-metric",children:[e.jsxs("div",{className:"client-resource-metric-head",children:[e.jsx(i,{size:17}),e.jsx("span",{children:t}),e.jsx("strong",{children:c})]}),e.jsx("small",{title:o,children:o}),e.jsx("i",{"aria-hidden":"true",children:e.jsx("b",{style:{width:Me(u)}})})]})}function $t(i,t){const c=i?.user.user_metadata||{},o=c.full_name||c.name||c.preferred_username||i?.user.email||i?.user.id||t?.userName||t?.auth?.name||t?.userEmail||t?.userId||"Account";return String(o).trim()||"Account"}function Ft(i,t){const c=i?.user.user_metadata||{};return yt([c.avatar_url,c.picture,t?.userAvatarUrl,t?.auth?.avatarUrl])}function Ot({page:i,status:t}){const o={docs:{label:"DOC",title:"Using this computer",body:"This computer connects to its assigned Hub automatically. Keep VuvoDesk running and manage screens, files, and remote control from the Hub."},pricing:{label:"PRICING",title:"VuvoDesk plans",body:"Plans are based on how many computers the Hub manages. This Client computer does not need a separate subscription or setup."},settings:{label:"SETTINGS",title:"Computer preferences",body:"VuvoDesk keeps the verified sign-in on this computer and reconnects to the assigned Hub automatically."}}[i];return e.jsxs("section",{className:"client-service-page",children:[e.jsx("span",{className:"client-unified-section-label",children:o.label}),e.jsx("h2",{children:o.title}),e.jsx("p",{children:o.body}),e.jsxs("div",{className:"client-service-page-card",children:[i==="docs"&&e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"Automatic connection"}),e.jsx("span",{children:"Start VuvoDesk. This computer signs in, finds the Hub, and becomes available without another action."})]}),i==="pricing"&&e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"One plan, managed at the Hub"}),e.jsx("span",{children:"Computer access follows the account and plan used by the Hub."})]}),i==="settings"&&e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:"Saved sign-in"}),e.jsx("span",{children:t?.auth?.persisted?"Enabled on this computer":"Sign in once to enable automatic reconnection"})]})]}),i==="settings"&&e.jsx(pt,{})]})}function Mt({session:i,status:t,pin:c,roleChangeMessage:o,videoAccelerationBusy:u,slotInput:p,slotBusy:v,onSignIn:R,onPinChange:_,onSubmitPin:C,onSlotInputChange:d,onSaveSlot:A,onEnableVideoAcceleration:k}){const j=t?.connectionState==="connected",g=t?.videoAcceleration,$=u||g?.busy||g?.state==="installing",b=g?.ready?`${g.encoder||"H.264"} · ${g.driver||"VAAPI"}`:$?"Setting up…":g?.message||"Setup available",y=t?.system?.memoryTotalBytes?Number(t.system.memoryUsedBytes||0)/t.system.memoryTotalBytes*100:0,P=t?.system?.gpus||[],w=P.find(h=>Number.isFinite(h.usagePercent)||Number.isFinite(h.memoryTotalBytes))||P[0],z=Number.isFinite(w?.usagePercent)?Number(w?.usagePercent):null,G=Number.isFinite(w?.memoryTotalBytes)&&Number(w?.memoryTotalBytes)>0&&Number.isFinite(w?.memoryUsedBytes)?Number(w?.memoryUsedBytes)/Number(w?.memoryTotalBytes)*100:null,E=t?.system?.disks||[],T=t?.system?.network,B=!!T?.sampledAt,N=T?.interfaces||[],S=[...new Set(N.map(h=>h.name).filter(Boolean))],L=N.map(h=>h.address).filter(Boolean);return e.jsxs("section",{className:"client-home-page",children:[e.jsxs("header",{className:"client-home-heading",children:[e.jsxs("div",{children:[e.jsx("p",{className:"client-unified-eyebrow",children:"THIS COMPUTER"}),e.jsx("h2",{children:t?.deviceName||"This Computer"})]}),e.jsxs("span",{className:`client-unified-role-chip ${j?"connected":""}`,children:[e.jsx(ce,{size:15})," ",j?"Online":"Connecting"]})]}),e.jsxs("div",{className:"client-home-layout",children:[e.jsxs("section",{className:"client-main-surface","aria-label":"Client computer",children:[e.jsxs("div",{className:"client-main-surface-head",children:[e.jsxs("div",{children:[e.jsx("span",{className:"client-unified-section-label",children:"SYSTEM STATUS"}),e.jsx("strong",{children:"Hardware at a glance"})]}),e.jsxs("small",{children:[e.jsx(et,{size:14})," Uptime ",It(t?.system?.uptimeSeconds)]})]}),e.jsxs("div",{className:"client-system-dashboard",children:[e.jsxs("section",{className:"client-performance-panel","aria-label":"Performance",children:[e.jsxs("div",{className:"client-system-subhead",children:[e.jsxs("div",{children:[e.jsx("span",{className:"client-unified-section-label",children:"PERFORMANCE"}),e.jsx("strong",{children:"Live resources"})]}),e.jsx("small",{children:"Live updates"})]}),e.jsxs("div",{className:"client-live-metrics",children:[e.jsx(ee,{icon:ke,label:"CPU",value:ue(t?.system?.cpuUsagePercent),detail:t?.system?.cpuLogicalCores?`${t.system.cpuLogicalCores} logical cores · Current processor usage`:"Current processor usage",percent:t?.system?.cpuUsagePercent}),e.jsx(ee,{icon:tt,label:"Memory",value:ue(y),detail:Lt(t?.system?.memoryUsedBytes,t?.system?.memoryTotalBytes),percent:y}),e.jsx(ee,{icon:nt,label:"GPU",value:oe(z),detail:w?.name||(t?.system?.hardwareCollecting?"Detecting graphics hardware…":"Graphics usage unavailable"),percent:z}),e.jsx(ee,{icon:te,label:"VRAM",value:oe(G),detail:Dt(w?.memoryUsedBytes,w?.memoryTotalBytes),percent:G})]})]}),e.jsxs("section",{className:"client-storage-panel","aria-label":"Local storage",children:[e.jsxs("div",{className:"client-system-subhead",children:[e.jsxs("div",{children:[e.jsx("span",{className:"client-unified-section-label",children:"STORAGE"}),e.jsx("strong",{children:"Local drives"})]}),e.jsx("small",{children:E.length>0?`${E.length} ${E.length===1?"drive":"drives"}`:t?.system?.hardwareCollecting?"Detecting…":"Unavailable"})]}),e.jsxs("div",{className:"client-disk-list",children:[E.map(h=>e.jsxs("article",{className:"client-disk-row",children:[e.jsxs("div",{className:"client-disk-row-head",children:[e.jsxs("span",{children:[e.jsx(Ne,{size:16}),e.jsx("strong",{children:h.mount||"Disk"}),e.jsx("small",{children:h.name||"Local disk"})]}),e.jsx("strong",{children:oe(h.usedPercent)})]}),e.jsxs("small",{children:[U(h.freeBytes)," free · ",U(h.totalBytes)," total"]}),e.jsx("i",{"aria-hidden":"true",children:e.jsx("b",{style:{width:Me(h.usedPercent)}})})]},`${h.mount}-${h.name||""}`)),E.length===0&&e.jsxs("div",{className:"client-disk-empty",children:[e.jsx(Ne,{size:18}),e.jsx("span",{children:t?.system?.hardwareCollecting?"Detecting local drives…":"Storage information is not available."})]})]})]}),e.jsxs("section",{className:"client-network-panel","aria-label":"Network activity",children:[e.jsxs("div",{className:"client-system-subhead",children:[e.jsxs("div",{children:[e.jsx("span",{className:"client-unified-section-label",children:"NETWORK"}),e.jsx("strong",{children:"Live traffic"})]}),e.jsx("small",{children:S.length>0?S.join(", "):"Detecting adapter"})]}),e.jsxs("div",{className:"client-network-live",children:[e.jsxs("div",{className:"client-network-adapter",children:[e.jsx(st,{size:18}),e.jsxs("span",{children:[e.jsx("strong",{children:S.join(", ")||"Network"}),e.jsx("small",{children:L.join(" / ")||"Checking active connection"})]})]}),e.jsxs("div",{className:"client-network-rate download",children:[e.jsx(it,{size:17}),e.jsxs("span",{children:[e.jsx("small",{children:"Receive"}),e.jsx("strong",{children:Le(B?T?.receiveBytesPerSecond:void 0)})]})]}),e.jsxs("div",{className:"client-network-rate upload",children:[e.jsx(rt,{size:17}),e.jsxs("span",{children:[e.jsx("small",{children:"Send"}),e.jsx("strong",{children:Le(B?T?.sendBytesPerSecond:void 0)})]})]}),e.jsx("small",{className:"client-network-total",children:B?`Total ${U(T?.receivedBytes)} received / ${U(T?.sentBytes)} sent`:"Traffic has not been measured yet."})]})]})]})]}),e.jsxs("aside",{className:"client-connection-panel",children:[e.jsx("span",{className:"client-unified-section-label",children:"LIVEDESK SERVICES"}),e.jsx("h3",{children:j?"Connected to the Hub":t?.authenticated?"Finding the Hub":"Connect this computer"}),j?e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"client-unified-copy",children:"This computer is available from the VuvoDesk Hub."}),e.jsxs("div",{className:"client-service-status-list",children:[e.jsxs("div",{children:[e.jsx(ce,{size:17}),e.jsxs("span",{children:[e.jsx("strong",{children:"Screen sharing"}),e.jsx("small",{children:t?.permissions?.screenCapture?"Active":"Waiting"})]})]}),e.jsxs("div",{children:[e.jsx($e,{size:17}),e.jsxs("span",{children:[e.jsx("strong",{children:"Remote control"}),e.jsx("small",{children:t?.permissions?.remoteInput?"Available":"Unavailable"})]})]}),e.jsxs("div",{children:[e.jsx(at,{size:17}),e.jsxs("span",{children:[e.jsx("strong",{children:"File delivery"}),e.jsx("small",{children:t?.permissions?.files?"Ready to receive":"Unavailable"})]})]}),e.jsxs("div",{children:[e.jsx(ot,{size:17}),e.jsxs("span",{children:[e.jsx("strong",{children:"Computer audio"}),e.jsx("small",{children:t?.permissions?.audio?"Available":"Unavailable"})]})]})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"client-unified-copy",children:t?.authenticated?"VuvoDesk is checking the registered Hub endpoints. A temporary Hub PIN can be used as a fallback.":"Sign in once on this computer. VuvoDesk saves the verified session, finds the Hub, and starts screen sharing automatically."}),!i&&!t?.authenticated?e.jsxs("button",{className:"client-unified-primary",type:"button",onClick:R,children:[e.jsx(Ie,{size:16})," Sign in with Google"]}):e.jsxs("p",{className:"client-unified-success",children:[e.jsx(Fe,{size:16})," Signed in as ",i?.user.email||i?.user.id||t?.userEmail||t?.userId||"saved account"]}),e.jsxs("div",{className:"client-unified-pin-row",children:[e.jsx(ct,{size:16}),e.jsx("input",{value:c,onChange:h=>_(h.target.value),placeholder:"6-digit Hub PIN",inputMode:"numeric","aria-label":"6-digit Hub PIN"}),e.jsx("button",{className:"client-unified-secondary",type:"button",onClick:C,disabled:c.length!==6,children:"Connect"})]})]}),g?.supported&&e.jsxs("div",{className:`client-video-acceleration state-${g.ready?"ready":g.state||"setup-required"}`,children:[e.jsx(ke,{size:17}),e.jsxs("span",{children:[e.jsx("strong",{children:"Hardware video"}),e.jsx("small",{children:b})]}),!g.ready&&g.canInstall&&e.jsx("button",{type:"button",onClick:k,disabled:$,title:"Install and verify Linux FFmpeg hardware video support",children:$?"Setting up":"Enable"})]}),o&&e.jsx("p",{className:"client-unified-success",children:o}),e.jsxs("div",{className:"client-slot-setting",children:[e.jsxs("label",{htmlFor:"client-slot-number",children:[e.jsx("span",{children:"Slot"}),e.jsx("input",{id:"client-slot-number",value:p,onChange:h=>d(h.target.value),inputMode:"numeric",pattern:"[0-9]*",placeholder:"1-999","aria-label":"Wall slot number",disabled:!j||v})]}),e.jsxs("button",{type:"button",onClick:A,disabled:!j||v||!p,"aria-label":"Save slot number",title:"Save slot number",children:[e.jsx(De,{size:17}),e.jsx("span",{children:v?"Saving":"Set"})]})]})]})]})]})}function Ht({runtimeBaseUrl:i=""}){const[t,c]=r.useState(null),[o,u]=r.useState(null),[p,v]=r.useState(!1),[R,_]=r.useState(""),[C,d]=r.useState(""),[A,k]=r.useState(null),[j,g]=r.useState(null),[$,b]=r.useState(""),[y,P]=r.useState(!1),[w,z]=r.useState(!1),[G,E]=r.useState(""),[T,B]=r.useState(!1),[N,S]=r.useState(null),[L,h]=r.useState(!1),[D,de]=r.useState("computer"),[he,J]=r.useState(!1),me=r.useRef(null),fe=r.useRef(null),se=r.useRef(!1),Y=r.useRef(null),Q=r.useRef(null),pe=r.useRef(!1),K=r.useRef(!1),ge=r.useRef(0),ie=r.useRef(!1),be=r.useRef(""),m=r.useMemo(()=>Pt(i),[i]),re=r.useMemo(()=>$t(o,t),[o,t]),ae=r.useMemo(()=>Ft(o,t),[o,t]),He=JSON.stringify(ae),[Ue,we]=r.useState(()=>new Set),W=jt(ae,Ue),ve=re.slice(0,1).toUpperCase()||"L";r.useEffect(()=>{we(n=>St(ae,n))},[He]);const _e=r.useCallback(n=>{we(s=>{if(!n||s.has(n))return s;const a=new Set(s);return a.add(n),a})},[]),F=r.useCallback(async()=>{if(d(""),window.liveDesk?.auth?.signInWithGoogle){const n=await window.liveDesk.auth.signInWithGoogle();return n?.ok===!1?(d(n.error||"VuvoDesk could not open the system browser for Google sign-in."),!1):!0}return window.location.assign(`${m}/auth/google`),!0},[m]),xe=r.useCallback(async()=>{K.current||(K.current=!0,d("Your saved Google sign-in is incomplete. VuvoDesk is reopening sign-in once to repair it."),await V.auth.signOut({scope:"local"}).catch(()=>{}),u(null),await F()||(K.current=!1))},[F]),ye=r.useCallback(async n=>{const s=Ce(n);if(s)throw new Error(s);if(se.current)return!1;se.current=!0;try{if(window.liveDesk?.auth?.persistSession){const a=await window.liveDesk.auth.persistSession(n);if(a?.ok===!1)throw new Error(a.error||"VuvoDesk could not validate the desktop session.");return d(""),!0}for(let a=0;a<2;a+=1){const l=await H(m,a>0),f=await fetch(`${m}/api/auth/session`,{method:"POST",headers:{"Content-Type":"application/json","X-LiveDesk-CSRF":l},signal:AbortSignal.timeout(1e4),body:JSON.stringify({accessToken:n.access_token,refreshToken:n.refresh_token,expiresAt:n.expires_at,user:{id:n.user.id,email:n.user.email}})}),M=await f.json().catch(()=>({}));if(f.status===403&&a===0){sessionStorage.removeItem("livedesk.client.csrf");continue}if(!f.ok)throw new Error(M.error||`Client runtime returned HTTP ${f.status}.`);return d(""),!0}throw new Error("Client runtime rejected the session transfer.")}finally{se.current=!1}},[m]),x=r.useCallback(()=>{const n=Y.current;if(n)return n;const s=(async()=>{try{const a=await fetch(`${m}/api/client/status`,{cache:"no-store",signal:AbortSignal.timeout(1500)}),l=await a.json().catch(()=>({}));if(!a.ok)throw new Error(l.error||`Client runtime returned HTTP ${a.status}.`);if(l.csrfToken&&sessionStorage.setItem("livedesk.client.csrf",l.csrfToken),String(l.role||"").toLowerCase()==="hub")throw new Error("This computer is assigned to the Hub role.");c(l),k(null),g(null)}catch(a){k(Ae(a))}})();return Y.current=s,s.finally(()=>{Y.current===s&&(Y.current=null)}),s},[m]),je=r.useCallback(()=>{const n=Q.current;if(n)return n;const s=(async()=>{const a=await fetch(`${m}/api/client/diagnostics`,{cache:"no-store",signal:AbortSignal.timeout(8e3)}),l=await a.json().catch(()=>({}));if(!a.ok)throw new Error(l.error||`Client diagnostics returned HTTP ${a.status}.`);if(String(l.role||"").toLowerCase()==="hub")throw new Error("This computer is assigned to the Hub role.");c(l)})();return Q.current=s,s.finally(()=>{Q.current===s&&(Q.current=null)}),s},[m]);r.useEffect(()=>{let n=!1,s=null;const a=async()=>{await x(),n||(s=window.setTimeout(()=>{a()},2e3))};return a(),()=>{n=!0,s!==null&&window.clearTimeout(s)}},[x]),r.useEffect(()=>{if(D!=="computer")return;let n=!1,s=null;const a=()=>{n||(s=window.setTimeout(()=>{l()},At))},l=async()=>{document.visibilityState==="visible"&&await je().catch(()=>{}),a()},f=()=>{document.visibilityState==="visible"&&(s!==null&&(window.clearTimeout(s),s=null),l())};return document.addEventListener("visibilitychange",f),l(),()=>{n=!0,document.removeEventListener("visibilitychange",f),s!==null&&window.clearTimeout(s)}},[D,je]),r.useEffect(()=>{if(ie.current)return;const n=Number(t?.slotNumber||0);E(n>0?String(n):"")},[t?.slotNumber]),r.useEffect(()=>{if(!N)return;const n=window.setTimeout(()=>S(null),5e3);return()=>window.clearTimeout(n)},[N]),r.useEffect(()=>{const n=Et({actionError:C,discoveryWakeError:j,statusPollError:A,runtimeError:t?.lastError}),s=Tt(be.current,n);be.current=s.nextKey,s.message&&S({kind:"error",message:s.message})},[j,C,A,t?.lastError]);const Z=r.useCallback(async()=>{const n=Date.now();if(!(!t?.authenticated||t.connectionState==="connected"||!["waiting","reconnecting"].includes(String(t.agent?.state||""))||n-ge.current<4e3)){ge.current=n;try{const s=await fetch(`${m}/api/client/reconnect`,{method:"POST",headers:{"Content-Type":"application/json","X-LiveDesk-CSRF":await H(m)},body:JSON.stringify({onlyIfWaiting:!0,reason:"app-active"})});if(!s.ok)throw new Error(`Client reconnect returned HTTP ${s.status}.`);g(null),await x()}catch(s){g(Ae(s))}}},[m,x,t]);r.useEffect(()=>{const n=()=>{Z()},s=()=>{Z()},a=()=>{document.visibilityState==="visible"&&Z()};return window.addEventListener("online",n),window.addEventListener("focus",s),document.addEventListener("visibilitychange",a),()=>{window.removeEventListener("online",n),window.removeEventListener("focus",s),document.removeEventListener("visibilitychange",a)}},[Z]),r.useEffect(()=>{if(!p||!t||!o?.access_token||t.authenticated)return;if(Ce(o)==="refresh-token-required"){xe().catch(f=>{K.current=!1,d(f instanceof Error?f.message:String(f))});return}let n=!1,s,a=0;const l=async()=>{if(n)return;try{const M=await ye(o);if(await x(),M)return}catch(M){d(M instanceof Error?M.message:String(M))}if(n)return;const f=Pe[Math.min(a,Pe.length-1)];a+=1,s=window.setTimeout(()=>{l()},f)};return l(),()=>{n=!0,s!==void 0&&window.clearTimeout(s)}},[p,x,xe,o,t,ye]),r.useEffect(()=>{const n=new URLSearchParams(window.location.search),s=n.get("auth_error");if(!s)return;d(s),n.delete("auth_error");const a=n.toString();window.history.replaceState(window.history.state,"",`${window.location.pathname}${a?`?${a}`:""}${window.location.hash}`)},[]),r.useEffect(()=>{let n=!0;if(!window.liveDesk?.auth)return u(null),v(!0),x(),()=>{n=!1};const s=window.liveDesk?.auth?.onComplete?.(l=>{l.ok&&l.session?V.auth.setSession(l.session).catch(f=>d(f instanceof Error?f.message:String(f))):l.ok&&l.signedOut?(u(null),v(!0),V.auth.signOut({scope:"local"})):l.error&&d(l.error)});(async()=>{try{const l=window.liveDesk?.auth?.getSession?await window.liveDesk.auth.getSession():await V.auth.getSession();if(!n)return;const f=ut(l);u(f),x()}catch(l){n&&d(l instanceof Error?l.message:String(l))}finally{n&&v(!0)}})();const{data:a}=V.auth.onAuthStateChange((l,f)=>{if(n){if(!f&&window.liveDesk?.auth){v(!0);return}u(f),v(!0),x()}});return()=>{n=!1,s?.(),a.subscription.unsubscribe()}},[x]),r.useEffect(()=>{if(!p||!t||pe.current||K.current||o||t.authenticated)return;const n=new URLSearchParams(window.location.search);if(!n.has("livedesk_launch"))return;pe.current=!0,n.delete("livedesk_launch");const s=n.toString();window.history.replaceState(window.history.state,"",`${window.location.pathname}${s?`?${s}`:""}${window.location.hash}`),F().catch(a=>d(a instanceof Error?a.message:String(a)))},[p,o,F,t]);const Be=async()=>{J(!1),window.liveDesk?.auth?.signOut?(await V.auth.signOut({scope:"local"}),(await window.liveDesk.auth.signOut())?.runtimeCleared===!1&&d("Signed out locally. The VuvoDesk runtime could not be reached to clear its session.")):await fetch(`${m}/api/auth/session`,{method:"DELETE",headers:{"X-LiveDesk-CSRF":await H(m)}}).catch(()=>{}),u(null),await x()},X=r.useCallback((n=!0)=>{y||(h(!1),n&&window.requestAnimationFrame(()=>fe.current?.focus()))},[y]),Ve=r.useCallback(()=>{y||!t?.authenticated||(fe.current=document.activeElement instanceof HTMLElement?document.activeElement:null,b(""),h(!0))},[y,t?.authenticated]);r.useEffect(()=>{if(!L)return;const n=window.requestAnimationFrame(()=>me.current?.focus()),s=l=>{l.target instanceof Element&&l.target.closest(".client-hub-switch-popover, .client-hub-switch-trigger")||X(!1)},a=l=>{l.key==="Escape"&&X()};return window.addEventListener("pointerdown",s),window.addEventListener("keydown",a),()=>{window.cancelAnimationFrame(n),window.removeEventListener("pointerdown",s),window.removeEventListener("keydown",a)}},[X,L]);const ze=async()=>{d("");try{const n=await fetch(`${m}/api/client/pin`,{method:"POST",headers:{"Content-Type":"application/json","X-LiveDesk-CSRF":await H(m)},body:JSON.stringify({pin:R})}),s=await n.json().catch(()=>({}));if(!n.ok||s?.ok===!1)throw new Error(s?.error||"PIN could not be accepted.");_(""),await x()}catch(n){d(n instanceof Error?n.message:String(n))}},Ge=async()=>{h(!1),P(!0),b(""),d("");try{const n=await fetch(`${m}/api/runtime/switch-role`,{method:"POST",headers:{"Content-Type":"application/json","X-LiveDesk-CSRF":await H(m)},body:JSON.stringify({role:"hub"})}),s=await n.json().catch(()=>({}));if(!n.ok||s?.ok===!1)throw new Error(s?.error||`Role change failed with HTTP ${n.status}.`);b("Hub role accepted. VuvoDesk is restarting this computer with the Hub Wall.");const a=Number(t?.runtimePid||0);await bt({baseUrl:m,targetRole:"hub",previousRuntimePid:a,allowedStates:["running"]}),window.location.reload()}catch(n){d(n instanceof Error?n.message:String(n)),P(!1)}},Ke=async()=>{if(T)return;const n=Number(G);if(!Number.isInteger(n)||n<1||n>999){S({kind:"error",message:"Enter a slot number from 1 to 999."});return}B(!0),S(null);try{const s=await fetch(`${m}/api/client/slot`,{method:"POST",headers:{"Content-Type":"application/json","X-LiveDesk-CSRF":await H(m)},body:JSON.stringify({slotNumber:n})}),a=await s.json().catch(()=>({}));if(!s.ok||a.ok===!1){if(a.error==="slot-taken"){const l=a.conflict?.deviceName||a.conflict?.hostname||a.conflict?.deviceId||"another computer";throw new Error(`Slot ${String(n).padStart(3,"0")} is already used by ${l}.`)}throw new Error(a.error||`Slot update failed with HTTP ${s.status}.`)}ie.current=!1,E(String(n)),c(a),S({kind:"success",message:`Slot ${String(n).padStart(3,"0")} saved. VuvoDesk is reconnecting this Client.`})}catch(s){S({kind:"error",message:s instanceof Error?s.message:String(s)})}finally{B(!1),await x()}},We=async()=>{if(!w){z(!0),d("");try{const n=await fetch(`${m}/api/client/video-acceleration/install`,{method:"POST",headers:{"Content-Type":"application/json","X-LiveDesk-CSRF":await H(m)},body:JSON.stringify({confirm:!0})}),s=await n.json().catch(()=>({}));if(c(s),!n.ok||s.videoAcceleration?.ready!==!0)throw new Error(s.videoAcceleration?.error||s.error||"Linux hardware video setup did not complete.")}catch(n){d(n instanceof Error?n.message:String(n))}finally{z(!1),await x()}}},I=!!(t?.authenticated||o),q=r.useMemo(()=>dt(),[]),Xe=Ee("switch-to-hub",q),qe=Ee("client",q),O=ht(q);return e.jsxs("main",{className:"app-shell client-unified-shell",children:[e.jsxs("aside",{className:"tool-rail","aria-label":"VuvoDesk Client tools",children:[e.jsx("div",{className:"rail-brand",title:"VuvoDesk",children:e.jsx(gt,{size:25})}),e.jsx("nav",{className:"rail-tools","aria-label":"Client navigation",children:e.jsxs("div",{className:"client-main-tool-slot",children:[e.jsxs("button",{className:"rail-tool client-main-tool client-hub-tool client-hub-switch-trigger accent-blue",type:"button",onClick:Ve,disabled:y||!t?.authenticated,"aria-busy":y,"aria-expanded":L,"aria-haspopup":"dialog","aria-controls":L?"client-hub-switch-popover":void 0,"aria-label":`Hub. ${Xe}`,"data-tooltip":L?void 0:Te("Hub","switch-to-hub",q),children:[e.jsx(te,{size:19}),e.jsx("span",{children:y?"Switching…":"Hub"})]}),e.jsxs("button",{className:`rail-tool client-main-tool accent-blue ${D==="computer"?"active":""}`,type:"button",onClick:()=>de("computer"),"aria-current":D==="computer"?"page":void 0,"aria-label":`Client. ${qe}`,"data-tooltip":Te("Client","client",q),children:[e.jsx(ce,{size:19}),e.jsx("span",{children:"Client"})]})]})}),e.jsxs("div",{className:"rail-footer",children:[Rt.map(n=>{const s=n.icon;return e.jsxs("button",{className:`rail-tool compact ${D===n.id?"active":""}`,type:"button",onClick:()=>de(n.id),title:n.label,children:[e.jsx(s,{size:18}),e.jsx("span",{children:n.label})]},n.id)}),e.jsxs("button",{className:`rail-account ${I?"signed-in":""}`,type:"button",onClick:()=>J(n=>!n),"aria-expanded":he,"aria-haspopup":"dialog","aria-controls":"vuvodesk-account-dialog",title:I?"Account":"Sign in",children:[I&&W?e.jsx("img",{src:W,alt:re,referrerPolicy:"no-referrer",onError:()=>_e(W)},W):I?e.jsx("span",{className:"avatar-fallback",children:ve}):e.jsx(Ie,{size:18}),e.jsx("span",{children:I?"Account":"Sign in"})]})]})]}),L&&e.jsxs("section",{id:"client-hub-switch-popover",className:"client-hub-switch-popover",role:"dialog","aria-modal":"false","aria-labelledby":"client-hub-switch-title","aria-describedby":"client-hub-switch-description client-hub-switch-restart",children:[e.jsxs("header",{className:"client-hub-switch-head",children:[e.jsx("span",{className:"client-hub-switch-mark","aria-hidden":"true",children:e.jsx(te,{size:19})}),e.jsx("span",{className:"client-hub-switch-eyebrow",children:O.eyebrow}),e.jsx("button",{className:"client-hub-switch-close",type:"button",onClick:()=>X(),"aria-label":O.closeLabel,children:e.jsx(Se,{size:17})})]}),e.jsx("h2",{id:"client-hub-switch-title",children:O.title}),e.jsx("p",{id:"client-hub-switch-description",children:O.description}),e.jsxs("p",{id:"client-hub-switch-restart",className:"client-hub-switch-notice",children:[e.jsx($e,{size:16,"aria-hidden":"true"}),e.jsx("span",{children:O.restartNotice})]}),e.jsxs("div",{className:"client-hub-switch-actions",children:[e.jsx("button",{type:"button",onClick:()=>X(),children:O.cancel}),e.jsxs("button",{ref:me,className:"primary",type:"button",onClick:()=>{Ge()},disabled:y||!t?.authenticated,children:[e.jsx(te,{size:16}),O.confirm]})]})]}),e.jsx(mt,{open:he,signedIn:I,accountName:I?re:"Account",accountEmail:o?.user.email||t?.userEmail||t?.userId||"",accountInitial:ve,avatarUrl:W,currentPlan:"free",currentPlanKnown:!1,deviceCount:t?1:0,deviceLimit:Number.POSITIVE_INFINITY,licenseLabel:"Plan is managed at the Hub. This Client does not choose or change billing.",networkLabel:t?.connectionState==="connected"?"Connected to Hub":t?"Finding Hub":"Checking local app",accessLabel:t?.auth?.persisted?"Saved sign-in on this computer":I?"Active for this run":"Not signed in",authBusy:!p,checkoutBusy:!1,ltdCheckoutEnabled:!1,monthlyCheckoutEnabled:!1,teamCheckoutEnabled:!1,planChangesEnabled:!1,planManagementLabel:"Plan is managed at the Hub",showWorkspaceSwitcher:!1,workspaces:[],activeWorkspaceId:"",onClose:()=>J(!1),onSignIn:async()=>{J(!1),await F()},onSignOut:Be,onSelectPlan:()=>{}}),e.jsx("section",{className:"desk-stage client-unified-stage",children:D==="support"?e.jsx("section",{className:"client-unified-page",children:e.jsx(lt,{session:o,currentProductKey:"livedesk",appVersion:t?.appVersion||"",onSignIn:()=>{F()}})}):D!=="computer"?e.jsx("section",{className:"client-unified-page",children:e.jsx(Ot,{page:D,status:t})}):e.jsx(Mt,{session:o,status:t,pin:R,roleChangeMessage:$,videoAccelerationBusy:w,slotInput:G,slotBusy:T,onSignIn:()=>{F()},onPinChange:n=>_(n.replace(/\D/g,"").slice(0,6)),onSubmitPin:()=>{ze()},onSlotInputChange:n=>{ie.current=!0,E(n.replace(/\D/g,"").slice(0,3))},onSaveSlot:()=>{Ke()},onEnableVideoAcceleration:()=>{We()}})}),N&&e.jsxs("div",{className:`client-side-toast ${N.kind}`,role:N.kind==="error"?"alert":"status",children:[N.kind==="error"?e.jsx(Ze,{size:18}):e.jsx(Fe,{size:18}),e.jsx("span",{children:N.message}),e.jsx("button",{type:"button",onClick:()=>S(null),"aria-label":"Dismiss notification",children:e.jsx(Se,{size:16})})]})]})}const Ut=1e3,_t=5e3;function Bt(){return typeof window>"u"?!1:(!!window.navigator.standalone||window.matchMedia("(display-mode: standalone), (display-mode: fullscreen)").matches)&&window.matchMedia("(pointer: coarse)").matches}function Vt(){return typeof window>"u"?[]:[...new Set([window.location.origin,ne].filter(Boolean))]}function en(){const t=wt(),c=Bt(),o=t||c,u=t||typeof window>"u"?ne:window.location.origin,p=o?{role:"hub",baseUrl:u}:null,[v,R]=r.useState(p),_=r.useRef(null);return r.useEffect(()=>{if(o){R(b=>b?.role==="hub"&&b.baseUrl===u?b:{role:"hub",baseUrl:u});return}let C=!1,d=!1,A=null;const k=new AbortController,j=async()=>{for(const b of Vt()){if(k.signal.aborted)return;try{const P=(await xt("/api/runtime/status",{signal:k.signal,timeoutMs:900},b)).role==="hub"?"hub":"client";d=!0,C||R(w=>w?.role===P&&w.baseUrl===b?w:{role:P,baseUrl:b});return}catch{if(k.signal.aborted)return}}},g=()=>{vt(_,j).finally(()=>{!C&&!k.signal.aborted&&(A=window.setTimeout(g,d?_t:Ut))}).catch(()=>{})};g();const $=window.setTimeout(()=>{!C&&!d&&R(b=>b?.role==="client"&&b.baseUrl===ne?b:{role:"client",baseUrl:ne})},2500);return()=>{C=!0,k.abort(new Error("VuvoDesk runtime role probe stopped.")),A!==null&&window.clearTimeout(A),window.clearTimeout($)}},[null,o,u]),v?v.role==="client"?e.jsx(Ht,{runtimeBaseUrl:v.baseUrl}):e.jsx(ft,{runtimeBaseUrl:v.baseUrl}):e.jsxs("main",{className:"runtime-role-boot","aria-busy":"true","aria-label":"Starting VuvoDesk",children:[e.jsx("span",{className:"runtime-role-boot-mark","aria-hidden":"true"}),e.jsx("strong",{children:"Starting VuvoDesk"}),e.jsx("p",{children:"Loading this computer's assigned role..."})]})}export{en as VuvoDeskApp};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/client-8jUbxy3j.js","assets/icons-CuXJn-Hz.js","assets/react-rvm9rmed.js","assets/HubApp-AhKLyz3K.js","assets/preload-helper-DD1OZmLC.js","assets/pwa-startup-xxamnV7P.js","assets/pwa-bootstrap-BCid3CYk.js","assets/MonitorStackIcon-DBuXI_Oa.js","assets/supabase-C7qjtLN3.js","assets/frame-lifecycle-esOdP-EY.js","assets/HubApp-DFLBNvIi.css","assets/styles-DDKP4MTD.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as i}from"./preload-helper-DD1OZmLC.js";import{m as l,t as d,s as u,r as _}from"./pwa-bootstrap-BCid3CYk.js";const v=8e3,m="http://127.0.0.1:5179".replace(/\/+$/,"");function f(a){const e=document.querySelector("[data-vuvodesk-static-boot]");if(!e?.isConnected)return;e.setAttribute("aria-busy","false"),e.querySelector(".vuvodesk-static-boot-mark")?.remove();const r=e.querySelector("[data-vuvodesk-static-boot-title]"),t=e.querySelector("[data-vuvodesk-static-boot-detail]"),n=e.querySelector("[data-vuvodesk-static-boot-retry]");r&&(r.textContent="VuvoDesk could not start",r.hidden=!1),t&&(t.textContent=a,t.hidden=!1),n&&(n.hidden=!1)}async function E(){let a=!1;const e=async t=>{if(a)return;a=!0,window.clearTimeout(r),await _("load-error",!0)||f(t)},r=window.setTimeout(()=>{e("The console files took too long to load. Check the connection, then try again.")},v);try{const[t,n,s,c]=await Promise.all([i(()=>import("./icons-CuXJn-Hz.js").then(o=>o.i),[]),i(()=>import("./client-8jUbxy3j.js").then(o=>o.c),__vite__mapDeps([0,1,2])),i(()=>import("./HubApp-AhKLyz3K.js").then(o=>o.e),__vite__mapDeps([3,4,5,1,6,7,8,9,10])),i(()=>import("./pwa-startup-xxamnV7P.js").then(o=>o.p),__vite__mapDeps([5,1,6])),i(()=>Promise.resolve({}),__vite__mapDeps([11]))]);if(a)return;a=!0,window.clearTimeout(r),n.createRoot(document.getElementById("root")).render(t.createElement(t.StrictMode,null,t.createElement(c.PwaStartupBoundary,{automaticRetry:!0,children:t.createElement(s.HubApp,{runtimeBaseUrl:m})}))),c.takeOverStaticBoot()}catch(t){console.warn("[VuvoDesk] PWA console load failed.",t),await e(window.navigator.onLine?"The latest console file could not be loaded.":"Reconnect to the internet, then try again.")}}l();d();u();E();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as c}from"./icons-CuXJn-Hz.js";import{r as s}from"./react-rvm9rmed.js";function f(r,a){for(var o=0;o<a.length;o++){const e=a[o];if(typeof e!="string"&&!Array.isArray(e)){for(const t in e)if(t!=="default"&&!(t in r)){const n=Object.getOwnPropertyDescriptor(e,t);n&&Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:()=>e[t]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}var i=s();const l=c(i),g=f({__proto__:null,default:l},[i]);export{i as a,g as c};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function t1(s,d){for(var u=0;u<d.length;u++){const p=d[u];if(typeof p!="string"&&!Array.isArray(p)){for(const _ in p)if(_!=="default"&&!(_ in s)){const l=Object.getOwnPropertyDescriptor(p,_);l&&Object.defineProperty(s,_,l.get?l:{enumerable:!0,get:()=>p[_]})}}}return Object.freeze(Object.defineProperty(s,Symbol.toStringTag,{value:"Module"}))}function a1(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}var j={exports:{}},o={};var I;function o1(){if(I)return o;I=1;var s=Symbol.for("react.transitional.element"),d=Symbol.for("react.portal"),u=Symbol.for("react.fragment"),p=Symbol.for("react.strict_mode"),_=Symbol.for("react.profiler"),l=Symbol.for("react.consumer"),$=Symbol.for("react.context"),x=Symbol.for("react.forward_ref"),N=Symbol.for("react.suspense"),b=Symbol.for("react.memo"),g=Symbol.for("react.lazy"),K=Symbol.for("react.activity"),R=Symbol.iterator;function G(e){return e===null||typeof e!="object"?null:(e=R&&e[R]||e["@@iterator"],typeof e=="function"?e:null)}var T={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,L={};function M(e,a,c){this.props=e,this.context=a,this.refs=L,this.updater=c||T}M.prototype.isReactComponent={},M.prototype.setState=function(e,a){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,a,"setState")},M.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function V(){}V.prototype=M.prototype;function C(e,a,c){this.props=e,this.context=a,this.refs=L,this.updater=c||T}var E=C.prototype=new V;E.constructor=C,S(E,M.prototype),E.isPureReactComponent=!0;var P=Array.isArray;function A(){}var i={H:null,A:null,T:null,S:null},O=Object.prototype.hasOwnProperty;function H(e,a,c){var n=c.ref;return{$$typeof:s,type:e,key:a,ref:n!==void 0?n:null,props:c}}function W(e,a){return H(e.type,a,e.props)}function q(e){return typeof e=="object"&&e!==null&&e.$$typeof===s}function F(e){var a={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(c){return a[c]})}var U=/\/+/g;function z(e,a){return typeof e=="object"&&e!==null&&e.key!=null?F(""+e.key):a.toString(36)}function Q(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch(typeof e.status=="string"?e.then(A,A):(e.status="pending",e.then(function(a){e.status==="pending"&&(e.status="fulfilled",e.value=a)},function(a){e.status==="pending"&&(e.status="rejected",e.reason=a)})),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}function m(e,a,c,n,r){var y=typeof e;(y==="undefined"||y==="boolean")&&(e=null);var h=!1;if(e===null)h=!0;else switch(y){case"bigint":case"string":case"number":h=!0;break;case"object":switch(e.$$typeof){case s:case d:h=!0;break;case g:return h=e._init,m(h(e._payload),a,c,n,r)}}if(h)return r=r(e),h=n===""?"."+z(e,0):n,P(r)?(c="",h!=null&&(c=h.replace(U,"$&/")+"/"),m(r,a,c,"",function(e1){return e1})):r!=null&&(q(r)&&(r=W(r,c+(r.key==null||e&&e.key===r.key?"":(""+r.key).replace(U,"$&/")+"/")+h)),a.push(r)),1;h=0;var f=n===""?".":n+":";if(P(e))for(var k=0;k<e.length;k++)n=e[k],y=f+z(n,k),h+=m(n,a,c,y,r);else if(k=G(e),typeof k=="function")for(e=k.call(e),k=0;!(n=e.next()).done;)n=n.value,y=f+z(n,k++),h+=m(n,a,c,y,r);else if(y==="object"){if(typeof e.then=="function")return m(Q(e),a,c,n,r);throw a=String(e),Error("Objects are not valid as a React child (found: "+(a==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":a)+"). If you meant to render a collection of children, use an array instead.")}return h}function w(e,a,c){if(e==null)return e;var n=[],r=0;return m(e,n,"","",function(y){return a.call(c,y,r++)}),n}function X(e){if(e._status===-1){var a=e._result;a=a(),a.then(function(c){(e._status===0||e._status===-1)&&(e._status=1,e._result=c)},function(c){(e._status===0||e._status===-1)&&(e._status=2,e._result=c)}),e._status===-1&&(e._status=0,e._result=a)}if(e._status===1)return e._result.default;throw e._result}var D=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var a=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(a))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)},J={map:w,forEach:function(e,a,c){w(e,function(){a.apply(this,arguments)},c)},count:function(e){var a=0;return w(e,function(){a++}),a},toArray:function(e){return w(e,function(a){return a})||[]},only:function(e){if(!q(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};return o.Activity=K,o.Children=J,o.Component=M,o.Fragment=u,o.Profiler=_,o.PureComponent=C,o.StrictMode=p,o.Suspense=N,o.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=i,o.__COMPILER_RUNTIME={__proto__:null,c:function(e){return i.H.useMemoCache(e)}},o.cache=function(e){return function(){return e.apply(null,arguments)}},o.cacheSignal=function(){return null},o.cloneElement=function(e,a,c){if(e==null)throw Error("The argument must be a React element, but you passed "+e+".");var n=S({},e.props),r=e.key;if(a!=null)for(y in a.key!==void 0&&(r=""+a.key),a)!O.call(a,y)||y==="key"||y==="__self"||y==="__source"||y==="ref"&&a.ref===void 0||(n[y]=a[y]);var y=arguments.length-2;if(y===1)n.children=c;else if(1<y){for(var h=Array(y),f=0;f<y;f++)h[f]=arguments[f+2];n.children=h}return H(e.type,r,n)},o.createContext=function(e){return e={$$typeof:$,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:l,_context:e},e},o.createElement=function(e,a,c){var n,r={},y=null;if(a!=null)for(n in a.key!==void 0&&(y=""+a.key),a)O.call(a,n)&&n!=="key"&&n!=="__self"&&n!=="__source"&&(r[n]=a[n]);var h=arguments.length-2;if(h===1)r.children=c;else if(1<h){for(var f=Array(h),k=0;k<h;k++)f[k]=arguments[k+2];r.children=f}if(e&&e.defaultProps)for(n in h=e.defaultProps,h)r[n]===void 0&&(r[n]=h[n]);return H(e,y,r)},o.createRef=function(){return{current:null}},o.forwardRef=function(e){return{$$typeof:x,render:e}},o.isValidElement=q,o.lazy=function(e){return{$$typeof:g,_payload:{_status:-1,_result:e},_init:X}},o.memo=function(e,a){return{$$typeof:b,type:e,compare:a===void 0?null:a}},o.startTransition=function(e){var a=i.T,c={};i.T=c;try{var n=e(),r=i.S;r!==null&&r(c,n),typeof n=="object"&&n!==null&&typeof n.then=="function"&&n.then(A,D)}catch(y){D(y)}finally{a!==null&&c.types!==null&&(a.types=c.types),i.T=a}},o.unstable_useCacheRefresh=function(){return i.H.useCacheRefresh()},o.use=function(e){return i.H.use(e)},o.useActionState=function(e,a,c){return i.H.useActionState(e,a,c)},o.useCallback=function(e,a){return i.H.useCallback(e,a)},o.useContext=function(e){return i.H.useContext(e)},o.useDebugValue=function(){},o.useDeferredValue=function(e,a){return i.H.useDeferredValue(e,a)},o.useEffect=function(e,a){return i.H.useEffect(e,a)},o.useEffectEvent=function(e){return i.H.useEffectEvent(e)},o.useId=function(){return i.H.useId()},o.useImperativeHandle=function(e,a,c){return i.H.useImperativeHandle(e,a,c)},o.useInsertionEffect=function(e,a){return i.H.useInsertionEffect(e,a)},o.useLayoutEffect=function(e,a){return i.H.useLayoutEffect(e,a)},o.useMemo=function(e,a){return i.H.useMemo(e,a)},o.useOptimistic=function(e,a){return i.H.useOptimistic(e,a)},o.useReducer=function(e,a,c){return i.H.useReducer(e,a,c)},o.useRef=function(e){return i.H.useRef(e)},o.useState=function(e){return i.H.useState(e)},o.useSyncExternalStore=function(e,a,c){return i.H.useSyncExternalStore(e,a,c)},o.useTransition=function(){return i.H.useTransition()},o.version="19.2.7",o}var Y;function n1(){return Y||(Y=1,j.exports=o1()),j.exports}var v=n1();const c1=a1(v),st=t1({__proto__:null,default:c1},[v]);const r1=s=>s.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),s1=s=>s.replace(/^([A-Z])|[\s-_]+(\w)/g,(d,u,p)=>p?p.toUpperCase():u.toLowerCase()),B=s=>{const d=s1(s);return d.charAt(0).toUpperCase()+d.slice(1)},Z=(...s)=>s.filter((d,u,p)=>!!d&&d.trim()!==""&&p.indexOf(d)===u).join(" ").trim(),y1=s=>{for(const d in s)if(d.startsWith("aria-")||d==="role"||d==="title")return!0};var i1={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const h1=v.forwardRef(({color:s="currentColor",size:d=24,strokeWidth:u=2,absoluteStrokeWidth:p,className:_="",children:l,iconNode:$,...x},N)=>v.createElement("svg",{ref:N,...i1,width:d,height:d,stroke:s,strokeWidth:p?Number(u)*24/Number(d):u,className:Z("lucide",_),...!l&&!y1(x)&&{"aria-hidden":"true"},...x},[...$.map(([b,g])=>v.createElement(b,g)),...Array.isArray(l)?l:[l]]));const t=(s,d)=>{const u=v.forwardRef(({className:p,..._},l)=>v.createElement(h1,{ref:l,iconNode:d,className:Z(`lucide-${r1(B(s))}`,`lucide-${s}`,p),..._}));return u.displayName=B(s),u};const d1=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],yt=t("activity",d1);const p1=[["path",{d:"M12 17V3",key:"1cwfxf"}],["path",{d:"m6 11 6 6 6-6",key:"12ii2o"}],["path",{d:"M19 21H5",key:"150jfl"}]],it=t("arrow-down-to-line",p1);const u1=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],ht=t("arrow-right",u1);const k1=[["path",{d:"m18 9-6-6-6 6",key:"kcunyi"}],["path",{d:"M12 3v14",key:"7cf3v8"}],["path",{d:"M5 21h14",key:"11awu3"}]],dt=t("arrow-up-from-line",k1);const l1=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],pt=t("arrow-up",l1);const _1=[["path",{d:"M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z",key:"3c2336"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],ut=t("badge-check",_1);const f1=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.9 4.9 14.2 14.2",key:"1m5liu"}]],kt=t("ban",f1);const v1=[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]],lt=t("bell",v1);const M1=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],_t=t("book-open",M1);const m1=[["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1",key:"d7y7pr"}],["path",{d:"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6",key:"xs1cw7"}],["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M6.53 9C4.6 8.8 3 7.1 3 5",key:"32zzws"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"M3 21c0-2.1 1.7-3.9 3.8-4",key:"4p0ekp"}],["path",{d:"M20.97 5c0 2.1-1.6 3.8-3.5 4",key:"18gb23"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M17.2 17c2.1.1 3.8 1.9 3.8 4",key:"k3fwyw"}]],ft=t("bug",m1);const x1=[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]],vt=t("camera",x1);const g1=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Mt=t("check",g1);const w1=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],mt=t("chevron-down",w1);const $1=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],xt=t("chevron-left",$1);const N1=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],gt=t("chevron-right",N1);const b1=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],wt=t("chevron-up",b1);const C1=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],$t=t("circle-alert",C1);const E1=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],Nt=t("circle-check",E1);const A1=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8",key:"1h4pet"}],["path",{d:"M12 18V6",key:"zqpxq5"}]],bt=t("circle-dollar-sign",A1);const H1=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Ct=t("circle-question-mark",H1);const q1=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],Et=t("circle-x",q1);const z1=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],At=t("circle",z1);const j1=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M11 9h4a2 2 0 0 0 2-2V3",key:"1ve2rv"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"M7 21v-4a2 2 0 0 1 2-2h4",key:"1fwkro"}],["circle",{cx:"15",cy:"15",r:"2",key:"3i40o0"}]],Ht=t("circuit-board",j1);const R1=[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2",key:"4jdomd"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v4",key:"3hqy98"}],["path",{d:"M21 14H11",key:"1bme5i"}],["path",{d:"m15 10-4 4 4 4",key:"5dvupr"}]],qt=t("clipboard-copy",R1);const T1=[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}]],zt=t("clipboard",T1);const S1=[["path",{d:"M12 6v6h4",key:"135r8i"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],jt=t("clock-3",S1);const L1=[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]],Rt=t("cloud",L1);const V1=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],Tt=t("copy",V1);const P1=[["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M17 20v2",key:"1rnc9c"}],["path",{d:"M17 2v2",key:"11trls"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M2 17h2",key:"7oei6x"}],["path",{d:"M2 7h2",key:"asdhe0"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"M20 17h2",key:"1fpfkl"}],["path",{d:"M20 7h2",key:"1o8tra"}],["path",{d:"M7 20v2",key:"4gnj0m"}],["path",{d:"M7 2v2",key:"1i4yhu"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",key:"1vbyd7"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1",key:"z9xiuo"}]],St=t("cpu",P1);const O1=[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]],Lt=t("credit-card",O1);const U1=[["path",{d:"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z",key:"1vdc57"}],["path",{d:"M5 21h14",key:"11awu3"}]],Vt=t("crown",U1);const D1=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]],Pt=t("database",D1);const I1=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],Ot=t("download",I1);const Y1=[["path",{d:"M21.54 15H17a2 2 0 0 0-2 2v4.54",key:"1djwo0"}],["path",{d:"M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17",key:"1tzkfa"}],["path",{d:"M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05",key:"14pb5j"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],Ut=t("earth",Y1);const B1=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],Dt=t("external-link",B1);const Z1=[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],It=t("eye-off",Z1);const K1=[["path",{d:"M17.5 22h.5a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3",key:"rslqgf"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M2 19a2 2 0 1 1 4 0v1a2 2 0 1 1-4 0v-4a6 6 0 0 1 12 0v4a2 2 0 1 1-4 0v-1a2 2 0 1 1 4 0",key:"9f7x3i"}]],Yt=t("file-audio",K1);const G1=[["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"m2.305 15.53.923-.382",key:"yfp9st"}],["path",{d:"m3.228 12.852-.924-.383",key:"bckynb"}],["path",{d:"M4.677 21.5a2 2 0 0 0 1.313.5H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v2.5",key:"1yo3oz"}],["path",{d:"m4.852 11.228-.383-.923",key:"1j88i9"}],["path",{d:"m4.852 16.772-.383.924",key:"sag1dv"}],["path",{d:"m7.148 11.228.383-.923",key:"rj39hk"}],["path",{d:"m7.53 17.696-.382-.924",key:"1uu5cs"}],["path",{d:"m8.772 12.852.923-.383",key:"13811l"}],["path",{d:"m8.772 15.148.923.383",key:"z1a5l0"}],["circle",{cx:"6",cy:"14",r:"3",key:"a1xfv6"}]],Bt=t("file-cog",G1);const W1=[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"m15 15-3-3-3 3",key:"15xj92"}]],Zt=t("file-up",W1);const F1=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]],Kt=t("folder-open",F1);const Q1=[["path",{d:"M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v.5",key:"1dkoa9"}],["path",{d:"M12 10v4h4",key:"1czhmt"}],["path",{d:"m12 14 1.535-1.605a5 5 0 0 1 8 1.5",key:"lvuxfi"}],["path",{d:"M22 22v-4h-4",key:"1ewp4q"}],["path",{d:"m22 18-1.535 1.605a5 5 0 0 1-8-1.5",key:"14ync0"}]],Gt=t("folder-sync",Q1);const X1=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}],["path",{d:"M12 10v6",key:"1bos4e"}],["path",{d:"m9 13 3-3 3 3",key:"1pxg3c"}]],Wt=t("folder-up",X1);const J1=[["path",{d:"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z",key:"sc7q7i"}]],Ft=t("funnel",J1);const ee=[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]],Qt=t("gauge",ee);const te=[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]],Xt=t("hard-drive",te);const ae=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],Jt=t("history",ae);const oe=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],e2=t("key-round",oe);const ne=[["path",{d:"M10 8h.01",key:"1r9ogq"}],["path",{d:"M12 12h.01",key:"1mp3jc"}],["path",{d:"M14 8h.01",key:"1primd"}],["path",{d:"M16 12h.01",key:"1l6xoz"}],["path",{d:"M18 8h.01",key:"emo2bl"}],["path",{d:"M6 8h.01",key:"x9i8wu"}],["path",{d:"M7 16h10",key:"wp8him"}],["path",{d:"M8 12h.01",key:"czm47f"}],["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}]],t2=t("keyboard",ne);const ce=[["path",{d:"M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2z",key:"1pdavp"}],["path",{d:"M20.054 15.987H3.946",key:"14rxg9"}]],a2=t("laptop",ce);const re=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],o2=t("layout-dashboard",re);const se=[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]],n2=t("layout-grid",se);const ye=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m4.93 4.93 4.24 4.24",key:"1ymg45"}],["path",{d:"m14.83 9.17 4.24-4.24",key:"1cb5xl"}],["path",{d:"m14.83 14.83 4.24 4.24",key:"q42g0n"}],["path",{d:"m9.17 14.83-4.24 4.24",key:"bqpfvv"}],["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}]],c2=t("life-buoy",ye);const ie=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]],r2=t("lightbulb",ie);const he=[["path",{d:"M9 17H7A5 5 0 0 1 7 7h2",key:"8i5ue5"}],["path",{d:"M15 7h2a5 5 0 1 1 0 10h-2",key:"1b9ql8"}],["line",{x1:"8",x2:"16",y1:"12",y2:"12",key:"1jonct"}]],s2=t("link-2",he);const de=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],y2=t("loader-circle",de);const pe=[["circle",{cx:"12",cy:"16",r:"1",key:"1au0dj"}],["rect",{x:"3",y:"10",width:"18",height:"12",rx:"2",key:"6s8ecr"}],["path",{d:"M7 10V7a5 5 0 0 1 10 0v3",key:"1pqi11"}]],i2=t("lock-keyhole",pe);const ue=[["path",{d:"m10 17 5-5-5-5",key:"1bsop3"}],["path",{d:"M15 12H3",key:"6jk70r"}],["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4",key:"u53s6r"}]],h2=t("log-in",ue);const ke=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],d2=t("lock",ke);const le=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],p2=t("log-out",le);const _e=[["path",{d:"M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z",key:"q8bfy3"}],["path",{d:"M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14",key:"1853fq"}],["path",{d:"M8 6v8",key:"15ugcq"}]],u2=t("megaphone",_e);const fe=[["path",{d:"M6 19v-3",key:"1nvgqn"}],["path",{d:"M10 19v-3",key:"iu8nkm"}],["path",{d:"M14 19v-3",key:"kcehxu"}],["path",{d:"M18 19v-3",key:"1vh91z"}],["path",{d:"M8 11V9",key:"63erz4"}],["path",{d:"M16 11V9",key:"fru6f3"}],["path",{d:"M12 11V9",key:"ha00sb"}],["path",{d:"M2 15h20",key:"16ne18"}],["path",{d:"M2 7a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v1.1a2 2 0 0 0 0 3.837V17a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-5.1a2 2 0 0 0 0-3.837Z",key:"lhddv3"}]],k2=t("memory-stick",fe);const ve=[["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 18h16",key:"19g7jn"}],["path",{d:"M4 6h16",key:"1o0s65"}]],l2=t("menu",ve);const Me=[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}],["path",{d:"M13 8H7",key:"14i4kc"}],["path",{d:"M17 12H7",key:"16if0g"}]],_2=t("message-square-text",Me);const me=[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]],f2=t("message-square",me);const xe=[["path",{d:"M18 8V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h8",key:"10dyio"}],["path",{d:"M10 19v-3.96 3.15",key:"1irgej"}],["path",{d:"M7 19h5",key:"qswx4l"}],["rect",{width:"6",height:"10",x:"16",y:"12",rx:"2",key:"1egngj"}]],v2=t("monitor-smartphone",xe);const ge=[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]],M2=t("monitor",ge);const we=[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]],m2=t("moon",we);const $e=[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]],x2=t("mouse-pointer-2",$e);const Ne=[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]],g2=t("network",Ne);const be=[["rect",{x:"14",y:"4",width:"4",height:"16",rx:"1",key:"zuxfzm"}],["rect",{x:"6",y:"4",width:"4",height:"16",rx:"1",key:"1okwgv"}]],w2=t("pause",be);const Ce=[["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",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],$2=t("pencil",Ce);const Ee=[["path",{d:"M12 17v5",key:"bb1du9"}],["path",{d:"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z",key:"1nkz8b"}]],N2=t("pin",Ee);const Ae=[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]],b2=t("play",Ae);const He=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],C2=t("plus",He);const qe=[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]],E2=t("power",qe);const ze=[["path",{d:"M16.247 7.761a6 6 0 0 1 0 8.478",key:"1fwjs5"}],["path",{d:"M19.075 4.933a10 10 0 0 1 0 14.134",key:"ehdyv1"}],["path",{d:"M4.925 19.067a10 10 0 0 1 0-14.134",key:"1q22gi"}],["path",{d:"M7.753 16.239a6 6 0 0 1 0-8.478",key:"r2q7qm"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]],A2=t("radio",ze);const je=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],H2=t("refresh-cw",je);const Re=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],q2=t("rotate-ccw",Re);const Te=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],z2=t("save",Te);const Se=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],j2=t("search",Se);const Le=[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]],R2=t("send",Le);const Ve=[["path",{d:"m10.852 14.772-.383.923",key:"11vil6"}],["path",{d:"M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923",key:"1v3clb"}],["path",{d:"m13.148 9.228.383-.923",key:"t2zzyc"}],["path",{d:"m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544",key:"1bxfiv"}],["path",{d:"m14.772 10.852.923-.383",key:"k9m8cz"}],["path",{d:"m14.772 13.148.923.383",key:"1xvhww"}],["path",{d:"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5",key:"tn8das"}],["path",{d:"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5",key:"1g2pve"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"M6 6h.01",key:"1utrut"}],["path",{d:"m9.228 10.852-.923-.383",key:"1wtb30"}],["path",{d:"m9.228 13.148-.923.383",key:"1a830x"}]],T2=t("server-cog",Ve);const Pe=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],S2=t("server",Pe);const Oe=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],L2=t("settings-2",Oe);const Ue=[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],V2=t("settings",Ue);const De=[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]],P2=t("share-2",De);const Ie=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]],O2=t("shield-alert",Ie);const Ye=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],U2=t("shield-check",Ye);const Be=[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]],D2=t("sparkles",Be);const Ze=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]],I2=t("square",Ze);const Ke=[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]],Y2=t("star",Ke);const Ge=[["path",{d:"M11 2v2",key:"1539x4"}],["path",{d:"M5 2v2",key:"1yf1q8"}],["path",{d:"M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1",key:"rb5t3r"}],["path",{d:"M8 15a6 6 0 0 0 12 0v-3",key:"x18d4x"}],["circle",{cx:"20",cy:"10",r:"2",key:"ts1r5v"}]],B2=t("stethoscope",Ge);const We=[["path",{d:"M12 19h8",key:"baeox8"}],["path",{d:"m4 17 6-6-6-6",key:"1yngyt"}]],Z2=t("terminal",We);const Fe=[["path",{d:"M21 7 6.82 21.18a2.83 2.83 0 0 1-3.99-.01a2.83 2.83 0 0 1 0-4L17 3",key:"1ub6xw"}],["path",{d:"m16 2 6 6",key:"1gw87d"}],["path",{d:"M12 16H4",key:"1cjfip"}]],K2=t("test-tube-diagonal",Fe);const Qe=[["path",{d:"M7 10v12",key:"1qc93n"}],["path",{d:"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z",key:"emmmcr"}]],G2=t("thumbs-up",Qe);const Xe=[["line",{x1:"10",x2:"14",y1:"2",y2:"2",key:"14vaq8"}],["line",{x1:"12",x2:"15",y1:"14",y2:"11",key:"17fdiu"}],["circle",{cx:"12",cy:"14",r:"8",key:"1e1u0o"}]],W2=t("timer",Xe);const Je=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],F2=t("trash-2",Je);const et=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Q2=t("triangle-alert",et);const tt=[["circle",{cx:"10",cy:"7",r:"1",key:"dypaad"}],["circle",{cx:"4",cy:"20",r:"1",key:"22iqad"}],["path",{d:"M4.7 19.3 19 5",key:"1enqfc"}],["path",{d:"m21 3-3 1 2 2Z",key:"d3ov82"}],["path",{d:"M9.26 7.68 5 12l2 5",key:"1esawj"}],["path",{d:"m10 14 5 2 3.5-3.5",key:"v8oal5"}],["path",{d:"m18 12 1-1 1 1-1 1Z",key:"1bh22v"}]],X2=t("usb",tt);const at=[["circle",{cx:"12",cy:"8",r:"5",key:"1hypcn"}],["path",{d:"M20 21a8 8 0 0 0-16 0",key:"rfgkzh"}]],J2=t("user-round",at);const ot=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],e0=t("users",ot);const nt=[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}],["path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728",key:"ijwkga"}]],t0=t("volume-2",nt);const ct=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],a0=t("wifi",ct);const rt=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],o0=t("x",rt);export{ht as $,yt as A,_t as B,Lt as C,Ot as D,Dt as E,Yt as F,Mt as G,Xt as H,Ft as I,pt as J,e2 as K,i2 as L,M2 as M,$2 as N,N2 as O,E2 as P,It as Q,H2 as R,U2 as S,K2 as T,G2 as U,Ct as V,a0 as W,o0 as X,ft as Y,r2 as Z,u2 as _,n1 as a,l2 as a0,gt as a1,Ut as a2,a2 as a3,Z2 as a4,v2 as a5,o2 as a6,x2 as a7,A2 as a8,g2 as a9,I2 as aA,Jt as aB,W2 as aC,J2 as aD,qt as aE,s2 as aF,Vt as aG,p2 as aH,ut as aI,B2 as aJ,n2 as aK,Pt as aL,zt as aM,t0 as aN,t2 as aO,xt as aP,b2 as aQ,w2 as aR,m2 as aS,Rt as aa,Tt as ab,bt as ac,Qt as ad,_2 as ae,y2 as af,At as ag,wt as ah,mt as ai,kt as aj,q2 as ak,O2 as al,j2 as am,Y2 as an,Q2 as ao,c2 as ap,Bt as aq,T2 as ar,e0 as as,c1 as at,X2 as au,Zt as av,Wt as aw,$t as ax,Gt as ay,vt as az,D2 as b,L2 as c,d2 as d,z2 as e,P2 as f,a1 as g,F2 as h,st as i,S2 as j,f2 as k,V2 as l,h2 as m,Et as n,Nt as o,jt as p,St as q,v as r,k2 as s,Ht as t,it as u,dt as v,Kt as w,lt as x,C2 as y,R2 as z};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/VuvoDeskApp-CU4N6t3c.js","assets/pwa-startup-xxamnV7P.js","assets/icons-CuXJn-Hz.js","assets/pwa-bootstrap-BCid3CYk.js","assets/SupportPage-B16Jl8Jq.js","assets/HubApp-AhKLyz3K.js","assets/preload-helper-DD1OZmLC.js","assets/MonitorStackIcon-DBuXI_Oa.js","assets/supabase-C7qjtLN3.js","assets/frame-lifecycle-esOdP-EY.js","assets/HubApp-DFLBNvIi.css","assets/SupportPage-Cxx61WwR.css","assets/DesktopUpdatePanel-CiGXFhqj.js","assets/VuvoDeskApp-ao5vkK6F.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as F}from"./preload-helper-DD1OZmLC.js";import{j as e,P as K,a as G}from"./pwa-startup-xxamnV7P.js";import{r as x,$ as o,a0 as Y,a1 as E,b as X,a2 as O,o as y,M as V,a3 as N,a4 as v,a5 as j,a6 as M,a7 as g,W as J,a8 as Q,j as Z,D as h,a9 as I,aa as ee,ab as se,ac as S,S as A,ad as _,G as ne}from"./icons-CuXJn-Hz.js";import{a as ae}from"./client-8jUbxy3j.js";import{L as ie,M as R,F as re,p as i,P as te,a as oe,T as le,i as P}from"./MonitorStackIcon-DBuXI_Oa.js";/* empty css */import{f as ce,s as de,r as he}from"./pwa-bootstrap-BCid3CYk.js";import"./react-rvm9rmed.js";const T="npx -y --prefer-online livedesk@latest",pe="".trim().toLowerCase(),U=pe==="stable"?"stable":"dev",f=`https://livedesk-desktop-updates.lovecrdm.workers.dev/download/${U}`,ue=`${f}/windows/x64`,me=`${f}/macos/x64`,xe=`${f}/macos/arm64`,je=`${f}/linux/x64`,fe=`${f}/linux/x64/deb`,k="".trim().toLowerCase()==="true",d="".trim().toLowerCase()==="true",p="".trim().toLowerCase()==="true",w="".trim().toLowerCase()==="true",b=d||p||w;function ve(){if(typeof window>"u")return"home";const s=window.location.pathname.replace(/\/+$/,"")||"/";return s==="/"?"home":s==="/download"?"download":s==="/pricing"?"pricing":s==="/support"?"support":s==="/terms"?"terms":s==="/privacy"?"privacy":s==="/refunds"?"refunds":"not-found"}function W(){return e.jsxs("a",{className:"site-brand",href:"/","aria-label":"VuvoDesk home",children:[e.jsx("span",{className:"site-brand-mark",children:e.jsx(R,{size:25})}),e.jsx("span",{children:"VuvoDesk"})]})}function we({page:s}){const a=[{label:"Product",href:"/#product",active:s==="home"},{label:"Pricing",href:"/pricing",active:s==="pricing"},{label:"Download",href:"/download",active:s==="download"},{label:"Support",href:"/support",active:s==="support"}];return e.jsx("header",{className:"site-header",children:e.jsxs("div",{className:"site-header-inner",children:[e.jsx(W,{}),e.jsx("nav",{className:"site-nav","aria-label":"Main navigation",children:a.map(n=>e.jsx("a",{className:n.active?"active":"",href:n.href,children:n.label},n.label))}),e.jsxs("div",{className:"site-header-actions",children:[e.jsx("a",{className:"site-text-link",href:"/app",children:"Open web console"}),e.jsxs("a",{className:"site-button site-button-small",href:"/download",children:["Get VuvoDesk ",e.jsx(o,{size:15})]})]}),e.jsxs("details",{className:"site-mobile-menu",children:[e.jsx("summary",{"aria-label":"Open navigation",children:e.jsx(Y,{size:22})}),e.jsxs("nav",{"aria-label":"Mobile navigation",children:[a.map(n=>e.jsxs("a",{href:n.href,children:[n.label,e.jsx(E,{size:15})]},n.label)),e.jsxs("a",{href:"/app",children:["Open web console",e.jsx(E,{size:15})]})]})]})]})})}function ge(){return e.jsxs("footer",{className:"site-footer",children:[e.jsxs("div",{className:"site-footer-main",children:[e.jsxs("div",{children:[e.jsx(W,{}),e.jsx("p",{children:"One calm command center for every computer you manage."})]}),e.jsxs("div",{className:"site-footer-links",children:[e.jsxs("div",{children:[e.jsx("strong",{children:"Product"}),e.jsx("a",{href:"/#product",children:"Overview"}),e.jsx("a",{href:"/pricing",children:"Pricing"}),e.jsx("a",{href:"/download",children:"Download"})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"Use VuvoDesk"}),e.jsx("a",{href:"/app",children:"Web console"}),e.jsx("a",{href:"/support",children:"Support"})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"Platforms"}),e.jsx("span",{children:"Windows"}),e.jsx("span",{children:"macOS"}),e.jsx("span",{children:"Linux"}),e.jsx("span",{children:"Mobile PWA"})]}),e.jsxs("div",{children:[e.jsx("strong",{children:"Legal"}),e.jsx("a",{href:"/terms",children:"Terms"}),e.jsx("a",{href:"/privacy",children:"Privacy"}),e.jsx("a",{href:"/refunds",children:"Cancellation & refunds"})]})]})]}),e.jsxs("div",{className:"site-footer-bottom",children:[e.jsx("span",{children:"© 2026 VuvoDesk"}),e.jsx("span",{children:"Built for people who run real work across many screens."})]})]})}function be(){const s=[{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 e.jsxs("div",{className:"product-mockup","aria-label":"VuvoDesk screen wall preview",children:[e.jsxs("div",{className:"mockup-window-bar",children:[e.jsxs("div",{children:[e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{})]}),e.jsx("span",{children:"VuvoDesk · Wall"}),e.jsxs("span",{className:"mockup-online",children:[e.jsx("i",{})," 4 online"]})]}),e.jsxs("div",{className:"mockup-body",children:[e.jsxs("aside",{className:"mockup-rail","aria-hidden":"true",children:[e.jsx("span",{className:"active",children:e.jsx(M,{size:17})}),e.jsx("span",{children:e.jsx(g,{size:17})}),e.jsx("span",{children:e.jsx(I,{size:17})}),e.jsx("span",{children:e.jsx(_,{size:17})})]}),e.jsx("div",{className:"mockup-wall",children:s.map(a=>e.jsxs("article",{className:"mockup-screen",children:[e.jsxs("div",{className:`mockup-screen-image ${a.className}`,children:[e.jsx("span",{className:"mockup-code-line wide"}),e.jsx("span",{className:"mockup-code-line"}),e.jsx("span",{className:"mockup-code-line short"}),e.jsx("span",{className:"mockup-panel-block"})]}),e.jsxs("div",{className:"mockup-screen-title",children:[e.jsx("strong",{children:a.name}),e.jsxs("span",{children:[e.jsx("i",{})," ",a.status]})]}),e.jsxs("div",{className:"mockup-metrics",children:[e.jsxs("span",{children:["CPU ",e.jsx("b",{children:a.cpu})]}),e.jsxs("span",{children:["RAM ",e.jsx("b",{children:a.ram})]})]})]},a.name))})]}),e.jsxs("div",{className:"mockup-control-card",children:[e.jsx(g,{size:18}),e.jsxs("span",{children:[e.jsx("small",{children:"Selected computer"}),e.jsx("strong",{children:"Render-Mac"})]}),e.jsx("button",{type:"button",children:"Control"})]})]})}function B({compact:s=!1}){const a=[{key:"free",name:i.free.name,price:i.free.price,suffix:"forever",audience:i.free.audience,description:"A practical personal wall, supported by a standard banner.",features:[`Up to ${re} devices`,"1 person","Standard banner"],action:"Start free",href:"/app",available:!0},{key:"plus",name:i.ltd.name,price:i.ltd.price,suffix:"/ month",audience:i.ltd.audience,description:"A clean personal command center for creators and homelabs.",features:[`Up to ${te} devices`,"1 person · no standard banner","Personal use"],ltd:i.ltd.ltd,action:p||d?"Choose Plus":"Paid checkout opening soon",href:p||d?"/app?view=pricing":"/support#billing",available:p||d},{key:"pro",name:i.pro.name,price:i.pro.price,suffix:"/ month",audience:i.pro.audience,description:"Monitoring for schools, academies, studios, offices, and growing commercial fleets.",features:[`Up to ${oe} devices`,"1 person","Ad-free school, academy, and commercial use"],ltd:i.pro.ltd,action:p||d?"Choose Business":"Paid checkout opening soon",href:p||d?"/app?view=pricing":"/support#billing",available:p||d},{key:"team",name:i.team.name,price:i.team.price,suffix:"/ month",audience:i.team.audience,description:"A shared Team Space for operators who manage the same computers together.",features:["Unlimited computers",`${le} people with their own accounts`,"Commercial use · Owner and Operator roles"],action:w?"Choose Team":"Paid checkout opening soon",href:w?"/app?view=pricing":"/support#billing",available:w}];return e.jsx("div",{className:`site-pricing-grid ${s?"compact":""}`,children:a.map(n=>e.jsxs("article",{className:`site-price-card ${n.key==="plus"?"featured":""} ${n.available?"":"pending"}`,children:[e.jsxs("div",{className:"site-price-heading",children:[e.jsx("span",{children:n.name}),n.key==="plus"&&e.jsx("em",{children:"Most popular"})]}),e.jsx("p",{className:"site-price-audience",children:n.audience}),e.jsxs("div",{className:"site-price",children:[e.jsx("strong",{children:n.price}),e.jsx("small",{children:n.suffix})]}),e.jsx("p",{children:n.description}),e.jsx("ul",{children:n.features.map(t=>e.jsxs("li",{children:[e.jsx(ne,{size:16})," ",t]},t))}),n.ltd&&e.jsxs("div",{className:"site-ltd",children:[e.jsxs("span",{children:[n.name," LTD"]}),e.jsx("strong",{children:n.ltd.replace(" LTD","")}),e.jsx("small",{children:d?"one-time · available now":"one-time · checkout opening soon"})]}),e.jsxs("a",{className:`site-price-action ${n.key==="plus"&&n.available?"primary":""} ${n.available?"":"pending"}`,href:n.href,children:[n.action,e.jsx(o,{size:15})]})]},n.key))})}function ye(){return e.jsx(e.Fragment,{children:e.jsxs("main",{children:[e.jsxs("section",{className:"site-hero",children:[e.jsxs("div",{className:"site-hero-copy",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(X,{size:15})," The screen wall for real work"]}),e.jsxs("h1",{children:["Every computer.",e.jsx("br",{}),e.jsx("span",{children:"One calm command center."})]}),e.jsx("p",{children:"See every screen, focus the computer that needs you, and keep work moving from your desk or phone."}),e.jsxs("div",{className:"site-hero-actions",children:[e.jsxs("a",{className:"site-button",href:"/download",children:["Download VuvoDesk ",e.jsx(o,{size:17})]}),e.jsxs("a",{className:"site-button site-button-secondary",href:"/app",children:["Open web console ",e.jsx(O,{size:17})]})]}),e.jsxs("div",{className:"site-hero-notes",children:[e.jsxs("span",{children:[e.jsx(y,{size:15})," Free for 5 devices"]}),e.jsxs("span",{children:[e.jsx(y,{size:15})," No credit card"]}),e.jsxs("span",{children:[e.jsx(y,{size:15})," Windows · macOS · Linux"]})]})]}),e.jsxs("div",{className:"site-hero-visual",children:[e.jsx("div",{className:"site-orbit site-orbit-one"}),e.jsx("div",{className:"site-orbit site-orbit-two"}),e.jsx(be,{})]})]}),e.jsxs("section",{className:"platform-strip","aria-label":"Supported platforms",children:[e.jsx("span",{children:"Built for the computers you already run"}),e.jsxs("div",{children:[e.jsxs("strong",{children:[e.jsx(V,{size:18})," Windows"]}),e.jsxs("strong",{children:[e.jsx(N,{size:18})," macOS"]}),e.jsxs("strong",{children:[e.jsx(v,{size:18})," Linux"]}),e.jsxs("strong",{children:[e.jsx(j,{size:18})," iPhone & Android"]}),e.jsxs("strong",{children:[e.jsx(O,{size:18})," Any browser"]})]})]}),e.jsxs("section",{className:"site-section site-value-section",id:"product",children:[e.jsxs("div",{className:"site-section-heading",children:[e.jsx("span",{children:"Why VuvoDesk"}),e.jsxs("h2",{children:["Spend less time finding the problem.",e.jsx("br",{}),"Spend more time fixing it."]}),e.jsx("p",{children:"VuvoDesk keeps the fleet visible without turning your desktop into a pile of remote windows."})]}),e.jsxs("div",{className:"site-value-grid",children:[e.jsxs("article",{className:"site-value-card large blue",children:[e.jsx("span",{className:"site-feature-icon",children:e.jsx(M,{size:23})}),e.jsx("h3",{children:"A wall that stays readable"}),e.jsx("p",{children:"Move from a compact list to large live previews. Keep the signal you need and hide the noise you do not."}),e.jsxs("div",{className:"feature-wall-demo",children:[e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{})]})]}),e.jsxs("article",{className:"site-value-card mint",children:[e.jsx("span",{className:"site-feature-icon",children:e.jsx(g,{size:23})}),e.jsx("h3",{children:"Control without losing context"}),e.jsx("p",{children:"Jump from Wall to focused Control, then return to the same fleet view."}),e.jsxs("div",{className:"feature-cursor-demo",children:[e.jsx(g,{size:31}),e.jsx("span",{children:"Direct control"})]})]}),e.jsxs("article",{className:"site-value-card violet",children:[e.jsx("span",{className:"site-feature-icon",children:e.jsx(J,{size:23})}),e.jsx("h3",{children:"Your fleet in your pocket"}),e.jsx("p",{children:"Install the PWA on iPhone or Android and check the room before you walk back to it."}),e.jsxs("div",{className:"feature-phone-demo",children:[e.jsx("span",{}),e.jsxs("div",{children:[e.jsx("i",{}),e.jsx("i",{}),e.jsx("i",{})]})]})]}),e.jsxs("article",{className:"site-value-card wide dark",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"site-kicker dark",children:[e.jsx(Q,{size:14})," Local-first when possible"]}),e.jsx("h3",{children:"Fast where you work. Reachable when you leave."}),e.jsx("p",{children:"VuvoDesk prefers the shortest useful route and keeps the current screen moving instead of building a stale queue."})]}),e.jsxs("div",{className:"feature-route",children:[e.jsxs("span",{children:[e.jsx(N,{size:19})," Hub"]}),e.jsx("i",{}),e.jsxs("span",{children:[e.jsx(Z,{size:19})," Clients"]}),e.jsx("i",{}),e.jsxs("span",{children:[e.jsx(j,{size:19})," PWA"]})]})]})]})]}),e.jsxs("section",{className:"site-section site-workflow",children:[e.jsxs("div",{className:"site-section-heading centered",children:[e.jsx("span",{children:"Start in three steps"}),e.jsx("h2",{children:"From zero to a live wall in minutes."})]}),e.jsxs("div",{className:"workflow-grid",children:[e.jsxs("article",{children:[e.jsx("b",{children:"01"}),e.jsx("span",{children:e.jsx(h,{size:21})}),e.jsx("h3",{children:"Install the Hub"}),e.jsx("p",{children:"Choose the computer that will organize your VuvoDesk fleet."})]}),e.jsxs("article",{children:[e.jsx("b",{children:"02"}),e.jsx("span",{children:e.jsx(I,{size:21})}),e.jsx("h3",{children:"Connect Clients"}),e.jsx("p",{children:"Use one PIN to add the Windows, Mac, and Linux computers you manage."})]}),e.jsxs("article",{children:[e.jsx("b",{children:"03"}),e.jsx("span",{children:e.jsx(j,{size:21})}),e.jsx("h3",{children:"Manage from anywhere"}),e.jsx("p",{children:"Open the web console or install the mobile PWA and keep every screen close."})]})]})]}),e.jsxs("section",{className:"site-section site-pricing-section",children:[e.jsxs("div",{className:"site-section-heading centered",children:[e.jsx("span",{children:"Simple pricing"}),e.jsx("h2",{children:"Start free. Upgrade when the wall earns its place."}),e.jsx("p",{children:b?"Monthly prices stay easy to understand. Lifetime offers are available separately below each paid plan.":"Free is available now. Paid checkout stays closed until live billing and customer support are verified."})]}),e.jsx(B,{compact:!0}),e.jsxs("a",{className:"site-inline-link",href:"/pricing",children:["Compare every plan ",e.jsx(o,{size:15})]})]}),e.jsxs("section",{className:"site-final-cta",children:[e.jsxs("div",{children:[e.jsxs("span",{className:"site-kicker dark",children:[e.jsx(ee,{size:14})," Your fleet, one glance away"]}),e.jsxs("h2",{children:["Give every computer",e.jsx("br",{}),"one clear place to report."]})]}),e.jsxs("div",{children:[e.jsx("p",{children:"Start with five devices for free. Install the Hub, connect a Client, and open your first live wall."}),e.jsxs("div",{children:[e.jsxs("a",{className:"site-button light",href:"/download",children:["Get VuvoDesk ",e.jsx(o,{size:17})]}),e.jsx("a",{className:"site-button ghost",href:"/app",children:"Open console"})]})]})]})]})})}function ke(){const[s,a]=x.useState(!1),n=async()=>{try{await navigator.clipboard.writeText(T),a(!0),window.setTimeout(()=>a(!1),1800)}catch{a(!1)}};return e.jsxs("main",{className:"site-subpage",children:[e.jsxs("section",{className:"site-subpage-hero download-hero",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(h,{size:15})," Download VuvoDesk"]}),e.jsxs("h1",{children:["Turn one computer into",e.jsx("br",{}),e.jsx("span",{children:"your command center."})]}),e.jsxs("p",{children:["Use the latest temporary installer for your computer. Available links follow the newest matching file on the ",U," channel; an unavailable platform is never linked to a missing file."]})]}),e.jsxs("section",{className:"download-grid",children:[e.jsxs("article",{id:"windows",children:[e.jsx("span",{className:"download-platform-icon windows",children:e.jsx(V,{size:27})}),e.jsxs("div",{children:[e.jsx("small",{children:"Windows"}),e.jsx("span",{className:"download-version",children:"Latest temporary build · x64 Electron"}),e.jsx("span",{className:"download-preview-note",children:"Temporary installer · unsigned"}),e.jsx("h2",{children:"Install VuvoDesk for Windows"}),e.jsx("p",{children:"Download the normal Electron setup program. Windows SmartScreen may warn about this preview until code signing is ready."})]}),e.jsxs("a",{className:"download-installer-link",href:ue,children:["Download Windows installer ",e.jsx(h,{size:16})]})]}),e.jsxs("article",{id:"macos",children:[e.jsx("span",{className:"download-platform-icon mac",children:e.jsx(N,{size:27})}),e.jsxs("div",{children:[e.jsx("small",{children:"macOS"}),e.jsx("span",{className:"download-version",children:"Intel & Apple silicon"}),e.jsx("span",{className:"download-preview-note",children:k?"Temporary installer · ad-hoc signed · not notarized":"Desktop installer not published yet"}),e.jsx("h2",{children:"Install VuvoDesk for macOS"}),e.jsx("p",{children:k?"Choose the chip in your Mac. On first launch, macOS may require Open Anyway in Privacy & Security because this preview is not Apple-notarized.":"Use the terminal install below while signed and notarized desktop packages are being prepared."})]}),k?e.jsxs("div",{className:"download-actions",children:[e.jsxs("a",{className:"download-installer-link",href:xe,children:["Apple silicon ",e.jsx(h,{size:16})]}),e.jsxs("a",{className:"download-installer-link secondary",href:me,children:["Intel Mac ",e.jsx(h,{size:16})]})]}):e.jsx("div",{className:"download-actions",children:e.jsxs("a",{className:"download-installer-link secondary",href:"#install-command",children:["Use terminal install ",e.jsx(v,{size:16})]})})]}),e.jsxs("article",{id:"linux",children:[e.jsx("span",{className:"download-platform-icon linux",children:e.jsx(v,{size:27})}),e.jsxs("div",{children:[e.jsx("small",{children:"Linux"}),e.jsx("span",{className:"download-version",children:"Latest temporary build · x64 · X11"}),e.jsx("span",{className:"download-preview-note",children:"Temporary installer"}),e.jsx("h2",{children:"Install VuvoDesk for Linux"}),e.jsx("p",{children:"Use the DEB package on Ubuntu, Debian, or Mint. For other distributions, download AppImage, mark it executable, then open it."})]}),e.jsxs("div",{className:"download-actions",children:[e.jsxs("a",{className:"download-installer-link",href:fe,children:["Download .deb ",e.jsx(h,{size:16})]}),e.jsxs("a",{className:"download-installer-link secondary",href:je,children:["Download AppImage ",e.jsx(h,{size:16})]})]})]})]}),e.jsxs("section",{className:"install-command-card",id:"install-command",children:[e.jsxs("div",{children:[e.jsxs("span",{children:[e.jsx(v,{size:18})," One command install"]}),e.jsx("h2",{children:"Terminal fallback and advanced setup"}),e.jsx("p",{children:"Use the npm package when you prefer a command-line install or the temporary desktop package does not suit your system."})]}),e.jsxs("div",{className:"install-command",children:[e.jsx("code",{children:T}),e.jsxs("button",{type:"button",onClick:()=>{n()},children:[e.jsx(se,{size:17})," ",s?"Copied":"Copy"]})]}),e.jsxs("ol",{children:[e.jsxs("li",{children:[e.jsx("b",{children:"1"}),e.jsx("span",{children:"Run the command on the computer that will be your Hub."})]}),e.jsxs("li",{children:[e.jsx("b",{children:"2"}),e.jsx("span",{children:"Open Settings and create a Hub PIN."})]}),e.jsxs("li",{children:[e.jsx("b",{children:"3"}),e.jsx("span",{children:"Run the same package as a Client on the other computers."})]})]})]}),e.jsxs("section",{className:"mobile-install-section",id:"mobile",children:[e.jsxs("div",{className:"mobile-install-heading",children:[e.jsx("span",{children:e.jsx(j,{size:26})}),e.jsxs("div",{children:[e.jsxs("small",{children:["iPhone & Android · PWA ",ie]}),e.jsx("h2",{children:"No app store required."}),e.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."})]})]}),e.jsxs("div",{className:"mobile-web-address",children:[e.jsx("span",{children:"Mobile web address"}),e.jsx("a",{href:"https://vuvodesk.com/app",children:"https://vuvodesk.com/app"}),e.jsxs("a",{className:"site-button",href:"/app",children:["Open mobile console ",e.jsx(o,{size:16})]})]}),e.jsxs("div",{className:"pwa-guide-grid",children:[e.jsxs("article",{children:[e.jsx("strong",{children:"iPhone & iPad"}),e.jsxs("ol",{children:[e.jsx("li",{children:"Open the address in Safari."}),e.jsx("li",{children:"Tap Share, then Add to Home Screen."}),e.jsx("li",{children:"Choose Open as Web App and add VuvoDesk."})]})]}),e.jsxs("article",{children:[e.jsx("strong",{children:"Android"}),e.jsxs("ol",{children:[e.jsx("li",{children:"Open the address in Chrome."}),e.jsx("li",{children:"Open the browser menu and tap Install app."}),e.jsx("li",{children:"Launch VuvoDesk from the Home Screen."})]})]})]})]})]})}function Ne(){return e.jsxs("main",{className:"site-subpage pricing-subpage",children:[e.jsxs("section",{className:"site-subpage-hero",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(S,{size:15})," VuvoDesk pricing"]}),e.jsxs("h1",{children:["Clear plans for",e.jsx("br",{}),e.jsx("span",{children:"growing screen walls."})]}),e.jsxs("p",{children:["Start with one account, choose Pro / Business for a school, academy, or commercial workplace, or give each operator a separate login with Team. ",!b&&"Paid checkout is not open yet."]})]}),e.jsx(B,{}),e.jsxs("section",{className:"pricing-explainer",children:[e.jsxs("article",{children:[e.jsx(A,{size:21}),e.jsxs("div",{children:[e.jsx("h3",{children:"Free stays useful"}),e.jsx("p",{children:"The standard banner helps keep a five-device personal wall available without a subscription."})]})]}),e.jsxs("article",{children:[e.jsx(S,{size:21}),e.jsxs("div",{children:[e.jsx("h3",{children:"Monthly and lifetime are separate"}),e.jsx("p",{children:"$5 Plus, $15 Pro / Business, and $49 Team are monthly prices. Existing Plus LTD $79 and Pro LTD $199 remain one-time offers."})]})]}),e.jsxs("article",{children:[e.jsx(_,{size:21}),e.jsxs("div",{children:[e.jsx("h3",{children:"Upgrade inside VuvoDesk"}),e.jsx("p",{children:"Sign in to the console, open Pricing, and choose the plan that matches the way you use the fleet."})]})]})]}),e.jsxs("section",{className:"pricing-bottom-cta",children:[e.jsxs("div",{children:[e.jsx("h2",{children:"Start with the computers you have today."}),e.jsx("p",{children:"No credit card is needed for Free."})]}),e.jsxs("a",{className:"site-button",href:"/app",children:["Start free ",e.jsx(o,{size:16})]})]})]})}function Se(){return e.jsxs("main",{className:"site-subpage policy-subpage",children:[e.jsxs("section",{className:"site-subpage-hero",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(A,{size:15})," VuvoDesk support"]}),e.jsxs("h1",{children:["Start with the shortest",e.jsx("br",{}),e.jsx("span",{children:"path back to work."})]}),e.jsx("p",{children:"Installation help is public. Account-specific diagnostics and billing requests stay inside your signed-in Support board so they are tied to the correct account."})]}),e.jsxs("section",{className:"support-option-grid",children:[e.jsxs("article",{children:[e.jsx(h,{size:23}),e.jsx("h2",{children:"Install or update"}),e.jsx("p",{children:"Use the current Windows or Linux preview package, or the terminal command for every supported desktop."}),e.jsxs("a",{href:"/download",children:["Open download help ",e.jsx(o,{size:15})]})]}),e.jsxs("article",{children:[e.jsx(j,{size:23}),e.jsx("h2",{children:"Connection trouble"}),e.jsx("p",{children:"Sign in, open the Support board, and include the affected computer name, operating system, VuvoDesk version, and the exact message you saw."}),e.jsxs("a",{href:"/support/issues",children:["Open signed-in Support ",e.jsx(o,{size:15})]})]}),e.jsxs("article",{id:"billing",children:[e.jsx(S,{size:23}),e.jsx("h2",{children:"Account or billing"}),e.jsx("p",{children:b?"Use the signed-in Support board for cancellation, refund, duplicate-payment, or access requests.":"Paid checkout is currently closed. No paid entitlement should be granted until verified checkout becomes available."}),e.jsxs("a",{href:"/support/questions",children:["Open account Support ",e.jsx(o,{size:15})]})]})]}),e.jsxs("section",{className:"support-checklist",children:[e.jsx("h2",{children:"Before sending a report"}),e.jsxs("ol",{children:[e.jsx("li",{children:"Confirm the Hub and Client show the same VuvoDesk release."}),e.jsx("li",{children:"Write down whether the problem affects Wall, Control, clipboard, or sign-in."}),e.jsx("li",{children:"Never post a Hub PIN, pairing token, access token, or payment credential."})]})]})]})}function Pe(){return e.jsxs(C,{title:"Terms of Service",summary:"The practical rules for using the VuvoDesk preview.",updated:"August 30, 2026",children:[e.jsx("h2",{children:"1. Authorized use"}),e.jsx("p",{children:"Use VuvoDesk only on computers and networks you own or are explicitly allowed to manage. You are responsible for every remote-control action performed through your account, Hub, Team Space, or pairing credential."}),e.jsx("h2",{children:"2. Accounts and Team Spaces"}),e.jsx("p",{children:"Keep sign-in and pairing credentials private. Team members use separate accounts. A Team Owner is responsible for invitations, roles, removals, and the computers shared with the Team Space."}),e.jsx("h2",{children:"3. Plans and payment"}),e.jsxs("p",{children:["Free, Plus, Pro / Business, and Team features are limited by the plan shown in the product. A displayed price is not a promise that checkout is open. Paid access starts only after a verified payment event grants the entitlement. Cancellation and refund handling follows the ",e.jsx("a",{href:"/refunds",children:"Cancellation & Refund Policy"}),"."]}),e.jsx("h2",{children:"4. Codex Agent features"}),e.jsx("p",{children:"Codex Agent features require a separately installed and signed-in Codex environment and a separate OpenAI account. OpenAI terms apply to that account and service. VuvoDesk does not sell Codex access and is not an OpenAI product."}),e.jsx("h2",{children:"5. Preview software"}),e.jsx("p",{children:"Unsigned or non-notarized installers are clearly labeled preview builds. Do not use preview software for safety-critical systems or where a temporary loss of screen, input, or connectivity could cause harm. Keep local access and backups available."}),e.jsx("h2",{children:"6. Acceptable behavior"}),e.jsx("p",{children:"Do not use VuvoDesk to access another person's device without permission, evade security controls, distribute malware, interfere with the service, or violate law or third-party rights."}),e.jsx("h2",{children:"7. Changes and termination"}),e.jsx("p",{children:"We may suspend access that creates security, abuse, or payment risk. Material policy changes will be dated on this page. Mandatory consumer rights in your country are not excluded."}),e.jsx("h2",{children:"8. Support"}),e.jsxs("p",{children:["Use the ",e.jsx("a",{href:"/support",children:"Support page"})," for product and account requests. Do not include passwords, tokens, or payment credentials."]})]})}function De(){return e.jsxs(C,{title:"Privacy Notice",summary:"What VuvoDesk handles, where it goes, and what is kept local.",updated:"August 30, 2026",children:[e.jsx("h2",{children:"1. Account and product data"}),e.jsx("p",{children:"VuvoDesk processes sign-in identity, device and workspace identifiers, roles, plan entitlements, connection status, version information, and Support content needed to operate the service."}),e.jsx("h2",{children:"2. Screen and input traffic"}),e.jsx("p",{children:"VuvoDesk is designed to send live screen, audio, clipboard, and remote-input traffic directly between your Hub, Clients, and browser when the connection succeeds. The Cloudflare signaling service exchanges authenticated connection metadata and does not intentionally store or forward the screen-media payload. Local diagnostic logs may record status and error details, not passwords or payment credentials."}),e.jsx("h2",{children:"3. Service providers"}),e.jsx("p",{children:"Google and Supabase provide sign-in and account storage. Cloudflare provides the public site, update delivery, and authenticated connection signaling. Dodo Payments is used only when paid checkout is enabled. Optional Codex Agent actions use the separately signed-in OpenAI service selected by the user."}),e.jsx("h2",{children:"4. Retention and control"}),e.jsxs("p",{children:["Account, workspace, entitlement, and Support records are retained while needed to provide the service, resolve disputes, prevent abuse, or meet legal duties. Request account access, correction, export, or deletion through the signed-in ",e.jsx("a",{href:"/support/questions",children:"Support board"}),". Some records may be retained where law or fraud prevention requires it."]}),e.jsx("h2",{children:"5. Security and transfers"}),e.jsx("p",{children:"Internet services may process data in more than one country. We use authenticated sessions, restricted service credentials, and encrypted network transport where supported, but no system can promise absolute security."}),e.jsx("h2",{children:"6. Policy changes"}),e.jsx("p",{children:"Material changes will update the date on this page. Review this notice before enabling new remote-control, clipboard, Team, payment, or Agent features."})]})}function Ae(){return e.jsxs(C,{title:"Cancellation & Refund Policy",summary:"A plain-language policy before any paid checkout is opened.",updated:"August 30, 2026",children:[e.jsx("h2",{children:"1. Current checkout status"}),e.jsx("p",{children:b?"Paid checkout is available only for the plans whose buttons are active.":"Paid checkout is currently closed. Preview access does not create a paid subscription or lifetime entitlement."}),e.jsx("h2",{children:"2. Subscriptions"}),e.jsx("p",{children:"You may request cancellation at any time. Cancellation stops the next renewal and normally keeps access through the already-paid billing period. A cancellation request must be submitted before the renewal is charged."}),e.jsx("h2",{children:"3. Initial purchase refunds"}),e.jsx("p",{children:"For an initial paid purchase, request a refund within 14 calendar days of payment. Duplicate or unauthorized charges and a material service failure will be reviewed even after that period. Mandatory local refund rights always apply."}),e.jsx("h2",{children:"4. Lifetime purchases"}),e.jsx("p",{children:"A lifetime purchase covers the product entitlement described at checkout, not third-party services, future paid add-ons, or a promise that every preview feature will remain unchanged. The same 14-day initial-purchase request window applies."}),e.jsx("h2",{children:"5. How to request"}),e.jsxs("p",{children:["Open the signed-in ",e.jsx("a",{href:"/support/questions",children:"Support board"})," and provide the account email, plan, purchase date, and reason. Never include full card details, passwords, API keys, or access tokens. Access may be removed after a full refund or successful payment dispute."]})]})}function C({title:s,summary:a,updated:n,children:t}){return e.jsxs("main",{className:"site-subpage policy-subpage",children:[e.jsxs("section",{className:"site-subpage-hero policy-hero",children:[e.jsxs("span",{className:"site-kicker",children:[e.jsx(A,{size:15})," VuvoDesk policy"]}),e.jsx("h1",{children:s}),e.jsx("p",{children:a}),e.jsxs("small",{children:["Last updated: ",n]})]}),e.jsx("article",{className:"policy-document",children:t})]})}function Ce(){return e.jsxs("main",{className:"site-not-found",children:[e.jsx("span",{className:"site-brand-mark",children:e.jsx(R,{size:25})}),e.jsx("small",{children:"404"}),e.jsx("h1",{children:"This screen is not on the wall."}),e.jsx("p",{children:"The page may have moved, but your VuvoDesk console is still here."}),e.jsxs("div",{children:[e.jsx("a",{className:"site-button",href:"/",children:"VuvoDesk home"}),e.jsx("a",{className:"site-button site-button-secondary",href:"/app",children:"Open console"})]})]})}function Le(){const s=ve();return x.useEffect(()=>{const a={home:"VuvoDesk — Every computer. One calm command center.",download:"Download VuvoDesk — Windows, macOS, and Linux",pricing:"VuvoDesk Pricing — Free, Plus, Pro / Business, and Team",support:"VuvoDesk Support",terms:"VuvoDesk Terms of Service",privacy:"VuvoDesk Privacy Notice",refunds:"VuvoDesk Cancellation & Refund Policy","not-found":"Page not found — VuvoDesk"},n={home:"See and control the computers you manage from one clear VuvoDesk screen wall.",download:"Download the currently available VuvoDesk desktop preview or install it with one npm command.",pricing:"Compare VuvoDesk Free, Plus, Pro / Business, and Team plan boundaries.",support:"Get public VuvoDesk installation help or open the signed-in Support board.",terms:"Read the VuvoDesk terms for authorized remote-control use, plans, preview software, and Codex Agent features.",privacy:"Learn how VuvoDesk handles account, device, support, signaling, and direct screen traffic data.",refunds:"Read the VuvoDesk cancellation and refund policy before paid checkout opens.","not-found":"The requested VuvoDesk page was not found."};document.title=a[s];const m=`https://vuvodesk.com${s==="not-found"?"/":window.location.pathname.replace(/\/+$/,"")||"/"}`;let r=document.querySelector('link[rel="canonical"]');r||(r=document.createElement("link"),r.rel="canonical",document.head.append(r)),r.href=m;const c=document.querySelector('meta[name="description"]');c&&(c.content=n[s]);let l=document.querySelector('meta[property="og:url"]');return l||(l=document.createElement("meta"),l.setAttribute("property","og:url"),document.head.append(l)),l.content=m,document.documentElement.classList.add("livedesk-marketing-active"),()=>document.documentElement.classList.remove("livedesk-marketing-active")},[s]),e.jsxs("div",{className:"marketing-site",children:[e.jsx(we,{page:s}),s==="home"?e.jsx(ye,{}):s==="download"?e.jsx(ke,{}):s==="pricing"?e.jsx(Ne,{}):s==="support"?e.jsx(Se,{}):s==="terms"?e.jsx(Pe,{}):s==="privacy"?e.jsx(De,{}):s==="refunds"?e.jsx(Ae,{}):e.jsx(Ce,{}),e.jsx(ge,{})]})}function ze(s){return!!s.navigatorStandalone||!!s.displayModeStandalone||!!s.displayModeFullscreen}function Ee({publicOrigin:s,electron:a,pathname:n,search:t="",navigatorStandalone:m=!1,displayModeStandalone:r=!1,displayModeFullscreen:c=!1,marketingPreview:l=!1}){if(a||!s&&!l)return{kind:"app",redirectPath:""};const L=new URLSearchParams(t),$=L.has("pwa")||ze({navigatorStandalone:m,displayModeStandalone:r,displayModeFullscreen:c}),z=n==="/app"||n.startsWith("/app/"),q=n.startsWith("/support/"),H=L.has("checkout");return $||H?{kind:"app",redirectPath:z?"":"/app"}:z||q?{kind:"app",redirectPath:""}:{kind:"site",redirectPath:""}}function Oe({automaticRetry:s}){const[a,n]=x.useState(null),[t,m]=x.useState("");return x.useEffect(()=>{let r=!0;return F(()=>import("./VuvoDeskApp-CU4N6t3c.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13])).then(c=>{r&&n(()=>c.VuvoDeskApp)}).catch(c=>{if(!r)return;console.warn("[VuvoDesk] app startup load failed.",c);const l=window.navigator.onLine?"The latest app file could not be loaded.":"Reconnect to the internet, then try again.";m(l),he("load-error",s)}),()=>{r=!1}},[s]),a?e.jsx(a,{}):t?e.jsx(G,{detail:t,automaticRetry:s}):e.jsx("main",{className:"runtime-role-boot","aria-label":"Starting VuvoDesk","aria-busy":"true",children:e.jsx("span",{className:"runtime-role-boot-mark","aria-hidden":"true"})})}window.liveDesk&&document.documentElement.classList.add("livedesk-electron-desktop");const u=new URL(window.location.href),Te=!!window.navigator.standalone,D=Ee({publicOrigin:P(),electron:!!window.liveDesk,pathname:u.pathname,search:u.search,navigatorStandalone:Te,displayModeStandalone:window.matchMedia("(display-mode: standalone)").matches,displayModeFullscreen:window.matchMedia("(display-mode: fullscreen)").matches,marketingPreview:u.searchParams.get("site")==="1"});D.redirectPath&&(u.pathname=D.redirectPath,window.history.replaceState({},"",`${u.pathname}${u.search}${u.hash}`));ae.createRoot(document.getElementById("root")).render(e.jsx(x.StrictMode,{children:D.kind==="site"?e.jsx(Le,{}):e.jsx(K,{automaticRetry:P(),children:e.jsx(Oe,{automaticRetry:P()})})}));ce();de();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))f(e);new MutationObserver(e=>{for(const t of e)if(t.type==="childList")for(const r of t.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&f(r)}).observe(document,{childList:!0,subtree:!0});function l(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?t.credentials="include":e.crossOrigin==="anonymous"?t.credentials="omit":t.credentials="same-origin",t}function f(e){if(e.ep)return;e.ep=!0;const t=l(e);fetch(e.href,t)}})();const y="modulepreload",g=function(a){return"/"+a},d={},v=function(i,l,f){let e=Promise.resolve();if(l&&l.length>0){let m=function(o){return Promise.all(o.map(c=>Promise.resolve(c).then(u=>({status:"fulfilled",value:u}),u=>({status:"rejected",reason:u}))))};document.getElementsByTagName("link");const r=document.querySelector("meta[property=csp-nonce]"),n=r?.nonce||r?.getAttribute("nonce");e=m(l.map(o=>{if(o=g(o),o in d)return;d[o]=!0;const c=o.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${o}"]${u}`))return;const s=document.createElement("link");if(s.rel=c?"stylesheet":y,c||(s.as="script"),s.crossOrigin="",s.href=o,n&&s.setAttribute("nonce",n),document.head.appendChild(s),c)return new Promise((p,h)=>{s.addEventListener("load",p),s.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${o}`)))})}))}function t(r){const n=new Event("vite:preloadError",{cancelable:!0});if(n.payload=r,window.dispatchEvent(n),!n.defaultPrevented)throw r}return e.then(r=>{for(const n of r||[])n.status==="rejected"&&t(n.reason);return i().catch(t)})};export{v as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const l="startup-retry",p="startup-refresh";function i(e){return/^\d+\.\d+\.\d+$/.test(e)}function R(e){return e.pathname==="/app"||e.searchParams.has("pwa")}function S(e){return e.searchParams.has("pwa")}function y({automaticRetry:e,online:t,retryValue:r}){return e&&t&&!r?"reload-once":"show-retry"}function g(e){const t=String(e||"").trim();return t?t.startsWith("timeout-")?"static-timeout":t.startsWith("load-error-")?"static-load-error":t.startsWith("render-error-")?"render-error":t.startsWith("manual-")||t.startsWith("static-")?"manual":"unknown":"none"}function m(e,t,r=""){const n=new URL(e);return i(r)&&(n.pathname="/app",n.searchParams.set("pwa",r)),n.searchParams.set(l,t),n.searchParams.set(p,t),n.toString()}function L(e){const t=new URL(e);return t.searchParams.delete(l),t.searchParams.delete(p),t.toString()}function T(e,t=""){const r=new URL(e),n=new URL("/callback",r.origin);if(!R(r))return n.toString();for(const[s,c]of r.searchParams)n.searchParams.append(s,c);const a=r.searchParams.get("pwa")??"";return!i(a)&&i(t)&&n.searchParams.set("pwa",t),n.hash=r.hash,n.toString()}function _(e,t){if(!i(t))return"";const r=new URL(e);if(!S(r))return"";const n=r.pathname!=="/app",a=r.searchParams.get("pwa")!==t;return!n&&!a?"":(r.pathname="/app",r.searchParams.set("pwa",t),r.toString())}const E=2500;let o=null,d=0,u=null,h=!1;function f(){return Math.max(0,Math.min(864e5,Math.round(window.performance?.now?.()||0)))}function k(e){const t=e.split(".").map(r=>Number(r));return t.length!==4||!t.every(r=>Number.isInteger(r)&&r>=0&&r<=255)?!1:t[0]===10||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&t[1]===168}function U(){if(window.location.protocol!=="https:")return!1;const e=window.location.hostname.replace(/^\[|\]$/g,"").toLowerCase();return e!=="localhost"&&e!=="127.0.0.1"&&e!=="::1"&&!k(e)}function v(){const e=new URL(window.location.href);return e.searchParams.get(l)||e.searchParams.get(p)||""}function b(){window.__vuvodeskPwaStartupEvidence||(window.__vuvodeskPwaStartupEvidence={moduleReadyMs:f(),renderReadyMs:0,retryKind:g(v())})}function W(){const e=window.__vuvodeskPwaStartupEvidence;return Object.freeze({moduleReadyMs:e?.moduleReadyMs??-1,renderReadyMs:e?.renderReadyMs??-1,documentAgeMs:f(),retryKind:e?.retryKind??"unknown"})}async function A(){if(!U()||!window.navigator.onLine)return"";const e=new AbortController,t=window.setTimeout(()=>e.abort(),E);try{const r=await fetch(`/sw.js?startup-recovery=${Date.now()}`,{cache:"no-store",signal:e.signal});return r.ok?(await r.text()).match(/const PWA_RELEASE = ['"](\d+\.\d+\.\d+)['"];/)?.[1]??"":""}catch{return""}finally{window.clearTimeout(t)}}function O(e,t){const r=v();if(y({automaticRetry:t,online:window.navigator.onLine,retryValue:r})!=="reload-once")return Promise.resolve(!1);if(o)return o;const a=++d;return o=(async()=>{const s=`${e}-${Date.now()}`,c=await A();return a!==d?!1:(window.stop(),window.location.replace(m(window.location.href,s,c)),!0)})(),o}function $(){d+=1;const e=`manual-${Date.now()}`;window.stop(),window.location.replace(m(window.location.href,e))}function M(){window.__vuvodeskStaticBootTimer!==void 0&&(window.clearTimeout(window.__vuvodeskStaticBootTimer),delete window.__vuvodeskStaticBootTimer)}function C(){window.__vuvodeskPwaStartupEvidence&&(window.__vuvodeskPwaStartupEvidence.renderReadyMs=f()),M()}const P="serviceWorker"in navigator&&window.isSecureContext&&window.location.protocol==="https:";function w(){!P||u||(u=(async()=>{await(await navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"})).update();const t=await fetch(`/sw.js?pwa-release-check=${Date.now()}`,{cache:"no-store"});if(!t.ok)return;const n=(await t.text()).match(/const PWA_RELEASE = ['"](\d+\.\d+\.\d+)['"];/)?.[1];if(!n)return;const a=_(window.location.href,n);a&&window.location.replace(a)})().catch(e=>{console.warn("[VuvoDesk] PWA update check failed.",e)}).finally(()=>{u=null}))}function D(){!P||h||(h=!0,w(),window.addEventListener("pageshow",w),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&w()}))}export{l as P,$ as a,p as b,L as c,y as d,W as e,C as f,T as g,b as m,O as r,D as s,M as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as c}from"./icons-CuXJn-Hz.js";import{r as m,a as R,P as h,b as f,c as P,d as v,m as S,e as y,s as j,t as k,f as E}from"./pwa-bootstrap-BCid3CYk.js";var l={exports:{}},s={};var d;function _(){if(d)return s;d=1;var e=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function o(x,t,n){var i=null;if(n!==void 0&&(i=""+n),t.key!==void 0&&(i=""+t.key),"key"in t){n={};for(var u in t)u!=="key"&&(n[u]=t[u])}else n=t;return t=n.ref,{$$typeof:e,type:x,key:i,ref:t!==void 0?t:null,props:n}}return s.Fragment=r,s.jsx=o,s.jsxs=o,s}var p;function T(){return p||(p=1,l.exports=_()),l.exports}var a=T();function A(e){const r=new URL(window.location.href);return v({automaticRetry:e,online:window.navigator.onLine,retryValue:r.searchParams.get(h)||r.searchParams.get(f)||""})==="reload-once"}function w({detail:e,automaticRetry:r=!1}){return A(r)?a.jsx("main",{className:"runtime-role-boot","aria-label":"Refreshing VuvoDesk","aria-busy":"true",children:a.jsx("span",{className:"runtime-role-boot-mark","aria-hidden":"true"})}):a.jsxs("main",{className:"runtime-role-boot","aria-label":"Starting VuvoDesk","aria-busy":"false",children:[a.jsx("strong",{children:"VuvoDesk could not start"}),a.jsx("p",{children:e}),a.jsx("button",{type:"button",className:"runtime-role-boot-retry",onClick:R,children:"Try again"})]})}function b(){return c.useEffect(()=>{const e=new URL(window.location.href);if(!e.searchParams.has(h)&&!e.searchParams.has(f))return;const r=new URL(P(e.toString()));window.history.replaceState(window.history.state,"",`${r.pathname}${r.search}${r.hash}`)},[]),null}class U extends c.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(r,o){console.error("[VuvoDesk] app render failed.",r,o.componentStack),m("render-error",this.props.automaticRetry)}render(){return this.state.failed?a.jsx(w,{detail:"The current app could not be displayed. Check the connection, then try again.",automaticRetry:this.props.automaticRetry}):a.jsxs(c.Fragment,{children:[this.props.children,a.jsx(b,{})]})}}const C=Object.freeze(Object.defineProperty({__proto__:null,PwaStartupBoundary:U,PwaStartupFailure:w,markPwaModuleReady:S,readPwaStartupEvidence:y,recoverPwaStartupNavigation:m,retryPwaStartupManually:R,startPwaUpdateOwner:j,takeOverPwaStaticEntry:k,takeOverStaticBoot:E},Symbol.toStringTag,{value:"Module"}));export{U as P,w as a,a as j,C as p};
|