Initial impact.tr site
All checks were successful
Deploy stable / deploy (push) Successful in 1m36s

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>
This commit is contained in:
2026-04-23 15:35:09 +03:00
parent 97edf69ab3
commit 8b480c036c
74 changed files with 2819 additions and 51 deletions

179
README.md
View File

@@ -1,36 +1,173 @@
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
# impact.tr
## Getting Started
Next.js 16 + Tailwind 4. SSG, markdown-driven content, self-host (Docker).
First, run the development server:
## Dev / build
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
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
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
Docker:
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
```bash
docker compose up -d --build # HOST_PORT=3010 by default
```
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
## Content workflow (no CMS, yalnızca markdown + git)
## Learn More
Yeni edisyon, yeni yarışma formatı, yeni foto = dosya ekle + commit + push. Site otomatik güncellenir.
To learn more about Next.js, take a look at the following resources:
### Yeni edisyon ekle
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
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.
```
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
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).
## Deploy on Vercel
3. Commit + push → SSG yeniden üretir, anasayfadaki "Edisyonlar" grid'i ve toplam metrikler (`stats` varsa) otomatik güncellenir.
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
### Yeni yarışma formatı
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
`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/)