feat: desktop image thumbnails, gallery lightbox portal, client-side compression, clickable table rows, fix header gap

This commit is contained in:
egecankomur
2026-05-12 04:49:36 +03:00
parent 3cce632eb3
commit 3554b39800
134 changed files with 7736 additions and 1913 deletions
@@ -21,7 +21,7 @@ export function ForbiddenError() {
<h2 className="mb-3 text-2xl font-semibold">Forbidden</h2>
<p>Access to this resource is forbidden. You don&apos;t have the necessary permissions to view this page.</p>
<div className='mt-6 flex items-center justify-center gap-4 md:mt-8'>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back Home</Button>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back House</Button>
<Button variant='outline' className='flex cursor-pointer items-center gap-1' onClick={() => router.push('#')}>
Contact Us
</Button>
@@ -21,7 +21,7 @@ export function InternalServerError() {
<h2 className="mb-3 text-2xl font-semibold">Internal Server Error</h2>
<p>Something went wrong on our end. We&apos;re working to fix the issue. Please try again later.</p>
<div className='mt-6 flex items-center justify-center gap-4 md:mt-8'>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back Home</Button>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back House</Button>
<Button variant='outline' className='flex cursor-pointer items-center gap-1' onClick={() => router.push('#')}>
Contact Us
</Button>
@@ -21,7 +21,7 @@ export function NotFoundError() {
<h2 className="mb-3 text-2xl font-semibold">Page Not Found</h2>
<p>The page you are looking for doesn&apos;t exist or has been moved to another location.</p>
<div className='mt-6 flex items-center justify-center gap-4 md:mt-8'>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back Home</Button>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back House</Button>
<Button variant='outline' className='flex cursor-pointer items-center gap-1' onClick={() => router.push('#')}>
Contact Us
</Button>
@@ -21,7 +21,7 @@ export function UnauthorizedError() {
<h2 className="mb-3 text-2xl font-semibold">Unauthorized</h2>
<p>You don&apos;t have permission to access this resource. Please sign in or contact your administrator.</p>
<div className='mt-6 flex items-center justify-center gap-4 md:mt-8'>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back Home</Button>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back House</Button>
<Button variant='outline' className='flex cursor-pointer items-center gap-1' onClick={() => router.push('#')}>
Contact Us
</Button>
@@ -21,7 +21,7 @@ export function UnderMaintenanceError() {
<h2 className="mb-3 text-2xl font-semibold">Under Maintenance</h2>
<p>The service is currently unavailable. Please try again later.</p>
<div className='mt-6 flex items-center justify-center gap-4 md:mt-8'>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back Home</Button>
<Button className='cursor-pointer' onClick={() => router.push('/dashboard')}>Go Back House</Button>
<Button variant='outline' className='flex cursor-pointer items-center gap-1' onClick={() => router.push('#')}>
Contact Us
</Button>
@@ -2,7 +2,7 @@
import Link from "next/link";
import { useActionState } from "react";
import { ArrowLeft, Loader2, MailCheck } from "lucide-react";
import { ArrowLeft, CircleNotch, EnvelopeOpen } from '@/lib/icons';
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
@@ -28,7 +28,7 @@ export function ForgotPasswordForm1({ className, ...props }: React.ComponentProp
{state.ok ? (
<div className="flex flex-col items-center gap-3 py-4 text-center">
<div className="bg-primary/10 text-primary flex size-12 items-center justify-center rounded-full">
<MailCheck className="size-6" />
<EnvelopeOpen className="size-6" />
</div>
<p className="text-sm">
Bağlantı emailinize gönderildi. Gelen kutusunu kontrol edin.
@@ -64,7 +64,7 @@ export function ForgotPasswordForm1({ className, ...props }: React.ComponentProp
<Button type="submit" className="w-full" disabled={isPending}>
{isPending ? (
<>
<Loader2 className="size-4 animate-spin" />
<CircleNotch className="size-4 animate-spin" />
Gönderiliyor...
</>
) : (
+1 -1
View File
@@ -11,7 +11,7 @@ export default function ForgotPasswordPage() {
<div className="bg-primary text-primary-foreground flex size-9 items-center justify-center rounded-md">
<Logo size={24} />
</div>
<span className="text-lg font-semibold">İşletmem</span>
<span className="text-lg font-semibold">Emlak CRM</span>
</Link>
<ForgotPasswordForm1 />
</div>
@@ -71,7 +71,7 @@ export function LoginForm3({
fill="currentColor"
/>
</svg>
<span className="sr-only">Login with Apple</span>
<span className="sr-only">Login with AppleLogo</span>
</Button>
<Button variant="outline" type="button" className="w-full cursor-pointer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
@@ -2,7 +2,7 @@
import Link from "next/link";
import { useActionState } from "react";
import { Loader2, Building2, Users, Presentation, Zap } from "lucide-react";
import { CircleNotch, Buildings, Users, Presentation, Lightning } from '@/lib/icons';
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
@@ -43,7 +43,7 @@ export function LoginForm1({
{/* Logo + Ürün adı */}
<div className="relative z-10 flex items-center gap-3">
<div className="flex size-10 items-center justify-center rounded-xl bg-blue-500/20 ring-1 ring-blue-400/30 backdrop-blur">
<Building2 className="size-5 text-blue-300" />
<Buildings className="size-5 text-blue-300" />
</div>
<div>
<p className="text-lg font-bold tracking-tight leading-none">Emlak CRM</p>
@@ -65,12 +65,12 @@ export function LoginForm1({
<ul className="space-y-4">
{[
{
icon: Building2,
icon: Buildings,
title: "Portföy yönetimi",
desc: "Tüm ilanlarınızı fotoğraflarıyla ekleyin, takip edin",
},
{
icon: Zap,
icon: Lightning,
title: "Akıllı eşleşme",
desc: "Ağırlıklı puanlama ile müşteri × ilan eşleştirmesi",
},
@@ -111,7 +111,7 @@ export function LoginForm1({
{/* Mobilde logo */}
<div className="flex items-center gap-2 lg:hidden">
<div className="flex size-8 items-center justify-center rounded-lg bg-blue-600 text-white">
<Building2 className="size-4" />
<Buildings className="size-4" />
</div>
<span className="font-bold">Emlak CRM</span>
</div>
@@ -172,7 +172,7 @@ export function LoginForm1({
<Button type="submit" className="w-full" disabled={isPending}>
{isPending ? (
<>
<Loader2 className="size-4 animate-spin" />
<CircleNotch className="size-4 animate-spin" />
Giriş yapılıyor...
</>
) : (
@@ -98,7 +98,7 @@ export function SignupForm3({
fill="currentColor"
/>
</svg>
<span className="sr-only">Sign up with Apple</span>
<span className="sr-only">Sign up with AppleLogo</span>
</Button>
<Button variant="outline" type="button" className="w-full cursor-pointer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
@@ -2,7 +2,7 @@
import Link from "next/link";
import { useActionState } from "react";
import { Loader2 } from "lucide-react";
import { CircleNotch } from '@/lib/icons';
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
@@ -35,7 +35,7 @@ export function SignupForm1({
<div className="bg-primary text-primary-foreground flex size-9 items-center justify-center rounded-md">
<Logo size={22} />
</div>
<span className="text-xl font-semibold">İşletmem</span>
<span className="text-xl font-semibold">Emlak CRM</span>
</Link>
</div>
@@ -98,7 +98,7 @@ export function SignupForm1({
<Button type="submit" className="w-full" disabled={isPending}>
{isPending ? (
<>
<Loader2 className="size-4 animate-spin" />
<CircleNotch className="size-4 animate-spin" />
Hesap oluşturuluyor...
</>
) : (
@@ -159,22 +159,22 @@ function BrandPanel() {
<div className="bg-primary-foreground/15 ring-1 ring-primary-foreground/20 backdrop-blur flex size-10 items-center justify-center rounded-md">
<Logo size={22} />
</div>
<span className="text-lg font-medium">İşletmem</span>
<span className="text-lg font-medium">Emlak CRM</span>
</div>
<div className="relative z-10 flex flex-col gap-3">
<h2 className="text-3xl font-semibold leading-tight">
İşletmenizi büyütecek tek araç.
Emlak ofisinizi büyütecek tek araç.
</h2>
<p className="text-primary-foreground/80 text-sm">
Hesap oluşturduktan sonra çalışma alanınızı kuruyor, ekibinizi davet ediyor ve hemen kullanmaya başlıyorsunuz.
</p>
<ul className="text-primary-foreground/85 mt-2 space-y-1 text-sm">
<li> Müşteri & hizmet yönetimi</li>
<li> Görev ve takvim</li>
<li> Finans ve fatura</li>
<li> Portföy ve müşteri yönetimi</li>
<li> Otomatik ilan-müşteri eşleştirme</li>
<li> Komisyon ve finans takibi</li>
</ul>
<div className="text-primary-foreground/70 mt-4 text-xs">KovakSoft tarafından</div>
<div className="text-primary-foreground/70 mt-4 text-xs">Kovak Yazılım ve Medya LTD. Ş.</div>
</div>
</div>
);