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({
+