diff --git a/src/app/gizlilik/page.tsx b/src/app/gizlilik/page.tsx
index e23dbc9..3326980 100644
--- a/src/app/gizlilik/page.tsx
+++ b/src/app/gizlilik/page.tsx
@@ -1,5 +1,7 @@
import type { Metadata } from "next";
import Link from "next/link";
+import { Parallax } from "@/components/parallax";
+import { ScrollFlow } from "@/components/scroll-flow";
export const metadata: Metadata = {
title: "Gizlilik ve KVKK — KolayTercih",
@@ -8,59 +10,70 @@ export const metadata: Metadata = {
// NOT: MVP taslağıdır; yayına almadan önce hukuki gözden geçirme gerekir.
export default function GizlilikPage() {
return (
-
-
- Gizlilik ve Kişisel Verilerin Korunması
-
-
Son güncelleme: 26 Temmuz 2026
+
+
+
+
+ Gizlilik ve Kişisel Verilerin Korunması
+
+
+ Son güncelleme: 26 Temmuz 2026
+
+
-
-
-
- Hangi verileri işliyoruz?
-
-
- KolayTercih; e-posta adresini (hesap oluşturma ve giriş için), YKS
- başarı sıralamanı ve sihirbazda yaptığın seçimleri (tercih listeni
- üretmek için), danışman sohbetine yazdığın mesajları (sorularını
- yanıtlamak için) ve ödeme yaptığında sipariş kayıtlarını işler.
- Kart bilgilerin bize hiç ulaşmaz; ödeme iyzico altyapısında
- gerçekleşir.
-
-
-
-
- Ne için kullanıyoruz?
-
-
- Verilerin yalnızca tercih önerileri üretmek, hesabını ve kredi
- bakiyeni yönetmek ve sana hizmetle ilgili e-posta (giriş bağlantısı,
- ödeme bilgilendirmesi) göndermek için kullanılır. Verilerini
- üçüncü taraflara satmayız, reklam amacıyla paylaşmayız.
-
-
-
-
- Saklama ve silme
-
-
- Hesabını sildirmek veya verilerinin bir kopyasını istemek için{" "}
-
- iletişim sayfasındaki
- {" "}
- adresten bize yazabilirsin; talepler 30 gün içinde sonuçlandırılır.
-
-
-
-
- Çerezler
-
-
- Yalnızca oturumunu açık tutmak için zorunlu çerezler kullanılır;
- reklam veya izleme çerezi kullanılmaz.
-
-
-
-
+
+
+
+ Hangi verileri işliyoruz?
+
+
+ KolayTercih; e-posta adresini (hesap oluşturma ve giriş için), YKS
+ başarı sıralamanı ve sihirbazda yaptığın seçimleri (tercih listeni
+ üretmek için), danışman sohbetine yazdığın mesajları (sorularını
+ yanıtlamak için) ve ödeme yaptığında sipariş kayıtlarını işler.
+ Kart bilgilerin bize hiç ulaşmaz; ödeme iyzico altyapısında
+ gerçekleşir.
+
+
+
+
+ Ne için kullanıyoruz?
+
+
+ Verilerin yalnızca tercih önerileri üretmek, hesabını ve kredi
+ bakiyeni yönetmek ve sana hizmetle ilgili e-posta (giriş
+ bağlantısı, ödeme bilgilendirmesi) göndermek için kullanılır.
+ Verilerini üçüncü taraflara satmayız, reklam amacıyla paylaşmayız.
+
+
+
+
+ Saklama ve silme
+
+
+ Hesabını sildirmek veya verilerinin bir kopyasını istemek için{" "}
+
+ iletişim sayfasındaki
+ {" "}
+ adresten bize yazabilirsin; talepler 30 gün içinde
+ sonuçlandırılır.
+
+
+
+
+ Çerezler
+
+
+ Yalnızca oturumunu açık tutmak için zorunlu çerezler kullanılır;
+ reklam veya izleme çerezi kullanılmaz.
+
+
+
+
+
);
}
diff --git a/src/app/globals.css b/src/app/globals.css
index d569ac0..2b7197c 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -7,9 +7,10 @@
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
- --font-sans: var(--font-work-sans);
+ --font-sans: var(--font-clarity-city);
--font-mono: var(--font-geist-mono);
- --font-heading: var(--font-outfit);
+ --font-heading: var(--font-cal-sans);
+ --font-bricolage: var(--font-bricolage-grotesque);
--color-sidebar-ring: var(--sidebar-ring);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
@@ -168,7 +169,22 @@
body {
@apply bg-background text-foreground;
}
+ /* Chrome autofill'in soluk mavi dolgusu inputun kendi arka planını
+ ezmesin; dolgu metne kırpılır, renkler temadan gelir. */
+ input:-webkit-autofill,
+ input:-webkit-autofill:hover,
+ input:-webkit-autofill:focus {
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: var(--foreground);
+ caret-color: var(--foreground);
+ }
html {
@apply font-sans;
+ scroll-behavior: smooth;
+ }
+ @media (prefers-reduced-motion: reduce) {
+ html {
+ scroll-behavior: auto;
+ }
}
}
\ No newline at end of file
diff --git a/src/app/iletisim/page.tsx b/src/app/iletisim/page.tsx
index e4bb320..02c380a 100644
--- a/src/app/iletisim/page.tsx
+++ b/src/app/iletisim/page.tsx
@@ -1,5 +1,7 @@
import type { Metadata } from "next";
import { Mail } from "lucide-react";
+import { Parallax } from "@/components/parallax";
+import { ScrollFlow } from "@/components/scroll-flow";
export const metadata: Metadata = {
title: "İletişim — KolayTercih",
@@ -7,24 +9,28 @@ export const metadata: Metadata = {
export default function IletisimPage() {
return (
-
-
İletişim
-
- Ödeme, iade, hesap silme ya da başka bir konuda yardıma mı ihtiyacın
- var? Tercih döneminde mesajlara aynı gün dönmeye çalışıyoruz.
-
- Ödemenle ilgili yazıyorsan e-postana sipariş tarihini ve kullandığın
- hesap adresini eklersen daha hızlı yardımcı olabiliriz. Kart bilgini
- asla e-postayla paylaşma.
-
-
+
+
+
+
İletişim
+
+
+ Ödeme, iade, hesap silme ya da başka bir konuda yardıma mı ihtiyacın
+ var? Tercih döneminde mesajlara aynı gün dönmeye çalışıyoruz.
+
+ Ödemenle ilgili yazıyorsan e-postana sipariş tarihini ve kullandığın
+ hesap adresini eklersen daha hızlı yardımcı olabiliriz. Kart bilgini
+ asla e-postayla paylaşma.
+
+
+
);
}
diff --git a/src/app/kosullar/page.tsx b/src/app/kosullar/page.tsx
index 9cd3cfa..1d182bd 100644
--- a/src/app/kosullar/page.tsx
+++ b/src/app/kosullar/page.tsx
@@ -1,5 +1,7 @@
import type { Metadata } from "next";
import Link from "next/link";
+import { Parallax } from "@/components/parallax";
+import { ScrollFlow } from "@/components/scroll-flow";
export const metadata: Metadata = {
title: "Kullanım ve Satış Koşulları — KolayTercih",
@@ -8,67 +10,77 @@ export const metadata: Metadata = {
// NOT: MVP taslağıdır; yayına almadan önce hukuki gözden geçirme gerekir.
export default function KosullarPage() {
return (
-
-
- Kullanım ve Satış Koşulları
-
-
Son güncelleme: 26 Temmuz 2026
+
+
+
+
+ Kullanım ve Satış Koşulları
+
+
+ Son güncelleme: 26 Temmuz 2026
+
+
-
-
-
- Hizmetin kapsamı
-
-
- KolayTercih, resmî YÖK Atlas verilerine dayanan bir karar destek
- aracıdır. Öneriler bilgilendirme amaçlıdır; KolayTercih yerleşme
- garantisi vermez ve ÖSYM ya da YÖK ile bağlantılı değildir. Tercih
- listenin son hali ve başvuru sorumluluğu sana aittir.
-
-
-
-
- Ücretlendirme
-
-
- Temel program arama ücretsizdir. Tercih Dönemi Paketi tek seferlik
- bir satın almadır; abonelik değildir, otomatik yenilenmez. Paket
- içeriği ve güncel fiyat{" "}
-
- paket sayfasında
- {" "}
- yazar.
-
-
-
-
- İade ve cayma
-
-
- Paket, satın alır almaz ifasına başlanan dijital bir içeriktir.
- Buna rağmen kişisel listen henüz üretilmemişse (paket hiç
- kullanılmamışsa) satın almadan itibaren 14 gün içinde koşulsuz
- iade talep edebilirsin. Teknik bir sorun nedeniyle hizmeti
- alamadıysan, kullanımdan bağımsız olarak ücretin iade edilir.
- İade talepleri için{" "}
-
- bize yaz
-
- ; talepler 14 gün içinde sonuçlandırılır ve iade, ödeme yaptığın
- karta yapılır.
-
-
-
-
- Hesap ve adil kullanım
-
-
- Krediler hesabına tanımlıdır, kişiseldir ve üçüncü kişilere
- devredilemez. Hizmeti kötüye kullanan (otomatik istek, içerik
- kazıma vb.) hesaplar kapatılabilir.
-
-
-
-
+
+
+
+ Hizmetin kapsamı
+
+
+ KolayTercih, resmî YÖK Atlas verilerine dayanan bir karar destek
+ aracıdır. Öneriler bilgilendirme amaçlıdır; KolayTercih yerleşme
+ garantisi vermez ve ÖSYM ya da YÖK ile bağlantılı değildir. Tercih
+ listenin son hali ve başvuru sorumluluğu sana aittir.
+
+
+
+
+ Ücretlendirme
+
+
+ Temel program arama ücretsizdir. Tercih Dönemi Paketi tek seferlik
+ bir satın almadır; abonelik değildir, otomatik yenilenmez. Paket
+ içeriği ve güncel fiyat{" "}
+
+ paket sayfasında
+ {" "}
+ yazar.
+
+
+
+
+ İade ve cayma
+
+
+ Paket, satın alır almaz ifasına başlanan dijital bir içeriktir.
+ Buna rağmen kişisel listen henüz üretilmemişse (paket hiç
+ kullanılmamışsa) satın almadan itibaren 14 gün içinde koşulsuz
+ iade talep edebilirsin. Teknik bir sorun nedeniyle hizmeti
+ alamadıysan, kullanımdan bağımsız olarak ücretin iade edilir. İade
+ talepleri için{" "}
+
+ bize yaz
+
+ ; talepler 14 gün içinde sonuçlandırılır ve iade, ödeme yaptığın
+ karta yapılır.
+
+
+
+
+ Hesap ve adil kullanım
+
+
+ Krediler hesabına tanımlıdır, kişiseldir ve üçüncü kişilere
+ devredilemez. Hizmeti kötüye kullanan (otomatik istek, içerik
+ kazıma vb.) hesaplar kapatılabilir.
+
)}
diff --git a/src/app/loading.tsx b/src/app/loading.tsx
index 4e8ae6e..2c4f3d1 100644
--- a/src/app/loading.tsx
+++ b/src/app/loading.tsx
@@ -1,13 +1,30 @@
-import { Loader2 } from "lucide-react";
+import { Skeleton } from "@/components/ui/skeleton";
+// Kendi loading dosyası olmayan tüm rotalar için genel sayfa iskeleti:
+// spinner yerine başlık, metin ve kart bloklarının yer tutucuları —
+// içerik gelince zıplama olmaz.
export default function Loading() {
return (
-
-
-
);
}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 80f7e5d..e7b1f86 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -12,6 +12,16 @@ import {
import Image from "next/image";
import Link from "next/link";
import { HeroForm } from "@/components/hero-form";
+import { Parallax } from "@/components/parallax";
+import { ScrollFlow } from "@/components/scroll-flow";
+import { Reveal } from "@/components/landing/reveal";
+import { TurkeyPixelMap } from "@/components/turkey-pixel-map";
+import {
+ PixelCorner,
+ PixelDivider,
+ PixelField,
+ SectionEyebrow,
+} from "@/components/pixel-decor";
import { URUNLER } from "@/lib/credits";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
@@ -156,261 +166,412 @@ function ComparisonCell({ value }: { value: boolean | string }) {
export default function Home() {
return (
-
-
- {/* Hero */}
-
-
- 2026 YKS tercih dönemi açık
-
-
- Dört yıllık geleceğini{" "}
- 48 saatlik panikle seçme
-
-
+
+
+
+ {/* Hero */}
+
+
+ {/* Arka katman: harita scroll'un gerisinde kalır, derinlik verir */}
+
+ {/* Harita hiçbir boyutta taşmaz: her zaman ekran genişliği
+ eksi kenar payı kadar; sayfa küçüldükçe onunla birlikte
+ küçülür. Çok geniş ekranda 1665px tavanına oturur;
+ mobilde tümüyle gizli. */}
+
+
+
+
+
+
+ 2026 YKS tercih dönemi açık
+
+
+ Dört yıllık geleceğini
+
+ 48 saatlik panikle
+ {" "}
+ seçme
+
+ {/*
KolayTercih, gerçek YÖK Atlas verisiyle çalışan yapay zekâ tercih
danışmanın. İnsan danışmanın binlerce lira aldığı işi — dengeli
liste, risk analizi, soru-cevap — onda bir fiyatına yapar.
-
-
-
-
-
- Temel arama her zaman ücretsiz · Kredi kartı gerekmez · Tam analiz
- paketi tek seferlik {PAKET_FIYATI} TL
-
+
+
+ {/* Final CTA — tam genişlik bant yerine yüzen, köşeleri yumuşak panel */}
+
+
+
+
+ {/* Hero'nun piksel dokusu koyu zeminde: ortası boş, kenarlara doğru yoğun */}
+ {/* Piksel zemin panel içinde geride kalır; taşma payı için dikeyde büyütülür */}
+
+
+
+
+
+
+
+
+ Tercih listen, pişmanlık listesi olmasın
+
+
+ Sıralamanı gir, yapay zekâ danışmanın veriyle konuşsun.
+ Tercih dönemi bitmeden yerini al.
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/src/app/paket/page.tsx b/src/app/paket/page.tsx
index 8519190..690113c 100644
--- a/src/app/paket/page.tsx
+++ b/src/app/paket/page.tsx
@@ -13,6 +13,8 @@ import { getCurrentUser } from "@/lib/session";
import { URUNLER, DENEME_KREDISI } from "@/lib/credits";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
+import { Parallax } from "@/components/parallax";
+import { ScrollFlow } from "@/components/scroll-flow";
import { SatinAlForm } from "./satin-al-form";
export const metadata: Metadata = {
@@ -51,134 +53,143 @@ export default async function PaketPage({
const odemeHatasi = hata === "token" || hata === "siparis";
return (
-
-
- {odemeHatasi ? (
-
+
+
+ {odemeHatasi ? (
+
+ Ödemen doğrulanamadı. Kartından çekim yapıldıysa kredilerin birkaç
+ dakika içinde otomatik tanımlanır; tanımlanmazsa aşağıdan tekrar
+ deneyebilirsin — çekim yapılmadıysa hiçbir ücret ödemedin.
+
+ ) : null}
+
+
+ Tek seferlik ödeme · Abonelik yok
+
+
+ İnsan danışmanın işini,{" "}
+ onda bir fiyatına
+
+
+ Tercih danışmanları bu dönemde 2.000–10.000 TL alıyor. KolayTercih
+ aynı işi gerçek YÖK Atlas verisiyle, dakikalar içinde yapar.
+
+
+
+
- Ödemen doğrulanamadı. Kartından çekim yapıldıysa kredilerin birkaç
- dakika içinde otomatik tanımlanır; tanımlanmazsa aşağıdan tekrar
- deneyebilirsin — çekim yapılmadıysa hiçbir ücret ödemedin.
-
- ) : null}
-
-
- Tek seferlik ödeme · Abonelik yok
-
-
- İnsan danışmanın işini,{" "}
- onda bir fiyatına
-
-
- Tercih danışmanları bu dönemde 2.000–10.000 TL alıyor. KolayTercih
- aynı işi gerçek YÖK Atlas verisiyle, dakikalar içinde yapar.
-
-
-
-
- {/* Ana paket */}
-
-
-
- Tercih Dönemi Paketi
-
-
- {tl(URUNLER.paket.amountKurus)} TL
-
-
-
- {OZELLIKLER.map((o) => (
-
-
- {o.text}
-
- ))}
-
-
- {u ? (
- u.hasPaket ? (
-
-
- Paketin aktif —{" "}
-
- listeni oluştur
-
-
+ {/* Ana paket */}
+
+
+
+ Tercih Dönemi Paketi
+
+
+ {tl(URUNLER.paket.amountKurus)} TL
+
+
+
+ {OZELLIKLER.map((o) => (
+
+
+ {o.text}
+
+ ))}
+
+
+ {u ? (
+ u.hasPaket ? (
+
+
+ Paketin aktif —{" "}
+
+ listeni oluştur
+
+
+ ) : (
+
+ )
) : (
+
+ )}
+
+
+ iyzico güvenli ödeme · Kart bilgilerin bize hiç ulaşmaz ·{" "}
+
+ İade koşulları
+
+
- KolayTercih bir karar destek aracıdır; öneriler resmî YÖK Atlas verisine
- dayanır ancak yerleşme garantisi verilmez. Tercih listesinin nihai
- sorumluluğu adaya aittir. Sorun mu var?{" "}
-
- Bize yaz
-
- .
-
-
+
+ KolayTercih bir karar destek aracıdır; öneriler resmî YÖK Atlas
+ verisine dayanır ancak yerleşme garantisi verilmez. Tercih
+ listesinin nihai sorumluluğu adaya aittir. Sorun mu var?{" "}
+
+ Bize yaz
+
+ .
+
+
+
);
}
diff --git a/src/app/paket/satin-al-form.tsx b/src/app/paket/satin-al-form.tsx
index 5e490d6..141fa7d 100644
--- a/src/app/paket/satin-al-form.tsx
+++ b/src/app/paket/satin-al-form.tsx
@@ -1,7 +1,6 @@
"use client";
import { useActionState, useEffect } from "react";
-import { Loader2 } from "lucide-react";
import { toast } from "sonner";
import { Button } from "@/components/ui/button";
import { baslatOdeme, type OdemeBaslatDurum } from "./actions";
@@ -37,9 +36,6 @@ export function SatinAlForm({
}
variant={vurgulu ? "default" : "outline"}
>
- {pending ? (
-
- ) : null}
{pending ? "Ödeme sayfasına yönlendiriliyorsun…" : label}
diff --git a/src/app/sonuc/liste-paneli.tsx b/src/app/sonuc/liste-paneli.tsx
index 6881216..08d1d54 100644
--- a/src/app/sonuc/liste-paneli.tsx
+++ b/src/app/sonuc/liste-paneli.tsx
@@ -2,8 +2,9 @@
import { useMemo, useEffect, useRef, useState } from "react";
import Link from "next/link";
-import { FileText, Loader2, Lock, RefreshCcw } from "lucide-react";
+import { FileText, Lock, RefreshCcw } from "lucide-react";
import { Button } from "@/components/ui/button";
+import { Skeleton } from "@/components/ui/skeleton";
import { SohbetPopup } from "./sohbet-popup";
import { RaporListesi } from "@/components/rapor-listesi";
import { TercihHaritasi, type HaritaPin } from "@/components/tercih-haritasi";
@@ -305,16 +306,28 @@ function UretimGovdesi() {
ref={govdeRef}
tabIndex={-1}
aria-live="polite"
- className="mt-16 flex flex-col items-center justify-center gap-4 rounded-2xl border border-slate-200 bg-white py-16 text-center outline-none"
+ className="mt-16 rounded-2xl border border-slate-200 bg-white p-6 outline-none sm:p-8"
>
-
-
Listen hazırlanıyor
-
- {URETIM_MESAJLARI[mesajIdx]}
-
-
- Bu işlem yarım dakika kadar sürebilir, sayfayı kapatma.
-
+
+
Listen hazırlanıyor
+
+ {URETIM_MESAJLARI[mesajIdx]}
+
+
+ Bu işlem yarım dakika kadar sürebilir, sayfayı kapatma.
+
+
+
+ {/* Gelmekte olan tercih listesinin iskeleti */}
+