v6.8.14: desktop 1.0.6 downloads, and a QR window without the coloured dots
CodeQL Analysis / Analyze CodeQL (push) Canceled after 0s
Deploy Application / deploy (push) Canceled after 0s
Mirror to Codeberg / mirror (push) Canceled after 0s
Mirror to PrivacyGuides / mirror (push) Canceled after 0s

This commit is contained in:
lockbitchat
2026-09-27 18:36:51 -04:00
parent b0444a52c6
commit 02b007af3e
26 changed files with 281 additions and 280 deletions
+6
View File
@@ -1,5 +1,11 @@
# Changelog
## v6.8.14 — Desktop 1.0.6 downloads
The download buttons now give you desktop version 1.0.6, which adds a light theme
and the new invitation screens. The window with the QR code no longer has the
coloured dots.
## v6.8.12 — New design for exchanging invitations
New design for the screens where you exchange invitations and answers with your
+1 -1
View File
@@ -9,7 +9,7 @@
No accounts. No servers storing your messages. No installation required.
[![License: MIT](https://img.shields.io/badge/License-MIT-f0892a.svg)](LICENSE)
[![Version](https://img.shields.io/badge/version-6.8.12-3ecf8e.svg)](CHANGELOG.md)
[![Version](https://img.shields.io/badge/version-6.8.14-3ecf8e.svg)](CHANGELOG.md)
[![Get it from the Snap Store](https://snapcraft.io/securebit-chat/badge.svg)](https://snapcraft.io/securebit-chat)
[![PWA](https://img.shields.io/badge/PWA-installable-3ecf8e.svg)](#install-as-an-app)
[![Encryption](https://img.shields.io/badge/crypto-ECDH%20P--384%20%C2%B7%20AES--256--GCM-blue.svg)](#security-model)
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/ar/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/ar.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/ar.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/de/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/de.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/de.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+2 -2
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
Vendored
+7 -7
View File
File diff suppressed because one or more lines are too long
+3 -3
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -7,7 +7,7 @@ this document describes.
| | |
| --- | --- |
| Release | v6.8.12 |
| Release | v6.8.14 |
| Protocol version | 4.1 |
| Ratchet wire version | 1 |
@@ -347,5 +347,5 @@ no leg may stop a capture it borrowed.
## Scope
This describes the browser implementation as it stands in v6.8.12. It is not a
This describes the browser implementation as it stands in v6.8.14. It is not a
substitute for independent cryptographic review.
+2 -2
View File
@@ -153,7 +153,7 @@
</thead>
<tbody><tr>
<td>Release</td>
<td>v6.8.12</td>
<td>v6.8.14</td>
</tr>
<tr>
<td>Protocol version</td>
@@ -486,7 +486,7 @@
shared across every leg, and stopped when the call, the group or the tab ends;
no leg may stop a capture it borrowed.</p>
<h2 id="scope">Scope</h2>
<p>This describes the browser implementation as it stands in v6.8.12. It is not a
<p>This describes the browser implementation as it stands in v6.8.14. It is not a
substitute for independent cryptographic review.</p>
<nav class="more">
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/es/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/es.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/es.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/fa/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/fa.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/fa.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/fr/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/fr.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/fr.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/he/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/he.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/he.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/hi/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/hi.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/hi.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+18 -18
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,18 +287,18 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -486,12 +486,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/ko/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/ko.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/ko.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+7 -7
View File
@@ -1,10 +1,10 @@
{
"version": "1790540575787",
"buildVersion": "1790540575787",
"appVersion": "6.8.12",
"buildTime": "2026-09-27T20:22:55.824Z",
"buildId": "1790540575787-cd9d78d",
"gitHash": "cd9d78d",
"version": "1790548306121",
"buildVersion": "1790548306121",
"appVersion": "6.8.14",
"buildTime": "2026-09-27T22:31:46.157Z",
"buildId": "1790548306121-b0444a5",
"gitHash": "b0444a5",
"generated": true,
"generatedAt": "2026-09-27T20:22:55.825Z"
"generatedAt": "2026-09-27T22:31:46.158Z"
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "securebit-chat",
"version": "6.8.12",
"version": "6.8.14",
"description": "Secure P2P Communication Application with End-to-End Encryption",
"main": "index.html",
"scripts": {
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/ru/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/ru.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/ru.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+1 -6
View File
@@ -1379,9 +1379,6 @@ import { GroupCallMedia, mediaErrorCode } from './group/groupCallMedia.js';
const isOfferCred = isCreate && showOfferStep && !showVerification;
const isAnswerCred = !isCreate && showAnswerStep && !showVerification;
const atIntro = !showVerification && !isGenerating && !isOfferCred && !isAnswerCred;
const accent = isCreate ? C_ORANGE : C_GREEN;
// Same pair as a mark: fa() puts `color` on the icon's stroke.
const accentSolid = isCreate ? C_ORANGE_SOLID : C_GREEN_SOLID;
const kicker = showVerification
? t('step.verification')
: ((isOfferCred || isAnswerCred) ? t('step.exchange') : t('step.open'));
@@ -1803,7 +1800,7 @@ import { GroupCallMedia, mediaErrorCode } from './group/groupCallMedia.js';
// /download/v0.3.0/SecureBit.Chat_0.1.0_x64-setup.exe, a file that never
// existed, and the download 404s. A pinned tag keeps serving a real
// installer instead.
const SB_DESKTOP_VERSION = '1.0.5';
const SB_DESKTOP_VERSION = '1.0.6';
const SB_DESKTOP_RELEASE = `https://github.com/SecureBitChat/securebit-desktop/releases/download/v${SB_DESKTOP_VERSION}`;
const DOWNLOADS = {
mac: { name: 'macOS', format: '.dmg · Apple Silicon & Intel', icon: 'fab fa-apple', url: `${SB_DESKTOP_RELEASE}/SecureBit.Chat_${SB_DESKTOP_VERSION}_x64.dmg` },
@@ -1900,7 +1897,6 @@ import { GroupCallMedia, mediaErrorCode } from './group/groupCallMedia.js';
const qrModal = (qrModalOpen && qrCodeUrl) && h('div', { key: 'qrmodal', onClick: () => setQrModalOpen(false), style: { position: 'fixed', inset: 0, zIndex: 50, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '32px', background: 'rgba(var(--sb-scrim-rgb), 0.82)', backdropFilter: 'blur(10px)', animation: 'sbUp .2s ease' } },
h('div', { onClick: (e) => e.stopPropagation(), style: { width: '100%', maxWidth: '460px', borderRadius: '22px', border: '1px solid rgba(var(--sb-ink), 0.1)', background: 'var(--sb-bg)', boxShadow: '0 30px 90px rgba(var(--sb-shadow-rgb), calc(0.6 * var(--sb-shadow-k)))', overflow: 'hidden' } }, [
h('div', { key: 'head', style: { display: 'flex', alignItems: 'center', gap: '11px', padding: '18px 20px', borderBottom: '1px solid rgba(var(--sb-ink), 0.06)' } }, [
h('span', { key: 'd', style: { width: '9px', height: '9px', borderRadius: '50%', background: accent } }),
h('div', { key: 'tx', style: { flex: 1, lineHeight: 1.2 } }, [
h('div', { key: 't', style: { fontSize: '15.5px', fontWeight: 800, color: 'var(--sb-text-1)' } }, isCreate ? t('handshake.shareTitle') : t('handshake.sendAnswerTitle')),
h('div', { key: 's', style: { fontSize: '12px', color: 'var(--sb-text-8)' } }, `${isCreate ? 'offer' : 'answer'} · one-time`)
@@ -1913,7 +1909,6 @@ import { GroupCallMedia, mediaErrorCode } from './group/groupCallMedia.js';
h('div', { key: 'ctrls', style: { display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '12px', marginTop: '18px' } }, [
(qrFramesTotal || 0) >= 1 && h('div', { key: 'frame', style: { display: 'flex', alignItems: 'center', gap: '9px' } }, [
h('span', { key: 'l', style: { fontFamily: MONO, fontSize: '12px', fontWeight: 600, color: 'var(--sb-text-6)' } }, `Frame ${Math.max(1, qrFrameIndex || 1)} / ${qrFramesTotal || 1}`),
h('div', { key: 'dots', style: { display: 'flex', gap: '5px' } }, Array.from({ length: qrFramesTotal || 1 }, (_, i) => h('span', { key: i, style: { width: '7px', height: '7px', borderRadius: '50%', background: (i + 1) === (qrFrameIndex || 1) ? accent : 'rgba(var(--sb-ink), 0.14)', transition: 'background .25s' } })))
]),
(qrFramesTotal || 0) > 1 && h('div', { key: 'nav', style: { display: 'flex', alignItems: 'center', gap: '6px' } }, [
h('button', { key: 'prev', onClick: prevQrFrame, style: { width: '40px', height: '36px', display: 'grid', placeItems: 'center', borderRadius: '10px', border: '1px solid rgba(var(--sb-ink), 0.1)', background: 'rgba(var(--sb-ink), 0.04)', color: 'var(--sb-text-4)', cursor: 'pointer' } }, fa('fa-chevron-left')),
+1 -1
View File
@@ -5,7 +5,7 @@
// The tag is pinned rather than using /releases/latest/download/: the filenames
// carry the version, so a `latest` link 404s the moment a newer release exists,
// whereas a pinned tag keeps serving a working (if older) installer.
const DESKTOP_VERSION = '1.0.5';
const DESKTOP_VERSION = '1.0.6';
const DESKTOP_RELEASE = `https://github.com/SecureBitChat/securebit-desktop/releases/download/v${DESKTOP_VERSION}`;
const DownloadApps = () => {
+1 -1
View File
@@ -11,7 +11,7 @@ let DYNAMIC_CACHE = 'securebit-pwa-dynamic-v4.7.56';
// Build stamp — rewritten by scripts/post-build.js on every release so this file's
// bytes change each deploy. That is what makes the browser detect a new Service Worker,
// reinstall it, drop stale caches and (via controllerchange) prompt the page to update.
const SW_BUILD_VERSION = '1790540575787';
const SW_BUILD_VERSION = '1790548306121';
// Locale subdirectories, rewritten by scripts/build-i18n.js. Each localized page is a
// separate document at its own URL, so the shell has to be cached and served per
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/uk/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/uk.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/uk.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/ur/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/ur.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/ur.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>
+19 -19
View File
@@ -30,18 +30,18 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/zh/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Blocking, and above the stylesheet on purpose: this stamps data-theme on <html>
from localStorage while the parser is still in <head>, so the page paints in the
chosen theme on the first frame instead of flashing dark and correcting itself.
Cannot be inline (CSP is script-src 'self') and cannot be a module (deferred). -->
<script src="/src/scripts/theme-boot.js?v=1790540575787"></script>
<script src="/src/scripts/theme-boot.js?v=1790548306121"></script>
<!-- Blocking, and in <head> on purpose: beforeinstallprompt fires once and is
not replayed, so the listener has to exist before Chrome decides the page
is installable. Deferred/module scripts are already too late. -->
<script src="/src/scripts/pwa-install-capture.js?v=1790540575787"></script>
<script src="/src/scripts/pwa-install-capture.js?v=1790548306121"></script>
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -116,7 +116,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1790548306121">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -125,7 +125,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790540575787">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1790548306121">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -264,7 +264,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1790540575787"></script>
<script defer src="/config/ice-servers.js?v=1790548306121"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -278,8 +278,8 @@
the end of <body>: 21 KB of CSS in total, but eight round trips before the
browser could paint, which GTmetrix measured at 441 ms on a throttled mobile
connection. Bytes were never the problem; requests were. -->
<link rel="stylesheet" href="/assets/app.css?v=1790540575787">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790540575787">
<link rel="stylesheet" href="/assets/app.css?v=1790548306121">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1790548306121">
<!-- Preload only the fonts needed for first paint. Inter is one variable file that
answers for every weight, so there is one to preload rather than the two of five
copies this used to name. fa-solid covers the bulk of UI icons; fa-regular and
@@ -287,19 +287,19 @@
<link rel="preload" href="/assets/fontawesome/webfonts/fa-solid-900.subset.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1790540575787"></script>
<script defer src="/src/scripts/load-async-css.js?v=1790548306121"></script>
<noscript>
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1790540575787"></script>
<script defer src="/src/scripts/fa-check.js?v=1790548306121"></script>
<!-- This locale's dictionary, registered before anything can ask for a string.
Only the default locale's is bundled (src/i18n/index.js imports it, because t()
falls back to it); every other page loads its own here instead of all thirteen
riding along inside dist/app.js. Absent on the default locale's own page. -->
<script type="module" src="/src/i18n/dict/zh.js?v=1790540575787"></script>
<script type="module" src="/src/i18n/dict/zh.js?v=1790548306121"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1790540575787"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790540575787"></script>
<script defer src="/src/utils/updateManager.js?v=1790548306121"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1790548306121"></script>
<!-- /dist/qr-local.js is deliberately absent: app-boot.js fetches it once the
app has mounted and the browser is idle, so the 142 KB it weighs is off the
first load. src/components/QRScanner.js used to be here too and registered
@@ -487,12 +487,12 @@
</div>
</div>
</div>
<script type="module" src="/dist/app-boot.js?v=1790540575787"></script>
<script type="module" src="/dist/app.js?v=1790540575787"></script>
<script type="module" src="/dist/app-boot.js?v=1790548306121"></script>
<script type="module" src="/dist/app.js?v=1790548306121"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790540575787"></script>
<script src="/src/pwa/install-prompt.js?v=1790540575787" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790540575787" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790540575787"></script>
<script defer src="/src/scripts/pwa-register.js?v=1790548306121"></script>
<script src="/src/pwa/install-prompt.js?v=1790548306121" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1790548306121" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1790548306121"></script>
</body>
</html>