diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..288e979
--- /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 /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/app/globals.css b/app/globals.css
index a2dc41e..05769a2 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -1,26 +1,135 @@
@import "tailwindcss";
:root {
- --background: #ffffff;
- --foreground: #171717;
+ --background: #03070b;
+ --foreground: #f8fafc;
+
+ --bg-primary: #03070b;
+ --bg-secondary: #070d14;
+ --bg-tertiary: #0c141d;
+
+ --color-emerald: #0df293;
+ --color-emerald-dim: rgba(13, 242, 147, 0.15);
+ --color-cyan: #00f2fe;
+ --color-cyan-dim: rgba(0, 242, 254, 0.15);
+
+ --text-primary: #f8fafc;
+ --text-secondary: #94a3b8;
+ --text-dim: #64748b;
+
+ --border-glow: rgba(13, 242, 147, 0.15);
+ --border-cyan-glow: rgba(0, 242, 254, 0.15);
}
-@theme inline {
- --color-background: var(--background);
- --color-foreground: var(--foreground);
- --font-sans: var(--font-geist-sans);
- --font-mono: var(--font-geist-mono);
+@theme {
+ --color-bg-primary: var(--bg-primary);
+ --color-bg-secondary: var(--bg-secondary);
+ --color-bg-tertiary: var(--bg-tertiary);
+
+ --color-accent-emerald: var(--color-emerald);
+ --color-accent-emerald-dim: var(--color-emerald-dim);
+ --color-accent-cyan: var(--color-cyan);
+ --color-accent-cyan-dim: var(--color-cyan-dim);
+
+ --color-text-primary: var(--text-primary);
+ --color-text-secondary: var(--text-secondary);
+ --color-text-dim: var(--text-dim);
+
+ --font-space: var(--font-space-grotesk);
+ --font-outfit: var(--font-outfit);
+
+ --animate-pulse-slow: pulse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite;
+ --animate-spin-slow: spin 20s linear infinite;
+ --animate-float: float 6s ease-in-out infinite;
}
-@media (prefers-color-scheme: dark) {
- :root {
- --background: #0a0a0a;
- --foreground: #ededed;
+@keyframes float {
+ 0%, 100% {
+ transform: translateY(0);
+ }
+ 50% {
+ transform: translateY(-10px);
}
}
+/* Base resets & layouts */
body {
background: var(--background);
color: var(--foreground);
- font-family: Arial, Helvetica, sans-serif;
+ overflow-x: hidden;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+}
+
+/* Custom premium utilities */
+.glow-text-emerald {
+ text-shadow: 0 0 20px rgba(13, 242, 147, 0.3);
+}
+
+.glow-text-cyan {
+ text-shadow: 0 0 20px rgba(0, 242, 254, 0.3);
+}
+
+.border-glow-emerald {
+ border-color: var(--border-glow);
+ box-shadow: 0 0 15px rgba(13, 242, 147, 0.05);
+}
+
+.border-glow-cyan {
+ border-color: var(--border-cyan-glow);
+ box-shadow: 0 0 15px rgba(0, 242, 254, 0.05);
+}
+
+.glass-panel {
+ background: rgba(7, 13, 20, 0.7);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border: 1px solid rgba(13, 242, 147, 0.08);
+}
+
+.glass-panel-cyan {
+ background: rgba(7, 13, 20, 0.7);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border: 1px solid rgba(0, 242, 254, 0.08);
+}
+
+/* Custom scrollbars */
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+
+::-webkit-scrollbar-track {
+ background: var(--bg-primary);
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--bg-tertiary);
+ border-radius: 3px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--color-emerald);
+}
+
+/* Lenis smooth scroll fix */
+html.lenis, html.lenis body {
+ height: auto;
+}
+
+.lenis.lenis-smooth {
+ scroll-behavior: auto !important;
+}
+
+.lenis.lenis-smooth [data-lenis-prevent] {
+ overscroll-behavior: contain;
+}
+
+.lenis.lenis-stopped {
+ overflow: hidden;
+}
+
+.lenis.lenis-scrolling iframe {
+ pointer-events: none;
}
diff --git a/app/layout.tsx b/app/layout.tsx
index 976eb90..001b03b 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,20 +1,34 @@
import type { Metadata } from "next";
-import { Geist, Geist_Mono } from "next/font/google";
+import { Space_Grotesk, Outfit } from "next/font/google";
import "./globals.css";
-const geistSans = Geist({
- variable: "--font-geist-sans",
+const spaceGrotesk = Space_Grotesk({
+ variable: "--font-space-grotesk",
subsets: ["latin"],
+ weight: ["300", "400", "500", "600", "700"],
});
-const geistMono = Geist_Mono({
- variable: "--font-geist-mono",
+const outfit = Outfit({
+ variable: "--font-outfit",
subsets: ["latin"],
+ weight: ["300", "400", "500", "600", "700", "800"],
});
export const metadata: Metadata = {
- title: "Create Next App",
- description: "Generated by create next app",
+ title: "SCENERJİ | Sürdürülebilir Enerji Mühendisliği & Yeşil Dönüşüm",
+ description: "Scenerji, dekarbonizasyon, yeşil dönüşüm destekleri ve sürdürülebilir enerji projeleri için dünya standartlarında mühendislik ve danışmanlık hizmetleri sunar.",
+ keywords: [
+ "sürdürülebilir enerji",
+ "yeşil dönüşüm",
+ "enerji mühendisliği",
+ "dekarbonizasyon",
+ "karbon ayak izi",
+ "enerji danışmanlığı",
+ "yeşil dönüşüm destekleri",
+ ],
+ icons: {
+ icon: "/favicon.ico",
+ },
};
export default function RootLayout({
@@ -24,10 +38,12 @@ export default function RootLayout({
}>) {
return (
-
{children}
+
+ {children}
+
);
}
diff --git a/app/page.tsx b/app/page.tsx
index 3f36f7c..51d84fa 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,65 +1,1011 @@
-import Image from "next/image";
+"use client";
+
+import React, { useState, useEffect, useRef } from "react";
+import { motion, AnimatePresence } from "framer-motion";
+import {
+ ArrowUpRight,
+ CheckCircle,
+ TrendingUp,
+ Leaf,
+ Zap,
+ BarChart3,
+ Globe,
+ Cpu,
+ Coins,
+ Shield,
+ Mail,
+ Phone,
+ MapPin,
+ Calendar,
+ Menu,
+ X
+} from "lucide-react";
+import LenisProvider from "@/components/LenisProvider";
+import NoiseOverlay from "@/components/NoiseOverlay";
+import GridBackground from "@/components/GridBackground";
+import Preloader from "@/components/Preloader";
+
+// CUSTOM METRICS ANIMATION COMPONENT
+function AnimatedMetric({ value, label, prefix = "", suffix = "" }: { value: number; label: string; prefix?: string; suffix?: string }) {
+ const [count, setCount] = useState(0);
+ const elementRef = useRef(null);
+ const [hasIntersections, setHasIntersections] = useState(false);
+
+ useEffect(() => {
+ const observer = new IntersectionObserver(
+ ([entry]) => {
+ if (entry.isIntersecting) {
+ setHasIntersections(true);
+ }
+ },
+ { threshold: 0.1 }
+ );
+
+ if (elementRef.current) {
+ observer.observe(elementRef.current);
+ }
+
+ return () => observer.disconnect();
+ }, []);
+
+ useEffect(() => {
+ if (!hasIntersections) return;
+
+ let start = 0;
+ const end = value;
+ const duration = 2000; // 2 seconds
+ const increment = end / (duration / 16); // ~60fps
+
+ const timer = setInterval(() => {
+ start += increment;
+ if (start >= end) {
+ clearInterval(timer);
+ setCount(end);
+ } else {
+ setCount(Math.floor(start));
+ }
+ }, 16);
+
+ return () => clearInterval(timer);
+ }, [hasIntersections, value]);
-export default function Home() {
return (
-
-
-
-
-
- To get started, edit the page.tsx file.
-
-
- Looking for a starting point or more instructions? Head over to{" "}
-
- Templates
- {" "}
- or the{" "}
-
- Learning
- {" "}
- center.
-
-
-
-
+
+
+
+ {prefix}{count.toLocaleString("tr-TR")}{suffix}
+
+
+ {label}
+
);
}
+
+export default function Home() {
+ const [preloaderComplete, setPreloaderComplete] = useState(false);
+ const [activeTab, setActiveTab] = useState<"eng" | "grants">("eng");
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
+ const [contactSuccess, setContactSuccess] = useState(false);
+
+ // Ref for mouse movement parallax on energy core
+ const coreRef = useRef
(null);
+ const [mousePos, setMousePos] = useState({ x: 0, y: 0 });
+
+ useEffect(() => {
+ const handleMouseMove = (e: MouseEvent) => {
+ if (!coreRef.current) return;
+ const { left, top, width, height } = coreRef.current.getBoundingClientRect();
+ const x = (e.clientX - left - width / 2) / (width / 2);
+ const y = (e.clientY - top - height / 2) / (height / 2);
+ setMousePos({ x, y });
+ };
+
+ window.addEventListener("mousemove", handleMouseMove);
+ return () => window.removeEventListener("mousemove", handleMouseMove);
+ }, []);
+
+ return (
+
+
+
+ {/* 1. CINEMATIC PRELOADER */}
+ setPreloaderComplete(true)} />
+
+ {/* DYNAMIC CONSOLE/DEMO BANNER */}
+
+
+
+ {preloaderComplete && (
+
+ {/* BACKGROUND ATMOSPHERE */}
+
+
+ {/* FLOATING NAVIGATION & CONCEPT BADGE */}
+
+
+
+ {/* Mobile Drawer menu */}
+
+ {mobileMenuOpen && (
+
+
+
+ )}
+
+
+
+ {/* CONCEPT BANNER */}
+
+
+
+ BU SİTE SCENERJİ İÇİN HAZIRLANMIŞ ÖZEL BİR KONSEPT DEMODUR — AYRIS TECH
+
+
+
+ {/* 2. HERO SECTION */}
+
+
+
+ {/* Sol Kolon - Başlık & Açıklama */}
+
+
+
+ KARBON NÖTR MÜHENDİSLİK TEKNOLOJİLERİ
+
+
+
+ YEŞİL DÖNÜŞÜMÜN
+
+ MÜHENDİSLİK AKLI.
+
+
+
+
+ Scenerji, endüstriyel tesislerin dekarbonizasyon süreçlerini, ileri seviye enerji mühendisliği ve stratejik yeşil dönüşüm teşvikleriyle birleştirerek sürdürülebilirliği yüksek karlılığa dönüştürür.
+
+
+
+
+ {/* Core Features Mini Badges */}
+
+
+ %100
+ VERİ ODAKLI
+
+
+ MİLYONLARCA €
+ KAZANILAN TEŞVİK
+
+
+ Sıfır
+ RİSK ANALİZİ
+
+
+
+
+ {/* Sağ Kolon - Dynamic Core Animation */}
+
+ {/* Decorative glowing backdrops */}
+
+
+ {/* Outer Orbit Container */}
+
+ {/* Glowing Energy Core SVG */}
+
+ {/* Orbital Tracks */}
+
+
+
+
+ {/* Interactive Particle Nodes */}
+
+
+
+
+
+ {/* Connecting Grid Lines */}
+
+
+
+
+
+ {/* Central core energy cell */}
+
+
+
+
+
+
+
+
+
+
+ {/* Surrounding UI metrics cards inside orbital frame */}
+
+ CO₂ EMİSYONU
+ -45.2%
+
+
+
+ MÜHENDİSLİK VERİMİ
+ COP 4.8
+
+
+
+
+
+
+
+ {/* 3. DOUBLE MARQUEE FLOW */}
+
+ {/* Marquee 1 (Left to Right) */}
+
+
+ YEŞİL DÖNÜŞÜM DANIŞMANLIĞI •
+ DEKARBONİZASYON •
+ SANAYİ TEŞVİKLERİ •
+ SOLAR ENERJİ SİSTEMLERİ •
+ ENERJİ VERİMLİLİĞİ •
+ MÜHENDİSLİK •
+ KOJENERASYON SİSTEMLERİ •
+
+
+ YEŞİL DÖNÜŞÜM DANIŞMANLIĞI •
+ DEKARBONİZASYON •
+ SANAYİ TEŞVİKLERİ •
+ SOLAR ENERJİ SİSTEMLERİ •
+ ENERJİ VERİMLİLİĞİ •
+ MÜHENDİSLİK •
+ KOJENERASYON SİSTEMLERİ •
+
+
+
+ {/* Marquee 2 (Right to Left) */}
+
+
+ KOSGEB YEŞİL DÖNÜŞÜM •
+ TÜBİTAK 1831 YEŞİL DESTEK •
+ IPARD DANIŞMANLIĞI •
+ ISO 50001 BELGELENDİRME •
+ ISO 14064 KARBON RAPORU •
+ SINIRDA KARBON VERGİSİ DANIŞMANLIĞI •
+
+
+ KOSGEB YEŞİL DÖNÜŞÜM •
+ TÜBİTAK 1831 YEŞİL DESTEK •
+ IPARD DANIŞMANLIĞI •
+ ISO 50001 BELGELENDİRME •
+ ISO 14064 KARBON RAPORU •
+ SINIRDA KARBON VERGİSİ DANIŞMANLIĞI •
+
+
+
+
+ {/* Custom styles for marquee loop animations */}
+
+
+ {/* 4. ABOUT & VISION/MISSION SECTION */}
+
+
+
+ {/* Sol - Detaylı Bizi Tanıyın ve Vizyon */}
+
+
+ BİZİ TANIYIN
+
+
+
+ Geleceğin Enerji Yapısını
+ Bugünden Tasarlıyoruz.
+
+
+
+ Scenerji, vizyoner mühendisler ve sürdürülebilirlik uzmanları tarafından kurulmuş, yüksek donanımlı butik bir mühendislik ve yeşil dönüşüm danışmanlık firmasıdır. Amacımız, endüstriyel tesislerin yüksek maliyetli enerji yükümlülüklerini en yeni teknolojiler ve devlet hibeleri yardımıyla karlı bir yatırıma dönüştürmektir.
+
+
+
+ Klasik bir danışmanlıktan farklı olarak; fizik, matematik, ileri mühendislik hesaplamaları ve derin hibe/teşvik mekanizmaları bilgisini harmanlıyoruz. Tesislerin enerji tüketim profilini çıkartarak karbon ayak izlerini minimize ederken, hibe fonlarını maksimum düzeyde kullanmalarını sağlıyoruz.
+
+
+ {/* Asymmetrical Vision & Mission layout */}
+
+
+
+ VİZYONUMUZ
+
+
+ Türkiye ve küresel pazarda sanayi tesislerinin sıfır emisyon hedeflerine ulaşmasında, en güvenilir ve veri odaklı dekarbonizasyon mühendislik lideri olmak.
+
+
+
+
+ MİSYONUMUZ
+
+
+ Derin mühendislik bilgimizi ve hibe ekosistemlerini kullanarak yeşil dönüşümü sanayiciler için bir zorunluluktan çıkarıp, rekabet avantajı sağlayan karlı yatırımlara çevirmek.
+
+
+
+
+
+ {/* Sağ - High-craft visual Dashboard Widget representation */}
+
+
+ {/* Header of widget */}
+
+
+ SCENERJİ ANALYTICS
+ Tesis Analiz Ağı: #TR-8049
+
+
+
+
+ {/* Content metrics bars */}
+
+ {/* Metric 1 */}
+
+
+ Karbon Ayak İzi Azaltımı
+ %42 / Hedef %50
+
+
+
+
+ {/* Metric 2 */}
+
+
+ Enerji Verimliliği Artışı
+ %35 / Hedef %30
+
+
+
+
+ {/* Metric 3 */}
+
+
+ Teşvik / Hibe Yararlanma Oranı
+ %92
+
+
+
+
+
+ {/* Interactive diagram preview inside widget */}
+
+
Aylık Emisyon Tasarruf Eğrisi
+
+
+ {[40, 55, 45, 60, 75, 68, 85, 95, 110, 125, 140].map((height, i) => (
+
+
+ {i + 1}A
+
+ ))}
+
+
+
+
+
+
+
+
+ {/* 5. INTERACTIVE SOLUTIONS TAB GRID */}
+
+
+
+ {/* Header text */}
+
+
+ HİZMET VE ÇÖZÜMLERİMİZ
+
+
+ Geniş Çözüm Spektrumumuzla
+ Sanayiyi Dönüştürüyoruz.
+
+
+ Endüstrinin teknik ihtiyaçlarına özel mühendislik çözümleri ve bu çözümleri finanse edecek global ve ulusal hibe destekleri tek bir çatı altında.
+
+
+
+ {/* Tab Controls */}
+
+
+ setActiveTab("eng")}
+ className={`px-6 py-3 rounded-xl font-space text-xs tracking-wider uppercase font-semibold transition-all duration-300 flex items-center gap-2 cursor-pointer ${
+ activeTab === "eng"
+ ? "bg-accent-emerald text-bg-primary shadow-lg"
+ : "text-text-secondary hover:text-text-primary"
+ }`}
+ >
+
+ MÜHENDİSLİK ÇÖZÜMLERİMİZ
+
+ setActiveTab("grants")}
+ className={`px-6 py-3 rounded-xl font-space text-xs tracking-wider uppercase font-semibold transition-all duration-300 flex items-center gap-2 cursor-pointer ${
+ activeTab === "grants"
+ ? "bg-accent-emerald text-bg-primary shadow-lg"
+ : "text-text-secondary hover:text-text-primary"
+ }`}
+ >
+
+ YEŞİL DÖNÜŞÜM DESTEKLERİ
+
+
+
+
+ {/* Tabs contents with dynamic animations */}
+
+ {activeTab === "eng" ? (
+
+ {/* Card 1 */}
+
+
+
+
+
+
+ Yenilenebilir Enerji Mühendisliği
+
+
+ Tesisleriniz için çatı ve arazi Solar Enerji (GES), Rüzgar Enerjisi (RES) ve Kojenerasyon sistemlerinin teknik ve finansal fizibilitelerini hazırlıyor, anahtar teslim proje mühendisliği yapıyoruz.
+
+
+
+ {/* Card 2 */}
+
+
+
+
+
+
+ Enerji Verimliliği ve VAP
+
+
+ Tesislerde detaylı enerji etütleri gerçekleştiriyor, atık ısı geri kazanımı ve proses optimizasyonu ile enerji maliyetlerini düşürecek Verimlilik Artırıcı Projeler (VAP) geliştiriyoruz.
+
+
+
+ {/* Card 3 */}
+
+
+
+
+
+
+ Karbon Ayak İzi Hesaplama
+
+
+ ISO 14064 standardına uygun olarak şirketinize ait Kapsam 1, 2 ve 3 karbon ayak izi hesaplamalarını yapıyor, uluslararası standartlarda raporlayarak doğrulatma sürecini yönetiyoruz.
+
+
+
+ ) : (
+
+ {/* Grant Card 1 */}
+
+
+
+
+
+
+ TÜBİTAK 1831 Yeşil İnovasyon
+
+
+ {"KOBİ'lerin"} yeşil dönüşüme yönelik teknolojik çözümlerini finanse eden TÜBİTAK Yeşil İnovasyon destek mekanizmalarında tam kapsamlı proje hazırlama, başvuru ve raporlama danışmanlığı veriyoruz.
+
+
+
+ {/* Grant Card 2 */}
+
+
+
+
+
+
+ KOSGEB Yeşil Dönüşüm Destekleri
+
+
+ Tesislerinizin enerji motorlarının verimlileştirilmesi, güneş enerjisi yatırımları ve karbon ayak izi hesaplama masraflarına kadar birçok alanda KOSGEB hibelerinden maksimum payı almanızı sağlıyoruz.
+
+
+
+ {/* Grant Card 3 */}
+
+
+
+
+
+
+ Sınırda Karbon Vergisi (CBAM)
+
+
+ Avrupa Birliği Yeşil Mutabakatı kapsamında, ihracat yapan firmalarımızı Sınırda Karbon Düzenleme Mekanizmasına (SKDM) hazırlıyor, gümrükte karbon vergisi ödemelerini engelleyecek sistemleri kuruyoruz.
+
+
+
+ )}
+
+
+
+
+ {/* 6. HORIZONTAL PROJECTS CAROUSEL */}
+
+
+
+
+
+ PORTFOLYO
+
+
+ Mühendislikle Şekillenen
+ Başarı Hikayelerimiz.
+
+
+
+ Sanayinin karbon emisyonlarını sıfırlarken, sürdürülebilir karlı yapıları inşa ettiğimiz bazı seçkin referanslarımız.
+
+
+
+ {/* Projects Draggable Flex Area */}
+
+
+ {/* Project 1 */}
+
+
+
+
+ 01 // SOLAR ENERJİ
+ Manisa OSB
+
+
+ Mega Endüstriyel Çatı GES Kurulumu
+
+
+ Bölgenin en büyük metal işleme fabrikasının 75.000 metrekarelik çatı alanına 12.4 MWp gücünde Solar Enerji Santrali kurduk. Tesisin yıllık elektrik ihtiyacının tamamı yeşil enerjiden karşılanıyor.
+
+
+
+
+
+ VERİLEN TEŞVİK
+ €1.4 Milyon Hibe
+
+
+ GERİ ÖDEME SÜRESİ
+ 3.2 Yıl
+
+
+
+
+ {/* Project 2 */}
+
+
+
+
+ 02 // VERİ & YÖNETİM
+ Bursa & Kocaeli
+
+
+ ISO 50001 Enerji Yönetim Ağı
+
+
+ Otomotiv yan sanayi üreticisinin 14 farklı üretim tesisinde, IoT sensör entegrasyonuyla ISO 50001 Enerji Yönetim sistemini kurduk. Tüketimleri anlık analiz ederek gereksiz kayıpları sıfırladık.
+
+
+
+
+
+ ENERJİ TASARRUFU
+ Yıllık 18.2 Milyon kWh
+
+
+ VERİMLİLİK ARTIŞI
+ %28
+
+
+
+
+ {/* Project 3 */}
+
+
+
+
+ 03 // YEŞİL TEŞVİK
+ İzmir Aliağa
+
+
+ Yeşil Dönüşüm Teşvik Optimizasyonu
+
+
+ Büyük ölçekli çelik üreticimizin karbonsuzlaşma yol haritasını hazırladık. Kapsam 1-2 emisyon raporlarını tamamlayarak, AB Yeşil Mutabakatı kapsamında 1.8 Milyon € tutarında direkt hibe onaylattık.
+
+
+
+
+
+ KAZANILAN HİBE
+ €1.8 Milyon Hibe
+
+
+ KARBON VERGİ TASARRUFU
+ %100
+
+
+
+
+ {/* Project 4 */}
+
+
+
+
+ 04 // MÜHENDİSLİK
+ Tekirdağ Çorlu
+
+
+ Kojenerasyon ve Isı Geri Kazanımı
+
+
+ Tekstil boyahanesinin baca gazlarındaki ve atık sularındaki ısıyı geri kazanacak kojenerasyon entegrasyonu projesini tamamladık. Atık ısı, {"fabrikanın"} sıcak su ihtiyacının {"%85'ini"} karşılıyor.
+
+
+
+
+
+ AZALTILAN DOĞALGAZ
+ Yıllık %32
+
+
+ YILLIK CO₂ AZALTIMI
+ 4.200 Ton
+
+
+
+
+
+
+
+
+ {/* 7. QUANTITATIVE SERVICE EXCELLENCE */}
+
+
+
+ {/* Header info */}
+
+
+
+ HİZMET ANLAYIŞI
+
+
+ Verilerle Kanıtlanmış
+ Sürdürülebilir Başarı.
+
+
+
+ Scenerji olarak, mühendislik hesaplarımızı teoride bırakmıyoruz. Geliştirdiğimiz projelerin tamamında, tesislerinizin gerçek enerji tüketim verileri üzerinden çalışıyor ve gerçekleştirdiğimiz net tasarrufları faturalandırılabilir kanıtlarla sunuyoruz.
+
+
+
+ {/* High-end metrics grid with counters */}
+
+
+
+
+ {/* 8. EDITORIAL FOOTER (CONTACT & ARTICLES) */}
+
+
+ )}
+
+
+ );
+}
diff --git a/components/GridBackground.tsx b/components/GridBackground.tsx
new file mode 100644
index 0000000..d50d54a
--- /dev/null
+++ b/components/GridBackground.tsx
@@ -0,0 +1,30 @@
+"use client";
+
+import React from "react";
+
+export default function GridBackground() {
+ return (
+
+ {/* Dynamic Ambient Glows */}
+
+
+
+ {/* Grid Pattern */}
+
+
+ {/* Decorative vertical lines */}
+
+
+
+
+ );
+}
diff --git a/components/LenisProvider.tsx b/components/LenisProvider.tsx
new file mode 100644
index 0000000..cb428fa
--- /dev/null
+++ b/components/LenisProvider.tsx
@@ -0,0 +1,43 @@
+"use client";
+
+import React, { useEffect, useRef } from "react";
+import Lenis from "lenis";
+
+export default function LenisProvider({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ const lenisRef = useRef(null);
+
+ useEffect(() => {
+ // Initialize Lenis
+ const lenis = new Lenis({
+ duration: 1.2,
+ easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
+ orientation: "vertical",
+ gestureOrientation: "vertical",
+ smoothWheel: true,
+ wheelMultiplier: 1,
+ touchMultiplier: 1.5,
+ });
+
+ lenisRef.current = lenis;
+
+ // RAF loop
+ function raf(time: number) {
+ lenis.raf(time);
+ requestAnimationFrame(raf);
+ }
+
+ requestAnimationFrame(raf);
+
+ // Bind clean-up
+ return () => {
+ lenis.destroy();
+ lenisRef.current = null;
+ };
+ }, []);
+
+ return <>{children}>;
+}
diff --git a/components/NoiseOverlay.tsx b/components/NoiseOverlay.tsx
new file mode 100644
index 0000000..e12587e
--- /dev/null
+++ b/components/NoiseOverlay.tsx
@@ -0,0 +1,15 @@
+"use client";
+
+import React from "react";
+
+export default function NoiseOverlay() {
+ return (
+
+ );
+}
diff --git a/components/Preloader.tsx b/components/Preloader.tsx
new file mode 100644
index 0000000..4cc8f83
--- /dev/null
+++ b/components/Preloader.tsx
@@ -0,0 +1,119 @@
+"use client";
+
+import React, { useEffect, useState } from "react";
+import { motion, AnimatePresence } from "framer-motion";
+
+const DIAGNOSTICS = [
+ "SOLAR PANEL DİZİLERİ SENKRONİZE EDİLİYOR...",
+ "RÜZGAR TRÜBİN KOMPANSATÖRLERİ DENGELENİYOR...",
+ "KOJENERASYON OPTİMİZASYON KATI AKTİFLEŞTİRİLİYOR...",
+ "YEŞİL DÖNÜŞÜM KARBON AĞI YAPILANDIRILIYOR...",
+ "SCENERJİ ENERJİ AKIŞI STABİL DURUMA GETİRİLDİ.",
+];
+
+export default function Preloader({ onComplete }: { onComplete: () => void }) {
+ const [progress, setProgress] = useState(0);
+ const [diagnosticText, setDiagnosticText] = useState(DIAGNOSTICS[0]);
+ const [isVisible, setIsVisible] = useState(true);
+
+ useEffect(() => {
+ let currentProgress = 0;
+ const duration = 2400; // 2.4 seconds total preloader time
+ const intervalTime = 20;
+ const step = 100 / (duration / intervalTime);
+
+ const timer = setInterval(() => {
+ currentProgress += step;
+ if (currentProgress >= 100) {
+ currentProgress = 100;
+ clearInterval(timer);
+ setTimeout(() => {
+ setIsVisible(false);
+ setTimeout(onComplete, 800); // Allow curtain reveal animation to complete
+ }, 500);
+ }
+ setProgress(Math.floor(currentProgress));
+
+ // Update diagnostic text based on progress
+ const diagIndex = Math.min(
+ Math.floor((currentProgress / 100) * DIAGNOSTICS.length),
+ DIAGNOSTICS.length - 1
+ );
+ setDiagnosticText(DIAGNOSTICS[diagIndex]);
+ }, intervalTime);
+
+ return () => clearInterval(timer);
+ }, [onComplete]);
+
+ return (
+
+ {isVisible && (
+
+ {/* Subtle decorative grid in preloader */}
+
+
+
+ {/* Tech Logo / Icon */}
+
+
+
+ SCENERJİ SYSTEM
+
+
+ v2.6.0
+
+
+
+ {/* Diagnostic Logs */}
+
+
+ [SİSTEM TEŞHİS KÜTÜPHANESİ]
+
+ {diagnosticText}
+
+
+ {/* Progress Counter & Bar */}
+
+
+ ENERJİ AĞI KALİBRASYONU
+
+
+ {progress}%
+
+
+
+
+
+
+
+
+ KURULUM: AYRIS TECH
+ LOKASYON: TÜRKİYE
+
+
+
+ )}
+
+ );
+}
diff --git a/docs/TEMPLATE_BRIEF.md b/docs/TEMPLATE_BRIEF.md
new file mode 100644
index 0000000..6a6b93f
--- /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.
diff --git a/docs/sccenerji.com/Anasayfa.jpg b/docs/sccenerji.com/Anasayfa.jpg
new file mode 100644
index 0000000..fe05b6a
Binary files /dev/null and b/docs/sccenerji.com/Anasayfa.jpg differ
diff --git a/docs/sccenerji.com/Bizi Tanıyın.jpg b/docs/sccenerji.com/Bizi Tanıyın.jpg
new file mode 100644
index 0000000..cca6fe5
Binary files /dev/null and b/docs/sccenerji.com/Bizi Tanıyın.jpg differ
diff --git a/docs/sccenerji.com/Hizmet Anlayışı.jpg b/docs/sccenerji.com/Hizmet Anlayışı.jpg
new file mode 100644
index 0000000..3a96436
Binary files /dev/null and b/docs/sccenerji.com/Hizmet Anlayışı.jpg differ
diff --git a/docs/sccenerji.com/Index.jpg b/docs/sccenerji.com/Index.jpg
new file mode 100644
index 0000000..ec45140
Binary files /dev/null and b/docs/sccenerji.com/Index.jpg differ
diff --git a/docs/sccenerji.com/Makaleler.jpg b/docs/sccenerji.com/Makaleler.jpg
new file mode 100644
index 0000000..c391b45
Binary files /dev/null and b/docs/sccenerji.com/Makaleler.jpg differ
diff --git a/docs/sccenerji.com/Tamamlanan Projeler.jpg b/docs/sccenerji.com/Tamamlanan Projeler.jpg
new file mode 100644
index 0000000..436d414
Binary files /dev/null and b/docs/sccenerji.com/Tamamlanan Projeler.jpg differ
diff --git a/docs/sccenerji.com/Vizyon ve Misyon.jpg b/docs/sccenerji.com/Vizyon ve Misyon.jpg
new file mode 100644
index 0000000..a190af7
Binary files /dev/null and b/docs/sccenerji.com/Vizyon ve Misyon.jpg differ
diff --git a/docs/sccenerji.com/Yeşil Dönüşüm Destekleri.jpg b/docs/sccenerji.com/Yeşil Dönüşüm Destekleri.jpg
new file mode 100644
index 0000000..2426473
Binary files /dev/null and b/docs/sccenerji.com/Yeşil Dönüşüm Destekleri.jpg differ
diff --git a/docs/sccenerji.com/Çözümlerimiz.jpg b/docs/sccenerji.com/Çözümlerimiz.jpg
new file mode 100644
index 0000000..fb2b87a
Binary files /dev/null and b/docs/sccenerji.com/Çözümlerimiz.jpg differ
diff --git a/docs/sccenerji.com/İletişim.jpg b/docs/sccenerji.com/İletişim.jpg
new file mode 100644
index 0000000..87a927c
Binary files /dev/null and b/docs/sccenerji.com/İletişim.jpg differ
diff --git a/next.config.ts b/next.config.ts
index e9ffa30..68a6c64 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -1,7 +1,7 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
- /* config options here */
+ output: "standalone",
};
export default nextConfig;
diff --git a/package-lock.json b/package-lock.json
index 194d143..19c2282 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,9 @@
"name": "scenerji",
"version": "0.1.0",
"dependencies": {
+ "framer-motion": "^12.40.0",
+ "lenis": "^1.3.23",
+ "lucide-react": "^1.17.0",
"next": "16.2.6",
"react": "19.2.4",
"react-dom": "19.2.4"
@@ -3762,6 +3765,33 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "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/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -4689,6 +4719,37 @@
"node": ">=0.10"
}
},
+ "node_modules/lenis": {
+ "version": "1.3.23",
+ "resolved": "https://registry.npmjs.org/lenis/-/lenis-1.3.23.tgz",
+ "integrity": "sha512-YxYq3TJqj9sJNv0V9SkyQHejt14xwyIwgDaaMK89Uf9SxQfIszu+gTQSSphh6BWlLTNVKvvXAGkg+Zf+oFIevg==",
+ "license": "MIT",
+ "workspaces": [
+ "packages/*",
+ "playground",
+ "playground/*"
+ ],
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/darkroomengineering"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": ">=3.0.0",
+ "react": ">=17.0.0",
+ "vue": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "vue": {
+ "optional": true
+ }
+ }
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -5022,6 +5083,15 @@
"yallist": "^3.0.2"
}
},
+ "node_modules/lucide-react": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.17.0.tgz",
+ "integrity": "sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
@@ -5089,6 +5159,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "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/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
diff --git a/package.json b/package.json
index 02e6e78..e3d9b54 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,9 @@
"lint": "eslint"
},
"dependencies": {
+ "framer-motion": "^12.40.0",
+ "lenis": "^1.3.23",
+ "lucide-react": "^1.17.0",
"next": "16.2.6",
"react": "19.2.4",
"react-dom": "19.2.4"