Merge pull request 'tasarim/sisko-sade' (#7) from tasarim/sisko-sade into main
All checks were successful
Deploy / deploy (push) Successful in 4m45s
All checks were successful
Deploy / deploy (push) Successful in 4m45s
Reviewed-on: #7
This commit was merged in pull request #7.
This commit is contained in:
@@ -10,7 +10,7 @@ yön zaten belli. Kaynak tek: `docs/tasarim/DESIGN.md`. Bu dosya onu nasıl uygu
|
|||||||
|
|
||||||
## 1. Başlamadan önce (zorunlu)
|
## 1. Başlamadan önce (zorunlu)
|
||||||
|
|
||||||
1. `docs/tasarim/DESIGN.md` dosyasını **tamamını** oku (181 satır). Özellikle §4 tek kaynaklar ve §7 yap/yapma.
|
1. `docs/tasarim/DESIGN.md` dosyasını **tamamını** oku (477 satır). Özellikle §1.1 temel his, §4 tek kaynaklar, §7 yap/yapma ve §9.2 ölç-tahmin-etme. Canlı referans ekran: `/universite/ankara-universitesi`.
|
||||||
2. Dört satırlık brief'i doldur (DESIGN.md §9): amaç · referans ekran · tek kaynak parçalar · durumlar.
|
2. Dört satırlık brief'i doldur (DESIGN.md §9): amaç · referans ekran · tek kaynak parçalar · durumlar.
|
||||||
3. Referans ekranı bul ve aç; kopyalayacağın sınıf dizilerini oradan al:
|
3. Referans ekranı bul ve aç; kopyalayacağın sınıf dizilerini oradan al:
|
||||||
|
|
||||||
|
|||||||
@@ -3,23 +3,57 @@
|
|||||||
Bu dosya sitenin görsel dilinin **tek yazılı kaynağıdır**. Yeni ekran, bileşen, modal, kart
|
Bu dosya sitenin görsel dilinin **tek yazılı kaynağıdır**. Yeni ekran, bileşen, modal, kart
|
||||||
ya da buton çizmeden önce okunur; mevcut arayüz değiştirilirken buna bakılır. Değerler koddan
|
ya da buton çizmeden önce okunur; mevcut arayüz değiştirilirken buna bakılır. Değerler koddan
|
||||||
çıkarılmıştır (`src/app/globals.css`, `src/app/layout.tsx`, `src/components/pixel-decor.tsx`,
|
çıkarılmıştır (`src/app/globals.css`, `src/app/layout.tsx`, `src/components/pixel-decor.tsx`,
|
||||||
`src/components/ui/*`, `src/app/page.tsx`); kodla çelişirse kod değil, bu dosya düzeltilir ve
|
`src/components/ui/*`, `src/app/page.tsx`, `src/features/katalog/components/universite-icerik.tsx`);
|
||||||
çelişki raporlanır. Kural ihlallerini `pnpm tasarim:denetim` yakalar.
|
kodla çelişirse kod değil, bu dosya düzeltilir ve çelişki raporlanır. Kural ihlallerini
|
||||||
|
`pnpm tasarim:denetim` yakalar.
|
||||||
|
|
||||||
Biçim: Google Stitch'in DESIGN.md düzeni (9 bölüm). Sabit değerler Tailwind sınıfı olarak
|
Biçim: Google Stitch'in DESIGN.md düzeni (9 bölüm). Sabit değerler Tailwind sınıfı olarak
|
||||||
verilir; kodda da sınıf kullanılır, hex/oklch elle yazılmaz.
|
verilir; kodda da sınıf kullanılır, hex/oklch elle yazılmaz.
|
||||||
|
|
||||||
|
**Canlı referans ekran:** `/universite/ankara-universitesi` (23 Eyl 2026'da Bilal'le birlikte
|
||||||
|
bu belgedeki "şişko ve sade" dile göre baştan tasarlandı). Bir kural belirsiz kalırsa o sayfanın
|
||||||
|
kodu (`universite-icerik.tsx`, `universite-program-tablosu.tsx`, `akademik-ayrinti.tsx`,
|
||||||
|
`nav-baslik.tsx`) ölçüdür. Site genelinde dönüşüm bu ekranı örnek alır.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 1. Görsel tema ve atmosfer
|
## 1. Görsel tema ve atmosfer
|
||||||
|
|
||||||
**Bir cümle:** Beyaz, bol nefesli, mavi bilgi + turuncu aksiyon; her yüzeyde küçük bir
|
**Bir cümle:** Beyaz, bol nefesli, **şişko ve sade** — kullanıcıya "basit bir şey
|
||||||
**piksel imzası** (hero'daki dot-matrix Türkiye haritasının dili) dolaşır.
|
kullanıyorum" hissi veren, Apple uygulamaları kadar kolay anlaşılır bir arayüz; mavi bilgi +
|
||||||
|
turuncu aksiyon; her yüzeyde küçük bir **piksel imzası** (hero'daki dot-matrix Türkiye
|
||||||
|
haritasının ve logodaki üç karenin dili) dolaşır.
|
||||||
|
|
||||||
|
### 1.1 Temel his: şişko ve sade
|
||||||
|
|
||||||
|
Referans: header (`src/components/site-header.tsx` ve içindeki arama/kullanıcı hapları), hero
|
||||||
|
ve üniversite sayfası. Bu hissi veren şeyler, ekrandan bağımsız:
|
||||||
|
|
||||||
|
- **İri dokunma alanı.** Butonlar ve haplar 44–48 px (`h-11`/`h-12`), tam yuvarlak.
|
||||||
|
- **İri yazı, az eleman.** Bir ekranda az şey var ve her biri büyük. Küçük gri yazı yığını yok.
|
||||||
|
- **Sayı kahramandır.** Bir veri gösteriliyorsa sayı kartın en büyük öğesidir; etiket ve
|
||||||
|
açıklama onun altında ikinci planda.
|
||||||
|
- **Sık bakılan önde, ayrıntı bir dokunuş derinde** (Apple'ın "önce ortak yol, gelişmiş
|
||||||
|
seçenekler bir seviye aşağıda" ilkesi). Sayfada en çok dört özet sayı; fazlası ayrıntı
|
||||||
|
satırının açtığı alt sayfaya (§4.10).
|
||||||
|
- **Nefes alanı korunur.** Harita gibi görsel dinlenme alanları küçültülmez, sıkıştırılmaz,
|
||||||
|
bilgiyle doldurulmaz. Sadeleştirmek = bu alanları silmek değil, etraflarındaki kalabalığı
|
||||||
|
azaltmaktır.
|
||||||
|
- **Verimli ama havadar.** Alt sayfa ve paneller dikine uzamaz; ilişkili öğeler yan yana
|
||||||
|
dizilir, aralarında boşluk kalır (§5.3).
|
||||||
|
- **Doğal duruş.** Eşit, hizalı ızgaralar yerine logodaki üç kare gibi hafif kaymış yerleşim
|
||||||
|
(§4.11). Her şey birbirine cetvelle hizalıysa ekran "tablo" gibi durur.
|
||||||
|
- **Basınca tepki.** Her tıklanabilir öğe basınca hafifçe küçülür (`active:scale-[0.97]`,
|
||||||
|
geniş satırlarda `[0.99]`), üzerine gelince turuncuya döner (§2.1).
|
||||||
|
|
||||||
|
### 1.2 Genel kurallar
|
||||||
|
|
||||||
- Zemin her zaman beyaz; koyu zemin yalnızca CTA bandı ve çekmece başlığı gibi tek bir
|
- Zemin her zaman beyaz; koyu zemin yalnızca CTA bandı ve çekmece başlığı gibi tek bir
|
||||||
vurgu yüzeyinde (`PixelField` ile).
|
vurgu yüzeyinde (`PixelField` ile).
|
||||||
- İmza dekoratiftir ama rastgele değildir: deterministik ızgara (hücre 10, nokta 7.4, rx 2),
|
- İmza dekoratiftir ama rastgele değildir: deterministik ızgara (hücre 10, nokta 7.4, rx 2),
|
||||||
imleç yaklaşınca turuncuya ısınan pikseller (`usePixelHeat`), uzaklaşınca yavaş soğuma.
|
imleç yaklaşınca turuncuya ısınan pikseller (`usePixelHeat`), uzaklaşınca yavaş soğuma.
|
||||||
|
Piksel **veri taşıyorsa** (ör. `PixelSira`) kalır; iki bölüm arasına **süs olarak** konmuş
|
||||||
|
piksel ayraç alt sayfalarda ve kompakt panellerde kullanılmaz.
|
||||||
- Ton: öğrenciye "sen" diyen, sakin, vaatsiz. Süs yok, gösteriş yok; hareket yalnızca
|
- Ton: öğrenciye "sen" diyen, sakin, vaatsiz. Süs yok, gösteriş yok; hareket yalnızca
|
||||||
bir şey söylüyorsa var.
|
bir şey söylüyorsa var.
|
||||||
- **Karanlık mod yoktur.** `dark:` sınıfı yazılmaz (`.dark` token'ları shadcn kalıntısıdır).
|
- **Karanlık mod yoktur.** `dark:` sınıfı yazılmaz (`.dark` token'ları shadcn kalıntısıdır).
|
||||||
@@ -28,31 +62,66 @@ verilir; kodda da sınıf kullanılır, hex/oklch elle yazılmaz.
|
|||||||
|
|
||||||
| Rol | Sınıf | Nerede |
|
| Rol | Sınıf | Nerede |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Bilgi/vurgu mavisi (`primary`) | `text-primary`, `bg-primary/10`, `border-primary/30` | Rozet metni, ikon kutusu, hero'daki italik vurgu, linkler, kart hover kenarlığı |
|
| Bilgi/vurgu mavisi (`primary`) | `text-primary`, `bg-primary/10`, `border-primary/30` | Rozet metni, ikon kutusu, hero'daki italik vurgu, linklerin durağan rengi |
|
||||||
| **Aksiyon turuncusu** | `bg-orange-500 hover:bg-orange-600 text-white` | Funnel CTA butonları. Bir ekranda **tek** turuncu buton |
|
| **Aksiyon turuncusu** | `bg-orange-500 hover:bg-orange-600 text-white` | Funnel CTA butonları. Bir ekranda **tek** turuncu buton |
|
||||||
|
| **Hover turuncusu** | `hover:text-orange-500`, `hover:border-orange-500`, `hover:bg-orange-50/60`, `group-hover:text-orange-500` | Link, kart, satır ve ikincil butonların üzerine gelme hâli (§2.1); liste satırı adı hariç (mavi kalır) |
|
||||||
| Piksel vurgusu | `fill-orange-500` (opaklık 0.55–0.85) | Yalnızca piksel süslerinin "sıcak" noktaları |
|
| Piksel vurgusu | `fill-orange-500` (opaklık 0.55–0.85) | Yalnızca piksel süslerinin "sıcak" noktaları |
|
||||||
| Başlık metni | `text-slate-900` | h1–h3, kart başlıkları |
|
| Başlık metni | `text-slate-900` | h1–h3, kart başlıkları, iri sayılar |
|
||||||
| Gövde metni | `text-slate-600` | Paragraf, açıklama |
|
| Gövde metni | `text-slate-600` | Paragraf, açıklama |
|
||||||
| İkincil metin | `text-slate-500` | Meta bilgi, yardımcı satır |
|
| İkincil metin | `text-slate-500` | Meta bilgi, yardımcı satır, kart açıklaması |
|
||||||
| Silik metin | `text-slate-400` | İpucu, devre dışı, placeholder |
|
| Silik metin | `text-slate-400` | İpucu, devre dışı, placeholder, sayının yanındaki birim (`/ 198`) |
|
||||||
| Kenarlık | `border-slate-200` (landing kartlarında `border-slate-200/70`) | Kart, rozet, çarpı, giriş alanı |
|
| Kenarlık | `border-slate-200` (landing kartlarında `border-slate-200/70`) | Kart, rozet, çarpı, giriş alanı |
|
||||||
| İç zemin | `bg-slate-50` | Kartın içindeki ikincil kutu, tablo başlığı |
|
| İç zemin | `bg-slate-50` | Kartın içindeki ikincil kutu, tablo başlığı |
|
||||||
| Hover zemini | `hover:bg-slate-100` | Çarpı, ghost buton |
|
| Nötr hover zemini | `hover:bg-slate-100` | Yalnız kapatma çarpısı ve ghost buton |
|
||||||
| Risk: güvenli | `emerald-500` / `text-emerald-600` | **Her zaman "Güvenli" metniyle** |
|
| Risk: güvenli | `emerald-500` / `text-emerald-600` | **Her zaman "Güvenli" metniyle** |
|
||||||
| Risk: az riskli | `amber-500` / `text-amber-600` | **Her zaman "Az riskli" metniyle** |
|
| Risk: az riskli | `amber-500` / `text-amber-600` | **Her zaman "Az riskli" metniyle** |
|
||||||
| Risk: riskli | `red-500` / `text-red-600` | **Her zaman "Riskli" metniyle** |
|
| Risk: riskli | `red-500` / `text-red-600` | **Her zaman "Riskli" metniyle** |
|
||||||
| Uyarı kutusu | `border-amber-200 bg-amber-50 text-amber-900` | Bilgilendirme notu |
|
| Uyarı kutusu | `border-amber-200 bg-amber-50 text-amber-900` | Bilgilendirme notu |
|
||||||
|
| Gösterge karesi | Dolu zemin + beyaz yazı: `bg-orange-500`, `bg-primary`, `bg-indigo-500`, `bg-green-600`; `rounded-3xl` | Yalnız sayı gösterge kareleri (§4.11). Renk sempati katar, anlam taşımaz: etiket her karede yazılı |
|
||||||
| Hata | `text-destructive`, `text-red-600` | Form hatası |
|
| Hata | `text-destructive`, `text-red-600` | Form hatası |
|
||||||
|
|
||||||
Kurallar:
|
### 2.1 Hover: tek turuncu
|
||||||
|
|
||||||
|
Bilal'in kararı (23 Eyl 2026): üzerine gelme hâlinde **sitenin turuncusu** kullanılır ve bu
|
||||||
|
turuncu **tek tondur: `orange-500`** — CTA butonunun turuncusuyla birebir aynı değer.
|
||||||
|
|
||||||
|
- Link / metin: `transition-colors hover:text-orange-500` (altı çizili linklerde
|
||||||
|
`hover:underline` kalır).
|
||||||
|
- Tıklanabilir kart / satır: `hover:border-orange-500 hover:bg-orange-50/60`; içindeki iri
|
||||||
|
sayı ya da başlık `group-hover:text-orange-500`; sağdaki ok
|
||||||
|
`group-hover:translate-x-0.5 group-hover:text-orange-500`.
|
||||||
|
- İkincil (outline) buton: `hover:border-orange-500 hover:bg-orange-50/60 hover:text-orange-500`.
|
||||||
|
- **İstisna — liste satırındaki adlar mavi kalır:** program/üniversite listelerinde satırın
|
||||||
|
adı (bölüm ya da üniversite sayfasına giden link) `hover:text-primary hover:underline`.
|
||||||
|
Bilal'in kararı (23 Eyl 2026): uzun bir listede imleç satırdan satıra geçerken yanıp sönen
|
||||||
|
turuncu adlar yorucu; mavi sakin kalır. Satırın butonları ve listedeki diğer linkler §2.1'e
|
||||||
|
uyar.
|
||||||
|
- **Yapılmaz:** hover'da `text-primary`/`border-primary` (eski mavi hover — yukarıdaki
|
||||||
|
istisna dışında), `orange-600` yazı, `orange-300` kenarlık — aynı ekranda iki turuncu tonu
|
||||||
|
göze "farklı turuncu" diye batar.
|
||||||
|
Tek istisna: turuncu CTA'nın kendi zemininin hover'ı (`hover:bg-orange-600`), kanonik.
|
||||||
|
- Geçiş notu: kodda hâlâ `hover:text-primary` / `hover:border-primary/30` kullanan yerler var
|
||||||
|
(landing kartı dahil); tarama sırasında bu kurala çevrilir. Denetim bunları `mavi-hover`
|
||||||
|
uyarısıyla listeler; liste satırı adındaki uyarı istisnadır, dokunulmaz.
|
||||||
|
|
||||||
|
### 2.2 Palet kuralları
|
||||||
|
|
||||||
- Nötr yalnızca **slate**. `gray`, `zinc`, `neutral`, `stone` yazılmaz.
|
- Nötr yalnızca **slate**. `gray`, `zinc`, `neutral`, `stone` yazılmaz.
|
||||||
- `indigo`, `purple`, `violet`, `fuchsia`, `pink`, `cyan`, `teal`, `lime`, `green`, `yellow`
|
- `indigo`, `purple`, `violet`, `fuchsia`, `pink`, `cyan`, `teal`, `lime`, `green`, `yellow`
|
||||||
yeni kullanım açmaz. (`bg-violet-50 text-violet-600` tek bir mevcut durum çipidir; yeni yere taşıma.)
|
yeni kullanım açmaz. Tek istisna "Gösterge karesi" satırındaki dolu `bg-indigo-500` ve
|
||||||
|
`bg-green-600` zeminleri (Bilal'in kararı, 23 Eyl 2026); yazı, kenarlık ya da başka
|
||||||
|
ton/opaklıkta bu renkler yine yasak. (`bg-violet-50 text-violet-600` tek bir mevcut durum
|
||||||
|
çipidir; yeni yere taşıma — üniversite sayfasında "Vakıf" çipi bu yüzden hap + ikonla
|
||||||
|
değiştirildi, §4.12.)
|
||||||
- Gradyan metin (`bg-clip-text text-transparent`) ve parlama gölgesi (`shadow-[0_0_…]`) yok.
|
- Gradyan metin (`bg-clip-text text-transparent`) ve parlama gölgesi (`shadow-[0_0_…]`) yok.
|
||||||
- Hex/oklch değeri sınıf içine yazılmaz (`text-[#…]`); token ya da Tailwind tonu kullanılır.
|
- Hex/oklch değeri sınıf içine yazılmaz (`text-[#…]`); token ya da Tailwind tonu kullanılır.
|
||||||
Risk renklerinin SVG karşılığı `src/lib/risk.ts` içindeki `RISK_PIN_RENK`'ten okunur.
|
Risk renklerinin SVG karşılığı `src/lib/risk.ts` içindeki `RISK_PIN_RENK`'ten okunur.
|
||||||
- Renk tek başına anlam taşımaz: risk rengi her zaman metin etiketiyle birlikte gider
|
- Renk tek başına anlam taşımaz: risk rengi her zaman metin etiketiyle birlikte gider
|
||||||
(`RISK_ETIKET`, `DILIM_ETIKET` — üçüncü dilimin görünen adı "Güvenli").
|
(`RISK_ETIKET`, `DILIM_ETIKET` — üçüncü dilimin görünen adı "Güvenli"). Tür ayrımı (devlet /
|
||||||
|
vakıf) da renkle değil ikon + metinle yapılır.
|
||||||
|
- Renkli dolu zeminde beyaz yazı: turuncu ve yeşil zeminde küçük beyaz yazı WCAG AA'nın
|
||||||
|
altında kalır (sitenin turuncu CTA'sı da aynı ikiliyi kullanır). Bu zeminlerde etiket
|
||||||
|
`font-bold`, sayı en az `text-3xl`; uzun metin konmaz.
|
||||||
|
|
||||||
## 3. Tipografi
|
## 3. Tipografi
|
||||||
|
|
||||||
@@ -60,27 +129,51 @@ Dört yazı tipi, her birinin tek bir işi var:
|
|||||||
|
|
||||||
| Sınıf | Yazı tipi | İş |
|
| Sınıf | Yazı tipi | İş |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `font-heading` | Cal Sans | Tüm başlıklar (h1–h3, kart başlığı). Her zaman `font-bold` ile |
|
| `font-heading` | Cal Sans | Tüm başlıklar (h1–h3, kart başlığı) ve **iri sayılar**. Her zaman `font-bold` ile |
|
||||||
| `font-sans` (varsayılan) | Clarity City 400–800 | Gövde, buton, form, tablo |
|
| `font-sans` (varsayılan) | Clarity City 400–800 | Gövde, buton, form, tablo |
|
||||||
| `font-bricolage` | Bricolage Grotesque (opsz ekseni) | Vurgu: hero'da italik mavi span, küçük etiketler/çipler, sayısal rozetler |
|
| `font-bricolage` | Bricolage Grotesque (opsz ekseni) | Vurgu: hero'da italik mavi span, logo yazısı, üst çubuktaki sayfa adı (§4.14), küçük etiketler/çipler |
|
||||||
| `font-mono` | Geist Mono | Yalnızca kod/markdown blokları. Arayüzde kullanılmaz |
|
| `font-mono` | Geist Mono | Yalnızca kod/markdown blokları. Arayüzde kullanılmaz |
|
||||||
|
|
||||||
Ölçek (kopyala, uydurma):
|
Ölçek (kopyala, uydurma):
|
||||||
|
|
||||||
- Hero h1: `font-heading text-5xl font-bold tracking-[0.015em] sm:text-6xl`; vurgu kelimesi
|
- Hero h1: `font-heading text-5xl font-bold tracking-[0.015em] sm:text-6xl`; vurgu kelimesi
|
||||||
`<span className="font-bricolage italic tracking-tighter font-bold text-primary">`
|
`<span className="font-bricolage italic tracking-tighter font-bold text-primary">`
|
||||||
- Bölüm h2: `font-heading text-3xl font-bold sm:text-4xl` (istenirse `text-slate-900`)
|
- Alt sayfa h1 (katalog, rehber): `font-heading text-3xl font-bold leading-tight text-slate-900 sm:text-5xl`
|
||||||
- Panel/kart h3: `font-heading text-xl font-bold` · liste satırı başlığı: `font-heading text-lg font-bold text-slate-900`
|
- Bölüm h2: `font-heading text-3xl font-bold sm:text-4xl` (istenirse `text-slate-900`);
|
||||||
|
alt sayfada liste bölümü başlığı `font-heading text-2xl font-bold text-slate-900 sm:text-3xl`
|
||||||
|
- Panel/kart h3: `font-heading text-xl font-bold` · grup başlığı (fakülte vb.):
|
||||||
|
`font-heading text-xl font-bold text-slate-900 sm:text-2xl`
|
||||||
- Küçük başlık: `font-heading text-base font-bold text-slate-900`
|
- Küçük başlık: `font-heading text-base font-bold text-slate-900`
|
||||||
- Bölüm giriş paragrafı: `max-w-xl text-lg leading-relaxed text-slate-600`
|
- Bölüm giriş paragrafı: `max-w-xl text-lg leading-relaxed text-slate-600`
|
||||||
- Gövde: `text-sm` (tablo, form, kart içi) ya da `text-base leading-relaxed` (açıklama)
|
- Sayfa özet paragrafı: `text-base leading-relaxed text-slate-600 sm:text-lg`
|
||||||
|
- Gövde: `text-base leading-relaxed` (açıklama, liste satırı adı) ya da `text-sm` (kart
|
||||||
|
açıklaması, tablo hücresi, meta)
|
||||||
- Etiket/rozet metni: `text-xs font-semibold`
|
- Etiket/rozet metni: `text-xs font-semibold`
|
||||||
- Yasak: Inter, Roboto, Arial, sistem fontu, serif, `font-[…]` keyfi font; tek kelimelik
|
|
||||||
büyük harf etiketler (uppercase yok, rozet metni büyük-küçük harfli yazılır).
|
**İri sayı ölçeği** (§1.1 "sayı kahramandır"):
|
||||||
|
|
||||||
|
| Yer | Sınıf |
|
||||||
|
|---|---|
|
||||||
|
| Özet kartı sayısı | `font-heading text-4xl font-bold leading-none tracking-tight text-slate-900 sm:text-5xl` |
|
||||||
|
| Gösterge karesi, büyük | `font-heading text-5xl font-bold leading-none tracking-tight` |
|
||||||
|
| Gösterge karesi, orta | `font-heading text-3xl font-bold leading-none` |
|
||||||
|
| Sayının birimi (`/ 198`, `kişi`) | `text-base font-semibold text-slate-400` (renkli zeminde `text-white/80`) |
|
||||||
|
|
||||||
|
**Alt sınırlar:**
|
||||||
|
- Gövde metni telefonda 16 px'in (`text-base`) altına inmez; `text-sm` yalnız ikincil
|
||||||
|
bilgide, `text-xs` yalnız ince yazıda (kaynak satırı, eksen etiketi, çip).
|
||||||
|
- **12 px altı yok:** `text-[10px]`, `text-[11px]` yazılmaz (denetim uyarır).
|
||||||
|
- **Büyük harfli minik etiket yok:** `uppercase tracking-wide text-xs` kalıbı ("PROGRAM",
|
||||||
|
"TOPLAM KONTENJAN") yazılmaz; etiket büyük-küçük harfli, `text-sm font-semibold`.
|
||||||
|
- **İri sayıda `tabular-nums` yok:** Cal Sans'ta sabit genişlikli rakam "daktilo" gibi
|
||||||
|
aralıklı durur ("13.88 9"). `tabular-nums` yalnız `font-sans` tablo sütunlarında.
|
||||||
|
- Yasak: Inter, Roboto, Arial, sistem fontu, serif, `font-[…]` keyfi font.
|
||||||
|
|
||||||
## 4. Bileşen stilleri (tek kaynaklar)
|
## 4. Bileşen stilleri (tek kaynaklar)
|
||||||
|
|
||||||
Bir eleman iki yerde görünüyorsa stili tek kaynaktan gelir. Aşağıdakiler yeniden tasarlanmaz.
|
Bir eleman iki yerde görünüyorsa stili tek kaynaktan gelir. Aşağıdakiler yeniden tasarlanmaz.
|
||||||
|
§4.8–§4.15 üniversite sayfasında doğdu; ikinci bir ekranda gerektiğinde **kopyalanmaz**, ortak
|
||||||
|
bir dosyaya (`src/components/…`) çıkarılıp iki yer de oradan kullanır.
|
||||||
|
|
||||||
### 4.1 Buton — `src/components/ui/button.tsx`
|
### 4.1 Buton — `src/components/ui/button.tsx`
|
||||||
- Her buton `rounded-full`; `h-9` varsayılan, `h-11`/`h-12` funnel CTA'ları (44 px dokunma hedefi), `size-9` ikon butonu.
|
- Her buton `rounded-full`; `h-9` varsayılan, `h-11`/`h-12` funnel CTA'ları (44 px dokunma hedefi), `size-9` ikon butonu.
|
||||||
@@ -93,24 +186,32 @@ Bir eleman iki yerde görünüyorsa stili tek kaynaktan gelir. Aşağıdakiler y
|
|||||||
</Button>
|
</Button>
|
||||||
```
|
```
|
||||||
Metin önce, ok sonda. Başta ikon yok. `Sparkles` yok. İstenirse `active:scale-[0.97]`.
|
Metin önce, ok sonda. Başta ikon yok. `Sparkles` yok. İstenirse `active:scale-[0.97]`.
|
||||||
- İkincil: `variant="outline"`; sessiz: `variant="ghost"`; link görünümü: `variant="link"`.
|
- **İkincil gezinme butonu** ("Tüm sıralamayı gör →"):
|
||||||
|
```tsx
|
||||||
|
<Button asChild size="lg" variant="outline" className="cursor-pointer px-6 transition-[background-color,border-color,color,transform] duration-150 hover:border-orange-500 hover:bg-orange-50/60 hover:text-orange-500 active:scale-[0.97]">
|
||||||
|
<Link href="…">Tüm sıralamayı gör<ArrowRight className="size-4" aria-hidden /></Link>
|
||||||
|
</Button>
|
||||||
|
```
|
||||||
|
- Sessiz: `variant="ghost"`; link görünümü: `variant="link"`.
|
||||||
|
|
||||||
### 4.2 Rozet (bölüm başlığı üstündeki kapsül) — `SectionEyebrow`, `src/components/pixel-decor.tsx`
|
### 4.2 Rozet (bölüm başlığı üstündeki kapsül) — `SectionEyebrow`, `src/components/pixel-decor.tsx`
|
||||||
```tsx
|
```tsx
|
||||||
<SectionEyebrow>Nasıl çalışır?</SectionEyebrow>
|
<SectionEyebrow>Nasıl çalışır?</SectionEyebrow>
|
||||||
```
|
```
|
||||||
Sınıfı: `inline-flex items-center gap-2 rounded-full border border-slate-200 bg-white px-3.5 py-1.5 text-xs font-semibold text-primary` + başta `PixelMark`.
|
Sınıfı: `inline-flex items-center gap-2 rounded-full border border-slate-200 bg-white px-3.5 py-1.5 text-xs font-semibold text-primary` + başta `PixelMark`.
|
||||||
`@/components/ui/badge` **kullanılmaz**; elle pill span yazılmaz. Filtre çipleri ve nav butonları bu kuralın dışındadır (onlar etkileşimlidir).
|
`@/components/ui/badge` **kullanılmaz**; elle pill span yazılmaz. Filtre çipleri, nav butonları
|
||||||
|
ve kimlik hapları (§4.12) bu kuralın dışındadır.
|
||||||
|
|
||||||
### 4.3 Modal kapatma çarpısı — `DialogContent` varsayılanı, `src/components/ui/dialog.tsx`
|
### 4.3 Modal kapatma çarpısı — `DialogContent` varsayılanı, `src/components/ui/dialog.tsx`
|
||||||
`absolute top-3 right-3 z-10 flex size-9 cursor-pointer items-center justify-center rounded-full border border-slate-200 bg-popover text-slate-500 transition-[background-color,transform] duration-150 hover:bg-slate-100 hover:text-slate-800 active:scale-[0.96]` + `<XIcon className="size-4" aria-hidden />` + `sr-only "Kapat"`.
|
`absolute top-3 right-3 z-10 flex size-9 cursor-pointer items-center justify-center rounded-full border border-slate-200 bg-popover text-slate-500 transition-[background-color,transform] duration-150 hover:bg-slate-100 hover:text-slate-800 active:scale-[0.96]` + `<XIcon className="size-4" aria-hidden />` + `sr-only "Kapat"`.
|
||||||
Özel yerleşim gerekiyorsa `showCloseButton={false}` ver ve **aynı sınıf setini** kopyala.
|
Özel yerleşim gerekiyorsa `showCloseButton={false}` ver ve **aynı sınıf setini** kopyala.
|
||||||
|
Alt sayfada (`Drawer`) aynı sınıf seti `DrawerClose` üstünde kullanılır (§4.10).
|
||||||
|
|
||||||
### 4.4 Kart ve kutu
|
### 4.4 Kart ve kutu
|
||||||
- Landing/öne çıkan kart: `<Card className="relative h-full overflow-hidden border-slate-200/70 shadow-sm transition-all duration-300 hover:-translate-y-1 hover:border-primary/30 hover:shadow-lg hover:shadow-primary/5">` + sağ üstte `<PixelCorner className="absolute right-4 top-4" />`.
|
- Landing/öne çıkan kart: `<Card className="relative h-full overflow-hidden border-slate-200/70 shadow-sm transition-all duration-300 hover:-translate-y-1 hover:border-orange-500 hover:shadow-lg hover:shadow-orange-500/5">` + sağ üstte `<PixelCorner className="absolute right-4 top-4" />`. (Kodda hâlâ `hover:border-primary/30 hover:shadow-primary/5`; §2.1 geçiş notu.)
|
||||||
- Sade kutu (form, panel, liste satırı): `rounded-2xl border border-slate-200 bg-white` (+ `p-5`/`p-6`). Küçük iç kutu: `rounded-xl border border-slate-200 bg-slate-50`. Not kutusu: `rounded-lg`.
|
- Sade kutu (form, panel, liste satırı): `rounded-2xl border border-slate-200 bg-white` (+ `p-5`/`p-6`). Küçük iç kutu: `rounded-xl border border-slate-200 bg-slate-50`. Not kutusu: `rounded-lg`.
|
||||||
- İkon kutusu: `flex size-11 items-center justify-center rounded-xl bg-primary/10` içinde `size-5 text-primary` ikon.
|
- İkon kutusu: `flex size-11 items-center justify-center rounded-xl bg-primary/10` içinde `size-5 text-primary` ikon. Kart içinde sayının yanında küçük hâli: `size-8 … sm:size-10` + `size-4 sm:size-5` ikon (§4.8).
|
||||||
- Gölge: `shadow-sm` varsayılan; hover'da `shadow-lg shadow-primary/5`. Başka gölge yok.
|
- Gölge: `shadow-sm` varsayılan; hover'da `shadow-lg shadow-orange-500/5`. Başka gölge yok.
|
||||||
|
|
||||||
### 4.5 Risk çipi / etiketi
|
### 4.5 Risk çipi / etiketi
|
||||||
Nokta + metin: `<span className="size-2 rounded-full bg-emerald-500" />` yanında `text-xs font-semibold text-emerald-600`; metin `RISK_ETIKET`'ten. Renk tek başına asla.
|
Nokta + metin: `<span className="size-2 rounded-full bg-emerald-500" />` yanında `text-xs font-semibold text-emerald-600`; metin `RISK_ETIKET`'ten. Renk tek başına asla.
|
||||||
@@ -121,8 +222,131 @@ shadcn `Input`, `Select`, `Textarea`, `Slider`. Etiket her alanda; hata mesajı
|
|||||||
### 4.7 İkonlar
|
### 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.
|
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`
|
||||||
|
Apple Fitness özet kartının sitenin ölçüleriyle hâli. Sayfada **en çok dört** tane (harita
|
||||||
|
yanındaki 2×2).
|
||||||
|
|
||||||
|
```
|
||||||
|
┌──────────────────────┐
|
||||||
|
│ 13.889 [👥] │ ← sayı solda, iri; ikon kutusu sağda, küçük
|
||||||
|
│ Kontenjan │ ← başlık text-base font-semibold text-slate-900
|
||||||
|
│ 2026 toplamı │ ← açıklama text-sm text-slate-500, tek satır
|
||||||
|
└──────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
- Kap: `flex flex-col rounded-2xl border border-slate-200 bg-white p-4 sm:p-5`.
|
||||||
|
- Sayı satırı: `flex items-start justify-between gap-1.5`; sayı §3 "Özet kartı sayısı";
|
||||||
|
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.
|
||||||
|
- 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.
|
||||||
|
- Açıklama altında veri görseli gerekiyorsa (ör. `PixelSira`) `ek` yuvasına konur.
|
||||||
|
|
||||||
|
### 4.9 Ayrıntı satırı — `AkademikAyrinti`, `akademik-ayrinti.tsx`
|
||||||
|
Özet kartlarının altında "fazlası burada" satırı (Apple Sağlık'taki "Tüm verileri göster").
|
||||||
|
|
||||||
|
- `mt-4 flex w-full items-center gap-4 rounded-2xl border border-slate-200 bg-white p-4 sm:p-5`
|
||||||
|
+ hover §2.1 + `active:scale-[0.99]`.
|
||||||
|
- Solda ikon kutusu (`size-11`), ortada iki satır: başlık `font-heading text-lg font-bold`,
|
||||||
|
altında **önizleme** `truncate text-sm text-slate-500` — içeride ne olduğunu söyler ("Hoca
|
||||||
|
başına 25 öğrenci"), boş "Daha fazla" yazmaz. Sağda `ChevronRight size-5 text-slate-400`.
|
||||||
|
- Dokununca alt sayfa açılır (§4.10).
|
||||||
|
|
||||||
|
### 4.10 Alt sayfa (Drawer) içeriği
|
||||||
|
Ayrıntı her zaman **alttan açılan sayfada** (`Drawer handleOnly`, tutamaçlı); ekranın ortasında
|
||||||
|
açılan modal değil. Çekmece kabı ve çarpı `cta-sira-form.tsx`'teki çekmeceyle birebir:
|
||||||
|
`DrawerContent className="max-h-[92dvh] bg-white sm:mx-auto sm:max-w-2xl sm:border-x sm:border-slate-200 sm:shadow-2xl"`.
|
||||||
|
|
||||||
|
İçerik kuralları (Apple ayrıntı sayfası):
|
||||||
|
- **Her ekranda ortalı:** başlık `px-10 text-center font-heading text-2xl font-bold`, altında
|
||||||
|
bağlam (`text-sm text-slate-500`, ör. üniversite adı).
|
||||||
|
- **Kart yok.** Çekmece zaten bir yüzey; içine çerçeveli kart koymak "pencere içinde pencere"
|
||||||
|
olur. Gösterge kareleri (§4.11) bu kuralın istisnası değildir — onlar çerçevesiz, dolu renk.
|
||||||
|
- **Süs ayraç yok.** Bölümler arasına piksel ayraç ya da çizgi konmaz; ayrım boşlukla ve
|
||||||
|
yan yana dizilişle yapılır. Yalnız en alttaki kaynak satırı `border-t border-slate-100`.
|
||||||
|
- **Tek ekrana sığar:** 375×812'de kaydırmasız. Dikine uzuyorsa öğeler yan yana dizilir,
|
||||||
|
kareler kısaltılır, not kısaltılır — içerik silinmez (§9.2 ölçüm).
|
||||||
|
- Sıra: gösterge kareleri → tek cümlelik not (`text-sm text-slate-500`) → ikincil buton (§4.1)
|
||||||
|
→ kaynaklar (logo solda, `text-xs` iki satır).
|
||||||
|
- **Arama motoru uyarısı:** çekmece içeriği sayfa açılırken HTML'de yoktur (kapalıyken
|
||||||
|
çizilmez). Google'ın görmesi gereken metin ve **zorunlu atıflar** (ör. URAP sırası + payda +
|
||||||
|
dönem + aktif bağlantı) çekmeceye taşınmaz, sayfada da görünür kalır.
|
||||||
|
|
||||||
|
### 4.11 Gösterge kareleri (masonry)
|
||||||
|
Birden çok sayıyı alt sayfada göstermenin yolu. Logodaki üç kare gibi: **iki sütun, sağdaki
|
||||||
|
aşağı kaymış, kare boyları farklı — ne tepeler ne bitişler hizalı.**
|
||||||
|
|
||||||
|
```
|
||||||
|
┌────────┐
|
||||||
|
│ Türkiye│ ┌────────┐
|
||||||
|
│ sırası │ │ Hoca │
|
||||||
|
│ 5. │ │ başına │
|
||||||
|
│ İlk %3 │ │ 25 │
|
||||||
|
└────────┘ └────────┘
|
||||||
|
┌────────┐ ┌────────┐
|
||||||
|
│ 56.128 │ │ 2.225 │
|
||||||
|
└────────┘ │ │
|
||||||
|
└────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
- Kap: `flex w-full max-w-md items-start gap-3`; iki sütun `flex flex-1 flex-col gap-3`,
|
||||||
|
sağdaki `mt-12`.
|
||||||
|
- Kare: `flex flex-col items-center justify-center rounded-3xl px-3 text-white` + zemin (§2
|
||||||
|
"Gösterge karesi") + `min-h-*` ile farklı boy (ör. 40 / 24 / 32 / doğal).
|
||||||
|
- **Ölçüyle doğrula:** komşu kareler arasında tepe ve bitiş farkı **en az 24 px**. 8 px fark
|
||||||
|
"yanlışlıkla hizalanmış" görünür (§9.2).
|
||||||
|
- Etiket `text-sm font-bold text-white/90`; sayı §3 gösterge ölçeği; vurgu satırı
|
||||||
|
`text-base font-bold`.
|
||||||
|
- Renk sırası: en önemli gösterge turuncu, ikincisi mavi, sonra indigo, yeşil.
|
||||||
|
|
||||||
|
### 4.12 Kimlik hapları (tür, il)
|
||||||
|
Başlığın altında kurumun kimliği; navbar haplarının ölçüsünde:
|
||||||
|
`inline-flex h-10 items-center gap-2 rounded-full border border-slate-200 bg-white px-4 text-sm font-semibold text-slate-800`
|
||||||
|
+ başta `size-4 text-primary` ikon (`Landmark` devlet, `Building2` vakıf, `MapPin` il). Tür
|
||||||
|
renkle değil ikonla ayrılır. Etkileşimli değildir; rozet (§4.2) değildir.
|
||||||
|
|
||||||
|
### 4.13 Piksel sıra şeridi — `PixelSira`, `src/components/pixel-decor.tsx`
|
||||||
|
Bir sıranın (ör. 198 içinde 5.) yerini tek satır piksel şeridinde gösterir; sıranın düştüğü
|
||||||
|
dilim turuncu yanar, geri kalanı hero dokusunda. **Veri taşıyan** piksel olduğu için süs
|
||||||
|
ayraç yasağına girmez.
|
||||||
|
- Açık zeminde: `<PixelSira sira={5} toplam={198} className="h-4" />` (8 hücre varsayılan).
|
||||||
|
- Renkli dolu zeminde: `zemin="koyu"` — işaret beyaz yanar, ısı fırçası kapanır.
|
||||||
|
- Anlamı her zaman yanındaki metin taşır ("5. / 198", "İlk %3"); şerit `aria-hidden`.
|
||||||
|
|
||||||
|
### 4.14 Üst çubuk başlık geçişi — `NavBaslik`, `nav-baslik.tsx`
|
||||||
|
iOS'taki büyük başlık davranışı: sayfa h1'i üst çubuğun altına girince üst çubuktaki
|
||||||
|
"KolayTercih" yazısı yukarı kayıp söner, yerine sayfanın logosu + adı gelir; dokununca sayfa
|
||||||
|
başına döner. Katalog detay sayfalarında (üniversite, bölüm) zorunlu; yeni detay sayfası
|
||||||
|
eklenince aynısı yapılır:
|
||||||
|
|
||||||
|
```tsx
|
||||||
|
<NavBaslik baslikId="uni-baslik" ad={uni.ad} logo={<UniLogo slug={slug} ad={uni.ad} boy="xs" />} />
|
||||||
|
<h1 id="uni-baslik" …>…</h1>
|
||||||
|
```
|
||||||
|
Logosu olmayan sayfada `logo` verilmez; üst çubukta **yalnız ad** görünür (bölüm sayfası —
|
||||||
|
Bilal'in kararı: yerine ikon konmaz, üst çubukta süs ikona gerek yok). Logo sunucuda üretilip
|
||||||
|
verilir (logo listesi istemciye inmez).
|
||||||
|
Hareket: yay `bounce: 0, duration: 0.35`, giriş ve çıkış aynı yoldan; "hareketi azalt"ta yalnız
|
||||||
|
opaklık.
|
||||||
|
|
||||||
|
### 4.15 Liste satırı (program/üniversite listeleri) — `universite-program-tablosu.tsx`
|
||||||
|
- **Ad kesilmez, sarar:** `whitespace-normal` + `block text-base font-semibold leading-snug`.
|
||||||
|
`truncate` ile "İngiliz Dili ve E…" yazılmaz.
|
||||||
|
- Ad linkinin hover'ı **mavi**: `transition-colors hover:text-primary hover:underline`
|
||||||
|
(§2.1 istisnası).
|
||||||
|
- Telefonda yalnız ad + satır butonları sütun olarak kalır; sayısal sütunlar (taban sıra vb.)
|
||||||
|
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.
|
||||||
|
- 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
|
## 5. Yerleşim
|
||||||
|
|
||||||
|
### 5.1 Genel
|
||||||
- Sayfa kabı: `mx-auto max-w-6xl px-4`. Metin sütunu: `max-w-xl` (paragraf) / `max-w-2xl`–`max-w-3xl` (uzun içerik).
|
- Sayfa kabı: `mx-auto max-w-6xl px-4`. Metin sütunu: `max-w-xl` (paragraf) / `max-w-2xl`–`max-w-3xl` (uzun içerik).
|
||||||
- Landing bölümü: `<section className="py-20 sm:py-24">`; alt sayfalar `py-12`–`py-16`.
|
- Landing bölümü: `<section className="py-20 sm:py-24">`; alt sayfalar `py-12`–`py-16`.
|
||||||
- Bölüm başlık bloğu (kanonik):
|
- Bölüm başlık bloğu (kanonik):
|
||||||
@@ -137,45 +361,118 @@ Yalnızca `lucide-react`. Boyut: `size-4` buton/satır içi (varsayılan), `size
|
|||||||
- Alt sayfa başlığının altında `PagePixelDivider` (`mt-6`/`mt-8`), her sayfada **farklı seed**.
|
- Alt sayfa başlığının altında `PagePixelDivider` (`mt-6`/`mt-8`), her sayfada **farklı seed**.
|
||||||
- Landing bölümleri arasında çizgi yok; `PixelDivider` (`mx-auto w-56`, farklı seed).
|
- Landing bölümleri arasında çizgi yok; `PixelDivider` (`mx-auto w-56`, farklı seed).
|
||||||
- Boşluk ölçeği: 4 → 6 → 8 → 12 → 16/20 → 24. Ara değer (`mt-7`, `gap-5`) yeni yerde açılmaz.
|
- Boşluk ölçeği: 4 → 6 → 8 → 12 → 16/20 → 24. Ara değer (`mt-7`, `gap-5`) yeni yerde açılmaz.
|
||||||
- Mobil önce (trafiğin ~%90'ı 375 px): uzun üniversite/program adları `min-w-0` + sarma ya da `truncate`; tablo yatay kaydırmaz, kart olur; sabit alt çubuk klavyeyle çakışmaz; `vh` yerine `dvh`.
|
- Mobil önce (trafiğin ~%90'ı 375 px): uzun adlar sarar (§4.15); tablo yatay kaydırmaz,
|
||||||
|
dar ekranda sütunlar satır altına iner; sabit alt çubuk klavyeyle çakışmaz; `vh` yerine `dvh`.
|
||||||
|
|
||||||
## 6. Derinlik ve katman
|
### 5.2 Geniş ekran dışında ortala
|
||||||
|
Alt sayfaların (katalog, detay) başlık bloğu **`lg` (1024 px) altında ortalı**, `lg`'de sola
|
||||||
|
yaslıdır — mobil uygulama gibi telefonda ve tablette her şey ortada, masaüstünde tablo ve
|
||||||
|
kartlarla aynı hizada:
|
||||||
|
- Yol satırı: `flex flex-wrap items-center justify-center gap-1.5 text-sm text-slate-500 lg:justify-start`
|
||||||
|
- Logo + h1: `flex flex-col items-center gap-4 text-center lg:flex-row lg:text-left` — logo
|
||||||
|
telefonda **başlığın üstünde, ortada**.
|
||||||
|
- Kimlik hapları: `flex flex-wrap items-center justify-center gap-2 lg:justify-start`
|
||||||
|
- Özet paragraf: `mx-auto … text-center lg:mx-0 lg:text-left`
|
||||||
|
- Sayfa ayracı: `mx-auto … lg:mx-0`; liste bölümü ve grup başlıkları `text-center lg:text-left`.
|
||||||
|
- **Ortalanmaz:** liste/tablo satırlarının içeriği (göz satırdan satıra kayarken ortalı liste
|
||||||
|
yorar), form alanları, uzun rehber metni.
|
||||||
|
- Alt sayfa (§4.10) içeriği her ekranda ortalıdır.
|
||||||
|
|
||||||
|
### 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
|
||||||
|
şeridi" (harita dahil altı değer tek satırda, yana kayan) reddedildi — harita küçüldü,
|
||||||
|
sayılar ezildi, ekran kalabalıklaştı.
|
||||||
|
|
||||||
|
## 6. Derinlik, katman ve hareket
|
||||||
|
|
||||||
Derinlik gölgeyle değil **piksel katmanı ve hareket farkıyla** verilir: başlık bloğu gövdeden hafif hızlı akar (`Parallax strength={16}` başlık, `7` içerik, `26` ayraç). Kartlar hover'da 4 px yükselir. Modal arka planı `bg-black/10` + hafif blur. Yığın: içerik < sabit bar < çekmece/modal (`z-50`).
|
Derinlik gölgeyle değil **piksel katmanı ve hareket farkıyla** verilir: başlık bloğu gövdeden hafif hızlı akar (`Parallax strength={16}` başlık, `7` içerik, `26` ayraç). Kartlar hover'da 4 px yükselir. Modal arka planı `bg-black/10` + hafif blur. Yığın: içerik < sabit bar < çekmece/modal (`z-50`).
|
||||||
|
|
||||||
|
Hareket kuralları (Apple, `motion/react`):
|
||||||
|
- Varsayılan yay: `{ type: "spring", bounce: 0, duration: 0.35 }` — sekmesiz, sakin. Sekme
|
||||||
|
yalnızca kullanıcı bir şeyi fırlattıysa (sürükle-bırak).
|
||||||
|
- Giriş ve çıkış **aynı yoldan** (aşağıdan geldiyse aşağı gider).
|
||||||
|
- Basınca anında tepki: `active:scale-[0.97]` (buton), `[0.99]` (geniş satır), `[0.96]` (çarpı).
|
||||||
|
- Hover'da ok `translate-x-0.5` kayar; kart yükselmesi yalnız landing kartında.
|
||||||
|
- Kaydırmaya bağlı tetik `IntersectionObserver` ile (kaydırma dinleyicisi değil).
|
||||||
|
- "Hareketi azalt": kayma/yay yok, yalnız opaklık (`useReducedMotion`,
|
||||||
|
`motion-reduce:transition-opacity`).
|
||||||
|
|
||||||
## 7. Yap / Yapma
|
## 7. Yap / Yapma
|
||||||
|
|
||||||
| Yap | Yapma (AI izi) |
|
| Yap | Yapma (AI izi) |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Rozet için `SectionEyebrow` | `Badge` import'u, elle `rounded-full border … px-3.5 py-1.5` span |
|
| Rozet için `SectionEyebrow` | `Badge` import'u, elle `rounded-full border … px-3.5 py-1.5` span |
|
||||||
| CTA: metin + sondaki `ArrowRight` | Başta `Sparkles`/yıldız ikonu, "✨" |
|
| CTA: metin + sondaki `ArrowRight` | Başta `Sparkles`/yıldız ikonu, "✨" |
|
||||||
| Nötr = slate; vurgu = primary mavi; aksiyon = orange-500 | `indigo/purple` primary, mor→mavi gradyan, `gray/zinc` nötr |
|
| Nötr = slate; vurgu = primary mavi; aksiyon ve hover = orange-500 | `indigo/purple` primary, mor→mavi gradyan, `gray/zinc` nötr |
|
||||||
|
| Hover'da tek turuncu (`orange-500`); liste satırı adı mavi (§2.1 istisnası) | Liste dışında hover'da mavi; aynı ekranda `orange-600` yazı + `orange-300` kenarlık |
|
||||||
| Kart: `rounded-2xl border-slate-200 bg-white shadow-sm` | Her şeyde `rounded-3xl`, camsı `backdrop-blur` kartlar, parlama gölgesi |
|
| Kart: `rounded-2xl border-slate-200 bg-white shadow-sm` | Her şeyde `rounded-3xl`, camsı `backdrop-blur` kartlar, parlama gölgesi |
|
||||||
| Hareket: `Reveal` (bölüm girişi), piksel ısısı, `kt-unblur`; `animate-ping` yalnızca "şu anda canlı" noktasında | Her elemanda `fade-up`, `whileHover scale 1.05`, `animate-bounce` |
|
| Sayı kartın en iri öğesi, ikon sağda küçük | İkon üstte büyük, sayı küçük; BÜYÜK HARFLİ `text-xs` etiket |
|
||||||
| Başlık `font-heading`, vurgu `font-bricolage` | Inter/Roboto/serif, tek kelimelik BÜYÜK HARF etiket |
|
| Sayfada ≤4 özet sayı, fazlası ayrıntı satırı → alt sayfa | 6+ kartı sayfaya dizmek ya da hepsini yatay şeride sıkıştırmak |
|
||||||
| Risk rengi + metin etiketi | Renk tek başına, "yerleşirsin" gibi vaat cümlesi |
|
| Harita gibi nefes alanını olduğu gibi bırakmak | Nefes alanını küçültüp bilgi şeridine gömmek |
|
||||||
|
| Alt sayfada kartsız, ortalı, tek ekrana sığan içerik | Çekmece içinde çerçeveli kart; bölümler arasında süs piksel ayraç |
|
||||||
|
| Gösterge kareleri masonry (kaymış sütun, farklı boy) | Hizalı eşit ızgara; 8 px'lik "neredeyse hizalı" kaymalar |
|
||||||
|
| Liste satırında ad sarar, sayı alt satıra iner | `truncate` ile yarım ad; 32 px satır butonu |
|
||||||
|
| Hareket: `Reveal`, piksel ısısı, `kt-unblur`, sekmesiz yay; `animate-ping` yalnızca "şu anda canlı" noktasında | Her elemanda `fade-up`, `whileHover scale 1.05`, `animate-bounce` |
|
||||||
|
| Başlık `font-heading`, vurgu `font-bricolage` | Inter/Roboto/serif, tek kelimelik BÜYÜK HARF etiket, 10–11 px yazı |
|
||||||
|
| Risk rengi + metin etiketi; tür ayrımı ikonla | Renk tek başına, "yerleşirsin" gibi vaat cümlesi |
|
||||||
| Üç kart yalnızca üç gerçek öğe varsa | Hero + üç kart iskeleti refleksi |
|
| Üç kart yalnızca üç gerçek öğe varsa | Hero + üç kart iskeleti refleksi |
|
||||||
| Beyaz zemin, tek koyu vurgu yüzeyi | İstenmemiş karanlık mod, `dark:` sınıfı |
|
| Beyaz zemin, tek koyu vurgu yüzeyi | İstenmemiş karanlık mod, `dark:` sınıfı |
|
||||||
| Kapatma çarpısı `DialogContent` varsayılanı | Başka boyut/renkte çarpı |
|
| Kapatma çarpısı `DialogContent` varsayılanı | Başka boyut/renkte çarpı |
|
||||||
|
|
||||||
## 8. Duyarlılık
|
## 8. Duyarlılık
|
||||||
|
|
||||||
- Kırılma noktaları: 375 (temel), 640 `sm:`, 768 `md:`, 1024 `lg:`. Her bileşen önce 375'te tasarlanır.
|
- Kırılma noktaları: 375 (temel), 640 `sm:`, 768 `md:`, 1024 `lg:`. Her bileşen önce 375'te
|
||||||
|
tasarlanır. Ortalı ↔ sola yaslı geçişi `lg`'dedir (§5.2).
|
||||||
- Dokunma hedefi en az 44 px (`h-11`, `size-11`); satır içi küçük buton `h-9` yalnızca masaüstü tablo aksiyonlarında.
|
- Dokunma hedefi en az 44 px (`h-11`, `size-11`); satır içi küçük buton `h-9` yalnızca masaüstü tablo aksiyonlarında.
|
||||||
- Başlık ölçeği bir kademe düşer (`text-3xl` → `sm:text-4xl`), gövde 16 px altına inmez.
|
- Başlık ölçeği bir kademe düşer (`text-3xl` → `sm:text-5xl` alt sayfa h1), gövde 16 px altına inmez.
|
||||||
- Modal genişliği `max-w-[calc(100%-2rem)]`; çekmece (`Drawer`) mobilde alttan açılır.
|
- Modal genişliği `max-w-[calc(100%-2rem)]`; ayrıntı her zaman çekmecede (`Drawer`), alttan açılır.
|
||||||
- `prefers-reduced-motion`: her animasyonun sade karşılığı var (`motion-reduce:animate-none`, `.kt-unblur-sade`).
|
- Çekmece içeriği 375×812'de kaydırmasız sığar (§4.10).
|
||||||
|
- `prefers-reduced-motion`: her animasyonun sade karşılığı var (`motion-reduce:animate-none`, `.kt-unblur-sade`, `useReducedMotion`).
|
||||||
|
|
||||||
## 9. Ajan için brief şablonu
|
## 9. Ajan için brief şablonu ve iş akışı
|
||||||
|
|
||||||
Yeni bir UI işi istenince önce şu dört satır doldurulur, sonra kod yazılır:
|
### 9.1 Brief
|
||||||
|
Yeni bir UI işi istenince önce şu beş satır doldurulur, sonra kod yazılır:
|
||||||
|
|
||||||
```
|
```
|
||||||
Amaç: Kim, hangi ekranda, ne yapacak? (ör. veli, /paket, fiyatı karşılaştırıp satın alacak)
|
Amaç: Kim, hangi ekranda, ne yapacak? (ör. veli, /paket, fiyatı karşılaştırıp satın alacak)
|
||||||
Referans: Sitedeki en yakın mevcut ekran/bileşen (dosya yolu). Yoksa "yok" yaz ve ana sayfa bölüm bloğunu al.
|
Referans: Sitedeki en yakın mevcut ekran/bileşen (dosya yolu). Yoksa üniversite sayfası.
|
||||||
Tek kaynak: Kullanılacak kanonik parçalar (SectionEyebrow, Button+ArrowRight, Card+PixelCorner, PagePixelDivider…)
|
Tek kaynak: Kullanılacak kanonik parçalar (SectionEyebrow, Button+ArrowRight, OzetKart, AkademikAyrinti, NavBaslik…)
|
||||||
Durumlar: boş / yükleniyor / hata / başarılı / girişsiz / kredisiz — hangileri var?
|
Durumlar: boş / yükleniyor / hata / başarılı / girişsiz / kredisiz — hangileri var?
|
||||||
|
His: Ekranın tek ana işi ne? Hangi 4 sayı önde, ne bir dokunuş derinde?
|
||||||
```
|
```
|
||||||
|
|
||||||
"Modern", "temiz", "şık" gibi yön belirtmeyen kelimeler kullanılmaz; yön = bu dosya.
|
"Modern", "temiz", "şık" gibi yön belirtmeyen kelimeler kullanılmaz; yön = bu dosya.
|
||||||
İş bitince: `pnpm tasarim:denetim` sıfır hata + 375 px'te tek bakış (taşma, üst üste binme, dokunma hedefi).
|
|
||||||
|
### 9.2 Ölç, tahmin etme
|
||||||
|
Bu dilde sorunların çoğu koddan görünmez (taşma, sığma, hizalanma). Tasarım işinde:
|
||||||
|
- **Sığma:** metin genişliğini tarayıcıda ölç (gizli `span` + `getBoundingClientRect`);
|
||||||
|
"sanırım sığar" ile yazma. Örnek: özet kartında "13.889" 36 px'te 95 px.
|
||||||
|
- **Hizasızlık:** masonry'de karelerin `top`/`bottom` değerlerini ölç; komşu fark ≥ 24 px.
|
||||||
|
- **Tek ekran:** çekmecede kaydırma kabının `scrollHeight` ≤ `clientHeight` (375×812).
|
||||||
|
- **Genişlikler:** 375 / 768 / 1280 px'te bak; ortalı ↔ sola yaslı geçişini `lg`'de doğrula.
|
||||||
|
- **Uç veri:** en uzun ad ("Adana Alparslan Türkeş Bilim ve Teknoloji Üniversitesi"), en
|
||||||
|
büyük sayı, verisi eksik kurum (URAP'ta olmayan, istatistiği olmayan).
|
||||||
|
|
||||||
|
### 9.3 Tuzaklar (23 Eyl 2026'da yaşandı)
|
||||||
|
- **Prettier'ı toplu çalıştırma.** Depo prettier düzeninde değil; bir dosyayı prettier'dan
|
||||||
|
geçirmek yüzlerce satırlık biçim farkı üretir ve başkasının kaydedilmemiş işine karışır.
|
||||||
|
Yalnız kendi yazdığın satırları elle düzenle.
|
||||||
|
- **Geliştirme sunucusunda ilk tık.** Kod değişikliğinden hemen sonra sunucu derleyip sayfayı
|
||||||
|
tazeleyebilir; o anda yapılan tıklama boşa gider. "Çekmece açılmıyor" demeden önce sayfa
|
||||||
|
hazır olduktan sonra tekrar dene.
|
||||||
|
- **Sayfada ikinci `<header>`.** Bölüm sayfasında içerik `<header>`'ı var; site üst çubuğunu
|
||||||
|
`querySelector("header")` ile değil, bilinen bir öğenin `closest("header")`'ı ile bul.
|
||||||
|
- **"use client" dosyasından sabit import etme.** Sunucu bileşeni o sabiti değer olarak
|
||||||
|
değil istemci referansı olarak alır; paylaşılan sabit ayrı dosyada durur ya da elle yazılır.
|
||||||
|
|
||||||
|
### 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).
|
||||||
|
Bir ekranı dönüştüren ajan o ekrandaki uyarıları sıfırlar ya da neden kaldığını yazar.
|
||||||
|
|
||||||
|
### 9.5 Bitirmeden
|
||||||
|
`pnpm tasarim:denetim` sıfır hata (uyarılar raporda listelenir) + 375 px'te tek bakış (taşma,
|
||||||
|
üst üste binme, dokunma hedefi, çekmece tek ekran) + §9.2 ölçümleri.
|
||||||
|
|||||||
74
public/urap-logo.svg
Normal file
74
public/urap-logo.svg
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Generator: visioncortex VTracer 0.6.12 -->
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="819" height="261" viewBox="0 0 819 261">
|
||||||
|
<path d="M0 0 C101.97 0 203.94 0 309 0 C309 4.62 309 9.24 309 14 C268.74 14.33 228.48 14.66 187 15 C192.28 16.98 197.56 18.96 203 21 C208.25 24.25 208.25 24.25 210.2 25.7 C212.06 27.05 213.93 28.02 216 29 C218 30 218 30 220.19 32.25 C222.38 34.39 224.31 35.98 226.81 37.69 C227.86 38.45 228.92 39.21 230 40 C230 40.66 230 41.32 230 42 C230.99 42.33 231.98 42.66 233 43 C235.78 45.18 237.16 48.01 238.84 51.06 C240.04 53.07 241.37 54.85 242.81 56.69 C260.17 79.55 266.1 108.87 262.62 137.1 C257.71 166.57 241.53 193.55 217.25 211.19 C206.46 218.78 194.62 224.15 182 228 C181.17 228.26 180.35 228.52 179.5 228.79 C170.66 231.32 162.05 231.55 152.94 231.5 C152.17 231.5 151.39 231.5 150.6 231.5 C138.41 231.45 127.49 230.29 116 226 C115.06 225.69 114.11 225.38 113.14 225.06 C86.66 215.66 64.29 193.69 52.19 168.75 C44.92 153.18 41.82 137.87 41.81 120.75 C41.8 119.69 41.79 118.64 41.78 117.55 C41.76 107.01 43.25 97.09 46.69 87.12 C46.82 86.74 46.82 86.74 47.48 84.81 C57.5 56.41 77.09 35.67 103 21 C107.95 19.02 112.9 17.04 118 15 C79.06 14.67 40.12 14.34 0 14 C0 9.38 0 4.76 0 0 Z " fill="#021D9A" transform="translate(18,16)"/>
|
||||||
|
<path d="M0 0 C1.78 -0.03 3.57 -0.13 5.35 -0.25 C22.87 -1.16 22.87 -1.16 28.38 1.84 C30.67 4.43 32.31 6.98 34 10 C35.5 12.05 37.03 14.1 38.56 16.12 C39.71 17.75 40.86 19.37 42 21 C40.44 24.47 39.4 25.35 36 27 C35.67 27.99 35.34 28.98 35 30 C35.99 30.33 36.98 30.66 38 31 C38.67 33.33 39.33 35.67 40 38 C40.99 38.33 41.98 38.66 43 39 C42.8 38.47 42.59 37.94 42.38 37.39 C42.11 36.68 41.84 35.98 41.56 35.25 C41.3 34.55 41.03 33.86 40.75 33.14 C40.04 31.11 39.49 29.1 39 27 C42.16 27.3 43.59 27.52 45.7 29.97 C53.59 43.94 53.59 43.94 52.57 49.26 C52.38 49.83 52.19 50.41 52 51 C49.36 51 46.72 51 44 51 C43.67 50.01 43.34 49.02 43 48 C42.01 48 41.02 48 40 48 C41.88 51.57 43.17 53.55 47 55 C47.33 54.34 47.66 53.68 48 53 C51.88 53.88 51.88 53.88 53 55 C53.38 57.81 53.38 57.81 53 61 C50.94 63.12 50.94 63.12 48 65 C47.72 65.19 47.72 65.19 46.32 66.13 C42.32 68.68 39.65 69.18 35 69 C34.61 68.2 34.23 67.41 33.83 66.59 C31.16 61.16 28.55 55.91 25 51 C25 54.53 25.92 56.74 27.25 60 C27.67 61.05 28.09 62.1 28.52 63.19 C30.06 66.11 31.38 67.12 34 69 C34 69.99 34 70.98 34 72 C37.63 72 41.26 72 45 72 C44.65 77.81 42.4 80.37 38.5 84.31 C37.99 84.85 37.48 85.39 36.95 85.94 C35.32 87.65 33.67 89.33 32 91 C32.08 94.56 32.18 98.1 32.39 101.65 C32.45 103.87 32.45 105.83 32 108 C29.54 110.32 29.54 110.32 27 112 C26.54 113.89 26.09 115.79 25.73 117.7 C24.02 123.09 19.97 128.03 16 132 C13.4 132.41 13.4 132.41 10.38 132.62 C9.87 132.66 9.87 132.66 7.34 132.85 C6.57 132.9 5.79 132.95 5 133 C2.9 127.31 1.55 122.05 1 116 C0.01 115.67 -0.98 115.34 -2 115 C-2.12 107.25 -2.12 107.25 -1 105 C-0.61 99.2 -1.14 96.16 -4 91 C-5.29 86.95 -4.85 84.81 -3 81 C-3.99 81.16 -3.99 81.16 -9 82 C-9.33 81.34 -9.66 80.68 -10 80 C-12.06 79.38 -12.06 79.38 -14 79 C-14.33 79.99 -14.66 80.98 -15 82 C-16.85 82.95 -16.85 82.95 -19.06 83.69 C-19.8 83.94 -20.53 84.19 -21.29 84.45 C-21.85 84.63 -22.42 84.81 -23 85 C-23 85.66 -23 86.32 -23 87 C-23.64 87.43 -24.28 87.87 -24.94 88.31 C-27.5 90.41 -27.65 91.78 -28 95 C-28.66 95 -29.32 95 -30 95 C-30.33 95.66 -30.66 96.32 -31 97 C-31.66 96.67 -32.32 96.34 -33 96 C-33.66 96.99 -34.32 97.98 -35 99 C-37.3 100.07 -39.63 101.08 -42 102 C-42.33 101.34 -42.66 100.68 -43 100 C-43.5 100.16 -43.5 100.16 -46 101 C-46 100.34 -46 99.68 -46 99 C-47.65 100.32 -49.3 101.64 -51 103 C-51 102.34 -51 101.68 -51 101 C-53.53 102.21 -55.1 103 -57 105 C-57.8 107.52 -58.19 109.97 -58.59 112.59 C-59.11 115.65 -60 117.63 -62 120 C-62.87 120.31 -63.73 120.62 -64.62 120.94 C-65.41 121.29 -66.19 121.64 -67 122 C-67.69 125.06 -67.69 125.06 -68 128 C-68.66 128.33 -69.32 128.66 -70 129 C-70.62 131.56 -70.62 131.56 -71 134 C-71.8 134.12 -72.61 134.25 -73.44 134.38 C-74.28 134.58 -75.13 134.79 -76 135 C-76.33 135.66 -76.66 136.32 -77 137 C-76.34 137 -75.68 137 -75 137 C-75.25 138.88 -75.25 138.88 -76 141 C-77.32 141.7 -78.65 142.37 -80 143 C-81.35 147.04 -81.57 150.77 -81 155 C-79 157.88 -79 157.88 -77 160 C-77 160.99 -77 161.98 -77 163 C-80.65 163 -82.91 162.8 -85.88 160.61 C-97.15 149 -95.69 132.44 -95.86 117.41 C-96 115 -96 115 -97 113 C-97.99 112.67 -98.98 112.34 -100 112 C-101.75 110.11 -101.75 110.11 -103.56 107.75 C-104.16 106.98 -104.76 106.21 -105.38 105.42 C-109.15 99.79 -109.73 94.64 -109 88 C-107.5 84.5 -107.5 84.5 -106 82 C-106 81.34 -106 80.68 -106 80 C-106.99 80.16 -106.99 80.16 -112 81 C-112.37 79.89 -112.74 78.77 -113.12 77.62 C-114.46 74.45 -114.7 74.13 -118.06 72.69 C-119.03 72.46 -120 72.23 -121 72 C-121.66 71.34 -122.32 70.68 -123 70 C-124.95 69.54 -124.95 69.54 -127.25 69.19 C-131.86 68.21 -134.81 66.46 -138 63 C-138.63 62.32 -139.27 61.65 -139.92 60.95 C-143.65 56.63 -145.52 54.08 -145.27 48.1 C-144.82 44.59 -143.69 41.46 -142.38 38.19 C-142.1 37.49 -141.83 36.8 -141.55 36.08 C-137.26 25.41 -131.74 16.54 -124 8 C-123.47 7.34 -122.94 6.69 -122.4 6.01 C-118.84 1.93 -116.24 -0.48 -110.72 -1.01 C-108.7 -1.05 -106.68 -1.05 -104.66 -1.02 C-103.55 -1.03 -102.44 -1.04 -101.3 -1.05 C-97.65 -1.09 -94 -1.06 -90.35 -1.04 C-87.81 -1.05 -85.27 -1.06 -82.73 -1.08 C-77.42 -1.1 -72.11 -1.11 -66.8 -1.09 C-59.31 -1.06 -51.81 -1.08 -44.32 -1.11 C-33.73 -1.16 -23.15 -1.18 -12.56 -1.15 C-11.52 -1.15 -10.47 -1.15 -9.39 -1.15 C-8.44 -1.15 -7.49 -1.14 -6.51 -1.14 C-5.69 -1.13 -4.86 -1.13 -4 -1.13 C-2 -1 -2 -1 0 0 Z " fill="#042FA4" transform="translate(219,64)"/>
|
||||||
|
<path d="M0 0 C101.97 0 203.94 0 309 0 C309 4.62 309 9.24 309 14 C268.74 14.33 228.48 14.66 187 15 C192.28 16.98 197.56 18.96 203 21 C208.25 24.25 208.25 24.25 210.2 25.7 C212.06 27.05 213.93 28.02 216 29 C218 30 218 30 220.19 32.25 C222.38 34.39 224.31 35.98 226.81 37.69 C227.86 38.45 228.92 39.21 230 40 C230 40.66 230 41.32 230 42 C230.99 42.33 231.98 42.66 233 43 C233.99 44.32 234.98 45.64 236 47 C181.55 47 127.1 47 71 47 C83.14 30.82 99.32 22.47 118 15 C79.06 14.67 40.12 14.34 0 14 C0 9.38 0 4.76 0 0 Z " fill="#201E22" transform="translate(18,16)"/>
|
||||||
|
<path d="M0 0 C22.02 -1.62 22.02 -1.62 28.38 1.84 C30.67 4.43 32.31 6.99 34 10 C35.5 12.05 37.03 14.1 38.56 16.12 C39.71 17.75 40.86 19.37 42 21 C40.44 24.47 39.4 25.35 36 27 C35.84 27.5 35.84 27.5 35 30 C35.5 30.16 35.5 30.16 38 31 C38.67 33.33 39.33 35.67 40 38 C40.5 38.16 40.5 38.16 43 39 C42.8 38.47 42.59 37.94 42.38 37.39 C42.11 36.68 41.84 35.98 41.56 35.25 C41.3 34.55 41.03 33.86 40.75 33.14 C40.04 31.11 39.49 29.1 39 27 C42.16 27.3 43.59 27.52 45.7 29.97 C53.59 43.94 53.59 43.94 52.57 49.26 C52.38 49.83 52.19 50.41 52 51 C49.36 51 46.72 51 44 51 C43.67 50.01 43.34 49.02 43 48 C42.01 48 41.02 48 40 48 C41.88 51.57 43.17 53.55 47 55 C47.16 54.67 47.16 54.67 48 53 C51.88 53.88 51.88 53.88 53 55 C53.38 57.81 53.38 57.81 53 61 C50.94 63.12 50.94 63.12 48 65 C47.45 65.37 46.89 65.75 46.32 66.13 C42.32 68.68 39.65 69.18 35 69 C34.61 68.2 34.23 67.41 33.83 66.59 C31.16 61.16 28.55 55.91 25 51 C25 54.53 25.92 56.74 27.25 60 C27.67 61.05 28.09 62.1 28.52 63.19 C30.06 66.11 31.38 67.12 34 69 C34 69.99 34 70.98 34 72 C37.63 72 41.26 72 45 72 C44.65 77.81 42.4 80.37 38.5 84.31 C37.99 84.85 37.48 85.39 36.95 85.94 C35.32 87.65 33.67 89.33 32 91 C32.08 94.56 32.18 98.1 32.39 101.65 C32.45 103.87 32.45 105.83 32 108 C29.54 110.32 29.54 110.32 27 112 C26.54 113.89 26.09 115.79 25.73 117.7 C24.02 123.09 19.97 128.03 16 132 C13.4 132.41 13.4 132.41 10.38 132.62 C9.87 132.66 9.87 132.66 7.34 132.85 C6.57 132.9 5.79 132.95 5 133 C2.9 127.31 1.55 122.05 1 116 C0.01 115.67 -0.98 115.34 -2 115 C-2.12 107.25 -2.12 107.25 -1 105 C-0.61 99.2 -1.14 96.16 -4 91 C-5.29 86.95 -4.85 84.81 -3 81 C-3.99 81.16 -3.99 81.16 -9 82 C-9.16 81.67 -9.16 81.67 -10 80 C-12.06 79.38 -12.06 79.38 -14 79 C-14.33 79.99 -14.66 80.98 -15 82 C-21.94 82.33 -26.34 81.36 -31.69 76.75 C-35.92 72.83 -35.92 72.83 -36.27 69.2 C-36.18 68.48 -36.09 67.75 -36 67 C-35.5 66.84 -35.5 66.84 -33 66 C-33.31 65.26 -33.62 64.51 -33.94 63.75 C-34.29 62.84 -34.64 61.94 -35 61 C-35.31 60.34 -35.62 59.68 -35.94 59 C-36 57 -36 57 -33.75 54.44 C-32.84 53.63 -31.94 52.83 -31 52 C-30.46 51.42 -29.93 50.84 -29.38 50.25 C-28 49 -28 49 -25 48 C-24.88 47.22 -24.75 46.43 -24.62 45.62 C-24 43 -24 43 -22 41 C-15.44 38.96 -8.81 38.74 -2 39 C-2 40.65 -2 42.3 -2 44 C-1.22 44.14 -0.43 44.29 0.38 44.44 C3 45 3 45 5 46 C5 46.66 5 47.32 5 48 C7.51 46.74 7.87 45.5 9 43 C12.88 44.88 12.88 44.88 14 46 C17.49 46.19 20.6 45.78 24 45 C24.33 43.35 24.66 41.7 25 40 C24.34 40.16 24.34 40.16 21 41 C21 40.34 21 39.68 21 39 C20.34 39 19.68 39 19 39 C19 39.66 19 40.32 19 41 C17.06 40.19 17.06 40.19 15 39 C14.67 38.01 14.34 37.02 14 36 C13.01 35.67 12.02 35.34 11 35 C11 36.32 11 37.64 11 39 C9.06 38.31 9.06 38.31 7 37 C6.88 36.22 6.75 35.43 6.62 34.62 C6 32 6 32 2.94 29.69 C1.97 29.13 1 28.57 0 28 C0.66 29.65 1.32 31.3 2 33 C2.66 33 3.32 33 4 33 C3.67 34.65 3.34 36.3 3 38 C2.34 38.16 2.34 38.16 -1 39 C-1 38.34 -1 37.68 -1 37 C-0.01 37 0.98 37 2 37 C2 36.34 2 35.68 2 35 C1.38 34.77 0.76 34.55 0.12 34.31 C-2.61 32.62 -3.05 31.01 -4 28 C-4.66 28 -5.32 28 -6 28 C-6 28.99 -6 29.98 -6 31 C-7.65 31 -9.3 31 -11 31 C-11.33 31.99 -11.66 32.98 -12 34 C-13.78 37.78 -13.78 37.78 -15 39 C-18.34 39.14 -21.66 39.04 -25 39 C-25 35.7 -25 32.4 -25 29 C-18.25 28.88 -18.25 28.88 -16 30 C-16.38 27.06 -16.38 27.06 -17 24 C-17.66 23.67 -18.32 23.34 -19 23 C-18.12 18.25 -18.12 18.25 -17 16 C-17.99 16 -18.98 16 -20 16 C-20 14.68 -20 13.36 -20 12 C-18.35 12 -16.7 12 -15 12 C-14.01 14.31 -13.02 16.62 -12 19 C-7.32 17.52 -7.32 17.52 -5.69 14.88 C-5.46 14.26 -5.23 13.64 -5 13 C-5.99 12.67 -6.98 12.34 -8 12 C-8.44 9.81 -8.44 9.81 -8 7 C-6.31 5.48 -4.56 4.31 -2.63 3.11 C-1 2 -1 2 0 0 Z " fill="#FAFAFD" transform="translate(219,64)"/>
|
||||||
|
<path d="M0 0 C1.6 0.04 3.2 0.08 4.8 0.11 C8.71 0.2 12.6 0.33 16.5 0.5 C13.86 3.93 12.05 6.11 8 7.75 C7.25 8.06 6.49 8.38 5.72 8.7 C3.66 9.44 1.63 10.02 -0.5 10.5 C-0.5 11.49 -0.5 12.48 -0.5 13.5 C0.3 13.95 1.11 14.41 1.94 14.88 C4.5 16.5 4.5 16.5 5.31 19.19 C5.37 19.95 5.44 20.71 5.5 21.5 C6.12 20.7 6.74 19.89 7.38 19.06 C9.5 16.5 9.5 16.5 11.5 15.5 C11.81 14.72 12.12 13.93 12.44 13.12 C13.49 10.52 14.32 9.22 16.5 7.5 C17.16 7.5 17.82 7.5 18.5 7.5 C18.5 8.16 18.5 8.82 18.5 9.5 C19.16 9.5 19.82 9.5 20.5 9.5 C20.66 10 20.66 10 21.5 12.5 C22.66 12.34 22.66 12.34 28.5 11.5 C28.55 11.8 28.55 11.8 28.83 13.29 C29.77 17.96 30.83 21.49 33.5 25.5 C33.5 26.16 33.5 26.82 33.5 27.5 C31.19 27.83 28.88 28.16 26.5 28.5 C26.34 27.67 26.34 27.67 25.5 23.5 C20.62 25.25 20.62 25.25 19.5 27.5 C20.49 27.5 21.48 27.5 22.5 27.5 C22.5 28.49 22.5 29.48 22.5 30.5 C20.85 30.5 19.2 30.5 17.5 30.5 C17.5 31.82 17.5 33.14 17.5 34.5 C16.51 34.5 15.52 34.5 14.5 34.5 C14.5 33.84 14.5 33.18 14.5 32.5 C8.66 34.39 4.72 37.61 1.44 42.69 C-0.68 45.77 -1.96 46.52 -5.5 47.5 C-5.41 48.06 -5.41 48.06 -4.94 50.88 C-4.5 54.5 -4.5 54.5 -5.5 56.5 C-8.43 56.07 -9.62 55.4 -11.94 53.44 C-14.5 51.5 -14.5 51.5 -16.94 50.94 C-20.85 51.8 -22.8 53.61 -25.5 56.5 C-25.95 59.74 -25.96 61.57 -24.5 64.5 C-22.03 63.35 -20.45 62.45 -18.5 60.5 C-15.88 60.38 -15.88 60.38 -13.5 60.5 C-13.81 62.44 -13.81 62.44 -14.5 64.5 C-15 64.66 -15 64.66 -17.5 65.5 C-17.5 66.49 -17.5 67.48 -17.5 68.5 C-15.52 68.5 -13.54 68.5 -11.5 68.5 C-10.52 71.43 -10.42 73.46 -10.5 76.5 C-8.19 76.75 -8.19 76.75 -5.5 76.5 C-5 75.84 -4.51 75.18 -4 74.5 C-3.5 73.84 -3.01 73.18 -2.5 72.5 C0.76 72.08 3.36 72.71 6.5 73.5 C7.35 73.44 8.19 73.38 9.06 73.31 C9.46 73.34 9.46 73.34 11.5 73.5 C11.96 74.12 12.41 74.73 12.88 75.37 C14.7 77.76 16.12 78.53 18.81 79.81 C22.12 81.54 24.27 83.12 26.56 86.06 C30.25 90.77 34.94 92.5 40.38 94.62 C42.5 95.5 42.5 95.5 44.5 97.5 C44.15 100.94 43.45 102.57 41.5 105.5 C41.13 107.11 40.82 108.74 40.56 110.38 C39.82 114.31 39.14 117.37 36.5 120.5 C35.63 120.81 34.77 121.12 33.88 121.44 C33.09 121.79 32.31 122.14 31.5 122.5 C30.81 125.56 30.81 125.56 30.5 128.5 C29.84 128.83 29.18 129.16 28.5 129.5 C27.88 132.06 27.88 132.06 27.5 134.5 C26.7 134.62 25.89 134.75 25.06 134.88 C24.22 135.08 23.37 135.29 22.5 135.5 C22.17 136.16 21.84 136.82 21.5 137.5 C22.16 137.5 22.82 137.5 23.5 137.5 C23.25 139.38 23.25 139.38 22.5 141.5 C21.18 142.2 19.85 142.87 18.5 143.5 C17.15 147.54 16.93 151.27 17.5 155.5 C19.5 158.38 19.5 158.38 21.5 160.5 C21.5 161.49 21.5 162.48 21.5 163.5 C17.85 163.5 15.59 163.3 12.62 161.11 C1.35 149.5 2.81 132.94 2.64 117.91 C2.5 115.5 2.5 115.5 1.5 113.5 C0.51 113.17 -0.48 112.84 -1.5 112.5 C-3.25 110.61 -3.25 110.61 -5.06 108.25 C-5.66 107.48 -6.26 106.71 -6.88 105.92 C-10.65 100.29 -11.23 95.14 -10.5 88.5 C-9 85 -9 85 -7.5 82.5 C-7.5 81.84 -7.5 81.18 -7.5 80.5 C-8.49 80.66 -8.49 80.66 -13.5 81.5 C-13.87 80.39 -14.24 79.27 -14.62 78.12 C-15.96 74.95 -16.2 74.63 -19.56 73.19 C-20.53 72.96 -21.5 72.73 -22.5 72.5 C-23.16 71.84 -23.82 71.18 -24.5 70.5 C-26.45 70.04 -26.45 70.04 -28.75 69.69 C-33.36 68.71 -36.31 66.96 -39.5 63.5 C-40.13 62.82 -40.77 62.15 -41.42 61.45 C-45.15 57.13 -47.02 54.58 -46.77 48.6 C-46.32 45.09 -45.19 41.96 -43.88 38.69 C-43.6 37.99 -43.33 37.3 -43.05 36.58 C-38.76 25.91 -33.24 17.04 -25.5 8.5 C-25.02 7.81 -24.54 7.12 -24.04 6.41 C-17.67 -1.68 -9.35 -0.41 0 0 Z " fill="#FBFBFD" transform="translate(120.5,63.5)"/>
|
||||||
|
<path d="M0 0 C0.06 0.91 0.11 1.83 0.17 2.77 C5.03 81.94 5.03 81.94 6.69 107.5 C6.75 108.4 6.8 109.31 6.87 110.24 C7.62 121.75 8.43 133.26 9.44 144.76 C9.48 145.19 9.48 145.19 9.67 147.37 C9.73 148.08 9.8 148.79 9.86 149.53 C10.06 153.01 10 156.51 10 160 C0.43 160 -9.14 160 -19 160 C-18.83 157.69 -18.66 155.37 -18.48 152.99 C-16.88 131.08 -15.41 109.17 -14 87.25 C-13.92 85.93 -13.83 84.62 -13.74 83.26 C-13.24 75.42 -12.74 67.57 -12.24 59.73 C-11.66 50.72 -11.09 41.72 -10.5 32.71 C-10.32 29.84 -10.13 26.96 -9.95 24.08 C-9.43 16.04 -8.89 8.01 -8 0 C-4.71 -1.1 -3.29 -0.8 0 0 Z " fill="#1E1D26" transform="translate(23,51)"/>
|
||||||
|
<path d="M0 0 C0.33 0.99 0.66 1.98 1 3 C1.74 3 2.49 3 3.25 3 C10.5 3 10.5 3 14 4 C14.16 4.66 14.16 4.66 15 8 C14.01 8.66 13.02 9.32 12 10 C12.14 10.56 12.29 11.11 12.44 11.69 C13.03 14.11 13.52 16.55 14 19 C13.67 19.16 13.67 19.16 12 20 C11.63 23.25 11.67 24.58 13.72 27.2 C18.47 31.35 21.58 34 28 34 C28 34.66 28 35.32 28 36 C26.69 37.03 25.35 38.02 24 39 C20.7 41.83 19.48 43.65 19 48 C18.34 48 17.68 48 17 48 C16.84 48.33 16.84 48.33 16 50 C15.67 49.84 15.67 49.84 14 49 C13.34 49.99 12.68 50.98 12 52 C9.7 53.07 7.37 54.08 5 55 C4.67 54.34 4.34 53.68 4 53 C3.01 53.33 2.02 53.66 1 54 C1 53.34 1 52.68 1 52 C-0.65 53.32 -2.3 54.64 -4 56 C-4 55.34 -4 54.68 -4 54 C-5.32 54.99 -6.64 55.98 -8 57 C-8.66 56.67 -9.32 56.34 -10 56 C-9.34 55.34 -8.68 54.68 -8 54 C-8.05 51.54 -8.05 51.54 -9 49 C-11.33 47.56 -11.33 47.56 -14.25 46.44 C-21 43.62 -25.58 40.71 -29 34 C-28.25 31.12 -28.25 31.12 -27 29 C-27.66 28.67 -28.32 28.34 -29 28 C-30.17 24.11 -30.17 22.41 -28.56 18.62 C-28.05 17.76 -27.53 16.89 -27 16 C-26.34 16 -25.68 16 -25 16 C-24.92 15.39 -24.84 14.79 -24.76 14.16 C-23.51 10.59 -20.64 9.77 -17.42 8.1 C-14.32 6.69 -11.29 5.86 -8 5 C-7.01 4.34 -6.02 3.68 -5 3 C-6.65 3 -8.3 3 -10 3 C-9.67 2.01 -9.34 1.02 -9 0 C-5.8 -1.37 -3.3 -0.83 0 0 Z " fill="#2C4BB0" transform="translate(172,111)"/>
|
||||||
|
<path d="M0 0 C-0.33 1.98 -0.66 3.96 -1 6 C2.96 6.33 6.92 6.66 11 7 C11.99 12.61 12.98 18.22 14 24 C16.31 18.39 18.62 12.78 21 7 C23.64 7 26.28 7 29 7 C25.96 14.73 22.56 22.29 19.06 29.81 C18.66 30.71 18.25 31.6 17.83 32.52 C14.68 39.23 11.19 46.08 4 49 C3.01 49 2.02 49 1 49 C0.67 46.69 0.34 44.38 0 42 C0.95 41.4 1.9 40.8 2.88 40.19 C6 38 6 38 8 35 C8.05 33.09 8.05 33.09 7.75 30.94 C7.64 30.15 7.54 29.36 7.43 28.54 C6.85 25.13 6.16 21.74 5.4 18.36 C4.98 15.86 4.93 13.53 5 11 C4.34 11 3.68 11 3 11 C3 11.66 3 12.32 3 13 C1.02 13 -0.96 13 -3 13 C-3.06 13.64 -3.12 14.28 -3.18 14.94 C-3.67 19.98 -4.24 24.99 -5 30 C-3.68 30 -2.36 30 -1 30 C-0.96 32 -0.96 34 -1 36 C-2 37 -2 37 -5.38 37.25 C-9 37 -9 37 -10.71 35.73 C-13.54 31.94 -12.17 26.18 -11.54 21.74 C-11.06 18.82 -10.55 15.91 -10 13 C-10.99 13 -11.98 13 -13 13 C-12.67 11.02 -12.34 9.04 -12 7 C-10.68 7 -9.36 7 -8 7 C-8 5.02 -8 3.04 -8 1 C-2.25 -1.12 -2.25 -1.12 0 0 Z " fill="#2D2D32" transform="translate(527,25)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.33 0.66 6.66 1.32 7 2 C7.99 1.34 8.98 0.68 10 0 C12.7 -0.42 15.3 -0.39 18 0 C20 1.5 20 1.5 21 3 C21.5 2.5 21.99 2.01 22.5 1.5 C26.29 -0.77 28.61 -0.56 33 0 C35.22 2.72 35.97 4.43 36.14 7.95 C36.03 8.99 35.93 10.04 35.81 11.12 C35.7 12.26 35.58 13.39 35.46 14.55 C34.81 19.4 33.99 24.21 33 29 C30.69 29 28.38 29 26 29 C26.14 27.93 26.29 26.85 26.44 25.75 C26.63 24.31 26.81 22.87 27 21.44 C27.1 20.73 27.19 20.03 27.29 19.3 C27.87 14.83 28.09 10.51 28 6 C26.35 6.33 24.7 6.66 23 7 C22.35 9.54 21.71 12.08 21.06 14.62 C20.88 15.34 20.7 16.05 20.51 16.79 C19.49 20.84 18.62 24.86 18 29 C15.69 29 13.38 29 11 29 C11.14 27.93 11.29 26.85 11.44 25.75 C11.63 24.31 11.81 22.87 12 21.44 C12.1 20.73 12.19 20.03 12.29 19.3 C12.87 14.83 13.09 10.51 13 6 C10.69 6.5 10.69 6.5 8 8 C5.18 13.63 4.31 19.35 3.43 25.56 C3 28 3 28 2 29 C0 29.04 -2 29.04 -4 29 C-3.45 19.17 -1.82 9.65 0 0 Z " fill="#2D2D32" transform="translate(672,96)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.33 0.66 6.66 1.32 7 2 C7.99 1.34 8.98 0.68 10 0 C12.7 -0.42 15.3 -0.39 18 0 C20 1.5 20 1.5 21 3 C21.5 2.5 21.99 2.01 22.5 1.5 C26.29 -0.77 28.61 -0.56 33 0 C35.22 2.72 35.97 4.43 36.14 7.95 C36.03 8.99 35.93 10.04 35.81 11.12 C35.7 12.26 35.58 13.39 35.46 14.55 C34.81 19.4 33.99 24.21 33 29 C30.69 29 28.38 29 26 29 C26.14 27.93 26.29 26.85 26.44 25.75 C26.63 24.31 26.81 22.87 27 21.44 C27.1 20.73 27.19 20.03 27.29 19.3 C27.87 14.83 28.09 10.51 28 6 C26.35 6.33 24.7 6.66 23 7 C22.35 9.54 21.71 12.08 21.06 14.62 C20.88 15.34 20.7 16.05 20.51 16.79 C19.49 20.84 18.62 24.86 18 29 C15.69 29 13.38 29 11 29 C11.14 27.93 11.29 26.85 11.44 25.75 C11.63 24.31 11.81 22.87 12 21.44 C12.1 20.73 12.19 20.03 12.29 19.3 C12.87 14.83 13.09 10.51 13 6 C10.69 6.5 10.69 6.5 8 8 C5.18 13.63 4.31 19.35 3.43 25.56 C3 28 3 28 2 29 C0 29.04 -2 29.04 -4 29 C-3.45 19.17 -1.82 9.65 0 0 Z " fill="#2D2D32" transform="translate(467,96)"/>
|
||||||
|
<path d="M0 0 C0.95 0.01 1.9 0.01 2.88 0.02 C5.44 0.19 5.44 0.19 8.44 1.19 C8.15 9.12 7.13 16.83 5.69 24.62 C5.54 25.48 5.4 26.33 5.25 27.21 C4.14 32.88 2.58 36.11 -1.56 40.19 C-6.54 42.79 -11.21 42.25 -16.56 41.19 C-17.22 40.86 -17.88 40.53 -18.56 40.19 C-18.4 39.2 -18.4 39.2 -17.56 34.19 C-13.27 34.19 -8.98 34.19 -4.56 34.19 C-4.4 33.2 -4.4 33.2 -3.56 28.19 C-4.22 28.52 -4.88 28.85 -5.56 29.19 C-11.81 29.77 -11.81 29.77 -14.94 27.38 C-17.88 23.41 -17.88 20 -17.56 15.19 C-16.06 8.95 -13.34 4.52 -7.75 1.07 C-5.04 -0.02 -2.91 -0.04 0 0 Z M-7.38 8.75 C-9.82 12.08 -10.49 15.03 -10.56 19.19 C-9.62 21.62 -9.62 21.62 -8.56 23.19 C-5.66 22.87 -4.03 22.67 -1.97 20.53 C-0.24 17.65 0.16 15.25 0.62 11.94 C0.78 10.86 0.94 9.78 1.11 8.67 C1.22 7.85 1.32 7.03 1.44 6.19 C-4.21 5.87 -4.21 5.87 -7.38 8.75 Z " fill="#2D2D32" transform="translate(733.5625,31.8125)"/>
|
||||||
|
<path d="M0 0 C3.25 1.24 5.41 2.82 7 6 C7.51 12.14 7.01 15.05 3 20 C2.34 20.66 1.68 21.32 1 22 C1.31 22.93 1.62 23.86 1.94 24.81 C3.38 29.78 3.65 34.86 4 40 C1.36 40 -1.28 40 -4 40 C-4.05 39.25 -4.1 38.5 -4.15 37.73 C-4.22 36.75 -4.3 35.76 -4.38 34.75 C-4.44 33.78 -4.51 32.8 -4.59 31.8 C-5 29.01 -5.31 27.26 -7 25 C-9.62 24.25 -9.62 24.25 -12 24 C-12.06 24.74 -12.12 25.47 -12.18 26.23 C-12.27 27.21 -12.35 28.18 -12.44 29.19 C-12.52 30.15 -12.6 31.11 -12.68 32.11 C-12.98 34.79 -13.43 37.37 -14 40 C-16.31 40 -18.62 40 -21 40 C-19.95 30.47 -18.59 21.02 -17 11.56 C-16.83 10.54 -16.67 9.51 -16.5 8.46 C-16.33 7.5 -16.17 6.55 -16 5.57 C-15.86 4.71 -15.71 3.85 -15.56 2.97 C-15.38 2.32 -15.19 1.67 -15 1 C-10.59 -1.21 -4.8 -0.44 0 0 Z M-9 6 C-9.66 9.96 -10.32 13.92 -11 18 C-5 18 -5 18 -2.06 15.81 C0 13 0 13 -0.06 10.31 C-1 8 -1 8 -3 6 C-4.98 6 -6.96 6 -9 6 Z " fill="#2D2D32" transform="translate(585,21)"/>
|
||||||
|
<path d="M0 0 C2.31 0 4.62 0 7 0 C6.57 5.79 5.96 11.47 4.94 17.19 C2.91 28.82 2.91 28.82 5 33 C10.51 33.37 10.51 33.37 12.61 31.8 C18.53 24.13 18.52 9.46 20 0 C22.31 0 24.62 0 27 0 C25.35 29.96 25.35 29.96 16.44 38.44 C12.25 41.12 8.9 41.34 4 41 C0.62 39.62 -0.73 38.39 -2.81 35.38 C-5.61 27.42 -3.5 18.99 -2 10.94 C-1.9 10.41 -1.9 10.41 -1.42 7.74 C-0.95 5.16 -0.48 2.58 0 0 Z " fill="#2D2D32" transform="translate(343,21)"/>
|
||||||
|
<path d="M0 0 C2.31 0 4.62 0 7 0 C5.39 14.06 3.2 28.02 1 42 C-2.33 42 -5.67 42 -9 42 C-10.11 42.25 -11.23 42.5 -12.38 42.75 C-16 43 -16 43 -18.88 41.25 C-22.1 37.83 -22.29 34.79 -22.21 30.19 C-21.57 23.67 -18.99 19.24 -14 15 C-9.8 12.2 -7 12.86 -2 13 C-1.34 8.71 -0.68 4.42 0 0 Z M-11.81 21.5 C-14.56 25.26 -15 28.38 -15 33 C-13.56 35.5 -13.56 35.5 -12 37 C-9.69 36.44 -9.69 36.44 -7 35 C-4.05 29.83 -3.39 24.88 -3 19 C-7.24 18.41 -8.55 18.6 -11.81 21.5 Z " fill="#2D2D32" transform="translate(435,83)"/>
|
||||||
|
<path d="M0 0 C2.05 0.03 4.1 0.07 6.15 0.1 C7.76 8.98 8.86 17.87 9.78 26.85 C9.91 28.13 10.05 29.41 10.18 30.73 C10.51 33.85 10.83 36.97 11.15 40.1 C8.51 40.1 5.87 40.1 3.15 40.1 C3.15 36.47 3.15 32.84 3.15 29.1 C-0.48 29.1 -4.11 29.1 -7.85 29.1 C-8.32 30.54 -8.8 31.99 -9.29 33.47 C-10.04 35.77 -10.76 37.93 -11.85 40.1 C-14.49 40.1 -17.13 40.1 -19.85 40.1 C-15.94 30.33 -11.82 20.68 -7.47 11.1 C-7.03 10.12 -6.59 9.15 -6.14 8.15 C-5.93 7.7 -5.93 7.7 -4.89 5.41 C-4.52 4.6 -4.15 3.79 -3.77 2.96 C-2.37 0.13 -2.37 0.13 0 0 Z M0.15 9.1 C-0.69 11.05 -1.52 13.01 -2.35 14.97 C-2.81 16.06 -3.28 17.15 -3.75 18.28 C-4.85 21.1 -4.85 21.1 -4.85 23.1 C-2.54 23.1 -0.23 23.1 2.15 23.1 C1.82 18.48 1.49 13.86 1.15 9.1 C0.82 9.1 0.49 9.1 0.15 9.1 Z " fill="#2D2D32" transform="translate(353.84765625,84.90234375)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C5.67 4.62 5.34 9.24 5 14 C5.66 13.67 6.32 13.34 7 13 C14.06 12.32 14.06 12.32 17.5 14.81 C20.01 20.16 20 25.67 18.3 31.32 C16.13 36.12 13.29 38.99 9 42 C4.3 43.57 0.6 43.75 -3.94 41.62 C-7.08 37.63 -6.36 33.94 -6 29 C-5.34 24.11 -4.47 19.28 -3.56 14.44 C-3.33 13.16 -3.1 11.87 -2.87 10.55 C-1.14 1.14 -1.14 1.14 0 0 Z M4.94 20.62 C1.05 25.39 0.76 30 1 36 C2.69 36.75 2.69 36.75 5 37 C8.89 34.59 10.87 32.44 12 28 C12.25 24.31 12.25 24.31 12 21 C11.34 20.34 10.68 19.68 10 19 C7 19 7 19 4.94 20.62 Z " fill="#2D2D32" transform="translate(761,19)"/>
|
||||||
|
<path d="M0 0 C0.57 -0.01 0.57 -0.01 3.43 -0.08 C7 0.28 8.82 1.14 11.69 3.25 C14.41 6.75 14.2 11.01 13.69 15.25 C11.9 20.43 9.58 22.81 4.69 25.25 C1.65 25.84 -1.22 26.06 -4.31 26.25 C-5.3 30.87 -6.29 35.49 -7.31 40.25 C-9.62 40.25 -11.93 40.25 -14.31 40.25 C-13.26 30.72 -11.9 21.27 -10.31 11.81 C-10.15 10.79 -9.98 9.76 -9.81 8.71 C-9.65 7.75 -9.48 6.8 -9.31 5.82 C-9.17 4.96 -9.02 4.1 -8.88 3.22 C-8.69 2.57 -8.5 1.92 -8.31 1.25 C-5.51 -0.15 -3.12 0.04 0 0 Z M-2.31 6.25 C-2.97 10.54 -3.63 14.83 -4.31 19.25 C-1.06 19.56 -1.06 19.56 2.69 19.25 C5.42 16.8 6.52 15.25 7.12 11.62 C6.69 9.25 6.69 9.25 5.56 7.44 C3.69 6.25 3.69 6.25 -2.31 6.25 Z " fill="#2D2D32" transform="translate(558.3125,84.75)"/>
|
||||||
|
<path d="M0 0 C2.31 0 4.62 0 7 0 C6.01 7.26 5.02 14.52 4 22 C4.97 20.52 5.94 19.03 6.94 17.5 C10.23 13.19 10.23 13.19 13.47 12.4 C15.71 12.43 17.8 12.6 20 13 C19.08 14.23 18.17 15.46 17.25 16.69 C16.74 17.37 16.23 18.06 15.7 18.76 C13.84 21.21 11.93 23.61 10 26 C10.43 26.99 10.87 27.97 11.31 28.99 C11.88 30.29 12.44 31.58 13 32.88 C13.29 33.53 13.57 34.18 13.87 34.85 C16 39.77 16 39.77 16 42 C13.36 42 10.72 42 8 42 C7.17 40.19 7.17 40.19 3 31 C1.43 34.93 0.57 37.9 0 42 C-2.31 42 -4.62 42 -7 42 C-6.42 33.72 -5.23 25.58 -3.84 17.41 C-3.49 15.34 -3.16 13.28 -2.82 11.21 C-2.71 10.56 -2.71 10.56 -2.16 7.27 C-1.96 6.09 -1.76 4.91 -1.56 3.69 C-1 1 -1 1 0 0 Z " fill="#2D2D32" transform="translate(656,19)"/>
|
||||||
|
<path d="M0 0 C1.06 -0.01 2.13 -0.03 3.22 -0.04 C5.94 0.19 5.94 0.19 7.94 2.19 C7.61 4.92 7.18 7.5 6.62 10.19 C6.33 11.73 6.03 13.27 5.74 14.81 C5.6 15.56 5.46 16.31 5.31 17.08 C4.6 21.1 4.26 25.12 3.94 29.19 C1.63 29.19 -0.68 29.19 -3.06 29.19 C-3.06 28.2 -3.06 27.21 -3.06 26.19 C-3.76 26.85 -4.47 27.51 -5.19 28.19 C-8.57 30.54 -10.04 30.87 -14.06 30.19 C-16.91 27.96 -17.91 26.64 -19.06 23.19 C-19.63 16.65 -18.55 11.79 -15.06 6.19 C-10.61 1.3 -6.48 0.04 0 0 Z M-10.06 11.19 C-12.5 15.4 -11.98 18.49 -11.06 23.19 C-10.07 23.52 -9.08 23.85 -8.06 24.19 C-2.57 19.88 -1.39 14.9 -0.06 8.19 C-0.06 7.53 -0.06 6.87 -0.06 6.19 C-5.15 5.46 -6.91 7.35 -10.06 11.19 Z " fill="#2D2D32" transform="translate(729.0625,95.8125)"/>
|
||||||
|
<path d="M0 0 C1.06 -0.01 2.13 -0.03 3.22 -0.04 C5.94 0.19 5.94 0.19 7.94 2.19 C7.61 4.92 7.18 7.5 6.62 10.19 C6.33 11.73 6.03 13.27 5.74 14.81 C5.6 15.56 5.46 16.31 5.31 17.08 C4.6 21.1 4.26 25.12 3.94 29.19 C1.63 29.19 -0.68 29.19 -3.06 29.19 C-3.06 28.2 -3.06 27.21 -3.06 26.19 C-3.76 26.85 -4.46 27.51 -5.19 28.19 C-8.57 30.54 -10.04 30.87 -14.06 30.19 C-16.91 27.96 -17.91 26.64 -19.06 23.19 C-19.63 16.65 -18.55 11.79 -15.06 6.19 C-10.61 1.3 -6.48 0.04 0 0 Z M-10.06 11.19 C-12.5 15.4 -11.98 18.49 -11.06 23.19 C-10.07 23.52 -9.08 23.85 -8.06 24.19 C-2.57 19.88 -1.39 14.9 -0.06 8.19 C-0.06 7.53 -0.06 6.87 -0.06 6.19 C-5.15 5.46 -6.91 7.35 -10.06 11.19 Z " fill="#2D2D32" transform="translate(406.0625,95.8125)"/>
|
||||||
|
<path d="M0 0 C1.06 -0.01 2.13 -0.03 3.22 -0.04 C5.94 0.19 5.94 0.19 7.94 2.19 C7.61 4.92 7.18 7.5 6.62 10.19 C6.33 11.73 6.03 13.27 5.74 14.81 C5.6 15.56 5.46 16.31 5.31 17.08 C4.6 21.1 4.26 25.12 3.94 29.19 C1.63 29.19 -0.68 29.19 -3.06 29.19 C-3.06 28.2 -3.06 27.21 -3.06 26.19 C-3.76 26.85 -4.47 27.51 -5.19 28.19 C-8.57 30.54 -10.04 30.87 -14.06 30.19 C-16.91 27.96 -17.91 26.64 -19.06 23.19 C-19.63 16.65 -18.55 11.79 -15.06 6.19 C-10.61 1.3 -6.48 0.04 0 0 Z M-10.06 11.19 C-12.5 15.4 -11.98 18.49 -11.06 23.19 C-10.07 23.52 -9.08 23.85 -8.06 24.19 C-2.57 19.88 -1.39 14.9 -0.06 8.19 C-0.06 7.53 -0.06 6.87 -0.06 6.19 C-5.15 5.46 -6.91 7.35 -10.06 11.19 Z " fill="#2D2D32" transform="translate(611.0625,31.8125)"/>
|
||||||
|
<path d="M0 0 C2.31 0 4.62 0 7 0 C7.99 5.61 8.98 11.22 10 17 C12.31 11.39 14.62 5.78 17 0 C19.64 0 22.28 0 25 0 C21.96 7.73 18.56 15.29 15.06 22.81 C14.66 23.71 14.25 24.6 13.83 25.52 C10.68 32.23 7.19 39.08 0 42 C-0.99 42 -1.98 42 -3 42 C-3.33 39.69 -3.66 37.38 -4 35 C-3.05 34.4 -2.1 33.8 -1.12 33.19 C2 31 2 31 4 28 C3.65 20.99 2.08 14.2 0.62 7.36 C0 4 0 4 0 0 Z " fill="#2D2D32" transform="translate(783,32)"/>
|
||||||
|
<path d="M0 0 C2.82 2.19 4.42 3.83 6 7 C6.78 13.87 6.01 19.29 2 25 C-1.45 28.84 -4.77 29.82 -9.78 30.16 C-13.47 29.89 -15.37 28.5 -18 26 C-20.65 21.05 -20.15 16.33 -19 11 C-15.67 1.88 -9.5 -2.03 0 0 Z M-10.25 8.56 C-12.45 12.88 -13.7 16.6 -12.31 21.38 C-11 23 -11 23 -9.19 24.06 C-7 24 -7 24 -4.31 21.75 C-0.78 17.55 -0.71 14.36 -1 9 C-3 6 -3 6 -5.38 5.44 C-8 6 -8 6 -10.25 8.56 Z " fill="#2D2D32" transform="translate(645,96)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.33 0.99 6.66 1.98 7 3 C7.52 2.5 8.03 2.01 8.56 1.5 C11.89 -0.55 14.16 -0.42 18 0 C19.88 1.06 19.88 1.06 21 3 C22.31 8.95 21.63 13.99 20.56 19.94 C20.49 20.37 20.49 20.37 20.12 22.59 C19.75 24.73 19.38 26.86 19 29 C16.69 29 14.38 29 12 29 C12.91 17.44 12.91 17.44 13.62 12.38 C14 9 14 9 13 7 C11.19 7.19 11.19 7.19 9 8 C5.87 12.15 5.13 16.31 4.31 21.31 C4.18 22.05 4.05 22.79 3.92 23.56 C3.6 25.37 3.3 27.18 3 29 C0.69 29 -1.62 29 -4 29 C-3.45 19.17 -1.82 9.65 0 0 Z " fill="#2D2D32" transform="translate(740,96)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.33 0.99 6.66 1.98 7 3 C7.52 2.51 8.03 2.01 8.56 1.5 C11.89 -0.55 14.16 -0.42 18 0 C19.88 1.06 19.88 1.06 21 3 C22.31 8.95 21.63 13.99 20.56 19.94 C20.49 20.37 20.49 20.37 20.12 22.59 C19.75 24.73 19.38 26.86 19 29 C16.69 29 14.38 29 12 29 C12.91 17.44 12.91 17.44 13.62 12.38 C14 9 14 9 13 7 C11.19 7.19 11.19 7.19 9 8 C5.87 12.15 5.13 16.31 4.31 21.31 C4.18 22.05 4.05 22.79 3.92 23.56 C3.6 25.37 3.3 27.18 3 29 C0.69 29 -1.62 29 -4 29 C-3.45 19.17 -1.82 9.65 0 0 Z " fill="#2D2D32" transform="translate(692,32)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.33 0.99 6.66 1.98 7 3 C7.52 2.51 8.03 2.01 8.56 1.5 C11.89 -0.55 14.16 -0.42 18 0 C19.88 1.06 19.88 1.06 21 3 C22.31 8.95 21.63 13.99 20.56 19.94 C20.49 20.37 20.49 20.37 20.12 22.59 C19.75 24.73 19.38 26.86 19 29 C16.69 29 14.38 29 12 29 C12.91 17.44 12.91 17.44 13.62 12.38 C14 9 14 9 13 7 C11.19 7.19 11.19 7.19 9 8 C5.87 12.15 5.13 16.31 4.31 21.31 C4.18 22.05 4.05 22.79 3.92 23.56 C3.6 25.37 3.3 27.18 3 29 C0.69 29 -1.62 29 -4 29 C-3.45 19.17 -1.82 9.65 0 0 Z " fill="#2D2D32" transform="translate(625,32)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.33 0.99 6.66 1.98 7 3 C7.52 2.51 8.03 2.01 8.56 1.5 C11.89 -0.55 14.16 -0.42 18 0 C19.88 1.06 19.88 1.06 21 3 C22.31 8.95 21.63 13.99 20.56 19.94 C20.49 20.37 20.49 20.37 20.12 22.59 C19.75 24.73 19.38 26.86 19 29 C16.69 29 14.38 29 12 29 C12.91 17.44 12.91 17.44 13.62 12.38 C14 9 14 9 13 7 C11.19 7.19 11.19 7.19 9 8 C5.87 12.15 5.13 16.31 4.31 21.31 C4.18 22.05 4.05 22.79 3.92 23.56 C3.6 25.37 3.3 27.18 3 29 C0.69 29 -1.62 29 -4 29 C-3.45 19.17 -1.82 9.65 0 0 Z " fill="#2D2D32" transform="translate(375,32)"/>
|
||||||
|
<path d="M0 0 C2.5 1.06 2.5 1.06 4 3 C5.03 6.71 5.3 9.07 4.12 12.75 C0.37 16.73 -4.7 17.86 -10.06 18.19 C-10.38 18.16 -10.38 18.16 -12 18 C-11.38 19.94 -11.38 19.94 -10 22 C-6.04 23.14 -2.97 23.05 1 22 C1 23.98 1 25.96 1 28 C-3.13 30 -6.42 30.41 -11 30 C-15.15 28.21 -17.24 26.17 -19 22 C-19.66 15.33 -18.78 9.54 -14.56 4.16 C-10.13 -0.21 -6.08 -1.15 0 0 Z M-7.62 6.19 C-10 8 -10 8 -10.81 10.19 C-10.87 10.79 -10.94 11.38 -11 12 C-8.36 11.67 -5.72 11.34 -3 11 C-2.67 9.35 -2.34 7.7 -2 6 C-5 5 -5 5 -7.62 6.19 Z " fill="#2D2D32" transform="translate(803,96)"/>
|
||||||
|
<path d="M0 0 C2.5 1.06 2.5 1.06 4 3 C5.03 6.71 5.3 9.07 4.12 12.75 C0.37 16.73 -4.7 17.86 -10.06 18.19 C-10.38 18.16 -10.38 18.16 -12 18 C-11.38 19.94 -11.38 19.94 -10 22 C-6.04 23.14 -2.97 23.05 1 22 C1 23.98 1 25.96 1 28 C-3.13 30 -6.42 30.41 -11 30 C-15.15 28.21 -17.24 26.17 -19 22 C-19.66 15.33 -18.78 9.54 -14.56 4.16 C-10.13 -0.21 -6.08 -1.15 0 0 Z M-7.62 6.19 C-10 8 -10 8 -10.81 10.19 C-10.87 10.79 -10.94 11.38 -11 12 C-8.36 11.67 -5.72 11.34 -3 11 C-2.67 9.35 -2.34 7.7 -2 6 C-5 5 -5 5 -7.62 6.19 Z " fill="#2D2D32" transform="translate(589,96)"/>
|
||||||
|
<path d="M0 0 C2.5 1.06 2.5 1.06 4 3 C5.03 6.71 5.3 9.07 4.12 12.75 C0.37 16.73 -4.7 17.86 -10.06 18.19 C-10.38 18.16 -10.38 18.16 -12 18 C-11.38 19.94 -11.38 19.94 -10 22 C-6.04 23.14 -2.97 23.05 1 22 C1 23.98 1 25.96 1 28 C-3.13 30 -6.42 30.41 -11 30 C-15.15 28.21 -17.24 26.17 -19 22 C-19.66 15.33 -18.78 9.54 -14.56 4.16 C-10.13 -0.21 -6.08 -1.15 0 0 Z M-7.62 6.19 C-10 8 -10 8 -10.81 10.19 C-10.87 10.79 -10.94 11.38 -11 12 C-8.36 11.67 -5.72 11.34 -3 11 C-2.67 9.35 -2.34 7.7 -2 6 C-5 5 -5 5 -7.62 6.19 Z " fill="#2D2D32" transform="translate(459,96)"/>
|
||||||
|
<path d="M0 0 C2.5 1.06 2.5 1.06 4 3 C5.03 6.71 5.3 9.07 4.12 12.75 C0.37 16.73 -4.7 17.86 -10.06 18.19 C-10.38 18.16 -10.38 18.16 -12 18 C-11.38 19.94 -11.38 19.94 -10 22 C-6.04 23.14 -2.97 23.05 1 22 C1 23.98 1 25.96 1 28 C-3.13 30 -6.42 30.41 -11 30 C-15.15 28.21 -17.24 26.17 -19 22 C-19.66 15.33 -18.78 9.54 -14.56 4.16 C-10.13 -0.21 -6.08 -1.15 0 0 Z M-7.62 6.19 C-10 8 -10 8 -10.81 10.19 C-10.87 10.79 -10.94 11.38 -11 12 C-8.36 11.67 -5.72 11.34 -3 11 C-2.67 9.35 -2.34 7.7 -2 6 C-5 5 -5 5 -7.62 6.19 Z " fill="#2D2D32" transform="translate(456,32)"/>
|
||||||
|
<path d="M0 0 C-0.33 1.98 -0.66 3.96 -1 6 C-1.47 6.11 -1.47 6.11 -3.88 6.69 C-7 8 -7 8 -8.38 10.62 C-8.58 11.41 -8.79 12.19 -9 13 C-7.35 13 -5.7 13 -4 13 C-3.96 14.67 -3.96 16.33 -4 18 C-5 19 -5 19 -7.56 19.06 C-8.37 19.04 -9.17 19.02 -10 19 C-10.12 20.07 -10.24 21.15 -10.37 22.25 C-10.54 23.69 -10.71 25.13 -10.88 26.56 C-10.91 26.91 -10.91 26.91 -11.11 28.7 C-11.67 33.31 -12.61 37.56 -14 42 C-16.31 42 -18.62 42 -21 42 C-19.68 34.41 -18.36 26.82 -17 19 C-17.99 19 -18.98 19 -20 19 C-19.67 17.02 -19.34 15.04 -19 13 C-18.01 13 -17.02 13 -16 13 C-15.77 11.78 -15.55 10.57 -15.31 9.31 C-14.25 5.03 -12.48 2.8 -9 0 C-5.52 -1.16 -3.54 -0.71 0 0 Z " fill="#2D2D32" transform="translate(632,83)"/>
|
||||||
|
<path d="M0 0 C2.31 0 4.62 0 7 0 C7.31 1.69 7.63 3.37 7.94 5.06 C8.11 6 8.29 6.94 8.46 7.91 C9.05 11.27 9.53 14.63 10 18 C10.49 16.78 10.99 15.57 11.5 14.32 C12.14 12.73 12.79 11.15 13.44 9.56 C13.76 8.76 14.09 7.96 14.42 7.13 C14.74 6.37 15.05 5.6 15.37 4.82 C15.66 4.11 15.95 3.4 16.24 2.67 C17 1 17 1 18 0 C20.67 -0.14 23.32 -0.04 26 0 C16.29 20.62 16.29 20.62 12 29 C9.36 29 6.72 29 4 29 C3.33 24.73 2.66 20.46 2 16.19 C1.81 14.97 1.62 13.76 1.42 12.51 C1.24 11.34 1.06 10.18 0.88 8.98 C0.71 7.91 0.54 6.83 0.37 5.73 C0 3 0 3 0 0 Z " fill="#2D2D32" transform="translate(413,32)"/>
|
||||||
|
<path d="M0 0 C-0.33 2.31 -0.66 4.62 -1 7 C-2.05 6.9 -3.1 6.79 -4.19 6.69 C-8 7 -8 7 -10.88 9.06 C-13.41 12.57 -14.08 14.68 -14 19 C-12.44 21.5 -12.44 21.5 -10 23 C-6.75 22.75 -6.75 22.75 -4 22 C-3.67 23.98 -3.34 25.96 -3 28 C-6.66 30.34 -9.73 30.37 -14 30 C-18.15 28.21 -20.24 26.17 -22 22 C-22.75 15.53 -21.52 10.51 -18 5 C-13.02 -0.82 -7.23 -0.59 0 0 Z " fill="#2D2D32" transform="translate(785,96)"/>
|
||||||
|
<path d="M0 0 C-0.33 2.31 -0.66 4.62 -1 7 C-2.05 6.9 -3.1 6.79 -4.19 6.69 C-8 7 -8 7 -10.88 9.06 C-13.41 12.57 -14.08 14.68 -14 19 C-12.44 21.5 -12.44 21.5 -10 23 C-6.75 22.75 -6.75 22.75 -4 22 C-3.67 23.98 -3.34 25.96 -3 28 C-6.66 30.34 -9.73 30.37 -14 30 C-18.15 28.21 -20.24 26.17 -22 22 C-22.75 15.53 -21.52 10.51 -18 5 C-13.02 -0.82 -7.23 -0.59 0 0 Z " fill="#2D2D32" transform="translate(538,96)"/>
|
||||||
|
<path d="M0 0 C-0.33 2.31 -0.66 4.62 -1 7 C-2.05 6.9 -3.1 6.79 -4.19 6.69 C-8 7 -8 7 -10.88 9.06 C-13.41 12.57 -14.08 14.68 -14 19 C-12.44 21.5 -12.44 21.5 -10 23 C-6.75 22.75 -6.75 22.75 -4 22 C-3.67 23.98 -3.34 25.96 -3 28 C-6.66 30.34 -9.73 30.37 -14 30 C-18.15 28.21 -20.24 26.17 -22 22 C-22.75 15.53 -21.52 10.51 -18 5 C-13.02 -0.82 -7.23 -0.59 0 0 Z " fill="#2D2D32" transform="translate(388,96)"/>
|
||||||
|
<path d="M0 0 C0.91 0.01 1.82 0.02 2.76 0.03 C3.11 0.03 3.11 0.03 4.88 0.06 C5.88 3.06 5.88 3.06 4.94 5.25 C4.59 5.85 4.24 6.45 3.88 7.06 C3.09 6.88 2.31 6.69 1.5 6.5 C-1.12 6.06 -1.12 6.06 -3.12 7.06 C-3.12 8.05 -3.12 9.04 -3.12 10.06 C-1.59 11.39 -1.59 11.39 0.38 12.75 C3.69 15.45 3.69 15.45 4.48 18.05 C4.62 21.68 3.96 23.93 2.06 27 C-0.83 29.73 -2.61 30.03 -6.56 30.25 C-9.82 30.08 -11.44 29.78 -14.12 28.06 C-13.8 26.08 -13.46 24.1 -13.12 22.06 C-10.15 22.39 -7.19 22.72 -4.12 23.06 C-4.43 19.45 -4.83 18.32 -7.62 15.88 C-8.45 15.28 -9.27 14.68 -10.12 14.06 C-11.55 11.21 -11.44 9.23 -11.12 6.06 C-7.79 1.05 -5.88 -0.08 0 0 Z " fill="#2D2D32" transform="translate(492.125,31.9375)"/>
|
||||||
|
<path d="M0 0 C0.16 0.83 0.16 0.83 1 5 C0.38 5.1 -0.24 5.21 -0.88 5.31 C-3 6 -3 6 -5 9 C-6.66 9.36 -8.33 9.7 -10 10 C-10.33 10.66 -10.66 11.32 -11 12 C-11 11.01 -11 10.02 -11 9 C-11.66 9 -12.32 9 -13 9 C-13 8.34 -13 7.68 -13 7 C-16.83 9.72 -18.39 11.64 -20 16 C-20.99 16.66 -21.98 17.32 -23 18 C-24.19 20.12 -24.19 20.12 -25 22 C-25.66 21.67 -26.32 21.34 -27 21 C-27.1 20.22 -27.21 19.43 -27.31 18.62 C-28 16 -28 16 -30.56 14.19 C-31.37 13.8 -32.17 13.4 -33 13 C-32.82 11.12 -32.82 11.12 -32 9 C-29.71 7.91 -29.71 7.91 -26.81 7.06 C-22.92 5.81 -21.2 5.2 -18.25 2.25 C-12.87 -1.47 -6.33 -0.36 0 0 Z " fill="#0F29A1" transform="translate(152,64)"/>
|
||||||
|
<path d="M0 0 C1.19 -0.01 2.37 -0.02 3.6 -0.04 C4.16 -0.04 4.16 -0.04 7.02 -0.04 C8.05 -0.05 9.08 -0.05 10.14 -0.06 C12.62 0.19 12.62 0.19 14.62 2.19 C11.48 3.24 9.43 3.26 6.14 3.18 C-17.08 2.78 -17.08 2.78 -28.38 6.19 C-29.33 6.45 -30.28 6.71 -31.25 6.98 C-38.13 8.94 -44.37 11.58 -50.69 14.94 C-51.35 15.29 -52.02 15.64 -52.7 16 C-57.03 18.35 -60.99 20.87 -64.76 24.06 C-66.6 25.35 -68.18 25.77 -70.38 26.19 C-70.38 26.85 -70.38 27.51 -70.38 28.19 C-73.11 31.15 -75.9 34.1 -79.38 36.19 C-80.36 35.86 -81.36 35.53 -82.38 35.19 C-67.13 15.14 -41.98 4.43 -17.8 0.62 C-11.89 -0.08 -5.95 0 0 0 Z " fill="#302E31" transform="translate(171.375,26.8125)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.33 0.66 6.66 1.32 7 2 C7.99 1.34 8.98 0.68 10 0 C12.69 -0.12 12.69 -0.12 15 0 C14.67 2.31 14.34 4.62 14 7 C13.24 7.23 12.47 7.45 11.69 7.69 C8.3 9.34 7.67 10.63 6 14 C5.34 16.63 4.78 19.16 4.31 21.81 C4.18 22.51 4.05 23.2 3.92 23.91 C3.6 25.61 3.3 27.3 3 29 C0.69 29 -1.62 29 -4 29 C-3.38 19.22 -1.69 9.64 0 0 Z " fill="#2D2D32" transform="translate(656,96)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.33 0.66 6.66 1.32 7 2 C7.99 1.34 8.98 0.68 10 0 C12.69 -0.12 12.69 -0.12 15 0 C14.67 2.31 14.34 4.62 14 7 C13.24 7.23 12.47 7.45 11.69 7.69 C8.3 9.34 7.67 10.63 6 14 C5.34 16.63 4.78 19.16 4.31 21.81 C4.18 22.51 4.05 23.2 3.92 23.91 C3.6 25.61 3.3 27.3 3 29 C0.69 29 -1.62 29 -4 29 C-3.38 19.22 -1.69 9.64 0 0 Z " fill="#2D2D32" transform="translate(597,96)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C6.33 0.66 6.66 1.32 7 2 C7.99 1.34 8.98 0.68 10 0 C12.69 -0.12 12.69 -0.12 15 0 C14.67 2.31 14.34 4.62 14 7 C13.24 7.23 12.47 7.45 11.69 7.69 C8.3 9.34 7.67 10.63 6 14 C5.34 16.63 4.78 19.16 4.31 21.81 C4.18 22.51 4.05 23.2 3.92 23.91 C3.6 25.61 3.3 27.3 3 29 C0.69 29 -1.62 29 -4 29 C-3.38 19.22 -1.69 9.64 0 0 Z " fill="#2D2D32" transform="translate(466,32)"/>
|
||||||
|
<path d="M0 0 C1.22 0.14 2.43 0.29 3.69 0.44 C3.69 1.1 3.69 1.76 3.69 2.44 C2.38 3.47 1.04 4.46 -0.31 5.44 C-3.61 8.27 -4.83 10.09 -5.31 14.44 C-5.97 14.44 -6.63 14.44 -7.31 14.44 C-7.64 15.1 -7.97 15.76 -8.31 16.44 C-8.97 16.11 -9.63 15.78 -10.31 15.44 C-10.64 15.93 -10.64 15.93 -12.31 18.44 C-14.61 19.51 -16.95 20.52 -19.31 21.44 C-19.64 20.78 -19.97 20.12 -20.31 19.44 C-21.3 19.77 -22.29 20.1 -23.31 20.44 C-23.31 19.78 -23.31 19.12 -23.31 18.44 C-24.96 19.76 -26.61 21.08 -28.31 22.44 C-28.31 21.78 -28.31 21.12 -28.31 20.44 C-29.63 21.43 -30.95 22.42 -32.31 23.44 C-32.97 23.11 -33.63 22.78 -34.31 22.44 C-33.65 21.78 -32.99 21.12 -32.31 20.44 C-31.06 14.95 -31.06 14.95 -32.31 12.44 C-29.65 13.1 -26.98 13.77 -24.31 14.44 C-24.31 15.1 -24.31 15.76 -24.31 16.44 C-23.76 16.13 -23.2 15.82 -22.62 15.5 C-20.18 14.37 -17.96 13.91 -15.31 13.44 C-14.32 13.11 -13.33 12.78 -12.31 12.44 C-12.31 11.78 -12.31 11.12 -12.31 10.44 C-11.65 10.44 -10.99 10.44 -10.31 10.44 C-9.98 9.45 -9.65 8.46 -9.31 7.44 C-7.07 2.95 -5.33 -0.04 0 0 Z " fill="#1242AC" transform="translate(196.3125,144.5625)"/>
|
||||||
|
<path d="M0 0 C0.48 0.01 0.48 0.01 2.94 0.06 C2.39 9.89 0.76 19.41 -1.06 29.06 C-3.37 29.06 -5.68 29.06 -8.06 29.06 C-4.61 0.09 -4.61 0.09 0 0 Z " fill="#2D2D32" transform="translate(512.0625,95.9375)"/>
|
||||||
|
<path d="M0 0 C0.48 0.01 0.48 0.01 2.94 0.06 C2.39 9.89 0.76 19.41 -1.06 29.06 C-3.37 29.06 -5.68 29.06 -8.06 29.06 C-4.61 0.09 -4.61 0.09 0 0 Z " fill="#2D2D32" transform="translate(683.0625,31.9375)"/>
|
||||||
|
<path d="M0 0 C0.48 0.01 0.48 0.01 2.94 0.06 C2.39 9.89 0.76 19.41 -1.06 29.06 C-3.37 29.06 -5.68 29.06 -8.06 29.06 C-4.61 0.09 -4.61 0.09 0 0 Z " fill="#2D2D32" transform="translate(508.0625,31.9375)"/>
|
||||||
|
<path d="M0 0 C0.48 0.01 0.48 0.01 2.94 0.06 C2.39 9.89 0.76 19.41 -1.06 29.06 C-3.37 29.06 -5.68 29.06 -8.06 29.06 C-4.61 0.09 -4.61 0.09 0 0 Z " fill="#2D2D32" transform="translate(407.0625,31.9375)"/>
|
||||||
|
<path d="M0 0 C13.68 -1.12 28.98 4.79 39.99 12.63 C41.94 13.96 43.88 15 46 16 C48 17 48 17 50.19 19.25 C52.38 21.39 54.31 22.98 56.81 24.69 C57.86 25.45 58.92 26.21 60 27 C60 27.66 60 28.32 60 29 C60.99 29.33 61.98 29.66 63 30 C64.69 32.06 64.69 32.06 66 34 C63.81 34.38 63.81 34.38 61 34 C59.76 32.59 58.52 31.17 57.4 29.66 C55.83 27.8 54.2 26.61 52.19 25.25 C51.14 24.51 50.08 23.77 49 23 C49 22.34 49 21.68 49 21 C48.27 20.73 47.54 20.46 46.79 20.18 C44.1 19.04 41.78 17.74 39.31 16.19 C29.49 10.26 20.03 6.58 9.01 3.55 C6 2.72 3 1.86 0 1 C0 0.67 0 0.34 0 0 Z " fill="#29282B" transform="translate(188,29)"/>
|
||||||
|
<path d="M0 0 C7.26 0 14.52 0 22 0 C19 2 19 2 15.31 2.75 C10.94 3.73 8.14 5.89 4.76 8.76 C3 10 3 10 0 10 C0 6.7 0 3.4 0 0 Z " fill="#ECECF6" transform="translate(164,64)"/>
|
||||||
|
<path d="M0 0 C1.65 0.33 3.3 0.66 5 1 C4.48 3.76 3.89 6.33 3 9 C4.26 11.51 5.5 11.87 8 13 C7.67 13.16 7.67 13.16 6 14 C6.33 14.74 6.66 15.49 7 16.25 C8 19 8 19 8 23 C4.59 22.44 3.17 21.53 1.12 18.75 C-0.16 16.86 -0.16 16.86 -1 15 C-0.31 12.06 -0.31 12.06 1 10 C0.34 9.67 -0.32 9.34 -1 9 C-1.75 6.12 -1.75 6.12 -2 3 C-1.34 2.01 -0.68 1.02 0 0 Z " fill="#1643AC" transform="translate(144,130)"/>
|
||||||
|
<path d="M0 0 C1.32 0 2.64 0 4 0 C4 0.99 4 1.98 4 3 C5.65 2.67 7.3 2.34 9 2 C9 2.99 9 3.98 9 5 C8.4 5.11 7.79 5.22 7.17 5.33 C2.71 6.22 -0.51 6.93 -4 10 C-4.66 10 -5.32 10 -6 10 C-6.33 10.66 -6.66 11.32 -7 12 C-8.32 11.67 -9.64 11.34 -11 11 C-10.01 10.67 -9.02 10.34 -8 10 C-7.38 8.12 -7.38 8.12 -7 6 C-6 3 -6 3 -5 1 C-3.35 1.33 -1.7 1.66 0 2 C0 1.34 0 0.68 0 0 Z " fill="#1141AB" transform="translate(158,111)"/>
|
||||||
|
<path d="M0 0 C4.41 1.5 5.62 4.38 7.69 8.38 C8.29 9.52 8.89 10.66 9.51 11.84 C10.67 14.3 11.51 16.35 12 19 C13.65 19 15.3 19 17 19 C17 19.33 17 19.66 17 20 C13.49 20.33 11.54 20.33 8.5 18.46 C5.35 15.36 4.17 12.41 2.69 8.31 C2.42 7.62 2.16 6.93 1.89 6.22 C0 1.24 0 1.24 0 0 Z " fill="#1731A4" transform="translate(242,114)"/>
|
||||||
|
<path d="M0 0 C3.3 0 6.6 0 10 0 C10.33 1.65 10.66 3.3 11 5 C10.38 5.1 9.76 5.21 9.12 5.31 C7 6 7 6 5 9 C3.12 8.75 3.12 8.75 1 8 C-0.25 5.94 -0.25 5.94 -1 4 C-0.01 3.34 0.98 2.68 2 2 C1.34 1.34 0.68 0.68 0 0 Z " fill="#E9E9F5" transform="translate(142,64)"/>
|
||||||
|
<path d="M0 0 C1.32 0.66 2.64 1.32 4 2 C4.19 4.88 4.19 4.88 4 8 C0.33 10.45 -1.66 10.32 -6 10 C-6.66 9.34 -7.32 8.68 -8 8 C-8 7.01 -8 6.02 -8 5 C-7.34 5 -6.68 5 -6 5 C-5.67 5.66 -5.34 6.32 -5 7 C-3.68 6.67 -2.36 6.34 -1 6 C-0.67 4.02 -0.34 2.04 0 0 Z " fill="#0E259F" transform="translate(223,70)"/>
|
||||||
|
<path d="M0 0 C1.88 0.19 1.88 0.19 4 1 C6.11 4.77 6.5 8.75 7 13 C5.68 12.67 4.36 12.34 3 12 C2.86 11.43 2.86 11.43 2.12 8.56 C1.75 7.39 1.38 6.21 1 5 C0.34 4.67 -0.32 4.34 -1 4 C-0.67 2.68 -0.34 1.36 0 0 Z " fill="#172FA3" transform="translate(255,90)"/>
|
||||||
|
<path d="M0 0 C3.54 0.54 3.54 0.54 5 2 C5.04 3.67 5.04 5.33 5 7 C2.62 8.06 2.62 8.06 0 9 C-0.66 8.67 -1.32 8.34 -2 8 C-2.12 5.12 -2.12 5.12 -2 2 C-1.34 1.34 -0.68 0.68 0 0 Z " fill="#2D2D32" transform="translate(512,84)"/>
|
||||||
|
<path d="M0 0 C3.54 0.54 3.54 0.54 5 2 C5.04 3.67 5.04 5.33 5 7 C2.62 8.06 2.62 8.06 0 9 C-0.66 8.67 -1.32 8.34 -2 8 C-2.12 5.12 -2.12 5.12 -2 2 C-1.34 1.34 -0.68 0.68 0 0 Z " fill="#2D2D32" transform="translate(683,20)"/>
|
||||||
|
<path d="M0 0 C3.54 0.54 3.54 0.54 5 2 C5.04 3.67 5.04 5.33 5 7 C2.62 8.06 2.62 8.06 0 9 C-0.66 8.67 -1.32 8.34 -2 8 C-2.12 5.12 -2.12 5.12 -2 2 C-1.34 1.34 -0.68 0.68 0 0 Z " fill="#2D2D32" transform="translate(508,20)"/>
|
||||||
|
<path d="M0 0 C3.54 0.54 3.54 0.54 5 2 C5.04 3.67 5.04 5.33 5 7 C2.62 8.06 2.62 8.06 0 9 C-0.66 8.67 -1.32 8.34 -2 8 C-2.12 5.12 -2.12 5.12 -2 2 C-1.34 1.34 -0.68 0.68 0 0 Z " fill="#2D2D32" transform="translate(407,20)"/>
|
||||||
|
<path d="M0 0 C0.7 0.29 1.4 0.58 2.12 0.88 C5.05 2.02 8.01 3.03 11 4 C11 4.99 11 5.98 11 7 C10.18 6.67 10.18 6.67 6 5 C5.67 5.66 5.34 6.32 5 7 C3.02 7 1.04 7 -1 7 C-1.33 6.34 -1.66 5.68 -2 5 C-1.06 2.38 -1.06 2.38 0 0 Z " fill="#1141AC" transform="translate(173,108)"/>
|
||||||
|
<path d="M0 0 C0.99 0 1.98 0 3 0 C3.33 0.66 3.66 1.32 4 2 C5.85 2.63 5.85 2.63 8.06 3.12 C8.8 3.29 9.53 3.46 10.29 3.63 C10.85 3.75 11.42 3.88 12 4 C11.36 4.1 10.72 4.21 10.06 4.31 C9.38 4.54 8.7 4.77 8 5 C7.67 5.99 7.34 6.98 7 8 C4.14 6.72 1.98 5.47 0 3 C0 2.01 0 1.02 0 0 Z " fill="#172BA2" transform="translate(259,112)"/>
|
||||||
|
<path d="M0 0 C0.33 1.32 0.66 2.64 1 4 C-1.35 5.43 -2.48 6.09 -5.25 5.62 C-5.83 5.42 -6.4 5.21 -7 5 C-7 3.68 -7 2.36 -7 1 C-4.54 -0.23 -2.72 -0.07 0 0 Z " fill="#1B1B34" transform="translate(22,43)"/>
|
||||||
|
<path d="M0 0 C-0.33 0.66 -0.66 1.32 -1 2 C-8.26 1.67 -15.52 1.34 -23 1 C-23 0.67 -23 0.34 -23 0 C-20.48 -0.2 -17.96 -0.38 -15.44 -0.56 C-14.73 -0.62 -14.03 -0.67 -13.3 -0.73 C-8.69 -1.05 -4.56 -0.81 0 0 Z " fill="#272529" transform="translate(186,28)"/>
|
||||||
|
<path d="M0 0 C2.87 0.57 3.86 0.86 6 3 C5.01 3.66 4.02 4.32 3 5 C3 5.99 3 6.98 3 8 C1.5 9.69 1.5 9.69 0 11 C-0.66 10.67 -1.32 10.34 -2 10 C-1.34 9.34 -0.68 8.68 0 8 C1.26 2.51 1.26 2.51 0 0 Z " fill="#1946AD" transform="translate(164,157)"/>
|
||||||
|
<path d="M0 0 C2 1.25 2 1.25 4 3 C4 4.32 4 5.64 4 7 C2.68 6.67 1.36 6.34 0 6 C0 4.02 0 2.04 0 0 Z " fill="#031B9A" transform="translate(258,96)"/>
|
||||||
|
<path d="M0 0 C1.98 0 3.96 0 6 0 C3.51 2.67 1.37 4.56 -2 6 C-1.34 4.02 -0.68 2.04 0 0 Z " fill="#073CA9" transform="translate(194,146)"/>
|
||||||
|
<path d="M0 0 C0.66 0 1.32 0 2 0 C2.33 0.66 2.66 1.32 3 2 C4.98 2.73 6.98 3.4 9 4 C9 4.33 9 4.66 9 5 C5.62 5.12 5.62 5.12 2 5 C1.34 4.34 0.68 3.68 0 3 C0 2.01 0 1.02 0 0 Z " fill="#1631A4" transform="translate(215,75)"/>
|
||||||
|
<path d="M0 0 C1.94 0.75 1.94 0.75 4 2 C4.75 4.12 4.75 4.12 5 6 C4.01 6.33 3.02 6.66 2 7 C1.34 4.69 0.68 2.38 0 0 Z " fill="#1C35A6" transform="translate(242,114)"/>
|
||||||
|
<path d="M0 0 C0.66 0.33 1.32 0.66 2 1 C0.84 1.99 0.84 1.99 -5 7 C-3.93 2.71 -3.49 2.25 0 0 Z " fill="#1433A6" transform="translate(129,98)"/>
|
||||||
|
<path d="" fill="#211F23" transform="translate(0,0)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 43 KiB |
@@ -115,8 +115,12 @@ const KURALLAR: Kural[] = [
|
|||||||
ad: "yabanci-renk",
|
ad: "yabanci-renk",
|
||||||
seviye: "hata",
|
seviye: "hata",
|
||||||
mesaj: "Paletin dışında ton; primary mavi / orange-500 / slate / risk renkleri kullanılır (DESIGN.md §2)",
|
mesaj: "Paletin dışında ton; primary mavi / orange-500 / slate / risk renkleri kullanılır (DESIGN.md §2)",
|
||||||
|
// İstisna (DESIGN.md §2 "Gösterge karesi"): yalnız dolu bg-indigo-500 ve
|
||||||
|
// bg-green-600 zeminleri serbest; başka ton/opaklık/özellik yine hata.
|
||||||
bul: regexKurali(
|
bul: regexKurali(
|
||||||
new RegExp(`\\b${RENK_ONEK}-(?:indigo|purple|fuchsia|pink|cyan|teal|lime|green|yellow)-\\d+`),
|
new RegExp(
|
||||||
|
`\\b${RENK_ONEK}-(?:indigo|purple|fuchsia|pink|cyan|teal|lime|green|yellow)-\\d+(?!\\d)(?!(?<=\\bbg-(?:indigo-500|green-600))(?![\\w/-]))`,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -171,6 +175,30 @@ const KURALLAR: Kural[] = [
|
|||||||
muaf: /src\/features\/rehber\/components\/rehber-kapak\.tsx$/,
|
muaf: /src\/features\/rehber\/components\/rehber-kapak\.tsx$/,
|
||||||
bul: regexKurali(/\[#[0-9a-fA-F]{3,8}\]/),
|
bul: regexKurali(/\[#[0-9a-fA-F]{3,8}\]/),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ad: "minik-yazi",
|
||||||
|
seviye: "uyari",
|
||||||
|
mesaj: "12 px altı yazı yok; en küçük text-xs, yalnız ince yazıda (DESIGN.md §3 alt sınırlar)",
|
||||||
|
bul: regexKurali(/\btext-\[(?:[0-9]|1[01])px\]/),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ad: "buyuk-harf-etiket",
|
||||||
|
seviye: "uyari",
|
||||||
|
mesaj: "Büyük harfli minik etiket yok; büyük-küçük harfli text-sm font-semibold (DESIGN.md §3 alt sınırlar)",
|
||||||
|
bul: regexKurali(/\buppercase\b[^"'`\n]*\btracking-(?:wide|wider|widest)\b|\btracking-(?:wide|wider|widest)\b[^"'`\n]*\buppercase\b/),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
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/),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ad: "iri-sayi-tabular",
|
||||||
|
seviye: "uyari",
|
||||||
|
mesaj: "Cal Sans iri sayıda tabular-nums 'daktilo' gibi durur; yalnız font-sans tablo sütunlarında (DESIGN.md §3)",
|
||||||
|
bul: regexKurali(/\bfont-heading\b[^"'`\n]*\btabular-nums\b|\btabular-nums\b[^"'`\n]*\bfont-heading\b/),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ad: "emoji-ikon",
|
ad: "emoji-ikon",
|
||||||
seviye: "uyari",
|
seviye: "uyari",
|
||||||
|
|||||||
142
scripts/yok-istatistik-uret.py
Normal file
142
scripts/yok-istatistik-uret.py
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
"""YÖK İstatistik Excel'lerinden src/lib/yok-istatistik.ts sabitini üretir.
|
||||||
|
|
||||||
|
Kullanım (yılda bir, YÖK İstatistik Mart'ta yayımlayınca):
|
||||||
|
python3 scripts/yok-istatistik-uret.py 2025-2026
|
||||||
|
|
||||||
|
Girdi: data/kaynak/yok-istatistik-{ogrenci,ogretim-elemani}-sayilari-<DONEM>.xls
|
||||||
|
(istatistik.yok.gov.tr'den tarayıcıyla indirilir, API yok). Bağımlılık: xlrd.
|
||||||
|
|
||||||
|
Kurallar:
|
||||||
|
- Öğrenci = örgün öğrenci (BİRİNCİ Ö. + İKİNCİ Ö.), tüm düzeyler. UZAKTAN Ö.
|
||||||
|
ve AÇIK Ö. dışarıda: açıköğretimli üç büyük üniversitede oranı anlamsız
|
||||||
|
kılar ve kampüste okuyan öğrenciyi anlatmaz.
|
||||||
|
- Öğretim üyesi = Profesör + Doçent + Doktor Öğretim Üyesi (YÖK tanımı).
|
||||||
|
- Anahtar: /universite/[slug] sayfa slug'ı; yalnız yokatlas.db'de sayfası
|
||||||
|
olan üniversiteler yazılır, eşleşmeyenler ekrana basılır.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sqlite3
|
||||||
|
import sys
|
||||||
|
import unicodedata
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import xlrd
|
||||||
|
|
||||||
|
KOK = Path(__file__).resolve().parent.parent
|
||||||
|
DONEM = sys.argv[1] if len(sys.argv) > 1 else "2025-2026"
|
||||||
|
|
||||||
|
|
||||||
|
def slugify(s: str) -> str:
|
||||||
|
# src/lib/slug.ts turkishSlugify ile aynı kural.
|
||||||
|
s = s.replace("I", "ı").replace("İ", "i").lower()
|
||||||
|
for a, b in [("ı", "i"), ("ş", "s"), ("ğ", "g"), ("ü", "u"), ("ö", "o"),
|
||||||
|
("ç", "c"), ("â", "a"), ("î", "i"), ("û", "u")]:
|
||||||
|
s = s.replace(a, b)
|
||||||
|
s = unicodedata.normalize("NFKD", s)
|
||||||
|
s = re.sub(r"[̀-ͯ]", "", s)
|
||||||
|
s = re.sub(r"[^a-z0-9]+", "-", s)
|
||||||
|
return s.strip("-")
|
||||||
|
|
||||||
|
|
||||||
|
def sayfa_slug(ad: str) -> str:
|
||||||
|
return slugify(re.sub(r"\s*\([^)]*\)\s*$", "", ad).strip())
|
||||||
|
|
||||||
|
|
||||||
|
def tamsayi(v) -> int:
|
||||||
|
return int(float(v)) if v not in ("", None) else 0
|
||||||
|
|
||||||
|
|
||||||
|
def sayfa(ad: str):
|
||||||
|
return xlrd.open_workbook(
|
||||||
|
KOK / "data" / "kaynak" / f"yok-istatistik-{ad}-sayilari-{DONEM}.xls"
|
||||||
|
).sheet_by_index(0)
|
||||||
|
|
||||||
|
|
||||||
|
# Öğrenci: sütun 1 ad, 4 öğrenim türü, 19 genel toplam (T).
|
||||||
|
ogrenci: dict[str, int] = {}
|
||||||
|
s = sayfa("ogrenci")
|
||||||
|
for r in range(4, s.nrows):
|
||||||
|
v = s.row_values(r)
|
||||||
|
ad, tur = str(v[1]).strip(), str(v[4]).strip()
|
||||||
|
if not ad or ad == "TOPLAM":
|
||||||
|
continue
|
||||||
|
if tur in ("BİRİNCİ Ö.", "İKİNCİ Ö."):
|
||||||
|
k = sayfa_slug(ad)
|
||||||
|
ogrenci[k] = ogrenci.get(k, 0) + tamsayi(v[19])
|
||||||
|
|
||||||
|
# Akademisyen: T sütunları Prof 6, Doç 9, Dr. Öğr. Üyesi 12, genel toplam 21.
|
||||||
|
akademik: dict[str, tuple[int, int]] = {}
|
||||||
|
s = sayfa("ogretim-elemani")
|
||||||
|
for r in range(4, s.nrows):
|
||||||
|
v = s.row_values(r)
|
||||||
|
ad = str(v[1]).strip()
|
||||||
|
if not ad or ad == "TOPLAM":
|
||||||
|
continue
|
||||||
|
uye = tamsayi(v[6]) + tamsayi(v[9]) + tamsayi(v[12])
|
||||||
|
akademik[sayfa_slug(ad)] = (uye, tamsayi(v[21]))
|
||||||
|
|
||||||
|
db = sqlite3.connect(KOK / "data" / "yokatlas.db")
|
||||||
|
sayfalar = {sayfa_slug(a) for (a,) in db.execute("SELECT DISTINCT universite FROM programs")}
|
||||||
|
|
||||||
|
satirlar = []
|
||||||
|
for k in sorted(sayfalar):
|
||||||
|
if k not in ogrenci or k not in akademik:
|
||||||
|
continue
|
||||||
|
uye, toplam = akademik[k]
|
||||||
|
if ogrenci[k] == 0 or uye == 0:
|
||||||
|
continue
|
||||||
|
satirlar.append(f' "{k}": {{ ogrenci: {ogrenci[k]}, ogretimUyesi: {uye}, akademisyen: {toplam} }},')
|
||||||
|
|
||||||
|
oranlar = sorted(ogrenci[k] / akademik[k][0] for k in sayfalar
|
||||||
|
if ogrenci.get(k) and akademik.get(k, (0, 0))[0])
|
||||||
|
medyan = round(oranlar[len(oranlar) // 2])
|
||||||
|
|
||||||
|
eksik = sorted(sayfalar - {l.split('"')[1] for l in satirlar})
|
||||||
|
print(f"{len(satirlar)}/{len(sayfalar)} sayfa eşleşti. Eşleşmeyen {len(eksik)}:", file=sys.stderr)
|
||||||
|
for k in eksik:
|
||||||
|
print(" -", k, file=sys.stderr)
|
||||||
|
for k in sorted(set(ogrenci) - sayfalar):
|
||||||
|
print(" Excel'de var, sayfası yok:", k, file=sys.stderr)
|
||||||
|
|
||||||
|
cikti = f'''// YÖK İstatistik {DONEM}: üniversite başına örgün öğrenci ve öğretim üyesi sayısı.
|
||||||
|
//
|
||||||
|
// ÜRETİLMİŞ DOSYA — elle düzenleme. Kaynak Excel'ler data/kaynak/ altında;
|
||||||
|
// yeniden üretmek için: python3 scripts/yok-istatistik-uret.py {DONEM}
|
||||||
|
//
|
||||||
|
// Öğrenci = örgün (birinci + ikinci öğretim), tüm düzeyler; uzaktan ve açık
|
||||||
|
// öğretim dahil değil. Öğretim üyesi = Prof. + Doç. + Dr. Öğr. Üyesi.
|
||||||
|
// Anahtar: /universite/[slug] sayfa slug'ı. Burada olmayan üniversitenin
|
||||||
|
// YÖK İstatistik satırı yok (KKTC/yurt dışı ya da öğrencisi/üyesi 0).
|
||||||
|
|
||||||
|
export const YOK_ISTATISTIK_DONEM = "{DONEM}";
|
||||||
|
|
||||||
|
export const YOK_ISTATISTIK_KAYNAK_URL = "https://istatistik.yok.gov.tr/";
|
||||||
|
|
||||||
|
/** Sayfası olan üniversitelerde öğretim üyesi başına öğrencinin medyanı — kıyas çizgisi. */
|
||||||
|
export const OGRENCI_BASINA_UYE_MEDYAN = {medyan};
|
||||||
|
|
||||||
|
export type UniIstatistik = {{
|
||||||
|
/** Örgün öğrenci (ön lisans + lisans + yüksek lisans + doktora) */
|
||||||
|
ogrenci: number;
|
||||||
|
/** Profesör + doçent + doktor öğretim üyesi */
|
||||||
|
ogretimUyesi: number;
|
||||||
|
/** Tüm akademik personel (öğretim görevlisi ve araştırma görevlisi dahil) */
|
||||||
|
akademisyen: number;
|
||||||
|
}};
|
||||||
|
|
||||||
|
export const YOK_ISTATISTIK: Record<string, UniIstatistik> = {{
|
||||||
|
{chr(10).join(satirlar)}
|
||||||
|
}};
|
||||||
|
|
||||||
|
/** Üniversite sayfa slug'ının YÖK İstatistik satırı; yoksa null. */
|
||||||
|
export function uniIstatistikBul(slug: string): UniIstatistik | null {{
|
||||||
|
return YOK_ISTATISTIK[slug] ?? null;
|
||||||
|
}}
|
||||||
|
|
||||||
|
/** Öğretim üyesi başına örgün öğrenci, tam sayıya yuvarlanmış. */
|
||||||
|
export function ogrenciBasinaUye(i: UniIstatistik): number {{
|
||||||
|
return Math.round(i.ogrenci / i.ogretimUyesi);
|
||||||
|
}}
|
||||||
|
'''
|
||||||
|
(KOK / "src" / "lib" / "yok-istatistik.ts").write_text(cikti, encoding="utf-8")
|
||||||
@@ -19,6 +19,11 @@ const staticEntries: MetadataRoute.Sitemap = [
|
|||||||
priority: 0.8,
|
priority: 0.8,
|
||||||
changeFrequency: "weekly",
|
changeFrequency: "weekly",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
url: `${SITE_URL}/universite-siralamasi`,
|
||||||
|
priority: 0.7,
|
||||||
|
changeFrequency: "yearly",
|
||||||
|
},
|
||||||
{ url: `${SITE_URL}/paket`, priority: 0.7, changeFrequency: "monthly" },
|
{ url: `${SITE_URL}/paket`, priority: 0.7, changeFrequency: "monthly" },
|
||||||
{ url: `${SITE_URL}/meraklisina`, priority: 0.6, changeFrequency: "monthly" },
|
{ url: `${SITE_URL}/meraklisina`, priority: 0.6, changeFrequency: "monthly" },
|
||||||
{ url: `${SITE_URL}/iletisim`, priority: 0.3, changeFrequency: "yearly" },
|
{ url: `${SITE_URL}/iletisim`, priority: 0.3, changeFrequency: "yearly" },
|
||||||
|
|||||||
@@ -106,14 +106,19 @@ export default function SonucPage({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const tadimlik = <TadimlikBolumu sira={sira} tur={turKey} />;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-slate-50 text-slate-900">
|
<div className="min-h-screen bg-slate-50 text-slate-900">
|
||||||
<main className="mx-auto max-w-4xl px-4 py-12">
|
<main className="mx-auto max-w-4xl px-4 py-12">
|
||||||
{/* Sayfa hiyerarşisi: manuel listenin haritası → tadımlık → ham
|
{/* Sayfa hiyerarşisi: manuel listenin haritası → ham tablo →
|
||||||
tablo. İki farklı ziyaretçi, iki farklı ilk ekran:
|
tadımlık (listesi yoksa tadımlık → tablo). İki farklı
|
||||||
|
ziyaretçi, iki farklı ilk ekran:
|
||||||
|
|
||||||
• Listesi OLAN ziyaretçi ekranda önce kendi kurduğu listeyi
|
• Listesi OLAN ziyaretçi ekranda önce kendi kurduğu listeyi
|
||||||
görür — o kişi "bu ürün ne?" aşamasını geçmiştir.
|
görür — o kişi "bu ürün ne?" aşamasını geçmiştir. Haritanın
|
||||||
|
hemen altında ekleme alanı (tablo) durur; tadımlık CTA'sı
|
||||||
|
ikisinin arasına girmez, tablonun altına iner.
|
||||||
• Listesi OLMAYAN ziyaretçide harita DOM'a hiç girmez
|
• Listesi OLMAYAN ziyaretçide harita DOM'a hiç girmez
|
||||||
(manuel-harita.tsx), sıra bugünküyle birebir aynı kalır:
|
(manuel-harita.tsx), sıra bugünküyle birebir aynı kalır:
|
||||||
tadımlık → tablo. Tadımlık, ödeme öncesi gösterebildiğimiz
|
tadımlık → tablo. Tadımlık, ödeme öncesi gösterebildiğimiz
|
||||||
@@ -131,8 +136,12 @@ export default function SonucPage({
|
|||||||
<ManuelHarita yerAyir={haritayaYerAyir} />
|
<ManuelHarita yerAyir={haritayaYerAyir} />
|
||||||
|
|
||||||
{/* Girişsiz tadımlık: gerçek rapor satırı formatında tek örnek.
|
{/* Girişsiz tadımlık: gerçek rapor satırı formatında tek örnek.
|
||||||
Havuzda içerik yoksa bileşen hiç render edilmez. */}
|
Havuzda içerik yoksa bileşen hiç render edilmez. Listesi
|
||||||
<TadimlikBolumu sira={sira} tur={turKey} />
|
OLAN ziyaretçide harita ile tablo (+ ile ekleme alanı)
|
||||||
|
arasına CTA girmesin diye tadımlık tablonun altına iner;
|
||||||
|
karar sunucudaki liste sayısı çerezinden verilir, böylece
|
||||||
|
hidrasyonda yer değiştirip zıplamaz. */}
|
||||||
|
{haritayaYerAyir ? null : tadimlik}
|
||||||
|
|
||||||
{/* Yapay Zeka'dan bağımsız ham tablo — sayfanın ana gövdesi;
|
{/* Yapay Zeka'dan bağımsız ham tablo — sayfanın ana gövdesi;
|
||||||
puan türü navbar'daki sıralama rozetinden değiştirilir.
|
puan türü navbar'daki sıralama rozetinden değiştirilir.
|
||||||
@@ -145,6 +154,8 @@ export default function SonucPage({
|
|||||||
uniturGrubu={uniturGrubu}
|
uniturGrubu={uniturGrubu}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{haritayaYerAyir ? tadimlik : null}
|
||||||
|
|
||||||
{/* Sihirbaz akışı (CTA + modal) — üretim ve liste /listem'de
|
{/* Sihirbaz akışı (CTA + modal) — üretim ve liste /listem'de
|
||||||
yaşar, burada yalnızca funnel kartları render edilir */}
|
yaşar, burada yalnızca funnel kartları render edilir */}
|
||||||
<SonucSihirbazi
|
<SonucSihirbazi
|
||||||
|
|||||||
34
src/app/universite-siralamasi/page.tsx
Normal file
34
src/app/universite-siralamasi/page.tsx
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
|
import { JsonLd, breadcrumbJsonLd, sayfaMetadata } from "@/lib/seo";
|
||||||
|
import { SiteFooter } from "@/components/site-footer";
|
||||||
|
import { TurkiyeSiralamasi } from "@/features/katalog/components/turkiye-siralamasi";
|
||||||
|
import { URAP_DONEM, URAP_TOPLAM } from "@/lib/urap-siralama";
|
||||||
|
|
||||||
|
const BASLIK = `Türkiye Üniversite Sıralaması ${URAP_DONEM}`;
|
||||||
|
|
||||||
|
export const metadata: Metadata = sayfaMetadata({
|
||||||
|
title: BASLIK,
|
||||||
|
description: `Türkiye'deki ${URAP_TOPLAM} üniversitenin URAP ${URAP_DONEM} akademik performans sıralaması — sıra, puan ve üniversite sayfaları.`,
|
||||||
|
path: "/universite-siralamasi",
|
||||||
|
});
|
||||||
|
|
||||||
|
export default function UniversiteSiralamasiPage() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<main className="mx-auto w-full max-w-5xl px-4 py-12 sm:py-16">
|
||||||
|
<JsonLd
|
||||||
|
data={breadcrumbJsonLd([
|
||||||
|
{ name: "Ana Sayfa", path: "/" },
|
||||||
|
{ name: "Üniversiteler", path: "/universiteler" },
|
||||||
|
{ name: "Türkiye Sıralaması", path: "/universite-siralamasi" },
|
||||||
|
])}
|
||||||
|
/>
|
||||||
|
<h1 className="font-heading text-3xl font-bold text-slate-900 sm:text-4xl">
|
||||||
|
{BASLIK}
|
||||||
|
</h1>
|
||||||
|
<TurkiyeSiralamasi />
|
||||||
|
</main>
|
||||||
|
<SiteFooter />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -298,6 +298,65 @@ export function PixelCorner({ className }: { className?: string }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bir sıranın yerini tek satır piksel şeridinde gösteren sessiz gösterge
|
||||||
|
* (ör. URAP'ta 198 üniversite içinde 5.). Şerit soldan (1.) sağa
|
||||||
|
* (sonuncu) dilimlere bölünür; sıranın düştüğü dilim hero'daki şehirler
|
||||||
|
* gibi turuncu yanar, geri kalanı hero dokusunda durur ve imleç fırçasına
|
||||||
|
* katılır. Dekoratiftir: anlamı yanındaki metin taşır (renk tek başına
|
||||||
|
* anlam taşımaz), bu yüzden aria-hidden.
|
||||||
|
*/
|
||||||
|
export function PixelSira({
|
||||||
|
sira,
|
||||||
|
toplam,
|
||||||
|
hucre = 8,
|
||||||
|
zemin = "acik",
|
||||||
|
className,
|
||||||
|
}: {
|
||||||
|
sira: number;
|
||||||
|
toplam: number;
|
||||||
|
hucre?: number;
|
||||||
|
/** "koyu": renkli dolu zemin üstünde (ör. turuncu gösterge karesi) —
|
||||||
|
* işaret beyaz yanar, doku zeminin üstünde beyaz kalır. */
|
||||||
|
zemin?: "acik" | "koyu";
|
||||||
|
className?: string;
|
||||||
|
}) {
|
||||||
|
const svgRef = useRef<SVGSVGElement>(null);
|
||||||
|
// Isı fırçası turuncuya ısıtır; turuncu zeminde görünmez, orada kapalı.
|
||||||
|
usePixelHeat(svgRef, { radius: zemin === "koyu" ? 0 : 28 });
|
||||||
|
const yer = Math.min(
|
||||||
|
hucre - 1,
|
||||||
|
Math.max(0, Math.floor(((sira - 1) / toplam) * hucre)),
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
ref={svgRef}
|
||||||
|
viewBox={`0 0 ${hucre * CELL} ${CELL}`}
|
||||||
|
aria-hidden="true"
|
||||||
|
focusable="false"
|
||||||
|
className={cn("h-3.5 w-auto shrink-0 text-primary", className)}
|
||||||
|
>
|
||||||
|
{Array.from({ length: hucre }, (_, i) =>
|
||||||
|
i === yer ? (
|
||||||
|
<rect
|
||||||
|
key={i}
|
||||||
|
x={i * CELL + INSET}
|
||||||
|
y={INSET}
|
||||||
|
width={DOT}
|
||||||
|
height={DOT}
|
||||||
|
rx={2}
|
||||||
|
className={zemin === "koyu" ? "fill-white" : "fill-orange-500"}
|
||||||
|
fillOpacity={zemin === "koyu" ? 1 : 0.85}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<g key={i}>{fixedPixel(i * CELL, 0, opacityFor(i, 0) + 0.1)}</g>
|
||||||
|
),
|
||||||
|
)}
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/** Bölüm başlıklarının üstünde duran piksel imzalı eyebrow rozeti. */
|
/** Bölüm başlıklarının üstünde duran piksel imzalı eyebrow rozeti. */
|
||||||
export function SectionEyebrow({
|
export function SectionEyebrow({
|
||||||
children,
|
children,
|
||||||
|
|||||||
@@ -10,15 +10,21 @@ export function SiteHeader() {
|
|||||||
<header className="sticky top-4 z-50 mt-4 sm:top-6 sm:mt-6 print:hidden">
|
<header className="sticky top-4 z-50 mt-4 sm:top-6 sm:mt-6 print:hidden">
|
||||||
{/* lg altında 2 satır: logo+UserNav / sıralama+ara. lg+: tek satır, ortada nav. */}
|
{/* lg altında 2 satır: logo+UserNav / sıralama+ara. lg+: tek satır, ortada nav. */}
|
||||||
<div className="relative mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-x-2 gap-y-2 px-3 sm:gap-x-3 sm:px-4 lg:h-16 lg:flex-nowrap">
|
<div className="relative mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-x-2 gap-y-2 px-3 sm:gap-x-3 sm:px-4 lg:h-16 lg:flex-nowrap">
|
||||||
|
{/* Sayfa başlığı yuvası (NavBaslik): bir sayfa <html>'e
|
||||||
|
data-nav-baslik koyunca yazı logosu yukarı kayıp söner, yuvaya
|
||||||
|
sayfanın başlığı (ör. üniversite logosu + adı) gelir. Yuva Link'in
|
||||||
|
dışında: içine gelen düğme bağlantı içinde bağlantı olmasın.
|
||||||
|
lg'de ortadaki nav hapına taşmasın diye genişliği sınırlı. */}
|
||||||
|
<div className="relative order-1 flex min-w-0 flex-1 items-center lg:flex-none">
|
||||||
<Link
|
<Link
|
||||||
href="/"
|
href="/"
|
||||||
aria-label="KolayTercih"
|
aria-label="KolayTercih"
|
||||||
className="group order-1 flex min-w-0 shrink items-center font-bricolage"
|
className="group flex min-w-0 shrink items-center font-bricolage"
|
||||||
>
|
>
|
||||||
{/* Inline animasyonlu mark: Link'teki `group` sayesinde hover'da
|
{/* Inline animasyonlu mark: Link'teki `group` sayesinde hover'da
|
||||||
kareler danışman panelindeki nabız animasyonuyla canlanır. */}
|
kareler danışman panelindeki nabız animasyonuyla canlanır. */}
|
||||||
<AnimasyonluMark sadeceHover className="size-8 sm:size-11" />
|
<AnimasyonluMark sadeceHover className="size-8 sm:size-11" />
|
||||||
<span className="truncate">
|
<span className="truncate transition-[opacity,translate] duration-300 ease-out in-data-[nav-baslik]:pointer-events-none in-data-[nav-baslik]:-translate-y-2 in-data-[nav-baslik]:opacity-0 motion-reduce:transition-opacity">
|
||||||
<span className="text-lg font-light tracking-tighter sm:text-3xl">
|
<span className="text-lg font-light tracking-tighter sm:text-3xl">
|
||||||
Kolay
|
Kolay
|
||||||
</span>
|
</span>
|
||||||
@@ -27,6 +33,11 @@ export function SiteHeader() {
|
|||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</Link>
|
</Link>
|
||||||
|
<div
|
||||||
|
id="nav-baslik-yuvasi"
|
||||||
|
className="pointer-events-none absolute inset-y-0 right-0 left-9 flex min-w-0 items-center sm:left-12 lg:right-auto lg:w-52 xl:w-72"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<KatalogArama rehberler={getRehberAramaKayitlari()} />
|
<KatalogArama rehberler={getRehberAramaKayitlari()} />
|
||||||
{/* UserNav session+DB bekler; Suspense dışına taşarsa tüm kabuk bloklanır */}
|
{/* UserNav session+DB bekler; Suspense dışına taşarsa tüm kabuk bloklanır */}
|
||||||
<Suspense fallback={<UserNavFallback />}>
|
<Suspense fallback={<UserNavFallback />}>
|
||||||
|
|||||||
72
src/features/katalog/components/akademik-ayrinti.tsx
Normal file
72
src/features/katalog/components/akademik-ayrinti.tsx
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import type { ReactNode } from "react";
|
||||||
|
import { ChevronRight, GraduationCap, X } from "lucide-react";
|
||||||
|
import {
|
||||||
|
Drawer,
|
||||||
|
DrawerClose,
|
||||||
|
DrawerContent,
|
||||||
|
DrawerDescription,
|
||||||
|
DrawerTitle,
|
||||||
|
DrawerTrigger,
|
||||||
|
} from "@/components/ui/drawer";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Üniversite sayfasında özet kartlarının altındaki "Akademik göstergeler ›"
|
||||||
|
* satırı (Apple Sağlık'taki "Tüm verileri göster" gibi): sık bakılan sayılar
|
||||||
|
* kartlarda, ayrıntı bir dokunuş derinde. İkinci satır içeride ne olduğunu
|
||||||
|
* önceden söyler. Ayrıntı alttan açılan çekmecede; çekmece ve kapatma
|
||||||
|
* çarpısı cta-sira-form.tsx'teki çekmeceyle birebir aynı sınıf setinde.
|
||||||
|
* Kartlar sunucuda üretilip `children` olarak gelir.
|
||||||
|
*/
|
||||||
|
export function AkademikAyrinti({
|
||||||
|
universite,
|
||||||
|
onizleme,
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
universite: string;
|
||||||
|
onizleme: string;
|
||||||
|
children: ReactNode;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<Drawer handleOnly>
|
||||||
|
<DrawerTrigger asChild>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="mt-4 flex w-full cursor-pointer items-center gap-4 group rounded-2xl border border-slate-200 bg-white p-4 text-left transition-[background-color,border-color,transform] duration-150 hover:border-orange-500 hover:bg-orange-50/60 active:scale-[0.99] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring sm:p-5"
|
||||||
|
>
|
||||||
|
<span className="flex size-11 shrink-0 items-center justify-center rounded-xl bg-primary/10">
|
||||||
|
<GraduationCap className="size-5 text-primary" aria-hidden />
|
||||||
|
</span>
|
||||||
|
<span className="min-w-0 flex-1">
|
||||||
|
<span className="block font-heading text-lg font-bold text-slate-900">
|
||||||
|
Akademik göstergeler
|
||||||
|
</span>
|
||||||
|
<span className="block truncate text-sm text-slate-500">
|
||||||
|
{onizleme}
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
<ChevronRight
|
||||||
|
className="size-5 shrink-0 text-slate-400 transition-[color,transform] duration-150 group-hover:translate-x-0.5 group-hover:text-orange-500"
|
||||||
|
aria-hidden
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</DrawerTrigger>
|
||||||
|
<DrawerContent className="max-h-[92dvh] bg-white sm:mx-auto sm:max-w-2xl sm:border-x sm:border-slate-200 sm:shadow-2xl">
|
||||||
|
<DrawerClose className="absolute top-3 right-3 z-10 flex size-9 cursor-pointer items-center justify-center rounded-full border border-slate-200 bg-popover text-slate-500 transition-[background-color,transform] duration-150 hover:bg-slate-100 hover:text-slate-800 active:scale-[0.96]">
|
||||||
|
<X className="size-4" aria-hidden />
|
||||||
|
<span className="sr-only">Kapat</span>
|
||||||
|
</DrawerClose>
|
||||||
|
<div className="min-h-0 flex-1 overflow-y-auto px-4 pt-5 pb-[max(1.25rem,env(safe-area-inset-bottom))] sm:px-6">
|
||||||
|
<DrawerTitle className="px-10 text-center font-heading text-2xl font-bold text-slate-900">
|
||||||
|
Akademik göstergeler
|
||||||
|
</DrawerTitle>
|
||||||
|
<DrawerDescription className="mt-1 px-10 text-center text-sm text-slate-500">
|
||||||
|
{universite}
|
||||||
|
</DrawerDescription>
|
||||||
|
<div className="mt-5">{children}</div>
|
||||||
|
</div>
|
||||||
|
</DrawerContent>
|
||||||
|
</Drawer>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -22,6 +22,7 @@ import {
|
|||||||
} from "./sayfalama";
|
} from "./sayfalama";
|
||||||
import { BolumProgramListesi } from "./bolum-program-listesi";
|
import { BolumProgramListesi } from "./bolum-program-listesi";
|
||||||
import { VeriKaynagi } from "./veri-kaynagi";
|
import { VeriKaynagi } from "./veri-kaynagi";
|
||||||
|
import { NavBaslik } from "./nav-baslik";
|
||||||
import { CtaSiraForm } from "@/features/sihirbaz/components/cta-sira-form";
|
import { CtaSiraForm } from "@/features/sihirbaz/components/cta-sira-form";
|
||||||
import { SiteFooter } from "@/components/site-footer";
|
import { SiteFooter } from "@/components/site-footer";
|
||||||
import { Skeleton } from "@/components/ui/skeleton";
|
import { Skeleton } from "@/components/ui/skeleton";
|
||||||
@@ -224,8 +225,12 @@ export function BolumIcerik({ slug, sayfa }: { slug: string; sayfa: number }) {
|
|||||||
)}
|
)}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
{/* Başlık üst çubuğun altına girince üst çubukta bölüm adı belirir */}
|
||||||
|
<NavBaslik baslikId="bolum-baslik" ad={bolum.ad} />
|
||||||
<header className="border-b pb-7 sm:pb-9">
|
<header className="border-b pb-7 sm:pb-9">
|
||||||
<h1 className="max-w-3xl font-heading text-3xl font-bold tracking-tight text-foreground sm:text-5xl">
|
<h1
|
||||||
|
id="bolum-baslik"
|
||||||
|
className="max-w-3xl font-heading text-3xl font-bold tracking-tight text-foreground sm:text-5xl">
|
||||||
{bolum.ad}
|
{bolum.ad}
|
||||||
{ilkSayfa ? "" : ` — Sayfa ${sayfa}`}
|
{ilkSayfa ? "" : ` — Sayfa ${sayfa}`}
|
||||||
{!ilkSayfa && aralik ? (
|
{!ilkSayfa && aralik ? (
|
||||||
|
|||||||
116
src/features/katalog/components/nav-baslik.tsx
Normal file
116
src/features/katalog/components/nav-baslik.tsx
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import {
|
||||||
|
type ReactNode,
|
||||||
|
useEffect,
|
||||||
|
useState,
|
||||||
|
useSyncExternalStore,
|
||||||
|
} from "react";
|
||||||
|
import { createPortal } from "react-dom";
|
||||||
|
import { AnimatePresence, motion, useReducedMotion } from "motion/react";
|
||||||
|
|
||||||
|
/** SiteHeader'daki yuva; logo yazısının hemen sağında. */
|
||||||
|
export const NAV_BASLIK_YUVASI = "nav-baslik-yuvasi";
|
||||||
|
|
||||||
|
const subscribe = () => () => {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* iOS'taki büyük başlık davranışı: sayfa başlığı (h1) üst çubuğun altına
|
||||||
|
* girince üst çubukta "KolayTercih" yazısı yukarı kayıp söner (SiteHeader'da
|
||||||
|
* `in-data-[nav-baslik]` ile), yerine üniversitenin logosu ve adı gelir.
|
||||||
|
* Dokununca sayfanın başına döner. Tetik IntersectionObserver'la: kaydırma
|
||||||
|
* dinleyicisi yok, üst sınır üst çubuğun alt kenarı.
|
||||||
|
*
|
||||||
|
* Hareket Apple'ın varsayılanı: sekmesiz yay (bounce 0, 0,35 sn), giriş ve
|
||||||
|
* çıkış aynı yoldan. "Hareketi azalt" açıksa yalnız opaklık değişir.
|
||||||
|
* Logo sunucuda üretilip `logo` olarak gelir (logo listesi istemciye inmez);
|
||||||
|
* logosu olmayan sayfada verilmez, yalnız ad görünür.
|
||||||
|
*/
|
||||||
|
export function NavBaslik({
|
||||||
|
baslikId,
|
||||||
|
ad,
|
||||||
|
logo,
|
||||||
|
}: {
|
||||||
|
baslikId: string;
|
||||||
|
ad: string;
|
||||||
|
/** Verilmezse yalnız ad görünür (ör. bölüm sayfası). */
|
||||||
|
logo?: ReactNode;
|
||||||
|
}) {
|
||||||
|
const [goster, setGoster] = useState(false);
|
||||||
|
const azHareket = useReducedMotion();
|
||||||
|
const yuva = useSyncExternalStore(
|
||||||
|
subscribe,
|
||||||
|
() => document.getElementById(NAV_BASLIK_YUVASI),
|
||||||
|
() => null,
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const baslik = document.getElementById(baslikId);
|
||||||
|
// Sayfada başka <header> olabilir (bölüm sayfası): yuvanın kendi
|
||||||
|
// üst çubuğu alınır.
|
||||||
|
const ustCubuk = document
|
||||||
|
.getElementById(NAV_BASLIK_YUVASI)
|
||||||
|
?.closest("header");
|
||||||
|
if (!baslik || !ustCubuk) return;
|
||||||
|
|
||||||
|
let gozlemci: IntersectionObserver | null = null;
|
||||||
|
const kur = () => {
|
||||||
|
gozlemci?.disconnect();
|
||||||
|
const alt = Math.round(ustCubuk.getBoundingClientRect().bottom);
|
||||||
|
gozlemci = new IntersectionObserver(
|
||||||
|
([giris]) => {
|
||||||
|
// Görünmüyor ve üst çubuğun üstünde kaldıysa (aşağıda değil)
|
||||||
|
setGoster(
|
||||||
|
!giris.isIntersecting && giris.boundingClientRect.top < alt,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
{ rootMargin: `-${alt}px 0px 0px 0px` },
|
||||||
|
);
|
||||||
|
gozlemci.observe(baslik);
|
||||||
|
};
|
||||||
|
kur();
|
||||||
|
window.addEventListener("resize", kur);
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener("resize", kur);
|
||||||
|
gozlemci?.disconnect();
|
||||||
|
};
|
||||||
|
}, [baslikId]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const kok = document.documentElement;
|
||||||
|
if (goster) kok.dataset.navBaslik = "";
|
||||||
|
else delete kok.dataset.navBaslik;
|
||||||
|
return () => {
|
||||||
|
delete kok.dataset.navBaslik;
|
||||||
|
};
|
||||||
|
}, [goster]);
|
||||||
|
|
||||||
|
if (!yuva) return null;
|
||||||
|
|
||||||
|
const kayma = azHareket ? 0 : 10;
|
||||||
|
return createPortal(
|
||||||
|
<AnimatePresence>
|
||||||
|
{goster ? (
|
||||||
|
<motion.button
|
||||||
|
key="nav-baslik"
|
||||||
|
type="button"
|
||||||
|
onClick={() =>
|
||||||
|
window.scrollTo({ top: 0, behavior: azHareket ? "auto" : "smooth" })
|
||||||
|
}
|
||||||
|
aria-label={`${ad} — sayfanın başına dön`}
|
||||||
|
initial={{ opacity: 0, y: kayma }}
|
||||||
|
animate={{ opacity: 1, y: 0 }}
|
||||||
|
exit={{ opacity: 0, y: kayma }}
|
||||||
|
transition={{ type: "spring", bounce: 0, duration: 0.35 }}
|
||||||
|
className="pointer-events-auto flex min-w-0 max-w-full cursor-pointer items-center gap-2 rounded-full py-1 pr-2 pl-1 transition-colors duration-150 hover:text-orange-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring active:scale-[0.97]"
|
||||||
|
>
|
||||||
|
{logo ?? null}
|
||||||
|
<span className="truncate font-bricolage text-base font-semibold tracking-tight sm:text-xl">
|
||||||
|
{ad}
|
||||||
|
</span>
|
||||||
|
</motion.button>
|
||||||
|
) : null}
|
||||||
|
</AnimatePresence>,
|
||||||
|
yuva,
|
||||||
|
);
|
||||||
|
}
|
||||||
123
src/features/katalog/components/turkiye-siralamasi.tsx
Normal file
123
src/features/katalog/components/turkiye-siralamasi.tsx
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
import Link from "next/link";
|
||||||
|
import { getAllUniversiteler } from "../katalog-queries";
|
||||||
|
import { trBaslikDuzeni } from "@/lib/slug";
|
||||||
|
import { UNITUR_ETIKET } from "@/lib/unitur";
|
||||||
|
import { UniLogo } from "@/components/uni-logo";
|
||||||
|
import { PagePixelDivider } from "@/components/pixel-decor";
|
||||||
|
import { UrapLogo } from "./urap-logo";
|
||||||
|
import {
|
||||||
|
URAP_DONEM,
|
||||||
|
URAP_KAYNAK_URL,
|
||||||
|
URAP_SIRA,
|
||||||
|
URAP_TOPLAM,
|
||||||
|
} from "@/lib/urap-siralama";
|
||||||
|
|
||||||
|
const sayi = (n: number) => n.toLocaleString("tr-TR");
|
||||||
|
const puanYaz = (n: number) =>
|
||||||
|
n.toLocaleString("tr-TR", {
|
||||||
|
minimumFractionDigits: 2,
|
||||||
|
maximumFractionDigits: 2,
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URAP atfı: izin "urapcenter.org adresine aktif bağlantı" şartına bağlı —
|
||||||
|
* gerçek <a href>, yeni sekme, rel="noopener", nofollow YOK. Sayfanın başında
|
||||||
|
* ve sonunda tekrar edilir, liste uzun olduğundan sıra sayısıyla aynı ekranda
|
||||||
|
* kalsın.
|
||||||
|
*/
|
||||||
|
function UrapAtfi() {
|
||||||
|
return (
|
||||||
|
<a
|
||||||
|
href={URAP_KAYNAK_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
className="font-medium text-primary hover:underline"
|
||||||
|
>
|
||||||
|
urapcenter.org
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function TurkiyeSiralamasi() {
|
||||||
|
const ozetler = new Map(getAllUniversiteler().map((u) => [u.slug, u]));
|
||||||
|
const satirlar = Object.entries(URAP_SIRA)
|
||||||
|
.map(([slug, u]) => ({ slug, ...u, ozet: ozetler.get(slug) }))
|
||||||
|
.sort((a, b) => a.sira - b.sira);
|
||||||
|
const enYuksek = satirlar[0]?.puan ?? 1;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="mt-4 flex flex-col-reverse gap-4 sm:flex-row sm:items-start sm:justify-between sm:gap-8">
|
||||||
|
<p className="max-w-3xl text-sm leading-7 text-slate-600">
|
||||||
|
Türkiye'deki {sayi(URAP_TOPLAM)} üniversitenin URAP (University
|
||||||
|
Ranking by Academic Performance) {URAP_DONEM} genel sıralaması. URAP,
|
||||||
|
üniversiteleri yayın, atıf, proje ve doktora gibi{" "}
|
||||||
|
<strong>akademik yayın ve araştırma performansı</strong>{" "}
|
||||||
|
göstergeleriyle puanlar; eğitim kalitesini ya da mezunların iş bulma
|
||||||
|
oranını ölçmez. Bölüm seçerken tek başına ölçüt değil, taban
|
||||||
|
sıralamayla birlikte bakılacak bir bilgi. Kaynak: <UrapAtfi />.
|
||||||
|
</p>
|
||||||
|
<UrapLogo className="h-10 sm:h-12" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<PagePixelDivider seed={71} className="mt-8" />
|
||||||
|
|
||||||
|
<ol className="mt-8 divide-y divide-slate-100 overflow-hidden rounded-xl border border-slate-200 bg-white">
|
||||||
|
{satirlar.map((u) => {
|
||||||
|
const ad = u.ozet?.ad ?? trBaslikDuzeni(u.slug.replace(/-/g, " "));
|
||||||
|
const tur = u.ozet?.unitur ? UNITUR_ETIKET[u.ozet.unitur]?.cip : null;
|
||||||
|
const alt = [u.ozet?.il ? trBaslikDuzeni(u.ozet.il) : null, tur]
|
||||||
|
.filter(Boolean)
|
||||||
|
.join(" · ");
|
||||||
|
return (
|
||||||
|
<li key={u.slug}>
|
||||||
|
<Link
|
||||||
|
href={`/universite/${u.slug}`}
|
||||||
|
className="group flex items-center gap-3 px-3 py-3 hover:bg-slate-50 sm:gap-4 sm:px-5"
|
||||||
|
>
|
||||||
|
<span className="w-9 shrink-0 text-right font-heading text-lg font-bold tabular-nums text-slate-900 sm:w-11 sm:text-xl">
|
||||||
|
{u.sira}
|
||||||
|
</span>
|
||||||
|
<UniLogo slug={u.slug} ad={ad} boy="sm" />
|
||||||
|
<span className="min-w-0 flex-1">
|
||||||
|
<span className="block truncate text-sm font-medium text-slate-800 group-hover:text-primary group-hover:underline">
|
||||||
|
{ad}
|
||||||
|
</span>
|
||||||
|
{alt ? (
|
||||||
|
<span className="block text-xs text-slate-400">{alt}</span>
|
||||||
|
) : null}
|
||||||
|
</span>
|
||||||
|
<span className="hidden w-40 shrink-0 items-center gap-3 sm:flex">
|
||||||
|
<span
|
||||||
|
className="h-1.5 flex-1 overflow-hidden rounded-full bg-slate-100"
|
||||||
|
aria-hidden
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
className="block h-full rounded-full bg-primary/60"
|
||||||
|
style={{ width: `${(u.puan / enYuksek) * 100}%` }}
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
<span className="w-14 text-right text-xs tabular-nums text-slate-500">
|
||||||
|
{puanYaz(u.puan)}
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<div className="mt-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-6">
|
||||||
|
<UrapLogo className="h-8" />
|
||||||
|
<p className="text-xs leading-5 text-slate-500">
|
||||||
|
Sağdaki sayı URAP toplam puanıdır. Listede olmayan üniversite
|
||||||
|
sıralamaya girmemiştir — KKTC/yurt dışı kurumlar ve araştırma çıktısı
|
||||||
|
henüz oluşmamış yeni üniversiteler listede yer almaz; bu,
|
||||||
|
"kötü" demek değildir. URAP Türkiye Sıralaması {URAP_DONEM},
|
||||||
|
URAP Araştırma Laboratuvarı'nın izniyle yayımlanmıştır. Kaynak:{" "}
|
||||||
|
<UrapAtfi />.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,7 +1,19 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import { ChevronRight } from "lucide-react";
|
import {
|
||||||
|
ArrowRight,
|
||||||
|
Building2,
|
||||||
|
ChevronRight,
|
||||||
|
Landmark,
|
||||||
|
LayoutList,
|
||||||
|
Medal,
|
||||||
|
MapPin,
|
||||||
|
Target,
|
||||||
|
Users,
|
||||||
|
} from "lucide-react";
|
||||||
|
import type { LucideIcon } from "lucide-react";
|
||||||
|
import type { ReactNode } from "react";
|
||||||
import {
|
import {
|
||||||
getAllUniversiteler,
|
getAllUniversiteler,
|
||||||
getAllUniversiteSlugs,
|
getAllUniversiteSlugs,
|
||||||
@@ -26,17 +38,23 @@ import {
|
|||||||
sayfaDilimi,
|
sayfaDilimi,
|
||||||
siraYiliEtiketi,
|
siraYiliEtiketi,
|
||||||
} from "./sayfalama";
|
} from "./sayfalama";
|
||||||
import { PagePixelDivider } from "@/components/pixel-decor";
|
import { PagePixelDivider, PixelSira } from "@/components/pixel-decor";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
import { UniversiteKonumHaritasi } from "./universite-konum-haritasi";
|
import { UniversiteKonumHaritasi } from "./universite-konum-haritasi";
|
||||||
import { uniUlkeKonum } from "@/lib/harita-ulkeler";
|
import { uniUlkeKonum } from "@/lib/harita-ulkeler";
|
||||||
import { UniversiteProgramTablosu } from "./universite-program-tablosu";
|
import { UniversiteProgramTablosu } from "./universite-program-tablosu";
|
||||||
import { VeriKaynagi } from "./veri-kaynagi";
|
import { VeriKaynagi } from "./veri-kaynagi";
|
||||||
|
import { URAP_DONEM, URAP_KAYNAK_URL, URAP_TOPLAM } from "@/lib/urap-siralama";
|
||||||
import {
|
import {
|
||||||
URAP_DONEM,
|
YOK_ISTATISTIK_DONEM,
|
||||||
URAP_KAYNAK_URL,
|
YOK_ISTATISTIK_KAYNAK_URL,
|
||||||
URAP_TOPLAM,
|
OGRENCI_BASINA_UYE_MEDYAN,
|
||||||
} from "@/lib/urap-siralama";
|
ogrenciBasinaUye,
|
||||||
|
} from "@/lib/yok-istatistik";
|
||||||
import { UniLogo } from "@/components/uni-logo";
|
import { UniLogo } from "@/components/uni-logo";
|
||||||
|
import { UrapLogo } from "./urap-logo";
|
||||||
|
import { AkademikAyrinti } from "./akademik-ayrinti";
|
||||||
|
import { NavBaslik } from "./nav-baslik";
|
||||||
import { uniLogoYolu } from "@/lib/uni-logolar";
|
import { uniLogoYolu } from "@/lib/uni-logolar";
|
||||||
import { Skeleton } from "@/components/ui/skeleton";
|
import { Skeleton } from "@/components/ui/skeleton";
|
||||||
import type { Program } from "@/types/yokatlas";
|
import type { Program } from "@/types/yokatlas";
|
||||||
@@ -124,8 +142,8 @@ function fakulteOzeti({
|
|||||||
* Atıf pazarlık dışı: URAP'ın izni "urapcenter.org adresine aktif bağlantı"
|
* Atıf pazarlık dışı: URAP'ın izni "urapcenter.org adresine aktif bağlantı"
|
||||||
* şartına bağlı, o yüzden gerçek <a href>, yeni sekme, rel="noopener" ve
|
* şartına bağlı, o yüzden gerçek <a href>, yeni sekme, rel="noopener" ve
|
||||||
* nofollow YOK. Sıra payda ("198 üniversite arasında") ve dönem olmadan
|
* nofollow YOK. Sıra payda ("198 üniversite arasında") ve dönem olmadan
|
||||||
* gösterilmez. URAP listesinde olmayan üniversitede sayı yoktur; eksiklik
|
* gösterilmez. Sıra ve atıf artık AkademikGostergeler kartında; bu satır
|
||||||
* gizlenmez, nedeni tek cümleyle yazılır.
|
* yalnız URAP listesinde olmayan üniversitede nedeni tek cümleyle yazar.
|
||||||
*/
|
*/
|
||||||
function UrapKaynakSatiri({ uni }: { uni: UniDetay }) {
|
function UrapKaynakSatiri({ uni }: { uni: UniDetay }) {
|
||||||
if (!uni.urap) {
|
if (!uni.urap) {
|
||||||
@@ -139,19 +157,289 @@ function UrapKaynakSatiri({ uni }: { uni: UniDetay }) {
|
|||||||
</p>
|
</p>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
// Sıra ve zorunlu atıf AkademikGostergeler kartında.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Akademik göstergeler: URAP sırası + YÖK İstatistik öğrenci/öğretim üyesi.
|
||||||
|
* Sayfada değil, özet kartlarının altındaki "Akademik göstergeler ›"
|
||||||
|
* satırının açtığı alt sayfada (AkademikAyrinti) durur; sıra sayısı ayrıca
|
||||||
|
* dördüncü özet kartında.
|
||||||
|
*
|
||||||
|
* Apple ayrıntı sayfası düzeni (Hava Durumu gibi): kart ve süs ayraç yok,
|
||||||
|
* her şey ortalı; iki dev sayı yan yana ince çizgiyle ayrılır, altında ham
|
||||||
|
* sayılar, tek satır not, buton ve en altta ince yazıyla kaynaklar. Alt
|
||||||
|
* sayfa ekranı doldurmasın diye dikey değil yan yana dizilir.
|
||||||
|
*
|
||||||
|
* URAP: sıra payda ve dönem olmadan gösterilmez; sıranın yeri piksel
|
||||||
|
* şeridinde (PixelSira) turuncu yanar. Atıf pazarlık dışı — URAP'ın izni
|
||||||
|
* urapcenter.org'a aktif bağlantı şartına bağlı: gerçek <a href>, yeni
|
||||||
|
* sekme, rel="noopener", nofollow YOK. Oran kıyası sayfası olan
|
||||||
|
* üniversitelerin medyanıyla yapılır; renk kullanılmaz.
|
||||||
|
*/
|
||||||
|
function AkademikGostergeler({ uni }: { uni: UniDetay }) {
|
||||||
|
const { urap, istatistik: i } = uni;
|
||||||
|
const oran = i ? ogrenciBasinaUye(i) : null;
|
||||||
|
const oranVar = i != null && oran != null;
|
||||||
|
if (!urap && !oranVar) return null;
|
||||||
|
const dilim = urap ? Math.ceil((urap.sira / URAP_TOPLAM) * 100) : 0;
|
||||||
|
const kaynakLinki =
|
||||||
|
"font-medium text-primary transition-colors hover:text-orange-500 hover:underline";
|
||||||
|
// Dört gösterge dört canlı karede, logodaki kareler gibi yerleşir: iki
|
||||||
|
// sütun, sağdaki aşağı kaymış, kare boyları farklı — ne tepeler ne
|
||||||
|
// bitişler hizalı (masonry). Renk sempati katar, anlamı etiket taşır;
|
||||||
|
// yazı beyaz (turuncu/mavi zeminde sitenin CTA'larıyla aynı ikili).
|
||||||
|
const kare =
|
||||||
|
"flex flex-col items-center justify-center rounded-3xl px-3 text-white";
|
||||||
|
const etiket = "text-sm font-bold text-white/90";
|
||||||
|
const devSayi =
|
||||||
|
"font-heading text-5xl font-bold leading-none tracking-tight";
|
||||||
|
const orta = "font-heading text-3xl font-bold leading-none";
|
||||||
|
|
||||||
|
const siraKaresi = urap ? (
|
||||||
|
<div className={`${kare} min-h-40 bg-orange-500 py-4`}>
|
||||||
|
<dt className={etiket}>Türkiye sırası</dt>
|
||||||
|
<dd className="mt-3 flex items-baseline justify-center gap-1">
|
||||||
|
<span className={devSayi}>{sayi(urap.sira)}.</span>
|
||||||
|
<span className="text-base font-bold text-white/80">
|
||||||
|
/ {sayi(URAP_TOPLAM)}
|
||||||
|
</span>
|
||||||
|
</dd>
|
||||||
|
<dd className="mt-2 text-base font-bold">
|
||||||
|
{dilim <= 50 ? `İlk %${dilim}` : `${URAP_DONEM} listesi`}
|
||||||
|
</dd>
|
||||||
|
<dd className="mt-3 text-white">
|
||||||
|
<PixelSira
|
||||||
|
sira={urap.sira}
|
||||||
|
toplam={URAP_TOPLAM}
|
||||||
|
hucre={10}
|
||||||
|
zemin="koyu"
|
||||||
|
className="h-3"
|
||||||
|
/>
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
) : null;
|
||||||
|
const ogrenciKaresi = oranVar ? (
|
||||||
|
<div className={`${kare} min-h-24 bg-indigo-500 py-3`}>
|
||||||
|
<dd className={orta}>{sayi(i.ogrenci)}</dd>
|
||||||
|
<dt className={`mt-1.5 ${etiket}`}>Örgün öğrenci</dt>
|
||||||
|
</div>
|
||||||
|
) : null;
|
||||||
|
const oranKaresi = oranVar ? (
|
||||||
|
<div className={`${kare} min-h-32 bg-primary py-4`}>
|
||||||
|
<dt className={etiket}>Hoca başına öğrenci</dt>
|
||||||
|
<dd className={`mt-3 ${devSayi}`}>{sayi(oran)}</dd>
|
||||||
|
<dd className="mt-2 text-base font-bold text-white/90">
|
||||||
|
Türkiye: {sayi(OGRENCI_BASINA_UYE_MEDYAN)}
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
) : null;
|
||||||
|
const uyeKaresi = oranVar ? (
|
||||||
|
<div className={`${kare} bg-green-600 py-5`}>
|
||||||
|
<dd className={orta}>{sayi(i.ogretimUyesi)}</dd>
|
||||||
|
<dt className={`mt-1.5 ${etiket}`}>Öğretim üyesi</dt>
|
||||||
|
</div>
|
||||||
|
) : null;
|
||||||
|
const ikiSutun = urap != null && oranVar;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<p className="mt-2 text-xs leading-5 text-slate-500">
|
<div className="flex flex-col items-center text-center">
|
||||||
URAP Türkiye Sıralaması {URAP_DONEM} ({sayi(URAP_TOPLAM)} üniversite
|
<dl className="flex w-full max-w-md items-start gap-3">
|
||||||
arasında) — akademik yayın ve araştırma performansını ölçer; eğitim
|
<div className="flex flex-1 flex-col gap-3">
|
||||||
kalitesini ya da iş bulma oranını ölçmez. Kaynak:{" "}
|
{siraKaresi}
|
||||||
|
{ogrenciKaresi}
|
||||||
|
</div>
|
||||||
|
{ikiSutun || (!urap && oranVar) ? (
|
||||||
|
<div className={`flex flex-1 flex-col gap-3 ${ikiSutun ? "mt-12" : ""}`}>
|
||||||
|
{oranKaresi}
|
||||||
|
{uyeKaresi}
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
{urap ? (
|
||||||
|
<>
|
||||||
|
<p className="mt-4 max-w-md text-sm leading-relaxed text-slate-500">
|
||||||
|
Türkiye sırası araştırma performansını ölçer; eğitim kalitesini
|
||||||
|
ya da iş bulma oranını ölçmez.
|
||||||
|
</p>
|
||||||
|
<Button
|
||||||
|
asChild
|
||||||
|
size="lg"
|
||||||
|
variant="outline"
|
||||||
|
className="mt-4 cursor-pointer px-6 transition-[background-color,border-color,color,transform] duration-150 hover:border-orange-500 hover:bg-orange-50/60 hover:text-orange-500 active:scale-[0.97]"
|
||||||
|
>
|
||||||
|
<Link href="/universite-siralamasi">
|
||||||
|
Tüm sıralamayı gör
|
||||||
|
<ArrowRight className="size-4" aria-hidden />
|
||||||
|
</Link>
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
) : null}
|
||||||
|
|
||||||
|
<div className="mt-5 flex w-full max-w-md items-center justify-center gap-3 border-t border-slate-100 pt-4 text-left text-xs leading-5 text-slate-500">
|
||||||
|
{urap ? <UrapLogo className="h-7 shrink-0" /> : null}
|
||||||
|
<div>
|
||||||
|
{urap ? (
|
||||||
|
<p>
|
||||||
|
URAP {URAP_DONEM} ·{" "}
|
||||||
<a
|
<a
|
||||||
href={URAP_KAYNAK_URL}
|
href={URAP_KAYNAK_URL}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener"
|
rel="noopener"
|
||||||
className="font-medium text-primary hover:underline"
|
className={kaynakLinki}
|
||||||
>
|
>
|
||||||
urapcenter.org
|
urapcenter.org
|
||||||
</a>
|
</a>
|
||||||
|
</p>
|
||||||
|
) : null}
|
||||||
|
{i ? (
|
||||||
|
<p>
|
||||||
|
YÖK {YOK_ISTATISTIK_DONEM} ·{" "}
|
||||||
|
<a
|
||||||
|
href={YOK_ISTATISTIK_KAYNAK_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
className={kaynakLinki}
|
||||||
|
>
|
||||||
|
istatistik.yok.gov.tr
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
) : null}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Özet kartı (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
|
||||||
|
* (DESIGN.md §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.
|
||||||
|
* Harita yanındaki dört hücrenin 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.
|
||||||
|
*/
|
||||||
|
function OzetKart({
|
||||||
|
ikon: Ikon,
|
||||||
|
etiket,
|
||||||
|
deger,
|
||||||
|
birim,
|
||||||
|
alt,
|
||||||
|
ek,
|
||||||
|
className,
|
||||||
|
}: {
|
||||||
|
ikon: LucideIcon;
|
||||||
|
etiket: string;
|
||||||
|
deger: ReactNode;
|
||||||
|
birim?: string;
|
||||||
|
alt: ReactNode;
|
||||||
|
ek?: ReactNode;
|
||||||
|
className?: string;
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={`flex flex-col rounded-2xl border border-slate-200 bg-white p-4 sm:p-5 ${className ?? ""}`}
|
||||||
|
>
|
||||||
|
<dt className="order-2 mt-2 text-base font-semibold text-slate-900">
|
||||||
|
{etiket}
|
||||||
|
</dt>
|
||||||
|
<dd className="order-1 flex items-start justify-between gap-1.5">
|
||||||
|
<span className="flex min-w-0 flex-wrap items-baseline gap-x-1">
|
||||||
|
<span className="font-heading text-4xl font-bold leading-none tracking-tight text-slate-900 sm:text-5xl">
|
||||||
|
{deger}
|
||||||
|
</span>
|
||||||
|
{birim ? (
|
||||||
|
<span className="text-base font-semibold text-slate-400">
|
||||||
|
{birim}
|
||||||
|
</span>
|
||||||
|
) : null}
|
||||||
|
</span>
|
||||||
|
<span className="flex size-8 shrink-0 items-center justify-center rounded-xl bg-primary/10 sm:size-10">
|
||||||
|
<Ikon className="size-4 text-primary sm:size-5" aria-hidden />
|
||||||
|
</span>
|
||||||
|
</dd>
|
||||||
|
<dd className="order-3 mt-0.5 text-sm text-slate-500">{alt}</dd>
|
||||||
|
{ek ? <dd className="order-4 mt-3">{ek}</dd> : null}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dördüncü özet kartı: URAP Türkiye sırası. Açıklamanın altında sıranın
|
||||||
|
* yerini gösteren piksel şeridi (PixelSira) durur. Kartın tamamı sıralama
|
||||||
|
* sayfasına gider (after: ile gerilmiş link); hover kenarlığı bunu belli
|
||||||
|
* eder. Atıf pazarlık dışı: sıra payda ve dönem olmadan gösterilmez;
|
||||||
|
* urapcenter.org'a aktif bağlantı (yeni sekme, rel="noopener", nofollow YOK)
|
||||||
|
* z-10 ile kart linkinin üstünde kalır.
|
||||||
|
*/
|
||||||
|
function TurkiyeSirasiKarti({ sira }: { sira: number }) {
|
||||||
|
const dilim = Math.ceil((sira / URAP_TOPLAM) * 100);
|
||||||
|
return (
|
||||||
|
<OzetKart
|
||||||
|
className="group relative transition-[background-color,border-color] duration-150 hover:border-orange-500 hover:bg-orange-50/60"
|
||||||
|
ikon={Medal}
|
||||||
|
ek={<PixelSira sira={sira} toplam={URAP_TOPLAM} className="h-3" />}
|
||||||
|
etiket="Türkiye sırası"
|
||||||
|
deger={
|
||||||
|
<Link
|
||||||
|
href="/universite-siralamasi"
|
||||||
|
aria-label={`Türkiye sıralamasında ${sayi(sira)}. — tüm üniversite sıralamasını gör`}
|
||||||
|
className="transition-colors after:absolute after:inset-0 after:rounded-2xl group-hover:text-orange-500 focus-visible:outline-none focus-visible:after:ring-2 focus-visible:after:ring-primary"
|
||||||
|
>
|
||||||
|
{sayi(sira)}.
|
||||||
|
</Link>
|
||||||
|
}
|
||||||
|
birim={`/ ${sayi(URAP_TOPLAM)}`}
|
||||||
|
alt={
|
||||||
|
<>
|
||||||
|
{dilim <= 50 ? (
|
||||||
|
<span className="block font-semibold text-slate-700">
|
||||||
|
İlk %{dilim}
|
||||||
|
</span>
|
||||||
|
) : null}
|
||||||
|
<a
|
||||||
|
href={URAP_KAYNAK_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
className="relative z-10 font-medium text-primary transition-colors hover:text-orange-500 hover:underline"
|
||||||
|
>
|
||||||
|
URAP {URAP_DONEM}
|
||||||
|
</a>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** "Akademik göstergeler ›" satırının ikinci satırı: içeride ne var. */
|
||||||
|
function akademikOnizleme(uni: UniDetay): string {
|
||||||
|
const oran = uni.istatistik ? ogrenciBasinaUye(uni.istatistik) : null;
|
||||||
|
if (oran != null) return `Hoca başına ${sayi(oran)} öğrenci`;
|
||||||
|
return "Türkiye sıralaması ayrıntısı";
|
||||||
|
}
|
||||||
|
|
||||||
|
/** YÖK İstatistik'in ayrı kaynak satırı — dönemi YÖK Atlas'tan ve URAP'tan farklı. */
|
||||||
|
function IstatistikKaynakSatiri({ uni }: { uni: UniDetay }) {
|
||||||
|
if (!uni.istatistik) return null;
|
||||||
|
return (
|
||||||
|
<p className="mt-2 text-xs leading-5 text-slate-500">
|
||||||
|
Öğrenci ve öğretim üyesi sayıları: YÖK Yükseköğretim İstatistikleri{" "}
|
||||||
|
{YOK_ISTATISTIK_DONEM}. Örgün öğrenci birinci ve ikinci öğretimdeki tüm
|
||||||
|
düzeyleri (ön lisans–doktora) kapsar, uzaktan ve açık öğretim dahil
|
||||||
|
değildir; öğretim üyesi profesör, doçent ve doktor öğretim üyesidir.
|
||||||
|
Kaynak:{" "}
|
||||||
|
<a
|
||||||
|
href={YOK_ISTATISTIK_KAYNAK_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
className="font-medium text-primary transition-colors hover:text-orange-500 hover:underline"
|
||||||
|
>
|
||||||
|
istatistik.yok.gov.tr
|
||||||
|
</a>
|
||||||
.
|
.
|
||||||
</p>
|
</p>
|
||||||
);
|
);
|
||||||
@@ -231,7 +519,7 @@ export function UniversiteIcerik({
|
|||||||
// özet paragrafının hemen altında, tablonun (ve ilk sayfadaki istatistik
|
// özet paragrafının hemen altında, tablonun (ve ilk sayfadaki istatistik
|
||||||
// ızgarasının) üstünde durur. Alttaki kart yerinde kalır.
|
// ızgarasının) üstünde durur. Alttaki kart yerinde kalır.
|
||||||
const ustSiraSatiri = (
|
const ustSiraSatiri = (
|
||||||
<div className="mt-6">
|
<div className="mt-8">
|
||||||
<CtaSiraForm varyant="kompakt" konum="ust" baslik={ctaBaslik} />
|
<CtaSiraForm varyant="kompakt" konum="ust" baslik={ctaBaslik} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -276,71 +564,88 @@ export function UniversiteIcerik({
|
|||||||
|
|
||||||
<nav
|
<nav
|
||||||
aria-label="breadcrumb"
|
aria-label="breadcrumb"
|
||||||
className="flex items-center gap-1 text-xs text-slate-500"
|
className="flex flex-wrap items-center justify-center gap-1.5 text-sm text-slate-500 lg:justify-start"
|
||||||
|
>
|
||||||
|
<Link
|
||||||
|
href="/"
|
||||||
|
className="transition-colors hover:text-orange-500 hover:underline"
|
||||||
>
|
>
|
||||||
<Link href="/" className="hover:text-primary hover:underline">
|
|
||||||
Ana Sayfa
|
Ana Sayfa
|
||||||
</Link>
|
</Link>
|
||||||
<ChevronRight className="size-3" aria-hidden />
|
<ChevronRight className="size-3.5 shrink-0" aria-hidden />
|
||||||
<Link
|
<Link
|
||||||
href="/universiteler"
|
href="/universiteler"
|
||||||
className="hover:text-primary hover:underline"
|
className="transition-colors hover:text-orange-500 hover:underline"
|
||||||
>
|
>
|
||||||
Üniversiteler
|
Üniversiteler
|
||||||
</Link>
|
</Link>
|
||||||
<ChevronRight className="size-3" aria-hidden />
|
<ChevronRight className="size-3.5 shrink-0" aria-hidden />
|
||||||
{ilkSayfa ? (
|
{ilkSayfa ? (
|
||||||
<span className="text-slate-700">{uni.ad}</span>
|
<span className="text-slate-700">{uni.ad}</span>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<Link
|
<Link
|
||||||
href={`/universite/${slug}`}
|
href={`/universite/${slug}`}
|
||||||
className="hover:text-primary hover:underline"
|
className="transition-colors hover:text-orange-500 hover:underline"
|
||||||
>
|
>
|
||||||
{uni.ad}
|
{uni.ad}
|
||||||
</Link>
|
</Link>
|
||||||
<ChevronRight className="size-3" aria-hidden />
|
<ChevronRight className="size-3.5 shrink-0" aria-hidden />
|
||||||
<span className="text-slate-700">Sayfa {sayfa}</span>
|
<span className="text-slate-700">Sayfa {sayfa}</span>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div className="mt-4 flex items-center gap-4">
|
{/* Başlık üst çubuğun altına girince üst çubukta logo + ad belirir */}
|
||||||
|
<NavBaslik
|
||||||
|
baslikId="uni-baslik"
|
||||||
|
ad={uni.ad}
|
||||||
|
logo={<UniLogo slug={slug} ad={uni.ad} boy="xs" />}
|
||||||
|
/>
|
||||||
|
{/* Geniş ekran (lg) altında başlık bloğu ortalı: logo başlığın
|
||||||
|
üstünde, yol satırı, çipler ve özet paragraf ortada. */}
|
||||||
|
<div className="mt-6 flex flex-col items-center gap-4 text-center lg:flex-row lg:text-left">
|
||||||
<UniLogo slug={slug} ad={uni.ad} boy="lg" />
|
<UniLogo slug={slug} ad={uni.ad} boy="lg" />
|
||||||
<h1 className="font-heading text-3xl font-bold text-slate-900 sm:text-4xl">
|
<h1
|
||||||
|
id="uni-baslik"
|
||||||
|
className="font-heading text-3xl font-bold leading-tight text-slate-900 sm:text-5xl"
|
||||||
|
>
|
||||||
{uni.ad} Taban Puanları {BASLIK_YILI}
|
{uni.ad} Taban Puanları {BASLIK_YILI}
|
||||||
{ilkSayfa ? "" : ` — Sayfa ${sayfa}`}
|
{ilkSayfa ? "" : ` — Sayfa ${sayfa}`}
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Kurumun kimliği (tür + il): ızgaradaki kartlar sayısal ve
|
{/* Kurumun kimliği (tür + il): ızgaradaki kartlar sayısal ve
|
||||||
karşılaştırılabilir metriklerdir, tür ise kategoridir — sitenin
|
karşılaştırılabilir metriklerdir, tür ise kategoridir — başlığın
|
||||||
geri kalanında da başlığın altında çip olarak duruyor. Çipin sınıf
|
altında iki iri hap olarak durur (navbar'daki hap butonların
|
||||||
seti program-tablosu.tsx:329-333'ten birebir kopyadır (AGENTS.md
|
ölçüsü: h-10, tam yuvarlak, ikon + tek kelime). Tür renkle değil
|
||||||
"ortak elemanlar tek kaynaktan"); yeni varyant üretilmez.
|
ikon + metinle ayrılır. Sayfalama sayfalarında da yazar:
|
||||||
Sayfalama sayfalarında da yazar: ziyaretçi Google'dan doğrudan
|
ziyaretçi Google'dan doğrudan /sayfa/N'ye inebiliyor. `unitur`
|
||||||
/sayfa/N'ye inebiliyor, kimlik orada da aynı. `unitur` NULL ise
|
NULL ise tür hapı düşer, kopuk boşluk kalmaz. */}
|
||||||
satırın tamamı düşer, kopuk boşluk kalmaz. */}
|
{turEtiketi || uni.il ? (
|
||||||
|
<p className="mt-5 flex flex-wrap items-center justify-center gap-2 lg:justify-start">
|
||||||
{turEtiketi ? (
|
{turEtiketi ? (
|
||||||
<p className="mt-3 flex min-w-0 items-center gap-1.5 text-xs text-slate-500">
|
<span className="inline-flex h-10 items-center gap-2 rounded-full border border-slate-200 bg-white px-4 text-sm font-semibold text-slate-800">
|
||||||
<span
|
{uniturDevletMi(uni.unitur) ? (
|
||||||
className={`shrink-0 rounded px-1 py-px text-[10px] font-medium leading-4 ${
|
<Landmark className="size-4 text-primary" aria-hidden />
|
||||||
uniturDevletMi(uni.unitur)
|
) : (
|
||||||
? "bg-slate-100 text-slate-600"
|
<Building2 className="size-4 text-primary" aria-hidden />
|
||||||
: "bg-violet-50 text-violet-600"
|
)}
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{turEtiketi.cip}
|
{turEtiketi.cip}
|
||||||
</span>
|
</span>
|
||||||
|
) : null}
|
||||||
{uni.il ? (
|
{uni.il ? (
|
||||||
|
<span className="inline-flex h-10 min-w-0 items-center gap-2 rounded-full border border-slate-200 bg-white px-4 text-sm font-semibold text-slate-800">
|
||||||
|
<MapPin className="size-4 shrink-0 text-primary" aria-hidden />
|
||||||
<span className="truncate">{trBaslikDuzeni(uni.il)}</span>
|
<span className="truncate">{trBaslikDuzeni(uni.il)}</span>
|
||||||
|
</span>
|
||||||
) : null}
|
) : null}
|
||||||
</p>
|
</p>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
{ilkSayfa ? (
|
{ilkSayfa ? (
|
||||||
<>
|
<>
|
||||||
<p className="mt-4 max-w-3xl text-sm leading-7 text-slate-600">
|
<p className="mx-auto mt-6 max-w-3xl text-center text-base leading-relaxed text-slate-600 sm:text-lg lg:mx-0 lg:text-left">
|
||||||
{uni.ad}
|
{uni.ad}
|
||||||
{uni.il ? ` (${trBaslikDuzeni(uni.il)})` : ""}
|
{uni.il ? ` (${trBaslikDuzeni(uni.il)})` : ""}
|
||||||
{turCumlesi ? `, ${turCumlesi};` : ","} {SON_YIL} YKS yerleştirme
|
{turCumlesi ? `, ${turCumlesi};` : ","} {SON_YIL} YKS yerleştirme
|
||||||
@@ -370,82 +675,68 @@ export function UniversiteIcerik({
|
|||||||
|
|
||||||
{ustSiraSatiri}
|
{ustSiraSatiri}
|
||||||
|
|
||||||
<div className="mt-6 grid grid-cols-2 gap-3 lg:grid-cols-[1fr_1fr_1.35fr] lg:grid-rows-2">
|
<div className="mt-8 grid grid-cols-2 gap-4 lg:grid-cols-[1fr_1fr_1.35fr] lg:grid-rows-2">
|
||||||
<UniversiteKonumHaritasi universite={uni.ad} il={uni.il} />
|
<UniversiteKonumHaritasi universite={uni.ad} il={uni.il} />
|
||||||
<dl className="contents">
|
|
||||||
<div className="rounded-xl border border-slate-200 bg-white p-4">
|
|
||||||
<dt className="text-xs font-medium uppercase tracking-wide text-slate-500">
|
|
||||||
Program
|
|
||||||
</dt>
|
|
||||||
<dd className="mt-1 font-heading text-2xl font-bold text-slate-900">
|
|
||||||
{sayi(uni.programSayisi)}
|
|
||||||
</dd>
|
|
||||||
</div>
|
|
||||||
<div className="rounded-xl border border-slate-200 bg-white p-4">
|
|
||||||
<dt className="text-xs font-medium uppercase tracking-wide text-slate-500">
|
|
||||||
Fakülte / Birim
|
|
||||||
</dt>
|
|
||||||
<dd className="mt-1 font-heading text-2xl font-bold text-slate-900">
|
|
||||||
{sayi(uni.fakulteSayisi)}
|
|
||||||
</dd>
|
|
||||||
</div>
|
|
||||||
{/* Şablon tam 4 hücre bırakıyor: masaüstünde harita 3. sütunu
|
{/* Şablon tam 4 hücre bırakıyor: masaüstünde harita 3. sütunu
|
||||||
iki satır boyunca kaplıyor (lg:grid-rows-2 + row-span-2), 5.
|
iki satır boyunca kaplıyor, 5. kart ızgarayı bozar. Fakülte
|
||||||
kart ızgarayı bozar. Bu yüzden 4. hücre tek: URAP'ta olan
|
sayısı Program kartının alt satırında; boşalan hücrede
|
||||||
üniversitede URAP sırası, olmayan 31 sayfada toplam
|
Türkiye sırası. Geri kalan akademik ayrıntı alttaki
|
||||||
kontenjan. Toplam kontenjanı 0 olan üniversite yok
|
"Akademik göstergeler ›" penceresinde. */}
|
||||||
(yokatlas.db: GROUP BY universite HAVING
|
<dl className="contents">
|
||||||
SUM(COALESCE(kontenjan2026,0))=0 → 0 satır), yani hiçbir
|
<OzetKart
|
||||||
sayfada "—" çıkmaz. URAP'ta payda kartın içindedir: "18."
|
ikon={LayoutList}
|
||||||
tek başına yanıltır. */}
|
etiket="Program"
|
||||||
<div className="rounded-xl border border-slate-200 bg-white p-4">
|
deger={sayi(uni.programSayisi)}
|
||||||
|
alt={`${sayi(uni.fakulteSayisi)} birimde`}
|
||||||
|
/>
|
||||||
|
<OzetKart
|
||||||
|
ikon={Users}
|
||||||
|
etiket="Kontenjan"
|
||||||
|
deger={sayi(uni.stats.toplamKontenjan)}
|
||||||
|
alt={`${SON_YIL} toplamı`}
|
||||||
|
/>
|
||||||
|
<OzetKart
|
||||||
|
ikon={Target}
|
||||||
|
etiket="En iyi sıralama"
|
||||||
|
deger={
|
||||||
|
uni.stats.minSira != null ? sayi(uni.stats.minSira) : "—"
|
||||||
|
}
|
||||||
|
alt={`${SON_YIL} taban sırası`}
|
||||||
|
/>
|
||||||
{uni.urap ? (
|
{uni.urap ? (
|
||||||
<>
|
<TurkiyeSirasiKarti sira={uni.urap.sira} />
|
||||||
<dt className="text-xs font-medium uppercase tracking-wide text-slate-500">
|
|
||||||
URAP Türkiye
|
|
||||||
</dt>
|
|
||||||
<dd className="mt-1 font-heading text-2xl font-bold text-slate-900">
|
|
||||||
{sayi(uni.urap.sira)} / {sayi(URAP_TOPLAM)}
|
|
||||||
<span className="mt-0.5 block font-sans text-xs font-medium text-slate-500">
|
|
||||||
{URAP_DONEM}
|
|
||||||
</span>
|
|
||||||
</dd>
|
|
||||||
</>
|
|
||||||
) : (
|
) : (
|
||||||
<>
|
<OzetKart
|
||||||
<dt className="text-xs font-medium uppercase tracking-wide text-slate-500">
|
ikon={Building2}
|
||||||
Toplam kontenjan
|
etiket="Fakülte / birim"
|
||||||
</dt>
|
deger={sayi(uni.fakulteSayisi)}
|
||||||
<dd className="mt-1 font-heading text-2xl font-bold text-slate-900">
|
alt="programların dağıldığı"
|
||||||
{sayi(uni.stats.toplamKontenjan)}
|
/>
|
||||||
</dd>
|
|
||||||
</>
|
|
||||||
)}
|
)}
|
||||||
</div>
|
|
||||||
<div className="rounded-xl border border-slate-200 bg-white p-4">
|
|
||||||
<dt className="text-xs font-medium uppercase tracking-wide text-slate-500">
|
|
||||||
En iyi sıralama
|
|
||||||
</dt>
|
|
||||||
<dd className="mt-1 font-heading text-2xl font-bold text-slate-900">
|
|
||||||
{uni.stats.minSira != null ? sayi(uni.stats.minSira) : "—"}
|
|
||||||
</dd>
|
|
||||||
</div>
|
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
|
{uni.urap || uni.istatistik ? (
|
||||||
|
<AkademikAyrinti
|
||||||
|
universite={uni.ad}
|
||||||
|
onizleme={akademikOnizleme(uni)}
|
||||||
|
>
|
||||||
|
<AkademikGostergeler uni={uni} />
|
||||||
|
</AkademikAyrinti>
|
||||||
|
) : null}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<p className="mt-4 max-w-3xl text-sm leading-7 text-slate-600">
|
<p className="mx-auto mt-6 max-w-3xl text-center text-base leading-relaxed text-slate-600 sm:text-lg lg:mx-0 lg:text-left">
|
||||||
{uni.ad} taban puanları tablosunun {sayfa}. sayfası (
|
{uni.ad} taban puanları tablosunun {sayfa}. sayfası (
|
||||||
{sayi(tumProgramlar.length)} programın{" "}
|
{sayi(tumProgramlar.length)} programın{" "}
|
||||||
{sayi((sayfa - 1) * SAYFA_BOYU + 1)}–
|
{sayi((sayfa - 1) * SAYFA_BOYU + 1)}–
|
||||||
{sayi(Math.min(sayfa * SAYFA_BOYU, tumProgramlar.length))}.
|
{sayi(Math.min(sayfa * SAYFA_BOYU, tumProgramlar.length))}.
|
||||||
satırları, fakülte sırasıyla).
|
satırları, fakülte sırasıyla).
|
||||||
{birimler ? ` Bu sayfadaki birimler: ${birimler}.` : ""} Üniversite
|
{birimler ? ` Bu sayfadaki birimler: ${birimler}.` : ""}{" "}
|
||||||
özeti ve istatistikler{" "}
|
Üniversite özeti ve istatistikler{" "}
|
||||||
<Link
|
<Link
|
||||||
href={`/universite/${slug}`}
|
href={`/universite/${slug}`}
|
||||||
className="font-medium text-primary hover:underline"
|
className="font-medium text-primary transition-colors hover:text-orange-500 hover:underline"
|
||||||
>
|
>
|
||||||
ilk sayfada
|
ilk sayfada
|
||||||
</Link>
|
</Link>
|
||||||
@@ -455,13 +746,13 @@ export function UniversiteIcerik({
|
|||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<PagePixelDivider seed={57} className="mt-8" />
|
<PagePixelDivider seed={57} className="mx-auto mt-12 lg:mx-0" />
|
||||||
|
|
||||||
<div id="programlar" className="mt-8">
|
<div id="programlar" className="mt-10 text-center lg:text-left">
|
||||||
<h2 className="font-heading text-xl font-bold text-slate-900">
|
<h2 className="font-heading text-2xl font-bold text-slate-900 sm:text-3xl">
|
||||||
Üniversite programları
|
Üniversite programları
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-1 text-xs text-slate-500">
|
<p className="mt-2 text-base text-slate-500">
|
||||||
Fakülte ve birimlere göre
|
Fakülte ve birimlere göre
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -474,6 +765,7 @@ export function UniversiteIcerik({
|
|||||||
</VeriKaynagi>
|
</VeriKaynagi>
|
||||||
|
|
||||||
{ilkSayfa ? <UrapKaynakSatiri uni={uni} /> : null}
|
{ilkSayfa ? <UrapKaynakSatiri uni={uni} /> : null}
|
||||||
|
{ilkSayfa ? <IstatistikKaynakSatiri uni={uni} /> : null}
|
||||||
|
|
||||||
<Sayfalama
|
<Sayfalama
|
||||||
tabanYol={`/universite/${slug}`}
|
tabanYol={`/universite/${slug}`}
|
||||||
@@ -497,21 +789,21 @@ export function UniversiteIcerik({
|
|||||||
export function UniversiteIcerikSkeleton() {
|
export function UniversiteIcerikSkeleton() {
|
||||||
return (
|
return (
|
||||||
<main className="mx-auto w-full max-w-5xl px-4 py-12 sm:py-16">
|
<main className="mx-auto w-full max-w-5xl px-4 py-12 sm:py-16">
|
||||||
<Skeleton className="h-4 w-64" />
|
<Skeleton className="h-5 w-64" />
|
||||||
<div className="mt-4 flex items-center gap-4">
|
<div className="mt-6 flex items-center gap-4">
|
||||||
<Skeleton className="size-14 rounded-lg" />
|
<Skeleton className="size-14 rounded-lg" />
|
||||||
<Skeleton className="h-10 w-2/3 max-w-xl" />
|
<Skeleton className="h-10 w-2/3 max-w-xl" />
|
||||||
</div>
|
</div>
|
||||||
<Skeleton className="mt-4 h-5 w-full max-w-3xl" />
|
<Skeleton className="mt-4 h-5 w-full max-w-3xl" />
|
||||||
<div className="mt-6 grid grid-cols-2 gap-3 lg:grid-cols-[1fr_1fr_1.35fr] lg:grid-rows-2">
|
<div className="mt-8 grid grid-cols-2 gap-4 lg:grid-cols-[1fr_1fr_1.35fr] lg:grid-rows-2">
|
||||||
{Array.from({ length: 5 }, (_, i) => (
|
{Array.from({ length: 5 }, (_, i) => (
|
||||||
<Skeleton key={i} className="h-24 w-full rounded-xl" />
|
<Skeleton key={i} className="h-28 w-full rounded-2xl" />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-16 space-y-3">
|
<div className="mt-16 space-y-3">
|
||||||
<Skeleton className="h-7 w-64" />
|
<Skeleton className="h-7 w-64" />
|
||||||
{Array.from({ length: 5 }, (_, i) => (
|
{Array.from({ length: 5 }, (_, i) => (
|
||||||
<Skeleton key={i} className="h-12 w-full" />
|
<Skeleton key={i} className="h-20 w-full rounded-2xl" />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export function UniversiteKonumHaritasi({
|
|||||||
return (
|
return (
|
||||||
<KonumBolumu universite={universite}>
|
<KonumBolumu universite={universite}>
|
||||||
<UlkeHaritasi universite={universite} konum={yurtdisi} />
|
<UlkeHaritasi universite={universite} konum={yurtdisi} />
|
||||||
<p className="pointer-events-none absolute bottom-0 left-0 text-[11px] font-medium text-slate-500">
|
<p className="pointer-events-none absolute bottom-0 left-0 text-xs font-medium text-slate-500">
|
||||||
{yurtdisi.ulkeAd}
|
{yurtdisi.ulkeAd}
|
||||||
{yurtdisi.sehir ? ` · ${yurtdisi.sehir}` : ""}
|
{yurtdisi.sehir ? ` · ${yurtdisi.sehir}` : ""}
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -36,29 +36,36 @@ export function UniversiteProgramTablosu({
|
|||||||
}: {
|
}: {
|
||||||
gruplar: { fakulte: string; programlar: UniProgramSatiri[] }[];
|
gruplar: { fakulte: string; programlar: UniProgramSatiri[] }[];
|
||||||
}) {
|
}) {
|
||||||
|
// Şişko ve sade: program adı kesilmez (sarar), sıra ve butonlar iri.
|
||||||
|
// 375 px'te yalnız ad + butonlar sütun olarak kalır; taban sıra adın
|
||||||
|
// altındaki satıra iner, böylece ad bütün genişliği kullanır.
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{gruplar.map(({ fakulte, programlar }, i) => (
|
{gruplar.map(({ fakulte, programlar }, i) => (
|
||||||
<section key={`${fakulte}-${i}`} className="mt-6">
|
<section key={`${fakulte}-${i}`} className="mt-10">
|
||||||
<h2 className="mb-3 font-heading text-xl font-bold text-slate-900">
|
<h2 className="mb-4 text-center font-heading text-xl font-bold text-slate-900 sm:text-2xl lg:text-left">
|
||||||
{fakulte}
|
{fakulte}
|
||||||
</h2>
|
</h2>
|
||||||
<div className="overflow-hidden rounded-2xl border border-slate-200 bg-white">
|
<div className="overflow-hidden rounded-2xl border border-slate-200 bg-white">
|
||||||
<Table>
|
<Table>
|
||||||
<TableHeader>
|
<TableHeader>
|
||||||
<TableRow>
|
<TableRow className="hover:bg-transparent">
|
||||||
<TableHead>Program</TableHead>
|
<TableHead className="h-12 pl-4 text-sm font-semibold text-slate-500 sm:pl-5">
|
||||||
<TableHead className="hidden text-right md:table-cell">
|
Program
|
||||||
|
</TableHead>
|
||||||
|
<TableHead className="hidden h-12 text-right text-sm font-semibold text-slate-500 lg:table-cell">
|
||||||
Son {VERI_YIL_SAYISI} yıl
|
Son {VERI_YIL_SAYISI} yıl
|
||||||
</TableHead>
|
</TableHead>
|
||||||
<TableHead className="hidden text-right lg:table-cell">
|
<TableHead className="hidden h-12 text-right text-sm font-semibold text-slate-500 lg:table-cell">
|
||||||
{SON_YIL} puan
|
{SON_YIL} puan
|
||||||
</TableHead>
|
</TableHead>
|
||||||
<TableHead className="hidden text-right sm:table-cell">
|
<TableHead className="hidden h-12 text-right text-sm font-semibold text-slate-500 md:table-cell">
|
||||||
Kontenjan
|
Kontenjan
|
||||||
</TableHead>
|
</TableHead>
|
||||||
<TableHead className="text-right">Taban sıra</TableHead>
|
<TableHead className="hidden h-12 text-right text-sm font-semibold text-slate-500 sm:table-cell">
|
||||||
<TableHead className="w-24 text-right">
|
Taban sıra
|
||||||
|
</TableHead>
|
||||||
|
<TableHead className="h-12 w-28 text-right">
|
||||||
<span className="sr-only">Netler ve listeye ekle</span>
|
<span className="sr-only">Netler ve listeye ekle</span>
|
||||||
</TableHead>
|
</TableHead>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
@@ -66,61 +73,64 @@ export function UniversiteProgramTablosu({
|
|||||||
<TableBody>
|
<TableBody>
|
||||||
{programlar.map((p) => {
|
{programlar.map((p) => {
|
||||||
const taban = programEtkinSira(p);
|
const taban = programEtkinSira(p);
|
||||||
|
const tabanMetni = taban != null ? `~${sayi(taban)}.` : "—";
|
||||||
return (
|
return (
|
||||||
<TableRow key={p.id} className="kt-cv-satir">
|
<TableRow key={p.id} className="kt-cv-satir">
|
||||||
<TableCell className="max-w-0 w-full">
|
<TableCell className="w-full whitespace-normal py-4 pl-4 sm:pl-5">
|
||||||
{p.bolumSlug ? (
|
{p.bolumSlug ? (
|
||||||
<Link
|
<Link
|
||||||
href={`/bolum/${p.bolumSlug}`}
|
href={`/bolum/${p.bolumSlug}`}
|
||||||
className="block truncate text-sm font-semibold text-slate-900 hover:text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
className="block text-base font-semibold leading-snug text-slate-900 transition-colors hover:text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
||||||
>
|
>
|
||||||
{p.isim.trim()}
|
{p.isim.trim()}
|
||||||
</Link>
|
</Link>
|
||||||
) : (
|
) : (
|
||||||
<span className="block truncate text-sm font-semibold">
|
<span className="block text-base font-semibold leading-snug text-slate-900">
|
||||||
{p.isim.trim()}
|
{p.isim.trim()}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
<span className="mt-0.5 flex items-center gap-1.5 text-xs text-slate-500">
|
<span className="mt-2 flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-slate-500">
|
||||||
<span className="shrink-0 rounded bg-slate-100 px-1 py-px text-[10px] font-medium leading-4 text-slate-600">
|
<span className="shrink-0 rounded-full bg-slate-100 px-2.5 py-0.5 text-xs font-semibold text-slate-700">
|
||||||
{TUR_ETIKET[p.tur] ?? p.tur}
|
{TUR_ETIKET[p.tur] ?? p.tur}
|
||||||
</span>
|
</span>
|
||||||
{p.sure ? (
|
{p.sure ? (
|
||||||
<span className="shrink-0">{p.sure} yıl</span>
|
<span className="shrink-0">{p.sure} yıl</span>
|
||||||
) : null}
|
) : null}
|
||||||
</span>
|
</span>
|
||||||
|
<span className="mt-1.5 flex items-center gap-1.5 text-sm text-slate-500 sm:hidden">
|
||||||
|
Taban sıra
|
||||||
|
<span className="font-semibold tabular-nums text-slate-900">
|
||||||
|
{tabanMetni}
|
||||||
|
</span>
|
||||||
|
<ProgramTabanTrendi program={p} />
|
||||||
|
</span>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell className="hidden text-right text-xs md:table-cell">
|
<TableCell className="hidden text-right text-sm lg:table-cell">
|
||||||
<ProgramSiraGecmisi program={p} />
|
<ProgramSiraGecmisi program={p} />
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell className="hidden text-right text-xs tabular-nums text-slate-500 lg:table-cell">
|
<TableCell className="hidden text-right text-sm tabular-nums text-slate-600 lg:table-cell">
|
||||||
{p.puanSon != null
|
{p.puanSon != null
|
||||||
? p.puanSon.toFixed(2).replace(".", ",")
|
? p.puanSon.toFixed(2).replace(".", ",")
|
||||||
: "—"}
|
: "—"}
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell className="hidden text-right text-xs tabular-nums text-slate-500 sm:table-cell">
|
<TableCell className="hidden text-right text-sm tabular-nums text-slate-600 md:table-cell">
|
||||||
{p.kontenjanSon != null
|
{p.kontenjanSon != null
|
||||||
? `${sayi(p.kontenjanSon)} kişi`
|
? `${sayi(p.kontenjanSon)} kişi`
|
||||||
: "—"}
|
: "—"}
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell className="text-right text-xs tabular-nums text-slate-500">
|
<TableCell className="hidden text-right text-base font-semibold tabular-nums text-slate-900 sm:table-cell">
|
||||||
<span className="inline-flex items-center gap-1">
|
<span className="inline-flex items-center gap-1.5">
|
||||||
<ProgramTabanTrendi program={p} />
|
<ProgramTabanTrendi program={p} />
|
||||||
{taban != null ? `~${sayi(taban)}.` : "—"}
|
{tabanMetni}
|
||||||
</span>
|
</span>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell className="pr-3 text-right">
|
<TableCell className="py-4 pr-4 text-right sm:pr-5">
|
||||||
<span className="inline-flex items-center gap-1.5">
|
<span className="inline-flex items-center gap-2">
|
||||||
<ProgramNetleriButonu
|
<ProgramNetleriButonu
|
||||||
programId={p.id}
|
programId={p.id}
|
||||||
isim={p.isim.trim()}
|
isim={p.isim.trim()}
|
||||||
className="size-8 min-h-8 min-w-8"
|
|
||||||
/>
|
|
||||||
<ProgramEkleButonu
|
|
||||||
program={p}
|
|
||||||
kaynak="universite"
|
|
||||||
className="size-8 min-h-8 min-w-8"
|
|
||||||
/>
|
/>
|
||||||
|
<ProgramEkleButonu program={p} kaynak="universite" />
|
||||||
</span>
|
</span>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
|
|||||||
28
src/features/katalog/components/urap-logo.tsx
Normal file
28
src/features/katalog/components/urap-logo.tsx
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import Image from "next/image";
|
||||||
|
import { URAP_KAYNAK_URL } from "@/lib/urap-siralama";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URAP logosu, urapcenter.org'a aktif bağlantı olarak. Atıf şartı gereği
|
||||||
|
* gerçek <a href>, yeni sekme, rel="noopener", nofollow YOK. Logo resmî
|
||||||
|
* PNG'den (urapcenter.org/img/urap-logo/logo.png) vektörleştirildi —
|
||||||
|
* `public/urap-logo.svg`, oran 819×261.
|
||||||
|
*/
|
||||||
|
export function UrapLogo({ className = "h-8" }: { className?: string }) {
|
||||||
|
return (
|
||||||
|
<a
|
||||||
|
href={URAP_KAYNAK_URL}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener"
|
||||||
|
className="relative z-10 inline-block shrink-0 opacity-90 transition-opacity hover:opacity-100"
|
||||||
|
>
|
||||||
|
<Image
|
||||||
|
src="/urap-logo.svg"
|
||||||
|
alt="URAP — University Ranking by Academic Performance"
|
||||||
|
width={819}
|
||||||
|
height={261}
|
||||||
|
unoptimized
|
||||||
|
className={`w-auto ${className}`}
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -422,10 +422,13 @@ function CekmeceSatiri({
|
|||||||
</span>
|
</span>
|
||||||
) : null}
|
) : null}
|
||||||
{tercih.risk ? (
|
{tercih.risk ? (
|
||||||
|
<span className="inline-flex shrink-0 items-center gap-1.5 text-xs font-medium">
|
||||||
<span
|
<span
|
||||||
className={`size-2.5 shrink-0 rounded-full ${RISK_NOKTA[tercih.risk]}`}
|
className={`size-2.5 shrink-0 rounded-full ${RISK_NOKTA[tercih.risk]}`}
|
||||||
aria-label={RISK_ETIKET[tercih.risk]}
|
aria-hidden
|
||||||
/>
|
/>
|
||||||
|
{RISK_ETIKET[tercih.risk]}
|
||||||
|
</span>
|
||||||
) : null}
|
) : null}
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
|
|||||||
@@ -120,11 +120,11 @@ export function TadimlikSatiri({
|
|||||||
const girisUrl = `/giris?callback=${encodeURIComponent(listemUretHref("tadimlik"))}`;
|
const girisUrl = `/giris?callback=${encodeURIComponent(listemUretHref("tadimlik"))}`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
// first:mt-0 — /sonuc'ta harita bu <section>'ın ÜSTÜNDE durur ama yalnızca
|
// first:mt-0 — kayıtlı listesi olan ziyaretçide /sonuc tadımlığı haritanın
|
||||||
// kayıtlı listesi olan ziyaretçide DOM'a girer (manuel-harita.tsx). Liste
|
// ve tablonun ALTINA koyar (sonuc/page.tsx), orada bölüm ritmini veren
|
||||||
// yoksa tadımlık main'in ilk DOM çocuğudur (JSX yorumları düğüm üretmez) ve
|
// mt-16'yı alır. Liste yoksa tadımlık main'in ilk DOM çocuğudur (JSX
|
||||||
// main'in py-12'si tek başına yeterli üst boşluğu verir; harita varsa
|
// yorumları düğüm üretmez) ve main'in py-12'si tek başına yeterli üst
|
||||||
// tadımlık ikinci çocuk olur ve bölüm ritmini veren mt-16'yı alır.
|
// boşluğu verir.
|
||||||
// Tadımlığın render edilmediği durumlarda (girişli kullanıcı, boş havuz)
|
// 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.
|
// bu bileşen hiç dönmediği için kural ilk gerçek bölüme geçer.
|
||||||
<section ref={gorunumRef} className="mt-16 min-w-0 first:mt-0">
|
<section ref={gorunumRef} className="mt-16 min-w-0 first:mt-0">
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import {
|
|||||||
DrawerDescription,
|
DrawerDescription,
|
||||||
DrawerTitle,
|
DrawerTitle,
|
||||||
} from "@/components/ui/drawer";
|
} from "@/components/ui/drawer";
|
||||||
import { SectionEyebrow } from "@/components/pixel-decor";
|
import { PagePixelDivider, SectionEyebrow } from "@/components/pixel-decor";
|
||||||
import { useGorunumOlayi } from "@/components/use-gorunum-olayi";
|
import { useGorunumOlayi } from "@/components/use-gorunum-olayi";
|
||||||
import {
|
import {
|
||||||
SihirbazAdimlarLazy,
|
SihirbazAdimlarLazy,
|
||||||
@@ -51,6 +51,31 @@ const KANITLAR = [
|
|||||||
{ ikon: Database, etiket: "YÖK Atlas verisi" },
|
{ ikon: Database, etiket: "YÖK Atlas verisi" },
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
|
// Kayıtlı profilli CTA'lar /listem boş durumunun dilini taşır (bkz.
|
||||||
|
// listem-bos-cta.tsx): büyük turuncu buton, piksel ayraç. Sınıf seti tek yerde.
|
||||||
|
const PROFILLI_CTA_SINIF =
|
||||||
|
"h-12 cursor-pointer bg-orange-500 px-6 text-white transition-colors duration-200 hover:bg-orange-600";
|
||||||
|
|
||||||
|
function turEtiketi(tur: string) {
|
||||||
|
return PUAN_TURLERI_SECENEK.find((t) => t.deger === tur)?.etiket ?? tur.toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** "Sayısal · 100.000. sıra" — kayıtlı profilin kısa özeti. */
|
||||||
|
function KayitliSira({ sira, tur }: { sira: number; tur: string }) {
|
||||||
|
return (
|
||||||
|
<span className="inline-flex items-center gap-1.5 text-sm text-slate-600">
|
||||||
|
<Trophy className="size-4 shrink-0 text-primary" aria-hidden />
|
||||||
|
<span>
|
||||||
|
Sıralaman kayıtlı:{" "}
|
||||||
|
<strong className="font-semibold tabular-nums text-slate-900">
|
||||||
|
{sira.toLocaleString("tr-TR")}.
|
||||||
|
</strong>{" "}
|
||||||
|
sıra · {turEtiketi(tur)}
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Programatik SEO sayfalarındaki funnel girişi. Statik/SSR çıktı her zaman
|
* Programatik SEO sayfalarındaki funnel girişi. Statik/SSR çıktı her zaman
|
||||||
* profilsiz hâldir (sayfalar prerender edilmeye devam eder); hydration
|
* profilsiz hâldir (sayfalar prerender edilmeye devam eder); hydration
|
||||||
@@ -344,42 +369,53 @@ export function CtaSiraForm({
|
|||||||
if (kompakt) {
|
if (kompakt) {
|
||||||
// CLS: kayıtlı profil hydration SONRASI bulunur. Satır tablonun üstünde
|
// CLS: kayıtlı profil hydration SONRASI bulunur. Satır tablonun üstünde
|
||||||
// olduğundan yüksekliği o anda değişmemeli — form yerinde (görünmez ve
|
// olduğundan yüksekliği o anda değişmemeli — form yerinde (görünmez ve
|
||||||
// inert) kalır, profilli kısayol aynı ızgara hücresine bindirilir; hücrenin
|
// inert) kalır, profilli kısayol (başlığıyla birlikte) aynı ızgara hücresine
|
||||||
// yüksekliğini her iki durumda da form belirler.
|
// bindirilir; hücrenin yüksekliğini her iki durumda da başlık + form belirler.
|
||||||
|
// Profilli içerik bu yüksekliği aşmayacak kadar kısa tutulmalı.
|
||||||
|
const kompaktBaslik = baslik ?? "Sıralaman bu tabanların neresinde?";
|
||||||
return (
|
return (
|
||||||
<section
|
<section
|
||||||
aria-labelledby={baslikId}
|
aria-labelledby={baslikId}
|
||||||
className="rounded-2xl border border-slate-200 bg-white p-4 sm:p-5"
|
className={cn(
|
||||||
|
"rounded-2xl border p-4 transition-colors duration-200 sm:p-5",
|
||||||
|
profil ? "border-primary/20 bg-primary/5" : "border-slate-200 bg-white",
|
||||||
|
)}
|
||||||
>
|
>
|
||||||
<p className="text-sm leading-6 text-slate-600">
|
<div className="grid">
|
||||||
<strong
|
|
||||||
id={baslikId}
|
|
||||||
className="font-heading text-base font-bold text-slate-900"
|
|
||||||
>
|
|
||||||
{baslik ?? "Sıralaman bu tabanların neresinde?"}
|
|
||||||
</strong>{" "}
|
|
||||||
Ücretsiz, üyelik gerekmez.
|
|
||||||
</p>
|
|
||||||
<div className="mt-3 grid">
|
|
||||||
<div
|
<div
|
||||||
ref={profil ? undefined : formRef}
|
ref={profil ? undefined : formRef}
|
||||||
inert={profil ? true : undefined}
|
inert={profil ? true : undefined}
|
||||||
className={cn("col-start-1 row-start-1", profil && "invisible")}
|
className={cn("col-start-1 row-start-1", profil && "invisible")}
|
||||||
>
|
>
|
||||||
{siraFormu}
|
<p className="text-sm leading-6 text-slate-600">
|
||||||
|
<strong
|
||||||
|
id={profil ? undefined : baslikId}
|
||||||
|
className="font-heading text-base font-bold text-slate-900"
|
||||||
|
>
|
||||||
|
{kompaktBaslik}
|
||||||
|
</strong>{" "}
|
||||||
|
Ücretsiz, üyelik gerekmez.
|
||||||
|
</p>
|
||||||
|
<div className="mt-3">{siraFormu}</div>
|
||||||
</div>
|
</div>
|
||||||
{profil ? (
|
{profil ? (
|
||||||
<div className="col-start-1 row-start-1 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
|
<div className="col-start-1 row-start-1 flex flex-col items-center justify-center gap-3 text-center sm:flex-row sm:justify-between sm:gap-6 sm:text-left">
|
||||||
<p className="text-sm leading-6 text-slate-600">
|
<div className="flex min-w-0 flex-col items-center gap-1 sm:items-start">
|
||||||
Sıralaman kayıtlı ({profil.sira.toLocaleString("tr-TR")}. sıra).
|
<p
|
||||||
</p>
|
id={baslikId}
|
||||||
<Link
|
className="font-heading text-base font-bold leading-6 text-slate-900"
|
||||||
href={sonucHref()}
|
|
||||||
className="inline-flex h-11 items-center justify-center gap-2 rounded-full bg-orange-500 px-6 text-sm font-semibold text-white transition-colors duration-200 hover:bg-orange-600"
|
|
||||||
>
|
>
|
||||||
|
{kompaktBaslik}
|
||||||
|
</p>
|
||||||
|
<KayitliSira sira={profil.sira} tur={profil.tur} />
|
||||||
|
</div>
|
||||||
|
<PagePixelDivider seed={67} className="w-24 sm:hidden" />
|
||||||
|
<Button asChild size="lg" className={cn(PROFILLI_CTA_SINIF, "w-full sm:w-auto")}>
|
||||||
|
<Link href={sonucHref()}>
|
||||||
Sıralamana uygun programları gör
|
Sıralamana uygun programları gör
|
||||||
<ArrowRight className="size-4" aria-hidden />
|
<ArrowRight className="size-4" aria-hidden />
|
||||||
</Link>
|
</Link>
|
||||||
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
@@ -390,22 +426,24 @@ export function CtaSiraForm({
|
|||||||
|
|
||||||
if (profil) {
|
if (profil) {
|
||||||
return (
|
return (
|
||||||
<section className="rounded-2xl border border-primary/20 bg-primary/5 p-6 sm:p-8">
|
<section className="flex flex-col items-center rounded-2xl border border-primary/20 bg-primary/5 px-6 py-8 text-center sm:px-10 sm:py-10">
|
||||||
<h2 className="font-heading text-xl font-bold text-slate-900">
|
<h2 className="font-heading text-xl font-bold text-balance text-slate-900 sm:text-2xl">
|
||||||
{baslik ?? "Sıralamana yakın programlar hangileri? Saniyede gör."}
|
{baslik ?? "Sıralamana yakın programlar hangileri? Saniyede gör."}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-2 text-sm leading-6 text-slate-600">
|
<div className="mt-3">
|
||||||
Sıralaman kayıtlı ({profil.sira.toLocaleString("tr-TR")}. sıra) —
|
<KayitliSira sira={profil.sira} tur={profil.tur} />
|
||||||
gerçek YÖK Atlas verisiyle hayal, dengeli ve güvenli dilimlerindeki
|
</div>
|
||||||
|
<p className="mt-2 max-w-xl text-sm leading-6 text-slate-600">
|
||||||
|
Gerçek YÖK Atlas verisiyle hayal, dengeli ve güvenli dilimlerindeki
|
||||||
programların hazır.
|
programların hazır.
|
||||||
</p>
|
</p>
|
||||||
<Link
|
<PagePixelDivider seed={67} className="mt-6" />
|
||||||
href={sonucHref()}
|
<Button asChild size="lg" className={cn(PROFILLI_CTA_SINIF, "mt-6")}>
|
||||||
className="mt-4 inline-flex h-12 items-center justify-center gap-2 rounded-full bg-orange-500 px-7 text-sm font-semibold text-white transition-colors duration-200 hover:bg-orange-600"
|
<Link href={sonucHref()}>
|
||||||
>
|
|
||||||
Sıralamana uygun programları gör
|
Sıralamana uygun programları gör
|
||||||
<ArrowRight className="size-4" aria-hidden />
|
<ArrowRight className="size-4" aria-hidden />
|
||||||
</Link>
|
</Link>
|
||||||
|
</Button>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { kategoriBul, type Kategori } from "./kategoriler";
|
|||||||
import { uniAdiNormalize } from "./harita";
|
import { uniAdiNormalize } from "./harita";
|
||||||
import { bolumBazAdi, turkishSlugify, trBaslikDuzeni } from "./slug";
|
import { bolumBazAdi, turkishSlugify, trBaslikDuzeni } from "./slug";
|
||||||
import { urapSirasiBul, type UrapSira } from "./urap-siralama";
|
import { urapSirasiBul, type UrapSira } from "./urap-siralama";
|
||||||
|
import { uniIstatistikBul, type UniIstatistik } from "./yok-istatistik";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Programatik SEO sayfalarının veri katmanı (/bolum, /universite, hub'lar).
|
* Programatik SEO sayfalarının veri katmanı (/bolum, /universite, hub'lar).
|
||||||
@@ -230,6 +231,8 @@ export type UniDetay = UniOzet & {
|
|||||||
* Gösterildiği her yüzeyde URAP_KAYNAK_URL'ye aktif atıf zorunludur.
|
* Gösterildiği her yüzeyde URAP_KAYNAK_URL'ye aktif atıf zorunludur.
|
||||||
*/
|
*/
|
||||||
urap: UrapSira | null;
|
urap: UrapSira | null;
|
||||||
|
/** YÖK İstatistik örgün öğrenci / öğretim üyesi sayısı; KKTC ve yurt dışında null. */
|
||||||
|
istatistik: UniIstatistik | null;
|
||||||
fakulteler: { fakulte: string; programlar: Program[] }[];
|
fakulteler: { fakulte: string; programlar: Program[] }[];
|
||||||
stats: {
|
stats: {
|
||||||
minSira: number | null;
|
minSira: number | null;
|
||||||
@@ -400,6 +403,7 @@ export function getUniversiteBySlug(slug: string): UniDetay | null {
|
|||||||
return {
|
return {
|
||||||
...ozet,
|
...ozet,
|
||||||
urap: urapSirasiBul(slug),
|
urap: urapSirasiBul(slug),
|
||||||
|
istatistik: uniIstatistikBul(slug),
|
||||||
fakulteler: [...gruplar.entries()]
|
fakulteler: [...gruplar.entries()]
|
||||||
.map(([fakulte, programlar]) => ({ fakulte, programlar }))
|
.map(([fakulte, programlar]) => ({ fakulte, programlar }))
|
||||||
.sort((a, b) => a.fakulte.localeCompare(b.fakulte, "tr-TR")),
|
.sort((a, b) => a.fakulte.localeCompare(b.fakulte, "tr-TR")),
|
||||||
|
|||||||
242
src/lib/yok-istatistik.ts
Normal file
242
src/lib/yok-istatistik.ts
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
// YÖK İstatistik 2025-2026: üniversite başına örgün öğrenci ve öğretim üyesi sayısı.
|
||||||
|
//
|
||||||
|
// ÜRETİLMİŞ DOSYA — elle düzenleme. Kaynak Excel'ler data/kaynak/ altında;
|
||||||
|
// yeniden üretmek için: python3 scripts/yok-istatistik-uret.py 2025-2026
|
||||||
|
//
|
||||||
|
// Öğrenci = örgün (birinci + ikinci öğretim), tüm düzeyler; uzaktan ve açık
|
||||||
|
// öğretim dahil değil. Öğretim üyesi = Prof. + Doç. + Dr. Öğr. Üyesi.
|
||||||
|
// Anahtar: /universite/[slug] sayfa slug'ı. Burada olmayan üniversitenin
|
||||||
|
// YÖK İstatistik satırı yok (KKTC/yurt dışı ya da öğrencisi/üyesi 0).
|
||||||
|
|
||||||
|
export const YOK_ISTATISTIK_DONEM = "2025-2026";
|
||||||
|
|
||||||
|
export const YOK_ISTATISTIK_KAYNAK_URL = "https://istatistik.yok.gov.tr/";
|
||||||
|
|
||||||
|
/** Sayfası olan üniversitelerde öğretim üyesi başına öğrencinin medyanı — kıyas çizgisi. */
|
||||||
|
export const OGRENCI_BASINA_UYE_MEDYAN = 35;
|
||||||
|
|
||||||
|
export type UniIstatistik = {
|
||||||
|
/** Örgün öğrenci (ön lisans + lisans + yüksek lisans + doktora) */
|
||||||
|
ogrenci: number;
|
||||||
|
/** Profesör + doçent + doktor öğretim üyesi */
|
||||||
|
ogretimUyesi: number;
|
||||||
|
/** Tüm akademik personel (öğretim görevlisi ve araştırma görevlisi dahil) */
|
||||||
|
akademisyen: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const YOK_ISTATISTIK: Record<string, UniIstatistik> = {
|
||||||
|
"abdullah-gul-universitesi": { ogrenci: 3936, ogretimUyesi: 107, akademisyen: 300 },
|
||||||
|
"acibadem-mehmet-ali-aydinlar-universitesi": { ogrenci: 6279, ogretimUyesi: 375, akademisyen: 646 },
|
||||||
|
"adana-alparslan-turkes-bilim-ve-teknoloji-universitesi": { ogrenci: 6220, ogretimUyesi: 236, akademisyen: 446 },
|
||||||
|
"adiyaman-universitesi": { ogrenci: 16659, ogretimUyesi: 548, akademisyen: 862 },
|
||||||
|
"afyon-kocatepe-universitesi": { ogrenci: 29711, ogretimUyesi: 699, akademisyen: 1109 },
|
||||||
|
"afyonkarahisar-saglik-bilimleri-universitesi": { ogrenci: 7072, ogretimUyesi: 325, akademisyen: 620 },
|
||||||
|
"agri-ibrahim-cecen-universitesi": { ogrenci: 15239, ogretimUyesi: 390, akademisyen: 574 },
|
||||||
|
"akdeniz-universitesi": { ogrenci: 55992, ogretimUyesi: 1339, akademisyen: 2658 },
|
||||||
|
"aksaray-universitesi": { ogrenci: 18151, ogretimUyesi: 626, akademisyen: 963 },
|
||||||
|
"alanya-alaaddin-keykubat-universitesi": { ogrenci: 15322, ogretimUyesi: 410, akademisyen: 696 },
|
||||||
|
"alanya-universitesi": { ogrenci: 1207, ogretimUyesi: 51, akademisyen: 100 },
|
||||||
|
"altinbas-universitesi": { ogrenci: 12055, ogretimUyesi: 227, akademisyen: 334 },
|
||||||
|
"amasya-universitesi": { ogrenci: 16656, ogretimUyesi: 543, akademisyen: 748 },
|
||||||
|
"anadolu-universitesi": { ogrenci: 25934, ogretimUyesi: 900, akademisyen: 1470 },
|
||||||
|
"ankara-bilim-universitesi": { ogrenci: 3626, ogretimUyesi: 72, akademisyen: 134 },
|
||||||
|
"ankara-haci-bayram-veli-universitesi": { ogrenci: 27559, ogretimUyesi: 867, akademisyen: 1221 },
|
||||||
|
"ankara-medipol-universitesi": { ogrenci: 14035, ogretimUyesi: 270, akademisyen: 458 },
|
||||||
|
"ankara-muzik-ve-guzel-sanatlar-universitesi": { ogrenci: 1457, ogretimUyesi: 86, akademisyen: 136 },
|
||||||
|
"ankara-sosyal-bilimler-universitesi": { ogrenci: 5879, ogretimUyesi: 274, akademisyen: 477 },
|
||||||
|
"ankara-universitesi": { ogrenci: 56128, ogretimUyesi: 2225, akademisyen: 3702 },
|
||||||
|
"ankara-yildirim-beyazit-universitesi": { ogrenci: 26177, ogretimUyesi: 1019, akademisyen: 1568 },
|
||||||
|
"antalya-belek-universitesi": { ogrenci: 2553, ogretimUyesi: 44, akademisyen: 94 },
|
||||||
|
"antalya-bilim-universitesi": { ogrenci: 8597, ogretimUyesi: 180, akademisyen: 315 },
|
||||||
|
"ardahan-universitesi": { ogrenci: 7355, ogretimUyesi: 236, akademisyen: 380 },
|
||||||
|
"artvin-coruh-universitesi": { ogrenci: 12358, ogretimUyesi: 332, akademisyen: 566 },
|
||||||
|
"atasehir-adiguzel-meslek-yuksekokulu": { ogrenci: 1476, ogretimUyesi: 2, akademisyen: 32 },
|
||||||
|
"ataturk-universitesi": { ogrenci: 58279, ogretimUyesi: 1800, akademisyen: 2758 },
|
||||||
|
"atilim-universitesi": { ogrenci: 9885, ogretimUyesi: 331, akademisyen: 594 },
|
||||||
|
"avrasya-universitesi": { ogrenci: 7495, ogretimUyesi: 119, akademisyen: 238 },
|
||||||
|
"aydin-adnan-menderes-universitesi": { ogrenci: 43686, ogretimUyesi: 1232, akademisyen: 1924 },
|
||||||
|
"bahcesehir-universitesi": { ogrenci: 21181, ogretimUyesi: 560, akademisyen: 838 },
|
||||||
|
"balikesir-universitesi": { ogrenci: 28673, ogretimUyesi: 890, akademisyen: 1313 },
|
||||||
|
"bandirma-onyedi-eylul-universitesi": { ogrenci: 18949, ogretimUyesi: 456, akademisyen: 653 },
|
||||||
|
"bartin-universitesi": { ogrenci: 15615, ogretimUyesi: 452, akademisyen: 723 },
|
||||||
|
"baskent-universitesi": { ogrenci: 17784, ogretimUyesi: 976, akademisyen: 1920 },
|
||||||
|
"batman-universitesi": { ogrenci: 14701, ogretimUyesi: 360, akademisyen: 584 },
|
||||||
|
"bayburt-universitesi": { ogrenci: 13883, ogretimUyesi: 314, akademisyen: 499 },
|
||||||
|
"beykoz-universitesi": { ogrenci: 5251, ogretimUyesi: 94, akademisyen: 154 },
|
||||||
|
"bezm-i-alem-vakif-universitesi": { ogrenci: 4076, ogretimUyesi: 231, akademisyen: 605 },
|
||||||
|
"bilecik-seyh-edebali-universitesi": { ogrenci: 19612, ogretimUyesi: 495, akademisyen: 824 },
|
||||||
|
"bingol-universitesi": { ogrenci: 18558, ogretimUyesi: 494, akademisyen: 744 },
|
||||||
|
"biruni-universitesi": { ogrenci: 15154, ogretimUyesi: 347, akademisyen: 449 },
|
||||||
|
"bitlis-eren-universitesi": { ogrenci: 14635, ogretimUyesi: 342, akademisyen: 549 },
|
||||||
|
"bogazici-universitesi": { ogrenci: 13839, ogretimUyesi: 503, akademisyen: 1031 },
|
||||||
|
"bolu-abant-izzet-baysal-universitesi": { ogrenci: 30443, ogretimUyesi: 965, akademisyen: 1491 },
|
||||||
|
"burdur-mehmet-akif-ersoy-universitesi": { ogrenci: 34361, ogretimUyesi: 799, akademisyen: 1209 },
|
||||||
|
"bursa-teknik-universitesi": { ogrenci: 12346, ogretimUyesi: 350, akademisyen: 601 },
|
||||||
|
"bursa-uludag-universitesi": { ogrenci: 58341, ogretimUyesi: 1368, akademisyen: 2331 },
|
||||||
|
"cag-universitesi": { ogrenci: 3667, ogretimUyesi: 63, akademisyen: 127 },
|
||||||
|
"canakkale-onsekiz-mart-universitesi": { ogrenci: 42341, ogretimUyesi: 1254, akademisyen: 2058 },
|
||||||
|
"cankaya-universitesi": { ogrenci: 6401, ogretimUyesi: 148, akademisyen: 260 },
|
||||||
|
"cankiri-karatekin-universitesi": { ogrenci: 17291, ogretimUyesi: 488, akademisyen: 740 },
|
||||||
|
"cukurova-universitesi": { ogrenci: 44430, ogretimUyesi: 1187, akademisyen: 2116 },
|
||||||
|
"demiroglu-bilim-universitesi": { ogrenci: 2633, ogretimUyesi: 179, akademisyen: 231 },
|
||||||
|
"dicle-universitesi": { ogrenci: 42368, ogretimUyesi: 1011, akademisyen: 1641 },
|
||||||
|
"dogus-universitesi": { ogrenci: 18442, ogretimUyesi: 217, akademisyen: 459 },
|
||||||
|
"dokuz-eylul-universitesi": { ogrenci: 56833, ogretimUyesi: 1849, akademisyen: 2951 },
|
||||||
|
"duzce-universitesi": { ogrenci: 28561, ogretimUyesi: 765, akademisyen: 1230 },
|
||||||
|
"ege-universitesi": { ogrenci: 49852, ogretimUyesi: 1744, akademisyen: 2983 },
|
||||||
|
"erciyes-universitesi": { ogrenci: 42735, ogretimUyesi: 1237, akademisyen: 2195 },
|
||||||
|
"erzincan-binali-yildirim-universitesi": { ogrenci: 23617, ogretimUyesi: 764, akademisyen: 1070 },
|
||||||
|
"erzurum-teknik-universitesi": { ogrenci: 5876, ogretimUyesi: 268, akademisyen: 389 },
|
||||||
|
"eskisehir-osmangazi-universitesi": { ogrenci: 26667, ogretimUyesi: 1043, akademisyen: 1695 },
|
||||||
|
"eskisehir-teknik-universitesi": { ogrenci: 13840, ogretimUyesi: 467, akademisyen: 735 },
|
||||||
|
"fatih-sultan-mehmet-vakif-universitesi": { ogrenci: 7676, ogretimUyesi: 169, akademisyen: 328 },
|
||||||
|
"fenerbahce-universitesi": { ogrenci: 9741, ogretimUyesi: 195, akademisyen: 311 },
|
||||||
|
"firat-universitesi": { ogrenci: 39181, ogretimUyesi: 1167, akademisyen: 1924 },
|
||||||
|
"galatasaray-universitesi": { ogrenci: 4398, ogretimUyesi: 162, akademisyen: 310 },
|
||||||
|
"gazi-universitesi": { ogrenci: 38023, ogretimUyesi: 1877, akademisyen: 3115 },
|
||||||
|
"gaziantep-islam-bilim-ve-teknoloji-universitesi": { ogrenci: 5934, ogretimUyesi: 167, akademisyen: 248 },
|
||||||
|
"gaziantep-universitesi": { ogrenci: 45986, ogretimUyesi: 906, akademisyen: 1689 },
|
||||||
|
"gebze-teknik-universitesi": { ogrenci: 10152, ogretimUyesi: 354, akademisyen: 820 },
|
||||||
|
"giresun-universitesi": { ogrenci: 24556, ogretimUyesi: 820, akademisyen: 1165 },
|
||||||
|
"gumushane-universitesi": { ogrenci: 19558, ogretimUyesi: 425, akademisyen: 664 },
|
||||||
|
"hacettepe-universitesi": { ogrenci: 45592, ogretimUyesi: 2015, akademisyen: 3536 },
|
||||||
|
"hakkari-universitesi": { ogrenci: 5255, ogretimUyesi: 216, akademisyen: 332 },
|
||||||
|
"halic-universitesi": { ogrenci: 15757, ogretimUyesi: 256, akademisyen: 470 },
|
||||||
|
"harran-universitesi": { ogrenci: 28476, ogretimUyesi: 740, akademisyen: 1249 },
|
||||||
|
"hasan-kalyoncu-universitesi": { ogrenci: 7697, ogretimUyesi: 206, akademisyen: 311 },
|
||||||
|
"hatay-mustafa-kemal-universitesi": { ogrenci: 18471, ogretimUyesi: 685, akademisyen: 1146 },
|
||||||
|
"hitit-universitesi": { ogrenci: 18433, ogretimUyesi: 492, akademisyen: 821 },
|
||||||
|
"ibn-haldun-universitesi": { ogrenci: 1877, ogretimUyesi: 110, akademisyen: 171 },
|
||||||
|
"igdir-universitesi": { ogrenci: 13947, ogretimUyesi: 314, akademisyen: 491 },
|
||||||
|
"ihsan-dogramaci-bilkent-universitesi": { ogrenci: 12244, ogretimUyesi: 367, akademisyen: 707 },
|
||||||
|
"inonu-universitesi": { ogrenci: 30854, ogretimUyesi: 948, akademisyen: 1584 },
|
||||||
|
"isik-universitesi": { ogrenci: 5999, ogretimUyesi: 108, akademisyen: 189 },
|
||||||
|
"iskenderun-teknik-universitesi": { ogrenci: 13168, ogretimUyesi: 263, akademisyen: 388 },
|
||||||
|
"isparta-uygulamali-bilimler-universitesi": { ogrenci: 22373, ogretimUyesi: 415, akademisyen: 739 },
|
||||||
|
"istanbul-29-mayis-universitesi": { ogrenci: 5492, ogretimUyesi: 129, akademisyen: 187 },
|
||||||
|
"istanbul-arel-universitesi": { ogrenci: 14076, ogretimUyesi: 276, akademisyen: 519 },
|
||||||
|
"istanbul-atlas-universitesi": { ogrenci: 10704, ogretimUyesi: 376, akademisyen: 501 },
|
||||||
|
"istanbul-aydin-universitesi": { ogrenci: 47200, ogretimUyesi: 777, akademisyen: 1200 },
|
||||||
|
"istanbul-beykent-universitesi": { ogrenci: 26693, ogretimUyesi: 501, akademisyen: 824 },
|
||||||
|
"istanbul-bilgi-universitesi": { ogrenci: 19216, ogretimUyesi: 310, akademisyen: 568 },
|
||||||
|
"istanbul-esenyurt-universitesi": { ogrenci: 14673, ogretimUyesi: 150, akademisyen: 320 },
|
||||||
|
"istanbul-galata-universitesi": { ogrenci: 4213, ogretimUyesi: 125, akademisyen: 192 },
|
||||||
|
"istanbul-gedik-universitesi": { ogrenci: 10243, ogretimUyesi: 175, akademisyen: 306 },
|
||||||
|
"istanbul-gelisim-universitesi": { ogrenci: 36730, ogretimUyesi: 472, akademisyen: 775 },
|
||||||
|
"istanbul-kent-universitesi": { ogrenci: 15262, ogretimUyesi: 231, akademisyen: 405 },
|
||||||
|
"istanbul-kultur-universitesi": { ogrenci: 13322, ogretimUyesi: 268, akademisyen: 459 },
|
||||||
|
"istanbul-medeniyet-universitesi": { ogrenci: 15978, ogretimUyesi: 746, akademisyen: 1141 },
|
||||||
|
"istanbul-medipol-universitesi": { ogrenci: 49066, ogretimUyesi: 975, akademisyen: 1647 },
|
||||||
|
"istanbul-nisantasi-universitesi": { ogrenci: 42789, ogretimUyesi: 485, akademisyen: 783 },
|
||||||
|
"istanbul-okan-universitesi": { ogrenci: 17022, ogretimUyesi: 560, akademisyen: 823 },
|
||||||
|
"istanbul-rumeli-universitesi": { ogrenci: 10118, ogretimUyesi: 165, akademisyen: 257 },
|
||||||
|
"istanbul-sabahattin-zaim-universitesi": { ogrenci: 8740, ogretimUyesi: 261, akademisyen: 392 },
|
||||||
|
"istanbul-saglik-ve-teknoloji-universitesi": { ogrenci: 5136, ogretimUyesi: 350, akademisyen: 434 },
|
||||||
|
"istanbul-sisli-meslek-yuksekokulu": { ogrenci: 10446, ogretimUyesi: 19, akademisyen: 80 },
|
||||||
|
"istanbul-teknik-universitesi": { ogrenci: 33900, ogretimUyesi: 1253, akademisyen: 2524 },
|
||||||
|
"istanbul-ticaret-universitesi": { ogrenci: 8384, ogretimUyesi: 167, akademisyen: 270 },
|
||||||
|
"istanbul-topkapi-universitesi": { ogrenci: 24477, ogretimUyesi: 237, akademisyen: 424 },
|
||||||
|
"istanbul-universitesi": { ogrenci: 52770, ogretimUyesi: 2125, akademisyen: 3379 },
|
||||||
|
"istanbul-universitesi-cerrahpasa": { ogrenci: 29490, ogretimUyesi: 1318, akademisyen: 2053 },
|
||||||
|
"istanbul-yeni-yuzyil-universitesi": { ogrenci: 20511, ogretimUyesi: 271, akademisyen: 424 },
|
||||||
|
"istinye-universitesi": { ogrenci: 17697, ogretimUyesi: 525, akademisyen: 745 },
|
||||||
|
"izmir-bakircay-universitesi": { ogrenci: 8576, ogretimUyesi: 340, akademisyen: 502 },
|
||||||
|
"izmir-demokrasi-universitesi": { ogrenci: 11641, ogretimUyesi: 321, akademisyen: 450 },
|
||||||
|
"izmir-ekonomi-universitesi": { ogrenci: 11623, ogretimUyesi: 356, akademisyen: 626 },
|
||||||
|
"izmir-katip-celebi-universitesi": { ogrenci: 19148, ogretimUyesi: 778, akademisyen: 1215 },
|
||||||
|
"izmir-konak-meslek-yuksekokulu": { ogrenci: 3816, ogretimUyesi: 28, akademisyen: 116 },
|
||||||
|
"izmir-tinaztepe-universitesi": { ogrenci: 4685, ogretimUyesi: 199, akademisyen: 232 },
|
||||||
|
"izmir-yuksek-teknoloji-enstitusu": { ogrenci: 7109, ogretimUyesi: 234, akademisyen: 685 },
|
||||||
|
"kadir-has-universitesi": { ogrenci: 5237, ogretimUyesi: 163, akademisyen: 257 },
|
||||||
|
"kafkas-universitesi": { ogrenci: 18892, ogretimUyesi: 712, akademisyen: 989 },
|
||||||
|
"kahramanmaras-istiklal-universitesi": { ogrenci: 4080, ogretimUyesi: 104, akademisyen: 186 },
|
||||||
|
"kahramanmaras-sutcu-imam-universitesi": { ogrenci: 30728, ogretimUyesi: 867, akademisyen: 1335 },
|
||||||
|
"kapadokya-universitesi": { ogrenci: 10946, ogretimUyesi: 149, akademisyen: 276 },
|
||||||
|
"karabuk-universitesi": { ogrenci: 37533, ogretimUyesi: 808, akademisyen: 1179 },
|
||||||
|
"karadeniz-teknik-universitesi": { ogrenci: 28957, ogretimUyesi: 1198, akademisyen: 2144 },
|
||||||
|
"karamanoglu-mehmetbey-universitesi": { ogrenci: 19098, ogretimUyesi: 641, akademisyen: 908 },
|
||||||
|
"kastamonu-universitesi": { ogrenci: 25308, ogretimUyesi: 639, akademisyen: 980 },
|
||||||
|
"kayseri-universitesi": { ogrenci: 14389, ogretimUyesi: 174, akademisyen: 315 },
|
||||||
|
"kilis-7-aralik-universitesi": { ogrenci: 13370, ogretimUyesi: 304, akademisyen: 478 },
|
||||||
|
"kirikkale-universitesi": { ogrenci: 29779, ogretimUyesi: 775, akademisyen: 1209 },
|
||||||
|
"kirklareli-universitesi": { ogrenci: 22377, ogretimUyesi: 560, akademisyen: 915 },
|
||||||
|
"kirsehir-ahi-evran-universitesi": { ogrenci: 20182, ogretimUyesi: 670, akademisyen: 990 },
|
||||||
|
"koc-universitesi": { ogrenci: 8596, ogretimUyesi: 432, akademisyen: 838 },
|
||||||
|
"kocaeli-saglik-ve-teknoloji-universitesi": { ogrenci: 6271, ogretimUyesi: 115, akademisyen: 152 },
|
||||||
|
"kocaeli-universitesi": { ogrenci: 53036, ogretimUyesi: 1191, akademisyen: 2174 },
|
||||||
|
"konya-gida-ve-tarim-universitesi": { ogrenci: 1614, ogretimUyesi: 36, akademisyen: 57 },
|
||||||
|
"konya-teknik-universitesi": { ogrenci: 10688, ogretimUyesi: 312, akademisyen: 521 },
|
||||||
|
"kto-karatay-universitesi": { ogrenci: 9768, ogretimUyesi: 211, akademisyen: 341 },
|
||||||
|
"kutahya-dumlupinar-universitesi": { ogrenci: 38491, ogretimUyesi: 652, akademisyen: 1007 },
|
||||||
|
"kutahya-saglik-bilimleri-universitesi": { ogrenci: 6757, ogretimUyesi: 326, akademisyen: 521 },
|
||||||
|
"lokman-hekim-universitesi": { ogrenci: 5137, ogretimUyesi: 241, akademisyen: 331 },
|
||||||
|
"malatya-turgut-ozal-universitesi": { ogrenci: 12370, ogretimUyesi: 355, akademisyen: 510 },
|
||||||
|
"maltepe-universitesi": { ogrenci: 6288, ogretimUyesi: 370, akademisyen: 577 },
|
||||||
|
"manisa-celal-bayar-universitesi": { ogrenci: 42218, ogretimUyesi: 986, akademisyen: 1647 },
|
||||||
|
"mardin-artuklu-universitesi": { ogrenci: 16705, ogretimUyesi: 456, akademisyen: 722 },
|
||||||
|
"marmara-universitesi": { ogrenci: 56733, ogretimUyesi: 2168, akademisyen: 3410 },
|
||||||
|
"mef-universitesi": { ogrenci: 3708, ogretimUyesi: 115, akademisyen: 181 },
|
||||||
|
"mersin-universitesi": { ogrenci: 37444, ogretimUyesi: 914, akademisyen: 1749 },
|
||||||
|
"mimar-sinan-guzel-sanatlar-universitesi": { ogrenci: 8956, ogretimUyesi: 457, akademisyen: 631 },
|
||||||
|
"mudanya-universitesi": { ogrenci: 3040, ogretimUyesi: 98, akademisyen: 158 },
|
||||||
|
"mugla-sitki-kocman-universitesi": { ogrenci: 39185, ogretimUyesi: 991, akademisyen: 1727 },
|
||||||
|
"munzur-universitesi": { ogrenci: 9826, ogretimUyesi: 318, akademisyen: 511 },
|
||||||
|
"mus-alparslan-universitesi": { ogrenci: 14993, ogretimUyesi: 418, akademisyen: 647 },
|
||||||
|
"necmettin-erbakan-universitesi": { ogrenci: 36239, ogretimUyesi: 1164, akademisyen: 1954 },
|
||||||
|
"nevsehir-haci-bektas-veli-universitesi": { ogrenci: 21073, ogretimUyesi: 471, akademisyen: 822 },
|
||||||
|
"nigde-omer-halisdemir-universitesi": { ogrenci: 26201, ogretimUyesi: 746, akademisyen: 1149 },
|
||||||
|
"nuh-naci-yazgan-universitesi": { ogrenci: 2902, ogretimUyesi: 98, akademisyen: 162 },
|
||||||
|
"ondokuz-mayis-universitesi": { ogrenci: 44852, ogretimUyesi: 1253, akademisyen: 2305 },
|
||||||
|
"ordu-universitesi": { ogrenci: 17767, ogretimUyesi: 598, akademisyen: 973 },
|
||||||
|
"orta-dogu-teknik-universitesi": { ogrenci: 30055, ogretimUyesi: 757, akademisyen: 2058 },
|
||||||
|
"osmaniye-korkut-ata-universitesi": { ogrenci: 16460, ogretimUyesi: 365, akademisyen: 609 },
|
||||||
|
"ostim-teknik-universitesi": { ogrenci: 8469, ogretimUyesi: 148, akademisyen: 257 },
|
||||||
|
"ozyegin-universitesi": { ogrenci: 8369, ogretimUyesi: 255, akademisyen: 465 },
|
||||||
|
"pamukkale-universitesi": { ogrenci: 43013, ogretimUyesi: 1238, akademisyen: 2113 },
|
||||||
|
"piri-reis-universitesi": { ogrenci: 6741, ogretimUyesi: 121, akademisyen: 217 },
|
||||||
|
"recep-tayyip-erdogan-universitesi": { ogrenci: 18693, ogretimUyesi: 703, akademisyen: 1252 },
|
||||||
|
"sabanci-universitesi": { ogrenci: 5093, ogretimUyesi: 212, akademisyen: 363 },
|
||||||
|
"saglik-bilimleri-universitesi": { ogrenci: 25070, ogretimUyesi: 3992, akademisyen: 4397 },
|
||||||
|
"sakarya-universitesi": { ogrenci: 44027, ogretimUyesi: 1088, akademisyen: 1678 },
|
||||||
|
"sakarya-uygulamali-bilimler-universitesi": { ogrenci: 29466, ogretimUyesi: 374, akademisyen: 698 },
|
||||||
|
"samsun-universitesi": { ogrenci: 8287, ogretimUyesi: 363, akademisyen: 515 },
|
||||||
|
"sanko-universitesi": { ogrenci: 1724, ogretimUyesi: 115, akademisyen: 167 },
|
||||||
|
"selcuk-universitesi": { ogrenci: 61768, ogretimUyesi: 1486, akademisyen: 2594 },
|
||||||
|
"siirt-universitesi": { ogrenci: 16165, ogretimUyesi: 482, akademisyen: 689 },
|
||||||
|
"sinop-universitesi": { ogrenci: 13767, ogretimUyesi: 421, akademisyen: 626 },
|
||||||
|
"sirnak-universitesi": { ogrenci: 6543, ogretimUyesi: 211, akademisyen: 330 },
|
||||||
|
"sivas-bilim-ve-teknoloji-universitesi": { ogrenci: 940, ogretimUyesi: 81, akademisyen: 177 },
|
||||||
|
"sivas-cumhuriyet-universitesi": { ogrenci: 46095, ogretimUyesi: 1184, akademisyen: 1921 },
|
||||||
|
"suleyman-demirel-universitesi": { ogrenci: 33222, ogretimUyesi: 1097, akademisyen: 1847 },
|
||||||
|
"tarsus-universitesi": { ogrenci: 7088, ogretimUyesi: 161, akademisyen: 285 },
|
||||||
|
"ted-universitesi": { ogrenci: 5454, ogretimUyesi: 188, akademisyen: 331 },
|
||||||
|
"tekirdag-namik-kemal-universitesi": { ogrenci: 28761, ogretimUyesi: 661, akademisyen: 1125 },
|
||||||
|
"tobb-ekonomi-ve-teknoloji-universitesi": { ogrenci: 5597, ogretimUyesi: 242, akademisyen: 378 },
|
||||||
|
"tokat-gaziosmanpasa-universitesi": { ogrenci: 32387, ogretimUyesi: 964, akademisyen: 1617 },
|
||||||
|
"toros-universitesi": { ogrenci: 4319, ogretimUyesi: 96, akademisyen: 155 },
|
||||||
|
"trabzon-universitesi": { ogrenci: 11965, ogretimUyesi: 432, akademisyen: 665 },
|
||||||
|
"trakya-universitesi": { ogrenci: 35922, ogretimUyesi: 933, akademisyen: 1710 },
|
||||||
|
"turk-alman-universitesi": { ogrenci: 4574, ogretimUyesi: 126, akademisyen: 364 },
|
||||||
|
"turk-hava-kurumu-universitesi": { ogrenci: 4144, ogretimUyesi: 73, akademisyen: 162 },
|
||||||
|
"ufuk-universitesi": { ogrenci: 4280, ogretimUyesi: 181, akademisyen: 284 },
|
||||||
|
"usak-universitesi": { ogrenci: 22113, ogretimUyesi: 495, akademisyen: 930 },
|
||||||
|
"uskudar-universitesi": { ogrenci: 23805, ogretimUyesi: 506, akademisyen: 702 },
|
||||||
|
"van-yuzuncu-yil-universitesi": { ogrenci: 28497, ogretimUyesi: 1195, akademisyen: 1744 },
|
||||||
|
"yalova-universitesi": { ogrenci: 16528, ogretimUyesi: 451, akademisyen: 758 },
|
||||||
|
"yasar-universitesi": { ogrenci: 10081, ogretimUyesi: 226, akademisyen: 414 },
|
||||||
|
"yeditepe-universitesi": { ogrenci: 19371, ogretimUyesi: 602, akademisyen: 1126 },
|
||||||
|
"yildiz-teknik-universitesi": { ogrenci: 36618, ogretimUyesi: 1072, akademisyen: 1801 },
|
||||||
|
"yozgat-bozok-universitesi": { ogrenci: 23118, ogretimUyesi: 656, akademisyen: 1028 },
|
||||||
|
"yuksek-ihtisas-universitesi": { ogrenci: 3654, ogretimUyesi: 197, akademisyen: 272 },
|
||||||
|
"zonguldak-bulent-ecevit-universitesi": { ogrenci: 29666, ogretimUyesi: 713, akademisyen: 1354 },
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Üniversite sayfa slug'ının YÖK İstatistik satırı; yoksa null. */
|
||||||
|
export function uniIstatistikBul(slug: string): UniIstatistik | null {
|
||||||
|
return YOK_ISTATISTIK[slug] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Öğretim üyesi başına örgün öğrenci, tam sayıya yuvarlanmış. */
|
||||||
|
export function ogrenciBasinaUye(i: UniIstatistik): number {
|
||||||
|
return Math.round(i.ogrenci / i.ogretimUyesi);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user