Files
impact-site/README.md
tunapro 8b480c036c
All checks were successful
Deploy stable / deploy (push) Successful in 1m36s
Initial impact.tr site
V3 landing: white + violet + yellow accent, bold editorial.
Markdown-driven content: 3 yarışma formatı (hands-on, ideathon, robo-soccer),
5 edisyon (Ataköy, Çemberlitaş Ideathon '25, Çemberlitaş HoC '26, İstanbul/Ankara Robo Soccer).
Sayfalar: anasayfa, yarışma/edisyon detayları, sponsor, hakkımızda, iletişim.
40 Çemberlitaş fotoğrafı (1600px optimize, ~6.4 MB).
Content helper (gray-matter + marked), reviews/photos registry,
iletişim/ekip tek kaynak lib/contact.ts.
Next.js 16 standalone build, Docker + compose hazır.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 15:35:09 +03:00

174 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# impact.tr
Next.js 16 + Tailwind 4. SSG, markdown-driven content, self-host (Docker).
## Dev / build
```bash
npm install
npm run dev # localhost:3000 (we use 3010 in the background)
npm run build # production build
npm run start # serve the production build
```
Docker:
```bash
docker compose up -d --build # HOST_PORT=3010 by default
```
## Content workflow (no CMS, yalnızca markdown + git)
Yeni edisyon, yeni yarışma formatı, yeni foto = dosya ekle + commit + push. Site otomatik güncellenir.
### Yeni edisyon ekle
1. `content/editions/<slug>.md` dosyası oluştur. Örnek:
```md
---
slug: ankara-hands-on-2026
competition: hands-on-challenge # hands-on-challenge | ideathon | robo-soccer
name: Hands-On Challenge — Ankara Regional
status: past # past | upcoming | announced
startDate: "2026-06-14"
endDate: "2026-06-15"
city: Ankara
venue: ODTÜ KKM
stats:
teams: 24
participants: 200
volunteers: 25
winners:
- { place: 1, team: "Takım Adı", school: "Okul", members: 4 }
- { place: 2, team: "...", school: "...", members: 3 }
teams:
- { name: "Takım A", school: "Lise X", size: 4 }
- { name: "Takım B", school: "Ü. Y", size: 3 }
partners:
- "Partner 1"
testimonials:
- { by: "İsim", org: "Kurum", quote: "..." }
summary: "Tek cümlelik özet, kart & meta yerlerinde görünür."
---
Serbest metin (markdown). `##`, `###`, listeler, bağlantılar.
```
2. Foto klasörü oluştur (opsiyonel): `public/photos/<slug>/01.jpg` … `NN.jpg`.
Şu an otomatik galeri **sadece** `cemberlitas-hands-on-2026` için bağlı — yeni edisyonları otomatik çekmesi için tek satırlık helper gerekiyor (aşağıda TODO).
3. Commit + push → SSG yeniden üretir, anasayfadaki "Edisyonlar" grid'i ve toplam metrikler (`stats` varsa) otomatik güncellenir.
### Yeni yarışma formatı
`content/competitions/<slug>.md`:
```md
---
slug: archeology-hackathon
name: Archeology Hackathon Challenge
short: Kültürel miras hackathonu
tagline: "Bir cümle hook."
format: "Kısa açıklama."
durationDays: 2
ageGroups: [Lise, Üniversite]
categories: [Veri, Görüntü işleme]
color: brand # brand | accent | pink
order: 4
---
Markdown body.
```
Sonra `src/components/Nav.tsx`'a bir link daha ekle; ve `src/lib/content.ts`'te `CompetitionSlug` union type'ına yeni slug'ı ekle.
### Yeni yorum / review
`src/lib/reviews.ts` içindeki `reviews` dizisine ekle:
```ts
{
quote: "...",
by: "İsim",
org: "Kurum",
edition: "Çemberlitaş 2026",
}
```
Edition-specific testimonial'lar için o edisyonun `.md` dosyasındaki `testimonials` alanını kullan — edisyon detay sayfasında görünür.
### Foto ekle
- Yeni foto: `public/photos/<klasör>/<ad>.jpg`. 1600px genişlik civarı, JPG quality ~78 öneri.
- Çoklu indirme için Drive linki varsa:
```bash
/tmp/gdown-venv/bin/gdown --folder "<drive-folder-url>" -O public/photos/<klasör>
# sonra Pillow ile 1600px'e küçült (script örneği geliştirilebilir)
```
## Pending / TODO
Kod seviyesinde hazır olup **veri bekleyen** şeyler:
- [ ] **Ataköy edisyonu** — tarih (`startDate`/`endDate`) doğrulanmalı. Şu an `2025-12-20/21` tahmin. Takım listesi + kazananlar eklenmeli.
- [ ] **Çemberlitaş Hands-On 2026** — 16 takımın tam listesi (okul + kişi) `teams` alanına girilmeli. Tüm podium (2. ve 3.) girilmeli.
- [ ] **Çemberlitaş Ideathon 2025** — stats (katılımcı/takım sayısı), kazananlar, varsa foto klasörü.
- [ ] **Robo Soccer** — resmi isim kesinleşirse (`Robo Soccer` mı `Impact Robo Soccer` mı), tarih/mekan netleşince `istanbul-robo-soccer.md` ve `ankara-robo-soccer.md` güncellenmeli. Başvuru Google Forms URL'si ekle → yarışma sayfasına embed.
- [ ] **Ataköy foto klasörü** — Drive'da `1JzYEOfWaT6oTSDgycG0GCg-rXrlZRK5K` çekilemedi (sadece boş alt klasörler indirdi). Manuel indirip `public/photos/atakoy-hands-on/` altına kopyalanmalı.
- [ ] **Ek testimonials** — şu an yalnızca M. Buğrahan Kılıç'ın yorumu var. Katılımcı/gönüllü yorumları toplanmalı.
- [ ] **Diğer etkinlikler (LinkedIn'den çıkan)** — ZAĞANOS International STEM Expo, ZAĞANOS Case Study Challenge, Archeology Hackathon Challenge, Arduino workshops. Bunların hangisi ayrı bir format mı, hangisi tek seferlik mi karar ver; `content/competitions/` veya `content/editions/` altına uygun şekilde eklenmeli.
Kod seviyesinde **yapılacaklar**:
- [ ] Otomatik edisyon galerisi: `public/photos/<edition-slug>/` klasörü varsa edisyon detay sayfasına otomatik `<Gallery>` düşsün. Şu an sadece `cemberlitas-hands-on-2026` için hardcoded. `src/lib/photos.ts` gibi bir helper: `getEditionPhotos(slug)` → `fs.readdirSync` ile otomatik.
- [ ] **OG image** (`src/app/opengraph-image.tsx`) — WhatsApp/Slack/Twitter link preview için.
- [ ] **sitemap.xml** ve **robots.txt** (`src/app/sitemap.ts`, `src/app/robots.ts`).
- [ ] **Google Forms embed** Robo Soccer başvuru için. Form URL'si geldiğinde `/yarismalar/robo-soccer/basvuru` route'u ya da yarışma sayfasına iframe blok.
- [ ] **Yorum gönderme** — şu an `mailto:` linki. İleride bir Google Forms ile Sheets'e düşsün; yeni yorumları elden `reviews.ts`'ye taşıma akışı.
- [ ] **"Önceki etkinlikler" arşiv sayfası** — `/edisyonlar` index'i henüz yok; ana sayfadan 6 kart görünüyor. Tüm edisyonları listeleyen bir sayfa eklenmeli.
- [ ] **Gerçek logo** — şu an "i" harfi violet blok. IG'deki "impact" wordmark SVG'ye çevirilip `public/logo.svg` + `Logo.tsx` güncellenmeli.
- [ ] **Foto optimizasyonu** — şu an 1600px JPG. Next Image zaten optimize ediyor ama AVIF/WebP export eklenebilir.
- [ ] **E-posta rate-limiting / iletişim formu** — mailto iyi ama spam gelirse form'a taşıyabiliriz.
## Deploy
Self-host Docker Compose. Üretim adımları:
```bash
# Reverse proxy (caddy/nginx) impact.tr → 127.0.0.1:3010
docker compose up -d --build
docker compose logs -f web
```
Reverse proxy örneği (Caddy):
```caddy
impact.tr {
reverse_proxy 127.0.0.1:3010
}
```
## Yapı
```
content/
competitions/*.md # yarışma formatları
editions/*.md # edisyonlar (metrik, kazanan, takım, testimonial)
public/
photos/<slug>/*.jpg # edisyon/format fotoğrafları
src/
app/ # App Router sayfaları
page.tsx # anasayfa
yarismalar/[slug]/ # yarışma detay
edisyonlar/[slug]/ # edisyon detay
sponsor/, hakkimizda/, iletisim/
components/ # Nav, Footer, Section, PageHero, Gallery, PhotoStrip, ...
lib/
content.ts # markdown loader, helpers
contact.ts # iletişim, ekip, değerler, SDG (tek kaynak)
reviews.ts # yorumlar + foto index
```
## İletişim
- Site: [impact.tr](https://impact.tr)
- E-posta: contact@impact.tr · info@impact.tr · hello@impact.tr
- Ekip: tarik@ · tuna@ · yigit@ impact.tr
- Instagram: [@impact.tr](https://www.instagram.com/impact.tr/)
- LinkedIn: [impactcommunit](https://www.linkedin.com/company/impactcommunit/)