diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68d39ea..a6ed980 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: - name: Check PWA install contracts run: node scripts/check-pwa.mjs - - name: Regenerate PWA icons + - name: Verify PWA icon generation run: node scripts/generate-icons.mjs - name: Check icon outputs exist diff --git a/CHANGELOG.md b/CHANGELOG.md index 72439bf..d630617 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,23 @@ All notable changes to FloRo Sign Controller are documented here. Version numbers match `APP_VERSION` in `js/ui.js`. Bump `CACHE_NAME` in `sw.js` when static assets change so installed PWAs pick up updates. +## [2.2.1] - 2026-09-05 + +### Fixed +- Register the service worker immediately instead of waiting for every font and image to load, and bypass stale CDN caches during worker updates. +- Add an honest manual-install path when Chrome withholds `beforeinstallprompt`, plus installed-app detection and app-drawer instructions for Android. +- Use the searchable Android app name **FloRo Sign** while preserving the same production manifest identity. +- Serve cached navigations immediately so installed launches do not wait on a poor network connection. +- Show Android install guidance without the old 2.5-second layout shift that delayed Largest Contentful Paint. +- Render the default disconnected state in the initial shell and align first-run Dynamic mode with the specified mode 32, avoiding startup layout and text shifts. +- Stop programmatic color restoration from firing a user-change callback that forced first-run and restored Dynamic scenes into Static mode 1. +- Force service-worker precache requests to bypass Chrome's HTTP cache, preventing a new cache version from silently reinstalling stale JavaScript. + +### Performance +- Replace the 3.7 MB Material Symbols font with a 6 KB subset containing only the 16 icons used by FloRo. +- Remove render-blocking third-party Google Font requests; Android continues to use its native Roboto font. +- Reuse the 192 px app icon in the install banner instead of downloading and precaching a duplicate 53 KB logo. + ## [2.2.0] - 2026-09-05 ### Fixed diff --git a/DESIGN.md b/DESIGN.md index f10b787..a380dc5 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -745,11 +745,11 @@ Do **not** introduce these — they break the premium-remote feel: Canonical contract: [`specs/pwa.md`](specs/pwa.md). Health Hub is the reference for the install button (native `prompt()` only). - **Asset paths:** Relative `./` in the page, SW, and manifest. No `` tag. Works at localhost `/` and production `/sign-controller/`. - **Display:** `standalone` with `display_override: ["standalone"]` -- **Identity:** `id` = `https://rawshn.com/sign-controller/` +- **Identity:** `id` = `./` (resolves to `https://rawshn.com/sign-controller/` in production) - **Meta:** `mobile-web-app-capable` + `apple-mobile-web-app-capable`; `apple-mobile-web-app-title` = FloRo - **Icons:** Neon Attack `logo.png`; regenerate via `node scripts/generate-icons.mjs` -- **Service worker:** `./sw.js` on `load`; bump `CACHE_NAME` on asset changes -- **Install prompt:** `#install-banner`; **Install** visible only when `beforeinstallprompt` fired +- **Service worker:** register `./sw.js` immediately with `updateViaCache: "none"`; bump `CACHE_NAME` on asset changes +- **Install prompt:** `#install-banner`; native **Install** only when `beforeinstallprompt` fired, otherwise a clearly labeled help action - **Required header:** `Permissions-Policy: bluetooth=(self)` plus `Cache-Control: no-cache` on `sw.js` (portfolio `vercel.json`) ## File Map diff --git a/README.md b/README.md index 056579e..d97d7fb 100644 --- a/README.md +++ b/README.md @@ -116,11 +116,11 @@ See [`specs/pwa.md`](specs/pwa.md). Short version: **Install** calls the browser | Platform | Banner | Install button | |----------|--------|----------------| -| **Android (Chrome/Edge)** | After `beforeinstallprompt`, or a 2.5s fallback with honest copy | Only when the native prompt exists | +| **Android (Chrome/Edge)** | Native prompt when available; otherwise immediate honest guidance | Native **Install**, or clearly labeled **Install help** | | **iOS (Safari)** | On first visit (Share → Add to Home Screen copy) | Hidden (Apple has no auto-install) | | **Desktop** | Hidden until `beforeinstallprompt` | Native **Install** when Chrome/Edge offers it | -Dismiss **Not now** stores `floro_install_dismissed_v5` for **7 days**. Settings > **Install App** still works (native prompt, or a help sheet). After install (standalone), the banner hides. +Dismiss **Not now** stores `floro_install_dismissed_v6` for **7 days**. Settings > **Install App** still works (native prompt, or a help sheet). On Android, an installed app appears in the app drawer as **FloRo Sign**; the launcher may not automatically pin it to the Home screen. ## Assets diff --git a/css/styles.css b/css/styles.css index ea47da3..9e6688b 100644 --- a/css/styles.css +++ b/css/styles.css @@ -58,8 +58,8 @@ --radius-pill: 999px; --radius-control: 12px; - --font-display: 'Roboto Flex', system-ui, sans-serif; - --font-mono: 'Roboto Mono', ui-monospace, monospace; + --font-display: 'Roboto', system-ui, sans-serif; + --font-mono: ui-monospace, 'SF Mono', Menlo, monospace; --header-height: 56px; --safe-bottom: env(safe-area-inset-bottom, 0px); @@ -140,10 +140,6 @@ body.sheet-open { overflow: hidden; } background: var(--bg-deep); } -.app-shell.install-banner-visible { - padding-bottom: calc(88px + var(--safe-bottom)); -} - /* ── Material Symbols (self-hosted for offline PWA) ── */ @font-face { diff --git a/fonts/MaterialSymbolsOutlined.woff2 b/fonts/MaterialSymbolsOutlined.woff2 index ffda5c8..8830747 100644 Binary files a/fonts/MaterialSymbolsOutlined.woff2 and b/fonts/MaterialSymbolsOutlined.woff2 differ diff --git a/index.html b/index.html index b64f909..782794d 100644 --- a/index.html +++ b/index.html @@ -13,22 +13,21 @@ FloRo Sign Controller - - - - + @@ -55,7 +54,7 @@
-