+
{risk ? (
-
+
+
+ {RISK_ETIKET[risk]}
+
) : null}
diff --git a/src/features/liste/components/tercih-haritasi-lazy.tsx b/src/features/liste/components/tercih-haritasi-lazy.tsx
index d6f1a97..7ef9125 100644
--- a/src/features/liste/components/tercih-haritasi-lazy.tsx
+++ b/src/features/liste/components/tercih-haritasi-lazy.tsx
@@ -4,6 +4,10 @@
// çizileceği zaman insin: dynamic + ssr'siz. İskelet, haritanın gerçek
// oranını (viewBox 1050 × 447, bkz. tercih-haritasi TAM_GORUNUM) rezerve
// eder — chunk gelince yerleşim zıplamaz.
+//
+// motion-reduce:animate-none: iskelet artık /sonuc'ta katlamanın üstünde
+// duruyor; hareketi azaltılmış isteyen kullanıcıya sürekli, durdurulamaz
+// nabız gösterilmez.
import dynamic from "next/dynamic";
@@ -11,7 +15,7 @@ export function HaritaIskeleti() {
return (
);
}
diff --git a/src/features/liste/components/yurtdisi-haritalar-lazy.tsx b/src/features/liste/components/yurtdisi-haritalar-lazy.tsx
index fc69096..bf13c92 100644
--- a/src/features/liste/components/yurtdisi-haritalar-lazy.tsx
+++ b/src/features/liste/components/yurtdisi-haritalar-lazy.tsx
@@ -5,7 +5,14 @@
import dynamic from "next/dynamic";
+// loading: chunk inene kadar şeridin yüksekliğini rezerve eder. Türkiye
+// haritası /sonuc'un en üstüne çıktığı için bu şerit de katlamanın üstünde;
+// yer tutucusuz hâlinde yoktan belirip altındaki her şeyi iterdi.
+// h-26 (104 px) tek satırlık gerçek yüksekliktir: figür w-52 (208 px),
+// svg oranı 1050×447 → 88,6 px, figcaption text-xs → 16 px. Kap mt-3'ü
+// bileşenin kendi kökündekiyle aynı (yurtdisi-haritalar.tsx). Birden çok
+// ülke alt satıra kayarsa fark kalır — sunucu ülke sayısını bilemez.
export const YurtdisiHaritalarLazy = dynamic(
() => import("./yurtdisi-haritalar").then((m) => m.YurtdisiHaritalar),
- { ssr: false },
+ { ssr: false, loading: () =>
},
);
diff --git a/src/features/liste/liste-dogrula.ts b/src/features/liste/liste-dogrula.ts
index 65674ce..2396a66 100644
--- a/src/features/liste/liste-dogrula.ts
+++ b/src/features/liste/liste-dogrula.ts
@@ -6,6 +6,16 @@ import type { RiskSeviyesi } from "@/lib/risk";
export const MANUEL_LISTE_MAX = 24;
+/**
+ * Listenin sunucu aynası — yalnızca ELEMAN SAYISI taşır, hiçbir kişisel veri
+ * ya da program kimliği taşımaz. Liste localStorage'ta yaşadığı için sunucu
+ * snapshot'ı her zaman boştur; /sonuc bu çerezi okuyup haritaya hidrasyondan
+ * önce tam ölçülü yer ayırabilsin diye var (bkz. sonuc/page.tsx).
+ * Sabit burada durur çünkü bu dosya client store ile sunucu tarafının ortak
+ * zemini; store'un kendisi "use client".
+ */
+export const LISTE_SAYI_CEREZ_ADI = "kolaytercih.liste-sayi";
+
export type ManuelKaynak = "sonuc" | "bolum" | "universite";
export type ManuelTercih = {
diff --git a/src/features/liste/liste-store.ts b/src/features/liste/liste-store.ts
index 26167dc..5464c92 100644
--- a/src/features/liste/liste-store.ts
+++ b/src/features/liste/liste-store.ts
@@ -14,6 +14,7 @@ import {
} from "@/features/sihirbaz/sihirbaz-sabitler";
import { tercihProfiliOku } from "@/features/sihirbaz/sihirbaz-profil";
import {
+ LISTE_SAYI_CEREZ_ADI,
MANUEL_LISTE_MAX,
dogrula,
type ManuelKaynak,
@@ -39,10 +40,23 @@ function yayinla() {
for (const cb of dinleyiciler) cb();
}
+/**
+ * Sunucu aynası: listenin yalnızca UZUNLUĞU çereze yazılır (kişisel veri yok).
+ * /sonuc bunu okuyup haritaya hidrasyondan önce tam ölçülü yer ayırır; yoksa
+ * kayıtlı listesi olan ziyaretçide harita sonradan belirip sayfayı iterdi.
+ * Öznitelikler profilCerezineYaz ile birebir aynı (sihirbaz-profil.ts).
+ */
+function sayiCereziniYaz(n: number) {
+ if (typeof document === "undefined") return;
+ const guvenli = window.location.protocol === "https:" ? "; secure" : "";
+ document.cookie = `${LISTE_SAYI_CEREZ_ADI}=${n}; path=/; max-age=31536000; samesite=lax${guvenli}`;
+}
+
function kaydet() {
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(liste));
} catch {}
+ sayiCereziniYaz(liste.length);
}
function yukle() {
@@ -52,6 +66,10 @@ function yukle() {
const ham = localStorage.getItem(STORAGE_KEY);
if (ham) liste = dogrula(JSON.parse(ham));
} catch {}
+ // Çerezi her açılışta gerçek uzunlukla tazele: yeni dağıtımdan sonra ilk
+ // ziyarette çerezi doğurur, localStorage silinmiş ama çerez kalmış durumda
+ // da 0 yazıp /sonuc'un boşuna yer ayırmasını engeller.
+ sayiCereziniYaz(liste.length);
// Profilsiz + ile eklenenlerin riski null'dır. Profil sonradan hangi yoldan
// yazılırsa yazılsın (kapı, hero/CTA formu, sihirbaz, giriş senkronu) riskler
// dolsun: açılışta bir kez, sonra her profil değişiminde.
@@ -62,6 +80,7 @@ function yukle() {
if (e.key !== STORAGE_KEY) return;
try {
liste = e.newValue ? dogrula(JSON.parse(e.newValue)) : [];
+ sayiCereziniYaz(liste.length);
yayinla();
} catch {}
});
@@ -87,6 +106,20 @@ export function useManuelListe(): ManuelTercih[] {
);
}
+/**
+ * Store'un client'ta hidre olup olmadığı: sunucu snapshot'ı false, hidrasyondan
+ * sonra true. `liste` ile aynı anda flip eder (ikisi de abone içindeki
+ * yukle()'den doğar), bu yüzden "boş liste" ile "henüz okunmadı" ayrımı
+ * gereken yerlerde tek render'da tutarlıdır — bkz. ManuelHarita.
+ */
+export function useListeHidreMi(): boolean {
+ return useSyncExternalStore(
+ abone,
+ () => yuklendi,
+ () => false,
+ );
+}
+
export function useCekmeceAcik(): boolean {
return useSyncExternalStore(
abone,
diff --git a/src/features/odeme/components/odeme-kromu.tsx b/src/features/odeme/components/odeme-kromu.tsx
index 12689ba..9431cbd 100644
--- a/src/features/odeme/components/odeme-kromu.tsx
+++ b/src/features/odeme/components/odeme-kromu.tsx
@@ -42,7 +42,7 @@ export function OdemeUstSerit() {
diff --git a/src/features/odeme/components/odeme-sonuc-karti.tsx b/src/features/odeme/components/odeme-sonuc-karti.tsx
index 2a872e3..a7911a5 100644
--- a/src/features/odeme/components/odeme-sonuc-karti.tsx
+++ b/src/features/odeme/components/odeme-sonuc-karti.tsx
@@ -138,7 +138,7 @@ export async function OdemeSonucKarti({ siparis }: { siparis?: string }) {
- Tekrar dene
+ Tekrar dene
);
diff --git a/src/features/odeme/components/paket-gorunum-olayi.tsx b/src/features/odeme/components/paket-gorunum-olayi.tsx
index 8d9a172..032ed8b 100644
--- a/src/features/odeme/components/paket-gorunum-olayi.tsx
+++ b/src/features/odeme/components/paket-gorunum-olayi.tsx
@@ -11,7 +11,38 @@ import { useEffect } from "react";
import { olayBirKez } from "@/lib/analitik";
// Serbest metin analitiğe sızmasın: bilinmeyen değerler "diger"e düşer.
-const KAYNAKLAR = ["kilit", "kredi_bitti", "nav"] as const;
+// Yeni bir /paket linki eklerken değerini önce buraya yaz, sonra href'e koy —
+// listede olmayan her kaynak "diger"e düşer ve yüzey görünmez kalır.
+//
+// SERİ KIRILMASI: liste 3'ten 13 değere çıktığı için tekilleştirme anahtarı
+// da (aşağıda `kaynak`) çeşitlendi; `paket_goruntulendi`nin oturum başına
+// atılabilme tavanı 4'ten 14'e çıktı ve "diger" kovası artık yalnız gerçekten
+// bilinmeyen yüzeyleri taşıyor (eskiden 10 bilinen yüzey de oradaydı).
+// Bu tarihten önceki/sonraki toplamlar ve "diger" payı karşılaştırılamaz.
+const KAYNAKLAR = [
+ // Kilitli liste satırı / kilit kartı (`listem-govde`)
+ "kilit",
+ // Üretimde kredi yetmedi (`liste-uretici`)
+ "kredi_bitti",
+ // Üst menü (`user-nav`)
+ "nav",
+ // Ana sayfa fiyat bölümü: paket kartı ve kredi (topup) kartı
+ "fiyat_paket",
+ "fiyat_kredi",
+ // Koşullar metnindeki "paket sayfasında" linki
+ "kosullar",
+ // "Tercihlerin değişmiş" modalı: aksiyon satırı / kredi-yetersiz satırı
+ "tercih_degisti",
+ "tercih_degisti_yetersiz",
+ // Danışman sohbeti: başlıktaki kredi rozeti, kredi bitti bandı, son krediler
+ // uyarısı
+ "danisman_rozet",
+ "danisman_kredi_bitti",
+ "danisman_kredi_az",
+ // Ödeme akışı: checkout şeridindeki geri linki, başarısız sonuç kartı
+ "odeme_geri",
+ "odeme_hata",
+] as const;
export function PaketGorunumOlayi() {
useEffect(() => {
diff --git a/src/features/rapor/components/rapor-listesi.tsx b/src/features/rapor/components/rapor-listesi.tsx
index 0a59dc7..16db174 100644
--- a/src/features/rapor/components/rapor-listesi.tsx
+++ b/src/features/rapor/components/rapor-listesi.tsx
@@ -40,8 +40,8 @@ import {
import type { Dilim } from "@/lib/rapor-havuzu";
// Risk renk dili: yeşil = güvenli, sarı = az riskli, kırmızı = riskli.
-// Nokta hiçbir yerde tek başına durmaz; yanındaki etiket dar ekranda sr-only
-// olarak kalır (renk tek başına anlam taşımaz).
+// Nokta hiçbir yerde tek başına durmaz; yanındaki etiket her ekran
+// genişliğinde yazılı durur (renk tek başına anlam taşımaz).
const RISK_STIL: Record = {
riskli: { nokta: "bg-red-500", icon: Rocket },
"az-riskli": { nokta: "bg-amber-500", icon: Scale },
@@ -264,9 +264,7 @@ export function RaporListesi({
className={`size-2.5 shrink-0 rounded-full ${stil.nokta}`}
aria-hidden
/>
-
- {RISK_ETIKET[risk]}
-
+ {RISK_ETIKET[risk]}
)}
diff --git a/src/features/rapor/components/sohbet-client.tsx b/src/features/rapor/components/sohbet-client.tsx
index 5e317a2..33d8bd3 100644
--- a/src/features/rapor/components/sohbet-client.tsx
+++ b/src/features/rapor/components/sohbet-client.tsx
@@ -348,7 +348,7 @@ export function SohbetClient({
) : null}
@@ -535,7 +535,7 @@ export function SohbetClient({
size="sm"
className="cursor-pointer bg-orange-500 text-white hover:bg-orange-600"
>
- Kredi yükle
+ Kredi yükle
) : (
@@ -543,7 +543,7 @@ export function SohbetClient({
{kredi <= 3 ? (
Son {kredi} kredin — bitse de listen ve sohbetin kaybolmaz;{" "}
-
+
kredi yükleyip
{" "}
kaldığın yerden devam edersin.
diff --git a/src/features/rapor/components/tadimlik-satiri.tsx b/src/features/rapor/components/tadimlik-satiri.tsx
index 7caa8ec..276b5b1 100644
--- a/src/features/rapor/components/tadimlik-satiri.tsx
+++ b/src/features/rapor/components/tadimlik-satiri.tsx
@@ -120,9 +120,11 @@ export function TadimlikSatiri({
const girisUrl = `/giris?callback=${encodeURIComponent(listemUretHref("tadimlik"))}`;
return (
- // first:mt-0 — /sonuc'ta bu main'in ilk DOM çocuğudur (harita
- // artık tablonun altında, üstte hiçbir kardeş yok; JSX yorumları düğüm
- // üretmez): main'in py-12'si tek başına yeterli üst boşluğu verir.
+ // first:mt-0 — /sonuc'ta harita bu 'ın ÜSTÜNDE durur ama yalnızca
+ // kayıtlı listesi olan ziyaretçide DOM'a girer (manuel-harita.tsx). Liste
+ // yoksa tadımlık main'in ilk DOM çocuğudur (JSX yorumları düğüm üretmez) ve
+ // main'in py-12'si tek başına yeterli üst boşluğu verir; harita varsa
+ // tadımlık ikinci çocuk olur ve bölüm ritmini veren mt-16'yı alır.
// Tadımlığın render edilmediği durumlarda (girişli kullanıcı, boş havuz)
// bu bileşen hiç dönmediği için kural ilk gerçek bölüme geçer.
diff --git a/src/features/rapor/components/tercih-degisti-modali.tsx b/src/features/rapor/components/tercih-degisti-modali.tsx
index 837dec3..1073ffd 100644
--- a/src/features/rapor/components/tercih-degisti-modali.tsx
+++ b/src/features/rapor/components/tercih-degisti-modali.tsx
@@ -297,7 +297,7 @@ export function TercihDegistiModali({
asChild
className="cursor-pointer bg-orange-500 text-white transition-[background-color,transform] duration-200 active:scale-[0.97] hover:bg-orange-600"
>
-
+
{hasPaket
? "Kredi yükle ve güncelle"
: "Paketi aktive et"}
@@ -349,7 +349,7 @@ function KrediYetersiz({
asChild
className="cursor-pointer bg-orange-500 text-white transition-[background-color,transform] duration-200 active:scale-[0.97] hover:bg-orange-600"
>
-
+
{hasPaket ? "Kredi yükle" : "Paketi aktive et"}
diff --git a/src/features/sihirbaz/components/sihirbaz-adimlar.tsx b/src/features/sihirbaz/components/sihirbaz-adimlar.tsx
index 5f3579c..71ca9fd 100644
--- a/src/features/sihirbaz/components/sihirbaz-adimlar.tsx
+++ b/src/features/sihirbaz/components/sihirbaz-adimlar.tsx
@@ -141,6 +141,25 @@ export function SihirbazAdimlar({
() => canliFacetler.iller.filter((i) => HARITA_ILLERI.has(i.il)),
[canliFacetler.iller],
);
+ // Huninin paydası: 1. adım hiçbir zaman "geçilmediği" için `adimaGit`ten
+ // atılamıyordu (orası yalnız ileri geçişleri sayar) ve `sihirbaz_adim{1}`
+ // hiç düşmüyordu — payda `sira_girildi`den türetilmek zorunda kalıyordu.
+ // Modal kapanınca bileşen unmount olduğu için mount = "1. adım görüldü";
+ // 1→2→1→2 gidip gelmek unmount etmediğinden tekrar tetiklenmez.
+ //
+ // Bilerek `olayBirKez` KULLANILMAZ (bkz. lib/analitik.ts:22-24, aynı kural
+ // `liste_uretim_basladi` için yazılı): `:220`'deki ileri geçiş olayı
+ // (`adim:2`, `adim:3`) her geçişte atılıyor. Paydayı oturum başına tekil
+ // yapsaydık sihirbazı ikinci kez açan öğrencide pay 2, payda 1 kalır ve
+ // 1→2 geçiş oranı %100'ü aşardı. Payda ile pay aynı birimde olmalı:
+ // sihirbaz her açıldığında `adim:1` de düşer.
+ //
+ // SERİ KIRILMASI: bu satırın canlıya çıktığı tarihten önce `sihirbaz_adim`
+ // serisinde `adim:1` hiç yok; öncesi/sonrası karşılaştırılamaz.
+ useEffect(() => {
+ olay("sihirbaz_adim", { adim: 1 });
+ }, []);
+
const [facetYukleniyor, setFacetYukleniyor] = useState(false);
useEffect(() => {
if (adim === 0) return;
@@ -201,7 +220,8 @@ export function SihirbazAdimlar({
setYon(yeniAdim > adim ? 1 : -1);
setGecisBasladi(true);
setAdim(yeniAdim);
- // Yalnızca ileri geçişler huni adımı sayılır; geri dönüşler tekrar saymasın
+ // Yalnızca ileri geçişler huni adımı sayılır; geri dönüşler tekrar saymasın.
+ // `adim:1` buradan hiç geçmez — onu yukarıdaki mount effect'i atar.
if (yeniAdim > adim) olay("sihirbaz_adim", { adim: yeniAdim + 1 });
}
diff --git a/src/lib/katalog.ts b/src/lib/katalog.ts
index ae4339c..fee4430 100644
--- a/src/lib/katalog.ts
+++ b/src/lib/katalog.ts
@@ -10,6 +10,7 @@ import type { Program } from "@/types/yokatlas";
import { kategoriBul, type Kategori } from "./kategoriler";
import { uniAdiNormalize } from "./harita";
import { bolumBazAdi, turkishSlugify, trBaslikDuzeni } from "./slug";
+import { urapSirasiBul, type UrapSira } from "./urap-siralama";
/**
* Programatik SEO sayfalarının veri katmanı (/bolum, /universite, hub'lar).
@@ -224,6 +225,11 @@ export type UniOzet = {
};
export type UniDetay = UniOzet & {
+ /**
+ * URAP Türkiye genel sıralaması; listede olmayan üniversitede null.
+ * Gösterildiği her yüzeyde URAP_KAYNAK_URL'ye aktif atıf zorunludur.
+ */
+ urap: UrapSira | null;
fakulteler: { fakulte: string; programlar: Program[] }[];
stats: {
minSira: number | null;
@@ -393,6 +399,7 @@ export function getUniversiteBySlug(slug: string): UniDetay | null {
const ozet = getAllUniversiteler().find((u) => u.slug === slug)!;
return {
...ozet,
+ urap: urapSirasiBul(slug),
fakulteler: [...gruplar.entries()]
.map(([fakulte, programlar]) => ({ fakulte, programlar }))
.sort((a, b) => a.fakulte.localeCompare(b.fakulte, "tr-TR")),
diff --git a/src/lib/unitur.ts b/src/lib/unitur.ts
new file mode 100644
index 0000000..137775a
--- /dev/null
+++ b/src/lib/unitur.ts
@@ -0,0 +1,37 @@
+/**
+ * Ham `unitur` değerlerinin (DB: DEVLET, VAKIF, VAKIF MYO, KKTC,
+ * YURTDISI KAMU, YURTDISI VAKIF) ekranda görünen karşılığı — **tek kaynak**.
+ * `DILIM_ETIKET`'in `lib/risk.ts`'te durması gibi: ham anahtarı kullanıcıya
+ * basma, buradan oku (AGENTS.md "ortak elemanlar tek kaynaktan").
+ *
+ * `trBaslikDuzeni` bu değerlere uygulanamaz: tr-TR küçültmesi "I" → "ı"
+ * yaptığı için "KKTC" → "Kktc", "VAKIF MYO" → "Vakıf Myo",
+ * "YURTDISI KAMU" → "Yurtdısı Kamu" gibi Türkçede olmayan kelimeler çıkıyor.
+ *
+ * İki biçim var, çünkü aynı bilgi iki bağlamda geçiyor:
+ * `cip` = başlık altındaki kimlik çipinde okunan kısa etiket,
+ * `cumle` = özet paragrafın ilk virgülündeki öbek; cümle ortasında
+ * okunacağı için küçük harfle başlar, KKTC gibi kısaltmalar
+ * büyük kalır.
+ */
+export const UNITUR_ETIKET: Record = {
+ DEVLET: { cip: "Devlet", cumle: "devlet üniversitesi" },
+ VAKIF: { cip: "Vakıf", cumle: "vakıf üniversitesi" },
+ "VAKIF MYO": { cip: "Vakıf MYO", cumle: "vakıf meslek yüksekokulu" },
+ KKTC: { cip: "KKTC", cumle: "KKTC üniversitesi" },
+ "YURTDISI KAMU": {
+ cip: "Yurt dışı (kamu)",
+ cumle: "yurt dışında bir kamu üniversitesi",
+ },
+ "YURTDISI VAKIF": {
+ cip: "Yurt dışı (vakıf)",
+ cumle: "yurt dışında bir vakıf üniversitesi",
+ },
+};
+
+/**
+ * Çipin renk dili: devlet → slate, diğer her şey (vakıf, KKTC, yurt dışı)
+ * → violet. Sitedeki dört çip kopyasının hepsinde aynı kural.
+ */
+export const uniturDevletMi = (unitur: string | null | undefined) =>
+ unitur === "DEVLET";
diff --git a/src/lib/urap-siralama.ts b/src/lib/urap-siralama.ts
new file mode 100644
index 0000000..eb301de
--- /dev/null
+++ b/src/lib/urap-siralama.ts
@@ -0,0 +1,242 @@
+// URAP (University Ranking by Academic Performance) Türkiye genel sıralaması.
+//
+// Kaynak: URAP Araştırma Laboratuvarı, 2025-2026 genel sıralaması
+// (URAP_KAYNAK_URL). Veri, URAP'ın yazılı izniyle yayımlanıyor; izin
+// "urapcenter.org adresine aktif bağlantı/atıf vermek" şartına bağlı.
+// Bu yüzden URAP sayısının göründüğü HER yüzeyde, aynı ekranda,
+// URAP_KAYNAK_URL'ye çıkan gerçek bir bulunmak zorunda
+// (rel="noopener", yeni sekme, nofollow YOK). Link konulamayan bir
+// yüzeyde (ör. OG görseli) URAP sayısı hiç gösterilmez.
+//
+// Anahtar biçimi: /universite/[slug] sayfa slug'ı (slug.ts → uniSayfaSlug).
+// URAP 198 üniversitenin 198'inde bizim yazımımızla birebir eşleşiyor;
+// takma ad tablosu yok. Burada olmayan üniversite URAP listesinde yoktur —
+// "kötü" demek değildir (KKTC/yurt dışı kurumlar, yalnız MYO'su olanlar ve
+// araştırma çıktısı henüz oluşmamış yeni üniversiteler listeye girmiyor).
+//
+// Yıllık tazeleme: URAP sıralamayı her Ekim yeni bir adreste yayımlıyor;
+// veri ve URAP_KAYNAK_URL aynı commit'te birlikte güncellenir. Denetimi
+// `pnpm veri-kalite` içindeki URAP kontrolleri yapar.
+
+/** Sıralamanın dönemi. Ölçtüğü veri dönemi 2020-2024'tür (URAP Yöntem sayfası). */
+export const URAP_DONEM = "2025-2026";
+
+/** Sıralamadaki toplam üniversite sayısı — payda. Sıra tek başına gösterilmez. */
+export const URAP_TOPLAM = 198;
+
+/** Atıf şartının adresi: sıralamanın o yıla ait kendi sayfası. */
+export const URAP_KAYNAK_URL =
+ "https://newtr.urapcenter.org/Rankings/2025-2026/GENEL-SIRALAMASI-2025";
+
+export type UrapSira = {
+ /** Türkiye genel sıralamasındaki sıra (1..URAP_TOPLAM) */
+ sira: number;
+ /** URAP toplam puanı — sayfada gösterilmez, veri kalitesi kontrolü kullanır */
+ puan: number;
+};
+
+export const URAP_SIRA: Record = {
+ "koc-universitesi": { sira: 1, puan: 1152.91 },
+ "hacettepe-universitesi": { sira: 2, puan: 1096.48 },
+ "orta-dogu-teknik-universitesi": { sira: 3, puan: 1082.81 },
+ "istanbul-teknik-universitesi": { sira: 4, puan: 1067.01 },
+ "ankara-universitesi": { sira: 5, puan: 1038.45 },
+ "gazi-universitesi": { sira: 6, puan: 1006.92 },
+ "ege-universitesi": { sira: 7, puan: 1003.87 },
+ "istanbul-universitesi-cerrahpasa": { sira: 8, puan: 998.17 },
+ "istanbul-universitesi": { sira: 9, puan: 994.98 },
+ "sabanci-universitesi": { sira: 10, puan: 992.03 },
+ "yildiz-teknik-universitesi": { sira: 11, puan: 962.25 },
+ "gebze-teknik-universitesi": { sira: 12, puan: 933.23 },
+ "ataturk-universitesi": { sira: 13, puan: 932.94 },
+ "erciyes-universitesi": { sira: 14, puan: 931.72 },
+ "marmara-universitesi": { sira: 15, puan: 929.21 },
+ "ihsan-dogramaci-bilkent-universitesi": { sira: 16, puan: 903.76 },
+ "firat-universitesi": { sira: 17, puan: 885.66 },
+ "bogazici-universitesi": { sira: 18, puan: 881.20 },
+ "dokuz-eylul-universitesi": { sira: 19, puan: 869.21 },
+ "karadeniz-teknik-universitesi": { sira: 20, puan: 866.97 },
+ "akdeniz-universitesi": { sira: 21, puan: 862.50 },
+ "izmir-yuksek-teknoloji-enstitusu": { sira: 22, puan: 862.37 },
+ "acibadem-mehmet-ali-aydinlar-universitesi": { sira: 23, puan: 852.95 },
+ "cukurova-universitesi": { sira: 24, puan: 851.47 },
+ "bezm-i-alem-vakif-universitesi": { sira: 25, puan: 841.14 },
+ "selcuk-universitesi": { sira: 26, puan: 840.50 },
+ "saglik-bilimleri-universitesi": { sira: 27, puan: 837.93 },
+ "sakarya-universitesi": { sira: 28, puan: 836.46 },
+ "ondokuz-mayis-universitesi": { sira: 29, puan: 829.78 },
+ "bursa-uludag-universitesi": { sira: 30, puan: 828.79 },
+ "istinye-universitesi": { sira: 31, puan: 824.40 },
+ "eskisehir-osmangazi-universitesi": { sira: 32, puan: 808.86 },
+ "kocaeli-universitesi": { sira: 33, puan: 787.14 },
+ "necmettin-erbakan-universitesi": { sira: 34, puan: 775.91 },
+ "inonu-universitesi": { sira: 35, puan: 774.31 },
+ "ankara-yildirim-beyazit-universitesi": { sira: 36, puan: 769.99 },
+ "izmir-katip-celebi-universitesi": { sira: 37, puan: 763.47 },
+ "istanbul-medeniyet-universitesi": { sira: 38, puan: 761.73 },
+ "recep-tayyip-erdogan-universitesi": { sira: 39, puan: 755.54 },
+ "kadir-has-universitesi": { sira: 40, puan: 748.99 },
+ "istanbul-medipol-universitesi": { sira: 41, puan: 747.95 },
+ "suleyman-demirel-universitesi": { sira: 42, puan: 739.79 },
+ "mersin-universitesi": { sira: 43, puan: 736.04 },
+ "eskisehir-teknik-universitesi": { sira: 44, puan: 734.81 },
+ "harran-universitesi": { sira: 45, puan: 732.49 },
+ "konya-teknik-universitesi": { sira: 46, puan: 731.10 },
+ "van-yuzuncu-yil-universitesi": { sira: 47, puan: 728.49 },
+ "bahcesehir-universitesi": { sira: 48, puan: 722.03 },
+ "gaziantep-universitesi": { sira: 49, puan: 720.53 },
+ "yeditepe-universitesi": { sira: 50, puan: 720.51 },
+ "duzce-universitesi": { sira: 51, puan: 711.46 },
+ "canakkale-onsekiz-mart-universitesi": { sira: 52, puan: 711.34 },
+ "baskent-universitesi": { sira: 53, puan: 709.49 },
+ "sivas-cumhuriyet-universitesi": { sira: 54, puan: 708.36 },
+ "mugla-sitki-kocman-universitesi": { sira: 55, puan: 700.99 },
+ "abdullah-gul-universitesi": { sira: 56, puan: 698.46 },
+ "karabuk-universitesi": { sira: 57, puan: 695.29 },
+ "isparta-uygulamali-bilimler-universitesi": { sira: 58, puan: 692.14 },
+ "bingol-universitesi": { sira: 59, puan: 690.31 },
+ "bartin-universitesi": { sira: 60, puan: 690.02 },
+ "nigde-omer-halisdemir-universitesi": { sira: 61, puan: 686.24 },
+ "biruni-universitesi": { sira: 62, puan: 686.04 },
+ "bolu-abant-izzet-baysal-universitesi": { sira: 63, puan: 682.56 },
+ "manisa-celal-bayar-universitesi": { sira: 64, puan: 681.21 },
+ "ozyegin-universitesi": { sira: 65, puan: 674.94 },
+ "kastamonu-universitesi": { sira: 66, puan: 674.08 },
+ "erzurum-teknik-universitesi": { sira: 67, puan: 672.03 },
+ "aydin-adnan-menderes-universitesi": { sira: 68, puan: 671.78 },
+ "tarsus-universitesi": { sira: 69, puan: 669.45 },
+ "pamukkale-universitesi": { sira: 70, puan: 669.23 },
+ "tobb-ekonomi-ve-teknoloji-universitesi": { sira: 71, puan: 660.20 },
+ "anadolu-universitesi": { sira: 72, puan: 656.74 },
+ "bursa-teknik-universitesi": { sira: 73, puan: 647.49 },
+ "adana-alparslan-turkes-bilim-ve-teknoloji-universitesi": { sira: 74, puan: 646.96 },
+ "kahramanmaras-sutcu-imam-universitesi": { sira: 75, puan: 646.28 },
+ "cankaya-universitesi": { sira: 76, puan: 639.31 },
+ "siirt-universitesi": { sira: 77, puan: 631.70 },
+ "karamanoglu-mehmetbey-universitesi": { sira: 78, puan: 628.87 },
+ "zonguldak-bulent-ecevit-universitesi": { sira: 79, puan: 628.13 },
+ "tekirdag-namik-kemal-universitesi": { sira: 80, puan: 626.48 },
+ "atilim-universitesi": { sira: 81, puan: 625.01 },
+ "aksaray-universitesi": { sira: 82, puan: 624.78 },
+ "bilecik-seyh-edebali-universitesi": { sira: 83, puan: 624.59 },
+ "hatay-mustafa-kemal-universitesi": { sira: 84, puan: 621.04 },
+ "hitit-universitesi": { sira: 85, puan: 620.88 },
+ "cankiri-karatekin-universitesi": { sira: 86, puan: 619.86 },
+ "hasan-kalyoncu-universitesi": { sira: 87, puan: 618.15 },
+ "yozgat-bozok-universitesi": { sira: 88, puan: 611.80 },
+ "kirikkale-universitesi": { sira: 89, puan: 608.75 },
+ "erzincan-binali-yildirim-universitesi": { sira: 90, puan: 602.70 },
+ "trakya-universitesi": { sira: 91, puan: 601.88 },
+ "tokat-gaziosmanpasa-universitesi": { sira: 92, puan: 595.80 },
+ "iskenderun-teknik-universitesi": { sira: 93, puan: 594.68 },
+ "dicle-universitesi": { sira: 94, puan: 594.60 },
+ "burdur-mehmet-akif-ersoy-universitesi": { sira: 95, puan: 593.54 },
+ "izmir-ekonomi-universitesi": { sira: 96, puan: 592.96 },
+ "afyon-kocatepe-universitesi": { sira: 97, puan: 592.85 },
+ "usak-universitesi": { sira: 98, puan: 589.80 },
+ "ordu-universitesi": { sira: 99, puan: 582.94 },
+ "igdir-universitesi": { sira: 100, puan: 577.55 },
+ "sakarya-uygulamali-bilimler-universitesi": { sira: 101, puan: 565.68 },
+ "yasar-universitesi": { sira: 102, puan: 561.18 },
+ "osmaniye-korkut-ata-universitesi": { sira: 103, puan: 558.18 },
+ "altinbas-universitesi": { sira: 104, puan: 556.66 },
+ "balikesir-universitesi": { sira: 105, puan: 550.12 },
+ "adiyaman-universitesi": { sira: 106, puan: 546.48 },
+ "munzur-universitesi": { sira: 107, puan: 545.61 },
+ "istanbul-ticaret-universitesi": { sira: 108, puan: 544.68 },
+ "malatya-turgut-ozal-universitesi": { sira: 109, puan: 542.65 },
+ "kirsehir-ahi-evran-universitesi": { sira: 110, puan: 541.62 },
+ "batman-universitesi": { sira: 111, puan: 530.02 },
+ "istanbul-okan-universitesi": { sira: 112, puan: 527.88 },
+ "kafkas-universitesi": { sira: 113, puan: 527.04 },
+ "bayburt-universitesi": { sira: 114, puan: 525.89 },
+ "bandirma-onyedi-eylul-universitesi": { sira: 115, puan: 524.68 },
+ "giresun-universitesi": { sira: 116, puan: 520.78 },
+ "samsun-universitesi": { sira: 117, puan: 516.24 },
+ "alanya-alaaddin-keykubat-universitesi": { sira: 118, puan: 512.85 },
+ "konya-gida-ve-tarim-universitesi": { sira: 119, puan: 512.57 },
+ "nevsehir-haci-bektas-veli-universitesi": { sira: 120, puan: 509.45 },
+ "sinop-universitesi": { sira: 121, puan: 509.24 },
+ "gumushane-universitesi": { sira: 122, puan: 507.79 },
+ "izmir-bakircay-universitesi": { sira: 123, puan: 504.13 },
+ "antalya-bilim-universitesi": { sira: 124, puan: 503.18 },
+ "ibn-haldun-universitesi": { sira: 125, puan: 501.66 },
+ "artvin-coruh-universitesi": { sira: 126, puan: 498.79 },
+ "istanbul-sabahattin-zaim-universitesi": { sira: 127, puan: 497.58 },
+ "ted-universitesi": { sira: 128, puan: 496.02 },
+ "agri-ibrahim-cecen-universitesi": { sira: 129, puan: 493.56 },
+ "lokman-hekim-universitesi": { sira: 130, puan: 492.28 },
+ "istanbul-aydin-universitesi": { sira: 131, puan: 489.10 },
+ "amasya-universitesi": { sira: 132, puan: 486.73 },
+ "kutahya-saglik-bilimleri-universitesi": { sira: 133, puan: 486.66 },
+ "istanbul-nisantasi-universitesi": { sira: 134, puan: 479.20 },
+ "kayseri-universitesi": { sira: 135, puan: 478.40 },
+ "galatasaray-universitesi": { sira: 136, puan: 476.49 },
+ "istanbul-bilgi-universitesi": { sira: 137, puan: 476.16 },
+ "istanbul-gelisim-universitesi": { sira: 138, puan: 475.63 },
+ "uskudar-universitesi": { sira: 139, puan: 472.03 },
+ "turk-alman-universitesi": { sira: 140, puan: 471.87 },
+ "yalova-universitesi": { sira: 141, puan: 464.53 },
+ "kutahya-dumlupinar-universitesi": { sira: 142, puan: 462.86 },
+ "istanbul-arel-universitesi": { sira: 143, puan: 459.52 },
+ "piri-reis-universitesi": { sira: 144, puan: 451.88 },
+ "afyonkarahisar-saglik-bilimleri-universitesi": { sira: 145, puan: 448.30 },
+ "izmir-demokrasi-universitesi": { sira: 146, puan: 447.60 },
+ "kto-karatay-universitesi": { sira: 147, puan: 440.94 },
+ "mus-alparslan-universitesi": { sira: 148, puan: 439.94 },
+ "maltepe-universitesi": { sira: 149, puan: 431.24 },
+ "ardahan-universitesi": { sira: 150, puan: 422.37 },
+ "kirklareli-universitesi": { sira: 151, puan: 421.10 },
+ "bitlis-eren-universitesi": { sira: 152, puan: 414.54 },
+ "demiroglu-bilim-universitesi": { sira: 153, puan: 407.06 },
+ "ankara-haci-bayram-veli-universitesi": { sira: 154, puan: 404.20 },
+ "turk-hava-kurumu-universitesi": { sira: 155, puan: 398.48 },
+ "fatih-sultan-mehmet-vakif-universitesi": { sira: 156, puan: 392.99 },
+ "dogus-universitesi": { sira: 157, puan: 388.75 },
+ "sirnak-universitesi": { sira: 158, puan: 377.20 },
+ "trabzon-universitesi": { sira: 159, puan: 376.52 },
+ "halic-universitesi": { sira: 160, puan: 375.33 },
+ "mef-universitesi": { sira: 161, puan: 373.15 },
+ "gaziantep-islam-bilim-ve-teknoloji-universitesi": { sira: 162, puan: 367.89 },
+ "ostim-teknik-universitesi": { sira: 163, puan: 363.20 },
+ "sanko-universitesi": { sira: 164, puan: 361.18 },
+ "isik-universitesi": { sira: 165, puan: 360.25 },
+ "istanbul-beykent-universitesi": { sira: 166, puan: 360.02 },
+ "mardin-artuklu-universitesi": { sira: 167, puan: 358.73 },
+ "ankara-medipol-universitesi": { sira: 168, puan: 349.71 },
+ "hakkari-universitesi": { sira: 169, puan: 348.80 },
+ "ufuk-universitesi": { sira: 170, puan: 344.76 },
+ "kilis-7-aralik-universitesi": { sira: 171, puan: 342.59 },
+ "kahramanmaras-istiklal-universitesi": { sira: 172, puan: 340.49 },
+ "istanbul-gedik-universitesi": { sira: 173, puan: 337.25 },
+ "ankara-sosyal-bilimler-universitesi": { sira: 174, puan: 333.58 },
+ "istanbul-kultur-universitesi": { sira: 175, puan: 330.47 },
+ "yuksek-ihtisas-universitesi": { sira: 176, puan: 318.38 },
+ "cag-universitesi": { sira: 177, puan: 318.17 },
+ "mimar-sinan-guzel-sanatlar-universitesi": { sira: 178, puan: 315.16 },
+ "istanbul-yeni-yuzyil-universitesi": { sira: 179, puan: 298.64 },
+ "istanbul-saglik-ve-teknoloji-universitesi": { sira: 180, puan: 297.39 },
+ "nuh-naci-yazgan-universitesi": { sira: 181, puan: 269.70 },
+ "istanbul-atlas-universitesi": { sira: 182, puan: 248.03 },
+ "fenerbahce-universitesi": { sira: 183, puan: 243.09 },
+ "toros-universitesi": { sira: 184, puan: 241.33 },
+ "kapadokya-universitesi": { sira: 185, puan: 237.16 },
+ "izmir-tinaztepe-universitesi": { sira: 186, puan: 235.88 },
+ "istanbul-kent-universitesi": { sira: 187, puan: 231.72 },
+ "istanbul-rumeli-universitesi": { sira: 188, puan: 179.54 },
+ "avrasya-universitesi": { sira: 189, puan: 178.53 },
+ "alanya-universitesi": { sira: 190, puan: 176.69 },
+ "istanbul-topkapi-universitesi": { sira: 191, puan: 171.16 },
+ "istanbul-29-mayis-universitesi": { sira: 192, puan: 170.22 },
+ "ankara-bilim-universitesi": { sira: 193, puan: 154.45 },
+ "kocaeli-saglik-ve-teknoloji-universitesi": { sira: 194, puan: 116.23 },
+ "istanbul-galata-universitesi": { sira: 195, puan: 114.92 },
+ "istanbul-esenyurt-universitesi": { sira: 196, puan: 97.81 },
+ "beykoz-universitesi": { sira: 197, puan: 83.48 },
+ "antalya-belek-universitesi": { sira: 198, puan: 70.82 },
+};
+
+/** Üniversite sayfa slug'ının URAP sırası; listede yoksa null. */
+export function urapSirasiBul(slug: string): UrapSira | null {
+ return URAP_SIRA[slug] ?? null;
+}