From 7f5891d029bca068dcb3cc04fad5e6809553ec9c Mon Sep 17 00:00:00 2001 From: jtricerolph Date: Wed, 29 Jul 2026 17:28:39 +0000 Subject: [PATCH] Add PWA manifest support and icons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit App had no manifest, no service worker, and no icons — not installable as a PWA at all despite having PWA meta tags in index.html. --- frontend/package.json | 3 ++- frontend/public/icons/icon-192.png | Bin 0 -> 2170 bytes frontend/public/icons/icon-512.png | Bin 0 -> 6243 bytes frontend/vite.config.ts | 26 +++++++++++++++++++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 frontend/public/icons/icon-192.png create mode 100644 frontend/public/icons/icon-512.png diff --git a/frontend/package.json b/frontend/package.json index 0da6cbc..ae2ec80 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,6 +19,7 @@ "@types/react-dom": "^18.3.1", "@vitejs/plugin-react": "^4.3.4", "typescript": "^5.7.2", - "vite": "^6.0.5" + "vite": "^6.0.5", + "vite-plugin-pwa": "^1.3.0" } } diff --git a/frontend/public/icons/icon-192.png b/frontend/public/icons/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2510acf88f1fc5bd69c4577bc1e34204e0b249 GIT binary patch literal 2170 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 at{ZF7ez76-GWgX1ur#%Uzd3*7(SHFrQ2-tQ literal 0 HcmV?d00001 diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 2e0f030..f8a7b73 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,7 +1,31 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +import { VitePWA } from 'vite-plugin-pwa' export default defineConfig({ base: '/hvac/', - plugins: [react()], + plugins: [ + react(), + VitePWA({ + registerType: 'autoUpdate', + manifest: { + name: 'HVAC', + short_name: 'HVAC', + start_url: '/hvac/', + scope: '/hvac/', + display: 'standalone', + theme_color: '#c1440e', + background_color: '#c1440e', + icons: [ + { src: '/hvac/icons/icon-192.png', sizes: '192x192', type: 'image/png' }, + { src: '/hvac/icons/icon-512.png', sizes: '512x512', type: 'image/png' }, + ], + }, + workbox: { + navigateFallback: '/hvac/index.html', + navigateFallbackDenylist: [/\/api\//], + globPatterns: ['**/*.{js,css,html,ico,png,svg}'], + }, + }), + ], })