diff --git a/docs/tasarim/DESIGN.md b/docs/tasarim/DESIGN.md
index 25187ed..adfed78 100644
--- a/docs/tasarim/DESIGN.md
+++ b/docs/tasarim/DESIGN.md
@@ -222,7 +222,7 @@ shadcn `Input`, `Select`, `Textarea`, `Slider`. Etiket her alanda; hata mesajı
### 4.7 İkonlar
Yalnızca `lucide-react`. Boyut: `size-4` buton/satır içi (varsayılan), `size-5` ikon kutusu, `size-3.5` küçük çip, `size-6` üstü yalnızca boş durum. Dekoratif ikon `aria-hidden`; tek başına ikon buton `aria-label` ya da `sr-only` metin taşır. Emoji ikon olarak kullanılmaz.
-### 4.8 Özet kartı — `OzetKart`, `universite-icerik.tsx`
+### 4.8 Özet kartı — `OzetKart`, `src/components/ozet-kart.tsx`
Apple Fitness özet kartının sitenin ölçüleriyle hâli. Sayfada **en çok dört** tane (harita
yanındaki 2×2).
@@ -239,7 +239,11 @@ yanındaki 2×2).
ikon kutusu `flex size-8 shrink-0 items-center justify-center rounded-xl bg-primary/10 sm:size-10`.
- `dl` anlamı için `dt` (başlık) DOM'da önce gelir, görsel sıra `order-*` ile kurulur.
- Telefonda kart iç genişliği ~131 px: en uzun sayı ("13.889", 36 px'te ~90 px) + 32 px ikon
- sığar. Daha uzun sayı gelecekse önce ölç (§9.2), sonra yaz.
+ sığar. Daha uzun sayı gelecekse önce ölç (§9.2), sonra yaz. Ölçülen sınır: 36 px'te
+ "1.618.988" 123 px — ikonun altına girer. 6–7 haneli sayı birimle kısalır: 245.300 →
+ `245` + birim `bin`, 1.618.988 → `1,62` + birim `milyon` (bölüm sayfasındaki `kartSayisi`).
+- Kullanıldığı yerler: üniversite ve bölüm sayfası (bölümde dört kart: Program, Devlet,
+ Vakıf, En iyi sıralama; `grid grid-cols-2 gap-4 lg:grid-cols-4`, haritası olmadığı için).
- Tıklanabilir kart (ör. Türkiye sırası → sıralama sayfası): kartın tamamı link olur
(`after:absolute after:inset-0` gerilmiş link), iç kaynak linki `relative z-10` ile üstte
kalır; hover §2.1.
@@ -341,7 +345,14 @@ opaklık.
adın altındaki satıra iner: `mt-1.5 flex items-center gap-1.5 text-sm text-slate-500 sm:hidden`
içinde değer `font-semibold text-slate-900`.
- Tür çipi: `rounded-full bg-slate-100 px-2.5 py-0.5 text-xs font-semibold text-slate-700`.
-- Satır butonları varsayılan `size-11` (44 px); `size-8` gibi küçültme verilmez.
+- Satır butonları varsayılan `size-11` (44 px); `size-8` gibi küçültme verilmez. Telefonda
+ iki buton alt alta durur (`inline-flex flex-col items-center gap-2 sm:flex-row`, sütun
+ `w-14 sm:w-28`): yan yana 96 px yiyip adı 157 px'e sıkıştırıyordu, alt alta 273 px kalıyor
+ (24 Eyl 2026 ölçümü).
+- Satırda logo varsa (bölüm sayfası) `UniLogo boy="sm"` adın solunda, `items-start`.
+- Program varyantı ("… (İngilizce) (Burslu)") adın altında ayrı satır
+ `mt-0.5 block text-sm leading-snug text-slate-600`; tür çipine yapıştırılıp kesilmez.
+- Tür çipi devlet/vakıf için de aynı slate çip; vakıf violet değildir (§2.2).
- Tablo başlığı `h-12 text-sm font-semibold text-slate-500`; hücre dolgusu `py-4 pl-4 sm:pl-5`.
## 5. Yerleşim
@@ -378,6 +389,11 @@ kartlarla aynı hizada:
yorar), form alanları, uzun rehber metni.
- Alt sayfa (§4.10) içeriği her ekranda ortalıdır.
+### 5.2.1 Sayfalama — `Sayfalama`, `sayfalama.tsx`
+Haplar `h-11` (44 px), hover §2.1. Telefonda (sm altı) tek satır kalsın diye yalnız Önceki ·
+aktif sayfa · Sonraki görünür; diğer numaralar `hidden sm:inline-flex` ile HTML'de durur
+(tarayıcı botları tüm sayfaları görür). 375 px'te 7 sayfalık şerit iki satıra kırılıyordu.
+
### 5.3 Verimli ve havadar
- İlişkili öğeler yan yana dizilir (iki sütun) — tek sütunda alt alta uzayan panel yapılmaz.
- Yan yana dizmek "hepsini tek şeride sıkıştırmak" değildir: 23 Eyl'de denenen yatay "bilgi
@@ -470,7 +486,11 @@ Bu dilde sorunların çoğu koddan görünmez (taşma, sığma, hizalanma). Tasa
### 9.4 Site taraması için denetim uyarıları
`pnpm tasarim:denetim` bu dilin eski izlerini **uyarı** olarak listeler (lint'i kırmaz, dönüşüm
listesidir): `minik-yazi` (10–11 px), `buyuk-harf-etiket` (uppercase + tracking-wide),
-`mavi-hover` (§2.1; liste satırı adı istisna), `iri-sayi-tabular` (Cal Sans + tabular-nums).
+`mavi-hover` (§2.1), `iri-sayi-tabular` (Cal Sans + tabular-nums).
+`mavi-hover` §4.15 kanonik liste satırı adını (`text-base font-semibold leading-snug` +
+`hover:text-primary hover:underline` aynı satırda) kendiliğinden atlar — istisna uyarı
+vermez (Bilal'in kararı, 24 Eyl 2026). Eski `truncate text-sm` adlar yine uyarır; önce §4.15'e
+çevrilir.
Bir ekranı dönüştüren ajan o ekrandaki uyarıları sıfırlar ya da neden kaldığını yazar.
### 9.5 Bitirmeden
diff --git a/scripts/tasarim-denetim.ts b/scripts/tasarim-denetim.ts
index 810ead0..96dbabb 100644
--- a/scripts/tasarim-denetim.ts
+++ b/scripts/tasarim-denetim.ts
@@ -191,7 +191,20 @@ const KURALLAR: Kural[] = [
ad: "mavi-hover",
seviye: "uyari",
mesaj: "Hover rengi tek turuncu (orange-500); liste satırındaki ad linkiyse istisna, mavi kalır (DESIGN.md §2.1)",
- bul: regexKurali(/\b(?:group-)?hover:(?:text|border|shadow)-primary\b/),
+ // §2.1 istisnası: §4.15 kanonik liste satırı adı (sarar, text-base
+ // font-semibold leading-snug + hover:text-primary hover:underline) mavi
+ // kalır. Eski truncate/text-sm adlar istisnaya girmez — önce §4.15'e
+ // çevrilir. (Bilal'in kararı, 24 Eyl 2026: istisna uyarı vermesin.)
+ bul: (icerik) =>
+ regexKurali(/\b(?:group-)?hover:(?:text|border|shadow)-primary\b/)(icerik).filter((e) => {
+ const bas = icerik.lastIndexOf("\n", e.index) + 1;
+ const son = icerik.indexOf("\n", e.index);
+ const satir = icerik.slice(bas, son === -1 ? undefined : son);
+ return !(
+ /\btext-base font-semibold leading-snug\b/.test(satir) &&
+ /\bhover:text-primary hover:underline\b/.test(satir)
+ );
+ }),
},
{
ad: "iri-sayi-tabular",
diff --git a/src/components/ozet-kart.tsx b/src/components/ozet-kart.tsx
new file mode 100644
index 0000000..4a3ec4d
--- /dev/null
+++ b/src/components/ozet-kart.tsx
@@ -0,0 +1,58 @@
+import type { ReactNode } from "react";
+import type { LucideIcon } from "lucide-react";
+
+/**
+ * Özet kartı (DESIGN.md §4.8 — Apple Fitness özet kartlarının düzeni,
+ * sitenin ölçüleriyle): kartın en baskın öğesi iri sayı; ikonu sağında,
+ * küçük ikon kutusunda (§4.4 ikon kutusunun küçük hali). Altında başlık ve
+ * tek satır açıklama. Telefonda kart iç genişliği ~131 px: en uzun sayı
+ * ("13.889", text-4xl ≈ 90 px) + size-8 ikon kutusu sığar; sm'den itibaren
+ * text-5xl. Üniversite ve bölüm sayfalarının tek kaynağı. `ek` verilirse
+ * açıklamanın altında durur (ör. Türkiye sırasındaki piksel şeridi). dl
+ * anlamı için dt DOM'da önce gelir, görsel sıra `order` ile kurulur; çağıran
+ * kartları bir `
)}
-
- {/* Tek sayfada çıkan ziyaretçi alttaki karta inmiyor: kompakt sıra girişi
- başlık bloğunun hemen altında, listenin üstünde. Alttaki kart kalır. */}
-
-
-
-
-
-
-
- Üniversite programları
-
-
- {sayi(tumProgramlar.length)} program
-
+ {/* Tek sayfada çıkan ziyaretçi alttaki karta inmiyor: kompakt sıra
+ girişi özet paragrafın hemen altında, listenin üstünde. Alttaki
+ kart kalır. */}
+
+
- ({
- ...program,
- universiteSlug: uniSlugFromAd(program.universite),
- }))}
- bazAd={bolum.ad}
- tabanYol={`/bolum/${slug}`}
- sayfa={sayfa}
- />
-
-
+ {/* Sayfada en çok dört özet sayı (DESIGN.md §1.1, §4.8). Derin
+ sayfalarda tekrar edilmez — üniversite sayfasıyla aynı. */}
+ {ilkSayfa ? (
+
+
+ 0
+ ? `${sayi(devletUni.size)} üniversitede`
+ : "bu bölümde yok"
+ }
+ />
+ 0
+ ? `${sayi(vakifUni.size)} üniversitede`
+ : "bu bölümde yok"
+ }
+ />
+
+
+ ) : null}
- {/* Üniversite sayfasıyla aynı konum ve aynı kart: liste + sayfalama altı */}
-
-
-
+
+
+
+
+
+ Üniversite programları
+
+
+ {sayi(tumProgramlar.length)} program, taban sırasına göre
+