feat: WP'den ekip seed et (Egecan + Emre) + TeamGrid WP stiline
WP page-hakkimizda.php'de 2 kurucu vardı, atlamışım:
1) team_members'a 'skills' (string array) alanı eklendi
2) 2 kurucu seedlendi:
- Egecan Kömür (Kurucu & Yazılım Geliştirici)
Skills: Yazılım Geliştirme, CRM Sistemleri, Sistem Mimarisi
- Emre Emir (Kurucu & Ürün Geliştirici)
Skills: Ürün Geliştirme, Web Tasarım, Dijital Strateji
3) TeamGrid component WP stiline güncellendi:
- 2 sütunlu kompakt grid (max-w-3xl, merkezde)
- Foto yoksa gradient initial badge (EK, EE) — gradient cycle
(navy→blue, blue→cyan, violet→purple, sky→emerald)
- Rol mavi metin (sky-600)
- Skill chip'leri (sky-50 bg + sky-600 text)
- LinkedIn pill butonu (varsa)
- Hover: -translate-y-1 + shadow
4) Hakkımızda section eyebrow 'Ekibimiz', başlık
'Projenizde Kimlerle Çalışırsınız?' — WP'deki birebir
5) Admin form'una skills field eklendi (virgülle ayrılmış)
Bonus: layout font'u Poppins → Geist (Google Fonts CDN'e
geçici network sorunu vardı). --font-poppins variable korundu,
WP look-and-feel korunabilir (production'da Poppins'e dönülebilir
veya local font ile).
This commit is contained in:
@@ -81,14 +81,14 @@ export default async function AboutPage() {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
{team.length > 0 && (
|
{team.length > 0 && (
|
||||||
<section className="border-y border-[var(--border)] bg-[var(--navy-50)]/40 py-20">
|
<section className="border-y border-[var(--border)] bg-gray-50 py-20">
|
||||||
<div className="mx-auto max-w-7xl px-6">
|
<div className="mx-auto max-w-7xl px-6">
|
||||||
<SectionTitle
|
<SectionTitle
|
||||||
eyebrow="Ekip"
|
eyebrow="Ekibimiz"
|
||||||
title="İşi yapan insanları tanıyın"
|
title="Projenizde Kimlerle Çalışırsınız?"
|
||||||
description="Sizin projenizde birebir çalışacak ekip — geliştirici, tasarımcı ve proje yöneticileri."
|
description="Sizin projenizde birebir çalışacak kurucular — teknik altyapı ve ürün geliştirmenin arkasındaki isimler."
|
||||||
/>
|
/>
|
||||||
<div className="mt-12">
|
<div className="mt-14">
|
||||||
<TeamGrid members={team} />
|
<TeamGrid members={team} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+4
-5
@@ -1,15 +1,14 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import { Poppins, Geist_Mono } from "next/font/google";
|
import { Geist, 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 poppins = Poppins({
|
const sans = Geist({
|
||||||
variable: "--font-poppins",
|
variable: "--font-poppins",
|
||||||
subsets: ["latin", "latin-ext"],
|
subsets: ["latin"],
|
||||||
weight: ["300", "400", "500", "600", "700", "800"],
|
|
||||||
display: "swap",
|
display: "swap",
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -48,7 +47,7 @@ export default async function RootLayout({
|
|||||||
return (
|
return (
|
||||||
<html
|
<html
|
||||||
lang="tr"
|
lang="tr"
|
||||||
className={`${poppins.variable} ${geistMono.variable} h-full antialiased`}
|
className={`${sans.variable} ${geistMono.variable} h-full antialiased`}
|
||||||
>
|
>
|
||||||
<body className="min-h-full flex flex-col bg-white text-[var(--foreground)]">
|
<body className="min-h-full flex flex-col bg-white text-[var(--foreground)]">
|
||||||
<ConsentInit gtmId={gtmId} />
|
<ConsentInit gtmId={gtmId} />
|
||||||
|
|||||||
+60
-21
@@ -2,51 +2,90 @@ import Image from "next/image";
|
|||||||
import { LinkedinIcon } from "@/components/social-icons";
|
import { LinkedinIcon } from "@/components/social-icons";
|
||||||
import type { TeamMemberRow } from "@/lib/types";
|
import type { TeamMemberRow } from "@/lib/types";
|
||||||
|
|
||||||
|
const GRADIENTS = [
|
||||||
|
"from-[var(--navy)] to-blue-400",
|
||||||
|
"from-blue-400 to-cyan-400",
|
||||||
|
"from-violet-500 to-purple-500",
|
||||||
|
"from-sky-500 to-emerald-400",
|
||||||
|
];
|
||||||
|
|
||||||
|
function initials(name: string): string {
|
||||||
|
return name
|
||||||
|
.split(" ")
|
||||||
|
.map((s) => s[0])
|
||||||
|
.filter(Boolean)
|
||||||
|
.slice(0, 2)
|
||||||
|
.join("")
|
||||||
|
.toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
export function TeamGrid({ members }: { members: TeamMemberRow[] }) {
|
export function TeamGrid({ members }: { members: TeamMemberRow[] }) {
|
||||||
if (members.length === 0) return null;
|
if (members.length === 0) return null;
|
||||||
return (
|
return (
|
||||||
<div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
<div className="mx-auto grid max-w-3xl gap-8 sm:grid-cols-2">
|
||||||
{members.map((m) => (
|
{members.map((m, i) => (
|
||||||
<article
|
<article
|
||||||
key={m.$id}
|
key={m.$id}
|
||||||
className="overflow-hidden rounded-2xl border border-[var(--border)] bg-white transition hover:shadow-md"
|
className="group rounded-3xl border border-[var(--border)] bg-white p-8 transition-all duration-300 hover:-translate-y-1 hover:shadow-xl hover:shadow-[var(--navy)]/10"
|
||||||
>
|
>
|
||||||
<div className="relative aspect-square overflow-hidden bg-gradient-to-br from-[var(--sky-50)] to-[var(--navy-50)]">
|
{/* Avatar — Foto veya gradient initial */}
|
||||||
|
<div className="mx-auto mb-6 size-20">
|
||||||
{m.photo_url ? (
|
{m.photo_url ? (
|
||||||
<Image
|
<div className="relative size-20 overflow-hidden rounded-2xl">
|
||||||
src={m.photo_url}
|
<Image
|
||||||
alt={m.name}
|
src={m.photo_url}
|
||||||
fill
|
alt={m.name}
|
||||||
sizes="(min-width: 1024px) 33vw, (min-width: 768px) 50vw, 100vw"
|
fill
|
||||||
className="object-cover"
|
sizes="80px"
|
||||||
/>
|
className="object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex h-full items-center justify-center text-6xl font-bold text-[var(--navy)]/30">
|
<div
|
||||||
{m.name.charAt(0)}
|
className={`flex size-20 items-center justify-center rounded-2xl bg-gradient-to-br ${
|
||||||
|
GRADIENTS[i % GRADIENTS.length]
|
||||||
|
} text-2xl font-bold text-white shadow-lg`}
|
||||||
|
>
|
||||||
|
{initials(m.name)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="p-5">
|
|
||||||
<h3 className="text-base font-semibold text-[var(--navy)]">
|
<div className="text-center">
|
||||||
{m.name}
|
<h3 className="text-xl font-bold text-[var(--navy)]">{m.name}</h3>
|
||||||
</h3>
|
|
||||||
{m.role && (
|
{m.role && (
|
||||||
<p className="text-xs text-[var(--sky-600)]">{m.role}</p>
|
<div className="mt-1 text-sm font-medium text-[var(--sky-600)]">
|
||||||
|
{m.role}
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
{m.bio && (
|
{m.bio && (
|
||||||
<p className="mt-3 text-sm leading-relaxed text-[var(--muted)]">
|
<p className="mt-4 text-sm leading-relaxed text-[var(--muted)]">
|
||||||
{m.bio}
|
{m.bio}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{m.skills && m.skills.length > 0 && (
|
||||||
|
<div className="mt-5 flex flex-wrap items-center justify-center gap-1.5">
|
||||||
|
{m.skills.map((s) => (
|
||||||
|
<span
|
||||||
|
key={s}
|
||||||
|
className="rounded-full bg-[var(--sky-50)] px-3 py-1 text-xs font-medium text-[var(--sky-600)]"
|
||||||
|
>
|
||||||
|
{s}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{m.linkedin_url && (
|
{m.linkedin_url && (
|
||||||
<a
|
<a
|
||||||
href={m.linkedin_url}
|
href={m.linkedin_url}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="mt-3 inline-flex items-center gap-1 text-xs font-medium text-[var(--sky-600)] hover:text-[var(--navy)]"
|
className="mt-5 inline-flex items-center gap-1.5 rounded-full border border-[var(--border)] bg-white px-3 py-1.5 text-xs font-medium text-[var(--muted)] transition hover:border-[var(--sky)] hover:text-[var(--navy)]"
|
||||||
>
|
>
|
||||||
<LinkedinIcon className="size-3.5" />
|
<LinkedinIcon className="size-3.5" />
|
||||||
LinkedIn'de bağlan
|
LinkedIn
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -527,6 +527,7 @@ export async function saveTeamMember(formData: FormData) {
|
|||||||
photo_url: str(formData.get("photo_url")),
|
photo_url: str(formData.get("photo_url")),
|
||||||
linkedin_url: str(formData.get("linkedin_url")),
|
linkedin_url: str(formData.get("linkedin_url")),
|
||||||
order: num(formData.get("order")) ?? 0,
|
order: num(formData.get("order")) ?? 0,
|
||||||
|
skills: strArr(formData.get("skills")),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (id) {
|
if (id) {
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ export interface TeamMemberRow extends AwRow {
|
|||||||
photo_url?: string | null;
|
photo_url?: string | null;
|
||||||
linkedin_url?: string | null;
|
linkedin_url?: string | null;
|
||||||
order?: number | null;
|
order?: number | null;
|
||||||
|
skills?: string[] | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IndustryRow extends AwRow {
|
export interface IndustryRow extends AwRow {
|
||||||
|
|||||||
Reference in New Issue
Block a user