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:
179
README.md
179
README.md
@@ -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/)
|
||||
|
||||
Reference in New Issue
Block a user