From 034a64a744ebafcf44738c4892396346174322ed Mon Sep 17 00:00:00 2001 From: srinidhi-2006-bit Date: Thu, 21 May 2026 09:49:18 +0530 Subject: [PATCH 1/3] feat: add dismissible privacy banner --- src/app/page.tsx | 6 ++-- src/components/PrivacyBanner.tsx | 59 ++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 src/components/PrivacyBanner.tsx diff --git a/src/app/page.tsx b/src/app/page.tsx index 0455049e..e3428153 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,5 +1,6 @@ import VideoEditor from "@/components/VideoEditor"; -import Footer from "@/components/Footer"; +import Footer from "@/components/Footer"; +import PrivacyBanner from "@/components/PrivacyBanner"; export default function Home() { return ( @@ -13,6 +14,7 @@ export default function Home() {
+
@@ -20,4 +22,4 @@ export default function Home() { ); } - + diff --git a/src/components/PrivacyBanner.tsx b/src/components/PrivacyBanner.tsx new file mode 100644 index 00000000..e7dd86c9 --- /dev/null +++ b/src/components/PrivacyBanner.tsx @@ -0,0 +1,59 @@ +"use client"; + +import { useEffect, useState } from "react"; + +const STORAGE_KEY = "reframe-privacy-banner-dismissed"; + +export default function PrivacyBanner() { + const [visible, setVisible] = useState(false); + + useEffect(() => { + const dismissedAt = localStorage.getItem(STORAGE_KEY); + + if (!dismissedAt) { + setVisible(true); + return; + } + + const sevenDays = 7 * 24 * 60 * 60 * 1000; + const expired = Date.now() - Number(dismissedAt) > sevenDays; + + if (expired) { + localStorage.removeItem(STORAGE_KEY); + setVisible(true); + } + }, []); + + const handleClose = () => { + localStorage.setItem(STORAGE_KEY, Date.now().toString()); + setVisible(false); + }; + + if (!visible) return null; + + return ( +
+
+
+

+ Your videos never leave your device. +

+ +

+ Processing is done entirely in your browser using FFmpeg.wasm. + No server, no upload, no account required. +

+
+ + +
+
+ ); +} From 054d648aca2feb3aa35bb694e0bfc2a0d89ae5d5 Mon Sep 17 00:00:00 2001 From: srinidhi-2006-bit Date: Thu, 21 May 2026 09:54:24 +0530 Subject: [PATCH 2/3] feat: add dismissible privacy banner --- src/app/page.tsx | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index e3428153..b86ad23b 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,25 +1,22 @@ import VideoEditor from "@/components/VideoEditor"; -import Footer from "@/components/Footer"; import PrivacyBanner from "@/components/PrivacyBanner"; export default function Home() { return ( - <> +
+ className="fixed top-4 right-4 z-50 flex items-center gap-1.5 px-3 py-1.5 rounded-lg border border-[var(--border)] bg-[var(--surface)] text-[10px] font-heading font-semibold uppercase tracking-widest text-[var(--muted)] hover:text-film-600 hover:border-film-400 transition-all duration-200 shadow-sm" + > ⭐ Star on GitHub -
+
- -
- +
); } - From 9adf6198bec6677ecabe9d14eac6723ac52540b7 Mon Sep 17 00:00:00 2001 From: srinidhi-2006-bit Date: Fri, 22 May 2026 00:04:51 +0530 Subject: [PATCH 3/3] fix: restore page structure and accessibility --- src/app/page.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index b86ad23b..691fec9b 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,22 +1,25 @@ -import VideoEditor from "@/components/VideoEditor"; import PrivacyBanner from "@/components/PrivacyBanner"; +import VideoEditor from "@/components/VideoEditor"; +import Footer from "@/components/Footer"; export default function Home() { return ( -
+ <> ⭐ Star on GitHub -
+
-
+ +