From 7bb86b20f0c9967887f7fea3f6e4f3db0fc23954 Mon Sep 17 00:00:00 2001 From: quartune <123062848+quartune@users.noreply.github.com> Date: Sat, 27 Jun 2026 17:22:00 +0000 Subject: [PATCH] feat(#321): add PWA install prompt with 30s delay and 7-day dismiss suppression - InstallBanner component captures beforeinstallprompt and shows after 30s - Dismiss suppresses banner for 7 days via localStorage - manifest.json extended with orientation and categories for Lighthouse - layout.tsx cleaned up duplicate CommandPalette import --- public/manifest.json | 2 + src/app/layout.tsx | 3 +- src/components/InstallBanner.tsx | 94 ++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 src/components/InstallBanner.tsx diff --git a/public/manifest.json b/public/manifest.json index 5af349f..b39335d 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -7,6 +7,8 @@ "display": "standalone", "background_color": "#030712", "theme_color": "#4f46e5", + "orientation": "any", + "categories": ["finance", "productivity"], "icons": [ { "src": "/icons/icon-192.png", diff --git a/src/app/layout.tsx b/src/app/layout.tsx index f4b026e..5af195a 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -13,8 +13,8 @@ import RecipientOnboarding from "@/components/RecipientOnboarding"; import HeaderShortcutsButton from "@/components/HeaderShortcutsButton"; import CommandPalette from "@/components/CommandPalette"; import { SessionLockProvider } from "@/contexts/SessionLockContext"; -import CommandPalette from "@/components/CommandPalette"; import { ToastProvider } from "@/contexts/ToastContext"; +import InstallBanner from "@/components/InstallBanner"; const accessibilityBootstrap = ` (function () { @@ -84,6 +84,7 @@ export default function RootLayout({ +