feat(v2): 9–10 Ekim çalışma ağacı — deneyim dili 1. dalga, PWA manifest, revizyon niyet modeli, listem/tadımlık bileşen denetimi

9–10 Ekim oturumlarının commit'lenmemiş işi tek parça alındı
(raporlar: docs/ekip-raporlari/2026-10-09, 2026-10-10):
- Landing deneyim dili 1. dalga: sayfa geçişi (ViewTransition), piksel morf/şerit,
  sorun sahneleri, adım akışı, sayan sayı, mobil menü, adım göstergesi, logoya tepki;
  DESIGN.md §11 ve AGENTS.md kuralları, tasarım denetimine yeni kurallar
- Tema: tema ikonu, D kısayolu, tema geçişi
- PWA: manifest.ts ve ikonlar
- Danışman: revizyon niyet modeli (OPENROUTER_NIYET_MODEL), sohbet geçmişi, soru API'si
- /listem ve /sonuc tadımlığı bileşen denetimi düzeltmeleri
- eslint: .venv-tts/ yok sayılır

tsc, eslint ve tasarım denetimi sıfır hata.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-10-11 00:34:29 +03:00
parent da0e9dff7a
commit aec8a2ad76
80 changed files with 4134 additions and 654 deletions

View File

@@ -1,11 +1,13 @@
"use client";
import { logoTepkisi } from "@/lib/logo-tepkisi";
import { useState } from "react";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { ArrowRight } from "lucide-react";
import { ArrowRight, Trophy } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { SayiRulo } from "@/components/ui/sayi-rulo";
import { SecimHaplari } from "@/components/ui/secim-haplari";
import {
Dialog,
@@ -22,7 +24,8 @@ import { olay, siraKovasi } from "@/lib/analitik";
import { onbellekliJsonGetir } from "@/lib/istek-cache";
import { useTercihProfili } from "@/features/liste/hooks/use-tercih-profili";
import type { SihirbazFacetleri } from "@/types/yokatlas";
import { sonucHref, type SihirbazSecimleri } from "@/features/sihirbaz/sihirbaz-sabitler";
import { PUAN_TURU_ETIKET, sonucHref, type SihirbazSecimleri } from "@/features/sihirbaz/sihirbaz-sabitler";
import { ListeDurumuSatiri } from "@/features/liste/components/liste-durumu-satiri";
import { tercihProfiliYaz } from "@/features/sihirbaz/sihirbaz-profil";
// lib/db sunucu tarafı; etiketler client bundle'a sızmasın diye burada.
@@ -99,6 +102,8 @@ export function HeroForm() {
if (!sira) return;
const profil = { sira, tur, secimler };
tercihProfiliYaz(profil);
// Üst çubuktaki logo kürsüye döner (DESIGN.md §4.34).
logoTepkisi("sira");
setModalAcik(false);
router.push(sonucHref(girisli ? { sihirbaz: "1", kaynak: "hero" } : { hazir: "1" }));
}
@@ -108,16 +113,27 @@ export function HeroForm() {
if (kayitliProfil) {
return (
<div className="flex w-full max-w-md flex-col items-center">
{/* Üst çubuktaki sıralama hapının iri hâli (DESIGN.md §1.1 "sayı
kahramandır", §11.2 "durumu yansıt"): site seni tanıyor. */}
<p className="mb-5 flex items-center gap-2.5 font-heading text-3xl leading-none font-bold tracking-tight text-slate-900 sm:text-4xl">
<Trophy className="size-6 shrink-0 text-orange-500 sm:size-7" aria-hidden />
<SayiRulo deger={kayitliProfil.sira} />
<span className="font-sans text-base font-semibold tracking-normal text-slate-500">
· {PUAN_TURU_ETIKET[kayitliProfil.tur] ?? kayitliProfil.tur}
</span>
</p>
<Button
asChild
size="lg"
className="w-full cursor-pointer bg-orange-500 text-white transition-colors duration-200 hover:bg-orange-600 sm:w-auto"
variant="cta"
className="w-full sm:w-auto"
>
<Link href={sonucHref()}>
Üniversitelere göz at
<ArrowRight className="size-4" aria-hidden />
</Link>
</Button>
<ListeDurumuSatiri varyant="hero" />
</div>
);
}
@@ -161,9 +177,9 @@ export function HeroForm() {
type="submit"
size="lg"
disabled={yukleniyor}
className="cursor-pointer bg-orange-500 text-white transition-colors duration-200 hover:bg-orange-600"
variant="cta"
>
Yapay Zeka listemi kur
{yukleniyor ? "Hazırlanıyor…" : "Yapay Zeka listemi kur"}
<ArrowRight className="size-4" aria-hidden />
</Button>
</form>