diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..11386dd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +.git +node_modules +.next +.env* +README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 0000000..ed3afa2 --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,89 @@ +# Deployment Rehberi — demo.ayristech.com + +## Yerel Geliştirme + +```bash +npm install +npm run dev +# → http://localhost:3000/dogan-tip-merkezi +``` + +## Yeni Demo Eklemek + +`data/demos.ts` dosyasına yeni kayıt ekle: + +```ts +"yeni-klinik": { + slug: "yeni-klinik", + template: "klinik", + firma: { + adi: "Yeni Klinik", + slogan: "...", + sehir: "İstanbul", + renkAna: "#0ea5e9", // Ana renk + renkKoyu: "#0284c7", // Hover rengi + renkAcik: "#e0f2fe", // Açık arka plan + ... + }, + ... +} +``` + +Kaydettikten sonra → `demo.ayristech.com/yeni-klinik` otomatik canlı olur. + +--- + +## Coolify ile Deploy + +### 1. GitHub'a Push +```bash +git init && git add . && git commit -m "init" +git remote add origin https://github.com/KULLANICI/demo-ayristech.git +git push -u origin main +``` + +### 2. Coolify Ayarları +- **Source:** GitHub repo +- **Build Pack:** Dockerfile +- **Port:** 3000 +- **Domain:** demo.ayristech.com + +### 3. Environment Variables (gerekirse) +``` +NODE_ENV=production +NEXT_TELEMETRY_DISABLED=1 +``` + +--- + +## Cloudflare Pages ile Deploy (Alternatif) + +`next.config.ts` içinde output'u değiştir: +```ts +output: "export" // standalone yerine +``` + +```bash +npm run build +# Çıktı: /out klasörü → Cloudflare Pages'e yükle +``` + +--- + +## Demo Tracking (Bildirim Sistemi) + +`components/templates/KlinikTemplate.tsx` içindeki tracking comment'ini +gerçek webhook'a çevir: + +```ts +// Demo tracking +useEffect(() => { + fetch("/api/track", { + method: "POST", + body: JSON.stringify({ slug: data.slug, ts: Date.now() }) + }); +}, []); +``` + +`app/api/track/route.ts` oluştur → n8n veya Make.com webhook'una ilet → +WhatsApp bildirimi gel. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c56aa99 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,55 @@ +# 1. Base image +FROM node:20-alpine AS base + +# 2. Dependencies +FROM base AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json package-lock.json* ./ +RUN npm ci --legacy-peer-deps + + +# 3. Builder +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Environment variables must be present at build time for Next.js +# Coolify will provide these, but we can set defaults +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN npm run build + +# 4. Runner +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder --chown=nextjs:nodejs /app/public ./public + +# Set the correct permission for prerender cache +RUN mkdir .next +RUN chown nextjs:nodejs .next + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT=3000 +# set hostname to localhost +ENV HOSTNAME="0.0.0.0" + +CMD ["node", "server.js"] diff --git a/INSTAGRAM_GRID_PROMPT.md b/INSTAGRAM_GRID_PROMPT.md new file mode 100644 index 0000000..3373323 --- /dev/null +++ b/INSTAGRAM_GRID_PROMPT.md @@ -0,0 +1,102 @@ +# Instagram 1x3 Grid Post — Yeni Müşteri Duyurusu +### Ayris Tech — Nano Banana Prompt + +--- + +## Değişkenleri Doldur + +``` +FİRMA_ADI = +SEKTÖR = +ŞEHİR = +YAPILAN_İŞ = +``` + +**Örnekler:** +- `FİRMA_ADI` → Gufo Gastro +- `SEKTÖR` → Restoran & Bar +- `ŞEHİR` → Muğla +- `YAPILAN_İŞ` → Web Sitesi & Rezervasyon Sistemi + +--- + +## Nano Banana Prompt + +> Aşağıdaki metni kopyala, büyük harfli yerleri doldur, Nano Banana'ya gönder. + +--- + +Create a premium Instagram 1x3 grid post (three 1080x1080 panels that form one seamless panoramic image when placed side by side on a profile grid). + +**Brand:** Ayris Tech — a modern digital agency based in Turkey. +**Announcement:** New client partnership with **[FİRMA_ADI]**, a **[SEKTÖR]** business from **[ŞEHİR]**. We are building their **[YAPILAN_İŞ]**. + +--- + +**Visual Style:** +- Background: deep navy-black `#080810` +- Accent: violet `#7C3AED` flowing into cyan `#06B6D4` as a gradient +- Typography: bold, modern sans-serif (Inter or similar) +- Subtle film grain texture overlay at 4% opacity +- No people, no stock photos — abstract geometric shapes and light leaks only +- Overall feel: Awwwards-level tech agency, dark luxury, editorial + +--- + +**Panel 1 — Client (left):** +- Small all-caps label: `YENİ İŞ BİRLİĞİ` +- Large bold text: `[FİRMA_ADI]` +- Below: `[SEKTÖR] · [ŞEHİR]` +- Visual element: soft glow blob in the client's industry color (warm amber for restaurant, teal for health, etc.) +- Gradient edge on the right side blending into Panel 2 + +**Panel 2 — Hero message (center):** +- This is the most eye-catching panel +- Giant gradient text (violet→cyan): `HOŞGELDIN` +- Smaller text below: `Dijital dönüşüm yolculuğu başlıyor` +- Strong centered layout, lots of breathing room +- Glowing radial light in the background +- Seamlessly connects to Panel 1 on the left and Panel 3 on the right + +**Panel 3 — Ayris Tech (right):** +- Small all-caps label: `AYRIS TECH` +- Work description: `[YAPILAN_İŞ]` +- Bottom: `ayristech.com` +- Visual element: subtle geometric grid pattern or the letter "A" as a large faint watermark +- Gradient edge on the left side blending from Panel 2 + +--- + +**Continuity rule:** When all three panels are placed side by side, the gradient flows seamlessly from left to right across all panels — violet on the far left, mixed in the center, cyan on the far right. Each panel must also look complete and intentional on its own. + +**Output:** Deliver as 3 separate square images (1080x1080px each), labeled Panel_1, Panel_2, Panel_3. Also deliver one combined panoramic preview (3240x1080px). + +--- + +## Caption (Kopyala Yapıştır) + +``` +[FİRMA_ADI] ile yeni bir yolculuğa çıkıyoruz 🚀 + +[SEKTÖR] alanında güçlü bir isim olan [FİRMA_ADI]'nın +dijital kimliğini birlikte inşa ediyoruz. + +→ [YAPILAN_İŞ] +→ [ŞEHİR]'den dünyaya + +#AyrisTech #WebTasarım #Dijital #[SEKTÖR] +``` + +--- + +## Hızlı Referans — Sektöre Göre Renk + +| Sektör | Glow Rengi | +|---|---| +| Restoran / Bar | `#F97316` (turuncu-amber) | +| Otel / Resort | `#14B8A6` (teal) | +| Klinik / Sağlık | `#0EA5E9` (mavi) | +| Mimari / İnşaat | `#94A3B8` (slate) | +| Teknoloji / SaaS | `#A78BFA` (violet) | +| Taksi / Ulaşım | `#F5C518` (sarı) | +| Hukuk / Finans | `#6366F1` (indigo) | diff --git a/SCC_ENERJI_ANTIGRAVITY_PROMPT.md b/SCC_ENERJI_ANTIGRAVITY_PROMPT.md new file mode 100644 index 0000000..dd41849 --- /dev/null +++ b/SCC_ENERJI_ANTIGRAVITY_PROMPT.md @@ -0,0 +1,156 @@ +# SCC Enerji — Antigravity Design Prompt + +--- + +## demos.ts Verisi + +```typescript +{ + slug: "scc-enerji", + template: "enerji", // YENİ ŞABLON — aşağıda tarif edildi + firma: { + adi: "SCC Enerji", + slogan: "Yeşil Enerji, Yeşil Dünya", + sehir: "Ankara / İstanbul", + adres: "Söğütözü Mah. Söğütözü Cad. No:2/A Çankaya, Ankara", + adres2: "Yenişehir Mah. Millet Cad. No:4/19 Pendik, İstanbul", + telefon: "0 (312) 945 04 24", + email: "info@sccenerji.com", + logoEmoji: "⚡", + renkAna: "#2E7D32", // koyu yeşil (mevcut sitenin ana rengi) + renkKoyu: "#1B5E20", // derin orman yeşili + renkAcik: "#E8F5E9", // soluk yeşil bg + renkVurgu: "#76FF03", // elektrik yeşili — enerji hissi için accent + }, + istatistikler: [ + { deger: "16+", etiket: "Uluslararası Proje" }, + { deger: "14", etiket: "Yıllık Deneyim" }, + { deger: "7+", etiket: "Ülkede Aktif" }, + { deger: "500+", etiket: "Desteklenen Firma" }, + ], + hizmetler: [ + { ikon: "🌱", baslik: "Yenilenebilir Enerji", aciklama: "Güneş, rüzgar ve biyokütle enerji sistemleri kurulum ve danışmanlığı" }, + { ikon: "♻️", baslik: "Sürdürülebilirlik Danışmanlığı", aciklama: "Şirketlerin karbon ayak izi hesaplama ve azaltma stratejileri" }, + { ikon: "📋", baslik: "Sertifikasyon & Fon", aciklama: "KOSGEB, TÜBİTAK, World Bank ve AB fon başvuru yönetimi" }, + { ikon: "🎯", baslik: "NET Zero Karbon", aciklama: "2050 hedefleri doğrultusunda net sıfır karbon yol haritası" }, + { ikon: "💡", baslik: "Dijital Dönüşüm & Yeşil Markalaşma", aciklama: "Kurumsal yeşil kimlik ve ESG raporlama" }, + { ikon: "🏗️", baslik: "Kurumsal Mühendislik", aciklama: "Endüstriyel tesis ve altyapı için sürdürülebilirlik çözümleri" }, + ], + fonlar: [ + "KOSGEB", "TÜBİTAK", "World Bank", "Enerji Bakanlığı 1832/1833 VAP", "AB Fonları" + ], + projeler: [ + { ulke: "Bulgaristan", alan: "Yenilenebilir Enerji" }, + { ulke: "Abu Dhabi", alan: "Sürdürülebilirlik" }, + { ulke: "Danimarka", alan: "Net Zero" }, + { ulke: "Kenya", alan: "Enerji Altyapısı" }, + { ulke: "Hırvatistan", alan: "AB Fon Yönetimi" }, + { ulke: "Almanya", alan: "Yeşil Markalaşma" }, + ], + yonetim: { + ceo: "Serdar Kayhan", + deneyim: "14 yıl", + unvan: "Kurucu & CEO", + }, + yorumlar: [ + { yazar: "Ahmet Kara", unvan: "Fabrika Müdürü", yorum: "SCC Enerji sayesinde tesisimizin karbon emisyonunu %40 düşürdük ve TÜBİTAK hibesi aldık.", puan: 5, tarih: "2024", emoji: "🏭" }, + { yazar: "Zeynep Arslan", unvan: "CFO, Lojistik Firması", yorum: "ESG raporlaması ve yeşil sertifikasyon sürecinde mükemmel bir rehberlik aldık.", puan: 5, tarih: "2024", emoji: "📊" }, + { yazar: "Mehmet Yılmaz", unvan: "Genel Müdür, İnşaat", yorum: "AB fon başvurumuz SCC Enerji'nin desteğiyle onaylandı. Sonuç inanılmaz.", puan: 5, tarih: "2023", emoji: "🏗️" }, + ], + sosyal: { + twitter: true, + instagram: true, + youtube: true, + linkedin: true, + }, +} +``` + +--- + +## Mevcut Site Analizi + +- **Platform:** WordPress (Caria Digital yapımı), eski, JS-rendered hero slider (yüklenmiyor) +- **Renk paleti:** Beyaz zemin + koyu yeşil aksant +- **His:** Kurumsal ama donuk — animasyon yok, fotoğraflar stock, hiyerarşi zayıf +- **Güçlü yan:** İçerik zengin (6 hizmet, 16+ proje, fon listesi, CEO bilgisi) +- **Dönüşüm fırsatı:** Bu firma Awwwards-level bir enerji sitesi hak ediyor — Tesla Energy veya Vestas seviyesi + +--- + +## Antigravity Komutu + +Aşağıdaki metni kopyala, Antigravity'e gönder: + +--- + +TEMPLATE_BRIEF.md dosyasındaki tüm kurallara uy. Şimdi `EnerjiTemplate` adında yeni bir şablon yazıyoruz. + +**Firma:** SCC Enerji — Ankara & İstanbul merkezli, 16+ uluslararası proje yapmış yenilenebilir enerji ve sürdürülebilirlik danışmanlık şirketi. + +**Demos.ts verisi:** (Yukarıdaki TypeScript objesini yapıştır) + +--- + +### İMZA MOMENT — Zorunlu + +**"Enerji Akışı Parallax"** + +Hero section'da tam ekran koyu arkaplan (`#030A03` — saf gece siyahı, yeşil tonu ile). +Üzerinde **SVG parçacık ağı** — ince çizgilerle birbirine bağlı noktalar, mouse hareketi ile etkileşimli. +Sayfa yüklenince büyük başlık kelime kelime yukarıdan düşer: **"YEŞİL ENERJİ"** — devasa, beyaz, cesur. +Hemen altında elektrik yeşili (`#76FF03`) ince bir yatay çizgi soldan sağa çizilir (stroke animation, 1.2s). +Bu çizginin altında küçük ve ince font ile: *"Sürdürülebilir geleceğin mühendisleri"* + +Hero CTA butonu: yeşil outline, hover'da içi dolup metin rengi siyah olur (fill animation). + +--- + +### Renk Paleti + +``` +Arkaplan (hero): #030A03 — neredeyse siyah, yeşil tonu +Arkaplan (sections): #F0F7F0 — çok açık yeşil beyaz (nefes verir) +Ana yeşil: #2E7D32 +Koyu yeşil: #1B5E20 +Elektrik vurgu: #76FF03 — sadece accent olarak, aşırı kullanma +Metin (açık bg): #0A1A0A +Metin (koyu bg): #FFFFFF +``` + +--- + +### Section Sırası + +1. **Hero** — imza moment (yukarıda tarif edildi), fullscreen, parçacık ağı +2. **İstatistikler** — koyu arkaplan `#0A1A0A`, 4 sayaç yan yana, scroll-triggered AnimatedCounter +3. **Hizmetler** — açık arkaplan, 6 kart, hover'da sol kenar `#76FF03` renk geçişi + kart hafifçe yukarı kalkar +4. **Fon & Destek Logolar** — "Bu fonları size biz getirebiliriz" başlığı, 5 fon logosu/etiketi yatay sıra, subtle marquee animasyon +5. **Küresel Projeler** — dünya haritası SVG üzerinde noktalar (Bulgaristan, Abu Dhabi, Danimarka, Kenya, Hırvatistan, Almanya, Adana) — Framer Motion ile tek tek belirir +6. **CEO / Hakkımızda** — yarım bölüm metin + yarım büyük fotoğraf (placeholder), CEO quote büyük ve italik +7. **Referanslar** — 3 yorum kartı, subtle yeşil border +8. **İletişim** — iki adres (Ankara + İstanbul) yan yana, telefon ve e-posta, form +9. **Footer** — sosyal medya ikonları, ince elektrik yeşili accent çizgisi + +--- + +### Teknik Gereksinimler + +- Next.js 14 App Router, TypeScript strict +- Framer Motion v11 — `useInView`, `staggerChildren`, `viewport: { once: true }` +- Lenis smooth scroll (TEMPLATE_BRIEF'teki setup kodu ile) +- Tailwind CSS v3 — custom colors `energyGreen`, `electricLime` olarak `tailwind.config.ts`'e ekle +- SVG parçacık ağı için vanilla JS Canvas veya basit CSS dots grid de kabul edilir +- AnimatedCounter component'ini kullanan istatistik section +- Komponent: `components/templates/EnerjiTemplate/index.tsx` +- Routing: `app/[slug]/page.tsx`'e `if (data.template === "enerji") return ;` ekle +- `data/demos.ts`'e interface ve veri ekle + +--- + +### Kalite Hedefi + +Bitince tarayıcıda açtığında şunu hissettirmeli: +**"Bu Tesla Energy'nin Türk versiyonu gibi görünüyor."** + +Eğer "idare eder" diyorsan — yeniden başla. diff --git a/TEMPLATE_BRIEF.md b/TEMPLATE_BRIEF.md new file mode 100644 index 0000000..6a6b93f --- /dev/null +++ b/TEMPLATE_BRIEF.md @@ -0,0 +1,416 @@ +# Şablon Tasarım Rehberi +### Ayris Tech — Premium Demo Sistemi + +--- + +## Görevin + +Potansiyel müşterilere gönderilecek demo siteleri için sektöre özel Next.js şablonları yazıyorsun. + +Öncelik sırası: **1. Tasarım ve his → 2. Animasyon → 3. İçerik → 4. Teknik detaylar** + +Müşteri linke tıkladığında ilk 3 saniyede "bu benim için yapılmış, bu çok pahalı görünüyor" hissini yaşamalı. Kod çalışıyor mu çalışmıyor mu ikinci plandır — önce göz kamaştır. + +--- + +## Tasarım Felsefesi + +### "Oha" Anı Zorunludur + +Her şablonun sayfaya girince insanı duraksatan **bir imza momenti** olmalı. Bu an tasarlanmış, hesaplanmış, sektöre özgün olmalı. Genel bir animasyon değil — o sektörün ruhunu yansıtan bir hareket. + +Referans seviye: **Awwwards Site of the Day**. Hedef his: "Bu siteyi kim yaptı, nasıl yaptı?" + +### Tasarım Kararlarında Öncelik Sırası + +``` +1. Boşluk ve nefes — section'lar arası ritim, padding cömertliği +2. Tipografi gücü — başlıklar cesur ve büyük, hiyerarşi net +3. Fotoğraf kalitesi — her fotoğraf kompozisyon düşünülerek seçilmeli +4. Renk disiplini — max 2-3 renk, geri kalanı siyah/beyaz/gri +5. Hareket kalitesi — az animasyon ama her biri mükemmel +6. Detay titizliği — hover state'ler, geçişler, micro-interaction'lar +``` + +### Nasıl Düşünmeli + +Görseller verildiğinde şunu sor: **"Bu tasarımı 10.000 USD'ye satan ajans ne hissettirdi?"** + +- Boşlukla mı ezdi? (luxury whitespace) +- Tipografiyle mi şok etti? (devasa başlık, küçük body) +- Fotoğrafla mı sardı? (fullscreen, parallax, overlay) +- Hareketle mi büyüledi? (curtain, reveal, magnetic) +- Detayla mı ikna etti? (custom cursor, subtle grain, line animation) + +Cevap hangisi ise — oradan başla, diğerlerini o etrafına kur. + +--- + +## İmza Moment Kütüphanesi + +Her şablona aşağıdakilerden **en az bir** tane koy. Birden fazla koyacaksan aralarına yeterli "sessizlik" bırak. + +### Sayfa Açılışı +- **Curtain reveal** — siyah ekran ortadan ikiye ayrılır, fotoğraf ortaya çıkar +- **Preloader çizgi** — ince bir çizgi soldan sağa ilerler, logo belirir, sahne açılır +- **Staggered text entrance** — başlık kelime kelime veya karakter karakter düşer +- **Scale-up reveal** — küçük merkezi bir görsel tam ekrana açılır + +### Scroll Animasyonları +- **Parallax hero** — scroll ettikçe fotoğraf daha yavaş iner, metin daha hızlı çıkar +- **Sticky + akan metin** — fotoğraf sabit kalır, metin onun üzerinden akar +- **Horizontal scroll bölüm** — kartlar/menü yatay ilerler, mouse/touch ile sürüklenir +- **Pinned section** — section scroll boyunca sabit kalır, içeriği değişir (tablar gibi) +- **Text scale on scroll** — başlık küçükten büyüğe veya büyükten küçüğe dönüşür + +### Hover & Mikro +- **Magnetic buton** — mouse yaklaştıkça buton sana doğru çekilir +- **Custom cursor** — varsayılan cursor kaybolur, markaya özgü daire/metin gelir +- **Image tilt** — kart hover'ında 3D perspektif eğimi (rotateX/Y) +- **Clip-path reveal** — fotoğraf hover'da yukarıdan aşağı açılır +- **Underline draw** — link hover'ında çizgi soldan sağa çizilir + +### Atmosfer +- **Scrolling marquee** — sonsuz döngü metin bandı (iki yönde farklı hızda olursa daha iyi) +- **Grain texture overlay** — tüm sayfa üstünde ince film grain (opacity 0.03-0.06) +- **Ambient glow** — arka planda renk blobları yavaşça hareket eder +- **Video loop** — hero'da sessiz, döngü video (restoran, otel için) + +--- + +## Tipografi Kuralları + +Pahalı hissinin %40'ı tipografiden gelir. + +``` +Başlık boyutu: clamp(48px, 8vw, 120px) — küçük ekranda küçülür, büyük ekranda büyür +Body boyutu: 16px minimum, 18px ideal +Satır yüksekliği: başlıklarda 0.9-1.0, body'de 1.6-1.8 +Harf aralığı: büyük harf başlıklarda tracking-widest, serif başlıklarda -0.02em +``` + +**Font kombinasyonları (sektöre göre):** +- Otel/Butik/Restoran → Playfair Display (serif) + Inter (sans) — klasik lüks +- Mimari/Kurumsal → Inter Black + Inter Regular — modern güç +- Bar/Gastro → Cormorant Garamond + Space Grotesk — sofistike +- Klinik/SaaS → DM Sans veya Sora + monospace detay — temiz güven + +Başlık tek satırda yoksa **satır kırılmalarını elle kontrol et** — otomatik kırılma çirkin görünür. + +--- + +## Renk ve Atmosfer Kuralları + +### Koyu Tema (restoran, bar, otel, gastro) +- Arka plan: `#080810` veya `#0a0a0a` — tam siyah değil, hafif tonlu +- Metin: `#ffffff` + `rgba(255,255,255,0.5)` ikincil +- Aksant: firmanın ana rengi — sadece CTA, badge, vurgu için +- Fotoğraflar üstünde: `rgba(0,0,0,0.3-0.5)` overlay — direkt koymadan + +### Açık Tema (klinik, mimari, kurumsal, butik) +- Arka plan: `#ffffff` veya `#f8f7f4` (hafif warm) veya `#f5f0e8` (krem) +- Metin: `#0a0a0a` veya `#1a1a1a` +- Aksant: firmanın ana rengi +- İkincil yüzeyler: `#f0f0f0` veya `rgba(0,0,0,0.04)` + +### Renk Disiplini +- Ana renk: butonlar, başlık vurgusu, badge, aktif state +- İkincil renk: hover state, border, gradient ikinci noktası +- Nötr: arka planlar, kartlar, ayırıcılar +- **Başka renk yok.** Emoji veya ikonlar nötr tutulur. + +--- + +## Fotoğraf Kullanımı + +Fotoğraflar kod kadar önemli. Kötü fotoğraf iyi tasarımı mahveder. + +**Unsplash koleksiyonları (sektöre göre):** +- Otel/Resort: `https://source.unsplash.com/1920x1080/?luxury,hotel,resort` +- Restoran: `https://source.unsplash.com/1920x1080/?restaurant,food,gastronomy` +- Bar: `https://source.unsplash.com/1920x1080/?cocktail,bar,dark` +- Mimari: `https://source.unsplash.com/1920x1080/?architecture,interior,modern` +- Klinik: `https://source.unsplash.com/1920x1080/?clinic,medical,clean` + +**Kurallar:** +- Hero fotoğrafı her zaman `object-cover` + `object-position: center` +- Dikey fotoğraflar (portrait) kart içinde daha dramatik görünür — kullan +- Birden fazla fotoğraf varsa renk tonu tutarlı olsun (hepsi sıcak veya hepsi soğuk) +- `picsum.photos` sadece hızlı test için — final görünümde Unsplash parametreli URL kullan + +--- + +## Animasyon Kalitesi + +### Easing Değerleri +```typescript +// Smooth deceleration — genel kullanım +ease: [0.25, 0.46, 0.45, 0.94] as [number,number,number,number] + +// Dramatic entrance — hero başlıklar +ease: [0.16, 1, 0.3, 1] as [number,number,number,number] + +// Snappy — buton, badge, küçük elementler +ease: [0.34, 1.56, 0.64, 1] as [number,number,number,number] + +// Linear — marquee, döngüler +ease: "linear" +``` + +### Süre Kuralları +``` +Micro (hover, badge): 0.15-0.25s +Element entrance: 0.6-0.8s +Section transition: 0.8-1.0s +Page reveal / curtain: 1.0-1.4s +Marquee döngü: 20-40s (içerik uzunluğuna göre) +``` + +### Stagger Ritmi +```typescript +// Çocuk sayısına göre stagger ayarla +3-4 element: staggerChildren: 0.15 +5-8 element: staggerChildren: 0.08 +9+ element: staggerChildren: 0.05 +``` + +### Animasyon Monotonluğu Kırma +Her section aynı `fadeUp` ile başlarsa sayfa uyutur. Karıştır: +- Hero: curtain veya scale reveal +- Stats: sayaç animasyonu (AnimatedCounter) +- Kartlar: stagger + hafif x offset (soldan veya sağdan) +- Galeri: clip-path veya opacity-only (y hareketi olmadan) +- CTA section: parallax arka plan + metin fade + +--- + +## Lenis Smooth Scroll Kurulumu + +Her şablona ekle: + +```typescript +"use client"; +import { useEffect } from "react"; + +// Component içinde: +useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); +}, []); +``` + +--- + +## Section Tasarım Standartları + +### Hero +- Her zaman viewport yüksekliği: `min-h-screen` +- Fotoğraf varsa: `position: absolute, inset: 0, object-fit: cover` + koyu overlay +- Başlık: clamp ile responsive, viewport'un %60-70'ini kaplamalı +- CTA buton: tek, net, aksant renkli — ikinci buton varsa ghost/outline + +### Marquee Bandı (opsiyonel ama etkili) +Hero ile sonraki section arasına koy. İki yönde farklı iki satır daha güçlü görünür. + +### İki Kolonlu (Split) Section +``` +Sol: metin + CTA Sağ: tall fotoğraf (aspect-ratio: 3/4) +Metin sola hizalı Fotoğraf slight overlap (negatif margin) +``` + +### Kart Grid'leri +- 3'lü grid: her kart eşit, hover'da `y: -8` ve border glow +- Masonry: sadece galeri için — CSS columns veya css-grid ile +- Horizontal scroll: `overflow-x: auto`, `scrollbar-width: none`, touch-action: pan-x + +### CTA Section (Son Bölüm) +En az bir kez tam genişlikte, fotoğraf arka planlı olsun. Başlık büyük, CTA tek. + +--- + +## Tech Stack + +```json +{ + "zorunlu": [ + "Next.js 14 App Router", + "Framer Motion v11", + "Tailwind CSS v3", + "TypeScript strict", + "@studio-freight/lenis" + ], + "gerektiğinde": [ + "Three.js / @react-three/fiber (sadece ambient bg için, performans dikkat)", + "react-lottie-player (loading, boş state ikonları için)", + "usehooks-ts (useWindowSize, useIntersectionObserver)" + ], + "yasak": [ + "jQuery", + "Bootstrap", + "CSS @keyframes animasyonları (Framer Motion kullan)", + "inline style ile animasyon (transform, opacity — Framer Motion kullan)" + ] +} +``` + +**Framer Motion zorunlu kurallar:** +- `ease` array'leri her zaman type assertion: `as [number,number,number,number]` +- Scroll animasyonları: `useScroll` + `useTransform` +- Section girişleri: `whileInView` + `viewport={{ once: true }}` +- Layout animasyonları: `layout` prop — yükseklik değişimlerinde kullan + +--- + +## Kalite Kontrol Listesi + +Kodu teslim etmeden önce şunları kontrol et: + +**Tasarım:** +- [ ] Sayfaya girince ilk 3 saniyede "oha" dedirten bir şey var mı? +- [ ] Boşluklar cömert mi — hiçbir element birbirine yapışık değil mi? +- [ ] Başlıklar yeterince büyük mü — yarım metre uzaktan okunabilir mi? +- [ ] Renk disiplini korunuyor mu — max 3 renk var mı? +- [ ] Fotoğraflar kompozisyon olarak uygun mu? + +**Animasyon:** +- [ ] Her section farklı animasyon mu kullanıyor (monotonluk yok)? +- [ ] Easing değerleri sert mi yoksa yumuşak mı? (Sert olmamalı) +- [ ] Lenis smooth scroll çalışıyor mu? +- [ ] Hover state'lerin hepsi var mı? + +**Detay:** +- [ ] Demo banner sabit mi: `"Bu site demo amaçlıdır — demo.ayristech.com"` +- [ ] Mobile'da layout bozulmuyor mu? +- [ ] TypeScript hataları var mı (`any` yok)? + +--- + +## Proje Yapısı + +``` +demo-ayristech/ +├── app/ +│ ├── page.tsx # Showcase index +│ └── [slug]/page.tsx # Dynamic routing +├── components/ +│ └── templates/ +│ └── [SektörTemplate]/ +│ └── index.tsx # Her şablon kendi klasöründe +├── data/ +│ └── demos.ts # Tüm demo verisi +└── components/ui/ + └── AnimatedCounter.tsx # Scroll-triggered sayaç +``` + +Yeni şablon eklerken: +1. `components/templates/YeniTemplate/index.tsx` oluştur +2. `data/demos.ts` interface'ine yeni sektör tipini ve alanları ekle +3. `app/[slug]/page.tsx` routing'e `if (data.template === "yeni") return ;` +4. `app/page.tsx` `templateLabels`'a yeni badge ekle + +--- + +## Müşteri Sitesi SS Analizi + +Sana müşterinin mevcut sitesinin ekran görüntüleri verildiğinde şu sırayla ilerle: + +### 1. İçerik Çıkarımı + +Her SS'den şunları çıkar: + +| Alan | Nereden Bulunur | +|---|---| +| Firma adı | Header, logo yanı, title | +| Slogan | Hero başlığı veya alt metin | +| Şehir / Adres | Footer, iletişim sayfası | +| Telefon | Header, footer, iletişim | +| E-posta | Footer, iletişim sayfası | +| Çalışma saatleri | Footer veya iletişim | +| Hizmetler | Hizmetler/servisler/poliklinikler sayfası | +| Ekip / Doktorlar | Kadro/hakkımızda sayfası | +| Yorumlar / Referanslar | Varsa ana sayfa veya ayrı sayfa | +| Sosyal medya | Footer veya header ikonları | + +### 2. Mevcut Tasarımı Değerlendir + +SS'lere bakarak kısaca not al: +- **Renk paleti:** Mevcut ana renk nedir? +- **Genel his:** Profesyonel mi, eski mi, amatör mü? +- **Eksikler:** Animasyon yok, mobile bozuk, fotoğraf kalitesi kötü vb. +- **Güçlü yanlar:** Korunabilecek bir şey var mı? + +Bu değerlendirmeyi şablona yansıt — mevcut siteyi taklit etme, **dönüştür**. + +### 3. demos.ts Formatında Çıkar + +Analiz sonucunu aşağıdaki formatta hazırla, eksik alanları makul şekilde doldur: + +```typescript +{ + slug: "firma-adi", // firma adından türet, küçük harf, tire ile + template: "klinik", // sektöre göre seç + firma: { + adi: "Firma Adı", + slogan: "SS'den alınan slogan veya uygun bir slogan üret", + sehir: "Şehir", + adres: "Tam adres", + telefon: "+90 ...", + email: "info@...", + logoEmoji: "🏥", // sektöre uygun emoji + renkAna: "#______", // mevcut sitenin ana rengi + renkKoyu: "#______", // daha koyu tonu + renkAcik: "#______", // çok açık tonu (bg için) + }, + istatistikler: [ + { deger: "15+", etiket: "Yıllık Deneyim" }, + // SS'de rakam varsa al, yoksa sektöre uygun üret + ], + hizmetler: [ + { ikon: "🔬", baslik: "Hizmet Adı", aciklama: "Kısa açıklama" }, + // SS'deki hizmetler sayfasından çek + ], + yorumlar: [ + { yazar: "Ad Soyad", yorum: "...", puan: 5, tarih: "2024", emoji: "👤" }, + // SS'de yoksa 3 adet gerçekçi yorum üret + ], + // Sektöre özel alanlar — SS'den çek, yoksa üret +} +``` + +### 4. Şablon Seçimi + +Sektöre göre hangi şablonun kullanılacağına karar ver: + +| Sektör | Şablon | +|---|---| +| Klinik, hastane, sağlık merkezi | `klinik` | +| Diş kliniği, estetik | `dental` | +| Restoran, kafe, bistro | `restoran` veya `restoran2` | +| Bar, meyhane, gece kulübü | `bar` veya `bar2` | +| Otel, resort, apart | `hotel1`, `hotel2` veya `hotel3` | +| Taksi, transfer, ulaşım | `taxi` veya `taxi2` | +| Yazılım, SaaS, chatbot | `chatbot` | +| İnşaat, mimarlık, kurumsal | `kurumsal` | + +Mevcut şablonlardan hiçbiri uygun değilse: **yeni şablon yaz** — TEMPLATE_BRIEF'teki tasarım kurallarına uyarak. + +### 5. Antigravity'e Ver + +Analiz tamamlandığında şunu söyle: + +> "Bu `demos.ts` verisini kullan. TEMPLATE_BRIEF.md'deki kurallara göre `[ŞabonAdı]` şablonunu yaz. Mevcut sitenin renk paletini koru ama tasarımı tamamen modernize et. İmza moment olarak `[seçilen imza moment]` kullan." + +--- + +## Son Not + +Amaç: müşteriye link atıp "bak, senin için yaptım" diyebilmek. + +**Standart değil, özel. Güzel değil, etkileyici. Çalışıyor değil, hissettiriyor.** + +Eğer şablona baktığında "bu idare eder" diyorsan — yeniden başla. diff --git a/app/[slug]/page.tsx b/app/[slug]/page.tsx new file mode 100644 index 0000000..1ef9f22 --- /dev/null +++ b/app/[slug]/page.tsx @@ -0,0 +1,50 @@ +import { getDemoBySlug } from "@/data/demos"; +import KlinikTemplate from "@/components/templates/KlinikTemplate"; +import RestoranTemplate from "@/components/templates/RestoranTemplate"; +import KurumsalTemplate from "@/components/templates/KurumsalTemplate"; +import DentalTemplate from "@/components/templates/DentalTemplate"; +import RestoranTemplate2 from "@/components/templates/RestoranTemplate2"; +import TaxiTemplate from "@/components/templates/TaxiTemplate"; +import TaxiTemplate2 from "@/components/templates/TaxiTemplate2"; +import ChatbotTemplate from "@/components/templates/ChatbotTemplate"; +import BarTemplate from "@/components/templates/BarTemplate"; +import BarTemplate2 from "@/components/templates/BarTemplate2"; +import HotelTemplate1 from "@/components/templates/HotelTemplate1"; +import HotelTemplate2 from "@/components/templates/HotelTemplate2"; +import HotelTemplate3 from "@/components/templates/HotelTemplate3"; +import BodrumCerrahiTemplate from "@/components/templates/BodrumCerrahiTemplate"; +import ChatbotTemplate2 from "@/components/templates/ChatbotTemplate2"; +import { notFound } from "next/navigation"; + +export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) { + const { slug } = await params; + const data = getDemoBySlug(slug); + if (!data) return { title: "Demo bulunamadı" }; + return { + title: `${data.firma.adi} — Ayris Tech Demo`, + description: data.firma.slogan, + }; +} + +export default async function DemoPage({ params }: { params: Promise<{ slug: string }> }) { + const { slug } = await params; + const data = getDemoBySlug(slug); + if (!data) notFound(); + + if (data.template === "klinik") return ; + if (data.template === "restoran") return ; + if (data.template === "kurumsal") return ; + if (data.template === "dental") return ; + if (data.template === "restoran2") return ; + if (data.template === "taxi") return ; + if (data.template === "taxi2") return ; + if (data.template === "chatbot") return ; + if (data.template === "bar") return ; + if (data.template === "bar2") return ; + if (data.template === "hotel1") return ; + if (data.template === "hotel2") return ; + if (data.template === "hotel3") return ; + if (data.template === "bodrumcerrahi") return ; + if (data.template === "chatbot2") return ; + notFound(); +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/app/favicon.ico differ diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..7e76f2e --- /dev/null +++ b/app/globals.css @@ -0,0 +1,4 @@ +@import "tailwindcss"; + +* { scroll-behavior: smooth; } +html { scroll-padding-top: 80px; } diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..e52ceb3 --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import Script from "next/script"; +import "./globals.css"; + +export const metadata: Metadata = { + title: "Ayris Tech — Demo", + description: "Ayris Tech tarafından hazırlanan demo sayfaları", +}; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + + + {children} + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..e523e29 --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,338 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { demos } from "@/data/demos"; +import Link from "next/link"; +import { useState } from "react"; + +const fadeUp = { + hidden: { opacity: 0, y: 30 }, + show: { opacity: 1, y: 0, transition: { duration: 0.65, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; +const stagger = { hidden: {}, show: { transition: { staggerChildren: 0.08 } } }; + +const templateLabels: Record = { + klinik: { label: "Klinik & Sağlık", renk: "#0ea5e9" }, + restoran: { label: "Restoran & Kafe", renk: "#f97316" }, + kurumsal: { label: "Kurumsal Çözüm", renk: "#6366f1" }, + dental: { label: "Dental Estetik", renk: "#10B981" }, + restoran2: { label: "Sicilya Trattoria", renk: "#3B82F6" }, + taxi: { label: "Cab Service (Dark)", renk: "#F5C518" }, + taxi2: { label: "Cab Service (Light)", renk: "#E5A900" }, + chatbot: { label: "AI Chatbot / SaaS", renk: "#00E5FF" }, + bar: { label: "Noir Velvet (Gold)", renk: "#D4AF37" }, + bar2: { label: "Chalk & Char (Red)", renk: "#E63946" }, + hotel1: { label: "Luxury Resort (Teal)", renk: "#14B8A6" }, + hotel2: { label: "Bunkhouse Lodge (Sand)", renk: "#D97706" }, + hotel3: { label: "Modernist Villa (Slate)", renk: "#94A3B8" }, + bodrumcerrahi: { label: "Cerrahi Tıp Merkezi", renk: "#1B6FA8" }, + chatbot2: { label: "Zenith AI (SaaS)", renk: "#8B5CF6" }, +}; + +function getTemplateIcon(template: string, color: string) { + const iconProps = { className: "w-5 h-5", style: { color } }; + + switch(template) { + case "klinik": + case "dental": + return ( + + + + ); + case "restoran": + case "restoran2": + return ( + + + + ); + case "kurumsal": + return ( + + + + ); + case "taxi": + case "taxi2": + return ( + + + + ); + case "chatbot": + case "chatbot2": + return ( + + + + ); + case "bar": + case "bar2": + return ( + + + + ); + case "hotel1": + case "hotel2": + case "hotel3": + return ( + + + + ); + default: + return ( + + + + ); + } +} + +export default function Home() { + const demoList = Object.values(demos); + const [showModal, setShowModal] = useState(false); + const [brandName, setBrandName] = useState(""); + const [email, setEmail] = useState(""); + + return ( +
+ + {/* Premium Ambient Background Mesh */} +
+
+ + {/* ── HEADER & SHOWCASE INTRO ── */} +
+ + + + + AYRIS TECH · DİJİTAL DENEYİM PORTFÖYÜ + + + + Yüksek Etkileşimli +
+ + Boutique Şablonlar + +
+ + + Sektör lideri markalar için tasarladığımız son derece akıcı, zengin mikro animasyonlu ve yüksek sadakatli dijital arayüz prototiplerimizi aşağıdan canlı olarak deneyimleyin. + +
+
+ + {/* ── DYNAMIC EXPERIENCES SHOWCASE GRID ── */} +
+ + + {demoList.map((demo) => { + const tpl = templateLabels[demo.template] || { label: "Özel Tasarım", renk: "#6366f1" }; + + return ( + + + + {/* Glowing highlight border on hover */} +
+ + {/* Gradient top strip */} +
+ +
+ {/* Logo Frame & Label Type */} +
+
+ {getTemplateIcon(demo.template, demo.firma.renkAna)} +
+ + {tpl.label} + +
+ +

{demo.firma.adi}

+

+ + + + + {demo.firma.sehir} +

+ + {/* Stat Dials inside Cards */} +
+ {demo.istatistikler.slice(0, 2).map((s, i) => ( +
+ {s.etiket.substring(0, 20)}... + {s.deger} +
+ ))} +
+ + {/* Premium CTA Row */} +
+ /{demo.slug} + + ÖNİZLE + + + + +
+
+ + + + ); + })} + + {/* ── CUSTOM INQUIRY REQUEST CARD (CLIENT FACING) ── */} + +
setShowModal(true)} + className="group bg-[#0d111d]/20 border border-dashed border-white/10 rounded-3xl p-8 h-full flex flex-col justify-between min-h-[360px] hover:border-indigo-400/50 hover:bg-[#121828]/30 transition-all cursor-pointer shadow-[0_20px_40px_rgba(0,0,0,0.2)]" + > +
+
+ + + +
+

Sıradaki Tasarım Sizin Olsun

+

+ Kendi markanız veya projeniz için özel kurgulanmış, zengin mikro animasyonlara ve üst segment görsel kimliğe sahip bir dijital şablon önizlemesi talep edin. +

+
+ + + ÖZEL KONSEPT TALEP ET + +
+
+ + +
+ + {/* ── MINIMALIST FOOTER ── */} + + + {/* ── CUSTOM INQUIRY MODAL (CLIENT LEAD GENERATION) ── */} + + {showModal && ( + + + {/* Close Button */} + + + {/* Success Icon */} +
+ + + +
+ +

+ Konsept Başvurusu +

+

+ Ayris Tech Design Lab +

+ + {/* Form Fields */} +
+
+ + setBrandName(e.target.value)} + placeholder="Örn. Vestam Wellness" + className="w-full px-4 py-3 rounded-xl border border-white/5 bg-[#070913] text-xs text-white placeholder-white/20 focus:outline-none focus:border-indigo-400 focus:ring-1 focus:ring-indigo-400 transition-all font-semibold" + /> +
+
+ + setEmail(e.target.value)} + placeholder="you@company.com" + className="w-full px-4 py-3 rounded-xl border border-white/5 bg-[#070913] text-xs text-white placeholder-white/20 focus:outline-none focus:border-indigo-400 focus:ring-1 focus:ring-indigo-400 transition-all font-semibold" + /> +
+
+ + { + setShowModal(false); + alert("Başvurunuz başarıyla kaydedildi! En kısa sürede iletişime geçeceğiz."); + }} + > + KONSEPT TALEBİNİ GÖNDER + +
+
+ )} +
+ +
+ ); +} diff --git a/components/templates/BarTemplate/index.tsx b/components/templates/BarTemplate/index.tsx new file mode 100644 index 0000000..3f56b39 --- /dev/null +++ b/components/templates/BarTemplate/index.tsx @@ -0,0 +1,778 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useRef, useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 40 }, + show: { opacity: 1, y: 0, transition: { duration: 0.7, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.1 } }, +}; + +const translations = { + tr: { + navReserve: "Rezervasyon", + navHours: "Çalışma Saatleri", + navCurator: "Kokteyl Menüsü", + navReviews: "Değerlendirmeler", + bookTable: "Masa Ayırt", + exclusiveLounge: "ÖZEL KOKTEYL SALONU", + cocktailStage: "KOKTEYL SAHNESİ", + evenings: "geceleri", + heroDesc: "Noir Velvet Lounge'a adım atın. Klasik karışımlar, botanik aromalar ve yıllanmış özel içkilerin loş kehribar akustiği altındaki benzersiz sunumunu keşfedin.", + discoverMenu: "MENÜYÜ KEŞFET", + reserveTableTitle: "Stage Booking", + reserveTableHeader: "MASA AYIRTIN", + reserveTableDesc: "Ana sahne akustik çizgilerinin altında, size özel bar tezgahı veya lounge masanızı şimdiden ayırtın.", + fieldsName: "İsim Soyisim", + fieldsPhone: "İletişim Numarası", + fieldsDate: "Tarih", + fieldsTime: "Saat", + guarantee: "Bu formu doldurarak doğrulanmış bir rezervasyon sağlarsınız. Masalar, rezervasyon saatinden itibaren 15 dakika boyunca adınıza tutulur.", + secureRes: "REZERVASYON YAP", + curatorSpecials: "Küratörün Seçtikleri", + weRecommend: "TAVSİYE EDİLENLER", + signature: "İmza", + loungeStories: "LOUNGE HİKAYELERİ", + loungeStoriesDesc: "Seçkin miksolojistlerin ve caz akustiği kuratörlerinin salon hakkındaki yorumlarını keşfedin.", + loungeHours: "ÇALIŞMA SAATLERİ", + loungeDials: "İMZA KOKTEYLLER", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Salon Koşulları", + dismiss: "KAPAT", + enquiryActive: "REZERVASYON YAPILDI", + ambassadorActive: "Sahne Mihmandarı Aktif", + enquirySuccess: "Bar tezgahı veya lounge masası rezervasyonunuzu başarıyla kaydettik. Özel mihmandarımız giriş koordinatlarınızı doğrulamak için sizinle iletişime geçecektir. Teşekkürler!", + }, + en: { + navReserve: "Reserve Table", + navHours: "Hours", + navCurator: "Curator's Specials", + navReviews: "Reviews", + bookTable: "Book a table", + exclusiveLounge: "EXCLUSIVE LOUNGE SERVICE", + cocktailStage: "COCKTAIL STAGE", + evenings: "evenings", + heroDesc: "Step into Noir Velvet Lounge. Indulge in classic mixes, botanic blends, and aged private reserve spirits staged under moody amber acoustics.", + discoverMenu: "DISCOVER STAGE MENU", + reserveTableTitle: "Stage Booking", + reserveTableHeader: "RESERVE A TABLE", + reserveTableDesc: "Allocate your private counter or lounge table under the main stage acoustic lines.", + fieldsName: "Name", + fieldsPhone: "Phone", + fieldsDate: "Date", + fieldsTime: "Time", + guarantee: "By submitting this form, you secure a verified reservation. Tables are held for 15 minutes past the booking coordinates.", + secureRes: "SECURE RESERVATION", + curatorSpecials: "Curator's Specials", + weRecommend: "WE RECOMMEND", + signature: "Signature", + loungeStories: "LOUNGE STORIES", + loungeStoriesDesc: "Hear what prominent mixologists and jazz acoustic curators write about the lounge.", + loungeHours: "OPEN HOURS", + loungeDials: "SPECIAL DIALS", + privacyRegs: "Privacy Regulations", + termsStay: "Terms of Lounge", + dismiss: "DISMISS", + enquiryActive: "TABLE RESERVED", + ambassadorActive: "Stage Concierge Active", + enquirySuccess: "We have secured your counter or lounge table reservation. A private host has registered your parameters. Thank you!", + } +}; + +export default function BarTemplate({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], yorumlar = [] } = data; + const [showBookingModal, setShowBookingModal] = useState(false); + const [menuOpen, setMenuOpen] = useState(false); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // 1. Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // 2. Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Localized statistics/hours + const getLocalizedStat = (deger: string, etiket: string) => { + if (deger.toLowerCase().includes("weekdays") || etiket.toLowerCase().includes("weekdays") || etiket.toLowerCase().includes("pazartesi")) { + return { + deger: lang === "tr" ? "Hafta İçi" : "Weekdays", + etiket: lang === "tr" ? "Pazartesi - Cuma · 16:00 - 02:00" : "Monday - Friday · 4:00 PM - 2:00 AM" + }; + } + if (deger.toLowerCase().includes("weekends") || etiket.toLowerCase().includes("weekends") || etiket.toLowerCase().includes("cumartesi")) { + return { + deger: lang === "tr" ? "Hafta Sonu" : "Weekends", + etiket: lang === "tr" ? "Cumartesi - Pazar · 16:00 - 04:00" : "Saturday - Sunday · 4:00 PM - 4:00 AM" + }; + } + if (deger.toLowerCase().includes("happy") || etiket.toLowerCase().includes("happy")) { + return { + deger: lang === "tr" ? "Happy Hour" : "Happy Hour", + etiket: lang === "tr" ? "Her gün 17:00 - 19:00 arası imza kokteyllerde %20 indirim" : "Daily 5:00 PM - 7:00 PM · 20% off signature mixology" + }; + } + return { + deger: lang === "tr" ? "Özel Karışımlar" : deger, + etiket: lang === "tr" ? "Taze botanik şuruplar ve el yapımı bitters infüzyonları." : etiket + }; + }; + + // Localized services/beverages + const getLocalizedService = (baslik: string, aciklama: string) => { + if (baslik.toLowerCase().includes("velvet") || baslik.toLowerCase().includes("velvet kiss")) { + return { + title: lang === "tr" ? "VELVET KISS KOKTEYLİ" : "VELVET KISS COCKTAIL", + desc: lang === "tr" ? "Kendi yapımımız taze vişne likörü, vanilya şurubu ve dumanlanmış ardıç aromaları ile hazırlanan imza içkimiz." : aciklama + }; + } + if (baslik.toLowerCase().includes("amber") || baslik.toLowerCase().includes("amber smoke") || baslik.toLowerCase().includes("smoke")) { + return { + title: lang === "tr" ? "KEHRİBAR DUMANI" : "AMBER SMOKE", + desc: lang === "tr" ? "Ağaç talaşı isi ile tütsülenmiş viski, botanik acı otlar ve karamelize portakal dilimi." : aciklama + }; + } + return { + title: lang === "tr" ? "BOTANİK RÜYA" : "BOTANICAL DREAM", + desc: lang === "tr" ? "Taze biberiye infüzyonu, narenciye asidi ve organik zencefil gazozu ile canlandırıcı hafif bir karışım." : aciklama + }; + }; + + // Custom visual styles & Google Fonts for our Classic Noir Velvet aesthetic + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,600;0,700;1,400&family=Space+Grotesk:wght@300;400;500;600;700&display=swap'); + + :root { + --color-velvet-gold: #D4AF37; + --color-velvet-black: #09090C; + --color-velvet-card: #14141A; + --color-text-white: #E8E8E8; + --color-text-muted: rgba(232, 232, 232, 0.6); + } + + .font-serif-editorial { + font-family: 'Cormorant Garamond', Georgia, serif; + } + + .font-serif-lux { + font-family: 'Cormorant Garamond', Georgia, serif; + font-weight: 700; + } + + .font-sans-clean { + font-family: 'Space Grotesk', sans-serif; + } + + .bg-mesh-velvet { + background-image: + radial-gradient(circle at 5% 5%, rgba(212, 175, 55, 0.03) 0%, transparent 40%), + radial-gradient(circle at 95% 95%, rgba(212, 175, 55, 0.02) 0%, transparent 50%); + } + + .gold-glow { + box-shadow: 0 0 20px rgba(212, 175, 55, 0.15); + } + + /* Slow pulse for active indicators */ + .pulse-gold { + animation: goldPulse 2.5s infinite; + } + + @keyframes goldPulse { + 0% { box-shadow: 0 0 0 0 rgba(212, 175, 55, 0.4); } + 70% { box-shadow: 0 0 0 10px rgba(212, 175, 55, 0); } + 100% { box-shadow: 0 0 0 0 rgba(212, 175, 55, 0); } + } + + .hero-title-clamp { + font-size: clamp(48px, 8vw, 110px); + letter-spacing: -0.03em; + line-height: 0.9; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + NOIR VELVET LOUNGE + +
+ +
+ + mixology & acoustic lounge + +
+
+ )} +
+ + {/* ── NOIR VELVET LOUNGE ── */} +
+ + {/* Floating Ambient Gold Orbs */} +
+
+ + {/* ── MANDATORY FLOATING DEMO BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + {/* ── GOLD FLOATING NAVBAR ── */} + +
+ {/* Logo */} + + + + + + + + + {firma.adi} + + + + {/* Navigation Links */} + + + {/* Action button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[10px] font-bold tracking-[2.5px] uppercase text-black bg-[#D4AF37] hover:bg-white px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_5px_15px_rgba(212,175,55,0.15)] hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.bookTable} + +
+
+
+ + {/* ── HERO & HOURS BLOCK ── */} +
+
+
+ + {/* Left Column: Headings & Hours details */} + + + + {t.exclusiveLounge} + + + + {t.cocktailStage} +
+ {t.evenings} +
+ + + {t.heroDesc} + + + {/* Grid details (Open Hours & Happy Hour) */} + + {istatistikler.map((stat, idx) => { + const locStat = getLocalizedStat(stat.deger, stat.etiket); + return ( +
+

+ {locStat.deger} +

+

+ {locStat.etiket} +

+
+ ); + })} +
+ + {/* Action CTA */} + + + {t.discoverMenu} + + +
+ + {/* Right Column: Parallax Moody Graphic Counter */} +
+ + {/* Outer glowing gold ring */} +
+ + {/* Using 8k Fresh Citrus flatlay to represent natural ingredients and botanical prep */} + {/* eslint-disable-next-line @next/next/no-img-element */} + Noir Velvet Fresh Citrus & Botanical Garnishes + + {/* Overlay velvet glow */} +
+ +
+ +
+
+
+ + {/* ── RESERVATION TABLE BUILDER ── */} +
+
+ +
+ + {/* Thin gold line connector indicator */} +
+ +
+ {t.reserveTableTitle} +

+ {t.reserveTableHeader} +

+

+ {t.reserveTableDesc} +

+
+ + {/* Form Grid */} +
+ {[ + { label: t.fieldsName, placeholder: lang === "tr" ? "Adınız Soyadınız" : "Your Name", type: "text" }, + { label: t.fieldsPhone, placeholder: lang === "tr" ? "İrtibat Numarası" : "Contact Number", type: "tel" }, + { label: t.fieldsDate, placeholder: "", type: "date" }, + { label: t.fieldsTime, placeholder: "", type: "time" }, + ].map((field, idx) => ( +
+ + +
+ ))} +
+ + {/* Form Submit Row */} +
+

+ {t.guarantee} +

+ setShowBookingModal(true)} + className="w-full md:w-auto px-10 py-4.5 rounded-xl bg-[#D4AF37] hover:bg-white text-black font-bold text-[10px] tracking-[2px] uppercase transition-all cursor-pointer shadow-[0_5px_15px_rgba(212,175,55,0.2)] shrink-0" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.secureRes} + +
+ +
+ +
+
+ + {/* ── CURATOR'S SPECIALS MENU (DOTTED CONNECTORS) ── */} +
+
+ +
+ + {/* Left Column: Fine dotted Menu lists */} + + + {t.curatorSpecials} + + + {t.weRecommend} + + + {/* Dotted menu */} +
+ {hizmetler.map((item, idx) => { + const locBeverage = getLocalizedService(item.baslik, item.aciklama); + return ( + +
+ + {locBeverage.title} + + {/* Fine dotted line */} +
+ + $19 + +
+

+ {locBeverage.desc} +

+ + ); + })} +
+
+ + {/* Right Column: Close-up action image counter */} +
+ + {/* Using 8k Chef Plating Smoke image to represent curator mixology and smoky vapor */} + {/* eslint-disable-next-line @next/next/no-img-element */} + Curator liquid smoke mixology stage +
+ +
+ +
+ +
+
+ + {/* ── TESTIMONIALS ── */} +
+
+ +
+ {t.navReviews} +

+ {t.loungeStories} +

+

+ {t.loungeStoriesDesc} +

+
+ + {/* Testimonials 2-Column Grid */} +
+ {yorumlar.map((y, yIdx) => ( + + {/* Rating Stars SVG */} +
+ {[...Array(y.puan)].map((_, starIdx) => ( + + + + ))} +
+ +

+ “{y.yorum}” +

+ +
+
+ {y.yazar.charAt(0)} +
+
+

+ {y.yazar} +

+ + {y.tarih} + +
+
+ +
+ ))} +
+ +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+ + {/* About Column */} +
+ + NoirVelvet + +

+ {firma.slogan} — Classic dark luxury lounge delivering organic mixology under curated acoustic stage lines. +

+
+

+ + + + + {firma.adres} +

+

+ + + + + {firma.email} +

+
+
+ + {/* Hours Column */} +
+

+ {t.loungeHours} +

+
+

{lang === "tr" ? "Pazartesi - Cuma" : "Monday - Friday"}
4:00 PM - 2:00 AM

+

{lang === "tr" ? "Cumartesi - Pazar" : "Saturday - Sunday"}
4:00 PM - 4:00 AM

+
+
+ + {/* Specials Column */} +
+

+ {t.loungeDials} +

+
+ {hizmetler.map((h, hIdx) => { + const locB = getLocalizedService(h.baslik, h.aciklama); + return ( + + {locB.title} {t.signature} + + ); + })} +
+
+ +
+ +
+

© 2026 {firma.adi}. All rights reserved.

+ +
+ +
+
+ + {/* ── FAST TABLE SUCCESS MODAL ── */} + + {showBookingModal && ( + + + {/* Close Button */} + + + {/* Success check indicator */} +
+ + + +
+ +

+ {t.enquiryActive} +

+

+ {t.ambassadorActive} +

+ +

+ {t.enquirySuccess} +

+ + setShowBookingModal(false)} + > + {t.dismiss} + +
+
+ )} +
+ +
+ + ); +} diff --git a/components/templates/BarTemplate2/index.tsx b/components/templates/BarTemplate2/index.tsx new file mode 100644 index 0000000..4786ac2 --- /dev/null +++ b/components/templates/BarTemplate2/index.tsx @@ -0,0 +1,873 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useRef, useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 40 }, + show: { opacity: 1, y: 0, transition: { duration: 0.7, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.1 } }, +}; + +interface DrinkSpec { + name: string; + desc: string; + capacity: string; + alcohol: string; + relax: string; + color: string; +} + +const translations = { + tr: { + navSpecials: "İmza Serisi", + navReserve: "Etkinlik Planla", + navFlights: "Tadım Serileri", + navReviews: "Gurme Yorumları", + scheduleCall: "Görüşme Planla", + ultimateExp: "EŞSİZ KOKTEYL DENEYİMİ", + dedicationTitle: "PROFESYONEL MİKSOLOJİ VE", + dedicationTail: "EL YAPIMI BAĞLILIK", + heroDesc: "Zanaatkar viski tadım uçuşları, kişisel miksoloji eğitimleri ve kurumsal atölye buluşmalarına dahil olun. Ham meşe ağacı ve oyma taş tezgahlar üzerinde hazırlanır.", + scheduleCallBtn: "GÖRÜŞME AYARLA", + artisanalSelections: "SANATSAL SEÇENEKLER", + signatureLiquors: "İmza İksirler", + chooseDrink: "FAVORİ İÇKİNİZİ SEÇİN", + sliderDesc: "Ustalıkla hazırlanan reçetelerimizi inceleyin. Aktif hacim, alkol derecesi ve gevşeme oranlarını görüntüleyin.", + capacity: "HACİM", + alcohol: "ALKOL", + relax: "GEVŞEME", + barrelhouseEvents: "Fıçı Evi Etkinlikleri", + featuredServices: "SEÇKİN HİZMETLER", + learnMore: "DAHA FAZLA KEŞFET →", + masterclassBooking: "Rezervasyon", + scheduleEvent: "BİR ETKİNLİK PLANLAYIN", + formDesc: "Viski tadım serileri veya miksoloji dersleri organize etmek için sommelier koordinatörümüzle iletişime geçin.", + fieldsName: "İsim Soyisim", + fieldsEmail: "E-Posta Adresi", + fieldsPhone: "İrtibat Numarası", + fieldsEvent: "Etkinlik Kategorisi", + fieldsNotes: "Özel İstekler", + fieldsNotesPlaceholder: "Aroma tercihleri veya VIP mihmandar gereksinimleri...", + dispatchRequest: "ETKİNLİK TALEBİNİ GÖNDER", + sommelierReviews: "Gurme Yorumları", + happyGuests: "MİSAFİR DENEYİMLERİ", + happyGuestsDesc: "Yıllanmış tek malt ve fıçı serisi tadım etkinliklerimiz hakkında ne yazdıklarını keşfedin.", + artisanalDials: "SANATSAL SERİ", + vipServices: "VIP HİZMETLER", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Fıçı Koşulları", + dismiss: "KAPAT", + enquiryActive: "TALEBİNİZ GÖNDERİLDİ", + ambassadorActive: "Mihmandar Sommelier Aktif", + enquirySuccess: "Özel fıçı evi tadım/etkinlik talebinizi başarıyla kaydettik. Sertifikalı mihmandarımız tadım parametrelerinizi kesinleştirmek için sizinle iletişime geçecektir. Teşekkürler!", + }, + en: { + navSpecials: "Specials", + navReserve: "Book experience", + navFlights: "Sommelier flights", + navReviews: "Sommelier reviews", + scheduleCall: "Schedule call", + ultimateExp: "THE ULTIMATE COCKTAIL EXPERIENCE", + dedicationTitle: "DEDICATION TO", + dedicationTail: "PROFESSIONAL CRAFT & SPIRIT", + heroDesc: "Indulge in artisanal whiskey flights, custom mixology, and corporate masterclass gatherings. Staged on heavy raw oak and carved stones.", + scheduleCallBtn: "SCHEDULE A CALL", + artisanalSelections: "ARTISANAL SELECTIONS", + signatureLiquors: "Signature Liquors", + chooseDrink: "CHOOSE FAVORITE DRINK", + sliderDesc: "Cycle through our mastercraft recipes. Toggle active stats, proof, and relax levels.", + capacity: "CAPACITY", + alcohol: "ALCOHOL", + relax: "RELAX", + barrelhouseEvents: "Barrelhouse Events", + featuredServices: "FEATURED SERVICES", + learnMore: "LEARN MORE →", + masterclassBooking: "Masterclass booking", + scheduleEvent: "SCHEDULE AN EVENT", + formDesc: "Connect with our sommelier coordinator to arrange whiskey flights or mixology classes.", + fieldsName: "Name", + fieldsEmail: "Email", + fieldsPhone: "Phone", + fieldsEvent: "Event Type", + fieldsNotes: "Special notes", + fieldsNotesPlaceholder: "Flavor preferences or VIP requirements...", + dispatchRequest: "DISPATCH EVENT REQUEST", + sommelierReviews: "Sommelier Reviews", + happyGuests: "HAPPY GUESTS", + happyGuestsDesc: "Hear what craft enthusiasts write about our private aged single malt coordinates.", + artisanalDials: "ARTISANAL DIALS", + vipServices: "VIP SERVICES", + privacyRegs: "Privacy Regulations", + termsStay: "Terms of Cask", + dismiss: "DISMISS", + enquiryActive: "EVENT DISPATCHED", + ambassadorActive: "Barrelhouse Sommelier Active", + enquirySuccess: "We have registered your private barrelhouse coordinate request. A certified somatic host will contact you shortly to confirm whiskey flights or mixology parameters. Thank you!", + } +}; + +export default function BarTemplate2({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], yorumlar = [] } = data; + const [showBookingModal, setShowBookingModal] = useState(false); + const [activeDrink, setActiveDrink] = useState(1); // Mai Tai active by default + const [menuOpen, setMenuOpen] = useState(false); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // 1. Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // 2. Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + const getLocalizedDrinks = () => { + return [ + { + name: lang === "tr" ? "Mojito" : "Mojito", + desc: lang === "tr" ? "Taze beyaz Küba romu, el ezmesi nane yaprakları, organik misket limonu suyu, ham kamış şekeri ve soğuk maden suyu." : "Fresh white cuban rum, hand-crushed spearmint, organic lime juice reduction, raw cane sugar, chilled splash of soda.", + capacity: "350ml", + alcohol: "12%", + relax: "80%", + color: "#00E5FF" + }, + { + name: lang === "tr" ? "Mai Tai" : "Mai Tai", + desc: lang === "tr" ? "Premium Jamaika kehribar romu, üç kez damıtılmış portakal likörü, organik badem şurubu ve taze sıkılmış misket limonu." : "Premium Jamaican amber rum, triple-distilled orange curaçao, organic almond orgeat syrup, fresh lime squeeze.", + capacity: "280ml", + alcohol: "18%", + relax: "90%", + color: "#FF9F00" + }, + { + name: lang === "tr" ? "Rum Cosmo" : "Rum Cosmo", + desc: lang === "tr" ? "Fıçıda yıllanmış koyu rom, dağ kızılcığı infüzyonu, organik portakal likörü ve portakal yağı buğusu." : "Cask-aged dark rum, wild mountain cranberry infusion, organic triple sec, orange oil mist garnish.", + capacity: "200ml", + alcohol: "22%", + relax: "95%", + color: "#FF007A" + } + ]; + }; + + const getLocalizedService = (baslik: string, aciklama: string) => { + if (baslik.toLowerCase().includes("whiskey") || baslik.toLowerCase().includes("flight") || baslik.toLowerCase().includes("tadim")) { + return { + title: lang === "tr" ? "VİSKİ TADIM UÇUŞLARI" : "WHISKEY FLIGHTS", + desc: lang === "tr" ? "Dünyanın en seçkin fıçılarından gelen yıllanmış tek malt ve burbon viski serilerinin özel sunumu." : aciklama + }; + } + if (baslik.toLowerCase().includes("mixology") || baslik.toLowerCase().includes("class") || baslik.toLowerCase().includes("ders")) { + return { + title: lang === "tr" ? "MİKSOLOJİ EĞİTİMLERİ" : "MIXOLOGY CLASSES", + desc: lang === "tr" ? "Profesyonel barmenlerimiz eşliğinde kendi taze şuruplarınızı ve kokteyllerinizi yapmayı öğrenin." : aciklama + }; + } + return { + title: lang === "tr" ? "ÖZEL KOKTEYL HİZMETİ" : "PRIVATE COCKTAIL CATERING", + desc: lang === "tr" ? "Kurumsal lansmanlar, VIP davetler ve butik etkinlikler için özel miksoloji menüsü ve servis ekibi." : aciklama + }; + }; + + const drinks = getLocalizedDrinks(); + + // Custom visual styles & Google Fonts for our Rustic Chalk & Char aesthetic + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,600;0,700;1,400&family=Space+Grotesk:wght@300;400;500;600;700&display=swap'); + + :root { + --color-char-red: #E63946; + --color-char-slate: #111215; + --color-char-card: #18191E; + --color-text-white: #FCFAF7; + --color-text-muted: rgba(252, 252, 247, 0.5); + } + + .font-industrial { + font-family: 'Cormorant Garamond', Georgia, serif; + font-weight: 700; + } + + .font-sans-clean { + font-family: 'Space Grotesk', sans-serif; + } + + .bg-mesh-char { + background-image: + radial-gradient(circle at 10% 20%, rgba(230, 57, 70, 0.04) 0%, transparent 45%), + radial-gradient(circle at 90% 80%, rgba(229, 169, 0, 0.03) 0%, transparent 50%), + linear-gradient(rgba(255, 255, 255, 0.005) 1px, transparent 1px), + linear-gradient(90deg, rgba(255, 255, 255, 0.005) 1px, transparent 1px); + background-size: 100% 100%, 100% 100%, 40px 40px, 40px 40px; + } + + .crimson-glow { + box-shadow: 0 0 20px rgba(230, 57, 70, 0.25); + } + + /* Pulse animation for CTA strip */ + .pulse-glow-crimson { + animation: crimsonPulse 2s infinite; + } + + @keyframes crimsonPulse { + 0% { box-shadow: 0 0 0 0 rgba(230, 57, 70, 0.4); } + 70% { box-shadow: 0 0 0 12px rgba(230, 57, 70, 0); } + 100% { box-shadow: 0 0 0 0 rgba(230, 57, 70, 0); } + } + + .hero-title-clamp { + font-size: clamp(42px, 7.5vw, 100px); + letter-spacing: -0.02em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + CHAR BARRELHOUSE + +
+ +
+ + barrel aged mixology + +
+
+ )} +
+ + {/* ── CHALK & CHAR BARRELHOUSE ── */} +
+ + {/* Floating Ambient Red Orbs */} +
+
+ + {/* ── MANDATORY FLOATING DEMO BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + {/* ── HIGH CONTRAST NAVBAR ── */} + +
+ {/* Logo */} + + + + + + + {firma.adi} + + + + {/* Navigation Links */} + + + {/* Action button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[10px] font-bold tracking-[2.5px] uppercase text-white bg-[#E63946] hover:bg-white hover:text-black px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_5px_15px_rgba(230,57,70,0.2)] hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.scheduleCall} + +
+
+
+ + {/* ── HERO SECTION ── */} +
+
+
+ + {/* Left Column: Heading and description */} + + + + {t.ultimateExp} + + + + {t.dedicationTitle} +
+ {t.dedicationTail} +
+ + + {t.heroDesc} + + + {/* Quick actions */} + + setShowBookingModal(true)} + className="px-8 py-4 rounded-xl bg-[#E63946] hover:bg-white hover:text-black text-white font-bold text-[10px] tracking-[2px] uppercase transition-all shadow-[0_5px_15px_rgba(230,57,70,0.25)] cursor-pointer" + whileHover={{ scale: 1.02 }} + > + {t.scheduleCallBtn} + + + {t.artisanalSelections} + + +
+ + {/* Right Column: High-fidelity image (steak/drink counter) */} +
+ + {/* Using 8k Chef Plating Smoke image to represent premium cask smoking counter */} + {/* eslint-disable-next-line @next/next/no-img-element */} + Char Barrelhouse Cask-Aged Spirits Smoking Counter +
+ +
+ +
+
+
+ + {/* ── ARTISANAL CAROUSEL SLIDER ── */} +
+
+ +
+ {t.signatureLiquors} +

+ {t.chooseDrink} +

+

+ {t.sliderDesc} +

+
+ + {/* Slider container */} +
+ + {/* Left Column: Drink Tabs & Specifications */} +
+ {/* Tabs */} +
+ {drinks.map((d, dIdx) => ( + + ))} +
+ + {/* Active Drink Info */} + + +

+ {drinks[activeDrink].name} +

+

+ {drinks[activeDrink].desc} +

+ + {/* Circular Dials Indicators */} +
+ + {/* Dial 1: Capacity */} +
+ {drinks[activeDrink].capacity} + {t.capacity} +
+ + {/* Dial 2: Alcohol */} +
+ {drinks[activeDrink].alcohol} + {t.alcohol} +
+ + {/* Dial 3: Relax */} +
+ {drinks[activeDrink].relax} + {t.relax} +
+ +
+
+
+
+ + {/* Right Column: Large closeup beverage display */} +
+ + {/* Using 8k lemon/citrus flatlay to represent fresh botanical drink prep */} + {/* eslint-disable-next-line @next/next/no-img-element */} + Fresh citrus botanic preparation +
+ +
+ +
+ +
+
+ + {/* ── FEATURED EXPERIENCES ── */} +
+
+ +
+ {t.barrelhouseEvents} +

+ {t.featuredServices} +

+

+ {lang === "tr" ? "Özel viski tadım uçuşları ve sommelier eğitim paketleri ayırtın." : "Reserve custom whiskey flights and private sommelier masterclass packages."} +

+
+ + {/* Bento Grid layout */} +
+ {hizmetler.map((experience, idx) => { + const locServ = getLocalizedService(experience.baslik, experience.aciklama); + return ( + + {/* Header cover using chef smoke image to represent luxury experience */} +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + {locServ.title} +
+
+ +
+

+ {locServ.title} +

+

+ {locServ.desc} +

+
+ +
+ setShowBookingModal(true)} + className="text-[#E63946] group-hover:text-white transition-colors text-[10px] font-bold tracking-[2px] uppercase flex items-center gap-1.5 cursor-pointer" + > + {t.learnMore} + +
+ + ); + })} +
+ +
+
+ + {/* ── RESERVATION RESERVATION RESERVATION ── */} +
+
+ +
+
+ +
+ {t.masterclassBooking} +

+ {t.scheduleEvent} +

+

+ {t.formDesc} +

+
+ +
+ {[ + { label: t.fieldsName, placeholder: lang === "tr" ? "Adınız Soyadınız" : "Your Name", type: "text", full: false }, + { label: t.fieldsEmail, placeholder: "you@company.com", type: "email", full: false }, + { label: t.fieldsPhone, placeholder: lang === "tr" ? "İrtibat Numarası" : "Contact Number", type: "tel", full: false }, + { label: t.fieldsEvent, placeholder: lang === "tr" ? "Viski Tadım Serisi" : "Whiskey Tasting Flight", type: "text", full: false }, + { label: t.fieldsNotes, placeholder: t.fieldsNotesPlaceholder, type: "text", full: true }, + ].map((field, idx) => ( +
+ + +
+ ))} +
+ + setShowBookingModal(true)} + className="mt-8 w-full py-4.5 rounded-xl bg-[#E63946] hover:bg-white hover:text-black text-white font-bold text-[10px] tracking-[2.5px] uppercase transition-colors cursor-pointer" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.dispatchRequest} + +
+ +
+
+ + {/* ── TESTIMONIALS ── */} +
+
+ +
+ {t.sommelierReviews} +

+ {t.happyGuests} +

+

+ {t.happyGuestsDesc} +

+
+ + {/* Testimonials 2-Column Grid */} +
+ {yorumlar.map((y, yIdx) => ( + + {/* Rating Stars SVG */} +
+ {[...Array(5)].map((_, starIdx) => ( + + + + ))} +
+ +

+ “{y.yorum}” +

+ +
+
+ {y.yazar.charAt(0)} +
+
+

+ {y.yazar} +

+ + {y.tarih} + +
+
+ +
+ ))} +
+ +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+ + {/* About Column */} +
+ + CharBarrel + +

+ {firma.slogan} — Heavy rustic slate-crimson themed barrelhouse coordinates offering masterclass mixology and corporate single malt tastings. +

+
+

+ + + + + {firma.adres} +

+

+ + + + + {firma.email} +

+
+
+ + {/* Dials Column */} +
+

+ {t.artisanalDials} +

+
+ {drinks.map(d => ( + + {d.name} Signature + + ))} +
+
+ + {/* Experiences Column */} +
+

+ {t.vipServices} +

+
+ {hizmetler.map((h, hIdx) => { + const locS = getLocalizedService(h.baslik, h.aciklama); + return ( + + {locS.title} + + ); + })} +
+
+ +
+ +
+

© 2026 {firma.adi}. All rights reserved.

+ +
+ +
+
+ + {/* ── FAST BOOKING SUCCESS MODAL ── */} + + {showBookingModal && ( + + + {/* Close Button */} + + + {/* Success check indicator */} +
+ + + +
+ +

+ {t.enquiryActive} +

+

+ {t.ambassadorActive} +

+ +

+ {t.enquirySuccess} +

+ + setShowBookingModal(false)} + > + {t.dismiss} + +
+
+ )} +
+ +
+ + ); +} diff --git a/components/templates/BodrumCerrahiTemplate/index.tsx b/components/templates/BodrumCerrahiTemplate/index.tsx new file mode 100644 index 0000000..12b64c6 --- /dev/null +++ b/components/templates/BodrumCerrahiTemplate/index.tsx @@ -0,0 +1,1102 @@ +"use client"; + +import { motion, AnimatePresence, useScroll, useTransform } from "framer-motion"; +import { useState, useEffect, useRef } from "react"; +import type { DemoData } from "@/data/demos"; +import AnimatedCounter from "@/components/ui/AnimatedCounter"; + +const E_SMOOTH = [0.25, 0.46, 0.45, 0.94] as [number, number, number, number]; +const E_DRAMATIC = [0.16, 1, 0.3, 1 ] as [number, number, number, number]; + +const fadeUp = { + hidden: { opacity: 0, y: 48 }, + show: { opacity: 1, y: 0, transition: { duration: 0.8, ease: E_SMOOTH } }, +}; +const fadeIn = { + hidden: { opacity: 0 }, + show: { opacity: 1, transition: { duration: 0.6, ease: E_SMOOTH } }, +}; +const fadeLeft = { + hidden: { opacity: 0, x: 40 }, + show: { opacity: 1, x: 0, transition: { duration: 0.8, ease: E_SMOOTH } }, +}; +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.11 } }, +}; +const staggerFast = { + hidden: {}, + show: { transition: { staggerChildren: 0.065 } }, +}; + +function ServiceIcon({ ikon, color }: { ikon: string; color: string }) { + const p = { className: "w-6 h-6 fill-none", viewBox: "0 0 24 24", strokeWidth: "1.7", stroke: color }; + if (ikon === "surgery" || ikon.includes("Cerrahi")) + return ; + if (ikon === "orthopedics" || ikon.includes("Ortopedi")) + return ; + if (ikon === "pediatrics" || ikon.includes("Çocuk")) + return ; + if (ikon === "gynecology" || ikon.includes("Kadın")) + return ; + if (ikon === "neurology" || ikon.includes("Nöroloji")) + return ; + if (ikon === "laboratory" || ikon.includes("Laboratuvar")) + return ; + if (ikon === "radiology" || ikon.includes("Radyoloji")) + return ; + if (ikon === "gastro" || ikon.includes("Gastro")) + return ; + if (ikon === "dietitian" || ikon.includes("Beslenme")) + return ; + return ; +} + +const MARQUEE_A = ["SGK Anlaşmalı", "7/24 Acil Servis", "Uluslararası Hasta", "Modern Ameliyathane", "MR & Tomografi", "Online Randevu", "Engelli Erişimi"]; +const MARQUEE_B = ["Genel Cerrahi", "Ortopedi", "Nöroloji", "Radyoloji", "Çocuk Sağlığı", "Beslenme & Diyet", "GETAT Birimi"]; + +const POLYCLINICS_TR = [ + { name: "Ortopedi ve Travmatoloji", desc: "Menüsküs yırtığı, kırık tedavisi, eklem cerrahisi ve sportif yaralanmalar için uzman yaklaşım." }, + { name: "Çocuk Sağlığı ve Hastalıkları", desc: "Pediatri, büyüme-gelişme takibi, aşı programları ve çocuk enfeksiyon hastalıkları." }, + { name: "Kadın Hastalıkları ve Doğum", desc: "Jinekoloji, gebelik takibi ve kadın sağlığına özel poliklinik hizmetleri." }, + { name: "Genel Cerrahi", desc: "Elektif ve acil cerrahi operasyonlar, ameliyathane ve yatan hasta servisi." }, + { name: "Nöroloji", desc: "Baş ağrısı, migren, epilepsi ve nörolojik hastalıkların tam tanı-tedavi süreci." }, + { name: "Beslenme ve Diyet", desc: "Uzman diyetisyen eşliğinde kişiye özel beslenme programı ve sağlıklı yaşam takibi." }, + { name: "Acil Servis", desc: "7/24 kesintisiz acil tıbbi hizmet, tüm yaş gruplarına anında müdahale kapasitesi." }, + { name: "GETAT Birimi", desc: "Proloterapi, akupunktur, posturoloji ve geleneksel tamamlayıcı tıp uygulamaları." }, +]; +const POLYCLINICS_EN = [ + { name: "Orthopedics & Traumatology", desc: "Meniscus tears, fractures, joint surgery and sports injuries treated by specialists." }, + { name: "Pediatrics", desc: "Child health and development monitoring, vaccination programs and pediatric diseases." }, + { name: "Gynecology & Obstetrics", desc: "Gynecology, pregnancy monitoring and women's health polyclinic services." }, + { name: "General Surgery", desc: "Elective and emergency surgical operations, operating room and inpatient ward." }, + { name: "Neurology", desc: "Headache, migraine, epilepsy and neurological disease diagnosis and treatment." }, + { name: "Nutrition & Dietetics", desc: "Personalized nutrition programs under expert dietitian guidance and lifestyle coaching." }, + { name: "Emergency Service", desc: "24/7 emergency medical service with immediate response capacity for all age groups." }, + { name: "CAIM Unit", desc: "Prolotherapy, acupuncture, posturology and traditional complementary medicine applications." }, +]; + +const TRANSLATIONS = { + tr: { + badge: "ÖZEL TIP MERKEZİ · BODRUM", + heroT1: "Bodrum'un", heroT2: "Sağlığa Adanmış", heroT3: "Öncü Merkezi", + heroDesc: "İleri cerrahi teknolojisi, 12 uzman hekim ve hasta odaklı yaklaşımla; SGK anlaşmalı, 7/24 acil, uluslararası hasta hizmetiyle güvende olun.", + ctaBook: "Online Randevu Al", ctaServices: "Hizmetlerimiz", + navServices: "Hizmetler", navDoctors: "Doktorlar", navPoly: "Poliklinikler", navContact: "İletişim", navBook: "Randevu Al", + floatDoctors: "Uzman Hekim", floatIntl: "Uluslararası Hasta Departmanı", + workTitle: "Çalışma Saatleri", wkdays: "Hafta İçi: 08:30–17:30", saturday: "Cumartesi: 08:30–13:00", sunday: "Pazar: Acil Servis", + statsSection: "Sayılarla Bodrum Cerrahi", + srvTitle: "Tıbbi Birimlerimiz", srvHeader: "UZMANLAŞMIŞ SAĞLIK HİZMETLERİ", + srvDesc: "Ameliyathane, tıbbi laboratuvar, radyoloji birimi ve branş uzmanlarımızla kapsamlı sağlık çözümleri sunuyoruz.", + drTitle: "Uzman Kadromuz", drHeader: "ALANINDA UZMAN HEKİMLER", + drDesc: "Deneyimli cerrahlar, uzman hekimler ve yardımcı sağlık personeliyle profesyonel tedavi.", + drYil: "Yıl", drHasta: "Hasta", + polyTitle: "Poliklinikler", polyHeader: "TIP MERKEZİMİZ BRANŞLARI", + rvwTitle: "Hasta Yorumları", rvwHeader: "HASTALARIMIZ NE DÜŞÜNÜYOR?", + bookTitle: "Online Randevu", bookHeader: "RANDEVUNUZU PLANLAYALIM", + bookDesc: "Formu doldurun, randevu koordinatörümüz sizi 15 dakika içinde arasın ve gününüzü kesinleştirsin.", + fName: "Ad Soyad", fPhone: "Telefon", fEmail: "E-Posta", fDept: "Bölüm", fDate: "Tercih Tarihi", fSubmit: "RANDEVU TALEP ET", + contactTitle: "İrtibat Bilgileri", callCenter: "Danışma Hattı", adresLabel: "Adres", mailLabel: "E-Posta", + emergency: "Acil: 112 · 7/24 Hizmet", + footerDesc: "SGK anlaşmalı, uluslararası hasta hizmetleri sunan Bodrum'un öncü özel tıp merkezi.", + privacy: "Gizlilik Sözleşmesi", terms: "Kullanım Şartları", + deptOptions: ["Genel Cerrahi", "Ortopedi ve Travmatoloji", "Çocuk Sağlığı", "Kadın Hastalıkları", "Nöroloji", "Radyoloji", "Laboratuvar", "Gastroenteroloji", "Beslenme ve Diyet"], + demoBanner: "Bu site demo amaçlıdır — demo.ayristech.com", + }, + en: { + badge: "PRIVATE MEDICAL CENTER · BODRUM", + heroT1: "Bodrum's", heroT2: "Dedicated", heroT3: "Healthcare Leader", + heroDesc: "Advanced surgical technology, 12 specialist physicians, patient-first care — SGK approved, 24/7 emergency and international patient services.", + ctaBook: "Book Appointment", ctaServices: "Our Services", + navServices: "Services", navDoctors: "Doctors", navPoly: "Polyclinics", navContact: "Contact", navBook: "Book Now", + floatDoctors: "Expert Physicians", floatIntl: "International Patient Dept.", + workTitle: "Working Hours", wkdays: "Weekdays: 08:30 – 17:30", saturday: "Saturday: 08:30 – 13:00", sunday: "Sunday: Emergency Only", + statsSection: "Bodrum Cerrahi in Numbers", + srvTitle: "Our Departments", srvHeader: "SPECIALIZED HEALTHCARE SERVICES", + srvDesc: "Surgery, medical laboratory, radiology and specialist physicians offering comprehensive healthcare solutions.", + drTitle: "Our Specialists", drHeader: "EXPERT PHYSICIANS", + drDesc: "Experienced surgeons, specialist physicians and support staff delivering professional treatment.", + drYil: "Yrs", drHasta: "Patients", + polyTitle: "Polyclinics", polyHeader: "MEDICAL CENTER SPECIALTIES", + rvwTitle: "Patient Reviews", rvwHeader: "WHAT OUR PATIENTS SAY", + bookTitle: "Appointment", bookHeader: "SCHEDULE YOUR VISIT", + bookDesc: "Fill in the form and our appointment coordinator will call you within 15 minutes to confirm your slot.", + fName: "Full Name", fPhone: "Phone", fEmail: "Email", fDept: "Department", fDate: "Preferred Date", fSubmit: "REQUEST APPOINTMENT", + contactTitle: "Contact Details", callCenter: "Consultation Line", adresLabel: "Address", mailLabel: "Email", + emergency: "Emergency: 112 · 24/7 Service", + footerDesc: "Bodrum's leading private medical center with SGK approval, 24/7 emergency and international patient services.", + privacy: "Privacy Policy", terms: "Terms of Service", + deptOptions: ["General Surgery", "Orthopedics", "Pediatrics", "Gynecology", "Neurology", "Radiology", "Laboratory", "Gastroenterology", "Nutrition & Dietetics"], + demoBanner: "This website is a demo — demo.ayristech.com", + }, +}; + +export default function BodrumCerrahiTemplate({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], doktorlar = [], yorumlar = [] } = data; + + const [preloader, setPreloader] = useState(true); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [showBooking, setShowBooking] = useState(false); + const [activeReview, setActiveReview] = useState(0); + const [openPoly, setOpenPoly] = useState(0); + + const t = TRANSLATIONS[lang]; + const polyclinics = lang === "tr" ? POLYCLINICS_TR : POLYCLINICS_EN; + + const heroRef = useRef(null); + const { scrollYProgress } = useScroll({ target: heroRef, offset: ["start start", "end start"] }); + const heroImgY = useTransform(scrollYProgress, [0, 1], ["0%", "28%"]); + const heroTextY = useTransform(scrollYProgress, [0, 1], ["0%", "-18%"]); + + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (x: number) => Math.min(1, 1.001 - Math.pow(2, -10 * x)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + useEffect(() => { + const t = setTimeout(() => setPreloader(false), 2400); + return () => clearTimeout(t); + }, []); + + useEffect(() => { + if (yorumlar.length === 0) return; + const iv = setInterval(() => setActiveReview(p => (p + 1) % yorumlar.length), 4800); + return () => clearInterval(iv); + }, [yorumlar.length]); + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,600;0,700;1,300;1,400;1,600;1,700&family=DM+Sans:opsz,wght@9..40,300;9..40,400;9..40,500;9..40,600;9..40,700&display=swap'); + + :root { + --deep: #071629; + --mid: #0F2240; + --accent: #1B6FA8; + --bright: #00B4D8; + --sand: #F4F8FC; + --white: #FFFFFF; + } + + .font-cormorant { font-family: 'Cormorant Garamond', serif; } + .font-dm { font-family: 'DM Sans', sans-serif; } + + .hero-title { + font-family: 'Cormorant Garamond', serif; + font-size: clamp(52px, 7.5vw, 108px); + line-height: 0.92; + letter-spacing: -0.02em; + } + .section-title { + font-family: 'Cormorant Garamond', serif; + font-size: clamp(38px, 5vw, 72px); + line-height: 0.95; + letter-spacing: -0.015em; + } + + .card-glow:hover { + box-shadow: 0 0 0 1px rgba(27,111,168,0.25), 0 24px 48px rgba(27,111,168,0.12); + } + .dr-scroll::-webkit-scrollbar { display: none; } + .dr-scroll { -ms-overflow-style: none; scrollbar-width: none; } + `; + + return ( + <> + + + {/* ── GRAIN OVERLAY ── */} +
+ + {/* ── DEMO BANNER ── */} +
+ + {t.demoBanner} +
+ + {/* ── PRELOADER — Medical cross SVG draw + curtain lift ── */} + + {preloader && ( + + {/* SVG medical cross drawing */} +
+ + + + + +
+ + {/* Loading bar */} +
+ +
+ + + {firma.adi} + +
+ )} +
+ +
+ + {/* ══════════════════════════════════════════════════════════════ + NAVBAR + ══════════════════════════════════════════════════════════════ */} + +
+
+ + {/* Logo */} + +
+ + + + +
+ {firma.adi} +
+ + {/* Nav links */} + + + {/* Right actions */} +
+
+ {(["tr", "en"] as const).map(l => ( + + ))} +
+ setShowBooking(true)} + className="text-[10px] font-bold tracking-[2px] uppercase text-white px-5 py-3 rounded-xl cursor-pointer hidden sm:block" + style={{ background: "linear-gradient(135deg, #1B6FA8, #00B4D8)" }} + whileHover={{ scale: 1.03 }} + whileTap={{ scale: 0.97 }} + > + {t.navBook} + +
+
+
+
+ + {/* ══════════════════════════════════════════════════════════════ + HERO + ══════════════════════════════════════════════════════════════ */} +
+ {/* Ambient orbs */} +
+
+ +
+
+ + {/* Left: Headline */} + + + + {t.badge} + + + + {t.heroT1} +
+ {t.heroT2} +
+ {t.heroT3} +
+ + + {t.heroDesc} + + + {/* Stats row */} + + {istatistikler.map((s, i) => ( +
+

{s.deger}

+

{s.etiket}

+
+ ))} +
+ + {/* CTAs */} + + setShowBooking(true)} + className="flex items-center gap-2.5 px-8 py-4 rounded-xl text-white text-[10px] font-bold tracking-[2px] uppercase cursor-pointer shadow-lg" + style={{ background: "linear-gradient(135deg, #1B6FA8, #00B4D8)", boxShadow: "0 8px 24px rgba(27,111,168,0.35)" }} + whileHover={{ scale: 1.03, boxShadow: "0 12px 32px rgba(27,111,168,0.5)" }} + whileTap={{ scale: 0.97 }} + > + + {t.ctaBook} + + + {t.ctaServices} + + + + {/* Working hours pill */} + + +
+

{t.workTitle}

+
+ {[t.wkdays, t.saturday, t.sunday].map((line, i) => ( +

{line}

+ ))} +
+
+
+
+ + {/* Right: Photography + floating cards */} +
+ + {/* Main image */} +
+ Bodrum Cerrahi Tıp Merkezi +
+
+ + {/* Floating card — doctors */} + +
+ +
+
+

{doktorlar.length}+

+

{t.floatDoctors}

+
+
+ + {/* Floating card — international */} + +
+ +
+
+

{t.floatIntl}

+
+
+ + {/* Emergency badge */} + + +

{t.emergency}

+
+ +
+ +
+
+ + {/* Bottom fade */} +
+
+ + {/* ══════════════════════════════════════════════════════════════ + MARQUEE BAND + ══════════════════════════════════════════════════════════════ */} +
+ {/* Row A — left */} +
+ + {[...MARQUEE_A, ...MARQUEE_A].map((item, i) => ( + + {item} + + + ))} + +
+ {/* Row B — right */} +
+ + {[...MARQUEE_B, ...MARQUEE_B].map((item, i) => ( + + {item} + + + ))} + +
+
+ + {/* ══════════════════════════════════════════════════════════════ + STATS + ══════════════════════════════════════════════════════════════ */} +
+
+ + + {t.statsSection} + + + + {istatistikler.map((s, i) => { + const numericValue = parseInt(s.deger.replace(/\D/g, ""), 10); + const suffix = s.deger.replace(/[\d]/g, "").trim(); + return ( + +

+ {!isNaN(numericValue) ? ( + <> + ) : ( + s.deger + )} +

+

{s.etiket}

+
+ ); + })} +
+
+
+ + {/* ══════════════════════════════════════════════════════════════ + HİZMETLER + ══════════════════════════════════════════════════════════════ */} +
+
+ +
+ + {t.srvTitle} + + + {t.srvHeader.split(" ").slice(0, 2).join(" ")} +
+ {t.srvHeader.split(" ").slice(2).join(" ")} +
+
+ + {t.srvDesc} + +
+ + + {hizmetler.map((h, i) => ( + +
+
+ +
+

{h.baslik}

+

{h.aciklama}

+
+ +
+ ))} +
+
+
+ + {/* ══════════════════════════════════════════════════════════════ + DOKTORLAR (dark section, horizontal scroll) + ══════════════════════════════════════════════════════════════ */} +
+
+ +
+
+ + + {t.drTitle} + + + {t.drHeader} + + + + {t.drDesc} + +
+ + {/* Horizontal scroll cards */} +
+ + {doktorlar.map((doc, i) => ( + + {/* Avatar area */} +
+ + {doc.emoji} + + {/* Rating badge */} +
+ + {doc.puan} +
+
+
+
+

{doc.ad}

+

{doc.uzmanlik}

+
+
+ {doc.yil} {t.drYil} + {doc.hasta}+ {t.drHasta} +
+
+
+ ))} +
+
+
+
+ + {/* ══════════════════════════════════════════════════════════════ + POLİKLİNİKLER (accordion) + ══════════════════════════════════════════════════════════════ */} +
+
+ + + {t.polyTitle} + + + {t.polyHeader} + + + + + {polyclinics.map((poly, i) => ( + + + + {openPoly === i && ( + +
+

{poly.desc}

+ +
+
+ )} +
+
+ ))} +
+
+
+ + {/* ══════════════════════════════════════════════════════════════ + YORUMLAR + ══════════════════════════════════════════════════════════════ */} +
+
+ + + {t.rvwTitle} + + + {t.rvwHeader} + + + +
+ + + {/* Stars */} +
+ {[...Array(yorumlar[activeReview]?.puan ?? 5)].map((_, i) => ( + + + + ))} +
+ + {/* Quote mark */} +

+ +

+ {yorumlar[activeReview]?.yorum} +

+ +
+
+ {yorumlar[activeReview]?.yazar.charAt(0)} +
+
+

{yorumlar[activeReview]?.yazar}

+

{yorumlar[activeReview]?.tarih}

+
+
+
+
+ + {/* Dots */} +
+ {yorumlar.map((_, i) => ( + setActiveReview(i)} + className="rounded-full cursor-pointer transition-all" + style={{ + width: i === activeReview ? 24 : 8, + height: 8, + background: i === activeReview ? "#1B6FA8" : "rgba(7,22,41,0.15)", + }} + whileHover={{ scale: 1.2 }} + /> + ))} +
+
+
+
+ + {/* ══════════════════════════════════════════════════════════════ + RANDEVU CTA (full-bleed image) + ══════════════════════════════════════════════════════════════ */} +
+ {/* Background image */} +
+ +
+
+ +
+
+ + {/* Left: Contact info */} + + + {t.bookTitle} + + + {t.bookHeader} + + + {t.bookDesc} + + + + {[ + { icon: "📞", label: t.callCenter, value: firma.telefon }, + { icon: "📍", label: t.adresLabel, value: firma.adres }, + { icon: "✉️", label: t.mailLabel, value: firma.email }, + ].map(item => ( +
+ {item.icon} +
+

{item.label}

+

{item.value}

+
+
+ ))} +
+ + {/* Certifications */} + + {["SGK Anlaşmalı", "Bodrum Belediyesi", "Muğla Tabip Odası"].map(cert => ( + + {cert} + + ))} + +
+ + {/* Right: Appointment form */} + +

{t.bookTitle}

+
+ {[ + { label: t.fName, placeholder: lang === "tr" ? "Ad Soyad" : "Full Name", type: "text", full: false }, + { label: t.fPhone, placeholder: "0252 xxx xx xx", type: "tel", full: false }, + { label: t.fEmail, placeholder: "info@mail.com", type: "email", full: false }, + { label: t.fDept, placeholder: "", type: "select", full: false }, + { label: t.fDate, placeholder: "", type: "date", full: false }, + ].map((field, i) => ( +
+ + {field.type === "select" ? ( + + ) : ( + + )} +
+ ))} +
+ setShowBooking(true)} + className="mt-5 w-full py-4 rounded-xl text-white font-bold text-[10px] tracking-[2.5px] uppercase cursor-pointer shadow-lg" + style={{ background: "linear-gradient(135deg, #1B6FA8, #00B4D8)" }} + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + 📅 {t.fSubmit} + +
+ +
+
+
+ + {/* ══════════════════════════════════════════════════════════════ + FOOTER + ══════════════════════════════════════════════════════════════ */} +
+
+
+ {/* Brand */} +
+
+
+ + + + +
+ {firma.adi} +
+

{t.footerDesc}

+
+

📍 {firma.adres}

+

📞 {firma.telefon}

+

✉️ {firma.email}

+
+
+ + {/* Services */} +
+

{t.navServices}

+ {hizmetler.slice(0, 5).map((h, i) => ( + {h.baslik} + ))} +
+ + {/* Navigation */} +
+

{lang === "tr" ? "Kurumsal" : "Corporate"}

+ {[t.navServices, t.navDoctors, t.navPoly, t.navContact].map(item => ( + {item} + ))} +
+
+ +
+

© 2026 {firma.adi}. {lang === "tr" ? "Tüm hakları saklıdır." : "All rights reserved."}

+
+ {t.privacy} + · + {t.terms} +
+
+
+
+ +
+ + {/* ══════════════════════════════════════════════════════════════ + BOOKING MODAL + ══════════════════════════════════════════════════════════════ */} + + {showBooking && ( + setShowBooking(false)} + > + e.stopPropagation()} + > + + +
+ + + + +
+ +

{t.bookTitle}

+

{lang === "tr" ? "Koordinatörümüz sizi arayacak." : "Our coordinator will call you back."}

+ +
+
+ + +
+
+ + +
+ setShowBooking(false)} + > + {lang === "tr" ? "Gönder" : "Submit"} + +
+
+
+ )} +
+ + ); +} diff --git a/components/templates/ChatbotTemplate/index.tsx b/components/templates/ChatbotTemplate/index.tsx new file mode 100644 index 0000000..8800b42 --- /dev/null +++ b/components/templates/ChatbotTemplate/index.tsx @@ -0,0 +1,1143 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useRef, useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.1 } }, +}; + +interface ChatMessage { + sender: "bot" | "user"; + text: string; +} + +const translations = { + tr: { + navSim: "AI Simülatörü", + navInteg: "Entegrasyonlar", + navFeatures: "Özellikler", + navReviews: "Yorumlar", + navPricing: "Planlar", + signUp: "Kayıt Ol", + badge: "VAATBOT COSMIC AI SAAS", + heroTitlePart1: "SİTENİZE", + heroTitlePart2: "AI CHATBOT", + heroTitlePart3: "EKLEYİN", + heroDesc: "Özel yapay zekayı 2 dakikadan kısa sürede sitenize entegre edin. Cybernetic botlarımız veri tabanlarınızdan, dökümanlarınızdan ve web bağlantılarınızdan doğrudan öğrenerek %100 doğru yanıtları garanti eder.", + accuracyLabel: "HATA PAYI %0", + accuracyText: "Zendesk, Notion ve web sitenizle eğitilerek sıfır halüsinasyon sağlar.", + speedLabel: "3x DAHA HIZLI", + speedText: "Slack, WhatsApp ve Web widget'larında 600ms altında yanıt süresi.", + bounceLabel: "-20% ÇIKMA ORANI", + bounceText: "Ziyaretçileri sayfada tutarak abone dönüşümlerini anında ikiye katlar.", + getStartedFree: "Ücretsiz Başla", + integrations: "Entegrasyonlar", + platformsTitle: "Esnek Platformlar", + platformsHeader: "ESNEK ENTEGRASYONLAR", + platformsDesc: "Kanalları sorunsuz bir şekilde değiştirin. Yapay zeka sohbet robotunuzu tüm platformlara dakikalar içinde kurun.", + tabWidget: "Web Chat Widget'ı", + tabSlack: "Slack Çalışma Alanı", + tabWhatsapp: "WhatsApp Business", + scriptTitle: "HTML ENTEGRASYON KODU", + scriptDesc: "Tek yapmanız gereken bu hafif script etiketini sitenizin gövdesine eklemektir. Tarayıcı önbelleğini destekler ve sıfır gecikme yükü getirir.", + featuresTitle: "Premium Değerler", + featuresHeader: "TEMEL ÖZELLİKLER", + featuresDesc: "Binlerce SaaS girişimi ve kurumsal destek platformunun VaatBot altyapısını tercih etme nedenleri.", + reviewsTitle: "Değerlendirmeler", + reviewsHeader: "MUTLU MÜŞTERİLER", + reviewsDesc: "Şirket kurucularının ve tasarımcıların otomatik destek sistemlerimiz hakkındaki yorumları.", + pricingTitle: "Karşılaştırmalı Planlar", + pricingHeader: "FİYATLANDIRMA PLANLARI", + pricingDesc: "Ziyaretçiden aboneye dönüşüm akışını hızlandıracak şeffaf fiyatlandırma yapısı.", + planFree: "Ücretsiz Paket", + planFreeDesc: "Temel bir sohbet robotu eklemek isteyen girişimler için. 5 adede kadar web bağlantısını indeksler.", + planGrowth: "Büyüme Paketi", + planGrowthDesc: "Ölçeklenen işletmeler ve öncelikli destek için. Notion, Slack entegrasyonu ve özel markalama içerir.", + planEnt: "Kurumsal Paket", + planEntDesc: "KVKK uyumluluğu, şirket içi veri tabanları ve anlık senkronizasyon gerektiren kurumsal platformlar için.", + bestValue: "EN POPÜLER", + choosePlan: "PLANI SEÇ", + month: "AYLIK", + footerDesc: "Notion veri tabanlarını, API belgelerini ve destek makalelerini indeksleyerek 600 milisaniyenin altında doğrulanmış yanıt garantisi sunan derin kozmik AI sohbet asistanı.", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Kullanım Şartları", + dismiss: "KAPAT", + startIntegration: "ENTEGRASYONU BAŞLAT", + sandboxToken: "Sandbox Anahtarı Oluşturuldu", + webLabel: "Web Sitesi Adresi", + emailLabel: "İletişim E-Postası", + generate: "KODLARI ÜRET", + welcomeMsg: "Merhaba! VaatBot AI'a hoş geldiniz. Bugün size nasıl yardımcı olabilirim?", + welcomeHelp: "Bana 50+ dil desteğimizi, 600ms altındaki yanıt hızımızı veya %100 doğruluk oranımızı sorabilirsiniz!", + botTyping: "Yazıyor...", + inputPlaceholder: "Doğruluk, fiyatlar veya diller hakkında sorun...", + readyToSupercharge: "DESTEK SİSTEMİNİZİ YAPAY ZEKA İLE GÜÇLENDİRMEYE HAZIR MISINIZ?", + startIntegBtn: "ENTEGRASYONU ŞİMDİ BAŞLAT", + customizerTitle: "Özel Markalama", + customizerDesc: "Renkleri, isimleri, avatarları ve karşılama mesajlarını kurumsal kimliğinize göre tamamen uyarlayın.", + languagesTitle: "50+ Dil Desteği", + languagesDesc: "İngilizce, İspanyolca, Türkçe ve daha fazlasını kapsayan 50'den fazla dilde müşterilerinizle akıcı konuşun.", + widgetsTitle: "Esnek Widget", + widgetsDesc: "Temiz kopyala-yapıştır script etiketimizi veya özelleştirilebilir iframe kapsayıcılarımızı saniyeler içinde kurun.", + industriesTitle: "Tüm Sektörler", + industriesDesc: "E-ticaret, SaaS, Emlak, Sağlık Klinikleri ve Müşteri Destek kanalları için yüksek düzeyde optimize edilmiştir.", + }, + en: { + navSim: "AI Simulator", + navInteg: "Integrations", + navFeatures: "Core Features", + navReviews: "Reviews", + navPricing: "Plans", + signUp: "Sign Up", + badge: "VAATBOT COSMIC AI SAAS", + heroTitlePart1: "ADD FREE", + heroTitlePart2: "AI CHATBOT", + heroTitlePart3: "TO YOUR SITE", + heroDesc: "Deploy custom intelligence in under 2 minutes. Our verified cybernetic bots learn directly from your databases, documents, and web links to guarantee 100% accurate responses.", + accuracyLabel: "0% ERROR RATE", + accuracyText: "Trained on Zendesk, Notion, and your website URLs to achieve zero hallucination.", + speedLabel: "3x FASTER CHAT", + speedText: "Sub-600ms latency responses across Slack, WhatsApp, and Web widgets.", + bounceLabel: "-20% BOUNCE RATE", + bounceText: "Keep visitors deeply engaged and instantly double visitor-to-lead subscription rates.", + getStartedFree: "Get Started Free", + integrations: "Integrations", + platformsTitle: "Flexible Platforms", + platformsHeader: "FLEXIBLE INTEGRATIONS", + platformsDesc: "Switch channels seamlessly. Deploy custom chat intelligence in minutes across all platforms.", + tabWidget: "Web Chat Widget", + tabSlack: "Slack Workspace", + tabWhatsapp: "WhatsApp Business", + scriptTitle: "HTML INTEGRATION SCRIPT", + scriptDesc: "Simply copy and paste this lightweight async JS script tag into your body. Highly optimized with zero load latency.", + featuresTitle: "Premium Values", + featuresHeader: "CORE FEATURES", + featuresDesc: "Why thousands of SaaS startups and corporate support platforms rely on our bot layers.", + reviewsTitle: "Reviews", + reviewsHeader: "HAPPY CLIENTS", + reviewsDesc: "Hear what designers and company founders say about their automated support loops.", + pricingTitle: "Comparative Plans", + pricingHeader: "PRICING PLANS", + pricingDesc: "Clear pricing structure designed to supercharge visitor-to-lead subscription streams.", + planFree: "Free Tier", + planFreeDesc: "For startups looking to add a basic custom widget. Index up to 5 web links.", + planGrowth: "Growth Tier", + planGrowthDesc: "For scaling businesses wanting priority support. Index Notion, Slack threads & custom branding.", + planEnt: "Enterprise Tier", + planEntDesc: "For corporate platforms requiring GDP alignment, on-prem databases, and instant sync.", + bestValue: "BEST VALUES", + choosePlan: "CHOOSE PLAN", + month: "MONTH", + footerDesc: "Deep cosmic cybernetic AI chatbot layer indexing Notion databases and Zendesk support lines with sub-second response guarantees.", + privacyRegs: "Privacy Policy", + termsStay: "Terms of Service", + dismiss: "DISMISS", + startIntegration: "START INTEGRATION", + sandboxToken: "Free Sandbox Token Issued", + webLabel: "Website URL", + emailLabel: "Contact Email", + generate: "GENERATE SCRIPTS", + welcomeMsg: "Hello! Welcome to VaatBot AI. How can I help you today?", + welcomeHelp: "Ask me about my 50+ languages support, our sub-second response times, or how we achieve 100% accuracy!", + botTyping: "Typing...", + inputPlaceholder: "Ask about accuracy, prices, or languages...", + readyToSupercharge: "READY TO SUPERCHARGE YOUR SUPPORT WITH AI?", + startIntegBtn: "START INTEGRATION NOW", + customizerTitle: "Brand Customizer", + customizerDesc: "Tailor colors, names, avatars, and greetings to fully respect your corporate branding system.", + languagesTitle: "50+ Languages", + languagesDesc: "Speaks your customer's native tongue fluently, spanning English, Spanish, Turkish, and more.", + widgetsTitle: "Flexible Widget", + widgetsDesc: "Deploy in seconds using our clean copy-paste JS script tag or customizable iframe containers.", + industriesTitle: "Any Industry", + industriesDesc: "Highly optimized for E-commerce, SaaS, Real Estate, Health Clinics, and Customer Support channels.", + } +}; + +export default function ChatbotTemplate({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], yorumlar = [] } = data; + const [showBookingModal, setShowBookingModal] = useState(false); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // Live Chat Simulator State + const [messages, setMessages] = useState([]); + const [inputVal, setInputVal] = useState(""); + const [isTyping, setIsTyping] = useState(false); + const chatEndRef = useRef(null); + + // Platform Integration Selector State + const [activePlatform, setActivePlatform] = useState<"widget" | "slack" | "whatsapp">("widget"); + + // Initial welcome messages + useEffect(() => { + setMessages([ + { sender: "bot", text: t.welcomeMsg }, + { sender: "bot", text: t.welcomeHelp }, + ]); + }, [lang, t.welcomeMsg, t.welcomeHelp]); + + // Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (x: number) => Math.min(1, 1.001 - Math.pow(2, -10 * x)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Scroll chat to bottom on new messages + useEffect(() => { + chatEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }, [messages, isTyping]); + + // Handles Simulated Bot Responses + const handleSendMessage = (e: React.FormEvent) => { + e.preventDefault(); + if (!inputVal.trim() || isTyping) return; + + const userText = inputVal; + setMessages((prev) => [...prev, { sender: "user", text: userText }]); + setInputVal(""); + setIsTyping(true); + + setTimeout(() => { + let botResponse = ""; + const lower = userText.toLowerCase(); + + if (lower.includes("lang") || lower.includes("dil") || lower.includes("lisan")) { + botResponse = lang === "tr" + ? "50'den fazla dili akıcı bir şekilde destekliyorum! Müşterinin Türkçe, İngilizce veya İspanyolca konuştuğunu otomatik olarak algılayıp gerçek zamanlı çeviri yaparım." + : "I support 50+ languages fluently! I automatically detect if a customer speaks Turkish, English, Spanish, or German, and translate in real-time."; + } else if (lower.includes("price") || lower.includes("fiyat") || lower.includes("ücret") || lower.includes("plan")) { + botResponse = lang === "tr" + ? "Hemen başlamanız için ücretsiz bir sürümümüz ($0) ve özel markalama, Notion entegrasyonu sunan bir Büyüme Paketimiz ($49/ay) mevcuttur!" + : "We have a Free Tier ($0) to get you started instantly, and a Growth Tier ($49/mo) which adds custom branding and support for up to 10k monthly active chats!"; + } else if (lower.includes("accuracy") || lower.includes("doğru") || lower.includes("hata") || lower.includes("güven")) { + botResponse = lang === "tr" + ? "Sıfır hata garantisi veriyoruz! Notion dökümanlarınızı, destek makalelerinizi ve şirket içi bağlantılarınızı indeksleyerek yalnızca doğrulanmış gerçeklerle yanıt veririm." + : "We guarantee 100% accuracy! By indexing your custom website URLs, PDF files, and Zendesk support hubs, we answer only using verified facts, ensuring zero hallucinations."; + } else { + botResponse = lang === "tr" + ? "Harika bir soru! Veri tabanlarınıza ve API belgelerinize doğrudan bağlanıp doğrulanmış şirket verilerinizle 600 milisaniyenin altında yanıt veriyorum." + : "That is a great question! VaatBot AI connects directly to your databases, Notion files, and API docs to respond with verified company facts in under 600 milliseconds."; + } + + setMessages((prev) => [...prev, { sender: "bot", text: botResponse }]); + setIsTyping(false); + }, 1200); + }; + + // Localized statistics label mappings + const getLocalizedStatLabel = (deger: string) => { + if (deger.includes("Accuracy")) return t.accuracyLabel; + if (deger.includes("Faster")) return t.speedLabel; + return t.bounceLabel; + }; + + const getLocalizedStatText = (deger: string) => { + if (deger.includes("Accuracy")) return t.accuracyText; + if (deger.includes("Faster")) return t.speedText; + return t.bounceText; + }; + + // Custom vector icons for chatbot values (No raw emojis) + const getIconSvg = (name: string) => { + switch (name) { + case "languages": + return ( + + + + ); + case "customizer": + return ( + + + + ); + case "widgets": + return ( + + + + ); + case "industries": + return ( + + + + ); + default: + return ( + + + + ); + } + }; + + const getBentoServiceText = (ikon: string) => { + switch (ikon) { + case "languages": return { title: t.languagesTitle, desc: t.languagesDesc }; + case "customizer": return { title: t.customizerTitle, desc: t.customizerDesc }; + case "widgets": return { title: t.widgetsTitle, desc: t.widgetsDesc }; + default: return { title: t.industriesTitle, desc: t.industriesDesc }; + } + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Sora:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;700&display=swap'); + + :root { + --color-neon-cyan: #00E5FF; + --color-neon-pink: #FF007A; + --color-neon-purple: #BD00FF; + --color-space-black: #080710; + --color-space-card: rgba(18, 20, 30, 0.45); + --color-space-border: rgba(255, 255, 255, 0.08); + } + + .font-sora-premium { + font-family: 'Sora', sans-serif; + } + + .font-mono-code { + font-family: 'JetBrains Mono', monospace; + } + + .bg-mesh-cosmic { + background-image: + radial-gradient(circle at 10% 20%, rgba(0, 229, 255, 0.04) 0%, transparent 45%), + radial-gradient(circle at 90% 80%, rgba(255, 0, 122, 0.03) 0%, transparent 50%), + linear-gradient(rgba(255, 255, 255, 0.005) 1px, transparent 1px), + linear-gradient(90deg, rgba(255, 255, 255, 0.005) 1px, transparent 1px); + background-size: 100% 100%, 100% 100%, 60px 60px, 60px 60px; + } + + .neon-cyan-glow { + box-shadow: 0 0 30px rgba(0, 229, 255, 0.15); + } + + .text-gradient-cyan-pink { + background: linear-gradient(90deg, #00E5FF, #FF007A); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + + .hero-title-clamp { + font-size: clamp(34px, 5.5vw, 85px); + letter-spacing: -0.02em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + VAATBOT CYBERNETICS + +
+ +
+ + COSMIC AI PROTOXY + +
+
+ )} +
+ +
+ + {/* Ambient mesh grid */} +
+ + {/* Ambient Orbs */} +
+
+ + {/* ── FLOATING CONCEPT BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + {/* ── FLOATING GLASS HEADER ── */} + +
+ {/* Logo */} + +
+ + + +
+ + VAATBOT + +
+ + {/* Navigation Links */} + + + {/* Language Selector + Signup Button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[10px] font-black tracking-[2px] uppercase text-black bg-[#00E5FF] hover:bg-white px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_5px_15px_rgba(0,229,255,0.25)] hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.signUp} + +
+
+
+ + {/* ── HERO & INTERACTIVE SANDBOX SECTION ── */} +
+
+
+ + {/* Left Column: Heading and high-impact metric counters */} + + + + {t.badge} + + + + {t.heroTitlePart1} +
+ {t.heroTitlePart2} +
+ {t.heroTitlePart3} +
+ + + {t.heroDesc} + + + {/* Accuracy & response blocks */} + + {istatistikler.map((stat, sIdx) => ( +
+
{getLocalizedStatLabel(stat.etiket)}
+
{getLocalizedStatText(stat.etiket)}
+
+ ))} +
+ + {/* Call-to-actions */} + + setShowBookingModal(true)} + className="px-8 py-4.5 rounded-xl bg-[#00E5FF] hover:bg-white text-black font-black text-[10px] tracking-[2px] uppercase transition-all shadow-[0_5px_15px_rgba(0,229,255,0.3)] cursor-pointer" + whileHover={{ scale: 1.02 }} + > + {t.getStartedFree} + + + {t.integrations} + + +
+ + {/* Right Column: Live Chat Sandbox & Flying Robot Mascot */} +
+ + {/* Floating Robot mascot overlap */} + + {/* eslint-disable-next-line @next/next/no-img-element */} + VaatBot AI 3D mascot + + + {/* Chatbox Sandbox Container */} + + {/* Top Bar */} +
+
+ +
+
VAATBOT SANDBOX
+
100% ACCURACY ACTIVE
+
+
+ {/* Visual platform icon */} +
+ 🤖 +
+
+ + {/* Message Stream */} +
+ {messages.map((msg, mIdx) => ( +
+
+ {msg.text} +
+
+ ))} + + {/* Typing Indicator */} + {isTyping && ( +
+
+ + + +
+
+ )} +
+
+ + {/* Input Form */} +
+ setInputVal(e.target.value)} + placeholder={t.inputPlaceholder} + className="grow px-4 py-3.5 rounded-xl border border-white/5 bg-[#080710] text-xs text-white placeholder-white/20 focus:outline-none focus:border-[#00E5FF] focus:ring-1 focus:ring-[#00E5FF] font-medium" + /> + +
+ + +
+ +
+
+
+ + {/* ── SECTION 2: INTERACTIVE INTEGRATION TOGGLE ── */} +
+
+ +
+ {t.platformsTitle} +

+ {t.platformsHeader} +

+

+ {t.platformsDesc} +

+
+ + {/* Platform Selector Tabs */} +
+ {[ + { id: "widget", label: t.tabWidget, icon: "🌐" }, + { id: "slack", label: t.tabSlack, icon: "💬" }, + { id: "whatsapp", label: t.tabWhatsapp, icon: "📱" }, + ].map((p) => ( + + ))} +
+ + {/* Preview Area container */} +
+ + {activePlatform === "widget" && ( + +
+
{t.scriptTitle}
+ + {` +`} + +
+

+ {t.scriptDesc} +

+
+ )} + + {activePlatform === "slack" && ( + + {/* Slack Header */} +
+
# slack-workspace
+ Channel Integration +
+ {/* Thread */} +
+
+
U
+
+

User 11:34 AM

+

@VaatBot {lang === "tr" ? "doğruluk garantimiz nedir?" : "what is our accuracy guarantee?"}

+
+
+
+
🤖
+
+

VaatBot APP

+

+ {lang === "tr" + ? "Yüklenen Notion belgeleriniz, destek dökümanlarınız ve web bağlantılarınız üzerinden doğrudan eğitiliyoruz. Bu sayede kanallarda %100 doğru yanıtları garanti ediyoruz!" + : "We are trained directly on your uploaded Notion docs, Zendesk files, and web links to guarantee 100% accurate responses in Slack channels!"} +

+
+
+
+
+ )} + + {activePlatform === "whatsapp" && ( + + {/* Phone Header */} +
+
🤖
+
+

VaatBot Business

+ online +
+
+ {/* Chat */} +
+
+
+ {lang === "tr" ? "Merhaba! Destek sorunuzu iletin." : "Hello! Ask me any support question."} +
+
+
+
+ {lang === "tr" ? "Destek biletini İspanyolca'ya çevir." : "Translate the customer support ticket to Spanish."} +
+
+
+
+ {lang === "tr" ? "¡Por supuesto! Destek bileti İspanyolca'ya çevrilerek iletildi." : "¡Por supuesto! The support ticket has been translated and dispatched."} +
+
+
+
+ )} +
+
+ +
+
+ + {/* ── BENTO FEATURES GRID ── */} +
+
+ +
+ {t.featuresTitle} +

+ {t.featuresHeader} +

+

+ {t.featuresDesc} +

+
+ + {/* Bento Grid */} +
+ {hizmetler.map((hizmet, hIdx) => { + const item = getBentoServiceText(hizmet.ikon); + return ( + +
+ {getIconSvg(hizmet.ikon)} +
+ +

+ {item.title} +

+

+ {item.desc} +

+
+ ); + })} +
+ +
+
+ + {/* ── TESTIMONIALS ── */} +
+
+ +
+ {t.reviewsTitle} +

+ {t.reviewsHeader} +

+

+ {t.reviewsDesc} +

+
+ + {/* Testimonials 2-Column Grid */} +
+ {yorumlar.map((y, yIdx) => ( + + {/* Rating Stars SVG */} +
+ {[...Array(5)].map((_, starIdx) => ( + + + + ))} +
+ +

+ “{y.yorum}” +

+ +
+
+ {y.yazar.charAt(0)} +
+
+

+ {y.yazar} +

+ + {y.tarih} + +
+
+ +
+ ))} +
+ +
+
+ + {/* ── SECTION 5: PRICING PLANS (Comparative pricing cards) ── */} +
+
+ +
+ {t.pricingTitle} +

+ {t.pricingHeader} +

+

+ {t.pricingDesc} +

+
+ + {/* Three Pricing Cards */} +
+ {[ + { title: t.planFree, price: "$0", desc: t.planFreeDesc, popular: false }, + { title: t.planGrowth, price: "$49", desc: t.planGrowthDesc, popular: true }, + { title: t.planEnt, price: "Custom", desc: t.planEntDesc, popular: false } + ].map((plan, pIdx) => ( + + {plan.popular && ( +
+ {t.bestValue} +
+ )} + +
+

+ {plan.title} +

+

+ {plan.desc} +

+
+ +
+ {/* Price display */} +
+ {plan.price} + / {t.month} +
+ + setShowBookingModal(true)} + className={`w-full py-4 rounded-xl font-black text-xs uppercase tracking-widest transition-all cursor-pointer ${ + plan.popular + ? "bg-[#00E5FF] hover:bg-white text-black shadow-md" + : "bg-[#080710] hover:bg-white/5 text-white/70 border border-white/5 hover:border-white/10" + }`} + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.choosePlan} + +
+ +
+ ))} +
+ +
+
+ + {/* ── BOTTOM BANNER ── */} +
+
+

+ {t.readyToSupercharge} +

+ setShowBookingModal(true)} + className="inline-flex items-center gap-3 px-8 py-4 bg-black hover:bg-white text-white hover:text-black rounded-xl font-mono-code font-black tracking-widest uppercase transition-all shadow-[0_5px_15px_rgba(0,0,0,0.3)] text-xs cursor-pointer" + whileHover={{ scale: 1.02 }} + > + {t.startIntegBtn} + +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+ + {/* About Column */} +
+ + VAATBOT + +

+ {firma.slogan} — {t.footerDesc} +

+
+

+ + + + + {firma.adres} +

+

+ + + + + {firma.email} +

+
+
+ + {/* Integrations Column */} + + + {/* Navigation Column */} +
+

+ USEFUL LINKS +

+
+ {[t.navSim, t.navPricing, t.navFeatures, t.navReviews].map(item => ( + + {item} + + ))} +
+
+ +
+ +
+

© 2026 {firma.adi}. All rights reserved.

+ +
+ +
+
+ + {/* ── FAST SIGN UP MODAL ── */} + + {showBookingModal && ( + + + {/* Close Button */} + + + {/* Success check indicator */} +
+ + + +
+ +

+ {t.startIntegration} +

+

+ {t.sandboxToken} +

+ +
+
+ + +
+
+ + +
+
+ + setShowBookingModal(false)} + > + {t.generate} + +
+
+ )} +
+ +
+ + ); +} diff --git a/components/templates/ChatbotTemplate2/index.tsx b/components/templates/ChatbotTemplate2/index.tsx new file mode 100644 index 0000000..413b568 --- /dev/null +++ b/components/templates/ChatbotTemplate2/index.tsx @@ -0,0 +1,1030 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useState, useEffect, useRef } from "react"; +import type { DemoData } from "@/data/demos"; + +interface ChatbotTemplate2Props { + data: DemoData; +} + +interface Message { + sender: "bot" | "user"; + text: string; +} + +const translations = { + tr: { + features: "Özellikler", + simulator: "AI Simülatörü", + integrations: "Entegrasyonlar", + pricing: "Planlar", + reviews: "Yorumlar", + tryNow: "Hemen Dene", + badge: "ZENITH COGNITIVE ENGINE V2.0", + heroTitle1: "Özel Bilginizle Eğitilmiş", + heroTitle2: "Sıfır Hatalı Yapay Zekâ", + heroDesc: "Zenith AI; web sitenizi, dokümanlarınızı ve Notion sayfalarınızı saniyeler içinde analiz eder. %99.4 doğruluk oranıyla halüsinasyonsuz, 240ms altında çalışan ultra hızlı bir chatbot oluşturur.", + startBtn: "Ücretsiz Başlat", + exploreBtn: "Entegrasyonları Gör", + sandboxTitle: "Zenith AI Arayüzü", + statusOnline: "Çevrimiçi & Aktif", + suggest1: "Semantik İndeksleme nedir?", + suggest2: "Hangi kanalları destekler?", + suggest3: "Sıfır halüsinasyon garantisi", + typing: "Yapay zeka yanıt üretiyor...", + inputPlaceholder: "Zenith AI'a bir soru sorun...", + terminalTitle: "Zenith AI Semantik Konsol", + terminalRunBtn: "Bilgi Tabanını İndeksle", + featuresHeader: "Yapay Zeka Destekli Kabiliyetler", + featuresSub: "Bento yapısında kurgulanmış üst segment altyapı mimarisi.", + integrationsHeader: "Tam Entegre Çalışma Ortamı", + integrationsSub: "Kullandığınız kurumsal araçlarla ve mesajlaşma kanallarıyla saniyeler içinde senkronize edin.", + pricingHeader: "Şeffaf Fiyatlandırma", + pricingSub: "İşletmenizin büyüklüğüne göre ölçeklenebilen esnek abonelik planları.", + reviewsHeader: "Görüşler", + reviewsSub: "Zenith AI altyapısını kullanan lider ekiplerin gerçek deneyimleri.", + footerText: "Bilgi tabanınızı semantik indekslerle saniyeler içinde analiz edip 240ms altında doğrulanmış yanıtlar sunan yeni nesil yapay zekâ sohbet asistanı.", + privacy: "Gizlilik Politikası", + terms: "Kullanım Şartları", + tryModalTitle: "Zenith AI Sandbox Deneyimi", + tryModalDesc: "Kendi web siteniz ve e-posta adresinizle hemen bir deneme anahtarı oluşturun ve sitenize ekleyebileceğiniz script kodunu kopyalayın.", + urlLabel: "Web Siteniz", + emailLabel: "E-Posta Adresiniz", + generateBtn: "Sandbox Kodunu Üret", + tokenTitle: "Sandbox Kodunuz Hazır", + tokenDesc: "Aşağıdaki script kodunu web sitenizin etiketinin kapanışından hemen önce yapıştırın.", + copyBtn: "Kodu Kopyala", + copied: "Kopyalandı!", + closeBtn: "Kapat" + }, + en: { + features: "Features", + simulator: "AI Simulator", + integrations: "Integrations", + pricing: "Pricing", + reviews: "Reviews", + tryNow: "Try Now", + badge: "ZENITH COGNITIVE ENGINE V2.0", + heroTitle1: "AI Chatbot Trained on", + heroTitle2: "Your Brand Knowledge", + heroDesc: "Zenith AI parses your website, documents, and Notion databases in seconds. It guarantees 99.4% accurate customer responses with sub-240ms latency and zero hallucination.", + startBtn: "Get Started Free", + exploreBtn: "Explore Integrations", + sandboxTitle: "Zenith AI Widget", + statusOnline: "Online & Active", + suggest1: "What is semantic indexing?", + suggest2: "Which channels are supported?", + suggest3: "Zero hallucination guarantee", + typing: "AI is thinking...", + inputPlaceholder: "Ask Zenith AI a question...", + terminalTitle: "Zenith Semantic Indexing Console", + terminalRunBtn: "Simulate Knowledge Indexing", + featuresHeader: "AI-Powered Capabilities", + featuresSub: "Bento-grid capabilities built with high performance and zero-hallucination engines.", + integrationsHeader: "Seamless Ecosystem Integrations", + integrationsSub: "Sync with your existing corporate workspaces and messaging channels in under a minute.", + pricingHeader: "Transparent Pricing Plans", + pricingSub: "Flexible scales designed to accommodate startups and enterprise support systems.", + reviewsHeader: "Wall of Love", + reviewsSub: "Honest feedback from customer support leaders and tech team leads globally.", + footerText: "Next-generation conversational interface parsing document structures to deliver verified responses with sub-240ms latency.", + privacy: "Privacy Policy", + terms: "Terms of Service", + tryModalTitle: "Zenith AI Sandbox Experience", + tryModalDesc: "Enter your website URL and contact email to issue a unique sandbox token and generate your lightweight embed script.", + urlLabel: "Your Website URL", + emailLabel: "Your Contact Email", + generateBtn: "Generate Embed Script", + tokenTitle: "Sandbox Script Ready", + tokenDesc: "Copy and paste this lightweight script tag right before the closing tag of your website code.", + copyBtn: "Copy Script", + copied: "Copied!", + closeBtn: "Close" + } +}; + +const mockResponses: Record> = { + tr: { + suggest1: "Semantik İndeksleme; dokümanlarınızı sadece kelime bazlı değil, anlamsal ilişkileriyle haritalandırıp vektör veritabanına kaydeder. Böylece yapay zeka bağlamı mükemmel anlar.", + suggest2: "Zenith AI; Web siteniz için özel JS widget'ı, Slack workspace, WhatsApp Business, Telegram botları ve Discord sunucuları üzerinde tamamen yerel entegrasyon desteği sağlar.", + suggest3: "%99.4 doğruluk oranımız, yapay zekanın sadece sizin onayladığınız bilgi tabanını referans almasından kaynaklanır. Bilmediği konularda uydurmak yerine destek ekibinize yönlendirir." + }, + en: { + suggest1: "Semantic Indexing maps your documents based on structural meaning rather than simple keywords, storing them in vector formats. This allows the AI to fully grasp context.", + suggest2: "Zenith AI natively integrates across custom JavaScript Web Widgets, Slack workspaces, WhatsApp Business API, Telegram channels, and Discord servers.", + suggest3: "Our 99.4% accuracy is achieved by strictly grounding the AI responses within your verified knowledge base. If a query is out-of-scope, it routes to a human agent instead of hallucinating." + } +}; + +export default function ChatbotTemplate2({ data }: ChatbotTemplate2Props) { + const [lang, setLang] = useState<"tr" | "en">("tr"); + const t = translations[lang]; + + // Chat Sandbox State + const [chatMessages, setChatMessages] = useState([ + { sender: "bot", text: lang === "tr" ? "Merhaba! Ben Zenith AI. Markanızın özel bilgi tabanıyla eğitildim. Özelliklerimi test etmek için aşağıdaki butonlara basabilir veya yazabilirsiniz." : "Hello! I am Zenith AI, trained on your custom knowledge base. Feel free to click the suggestion chips or write to test my capabilities." } + ]); + const [chatInput, setChatInput] = useState(""); + const [isBotTyping, setIsBotTyping] = useState(false); + const [streamedText, setStreamedText] = useState(""); + const chatEndRef = useRef(null); + + // Sync initial message on language switch + useEffect(() => { + setChatMessages([ + { sender: "bot", text: lang === "tr" ? "Merhaba! Ben Zenith AI. Markanızın özel bilgi tabanıyla eğitildim. Özelliklerimi test etmek için aşağıdaki butonlara basabilir veya yazabilirsiniz." : "Hello! I am Zenith AI, trained on your custom knowledge base. Feel free to click the suggestion chips or write to test my capabilities." } + ]); + }, [lang]); + + // Terminal Simulation State + const [terminalLogs, setTerminalLogs] = useState([]); + const [isTerminalIndexing, setIsTerminalIndexing] = useState(false); + const terminalEndRef = useRef(null); + + // Try Now Modal State + const [showModal, setShowModal] = useState(false); + const [userUrl, setUserUrl] = useState(""); + const [userEmail, setUserEmail] = useState(""); + const [generatedScript, setGeneratedScript] = useState(""); + const [isGenerating, setIsGenerating] = useState(false); + const [isCopied, setIsCopied] = useState(false); + + // Custom Streaming Response Helper + const triggerStreamingResponse = async (responseText: string) => { + setIsBotTyping(true); + // Simulate thinking delay + await new Promise((res) => setTimeout(res, 800)); + setIsBotTyping(false); + + setChatMessages((prev) => [...prev, { sender: "bot", text: "" }]); + const words = responseText.split(" "); + let currentText = ""; + + for (let i = 0; i < words.length; i++) { + currentText += (i === 0 ? "" : " ") + words[i]; + // Update the last message in chat array + setChatMessages((prev) => { + const updated = [...prev]; + updated[updated.length - 1] = { sender: "bot", text: currentText }; + return updated; + }); + await new Promise((res) => setTimeout(res, 45)); // stream pacing + } + }; + + const handleSendCustomMessage = (e: React.FormEvent) => { + e.preventDefault(); + if (!chatInput.trim() || isBotTyping) return; + + const userText = chatInput; + setChatMessages((prev) => [...prev, { sender: "user", text: userText }]); + setChatInput(""); + + // Simulate standard answers + let reply = lang === "tr" + ? "Sorduğunuz soruyu Zenith AI semantik motorumuzda işledim. Bilgi tabanınızda bu veriye ulaştım: Zenith AI, 240ms gibi rekor bir sürede doğrulanmış yanıtlar verir." + : "I processed your query in our Zenith semantic cognitive engine. According to your synced documents: Zenith AI operates in a sub-240ms timeframe with verified responses."; + + if (userText.toLowerCase().includes("hız") || userText.toLowerCase().includes("speed") || userText.toLowerCase().includes("ms")) { + reply = lang === "tr" + ? "Zenith AI, özel geliştirilmiş hafif LLM ara katmanı sayesinde web widgetlarında ve API uçlarında 240 milisaniyenin altında anlık kelime akışı başlatır." + : "Zenith AI features an optimized micro-model layer initiating word streams on web frontends in under 240 milliseconds."; + } else if (userText.toLowerCase().includes("hata") || userText.toLowerCase().includes("error") || userText.toLowerCase().includes("halüs")) { + reply = lang === "tr" + ? "%99.4 oranında doğrulanmış yanıt modelimiz, veri tabanınız dışındaki konulara uydurma cevaplar üretilmesini engeller ve anında gerçek bir insana aktarım sunar." + : "Our 99.4% accuracy threshold prevents arbitrary generation on out-of-bounds topics, offering direct failover to human support."; + } + + triggerStreamingResponse(reply); + }; + + const handleSuggestionClick = (key: string, label: string) => { + if (isBotTyping) return; + setChatMessages((prev) => [...prev, { sender: "user", text: label }]); + const responseText = mockResponses[lang][key]; + triggerStreamingResponse(responseText); + }; + + // Terminal Indexing Simulator + const runTerminalSimulation = async () => { + if (isTerminalIndexing) return; + setIsTerminalIndexing(true); + setTerminalLogs([]); + + const logs = lang === "tr" ? [ + "⚡ Zenith AI Cognitive Indexer v2.0 başlatıldı...", + "🔗 Bağlantı taranıyor: https://docs.yourcompany.com", + "📂 Bulunan alt dokümanlar: /api-reference, /installation, /customization", + "🧠 Semantik parçalama algoritması yükleniyor (Chunk size: 512, overlap: 64)...", + "📦 Parçalanan doküman sayısı: 184.", + "🧬 Vektör gömmeleri hesaplanıyor (OpenAI text-embedding-3-small)...", + "💾 Veriler Zenith Vector Cloud veritabanına kaydedildi.", + "🟢 Bilgi tabanı başarıyla indekslendi. 240ms anlık sorgulara hazır!" + ] : [ + "⚡ Zenith AI Cognitive Indexer v2.0 active...", + "🔗 Scanning core connection: https://docs.yourcompany.com", + "📂 Found sub-documents: /api-reference, /installation, /customization", + "🧠 Launching semantic chunking parser (Chunk size: 512, overlap: 64)...", + "📦 Indexed block count: 184.", + "🧬 Computing vector dimensional weights (OpenAI text-embedding-3-small)...", + "💾 Synced indices with Zenith Vector Cloud database.", + "🟢 Knowledge base indexed successfully! Sub-240ms queries ready." + ]; + + for (let i = 0; i < logs.length; i++) { + setTerminalLogs((prev) => [...prev, logs[i]]); + await new Promise((res) => setTimeout(res, 600)); + } + setIsTerminalIndexing(false); + }; + + // Modal Generator Script + const handleGenerateScript = (e: React.FormEvent) => { + e.preventDefault(); + if (!userUrl.trim() || !userEmail.trim()) return; + + setIsGenerating(true); + setTimeout(() => { + const cleanUrl = userUrl.replace(/https?:\/\/(www\.)?/, "").split("/")[0]; + const code = `\n\n`; + setGeneratedScript(code); + setIsGenerating(false); + }, 1200); + }; + + const handleCopyCode = () => { + navigator.clipboard.writeText(generatedScript); + setIsCopied(true); + setTimeout(() => setIsCopied(false), 2000); + }; + + // Auto-scroll for chat + useEffect(() => { + chatEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }, [chatMessages, isBotTyping]); + + // Auto-scroll for terminal + useEffect(() => { + terminalEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }, [terminalLogs]); + + return ( +
+ + {/* Custom Global Styles for fonts & animations */} + + + {/* Decorative Ambient Background */} +
+
+
+ + {/* ── HEADER / NAVBAR ── */} +
+ +
+ + {/* ── HERO & CONVERSATIONAL SANDBOX GRID ── */} +
+
+ + {/* Left: Text Elements */} +
+
+ + {t.badge} +
+ +

+ {t.heroTitle1} +
+ + {t.heroTitle2} + +

+ +

+ {t.heroDesc} +

+ +
+ + + {t.exploreBtn} + +
+ + {/* Quick Stats Grid */} +
+ {data.istatistikler.map((stat, i) => ( +
+ {stat.deger} + {stat.etiket.substring(0, 15)}... +
+ ))} +
+
+ + {/* Right: Conversational UI Preview Sandbox */} +
+
+ + {/* Chat Header */} +
+
+
+ 🧬 +
+
+ {t.sandboxTitle} + + + {t.statusOnline} + +
+
+
+ + +
+
+ + {/* Chat Messages Log */} +
+ {chatMessages.map((msg, i) => ( +
+
+ {msg.text} +
+
+ ))} + + {/* Bot Typing Indicator */} + {isBotTyping && ( +
+
+ {t.typing} + + + +
+
+ )} + +
+
+ + {/* Suggested Questions Chips */} +
+ + + +
+ + {/* Chat Input Area */} +
+ setChatInput(e.target.value)} + disabled={isBotTyping} + placeholder={t.inputPlaceholder} + className="flex-1 bg-zinc-950 border border-zinc-800/80 rounded-xl px-4 py-3 text-xs text-white focus:outline-none focus:border-violet-500 transition-all placeholder-zinc-600 disabled:opacity-50" + /> + +
+
+
+
+
+ + {/* ── STREAMING TEXT / INDEXING TERMINAL WIDGET ── */} +
+
+ +
+
+ 💻 +
+

+ {t.terminalTitle} +

+

+ {lang === "tr" + ? "Zenith AI, arka planda web sitelerinizi semantik kütüphanelere ayrıştırırken eşzamanlı bir tarama yürütür. Kod bloklarını simüle edin ve veri indekslemeyi canlı izleyin." + : "Zenith AI runs synchronous crawlers that dissect pages into semantic vector models. Simulate knowledge indexing in real-time below."} +

+ +
+ + {/* Terminal Console Card */} +
+ {/* Header controls */} +
+
+ + + +
+ sh - zenith_indexer.sh +
+ + {/* Scrollable logs */} +
+ {terminalLogs.length === 0 ? ( + {lang === "tr" ? "İndeksleme simülatörünü başlatmak için sol taraftaki butona basın." : "Click the button to simulate the semantic vector indexer."} + ) : ( + terminalLogs.map((log, i) => ( +
+ {log} +
+ )) + )} +
+
+
+ +
+
+ + {/* ── BENTO FEATURE CARDS Grid ── */} +
+
+

+ {t.featuresHeader} +

+

+ {t.featuresSub} +

+
+ + {/* Bento Grid */} +
+ + {/* Card 1: 8cols top */} +
+ {/* Ambient hover glow */} +
+ +
+ + + +
+ +

{data.hizmetler[0].baslik}

+

{data.hizmetler[0].aciklama}

+
+ + {/* Card 2: 4cols top */} +
+
+ +
+ + + +
+ +

{data.hizmetler[1].baslik}

+

{data.hizmetler[1].aciklama}

+
+ + {/* Card 3: 4cols bottom */} +
+
+ +
+ + + +
+ +

{data.hizmetler[2].baslik}

+

{data.hizmetler[2].aciklama}

+
+ + {/* Card 4: 8cols bottom */} +
+
+ +
+ + + +
+ +

{data.hizmetler[3].baslik}

+

{data.hizmetler[3].aciklama}

+
+ +
+
+ + {/* ── INTEGRATIONS SCROLLING LOGO MARQUEE ── */} +
+
+
+

{t.integrationsHeader}

+

{t.integrationsSub}

+
+
+ + {/* Scrolling logos container */} +
+
+ {[1, 2].map((loop) => ( +
+ + {/* Integration Logo: Slack */} +
+ + + + SLACK +
+ + {/* Integration Logo: WhatsApp */} +
+ + + + WHATSAPP +
+ + {/* Integration Logo: Notion */} +
+ N + NOTION +
+ + {/* Integration Logo: Discord */} +
+ + + + DISCORD +
+ + {/* Integration Logo: Zendesk */} +
+ Z + ZENDESK +
+ +
+ ))} +
+
+
+ + {/* ── PRICING TIER SECTION ── */} +
+
+

{t.pricingHeader}

+

{t.pricingSub}

+
+ + {/* Pricing Cards */} +
+ + {/* Plan 1: Free */} +
+
+ Tier 01 +

Sandbox

+

+ {lang === "tr" ? "Yapay zekayı kendi web sitenizde test edin." : "Test conversational intelligence live on your host."} +

+ +
+ $0 + / {lang === "tr" ? "Sonsuza Dek" : "Forever"} +
+ +
    +
  • + 1 Website Connection +
  • +
  • + 5 Semantic Chunk Indexing +
  • +
  • + JS Embed Widget +
  • +
+
+ + +
+ + {/* Plan 2: Pro (Active Glow) */} +
+ + POPULAR + + +
+ Tier 02 +

Growth

+

+ {lang === "tr" ? "Küçük ekipler ve büyüyen SaaS markaları için." : "Ideal support scale for early corporate integrations."} +

+ +
+ $49 + / {lang === "tr" ? "Aylık" : "Month"} +
+ +
    +
  • + 3 Website Connections +
  • +
  • + 200+ Pages Semantic Indexing +
  • +
  • + Slack & WhatsApp channels +
  • +
  • + Custom Brand colors & logo +
  • +
+
+ + +
+ + {/* Plan 3: Enterprise */} +
+
+ Tier 03 +

Corporate

+

+ {lang === "tr" ? "Sınırsız sunucu kapasitesi ve KVKK entegrasyonu." : "Full GDPR validation and cluster node orchestration."} +

+ +
+ Custom +
+ +
    +
  • + Unlimited data sync loops +
  • +
  • + Dedicated Cluster Node +
  • +
  • + Personal Support Sommelier +
  • +
  • + Custom Model fine-tuning +
  • +
+
+ + +
+ +
+
+ + {/* ── CLIENT TESTIMONIALS ── */} +
+
+

{t.reviewsHeader}

+

{t.reviewsSub}

+
+ + {/* Testimonial Cards */} +
+ {data.yorumlar.map((review, i) => ( +
+
+
+ {review.emoji} +
+
+ {review.yazar} + {review.tarih} +
+
+

+ "{review.yorum}" +

+
+ ))} +
+
+ + {/* ── BOTTOM CALL TO ACTION BANNER ── */} +
+
+ {/* Purple decorative spotlight */} +
+ +

+ {lang === "tr" ? "Müşteri Destek Dönüşümünü Katlayın" : "Double your customer conversion loop"} +

+

+ {lang === "tr" + ? "Semantik taranan indeksler sayesinde Zenith AI sıfır halüsinasyon riski taşır. Saniyeler içinde kurun ve ekibinizi otomatik yapay zekâ ile özgürleştirin." + : "Thanks to parsed semantic indexing, Zenith AI delivers responses with zero hallucination. Install in under 60 seconds and automate support loops."} +

+ + +
+
+ + {/* ── FOOTER ── */} + + + {/* ── INTERACTIVE SCRIPTS MODAL (SANDBOX INTEGRATOR) ── */} + + {showModal && ( + + + {/* Close Button */} + + + {/* Title & Badge */} +
+ 🧬 +
+ +

+ {t.tryModalTitle} +

+

+ {t.tryModalDesc} +

+ + {/* Generative Embed Code Form */} + {generatedScript === "" ? ( +
+
+ + setUserUrl(e.target.value)} + placeholder="e.g., https://yourbrand.com" + className="w-full px-4 py-3 rounded-xl border border-zinc-800 bg-zinc-950 text-xs text-white placeholder-zinc-700 focus:outline-none focus:border-violet-500 transition-all font-semibold" + /> +
+
+ + setUserEmail(e.target.value)} + placeholder="e.g., tech@yourbrand.com" + className="w-full px-4 py-3 rounded-xl border border-zinc-800 bg-zinc-950 text-xs text-white placeholder-zinc-700 focus:outline-none focus:border-violet-500 transition-all font-semibold" + /> +
+ + +
+ ) : ( + // Display Embed Script +
+

+ + {t.tokenTitle} +

+

+ {t.tokenDesc} +

+ +
+ {generatedScript} +
+ +
+ + +
+
+ )} + +
+
+ )} +
+ +
+ ); +} diff --git a/components/templates/DentalTemplate/index.tsx b/components/templates/DentalTemplate/index.tsx new file mode 100644 index 0000000..b16f3d1 --- /dev/null +++ b/components/templates/DentalTemplate/index.tsx @@ -0,0 +1,890 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.1 } }, +}; + +const translations = { + tr: { + navMembership: "Üyelik Programı", + navServices: "Hizmetlerimiz", + navWorks: "Portföyümüz", + navReviews: "Hasta Hikayeleri", + navBooking: "Randevu Al", + badge: "SEAMLESS DENTAL CLINIC", + heroTitlePart1: "Kusursuz", + heroTitlePart2: "Ağız ve Diş Sağlığı", + heroTitlePart3: "Deneyimi", + heroDesc: "Sağlıklı ve özgüvenli bir gülümseme için pürüzsüz ve stressiz bir diş hekimliği deneyimi. Odentries modern klinik koordinatları ile dijital sağlık lüksünü yaşayın.", + bookNow: "Randevu Al", + contactUs: "İletişim", + statTitle1: "Özel Üye Tasarrufu", + statDesc1: "Ağız Muayeneleri, Temizlik ve Röntgen dahil olmak üzere Diş Prosedürlerinde %60 - %80 arasında tasarruf sağlayın.", + statTitle2: "Gelişmiş Üye Avantajları", + statDesc2: "Kozmetik, Restoratif ve Uzmanlık Diş Tedavileri dahil olmak üzere Diğer Tüm Diş Hizmetlerinde %40 Tasarruf Sağlayın.", + membershipHeader: "Aileniz İçin Erişilebilir Diş Hekimliği", + membershipDesc: "Sevdikleriniz için en iyi diş sağlığı planlarını keşfedin. Muayene, temizlik ve özel estetik tedavilerde benzersiz fiyat avantajlarından yararlanın.", + joinedText: "Bu ay 1.200'den fazla üye katıldı", + joinBtn: "Üye Olun", + servicesHeader: "Ayrıcalıklı Klinik Hizmetleri", + worksHeader: "Sağlıklı Gülüşler Burada Başlar", + worksDesc: "Daha parlak, daha sağlıklı bir gülümseme ve kalıcı özgüven için uzman diş bakımı ve profesyonel temizlik uygulamaları.", + reviewsHeader: "Hasta Görüşleri", + bookingHeader: "Online Randevu Oluşturun", + bookingDesc: "Hayalinizdeki sağlıklı gülüşe kavuşmak için formu doldurun, sizi arayalım.", + fieldsName: "Ad Soyad", + fieldsPhone: "Telefon Numarası", + fieldsEmail: "E-Posta Adresi", + fieldsService: "Hizmet Türü", + fieldsDate: "Tercih Edilen Tarih", + fieldsNotes: "Şikayetiniz / Notunuz", + fieldsNotesPlaceholder: "Belirtmek istediğiniz özel detaylar...", + dispatchForm: "RANDEVU TALEP ET", + footerDesc: "Ferah ve hijyenik modern klinik ortamında, ağrısız ve en son teknoloji tedavi yöntemleri ile size özel ağız sağlığı çözümleri.", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Kullanım Şartları", + dismiss: "KAPAT", + contactTitle: "Hızlı İletişim", + contactDesc: "İletişim bilgilerinizi bırakın, en kısa sürede sizi arayalım.", + submit: "Gönder", + viewAllWorks: "PORTFÖYÜ KEŞFET • PORTFÖYÜ KEŞFET • ", + preventTitle: "Diş Çürüklerini Önleme", + preventDesc: "Kapsamlı diş muayeneleri ve koruyucu hekimlik uygulamaları ile dişlerinizi koruyoruz.", + sparkleTitle: "Işıldayan Temizlik", + sparkleDesc: "Profesyonel temizleme ve beyazlatma teknikleriyle parıldayan sağlıklı gülüşler yaratıyoruz.", + detectionTitle: "Erken Teşhis İmkanı", + detectionDesc: "İleri teknoloji röntgen ve teşhis araçlarıyla sorunları büyümeden yakalıyoruz.", + }, + en: { + navMembership: "Membership Plan", + navServices: "Our Services", + navWorks: "Our Works", + navReviews: "Patient Stories", + navBooking: "Book Now", + badge: "SEAMLESS DENTAL CLINIC", + heroTitlePart1: "Seamless", + heroTitlePart2: "Dental Care", + heroTitlePart3: "Experience", + heroDesc: "A smooth and hassle-free dental care experience for a healthy and confident smile. Indulge in digital health luxury structured by Odentries clinic.", + bookNow: "Book Now", + contactUs: "Contact", + statTitle1: "Exclusive Member Savings", + statDesc1: "Save 60% - 80% on Dental Procedures, including Oral Exams, Cleanings, and X-Rays.", + statTitle2: "Enhanced Member Benefits", + statDesc2: "Save 40% on All Other Dental Services, including Cosmetic, Restorative, and Specialty Dental Procedures.", + membershipHeader: "Affordable Dental Care for Your Family", + membershipDesc: "Unlock optimal dental wellness for your loved ones. Get massive savings on check-ups, cleaning, and specialized cosmetic treatments.", + joinedText: "Joined by 1,200+ members this month", + joinBtn: "Join Membership", + servicesHeader: "Exclusive Clinic Services", + worksHeader: "A Healthy Smile Starts Here", + worksDesc: "Expert Dental Care and Cleaning Procedures for a Brighter, Healthier Smile and Lasting Confidence.", + reviewsHeader: "Patient Testimonials", + bookingHeader: "Online Appointment", + bookingDesc: "Fill out the appointment details to secure your priority consultation slot with our experts.", + fieldsName: "Full Name", + fieldsPhone: "Phone Number", + fieldsEmail: "Email Address", + fieldsService: "Service Category", + fieldsDate: "Preferred Date", + fieldsNotes: "Notes / Symptoms", + fieldsNotesPlaceholder: "Any specific dental notes or requests...", + dispatchForm: "REQUEST APPOINTMENT", + footerDesc: "Custom dental care solutions designed in an ultra-clean, welcoming clinic layout using advanced high-tech treatment instruments.", + privacyRegs: "Privacy Policy", + termsStay: "Terms of Service", + dismiss: "DISMISS", + contactTitle: "Quick Consultation", + contactDesc: "Leave your contact details and our medical coordinator will call you back within 15 minutes.", + submit: "Submit", + viewAllWorks: "VIEW ALL WORKS • VIEW ALL WORKS • ", + preventTitle: "Prevent Cavities & Disease", + preventDesc: "State-of-the-art checkups and preventative dentistry to protect your raw teeth structure.", + sparkleTitle: "Keep Your Teeth Sparkling Clean", + sparkleDesc: "Professional scale cleaning and premium laser whitening for an immediate aesthetic update.", + detectionTitle: "Early Detection of Dental Issues", + detectionDesc: "Advanced high-resolution diagnostic tools to intercept hidden micro-cavities before they expand.", + } +}; + +export default function DentalTemplate({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], projeler = [], yorumlar = [] } = data; + const [showBookingModal, setShowBookingModal] = useState(false); + const [activeYorum, setActiveYorum] = useState(0); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (x: number) => Math.min(1, 1.001 - Math.pow(2, -10 * x)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Map service icons without generic emojis + const getServiceIconSvg = (ikon: string) => { + switch (ikon) { + case "🦷": + return ( + + + + ); + case "✨": + return ( + + + + ); + default: + return ( + + + + ); + } + }; + + const getLocalizedServiceText = (baslik: string) => { + if (baslik.includes("Prevent")) return { title: t.preventTitle, desc: t.preventDesc }; + if (baslik.includes("Sparkling")) return { title: t.sparkleTitle, desc: t.sparkleDesc }; + return { title: t.detectionTitle, desc: t.detectionDesc }; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500;600;700;800;900&family=Sora:wght@300;400;500;600;700;800&display=swap'); + + :root { + --bg-ivory: #FAF7F2; + --bg-mint: #EBF5F0; + --text-slate: #1E2E38; + --text-dark: #121C22; + --color-gold: #D4AF37; + } + + .font-elegant { + font-family: 'Sora', sans-serif; + } + + .font-sans-clean { + font-family: 'DM Sans', sans-serif; + } + + .spinning-text { + animation: spin 24s linear infinite; + } + + @keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } + } + + .hero-title-clamp { + font-size: clamp(38px, 6vw, 85px); + letter-spacing: -0.02em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + ODENTRIES CLINIC + +
+ +
+ + interactive prototype + +
+
+ )} +
+ +
+ + {/* Floating cross graphics (+) from reference design */} +
+
+
+
+
+
+
+
+
+
+
+
+ + {/* ── FLOATING CONCEPT BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + {/* ── PREMIUM HEADER ── */} + +
+ {/* Logo */} + + + + + + + {firma.adi} + + + + {/* Links */} + + + {/* Language Selector + Action Button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[10px] font-black tracking-[2.5px] uppercase text-[#FAF7F2] bg-[#1E2E38] hover:bg-[#121C22] px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_4px_12px_rgba(30,46,56,0.15)] hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.bookNow} + +
+
+
+ + {/* ── HERO SECTION ── */} +
+
+
+ + {/* Left Col - Text Content */} + + + + {t.badge} + + + + {t.heroTitlePart1} +
+ {t.heroTitlePart2} +
+ {t.heroTitlePart3} +
+ + + {t.heroDesc} + + + + setShowBookingModal(true)} + className="inline-flex items-center gap-3 px-8 py-4.5 rounded-xl bg-[#1E2E38] hover:bg-[#121C22] text-[#FAF7F2] font-black text-[10px] tracking-[2px] uppercase transition-all shadow-[0_5px_15px_rgba(30,46,56,0.1)] cursor-pointer" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.bookNow} + + +
+ + {/* Right Col - Cropped Smiling Portrait Overlay */} +
+ + {/* Background soft lighting */} +
+ + {/* Main Generated High-Fidelity Smiling Image */} + {/* eslint-disable-next-line @next/next/no-img-element */} + Odentries Smiling Model + +
+ +
+
+
+ + {/* ── SECTION 001: AFFORDABLE CARE & BENTO CARDS ── */} +
+
+ +
+ + {/* Left Content */} + + + 001 - Join Membership + + + {t.membershipHeader} + + + {t.membershipDesc} + + + {/* Patient Pile from Reference Design */} + +
+ {["👨‍⚕️", "👩‍⚕️", "🧑‍⚕️", "✨"].map((emoji, i) => ( +
+ {emoji} +
+ ))} +
+ + +
+
+
+ {t.joinedText} +
+
+ + setShowBookingModal(true)} + className="px-8 py-4 rounded-xl bg-[#1E2E38] hover:bg-[#121C22] text-[#FAF7F2] font-black text-[10px] tracking-[2.5px] uppercase transition-colors" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.joinBtn} + +
+ + {/* Right Bento Cards */} +
+ + {/* Card 1: 80% Savings */} + +
+ + {istatistikler[0]?.deger || "80%"} + + + +
+
+

{t.statTitle1}

+

+ {t.statDesc1} +

+
+
+ + {/* Card 2: 40% Benefits */} + +
+ + {istatistikler[1]?.deger || "40%"} + + + +
+
+

{t.statTitle2}

+

+ {t.statDesc2} +

+
+
+ +
+ +
+ +
+
+ + {/* ── CORE SERVICES CARD ROW ── */} +
+
+ +
+ {t.navServices} +

+ {t.servicesHeader} +

+
+ +
+ {hizmetler.map((h, i) => { + const item = getLocalizedServiceText(h.baslik); + return ( + +
+
+ {getServiceIconSvg(h.ikon)} +
+

+ {item.title} +

+

+ {item.desc} +

+
+ + +
+ ); + })} +
+ +
+
+ + {/* ── SECTION 002: OUR WORKS / PORTFOLIO ── */} +
+
+ + {/* Header */} +
+ + + 002 - Our Works + + + {t.worksHeader} + + + + {/* Spinning Circle badge and text details */} + + {/* Spinning Badge */} +
+ + + + + {t.viewAllWorks} + + + + +
+

+ {t.worksDesc} +

+
+
+ + {/* 3 Column Image Cards Grid */} +
+ {projeler.map((p, i) => ( + +
+ {/* Photo container */} +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + {p.baslik} +
+ {/* Text details */} +

{p.baslik}

+

{lang === "tr" ? "Estetik ve Dayanıklı Sonuçlar" : "Impressive, high-durability smile aesthetics"}

+
+ + +
+ ))} +
+ +
+
+ + {/* ── YORUMLAR (TESTIMONIALS) ── */} +
+
+
+ + 003 - Patient Stories + +

+ {t.reviewsHeader} +

+
+ +
+ + +
+ {[...Array(yorumlar[activeYorum]?.puan || 5)].map((_, i) => ( + + + + ))} +
+

+ “{yorumlar[activeYorum]?.yorum}” +

+
+
+ {yorumlar[activeYorum]?.yazar.charAt(0)} +
+
+

{yorumlar[activeYorum]?.yazar}

+

{yorumlar[activeYorum]?.tarih}

+
+
+
+
+ +
+ {yorumlar.map((_, i) => ( +
+
+
+
+ + {/* ── RANDEVU AL (APPOINTMENT SECTION) ── */} +
+
+
+
+ + 004 - Online Appointment + +

+ {t.bookingHeader} +

+

+ {t.bookingDesc} +

+
+ +
+ {[ + { label: t.fieldsName, placeholder: lang === "tr" ? "Adınız Soyadınız" : "Your Full Name", type: "text", full: false }, + { label: t.fieldsPhone, placeholder: "05xx xxx xx xx", type: "tel", full: false }, + { label: t.fieldsEmail, placeholder: "ornek@mail.com", type: "email", full: false }, + { label: t.fieldsService, placeholder: "", type: "select", full: false }, + { label: t.fieldsDate, placeholder: "", type: "date", full: false }, + { label: t.fieldsNotes, placeholder: t.fieldsNotesPlaceholder, type: "text", full: true }, + ].map((field, i) => ( +
+ + {field.type === "select" ? ( + + ) : ( + + )} +
+ ))} +
+ setShowBookingModal(true)} + className="mt-8 w-full py-4.5 rounded-xl text-[#FAF7F2] font-black text-xs bg-[#1E2E38] hover:bg-[#121C22] uppercase tracking-widest cursor-pointer shadow-[0_5px_15px_rgba(30,46,56,0.15)]" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + 📅 {t.dispatchForm} + +
+
+
+ + {/* ── FOOTER ── */} +
+
+
+
+
+ + + + + {firma.adi} +
+

{t.footerDesc}

+
+

📍 {firma.adres}

+

📞 {firma.telefon}

+
+
+
+

{t.navServices}

+ {hizmetler.map((h, i) => { + const s = getLocalizedServiceText(h.baslik); + return ( + {s.title} + ); + })} +
+
+

Odentries

+ {[t.navMembership, t.navServices, t.navWorks, t.navReviews].map((item) => ( + {item} + ))} +
+
+
+

© 2026 {firma.adi}. All rights reserved.

+ +
+
+
+ + {/* ── BOOKING MODAL ── */} + + {showBookingModal && ( + + + + +

{t.contactTitle}

+

{t.contactDesc}

+ +
+
+ + +
+
+ + +
+ setShowBookingModal(false)} + > + {t.submit} + +
+
+
+ )} +
+
+ + ); +} diff --git a/components/templates/HotelTemplate1/index.tsx b/components/templates/HotelTemplate1/index.tsx new file mode 100644 index 0000000..7d35041 --- /dev/null +++ b/components/templates/HotelTemplate1/index.tsx @@ -0,0 +1,845 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.1 } }, +}; + +const translations = { + tr: { + navBook: "Rezervasyon", + navSuites: "Özel Süitler", + navExp: "Deneyimler", + navRev: "Yorumlar", + badge: "BUTİK LÜKS RESORT", + heroTail: "sizi bekliyor", + heroDesc: "Cal Vestam'da eşsiz bir huzura dalın. Fethiye'nin nefes kesici mavi sırtlarının üzerinde, size özel cam kenarlı sonsuzluk havuzları ve organik zeytin yaprağı masaj terapileri sunuyoruz.", + reserveNow: "Rezervasyon Yap", + planEscape: "TATİLİ PLANLA", + resortServices: "RESORT HİZMETLERİ", + checkAvailability: "UYGUNLUK DURUMU", + scheduleEscape: "RESORT TATİLİNİZİ PLANLAYIN", + scheduleDesc: "Benzersiz deniz manzaralı teras süitinizde yerinizi ayırtmak için tarihlerinizi belirleyin.", + checkin: "GİRİŞ TARİHİ", + checkout: "ÇIKIŞ TARİHİ", + adults: "YETİŞKİN", + kids: "ÇOCUK (12 YAŞ ALTI)", + guests: "Misafir", + kidsLabel: "Çocuk", + guarantee: "Rezervasyonlar, giriş esnasında taze toplanmış narenciye kokteyli ikramı ile en iyi fiyat garantisini kilitler.", + confirmDetails: "TARİHLERİ ONAYLA", + suitesTitle: "TERAS SÜİTLERİ", + suitesHeader: "SEÇKİN SÜİTLER", + suitesDesc: "Özel dokuma keten serimler, doğal zeytinyağlı sabunlar ve kesintisiz deniz panoraması ile mimari lüksü deneyimleyin.", + secureRes: "REZERVASYON YAP →", + diaries: "Misafir Defteri", + lovedGuests: "LOVED BY GUESTS", + lovedDesc: "Seçkin gezginlerin ve küresel mimari yazarlarının Cal Vestam deneyimlerini keşfedin.", + vipCoords: "VIP KOORDİNATLAR", + conciergeActive: "Resort Concierge Aktif", + checkInOutDetails: "Giriş: 15:00 · Çıkış: 11:00", + boutiqueLeisures: "BUTİK AYRICALIKLAR", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Konaklama Şartları", + dismiss: "KAPAT", + enquiryActive: "BAŞVURU ALINDI", + ambassadorActive: "Cal Vestam Concierge Aktif", + enquirySuccess: "Akdeniz resort rezervasyon koordinatlarınızı kaydettik. Özel misafir elçimiz giriş işlemlerinizi öncelikli olarak tamamlamak için sizinle iletişime geçecektir. Teşekkürler!", + + // Suite details + suite1Title: "PANORAMİK VESTAM SÜİT", + suite1Desc: "Fethiye'nin mavi sırtlarına bakan özel havuzlu balkon ve premium pamuklu yatak tasarımı.", + suite2Title: "NARENCİYE BAHÇE SÜİTİ", + suite2Desc: "Çevreleyen zeytin ve limon bahçeleriyle entegre, gün ışığıyla dolu ferah konaklama deneyimi.", + suite3Title: "AKDENİZ VİLLASI", + suite3Desc: "Özel sonsuzluk havuzları, kişisel uşak hizmeti ve gün batımı terasları sunan tam villa kiralama.", + + // Welcome orchards + welcomeTitle: "Karşılama İkramları", + welcomeDesc: "MİSAFİRLERİMİZ İÇİN TAZE NARENCİYE KOKTEYLLERİ", + }, + en: { + navBook: "Book stay", + navSuites: "Exclusive suites", + navExp: "Experiences", + navRev: "Guest reviews", + badge: "BOUTIQUE LUXURY RESORT", + heroTail: "awaits your arrival", + heroDesc: "Submerge into sheer tranquility at Cal Vestam. Situated directly above Muğla's gorgeous blue ridges, we stage exclusive glass-edge infinity pools and wellness stone therapy.", + reserveNow: "Reserve Now", + planEscape: "PLAN ESCAPE", + resortServices: "RESORT SERVICES", + checkAvailability: "Check availability", + scheduleEscape: "SCHEDULE YOUR RESORT ESCAPE", + scheduleDesc: "Allocate your exclusive sea-view panoramic terrace suite directly inside our luxury booking engine.", + checkin: "CHECK-IN DATE", + checkout: "CHECK-OUT DATE", + adults: "ADULTS", + kids: "KIDS (UNDER 12)", + guests: "Guests", + kidsLabel: "Kids", + guarantee: "Reservations lock in our premium best-rate guarantee with local welcome orchard citrus cocktail packages upon check-in.", + confirmDetails: "CONFIRM DETAILS", + suitesTitle: "Terrace suites", + suitesHeader: "EXCLUSIVE SUITES", + suitesDesc: "Experience high-end architecture layered with bespoke linen, local natural olive oil soaps, and floor-to-ceiling sea panoramas.", + secureRes: "SECURE RESERVATION →", + diaries: "Guest Diaries", + lovedGuests: "LOVED BY GUESTS", + lovedDesc: "Hear what prominent travelers and global architecture writers experience inside Cal Vestam.", + vipCoords: "VIP COORDINATES", + conciergeActive: "Concierge 24 Hours Active", + checkInOutDetails: "Check In: 3:00 PM · Check Out: 11:00 AM", + boutiqueLeisures: "BOUTIQUE LEISURES", + privacyRegs: "Privacy Regulations", + termsStay: "Terms of Stay", + dismiss: "DISMISS", + enquiryActive: "ENQUIRY ACTIVE", + ambassadorActive: "Cal Vestam Concierge Active", + enquirySuccess: "We have registered your Mediterranean resort reservation coordinates. A personal guest ambassador has locked your priority check-in slot. Thank you!", + + // Suite details + suite1Title: "PANORAMIC VESTAM SUITE", + suite1Desc: "Private pool balcony looking directly over Fethiye blue ridges with premium cotton layout.", + suite2Title: "CITRUS GARDEN SUITE", + suite2Desc: "Cozy light-filled suite integrated with surrounding organic welcome olive and lemon orchards.", + suite3Title: "MEDITERRANEAN VILLA", + suite3Desc: "Executive buyout layout offering private infinity pools, automated concierge, and sunset lounges.", + + // Welcome orchards + welcomeTitle: "Welcome Orchards", + welcomeDesc: "CITRUS COCKTAILS FOR GUESTS", + } +}; + +export default function HotelTemplate1({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], yorumlar = [] } = data; + const [showModal, setShowModal] = useState(false); + const [adults, setAdults] = useState(2); + const [kids, setKids] = useState(0); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // 1. Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // 2. Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Localized statistics + const getLocalizedStat = (etiket: string) => { + if (etiket.includes("Suites")) return lang === "tr" ? "İmza Deniz Süiti" : "Signature Sea Suites"; + if (etiket.includes("Pools")) return lang === "tr" ? "Panoramik Havuz" : "Panoramic Infinity Pools"; + if (etiket.includes("Experience")) return lang === "tr" ? "Misafir Memnuniyeti" : "Guest Experience Index"; + return lang === "tr" ? "Doğal Zeytinyağı Sabun & Spa" : "Natural Olive Oil Soap & Spa"; + }; + + // Localized services + const getLocalizedService = (baslik: string, aciklama: string) => { + if (baslik.includes("POOL")) { + return { + title: lang === "tr" ? "SONSUZLUK VESTAM HAVUZU" : "INFINITY VESTAM POOL", + desc: lang === "tr" ? "Fethiye'nin mavi sırtlarına bakan cam kenarlı, ödüllü sonsuzluk havuzlarımızın keyfini çıkarın." : aciklama + }; + } + if (baslik.includes("SPA")) { + return { + title: lang === "tr" ? "REHIAL SPA TERAPİSİ" : "REHIAL SPA THERAPY", + desc: lang === "tr" ? "Yerel uzmanlar tarafından tasarlanan organik zeytin yaprağı taş masajları ve mineral tuzlu hidroterapi ile yenilenin." : aciklama + }; + } + return { + title: lang === "tr" ? "AÇIK HAVA TERAS YEMEĞİ" : "AL-FRESCO TERRACE DINING", + desc: lang === "tr" ? "Akdeniz zeytin ağaçlarının altında taze bahçe malzemeleri ve soğuk sıkım narenciye lezzetlerinin tadını çıkarın." : aciklama + }; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500;600;700;800;900&display=swap'); + + :root { + --color-resort-teal: #14B8A6; + --color-resort-sand: #FAF8F5; + --color-resort-charcoal: #0F172A; + --color-resort-gold: #D4AF37; + } + + .font-serif-editorial { + font-family: 'Playfair Display', Georgia, serif; + } + + .font-sans-resort { + font-family: 'Inter', sans-serif; + } + + .bg-light-mesh { + background-image: + radial-gradient(circle at 0% 0%, rgba(20, 184, 166, 0.04) 0%, transparent 40%), + radial-gradient(circle at 100% 100%, rgba(212, 175, 55, 0.03) 0%, transparent 50%); + } + + .shadow-premium { + box-shadow: 0 20px 40px -15px rgba(15, 23, 42, 0.05); + } + + .hero-title-clamp { + font-size: clamp(38px, 6vw, 90px); + letter-spacing: -0.02em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + CAL VESTAM RESORT + +
+ +
+ + interactive prototype + +
+
+ )} +
+ + {/* MEDITERRANEAN RESORT LIGHT THEME */} +
+ + {/* Floating Ambient Orbs */} +
+
+ + {/* ── MANDATORY FLOATING DEMO BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + {/* ── PREMIUM FLOATING NAVBAR ── */} + +
+ {/* Logo */} + + + + + + + + + {firma.adi} + + + + {/* Links */} + + + {/* Language Selector + Booking Button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowModal(true)} + className="text-[10px] font-black tracking-[2.5px] uppercase text-white bg-[#14B8A6] hover:bg-[#0D9488] px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_4px_12px_rgba(20,184,166,0.15)] hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.reserveNow} + +
+
+
+ + {/* ── HERO & SUITE QUICK LOOK ── */} +
+
+
+ + {/* Left Column: Typography Details */} + + + + {t.badge} + + + + {firma.slogan} +
+ {t.heroTail} +
+ + + {t.heroDesc} + + + {/* Statistics Grid */} + + {istatistikler.map((stat, idx) => ( +
+

+ {stat.deger} +

+

+ {getLocalizedStat(stat.etiket)} +

+
+ ))} +
+ + {/* CTA buttons */} + + + {t.planEscape} + + + {t.resortServices} + + +
+ + {/* Right Column: Layered Boutique Showcase */} +
+ + {/* Outer delicate lines */} +
+ + {/* Main Mediterranean Dining / Pool Setup */} + {/* eslint-disable-next-line @next/next/no-img-element */} + Cal Vestam Panoramic Dining Terrace + + {/* Floating Citrus Welcome Badge Overlay */} +
+ {/* Miniature citrus close-up */} +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + Citrus welcome orchard +
+
+ {t.welcomeTitle} +

{t.welcomeDesc}

+
+
+ +
+ +
+
+
+ + {/* ── INTERACTIVE BOOKING ENGINE ── */} +
+
+ +
+ {/* Glowing Top Line */} +
+ +
+ {t.checkAvailability} +

+ {t.scheduleEscape} +

+

+ {t.scheduleDesc} +

+
+ + {/* Booking Fields Grid */} +
+ {[ + { label: t.checkin, type: "date" }, + { label: t.checkout, type: "date" }, + ].map((field, idx) => ( +
+ + +
+ ))} + + {/* Adults Count */} +
+ +
+ + {adults} {t.guests} + +
+
+ + {/* Kids Count */} +
+ +
+ + {kids} {t.kidsLabel} + +
+
+
+ + {/* Action row */} +
+

+ {t.guarantee} +

+ setShowModal(true)} + className="w-full md:w-auto px-10 py-4 rounded-xl bg-[#14B8A6] hover:bg-[#0D9488] text-white font-black text-[10px] tracking-[2px] uppercase transition-all cursor-pointer shadow-[0_5px_15px_rgba(20,184,166,0.15)] shrink-0" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.confirmDetails} + +
+ +
+ +
+
+ + {/* ── SUITES GALLERY ── */} +
+
+ +
+
+ {t.suitesTitle} +

+ {t.suitesHeader} +

+
+

+ {t.suitesDesc} +

+
+ + {/* Gallery Columns */} +
+ {[ + { title: t.suite1Title, img: "/sicilia_hero_table.png", desc: t.suite1Desc }, + { title: t.suite2Title, img: "/sicilia_lemon_heritage.png", desc: t.suite2Desc }, + { title: t.suite3Title, img: "/sicilia_hero_table.png", desc: t.suite3Desc }, + ].map((suite, idx) => ( + +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + {suite.title} +
+
+ +
+

+ {suite.title} +

+

+ {suite.desc} +

+
+ +
+ +
+ + ))} +
+ +
+
+ + {/* ── RESORT EXPERIENCES ── */} +
+
+
+ {hizmetler.map((hizmet, idx) => { + const locServ = getLocalizedService(hizmet.baslik, hizmet.aciklama); + return ( +
+
+
+ + + + +
+

+ {locServ.title} +

+

+ {locServ.desc} +

+
+ + +
+ ); + })} +
+
+
+ + {/* ── TESTIMONIALS ── */} +
+
+ +
+ {t.diaries} +

+ {t.lovedGuests} +

+

+ {t.lovedDesc} +

+
+ + {/* Testimonials 2-Column Grid */} +
+ {yorumlar.map((y, yIdx) => ( +
+ {/* Rating Stars SVG */} +
+ {[...Array(5)].map((_, starIdx) => ( + + + + ))} +
+ +

+ “{y.yorum}” +

+ +
+
+ {y.yazar.charAt(0)} +
+
+

+ {y.yazar} +

+ + {y.tarih} + +
+
+
+ ))} +
+ +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+ + {/* About Column */} +
+ + CalVestam + +

+ {firma.slogan} — Exclusive boutique resort nestled inside Ölüdeniz heights. Handcrafted sea suites, infinity pools, and organic salt therapy. +

+
+

+ + + + + {firma.adres} +

+

+ + + + + {firma.email} +

+
+
+ + {/* Coordinates Column */} +
+

+ {t.vipCoords} +

+
+

{t.conciergeActive}
24 Hours Active

+

Check-In/Out
{t.checkInOutDetails}

+
+
+ + {/* Leisure Services Column */} +
+

+ {t.boutiqueLeisures} +

+
+ {hizmetler.map((h, hIdx) => { + const locS = getLocalizedService(h.baslik, h.aciklama); + return ( + + {locS.title} + + ); + })} +
+
+ +
+ +
+

© 2026 {firma.adi}. All rights reserved.

+ +
+ +
+
+ + {/* ── CONFIRM SUCCESS MODAL ── */} + + {showModal && ( + + + {/* Close Button */} + + + {/* Success check indicator */} +
+ + + +
+ +

+ {t.enquiryActive} +

+

+ {t.ambassadorActive} +

+ +

+ {t.enquirySuccess} +

+ + setShowModal(false)} + > + {t.dismiss} + +
+
+ )} +
+ +
+ + ); +} diff --git a/components/templates/HotelTemplate2/index.tsx b/components/templates/HotelTemplate2/index.tsx new file mode 100644 index 0000000..edad09f --- /dev/null +++ b/components/templates/HotelTemplate2/index.tsx @@ -0,0 +1,747 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.65, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.08 } }, +}; + +const translations = { + tr: { + navCabin: "Kulübemiz", + navHosts: "Hizmetlerimiz", + navChannels: "Rezervasyon", + navReviews: "Misafir Günlüğü", + bookWilderness: "Kulübeyi Ayırt", + est: "2015'TEN BERİ", + heroDesc: "Şebekeden bağımsız lüks dağ kulübesi inzivalarına dalın. Odun ateşinde taze ekmek fırın sabahları, rustik açık şömine salonları ve serin dağ nehrinde alabalık avı koordinatları.", + secureCabin: "REZERVASYON YAP", + cabinUnits: "Dağ Kulübeleri", + cabinWood: "Darby Kırmızı Sedir", + fireplaceUnit: "Tütsülü Şömine", + fireplaceType: "Doğal Taş Ocak", + aboutTitle: "Darby Dağ Yaşamı", + aboutHeader: "KULÜBE HAKKINDA", + aboutSub: "DOĞAL MT. LOGWOOD AKUSTİĞİ ALTINDA HUZUR", + aboutDesc: "Bitterroot Bunkhouse, Darby milli orman koordinatlarının derinliklerinde el işçiliğiyle inşa edilmiş iki adet kırmızı sedir dağ kulübesi sunar. Her kulübe döküm demir mutfak gereçleri, kurutulmuş huş odunları ve yerel gölleri keşfetmeniz için dağ rehberleriyle donatılmıştır.", + feat1Title: "YABANİ YÜRÜYÜŞ YOLLARI", + feat1Desc: "Arka terasınızdan doğrudan yaban çiçeği orman yollarına adım atın.", + feat2Title: "ODUN ATEŞİNDE SABAHLAR", + feat2Desc: "Her gün ücretsiz temin edilen şömine odunlarının ve döküm fırın ikramlarının keyfini çıkarın.", + channelsTitle: "Entegre Platformlar", + channelsHeader: "REZERVASYON YÖNTEMLERİ", + channelsDesc: "Senkronize edilmiş kanallarimizi aşağidan inceleyin. Komisyonsuz konaklamalar için Airbnb, VRBO veya doğrudan kurumsal web sitemiz üzerinden rezervasyon yapin.", + chAirbnb: "AIRBNB İLE REZERVE ET", + chVrbo: "VRBO İLE REZERVE ET", + chDirect: "DOĞRUDAN REZERVE (%15 TASARRUF)", + airbnbTitle: "Airbnb Superhost Kanalı", + airbnbDesc: "Giriş ve konaklama takvimlerini doğrudan Superhost sayfamızdan anlık doğrulayın. Klasik platform güvencesi arayan gezginler için idealdir.", + vrboTitle: "VRBO Premier Host Kanalı", + vrboDesc: "Aileler veya geniş gruplar için Premier Host statüsünde listelemeler. Grup iptal ve iade ayrıcalıkları çıkış esnasında otomatik olarak uygulanır.", + directTitle: "Doğrudan Kulübe Rezervasyonu", + directDesc: "Rezervasyon hizmet bedellerini tamamen atlayın. Girişte size özel taze ekşi mayalı sabah ekmeği, ücretsiz şömine odunu ve doğrudan VIP mihmandar desteği alın.", + launchPortal: "REZERVASYON PORTALINI BAŞLAT", + diaries: "Yaban Günlükleri", + lovedGuests: "MİSAFİRLERİMİZDEN KELİMELER", + vipServices: "VIP HİZMETLER", + mountainHelp: "Dağ Desteği", + mountainActive: "Her Gün 08:00 - 20:00 Aktif", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Kulübe Şartları", + dismiss: "KAPAT", + enquiryActive: "REZERVASYON ALINDI", + ambassadorActive: "Yaban Concierge Aktif", + enquirySuccess: "Darby dağ kulübesi rezervasyon talebinizi kaydettik. Sertifikalı yaban mihmandarımız geliş, sıcak ekmek ve kano yolları detaylarını planlamak için sizinle iletişime geçecektir. Teşekkürler!", + }, + en: { + navCabin: "Our cabin", + navHosts: "Host guides", + navChannels: "Book channels", + navReviews: "Guest diaries", + bookWilderness: "Book wilderness", + est: "ESTABLISHED IN 2015", + heroDesc: "Immerse in off-grid luxury cabin retreats. Wood-fired bakery mornings, rustic open fireplace lounges, and cold mountain river trout coordinates.", + secureCabin: "SECURE CABIN SLOTS", + cabinUnits: "A-frame lodges", + cabinWood: "Darby Cedar Wood", + fireplaceUnit: "Stocked fireplace", + fireplaceType: "Open Stone Hearth", + aboutTitle: "Darby Mountain Life", + aboutHeader: "ABOUT THE CABIN", + aboutSub: "OFF-GRID HEAVEN UNDER MT. LOGWOOD ACOUSTICS", + aboutDesc: "Bitterroot Bunkhouse provides two hand-crafted A-frame cedar lodges deep in the Darby forest coordinates. Each lodge is stocked with cast-iron cookware, seasoned logwood reserves, and local guides to explore hidden mountain lakes.", + feat1Title: "WILDERNESS TRAIL PATHS", + feat1Desc: "Walk directly from your back deck onto wildflower forest lines.", + feat2Title: "WOOD-FIRED MORNINGS", + feat2Desc: "Enjoy complimentary firewood logs and hot stone iron bakers daily.", + channelsTitle: "Integrated Platforms", + channelsHeader: "HOW TO SECURE BOOKINGS", + channelsDesc: "Toggle our synced channels below. Syncing Airbnb, VRBO, or our premium Direct reservation for commission-free stays.", + chAirbnb: "BOOK ON AIRBNB", + chVrbo: "BOOK ON VRBO", + chDirect: "BOOK DIRECT (SAVE 15%)", + airbnbTitle: "Airbnb Superhost Channel", + airbnbDesc: "Verify lodging calendars dynamically directly on our superhost page listing. Perfect for travelers seeking classic platform protection.", + vrboTitle: "VRBO Premier Host Channel", + vrboDesc: "Premier hosts status listings for families or large groups. All group cancellation benefits apply automatically upon checkout.", + directTitle: "Bunkhouse Direct Booking", + directDesc: "Skip booking service fees completely. Receive customized fresh morning sourdough, complimentary firewood, and direct VIP coordination.", + launchPortal: "LAUNCH RESERVATION PORTAL", + diaries: "Wilderness Diaries", + lovedGuests: "KIND WORDS FROM PAST GUESTS", + vipServices: "VIP SERVICES", + mountainHelp: "Mountain Help", + mountainActive: "Available 8 AM - 8 PM", + privacyRegs: "Privacy Regulations", + termsStay: "Terms of Cabin", + dismiss: "DISMISS", + enquiryActive: "CABIN REQUEST FILED", + ambassadorActive: "Wilderness Concierge Active", + enquirySuccess: "We have registered your Darby wilderness cabin coordinate request. A certified somatic host will contact you shortly to coordinate arrival, hot bread baking, and kayak paths. Thank you!", + } +}; + +export default function HotelTemplate2({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], yorumlar = [] } = data; + const [showModal, setShowModal] = useState(false); + const [channel, setChannel] = useState("direct"); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // 1. Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // 2. Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Localized services + const getLocalizedService = (baslik: string, aciklama: string) => { + if (baslik.includes("HOSTS")) { + return { + title: lang === "tr" ? "EV SAHİBİ REHBERLİĞİ" : "MEET YOUR HOSTS", + desc: lang === "tr" ? "Yerel dağ rehberlerimiz; alabalık avı yolları, yaban çiçeği rotaları ve gizli nehir haritaları koordinasyonunu üstlenir." : aciklama + }; + } + if (baslik.includes("POLICIES")) { + return { + title: lang === "tr" ? "KULÜBE KURALLARI" : "CABIN POLICIES", + desc: lang === "tr" ? "Evcil hayvan dostu konaklama koşulları. Döküm demir tava ve her zaman dolu odunluk güvenceleri." : aciklama + }; + } + return { + title: lang === "tr" ? "DOĞRUDAN REZERVE" : "DIRECT RESERVATION", + desc: lang === "tr" ? "Airbnb veya VRBO ile anlık takvim senkronizasyonu; dilerseniz komisyonsuz doğrudan rezervasyon avantajı." : aciklama + }; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500;600;700;800;900&display=swap'); + + :root { + --color-bunkhouse-gold: #854D0E; + --color-bunkhouse-sand: #F5F2EB; + --color-bunkhouse-stone: #1C1917; + --color-bunkhouse-card: #FAF8F5; + } + + .font-serif-bunkhouse { + font-family: 'Playfair Display', Georgia, serif; + } + + .font-industrial-bunkhouse { + font-family: 'Inter', sans-serif; + font-weight: 800; + } + + .font-sans-bunkhouse { + font-family: 'Inter', sans-serif; + } + + .bg-rustic-mesh { + background-image: + radial-gradient(circle at 10% 10%, rgba(133, 77, 14, 0.02) 0%, transparent 40%), + radial-gradient(circle at 90% 90%, rgba(28, 25, 23, 0.02) 0%, transparent 50%), + linear-gradient(rgba(28, 25, 23, 0.005) 1px, transparent 1px), + linear-gradient(90deg, rgba(28, 25, 23, 0.005) 1px, transparent 1px); + background-size: 100% 100%, 100% 100%, 30px 30px, 30px 30px; + } + + .border-bunkhouse { + border-color: rgba(28, 25, 23, 0.15); + } + + .hero-title-clamp { + font-size: clamp(34px, 5vw, 85px); + letter-spacing: -0.02em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + BITTERROOT BUNKHOUSE + +
+ +
+ + wilderness sanctuary + +
+
+ )} +
+ + {/* COZY RUSTIC WILDERNESS LODGE THEME */} +
+ + {/* Floating Woody Ambience Orbs */} +
+
+ + {/* ── MANDATORY FLOATING DEMO BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + + + {/* ── COZY HEADER ── */} + +
+ {/* Logo */} + + + + + + {firma.adi} + + + + {/* Links */} + + + {/* Language Selector + Booking Button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowModal(true)} + className="text-[9px] font-bold tracking-[2.5px] uppercase text-white bg-[#1C1917] hover:bg-[#854D0E] px-6 py-3.5 rounded-lg transition-all cursor-pointer shadow-md hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.bookWilderness} + +
+
+
+ + {/* ── COZY HERO BANNER (DARK CONTRAST) ── */} +
+ + {/* Ambient fire glow background */} +
+ + {/* Banner top */} +
+ + BITTERROOT VALLEY · MONTANA + + + {t.est} + +
+ + {/* Banner headings */} +
+

+ {firma.slogan} +

+

+ {t.heroDesc} +

+
+ + {/* Banner bottom details */} +
+
+
+ {t.cabinUnits} + {t.cabinWood} +
+
+ {t.fireplaceUnit} + {t.fireplaceType} +
+
+ setShowModal(true)} + className="px-8 py-4 bg-[#854D0E] hover:bg-white hover:text-[#1C1917] text-white font-bold text-[9px] tracking-[2.5px] uppercase rounded-xl transition-all cursor-pointer shadow-lg" + whileHover={{ scale: 1.02 }} + > + {t.secureCabin} + +
+ +
+ + {/* ── ABOUT THE CABIN WITH LAYERED GRAPHICS ── */} +
+
+ +
+ {t.aboutTitle} +

+ {t.aboutHeader} +

+
+
+ + {/* Layered images grid */} +
+ + {/* Left Column: 3 detailed pictures layered */} +
+ {/* 1st image: Sourdough fresh bakery */} +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + Wilderness breakfast sourdough bakery +
+ {/* 2nd image: Cozy fireside cooking */} +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + Cozy lodge stone fireplace cooking +
+
+ + {/* Right Column: Cabin text details */} +
+ EXCLUSIVELY HAND-CRAFTED +

+ {t.aboutSub} +

+

+ {t.aboutDesc} +

+ + {/* Details list */} +
+ {[ + { title: t.feat1Title, text: t.feat1Desc }, + { title: t.feat2Title, text: t.feat2Desc }, + ].map((feat, idx) => ( +
+ +
+

{feat.title}

+

{feat.text}

+
+
+ ))} +
+
+ +
+ +
+
+ + {/* ── CHANNELS & HOST GUIDES ── */} +
+
+ +
+ {hizmetler.map((hizmet, idx) => { + const locServ = getLocalizedService(hizmet.baslik, hizmet.aciklama); + return ( +
+
+
+ + + + +
+

+ {locServ.title} +

+

+ {locServ.desc} +

+
+ + +
+ ); + })} +
+ +
+
+ + {/* ── CHANNEL BOOKING INTEGRATION ── */} +
+
+ +
+
+ +
+ {t.channelsTitle} +

+ {t.channelsHeader} +

+

+ {t.channelsDesc} +

+
+ + {/* Toggle channels buttons */} +
+ {[ + { id: "airbnb", label: t.chAirbnb }, + { id: "vrbo", label: t.chVrbo }, + { id: "direct", label: t.chDirect }, + ].map(item => ( + + ))} +
+ + {/* Active channel info */} +
+

+ {channel === "airbnb" ? t.airbnbTitle : channel === "vrbo" ? t.vrboTitle : t.directTitle} +

+

+ {channel === "airbnb" + ? t.airbnbDesc + : channel === "vrbo" + ? t.vrboDesc + : t.directDesc} +

+ setShowModal(true)} + className="w-full py-4.5 rounded-xl bg-[#854D0E] hover:bg-white hover:text-[#1C1917] text-white font-bold text-[9px] tracking-[2px] uppercase cursor-pointer transition-colors shadow-md" + whileHover={{ scale: 1.01 }} + > + {t.launchPortal} + +
+ +
+ +
+
+ + {/* ── TESTIMONIALS ── */} +
+
+ +
+ {t.diaries} +

+ {t.lovedGuests} +

+
+ + {/* Grid */} +
+ {yorumlar.map((y, yIdx) => ( +
+
+ {[...Array(5)].map((_, starIdx) => ( + + + + ))} +
+ +

+ “{y.yorum}” +

+ +
+
+ {y.yazar.charAt(0)} +
+
+

+ {y.yazar} +

+ + {y.tarih} + +
+
+
+ ))} +
+ +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+ + {/* About Column */} +
+ + BitterrootBunkhouse + +

+ {firma.slogan} — Cozy hand-built rustic cedar cabins deep inside Darby forest valley. High-end off-grid luxury. +

+
+

+ + + + + {firma.adres} +

+

+ + + + + {firma.email} +

+
+
+ + {/* Coordinates Column */} +
+

+ {lang === "tr" ? "KULÜBE KOORDİNATLARI" : "CABIN COORDINATES"} +

+
+

{t.mountainHelp}
{t.mountainActive}

+

Check-In/Out
{lang === "tr" ? "Giriş: 16:00 · Çıkış: 10:00" : "Check In: 4:00 PM · Check Out: 10:00 AM"}

+
+
+ + {/* Services Column */} +
+

+ {t.vipServices} +

+
+ {hizmetler.map((h, hIdx) => { + const locS = getLocalizedService(h.baslik, h.aciklama); + return ( + + {locS.title} + + ); + })} +
+
+ +
+ +
+

© 2026 {firma.adi}. All rights reserved.

+ +
+ +
+
+ + {/* ── BOOKING MODAL ── */} + + {showModal && ( + + + {/* Close Button */} + + + {/* Success check indicator */} +
+ + + +
+ +

+ {t.enquiryActive} +

+

+ {t.ambassadorActive} +

+ +

+ {t.enquirySuccess} +

+ + setShowModal(false)} + > + {t.dismiss} + +
+
+ )} +
+ +
+ + ); +} diff --git a/components/templates/HotelTemplate3/index.tsx b/components/templates/HotelTemplate3/index.tsx new file mode 100644 index 0000000..5f050df --- /dev/null +++ b/components/templates/HotelTemplate3/index.tsx @@ -0,0 +1,750 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.65, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.08 } }, +}; + +const translations = { + tr: { + navIdeology: "Tasarım Felsefesi", + navServices: "Seçkin Hizmetler", + navPortfolio: "Portföyümüz", + navEnquire: "Ziyaret Başvurusu", + scheduleAccess: "Giriş Planla", + badge: "MİNİMAL MONOLİTİK VİLLA", + sloganTail: "BRÜT BETON ÇİZGİLERİYLE", + heroDesc: "Bodrum Yalıkavak kıyılarında saf yapısal lüksü yaşayın. Brüt monolitik beton formlar, sıfır kenar taşmalı sonsuzluk havuzları ve akıllı ev ses sistemleriyle tasarlandı.", + scheduleVisit: "ZİYARET PLANLA", + estatePortfolio: "VİLLA PORTFÖYÜ", + statTitle1: "PARAMETRE 1", + statTitle2: "PARAMETRE 2", + statTitle3: "PARAMETRE 3", + privateAmenities: "Özel Ayrıcalıklar", + bespokeServices: "SEÇKİN VİLLA HİZMETLERİ", + secureRes: "GİRİŞ BAŞVURUSU YAP →", + privilegedRequest: "Ayrıcalıklı Talep", + enquirePrivate: "ZİYARET VE EMLAK BAŞVURUSU", + formDesc: "Özel mimari koordinatörlerimizle iletişime geçerek yapılandırılmış villa gezilerini planlayın.", + fieldsName: "İsim Soyisim", + fieldsEmail: "E-Posta Adresi", + fieldsPhone: "İletişim Numarası", + fieldsProperty: "Mülk Kategorisi", + fieldsNotes: "Özel istekler", + fieldsNotesPlaceholder: "Helikopter pisti talepleri, kişisel güvenlik önlemleri...", + dispatchForm: "GÜVENLİK FORMUNU GÖNDER", + diaries: "Görüşler", + trustedOwners: "MÜLK SAHİPLERİNİN GÜVENCESİ", + vipCoords: "VIP KOORDİNATLAR", + securityHours: "Güvenlik Birimi", + securityActive: "24 Saat Kesintisiz Aktif", + heliport: "Özel Helikopter Pisti", + heliportActive: "Otomatik rötar senkronizasyonu", + estateServices: "VİLLA HİZMETLERİ", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Brüt Beton Koşulları", + dismiss: "KAPAT", + enquiryActive: "ZİYARET ONAYLANDI", + ambassadorActive: "Güvenlik Doğrulaması Başlatıldı", + enquirySuccess: "Yalıkavak brüt beton villa gezi talebinizi kaydettik. Güvenlik doğrulama koordinatörümüz, giriş detaylarını onaylamak için en kısa sürede sizinle iletişime geçecektir. Teşekkürler!", + }, + en: { + navIdeology: "Design ideology", + navServices: "Bespoke services", + navPortfolio: "Bento portfolio", + navEnquire: "Enquire access", + scheduleAccess: "Schedule Access", + badge: "MINIMAL MONOLITHIC VILLA", + sloganTail: "WITH CONCRETE LINES", + heroDesc: "Indulge in sheer structural luxury at Bodrum Yalıkavak coast lines. Designed with raw monolithic architectural concrete forms, zero-edge pools, and smart voice systems.", + scheduleVisit: "SCHEDULE VISIT", + estatePortfolio: "ESTATE PORTFOLIO", + statTitle1: "PARAMETER 1", + statTitle2: "PARAMETER 2", + statTitle3: "PARAMETER 3", + privateAmenities: "Private Amenities", + bespokeServices: "BESPOKE VILLA SERVICES", + secureRes: "ENQUIRE ACCESS →", + privilegedRequest: "Privileged Request", + enquirePrivate: "ENQUIRE PRIVATE ACCESS", + formDesc: "Connect with our somatic architectural coordinators to schedule structured property walkthroughs.", + fieldsName: "Name", + fieldsEmail: "Email", + fieldsPhone: "Phone", + fieldsProperty: "Property Category", + fieldsNotes: "Special details", + fieldsNotesPlaceholder: "Helipad requirements, personalized security levels...", + dispatchForm: "DISPATCH SECURITY FORM", + diaries: "Sommelier Reviews", + trustedOwners: "TRUSTED BY OWNERS", + vipCoords: "VIP COORDINATES", + securityHours: "Security Hours", + securityActive: "Active 24 Hours", + heliport: "Lounge Heliport", + heliportActive: "Automated delay syncing", + estateServices: "ESTATE SERVICES", + privacyRegs: "Privacy Regulations", + termsStay: "Terms of Concrete", + dismiss: "DISMISS", + enquiryActive: "VISIT GRANTED", + ambassadorActive: "Security Clearing Initiated", + enquirySuccess: "We have registered your executive Yalıkavak concrete villa walkthrough request. A security clearance coordinator will contact you shortly to authorize access parameters. Thank you!", + } +}; + +export default function HotelTemplate3({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], yorumlar = [] } = data; + const [showModal, setShowModal] = useState(false); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // 1. Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // 2. Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Localized statistics + const getLocalizedStat = (deger: string, etiket: string) => { + if (deger.includes("Concrete")) { + return { + deger: lang === "tr" ? "Brüt Beton" : "Concrete", + etiket: lang === "tr" ? "Tik ağacı zemin kaplamaları ile birleştirilmiş brüt monolitik beton formlar." : etiket + }; + } + if (deger.includes("Smart")) { + return { + deger: lang === "tr" ? "Akıllı Konut" : "Smart Estate", + etiket: lang === "tr" ? "Tam entegre ses arayüzleri, otomatik havalandırma ve yedek güneş enerjisi." : etiket + }; + } + return { + deger: lang === "tr" ? "Deniz Manzarası" : "Sea View", + etiket: lang === "tr" ? "Yerden tavana kadar kesintisiz cam panellerle tasarlanmış konsol yatak odaları." : etiket + }; + }; + + // Localized services + const getLocalizedService = (baslik: string, aciklama: string) => { + if (baslik.includes("ARCHITECTURAL")) { + return { + title: lang === "tr" ? "MİMARİ TURLAR" : "ARCHITECTURAL TOURS", + desc: lang === "tr" ? "Karbon yapılar, brüt beton dokular ve taşmalı havuzları gösteren özel emlak turları." : aciklama + }; + } + if (baslik.includes("MASTERCLASSES")) { + return { + title: lang === "tr" ? "TASARIM EĞİTİMLERİ" : "DESIGN MASTERCLASSES", + desc: lang === "tr" ? "Minimalist yaşam, özel mobilya yerleşimi ve sürdürülebilir brüt beton tasarımı atölyelerimiz." : aciklama + }; + } + return { + title: lang === "tr" ? "ÖZEL LÜKS VİLLA" : "EXECUTIVE LUXURY VILLA", + desc: lang === "tr" ? "Kişisel sommelier desteği, otomatik helikopter pisti ve üst düzey güvenlik ile tam mülk kiralama." : aciklama + }; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap'); + + :root { + --color-apex-emerald: #059669; + --color-apex-slate: #09090C; + --color-apex-card: #14141A; + --color-apex-white: #FAF8F5; + --color-apex-muted: rgba(250, 248, 245, 0.5); + } + + .font-apex-heading { + font-family: 'Inter', sans-serif; + font-weight: 900; + letter-spacing: -0.04em; + } + + .font-sans-apex { + font-family: 'Inter', sans-serif; + } + + .bg-apex-mesh { + background-image: + radial-gradient(circle at 10% 20%, rgba(5, 150, 105, 0.04) 0%, transparent 45%), + radial-gradient(circle at 90% 80%, rgba(250, 248, 245, 0.01) 0%, transparent 50%), + linear-gradient(rgba(255, 255, 255, 0.005) 1px, transparent 1px), + linear-gradient(90deg, rgba(255, 255, 255, 0.005) 1px, transparent 1px); + background-size: 100% 100%, 100% 100%, 40px 40px, 40px 40px; + } + + .emerald-glow { + box-shadow: 0 0 25px rgba(5, 150, 105, 0.15); + } + + .hero-title-clamp { + font-size: clamp(34px, 5.5vw, 85px); + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + APEX ARC MONOLITHIC + +
+ +
+ + brutalist villa estate + +
+
+ )} +
+ + {/* SLEEK BRUTALIST ARCHITECTURAL ESTATE THEME */} +
+ + {/* Floating Ambient Emerald Orbs */} +
+
+ + {/* ── MANDATORY FLOATING DEMO BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + + + {/* ── HIGH CONTRAST SLATE NAVBAR ── */} + +
+ {/* Logo */} + + + + + + + + + + {firma.adi} + + + + {/* Links */} + + + {/* Language Selector + Booking Button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowModal(true)} + className="text-[10px] font-black tracking-[2.5px] uppercase text-white bg-[#059669] hover:bg-white hover:text-black px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_5px_15px_rgba(5,150,105,0.2)] hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.scheduleAccess} + +
+
+
+ + {/* ── ARCHITECTURAL HERO BANNER ── */} +
+
+
+ + {/* Left Column: Heading and Brutalist descriptions */} + + + + {t.badge} + + + + {firma.slogan} +
+ {t.sloganTail} +
+ + + {t.heroDesc} + + + {/* Quick actions */} + + setShowModal(true)} + className="px-8 py-4 rounded-xl bg-[#059669] hover:bg-white hover:text-[#09090C] text-white font-black text-[10px] tracking-[2px] uppercase transition-all shadow-[0_5px_15px_rgba(5,150,105,0.25)] cursor-pointer" + whileHover={{ scale: 1.02 }} + > + {t.scheduleVisit} + + + {t.estatePortfolio} + + +
+ + {/* Right Column: High-fidelity image (brutalist fireplace oven) */} +
+ + {/* Raw concrete fireplace oven representing structural concrete warmth */} + {/* eslint-disable-next-line @next/next/no-img-element */} + Apex Arc Monolithic Architectural Fireplace +
+ +
+ +
+
+
+ + {/* ── IDEOLOGY STATISTICS BLOCK ── */} +
+
+
+ {istatistikler.map((stat, idx) => { + const locStat = getLocalizedStat(stat.deger, stat.etiket); + return ( +
+ {idx === 0 ? t.statTitle1 : idx === 1 ? t.statTitle2 : t.statTitle3} +

+ {locStat.deger} +

+

+ {locStat.etiket} +

+
+ ); + })} +
+
+
+ + {/* ── BESPOKE SERVICES ── */} +
+
+ +
+ {t.privateAmenities} +

+ {t.bespokeServices} +

+
+ + {/* Bento services grid */} +
+ {hizmetler.map((hizmet, idx) => { + const locServ = getLocalizedService(hizmet.baslik, hizmet.aciklama); + return ( + + {/* Cover image using dark upscale culinary smoke or organic lemon */} +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + {hizmet.baslik} +
+
+ +
+

+ {locServ.title} +

+

+ {locServ.desc} +

+
+ +
+ +
+ + ); + })} +
+ +
+
+ + {/* ── RESERVATION FLOW ── */} +
+
+ +
+
+ +
+ {t.privilegedRequest} +

+ {t.enquirePrivate} +

+

+ {t.formDesc} +

+
+ +
+ {[ + { label: t.fieldsName, placeholder: lang === "tr" ? "Adınız Soyadınız" : "Your Name", type: "text", full: false }, + { label: t.fieldsEmail, placeholder: "you@company.com", type: "email", full: false }, + { label: t.fieldsPhone, placeholder: lang === "tr" ? "İrtibat Numarası" : "Contact Number", type: "tel", full: false }, + { label: t.fieldsProperty, placeholder: lang === "tr" ? "Yalıkavak Beton Villa" : "Yalıkavak Concrete Villa", type: "text", full: false }, + { label: t.fieldsNotes, placeholder: t.fieldsNotesPlaceholder, type: "text", full: true }, + ].map((field, idx) => ( +
+ + +
+ ))} +
+ + setShowModal(true)} + className="mt-8 w-full py-4 rounded-xl bg-[#059669] hover:bg-white hover:text-[#09090C] text-white font-bold text-[10px] tracking-[2.5px] uppercase transition-colors cursor-pointer" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.dispatchForm} + +
+ +
+
+ + {/* ── TESTIMONIALS ── */} +
+
+ +
+ {t.diaries} +

+ {t.trustedOwners} +

+
+ + {/* Testimonials */} +
+ {yorumlar.map((y, yIdx) => ( + +
+ {[...Array(5)].map((_, starIdx) => ( + + + + ))} +
+ +

+ “{y.yorum}” +

+ +
+
+ {y.yazar.charAt(0)} +
+
+

+ {y.yazar} +

+ + {y.tarih} + +
+
+ +
+ ))} +
+ +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+ + {/* About Column */} +
+ + ApexArc + +

+ {firma.slogan} — Monolithic concrete-Teak luxury estates looking over Muğla coastlines. High-end voice smart interfaces. +

+
+

+ + + + + {firma.adres} +

+

+ + + + + {firma.email} +

+
+
+ + {/* Coordinates Column */} +
+

+ {t.vipCoords} +

+
+

{t.securityHours}
{t.securityActive}

+

{t.heliport}
{t.heliportActive}

+
+
+ + {/* Services Column */} +
+

+ {t.estateServices} +

+
+ {hizmetler.map((h, hIdx) => { + const locS = getLocalizedService(h.baslik, h.aciklama); + return ( + + {locS.title} + + ); + })} +
+
+ +
+ +
+

© 2026 {firma.adi}. All rights reserved.

+ +
+ +
+
+ + {/* ── ENQUIRY MODAL ── */} + + {showModal && ( + + + {/* Close Button */} + + + {/* Success check indicator */} +
+ + + +
+ +

+ {t.enquiryActive} +

+

+ {t.ambassadorActive} +

+ +

+ {t.enquirySuccess} +

+ + setShowModal(false)} + > + {t.dismiss} + +
+
+ )} +
+ +
+ + ); +} diff --git a/components/templates/KlinikTemplate/index.tsx b/components/templates/KlinikTemplate/index.tsx new file mode 100644 index 0000000..c00540c --- /dev/null +++ b/components/templates/KlinikTemplate/index.tsx @@ -0,0 +1,945 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.1 } }, +}; + +const translations = { + tr: { + navServices: "Hizmetlerimiz", + navDoctors: "Uzman Kadromuz", + navReviews: "Hasta Yorumları", + navContact: "İletişim", + navBooking: "Randevu Al", + badge: "GÜVENİLİR SAĞLIK MERKEZİ", + heroTitlePart1: "Sağlığınız İçin", + heroTitlePart2: "En İyi Ellerde", + heroTitlePart3: "Olun", + heroDesc: "Uzman hekim kadromuz, modern tıbbi donanımımız ve kişiye özel tedavi yaklaşımlarımızla sağlığınızı korumak için buradayız. Doğan Tıp Merkezi güvenilir koordinatları.", + appointmentsToday: "Bugünkü Randevular", + saturday: "Cumartesi, 28 Mayıs 2026", + appointmentList: [ + { saat: "09:30", tip: "Genel Muayene", dolu: true }, + { saat: "11:00", tip: "Check-Up Kontrolü", dolu: false }, + { saat: "13:30", tip: "Kardiyoloji Muayenesi", dolu: true }, + { saat: "15:00", tip: "Göz Muayenesi", dolu: false }, + ], + statusDolu: "Dolu", + statusMusait: "Müsait", + ratingText: "4.9 / 5 • 620+ Hasta Değerlendirmesi", + smsReminder: "SMS Hatırlatma", + smsDesc: "Randevularınızı asla kaçırmayın", + servicesTitle: "Hizmetlerimiz", + servicesHeader: "UZMAN KADROMUZLA HER ALANDA YANINIZDAYIZ", + learnMore: "Detaylı Bilgi →", + doctorsTitle: "Ekibimiz", + doctorsHeader: "ALANINDA UZMAN DOKTORLARIMIZ", + yearsExp: "Yıl Deneyim", + patientsTreated: "Hasta Tedavisi", + bookingTitle: "Online Randevu", + bookingHeader: "HEMEN RANDEVU OLUŞTURUN", + bookingDesc: "Formu doldurun, randevu koordinatörümüz sizi 15 dakika içinde arayıp gününüzü kesinleştirsin.", + fieldsName: "Ad Soyad", + fieldsPhone: "Telefon Numarası", + fieldsEmail: "E-Posta Adresi", + fieldsDepartment: "Bölüm / Klinik", + fieldsDate: "Randevu Tarihi", + fieldsNotes: "Notunuz / Şikayetiniz", + fieldsNotesPlaceholder: "Belirtmek istediğiniz tıbbi şikayetler veya özel notlar...", + dispatchForm: "RANDEVU TALEP ET", + contactDetails: "İLETİŞİM BİLGİLERİMİZ", + callCenter: "7/24 Çağrı Merkezi", + addressLabel: "Klinik Adresi", + emailLabel: "E-Posta", + footerDesc: "İleri tanı ve tedavi yöntemleri, hasta odaklı hizmet anlayışı ve seçkin hekim kadrosuyla sağlığınız için en güvenilir koordinat.", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Kullanım Şartları", + dismiss: "KAPAT", + contactTitle: "Hızlı Danışma", + contactDesc: "İletişim bilgilerinizi bırakın, tıbbi danışmanımız sizi hemen arasın.", + submit: "Gönder", + serviceDahiliye: "Dahiliye", + serviceDahiliyeDesc: "Erişkin hastalıklarında kapsamlı tanı ve tedavi hizmetleri.", + serviceKardiyoloji: "Kardiyoloji", + serviceKardiyolojiDesc: "Kalp ve damar sağlığı için ileri tanı ve tedavi yöntemleri.", + serviceDis: "Diş Hekimliği", + serviceDisDesc: "İmplant, ortodonti ve estetik gülüş tasarımı uygulamaları.", + serviceGoz: "Göz Sağlığı", + serviceGozDesc: "Lazer tedavileri, katarakt ve mikro cerrahi operasyonları.", + serviceLab: "Laboratuvar", + serviceLabDesc: "Hızlı, güvenilir ve tam kapsamlı tahlil sonuçları.", + serviceRad: "Radyoloji", + serviceRadDesc: "MR, bilgisayarlı tomografi ve ileri ultrason görüntüleme.", + }, + en: { + navServices: "Our Services", + navDoctors: "Our Doctors", + navReviews: "Testimonials", + navContact: "Contact", + navBooking: "Book Appointment", + badge: "TRUSTED MEDICAL CENTER", + heroTitlePart1: "Your Health", + heroTitlePart2: "In The Safest Hands", + heroTitlePart3: "Always", + heroDesc: "We protect your health with our expert physicians, state-of-the-art diagnostic systems, and customized treatment plans. Trusted coordinates of Doğan Medical Center.", + appointmentsToday: "Today's Schedule", + saturday: "Saturday, May 28, 2026", + appointmentList: [ + { saat: "09:30", tip: "General Checkup", dolu: true }, + { saat: "11:00", tip: "Prevention Review", dolu: false }, + { saat: "13:30", tip: "Cardiology Consult", dolu: true }, + { saat: "15:00", tip: "Ophthalmology Exam", dolu: false }, + ], + statusDolu: "Booked", + statusMusait: "Available", + ratingText: "4.9 / 5 • 620+ Patient Feedbacks", + smsReminder: "SMS Reminder", + smsDesc: "Never miss your medical checks", + servicesTitle: "Our Services", + servicesHeader: "COMPREHENSIVE MEDICAL CARE IN EVERY SPECIALTY", + learnMore: "Learn More →", + doctorsTitle: "Our Team", + doctorsHeader: "MEET OUR ACCOMPLISHED PHYSICIANS", + yearsExp: "Years Experience", + patientsTreated: "Patients Treated", + bookingTitle: "Online Booking", + bookingHeader: "SCHEDULE A MEDICAL APPOINTMENT", + bookingDesc: "Fill in the details and our patient representative will call you back within 15 minutes to lock your slot.", + fieldsName: "Full Name", + fieldsPhone: "Phone Number", + fieldsEmail: "Email Address", + fieldsDepartment: "Specialty / Department", + fieldsDate: "Preferred Date", + fieldsNotes: "Symptoms / Clinical Notes", + fieldsNotesPlaceholder: "Briefly describe your symptoms or specific notes for the doctor...", + dispatchForm: "REQUEST APPOINTMENT", + contactDetails: "CONTACT CHANNELS", + callCenter: "24/7 Call Center", + addressLabel: "Clinic Coordinates", + emailLabel: "Support Email", + footerDesc: "Trusted medical hub offering comprehensive diagnosis and advanced therapy protocols utilizing the latest patient care systems.", + privacyRegs: "Privacy Policy", + termsStay: "Terms of Service", + dismiss: "DISMISS", + contactTitle: "Quick Consultation", + contactDesc: "Leave your contact coordinates and our medical coordinator will call you back shortly.", + submit: "Submit", + serviceDahiliye: "Internal Medicine", + serviceDahiliyeDesc: "Comprehensive diagnostics and advanced therapies for adult diseases.", + serviceKardiyoloji: "Cardiology", + serviceKardiyolojiDesc: "Advanced diagnostics and treatment plans for cardiovascular wellness.", + serviceDis: "Dentistry", + serviceDisDesc: "Modern implants, clear aligners, and aesthetic smile design applications.", + serviceGoz: "Ophthalmology", + serviceGozDesc: "State-of-the-art laser corrections, cataract surgeries, and microsurgery.", + serviceLab: "Medical Laboratory", + serviceLabDesc: "Ultra-fast, certified, and fully automated biological analysis protocols.", + serviceRad: "Advanced Radiology", + serviceRadDesc: "High-resolution MRI, computerized tomography, and diagnostic ultrasound.", + } +}; + +export default function KlinikTemplate({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], doktorlar = [], yorumlar = [] } = data; + const [showBookingModal, setShowBookingModal] = useState(false); + const [activeYorum, setActiveYorum] = useState(0); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (x: number) => Math.min(1, 1.001 - Math.pow(2, -10 * x)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Localized statistics labels + const getLocalizedStatLabel = (deger: string) => { + if (deger === "4200") return lang === "tr" ? "Mutlu Hasta" : "Happy Patients"; + if (deger === "14") return lang === "tr" ? "Uzman Hekim" : "Expert Physicians"; + if (deger === "12") return lang === "tr" ? "Yıl Deneyim" : "Years of Experience"; + return lang === "tr" ? "Hasta Yorumu" : "Patient Reviews"; + }; + + // Maps services text based on data + const getLocalizedServiceText = (baslik: string) => { + if (baslik.includes("Dahiliye")) return { title: t.serviceDahiliye, desc: t.serviceDahiliyeDesc }; + if (baslik.includes("Kardiyoloji")) return { title: t.serviceKardiyoloji, desc: t.serviceKardiyolojiDesc }; + if (baslik.includes("Diş")) return { title: t.serviceDis, desc: t.serviceDisDesc }; + if (baslik.includes("Göz")) return { title: t.serviceGoz, desc: t.serviceGozDesc }; + if (baslik.includes("Laboratuvar")) return { title: t.serviceLab, desc: t.serviceLabDesc }; + return { title: t.serviceRad, desc: t.serviceRadDesc }; + }; + + // Maps service icons + const getServiceIconSvg = (baslik: string) => { + if (baslik.includes("Dahiliye")) { + return ( + + + + ); + } + if (baslik.includes("Kardiyoloji")) { + return ( + + + + ); + } + if (baslik.includes("Diş")) { + return ( + + + + ); + } + if (baslik.includes("Göz")) { + return ( + + + + + ); + } + if (baslik.includes("Laboratuvar")) { + return ( + + + + ); + } + return ( + + + + + ); + }; + + const getLocalizedDoctor = (ad: string) => { + if (ad.includes("Ahmet")) { + return { + name: lang === "tr" ? "Dr. Ahmet Yılmaz" : "Dr. Ahmet Yilmaz", + title: lang === "tr" ? "Dahiliye Uzmanı" : "Internal Medicine Specialist", + }; + } + if (ad.includes("Ayşe")) { + return { + name: lang === "tr" ? "Dr. Ayşe Kaya" : "Dr. Ayse Kaya", + title: lang === "tr" ? "Kardiyolog" : "Cardiologist", + }; + } + if (ad.includes("Mehmet")) { + return { + name: lang === "tr" ? "Dr. Mehmet Demir" : "Dr. Mehmet Demir", + title: lang === "tr" ? "Göz Sağlığı Uzmanı" : "Ophthalmology Specialist", + }; + } + return { + name: lang === "tr" ? "Dr. Zeynep Arslan" : "Dr. Zeynep Arslan", + title: lang === "tr" ? "Estetik Diş Hekimi" : "Aesthetic Dentist", + }; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500;600;700;800;900&family=Sora:wght@300;400;500;600;700;800&display=swap'); + + :root { + --color-klinik-sky: #0ea5e9; + --color-klinik-sky-dark: #0284c7; + --color-klinik-sky-light: #e0f2fe; + --color-klinik-charcoal: #0F172A; + --color-klinik-sand: #FAF8F5; + } + + .font-sora-editorial { + font-family: 'Sora', sans-serif; + } + + .font-sans-clean { + font-family: 'DM Sans', sans-serif; + } + + .shadow-premium { + box-shadow: 0 20px 40px -15px rgba(15, 23, 42, 0.05); + } + + .hero-title-clamp { + font-size: clamp(38px, 6vw, 85px); + letter-spacing: -0.02em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + DOĞAN TIP MERKEZİ + +
+ +
+ + interactive prototype + +
+
+ )} +
+ +
+ + {/* Floating Ambient Orbs */} +
+
+ + {/* ── FLOATING CONCEPT BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + {/* ── PREMIUM NAVBAR ── */} + +
+ {/* Logo */} + + + + + + + {firma.adi} + + + + {/* Links */} + + + {/* Language Selector + Booking Button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[10px] font-black tracking-[2.5px] uppercase text-white bg-[#0ea5e9] hover:bg-[#0284c7] px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_4px_12px_rgba(14,165,233,0.15)] hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.navBooking} + +
+
+
+ + {/* ── HERO & INTERACTIVE APPOINTMENT TRACKER ── */} +
+
+
+ + {/* Left Column: Heading and clinic stats */} + + + + {t.badge} + + + + {t.heroTitlePart1} +
+ {t.heroTitlePart2} +
+ {t.heroTitlePart3} +
+ + + {t.heroDesc} + + + {/* Statistics Grid */} + + {istatistikler.map((stat, idx) => ( +
+

+ {stat.deger === "4200" || stat.deger === "620" ? `${stat.deger}+` : stat.deger} +

+

+ {getLocalizedStatLabel(stat.deger)} +

+
+ ))} +
+ + {/* CTA buttons */} + + + 📅 {t.navBooking} + + + {t.navServices} + + +
+ + {/* Right Column: Layered Live Tracker Mockup */} +
+ +
+
+

{t.appointmentsToday}

+ {t.saturday} +
+
+ + + +
+
+ +
+ {t.appointmentList.map((r, i) => ( +
+
+
+
+
{r.saat}
+ {r.tip} +
+
+ + {r.dolu ? t.statusDolu : t.statusMusait} + +
+ ))} +
+ + {/* Rating Badge Overlay */} + + +
+
{t.ratingText.split("•")[0]}
+ {t.ratingText.split("•")[1]} +
+
+ + {/* SMS Reminder Overlay */} + + 🔔 +
+
{t.smsReminder}
+ {t.smsDesc} +
+
+ +
+ +
+
+
+ + {/* ── HİZMETLER ── */} +
+
+ + + {t.servicesTitle} + + + {t.servicesHeader} + + + + + {hizmetler.map((h, i) => { + const item = getLocalizedServiceText(h.baslik); + return ( + +
+
+ {getServiceIconSvg(h.baslik)} +
+

{item.title}

+

{item.desc}

+
+ +
+ ); + })} +
+
+
+ + {/* ── DOKTORLAR ── */} +
+
+ + + {t.doctorsTitle} + + + {t.doctorsHeader} + + + + + {doktorlar.map((d, i) => { + const doc = getLocalizedDoctor(d.ad); + return ( + +
+ + {d.emoji} + +
+
+

{doc.name}

+

{doc.title}

+
+ ⭐ {d.puan} + 🏥 {d.yil} {lang === "tr" ? "YIL" : "YRS"} + 👥 {d.hasta}+ {lang === "tr" ? "HASTA" : "PATS"} +
+
+
+ ); + })} +
+
+
+ + {/* ── ONLINE APPOINTMENT FORM ── */} +
+ + {/* Subtle cosmic grid layout */} +
+ +
+
+ + {/* Left Column: Contact details */} + + + {t.bookingTitle} + + + {t.bookingHeader} + + + {t.bookingDesc} + + + + {[ + { ikon: "📞", baslik: t.callCenter, aciklama: firma.telefon }, + { ikon: "📍", baslik: t.addressLabel, aciklama: firma.adres }, + { ikon: "✉️", baslik: t.emailLabel, aciklama: firma.email }, + ].map((item) => ( +
+ {item.ikon} +
+

{item.baslik}

+

{item.aciklama}

+
+
+ ))} +
+
+ + {/* Right Column: Appointment Form */} + +

{t.bookingTitle}

+
+ {[ + { label: t.fieldsName, placeholder: lang === "tr" ? "Adınız Soyadınız" : "Your Full Name", type: "text", full: false }, + { label: t.fieldsPhone, placeholder: "05xx xxx xx xx", type: "tel", full: false }, + { label: t.fieldsEmail, placeholder: "ornek@mail.com", type: "email", full: false }, + { label: t.fieldsDepartment, placeholder: "", type: "select", full: false }, + { label: t.fieldsDate, placeholder: "", type: "date", full: false }, + { label: t.fieldsNotes, placeholder: t.fieldsNotesPlaceholder, type: "text", full: true }, + ].map((field, i) => ( +
+ + {field.type === "select" ? ( + + ) : ( + + )} +
+ ))} +
+ setShowBookingModal(true)} + className="mt-6 w-full py-4.5 rounded-xl text-white font-black text-xs uppercase tracking-widest cursor-pointer shadow-[0_5px_15px_rgba(14,165,233,0.2)]" + style={{ background: `linear-gradient(135deg, ${firma.renkAna}, ${firma.renkKoyu})` }} + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + 📅 {t.dispatchForm} + +
+
+
+
+ + {/* ── TESTIMONIALS ── */} +
+
+ + + {t.navReviews} + +

+ {t.bookingTitle} +

+
+ +
+ + +
+ {[...Array(yorumlar[activeYorum]?.puan || 5)].map((_, i) => ( + + + + ))} +
+

+ “{yorumlar[activeYorum]?.yorum}” +

+
+
+ {yorumlar[activeYorum]?.yazar.charAt(0)} +
+
+

{yorumlar[activeYorum]?.yazar}

+

{yorumlar[activeYorum]?.tarih}

+
+
+
+
+ +
+ {yorumlar.map((_, i) => ( +
+
+
+
+ + {/* ── FOOTER ── */} +
+
+
+
+
+ + + + + {firma.adi} +
+

{t.footerDesc}

+
+

📍 {firma.adres}

+

📞 {firma.telefon}

+
+
+
+

{t.navServices}

+ {hizmetler.slice(0, 4).map((h, i) => { + const s = getLocalizedServiceText(h.baslik); + return ( + {s.title} + ); + })} +
+
+

Klinik

+ {[t.navServices, t.navDoctors, t.navReviews, t.navContact].map((item) => ( + {item} + ))} +
+
+
+

© 2026 {firma.adi}. All rights reserved.

+ +
+
+
+ + {/* ── BOOKING MODAL ── */} + + {showBookingModal && ( + + + + +

{t.contactTitle}

+

{t.contactDesc}

+ +
+
+ + +
+
+ + +
+ setShowBookingModal(false)} + > + {t.submit} + +
+
+
+ )} +
+
+ + ); +} diff --git a/components/templates/KurumsalTemplate/index.tsx b/components/templates/KurumsalTemplate/index.tsx new file mode 100644 index 0000000..4570403 --- /dev/null +++ b/components/templates/KurumsalTemplate/index.tsx @@ -0,0 +1,964 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.08 } }, +}; + +const translations = { + tr: { + navServices: "Hizmetlerimiz", + navProjects: "Referanslarımız", + navTeam: "Ekibimiz", + navReviews: "Görüşler", + navBooking: "Teklif Al", + badge: "PREMIUM LOJİSTİK OPERATÖRÜ", + heroTitlePart1: "Lojistikte", + heroTitlePart2: "Fark Yaratan", + heroTitlePart3: "Çözümler", + heroDesc: "Güvenli taşımacılık ve zamanında teslimat çözümleri. Teknoloji destekli operasyon yönetimi ve küresel tedarik zinciri entegrasyonu ile işinizi büyütüyoruz. Atlas Lojistik premium ağı.", + getQuote: "Teklif Al", + learnMore: "Referanslar", + projectsTitle: "Referanslarımız", + projectsHeader: "BİRLİKTE BÜYÜDÜĞÜMÜZ KÜRESEL MARKALAR", + teamTitle: "Ekibimiz", + teamHeader: "YÖNETİM VE OPERASYON KADROMUZ", + reviewsTitle: "Müşteri Görüşleri", + reviewsHeader: "GÜVENİLİR İŞ ORTAKLARIMIZ", + bookingTitle: "Teklif Talebi", + bookingHeader: "BİRLİKTE ÇALIŞALIM", + bookingDesc: "Tedarik zincirinizi veya lojistik operasyonunuzu optimize etmek için bilgilerinizi bırakın, uzmanlarımız özel çalışma planıyla geri dönsün.", + fieldsName: "Ad Soyad", + fieldsPhone: "Telefon Numarası", + fieldsEmail: "E-Posta Adresi", + fieldsCategory: "Hizmet Kategorisi", + fieldsDate: "Planlanan Tarih", + fieldsNotes: "Operasyon Notları / Detaylar", + fieldsNotesPlaceholder: "Yıllık sevkiyat hacmi, depo alanı veya özel taşıma ihtiyaçları...", + dispatchForm: "TEKLİF TALEBİ GÖNDER", + contactChannels: "İLETİŞİM KANALLARI", + callCenter: "Destek Hattı", + addressLabel: "Lojistik Merkezi", + emailLabel: "Kurumsal E-Posta", + footerDesc: "Tedarik zinciri yönetiminde JIT (Just-In-Time) modelleri, GDP sertifikalı soğuk zincir lojistiği ve 7/24 anlık takip güvencesi.", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Kullanım Şartları", + dismiss: "KAPAT", + contactTitle: "Hızlı Teklif Danışmanlığı", + contactDesc: "Lojistik gereksinimlerinizi bırakın, operasyon yöneticimiz 15 dakika içinde arasın.", + submit: "Gönder", + statExp: "Yıl Deneyim", + statClients: "Aktif Müşteri", + statCities: "Şehir Ağı", + statDelivery: "Zamanında Teslimat", + + // Services Localized + serviceKarayolu: "Karayolu Taşımacılığı", + serviceKarayoluDesc: "Yurtiçi ve uluslararası karayolu ile güvenli ve hızlı komple/parsiyel taşımacılık.", + serviceDepolama: "Depolama & Lojistik", + serviceDepolamaDesc: "Modern antrepolarımızda güvenli stok yönetimi, etiketleme ve dağıtım.", + serviceEticaret: "E-ticaret Lojistiği", + serviceEticaretDesc: "Son mile teslimat, iade yönetimi ve tam entegre fulfillment çözümleri.", + serviceUlusal: "Uluslararası Nakliye", + serviceUlusalDesc: "Gümrükleme, evrak takibi dahil kapıdan kapıya uluslararası taşımacılık.", + serviceSoguk: "Soğuk Zincir Lojistiği", + serviceSogukDesc: "Gıda ve ilaç sektörü için kontrollü sıcaklıkta GDP sertifikalı taşıma.", + serviceTakip: "7/24 Anlık Takip", + serviceTakipDesc: "Yüklerinizi ve sevkiyat rotalarınızı uydu üzerinden anlık takip edin.", + + // Projects Localized + projMigros: "Migros Dağıtım Ağı", + projMigrosDesc: "12 şehirde günlük 400+ perakende noktasına kesintisiz soğuk zincir dağıtım yönetimi.", + projTrendyol: "Trendyol Fulfillment", + projTrendyolDesc: "Günlük 8.000+ e-ticaret sipariş işleme, paketleme ve son mile hızlı teslimat.", + projFord: "Ford Otosan Tedarik", + projFordDesc: "JIT (Just-In-Time) metodolojisiyle otomotiv üretim fabrikasına parça tedarik zinciri lojistiği.", + projPfizer: "Pfizer İlaç Dağıtımı", + projPfizerDesc: "GDP standartlarında, tam ısı kontrollü soğuk zincir ile ilaç ve aşı lojistiği.", + }, + en: { + navServices: "Our Services", + navProjects: "References", + navTeam: "Our Team", + navReviews: "Testimonials", + navBooking: "Get Quote", + badge: "PREMIUM LOGISTICS OPERATOR", + heroTitlePart1: "Logistics", + heroTitlePart2: "Redefined With", + heroTitlePart3: "Precision", + heroDesc: "Secured transportation and JIT delivery frameworks. We optimize your supply chain with modern tech tracking, integrated warehousing, and global networks. Premium Atlas logistics hub.", + getQuote: "Get Quote", + learnMore: "References", + projectsTitle: "Our Works", + projectsHeader: "GLOBAL PARTNERS WE ARE PROUD TO GROW WITH", + teamTitle: "Our Team", + teamHeader: "OUR EXECUTIVE AND OPERATIONS DIRECTORS", + reviewsTitle: "Client Reviews", + reviewsHeader: "TRUSTED BY SECTOR LEADERS", + bookingTitle: "Quote Request", + bookingHeader: "WORK WITH US", + bookingDesc: "To optimize your supply chain or schedule specialized cargo coordination, leave your credentials and our managers will draft a customized execution plan.", + fieldsName: "Full Name", + fieldsPhone: "Phone Number", + fieldsEmail: "Email Address", + fieldsCategory: "Service Category", + fieldsDate: "Target Date", + fieldsNotes: "Operations Details", + fieldsNotesPlaceholder: "Annual volume, cold storage requests, or specific cargo dimensions...", + dispatchForm: "SEND QUOTE REQUEST", + contactChannels: "CONTACT CHANNELS", + callCenter: "Support Helpline", + addressLabel: "Logistics Hub", + emailLabel: "Corporate Email", + footerDesc: "Just-In-Time (JIT) manufacturing workflows, GDP certified cold chain facilities, and 7/24 satellite tracking systems.", + privacyRegs: "Privacy Policy", + termsStay: "Terms of Service", + dismiss: "DISMISS", + contactTitle: "Quick Consultation", + contactDesc: "Outline your logistics coordinates and our transport managers will reach back in 15 minutes.", + submit: "Submit", + statExp: "Years Experience", + statClients: "Active Clients", + statCities: "City Hubs", + statDelivery: "On-Time Delivery", + + // Services Localized + serviceKarayolu: "Road Transportation", + serviceKarayoluDesc: "Secured and rapid domestic/international full or partial truckload transport.", + serviceDepolama: "Warehousing & Logistics", + serviceDepolamaDesc: "Bespoke inventory management, labeling, and retail cross-docking.", + serviceEticaret: "E-Commerce Fulfillment", + serviceEticaretDesc: "Last-mile courier integration, automated return flows, and fulfillment.", + serviceUlusal: "Global Air/Ocean Cargo", + serviceUlusalDesc: "Door-to-door global shipping routes with integrated custom clearance clearance.", + serviceSoguk: "Cold Chain Transport", + serviceSogukDesc: "GDP certified multi-temp fleet specifically for food and pharmaceutical sectors.", + serviceTakip: "7/24 Satellite Tracking", + serviceTakipDesc: "Real-time satellite path tracking and automated delay coordination.", + + // Projects Localized + projMigros: "Migros Retail Supply", + projMigrosDesc: "Daily cold chain distribution routing to over 400+ points across 12 cities.", + projTrendyol: "Trendyol Fulfillment Hub", + projTrendyolDesc: "Handling 8,000+ daily e-commerce order dispatches with priority last-mile courier lanes.", + projFord: "Ford Otosan JIT Tedarik", + projFordDesc: "JIT manufacturing line support, synchronizing auto parts arrival exactly within scheduled shifts.", + projPfizer: "Pfizer Cold Chain Pharma", + projPfizerDesc: "GDP certified pharmaceutical transport using automated multi-temperature thermal cargo.", + } +}; + +export default function KurumsalTemplate({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], yorumlar = [], projeler = [], ekip = [] } = data; + const [showBookingModal, setShowBookingModal] = useState(false); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (x: number) => Math.min(1, 1.001 - Math.pow(2, -10 * x)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Localized stats label mappings + const getLocalizedStatLabel = (etiket: string) => { + if (etiket.includes("Deneyim")) return t.statExp; + if (etiket.includes("Müşteri")) return t.statClients; + if (etiket.includes("Şehir")) return t.statCities; + return t.statDelivery; + }; + + // Localized services text mappings + const getLocalizedServiceText = (baslik: string) => { + if (baslik.includes("Karayolu")) return { title: t.serviceKarayolu, desc: t.serviceKarayoluDesc }; + if (baslik.includes("Depolama")) return { title: t.serviceDepolama, desc: t.serviceDepolamaDesc }; + if (baslik.includes("E-ticaret")) return { title: t.serviceEticaret, desc: t.serviceEticaretDesc }; + if (baslik.includes("Uluslararası")) return { title: t.serviceUlusal, desc: t.serviceUlusalDesc }; + if (baslik.includes("Soğuk")) return { title: t.serviceSoguk, desc: t.serviceSogukDesc }; + return { title: t.serviceTakip, desc: t.serviceTakipDesc }; + }; + + // Localized projects text mappings + const getLocalizedProjectText = (baslik: string) => { + if (baslik.includes("Migros")) return { title: t.projMigros, desc: t.projMigrosDesc, sector: lang === "tr" ? "Perakende" : "Retail" }; + if (baslik.includes("Trendyol")) return { title: t.projTrendyol, desc: t.projTrendyolDesc, sector: lang === "tr" ? "E-Ticaret" : "E-Commerce" }; + if (baslik.includes("Ford")) return { title: t.projFord, desc: t.projFordDesc, sector: lang === "tr" ? "Otomotiv" : "Automotive" }; + return { title: t.projPfizer, desc: t.projPfizerDesc, sector: lang === "tr" ? "İlaç" : "Pharmaceutical" }; + }; + + // Custom vector icons for services (No generic emojis) + const getServiceIconSvg = (baslik: string) => { + if (baslik.includes("Karayolu")) { + return ( + + + + + ); + } + if (baslik.includes("Depolama")) { + return ( + + + + ); + } + if (baslik.includes("E-ticaret")) { + return ( + + + + ); + } + if (baslik.includes("Uluslararası")) { + return ( + + + + ); + } + if (baslik.includes("Soğuk")) { + return ( + + + + ); + } + return ( + + + + ); + }; + + const getLocalizedTeam = (ad: string) => { + if (ad.includes("Murat")) return { name: "Murat Yıldız", role: lang === "tr" ? "Genel Müdür" : "Managing Director" }; + if (ad.includes("Hande")) return { name: "Hande Çelik", role: lang === "tr" ? "Operasyon Direktörü" : "Operations Director" }; + if (ad.includes("Serkan")) return { name: "Serkan Aydın", role: lang === "tr" ? "Teknoloji Müdürü" : "Technology Director" }; + return { name: "Neslihan Kara", role: lang === "tr" ? "Müşteri Deneyimi Yöneticisi" : "Customer Success Lead" }; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap'); + + :root { + --color-kurumsal-indigo: #6366f1; + --color-kurumsal-indigo-dark: #4f46e5; + --color-kurumsal-indigo-light: #eef2ff; + --color-kurumsal-charcoal: #0F172A; + --color-kurumsal-sand: #FAF8F5; + } + + .font-heavy-sans { + font-family: 'Inter', sans-serif; + font-weight: 900; + } + + .font-sans-clean { + font-family: 'Inter', sans-serif; + } + + .shadow-premium { + box-shadow: 0 20px 40px -15px rgba(15, 23, 42, 0.05); + } + + .hero-title-clamp { + font-size: clamp(38px, 6vw, 90px); + letter-spacing: -0.03em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + ATLAS LOGISTICS + +
+ +
+ + interactive prototype + +
+
+ )} +
+ +
+ + {/* Floating Ambient Orbs */} +
+
+ + {/* ── FLOATING CONCEPT BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + {/* ── PREMIUM HEADER ── */} + +
+ {/* Logo */} + + + + + + + {firma.adi} + + + + {/* Links */} + + + {/* Language Selector + Quote Button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[10px] font-black tracking-[2.5px] uppercase text-white bg-[#6366f1] hover:bg-[#4f46e5] px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_4px_12px_rgba(99,102,241,0.15)] hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.navBooking} + +
+
+
+ + {/* ── HERO & BENTO HIGHLIGHTS ── */} +
+
+
+ + {/* Left Column: Heavy typography and stats */} + + + + {t.badge} + + + + {t.heroTitlePart1} +
+ {t.heroTitlePart2} +
+ {t.heroTitlePart3} +
+ + + {t.heroDesc} + + + {/* Statistics Grid */} + + {istatistikler.map((stat, idx) => ( +
+

+ {stat.deger} +

+

+ {getLocalizedStatLabel(stat.etiket)} +

+
+ ))} +
+ + {/* CTA buttons */} + + setShowBookingModal(true)} + className="inline-flex items-center gap-3 px-8 py-4.5 rounded-xl bg-[#6366f1] hover:bg-[#4f46e5] text-white font-black text-[10px] tracking-[2px] uppercase transition-all shadow-[0_5px_15px_rgba(99,102,241,0.2)] cursor-pointer" + whileHover={{ scale: 1.02 }} + > + 📅 {t.getQuote} + + + {t.learnMore} + + +
+ + {/* Right Column: Bento style highlights preview */} +
+ {hizmetler.slice(0, 4).map((h, i) => { + const s = getLocalizedServiceText(h.baslik); + return ( + +
+ {getServiceIconSvg(h.baslik)} +
+
+

{s.title}

+

{s.desc}

+
+
+ ); + })} +
+ +
+
+
+ + {/* ── HİZMETLER FULL BENTO GRID ── */} +
+
+ + + + {t.navServices} + + + {lang === "tr" ? "Kapsamlı Lojistik Çözüm Paketi" : "Comprehensive Logistics Solutions"} + + + + + {hizmetler.map((h, i) => { + const s = getLocalizedServiceText(h.baslik); + return ( + +
+
+ {getServiceIconSvg(h.baslik)} +
+

{s.title}

+

{s.desc}

+
+ + +
+ ); + })} +
+
+
+ + {/* ── REFERANSLAR (PROJELER) ── */} +
+
+ + + + {t.projectsTitle} + + + {t.projectsHeader} + + + + + {projeler.map((p, i) => { + const proj = getLocalizedProjectText(p.baslik); + return ( + +
+
+ {p.ikon} +
+
+
+

{proj.title}

+ + {proj.sector} + +
+

{proj.desc}

+
+
+ + +
+ ); + })} +
+
+
+ + {/* ── EKİP (TEAM) ── */} + {ekip.length > 0 && ( +
+
+ + + + {t.teamTitle} + + + {t.teamHeader} + + + + + {ekip.map((k, i) => { + const member = getLocalizedTeam(k.ad); + return ( + +
+ + {k.emoji} + +
+
+

{member.name}

+

{member.role}

+
+
+ ); + })} +
+
+
+ )} + + {/* ── YORUMLAR (TESTIMONIALS) ── */} +
+
+ + + + {t.reviewsTitle} + + + {t.reviewsHeader} + + + + + {yorumlar.map((y, i) => ( + +
+
+ {[...Array(y.puan || 5)].map((_, j) => ( + + + + ))} +
+

“{y.yorum}”

+
+ +
+
+ {y.emoji} +
+
+

{y.yazar.split("—")[0]}

+

{y.yazar.split("—")[1] || t.reviewsTitle}

+
+
+
+ ))} +
+
+
+ + {/* ── İLETİŞİM / TEKLİF AL ── */} +
+ + {/* Subtle cosmic grid layout */} +
+ +
+
+ + {/* Left Column: contact information */} + + + {t.bookingTitle} + + + {t.bookingHeader} + + + {t.bookingDesc} + + + + {[ + { ikon: "📞", baslik: t.callCenter, aciklama: firma.telefon }, + { ikon: "📍", baslik: t.addressLabel, aciklama: firma.adres }, + { ikon: "✉️", baslik: t.emailLabel, aciklama: firma.email }, + ].map((item) => ( +
+ {item.ikon} +
+

{item.baslik}

+

{item.aciklama}

+
+
+ ))} +
+
+ + {/* Right Column: Quote Form */} + +

{t.bookingTitle}

+
+ {[ + { label: t.fieldsName, placeholder: lang === "tr" ? "Adınız Soyadınız" : "Your Full Name", type: "text", full: false }, + { label: t.fieldsPhone, placeholder: "05xx xxx xx xx", type: "tel", full: false }, + { label: t.fieldsEmail, placeholder: "ornek@mail.com", type: "email", full: false }, + { label: t.fieldsCategory, placeholder: "", type: "select", full: false }, + { label: t.fieldsDate, placeholder: "", type: "date", full: false }, + { label: t.fieldsNotes, placeholder: t.fieldsNotesPlaceholder, type: "text", full: true }, + ].map((field, i) => ( +
+ + {field.type === "select" ? ( + + ) : ( + + )} +
+ ))} +
+ setShowBookingModal(true)} + className="mt-6 w-full py-4.5 rounded-xl text-white font-black text-xs uppercase tracking-widest cursor-pointer shadow-[0_5px_15px_rgba(99,102,241,0.2)]" + style={{ background: `linear-gradient(135deg, ${firma.renkAna}, ${firma.renkKoyu})` }} + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + 📅 {t.dispatchForm} + +
+ +
+
+
+ + {/* ── FOOTER ── */} +
+
+
+
+
+ + + + + {firma.adi} +
+

{firma.slogan} — {t.footerDesc}

+
+

📍 {firma.adres}

+

📞 {firma.telefon}

+
+
+
+

{t.navServices}

+ {hizmetler.slice(0, 4).map((h, i) => { + const s = getLocalizedServiceText(h.baslik); + return ( + {s.title} + ); + })} +
+
+

Company

+ {[t.navServices, t.navProjects, t.navTeam, t.navReviews].map((item) => ( + {item} + ))} +
+
+
+

© 2026 {firma.adi}. All rights reserved.

+ +
+
+
+ + {/* ── CONSULTATION SUCCESS MODAL ── */} + + {showBookingModal && ( + + + + +

{t.contactTitle}

+

{t.contactDesc}

+ +
+
+ + +
+
+ + +
+ setShowBookingModal(false)} + > + {t.submit} + +
+
+
+ )} +
+
+ + ); +} diff --git a/components/templates/RestoranTemplate/index.tsx b/components/templates/RestoranTemplate/index.tsx new file mode 100644 index 0000000..995afa2 --- /dev/null +++ b/components/templates/RestoranTemplate/index.tsx @@ -0,0 +1,1044 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.08 } }, +}; + +const translations = { + tr: { + navHeritage: "Mirasımız", + navSpecial: "Şefin Seçimi", + navBakery: "Günlük Ekmekler", + navServices: "Ayrıcalıklar", + navBooking: "Rezervasyon", + badge: "SIGNATURE STEAKHOUSE & GASTRONOMY", + heroTitlePart1: "Lezzet", + heroTitlePart2: "Sanatı & Ateşin", + heroTitlePart3: "Mirasımız", + heroDesc: "Ateş, duman ve Palermo zanaatkarlığıyla şekillenen lezzet dolu bir yolculuk. Karaköy limanında, seçkin gurmeler için özenle tasarlanan imza steakhouse koordinatları.", + learnMore: "Heritage Keşfet", + reserveTable: "Rezervasyon Yap", + heritageTitle: "Zanaat Hikayesi", + heritageHeader: "LEZZETİN ANATOMİSİ", + heritageDesc: "Karaköy limanının en eski taş duvarları arasında, Palermo'nun asırlık pişirme tekniklerini modern gastronomi vizyonuyla harmanlıyoruz. Ağır ateşte dinlendirilmiş Wagyu etlerinden, odun fırınında pişen taze ekşi mayalara uzanan bir tutku.", + specialTitle: "Şefin İmzası", + specialHeader: "HAFTALIK SPESİYALLER", + specialDesc: "Taze mevsim otları, el yapımı soslar ve meşe odununda dinlendirilmiş Wagyu lezzetlerini keşfedin.", + bakeryTitle: "Zanaat Fırınımız", + bakeryHeader: "GÜNLÜK EKŞİ MAYALAR", + bakeryDesc: "Her sabah 05:00'te taş fırınımızda maya kokusuyla başlayan hikaye. İtalyan unları, doğal ekşi maya ve 48 saatlik fermantasyon ile elde açılan eşsiz ekmekler.", + servicesTitle: "Ayrıcalıklarımız", + servicesHeader: "MİSAFİRLERİMİZ İÇİN PREMIUM SEÇENEKLER", + reviewsTitle: "Gurme Değerlendirmeleri", + reviewsHeader: "MİSAFİRLERİMİZİN DİLİNDEN HİKAYELER", + bookingTitle: "Masa Rezervasyonu", + bookingHeader: "REZERVASYON YAPIN", + bookingDesc: "Seçkin caz akustiği ve loş kehribar aydınlatmalı salonumuzda masanızı şimdiden ayırtın.", + fieldsName: "Ad Soyad", + fieldsPhone: "Telefon Numarası", + fieldsDate: "Randevu Tarihi", + fieldsTime: "Rezervasyon Saati", + fieldsGuests: "Kişi Sayısı", + fieldsNotes: "Özel İstek / Not", + fieldsNotesPlaceholder: "Diyet hassasiyetleri, VIP uşak talepleri, yıldönümü vb...", + dispatchForm: "REZERVASYON TALEBİNİ GÖNDER", + guarantee: "Bu formu doldurarak doğrulanmış bir rezervasyon sağlarsınız. Masalar, rezervasyon saatinden itibaren 15 dakika boyunca adınıza tutulur.", + footerDesc: "Geleneksel zanaat, ağır ateşte meşe odununda dinlendirilmiş imza Wagyu bonfileleri ve Palermo fırıncılık mirası.", + privacyRegs: "Gizlilik Sözleşmesi", + termsStay: "Kullanım Şartları", + dismiss: "KAPAT", + contactTitle: "Hızlı Rezervasyon", + contactDesc: "Karaköy salon koordinatörümüzün sizi hemen araması için bilgilerinizi bırakın.", + submit: "Gönder", + alacarteTitle: "À la Carte Deneyimi", + alacarteDesc: "Seçkin malzemelerle hazırlanan meşe odununda dinlendirilmiş Wagyu imza yemeklerimizi keşfedin.", + specialEventTitle: "Özel Kutlamalar", + specialEventDesc: "Doğum günü, evlilik yıldönümü ve kutlamalar için kişiselleştirilmiş şef menüleri.", + cateringTitle: "Kurumsal Akustik", + cateringDesc: "İş yemekleri ve kurumsal lansman organizasyonları için premium gurme catering hizmeti.", + deliveryTitle: "Tavola Evinizde", + deliveryDesc: "Özel korumalı kuryelerimizle en taze gurme lezzetleri kapınıza getiriyoruz.", + categoryTitle1: "Başlangıçlar", + categoryTitle2: "Ana Yemekler", + categoryTitle3: "Tatlılar", + + // Menus Localized + menuHummus: "Ev Yapımı Hummus", + menuHummusDesc: "Fırından taze lavaş ve soğuk sıkım İtalyan trüf yağı ile.", + menuBruschetta: "Karidesli Bruschetta", + menuBruschettaDesc: "Taze marine domates, fesleğen ve sarımsak emülsiyonu.", + menuBurrata: "Burrata Salatası", + menuBurrataDesc: "Cherry domates, fesleğen sosu ve taze roka yaprakları.", + menuWagyu: "Wagyu Bonfile", + menuWagyuDesc: "Fırınlanmış kuşkonmaz ve trüf mantarlı patates püresi eşliğinde.", + menuLevrek: "Levrek Fileto", + menuLevrekDesc: "Limonlu tereyağı sosu, kapari ve taze bahçe otları.", + menuRisotto: "Mantar Risotto", + menuRisottoDesc: "Yabani orman mantarları ve Parmigiano Reggiano peyniri ile.", + menuBrule: "Crème Brûlée", + menuBruleDesc: "Gerçek Madagaskar vanilyası ve karamelize şeker kıtırı.", + menuFondant: "Çikolatalı Fondant", + menuFondantDesc: "Belçika çikolatası dolgulu sıcak kek, vanilyalı dondurma.", + menuKunefe: "Karaköy Künefesi", + menuKunefeDesc: "Halis tereyağlı çıtır tel kadayıf ve manda kaymağı.", + }, + en: { + navHeritage: "Our Heritage", + navSpecial: "Chef's Specials", + navBakery: "Daily Bakery", + navServices: "Leisures", + navBooking: "Reservation", + badge: "SIGNATURE STEAKHOUSE & GASTRONOMY", + heroTitlePart1: "Crafting", + heroTitlePart2: "Flame & Steak", + heroTitlePart3: "Heritage", + heroDesc: "A journey of raw ingredients transformed by fire, smoke, and Palermo craftsmanship. Exquisite coordinates situated at Karaköy docks designed for refined palates.", + learnMore: "Explore Heritage", + reserveTable: "Reserve Table", + heritageTitle: "Heritage Narrative", + heritageHeader: "ANATOMY OF FLAVOR", + heritageDesc: "Surrounded by Karaköy's historical stone walls, we merge Palermo's ancient wood-fired baking roots with modern culinary vision. A passion spanning oak-aged Wagyu steaks and sourdough crusts.", + specialTitle: "Signature Cuts", + specialHeader: "WEEKLY CULINARY SPECS", + specialDesc: "Discover fresh orchard herbs, house-made sauces, and oak-fired Wagyu steak creations.", + bakeryTitle: "Chalkboard Bakery", + bakeryHeader: "DAILY SOURDOUGH BOULES", + bakeryDesc: "Every morning at 05:00 AM, our stone ovens fill with sourdough fragrance. Hand-stretched using premium Italian flour and 48-hour fermentation.", + servicesTitle: "Boutique Leisures", + servicesHeader: "PREMIUM SERVICES FOR REFINED GUESTS", + reviewsTitle: "Gourmet Diaries", + reviewsHeader: "LOVED BY GLOBAL WRITERS", + bookingTitle: "Table Booking", + bookingHeader: "SECURE RESERVATION", + bookingDesc: "Reserve your private velvet booth or live-cooking counter inside our acoustic jazz lounge.", + fieldsName: "Full Name", + fieldsPhone: "Phone Number", + fieldsDate: "Target Date", + fieldsTime: "Reservation Time", + fieldsGuests: "Guest Count", + fieldsNotes: "Bespoke Requests", + fieldsNotesPlaceholder: "Dietary restrictions, VIP butler dispatch, anniversary settings...", + dispatchForm: "SEND RESERVATION REQUEST", + guarantee: "Submitting this form registers a verified priority slot. Tables are held exactly for 15 minutes beyond the scheduled time.", + footerDesc: "Traditional craft, signature oak-aged Wagyu beef cuts, and Palermo baking heritage.", + privacyRegs: "Privacy Policy", + termsStay: "Terms of Service", + dismiss: "DISMISS", + contactTitle: "Quick Reservation", + contactDesc: "Leave your contact details and our salon representative will call you back immediately.", + submit: "Submit", + alacarteTitle: "À la Carte Gastronomy", + alacarteDesc: "Savor our signature oak-aged Wagyu ribeye cuts built with the finest local ingredients.", + specialEventTitle: "Bespoke Gatherings", + specialEventDesc: "Custom tasting menus and sommelier coordination for birthdays and private lounges.", + cateringTitle: "Corporate Acoustics", + cateringDesc: "Professional gourmet catering configurations for corporate launches and executive dinners.", + deliveryTitle: "Tavola at Home", + deliveryDesc: "Delivering hot gourmet culinary setups directly to your address via priority dispatch.", + categoryTitle1: "Appetizers", + categoryTitle2: "Main Courses", + categoryTitle3: "Desserts", + + // Menus Localized + menuHummus: "House-Crafted Hummus", + menuHummusDesc: "Served with hot wood-fired flatbread and cold pressed truffle oil mist.", + menuBruschetta: "Shrimp Bruschetta", + menuBruschettaDesc: "Marinated cherry tomatoes, botanical basil, garlic emulsion.", + menuBurrata: "Creamy Burrata", + menuBurrataDesc: "Heirloom tomatoes, organic basil pesto, taze baby wild rocket.", + menuWagyu: "A5 Wagyu Ribeye", + menuWagyuDesc: "Accompanied by fire-charred asparagus and black truffle potato mash.", + menuLevrek: "Sea Bass Filet", + menuLevrekDesc: "Citrus butter reduction, capillary capers, and taze orchard herbs.", + menuRisotto: "Wild Mushroom Risotto", + menuRisottoDesc: "Foraged forest mushrooms, aged Parmigiano Reggiano, micro greens.", + menuBrule: "Crème Brûlée", + menuBruleDesc: "Infused with organic Madagascar vanilla and caramelized sugar crust.", + menuFondant: "Molten Lava Fondant", + menuFondantDesc: "Rich Belgian chocolate cake shell with house vanilla bean gelato.", + menuKunefe: "Traditional Künefe", + menuKunefeDesc: "Crisp shredded pastry loaded with melted unsalted cheese, thick buffalo cream.", + } +}; + +export default function RestoranTemplate({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], menu = [], yorumlar = [] } = data; + const [showBookingModal, setShowBookingModal] = useState(false); + const [aktifKategori, setAktifKategori] = useState(0); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (x: number) => Math.min(1, 1.001 - Math.pow(2, -10 * x)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // Preloader Curtain Timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Localized stats label mappings + const getLocalizedStatLabel = (deger: string) => { + if (deger.includes("Heritage")) return lang === "tr" ? "Yıllık Köklü Miras" : "Years of Heritage"; + if (deger.includes("Dishes")) return lang === "tr" ? "İmza Tabaklar" : "Signature Dishes"; + if (deger.includes("Rating")) return lang === "tr" ? "Ortalama Değerlendirme" : "Average Guest Rating"; + return lang === "tr" ? "Aylık Gurme Misafir" : "Monthly Diners"; + }; + + // Localized services text mappings + const getLocalizedServiceText = (baslik: string) => { + if (baslik.includes("Carte")) return { title: t.alacarteTitle, desc: t.alacarteDesc }; + if (baslik.includes("Günler")) return { title: t.specialEventTitle, desc: t.specialEventDesc }; + if (baslik.includes("Kurumsal")) return { title: t.cateringTitle, desc: t.cateringDesc }; + return { title: t.deliveryTitle, desc: t.deliveryDesc }; + }; + + // Custom vector icons for services (No generic emojis) + const getServiceIconSvg = (ikon: string) => { + switch (ikon) { + case "alacarte": + return ( + + + + ); + case "special": + return ( + + + + ); + case "catering": + return ( + + + + ); + default: + return ( + + + + + ); + } + }; + + // Localized menu items + const getLocalizedMenuItemText = (ad: string) => { + if (ad.includes("Hummus")) return { title: t.menuHummus, desc: t.menuHummusDesc }; + if (ad.includes("Bruschetta")) return { title: t.menuBruschetta, desc: t.menuBruschettaDesc }; + if (ad.includes("Burrata")) return { title: t.menuBurrata, desc: t.menuBurrataDesc }; + if (ad.includes("Wagyu")) return { title: t.menuWagyu, desc: t.menuWagyuDesc }; + if (ad.includes("Levrek")) return { title: t.menuLevrek, desc: t.menuLevrekDesc }; + if (ad.includes("Risotto")) return { title: t.menuRisotto, desc: t.menuRisottoDesc }; + if (ad.includes("Brûlée")) return { title: t.menuBrule, desc: t.menuBruleDesc }; + if (ad.includes("Fondant")) return { title: t.menuFondant, desc: t.menuFondantDesc }; + return { title: t.menuKunefe, desc: t.menuKunefeDesc }; + }; + + const getLocalizedCategoryTitle = (kategori: string) => { + if (kategori.includes("Başlangıç")) return t.categoryTitle1; + if (kategori.includes("Ana")) return t.categoryTitle2; + return t.categoryTitle3; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500;600;700;800&display=swap'); + + :root { + --color-restaurant-gold: #C5A880; + --color-restaurant-charcoal: #090A0C; + --color-restaurant-slate: #13151A; + } + + .font-serif-editorial { + font-family: 'Playfair Display', Georgia, serif; + } + + .font-sans-clean { + font-family: 'Inter', sans-serif; + } + + .shadow-premium { + box-shadow: 0 20px 40px -15px rgba(0, 0, 0, 0.4); + } + + .grain-overlay { + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.025'/%3E%3C/svg%3E"); + } + + .marquee-text-flow { + white-space: nowrap; + animation: marquee 25s linear infinite; + } + + @keyframes marquee { + 0% { transform: translateX(0%); } + 100% { transform: translateX(-50%); } + } + + .hero-title-clamp { + font-size: clamp(38px, 6vw, 90px); + letter-spacing: -0.01em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + LEZZET MUTFAĞI + +
+ +
+ + interactive prototype + +
+
+ )} +
+ +
+ + {/* Grain texture */} +
+ + {/* Ambient glow blobs */} +
+
+ + {/* ── FLOATING CONCEPT BANNER ── */} +
+
+ + {lang === "tr" ? "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." : "This website is a premium concept prototype designed by Ayris Tech."} + +
+ + {/* ── FLOATING NAVBAR ── */} + +
+ {/* Logo */} + + + {firma.adi} + + + + {/* Links */} + + + {/* Language Selector + Reserve Button */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[10px] font-sans-clean font-black tracking-[2.5px] uppercase text-black bg-[#C5A880] hover:bg-[#d5b990] px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_4px_12px_rgba(197,168,128,0.15)] hidden sm:block" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.reserveTable} + +
+
+
+ + {/* ── HERO SECTION WITH EDITORIAL BACKGROUND zoom ── */} +
+
+
+ +
+ +
+ + + + {t.badge} + + + + {t.heroTitlePart1} +
+ {t.heroTitlePart2} +
+ {t.heroTitlePart3} +
+ + + {t.heroDesc} + + + + + + {t.learnMore} + + +
+
+
+ + {/* ── IMZA AN: INFINITE MARQUEE BAND ── */} +
+
+ {lang === "tr" ? "Lezzet Mutfağı Karaköy" : "Karaköy Culinary Heritage"} · + {lang === "tr" ? "İmza Steakhouse ve Gastronomi" : "Signature Wagyu Steak cuts"} · + {lang === "tr" ? "Geleneksel Pişirme Teknikleri" : "Wood-Fired Fermented Sourdough"} · + {lang === "tr" ? "Palermo Zanaat Kültürü" : "Palermo Baking Roots"} · + + {lang === "tr" ? "Lezzet Mutfağı Karaköy" : "Karaköy Culinary Heritage"} · + {lang === "tr" ? "İmza Steakhouse ve Gastronomi" : "Signature Wagyu Steak cuts"} · + {lang === "tr" ? "Geleneksel Pişirme Teknikleri" : "Wood-Fired Fermented Sourdough"} · + {lang === "tr" ? "Palermo Zanaat Kültürü" : "Palermo Baking Roots"} · +
+
+ + {/* ── SECTION 2: HERITAGE / ABOUT US (3 COLUMN SPLIT) ── */} +
+
+ +
+ + {/* Left text column */} + + + {t.heritageTitle} + + + {t.heritageHeader} + + + {t.heritageDesc} + + + {/* Stat pile inside heritage */} + + {istatistikler.map((stat, sIdx) => ( +
+

{stat.deger}

+

{getLocalizedStatLabel(stat.etiket)}

+
+ ))} +
+
+ + {/* Right layered imagery column */} +
+ +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + Chef Plating Wagyu Ribeye + +
+ +
+ +
+
+ + {/* ── SECTION 3: ŞEFİN SEÇİMİ (DOTTED MENU GRID) ── */} +
+
+ +
+ + {/* Left Col: Gourmet active sauté shot */} +
+ +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + Flaming Gourmet sauté preparation + {/* Small tag inside photo */} +
+
+

Flaming sauté

+

Live from karaköy kitchen

+
+ 🔥 +
+ +
+ + {/* Right Col: The Dotted Menu List */} + + + {t.specialTitle} + + + {t.specialHeader} + + + {t.specialDesc} + + + {/* Dotted lines menu item lists */} +
+ {menu[aktifKategori]?.urunler.map((item) => { + const text = getLocalizedMenuItemText(item.ad); + return ( + +
+ + {text.title} + +
+ + {item.fiyat} + +
+

+ {text.desc} +

+ + ); + })} +
+ + {/* Menu categories tabs */} + + {menu.map((kat, idx) => ( + + ))} + +
+ +
+ +
+
+ + {/* ── SECTION 4: CHALKBOARD BAKERY ── */} +
+
+ +
+ + {/* Left Side: Sourdough Details */} + + + {t.bakeryTitle} + + + {t.bakeryHeader} + + + {t.bakeryDesc} + + + {/* Sourdough Boule metrics */} +
+ {[ + { title: lang === "tr" ? "Geleneksel İtalyan Ciabatta" : "Traditional Italian Ciabatta", desc: "1250g | 45 min | 230°C", body: lang === "tr" ? "Altın çıtır kabuklu, bol gözenekli Palermo klasiği." : "Gold crispy crust, high hydration classic boules." }, + { title: lang === "tr" ? "Çavdar Sourdough Boule" : "Rye Sourdough Boule", desc: "750g | 38 min | 240°C", body: lang === "tr" ? "Aktif karbon, çavdar ve özel ekşi maya ile pişirilmiş tahıllı ekmek." : "Baked with active charcoal, organic rye, and local sourdough." } + ].map((bread, bIdx) => ( + +
+

{bread.title}

+ {bread.desc} +
+

{bread.body}

+
+ ))} +
+
+ + {/* Right Side: Flatlay image */} +
+ +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + Sourdough flatlay chalkboard + +
+ +
+ +
+
+ + {/* ── SECTION 5: SERVICES (SVG ICONS - NO EMOJIS) ── */} +
+
+ +
+ {t.servicesTitle} +

+ {t.servicesHeader} +

+
+ +
+ {hizmetler.map((h, i) => { + const s = getLocalizedServiceText(h.baslik); + return ( + +
+ {getServiceIconSvg(h.ikon)} +
+

+ {s.title} +

+

+ {s.desc} +

+
+ ); + })} +
+ +
+
+ + {/* ── SECTION 6: TESTIMONIALS (YORUMLAR) ── */} +
+
+ +
+ {t.reviewsTitle} +

+ {t.reviewsHeader} +

+
+ +
+ {yorumlar.map((y, i) => ( + +
+ {[...Array(y.puan || 5)].map((_, j) => ( + + + + ))} +
+ +

+ “{y.yorum}” +

+ +
+
+ {y.emoji} +
+
+

+ {y.yazar.split("—")[0]} +

+ + {y.tarih} + +
+
+
+ ))} +
+ +
+
+ + {/* ── SECTION 7: RANDEVU AL / RESERVATION ── */} +
+
+ +
+
+ {t.bookingTitle} +

+ {t.bookingHeader} +

+

+ {t.bookingDesc} +

+
+ +
+ {[ + { label: t.fieldsName, placeholder: lang === "tr" ? "Adınız Soyadınız" : "Your Full Name", type: "text", full: false }, + { label: t.fieldsPhone, placeholder: "05xx xxx xx xx", type: "tel", full: false }, + { label: t.fieldsDate, placeholder: "", type: "date", full: false }, + { label: t.fieldsTime, placeholder: "", type: "time", full: false }, + { label: t.fieldsGuests, placeholder: "2", type: "number", full: false }, + { label: t.fieldsNotes, placeholder: t.fieldsNotesPlaceholder, type: "text", full: true }, + ].map((field, i) => ( +
+ + +
+ ))} +
+ +
+

+ {t.guarantee} +

+ setShowBookingModal(true)} + className="w-full md:w-auto px-10 py-4.5 rounded-xl text-[#090A0C] font-sans-clean font-black tracking-[2px] uppercase bg-[#C5A880] hover:bg-[#d5b990] transition-colors cursor-pointer text-xs shrink-0 shadow-[0_5px_15px_rgba(197,168,128,0.15)]" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.dispatchForm} + +
+
+ +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+
+ + {firma.adi} + +

+ {firma.slogan} — {t.footerDesc} +

+
+

📍 {firma.adres}

+

📞 {firma.telefon}

+
+
+ +
+

+ {lang === "tr" ? "Şefin Menüsü" : "Tasting Menu"} +

+ {menu.map((kat, idx) => ( + + {getLocalizedCategoryTitle(kat.kategori)} + + ))} +
+ +
+

+ {lang === "tr" ? "Karaköy Restoran" : "Karakoy Steakhouse"} +

+ {[t.navHeritage, t.navSpecial, t.navBakery, t.navServices].map(item => ( + + {item} + + ))} +
+
+ +
+

© 2026 {firma.adi}. All rights reserved.

+ +
+ +
+
+ + {/* ── FAST BOOKING OVERLAY MODAL ── */} + + {showBookingModal && ( + + + + +

+ {t.contactTitle} +

+

+ {lang === "tr" ? "Karaköy Rezervasyon Hattı" : "Karakoy Booking Desk"} +

+ +
+
+ + +
+
+ + +
+ setShowBookingModal(false)} + > + {t.submit} + +
+
+
+ )} +
+
+ + ); +} diff --git a/components/templates/RestoranTemplate2/index.tsx b/components/templates/RestoranTemplate2/index.tsx new file mode 100644 index 0000000..a979593 --- /dev/null +++ b/components/templates/RestoranTemplate2/index.tsx @@ -0,0 +1,1056 @@ +"use client"; + +import { motion, useScroll, useTransform, AnimatePresence } from "framer-motion"; +import { useRef, useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; +import AnimatedCounter from "@/components/ui/AnimatedCounter"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.1 } }, +}; + +const translations = { + tr: { + navStory: "Hikayemiz", + navMenu: "Makarna & Pizza", + navOrchard: "Limon Bahçesi", + navServices: "Hizmetlerimiz", + navBook: "Rezervasyon", + bookTable: "Masa Ayırt", + discoverMenu: "Menüyü Keşfet", + badge: "SİCİLYA ZANAATKAR MUTFAĞI", + heroTitlePart1: "Keten, Limonlar", + heroTitlePart2: "& Odun Ateşinde", + heroDesc: "Karaköy limanında, Sicilya rüzgarları esiyor. El yapımı makarnalar, taze baharatlar ve odun ateşinde karamelize olan lezzetler.", + storySubtitle: "Sicilya Fırıncılık Mirası", + storyTitle: "Hikayemiz", + storyDesc: "Odun ateşinin alevi ve zeytin ağacı közlerinin aroması. Sicilia Tavola, nesiller boyu aktarılan İtalyan tariflerini zanaatkar ellerle buluşturuyor. Her pizza taş fırınımızda 485 derecede saniyeler içinde mükemmelleşiyor.", + menuSubtitle: "Taze Seçeneklerimiz", + menuTitle: "Makarna & Pizza", + lemonSubtitle: "Limon, Keten & Zeytinyağı", + lemonTitle: "Limon Bahçesi", + lemonDesc: "Bizim zeytinyağlarımız ve limonlarımız doğrudan Sicilya bahçelerimizden gelir. %100 soğuk sıkım, organik ve asit oranı sıfıra yakın. Her yemeğin can damarı.", + lemonBadgeText: "ORGANİK NARENCİYE • SOĞUK SIKIM SIZMA ZEYTİNYAĞI •", + lemonBottomText: "Siracusa'daki biyolojik tarım ortaklarımızdan elde edilen, elle toplanmış organik limonlar ve zeytinyağları kullanıyoruz.", + servicesSubtitle: "Ayrıcalıklarımız", + servicesTitle: "Hizmetlerimiz", + testimonialsSubtitle: "Misafir Hikayeleri", + testimonialsTitle: "Misafir Yorumları", + bookingSubtitle: "Masa Rezervasyonu", + bookingTitle: "Masa Rezervasyonu", + bookingDesc: "Karaköy Trattoria'mızda unutulmaz bir akşam yemeği için yerinizi ayırtın.", + formName: "Ad Soyad", + formNamePlaceholder: "Adınız Soyadınız", + formPhone: "Telefon", + formPhonePlaceholder: "05xx xxx xx xx", + formDate: "Tarih", + formTime: "Saat", + formGuests: "Kişi Sayısı", + formNotes: "Özel Notlar", + formNotesPlaceholder: "Diyet sınırlandırmaları veya özel kutlamalar...", + formSubmit: "Masa Ayırt", + footerDesc: "Siracusa bahçelerinden Karaköy limanına.", + footerRights: "Tüm hakları saklıdır.", + footerPrivacy: "Gizlilik Politikası · Çerez Ayarları", + quickBookTitle: "Hızlı Rezervasyon", + quickBookDesc: "Karaköy Trattoria Hattı", + quickBookSubmit: "Rezervasyon Gönder", + conceptBanner: "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır." + }, + en: { + navStory: "Our Story", + navMenu: "Pasta & Pizza", + navOrchard: "Lemon Orchard", + navServices: "Services", + navBook: "Book Table", + bookTable: "Book Table", + discoverMenu: "Discover Menu", + badge: "SICILIAN ARTISANAL KITCHEN", + heroTitlePart1: "Linen, Lemons", + heroTitlePart2: "& Wood-fired", + heroDesc: "Sicilian winds blow over the Istanbul port. Hand-rolled pastas, fresh aromatic herbs, and rich flavors caramelized in our wood-fired stone oven.", + storySubtitle: "Sicilian Baking Heritage", + storyTitle: "Our Story", + storyDesc: "The flicker of wood fire and the warm aroma of olive branch embers. Sicilia Tavola blends generations of authentic Italian culinary secrets with modern artisanal hands. Each pizza reaches crispy perfection inside our 485-degree stone oven in seconds.", + menuSubtitle: "Our Fresh Selections", + menuTitle: "Pasta & Pizza", + lemonSubtitle: "Lemons, Linen & Olives", + lemonTitle: "Lemon Orchard", + lemonDesc: "Our signature olive oils and organic lemons are sourced directly from our private biological orchards in Sicily. 100% cold-pressed, completely natural, and low acidity. The soul of every dish.", + lemonBadgeText: "ORGANIC CITRUS • COLD PRESSED EXTRA VIRGIN •", + lemonBottomText: "We use only hand-picked organic lemons and olive oils sourced from biological farming partners in Siracusa.", + servicesSubtitle: "Our Offerings", + servicesTitle: "Our Services", + testimonialsSubtitle: "Guest Stories", + testimonialsTitle: "Guest Reviews", + bookingSubtitle: "Tavola Reservation", + bookingTitle: "Table Reservation", + bookingDesc: "Book your exclusive slot for an unforgettable dining experience in our Karaköy Trattoria.", + formName: "Name & Surname", + formNamePlaceholder: "Your full name", + formPhone: "Phone Number", + formPhonePlaceholder: "Phone number", + formDate: "Date", + formTime: "Time", + formGuests: "Guests", + formNotes: "Special Notes", + formNotesPlaceholder: "Dietary restrictions or special celebrations...", + formSubmit: "Book Table Now", + footerDesc: "From Siracusa orchards directly to Karaköy port.", + footerRights: "All rights reserved.", + footerPrivacy: "Privacy Policy · Cookie Settings", + quickBookTitle: "Quick Reservation", + quickBookDesc: "Karaköy Trattoria Dispatch Line", + quickBookSubmit: "Submit Details", + conceptBanner: "This website is a premium concept prototype designed by Ayris Tech." + } +}; + +export default function RestoranTemplate2({ data }: { data: DemoData }) { + const { firma, istatistikler, hizmetler, menu = [], yorumlar = [] } = data; + const heroRef = useRef(null); + + const { scrollYProgress } = useScroll({ target: heroRef, offset: ["start start", "end start"] }); + const heroY = useTransform(scrollYProgress, [0, 1], ["0%", "20%"]); + + const [aktifKategori, setAktifKategori] = useState(0); + const [showBookingModal, setShowBookingModal] = useState(false); + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + const t = translations[lang]; + + // 1. Lenis Smooth Scroll Setup + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // 2. Preloader curtain timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Dynamic localization handlers + const getLocalizedStat = (etiket: string) => { + if (etiket.toLowerCase().includes("baking")) return lang === "tr" ? "Sicilya Fırıncılık Kökleri" : "Sicilian Baking Roots"; + if (etiket.toLowerCase().includes("pressed")) return lang === "tr" ? "Organik Soğuk Sıkım Yağ" : "Organic Cold Pressed Oil"; + if (etiket.toLowerCase().includes("gastronomy")) return lang === "tr" ? "Ortalama Gastronomi Puanı" : "Average Gastronomy Rating"; + return lang === "tr" ? "Yıllık Mutlu Misafir" : "Happy Diners Annually"; + }; + + const getLocalizedService = (baslik: string, aciklama: string) => { + if (baslik.toLowerCase().includes("carte")) { + return { + title: lang === "tr" ? "À la Carte Gastronomi" : "À la Carte Gastronomy", + desc: lang === "tr" ? "Odun ateşinde pişen taze makarnalar, taze deniz mahsulleri ve Sicilya klasikleri." : "Wood-fired fresh pasta, coastal seafood selections, and authentic Sicilian classics." + }; + } + if (baslik.toLowerCase().includes("trattoria") || baslik.toLowerCase().includes("geceleri")) { + return { + title: lang === "tr" ? "Trattoria Geceleri" : "Trattoria Evenings", + desc: lang === "tr" ? "Özel canlı akordeon dinletileri ve şefin tadım menüleri eşliğinde Sicilya akşamları." : "Accordion acoustic performances coupled with custom tasting menus for starry Sicilian nights." + }; + } + if (baslik.toLowerCase().includes("zeytinyağı") || baslik.toLowerCase().includes("oil")) { + return { + title: lang === "tr" ? "Zeytinyağı Tadımı" : "Olive Oil Tastings", + desc: lang === "tr" ? "Kendi bahçelerimizden gelen %100 soğuk sıkım sızma zeytinyağlarımızı keşfedin." : "Discover 100% biological cold-pressed extra virgin olive oils directly from our Siracusa orchards." + }; + } + return { + title: lang === "tr" ? "Tavola Evinizde" : "Tavola at Home", + desc: lang === "tr" ? "Özel korumalı kuryelerimizle en taze gurme lezzetleri kapınıza getiriyoruz." : "Gourmet biological flavors safely packaged and dispatched directly to your doorstep." + }; + }; + + const getLocalizedMenuCategory = (kategori: string) => { + if (kategori.toLowerCase().includes("primi")) return lang === "tr" ? "Primi Piatti (Başlangıç)" : "Primi Piatti"; + if (kategori.toLowerCase().includes("secondi")) return lang === "tr" ? "Secondi (Ana Yemek)" : "Secondi"; + return lang === "tr" ? "Dolci (Tatlı)" : "Dolci"; + }; + + const getLocalizedMenuItem = (ad: string, aciklama: string) => { + if (ad.toLowerCase().includes("caprese")) { + return { + ad: "Caprese di Burrata", + desc: lang === "tr" ? "Manda burrata, pembe domates dilimleri, taze fesleğen ve sızma zeytinyağı" : "Buffalo burrata, heirloom tomato fillets, aromatic fresh basil, and cold-pressed olive oil" + }; + } + if (ad.toLowerCase().includes("carpaccio")) { + return { + ad: "Carpaccio di Polpo", + desc: lang === "tr" ? "İnce dilimlenmiş marine ahtapot, kapari, bebek roka ve limon emülsiyonu" : "Wafer-thin octopus slices, wild capers, organic baby arugula, and lemon emulsion" + }; + } + if (ad.toLowerCase().includes("focaccia")) { + return { + ad: "Focaccia al Rosmarino", + desc: lang === "tr" ? "Taş fırından yeni çıkmış deniz tuzu, taze biberiye ve sızma zeytinyağlı" : "Stone-oven fresh rosemary focaccia topped with coarse sea salt crystals and olive oil mist" + }; + } + if (ad.toLowerCase().includes("tagliatelle")) { + return { + ad: "Tagliatelle al Ragu di Polpo", + desc: lang === "tr" ? "Ağır ateşte pişmiş ahtapot ragu, taze el yapımı tagliatelle" : "Slow-braised octopus ragout layered over fresh hand-rolled organic egg tagliatelle" + }; + } + if (ad.toLowerCase().includes("margherita")) { + return { + ad: "Pizza Margherita DOP", + desc: lang === "tr" ? "Odun ateşinde taş fırın pizza, San Marzano domates, taze mozzarella di bufala" : "Authentic San Marzano tomato pulp, creamy mozzarella di bufala, and stone-oven charred crust" + }; + } + if (ad.toLowerCase().includes("polpo alla griglia")) { + return { + ad: "Polpo alla Griglia", + desc: lang === "tr" ? "Izgara ahtapot kolları, kapari, cherry domates ve ezilmiş sarımsaklı bebek patates" : "Tender charred octopus arms paired with capers, blistered cherry tomatoes, and garlic fingerlings" + }; + } + if (ad.toLowerCase().includes("cannoli")) { + return { + ad: "Cannoli Siciliani", + desc: lang === "tr" ? "Çıtır hamur tüpleri içinde tatlı ricotta kreması, çikolata parçacıkları ve Antep fıstığı" : "Crispy pastry tubes stuffed with sweet sheep's milk ricotta, dark chocolate curls, and Bronte pistachio" + }; + } + if (ad.toLowerCase().includes("tiramisu")) { + return { + ad: "Tiramisu al Limone", + desc: lang === "tr" ? "Limon likörlü hafif mascarpone kreması, taze limon kabuğu rendesi ile" : "Light lemon-liqueur soaked ladyfingers covered in delicate lemon-mascarpone whipped cream" + }; + } + return { + ad: "Gelato di Pistacchio", + desc: lang === "tr" ? "Kendi imalatımız gerçek Bronte Antep fıstıklı İtalyan dondurması" : "House-churned organic Sicilian pistachio gelato made with 100% biological Bronte pistachios" + }; + }; + + const getLocalizedTestimonial = (yazar: string, yorum: string) => { + if (yazar.toLowerCase().includes("ender")) { + return lang === "tr" ? "Limon kokuları ve çalan müzikler eşliğinde kendimizi Sicilya'da hissettik. Ahtapot makarna tek kelimeyle kusursuzdu." : "We felt completely transported to Siracusa with the lemon breeze and acoustic accordion. The octopus pasta was sheer culinary perfection."; + } + return lang === "tr" ? "Focaccia ekmeği ve sızma zeytinyağının kalitesi buranın zanaatkarlığını kanıtlıyor. Mutlaka rezervasyon yaptırın." : "The sheer crumb of the rosemary focaccia paired with biological extra virgin olive oil speaks volumes. A must-visit Karaköy gem."; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Inter:wght@300;400;500;600;700;800;900&display=swap'); + + :root { + --color-cobalt: #0038A8; + --color-cobalt-muted: rgba(0, 56, 168, 0.15); + --color-linen: #FDFBF7; + --color-linen-dark: #F5F2EB; + --color-text-dark: #121C22; + --color-leaf: #3C5A48; + } + + .font-serif-sicilia { + font-family: 'Playfair Display', Georgia, serif; + } + + .font-sans-clean { + font-family: 'Inter', sans-serif; + } + + .spinning-lemon { + animation: spin 20s linear infinite; + } + + @keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } + } + + .dappled-sunlight { + background-image: radial-gradient(circle at 80% 20%, rgba(253, 251, 247, 0.1) 0%, transparent 60%); + opacity: 0.85; + mix-blend-mode: multiply; + } + + .hero-title-clamp { + font-size: clamp(38px, 6.2vw, 92px); + letter-spacing: -0.02em; + line-height: 0.95; + } + `; + + const getIconSvg = (name: string) => { + switch (name) { + case "alacarte": + return ( + + + + ); + case "special": + return ( + + + + ); + case "catering": + return ( + + + + ); + case "delivery": + return ( + + + + + ); + default: + return ( + + + + ); + } + }; + + return ( + <> + + + {/* ── IMZA AN: CURTAIN REVEAL PRELOADER ── */} + + {preloader && ( + +
+ + {firma.adi.toUpperCase()} + +
+ +
+ + interactive prototype + +
+
+ )} +
+ + {/* ── MANDATORY FLOATING DEMO BANNER ── */} +
+
+ + {t.conceptBanner} + +
+ + {/* ── SUN-DRENCHED OLIVE BRANCH LEAF OVERLAYS (WILMA & SICILIA INSPIRED) ── */} +
+ {/* Top-Left Olive Branch SVG Overlay */} +
+ + + + + + + + +
+ {/* Mid-Right Olive Branch */} +
+ + + + + + +
+
+ + {/* ── HEADER ── */} + +
+ {/* Logo */} + + + + + + {firma.adi} + + + + {/* Navigation Links */} + + + {/* Action button & Lang selector */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[11px] font-sans-clean font-black tracking-[2px] uppercase text-white bg-[#0038A8] hover:bg-[#002266] px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-md shadow-[#0038A8]/20 hidden sm:block" + whileHover={{ scale: 1.03 }} + whileTap={{ scale: 0.98 }} + > + {t.bookTable} + +
+
+
+ + {/* ── HERO SECTION ── */} +
+ + {/* Parallax sun-drenched backdrop container */} +
+ +
+
+ + {/* Left Content */} + + + + {t.badge} + + + + {t.heroTitlePart1} +
+ {t.heroTitlePart2} +
+ + + {t.heroDesc} + + + + + {t.discoverMenu} + + +
+ + {/* Right Content: Hand-crafted Sun-Drenched Image in offset frame */} +
+ + {/* Main Generated High-Fidelity Table Image */} + {/* eslint-disable-next-line @next/next/no-img-element */} + Sicilia Tavola Fresh Tomato Pasta + +
+ +
+
+
+ + {/* ── SECTION 2: OUR STORY / WOOD OVEN (DOUBLE SPLIT) ── */} +
+
+ +
+ + {/* Left Col: Stone Oven Photo */} +
+ + {/* eslint-disable-next-line @next/next/no-img-element */} + Trattoria Stone Wood-Fired Oven + +
+ + {/* Right Col: Story detail and chalkboard metrics */} + + + {t.storySubtitle} + + + {t.storyTitle} + + + + {t.storyDesc} + + + {/* Grid Metrics - Chalkboard Styled */} + + {istatistikler.slice(0, 2).map((s, i) => ( +
+
+ {s.deger} +
+
+ {getLocalizedStat(s.etiket)} +
+
+ ))} +
+
+ +
+ +
+
+ + {/* ── SECTION 3: PASTA & PIZZA MENU (EDITORIAL BLUE DOTTED connectors) ── */} +
+
+ +
+ + {/* Left Col: Dotted Menu List */} + + + {t.menuSubtitle} + + + {t.menuTitle} + + +
+ {menu[aktifKategori]?.urunler.map((item) => { + const locItem = getLocalizedMenuItem(item.ad, item.aciklama); + return ( + +
+ + {locItem.ad} + + {/* Dotted lines connector */} +
+ + {item.fiyat} + +
+

+ {locItem.desc} +

+ + ); + })} +
+ + {/* Category Tab Buttons below the menu */} + + {menu.map((kat, idx) => ( + + ))} + +
+ + {/* Right Col: Active Roasted Octopus Blue Plate image */} +
+ + {/* eslint-disable-next-line @next/next/no-img-element */} + Roasted Octopus blue plate + +
+ +
+ +
+
+ + {/* ── SECTION 4: LEMON ORCHARD STORY CARD (SICILIA LEMON & LINEN OVERLAYS) ── */} +
+
+ +
+ + {/* Left Col: Lemon Flatlay Image */} +
+ + {/* eslint-disable-next-line @next/next/no-img-element */} + Organic lemons flatlay olive branches + +
+ + {/* Right Col: Spinning lemon text badge and heritage content */} + + + {t.lemonSubtitle} + + + + {t.lemonTitle} + + + + {t.lemonDesc} + + + {/* Spinning Seal badge */} + +
+ + + + + {t.lemonBadgeText} + + + + 🍋 +
+
+ {t.lemonBottomText} +
+
+
+ +
+ +
+
+ + {/* ── SECTION 5: SERVICES (PURE SVGS - NO EMOJIS) ── */} +
+
+ +
+ {t.servicesSubtitle} +

+ {t.servicesTitle} +

+
+ +
+ {hizmetler.map((h, i) => { + const locServ = getLocalizedService(h.baslik, h.aciklama); + return ( + +
+ {getIconSvg(h.ikon)} +
+

+ {locServ.title} +

+

+ {locServ.desc} +

+
+ ); + })} +
+ +
+
+ + {/* ── SECTION 6: TESTIMONIALS (YORUMLAR) ── */} +
+
+ +
+ {t.testimonialsSubtitle} +

+ {t.testimonialsTitle} +

+
+ +
+ {yorumlar.map((y, i) => { + const locComment = getLocalizedTestimonial(y.yazar, y.yorum); + return ( + + {/* SVG Golden Stars */} +
+ {[...Array(y.puan)].map((_, j) => ( + + + + ))} +
+ +

+ “{locComment}” +

+ +
+
+ {y.yazar.charAt(0)} +
+
+

+ {y.yazar} +

+ + {y.tarih} + +
+
+
+ ); + })} +
+ +
+
+ + {/* ── SECTION 7: RANDEVU AL / RESERVATION ── */} +
+
+ +
+
+ {t.bookingSubtitle} +

+ {t.bookingTitle} +

+

+ {t.bookingDesc} +

+
+ +
+ {[ + { label: t.formName, placeholder: t.formNamePlaceholder, type: "text", full: false }, + { label: t.formPhone, placeholder: t.formPhonePlaceholder, type: "tel", full: false }, + { label: t.formDate, placeholder: "", type: "date", full: false }, + { label: t.formTime, placeholder: "", type: "time", full: false }, + { label: t.formGuests, placeholder: "2", type: "number", full: false }, + { label: t.formNotes, placeholder: t.formNotesPlaceholder, type: "text", full: true }, + ].map((field, i) => ( +
+ + +
+ ))} +
+ + + {t.formSubmit} + +
+ +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+
+ + {firma.adi} + +

+ {firma.slogan} — {t.footerDesc} +

+

📍 {firma.adres}

+

📞 {firma.telefon}

+
+ +
+

+ Primi & Secondi +

+ {menu.map(kat => ( + + {getLocalizedMenuCategory(kat.kategori)} + + ))} +
+ +
+

+ Sicilia +

+ {["Our Story", "Pizza & Pasta", "Lemon Orchard", "Reservation"].map(item => ( + + {item} + + ))} +
+
+ +
+

© 2026 {firma.adi}. {t.footerRights}

+

{t.footerPrivacy}

+
+ +
+
+ + {/* ── FAST BOOKING OVERLAY MODAL ── */} + + {showBookingModal && ( + + + + +

+ {t.quickBookTitle} +

+

+ {t.quickBookDesc} +

+ +
+
+ + +
+
+ + +
+ setShowBookingModal(false)} + > + {t.quickBookSubmit} + +
+
+
+ )} +
+ + ); +} diff --git a/components/templates/TaxiTemplate/index.tsx b/components/templates/TaxiTemplate/index.tsx new file mode 100644 index 0000000..79dd9ec --- /dev/null +++ b/components/templates/TaxiTemplate/index.tsx @@ -0,0 +1,1166 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useRef, useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.1 } }, +}; + +const translations = { + tr: { + navBook: "Rezervasyon", + navTariffs: "Tarifeler", + navBenefits: "Ayrıcalıklar", + navApp: "Mobil Uygulama", + navReviews: "Misafir Yorumları", + callCenter: "Çağrı Merkezi", + bookNow: "Rezervasyon Yap", + badge: "NYC GÜVENİLİR PRİVATE CAB AĞI", + heroTitlePart1: "NYC'DE LÜKS", + heroTitlePart2: "BİR SEYAHAT?", + heroTitlePart3: "ÖZEL ŞOFÖRLÜ HAVAALANI TRANSFER SERVİSİ", + heroDesc: "New York genelinde 7/24 güvenli, yüksek konforlu özel araç hizmetleri. Havalimanı lounge transferlerinizi anında hesaplayın ve stressiz planlayın.", + instantBooking: "Hızlı Telefon Hattı", + getQuote: "Seyahat Hesapla", + viewTariffs: "Tarifeleri İncele", + fastFormSubtitle: "Hızlı Seyahat Formu", + fastFormTitle: "MİL HESAPLA & AYIRT", + fastFormDesc: "Konum parametrelerinizi girerek seyahat tutarınızı anında hesaplayın ve rezervasyon oluşturun.", + formName: "Ad Soyad", + formNamePlaceholder: "Adınız Soyadınız", + formPhone: "Telefon Numarası", + formPhonePlaceholder: "İletişim Numaranız", + formDate: "Tarih", + formTime: "Saat", + formPickup: "Alış Noktası", + formDropoff: "Varış Noktası", + chooseVehicle: "Araç Sınıfı Seçimi", + submitBooking: "REZERVASYONU BAŞLAT", + dispatchWarning: "Bu formu gönderdiğinizde, sürücümüz sizinle 3 dakika içinde iletişime geçecektir.", + tariffsSubtitle: "Esnek Fiyatlar", + tariffsTitle: "TARİFELERİMİZ", + tariffsDesc: "Seyahatlerinize en uygun lüks araç segmentini ve ücretlendirmelerini keşfedin.", + popular: "EN ÇOK TERCİH EDİLEN", + perMile: "/ MİL", + bookTariff: "BU TARİFEYİ SEÇ", + benefitsSubtitle: "Özel Ayrıcalıklar", + benefitsTitle: "HİZMET KALİTEMİZ", + benefitsDesc: "New York'taki iş dünyasının ve seçkin yolcuların bizi tercih etmesinin nedenleri.", + appSubtitle: "Uygulamayı İndirin", + appTitle: "MOBİL CAB UYGULAMASI", + appDesc: "CabHub mobil uygulamasını telefonunuza indirin. 7/24 GPS takibi yapın, uçuş rötar senkronizasyonu ile en özel fiyatlardan faydalanın.", + getItOn: "HEMEN İNDİRİN", + googlePlay: "Google Play Store", + appStore: "App Store", + reviewsSubtitle: "Müşteri Deneyimleri", + reviewsTitle: "MUTLU YOLCULARIMIZ", + reviewsDesc: "Sık seyahat eden iş insanlarımızın CabHub özel şoför hizmeti hakkındaki yorumları.", + callStripText: "7 GÜN 24 SAAT ÇAĞRILARINIZI CEVAPLAMAYA HAZIRIZ!", + footerRights: "Tüm hakları saklıdır.", + footerPrivacy: "Gizlilik Politikası", + footerTerms: "Kullanım Şartları", + bookingRequested: "REZERVASYON ALINDI", + nycDispatchActive: "NYC Sürücü Atama Hattı Aktif", + successDesc: "Seyahat parametrelerinizi kaydettik. En yakın CabHub lüks aracı ve sürücüsü 3 dakika içinde sizinle iletişime geçecektir. Keyifli yolculuklar dileriz!", + dismiss: "KAPAT", + conceptBanner: "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır.", + calcEstimated: "Tahmini Tutar:", + calcLoading: "Hesaplanıyor...", + min: "dk", + calculatingText: "Mesafe bazlı anlık ücretlendirme" + }, + en: { + navBook: "Book Cab", + navTariffs: "Tariffs", + navBenefits: "Why Us", + navApp: "Mobile App", + navReviews: "Reviews", + callCenter: "Call Center", + bookNow: "Book Now", + badge: "NYC TRUSTED PRIVATE CAB NETWORK", + heroTitlePart1: "NEED A", + heroTitlePart2: "PREMIUM RIDE?", + heroTitlePart3: "NYC'S PREMIER PRIVATE TRANSFERS", + heroDesc: "Safe, high-fidelity premium luxury rides available 24/7 across New York City. Book instantly from our modern standard line or download our custom voucher app for secure rides.", + instantBooking: "Instant Booking Line", + getQuote: "Calculate Fare", + viewTariffs: "View Tariffs", + fastFormSubtitle: "Fast Ride Form", + fastFormTitle: "BOOK A CAB", + fastFormDesc: "Fill in your destination parameters below to calculate estimated fares and allocate a nearby premium cab.", + formName: "Name", + formNamePlaceholder: "Your full name", + formPhone: "Phone", + formPhonePlaceholder: "Contact Number", + formDate: "Date", + formTime: "Time", + formPickup: "Start Location", + formDropoff: "End Destination", + chooseVehicle: "Choose Vehicle", + submitBooking: "SUBMIT BOOKING", + dispatchWarning: "By submitting this form, you trigger immediate dispatch. A professional verified driver will contact you in under 3 minutes.", + tariffsSubtitle: "Flexible Rates", + tariffsTitle: "OUR TARIFFS", + tariffsDesc: "Choose the perfect ride category structured to fit your travel coordinates.", + popular: "POPULAR CHOICE", + perMile: "/ MILE", + bookTariff: "BOOK TARIFF", + benefitsSubtitle: "Premium Values", + benefitsTitle: "SOME BENEFITS", + benefitsDesc: "Why thousands of New Yorkers and high-profile businesses trust our private network.", + appSubtitle: "Download App", + appTitle: "BEST CAB SERVICES", + appDesc: "Download the CabHub voucher application on your phone. Book local transfers, coordinate with drivers using real-time GPS search, and access exclusive 40% member benefits dynamically.", + getItOn: "GET IT ON", + googlePlay: "Google Play", + appStore: "App Store", + reviewsSubtitle: "Testimonials", + reviewsTitle: "HAPPY CLIENTS", + reviewsDesc: "Hear what frequent business travelers say about the CabHub ride coordination.", + callStripText: "WE ARE READY TO TAKE YOUR CALL 24 HOURS, 7 DAYS!", + footerRights: "All rights reserved.", + footerPrivacy: "Privacy Policy", + footerTerms: "Terms of Service", + bookingRequested: "BOOKING REQUESTED", + nycDispatchActive: "NYC Dispatch Line Active", + successDesc: "We have registered your travel parameters. A professional verified CabHub chauffeur will reach out on your contact number in under 3 minutes. Thank you!", + dismiss: "DISMISS", + conceptBanner: "This website is a premium concept prototype designed by Ayris Tech.", + calcEstimated: "Estimated Fare:", + calcLoading: "Calculating...", + min: "min", + calculatingText: "Real-time coordinate-based pricing" + } +}; + +const locationsList = [ + "Manhattan Midtown", + "Brooklyn Heights", + "Queens Astoria", + "JFK Airport", + "LaGuardia Airport" +]; + +export default function TaxiTemplate({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], yorumlar = [] } = data; + const [showBookingModal, setShowBookingModal] = useState(false); + const [activePlan, setActivePlan] = useState(1); // Standard Class active by default + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + // Fare Calculator states + const [pickupLoc, setPickupLoc] = useState("Manhattan Midtown"); + const [dropoffLoc, setDropoffLoc] = useState("Brooklyn Heights"); + + const t = translations[lang]; + + const getIconSvg = (type: string) => { + switch (type) { + case "pickup": + return ( + + + + ); + case "booking": + return ( + + + + + ); + case "bonus": + return ( + + + + ); + case "gps": + return ( + + + + + + ); + default: + return ( + + + + ); + } + }; + + // 1. Lenis Smooth Scroll Setup + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // 2. Preloader timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Price estimate logic + const calculatePrice = () => { + if (pickupLoc === dropoffLoc) return "$5.00"; + + // JFK flat rates + if ((pickupLoc === "Manhattan Midtown" && dropoffLoc === "JFK Airport") || + (pickupLoc === "JFK Airport" && dropoffLoc === "Manhattan Midtown")) { + return activePlan === 0 ? "$55.00" : activePlan === 1 ? "$75.00" : "$110.00"; + } + // LaGuardia flat rates + if ((pickupLoc === "Manhattan Midtown" && dropoffLoc === "LaGuardia Airport") || + (pickupLoc === "LaGuardia Airport" && dropoffLoc === "Manhattan Midtown")) { + return activePlan === 0 ? "$35.00" : activePlan === 1 ? "$48.00" : "$75.00"; + } + + // Mileage estimations based on distance + let miles = 8; + if ((pickupLoc === "Manhattan Midtown" && dropoffLoc === "Brooklyn Heights") || + (pickupLoc === "Brooklyn Heights" && dropoffLoc === "Manhattan Midtown")) miles = 6; + else if ((pickupLoc === "Manhattan Midtown" && dropoffLoc === "Queens Astoria") || + (pickupLoc === "Queens Astoria" && dropoffLoc === "Manhattan Midtown")) miles = 7; + else if ((pickupLoc === "Brooklyn Heights" && dropoffLoc === "Queens Astoria") || + (pickupLoc === "Queens Astoria" && dropoffLoc === "Brooklyn Heights")) miles = 10; + else if ((pickupLoc === "Brooklyn Heights" && dropoffLoc === "JFK Airport") || + (pickupLoc === "JFK Airport" && dropoffLoc === "Brooklyn Heights")) miles = 16; + else if ((pickupLoc === "Brooklyn Heights" && dropoffLoc === "LaGuardia Airport") || + (pickupLoc === "LaGuardia Airport" && dropoffLoc === "Brooklyn Heights")) miles = 14; + else if ((pickupLoc === "Queens Astoria" && dropoffLoc === "JFK Airport") || + (pickupLoc === "JFK Airport" && dropoffLoc === "Queens Astoria")) miles = 12; + else if ((pickupLoc === "Queens Astoria" && dropoffLoc === "LaGuardia Airport") || + (pickupLoc === "LaGuardia Airport" && dropoffLoc === "Queens Astoria")) miles = 6; + else if ((pickupLoc === "JFK Airport" && dropoffLoc === "LaGuardia Airport") || + (pickupLoc === "LaGuardia Airport" && dropoffLoc === "JFK Airport")) miles = 12; + + const basePrice = miles * 1.6 + 5.0; + const multiplier = activePlan === 0 ? 1.0 : activePlan === 1 ? 1.5 : 2.2; + return `$${(basePrice * multiplier).toFixed(2)}`; + }; + + // Dynamic Localization handlers + const getLocalizedStat = (deger: string) => { + if (deger.toLowerCase().includes("economy")) { + return { + title: lang === "tr" ? "Ekonomi Sınıfı" : "Economy Class", + desc: lang === "tr" ? "Şehir içi seyahatleriniz için ideal, konforlu ve ekonomik ulaşım. Mil başı $1.50." : "Optimal zero-emission trips to any destination within boroughs. $1.5/MI" + }; + } + if (deger.toLowerCase().includes("standard")) { + return { + title: lang === "tr" ? "Standart Sınıf" : "Standard Class", + desc: lang === "tr" ? "Havaalanı ve eyaletler arası transferler için premium sedanlar. Mil başı $2.25." : "Premium transfers. Verified luxury sedans covering tri-state airport hubs. $2.25/MI" + }; + } + return { + title: lang === "tr" ? "Business Sınıfı" : "Business Class", + desc: lang === "tr" ? "Lüks araç filomuz ve öncelikli sürücü atama ayrıcalığı. Mil başı $3.50." : "First class executive. Top-tier luxury vehicles with priority lane dispatch. $3.50/MI" + }; + }; + + const getLocalizedService = (baslik: string, aciklama: string) => { + if (baslik.toLowerCase().includes("pickup") || baslik.toLowerCase().includes("home")) { + return { + title: lang === "tr" ? "ADRESTEN ALIM" : "HOME PICKUP", + desc: lang === "tr" ? "Kapınızdan veya otel lobinizden bagaj desteği ve koordinatlı karşılama ile lüks seyahat başlangıcı." : "We run services to serve you more better and to your convenience." + }; + } + if (baslik.toLowerCase().includes("booking") || baslik.toLowerCase().includes("fast")) { + return { + title: lang === "tr" ? "KOLAY REZERVASYON" : "FAST BOOKING", + desc: lang === "tr" ? "Sadece birkaç tıkla seyahat parametrelerinizi belirleyin, stressiz rezervasyon yapın." : "Our book method is very fast and easy. It won't stress you." + }; + } + if (baslik.toLowerCase().includes("bonus") || baslik.toLowerCase().includes("member")) { + return { + title: lang === "tr" ? "MİL & ÜYELİK AVANTAJLARI" : "BONUSES FOR RIDE", + desc: lang === "tr" ? "Bizimle yaptığınız her yolculukta mil puanları toplayın, sonraki rezervasyonlarda %40'a varan indirim kazanın." : "When you run services frequently we give you different bonuses that can put a smile on your face." + }; + } + return { + title: lang === "tr" ? "7/24 AKTİF GPS TAKİBİ" : "GPS SEARCHING", + desc: lang === "tr" ? "Uçuş rötar senkronizasyonu ve 7/24 anlık uydu üzerinden konum takibi ile mutlak güvendesiniz." : "We run services incase you aren't sure of your destination. So you don't have to worry." + }; + }; + + const getLocalizedTestimonial = (yazar: string) => { + if (yazar.toLowerCase().includes("john")) { + return lang === "tr" + ? "CabHub NYC iş seyahatlerimde en güvendiğim ulaşım ortağım oldu. Standart sınıf araçları pırıl pırıldı ve sürücü tüm kestirmeleri biliyordu." + : "CabHub NYC provided the most reliable ride during my business trip. The standard class vehicle was pristine and the driver knew all the shortcuts."; + } + return lang === "tr" + ? "Hızlı rezervasyon sistemi tek kelimeyle kusursuz çalışıyor. Adresten alım tam dakikasında gerçekleşti ve GPS takibi kendimi inanılmaz güvende hissettirdi." + : "The fast booking system works like a charm. Home pickup was exactly on time and the GPS tracking made me feel incredibly secure."; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Oswald:wght@400;500;700;900&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=Syne:wght@700;800&display=swap'); + + :root { + --color-taxi-yellow: #F5C518; + --color-taxi-yellow-rgb: 245, 197, 24; + --color-coal-dark: #07080A; + --color-coal-card: #121418; + --color-coal-card-hover: #181C22; + --color-text-white: #FFFFFF; + --color-text-gray: rgba(255, 255, 255, 0.6); + } + + .font-industrial { + font-family: 'Syne', 'Oswald', sans-serif; + } + + .font-sans-premium { + font-family: 'Plus Jakarta Sans', sans-serif; + } + + .spinning-badge { + animation: spin 25s linear infinite; + } + + @keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } + } + + .bg-mesh-grid { + background-image: + linear-gradient(rgba(245, 197, 24, 0.03) 1px, transparent 1px), + linear-gradient(90deg, rgba(245, 197, 24, 0.03) 1px, transparent 1px); + background-size: 40px 40px; + } + + .glowing-bar { + box-shadow: 0 0 15px rgba(245, 197, 24, 0.4); + } + + .pulse-glow { + animation: pulse 2s infinite; + } + + @keyframes pulse { + 0% { box-shadow: 0 0 0 0 rgba(245, 197, 24, 0.5); } + 70% { box-shadow: 0 0 0 15px rgba(245, 197, 24, 0); } + 100% { box-shadow: 0 0 0 0 rgba(245, 197, 24, 0); } + } + + .hero-title-clamp { + font-size: clamp(34px, 5.8vw, 84px); + letter-spacing: -0.01em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: HIGH-TECH PRELOADER ── */} + + {preloader && ( + +
+ + CABHUB DISPATCH SYSTEM + +
+ +
+ + connecting... + +
+
+ )} +
+ + {/* ── MANDATORY FLOATING DEMO BANNER ── */} +
+
+ + {t.conceptBanner} + +
+ + {/* ── MAIN CONTENT CONTAINER (Sleek Obsidian Theme) ── */} +
+ + {/* Decorative Mesh Background */} +
+ + {/* Floating Ambient Yellow Glow Orbs */} +
+
+ + {/* ── FLOATING NAVBAR ── */} + +
+ {/* Logo */} + +
+ + + +
+ + CABHUB + +
+ + {/* Navigation Links */} + + + {/* Quick Contact & Action */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[11px] font-black tracking-[2px] uppercase text-black bg-[#F5C518] hover:bg-white px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_5px_15px_rgba(245,197,24,0.2)] hidden sm:block" + whileHover={{ scale: 1.03 }} + whileTap={{ scale: 0.98 }} + > + {t.bookNow} + +
+
+
+ + {/* ── HERO & BOOKING SECTION ── */} +
+
+
+ + {/* Left Column: Heading and Badge */} + + {/* Yellow Accent Badge */} + + + {t.badge} + + + + {t.heroTitlePart1} +
+ {t.heroTitlePart2} +
+ + + {t.heroDesc} + + + {/* Call Booking Center */} + +
+ + + +
+
+
{t.instantBooking}
+ + {firma.telefon} + +
+
+ + {/* CTA Buttons */} + + + {t.getQuote} + + + {t.viewTariffs} + + +
+ + {/* Right Column: Hero Car & Parallax Plate */} +
+ + {/* Outer circle overlay */} +
+ + {/* High fidelity Yellow cab image */} + {/* eslint-disable-next-line @next/next/no-img-element */} + CabHub Yellow Sedan Premium NYC Cab + + {/* Floating badge rotating around */} +
+ + + + + BOOK A RIDE • PREMIUM CAR SERVICE • 24/7 • + + + +
+ + + +
+
+ +
+ +
+
+
+ + {/* ── INTERACTIVE TARIFF CALCULATOR WIDGET ── */} +
+
+ +
+ {/* Glow border header indicator */} +
+ +
+ {t.fastFormSubtitle} +

+ {t.fastFormTitle} +

+

+ {t.fastFormDesc} +

+
+ + {/* Form Grid */} +
+ {[ + { label: t.formName, placeholder: t.formNamePlaceholder, type: "text" }, + { label: t.formPhone, placeholder: t.formPhonePlaceholder, type: "tel" }, + { label: t.formDate, placeholder: "", type: "date" }, + { label: t.formTime, placeholder: "", type: "time" }, + ].map((field, idx) => ( +
+ + +
+ ))} + + {/* Interactive Pickup Location */} +
+ + +
+ + {/* Interactive Dropoff Location */} +
+ + +
+ + {/* Choose Vehicle */} +
+ +
+ {["Economy", "Standard", "Business"].map((option, oIdx) => ( + + ))} +
+
+
+ + {/* ESTIMATED FARE BANNER */} +
+
+
+ $ +
+
+ {t.calculatingText} + {t.calcEstimated} {calculatePrice()} +
+
+
+ Flat-rate airport vouchers apply dynamically between JFK / LaGuardia and Manhattan. +
+
+ + {/* Submit Action */} +
+

+ {t.dispatchWarning} +

+ setShowBookingModal(true)} + className="w-full md:w-auto px-10 py-4.5 rounded-xl bg-[#F5C518] hover:bg-white text-black font-black text-xs uppercase tracking-widest transition-all cursor-pointer shadow-[0_5px_15px_rgba(245,197,24,0.3)] shrink-0" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.submitBooking} + +
+ +
+ +
+
+ + {/* ── OUR TARIFFS (Subscription Cards) ── */} +
+
+ +
+ {t.tariffsSubtitle} +

+ {t.tariffsTitle} +

+

+ {t.tariffsDesc} +

+
+ + {/* Three Tariff Cards Grid */} +
+ {istatistikler.map((stat, sIdx) => { + const locStat = getLocalizedStat(stat.deger); + const isPopular = stat.deger === "Standard Class"; + return ( + + {isPopular && ( +
+ {t.popular} +
+ )} + +
+ {/* Car vector silhouette placeholder */} +
+ + + +
+ +

+ {locStat.title} +

+

+ {locStat.desc} +

+
+ +
+ {/* Price Display */} +
+ + {sIdx === 0 ? "$1.50" : sIdx === 1 ? "$2.20" : "$3.50"} + + {t.perMile} +
+ + { + setActivePlan(sIdx); + const el = document.getElementById("booking-flow"); + el?.scrollIntoView({ behavior: "smooth" }); + }} + className={`w-full py-4.5 rounded-xl font-black text-xs uppercase tracking-widest transition-all cursor-pointer ${ + isPopular + ? "bg-[#F5C518] hover:bg-white text-black shadow-lg" + : "bg-[#0B0C0E] hover:bg-white/5 text-white/70 border border-white/5 hover:border-white/10" + }`} + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.bookTariff} + +
+ +
+ ); + })} +
+ +
+
+ + {/* ── OUR BENEFITS ── */} +
+
+ +
+ {t.benefitsSubtitle} +

+ {t.benefitsTitle} +

+

+ {t.benefitsDesc} +

+
+ + {/* Grid display of benefits */} +
+ {hizmetler.map((benefit, bIdx) => { + const locBenefit = getLocalizedService(benefit.baslik, benefit.aciklama); + return ( + +
+ {getIconSvg(benefit.ikon)} +
+ +

+ {locBenefit.title} +

+

+ {locBenefit.desc} +

+
+ ); + })} +
+ +
+
+ + {/* ── APP DOWNLOAD SHOWCASE ── */} +
+
+
+ + {/* Left Column: Heading and action badges */} + + + {t.appSubtitle} + + + {t.appTitle} + + + {t.appDesc} + + + {/* Badges buttons */} + + {/* Google Play */} + + + + +
+
{t.getItOn}
+
{t.googlePlay}
+
+
+ + {/* App Store */} + + + + +
+
{t.getItOn}
+
{t.appStore}
+
+
+
+
+ + {/* Right Column: Hand holding smartphone flatlay mockup */} +
+ + {/* eslint-disable-next-line @next/next/no-img-element */} + CabHub Booking Digital Phone Interface Map + +
+ +
+
+
+ + {/* ── TESTIMONIAL GRID ── */} +
+
+ +
+ {t.reviewsSubtitle} +

+ {t.reviewsTitle} +

+

+ {t.reviewsDesc} +

+
+ + {/* Testimonials 2-Column Layout */} +
+ {yorumlar.map((y, yIdx) => { + const locTestimonial = getLocalizedTestimonial(y.yazar); + return ( + + {/* Rating Stars SVG */} +
+ {[...Array(5)].map((_, starIdx) => ( + + + + ))} +
+ +

+ “{locTestimonial}” +

+ +
+
+ {y.yazar.charAt(0)} +
+
+

+ {y.yazar} +

+ + {y.tarih} + +
+
+ +
+ ); + })} +
+ +
+
+ + {/* ── BOTTOM CALL RESERVATION DIRECT STRIP ── */} +
+
+

+ {t.callStripText} +

+ + 📞 {firma.telefon} + +
+ {/* subtle moving abstract banner lines */} +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+ + {/* About Column */} +
+ + CABHUB + +

+ {firma.slogan} — Safe, verified, high-fidelity premium luxury sedan cab rides across New York City and global destinations. +

+
+

📍 {firma.adres}

+

📧 {firma.email}

+
+
+ + {/* Download links */} + + + {/* Navigation links */} +
+

+ USEFUL LINKS +

+
+ {["Book a Cab", "Economy & Business Tariffs", "Our Core Benefits", "Happy Reviews", "Terms & Regulations"].map(item => ( + + {item} + + ))} +
+
+ +
+ +
+

© 2026 {firma.adi}. {t.footerRights}

+ +
+ +
+
+ + {/* ── FAST BOOKING SUCCESS MODAL ── */} + + {showBookingModal && ( + + + {/* Close Button */} + + + {/* Visual success indicator */} +
+ + + +
+ +

+ {t.bookingRequested} +

+

+ {t.nycDispatchActive} +

+ +

+ {t.successDesc} +

+ + setShowBookingModal(false)} + > + {t.dismiss} + +
+
+ )} +
+ +
+ + ); +} diff --git a/components/templates/TaxiTemplate2/index.tsx b/components/templates/TaxiTemplate2/index.tsx new file mode 100644 index 0000000..083cc40 --- /dev/null +++ b/components/templates/TaxiTemplate2/index.tsx @@ -0,0 +1,1161 @@ +"use client"; + +import { motion, AnimatePresence } from "framer-motion"; +import { useRef, useState, useEffect } from "react"; +import type { DemoData } from "@/data/demos"; + +const fadeUp = { + hidden: { opacity: 0, y: 35 }, + show: { opacity: 1, y: 0, transition: { duration: 0.75, ease: [0.25, 0.46, 0.45, 0.94] as [number, number, number, number] } }, +}; + +const stagger = { + hidden: {}, + show: { transition: { staggerChildren: 0.1 } }, +}; + +const translations = { + tr: { + navBook: "Rezervasyon", + navTariffs: "Havalimanı Ücretleri", + navBenefits: "Ayrıcalıklar", + navApp: "Mobil Uygulama", + navReviews: "Misafir Yorumları", + callCenter: "Çağrı Hattı", + bookNow: "Rezervasyon Yap", + badge: "NYC MINIMALIST & CHIC HAVAALANI TRANSFERLERİ", + heroTitlePart1: "ZARİF & GÜVENLİ", + heroTitlePart2: "PREMIUM TRANSFERLER", + heroDesc: "Yeni nesil sıfır emisyonlu lüks yolculuk keyfi. Beyaz elektrikli lüks sedan filomuz JFK, LaGuardia ve Newark lounge transferleriniz için özel olarak optimize edilmiştir. 60 saniyede güvenli planlama.", + instantBooking: "Havalimanı Özel Hattı", + getQuote: "Rezervasyon Yap", + viewTariffs: "Havaalanı Tarifeleri", + fastFormSubtitle: "Transfer Seyahat Formu", + fastFormTitle: "MİL HESAPLA & REZERVE ET", + fastFormDesc: "Havalimanı kapı ve seyahat koordinatlarınızı girerek tahmini tutarı anında hesaplayın.", + formName: "Ad Soyad", + formNamePlaceholder: "Adınız Soyadınız", + formPhone: "Telefon Numarası", + formPhonePlaceholder: "İletişim Numaranız", + formDate: "Tarih", + formTime: "Saat", + formPickup: "Alış Noktası", + formDropoff: "Varış Noktası", + chooseVehicle: "Araç Sınıfı Seçimi", + submitBooking: "GÜVENLİ REZERVASYON", + dispatchWarning: "Bu formu gönderdiğinizde, sürücümüz sizinle 3 dakika içinde iletişime geçecektir.", + tariffsSubtitle: "Havalimanı Ücretleri", + tariffsTitle: "HAVAALANI TARİFELERİ", + tariffsDesc: "Lounge ve terminal koordinatlarınızı taçlandıracak en uygun sabit fiyatları inceleyin.", + popular: "EN ÇOK TERCİH EDİLEN", + perMile: "/ MİL", + bookTariff: "BU TARİFEYİ SEÇ", + benefitsSubtitle: "Özel Değerler", + benefitsTitle: "LOUNGE AYRICALIKLARI", + benefitsDesc: "Havaalanı ve şehir içi koordinatlarınızı tamamen stressiz hale getirmek için tasarlandı.", + appSubtitle: "Zarif Mobil Mobilite", + appTitle: "CHIC MOBİL UYGULAMASI", + appDesc: "CabHub mobil uygulamasını telefonunuza indirin. Sürücü atamalarını izleyin, anlık GPS rotalarını takip edin ve üyelere özel avantajlardan yararlanın.", + getItOn: "HEMEN İNDİRİN", + googlePlay: "Google Play", + appStore: "App Store", + reviewsSubtitle: "Müşteri Deneyimleri", + reviewsTitle: "AYRICALIKLI DENEYİMLER", + reviewsDesc: "Sık seyahat eden kurumsal yöneticilerimizin lounge transfer sistemimiz hakkındaki yorumları.", + callStripText: "7 GÜN 24 SAAT ÇAĞRILARINIZI CEVAPLAMAYA HAZIRIZ!", + footerRights: "Tüm hakları saklıdır.", + footerPrivacy: "Gizlilik Politikası", + footerTerms: "Kullanım Şartları", + bookingRequested: "TRANSFER REZERVE EDİLDİ", + nycDispatchActive: "Premium Lounge Sürücü Atama Aktif", + successDesc: "Havalimanı transfer parametrelerinizi kaydettik. En yakın CabHub özel şoförü 3 dakika içinde sizinle iletişime geçecektir. Teşekkürler!", + dismiss: "KAPAT", + conceptBanner: "Bu web sitesi Ayris Tech tarafından hazırlanmış bir konsept çalışmasıdır.", + calcEstimated: "Tahmini Tutar:", + calcLoading: "Hesaplanıyor...", + min: "dk", + calculatingText: "Mesafe bazlı anlık ücretlendirme" + }, + en: { + navBook: "Reserve", + navTariffs: "Airport Rates", + navBenefits: "Why Us", + navApp: "Mobile App", + navReviews: "Reviews", + callCenter: "Lounge Line", + bookNow: "Book Transfer", + badge: "NYC MINIMALIST & CHIC AIRPORT TRANSFERS", + heroTitlePart1: "CHIC & SECURE", + heroTitlePart2: "PREMIUM TRANSFERS", + heroDesc: "Indulge in modern zero-emission comfort. Our fleet of white luxury electric sedans is fully optimized for JFK, LaGuardia, and Newark lounge drop-offs. Secure scheduling in under 60 seconds.", + instantBooking: "Lounge Concierge Line", + getQuote: "Reserve Now", + viewTariffs: "Airport Tariffs", + fastFormSubtitle: "Transfer Form", + fastFormTitle: "RESERVE TRANSFER", + fastFormDesc: "Input airport gate and travel coordinates to allocate a verified premium driver.", + formName: "Name", + formNamePlaceholder: "Your full name", + formPhone: "Phone", + formPhonePlaceholder: "Contact Number", + formDate: "Date", + formTime: "Time", + formPickup: "Start Location", + formDropoff: "End Destination", + chooseVehicle: "Choose Vehicle", + submitBooking: "SECURE BOOKING", + dispatchWarning: "By submitting this form, you secure immediate dispatch. A professional verified driver will reach out on your contact number in under 3 minutes.", + tariffsSubtitle: "Airport Rates", + tariffsTitle: "AIRPORT TARIFFS", + tariffsDesc: "Flat rates designed to elevate your airport lounge coordinates.", + popular: "MOST PREFERRED", + perMile: "/ MILE", + bookTariff: "BOOK TARIFF", + benefitsSubtitle: "Premium Values", + benefitsTitle: "LOUNGE ADVANTAGES", + benefitsDesc: "Designed to make airport and city coordinates completely stress-free.", + appSubtitle: "Light Application", + appTitle: "CHIC MOBILITY APP", + appDesc: "Reserve transfers, allocate verified chauffeurs, monitor real-time GPS trajectories, and redeem up to 40% saving balances. Beautiful, seamless light-mode smartphone UI.", + getItOn: "GET IT ON", + googlePlay: "Google Play", + appStore: "App Store", + reviewsSubtitle: "Reviews", + reviewsTitle: "TRUSTED EXPERIENCE", + reviewsDesc: "Hear what frequent corporate executives think of our lounge transfer system.", + callStripText: "WE ARE READY TO TAKE YOUR CALL 24 HOURS, 7 DAYS!", + footerRights: "All rights reserved.", + footerPrivacy: "Privacy Policy", + footerTerms: "Terms of Service", + bookingRequested: "TRANSFER SECURED", + nycDispatchActive: "Premium Lounge Dispatcher Active", + successDesc: "We have registered your airport transfer parameters. A professional verified CabHub chauffeur will reach out on your contact number in under 3 minutes. Thank you!", + dismiss: "DISMISS", + conceptBanner: "This website is a premium concept prototype designed by Ayris Tech.", + calcEstimated: "Estimated Fare:", + calcLoading: "Calculating...", + min: "min", + calculatingText: "Real-time coordinate-based pricing" + } +}; + +const locationsList = [ + "Manhattan Midtown", + "Brooklyn Heights", + "Queens Astoria", + "JFK Airport", + "LaGuardia Airport" +]; + +export default function TaxiTemplate2({ data }: { data: DemoData }) { + const { firma, istatistikler = [], hizmetler = [], yorumlar = [] } = data; + const [showBookingModal, setShowBookingModal] = useState(false); + const [activePlan, setActivePlan] = useState(1); // Standard active by default + const [lang, setLang] = useState<"tr" | "en">("tr"); + const [preloader, setPreloader] = useState(true); + + // Calculator states + const [pickupLoc, setPickupLoc] = useState("Manhattan Midtown"); + const [dropoffLoc, setDropoffLoc] = useState("JFK Airport"); + + const t = translations[lang]; + + const getIconSvg = (type: string) => { + switch (type) { + case "pickup": + return ( + + + + ); + case "booking": + return ( + + + + + ); + case "bonus": + return ( + + + + ); + case "gps": + return ( + + + + + + ); + default: + return ( + + + + ); + } + }; + + // 1. Lenis Smooth Scroll Integration + useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); + }, []); + + // 2. Preloader timer + useEffect(() => { + const timer = setTimeout(() => { + setPreloader(false); + }, 1500); + return () => clearTimeout(timer); + }, []); + + // Fare estimation logic + const calculatePrice = () => { + if (pickupLoc === dropoffLoc) return "$5.00"; + + // JFK flat rates + if ((pickupLoc === "Manhattan Midtown" && dropoffLoc === "JFK Airport") || + (pickupLoc === "JFK Airport" && dropoffLoc === "Manhattan Midtown")) { + return activePlan === 0 ? "$55.00" : activePlan === 1 ? "$75.00" : "$110.00"; + } + // LaGuardia flat rates + if ((pickupLoc === "Manhattan Midtown" && dropoffLoc === "LaGuardia Airport") || + (pickupLoc === "LaGuardia Airport" && dropoffLoc === "Manhattan Midtown")) { + return activePlan === 0 ? "$35.00" : activePlan === 1 ? "$48.00" : "$75.00"; + } + + // Mileage estimations based on distance + let miles = 8; + if ((pickupLoc === "Manhattan Midtown" && dropoffLoc === "Brooklyn Heights") || + (pickupLoc === "Brooklyn Heights" && dropoffLoc === "Manhattan Midtown")) miles = 6; + else if ((pickupLoc === "Manhattan Midtown" && dropoffLoc === "Queens Astoria") || + (pickupLoc === "Queens Astoria" && dropoffLoc === "Manhattan Midtown")) miles = 7; + else if ((pickupLoc === "Brooklyn Heights" && dropoffLoc === "Queens Astoria") || + (pickupLoc === "Queens Astoria" && dropoffLoc === "Brooklyn Heights")) miles = 10; + else if ((pickupLoc === "Brooklyn Heights" && dropoffLoc === "JFK Airport") || + (pickupLoc === "JFK Airport" && dropoffLoc === "Brooklyn Heights")) miles = 16; + else if ((pickupLoc === "Brooklyn Heights" && dropoffLoc === "LaGuardia Airport") || + (pickupLoc === "LaGuardia Airport" && dropoffLoc === "Brooklyn Heights")) miles = 14; + else if ((pickupLoc === "Queens Astoria" && dropoffLoc === "JFK Airport") || + (pickupLoc === "JFK Airport" && dropoffLoc === "Queens Astoria")) miles = 12; + else if ((pickupLoc === "Queens Astoria" && dropoffLoc === "LaGuardia Airport") || + (pickupLoc === "LaGuardia Airport" && dropoffLoc === "Queens Astoria")) miles = 6; + else if ((pickupLoc === "JFK Airport" && dropoffLoc === "LaGuardia Airport") || + (pickupLoc === "LaGuardia Airport" && dropoffLoc === "JFK Airport")) miles = 12; + + const basePrice = miles * 1.6 + 5.0; + const multiplier = activePlan === 0 ? 1.0 : activePlan === 1 ? 1.5 : 2.2; + return `$${(basePrice * multiplier).toFixed(2)}`; + }; + + // Dynamic Localization handlers + const getLocalizedStat = (deger: string) => { + if (deger.toLowerCase().includes("economy")) { + return { + title: lang === "tr" ? "Chic Şehir İçi" : "Economy Class", + desc: lang === "tr" ? "Şehir içi ulaşımlarda konforlu ve sıfır emisyonlu elektrikli araç deneyimi. Mil başı $1.50." : "Comfortable zero-emission trips to any destination within boroughs. $1.5/MI" + }; + } + if (deger.toLowerCase().includes("standard")) { + return { + title: lang === "tr" ? "Premium Şehirler Arası" : "Standard Class", + desc: lang === "tr" ? "Eyalet genelinde ve 3 ana havalimanına premium lüks seyahatler. Mil başı $2.20." : "Premium transfers. Verified luxury sedans covering tri-state airport hubs. $2.20/MI" + }; + } + return { + title: lang === "tr" ? "First Class Yönetici" : "Business Class", + desc: lang === "tr" ? "Öncelikli geçiş şeridi ve en üst segment lüks şoför hizmeti. Mil başı $3.50." : "First class executive. Top-tier luxury vehicles with priority lane dispatch. $3.50/MI" + }; + }; + + const getLocalizedService = (baslik: string, aciklama: string) => { + if (baslik.toLowerCase().includes("pickup") || baslik.toLowerCase().includes("lounge")) { + return { + title: lang === "tr" ? "LOUNGE'DAN ALIM" : "LOUNGE PICKUP", + desc: lang === "tr" ? "Doğrudan havalimanı lounge kapısından veya otel girişinden bagaj asistanlığıyla karşılama." : "Direct lounge or doorstep coordination for all airport coordinates." + }; + } + if (baslik.toLowerCase().includes("booking") || baslik.toLowerCase().includes("reservation")) { + return { + title: lang === "tr" ? "PRATİK REZERVASYON" : "TAP RESERVATION", + desc: lang === "tr" ? "Akıllı telefon entegrasyonu ile seyahatlerinizi 60 saniyenin altında rezerve edin." : "Ultra-fast smartphone booking client. Secure scheduling under 60 seconds." + }; + } + if (baslik.toLowerCase().includes("bonus") || baslik.toLowerCase().includes("member")) { + return { + title: lang === "tr" ? "ÜYELİK AVANTAJLARI" : "MEMBER BENEFITS", + desc: lang === "tr" ? "Mil toplayın ve bir sonraki premium seyahatinizde %40 indirim kazanın." : "Collect mileage dynamically. Redeem up to 40% savings on specialty trips." + }; + } + return { + title: lang === "tr" ? "HASSAS GPS TAKİBİ" : "TRACKING GPS", + desc: lang === "tr" ? "Gerçek zamanlı uydu üzerinden sürüş takibi ve uçuş saati rötar senkronizasyonu." : "Real-time satellite path tracking and automated flight delay syncing." + }; + }; + + const getLocalizedTestimonial = (yazar: string) => { + if (yazar.toLowerCase().includes("alexander")) { + return lang === "tr" + ? "JFK'den transferim tamamen kusursuzdu. Sürücü beni lounge kapısında karşıladı ve elektrikli araç tertemiz durumdaydı." + : "The airport transfer from JFK was absolutely seamless. The driver met me at the lounge gate and the electric vehicle was in pristine condition."; + } + return lang === "tr" + ? "Kurumsal seyahatlerimde kesinlikle ilk tercihim CabHub Premium. Açık renkli sade uygulamasından rezervasyon çok basit ve rötar takibi mükemmel." + : "CabHub Premium is my absolute go-to for corporate travel. The light theme app booking is simple and the delay syncing works perfectly."; + }; + + const css = ` + @import url('https://fonts.googleapis.com/css2?family=Oswald:wght@400;500;700;900&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=Syne:wght@700;800&display=swap'); + + :root { + --color-premium-gold: #E5A900; + --color-nordic-white: #FFFFFF; + --color-nordic-ivory: #FCFAF7; + --color-nordic-ivory-dark: #F5F2EC; + --color-coal-text: #111317; + --color-coal-muted: rgba(17, 19, 23, 0.6); + } + + .font-industrial { + font-family: 'Syne', 'Oswald', sans-serif; + } + + .font-sans-premium { + font-family: 'Plus Jakarta Sans', sans-serif; + } + + .spinning-badge { + animation: spin 25s linear infinite; + } + + @keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } + } + + .bg-mesh-grid-light { + background-image: + linear-gradient(rgba(229, 169, 0, 0.02) 1px, transparent 1px), + linear-gradient(90deg, rgba(229, 169, 0, 0.02) 1px, transparent 1px); + background-size: 45px 45px; + } + + .gold-bar-glow { + box-shadow: 0 0 12px rgba(229, 169, 0, 0.25); + } + + .pulse-glow-dark { + animation: pulseDark 2s infinite; + } + + @keyframes pulseDark { + 0% { box-shadow: 0 0 0 0 rgba(17, 19, 23, 0.2); } + 70% { box-shadow: 0 0 0 15px rgba(17, 19, 23, 0); } + 100% { box-shadow: 0 0 0 0 rgba(17, 19, 23, 0); } + } + + .hero-title-clamp { + font-size: clamp(34px, 5.8vw, 84px); + letter-spacing: -0.01em; + line-height: 0.95; + } + `; + + return ( + <> + + + {/* ── IMZA AN: LIGHT TARIFF PRELOADER ── */} + + {preloader && ( + +
+ + CABHUB PREMIUM SERVICE + +
+ +
+ + allocating... + +
+
+ )} +
+ + {/* ── MANDATORY FLOATING DEMO BANNER ── */} +
+
+ + {t.conceptBanner} + +
+ + {/* ── MAIN CONTENT CONTAINER (Chic Minimalist Light Theme) ── */} +
+ + {/* Soft Grid Overlay */} +
+ + {/* Floating Ambient Warm Gold Orbs */} +
+
+ + {/* ── PREMIUM LIGHT NAVBAR ── */} + +
+ {/* Logo */} + +
+ + + +
+ + CABHUB + +
+ + {/* Navigation Links */} + + + {/* Direct Dial booking & Lang Selector */} +
+ {/* Language Switcher */} +
+ + +
+ + setShowBookingModal(true)} + className="text-[11px] font-black tracking-[2px] uppercase text-white bg-[#E5A900] hover:bg-black px-6 py-3.5 rounded-xl transition-all cursor-pointer shadow-[0_4px_12px_rgba(229,169,0,0.2)] hidden sm:block" + whileHover={{ scale: 1.03 }} + whileTap={{ scale: 0.98 }} + > + {t.bookNow} + +
+
+
+ + {/* ── HERO SECTION ── */} +
+
+
+ + {/* Left Column: Heading, Slogans, Direct Reservation */} + + {/* Minimalist Accent Badge */} + + + {t.badge} + + + + {t.heroTitlePart1} +
+ {t.heroTitlePart2} +
+ + + {t.heroDesc} + + + {/* Direct Dial block */} + +
+ + + +
+
+
{t.instantBooking}
+ + {firma.telefon} + +
+
+ + {/* Action Buttons */} + + + {t.getQuote} + + + {t.viewTariffs} + + +
+ + {/* Right Column: Premium White e-tron Car & Rotating circular stamp */} +
+ + {/* Outer circle overlay */} +
+ + {/* High fidelity White luxury cab */} + {/* eslint-disable-next-line @next/next/no-img-element */} + CabHub White e-tron GT Luxury Electric NYC Cab + + {/* Spinning stamp */} +
+ + + + + LOUNGE TRANSFER • AIRPORT EXPRESS • 24/7 • + + + +
+ + + +
+
+ +
+ +
+
+
+ + {/* ── BOOKING FLOW & CALCULATOR ── */} +
+
+ +
+ {/* Gold line border indicator */} +
+ +
+ {t.fastFormSubtitle} +

+ {t.fastFormTitle} +

+

+ {t.fastFormDesc} +

+
+ + {/* Form Input fields */} +
+ {[ + { label: t.formName, placeholder: t.formNamePlaceholder, type: "text" }, + { label: t.formPhone, placeholder: t.formPhonePlaceholder, type: "tel" }, + { label: t.formDate, placeholder: "", type: "date" }, + { label: t.formTime, placeholder: "", type: "time" }, + ].map((field, idx) => ( +
+ + +
+ ))} + + {/* Pickup Location select */} +
+ + +
+ + {/* Dropoff Location select */} +
+ + +
+ + {/* Choose Vehicle */} +
+ +
+ {["Economy", "Standard", "Business"].map((option, oIdx) => ( + + ))} +
+
+
+ + {/* ESTIMATED FARE BANNER */} +
+
+
+ $ +
+
+ {t.calculatingText} + {t.calcEstimated} {calculatePrice()} +
+
+
+ Flat-rate airport vouchers apply dynamically between JFK / LaGuardia and Manhattan. +
+
+ + {/* Submit panel */} +
+

+ {t.dispatchWarning} +

+ setShowBookingModal(true)} + className="w-full md:w-auto px-10 py-4.5 rounded-xl bg-[#E5A900] hover:bg-black text-white font-black text-xs uppercase tracking-widest transition-all cursor-pointer shadow-[0_4px_12px_rgba(229,169,0,0.25)] shrink-0" + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.submitBooking} + +
+ +
+ +
+
+ + {/* ── OUR TARIFFS (Bento style Light Plans) ── */} +
+
+ +
+ {t.tariffsSubtitle} +

+ {t.tariffsTitle} +

+

+ {t.tariffsDesc} +

+
+ + {/* Three Cards Grid */} +
+ {istatistikler.map((stat, sIdx) => { + const locStat = getLocalizedStat(stat.deger); + const isPopular = stat.deger === "Standard Class"; + return ( + + {isPopular && ( +
+ {t.popular} +
+ )} + +
+ {/* Car vector silhouette placeholder */} +
+ + + +
+ +

+ {locStat.title} +

+

+ {locStat.desc} +

+
+ +
+ {/* Price display */} +
+ + {sIdx === 0 ? "$1.50" : sIdx === 1 ? "$2.20" : "$3.50"} + + {t.perMile} +
+ + { + setActivePlan(sIdx); + const el = document.getElementById("booking-flow"); + el?.scrollIntoView({ behavior: "smooth" }); + }} + className={`w-full py-4.5 rounded-xl font-black text-xs uppercase tracking-widest transition-all cursor-pointer ${ + isPopular + ? "bg-[#E5A900] hover:bg-black text-white shadow-md shadow-[#E5A900]/10" + : "bg-[#FCFAF7] hover:bg-black hover:text-white text-black/70 border border-black/5 hover:border-black/10" + }`} + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > + {t.bookTariff} + +
+ +
+ ); + })} +
+ +
+
+ + {/* ── CORE BENEFITS ── */} +
+
+ +
+ {t.benefitsSubtitle} +

+ {t.benefitsTitle} +

+

+ {t.benefitsDesc} +

+
+ + {/* Grid */} +
+ {hizmetler.map((benefit, bIdx) => { + const locBenefit = getLocalizedService(benefit.baslik, benefit.aciklama); + return ( + +
+ {getIconSvg(benefit.ikon)} +
+ +

+ {locBenefit.title} +

+

+ {locBenefit.desc} +

+
+ ); + })} +
+ +
+
+ + {/* ── APP SHOWCASE ── */} +
+
+
+ + {/* Left Column: text details and store buttons */} + + + {t.appSubtitle} + + + {t.appTitle} + + + {t.appDesc} + + + {/* Badges buttons */} + + {/* Google Play */} + + + + +
+
{t.getItOn}
+
{t.googlePlay}
+
+
+ + {/* App Store */} + + + + +
+
{t.getItOn}
+
{t.appStore}
+
+
+
+
+ + {/* Right Column: Light theme smartphone mockup */} +
+ + {/* eslint-disable-next-line @next/next/no-img-element */} + CabHub Light-themed Booking interface tracking map + +
+ +
+
+
+ + {/* ── TESTIMONIALS ── */} +
+
+ +
+ {t.reviewsSubtitle} +

+ {t.reviewsTitle} +

+

+ {t.reviewsDesc} +

+
+ + {/* Testimonials 2-Column Grid */} +
+ {yorumlar.map((y, yIdx) => { + const locTestimonial = getLocalizedTestimonial(y.yazar); + return ( + + {/* Rating Stars SVG */} +
+ {[...Array(5)].map((_, starIdx) => ( + + + + ))} +
+ +

+ “{locTestimonial}” +

+ +
+
+ {y.yazar.charAt(0)} +
+
+

+ {y.yazar} +

+ + {y.tarih} + +
+
+ +
+ ); + })} +
+ +
+
+ + {/* ── BOTTOM CALL RESERVATION DIRECT STRIP ── */} +
+
+

+ {t.callStripText} +

+ + 📞 {firma.telefon} + +
+
+ + {/* ── FOOTER ── */} +
+
+ +
+ + {/* About Column */} +
+ + CABHUB + +

+ {firma.slogan} — Exclusive, verified zero-emission lounge drop-offs and corporate city transfers in New York City. +

+
+

📍 {firma.adres}

+

📧 {firma.email}

+
+
+ + {/* Download links */} + + + {/* Navigation links */} +
+

+ USEFUL LINKS +

+
+ {["Book a Cab", "Economy & Business Tariffs", "Our Core Benefits", "Happy Reviews", "Terms & Regulations"].map(item => ( + + {item} + + ))} +
+
+ +
+ +
+

© 2026 {firma.adi}. {t.footerRights}

+ +
+ +
+
+ + {/* ── FAST BOOKING SUCCESS MODAL ── */} + + {showBookingModal && ( + + + {/* Close Button */} + + + {/* Success check indicator */} +
+ + + +
+ +

+ {t.bookingRequested} +

+

+ {t.nycDispatchActive} +

+ +

+ {t.successDesc} +

+ + setShowBookingModal(false)} + > + {t.dismiss} + +
+
+ )} +
+ +
+ + ); +} diff --git a/components/ui/AnimatedCounter.tsx b/components/ui/AnimatedCounter.tsx new file mode 100644 index 0000000..3489a8d --- /dev/null +++ b/components/ui/AnimatedCounter.tsx @@ -0,0 +1,34 @@ +"use client"; +import { useEffect, useRef, useState } from "react"; +import { useInView } from "framer-motion"; + +export default function AnimatedCounter({ target, suffix = "" }: { target: number; suffix?: string }) { + const [count, setCount] = useState(0); + const ref = useRef(null); + const inView = useInView(ref, { once: true }); + + useEffect(() => { + if (!inView) return; + const duration = 1800; + const steps = 60; + const increment = target / steps; + let current = 0; + const timer = setInterval(() => { + current += increment; + if (current >= target) { + setCount(target); + clearInterval(timer); + } else { + setCount(Math.floor(current)); + } + }, duration / steps); + return () => clearInterval(timer); + }, [inView, target]); + + return ( + + {count.toLocaleString("tr-TR")} + {suffix} + + ); +} diff --git a/data/demos.ts b/data/demos.ts new file mode 100644 index 0000000..7a94207 --- /dev/null +++ b/data/demos.ts @@ -0,0 +1,610 @@ +export interface DemoData { + slug: string; + template: "klinik" | "restoran" | "kurumsal" | "dental" | "restoran2" | "taxi" | "taxi2" | "chatbot" | "bar" | "bar2" | "hotel1" | "hotel2" | "hotel3" | "bodrumcerrahi" | "chatbot2"; + firma: { + adi: string; + slogan: string; + sehir: string; + adres: string; + telefon: string; + email: string; + logoEmoji: string; + renkAna: string; + renkKoyu: string; + renkAcik: string; + }; + // Flexible stats — her şablon kendi anahtarlarını kullanır + istatistikler: { deger: string; etiket: string }[]; + hizmetler: { ikon: string; baslik: string; aciklama: string }[]; + yorumlar: { yazar: string; yorum: string; puan: number; tarih: string; emoji: string }[]; + + // Klinik + doktorlar?: { ad: string; uzmanlik: string; puan: string; yil: string; hasta: string; emoji: string }[]; + + // Restoran + menu?: { kategori: string; ikon: string; urunler: { ad: string; aciklama: string; fiyat: string }[] }[]; + + // Kurumsal + projeler?: { baslik: string; sektor: string; aciklama: string; ikon: string; renk: string; resim?: string }[]; + ekip?: { ad: string; rol: string; emoji: string }[]; +} + +export const demos: Record = { + "dogan-tip-merkezi": { + slug: "dogan-tip-merkezi", + template: "klinik", + firma: { + adi: "Doğan Tıp Merkezi", + slogan: "Sağlığınız, En Değerli Varlığınız", + sehir: "İstanbul", + adres: "Bağcılar Mah. Sağlık Cad. No:12, Bağcılar / İstanbul", + telefon: "0212 555 44 33", + email: "info@dogantip.com", + logoEmoji: "🏥", + renkAna: "#0ea5e9", + renkKoyu: "#0284c7", + renkAcik: "#e0f2fe", + }, + istatistikler: [ + { deger: "4200", etiket: "Mutlu Hasta" }, + { deger: "14", etiket: "Uzman Doktor" }, + { deger: "12", etiket: "Yıl Deneyim" }, + { deger: "620", etiket: "Yorum" }, + ], + hizmetler: [ + { ikon: "🩺", baslik: "Dahiliye", aciklama: "Erişkin hastalıklarında kapsamlı tanı ve tedavi hizmetleri." }, + { ikon: "❤️", baslik: "Kardiyoloji", aciklama: "Kalp ve damar sağlığı için ileri tanı ve tedavi." }, + { ikon: "🦷", baslik: "Diş Hekimliği", aciklama: "İmplant, ortodonti ve estetik diş uygulamaları." }, + { ikon: "👁️", baslik: "Göz Sağlığı", aciklama: "Lazer tedavileri ve göz cerrahisi." }, + { ikon: "🧪", baslik: "Laboratuvar", aciklama: "Hızlı ve güvenilir tahlil sonuçları." }, + { ikon: "📷", baslik: "Radyoloji", aciklama: "MR, tomografi ve ultrason görüntüleme." }, + ], + doktorlar: [ + { ad: "Dr. Ahmet Yılmaz", uzmanlik: "Dahiliye Uzmanı", puan: "4.9", yil: "15", hasta: "2400", emoji: "👨‍⚕️" }, + { ad: "Dr. Ayşe Kaya", uzmanlik: "Kardiyoloji", puan: "4.8", yil: "12", hasta: "1800", emoji: "👩‍⚕️" }, + { ad: "Dr. Mehmet Demir", uzmanlik: "Göz Hastalıkları", puan: "5.0", yil: "10", hasta: "1200", emoji: "👨‍⚕️" }, + { ad: "Dr. Zeynep Arslan", uzmanlik: "Diş Hekimi", puan: "4.9", yil: "8", hasta: "900", emoji: "👩‍⚕️" }, + ], + yorumlar: [ + { yazar: "Fatma K.", yorum: "Çok iyi hizmet aldım. Doktorlar son derece ilgili ve profesyonel. Randevu sistemi de çok pratik.", puan: 5, tarih: "2 hafta önce", emoji: "😊" }, + { yazar: "Mustafa A.", yorum: "Temiz, modern ortam. Muayenemi çok hızlı yaptılar ve sonuçları aynı gün aldım.", puan: 5, tarih: "1 ay önce", emoji: "🙂" }, + { yazar: "Elif T.", yorum: "Online randevu sistemi harikaydı. Güvenilir ve kaliteli bir klinik. Tüm ailemle tercih ediyoruz.", puan: 5, tarih: "3 hafta önce", emoji: "😄" }, + ], + }, + + // ── RESTORAN ────────────────────────────────────────────────────────────── + "lezzet-mutfagi": { + slug: "lezzet-mutfagi", + template: "restoran", + firma: { + adi: "Lezzet Mutfağı", + slogan: "Taste The Difference", + sehir: "İstanbul", + adres: "Karaköy Mah. Liman Cad. No:7, Beyoğlu / İstanbul", + telefon: "0212 444 55 66", + email: "rezervasyon@lezzetmutfagi.com", + logoEmoji: "🍽️", + renkAna: "#C5A880", + renkKoyu: "#0A0B0D", + renkAcik: "#14161B", + }, + istatistikler: [ + { deger: "12", etiket: "Years of Heritage" }, + { deger: "48+", etiket: "Signature Dishes" }, + { deger: "4.9", etiket: "Average Guest Rating" }, + { deger: "18k+", etiket: "Monthly Diners" }, + ], + hizmetler: [ + { ikon: "alacarte", baslik: "À la Carte", aciklama: "Seçkin malzemelerle hazırlanan imza yemeklerimizi keşfedin." }, + { ikon: "special", baslik: "Özel Günler", aciklama: "Doğum günü, evlilik yıldönümü ve kutlamalar için özel menüler." }, + { ikon: "catering", baslik: "Kurumsal Etkinlik", aciklama: "İş yemekleri ve kurumsal organizasyonlar için catering hizmeti." }, + { ikon: "delivery", baslik: "Paket Servis", aciklama: "Şehrin her köşesine hızlı ve sıcak teslimat." }, + ], + menu: [ + { + kategori: "Başlangıçlar", ikon: "salad", + urunler: [ + { ad: "Ev Yapımı Hummus", aciklama: "Fırından taze lavaş ve trüf yağı ile", fiyat: "₺180" }, + { ad: "Karidesli Bruschetta", aciklama: "Taze domates, fesleğen, marine sarımsak", fiyat: "₺220" }, + { ad: "Burrata Salatası", aciklama: "Cherry domates, pesto, taze roka yaprakları", fiyat: "₺240" }, + ], + }, + { + kategori: "Ana Yemekler", ikon: "steak", + urunler: [ + { ad: "Wagyu Bonfile", aciklama: "Fırınlanmış kuşkonmaz, trüf mantarlı patates püresi", fiyat: "₺680" }, + { ad: "Levrek Fileto", aciklama: "Limonlu tereyağı sosu, kapari ve taze otlar", fiyat: "₺420" }, + { ad: "Mantar Risotto", aciklama: "Yabani orman mantarları ve Parmigiano Reggiano", fiyat: "₺360" }, + ], + }, + { + kategori: "Tatlılar", ikon: "dessert", + urunler: [ + { ad: "Crème Brûlée", aciklama: "Gerçek Madagaskar vanilyası, karamelize şeker kıtırı", fiyat: "₺160" }, + { ad: "Çikolatalı Fondant", aciklama: "Belçika çikolatası dolgulu sıcak kek, vanilyalı dondurma", fiyat: "₺180" }, + { ad: "Künefe", aciklama: "Halis tereyağlı çıtır tel kadayıf, manda kaymağı", fiyat: "₺200" }, + ], + }, + ], + yorumlar: [ + { yazar: "Selin A.", yorum: "Hayatımda yediğim en iyi bonfile. Servis mükemmeldi, ortam son derece loş ve şık. Kesinlikle tekrar geleceğiz.", puan: 5, tarih: "1 hafta önce", emoji: "🍷" }, + { yazar: "Burak T.", yorum: "Yıldönümümüzü burada kutladık. Detaylara gösterilen özen, menü kalitesi ve ambiyans harikaydı.", puan: 5, tarih: "2 hafta önce", emoji: "🥂" }, + { yazar: "Canan M.", yorum: "Karaköy'ün en iyi restoranı. Risotto ve tatlılar inanılmazdı. Şefin ellerine sağlık.", puan: 5, tarih: "1 ay önce", emoji: "✨" }, + ], + }, + + // ── KURUMSAL ────────────────────────────────────────────────────────────── + "atlas-lojistik": { + slug: "atlas-lojistik", + template: "kurumsal", + firma: { + adi: "Atlas Lojistik", + slogan: "Güvenli Taşımacılık, Zamanında Teslimat", + sehir: "İstanbul", + adres: "Esenyurt Lojistik Merkezi, Esenyurt / İstanbul", + telefon: "0212 333 22 11", + email: "info@atlaslojistik.com", + logoEmoji: "🚛", + renkAna: "#6366f1", + renkKoyu: "#4f46e5", + renkAcik: "#eef2ff", + }, + istatistikler: [ + { deger: "15", etiket: "Yıl Deneyim" }, + { deger: "850+", etiket: "Aktif Müşteri" }, + { deger: "12", etiket: "Şehir" }, + { deger: "%99.2", etiket: "Zamanında Teslimat" }, + ], + hizmetler: [ + { ikon: "🚛", baslik: "Karayolu Taşımacılığı", aciklama: "Yurtiçi ve uluslararası karayolu ile güvenli ve hızlı taşımacılık." }, + { ikon: "🏭", baslik: "Depolama & Lojistik", aciklama: "Modern depolarımızda güvenli stok yönetimi ve dağıtım hizmetleri." }, + { ikon: "📦", baslik: "E-ticaret Lojistiği", aciklama: "Son mile teslimat, iade yönetimi ve fulfillment çözümleri." }, + { ikon: "🌍", baslik: "Uluslararası Nakliye", aciklama: "Gümrük işlemleri dahil kapıdan kapıya uluslararası taşımacılık." }, + { ikon: "❄️", baslik: "Soğuk Zincir", aciklama: "Gıda ve ilaç sektörü için kontrollü sıcaklıkta taşıma." }, + { ikon: "📱", baslik: "Anlık Takip", aciklama: "Yükünüzü 7/24 gerçek zamanlı olarak takip edin." }, + ], + projeler: [ + { baslik: "Migros Dağıtım Ağı", sektor: "Perakende", aciklama: "12 şehirde günlük 400+ noktaya soğuk zincir dağıtım yönetimi.", ikon: "🛒", renk: "#10b981" }, + { baslik: "Trendyol Fulfillment", sektor: "E-ticaret", aciklama: "Günlük 8.000+ sipariş işleme ve son mile teslimat operasyonu.", ikon: "📦", renk: "#f97316" }, + { baslik: "Ford Otosan Tedarik", sektor: "Otomotiv", aciklama: "JIT modeli ile fabrikaya zamanında parça tedarik lojistiği.", ikon: "🚗", renk: "#6366f1" }, + { baslik: "Pfizer İlaç Lojistiği", sektor: "İlaç", aciklama: "GDP sertifikalı soğuk zincir ile ilaç dağıtım ağı yönetimi.", ikon: "💊", renk: "#0ea5e9" }, + ], + ekip: [ + { ad: "Murat Yıldız", rol: "Genel Müdür", emoji: "👨‍💼" }, + { ad: "Hande Çelik", rol: "Operasyon Direktörü", emoji: "👩‍💼" }, + { ad: "Serkan Aydın", rol: "Teknoloji Müdürü", emoji: "👨‍💻" }, + { ad: "Neslihan Kara", rol: "Müşteri Deneyimi", emoji: "👩‍💼" }, + ], + yorumlar: [ + { yazar: "Kemal B. — Tedarik Zinciri Müdürü", yorum: "3 yıldır çalışıyoruz, tek bir gecikmemiz olmadı. Gerçek anlamda güvenilir bir iş ortağı.", puan: 5, tarih: "1 ay önce", emoji: "👍" }, + { yazar: "Derya S. — E-ticaret Direktörü", yorum: "E-ticaret operasyonumuzu tamamen Atlas'a devrettik. Müşteri memnuniyetimiz %94'e çıktı.", puan: 5, tarih: "2 ay önce", emoji: "🙌" }, + { yazar: "Tahir A. — Satın Alma Müdürü", yorum: "Anlık takip sistemi ve proaktif iletişim anlayışı sektörde fark yaratıyor.", puan: 5, tarih: "3 hafta önce", emoji: "⭐" }, + ], + }, + + "odentries": { + slug: "odentries", + template: "dental", + firma: { + adi: "Odentries", + slogan: "Seamless Dental Care", + sehir: "İstanbul", + adres: "Nişantaşı Mah. Valikonağı Cad. No:45, Şişli / İstanbul", + telefon: "0212 999 88 77", + email: "hello@odentries.com", + logoEmoji: "🦷", + renkAna: "#1E2E38", + renkKoyu: "#121C22", + renkAcik: "#EBF5F0", + }, + istatistikler: [ + { deger: "80%", etiket: "Exclusive Member Savings: Save 60% - 80% on Dental Procedures, including Oral Exams, Cleanings, and X-Rays." }, + { deger: "40%", etiket: "Enhanced Member Benefits: Save 40% on All Other Dental Services, including Cosmetic, Restorative, and Specialty Dental Procedures." }, + ], + hizmetler: [ + { ikon: "🦷", baslik: "Prevent cavities and gum disease", aciklama: "Kapsamlı diş muayeneleri ve koruyucu hekimlik uygulamaları ile dişlerinizi koruyoruz." }, + { ikon: "✨", baslik: "Keep your teeth sparkling clean", aciklama: "Profesyonel temizleme ve beyazlatma teknikleriyle parıldayan sağlıklı gülüşler yaratıyoruz." }, + { ikon: "🔍", baslik: "Early detection of dental issues", aciklama: "İleri teknoloji röntgen ve teşhis araçlarıyla sorunları büyümeden yakalıyoruz." }, + ], + projeler: [ + { baslik: "Teeth Straightening", sektor: "002 - Our Works", aciklama: "Impressive results with cleaning.", ikon: "✨", renk: "#EBF5F0", resim: "/teeth_straightening.png" }, + { baslik: "Revitalized Cleaning", sektor: "002 - Our Works", aciklama: "A simple way to enhance your smile.", ikon: "🦷", renk: "#FAF7F2", resim: "/revitalized_cleaning.png" }, + { baslik: "Dental Implant", sektor: "002 - Our Works", aciklama: "Gorgeous and durable smile updates.", ikon: "🔬", renk: "#EBF5F0", resim: "/dental_implant.png" }, + ], + yorumlar: [ + { yazar: "Melis Y.", yorum: "Harika bir diş sağlığı deneyimiydi. Tasarım muhteşem, ekip inanılmaz profesyonel. Odentries bir numara!", puan: 5, tarih: "1 hafta önce", emoji: "😊" }, + { yazar: "Arda K.", yorum: "Klinik çok temiz ve ferah. Tedavi süresince hiçbir acı hissetmedim. Herkese tavsiye ederim.", puan: 5, tarih: "3 hafta önce", emoji: "👍" }, + ], + }, + + "sicilia-tavola": { + slug: "sicilia-tavola", + template: "restoran2", + firma: { + adi: "Sicilia Tavola", + slogan: "Linen, Lemons & Wood-fired Heritage", + sehir: "İstanbul", + adres: "Karaköy Mah. Gümrük Sok. No:14, Beyoğlu / İstanbul", + telefon: "0212 555 77 88", + email: "ciao@siciliatavola.com", + logoEmoji: "🍋", + renkAna: "#0038A8", + renkKoyu: "#002266", + renkAcik: "#FDFBF7", + }, + istatistikler: [ + { deger: "1892", etiket: "Sicilian Baking Roots" }, + { deger: "100%", etiket: "Organic Cold Pressed Oil" }, + { deger: "4.9", etiket: "Average Gastronomy Rating" }, + { deger: "12k+", etiket: "Happy Diners Annually" }, + ], + hizmetler: [ + { ikon: "alacarte", baslik: "À la Carte Gastronomy", aciklama: "Odun ateşinde pişen taze makarnalar, taze deniz mahsulleri ve Sicilya klasikleri." }, + { ikon: "special", baslik: "Trattoria Geceleri", aciklama: "Özel canlı akordeon dinletileri ve şefin tadım menüleri eşliğinde Sicilya akşamları." }, + { ikon: "catering", baslik: "Zeytinyağı Tadımı", aciklama: "Kendi bahçelerimizden gelen %100 soğuk sıkım sızma zeytinyağlarımızı keşfedin." }, + { ikon: "delivery", baslik: "Tavola Evinizde", aciklama: "Özel korumalı kuryelerimizle en taze gurme lezzetleri kapınıza getiriyoruz." }, + ], + menu: [ + { + kategori: "Primi Piatti", ikon: "salad", + urunler: [ + { ad: "Caprese di Burrata", aciklama: "Manda burrata, pembe domates dilimleri, taze fesleğen ve zeytinyağı", fiyat: "₺280" }, + { ad: "Carpaccio di Polpo", aciklama: "İnce dilimlenmiş marine ahtapot, kapari, bebek roka ve limon emülsiyonu", fiyat: "₺340" }, + { ad: "Focaccia al Rosmarino", aciklama: "Taş fırından yeni çıkmış deniz tuzu, taze biberiye ve sızma zeytinyağlı", fiyat: "₺180" }, + ], + }, + { + kategori: "Secondi", ikon: "steak", + urunler: [ + { ad: "Tagliatelle al Ragu di Polpo", aciklama: "Ağır ateşte pişmiş ahtapot ragu, taze el yapımı tagliatelle", fiyat: "₺460" }, + { ad: "Pizza Margherita DOP", aciklama: "Odun ateşinde taş fırın pizza, San Marzano domates, taze mozzarella di bufala", fiyat: "₺380" }, + { ad: "Polpo alla Griglia", aciklama: "Izgara ahtapot kolları, kapari, cherry domates ve ezilmiş sarımsaklı bebek patates", fiyat: "₺680" }, + ], + }, + { + kategori: "Dolci", ikon: "dessert", + urunler: [ + { ad: "Cannoli Siciliani", aciklama: "Çıtır hamur tüpleri içinde tatlı ricotta kreması, çikolata parçacıkları ve Antep fıstığı", fiyat: "₺190" }, + { ad: "Tiramisu al Limone", aciklama: "Limon likörlü hafif mascarpone kreması, taze limon kabuğu rendesi ile", fiyat: "₺210" }, + { ad: "Gelato di Pistacchio", aciklama: "Kendi imalatımız gerçek Bronte Antep fıstıklı İtalyan dondurması", fiyat: "₺160" }, + ], + }, + ], + yorumlar: [ + { yazar: "Ender M.", yorum: "Limon kokuları ve çalan müzikler eşliğinde kendimizi Sicilya'da hissettik. Ahtapot makarna tek kelimeyle kusursuzdu.", puan: 5, tarih: "3 gün önce", emoji: "🍋" }, + { yazar: "Zeynep S.", yorum: "Focaccia ekmeği ve sızma zeytinyağının kalitesi buranın zanaatkarlığını kanıtlıyor. Mutlaka rezervasyon yaptırın.", puan: 5, tarih: "2 hafta önce", emoji: "✨" }, + ], + }, + "cabhub-nyc": { + slug: "cabhub-nyc", + template: "taxi", + firma: { + adi: "CabHub NYC", + slogan: "Trusted & Premium Cab Services in New York", + sehir: "New York", + adres: "450 7th Ave, New York, NY 10123", + telefon: "+1 234 567 8900", + email: "booking@cabhubnyc.com", + logoEmoji: "🚕", + renkAna: "#F5C518", + renkKoyu: "#0B0C0E", + renkAcik: "#14161C", + }, + istatistikler: [ + { deger: "Economy Class", etiket: "Within the city. We run services within the city to any destination you want to go. $1.5/MI" }, + { deger: "Standard Class", etiket: "Within the state. We run services within the state to any destination you want to go. $1.5/MI" }, + { deger: "Business Class", etiket: "Within the country. We run services within the country to any destination you want to go. $1.5/MI" }, + ], + hizmetler: [ + { ikon: "pickup", baslik: "HOME PICKUP", aciklama: "We run services to serve you more better and to your convenience." }, + { ikon: "booking", baslik: "FAST BOOKING", aciklama: "Our book method is very fast and easy. It won't stress you." }, + { ikon: "bonus", baslik: "BONUSES FOR RIDE", aciklama: "When you run services frequently we give you different bonuses that can put a smile on your face." }, + { ikon: "gps", baslik: "GPS SEARCHING", aciklama: "We run services incase you aren't sure of your destination. So you don't have to worry." }, + ], + yorumlar: [ + { yazar: "John Doe", yorum: "CabHub NYC provided the most reliable ride during my business trip. The standard class vehicle was pristine and the driver knew all the shortcuts.", puan: 5, tarih: "2 days ago", emoji: "⭐" }, + { yazar: "Sarah Jenkins", yorum: "The fast booking system works like a charm. Home pickup was exactly on time and the GPS tracking made me feel incredibly secure.", puan: 5, tarih: "1 week ago", emoji: "⭐" } + ] + }, + "cabhub-premium": { + slug: "cabhub-premium", + template: "taxi2", + firma: { + adi: "CabHub Premium", + slogan: "Minimalist & Chic Airport Transfers in NYC", + sehir: "New York", + adres: "500 5th Ave, New York, NY 10110", + telefon: "+1 800 555 0199", + email: "premium@cabhub.com", + logoEmoji: "⚡", + renkAna: "#E5A900", + renkKoyu: "#111317", + renkAcik: "#FCFAF7", + }, + istatistikler: [ + { deger: "Economy Class", etiket: "Chic city rides. Comfortable zero-emission trips to any destination within boroughs. $1.5/MI" }, + { deger: "Standard Class", etiket: "Premium transfers. Verified luxury sedans covering tri-state airport hubs. $1.5/MI" }, + { deger: "Business Class", etiket: "First class executive. Top-tier luxury vehicles with priority lane dispatch. $1.5/MI" }, + ], + hizmetler: [ + { ikon: "pickup", baslik: "LOUNGE PICKUP", aciklama: "Direct lounge or doorstep coordination for all airport coordinates." }, + { ikon: "booking", baslik: "TAP RESERVATION", aciklama: "Ultra-fast smartphone booking client. Secure scheduling under 60 seconds." }, + { ikon: "bonus", baslik: "MEMBER BENEFITS", aciklama: "Collect mileage dynamically. Redeem up to 40% savings on specialty trips." }, + { ikon: "gps", baslik: "TRACKING GPS", aciklama: "Real-time satellite path tracking and automated flight delay syncing." }, + ], + yorumlar: [ + { yazar: "Alexander Wright", yorum: "The airport transfer from JFK was absolutely seamless. The driver met me at the lounge gate and the electric vehicle was in pristine condition.", puan: 5, tarih: "3 days ago", emoji: "👤" }, + { yazar: "Emily Vance", yorum: "CabHub Premium is my absolute go-to for corporate travel. The light theme app booking is simple and the delay syncing works perfectly.", puan: 5, tarih: "2 weeks ago", emoji: "👤" } + ] + }, + "vaatbot-ai": { + slug: "vaatbot-ai", + template: "chatbot", + firma: { + adi: "VaatBot AI", + slogan: "Supercharge Your Team with AI Conversations", + sehir: "Istanbul", + adres: "Levent Loft 1C, Buyukdere Cad. No:201, Sisli / Istanbul", + telefon: "+90 212 999 5544", + email: "hello@vaatbot.ai", + logoEmoji: "🤖", + renkAna: "#00E5FF", + renkKoyu: "#080710", + renkAcik: "#FF007A", + }, + istatistikler: [ + { deger: "Accuracy 100%", etiket: "Trained directly on your database, docs, and custom web URLs to guarantee zero hallucination." }, + { deger: "3x Faster Response", etiket: "Sub-second low-latency instant response times across Slack, WhatsApp, and Web widgets." }, + { deger: "-20% Bounce Rate", etiket: "Keep visitors deeply engaged and double visitor-to-lead subscription conversions." }, + ], + hizmetler: [ + { ikon: "languages", baslik: "50+ Languages", aciklama: "Speaks your customer's native tongue fluently, spanning English, Spanish, Turkish, and more." }, + { ikon: "customizer", baslik: "Brand Customizer", aciklama: "Tailor colors, names, avatars, and greetings to fully respect your corporate branding system." }, + { ikon: "widgets", baslik: "Flexible Widget", aciklama: "Deploy in seconds using our clean copy-paste JS script tag or customizable iframe containers." }, + { ikon: "industries", baslik: "Any Industry", aciklama: "Highly optimized for E-commerce, SaaS, Real Estate, Health Clinics, and Customer Support channels." }, + ], + yorumlar: [ + { yazar: "Sahil Dobariya", yorum: "VaatBot transformed our customer feedback loop. We connected the AI widget in under 2 minutes, and it handles 80% of routine questions without any developer overhead.", puan: 5, tarih: "1 day ago", emoji: "⚡" }, + { yazar: "Michael Vance", yorum: "The accuracy rate is astonishing. It indexes our Zendesk support articles and guides customers directly to links in real-time.", puan: 5, tarih: "1 week ago", emoji: "🤖" } + ] + }, + "noir-velvet": { + slug: "noir-velvet", + template: "bar", + firma: { + adi: "Noir Velvet Lounge", + slogan: "Cocktail Stage Evenings", + sehir: "Istanbul", + adres: "Karakoy Cad. No:88, Beyoglu / Istanbul", + telefon: "+90 212 555 9090", + email: "cheers@noirvelvet.com", + logoEmoji: "🍸", + renkAna: "#D4AF37", + renkKoyu: "#0A0A0C", + renkAcik: "#1C1C22", + }, + istatistikler: [ + { deger: "Open Hours", etiket: "Weekday: 4:00 PM - 2:00 AM. Weekend: 4:00 PM - 4:00 AM." }, + { deger: "Happy Hour", etiket: "Everyday: 5:00 PM - 8:00 PM. 20% off classic mixology cocktails." }, + ], + hizmetler: [ + { ikon: "signature", baslik: "Coco Spice", aciklama: "Spiced rum, pressed pineapple nectar, organic ginger syrup, grated nutmeg." }, + { ikon: "signature", baslik: "Tequila Sunrise", aciklama: "Reposado tequila, fresh orange reduction, grenadine, lime wheel." }, + { ikon: "signature", baslik: "Cuba Libre", aciklama: "Dark cask rum, fresh squeezed lime, house cola bitters." }, + { ikon: "signature", baslik: "Gin Fizz", aciklama: "Botanical gin, fresh lemon juice, simple syrup, soda splash, egg white foam." }, + ], + yorumlar: [ + { yazar: "David K.", yorum: "The cocktails are meticulously staged. A perfect moody obsidian lounge with jazz chords and exceptional botanical gin selections.", puan: 5, tarih: "3 days ago", emoji: "🍸" }, + { yazar: "Elena R.", yorum: "We booked the VIP counter. Watching the mixologist mist the crystal glassware with citrus zest was an absolute work of art.", puan: 5, tarih: "1 week ago", emoji: "✨" } + ] + }, + "char-barrelhouse": { + slug: "char-barrelhouse", + template: "bar2", + firma: { + adi: "Char Barrelhouse", + slogan: "The Ultimate Craft & Spirit Experience", + sehir: "Istanbul", + adres: "Kadikoy Ritim Sok. No:19, Kadikoy / Istanbul", + telefon: "+90 216 444 8822", + email: "hello@charbarrel.com", + logoEmoji: "🥃", + renkAna: "#E63946", + renkKoyu: "#111215", + renkAcik: "#1E1F24", + }, + istatistikler: [ + { deger: "Mojito", etiket: "Capacity: 350ml • Alcohol: 12% • Relax: 80% • Fresh white rum, crushed spearmint, lime juice." }, + { deger: "Mai Tai", etiket: "Capacity: 280ml • Alcohol: 18% • Relax: 90% • Jamaican amber rum, orange curaçao, orgeat syrup." }, + { deger: "Rum Cosmo", etiket: "Capacity: 200ml • Alcohol: 22% • Relax: 95% • Cask-aged dark rum, cranberry infusion, triple sec." }, + ], + hizmetler: [ + { ikon: "experience", baslik: "WHISKEY TASTINGS", aciklama: "Explore curated flights of single malt scotch, bourbon, and rye guided by certified sommeliers." }, + { ikon: "experience", baslik: "MASTERCLASS MIXOLOGY", aciklama: "Step behind the heavy oak bar counter and craft signature historical formulas under expert tuition." }, + { ikon: "experience", baslik: "VIP PRIVATE BOOKING", aciklama: "Reserve the entire rustic stone fireplace chamber for corporate launches or private bachelorettes." }, + ], + yorumlar: [ + { yazar: "Marcus V.", yorum: "The heavy wooden barrels and charcoal smoke aroma set an outstanding vibe. The single malt tastings are second to none.", puan: 5, tarih: "2 days ago", emoji: "🥃" }, + { yazar: "Sophia T.", yorum: "Outstanding Mai Tais! You can taste the quality of the raw Jamaican aged rum. We scheduled a private corporate masterclass.", puan: 5, tarih: "2 weeks ago", emoji: "⭐" } + ] + }, + "cal-vestam-resort": { + slug: "cal-vestam-resort", + template: "hotel1", + firma: { + adi: "Cal Vestam Resort", + slogan: "Cal Vestam Rehial Felgor", + sehir: "Muğla", + adres: "Ölüdeniz Mah. Akdeniz Bulvarı No:140, Fethiye / Muğla", + telefon: "+90 252 666 4422", + email: "stay@calvestam.com", + logoEmoji: "🌴", + renkAna: "#14B8A6", + renkKoyu: "#0D9488", + renkAcik: "#F0FDFA", + }, + istatistikler: [ + { deger: "120+", etiket: "Signature Sea Suites" }, + { deger: "3", etiket: "Panoramic Infinity Pools" }, + { deger: "4.9", etiket: "Guest Experience Index" }, + { deger: "100%", etiket: "Natural Olive Oil Soap & Spa" }, + ], + hizmetler: [ + { ikon: "pool", baslik: "INFINITY VESTAM POOL", aciklama: "Dive into our award-winning glass-edge infinity pools looking directly over Fethiye blue ridges." }, + { ikon: "spa", baslik: "REHIAL SPA THERAPY", aciklama: "Indulge in organic olive leaf stone massages and mineral salt hydrotherapy curated by local experts." }, + { ikon: "cuisine", baslik: "AL-FRESCO TERRACE DINING", aciklama: "Savor fresh garden ingredients and cold pressed citrus recipes under Mediterranean olive trees." }, + ], + yorumlar: [ + { yazar: "Clara M.", yorum: "The infinity pools at Cal Vestam are absolutely magical. Watching the sunset while looking over the mountains of Muğla felt like a dream.", puan: 5, tarih: "3 days ago", emoji: "🌴" }, + { yazar: "Tobias W.", yorum: "Clean, elegant, and filled with Mediterranean light. The local citrus cocktails and al-fresco terrace dining were exceptional.", puan: 5, tarih: "1 week ago", emoji: "✨" }, + ], + }, + "bitterroot-bunkhouse": { + slug: "bitterroot-bunkhouse", + template: "hotel2", + firma: { + adi: "Bitterroot Bunkhouse", + slogan: "Book Your Cozy Wilderness Getaway Today", + sehir: "Montana", + adres: "Bitterroot Valley National Forest, Darby, MT 59829", + telefon: "+1 406 555 0122", + email: "cabin@bitterrootbunkhouse.com", + logoEmoji: "🌲", + renkAna: "#854D0E", + renkKoyu: "#1C1917", + renkAcik: "#F5F2EB", + }, + istatistikler: [ + { deger: "A-Frame", etiket: "Rustic hand-crafted red cedar cabins situated deep in Darby forest." }, + { deger: "Fireplace", etiket: "Organic stone hearth fireplaces stocked with seasoned birch logwood." }, + { deger: "Wilderness", etiket: "Direct access to river trout fishing, forest trails, and kayak lakes." }, + ], + hizmetler: [ + { ikon: "hosts", baslik: "MEET YOUR HOSTS", aciklama: "Local mountain guides coordinate custom trout fishing trips, wildflower paths, and local map secrets." }, + { ikon: "cabin", baslik: "CABIN POLICIES", aciklama: "Respectful pet-friendly lodge parameters. Stocked kitchens with cast iron skillets and firewood reserves." }, + { ikon: "booking", baslik: "DIRECT RESERVATION", aciklama: "Direct calendar sync with Airbnb, VRBO, or secure bunkhouse booking triggers without commissions." }, + ], + yorumlar: [ + { yazar: "Ethan R.", yorum: "The Bitterroot Bunkhouse is the ultimate mountain escape. The A-frame architecture combined with the stone fireplace was so cozy.", puan: 5, tarih: "4 days ago", emoji: "🔥" }, + { yazar: "Sophia J.", yorum: "Waking up to the smell of pine trees and hot sourdough was incredible. The hosts were incredibly helpful with kayak trails.", puan: 5, tarih: "2 weeks ago", emoji: "🌲" }, + ], + }, + "apex-arc-hotel": { + slug: "apex-arc-hotel", + template: "hotel3", + firma: { + adi: "Apex Arc Estate", + slogan: "Designing Spaces That Inspire & Endure", + sehir: "Bodrum", + adres: "Yalıkavak Yat Limanı Yolu No:8, Bodrum / Muğla", + telefon: "+90 252 777 5533", + email: "villas@apexarcestate.com", + logoEmoji: "📐", + renkAna: "#0F172A", + renkKoyu: "#020617", + renkAcik: "#F8FAFC", + }, + istatistikler: [ + { deger: "Concrete", etiket: "Raw monolithic architectural concrete forms coupled with warm teak decking." }, + { deger: "Smart Estate", etiket: "Fully integrated voice interfaces, automated ventilation, and solar grid reserves." }, + { deger: "Sea View", etiket: "Cantilevered master chambers designed with absolute panoramic floor-to-ceiling glass." }, + ], + hizmetler: [ + { ikon: "arch", baslik: "ARCHITECTURAL TOURS", aciklama: "Private property walkthroughs showcasing carbon structures, raw concrete textures, and zero-edge pools." }, + { ikon: "interior", baslik: "DESIGN MASTERCLASSES", aciklama: "Join our masterclasses on minimalist living, bespoke furniture layout, and sustainable concrete styling." }, + { ikon: "vip", baslik: "EXECUTIVE LUXURY VILLA", aciklama: "Full estate buyouts with personal sommelier coordination, automated helipad dispatch, and high-security details." }, + ], + yorumlar: [ + { yazar: "David V.", yorum: "An absolute masterpiece of modern architecture. The raw concrete lines and cantilevered ocean deck at Apex Arc took our breath away.", puan: 5, tarih: "5 days ago", emoji: "📐" }, + { yazar: "Zoe K.", yorum: "Elegant, brutalist-inspired minimalism at its absolute finest. Floor-to-ceiling glass and smart automated automation worked flawlessly.", puan: 5, tarih: "3 weeks ago", emoji: "✨" }, + ], + }, + + // ── BODRUM CERRAHİ ──────────────────────────────────────────────────────── + "bodrum-cerrahi": { + slug: "bodrum-cerrahi", + template: "bodrumcerrahi", + firma: { + adi: "Bodrum Cerrahi", + slogan: "Güven, Teknoloji, Sağlık", + sehir: "Bodrum", + adres: "Eskiçeşme Mah. Sadi Irmak Cad. No:17, Gümbet / Bodrum – Muğla", + telefon: "+90 252 319 4800", + email: "info@bodrumcerrahi.com", + logoEmoji: "🏥", + renkAna: "#1B6FA8", + renkKoyu: "#0D3F65", + renkAcik: "#EBF5FF", + }, + istatistikler: [ + { deger: "15+", etiket: "Yıllık Deneyim" }, + { deger: "12", etiket: "Uzman Hekim" }, + { deger: "4.7", etiket: "Google Puanı" }, + { deger: "7/24", etiket: "Acil Servis" }, + ], + hizmetler: [ + { ikon: "surgery", baslik: "Genel Cerrahi", aciklama: "Ameliyathane, yatan hasta servisi ve cerrahi operasyonlarında tam donanımlı hizmet." }, + { ikon: "orthopedics", baslik: "Ortopedi ve Travmatoloji", aciklama: "Menüsküs yırtığı, kırık tedavisi ve eklem cerrahisi alanlarında uzman yaklaşım." }, + { ikon: "pediatrics", baslik: "Çocuk Sağlığı", aciklama: "Pediatri alanında çocuk gelişimi takibi ve hastalık tedavisi hizmetleri." }, + { ikon: "gynecology", baslik: "Kadın Hastalıkları", aciklama: "Jinekoloji, gebelik takibi ve kadın sağlığına özel poliklinik hizmetleri." }, + { ikon: "neurology", baslik: "Nöroloji", aciklama: "Baş ağrısı, epilepsi ve nörolojik hastalıkların tanı ve tedavisi." }, + { ikon: "laboratory", baslik: "Tıbbi Laboratuvar", aciklama: "Hızlı ve güvenilir tahlil sonuçlarıyla kapsamlı laboratuvar hizmetleri." }, + { ikon: "radiology", baslik: "Radyoloji", aciklama: "MR, bilgisayarlı tomografi ve ultrason ile ileri görüntüleme." }, + { ikon: "gastro", baslik: "Gastroenteroloji", aciklama: "Endoskopi, kolonoskopi ve sindirim sistemi hastalıklarında uzman tanı." }, + { ikon: "dietitian", baslik: "Beslenme ve Diyet", aciklama: "Uzman diyetisyen eşliğinde kişiye özel beslenme programları." }, + ], + doktorlar: [ + { ad: "Op. Dr. Erdal Kaleli", uzmanlik: "Genel Cerrah — Mesul Müdür", puan: "5.0", yil: "20", hasta: "3800", emoji: "👨‍⚕️" }, + { ad: "Op. Dr. Murat Bozlar", uzmanlik: "Ortopedi ve Travmatoloji", puan: "4.9", yil: "15", hasta: "2200", emoji: "👨‍⚕️" }, + { ad: "Dyt. Fulden Yürek", uzmanlik: "Beslenme ve Diyet", puan: "4.8", yil: "8", hasta: "1200", emoji: "👩‍⚕️" }, + { ad: "Dr. Tatiana Arslan", uzmanlik: "Geleneksel ve Tamamlayıcı Tıp", puan: "4.9", yil: "12", hasta: "980", emoji: "👩‍⚕️" }, + { ad: "Uzm. Dr. M. Hüsnücan İşgüven", uzmanlik: "Radyoloji", puan: "4.8", yil: "10", hasta: "1500", emoji: "👨‍⚕️" }, + { ad: "Y. Doç. Dr. Hikmet Kerem Çağlayan", uzmanlik: "Anestezi ve Reanimasyon", puan: "5.0", yil: "14", hasta: "2100", emoji: "👨‍⚕️" }, + { ad: "Uzm. Dr. Suat Kahraman", uzmanlik: "İç Hastalıkları — Dahiliye", puan: "4.9", yil: "11", hasta: "1800", emoji: "👨‍⚕️" }, + { ad: "Uzm. Dr. İrfan Güler", uzmanlik: "Anestezi ve Reanimasyon", puan: "4.7", yil: "9", hasta: "1100", emoji: "👨‍⚕️" }, + ], + yorumlar: [ + { yazar: "Aylin K.", yorum: "Bodrum'da bu kalitede bir özel hastane bulmak gerçekten şaşırtıcı. Doktorlar çok ilgili, ameliyat süreci çok iyi yönetildi. Kesinlikle tavsiye ederim.", puan: 5, tarih: "2 hafta önce", emoji: "😊" }, + { yazar: "Michael T.", yorum: "As a foreign patient I was amazed by the level of English spoken at the international desk. The orthopedic team was exceptional.", puan: 5, tarih: "1 ay önce", emoji: "🙂" }, + { yazar: "Hasan B.", yorum: "Acil servise gece geldiğimizde anında ilgilendiler. 7/24 hizmet verdiklerini bu gece deneyimledim. Çok teşekkürler.", puan: 5, tarih: "3 hafta önce", emoji: "😄" }, + { yazar: "Claudia R.", yorum: "The radiology department had state-of-the-art equipment and results came within the hour. Highly professional staff throughout.", puan: 5, tarih: "2 ay önce", emoji: "👍" }, + ], + }, + + // ── ZENITH AI CHATBOT ─────────────────────────────────────────────────── + "zenith-ai": { + slug: "zenith-ai", + template: "chatbot2", + firma: { + adi: "Zenith AI", + slogan: "Next-Generation Conversational Intelligence", + sehir: "Istanbul", + adres: "Kanyon Office Tower 12B, Buyukdere Cad. No:185, Sisli / Istanbul", + telefon: "+90 212 888 7755", + email: "hello@zenithai.com", + logoEmoji: "🧬", + renkAna: "#8B5CF6", // Premium Purple accent + renkKoyu: "#09090B", // Dark neutral + renkAcik: "#F4F4F5", // Neutral warm grey + }, + istatistikler: [ + { deger: "99.4%", etiket: "Doğruluk oranıyla halüsinasyonsuz AI konuşmaları garanti edilir." }, + { deger: "240ms", etiket: "Yanıt gecikmesiyle Slack, WhatsApp ve web widget'larında anında cevaplar." }, + { deger: "4.8x", etiket: "Müşteri etkileşimi ve dönüşüm oranlarında kanıtlanmış artış." }, + ], + hizmetler: [ + { ikon: "brain", baslik: "Akıllı Semantik İndeksleme", aciklama: "Notion, Zendesk, PDF'ler ve tüm web URL'lerinizi otomatik olarak analiz ederek markanızın kendi bilgi tabanını oluşturur." }, + { ikon: "channel", baslik: "Çoklu Kanal Entegrasyonu", aciklama: "Web siteniz, Slack, WhatsApp, Telegram ve Discord kanallarınızda saniyeler içinde yayına alın." }, + { ikon: "brand", baslik: "Kurumsal Özelleştirme", aciklama: "Renklerinizi, avatarınızı, bot isminizi ve tonunu kurumsal kimliğinize göre tamamen uyarlayın." }, + { ikon: "sync", baslik: "Anlık Bilgi Senkronizasyonu", aciklama: "Web siteniz güncellendiğinde veya yeni dökümanlar yüklendiğinde, Zenith AI bilgiyi anında senkronize eder." }, + ], + yorumlar: [ + { yazar: "Alican Y.", yorum: "Kendi dökümanlarımızla eğitmemiz sadece 1 dakika sürdü. Dönüşüm oranlarımız %35 arttı.", puan: 5, tarih: "3 gün önce", emoji: "⚡" }, + { yazar: "Sarah Mitchell", yorum: "The API integration is lightning-fast and the customer workspace matches our corporate branding flawlessly.", puan: 5, tarih: "2 hafta önce", emoji: "🤖" }, + ] + }, +}; + +export function getDemoBySlug(slug: string): DemoData | null { + return demos[slug] ?? null; +} diff --git a/docs/TEMPLATE_BRIEF.md b/docs/TEMPLATE_BRIEF.md new file mode 100644 index 0000000..f3f1f91 --- /dev/null +++ b/docs/TEMPLATE_BRIEF.md @@ -0,0 +1,416 @@ +# Şablon Tasarım Rehberi +### Ayris Tech — Premium Demo Sistemi + +--- + +## Görevin + +Potansiyel müşterilere gönderilecek demo siteleri için sektöre özel Next.js şablonları yazıyorsun. + +Öncelik sırası: **1. Tasarım ve his → 2. Animasyon → 3. İçerik → 4. Teknik detaylar** + +Müşteri linke tıkladığında ilk 3 saniyede "bu benim için yapılmış, bu çok pahalı görünüyor" hissini yaşamalı. Kod çalışıyor mu çalışmıyor mu ikinci plandır — önce göz kamaştır. + +--- + +## Tasarım Felsefesi + +### "Oha" Anı Zorunludur + +Her şablonun sayfaya girince insanı duraksatan **bir imza momenti** olmalı. Bu an tasarlanmış, hesaplanmış, sektöre özgün olmalı. Genel bir animasyon değil — o sektörün ruhunu yansıtan bir hareket. + +Referans seviye: **Awwwards Site of the Day**. Hedef his: "Bu siteyi kim yaptı, nasıl yaptı?" + +### Tasarım Kararlarında Öncelik Sırası + +``` +1. Boşluk ve nefes — section'lar arası ritim, padding cömertliği +2. Tipografi gücü — başlıklar cesur ve büyük, hiyerarşi net +3. Fotoğraf kalitesi — her fotoğraf kompozisyon düşünülerek seçilmeli +4. Renk disiplini — max 2-3 renk, geri kalanı siyah/beyaz/gri +5. Hareket kalitesi — az animasyon ama her biri mükemmel +6. Detay titizliği — hover state'ler, geçişler, micro-interaction'lar +``` + +### Nasıl Düşünmeli + +Görseller verildiğinde şunu sor: **"Bu tasarımı 10.000 USD'ye satan ajans ne hissettirdi?"** + +- Boşlukla mı ezdi? (luxury whitespace) +- Tipografiyle mi şok etti? (devasa başlık, küçük body) +- Fotoğrafla mı sardı? (fullscreen, parallax, overlay) +- Hareketle mi büyüledi? (curtain, reveal, magnetic) +- Detayla mı ikna etti? (custom cursor, subtle grain, line animation) + +Cevap hangisi ise — oradan başla, diğerlerini o etrafına kur. + +--- + +## İmza Moment Kütüphanesi + +Her şablona aşağıdakilerden **en az bir** tane koy. Birden fazla koyacaksan aralarına yeterli "sessizlik" bırak. + +### Sayfa Açılışı +- **Curtain reveal** — siyah ekran ortadan ikiye ayrılır, fotoğraf ortaya çıkar +- **Preloader çizgi** — ince bir çizgi soldan sağa ilerler, logo belirir, sahne açılır +- **Staggered text entrance** — başlık kelime kelime veya karakter karakter düşer +- **Scale-up reveal** — küçük merkezi bir görsel tam ekrana açılır + +### Scroll Animasyonları +- **Parallax hero** — scroll ettikçe fotoğraf daha yavaş iner, metin daha hızlı çıkar +- **Sticky + akan metin** — fotoğraf sabit kalır, metin onun üzerinden akar +- **Horizontal scroll bölüm** — kartlar/menü yatay ilerler, mouse/touch ile sürüklenir +- **Pinned section** — section scroll boyunca sabit kalır, içeriği değişir (tablar gibi) +- **Text scale on scroll** — başlık küçükten büyüğe veya büyükten küçüğe dönüşür + +### Hover & Mikro +- **Magnetic buton** — mouse yaklaştıkça buton sana doğru çekilir +- **Custom cursor** — varsayılan cursor kaybolur, markaya özgü daire/metin gelir +- **Image tilt** — kart hover'ında 3D perspektif eğimi (rotateX/Y) +- **Clip-path reveal** — fotoğraf hover'da yukarıdan aşağı açılır +- **Underline draw** — link hover'ında çizgi soldan sağa çizilir + +### Atmosfer +- **Scrolling marquee** — sonsuz döngü metin bandı (iki yönde farklı hızda olursa daha iyi) +- **Grain texture overlay** — tüm sayfa üstünde ince film grain (opacity 0.03-0.06) +- **Ambient glow** — arka planda renk blobları yavaşça hareket eder +- **Video loop** — hero'da sessiz, döngü video (restoran, otel için) + +--- + +## Tipografi Kuralları + +Pahalı hissinin %40'ı tipografiden gelir. + +``` +Başlık boyutu: clamp(48px, 8vw, 120px) — küçük ekranda küçülür, büyük ekranda büyür +Body boyutu: 16px minimum, 18px ideal +Satır yüksekliği: başlıklarda 0.9-1.0, body'de 1.6-1.8 +Harf aralığı: büyük harf başlıklarda tracking-widest, serif başlıklarda -0.02em +``` + +**Font kombinasyonları (sektöre göre):** +- Otel/Butik/Restoran → Playfair Display (serif) + Inter (sans) — klasik lüks +- Mimari/Kurumsal → Inter Black + Inter Regular — modern güç +- Bar/Gastro → Cormorant Garamond + Space Grotesk — sofistike +- Klinik/SaaS → DM Sans veya Sora + monospace detay — temiz güven + +Başlık tek satırda yoksa **satır kırılmalarını elle kontrol et** — otomatik kırılma çirkin görünür. + +--- + +## Renk ve Atmosfer Kuralları + +### Koyu Tema (restoran, bar, otel, gastro) +- Arka plan: `#080810` veya `#0a0a0a` — tam siyah değil, hafif tonlu +- Metin: `#ffffff` + `rgba(255,255,255,0.5)` ikincil +- Aksant: firmanın ana rengi — sadece CTA, badge, vurgu için +- Fotoğraflar üstünde: `rgba(0,0,0,0.3-0.5)` overlay — direkt koymadan + +### Açık Tema (klinik, mimari, kurumsal, butik) +- Arka plan: `#ffffff` veya `#f8f7f4` (hafif warm) veya `#f5f0e8` (krem) +- Metin: `#0a0a0a` veya `#1a1a1a` +- Aksant: firmanın ana rengi +- İkincil yüzeyler: `#f0f0f0` veya `rgba(0,0,0,0.04)` + +### Renk Disiplini +- Ana renk: butonlar, başlık vurgusu, badge, aktif state +- İkincil renk: hover state, border, gradient ikinci noktası +- Nötr: arka planlar, kartlar, ayırıcılar +- **Başka renk yok.** Emoji veya ikonlar nötr tutulur. + +--- + +## Fotoğraf Kullanımı + +Fotoğraflar kod kadar önemli. Kötü fotoğraf iyi tasarımı mahveder. + +**Unsplash koleksiyonları (sektöre göre):** +- Otel/Resort: `https://source.unsplash.com/1920x1080/?luxury,hotel,resort` +- Restoran: `https://source.unsplash.com/1920x1080/?restaurant,food,gastronomy` +- Bar: `https://source.unsplash.com/1920x1080/?cocktail,bar,dark` +- Mimari: `https://source.unsplash.com/1920x1080/?architecture,interior,modern` +- Klinik: `https://source.unsplash.com/1920x1080/?clinic,medical,clean` + +**Kurallar:** +- Hero fotoğrafı her zaman `object-cover` + `object-position: center` +- Dikey fotoğraflar (portrait) kart içinde daha dramatik görünür — kullan +- Birden fazla fotoğraf varsa renk tonu tutarlı olsun (hepsi sıcak veya hepsi soğuk) +- `picsum.photos` sadece hızlı test için — final görünümde Unsplash parametreli URL kullan + +--- + +## Animasyon Kalitesi + +### Easing Değerleri +```typescript +// Smooth deceleration — genel kullanım +ease: [0.25, 0.46, 0.45, 0.94] as [number,number,number,number] + +// Dramatic entrance — hero başlıklar +ease: [0.16, 1, 0.3, 1] as [number,number,number,number] + +// Snappy — buton, badge, küçük elementler +ease: [0.34, 1.56, 0.64, 1] as [number,number,number,number] + +// Linear — marquee, döngüler +ease: "linear" +``` + +### Süre Kuralları +``` +Micro (hover, badge): 0.15-0.25s +Element entrance: 0.6-0.8s +Section transition: 0.8-1.0s +Page reveal / curtain: 1.0-1.4s +Marquee döngü: 20-40s (içerik uzunluğuna göre) +``` + +### Stagger Ritmi +```typescript +// Çocuk sayısına göre stagger ayarla +3-4 element: staggerChildren: 0.15 +5-8 element: staggerChildren: 0.08 +9+ element: staggerChildren: 0.05 +``` + +### Animasyon Monotonluğu Kırma +Her section aynı `fadeUp` ile başlarsa sayfa uyutur. Karıştır: +- Hero: curtain veya scale reveal +- Stats: sayaç animasyonu (AnimatedCounter) +- Kartlar: stagger + hafif x offset (soldan veya sağdan) +- Galeri: clip-path veya opacity-only (y hareketi olmadan) +- CTA section: parallax arka plan + metin fade + +--- + +## Lenis Smooth Scroll Kurulumu + +Her şablona ekle: + +```typescript +"use client"; +import { useEffect } from "react"; + +// Component içinde: +useEffect(() => { + let lenis: any; + import("@studio-freight/lenis").then(({ default: Lenis }) => { + lenis = new Lenis({ duration: 1.2, easing: (t: number) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) }); + function raf(time: number) { lenis.raf(time); requestAnimationFrame(raf); } + requestAnimationFrame(raf); + }); + return () => lenis?.destroy(); +}, []); +``` + +--- + +## Section Tasarım Standartları + +### Hero +- Her zaman viewport yüksekliği: `min-h-screen` +- Fotoğraf varsa: `position: absolute, inset: 0, object-fit: cover` + koyu overlay +- Başlık: clamp ile responsive, viewport'un %60-70'ini kaplamalı +- CTA buton: tek, net, aksant renkli — ikinci buton varsa ghost/outline + +### Marquee Bandı (opsiyonel ama etkili) +Hero ile sonraki section arasına koy. İki yönde farklı iki satır daha güçlü görünür. + +### İki Kolonlu (Split) Section +``` +Sol: metin + CTA Sağ: tall fotoğraf (aspect-ratio: 3/4) +Metin sola hizalı Fotoğraf slight overlap (negatif margin) +``` + +### Kart Grid'leri +- 3'lü grid: her kart eşit, hover'da `y: -8` ve border glow +- Masonry: sadece galeri için — CSS columns veya css-grid ile +- Horizontal scroll: `overflow-x: auto`, `scrollbar-width: none`, touch-action: pan-x + +### CTA Section (Son Bölüm) +En az bir kez tam genişlikte, fotoğraf arka planlı olsun. Başlık büyük, CTA tek. + +--- + +## Tech Stack + +```json +{ + "zorunlu": [ + "Next.js 14 App Router", + "Framer Motion v11", + "Tailwind CSS v3", + "TypeScript strict", + "@studio-freight/lenis" + ], + "gerektiğinde": [ + "Three.js / @react-three/fiber (sadece ambient bg için, performans dikkat)", + "react-lottie-player (loading, boş state ikonları için)", + "usehooks-ts (useWindowSize, useIntersectionObserver)" + ], + "yasak": [ + "jQuery", + "Bootstrap", + "CSS @keyframes animasyonları (Framer Motion kullan)", + "inline style ile animasyon (transform, opacity — Framer Motion kullan)" + ] +} +``` + +**Framer Motion zorunlu kurallar:** +- `ease` array'leri her zaman type assertion: `as [number,number,number,number]` +- Scroll animasyonları: `useScroll` + `useTransform` +- Section girişleri: `whileInView` + `viewport={{ once: true }}` +- Layout animasyonları: `layout` prop — yükseklik değişimlerinde kullan + +--- + +## Kalite Kontrol Listesi + +Kodu teslim etmeden önce şunları kontrol et: + +**Tasarım:** +- [ ] Sayfaya girince ilk 3 saniyede "oha" dedirten bir şey var mı? +- [ ] Boşluklar cömert mi — hiçbir element birbirine yapışık değil mi? +- [ ] Başlıklar yeterince büyük mü — yarım metre uzaktan okunabilir mi? +- [ ] Renk disiplini korunuyor mu — max 3 renk var mı? +- [ ] Fotoğraflar kompozisyon olarak uygun mu? + +**Animasyon:** +- [ ] Her section farklı animasyon mu kullanıyor (monotonluk yok)? +- [ ] Easing değerleri sert mi yoksa yumuşak mı? (Sert olmamalı) +- [ ] Lenis smooth scroll çalışıyor mu? +- [ ] Hover state'lerin hepsi var mı? + +**Detay:** +- [ ] Demo banner sabit mi: `"Bu site demo amaçlıdır — demo.ayristech.com"` +- [ ] Mobile'da layout bozulmuyor mu? +- [ ] TypeScript hataları var mı (`any` yok)? + +--- + +## Proje Yapısı + +``` +demo-ayristech/ +├── app/ +│ ├── page.tsx # Showcase index +│ └── [slug]/page.tsx # Dynamic routing +├── components/ +│ └── templates/ +│ └── [SektörTemplate]/ +│ └── index.tsx # Her şablon kendi klasöründe +├── data/ +│ └── demos.ts # Tüm demo verisi +└── components/ui/ + └── AnimatedCounter.tsx # Scroll-triggered sayaç +``` + +Yeni şablon eklerken: +1. `components/templates/YeniTemplate/index.tsx` oluştur +2. `data/demos.ts` interface'ine yeni sektör tipini ve alanları ekle +3. `app/[slug]/page.tsx` routing'e `if (data.template === "yeni") return ;` +4. `app/page.tsx` `templateLabels`'a yeni badge ekle + +--- + +## Müşteri Sitesi SS Analizi + +Sana müşterinin mevcut sitesinin ekran görüntüleri verildiğinde şu sırayla ilerle: + +### 1. İçerik Çıkarımı + +Her SS'den şunları çıkar: + +| Alan | Nereden Bulunur | +|---|---| +| Firma adı | Header, logo yanı, title | +| Slogan | Hero başlığı veya alt metin | +| Şehir / Adres | Footer, iletişim sayfası | +| Telefon | Header, footer, iletişim | +| E-posta | Footer, iletişim sayfası | +| Çalışma saatleri | Footer veya iletişim | +| Hizmetler | Hizmetler/servisler/poliklinikler sayfası | +| Ekip / Doktorlar | Kadro/hakkımızda sayfası | +| Yorumlar / Referanslar | Varsa ana sayfa veya ayrı sayfa | +| Sosyal medya | Footer veya header ikonları | + +### 2. Mevcut Tasarımı Değerlendir + +SS'lere bakarak kısaca not al: +- **Renk paleti:** Mevcut ana renk nedir? +- **Genel his:** Profesyonel mi, eski mi, amatör mü? +- **Eksikler:** Animasyon yok, mobile bozuk, fotoğraf kalitesi kötü vb. +- **Güçlü yanlar:** Korunabilecek bir şey var mı? + +Bu değerlendirmeyi şablona yansıt — mevcut siteyi taklit etme, **dönüştür**. + +### 3. demos.ts Formatında Çıkar + +Analiz sonucunu aşağıdaki formatta hazırla, eksik alanları makul şekilde doldur: + +```typescript +{ + slug: "firma-adi", // firma adından türet, küçük harf, tire ile + template: "klinik", // sektöre göre seç + firma: { + adi: "Firma Adı", + slogan: "SS'den alınan slogan veya uygun bir slogan üret", + sehir: "Şehir", + adres: "Tam adres", + telefon: "+90 ...", + email: "info@...", + logoEmoji: "🏥", // sektöre uygun emoji + renkAna: "#______", // mevcut sitenin ana rengi + renkKoyu: "#______", // daha koyu tonu + renkAcik: "#______", // çok açık tonu (bg için) + }, + istatistikler: [ + { deger: "15+", etiket: "Yıllık Deneyim" }, + // SS'de rakam varsa al, yoksa sektöre uygun üret + ], + hizmetler: [ + { ikon: "🔬", baslik: "Hizmet Adı", aciklama: "Kısa açıklama" }, + // SS'deki hizmetler sayfasından çek + ], + yorumlar: [ + { yazar: "Ad Soyad", yorum: "...", puan: 5, tarih: "2024", emoji: "👤" }, + // SS'de yoksa 3 adet gerçekçi yorum üret + ], + // Sektöre özel alanlar — SS'den çek, yoksa üret +} +``` + +### 4. Şablon Seçimi + +Sektöre göre hangi şablonun kullanılacağına karar ver: + +| Sektör | Şablon | +|---|---| +| Klinik, hastane, sağlık merkezi | `klinik` | +| Diş kliniği, estetik | `dental` | +| Restoran, kafe, bistro | `restoran` veya `restoran2` | +| Bar, meyhane, gece kulübü | `bar` veya `bar2` | +| Otel, resort, apart | `hotel1`, `hotel2` veya `hotel3` | +| Taksi, transfer, ulaşım | `taxi` veya `taxi2` | +| Yazılım, SaaS, chatbot | `chatbot` | +| İnşaat, mimarlık, kurumsal | `kurumsal` | + +Mevcut şablonlardan hiçbiri uygun değilse: **yeni şablon yaz** — TEMPLATE_BRIEF'teki tasarım kurallarına uyarak. + +### 5. Antigravity'e Ver + +Analiz tamamlandığında şunu söyle: + +> "Bu `demos.ts` verisini kullan. TEMPLATE_BRIEF.md'deki kurallara göre `[ŞabonAdı]` şablonunu yaz. Mevcut sitenin renk paletini koru ama tasarımı tamamen modernize et. İmza moment olarak `[seçilen imza moment]` kullan." + +--- + +## Son Not + +Amaç: müşteriye link atıp "bak, senin için yaptım" diyebilmek. + +**Standart değil, özel. Güzel değil, etkileyici. Çalışıyor değil, hissettiriyor.** + +Eğer şablona baktığında "bu idare eder" diyorsan — yeniden başla. \ No newline at end of file diff --git a/docs/bodrumcerrahi.com/Hakkımızda.jpg b/docs/bodrumcerrahi.com/Hakkımızda.jpg new file mode 100644 index 0000000..6953b1d Binary files /dev/null and b/docs/bodrumcerrahi.com/Hakkımızda.jpg differ diff --git a/docs/bodrumcerrahi.com/Hasta Rehberi.jpg b/docs/bodrumcerrahi.com/Hasta Rehberi.jpg new file mode 100644 index 0000000..6513f39 Binary files /dev/null and b/docs/bodrumcerrahi.com/Hasta Rehberi.jpg differ diff --git a/docs/bodrumcerrahi.com/Kadromuz.jpg b/docs/bodrumcerrahi.com/Kadromuz.jpg new file mode 100644 index 0000000..f952dbe Binary files /dev/null and b/docs/bodrumcerrahi.com/Kadromuz.jpg differ diff --git a/docs/bodrumcerrahi.com/ONLINE RANDEVU.jpg b/docs/bodrumcerrahi.com/ONLINE RANDEVU.jpg new file mode 100644 index 0000000..87da936 Binary files /dev/null and b/docs/bodrumcerrahi.com/ONLINE RANDEVU.jpg differ diff --git a/docs/bodrumcerrahi.com/Poliklinikler.jpg b/docs/bodrumcerrahi.com/Poliklinikler.jpg new file mode 100644 index 0000000..5aad91f Binary files /dev/null and b/docs/bodrumcerrahi.com/Poliklinikler.jpg differ diff --git a/docs/bodrumcerrahi.com/Tıbbi Birimler.jpg b/docs/bodrumcerrahi.com/Tıbbi Birimler.jpg new file mode 100644 index 0000000..67a69e3 Binary files /dev/null and b/docs/bodrumcerrahi.com/Tıbbi Birimler.jpg differ diff --git a/docs/bodrumcerrahi.com/_img class=_trp-flag-image_ src=_https_bodrumcerrahi.com_wp-content_plugins_translatepress-multilingual_assets_images_flags_en_US.png_ width=_18_ height=_12_ alt=_en_US_ title=_English_English.jpg b/docs/bodrumcerrahi.com/_img class=_trp-flag-image_ src=_https_bodrumcerrahi.com_wp-content_plugins_translatepress-multilingual_assets_images_flags_en_US.png_ width=_18_ height=_12_ alt=_en_US_ title=_English_English.jpg new file mode 100644 index 0000000..edd5e0a Binary files /dev/null and b/docs/bodrumcerrahi.com/_img class=_trp-flag-image_ src=_https_bodrumcerrahi.com_wp-content_plugins_translatepress-multilingual_assets_images_flags_en_US.png_ width=_18_ height=_12_ alt=_en_US_ title=_English_English.jpg differ diff --git a/docs/bodrumcerrahi.com/İletişim.jpg b/docs/bodrumcerrahi.com/İletişim.jpg new file mode 100644 index 0000000..ce961b6 Binary files /dev/null and b/docs/bodrumcerrahi.com/İletişim.jpg differ diff --git a/n8n-partner-sheets-workflow.json b/n8n-partner-sheets-workflow.json new file mode 100644 index 0000000..9ce7ddb --- /dev/null +++ b/n8n-partner-sheets-workflow.json @@ -0,0 +1,246 @@ +{ + "name": "Partner Sheets → Analiz → PostgreSQL", + "nodes": [ + { + "parameters": { + "rule": { + "interval": [ + { + "field": "cronExpression", + "expression": "0 9 * * *" + } + ] + } + }, + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1.2, + "position": [0, 0], + "id": "aaa00001-0000-0000-0000-000000000001", + "name": "Her Gün Saat 09:00" + }, + { + "parameters": { + "operation": "getAll", + "documentId": { + "__rl": true, + "value": "SHEETS_DOCUMENT_ID", + "mode": "id" + }, + "sheetName": { + "__rl": true, + "value": "Sheet1", + "mode": "name" + }, + "returnAll": true, + "options": {} + }, + "type": "n8n-nodes-base.googleSheets", + "typeVersion": 4.5, + "position": [240, 0], + "id": "aaa00002-0000-0000-0000-000000000002", + "name": "Sheets - Tüm Satırları Çek", + "credentials": { + "googleSheetsOAuth2Api": { + "id": "SHEETS_CREDENTIAL_ID", + "name": "Google Sheets account" + } + } + }, + { + "parameters": { + "jsCode": "// Sadece completed = FALSE veya boş olanları döndür\nconst rows = $input.all();\nconst pending = rows.filter(item => {\n const completed = String(item.json.completed || '').toUpperCase();\n return completed !== 'TRUE' && completed !== 'TAMAMLANDI' && completed !== '1';\n});\n\nif (pending.length === 0) {\n // İşlenecek satır yok\n return [];\n}\n\nreturn pending;" + }, + "id": "aaa00003-0000-0000-0000-000000000003", + "name": "Bekleyenleri Filtrele", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [480, 0] + }, + { + "parameters": { + "options": {} + }, + "type": "n8n-nodes-base.splitInBatches", + "typeVersion": 3, + "position": [720, 0], + "id": "aaa00004-0000-0000-0000-000000000004", + "name": "Loop Over Items" + }, + { + "parameters": { + "modelId": { + "__rl": true, + "value": "models/gemini-2.5-flash", + "mode": "list", + "cachedResultName": "models/gemini-2.5-flash" + }, + "messages": { + "values": [ + { + "content": "={{ $json.domain }}\n\nSen bir full-stack yazılım ve teknoloji şirketinin admin paneli için veri otomasyon asistanısın. Görevin, şirketin web sitesi tasarımı veya yazılım hizmeti sunduğu partner firmaların (müşterilerin) web sitelerini analiz etmek ve bunları \"Partnerler\" sayfasındaki grid yapısına uygun şekilde JSON formatına dönüştürmektir.\n\nSana gönderilen web sitesi adresini analiz et ve YALNIZCA aşağıdaki JSON formatında çıktı ver. JSON dışında hiçbir açıklama, markdown kodu (```json vb.) veya ön söz/son söz ekleme.\n\n### ÇIKTI FORMATI:\n{\n \"partner_ismi\": \"Firma adı (örn: MUĞLA SÜRÜCÜ KURSU)\",\n \"monogram\": \"Firmanın baş harflerinden oluşan 3 harfli büyük harf kombinasyonu (örn: MSK)\",\n \"kategori\": \"Yazılım şirketinin o firmaya sunduğu hizmet odağı. Tek veya iki kelime, dikkat çekici, teknolojik alt başlık (Örn: TEKNOLOJİ, WEB3 ALTYAPISI, TEDARİK ZİNCİRİ, KÜRESEL ÖDEMELER, GERÇEK ZAMANLI VERİ, HEADLESS WEB)\",\n \"aciklama\": \"Yazılım şirketinin bu partner ile olan teknolojik ortaklığını, sağladığı altyapıyı veya geliştirdiği çözümü anlatan, kurumsal, havalı ve 'ortaklığa' vurgu yapan tek cümlelik tanım.\"\n}\n\n### KURALLAR:\n1. \"partner_ismi\" kısmında firmanın resmi veya jenerik tam adını yaz.\n2. \"monogram\" her zaman 3 harfli ve tamamen BÜYÜK harf olmalı.\n3. \"kategori\" firmanın kendi sektörü DEĞİL, yazılımcı olarak senin ona dokunduğun teknolojik dikey olmalı.\n4. \"aciklama\" cümlesi kesinlikle profesyonel, ajans dilinde olmalı.\n5. \"yil\" alanı EKLEME — sistem otomatik ekleyecek.\n6. Çıktıda temiz JSON dışında hiçbir şey bulunmamalıdır." + } + ] + }, + "builtInTools": {}, + "options": {} + }, + "type": "@n8n/n8n-nodes-langchain.googleGemini", + "typeVersion": 1.1, + "position": [960, 0], + "id": "aaa00005-0000-0000-0000-000000000005", + "name": "Gemini Analiz", + "credentials": { + "googlePalmApi": { + "id": "Bu5nSnIxNY3DvfGa", + "name": "n8nautomation" + } + } + }, + { + "parameters": { + "jsCode": "const input = $input.first().json;\n\nconst raw = input.text \n || input.content?.parts?.[0]?.text \n || (typeof input.content === 'string' ? input.content : '')\n || '';\n\nconst cleaned = String(raw).replace(/```json/g, '').replace(/```/g, '').trim();\n\nlet parsed;\ntry {\n parsed = JSON.parse(cleaned);\n} catch(e) {\n const domain = $('Loop Over Items').item.json.domain || '';\n parsed = {\n partner_ismi: domain,\n monogram: domain.replace(/https?:\\/\\//, '').substring(0, 3).toUpperCase(),\n kategori: 'Diğer',\n aciklama: 'Otomatik analiz başarısız oldu.'\n };\n}\n\n// Yılı her zaman sistem üzerinden al — Gemini'ye bırakma\nparsed.yil = new Date().getFullYear().toString();\n\n// Row number'ı da taşı (Sheets güncellemesi için)\nparsed._rowNumber = $('Loop Over Items').item.json.row_number \n || $('Loop Over Items').item.json._rowNumber\n || null;\n\nreturn [{ json: parsed }];" + }, + "id": "aaa00006-0000-0000-0000-000000000006", + "name": "Parse JSON", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [1200, 0] + }, + { + "parameters": { + "schema": { + "__rl": true, + "mode": "list", + "value": "public" + }, + "table": { + "__rl": true, + "value": "Partner", + "mode": "list", + "cachedResultName": "Partner" + }, + "columns": { + "mappingMode": "defineBelow", + "value": { + "name": "={{ $json.partner_ismi }}", + "desc": "={{ $json.aciklama }}", + "mono": "={{ $json.monogram }}", + "tag": "={{ $json.kategori }}", + "year": "={{ $json.yil }}" + }, + "matchingColumns": ["id"], + "schema": [ + { "id": "id", "displayName": "id", "required": false, "defaultMatch": true, "display": true, "type": "number", "canBeUsedToMatch": true, "removed": true }, + { "id": "name", "displayName": "name", "required": true, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, + { "id": "tag", "displayName": "tag", "required": true, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, + { "id": "mono", "displayName": "mono", "required": true, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, + { "id": "year", "displayName": "year", "required": true, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, + { "id": "desc", "displayName": "desc", "required": true, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true } + ], + "attemptToConvertTypes": false, + "convertFieldsToString": false + }, + "options": {} + }, + "type": "n8n-nodes-base.postgres", + "typeVersion": 2.6, + "position": [1440, 0], + "id": "aaa00007-0000-0000-0000-000000000007", + "name": "PostgreSQL Insert", + "credentials": { + "postgres": { + "id": "T6YReSQ3PnkNwvnZ", + "name": "AyrisTech" + } + } + }, + { + "parameters": { + "operation": "update", + "documentId": { + "__rl": true, + "value": "SHEETS_DOCUMENT_ID", + "mode": "id" + }, + "sheetName": { + "__rl": true, + "value": "Sheet1", + "mode": "name" + }, + "columns": { + "mappingMode": "defineBelow", + "value": { + "completed": "TRUE" + }, + "matchingColumns": ["domain"], + "schema": [ + { "id": "domain", "displayName": "domain", "required": false, "defaultMatch": true, "display": true, "type": "string", "canBeUsedToMatch": true }, + { "id": "completed", "displayName": "completed", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": false } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.googleSheets", + "typeVersion": 4.5, + "position": [1680, 0], + "id": "aaa00008-0000-0000-0000-000000000008", + "name": "Sheets - Completed Yap", + "credentials": { + "googleSheetsOAuth2Api": { + "id": "SHEETS_CREDENTIAL_ID", + "name": "Google Sheets account" + } + } + }, + { + "parameters": {}, + "type": "n8n-nodes-base.noOp", + "typeVersion": 1, + "position": [1680, -200], + "id": "aaa00009-0000-0000-0000-000000000009", + "name": "İşlenecek kayıt yok" + } + ], + "pinData": {}, + "connections": { + "Her Gün Saat 09:00": { + "main": [[{ "node": "Sheets - Tüm Satırları Çek", "type": "main", "index": 0 }]] + }, + "Sheets - Tüm Satırları Çek": { + "main": [[{ "node": "Bekleyenleri Filtrele", "type": "main", "index": 0 }]] + }, + "Bekleyenleri Filtrele": { + "main": [[{ "node": "Loop Over Items", "type": "main", "index": 0 }]] + }, + "Loop Over Items": { + "main": [ + [{ "node": "İşlenecek kayıt yok", "type": "main", "index": 0 }], + [{ "node": "Gemini Analiz", "type": "main", "index": 0 }] + ] + }, + "Gemini Analiz": { + "main": [[{ "node": "Parse JSON", "type": "main", "index": 0 }]] + }, + "Parse JSON": { + "main": [[{ "node": "PostgreSQL Insert", "type": "main", "index": 0 }]] + }, + "PostgreSQL Insert": { + "main": [[{ "node": "Sheets - Completed Yap", "type": "main", "index": 0 }]] + }, + "Sheets - Completed Yap": { + "main": [[{ "node": "Loop Over Items", "type": "main", "index": 0 }]] + } + }, + "active": false, + "settings": { + "executionOrder": "v1", + "binaryMode": "separate", + "availableInMCP": false + }, + "meta": { + "templateCredsSetupCompleted": true, + "instanceId": "79d13d1a6fcae5c2e451a2b02247a15904071a685f973aa3c0464bf9f4cd5f82" + }, + "id": "triMzeBHtCmmToakgy6Ri", + "tags": [] +} diff --git a/n8n-partner-workflow.json b/n8n-partner-workflow.json new file mode 100644 index 0000000..3308052 --- /dev/null +++ b/n8n-partner-workflow.json @@ -0,0 +1,352 @@ +{ + "name": "Site Scraper → Screenshot → Partner Analiz", + "nodes": [ + { + "parameters": {}, + "type": "n8n-nodes-base.manualTrigger", + "typeVersion": 1, + "position": [240, 300], + "id": "10cf88d5-0df8-4b39-ba6b-5507bc5cfeb0", + "name": "When clicking 'Execute workflow'" + }, + { + "parameters": { + "assignments": { + "assignments": [ + { + "id": "domain-field", + "name": "domain", + "value": "muglasurucukursu.com", + "type": "string" + } + ] + }, + "options": {} + }, + "id": "90ed9042-f1e0-4b75-a986-06d266974b9a", + "name": "Set Domain", + "type": "n8n-nodes-base.set", + "typeVersion": 3.4, + "position": [480, 300] + }, + { + "parameters": { + "method": "POST", + "url": "http://sbq038z8y8yb8z4s2whet0q0.65.109.236.58.sslip.io/scrape", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "x-api-key", + "value": "AyrisScraperSecr3tKey2026" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={\n \"url\": \"https://{{ $json.domain }}\"\n}", + "options": {} + }, + "id": "d19cc658-e65e-489e-b23c-ea02a23a9b94", + "name": "Link Scraper API", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.1, + "position": [720, 300] + }, + { + "parameters": { + "resource": "folder", + "name": "={{ $('Set Domain').first().json.domain }}", + "driveId": { + "__rl": true, + "mode": "list", + "value": "My Drive" + }, + "folderId": { + "__rl": true, + "value": "1jNcMOUaTZmi7SJIF4xShGjEvEymENDZ0", + "mode": "list", + "cachedResultName": "WebSiteScrenShots", + "cachedResultUrl": "https://drive.google.com/drive/folders/1jNcMOUaTZmi7SJIF4xShGjEvEymENDZ0" + }, + "options": {} + }, + "type": "n8n-nodes-base.googleDrive", + "typeVersion": 3, + "position": [960, 300], + "id": "e0fb79cd-8adc-449a-b0de-800e3451e5f2", + "name": "Create Folder", + "credentials": { + "googleDriveOAuth2Api": { + "id": "UobQnjEvaIAp1tOm", + "name": "Google Drive account" + } + } + }, + { + "parameters": { + "jsCode": "const links = $('Link Scraper API').first().json.links || [];\nconst folderId = $('Create Folder').first().json.id;\n\nreturn links.slice(0, 10).map(l => ({\n json: {\n label: l.label,\n url: l.url,\n folderId: folderId\n }\n}));" + }, + "id": "8e0dea68-2437-416b-b963-ab1d1f97eca1", + "name": "Prepare URLs", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [1200, 300] + }, + { + "parameters": { + "options": {} + }, + "type": "n8n-nodes-base.splitInBatches", + "typeVersion": 3, + "position": [1440, 300], + "id": "daf4a716-92bf-497d-b017-bdca05485a9f", + "name": "Loop Over Items" + }, + { + "parameters": { + "method": "POST", + "url": "https://api.screencapr.com/api/screenshot", + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={\n \"url\": \"{{ $('Prepare URLs').first().json.url }}\",\n \"options\": {\n \"width\": 1440,\n \"height\": 900,\n \"format\": \"jpeg\",\n \"quality\": 85,\n \"fullPage\": true,\n \"timeout\": 30000\n }\n}", + "options": { + "response": { + "response": { + "responseFormat": "file", + "outputPropertyName": "screenshot" + } + }, + "timeout": 60000 + } + }, + "id": "ce61f453-59da-4592-8bf3-ff269debb57f", + "name": "ScreenCapr Screenshot", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.1, + "position": [1680, 300] + }, + { + "parameters": { + "inputDataFieldName": "screenshot", + "name": "={{ $('Loop Over Items').item.json.label }}.jpg", + "driveId": { + "__rl": true, + "mode": "list", + "value": "My Drive" + }, + "folderId": { + "__rl": true, + "value": "={{ $('Loop Over Items').item.json.folderId }}", + "mode": "id" + }, + "options": {} + }, + "type": "n8n-nodes-base.googleDrive", + "typeVersion": 3, + "position": [1920, 300], + "id": "8b087127-57f8-430e-b3d2-8a66c57561fa", + "name": "Upload to Drive", + "credentials": { + "googleDriveOAuth2Api": { + "id": "UobQnjEvaIAp1tOm", + "name": "Google Drive account" + } + } + }, + { + "parameters": { + "resource": "file", + "operation": "list", + "driveId": { + "__rl": true, + "mode": "list", + "value": "My Drive" + }, + "folderId": { + "__rl": true, + "value": "={{ $('Create Folder').first().json.id }}", + "mode": "id" + }, + "returnAll": false, + "limit": 2, + "options": {} + }, + "type": "n8n-nodes-base.googleDrive", + "typeVersion": 3, + "position": [1680, 80], + "id": "f1a23456-0001-4abc-8def-111111111111", + "name": "List Drive Files", + "credentials": { + "googleDriveOAuth2Api": { + "id": "UobQnjEvaIAp1tOm", + "name": "Google Drive account" + } + } + }, + { + "parameters": { + "jsCode": "// Sadece ilk dosyayı al\nreturn [$input.first()];" + }, + "id": "f2b34567-0002-4abc-8def-222222222222", + "name": "Get First File", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [1920, 80] + }, + { + "parameters": { + "resource": "file", + "operation": "download", + "fileId": { + "__rl": true, + "value": "={{ $json.id }}", + "mode": "id" + }, + "options": {} + }, + "type": "n8n-nodes-base.googleDrive", + "typeVersion": 3, + "position": [2160, 80], + "id": "f3c45678-0003-4abc-8def-333333333333", + "name": "Download Screenshot", + "credentials": { + "googleDriveOAuth2Api": { + "id": "UobQnjEvaIAp1tOm", + "name": "Google Drive account" + } + } + }, + { + "parameters": { + "resource": "image", + "operation": "analyze", + "modelId": { + "__rl": true, + "value": "models/gemini-2.5-flash", + "mode": "list", + "cachedResultName": "models/gemini-2.5-flash" + }, + "text": "Bu web sitesi ekran görüntüsünü analiz et ve aşağıdaki JSON formatında döndür. Sadece JSON döndür, başka açıklama ekleme:\n\n{\n \"partner_ismi\": \"Firmanın tam adı\",\n \"monogram\": \"2-3 harfli kısaltma (örn: AYR, SCC)\",\n \"kategori\": \"Tek kelime sektör (Sağlık, Enerji, Restoran, Eğitim, Ulaşım, İnşaat, Teknoloji vb.)\",\n \"aciklama\": \"Firmayı anlatan 1-2 cümle\"\n}", + "inputType": "binary", + "options": {} + }, + "type": "@n8n/n8n-nodes-langchain.googleGemini", + "typeVersion": 1.1, + "position": [2400, 80], + "id": "f4d56789-0004-4abc-8def-444444444444", + "name": "Gemini Analiz", + "credentials": { + "googlePalmApi": { + "id": "Bu5nSnIxNY3DvfGa", + "name": "n8nautomation" + } + } + }, + { + "parameters": { + "jsCode": "const raw = $input.first().json.text || $input.first().json.content || '';\n\n// JSON bloğunu temizle\nconst cleaned = raw.replace(/```json/g, '').replace(/```/g, '').trim();\n\nlet parsed;\ntry {\n parsed = JSON.parse(cleaned);\n} catch(e) {\n // JSON parse başarısız olursa fallback\n parsed = {\n partner_ismi: $('Set Domain').first().json.domain,\n monogram: $('Set Domain').first().json.domain.substring(0, 3).toUpperCase(),\n kategori: 'Diğer',\n aciklama: 'Otomatik analiz başarısız oldu.'\n };\n}\n\nreturn [{ json: parsed }];" + }, + "id": "f5e67890-0005-4abc-8def-555555555555", + "name": "Parse JSON", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [2640, 80] + }, + { + "parameters": { + "operation": "insert", + "schema": { + "__rl": true, + "mode": "list", + "value": "public" + }, + "table": { + "__rl": true, + "mode": "list", + "value": "partners" + }, + "columns": { + "mappingMode": "defineBelow", + "value": { + "name": "={{ $json.partner_ismi }}", + "monogram": "={{ $json.monogram }}", + "category": "={{ $json.kategori }}", + "bio": "={{ $json.aciklama }}", + "start_year": 2026, + "domain": "={{ $('Set Domain').first().json.domain }}" + } + }, + "options": {} + }, + "type": "n8n-nodes-base.postgres", + "typeVersion": 2.5, + "position": [2880, 80], + "id": "f6f78901-0006-4abc-8def-666666666666", + "name": "PostgreSQL Insert", + "credentials": { + "postgres": { + "id": "POSTGRES_CREDENTIAL_ID", + "name": "Postgres account" + } + } + } + ], + "pinData": {}, + "connections": { + "When clicking 'Execute workflow'": { + "main": [[{ "node": "Set Domain", "type": "main", "index": 0 }]] + }, + "Set Domain": { + "main": [[{ "node": "Link Scraper API", "type": "main", "index": 0 }]] + }, + "Link Scraper API": { + "main": [[{ "node": "Create Folder", "type": "main", "index": 0 }]] + }, + "Create Folder": { + "main": [[{ "node": "Prepare URLs", "type": "main", "index": 0 }]] + }, + "Prepare URLs": { + "main": [[{ "node": "Loop Over Items", "type": "main", "index": 0 }]] + }, + "Loop Over Items": { + "main": [ + [{ "node": "List Drive Files", "type": "main", "index": 0 }], + [{ "node": "ScreenCapr Screenshot", "type": "main", "index": 0 }] + ] + }, + "ScreenCapr Screenshot": { + "main": [[{ "node": "Upload to Drive", "type": "main", "index": 0 }]] + }, + "Upload to Drive": { + "main": [[{ "node": "Loop Over Items", "type": "main", "index": 0 }]] + }, + "List Drive Files": { + "main": [[{ "node": "Get First File", "type": "main", "index": 0 }]] + }, + "Get First File": { + "main": [[{ "node": "Download Screenshot", "type": "main", "index": 0 }]] + }, + "Download Screenshot": { + "main": [[{ "node": "Gemini Analiz", "type": "main", "index": 0 }]] + }, + "Gemini Analiz": { + "main": [[{ "node": "Parse JSON", "type": "main", "index": 0 }]] + }, + "Parse JSON": { + "main": [[{ "node": "PostgreSQL Insert", "type": "main", "index": 0 }]] + } + }, + "active": false, + "settings": { + "executionOrder": "v1", + "binaryMode": "separate", + "availableInMCP": false + }, + "meta": { + "templateCredsSetupCompleted": true, + "instanceId": "79d13d1a6fcae5c2e451a2b02247a15904071a685f973aa3c0464bf9f4cd5f82" + }, + "id": "UDHv1qTfRRi1Q-Vqt47m1", + "tags": [] +} diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..c735b0b --- /dev/null +++ b/next.config.ts @@ -0,0 +1,10 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + output: "standalone", // Dockerfile için gerekli + images: { + remotePatterns: [], + }, +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0962e0e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1800 @@ +{ + "name": "demo-ayristech", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "demo-ayristech", + "version": "0.1.0", + "license": "ISC", + "dependencies": { + "@studio-freight/lenis": "^1.0.42", + "framer-motion": "^12.40.0", + "next": "16.2.6", + "react": "19.2.4", + "react-dom": "19.2.4" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", + "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", + "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", + "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@studio-freight/lenis": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/@studio-freight/lenis/-/lenis-1.0.42.tgz", + "integrity": "sha512-HJAGf2DeM+BTvKzHv752z6Z7zy6bA643nZM7W88Ft9tnw2GsJSp6iJ+3cekjyMIWH+cloL2U9X82dKXgdU8kPg==", + "deprecated": "The '@studio-freight/lenis' package has been renamed to 'lenis'. Please update your dependencies: npm install lenis and visit the documentation: https://www.npmjs.com/package/lenis", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.21.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-x64": "4.3.0", + "@tailwindcss/oxide-freebsd-x64": "4.3.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-x64-musl": "4.3.0", + "@tailwindcss/oxide-wasm32-wasi": "4.3.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", + "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", + "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", + "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", + "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", + "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", + "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", + "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", + "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", + "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", + "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz", + "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "postcss": "^8.5.10", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", + "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.15.tgz", + "integrity": "sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", + "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.1.tgz", + "integrity": "sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/framer-motion": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", + "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.40.0", + "motion-utils": "^12.39.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/motion-dom": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz", + "integrity": "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.39.0" + } + }, + "node_modules/motion-utils": { + "version": "12.39.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", + "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.6", + "@next/swc-darwin-x64": "16.2.6", + "@next/swc-linux-arm64-gnu": "16.2.6", + "@next/swc-linux-arm64-musl": "16.2.6", + "@next/swc-linux-x64-gnu": "16.2.6", + "@next/swc-linux-x64-musl": "16.2.6", + "@next/swc-win32-arm64-msvc": "16.2.6", + "@next/swc-win32-x64-msvc": "16.2.6", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..bd5e03e --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "demo-ayristech", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "@studio-freight/lenis": "^1.0.42", + "framer-motion": "^12.40.0", + "next": "16.2.6", + "react": "19.2.4", + "react-dom": "19.2.4" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4", + "typescript": "^5" + }, + "description": "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).", + "main": "index.js", + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/bakery_heritage.png b/public/bakery_heritage.png new file mode 100644 index 0000000..00c1b9e Binary files /dev/null and b/public/bakery_heritage.png differ diff --git a/public/cab_app_light.png b/public/cab_app_light.png new file mode 100644 index 0000000..996431c Binary files /dev/null and b/public/cab_app_light.png differ diff --git a/public/cab_app_mockup.png b/public/cab_app_mockup.png new file mode 100644 index 0000000..a912220 Binary files /dev/null and b/public/cab_app_mockup.png differ diff --git a/public/cab_hero_white.png b/public/cab_hero_white.png new file mode 100644 index 0000000..1ff6021 Binary files /dev/null and b/public/cab_hero_white.png differ diff --git a/public/cab_hero_yellow.png b/public/cab_hero_yellow.png new file mode 100644 index 0000000..8db599d Binary files /dev/null and b/public/cab_hero_yellow.png differ diff --git a/public/chatbot_mascot.png b/public/chatbot_mascot.png new file mode 100644 index 0000000..092c6c4 Binary files /dev/null and b/public/chatbot_mascot.png differ diff --git a/public/chef_plating_smoke.png b/public/chef_plating_smoke.png new file mode 100644 index 0000000..084cb7c Binary files /dev/null and b/public/chef_plating_smoke.png differ diff --git a/public/dental_hero.png b/public/dental_hero.png new file mode 100644 index 0000000..b1f2e5d Binary files /dev/null and b/public/dental_hero.png differ diff --git a/public/dental_implant.png b/public/dental_implant.png new file mode 100644 index 0000000..12ee86d Binary files /dev/null and b/public/dental_implant.png differ diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/gourmet_pasta_flame.png b/public/gourmet_pasta_flame.png new file mode 100644 index 0000000..81858fa Binary files /dev/null and b/public/gourmet_pasta_flame.png differ diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/restaurant_hero_steak.png b/public/restaurant_hero_steak.png new file mode 100644 index 0000000..bece590 Binary files /dev/null and b/public/restaurant_hero_steak.png differ diff --git a/public/revitalized_cleaning.png b/public/revitalized_cleaning.png new file mode 100644 index 0000000..d0dfd79 Binary files /dev/null and b/public/revitalized_cleaning.png differ diff --git a/public/sicilia_hero_table.png b/public/sicilia_hero_table.png new file mode 100644 index 0000000..b1dcbde Binary files /dev/null and b/public/sicilia_hero_table.png differ diff --git a/public/sicilia_lemon_heritage.png b/public/sicilia_lemon_heritage.png new file mode 100644 index 0000000..065c34d Binary files /dev/null and b/public/sicilia_lemon_heritage.png differ diff --git a/public/sicilia_octopus_plate.png b/public/sicilia_octopus_plate.png new file mode 100644 index 0000000..6780b09 Binary files /dev/null and b/public/sicilia_octopus_plate.png differ diff --git a/public/sicilia_wood_oven.png b/public/sicilia_wood_oven.png new file mode 100644 index 0000000..c88b2d0 Binary files /dev/null and b/public/sicilia_wood_oven.png differ diff --git a/public/teeth_straightening.png b/public/teeth_straightening.png new file mode 100644 index 0000000..04374be Binary files /dev/null and b/public/teeth_straightening.png differ diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3a13f90 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +}