Amaç: yeni bir sayfa veya bileşen eklerken mevcut siteyle görsel/kod tutarlılığını korumak.
Token'lar src/styles/global.css içindeki @theme bloğunda tanımlı; burada onları nasıl
kullanacağını anlatıyoruz.
Karanlık zeminli, tek tema (site her zaman koyu — light mode yok, color-scheme: dark).
| Token | Değer | Kullanım |
|---|---|---|
ink-950 |
#0b1012 |
Sayfa arka planı |
ink-900 / ink-850 / ink-800 |
koyudan açığa | Kart/panel katmanları, header |
ink-700 / ink-600 |
Border, hover zemin | |
mist-100 |
#f0f0e9 |
Ana metin (başlıklar) |
mist-300 |
#bdc8c9 |
Gövde metni |
mist-500 |
#8e9fa3 |
İkincil/etiket metni |
volt-300..600 |
camgöbeği | Marka rengi. CTA, link ve aktif durum; ana vurgu #75d5d0 |
medal-400/500 |
altın sarısı | Ödül/derece, rozet ("2026 Finalisti" gibi) |
ember-400/500 |
kırmızı | Bronz/uyarı tonları (nadiren kullanılır) |
Kural: yeni bir vurgu rengi icat etme. Marka aksiyonu → volt, başarı/ödül → medal,
tehlike/bronz → ember. packageTone()/degreeTone() (src/lib/utils.ts) bu eşlemeyi
otomatik yapar — sponsorluk paketi veya derece metni yazarken bunları kullan, renk sınıfını elle
seçme.
- Barlow (
--font-display) — BTÜ kurumsal kimlik fontu, sadece başlıklarda (h1-h3civarı,font-displaysınıfı gerekmiyorsa bile Section/PageHero başlıkları bunu kullanıyor). - Inter Variable (
--font-sans) — gövde metni, varsayılanbodyfontu. - JetBrains Mono Variable (
--font-mono) — etiketler, rakamlar, "eyebrow" metinler (font-mono text-[0.65rem] tracking-[0.2em] uppercasekalıbı sitede çok tekrar eder).
Üç fontu da @fontsource* paketleriyle self-host ediyoruz — CDN'e çıkma.
container-matro— sayfa genişliği sınırlayıcı (global.css'de tanımlı), her section bunu kullanır.Section.astro—eyebrow+title+ opsiyoneldescription, standart üst boşluk. Yeni bir içerik bloğu eklerken çıplak<section>yazma,Section'ı kullan.PageHero.astro— her alt sayfanın en üstündeki büyük başlık alanı.CtaBand.astro— sayfa sonu çağrı kutusu;<slot />destekler (ör.BasvuruButonlariiçine geçirilebilir)..card/.card-hover— düz koyu panel, 4px köşe ve ince kenarlık; hover'da hafif yükselme. Yeni bir kutu tasarlarken bu sınıftan başla..reveal(+data-delay) — JavaScript hazırsa scroll'da kısa fade/slide-in; JS olmadan içerik görünür. Listelerdedata-delay={i * 50}gibi kademeli gecikme ver.grid-bg— yalnızca gerektiğinde görselsiz yer tutucularda kullanılır. Hero, CTA ve footer zeminine ızgara veya glow eklenmez.
Tek görevi: bir cover + opsiyonel gallery: string[] alıp, tek görsel varsa düz <img>,
birden fazla varsa kapağın altında tıklanabilir küçük resim şeridi basmak. Tüm çoklu görsel
ihtiyaçları bu bileşenden geçmeli — kendi thumbnail/lightbox mantığını yazma.
<MediaGaleri
cover={team.data.image}
gallery={team.data.gallery}
alt={`${team.data.title} takımı`}
imgClass="aspect-[16/9] w-full rounded-2xl border border-white/10 object-cover"
/>İki yerleşim modu var:
- Sabit oranlı, blok akışı (varsayılan,
stretchverilmez) — takım detay sayfasındaki gibi ortalanmış, sabitaspect-[…]ile.imgClassboyutu tamamen belirler. stretch(grid hücresini doldur) — haber/faaliyet kartlarındaki gibi, sarmalayıcıflex h-full flex-cololur,imgClass'aflex-1eklenir; ana görsel kalan tüm yüksekliği kaplar, şerit varsa altına oturur. Bunu yalnızca ebeveyn zaten bir grid/flex ile yükseklik veriyorsa kullan (aksi haldeflex-1hiçbir şeye büyümez).
Diğer prop'lar: placeholderLabel (görsel yoksa gösterilecek metin — haber tipi gibi),
renderEmpty={false} (görsel yoksa hiçbir şey basma; takım detay sayfası bunu kullanıyor çünkü
görsel yoksa orada boşluk bırakmak istemiyoruz).
Tıklama mantığı tek bir global <script> ile event delegation üzerinden çalışır — sayfada kaç
tane MediaGaleri olursa olsun ek JS yükü olmaz. Yeni bir kullanım eklerken script'e dokunmana
gerek yok.
Galeri verisinden (src/data/gallery.json) beslenen, sayfa altına konan yatay foto şeridi
(hakkımızda, ekibimiz, bize katılın, iletişim sayfalarında kullanılıyor). MediaGaleri'den
farkı: tek bir içeriğin görselleri değil, tüm siteden kategoriye göre filtrelenmiş bir
seçki gösterir ve tıklayınca /galeri sayfasına götürür (büyütme yapmaz).
<FotoSerit categories={['Yarışma']} limit={6} class="mt-10" />Takım listesi kartı — kapak, kategori rozeti, badge (ör. "2026 Finalisti"), isNew durumu,
odak alanları (ilk 3). Bu kartın kendi galerisi yok — liste görünümünde tek kapak yeterli,
çoklu görsel yalnızca detay sayfasında (MediaGaleri ile) gösterilir.
src/data/join.json'daki applications[] dizisinden beslenir. variant="kart" (açıklamalı,
Bize Katılın sayfası) veya variant="satir" (yalnızca buton, CTA bantları/iletişim). Yeni bir
başvuru formu eklerken bu bileşene dokunma — sadece JSON'a ekle, her yerde otomatik çıkar.
| Bağlam | Oran/sınıf |
|---|---|
| Takım/haber/faaliyet kartı (liste) | aspect-[4/3] (TeamCard) veya stretch + grid hücresi (haber/faaliyet) |
| Takım detay kapak görseli | aspect-[16/9], max-w-3xl, rounded-2xl |
| Sponsor logosu | kare, rounded-full, h-20 w-20 (dairesel rozet — crop-sponsor-logos.mjs çıktısı zaten kare+saydam) |
Galeri şeridi kareleri (FotoSerit) |
aspect-square |
MediaGaleri küçük resim |
h-12 w-16 (sabit, oranı önemli değil, object-cover) |
- Görseli
public/media/altına, isim desenitakim-…/haber-…/galeri-…/sponsor-…/logolar/…ile koy (var olan adlandırmayı takip et). sharpile optimize et (bkz. AGENTS.md → Görsel kuralları).- Frontmatter'da
image(kapak) ve varsagallery: [...]alanlarını doldur — ekstra markup/bileşen yazmana gerek yok, sayfalar zatenMediaGaleri'yi çağırıyor. .pages.yml'de karşılık gelen alan zaten tanımlı (image+galleryüç koleksiyonda da var); yeni bir koleksiyon eklersen aynı ikiliyi oraya da ekle.
Görsel yön: teknik bir topluluğun fotoğraf ağırlıklı, sade yayın düzeni. Koyu kömür zemin, kırık beyaz Barlow başlıklar, sınırlı camgöbeği vurgu. Büyük başlıkların yanında kısa açıklamalar ve belirgin boşluklar kullanılır. Tekrarlayan kutular yerine içeriğe göre farklı düzenler tercih edilir; hero görseline karartma bindirilmez.
- Ana sayfa: iki satırlı kısa başlık ve açıklama, altında gerçek ekip fotoğrafı.
home.hero.backgroundImageartık arka plan değil, ana fotoğraftır;imageAltveimageCaptionalanları Pages CMS üzerinden düzenlenir. Başlık satır sonlarını korur. PageHero: masaüstünde başlık/açıklama iki sütun, mobilde üst üste. Izgara ve ışık efekti yok.StatGrid: altı sütuna kadar açılan düz istatistik şeridi. Değerler sunucuda basılır; sıfırdan başlayan sayaç animasyonu kaldırıldı, JavaScript olmadan da doğru sayı gösterilir.TeamCard: 4:3 fotoğraf, fotoğraf altında kategori ve başlık, ince alt çizgi. Kategori, özet ve odak alanları korunur. Fotoğrafsız içerikte soyut teknik çizim bulunur.- Takım listesi: kategoriler gerçek filtre düğmeleridir;
aria-pressedve canlı sonuç sayısı bulunur. JS olmadan filtreler gizlenir ve tüm takımlar görünür. - Ana sayfa başarıları: yıl / yarışma / derece sütunlarından oluşan satırlar.
- Ana sayfa haberleri: bir büyük ve iki ikincil fotoğraflı haber. Bağlantılar haberin
/haberler#dosya-adikonumuna gider. - Sponsorlar: küçük kapsüller yerine logoların okunabildiği sabit hücreler.
CtaBand: camgöbeği üst çizgi, solda başlık, sağda eylemler; ışık efekti yok. Dahili yollar yanındamailto:ve dış bağlantıları da destekler..button-primary: 3px köşeli, düz renkli ana düğme..text-link: okla biten metin bağlantısı.- Hareket, yalnızca hazır JS tarafından
.motion-readyile etkinleştirilir. Hareket azaltma tercihi korunur. Mobil menü Escape ile kapanıp odağı düğmeye döndürür.
Doğrulama: 25 sayfalık Astro üretim derlemesi; 12 sayfanın 320, 768 ve 1440px genişlikte taşma/tek h1 kontrolleri; menü, takım filtreleri, galeri değişimi ve ana sayfa görsel yüklemeleri.
Site dışındaki A4 yayınların kendi tasarım belgeleri var. Hepsi sitenin veri dosyalarını
okur, HTML/CSS'ten Chrome ile PDF üretir; site ile aynı üç fontu ve aynı renk anlamlarını
kullanır, ancak açık zeminde basıldığı için koyu camgöbeği (#0f8c86) ana vurgudur.
| Yayın | Belge | Betik |
|---|---|---|
| Faaliyet Raporu 2025–2026 | docs/faaliyet-kitapcigi-2025-26/DESIGN.md |
scripts/build-faaliyet-kitapcigi.mjs |
| Sponsorluk Dergisi 2026–2027 | docs/sponsorluk-dergisi-2026-27/DESIGN.md |
scripts/build-sponsorluk-dergisi.mjs |
| MATRO Dergi, Sayı 01 | docs/dergi-sayi-01/DESIGN.md |
scripts/build-dergi-sayi-01.mjs |
Basılı yayınlarda ortak kural: @font-face tanımlarında her aile için latin ve
latin-ext dosyaları ayrı unicode-range ile yüklenir; aksi hâlde Türkçe karakterler
başlıklarda yedek fonta düşer.