feat: modernize landing page design, localize login/forgot password forms, and add public privacy/imprint pages
All checks were successful
Staging Build / build (push) Successful in 2m42s

This commit is contained in:
DanielS
2026-06-25 22:25:11 +02:00
parent 08382ff4a1
commit e93cf7805c
8 changed files with 525 additions and 114 deletions

View File

@@ -98,7 +98,7 @@ export function NavbarClient({ user, role = "partner" }: NavbarClientProps) {
<>
<header className="px-4 lg:px-6 h-16 flex items-center justify-between border-b border-white/5 backdrop-blur-md sticky top-0 z-50 bg-[#020617]/85">
<Link className="flex items-center justify-center gap-2 group" href="/">
<span className="font-bold text-xl tracking-tighter text-white">CASPOS Store</span>
<span className="font-bold text-xl tracking-tighter text-white">CASPOS Shop</span>
<DemoWrapper>
<span className="text-[10px] bg-amber-500/20 text-amber-400 px-2 py-0.5 rounded-full font-semibold uppercase tracking-wider border border-amber-500/30">
Demo

View File

@@ -33,7 +33,7 @@ export function ForgotPasswordForm({
await resetPassword(email);
setSuccess(true);
} catch (error: unknown) {
setError(error instanceof Error ? error.message : "An error occurred");
setError(error instanceof Error ? error.message : "Ein Fehler ist aufgetreten.");
} finally {
setIsLoading(false);
}
@@ -44,34 +44,34 @@ export function ForgotPasswordForm({
{success ? (
<Card>
<CardHeader>
<CardTitle className="text-2xl">Check Your Email</CardTitle>
<CardDescription>Password reset instructions sent</CardDescription>
<CardTitle className="text-2xl">E-Mails prüfen</CardTitle>
<CardDescription>Link zum Zurücksetzen gesendet</CardDescription>
</CardHeader>
<CardContent>
<p className="text-sm text-muted-foreground">
If you registered using your email and password, you will receive
a password reset email.
Wenn Sie sich mit E-Mail und Passwort registriert haben, erhalten Sie
in Kürze eine E-Mail zum Zurücksetzen Ihres Passworts.
</p>
</CardContent>
</Card>
) : (
<Card>
<CardHeader>
<CardTitle className="text-2xl">Reset Your Password</CardTitle>
<CardTitle className="text-2xl">Passwort zurücksetzen</CardTitle>
<CardDescription>
Type in your email and we&apos;ll send you a link to reset your
password
Geben Sie Ihre E-Mail-Adresse ein. Wir senden Ihnen einen Link,
um Ihr Passwort zurückzusetzen.
</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={handleForgotPassword}>
<div className="flex flex-col gap-6">
<div className="grid gap-2">
<Label htmlFor="email">Email</Label>
<Label htmlFor="email">E-Mail</Label>
<Input
id="email"
type="email"
placeholder="m@example.com"
placeholder="name@beispiel.de"
required
value={email}
onChange={(e) => setEmail(e.target.value)}
@@ -79,16 +79,16 @@ export function ForgotPasswordForm({
</div>
{error && <p className="text-sm text-red-500">{error}</p>}
<Button type="submit" className="w-full" disabled={isLoading}>
{isLoading ? "Sending..." : "Send reset email"}
{isLoading ? "Wird gesendet..." : "Link senden"}
</Button>
</div>
<div className="mt-4 text-center text-sm">
Already have an account?{" "}
Bereits ein Konto vorhanden?{" "}
<Link
href="/auth/login"
className="underline underline-offset-4"
>
Login
Anmelden
</Link>
</div>
</form>

View File

@@ -44,7 +44,7 @@ export function LoginForm({
try {
const res = await signIn(email, password);
if (!res.success) {
setError(res.error || "An error occurred");
setError(res.error || "Ein Fehler ist aufgetreten.");
return;
}
if (nextParam) {
@@ -55,7 +55,7 @@ export function LoginForm({
router.push("/my-customers");
}
} catch (error: unknown) {
setError(error instanceof Error ? error.message : "An error occurred");
setError(error instanceof Error ? error.message : "Ein Fehler ist aufgetreten.");
} finally {
setIsLoading(false);
}
@@ -65,20 +65,20 @@ export function LoginForm({
<div className={cn("flex flex-col gap-6", className)} {...props}>
<Card>
<CardHeader>
<CardTitle className="text-2xl">Login</CardTitle>
<CardTitle className="text-2xl">Anmelden</CardTitle>
<CardDescription>
Enter your email below to login to your account
Geben Sie Ihre E-Mail-Adresse und Ihr Passwort ein, um sich anzumelden.
</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={handleLogin}>
<div className="flex flex-col gap-6">
<div className="grid gap-2">
<Label htmlFor="email">Email</Label>
<Label htmlFor="email">E-Mail</Label>
<Input
id="email"
type="email"
placeholder="m@example.com"
placeholder="name@beispiel.de"
required
value={email}
onChange={(e) => setEmail(e.target.value)}
@@ -86,12 +86,12 @@ export function LoginForm({
</div>
<div className="grid gap-2">
<div className="flex items-center">
<Label htmlFor="password">Password</Label>
<Label htmlFor="password">Passwort</Label>
<Link
href="/auth/forgot-password"
className="ml-auto inline-block text-sm underline-offset-4 hover:underline"
>
Forgot your password?
Passwort vergessen?
</Link>
</div>
<Input
@@ -114,7 +114,7 @@ export function LoginForm({
)}
{error && <p className="text-sm text-red-500">{error}</p>}
<Button type="submit" className="w-full" disabled={isLoading}>
{isLoading ? "Logging in..." : "Login"}
{isLoading ? "Wird angemeldet..." : "Anmelden"}
</Button>
</div>
</form>

View File

@@ -964,7 +964,7 @@ export function OrderWizard({
)}
<p className="text-xs text-slate-500 italic">
Mit dem Klick auf Kostenpflichtig bestellen" akzeptieren Sie unsere AGB und die{' '}
<a href="https://caspos.de/datenschutz/" target="_blank" rel="noopener noreferrer" className="underline hover:text-slate-400">
<a href="/datenschutz" target="_blank" rel="noopener noreferrer" className="underline hover:text-slate-400">
Datenschutzerklärung
</a>.
</p>