|
1 | 1 | import React, { useState, useCallback, useRef, DragEvent, useEffect } from "react"; |
2 | 2 | import { Upload, GithubLogo, CircleNotch } from "@phosphor-icons/react"; |
3 | | -import { UserSquare, ChevronRight } from "lucide-react"; |
| 3 | +import { UserSquare, ChevronRight, Shield } from "lucide-react"; |
4 | 4 | import { toast, Toaster } from "sonner"; |
5 | 5 | import { |
6 | 6 | LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, |
@@ -44,6 +44,7 @@ import { |
44 | 44 | } from "@/lib/utils"; |
45 | 45 |
|
46 | 46 | function App() { |
| 47 | + const [showPrivacyBanner, setShowPrivacyBanner] = useState(true); |
47 | 48 | const [data, setData] = useState<CopilotUsageData[] | null>(null); |
48 | 49 | const [aggregatedData, setAggregatedData] = useState<AggregatedData[]>([]); |
49 | 50 | const [uniqueModels, setUniqueModels] = useState<string[]>([]); |
@@ -474,6 +475,37 @@ function App() { |
474 | 475 | </Button> |
475 | 476 | </div> |
476 | 477 | </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 | + )} |
477 | 509 |
|
478 | 510 | {!(data && data.length > 0) && ( |
479 | 511 | <Card className="mb-8"> |
|
0 commit comments