feat: complete UI/UX improvements and localization

This commit is contained in:
AyrisAI
2026-07-15 14:42:51 +03:00
parent 2d149f1178
commit a36b833e00
32 changed files with 3667 additions and 348 deletions
+187
View File
@@ -0,0 +1,187 @@
# PRD — Sitar Apart & Otel Web Sitesi
## 1. Proje Özeti
**İşletme:** Sitar Apart & Otel
**Konum:** Akyaka, İnişdibi Cd. No:46, Ula/Muğla
**Telefon:** 0 530 510 98 42
**Mevcut domain:** www.akyakastarapart.com
**Slogan:** "Akyaka'nın Huzuru Sizinle!"
Akyaka'da, denize 10 dakika yürüme mesafesinde, merkezi konumda (market, pazaryeri, kafelere yakın) faaliyet gösteren self-catering apart otel. Kaynak içerik: işletmenin mevcut tanıtım broşüründen (sitar apart.pdf) çıkarıldı.
**Site tipi:** Otel / Apart Otel (self-catering)
## 2. Marka Bilgileri
- **Logo:** Ev/dalga siluetli çizgi logo, turkuaz (#2FB6C4 civarı) renkte, "SİTAR APART & OTEL" yazısı
- **Ana renk:** Turkuaz / camgöbeği (broşürde üst-alt bantlarda kullanılan turkuaz)
- **Yardımcı renkler:** Kirli beyaz / krem arka plan, koyu kahve (ahşap balkon detayları)
- **Ton:** Sıcak, sade, huzurlu — butik apart otel havası (5 yıldızlı lüks otel değil)
## 3. Site Haritası (Sayfa Envanteri)
| Route | Açıklama |
|---|---|
| `/` | Ana Sayfa — hero, kısa tanıtım, olanaklar özeti, öne çıkan daireler, CTA (rezervasyon/iletişim) |
| `/dairelerimiz` | Tüm daire tiplerinin listesi (1+0, 1+1 x2 varyant) |
| `/dairelerimiz/[slug]` | Daire detay sayfası — galeri, açıklama, olanaklar, kapasite, rezervasyon formu |
| `/galeri` | Fotoğraf galerisi (kategorili: daireler, dış cephe, manzara, balkon) |
| `/konum` | Akyaka & ulaşım bilgisi, harita gömme, çevredeki market/pazaryeri/kafeler |
| `/iletisim` | İletişim formu, adres, telefon, WhatsApp linki, harita |
| `/admin/*` | Yönetim paneli (bkz. Bölüm 8) |
Not: Bu işletme restoran/spa gibi ek hizmetler sunmuyor (self-catering apart), bu yüzden "Hizmetlerimiz" sayfası yerine olanaklar (amenities) ana sayfada ve daire detayında gösterilir.
## 4. Dil Seçenekleri
`tr`, `en`, `de` (Akyaka bölgesi yoğun Alman turist trafiği alıyor, DE desteği önemli)
→ next-intl locales: `['tr', 'en', 'de']`
`messages/tr.json`, `en.json`, `de.json`
## 5. Servisler / Olanaklar (Amenity)
Broşürden çıkarılan olanaklar:
- Yüzme Havuzu (Pool)
- Wifi
- Özel Mutfak Alanı (Private Kitchen Area)
- Balkon (fotoğraflarda görünüyor, tüm dairelerde var)
- Klima (Akyaka yaz sıcaklarında standart, eklenmesi önerilir — teyit gerekir)
→ Prisma: `model Amenity { slug, labelTr, labelEn, labelDe, icon }`
→ Room modeli üzerinde `amenities String[]` veya `RoomAmenity` join tablosu
## 6. Daire Tipleri (Room)
Broşürden 3 daire konfigürasyonu çıkarıldı:
| Slug | Ad (TR) | Açıklama | Kapasite (tahmini) |
|---|---|---|---|
| `1-0-daire` | 1+0 Dairemiz | Stüdyo tip, tek yatak, mini mutfak, banyo | 1-2 kişi |
| `1-1-daire-a` | 1+1 Dairemiz | Yatak odası + ayrı mutfak köşesi, balkon | 2 kişi |
| `1-1-daire-b` | 1+1 Dairemiz (2 Oda) | 2 kişilik ve 1 kişilik olmak üzere 2 oda, balkon | 3-4 kişi |
Ortak özellikler (broşürden): Denize 10 dk yürüme mesafesi, merkezi konum, market/pazaryeri/kafelere yakınlık.
→ Prisma:
```prisma
enum RoomType {
STUDIO_1_0
SUITE_1_1
}
model Room {
id String @id @default(cuid())
slug String @unique
type RoomType
nameTr String
nameEn String
nameDe String
descriptionTr String
descriptionEn String
descriptionDe String
capacity Int
price Int? // gecelik fiyat (varsa; broşürde fiyat yok, admin'den girilecek)
imageUrl String?
images String[]
amenities String[]
available Boolean @default(true)
featured Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
}
```
**Not:** Broşürde gecelik fiyat bilgisi yok. İşletme sahibinden fiyat teyidi alınmalı; alınana kadar mock data'da placeholder fiyat kullanılacak ve "Fiyat için iletişime geçin" ibaresi eklenmesi önerilir.
## 7. Rezervasyon Formu Alanları
Bu bir self-catering apart, online ödeme/anlık onay yok — **rezervasyon talebi** (inquiry) formu olarak kurgulanmalı, otomatik onay değil.
Alanlar: `checkIn`, `checkOut`, `adults`, `children`, `roomId` (daire tipi seçimi), `fullName`, `email`, `phone`, `message`
→ Prisma:
```prisma
enum ReservationStatus {
PENDING
CONFIRMED
CANCELLED
}
model Reservation {
id String @id @default(cuid())
roomId String
room Room @relation(fields: [roomId], references: [id])
checkIn DateTime
checkOut DateTime
adults Int
children Int @default(0)
fullName String
email String
phone String
message String?
status ReservationStatus @default(PENDING)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
}
```
→ API: `POST /api/reservations` (public), `GET /api/admin/reservations` (liste)
→ Zod: `ReservationSchema`
## 8. İletişim Formu Alanları
`fullName`, `email`, `phone`, `message`
→ Prisma: `model ContactMessage { fullName, email, phone, message, read Boolean @default(false), ... }`
→ API: `POST /api/contact` (public), `GET /api/admin/messages`
## 9. Admin / Yönetim İhtiyaçları
Standart admin paneli (her projede sabit) + bu proje için:
- `/admin/rooms` — daire tipleri CRUD (ad, açıklama TR/EN/DE, kapasite, fiyat, olanaklar, görseller)
- `/admin/reservations` — rezervasyon talepleri listesi, durum güncelleme (PENDING/CONFIRMED/CANCELLED)
- `/admin/gallery` — galeri görselleri CRUD, kategori bazlı
- `/admin/messages` — iletişim mesajları listesi, okundu işaretleme
- `/admin/amenities` — olanaklar listesi (opsiyonel, sabit liste de olabilir)
- Dashboard: toplam daire sayısı, bekleyen rezervasyon sayısı, okunmamış mesaj sayısı
## 10. Sosyal Medya / 3. Parti Entegrasyonlar
- **WhatsApp click-to-chat:** `0 530 510 98 42` numarasına yönlenen buton (header + iletişim sayfası)
- **Google Maps embed:** Akyaka, İnişdibi Cd. No:46, Ula/Muğla konumu
- Instagram/Facebook hesabı broşürde belirtilmemiş — işletme sahibinden teyit alınmalı, varsa footer'a eklenir
→ Env: `NEXT_PUBLIC_WHATSAPP_NUMBER`, `NEXT_PUBLIC_MAPS_EMBED_URL`
## 11. Teknik Notlar
- Mevcut domain `www.akyakastarapart.com` — yeni site bu domain üzerine yayınlanacak (Coolify deploy sürecinde teyit edilmeli)
- Broşürdeki fotoğraflar (3 sayfa, düşük-orta çözünürlük) başlangıç mock görseli olarak kullanılabilir; ancak production için işletmeden yüksek çözünürlüklü orijinal fotoğraf talep edilmesi önerilir
- Fiyat bilgisi eksik — admin panelinden sonradan girilecek şekilde `price` alanı nullable
- Tek işletme, çoklu şube yok — `Location`/`Branch` modeline gerek yok
## 12. Rebranding / Öncelik Sırası (Todo)
1. Ana Sayfa + Daireler listesi + Daire detay (temel akış)
2. Rezervasyon talep formu + admin onay ekranı
3. Galeri sayfası
4. İletişim sayfası + WhatsApp/Harita entegrasyonu
5. Admin panel (rooms, reservations, gallery, messages)
6. TR/EN/DE içerik doldurma
7. Openinary görsel yükleme entegrasyonu
8. Coolify deploy (bkz. `/coolify-deploy` skill)
---
## PRD'den Çıkarılanlar (Özet)
- **Modeller:** Room, Reservation, Amenity, Gallery, ContactMessage
- **Lokaller:** tr, en, de
- **Admin sayfaları:** rooms, reservations, gallery, messages, amenities
- **Özel route'lar:** `/api/reservations` (public POST), `/api/contact` (public POST)
- **Eksik / teyit gereken bilgiler:** gecelik fiyatlar, sosyal medya hesapları, klima olup olmadığı, yüksek çözünürlüklü görseller