feat: Çözümler bölümü + mobil menü; admin parser düzeltmeleri

- Çözümler: solutions tablosu, /cozumler liste + detay sayfası, anasayfa
  bölümü, tam admin CRUD (/admin/cozumler), header & footer linkleri,
  projelerde solution_slug ilişkisi, services-grid genelleştirildi
- Mobil menü (hamburger drawer) eklendi — header artık < lg'de gezilebilir
- Site ayarları parser: textarea CRLF (\r\n) normalizasyonu — neden biz,
  süreç adımları, değerler ve SSS blokları artık doğru parçalanıyor
- homepage_faq + garanti (title/description/items) saveSiteSettings'e
  bağlandı (daha önce hiç kaydedilmiyordu)
This commit is contained in:
egecankomur
2026-06-02 18:21:58 +03:00
parent f49df9cbeb
commit 2e001680bf
21 changed files with 1191 additions and 27 deletions
+38 -6
View File
@@ -18,6 +18,7 @@ import {
getSiteSettings,
listProjects,
listServices,
listSolutions,
listTestimonials,
} from "@/lib/data";
import { buildMetadata } from "@/lib/seo";
@@ -28,12 +29,14 @@ export async function generateMetadata(): Promise<Metadata> {
}
export default async function Home() {
const [services, projects, testimonials, settings] = await Promise.all([
listServices({ featured: true }),
listProjects({ featured: true, limit: 6 }),
listTestimonials({ featured: true }),
getSiteSettings(),
]);
const [services, solutions, projects, testimonials, settings] =
await Promise.all([
listServices({ featured: true }),
listSolutions({ featured: true }),
listProjects({ featured: true, limit: 6 }),
listTestimonials({ featured: true }),
getSiteSettings(),
]);
const phoneRaw = settings?.contact_phone_raw ?? siteConfig.contact.phoneRaw;
const phone = settings?.contact_phone ?? siteConfig.contact.phone;
@@ -118,6 +121,35 @@ export default async function Home() {
</div>
</section>
<section className="border-b border-[var(--border)] bg-[var(--navy-50)]/40 py-20">
<div className="mx-auto max-w-7xl px-6">
<SectionTitle
eyebrow={settings?.solutions_eyebrow ?? "İşletmeler için"}
title={settings?.solutions_title ?? "Hazır dijital çözüm paketleri"}
description={
settings?.solutions_description ??
"Tek tek hizmetleri değil; işinizi büyüten bütün paketleri tek elden kuruyoruz."
}
/>
<div className="mt-12">
<ServicesGrid
services={solutions}
basePath="/cozumler"
fallback={siteConfig.fallbackSolutions}
/>
</div>
<div className="mt-10 text-center">
<Link
href="/cozumler"
className="inline-flex items-center gap-2 rounded-full border border-[var(--border)] bg-white px-5 py-2.5 text-sm font-semibold text-[var(--navy)] transition hover:border-[var(--sky)] hover:text-[var(--sky-600)]"
>
Tüm çözümleri gör
<ArrowRight className="size-4" />
</Link>
</div>
</div>
</section>
<WhyUs settings={settings} />
<Guarantee settings={settings} />