Maestro task: ad6b3d80-9f41-40ac-8e2a-f786e1fa9777 (Feature 06 - PWA Shell and Offline, final task).
Done-condition
InstallHint renders only on iOS/iPadOS Safari when not standalone (display-mode: standalone and navigator.standalone both false), copy exactly "Tap Share, then Add to Home Screen to get notifications", dismissible and remembered per device, exported for onboarding step 3 and the Notifications screen. Vitest covers shown on iOS Safari tab, hidden when standalone, hidden on Android/desktop, dismissal persisted. Typecheck, test, build pass.
Evidence
New web/src/pwa/InstallHint.tsx + module.css + test.tsx, reusing Card/Icon/IconButton primitives; exported and intentionally not yet wired into any screen.
npm test: 29 files / 302 tests passed; npm run build passed (no Google Fonts check); gofmt -l . empty; no dependency added.
Maestro task: ad6b3d80-9f41-40ac-8e2a-f786e1fa9777 (Feature 06 - PWA Shell and Offline, final task).
## Done-condition
InstallHint renders only on iOS/iPadOS Safari when not standalone (display-mode: standalone and navigator.standalone both false), copy exactly "Tap Share, then Add to Home Screen to get notifications", dismissible and remembered per device, exported for onboarding step 3 and the Notifications screen. Vitest covers shown on iOS Safari tab, hidden when standalone, hidden on Android/desktop, dismissal persisted. Typecheck, test, build pass.
## Evidence
- New web/src/pwa/InstallHint.tsx + module.css + test.tsx, reusing Card/Icon/IconButton primitives; exported and intentionally not yet wired into any screen.
- npm test: 29 files / 302 tests passed; npm run build passed (no Google Fonts check); gofmt -l . empty; no dependency added.
InstallHint shows "Tap Share, then Add to Home Screen to get notifications"
only in iOS and iPadOS Safari browser tabs (not when display-mode is
standalone or navigator.standalone is true), since iOS delivers Web Push
only to installed apps. Dismissing it is remembered per device in
localStorage; when storage is unavailable the hint still shows and
dismisses for the page's lifetime. Exported from src/pwa/InstallHint.tsx
for onboarding step 3 and the Notifications screen.
Maestro task: ad6b3d80-9f41-40ac-8e2a-f786e1fa9777
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Detect Safari by its exact user agent tail instead of a "Safari/" token
plus an exclusion list, so third-party iOS browsers such as MQQBrowser
no longer get the hint. When storage cannot be read or written, keep the
hint visible and show an error banner with Retry instead of treating the
dismissal as saved.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Maestro task: ad6b3d80-9f41-40ac-8e2a-f786e1fa9777 (Feature 06 - PWA Shell and Offline, final task).
Done-condition
InstallHint renders only on iOS/iPadOS Safari when not standalone (display-mode: standalone and navigator.standalone both false), copy exactly "Tap Share, then Add to Home Screen to get notifications", dismissible and remembered per device, exported for onboarding step 3 and the Notifications screen. Vitest covers shown on iOS Safari tab, hidden when standalone, hidden on Android/desktop, dismissal persisted. Typecheck, test, build pass.
Evidence
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: APPROVED for this exact commit.