Skip to content

Commit 4c76ccd

Browse files
authored
Merge pull request #105 from rajbos/feature/privacy-banner
feat: Add privacy banner to reassure users about data security
2 parents 9576842 + 44c6ed2 commit 4c76ccd

2 files changed

Lines changed: 33 additions & 34 deletions

File tree

package-lock.json

Lines changed: 0 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/App.tsx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useState, useCallback, useRef, DragEvent, useEffect } from "react";
22
import { Upload, GithubLogo, CircleNotch } from "@phosphor-icons/react";
3-
import { UserSquare, ChevronRight } from "lucide-react";
3+
import { UserSquare, ChevronRight, Shield } from "lucide-react";
44
import { toast, Toaster } from "sonner";
55
import {
66
LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer,
@@ -44,6 +44,7 @@ import {
4444
} from "@/lib/utils";
4545

4646
function App() {
47+
const [showPrivacyBanner, setShowPrivacyBanner] = useState(true);
4748
const [data, setData] = useState<CopilotUsageData[] | null>(null);
4849
const [aggregatedData, setAggregatedData] = useState<AggregatedData[]>([]);
4950
const [uniqueModels, setUniqueModels] = useState<string[]>([]);
@@ -474,6 +475,37 @@ function App() {
474475
</Button>
475476
</div>
476477
</header>
478+
479+
{/* Privacy Banner */}
480+
{showPrivacyBanner && (
481+
<Card className="mb-6 border border-green-300 bg-white/90 dark:bg-zinc-900/90 shadow-sm dark:border-green-700 relative">
482+
<button
483+
aria-label="Close privacy banner"
484+
className="absolute top-3 right-3 text-green-700 dark:text-green-300 hover:text-red-500 dark:hover:text-red-400 transition-colors rounded-full p-1 focus:outline-none focus:ring-2 focus:ring-green-400"
485+
onClick={() => setShowPrivacyBanner(false)}
486+
type="button"
487+
>
488+
<span className="sr-only">Close</span>
489+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
490+
<path d="M6 6L14 14M14 6L6 14" stroke="currentColor" strokeWidth="2" strokeLinecap="round" />
491+
</svg>
492+
</button>
493+
<div className="p-5 sm:p-6 flex items-center gap-4">
494+
<Shield className="h-6 w-6 text-green-700 dark:text-green-300 flex-shrink-0" />
495+
<div className="flex-1">
496+
<div className="flex items-center gap-2 mb-1">
497+
<h3 className="text-base sm:text-lg font-semibold text-green-900 dark:text-green-200 tracking-tight">
498+
Your Data Stays Private
499+
</h3>
500+
</div>
501+
<p className="text-sm sm:text-base font-medium text-gray-800 dark:text-gray-100 leading-relaxed">
502+
All CSV data is <span className="font-bold text-green-800 dark:text-green-300">processed locally in your browser</span>. We <span className="font-bold">never upload, store, or transmit your data</span> to any server.<br className="hidden sm:block" />
503+
Your usage information remains <span className="font-bold text-green-800 dark:text-green-300">completely private and secure</span> on your machine.
504+
</p>
505+
</div>
506+
</div>
507+
</Card>
508+
)}
477509

478510
{!(data && data.length > 0) && (
479511
<Card className="mb-8">

0 commit comments

Comments
 (0)