feat(auth): welcome/landing page + email-password login UI (5b)

Replace the old Google-only login card with a public landing page (Welcome.tsx):
hero + auth card (email+password Sign in / Create account / Forgot password,
Continue with Google, explicit Try-the-demo) over a feature pitch (6 pain->solution
cards) and demo-account screenshot slots (graceful placeholder until the images are
dropped into frontend/public/welcome/). Auth forms wire to the 5a endpoints; errors
show inline via a new req() quiet flag (no global modal for a wrong password).
Handles ?verify, ?reset (set-new-password form), ?access banners. EN/HU/DE.
Verified end-to-end on a fresh load: render, register->approve->password-login.
This commit is contained in:
npeter83 2026-06-19 15:15:58 +02:00
parent 40a3f5c005
commit 3fd5950f4c
7 changed files with 602 additions and 124 deletions

View file

@ -0,0 +1,73 @@
{
"hero": {
"title": "Deine YouTube-Abos, so wie ein Feed funktionieren sollte.",
"subtitle": "Siftlode sammelt jeden Upload der Kanäle, denen du folgst, in einem aufgeräumten, filterbaren Feed — kein Algorithmus entscheidet, was du siehst, und kein Shorts- oder Live-Lärm, außer du willst es.",
"trust": "Selbst gehostet und privat. Melde dich per E-Mail an oder fahre mit Google fort."
},
"preview": {
"feed": "Der Feed — filtern nach Kanal, Sprache, Thema, Länge und Datum.",
"channels": "Kanal-Verwaltung",
"playlists": "Wiedergabelisten"
},
"features": {
"heading": "Warum Siftlode",
"readable": {
"title": "Deine Abos, endlich lesbar",
"body": "Sortiere und filtere nach Kanal, Sprache, Thema, Länge oder Datum — und blende Kanäle aus, ohne sie zu deabonnieren. Du entscheidest, was erscheint, nicht ein Algorithmus."
},
"neverMiss": {
"title": "Verpasse keinen Upload",
"body": "Jedes Video jedes Kanals, dem du folgst, landet in einem Feed. Shorts und Livestreams sind standardmäßig ausgeblendet — so sind es nur die Videos, für die du gekommen bist."
},
"playlists": {
"title": "Playlists, die in beide Richtungen synchronisieren",
"body": "Erstelle Playlists lokal und halte sie mit YouTube synchron — Änderungen fließen in beide Richtungen."
},
"player": {
"title": "Schau in der App, mach da weiter, wo du aufgehört hast",
"body": "Ein In-App-Player setzt jedes Video dort fort, wo du gestoppt hast — kein Empfehlungs-Strudel, der dich ablenkt."
},
"channels": {
"title": "Eine echte Kanal-Verwaltung",
"body": "Priorisiere die Kanäle, die dir wichtig sind, tagge sie nach deiner Art und filtere den Feed nach deinen eigenen Tags."
},
"private": {
"title": "Selbst gehostet, privat, mehrsprachig",
"body": "Betreibe es selbst — deine Daten bleiben deine. Mehrbenutzerfähig, mit der Oberfläche auf Englisch, Ungarisch und Deutsch."
}
},
"auth": {
"signinTitle": "Anmelden",
"createTitle": "Konto erstellen",
"forgotTitle": "Passwort zurücksetzen",
"resetTitle": "Neues Passwort festlegen",
"email": "E-Mail",
"password": "Passwort",
"newPassword": "Neues Passwort (min. {{min}} Zeichen)",
"invalidEmail": "Gib eine gültige E-Mail-Adresse ein.",
"weakPassword": "Das Passwort muss mindestens {{min}} Zeichen lang sein.",
"genericError": "Etwas ist schiefgelaufen. Bitte versuche es erneut.",
"working": "Einen Moment…",
"signinButton": "Anmelden",
"createButton": "Konto erstellen",
"forgotButton": "Reset-Link senden",
"resetButton": "Passwort festlegen",
"createLink": "Konto erstellen",
"forgotLink": "Passwort vergessen?",
"backToSignin": "Zurück zur Anmeldung",
"or": "oder",
"google": "Mit Google fortfahren",
"tryDemo": "Demo ausprobieren",
"demoHint": "Gib eine E-Mail ein, die für das Demo-Konto freigeschaltet ist.",
"demoEmail": "Demo-E-Mail",
"demoEnter": "Eintreten",
"demoDenied": "Diese E-Mail ist nicht für die Demo freigeschaltet. Bitte den Admin, sie hinzuzufügen.",
"registerDone": "Fast geschafft — prüfe deine E-Mails auf den Bestätigungslink. Nach der Bestätigung gibt ein Admin dein Konto frei, bevor du dich anmelden kannst.",
"forgotDone": "Falls zu dieser E-Mail ein Konto gehört, haben wir einen Reset-Link gesendet. Prüfe dein Postfach.",
"resetDone": "Dein Passwort wurde festgelegt — du kannst dich jetzt anmelden.",
"verifyOk": "E-Mail bestätigt. Sobald ein Admin dein Konto freigibt, kannst du dich anmelden.",
"verifyInvalid": "Dieser Bestätigungslink ist ungültig oder abgelaufen.",
"accessRequested": "Danke — wir haben deine Anfrage erfasst. Ein Admin wird sie prüfen.",
"accessDenied": "Dieses Konto ist für diese Instanz noch nicht freigegeben — registriere dich unten oder bitte den Admin um Zugang."
}
}