diff --git a/data/app.db b/data/app.db index e082232..8ec2fc3 100644 Binary files a/data/app.db and b/data/app.db differ diff --git a/src/app/giris/page.tsx b/src/app/giris/page.tsx index bac56af..ea4b23e 100644 --- a/src/app/giris/page.tsx +++ b/src/app/giris/page.tsx @@ -2,6 +2,7 @@ import type { Metadata } from "next"; import Link from "next/link"; import { redirect } from "next/navigation"; import { getSession } from "@/lib/session"; +import { PixelCorner } from "@/components/pixel-decor"; import { GirisForm } from "./giris-form"; import { GirisBaslik } from "./giris-baslik"; @@ -27,24 +28,35 @@ export default async function GirisPage({ return (
-
- -

- {funnel ? ( - <> - Seçimlerin hazır — giriş yap,{" "} - 5 deneme kredinle listen - hemen üretilsin. - - ) : ( - <> - Kayıt olduğunda{" "} - 5 deneme kredisi hesabına - tanımlanır — AI danışmana ücretsiz soru sorabilirsin. - - )} -

- +
+
+ +

+ {funnel ? ( + <> + Seçimlerin hazır — giriş yap,{" "} + 5 deneme kredinle listen + hemen üretilsin. + + ) : ( + <> + Kayıt olduğunda{" "} + 5 deneme kredisi{" "} + hesabına tanımlanır — AI danışmana ücretsiz soru sorabilirsin. + + )} +

+ +
+
+ + + + +

Giriş yaparak verilerinin tercih önerileri üretmek amacıyla{" "} diff --git a/src/app/gizlilik/page.tsx b/src/app/gizlilik/page.tsx index 3326980..f98349a 100644 --- a/src/app/gizlilik/page.tsx +++ b/src/app/gizlilik/page.tsx @@ -1,7 +1,6 @@ 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", @@ -10,8 +9,7 @@ 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ı @@ -73,7 +71,6 @@ export default function GizlilikPage() {

-

- +
); } diff --git a/src/app/iletisim/page.tsx b/src/app/iletisim/page.tsx index 02c380a..382795a 100644 --- a/src/app/iletisim/page.tsx +++ b/src/app/iletisim/page.tsx @@ -1,7 +1,6 @@ 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", @@ -9,8 +8,7 @@ export const metadata: Metadata = { export default function IletisimPage() { return ( - -
+

İletişim

@@ -30,7 +28,6 @@ export default function IletisimPage() { 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 1d182bd..22e2a9e 100644 --- a/src/app/kosullar/page.tsx +++ b/src/app/kosullar/page.tsx @@ -1,7 +1,6 @@ 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", @@ -10,8 +9,7 @@ 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ı @@ -80,7 +78,6 @@ export default function KosullarPage() {

-

- +
); } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 6376c8f..7db1dfd 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -7,6 +7,9 @@ import { ListeCekmecesi } from "@/components/manuel-liste/liste-cekmecesi"; import { HeaderGate } from "@/components/header-gate"; import { ProgressiveBlur } from "@/components/ui/skiper-ui/skiper41"; import { DevPanel } from "@/components/dev/dev-panel"; +import { ScrollFlow } from "@/components/scroll-flow"; +import { PagePixelLayer } from "@/components/page-pixel-layer"; +import { ConsoleAsr } from "@/components/console-asr"; import "./globals.css"; const calSans = Cal_Sans({ @@ -54,6 +57,8 @@ export default function RootLayout({ className={`${calSans.variable} ${clarityCity.variable} ${geistMono.variable} ${bricolage.variable} h-full antialiased`} > + + {/* Site geneli progressive blur — üst ve alt */}
- {children} + + {children} + {/* Manuel 24'lük liste çekmecesi + "+" uçuş katmanı (navbar'dan açılır) */} diff --git a/src/app/listem/page.tsx b/src/app/listem/page.tsx index 23bb26c..d53d8af 100644 --- a/src/app/listem/page.tsx +++ b/src/app/listem/page.tsx @@ -24,6 +24,7 @@ import type { RaporParams } from "@/lib/rapor-havuzu"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { RaporListesi } from "@/components/rapor-listesi"; +import { ViewportPortal } from "@/components/viewport-portal"; import { raporMaskele, ACIK_SATIR } from "@/lib/rapor-maske"; import { SohbetClient } from "./sohbet-client"; import { RevizyonKutusu } from "./revizyon-kutusu"; @@ -322,13 +323,15 @@ export default async function ListemPage({ {/* Mobilde sohbet sağ rayla birlikte en alta düşer; yüzen kısayol kullanıcıyı 24 satırı kaydırmadan danışmana ulaştırır. */} - - - Danışmana sor - + + + + Danışmana sor + +
); } diff --git a/src/app/page.tsx b/src/app/page.tsx index e7b1f86..887021a 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -11,9 +11,9 @@ import { } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; +import { HeroFocusButton } from "@/components/hero-focus-button"; 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 { @@ -24,7 +24,6 @@ import { } from "@/components/pixel-decor"; import { URUNLER } from "@/lib/credits"; import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; import { Accordion, AccordionContent, @@ -166,8 +165,10 @@ function ComparisonCell({ value }: { value: boolean | string }) { export default function Home() { return ( -
- +
{/* Hero */}
@@ -193,7 +194,7 @@ export default function Home() { 2026 YKS tercih dönemi açık -

+

Dört yıllık geleceğini
48 saatlik panikle @@ -481,7 +482,7 @@ export default function Home() { value={faq.question} className="last:border-b-0" > - + {faq.question} @@ -522,13 +523,7 @@ export default function Home() { Sıralamanı gir, yapay zekâ danışmanın veriyle konuşsun. Tercih dönemi bitmeden yerini al.

- +

@@ -571,7 +566,6 @@ export default function Home() {
- ); } diff --git a/src/app/paket/page.tsx b/src/app/paket/page.tsx index 690113c..abc9ac0 100644 --- a/src/app/paket/page.tsx +++ b/src/app/paket/page.tsx @@ -14,7 +14,6 @@ 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 = { @@ -53,8 +52,7 @@ export default async function PaketPage({ const odemeHatasi = hata === "token" || hata === "siparis"; return ( -
- +
{odemeHatasi ? (
-
); } diff --git a/src/app/sonuc/sihirbaz-cagri-karti.tsx b/src/app/sonuc/sihirbaz-cagri-karti.tsx index 585a488..ba7a23a 100644 --- a/src/app/sonuc/sihirbaz-cagri-karti.tsx +++ b/src/app/sonuc/sihirbaz-cagri-karti.tsx @@ -8,6 +8,7 @@ import { animate } from "motion"; import { AnimatePresence, motion, useReducedMotion } from "motion/react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; +import { ViewportPortal } from "@/components/viewport-portal"; import type { SihirbazFacetleri } from "@/lib/db"; import { SIHIRBAZ_STORAGE_KEY, @@ -446,54 +447,56 @@ export function SihirbazBolumu({
{/* Sabit alt çağrı kartı — liste/panel yokken ve kart kapatılmadıysa */} - {monteEdildi && !panelde && !kartGizle && !acik ? ( -
-
-
-

- {girisBekliyor - ? "Seçimlerin kayıtlı — AI listen hazır bekliyor" - : "3 adımda 24 tercihlik listen"} -

-

- {girisBekliyor - ? "Ücretsiz giriş yap, 5 deneme kredinle listen otomatik kurulsun." - : "Sıralamana uygun bölümleri seç, yapay zekâ listeni kursun."} -

+ + {monteEdildi && !panelde && !kartGizle && !acik ? ( +
+
+
+

+ {girisBekliyor + ? "Seçimlerin kayıtlı — AI listen hazır bekliyor" + : "3 adımda 24 tercihlik listen"} +

+

+ {girisBekliyor + ? "Ücretsiz giriş yap, 5 deneme kredinle listen otomatik kurulsun." + : "Sıralamana uygun bölümleri seç, yapay zekâ listeni kursun."} +

+
+ {girisBekliyor ? ( + + ) : ( + + )} +
- {girisBekliyor ? ( - - ) : ( - - )} -
-
- ) : null} + ) : null} + {/* Üretim başladığında modalı kaldır; yeni panelin geçişini Motion üstlenir ve odağı panel içeriğine taşır. */} diff --git a/src/app/sonuc/sohbet-popup.tsx b/src/app/sonuc/sohbet-popup.tsx index 25b6fda..9ffcf6e 100644 --- a/src/app/sonuc/sohbet-popup.tsx +++ b/src/app/sonuc/sohbet-popup.tsx @@ -8,6 +8,7 @@ import { useEffect, useState } from "react"; import { MessageCircleMore, X } from "lucide-react"; import { AnimatePresence, motion, useReducedMotion } from "motion/react"; import { SohbetClient } from "@/app/listem/sohbet-client"; +import { ViewportPortal } from "@/components/viewport-portal"; export function SohbetPopup({ kredi }: { kredi: number }) { const [acik, setAcik] = useState(false); @@ -23,7 +24,7 @@ export function SohbetPopup({ kredi }: { kredi: number }) { }, [acik]); return ( - <> + {acik ? ( - + ); } diff --git a/src/components/console-asr.tsx b/src/components/console-asr.tsx new file mode 100644 index 0000000..f20b684 --- /dev/null +++ b/src/components/console-asr.tsx @@ -0,0 +1,33 @@ +"use client"; + +import { useEffect } from "react"; + +let hasPlayed = false; + +const consoleMessage = [ + "%cبِسْمِ اللَّهِ الرَّحْمٰنِ الرَّحِيمِ", + "", + "وَالْعَصْرِۙ اِنَّ الْاِنْسَانَ لَف۪ي خُسْرٍۙ", + "اِلَّا الَّذ۪ينَ اٰمَنُوا وَعَمِلُوا الصَّالِحَاتِ", + "وَتَوَاصَوْا بِالْحَقِّ وَتَوَاصَوْا بِالصَّبْرِ", + "", + "Rahmân ve Rahîm olan Allah’ın adıyla.", + "", + "Asra yemîn olsun ki,", + "İnsan gerçekten ziyândadır.", + "Ancak iman edip sâlih ameller yapanlar, birbirlerine hakkı tavsiye", + "edenler ve birbirlerine sabretmeyi öğütleyenler müstesnâ!", +].join("\n"); + +export function ConsoleAsr() { + useEffect(() => { + if (hasPlayed) return; + hasPlayed = true; + + window.setTimeout(() => { + console.log(consoleMessage, "font-size:16px"); + }, 250); + }, []); + + return null; +} diff --git a/src/components/dev/dev-panel.tsx b/src/components/dev/dev-panel.tsx index 9be480b..e5dec28 100644 --- a/src/components/dev/dev-panel.tsx +++ b/src/components/dev/dev-panel.tsx @@ -200,7 +200,10 @@ export function DevPanel() {
-
+
{/* Oturum */}

diff --git a/src/components/hero-focus-button.tsx b/src/components/hero-focus-button.tsx new file mode 100644 index 0000000..d8b94f9 --- /dev/null +++ b/src/components/hero-focus-button.tsx @@ -0,0 +1,26 @@ +"use client"; + +import { Button } from "@/components/ui/button"; + +export function HeroFocusButton() { + function handleClick() { + const input = document.getElementById("siralama"); + + if (input instanceof HTMLInputElement) { + input.focus({ preventScroll: true }); + } + + window.scrollTo({ top: 0, behavior: "smooth" }); + } + + return ( + + ); +} diff --git a/src/components/hero-form.tsx b/src/components/hero-form.tsx index da467e8..2619cd9 100644 --- a/src/components/hero-form.tsx +++ b/src/components/hero-form.tsx @@ -132,7 +132,7 @@ export function HeroForm() { // flex-1 yalnızca yatay dizilimde (sm+): mobilde form flex-col olduğu // için flex-1 inputun yüksekliğini eziyordu. Mobilde geniş padding // + büyük yazı; sm ve üzeri eski görünüm. - className="h-12 bg-background px-5 text-lg sm:flex-1 sm:px-2.5 sm:text-base" + className="h-14 bg-background px-6 py-3 text-lg sm:h-12 sm:flex-1 sm:px-2.5 sm:py-1 sm:text-base" />