livedesk 0.1.623 → 0.1.625

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livedesk",
3
- "version": "0.1.623",
3
+ "version": "0.1.625",
4
4
  "livedeskClientVersion": "0.1.266",
5
5
  "buildFlavor": "production",
6
6
  "description": "VuvoDesk Hub and client launcher",
package/web/dist/_headers CHANGED
@@ -1,8 +1,14 @@
1
1
  /*
2
2
  Permissions-Policy: local-network-access=(self), local-network=(self), loopback-network=(self)
3
3
 
4
- /
5
- Cache-Control: no-cache, no-store, must-revalidate
4
+ /
5
+ Cache-Control: no-cache, no-store, must-revalidate
6
+
7
+ /app
8
+ Cache-Control: no-cache, no-store, must-revalidate
9
+
10
+ /app.html
11
+ Cache-Control: no-cache, no-store, must-revalidate
6
12
 
7
13
  /index.html
8
14
  Cache-Control: no-cache, no-store, must-revalidate
@@ -0,0 +1,134 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover, interactive-widget=resizes-content" />
6
+ <meta name="description" content="VuvoDesk puts every computer in one calm screen wall, with focused control from desktop or mobile." />
7
+ <meta name="application-name" content="VuvoDesk" />
8
+ <meta name="theme-color" content="#ffffff" />
9
+ <meta name="mobile-web-app-capable" content="yes" />
10
+ <meta name="apple-mobile-web-app-capable" content="yes" />
11
+ <meta name="apple-mobile-web-app-status-bar-style" content="default" />
12
+ <meta name="apple-mobile-web-app-title" content="VuvoDesk" />
13
+ <link rel="manifest" href="/app.webmanifest" />
14
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
15
+ <link rel="icon" href="/favicon.ico" sizes="any" />
16
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png" />
17
+ <title>VuvoDesk Console</title>
18
+ <style>
19
+ html, body { min-height: 100%; margin: 0; background: #f3f6f9; }
20
+ .vuvodesk-static-boot {
21
+ min-height: 100vh;
22
+ display: grid;
23
+ place-content: center;
24
+ justify-items: center;
25
+ gap: 10px;
26
+ background: #f3f6f9;
27
+ color: #111827;
28
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
29
+ }
30
+ .vuvodesk-static-boot-mark {
31
+ width: 30px;
32
+ height: 30px;
33
+ border: 3px solid rgba(15, 118, 110, .18);
34
+ border-top-color: #0f766e;
35
+ border-radius: 999px;
36
+ animation: vuvodesk-static-boot-spin .8s linear infinite;
37
+ }
38
+ .vuvodesk-static-boot strong { font-size: 15px; }
39
+ .vuvodesk-static-boot p { margin: 0; color: #667085; font-size: 12px; }
40
+ .vuvodesk-static-boot button {
41
+ min-width: 108px;
42
+ min-height: 40px;
43
+ margin-top: 4px;
44
+ border: 0;
45
+ border-radius: 10px;
46
+ background: #0f766e;
47
+ color: #ffffff;
48
+ font: inherit;
49
+ font-size: 13px;
50
+ font-weight: 700;
51
+ }
52
+ .vuvodesk-static-boot button[hidden] { display: none; }
53
+ @keyframes vuvodesk-static-boot-spin { to { transform: rotate(360deg); } }
54
+ </style>
55
+ <script type="module" crossorigin src="/assets/app-Cf_zcvY8.js"></script>
56
+ <link rel="modulepreload" crossorigin href="/assets/icons-GaObu1Hf.js">
57
+ <link rel="modulepreload" crossorigin href="/assets/react-BF-iFH2F.js">
58
+ <link rel="modulepreload" crossorigin href="/assets/styles-BgBqNVYU.js">
59
+ <link rel="modulepreload" crossorigin href="/assets/supabase-C7qjtLN3.js">
60
+ <link rel="modulepreload" crossorigin href="/assets/LiveDeskApp-DYF-U7wd.js">
61
+ <link rel="stylesheet" crossorigin href="/assets/styles-p05EbHC8.css">
62
+ <link rel="stylesheet" crossorigin href="/assets/LiveDeskApp-ChGXEkMA.css">
63
+ </head>
64
+ <body>
65
+ <div id="root">
66
+ <main class="vuvodesk-static-boot" data-vuvodesk-static-boot aria-label="Starting VuvoDesk" aria-busy="true">
67
+ <span class="vuvodesk-static-boot-mark" aria-hidden="true"></span>
68
+ <strong data-vuvodesk-static-boot-title>Starting VuvoDesk</strong>
69
+ <p data-vuvodesk-static-boot-detail>Loading the current app...</p>
70
+ <button type="button" data-vuvodesk-static-boot-retry hidden>Try again</button>
71
+ </main>
72
+ </div>
73
+ <script>
74
+ (() => {
75
+ const boot = document.querySelector('[data-vuvodesk-static-boot]');
76
+ const title = document.querySelector('[data-vuvodesk-static-boot-title]');
77
+ const detail = document.querySelector('[data-vuvodesk-static-boot-detail]');
78
+ const retry = document.querySelector('[data-vuvodesk-static-boot-retry]');
79
+ const revealSlow = () => {
80
+ if (!boot || !boot.isConnected) return;
81
+ if (title) title.textContent = 'VuvoDesk is still loading';
82
+ if (detail) detail.textContent = 'The latest app is taking longer than usual.';
83
+ if (retry) {
84
+ retry.textContent = 'Reload latest';
85
+ retry.hidden = false;
86
+ }
87
+ };
88
+ const revealFailure = () => {
89
+ if (!boot || !boot.isConnected) return;
90
+ boot.setAttribute('aria-busy', 'false');
91
+ boot.querySelector('.vuvodesk-static-boot-mark')?.remove();
92
+ if (title) title.textContent = 'VuvoDesk could not start';
93
+ if (detail) detail.textContent = 'The app files did not start. Check the connection, then try again.';
94
+ if (retry) {
95
+ retry.textContent = 'Try again';
96
+ retry.hidden = false;
97
+ }
98
+ };
99
+ window.__vuvodeskStaticBootTimer = window.setTimeout(revealSlow, 10_000);
100
+ window.addEventListener('error', event => {
101
+ if (event instanceof ErrorEvent || event.target instanceof HTMLScriptElement) revealFailure();
102
+ }, true);
103
+ window.addEventListener('unhandledrejection', revealFailure, { once: true });
104
+ retry?.addEventListener('click', async () => {
105
+ retry.disabled = true;
106
+ retry.textContent = 'Loading latest...';
107
+ const url = new URL(window.location.href);
108
+ const retryToken = `static-${Date.now()}`;
109
+ url.pathname = '/app';
110
+ const controller = new AbortController();
111
+ const timeout = window.setTimeout(() => controller.abort(), 2_500);
112
+ try {
113
+ const response = await fetch(`/sw.js?startup-recovery=${Date.now()}`, {
114
+ cache: 'no-store',
115
+ signal: controller.signal
116
+ });
117
+ if (response.ok) {
118
+ const source = await response.text();
119
+ const release = source.match(/const PWA_RELEASE = ['"](\d+\.\d+\.\d+)['"];/)?.[1];
120
+ if (release) url.searchParams.set('pwa', release);
121
+ }
122
+ } catch {
123
+ // The unique recovery URL still forces a fresh document request.
124
+ } finally {
125
+ window.clearTimeout(timeout);
126
+ }
127
+ url.searchParams.set('startup-retry', retryToken);
128
+ url.searchParams.set('startup-refresh', retryToken);
129
+ window.location.replace(url.toString());
130
+ });
131
+ })();
132
+ </script>
133
+ </body>
134
+ </html>
@@ -4,7 +4,7 @@
4
4
  "short_name": "VuvoDesk",
5
5
  "description": "Monitor and control your VuvoDesk computers from your phone.",
6
6
  "lang": "en",
7
- "start_url": "/app?pwa=0.1.623",
7
+ "start_url": "/app?pwa=0.1.625",
8
8
  "scope": "/",
9
9
  "display": "standalone",
10
10
  "orientation": "any",