feat: implement authentication login and registration pages with custom dark theme and icon support

This commit is contained in:
Poyraz Avsever
2026-05-07 11:33:31 +03:00
parent a132443c93
commit a958d6cbb8
6 changed files with 240 additions and 67 deletions
+24 -13
View File
@@ -4,22 +4,23 @@
@layer base {
:root, .dark {
--background: #676278;
--background-dark: #605C71;
/* Deeper premium dark mode background */
--background: #120D1C;
--background-dark: #0A0710;
--foreground: #FBF9FE;
--card: #2B2538;
--card: #1F172B;
--card-foreground: #FBF9FE;
--popover: #2B2538;
--popover: #1F172B;
--popover-foreground: #FBF9FE;
--primary: #6C5BB0;
--primary-foreground: #FBF9FE;
--primary-foreground: #FFFFFF;
--primary-hover: #594D9F;
--primary-pressed: #493D90;
--secondary: #1F172B;
--secondary: #2B2538;
--secondary-foreground: #C0B8D6;
--muted: #3B3448;
@@ -31,14 +32,14 @@
--destructive: #d8644a;
--destructive-foreground: #FBF9FE;
--border: #473F55;
--input: #473F55;
--input-bg: #150E21;
--overlay: #150E21;
--border: #3B3448;
--input: #3B3448;
--input-bg: #1A1325;
--overlay: #000000;
--ring: #594D9F;
--ring: #6C5BB0;
--radius: 0.625rem;
--radius: 0.75rem;
}
}
@@ -48,8 +49,18 @@
}
body {
@apply text-foreground;
background: linear-gradient(to bottom right, var(--background), var(--background-dark));
background: linear-gradient(135deg, var(--background), var(--background-dark));
background-attachment: fixed;
min-height: 100vh;
}
/* Fix for Chrome autofill turning inputs yellow/olive */
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
-webkit-box-shadow: 0 0 0 30px var(--input-bg) inset !important;
-webkit-text-fill-color: var(--foreground) !important;
transition: background-color 5000s ease-in-out 0s;
}
}
+105 -28
View File
@@ -2,9 +2,10 @@ import { login } from './actions'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'
import Link from 'next/link'
import { ErrorToaster } from '@/components/error-toaster'
import Image from 'next/image'
import { Icon } from '@/components/ui/icon'
export default async function LoginPage({
searchParams,
@@ -16,41 +17,117 @@ export default async function LoginPage({
const message = resolvedParams?.message;
return (
<div className="flex items-center justify-center min-h-screen bg-background p-4">
<div className="flex min-h-screen bg-background">
{error && message && <ErrorToaster message={String(message)} />}
<Card className="w-full max-w-md">
<CardHeader className="space-y-1">
<CardTitle className="text-2xl font-bold text-center">MindSpace</CardTitle>
<CardDescription className="text-center">
Hesabınıza giriş yapın
</CardDescription>
</CardHeader>
<CardContent>
<form>
{/* Sol Taraf - Resim Alanı */}
<div className="hidden lg:flex lg:w-1/2 p-4 relative">
<div className="relative w-full h-full overflow-hidden rounded-2xl">
<Image
src="/images/1830857_Image.png"
alt="MindSpace Background"
fill
className="object-cover"
priority
/>
<div className="absolute inset-0 bg-gradient-to-t from-background via-transparent to-background/30 opacity-90" />
{/* Logo */}
<div className="absolute bottom-0 flex items-center justify-center pointer-events-none z-10">
<div className="relative drop-shadow-2xl flex items-center gap-4">
<img
src="/logo/logo.png"
alt="MindSpace Logo"
className="object-contain w-64 h-auto"
/>
</div>
</div>
</div>
</div>
{/* Sağ Taraf - Form Alanı */}
<div className="flex flex-1 items-center justify-center p-8 w-full lg:w-1/2">
<div className="w-full max-w-sm space-y-8">
<div className="text-center lg:text-left">
<h1 className="text-3xl font-bold tracking-tight text-foreground">
Tekrar Hoş Geldiniz
</h1>
<p className="text-sm text-muted-foreground mt-2">
Kişisel alanınıza ulaşmak için giriş yapın
</p>
</div>
<form className="space-y-6">
<div className="space-y-4">
<div className="space-y-2">
<Label htmlFor="email">E-posta</Label>
<Input id="email" name="email" type="email" placeholder="ornek@mail.com" required />
<Input
id="email"
name="email"
type="email"
placeholder="ornek@mail.com"
required
className="h-11 bg-input-bg border-border"
/>
</div>
<div className="space-y-2">
<Label htmlFor="password">Şifre</Label>
<Input id="password" name="password" type="password" required />
</div>
</div>
<div className="flex flex-col space-y-4 mt-6">
<Button formAction={login} className="w-full">
Giriş Yap
</Button>
<div className="text-center text-sm">
Hesabınız yok mu?{' '}
<Link href="/register" className="text-primary hover:underline">
Kayıt Ol
</Link>
<div className="flex items-center justify-between">
<Label htmlFor="password">Şifre</Label>
<Link
href="/forgot-password"
className="text-sm font-medium text-primary hover:text-primary-hover transition-colors"
>
Şifremi unuttum
</Link>
</div>
<Input
id="password"
name="password"
type="password"
required
className="h-11 bg-input-bg border-border"
/>
</div>
</div>
<Button
formAction={login}
className="w-full h-11 text-base font-medium shadow-md transition-transform active:scale-[0.98] bg-primary hover:bg-primary-hover text-primary-foreground"
>
Giriş Yap
</Button>
</form>
</CardContent>
</Card>
<div className="relative">
<div className="absolute inset-0 flex items-center">
<span className="w-full border-t border-border" />
</div>
<div className="relative flex justify-center text-xs uppercase">
<span className="bg-background px-2 text-muted-foreground">
veya
</span>
</div>
</div>
<Button
type="button"
variant="outline"
className="w-full h-11 text-base font-medium bg-card border-border hover:bg-secondary transition-colors"
>
<Icon icon="flat-color-icons:google" className="w-5 h-5 mr-2" />
Google ile Devam Et
</Button>
<div className="text-center text-sm mt-6">
Hesabınız yok mu?{" "}
<Link
href="/register"
className="font-medium text-primary hover:text-primary-hover transition-colors"
>
Kayıt Ol
</Link>
</div>
</div>
</div>
</div>
)
);
}
+85 -26
View File
@@ -2,9 +2,10 @@ import { signup } from '@/app/login/actions'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'
import Link from 'next/link'
import { ErrorToaster } from '@/components/error-toaster'
import Image from 'next/image'
import { Icon } from '@/components/ui/icon'
export default async function RegisterPage({
searchParams,
@@ -16,41 +17,99 @@ export default async function RegisterPage({
const message = resolvedParams?.message;
return (
<div className="flex items-center justify-center min-h-screen bg-background p-4">
<div className="flex min-h-screen bg-background">
{error && message && <ErrorToaster message={String(message)} />}
<Card className="w-full max-w-md">
<CardHeader className="space-y-1">
<CardTitle className="text-2xl font-bold text-center">MindSpace</CardTitle>
<CardDescription className="text-center">
Yeni bir hesap oluşturun
</CardDescription>
</CardHeader>
<CardContent>
<form>
{/* Sol Taraf - Resim Alanı */}
<div className="hidden lg:flex lg:w-1/2 p-4 relative">
<div className="relative w-full h-full overflow-hidden rounded-2xl bg-black">
<Image
src="/images/1830857_Image.png"
alt="MindSpace Background"
fill
className="object-cover opacity-60"
priority
/>
<div className="absolute inset-0 bg-gradient-to-t from-background via-transparent to-background/30 opacity-90" />
{/* Logo */}
<div className="absolute inset-0 flex items-center justify-center pointer-events-none z-10">
<div className="relative w-64 h-64 drop-shadow-2xl">
<Image
src="/logo/logo.png"
alt="MindSpace Logo"
fill
className="object-contain"
priority
/>
</div>
</div>
</div>
</div>
{/* Sağ Taraf - Form Alanı */}
<div className="flex flex-1 items-center justify-center p-8 w-full lg:w-1/2">
<div className="w-full max-w-sm space-y-8">
<div className="text-center lg:text-left">
<h1 className="text-3xl font-bold tracking-tight text-foreground">Aramıza Katılın</h1>
<p className="text-sm text-muted-foreground mt-2">
Kişisel yaşam alanınızı oluşturmak için kayıt olun
</p>
</div>
<form className="space-y-6">
<div className="space-y-4">
<div className="space-y-2">
<Label htmlFor="email">E-posta</Label>
<Input id="email" name="email" type="email" placeholder="ornek@mail.com" required />
<Input
id="email"
name="email"
type="email"
placeholder="ornek@mail.com"
required
className="h-11 bg-input-bg border-border"
/>
</div>
<div className="space-y-2">
<Label htmlFor="password">Şifre</Label>
<Input id="password" name="password" type="password" required />
</div>
</div>
<div className="flex flex-col space-y-4 mt-6">
<Button formAction={signup} className="w-full">
Kayıt Ol
</Button>
<div className="text-center text-sm">
Zaten hesabınız var mı?{' '}
<Link href="/login" className="text-primary hover:underline">
Giriş Yap
</Link>
<Input
id="password"
name="password"
type="password"
required
className="h-11 bg-input-bg border-border"
/>
</div>
</div>
<Button formAction={signup} className="w-full h-11 text-base font-medium shadow-md transition-transform active:scale-[0.98] bg-primary hover:bg-primary-hover text-primary-foreground">
Kayıt Ol
</Button>
</form>
</CardContent>
</Card>
<div className="relative">
<div className="absolute inset-0 flex items-center">
<span className="w-full border-t border-border" />
</div>
<div className="relative flex justify-center text-xs uppercase">
<span className="bg-background px-2 text-muted-foreground">
veya
</span>
</div>
</div>
<Button type="button" variant="outline" className="w-full h-11 text-base font-medium bg-card border-border hover:bg-secondary transition-colors">
<Icon icon="flat-color-icons:google" className="w-5 h-5 mr-2" />
Google ile Devam Et
</Button>
<div className="text-center text-sm mt-6">
Zaten hesabınız var mı?{' '}
<Link href="/login" className="font-medium text-primary hover:text-primary-hover transition-colors">
Giriş Yap
</Link>
</div>
</div>
</div>
</div>
)
}