diff --git a/public/site.webmanifest b/public/site.webmanifest
new file mode 100644
index 0000000..db2aa24
--- /dev/null
+++ b/public/site.webmanifest
@@ -0,0 +1,30 @@
+{
+ "name": "Öğretmen Platformu", "short_name": "Öğretmen", "description": "Kişiselleştirilmiş online eğitim platformu", "start_url": "/", "scope": "/", "display": "standalone", "background_color": "#ffffff", "theme_color": "#000000", "orientation": "portrait-primary", "icons": [
+ {
+ "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "any"
+ },
+ {
+ "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "any"
+ },
+ {
+ "src": "/android-chrome-192x192-maskable.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable"
+ },
+ {
+ "src": "/android-chrome-512x512-maskable.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable"
+ }
+ ],
+ "screenshots": [
+ {
+ "src": "/screenshot-1.png", "sizes": "540x720", "type": "image/png", "form_factor": "narrow"
+ },
+ {
+ "src": "/screenshot-2.png", "sizes": "1280x720", "type": "image/png", "form_factor": "wide"
+ }
+ ],
+ "categories": ["education", "productivity"],
+ "screenshots": [
+ {
+ "src": "/screenshot-1.png", "sizes": "540x720", "type": "image/png"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts
new file mode 100644
index 0000000..d7e9291
--- /dev/null
+++ b/src/app/api/auth/login/route.ts
@@ -0,0 +1,95 @@
+import { NextRequest, NextResponse } from "next/server";
+
+interface LoginRequest {
+ email: string;
+ password: string;
+ rememberMe: boolean;
+}
+
+// Mock user storage for demonstration
+const mockUsers: {
+ [key: string]: {
+ id: string;
+ firstName: string;
+ lastName: string;
+ email: string;
+ password: string;
+ userType: "student" | "teacher";
+ };
+} = {
+ "demo@example.com": {
+ id: "user_1", firstName: "Demo", lastName: "User", email: "demo@example.com", password: "DemoPassword123", // Demo password
+ userType: "student"},
+ "teacher@example.com": {
+ id: "user_2", firstName: "Demo", lastName: "Teacher", email: "teacher@example.com", password: "TeacherPassword123", userType: "teacher"},
+};
+
+export async function POST(request: NextRequest) {
+ try {
+ const body: LoginRequest = await request.json();
+
+ // Validate input
+ if (!body.email || !body.password) {
+ return NextResponse.json(
+ { message: "E-posta ve şifre gereklidir" },
+ { status: 400 }
+ );
+ }
+
+ // Find user
+ const user = mockUsers[body.email];
+
+ if (!user) {
+ return NextResponse.json(
+ { message: "E-posta veya şifre hatalı" },
+ { status: 401 }
+ );
+ }
+
+ // In production, use bcrypt.compare()
+ // const passwordMatch = await bcrypt.compare(body.password, user.password);
+
+ if (user.password !== body.password) {
+ return NextResponse.json(
+ { message: "E-posta veya şifre hatalı" },
+ { status: 401 }
+ );
+ }
+
+ // Create response with user data
+ const response = NextResponse.json(
+ {
+ message: "Giriş başarıyla gerçekleştirildi", user: {
+ id: user.id,
+ firstName: user.firstName,
+ lastName: user.lastName,
+ email: user.email,
+ userType: user.userType,
+ },
+ },
+ { status: 200 }
+ );
+
+ // In production, set secure HTTP-only cookies
+ if (body.rememberMe) {
+ // Set longer expiration for "remember me"
+ response.cookies.set("authToken", `token_${user.id}`, {
+ maxAge: 30 * 24 * 60 * 60, // 30 days
+ httpOnly: true,
+ secure: process.env.NODE_ENV === "production", sameSite: "lax"});
+ } else {
+ response.cookies.set("authToken", `token_${user.id}`, {
+ maxAge: 24 * 60 * 60, // 24 hours
+ httpOnly: true,
+ secure: process.env.NODE_ENV === "production", sameSite: "lax"});
+ }
+
+ return response;
+ } catch (error) {
+ console.error("Login error:", error);
+ return NextResponse.json(
+ { message: "Sunucu hatası oluştu" },
+ { status: 500 }
+ );
+ }
+}
diff --git a/src/app/api/auth/register/route.ts b/src/app/api/auth/register/route.ts
new file mode 100644
index 0000000..5699469
--- /dev/null
+++ b/src/app/api/auth/register/route.ts
@@ -0,0 +1,84 @@
+import { NextRequest, NextResponse } from "next/server";
+
+interface RegisterRequest {
+ firstName: string;
+ lastName: string;
+ email: string;
+ password: string;
+ userType: "student" | "teacher";
+}
+
+// This is a mock implementation. In production, you would:
+// 1. Hash the password using bcrypt or similar
+// 2. Store the user in a database
+// 3. Send verification email
+// 4. Create JWT tokens
+
+const mockUsers: { [key: string]: RegisterRequest & { id: string } } = {};
+
+export async function POST(request: NextRequest) {
+ try {
+ const body: RegisterRequest = await request.json();
+
+ // Validate input
+ if (
+ !body.firstName ||
+ !body.lastName ||
+ !body.email ||
+ !body.password ||
+ !body.userType
+ ) {
+ return NextResponse.json(
+ { message: "Tüm alanlar zorunludur" },
+ { status: 400 }
+ );
+ }
+
+ // Check if user already exists
+ if (mockUsers[body.email]) {
+ return NextResponse.json(
+ { message: "Bu e-posta adresi zaten kullanımda" },
+ { status: 409 }
+ );
+ }
+
+ // In production, hash the password
+ // const hashedPassword = await bcrypt.hash(body.password, 10);
+
+ // Create new user
+ const newUser = {
+ id: `user_${Date.now()}`,
+ firstName: body.firstName,
+ lastName: body.lastName,
+ email: body.email,
+ password: body.password, // Never store plaintext in production!
+ userType: body.userType,
+ };
+
+ mockUsers[body.email] = newUser;
+
+ // In production, you would:
+ // 1. Create a JWT token
+ // 2. Set secure HTTP-only cookie
+ // 3. Send verification email
+
+ return NextResponse.json(
+ {
+ message: "Kayıt başarıyla tamamlandı", user: {
+ id: newUser.id,
+ firstName: newUser.firstName,
+ lastName: newUser.lastName,
+ email: newUser.email,
+ userType: newUser.userType,
+ },
+ },
+ { status: 201 }
+ );
+ } catch (error) {
+ console.error("Registration error:", error);
+ return NextResponse.json(
+ { message: "Sunucu hatası oluştu" },
+ { status: 500 }
+ );
+ }
+}
diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx
new file mode 100644
index 0000000..dbab3ba
--- /dev/null
+++ b/src/app/contact/page.tsx
@@ -0,0 +1,164 @@
+"use client";
+
+import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
+import NavbarStyleFullscreen from "@/components/navbar/NavbarStyleFullscreen/NavbarStyleFullscreen";
+import FooterLogoReveal from "@/components/sections/footer/FooterLogoReveal";
+import { Mail, Phone, MapPin, Send } from "lucide-react";
+import { useState } from "react";
+
+export default function ContactPage() {
+ const [formData, setFormData] = useState({
+ name: "", email: "", subject: "", message: ""});
+ const [submitted, setSubmitted] = useState(false);
+
+ const navItems = [
+ { name: "Ana Sayfa", id: "/" },
+ { name: "Öğretmenler", id: "/teachers" },
+ { name: "Etkinlikler", id: "events" },
+ { name: "Çalışma Programı", id: "schedule" },
+ ];
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault();
+ // Simulate form submission
+ setSubmitted(true);
+ setTimeout(() => {
+ setFormData({ name: "", email: "", subject: "", message: "" });
+ setSubmitted(false);
+ }, 2000);
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
Bize Ulaşın
+
+ Sorularınız mı var? Bize mesaj gönderin, en kısa sürede sizinle iletişime geçeceğiz.
+
+
+
+
+ {/* Contact Info Cards */}
+ {[
+ { icon: Mail, label: "Email", value: "info@platform.com" },
+ { icon: Phone, label: "Telefon", value: "+90 (212) 555-0123" },
+ { icon: MapPin, label: "Adres", value: "İstanbul, Türkiye" },
+ ].map((item, idx) => {
+ const IconComponent = item.icon;
+ return (
+
+
+
{item.label}
+
{item.value}
+
+ );
+ })}
+
+
+ {/* Contact Form */}
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx
new file mode 100644
index 0000000..4a1662f
--- /dev/null
+++ b/src/app/dashboard/page.tsx
@@ -0,0 +1,171 @@
+"use client";
+
+import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
+import NavbarStyleFullscreen from "@/components/navbar/NavbarStyleFullscreen/NavbarStyleFullscreen";
+import MetricCardTen from "@/components/sections/metrics/MetricCardTen";
+import BlogCardTwo from "@/components/sections/blog/BlogCardTwo";
+import TimelineHorizontalCardStack from "@/components/cardStack/layouts/timelines/TimelineHorizontalCardStack";
+import TeamCardTen from "@/components/sections/team/TeamCardTen";
+import FooterLogoReveal from "@/components/sections/footer/FooterLogoReveal";
+import { Target, Calendar, Users, TrendingUp } from "lucide-react";
+
+export default function DashboardPage() {
+ const navItems = [
+ { name: "Ana Sayfa", id: "/" },
+ { name: "Öğretmenler", id: "/teachers" },
+ { name: "Etkinlikler", id: "events" },
+ { name: "Çalışma Programı", id: "schedule" },
+ { name: "Öğrenci Paneli", id: "/dashboard" },
+ ];
+
+ const targetMetrics = [
+ {
+ id: "math", title: "Matematik Hedefim", subtitle: "İleri Cebir · Hedef: %85 Başarı", category: "Matematik", value: "72%"},
+ {
+ id: "english", title: "İngilizce Konuşma", subtitle: "Sertifikasyon · Hedef: İleri Seviye", category: "İngilizce", value: "Orta"},
+ {
+ id: "science", title: "Fen Bilimleri Paketi", subtitle: "Kimya & Fizik · Hedef: %90 Başarı", category: "Bilim", value: "68%"},
+ ];
+
+ const upcomingLessons = [
+ {
+ id: "1", imageSrc: "http://img.b2bpic.net/free-photo/happy-office-colleagues-watching-project-presentation-together_74855-10013.jpg", videoAlt: "Matematik dersi", category: ["Matematik"],
+ title: "İleri Cebir Dersi", excerpt: "Polinomlar ve denklemler konusunda derinlemesine çalışma. Zor problemleri çözmek için pratik yapalım.", imageSrc: "http://img.b2bpic.net/free-photo/happy-office-colleagues-watching-project-presentation-together_74855-10013.jpg", imageAlt: "Matematik Dersi", authorName: "Dr. Ahmet Matematik", authorAvatar: "http://img.b2bpic.net/free-photo/portrait-businessman-office-3_1262-1489.jpg", date: "Yarın 14:00"},
+ {
+ id: "2", category: ["İngilizce"],
+ title: "İngilizce Konuşma Pratiği", excerpt: "Günlük hayat senaryolarında İngilizce konuşma becerilerini geliştirmek. İfade ve aksanda odaklanacağız.", imageSrc: "http://img.b2bpic.net/free-vector/language-concept-background_23-2147872796.jpg", imageAlt: "İngilizce Dersi", authorName: "Miss Sarah English", authorAvatar: "http://img.b2bpic.net/free-photo/young-female-glasses-workplace_1301-980.jpg", date: "27 Ocak 15:30"},
+ {
+ id: "3", category: ["Kimya"],
+ title: "Kimya Deneyimleri Lab", excerpt: "Sanal laboratuvarda pratik deneyimler. Kimyasal reaksiyonları gözlemleyin ve analiz edin.", imageSrc: "http://img.b2bpic.net/free-photo/close-up-laboratory-test-tubes_23-2148891898.jpg", imageAlt: "Kimya Dersi", authorName: "Prof. Zeynep Kimya", authorAvatar: "http://img.b2bpic.net/free-photo/woman-posing-with-books_23-2148680219.jpg", date: "29 Ocak 16:00"},
+ ];
+
+ const recommendedTeachers = [
+ {
+ id: "1", name: "Dr. Ahmet Yıldız", imageSrc: "http://img.b2bpic.net/free-photo/portrait-businessman-office-3_1262-1489.jpg", imageAlt: "Dr. Ahmet Yıldız"},
+ {
+ id: "2", name: "Ayşe Şahin", imageSrc: "http://img.b2bpic.net/free-photo/young-female-glasses-workplace_1301-980.jpg", imageAlt: "Ayşe Şahin"},
+ {
+ id: "3", name: "Prof. Mehmet Kara", imageSrc: "http://img.b2bpic.net/free-photo/young-man-wearing-blue-outfit-looking-satisfied_1298-169.jpg", imageAlt: "Prof. Mehmet Kara"},
+ {
+ id: "4", name: "Dr. Zeynep Demir", imageSrc: "http://img.b2bpic.net/free-photo/woman-posing-with-books_23-2148680219.jpg", imageAlt: "Dr. Zeynep Demir"},
+ ];
+
+ const weeklyProgress = [
+ {
+ id: "mon", imageSrc: "http://img.b2bpic.net/free-photo/happy-office-colleagues-watching-project-presentation-together_74855-10013.jpg", imageAlt: "Pazartesi dersleri"},
+ {
+ id: "tue", imageSrc: "http://img.b2bpic.net/free-photo/front-view-older-business-woman-with-glasses-writing-agenda-looking-laptop_23-2148661168.jpg", imageAlt: "Salı dersleri"},
+ {
+ id: "wed", imageSrc: "http://img.b2bpic.net/free-photo/friends-learning-study-group_23-2149257210.jpg", imageAlt: "Çarşamba dersleri"},
+ {
+ id: "thu", imageSrc: "http://img.b2bpic.net/free-photo/crop-men-discussing-graph-tablet_23-2147785037.jpg", imageAlt: "Perşembe dersleri"},
+ ];
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Pazartesi
+
Matematik: 2 saat çalışma
+
Başarı: %85
+
+
+
Salı
+
İngilizce: 1.5 saat konuşma
+
Başarı: %78
+
+
+
Çarşamba
+
Kimya: 2 saat lab çalışması
+
Başarı: %90
+
+
+
Perşembe
+
Tarih: 1 saat tartışma
+
Başarı: %82
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 6f12575..fbfe7fb 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,58 +1,71 @@
import type { Metadata } from "next";
-import { Halant } from "next/font/google";
import { Inter } from "next/font/google";
-import { Open_Sans } from "next/font/google";
import "./globals.css";
-import { ServiceWrapper } from "@/components/ServiceWrapper";
-import Tag from "@/tag/Tag";
-
-const halant = Halant({
- variable: "--font-halant",
- subsets: ["latin"],
- weight: ["300", "400", "500", "600", "700"],
-});
+import { ReactLenis } from "lenis/react";
const inter = Inter({
- variable: "--font-inter",
- subsets: ["latin"],
-});
-
-const openSans = Open_Sans({
- variable: "--font-open-sans",
- subsets: ["latin"],
+ variable: "--font-inter", subsets: ["latin"],
+ weight: ["100", "200", "300", "400", "500", "600", "700", "800", "900"],
});
export const metadata: Metadata = {
- title: "Çevrimiçi Öğretmen Platformu - Uzman Eğitim",
- description: "50+ deneyimli öğretmenle bağlantı kurun. Kişiselleştirilmiş eğitim, esnek zaman planlaması ve 4.9/5 memnuniyet oranı.",
- keywords: "çevrimiçi öğretmen, ders platformu, eğitim, uzak eğitim, dersler",
+ title: "Öğretmen Platformu - Kişiselleştirilmiş Online Eğitim", description: "50+ deneyimli öğretmenle bağlantı kurun ve kişiselleştirilmiş eğitim alın. Esnek zaman planlaması ve etkili öğrenme deneyimi.", keywords: "online eğitim, öğretmen, tutor, kişiselleştirilmiş öğrenme, ders, eğitim platformu", authors: [{ name: "Öğretmen Platformu" }],
openGraph: {
- title: "Çevrimiçi Öğretmen Platformu",
- description: "50+ deneyimli öğretmenle bağlantı kurun ve etkili eğitim alın",
- siteName: "Öğretmen Platformu",
- type: "website",
+ type: "website", locale: "tr_TR", url: "https://ogretmen-platformu.com", title: "Öğretmen Platformu - Kişiselleştirilmiş Online Eğitim", description: "50+ deneyimli öğretmenle bağlantı kurun ve kişiselleştirilmiş eğitim alın.", siteName: "Öğretmen Platformu", images: [
+ {
+ url: "https://ogretmen-platformu.com/og-image.jpg", width: 1200,
+ height: 630,
+ alt: "Öğretmen Platformu"},
+ ],
},
twitter: {
- card: "summary_large_image",
- title: "Çevrimiçi Öğretmen Platformu",
- description: "Uzman öğretmenlerle dersler için kaydolun",
+ card: "summary_large_image", title: "Öğretmen Platformu", description: "Kişiselleştirilmiş online eğitim platformu", images: ["https://ogretmen-platformu.com/twitter-image.jpg"],
},
+ icons: {
+ icon: [
+ { url: "/favicon.ico", sizes: "any" },
+ { url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" },
+ { url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" },
+ ],
+ apple: [
+ { url: "/apple-touch-icon.png", sizes: "180x180", type: "image/png" },
+ ],
+ },
+ manifest: "/site.webmanifest", viewport: "width=device-width, initial-scale=1, maximum-scale=5", appleWebApp: {
+ capable: true,
+ statusBarStyle: "black-translucent", title: "Öğretmen Platformu"},
};
export default function RootLayout({
children,
-}: Readonly<{
+}: {
children: React.ReactNode;
-}>) {
+}) {
return (
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
{children}
-
+
+
+
-
);
+}
+
+function CookieConsentBanner() {
+ return (
+
+
+
+ Deneyiminizi iyileştirmek için çerezleri kullanıyoruz. Site kullanımına devam ederek, çerez politikamızı kabul etmiş olursunuz.
+
+
+
+
+
+
+
+
+ );
}
\ No newline at end of file
diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx
new file mode 100644
index 0000000..0d83862
--- /dev/null
+++ b/src/app/login/page.tsx
@@ -0,0 +1,257 @@
+"use client";
+
+import { useState } from "react";
+import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
+import NavbarStyleFullscreen from "@/components/navbar/NavbarStyleFullscreen/NavbarStyleFullscreen";
+import FooterLogoReveal from "@/components/sections/footer/FooterLogoReveal";
+import { Eye, EyeOff, AlertCircle, CheckCircle } from "lucide-react";
+
+interface LoginFormData {
+ email: string;
+ password: string;
+}
+
+interface LoginErrors {
+ email?: string;
+ password?: string;
+}
+
+export default function LoginPage() {
+ const navItems = [
+ { name: "Ana Sayfa", id: "/" },
+ { name: "Öğretmenler", id: "/teachers" },
+ { name: "Etkinlikler", id: "events" },
+ { name: "Çalışma Programı", id: "schedule" },
+ ];
+
+ const [formData, setFormData] = useState({
+ email: "", password: ""});
+
+ const [errors, setErrors] = useState({});
+ const [showPassword, setShowPassword] = useState(false);
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [submitSuccess, setSubmitSuccess] = useState(false);
+ const [rememberMe, setRememberMe] = useState(false);
+
+ const validateForm = (): boolean => {
+ const newErrors: LoginErrors = {};
+
+ if (!formData.email.trim()) {
+ newErrors.email = "E-posta gereklidir";
+ } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) {
+ newErrors.email = "Geçerli bir e-posta adresi girin";
+ }
+
+ if (!formData.password) {
+ newErrors.password = "Şifre gereklidir";
+ }
+
+ setErrors(newErrors);
+ return Object.keys(newErrors).length === 0;
+ };
+
+ const handleChange = (
+ e: React.ChangeEvent
+ ) => {
+ const { name, value } = e.target;
+ setFormData((prev) => ({
+ ...prev,
+ [name]: value,
+ }));
+ if (errors[name as keyof LoginErrors]) {
+ setErrors((prev) => ({
+ ...prev,
+ [name]: undefined,
+ }));
+ }
+ };
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ if (!validateForm()) {
+ return;
+ }
+
+ setIsSubmitting(true);
+
+ try {
+ const response = await fetch("/api/auth/login", {
+ method: "POST", headers: {
+ "Content-Type": "application/json"},
+ body: JSON.stringify({
+ email: formData.email,
+ password: formData.password,
+ rememberMe: rememberMe,
+ }),
+ });
+
+ if (response.ok) {
+ setSubmitSuccess(true);
+ setFormData({
+ email: "", password: ""});
+ setTimeout(() => {
+ window.location.href = "/dashboard";
+ }, 1500);
+ } else {
+ const data = await response.json();
+ setErrors({ email: data.message || "Giriş başarısız oldu" });
+ }
+ } catch (error) {
+ setErrors({ email: "Bir hata oluştu. Lütfen tekrar deneyin." });
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
Giriş Yap
+
Hesabınıza giriş yaparak öğrenmeye başlayın
+
+
+ {submitSuccess && (
+
+
+
+
Başarılı!
+
+ Giriş başarıyla gerçekleştirildi. Yönlendiriliyorsunuz...
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
new file mode 100644
index 0000000..7d6fb33
--- /dev/null
+++ b/src/app/not-found.tsx
@@ -0,0 +1,84 @@
+"use client";
+
+import Link from "next/link";
+import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
+import { Home, ArrowLeft } from "lucide-react";
+
+export default function NotFound() {
+ return (
+
+
+
+
+
+ 404
+
+
Sayfa Bulunamadı
+
+ Aradığınız sayfa maalesef mevcut değil veya taşınmış olabilir.
+
+
+
+
+
+
+ Oops! Bir şeyler yanlış gitti. Lütfen ana sayfaya dönün veya bize ulaşın.
+
+
+
+
+
+
+ Ana Sayfaya Dön
+
+
+
+
+
+
+ Halen sorun yaşıyor musunuz?
+
+
+ Bize ulaşın →
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/page.tsx b/src/app/page.tsx
index a32a65a..a7a0969 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -8,9 +8,30 @@ import BlogCardTwo from "@/components/sections/blog/BlogCardTwo";
import ContactText from "@/components/sections/contact/ContactText";
import FooterLogoReveal from "@/components/sections/footer/FooterLogoReveal";
import Link from "next/link";
-import { BookOpen } from "lucide-react";
+import { BookOpen, Share2, Copy, Check } from "lucide-react";
+import { useState, useEffect } from "react";
export default function HomePage() {
+ const [copied, setCopied] = useState(false);
+ const [mounted, setMounted] = useState(false);
+
+ useEffect(() => {
+ setMounted(true);
+ }, []);
+
+ const formatTurkishLira = (amount: number) => {
+ return new Intl.NumberFormat("tr-TR", {
+ style: "currency", currency: "TRY", minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ }).format(amount);
+ };
+
+ const formatTurkishDate = (dateString: string) => {
+ const date = new Date(dateString);
+ return new Intl.DateTimeFormat("tr-TR", {
+ year: "numeric", month: "long", day: "numeric"}).format(date);
+ };
+
const navItems = [
{ name: "Ana Sayfa", id: "/" },
{ name: "Öğretmenler", id: "/teachers" },
@@ -31,7 +52,7 @@ export default function HomePage() {
{
id: "3", value: "200+", title: "Ders", description: "Çeşitli konu başlıkları", imageSrc: "http://img.b2bpic.net/free-photo/flat-lay-educational-elements-arrangement-with-empty-notepad_23-2148721242.jpg", imageAlt: "course curriculum education subjects books"},
{
- id: "4", value: "4.9/5", title: "Puan", description: "Ortalama memnuniyet oranı", imageSrc: "http://img.b2bpic.net/free-vector/education-white_24877-49399.jpg", imageAlt: "five star rating excellent satisfaction feedback"},
+ id: "4", value: "4.9/5", title: "Puan", description: "Ortalama memnuniyet oranı ⭐", imageSrc: "http://img.b2bpic.net/free-vector/education-white_24877-49399.jpg", imageAlt: "five star rating excellent satisfaction feedback"},
];
const carouselItems = [
@@ -71,84 +92,251 @@ export default function HomePage() {
text: "Canlı Sohbet", href: "#"},
];
+ const handleShare = () => {
+ const url = typeof window !== "undefined" ? window.location.href : "";
+ const title = "Öğretmen Platformu - Kişiselleştirilmiş Online Eğitim";
+ const text = "50+ deneyimli öğretmenle bağlantı kurun ve kişiselleştirilmiş eğitim alın.";
+
+ if (navigator.share) {
+ navigator.share({ title, text, url }).catch(() => {});
+ } else {
+ navigator.clipboard.writeText(url);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ }
+ };
+
return (
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {mounted && (
+ <>
+ {/* Mobile Hamburger Menu */}
+
+ {/* Sticky Mobile CTA */}
+
+ {/* Social Sharing Button */}
+
+ >
+ )}
+ >
+ );
+}
+
+function MobileHamburgerMenu({
+ navItems,
+}: {
+ navItems: Array<{ name: string; id: string }>;
+}) {
+ const [isOpen, setIsOpen] = useState(false);
+
+ useEffect(() => {
+ if (isOpen) {
+ document.body.style.overflow = "hidden";
+ } else {
+ document.body.style.overflow = "auto";
+ }
+ }, [isOpen]);
+
+ return (
+ <>
+ {/* Hamburger Button - Mobile Only */}
+
+
+ {/* Mobile Menu Drawer */}
+
+ {/* Backdrop */}
+
setIsOpen(false)}
+ aria-hidden="true"
+ />
+
+ {/* Drawer */}
+
+
+ >
+ );
+}
+
+function StickyMobileCTA() {
+ const [isVisible, setIsVisible] = useState(false);
+
+ useEffect(() => {
+ const handleScroll = () => {
+ setIsVisible(window.scrollY > 300);
+ };
+
+ window.addEventListener("scroll", handleScroll);
+ return () => window.removeEventListener("scroll", handleScroll);
+ }, []);
+
+ return (
+
-
-
-
+
+
+ );
+}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+function SocialShareButton({
+ copied,
+ onShare,
+}: {
+ copied: boolean;
+ onShare: () => void;
+}) {
+ return (
+
);
}
\ No newline at end of file
diff --git a/src/app/register/page.tsx b/src/app/register/page.tsx
new file mode 100644
index 0000000..514de9c
--- /dev/null
+++ b/src/app/register/page.tsx
@@ -0,0 +1,382 @@
+"use client";
+
+import { useState } from "react";
+import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
+import NavbarStyleFullscreen from "@/components/navbar/NavbarStyleFullscreen/NavbarStyleFullscreen";
+import FooterLogoReveal from "@/components/sections/footer/FooterLogoReveal";
+import { Eye, EyeOff, AlertCircle, CheckCircle } from "lucide-react";
+
+interface FormData {
+ firstName: string;
+ lastName: string;
+ email: string;
+ password: string;
+ confirmPassword: string;
+ userType: "student" | "teacher" | "";
+}
+
+interface FormErrors {
+ firstName?: string;
+ lastName?: string;
+ email?: string;
+ password?: string;
+ confirmPassword?: string;
+ userType?: string;
+}
+
+export default function RegisterPage() {
+ const navItems = [
+ { name: "Ana Sayfa", id: "/" },
+ { name: "Öğretmenler", id: "/teachers" },
+ { name: "Etkinlikler", id: "events" },
+ { name: "Çalışma Programı", id: "schedule" },
+ ];
+
+ const [formData, setFormData] = useState
({
+ firstName: "", lastName: "", email: "", password: "", confirmPassword: "", userType: ""});
+
+ const [errors, setErrors] = useState({});
+ const [showPassword, setShowPassword] = useState(false);
+ const [showConfirmPassword, setShowConfirmPassword] = useState(false);
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [submitSuccess, setSubmitSuccess] = useState(false);
+
+ const validateForm = (): boolean => {
+ const newErrors: FormErrors = {};
+
+ if (!formData.firstName.trim()) {
+ newErrors.firstName = "Ad gereklidir";
+ } else if (formData.firstName.length < 2) {
+ newErrors.firstName = "Ad en az 2 karakter olmalıdır";
+ }
+
+ if (!formData.lastName.trim()) {
+ newErrors.lastName = "Soyad gereklidir";
+ } else if (formData.lastName.length < 2) {
+ newErrors.lastName = "Soyad en az 2 karakter olmalıdır";
+ }
+
+ if (!formData.email.trim()) {
+ newErrors.email = "E-posta gereklidir";
+ } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) {
+ newErrors.email = "Geçerli bir e-posta adresi girin";
+ }
+
+ if (!formData.password) {
+ newErrors.password = "Şifre gereklidir";
+ } else if (formData.password.length < 8) {
+ newErrors.password = "Şifre en az 8 karakter olmalıdır";
+ } else if (!/[A-Z]/.test(formData.password)) {
+ newErrors.password = "Şifre en az bir büyük harf içermelidir";
+ } else if (!/[0-9]/.test(formData.password)) {
+ newErrors.password = "Şifre en az bir rakam içermelidir";
+ }
+
+ if (formData.password !== formData.confirmPassword) {
+ newErrors.confirmPassword = "Şifreler eşleşmiyor";
+ }
+
+ if (!formData.userType) {
+ newErrors.userType = "Kullanıcı türünü seçin";
+ }
+
+ setErrors(newErrors);
+ return Object.keys(newErrors).length === 0;
+ };
+
+ const handleChange = (
+ e: React.ChangeEvent
+ ) => {
+ const { name, value } = e.target;
+ setFormData((prev) => ({
+ ...prev,
+ [name]: value,
+ }));
+ if (errors[name as keyof FormErrors]) {
+ setErrors((prev) => ({
+ ...prev,
+ [name]: undefined,
+ }));
+ }
+ };
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ if (!validateForm()) {
+ return;
+ }
+
+ setIsSubmitting(true);
+
+ try {
+ const response = await fetch("/api/auth/register", {
+ method: "POST", headers: {
+ "Content-Type": "application/json"},
+ body: JSON.stringify({
+ firstName: formData.firstName,
+ lastName: formData.lastName,
+ email: formData.email,
+ password: formData.password,
+ userType: formData.userType,
+ }),
+ });
+
+ if (response.ok) {
+ setSubmitSuccess(true);
+ setFormData({
+ firstName: "", lastName: "", email: "", password: "", confirmPassword: "", userType: ""});
+ setTimeout(() => {
+ setSubmitSuccess(false);
+ }, 5000);
+ } else {
+ const data = await response.json();
+ setErrors({ email: data.message || "Kayıt başarısız oldu" });
+ }
+ } catch (error) {
+ setErrors({ email: "Bir hata oluştu. Lütfen tekrar deneyin." });
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
Hesap Oluştur
+
Eğitim yolculuğunuza bugün başlayın
+
+
+ {submitSuccess && (
+
+
+
+
Başarılı!
+
+ Hesabınız başarıyla oluşturuldu. Şimdi giriş yapabilirsiniz.
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/styles/variables.css b/src/app/styles/variables.css
index d12c3c0..a66231d 100644
--- a/src/app/styles/variables.css
+++ b/src/app/styles/variables.css
@@ -10,15 +10,15 @@
--accent: #ffffff;
--background-accent: #ffffff; */
- --background: #f7f6f7;
- --card: #ffffff;
- --foreground: #250c0d;
- --primary-cta: #b82b40;
+ --background: #0f1419;
+ --card: #1a1f2e;
+ --foreground: #e8eef5;
+ --primary-cta: #1e4a7a;
--primary-cta-text: #f7f6f7;
- --secondary-cta: #ffffff;
+ --secondary-cta: #0f9d6f;
--secondary-cta-text: #250c0d;
- --accent: #b90941;
- --background-accent: #e8a8b6;
+ --accent: #5d9cec;
+ --background-accent: #2d6a9f;
/* text sizing - set by ThemeProvider */
/* --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem);
diff --git a/src/app/teacher-dashboard/page.tsx b/src/app/teacher-dashboard/page.tsx
new file mode 100644
index 0000000..ef67cec
--- /dev/null
+++ b/src/app/teacher-dashboard/page.tsx
@@ -0,0 +1,277 @@
+"use client";
+
+import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
+import { useState } from "react";
+import {
+ Home,
+ Calendar,
+ Users,
+ MessageSquare,
+ DollarSign,
+ BarChart3,
+ Settings,
+ LogOut,
+ Menu,
+ X,
+ Star,
+ Clock,
+ AlertCircle,
+ CheckCircle,
+} from "lucide-react";
+
+export default function TeacherDashboard() {
+ const [activeMenu, setActiveMenu] = useState("home");
+ const [sidebarOpen, setSidebarOpen] = useState(true);
+
+ const menuItems = [
+ { id: "home", label: "Home", icon: Home },
+ { id: "calendar", label: "Calendar", icon: Calendar },
+ { id: "students", label: "My Students", icon: Users },
+ { id: "messages", label: "Messages", icon: MessageSquare },
+ { id: "earnings", label: "Earnings", icon: DollarSign },
+ { id: "statistics", label: "Statistics", icon: BarChart3 },
+ { id: "settings", label: "Settings", icon: Settings },
+ ];
+
+ const monthlyStats = {
+ earnings: "$4,280", lessons: 24,
+ rating: 4.9,
+ newStudents: 5,
+ };
+
+ const todayLessons = [
+ {
+ id: 1,
+ studentName: "John Doe", subject: "Mathematics", time: "09:00 AM", duration: "1 hour", status: "upcoming"},
+ {
+ id: 2,
+ studentName: "Sarah Smith", subject: "Physics", time: "10:30 AM", duration: "1 hour", status: "upcoming"},
+ {
+ id: 3,
+ studentName: "Mike Johnson", subject: "English", time: "02:00 PM", duration: "45 minutes", status: "upcoming"},
+ ];
+
+ const pendingRequests = [
+ {
+ id: 1,
+ studentName: "Emma Wilson", subject: "Chemistry", message: "Requesting trial lesson", requestDate: "2 hours ago"},
+ {
+ id: 2,
+ studentName: "Alex Brown", subject: "Biology", message: "Requesting regular classes", requestDate: "5 hours ago"},
+ {
+ id: 3,
+ studentName: "Jordan Lee", subject: "Mathematics", message: "Requesting intensive tutoring", requestDate: "1 day ago"},
+ ];
+
+ const MenuItem = ({ item }: any) => {
+ const Icon = item.icon;
+ const isActive = activeMenu === item.id;
+ return (
+
+ );
+ };
+
+ const StatCard = ({ label, value, icon: Icon }: any) => (
+
+ );
+
+ const LessonCard = ({ lesson }: any) => (
+
+
+
+
+
{lesson.studentName}
+
+ {lesson.subject}
+
+
+
+
+
+ {lesson.time}
+
+
{lesson.duration}
+
+
+
+
+
+ );
+
+ const RequestCard = ({ request }: any) => (
+
+
+
+
+
{request.studentName}
+
+ {request.subject}
+
+
+
{request.message}
+
{request.requestDate}
+
+
+
+
+
+
+
+ );
+
+ return (
+
+
+ {/* Sidebar */}
+
+ {/* Header */}
+
+ {sidebarOpen && (
+
Dashboard
+ )}
+
+
+
+ {/* Menu Items */}
+
+
+ {/* Logout */}
+
+
+
+
+
+ {/* Main Content */}
+
+
+ {/* Welcome Header */}
+
+
+ Welcome back, Teacher!
+
+
+ Here's your teaching dashboard for today
+
+
+
+ {/* Monthly Stats */}
+
+
+
+
+
+
+
+ {/* Content Grid */}
+
+ {/* Today's Lessons */}
+
+
+
+ Today's Lessons
+
+
+ {todayLessons.map((lesson) => (
+
+ ))}
+
+
+
+
+ {/* Pending Requests */}
+
+
+
+
+ Pending Requests
+
+
+ {pendingRequests.length}
+
+
+
+ {pendingRequests.length > 0 ? (
+ pendingRequests.map((request) => (
+
+ ))
+ ) : (
+
+
+
No pending requests
+
+ )}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/teachers/[id]/page.tsx b/src/app/teachers/[id]/page.tsx
new file mode 100644
index 0000000..0dc1515
--- /dev/null
+++ b/src/app/teachers/[id]/page.tsx
@@ -0,0 +1,307 @@
+"use client";
+
+import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
+import NavbarStyleFullscreen from "@/components/navbar/NavbarStyleFullscreen/NavbarStyleFullscreen";
+import FooterLogoReveal from "@/components/sections/footer/FooterLogoReveal";
+import { Star, MapPin, Clock, ChevronLeft, Users } from "lucide-react";
+import Link from "next/link";
+
+const teachersData: Record = {
+ "1": {
+ id: "1", name: "Ayşe Kaya", specialization: "Matematik", rating: 4.9,
+ students: 250,
+ bio: "10 yıl öğretim deneyimi ile üniversite giriş sınavlarına hazırlık konusunda uzman. Öğrencilerim %95 başarı oranı ile hedeflerine ulaşıyor.", image: "http://img.b2bpic.net/free-photo/young-female-glasses-workplace_1301-980.jpg", location: "İstanbul", availability: "Pazartesi-Cuma 18:00-22:00", hourlyRate: "₺150/saat", reviews: [
+ {
+ id: "1", author: "Ali Başkan", rating: 5,
+ date: "15 Ocak 2025", text: "Ayşe öğretmen çok sabırlı ve açıklayıcı. Zor konuları çok iyi anlatıyor."},
+ {
+ id: "2", author: "Zeynep Şimşek", rating: 5,
+ date: "20 Ocak 2025", text: "Dersleri çok eğlenceli ve etkili. Sınavda 20 puan artış yaşadım!"},
+ {
+ id: "3", author: "Emre Yilmaz", rating: 4,
+ date: "22 Ocak 2025", text: "Profesyonel bir yaklaşım var. Çok memnun kaldım."},
+ ],
+ similarTeachers: [
+ {
+ id: "2", name: "Mehmet Yıldız", specialization: "İngilizce", rating: 4.8,
+ image: "http://img.b2bpic.net/free-photo/portrait-businessman-office-3_1262-1489.jpg"},
+ {
+ id: "3", name: "Zeynep Demir", specialization: "Kimya", rating: 4.7,
+ image: "http://img.b2bpic.net/free-photo/woman-posing-with-books_23-2148680219.jpg"},
+ ],
+ },
+ "2": {
+ id: "2", name: "Mehmet Yıldız", specialization: "İngilizce", rating: 4.8,
+ students: 180,
+ bio: "Amerikalı İngilizce öğretmeni, akıcı iletişim becerilerine odaklanır. Konuşma pratiği ve kültürel öğrenmeyi destekler.", image: "http://img.b2bpic.net/free-photo/portrait-businessman-office-3_1262-1489.jpg", location: "Ankara", availability: "Salı-Perşembe 17:00-21:00", hourlyRate: "₺120/saat", reviews: [
+ {
+ id: "1", author: "Selin Kara", rating: 5,
+ date: "18 Ocak 2025", text: "İngilizce konuşmak artık çok daha doğal hissettiriyor. Müthiş bir öğretmen!"},
+ {
+ id: "2", author: "Deniz Güzel", rating: 5,
+ date: "21 Ocak 2025", text: "Üst düzey derse hazırlanıyorum ve çok yardımcı oldu."},
+ {
+ id: "3", author: "Gül Yaşar", rating: 4,
+ date: "23 Ocak 2025", text: "Güzel dersi var ama zaman sınırlı."},
+ ],
+ similarTeachers: [
+ {
+ id: "1", name: "Ayşe Kaya", specialization: "Matematik", rating: 4.9,
+ image: "http://img.b2bpic.net/free-photo/young-female-glasses-workplace_1301-980.jpg"},
+ {
+ id: "3", name: "Zeynep Demir", specialization: "Kimya", rating: 4.7,
+ image: "http://img.b2bpic.net/free-photo/woman-posing-with-books_23-2148680219.jpg"},
+ ],
+ },
+ "3": {
+ id: "3", name: "Zeynep Demir", specialization: "Kimya", rating: 4.7,
+ students: 160,
+ bio: "Laboratuvar deneyimli, interaktif öğrenme yönetimiyle başarı sağlar. Kimya konseptlerini pratik örneklerle açıklar.", image: "http://img.b2bpic.net/free-photo/woman-posing-with-books_23-2148680219.jpg", location: "İzmir", availability: "Pazartesi-Çarşamba 19:00-23:00", hourlyRate: "₺130/saat", reviews: [
+ {
+ id: "1", author: "Kerem Aslan", rating: 5,
+ date: "16 Ocak 2025", text: "Kimya hiçbir zaman bu kadar kolay olmamıştı. Teşekkürler!"},
+ {
+ id: "2", author: "Nur Özcan", rating: 5,
+ date: "19 Ocak 2025", text: "Sınavda başarılı oldum, çokça yardımı oldu."},
+ {
+ id: "3", author: "Hakan Demir", rating: 4,
+ date: "24 Ocak 2025", text: "Güzel açıklamaları var."},
+ ],
+ similarTeachers: [
+ {
+ id: "1", name: "Ayşe Kaya", specialization: "Matematik", rating: 4.9,
+ image: "http://img.b2bpic.net/free-photo/young-female-glasses-workplace_1301-980.jpg"},
+ {
+ id: "2", name: "Mehmet Yıldız", specialization: "İngilizce", rating: 4.8,
+ image: "http://img.b2bpic.net/free-photo/portrait-businessman-office-3_1262-1489.jpg"},
+ ],
+ },
+};
+
+export default function TeacherProfilePage({ params }: { params: { id: string } }) {
+ const teacher = teachersData[params.id];
+ const navItems = [
+ { name: "Ana Sayfa", id: "/" },
+ { name: "Öğretmenler", id: "/teachers" },
+ { name: "Etkinlikler", id: "events" },
+ { name: "Çalışma Programı", id: "schedule" },
+ ];
+
+ if (!teacher) {
+ return (
+
+
+
+
+
+
Öğretmen bulunamadı
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+ {/* Breadcrumb Navigation */}
+
+
+
+
+
+
+
+
+ {/* Teacher Profile Header */}
+
+ {/* Image */}
+
+
+

+
+
+
+ {/* Teacher Info */}
+
+
{teacher.name}
+
{teacher.specialization}
+
+
+
+
+ {teacher.rating}
+ ({teacher.students} öğrenci)
+
+
+
+
{teacher.bio}
+
+
+
+
+ {teacher.location}
+
+
+
+ {teacher.availability}
+
+
+
+
+
{teacher.hourlyRate}
+
+
+
+
+
+ {/* Available Hours Section */}
+
+ Uygun Saatler
+
+
+ {[
+ { day: "Pazartesi", available: true },
+ { day: "Salı", available: true },
+ { day: "Çarşamba", available: true },
+ { day: "Perşembe", available: true },
+ { day: "Cuma", available: true },
+ { day: "Cumartesi", available: false },
+ { day: "Pazar", available: false },
+ ].map((d) => (
+
+
{d.day}
+
{d.available ? "18:00 - 22:00" : "Müsait değil"}
+
+ ))}
+
+
+
+
+ {/* Reviews Section */}
+
+ Öğrenci Yorumları
+
+ {teacher.reviews.map((review: any) => (
+
+
+
+
{review.author}
+
{review.date}
+
+
+ {[...Array(5)].map((_, i) => (
+
+ ))}
+
+
+
{review.text}
+
+ ))}
+
+
+
+ {/* Similar Teachers Section */}
+
+ Benzer Öğretmenler
+
+ {teacher.similarTeachers.map((similar: any) => (
+
+
+

+
+
+
{similar.name}
+
{similar.specialization}
+
+
+ {similar.rating}
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/teachers/page.tsx b/src/app/teachers/page.tsx
index 432677e..9015bcc 100644
--- a/src/app/teachers/page.tsx
+++ b/src/app/teachers/page.tsx
@@ -2,11 +2,15 @@
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleFullscreen from "@/components/navbar/NavbarStyleFullscreen/NavbarStyleFullscreen";
-import TeamCardEleven from "@/components/sections/team/TeamCardEleven";
-import FaqSplitText from "@/components/sections/faq/FaqSplitText";
+import HeroBillboardRotatedCarousel from "@/components/sections/hero/HeroBillboardRotatedCarousel";
import FooterLogoReveal from "@/components/sections/footer/FooterLogoReveal";
+import { BookOpen, Star } from "lucide-react";
+import { useState } from "react";
+import Image from "next/image";
export default function TeachersPage() {
+ const [favorites, setFavorites] = useState>(new Set());
+
const navItems = [
{ name: "Ana Sayfa", id: "/" },
{ name: "Öğretmenler", id: "/teachers" },
@@ -14,79 +18,62 @@ export default function TeachersPage() {
{ name: "Çalışma Programı", id: "schedule" },
];
- const teacherGroups = [
+ const teachers = [
{
- id: "group-1",
- groupTitle: "İleri Seviye Öğretmenler",
- members: [
- {
- id: "1",
- title: "Ayşe Kaya",
- subtitle: "Matematik & Fizik",
- detail: "12 yıl tecrübe | 5.0 puan",
- imageSrc: "http://img.b2bpic.net/free-photo/young-female-glasses-workplace_1301-980.jpg?_wi=1",
- imageAlt: "professional woman teacher portrait headshot",
- },
- {
- id: "2",
- title: "Mehmet Yıldız",
- subtitle: "İngilizce & Dil",
- detail: "15 yıl tecrübe | 4.9 puan",
- imageSrc: "http://img.b2bpic.net/free-photo/portrait-businessman-office-3_1262-1489.jpg?_wi=1",
- imageAlt: "professional man teacher portrait headshot",
- },
- {
- id: "3",
- title: "Zeynep Demir",
- subtitle: "Kimya & Biyoloji",
- detail: "10 yıl tecrübe | 4.8 puan",
- imageSrc: "http://img.b2bpic.net/free-photo/woman-posing-with-books_23-2148680219.jpg?_wi=1",
- imageAlt: "female scientist professor portrait headshot",
- },
- {
- id: "4",
- title: "İbrahim Çelik",
- subtitle: "Tarih & Sosyal Bilgiler",
- detail: "8 yıl tecrübe | 4.9 puan",
- imageSrc: "http://img.b2bpic.net/free-photo/young-man-wearing-blue-outfit-looking-satisfied_1298-169.jpg?_wi=1",
- imageAlt: "male professor teacher history expert portrait",
- },
- ],
+ id: "1", name: "Dr. Ahmet Yılmaz", subject: "Matematik", bio: "20 yıl öğretim deneyimi", image: "http://img.b2bpic.net/free-photo/portrait-businessman-office-3_1262-1489.jpg", rating: 4.9,
+ reviews: 342,
+ price: 150,
+ badge: "Doktor", students: 500,
+ },
+ {
+ id: "2", name: "Prof. Zeynep Demir", subject: "Kimya", bio: "Üniversite hocası", image: "http://img.b2bpic.net/free-photo/woman-posing-with-books_23-2148680219.jpg", rating: 4.8,
+ reviews: 278,
+ price: 200,
+ badge: "Profesör", students: 450,
+ },
+ {
+ id: "3", name: "Mehmet Kaya", subject: "İngilizce", bio: "Dil sertifikasyonları", image: "http://img.b2bpic.net/free-photo/young-male-student-with-backpack-reading_23-2148639349.jpg", rating: 4.7,
+ reviews: 215,
+ price: 120,
+ badge: "Sertifikalı", students: 320,
+ },
+ {
+ id: "4", name: "Ayşe Kara", subject: "Tarih", bio: "Araştırmacı ve yazar", image: "http://img.b2bpic.net/free-photo/young-female-glasses-workplace_1301-980.jpg", rating: 4.9,
+ reviews: 289,
+ price: 140,
+ badge: "Uzman", students: 380,
},
];
- const faqData = [
- {
- id: "1",
- title: "Öğretmen seçerken nelere dikkat etmeliyim?",
- content:
- "Öğretmen profillerinde deneyim, uzmanlık alanı ve öğrenci puanlarını inceleyebilirsiniz. İlk dersini denemek için \"İletişime Geç\" düğmesini kullanarak öğretmenle bağlantı kurabilirsiniz.",
- },
- {
- id: "2",
- title: "Ders saatlerini nasıl düzenleyebilirim?",
- content:
- "Çalışma Programı sayfasında haftalık ders takvimini görebilirsiniz. Istediğiniz ders saatine tıklayarak \"Katıl\" butonu ile kaydolabilirsiniz.",
- },
- {
- id: "3",
- title: "Etkinliklere nasıl katılabilirim?",
- content:
- "Etkinlikler sayfasında tüm yaklaşan dersleri ve webinarları görebilirsiniz. İlgilendiğiniz etkinliğin \"Kayıt Ol\" düğmesine tıklayarak katılabilirsiniz.",
- },
- {
- id: "4",
- title: "Ödeme seçenekleri nelerdir?",
- content:
- "Kredi kartı, banka havalesi ve e-cüzdan gibi çeşitli ödeme yöntemlerini destekliyoruz. Ödeme bilgileri gizli ve güvenlidir.",
- },
- {
- id: "5",
- title: "Dersi iptal etmek istiyorsam ne yapmalıyım?",
- content:
- "Dersin başlamasından en az 24 saat önce iptal edebilirsiniz. Profil bölümünde 'Kayıtlı Dersler' kısmından ders iptalini gerçekleştirebilirsiniz.",
- },
- ];
+ const formatTurkishLira = (amount: number) => {
+ return new Intl.NumberFormat("tr-TR", {
+ style: "currency", currency: "TRY", minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ }).format(amount);
+ };
+
+ const toggleFavorite = (id: string) => {
+ const newFavorites = new Set(favorites);
+ if (newFavorites.has(id)) {
+ newFavorites.delete(id);
+ } else {
+ newFavorites.add(id);
+ }
+ setFavorites(newFavorites);
+ };
+
+ const StarRating = ({ rating }: { rating: number }) => {
+ return (
+
+ {[...Array(5)].map((_, i) => (
+
+ ★
+
+ ))}
+ {rating}
+
+ );
+ };
return (
-
-
+
+
+
+
Uzman Öğretmenlerimiz
+
+ Alanlarında uzmanlaşmış, deneyimli eğitimciler sizin başarı yolculuğunuza eşlik etmek için hazır.
+
+
+
+
+ {teachers.map((teacher) => (
+
+ {/* Image Container */}
+
+

+ {/* Trust Badge */}
+
+ {teacher.badge}
+
+ {/* Favorite Button */}
+
+
+
+ {/* Content */}
+
+
+
{teacher.name}
+
{teacher.subject}
+
+
+ {/* Star Rating System */}
+
+
+
+ {teacher.reviews} değerlendirme • {teacher.students}+ öğrenci
+
+
+
+ {/* Price */}
+
+
{formatTurkishLira(teacher.price)}/saat
+
+
+ {/* CTA Button - Touch target 44px minimum */}
+
+
+
+ ))}
+
+
-
-
-
-
-