From fc62302f97572521d7bc6f0d039a9a98e371b9ee Mon Sep 17 00:00:00 2001 From: knuthtimo-lab Date: Thu, 4 Sep 2025 14:55:04 +0200 Subject: [PATCH] MVP fertig --- app/client-side/page.tsx | 57 ++--- app/exclude-similar/page.tsx | 124 +++++----- app/offline/page.tsx | 346 +++++++++++++++++++++++++++ app/page.tsx | 6 +- app/privacy/page.tsx | 21 +- public/manifest.json | 22 +- src/app/layout.tsx | 40 ++-- src/components/FAQ.tsx | 36 +-- src/components/PasswordGenerator.tsx | 46 ++-- src/components/layout/Footer.tsx | 24 +- src/components/layout/Header.tsx | 16 +- 11 files changed, 515 insertions(+), 223 deletions(-) create mode 100644 app/offline/page.tsx diff --git a/app/client-side/page.tsx b/app/client-side/page.tsx index 9f9d9d1..46fe3f6 100644 --- a/app/client-side/page.tsx +++ b/app/client-side/page.tsx @@ -32,11 +32,6 @@ export default function ClientSidePage() { title: "Zero Data Storage", description: "We don't store any passwords, user data, or personal information. Everything is processed locally and immediately discarded." }, - { - icon: Shield, - title: "Open Source Verification", - description: "All code is publicly available and auditable. You can verify our security claims by reviewing the source code." - } ] const technicalDetails = [ @@ -98,7 +93,7 @@ export default function ClientSidePage() { className="flex items-center text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors" > - Zurück zu PassMaster + Back to PassMaster @@ -118,10 +113,10 @@ export default function ClientSidePage() {

- Client-Side Sicherheit + Client-Side Security

- Maximale Sicherheit durch lokale Verarbeitung. Ihre Passwörter werden ausschließlich in Ihrem Browser generiert und verlassen niemals Ihr Gerät. + Maximum security through local processing. Your passwords are generated exclusively in your browser and never leave your device.

@@ -135,14 +130,14 @@ export default function ClientSidePage() { className="text-center mb-12" >

- Sicherheits-Features + Security Features

- Jeder Aspekt von PassMaster ist darauf ausgelegt, Ihre Sicherheit zu maximieren. + Every aspect of PassMaster is designed to maximize your security.

-
+
{securityFeatures.map((feature, index) => (

- Warum Client-Side Sicherheit? + Why Client-Side Security?

- Die Vorteile der lokalen Passwort-Generierung. + The benefits of local password generation.

@@ -225,10 +220,10 @@ export default function ClientSidePage() { className="text-center mb-12" >

- Technische Details + Technical Details

- Wie PassMaster Ihre Sicherheit gewährleistet. + How PassMaster ensures your security.

@@ -270,28 +265,24 @@ export default function ClientSidePage() {

- Technische Implementierung + Technical Implementation

-

Wie PassMaster funktioniert

+

How PassMaster Works

  • - Lokale Verarbeitung: Alle Passwort-Generierung erfolgt in Ihrem Browser mit JavaScript + Local Processing: All password generation happens in your browser using JavaScript
  • - Keine Netzwerk-Anfragen: Die App funktioniert nach dem ersten Laden vollständig offline + No Network Requests: The app works completely offline after initial load
  • - Open Source: Der gesamte Code ist öffentlich auf GitHub verfügbar zur Überprüfung -
  • -
  • - - Keine Abhängigkeiten: Wir verwenden keine externen Services oder Drittanbieter-Bibliotheken + No Dependencies: We don't use external services or third-party libraries
@@ -308,26 +299,18 @@ export default function ClientSidePage() { className="bg-green-50 dark:bg-green-900/20 rounded-lg p-8" >

- Fragen zur Sicherheit? + Questions About Security?

- Wir sind verpflichtet zu Transparenz. Wenn Sie Fragen zu unseren Sicherheitspraktiken haben, - überprüfen Sie unseren Quellcode oder kontaktieren Sie uns. + We are committed to transparency. If you have questions about our security practices, + please contact us.

-
- - Quellcode ansehen - +
- Zum Generator + Back to Generator
diff --git a/app/exclude-similar/page.tsx b/app/exclude-similar/page.tsx index 2de4188..2d16b26 100644 --- a/app/exclude-similar/page.tsx +++ b/app/exclude-similar/page.tsx @@ -17,88 +17,88 @@ export default function ExcludeSimilarPage() { const readabilityFeatures = [ { icon: Eye, - title: "Ähnliche Zeichen ausschließen", - description: "Verwirrende Zeichen wie 0/O, 1/l/I werden automatisch ausgeschlossen, um Lesbarkeit zu verbessern." + title: "Exclude Similar Characters", + description: "Confusing characters like 0/O, 1/l/I are automatically excluded to improve readability." }, { icon: BookOpen, - title: "Bessere Lesbarkeit", - description: "Passwörter sind leichter zu lesen und zu tippen, ohne die Sicherheit zu beeinträchtigen." + title: "Better Readability", + description: "Passwords are easier to read and type without compromising security." }, { icon: Target, - title: "Weniger Fehler", - description: "Reduziert Tippfehler beim manuellen Eingeben von Passwörtern erheblich." + title: "Fewer Errors", + description: "Significantly reduces typing errors when manually entering passwords." }, { icon: Users, - title: "Benutzerfreundlich", - description: "Besonders nützlich für ältere Benutzer oder bei der Eingabe auf mobilen Geräten." + title: "User-Friendly", + description: "Especially useful for older users or when typing on mobile devices." } ] const excludedCharacters = [ { - category: "Zahlen und Buchstaben", - characters: ["0 (Null)", "O (Großes O)", "1 (Eins)", "l (kleines L)", "I (Großes i)"], - reason: "Diese Zeichen sehen in vielen Schriftarten identisch aus" + category: "Numbers and Letters", + characters: ["0 (Zero)", "O (Capital O)", "1 (One)", "l (lowercase L)", "I (Capital I)"], + reason: "These characters look identical in many fonts" }, { - category: "Sonderzeichen", - characters: ["| (Pipe)", "` (Backtick)", "' (Apostroph)", "\" (Anführungszeichen)"], - reason: "Können in verschiedenen Kontexten verwirrend sein" + category: "Special Characters", + characters: ["| (Pipe)", "` (Backtick)", "' (Apostrophe)", "\" (Quotation marks)"], + reason: "Can be confusing in different contexts" }, { - category: "Leerzeichen", - characters: [" (Leerzeichen)", " (Mehrfache Leerzeichen)"], - reason: "Können beim Kopieren/Einfügen Probleme verursachen" + category: "Spaces", + characters: [" (Space)", " (Multiple spaces)"], + reason: "Can cause problems when copying/pasting" } ] const benefits = [ { icon: Zap, - title: "Schnellere Eingabe", - description: "Weniger Verwirrung beim manuellen Tippen von Passwörtern." + title: "Faster Input", + description: "Less confusion when manually typing passwords." }, { icon: CheckCircle, - title: "Weniger Fehler", - description: "Reduziert Tippfehler und damit verbundene Frustration." + title: "Fewer Errors", + description: "Reduces typing errors and associated frustration." }, { icon: Eye, - title: "Bessere UX", - description: "Verbessert die Benutzererfahrung ohne Sicherheitsverlust." + title: "Better UX", + description: "Improves user experience without security loss." } ] const securityImpact = [ { - title: "Sicherheit bleibt hoch", + title: "Security Remains High", items: [ - "Entropie wird nur minimal reduziert", - "Noch immer über 80 Zeichen verfügbar", - "Kryptographisch sichere Generierung", - "Ausreichend für alle praktischen Zwecke" + "Entropy is only minimally reduced", + "Still over 80 characters available", + "Cryptographically secure generation", + "Sufficient for all practical purposes" ] }, { - title: "Praktische Vorteile", + title: "Practical Benefits", items: [ - "Einfachere manuelle Eingabe", - "Weniger Support-Anfragen", - "Bessere Benutzerakzeptanz", - "Reduzierte Fehlerrate" + "Easier manual input", + "Fewer support requests", + "Better user acceptance", + "Reduced error rate" ] }, { - title: "Empfohlene Verwendung", + title: "Recommended Usage", items: [ - "Für manuell eingegebene Passwörter", - "Bei älteren Benutzern", - "Auf mobilen Geräten", - "In Umgebungen mit schlechter Sichtbarkeit" + "For manually entered passwords", + "For older users", + "On mobile devices", + "In environments with poor visibility" ] } ] @@ -114,7 +114,7 @@ export default function ExcludeSimilarPage() { className="flex items-center text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white transition-colors" > - Zurück zu PassMaster + Back to PassMaster
@@ -134,11 +134,11 @@ export default function ExcludeSimilarPage() {

- Lesbarkeit & Benutzerfreundlichkeit + Readability & User-Friendliness

- Verbessern Sie die Lesbarkeit Ihrer Passwörter ohne Sicherheit zu opfern. - Ähnliche Zeichen werden automatisch ausgeschlossen. + Improve the readability of your passwords without sacrificing security. + Similar characters are automatically excluded.

@@ -152,10 +152,10 @@ export default function ExcludeSimilarPage() { className="text-center mb-12" >

- Lesbarkeits-Features + Readability Features

- Wie PassMaster die Benutzerfreundlichkeit verbessert. + How PassMaster improves user-friendliness.

@@ -199,10 +199,10 @@ export default function ExcludeSimilarPage() { className="text-center mb-12" >

- Ausgeschlossene Zeichen + Excluded Characters

- Diese Zeichen werden automatisch ausgeschlossen, um Verwirrung zu vermeiden. + These characters are automatically excluded to avoid confusion.

@@ -245,10 +245,10 @@ export default function ExcludeSimilarPage() { className="text-center mb-12" >

- Vorteile der Lesbarkeit + Benefits of Readability

- Warum lesbare Passwörter wichtig sind. + Why readable passwords are important.

@@ -288,10 +288,10 @@ export default function ExcludeSimilarPage() { className="text-center mb-12" >

- Sicherheit vs. Lesbarkeit + Security vs. Readability

- Wie wir das perfekte Gleichgewicht finden. + How we find the perfect balance.

@@ -331,20 +331,20 @@ export default function ExcludeSimilarPage() { className="bg-white dark:bg-gray-800 rounded-lg p-8 shadow-sm border border-gray-200 dark:border-gray-700" >

- Beispiel-Vergleich + Example Comparison

- Ohne Lesbarkeits-Filter + Without Readability Filter

-
Schwer lesbar:
+
Hard to read:
K9mP0lI|nQ2v
- Verwirrende Zeichen: 0, l, I, | + Confusing characters: 0, l, I, |
@@ -352,13 +352,13 @@ export default function ExcludeSimilarPage() {

- Mit Lesbarkeits-Filter + With Readability Filter

-
Leicht lesbar:
+
Easy to read:
K9mP3nQ2vX7w
- Keine verwirrenden Zeichen + No confusing characters
@@ -376,24 +376,24 @@ export default function ExcludeSimilarPage() { className="bg-blue-50 dark:bg-blue-900/20 rounded-lg p-8" >

- Bereit für bessere Lesbarkeit? + Ready for Better Readability?

- Aktivieren Sie die Lesbarkeits-Option in PassMaster und generieren Sie - benutzerfreundliche, aber dennoch sichere Passwörter. + Enable the readability option in PassMaster and generate + user-friendly, yet secure passwords.

- Jetzt ausprobieren + Try Now - Sicherheit erfahren + Learn About Security
diff --git a/app/offline/page.tsx b/app/offline/page.tsx new file mode 100644 index 0000000..726e0d0 --- /dev/null +++ b/app/offline/page.tsx @@ -0,0 +1,346 @@ +"use client" + +import { useState, useEffect } from 'react' +import { motion } from 'framer-motion' +import { + Wifi, + WifiOff, + Download, + Shield, + CheckCircle, + AlertCircle, + Smartphone, + Monitor +} from 'lucide-react' + +export default function OfflinePage() { + const [isOnline, setIsOnline] = useState(true) + const [isInstallable, setIsInstallable] = useState(false) + const [deferredPrompt, setDeferredPrompt] = useState(null) + + useEffect(() => { + setIsOnline(navigator.onLine) + + const handleOnline = () => setIsOnline(true) + const handleOffline = () => setIsOnline(false) + + window.addEventListener('online', handleOnline) + window.addEventListener('offline', handleOffline) + + // PWA install prompt + const handleBeforeInstallPrompt = (e: any) => { + e.preventDefault() + setDeferredPrompt(e) + setIsInstallable(true) + } + + window.addEventListener('beforeinstallprompt', handleBeforeInstallPrompt) + + return () => { + window.removeEventListener('online', handleOnline) + window.removeEventListener('offline', handleOffline) + window.removeEventListener('beforeinstallprompt', handleBeforeInstallPrompt) + } + }, []) + + const handleInstallClick = async () => { + if (deferredPrompt) { + deferredPrompt.prompt() + const { outcome } = await deferredPrompt.userChoice + if (outcome === 'accepted') { + setDeferredPrompt(null) + setIsInstallable(false) + } + } + } + + const offlineFeatures = [ + { + icon: Shield, + title: "Complete Offline Functionality", + description: "All password generation features work without internet connection. Service Worker ensures local availability." + }, + { + icon: WifiOff, + title: "No Data Transmission", + description: "100% client-side processing. Your passwords never leave your device, even in online mode." + }, + { + icon: Download, + title: "PWA Installation", + description: "Install PassMaster as a native app. Works on desktop, tablet and smartphone." + } + ] + + const installSteps = [ + { + step: 1, + title: "Browser Installation", + description: "Click 'Install App' in the address bar or use the button below." + }, + { + step: 2, + title: "Offline Test", + description: "Disable your internet connection and test password generation." + }, + { + step: 3, + title: "App Icon", + description: "PassMaster appears as an app icon on your home screen or in the app list." + } + ] + + return ( +
+
+ {/* Header */} + +
+
+ {isOnline ? ( + + ) : ( + + )} +
+
+ +

+ Offline Password Generator (PWA) +

+ +

+ Install and use PassMaster completely offline. Service Worker and local storage for maximum independence. +

+ + {/* Connection Status */} +
+ {isOnline ? ( + <> + + Online - Ready for Installation + + ) : ( + <> + + Offline Mode Active + + )} +
+
+ + {/* Install Button */} + {isInstallable && ( + + + + )} + + {/* Features */} + +

+ Service Worker & Installation | FAQ | Security +

+ +
+ {offlineFeatures.map((feature, index) => ( + +
+
+ +
+
+

+ {feature.title} +

+

+ {feature.description} +

+
+ ))} +
+
+ + {/* Installation Steps */} + +

+ PWA Installation in 3 Steps +

+ +
+ {installSteps.map((step, index) => ( + +
+ {step.step} +
+
+

+ {step.title} +

+

+ {step.description} +

+
+
+ ))} +
+
+ + {/* Platform Support */} + +

+ Platform Support +

+ +
+
+ +

+ Desktop Browser +

+

+ Chrome, Firefox, Safari, Edge - All modern browsers support PWA installation +

+
+ +
+ +

+ Mobile Devices +

+

+ iOS Safari, Android Chrome - Installation via "Add to Home Screen" +

+
+
+
+ + {/* FAQ Section */} + +

+ Offline FAQ +

+ +
+
+

+ How do I install PassMaster as a PWA? +

+

+ On supported browsers, an installation icon automatically appears in the address bar. + Alternatively, use the "Install App" button on this page. +

+
+ +
+

+ What offline features are available? +

+

+ All main functions: password generation, parameter customization, entropy calculation, + and copying to clipboard work completely offline. +

+
+ +
+

+ What is stored locally? +

+

+ Only app files (HTML, CSS, JavaScript) are stored in the browser cache. + No passwords or personal data are ever stored. +

+
+
+
+ + {/* JSON-LD for FAQ */} +