feat: kovakyazilim.com WordPress sitesinden tasarım + içerik aktarımı

Hostinger SSH + WP-CLI ile mevcut canlı sitedeki tasarım ve içerikler aktarıldı.

Tasarım değişiklikleri:
- Renkler: navy #0F2C5C → #043e8c (deep navy), sky #4DA3C7 → #3b82f6 (bright blue)
- Tailwind blue palette uyumlu, WP kovak temasıyla bire bir
- Font: Geist → Poppins (300/400/500/600/700/800)
- Hero: gradient açık → dark gradient (#0f172a → #1e293b → #334155)
  - Pulse animasyonlu radial glow
  - 'Web Tasarım', 'Yazılım', 'Ajansı' kelimelerini blue-400 vurgu
  - Stats strip artık hero'nun alt kenarında (4 metrik)

İçerik aktarımı (Appwrite):

site_settings/homepage güncellendi:
- Hero: 'Kocaeli Web Tasarım ve Yazılım Ajansı' + 2015'ten beri tagline
- Stats: 150+ proje / 50+ müşteri / 100% memnuniyet / 24/7 destek
- Services intro: 'İzmit ve Kocaeli Web Tasarım Hizmetlerimiz'
- Projects intro: 'İzmit Web Tasarım Referanslarımız'
- CTA: 'Projeniz İçin Hemen Teklif Alın'

6 referans projesi seed edildi (WP'deki real client listesi):
- Torpido Makina (torpidomakina.com.tr) — Volvo Penta yetkili bayi
- Marjinal Dent (marjinaldent.com) — Diş kliniği
- Abdullah Tosun Mimarlık (abdullahtosun.art) — Mimar portfoyu
- Calibra PPF (calibrappf.com) — Araç kaplama
- Atolye Bastar — Zanaat atölyesi (yakında)
- MarineCRM — Denizcilik CRM (özel yazılım)

6 hizmet description'u WP içerikleriyle güncellendi:
- web-tasarim → 'Profesyonel Web Tasarım İzmit'
- e-ticaret → 'E-Ticaret Sitesi Yapımı'
- mobil-uygulama → 'Mobil Uygulama Geliştirme'
- yazilim-gelistirme → 'Özel Yazılım Geliştirme İzmit'
- seo-dijital-pazarlama → 'SEO Hizmeti Kocaeli'
- dijital-reklam → 'Dijital Pazarlama Kocaeli'

7 sektör/bölge landing sayfası industries tablosuna seed edildi:
- /sektor/kocaeli-web-tasarim
- /sektor/izmit-web-tasarim
- /sektor/gebze-web-tasarim
- /sektor/kocaeli-seo
- /sektor/izmit-seo
- /sektor/kocaeli-yazilim
- /sektor/izmit-web-tasarim-fiyat (paket fiyat tablosu ile)

Her sektör için:
- WP'deki rank_math_description meta'ları SEO desc olarak
- Markdown content + features list + FAQ
- featured + order ayarlı

37 route, build temiz.

Sıradaki adım: WP uploads klasöründen müşteri görsellerini indirip
project image_url'lerini local'e taşıyabilir (şu an Pexels CDN kullanılıyor).
This commit is contained in:
Ege Can Komur
2026-05-20 18:26:05 +03:00
parent dbc55e7527
commit 4d5186ff0c
3 changed files with 129 additions and 84 deletions
+43 -13
View File
@@ -2,15 +2,23 @@
:root { :root {
--background: #ffffff; --background: #ffffff;
--foreground: #0a0f1c; --foreground: #0f172a;
--navy: #0f2c5c;
--navy-700: #15407f; /* Kovak brand palette (WP'den aktarıldı) */
--navy-50: #eef3fb; --navy: #043e8c; /* primary deep navy — CTA */
--sky: #4da3c7; --navy-700: #032d66;
--sky-600: #2f87ad; --navy-50: #eff6ff;
--sky-50: #ecf6fb; --sky: #3b82f6; /* primary bright blue — accent */
--muted: #5b6577; --sky-600: #2563eb;
--border: #e5e9f0; --sky-50: #dbeafe;
/* Dark hero gradient stops */
--hero-dark-1: #0f172a;
--hero-dark-2: #1e293b;
--hero-dark-3: #334155;
--muted: #64748b;
--border: #e2e8f0;
} }
@theme inline { @theme inline {
@@ -24,30 +32,52 @@
--color-sky-brand-50: var(--sky-50); --color-sky-brand-50: var(--sky-50);
--color-muted-foreground: var(--muted); --color-muted-foreground: var(--muted);
--color-border-soft: var(--border); --color-border-soft: var(--border);
--font-sans: var(--font-geist-sans); --font-sans: var(--font-poppins);
--font-mono: var(--font-geist-mono); --font-mono: var(--font-geist-mono);
} }
body { body {
background: var(--background); background: var(--background);
color: var(--foreground); color: var(--foreground);
font-family: var(--font-sans), Arial, Helvetica, sans-serif; font-family: var(--font-poppins), Arial, Helvetica, sans-serif;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
} }
::-webkit-scrollbar { width: 5px; }
::-webkit-scrollbar-track { background: #f1f5f9; }
::-webkit-scrollbar-thumb { background: var(--navy); border-radius: 3px; }
.hero-grid { .hero-grid {
background-image: background-image:
radial-gradient(circle at 1px 1px, rgba(15, 44, 92, 0.08) 1px, transparent 0); radial-gradient(circle at 1px 1px, rgba(4, 62, 140, 0.08) 1px, transparent 0);
background-size: 24px 24px; background-size: 24px 24px;
} }
.gradient-text { .gradient-text {
background: linear-gradient(90deg, var(--navy) 0%, var(--sky) 100%); background: linear-gradient(135deg, var(--navy) 0%, var(--sky) 100%);
-webkit-background-clip: text; -webkit-background-clip: text;
background-clip: text; background-clip: text;
color: transparent; color: transparent;
} }
.hero-dark {
background: linear-gradient(135deg, var(--hero-dark-1) 0%, var(--hero-dark-2) 50%, var(--hero-dark-3) 100%);
}
.hero-glow::before {
content: '';
position: absolute;
inset: -50%;
background: radial-gradient(circle, rgba(59, 130, 246, 0.1) 0%, transparent 70%);
animation: hero-pulse 4s ease-in-out infinite;
pointer-events: none;
}
@keyframes hero-pulse {
0%, 100% { transform: scale(1); opacity: 0.5; }
50% { transform: scale(1.1); opacity: 0.8; }
}
@keyframes float-slow { @keyframes float-slow {
0%, 100% { transform: translateY(0); } 0%, 100% { transform: translateY(0); }
50% { transform: translateY(-12px); } 50% { transform: translateY(-12px); }
+7 -5
View File
@@ -1,14 +1,16 @@
import type { Metadata } from "next"; import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google"; import { Poppins, Geist_Mono } from "next/font/google";
import "./globals.css"; import "./globals.css";
import { siteConfig } from "@/lib/site-config"; import { siteConfig } from "@/lib/site-config";
import { ConsentInit } from "@/components/consent-init"; import { ConsentInit } from "@/components/consent-init";
import { CookieBanner } from "@/components/cookie-banner"; import { CookieBanner } from "@/components/cookie-banner";
import { getSeoSettings } from "@/lib/data"; import { getSeoSettings } from "@/lib/data";
const geistSans = Geist({ const poppins = Poppins({
variable: "--font-geist-sans", variable: "--font-poppins",
subsets: ["latin"], subsets: ["latin", "latin-ext"],
weight: ["300", "400", "500", "600", "700", "800"],
display: "swap",
}); });
const geistMono = Geist_Mono({ const geistMono = Geist_Mono({
@@ -46,7 +48,7 @@ export default async function RootLayout({
return ( return (
<html <html
lang="tr" lang="tr"
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`} className={`${poppins.variable} ${geistMono.variable} h-full antialiased`}
> >
<head> <head>
<ConsentInit gtmId={gtmId} /> <ConsentInit gtmId={gtmId} />
+79 -66
View File
@@ -1,11 +1,11 @@
import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { ArrowRight, Sparkles } from "lucide-react"; import { ArrowRight, Sparkles } from "lucide-react";
import type { SiteSettingsRow, StatItem } from "@/lib/types"; import type { SiteSettingsRow, StatItem } from "@/lib/types";
const DEFAULT_STATS: StatItem[] = [ const DEFAULT_STATS: StatItem[] = [
{ value: "50+", label: "Tamamlanan proje" }, { value: "150+", label: "Tamamlanan proje" },
{ value: "10+", label: "Yıllık deneyim" }, { value: "50+", label: "Aktif müşteri" },
{ value: "100%", label: "Memnuniyet" },
{ value: "24/7", label: "Teknik destek" }, { value: "24/7", label: "Teknik destek" },
]; ];
@@ -24,84 +24,97 @@ function parseStats(items?: string[] | null): StatItem[] {
} }
export function Hero({ settings }: { settings?: SiteSettingsRow | null }) { export function Hero({ settings }: { settings?: SiteSettingsRow | null }) {
const badge = settings?.hero_badge ?? "Kocaeli'nin teknoloji ajansı"; const badge =
settings?.hero_badge ?? "Kocaeli Web Tasarım & Yazılım Ajansı";
const title = const title =
settings?.hero_title ?? "Fikirden ürüne tek bir partner ile yola çıkın"; settings?.hero_title ??
"Kocaeli Web Tasarım ve Yazılım Ajansı";
const subtitle = const subtitle =
settings?.hero_subtitle ?? settings?.hero_subtitle ??
"Web, mobil ve CRM çözümlerinde uçtan uca geliştirme. Markanıza özel tasarım, ölçeklenebilir altyapı ve uzun vadeli destek."; "Kocaeli ve İzmit'te profesyonel web tasarım, SEO optimizasyonu ve özel yazılım çözümleri. 2015'ten bu yana işletmelere dijital dönüşümde rehberlik ediyoruz.";
const primaryLabel = const primaryLabel = settings?.hero_cta_primary_label ?? "Ücretsiz Teklif Al";
settings?.hero_cta_primary_label ?? "Proje görüşmesi başlat";
const primaryHref = settings?.hero_cta_primary_href ?? "/iletisim"; const primaryHref = settings?.hero_cta_primary_href ?? "/iletisim";
const secondaryLabel = const secondaryLabel =
settings?.hero_cta_secondary_label ?? "Hizmetlerimizi inceleyin"; settings?.hero_cta_secondary_label ?? "Hizmetlerimizi İnceleyin";
const secondaryHref = settings?.hero_cta_secondary_href ?? "/hizmetler"; const secondaryHref = settings?.hero_cta_secondary_href ?? "/hizmetler";
const stats = parseStats(settings?.hero_stats); const stats = parseStats(settings?.hero_stats);
return ( return (
<section className="relative overflow-hidden"> <section className="hero-dark hero-glow relative overflow-hidden">
<div className="absolute inset-0 hero-grid opacity-60" aria-hidden /> {/* Grid pattern overlay */}
<div className="absolute -right-32 top-1/2 -z-0 size-[520px] -translate-y-1/2 rounded-full bg-gradient-to-br from-[var(--sky)]/30 to-[var(--navy)]/0 blur-3xl" aria-hidden /> <div
className="absolute inset-0 opacity-[0.04]"
style={{
backgroundImage:
"radial-gradient(circle at 1px 1px, white 1px, transparent 0)",
backgroundSize: "32px 32px",
}}
aria-hidden
/>
<div className="relative mx-auto grid max-w-7xl items-center gap-12 px-6 py-24 md:grid-cols-2 md:py-32"> <div className="relative mx-auto max-w-5xl px-6 py-24 text-center md:py-32">
<div> <span className="inline-flex items-center gap-2 rounded-full border border-blue-400/30 bg-[#043e8c]/30 px-4 py-1.5 text-sm font-medium text-blue-300">
<span className="inline-flex items-center gap-2 rounded-full border border-[var(--sky)]/30 bg-[var(--sky-50)] px-3 py-1 text-xs font-medium text-[var(--sky-600)]"> <Sparkles className="size-4" />
<Sparkles className="size-3.5" /> {badge}
{badge} </span>
</span>
<h1 className="mt-6 text-4xl font-bold leading-tight tracking-tight text-[var(--navy)] sm:text-5xl md:text-6xl"> <h1 className="mt-6 text-4xl font-extrabold leading-[1.1] tracking-tight text-white sm:text-5xl md:text-6xl">
{title} {title.split(" ").map((word, i, arr) => {
</h1> // Highlight key words in blue (Web Tasarım, Yazılım)
const highlight =
word.toLowerCase().includes("web") ||
word.toLowerCase().includes("tasarım") ||
word.toLowerCase().includes("yazılım") ||
word.toLowerCase().includes("ajansı");
return (
<span key={i}>
<span className={highlight ? "text-blue-400" : undefined}>
{word}
</span>
{i < arr.length - 1 && " "}
</span>
);
})}
</h1>
<p className="mt-6 max-w-xl text-lg leading-relaxed text-[var(--muted)]"> <p className="mx-auto mt-6 max-w-2xl text-base leading-relaxed text-slate-300 sm:text-lg">
{subtitle} {subtitle}
</p> </p>
<div className="mt-8 flex flex-col gap-3 sm:flex-row"> <div className="mt-10 flex flex-col justify-center gap-3 sm:flex-row">
<Link <Link
href={primaryHref} href={primaryHref}
className="inline-flex items-center justify-center gap-2 rounded-full bg-[var(--navy)] px-6 py-3 text-sm font-medium text-white transition hover:bg-[var(--navy-700)]" className="inline-flex items-center justify-center gap-2 rounded-xl bg-[var(--sky)] px-7 py-3.5 text-sm font-semibold text-white shadow-lg shadow-[var(--sky)]/30 transition hover:-translate-y-0.5 hover:bg-[var(--sky-600)] hover:shadow-xl hover:shadow-[var(--sky)]/40"
> >
{primaryLabel} {primaryLabel}
<ArrowRight className="size-4" /> <ArrowRight className="size-4" />
</Link> </Link>
<Link <Link
href={secondaryHref} href={secondaryHref}
className="inline-flex items-center justify-center gap-2 rounded-full border border-[var(--border)] bg-white px-6 py-3 text-sm font-medium text-[var(--navy)] transition hover:border-[var(--navy)]" className="inline-flex items-center justify-center gap-2 rounded-xl border border-white/20 bg-white/5 px-7 py-3.5 text-sm font-semibold text-white backdrop-blur transition hover:border-white/40 hover:bg-white/10"
> >
{secondaryLabel} {secondaryLabel}
</Link> </Link>
</div>
{stats.length > 0 && (
<dl className="mt-12 grid max-w-md grid-cols-3 gap-6">
{stats.map((stat) => (
<div key={stat.label}>
<dt className="text-2xl font-bold text-[var(--navy)]">
{stat.value}
</dt>
<dd className="mt-1 text-xs text-[var(--muted)]">{stat.label}</dd>
</div>
))}
</dl>
)}
</div>
<div className="relative flex justify-center">
<div className="absolute inset-8 -z-10 rounded-full bg-gradient-to-br from-[var(--sky-50)] to-white blur-2xl" aria-hidden />
<div className="animate-float">
<Image
src="/logo.png"
alt="Kovak Yazılım"
width={420}
height={420}
priority
className="size-[320px] object-contain drop-shadow-[0_30px_50px_rgba(15,44,92,0.25)] md:size-[420px]"
/>
</div>
</div> </div>
</div> </div>
{/* Stats strip — pinned bottom of hero */}
{stats.length > 0 && (
<div className="relative border-t border-white/10 bg-black/20 backdrop-blur">
<div className="mx-auto grid max-w-6xl grid-cols-2 gap-4 px-6 py-8 sm:grid-cols-4">
{stats.map((stat) => (
<div key={stat.label} className="text-center">
<p className="text-3xl font-bold text-[var(--sky)] sm:text-4xl">
{stat.value}
</p>
<p className="mt-1 text-xs text-slate-400 sm:text-sm">
{stat.label}
</p>
</div>
))}
</div>
</div>
)}
</section> </section>
); );
} }