From 67fea16abd62c243c7ab7f461e89109c896f98ba Mon Sep 17 00:00:00 2001 From: poyrazavsever Date: Sat, 18 Jul 2026 14:39:18 +0300 Subject: [PATCH] feat: added new page media kit --- app/[locale]/media-kit/page.tsx | 45 +++ app/robots.ts | 2 +- components/app-shell.tsx | 4 +- components/media-kit-content.tsx | 630 +++++++++++++++++++++++++++++++ data/media-kit.ts | 163 ++++++++ 5 files changed, 842 insertions(+), 2 deletions(-) create mode 100644 app/[locale]/media-kit/page.tsx create mode 100644 components/media-kit-content.tsx create mode 100644 data/media-kit.ts diff --git a/app/[locale]/media-kit/page.tsx b/app/[locale]/media-kit/page.tsx new file mode 100644 index 0000000..b5a33b8 --- /dev/null +++ b/app/[locale]/media-kit/page.tsx @@ -0,0 +1,45 @@ +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; +import { MediaKitContent } from "@/components/media-kit-content"; +import type { MediaKitLocale } from "@/data/media-kit"; + +type MediaKitPageProps = { + params: Promise<{ locale: string }>; +}; + +export async function generateMetadata({ + params, +}: MediaKitPageProps): Promise { + const { locale } = await params; + const isTurkish = locale === "tr"; + + return { + title: isTurkish ? "Medya Kiti" : "Media Kit", + description: isTurkish + ? "Poyraz Avsever sponsorluk ve marka iş birlikleri medya kiti." + : "Poyraz Avsever media kit for sponsorships and brand partnerships.", + robots: { + index: false, + follow: false, + nocache: true, + googleBot: { + index: false, + follow: false, + noimageindex: true, + }, + }, + alternates: { + canonical: null, + }, + }; +} + +export default async function MediaKitPage({ params }: MediaKitPageProps) { + const { locale } = await params; + + if (locale !== "tr" && locale !== "en") { + notFound(); + } + + return ; +} diff --git a/app/robots.ts b/app/robots.ts index 6825975..31ff989 100644 --- a/app/robots.ts +++ b/app/robots.ts @@ -8,7 +8,7 @@ export default function robots(): MetadataRoute.Robots { { userAgent: "*", allow: "/", - disallow: ["/api/", "/_next/"], + disallow: ["/api/", "/_next/", "/media-kit", "/tr/media-kit", "/en/media-kit"], }, ], sitemap: `${SITE_URL}/sitemap.xml`, diff --git a/components/app-shell.tsx b/components/app-shell.tsx index 4476a12..52bfe92 100644 --- a/components/app-shell.tsx +++ b/components/app-shell.tsx @@ -37,6 +37,8 @@ export function AppShell({ children }: AppShellProps) { const [theme, setTheme] = useState(getInitialTheme); const isStandaloneLinksPage = pathname === "/links" || pathname.startsWith("/links/"); + const isStandaloneMediaKitPage = + pathname === "/media-kit" || pathname.startsWith("/media-kit/"); useEffect(() => { document.documentElement.dataset.poyrazTheme = theme; @@ -44,7 +46,7 @@ export function AppShell({ children }: AppShellProps) { localStorage.setItem("poyraz-theme", theme); }, [theme]); - if (isStandaloneLinksPage) { + if (isStandaloneLinksPage || isStandaloneMediaKitPage) { return children; } diff --git a/components/media-kit-content.tsx b/components/media-kit-content.tsx new file mode 100644 index 0000000..e211e51 --- /dev/null +++ b/components/media-kit-content.tsx @@ -0,0 +1,630 @@ +"use client"; + +import { Icon } from "@iconify/react"; +import Image from "next/image"; +import { + Badge, + Button, + ButtonIcon, + ButtonLabel, + Card, + PatternDots, + Separator, + StatisticCard, + TextEffect, + Typography, +} from "poyraz-ui/atoms"; +import { SPONSORS } from "@/data/sponsors"; +import { + MEDIA_KIT_AGES, + MEDIA_KIT_CONTENT_BREAKDOWN, + MEDIA_KIT_GENDER, + MEDIA_KIT_METRICS, + MEDIA_KIT_PERIOD, + MEDIA_KIT_TOPICS, + type MediaKitAudienceRow, + type MediaKitLocale, +} from "@/data/media-kit"; + +const COPY = { + tr: { + eyebrow: "Medya Kiti · 2026", + availability: "İş birliklerine açık", + name: "Poyraz Avsever", + title: "Teknolojiyi öğreniyor, üretiyor ve anlaşılır şekilde paylaşıyorum.", + intro: + "En büyük amacım öğrendiklerimi aktarırken bilgimi pekiştirmek ve başkalarının da üretmesine yardımcı olmak. Yazılım, teknoloji ve tasarımı gerçek projeler, dürüst deneyimler ve uygulanabilir anlatımlarla buluşturuyorum.", + role: "İçerik üreticisi · Yazılım geliştirici", + audienceTitle: "Kime ulaşıyorum?", + audienceDescription: + "Yazılım geliştiriciler, sistem yöneticileri, teknoloji meraklıları ve üretirken öğrenmeyi seven genç profesyoneller.", + statsEyebrow: "YouTube performansı", + statsTitle: "Takipçiden öte, aktif ve büyüyen bir kitle.", + statsDescription: + "Kanal performansının son 28 günlük görünümü. Gelir verileri medya kitine dahil edilmemiştir.", + periodLabel: "Veri dönemi", + audienceEyebrow: "Kitle profili", + audienceHeadline: "İzleyicilerin %68’i 18–34 yaş aralığında.", + audienceBody: + "Teknik kararları etkileyen, yeni araçları deneyen ve teknoloji ürünlerine yüksek ilgi gösteren odaklı bir topluluk.", + ageTitle: "Yaş dağılımı", + genderTitle: "Cinsiyet dağılımı", + formatTitle: "İçerik formatına göre izlenme", + formatDescription: + "Uzun video odağı, markaların ürün ve hikâyelerini detaylı ve bağlamı korunmuş biçimde anlatmaya alan açıyor.", + reachTitle: "Son 28 günde içerik ritmi", + reachItems: [ + { label: "Yeni izleyici", value: "6,8 B" }, + { label: "Düzenli izleyici", value: "801" }, + { label: "Yayınlanan içerik", value: "9" }, + ], + reachNote: "5 uzun video · 4 Shorts", + partnersEyebrow: "Seçili iş birlikleri", + partnersTitle: "Daha önce birlikte ürettik.", + partnersDescription: + "İçeriğin doğal akışını ve izleyici güvenini koruyan, ürünü gerçekten deneyimlemeye dayalı iş birlikleri.", + collaborationTitle: "Uygun iş birliği formatları", + collaborationItems: [ + "Sponsorlu YouTube videosu veya doğal ürün entegrasyonu", + "Teknik ürün incelemesi ve kullanım senaryosu", + "Kısa format video ve çoklu platform içerik paketi", + "Uzun dönem marka elçiliği ve içerik serisi", + ], + ctaEyebrow: "Birlikte üretelim", + ctaTitle: "Teknoloji kitlesine güvenilir bir hikâyeyle ulaşın.", + ctaDescription: + "Markanızı, ürünü gerçekten anlayan ve izleyicisine açık bir dille anlatan içeriklerle buluşturalım.", + emailCta: "E-posta gönder", + youtubeCta: "YouTube kanalını aç", + footer: "Poyraz Avsever · Medya Kiti", + updated: "Son güncelleme: 1 Temmuz 2026", + derivedNote: + "Ortalama izlenme süresi, paylaşılan toplam izlenme saati ve görüntüleme değerlerinden yaklaşık olarak hesaplanmıştır.", + }, + en: { + eyebrow: "Media Kit · 2026", + availability: "Open to partnerships", + name: "Poyraz Avsever", + title: "I learn, build, and make technology easier to understand.", + intro: + "My biggest goal is to reinforce what I learn by sharing it and help others build along the way. I connect software, technology, and design through real projects, honest experiences, and practical storytelling.", + role: "Content creator · Software developer", + audienceTitle: "Who do I reach?", + audienceDescription: + "Software developers, system administrators, technology enthusiasts, and young professionals who learn by building.", + statsEyebrow: "YouTube performance", + statsTitle: "An active, growing audience beyond follower count.", + statsDescription: + "A 28-day view of channel performance. Revenue data is intentionally excluded from this media kit.", + periodLabel: "Data period", + audienceEyebrow: "Audience profile", + audienceHeadline: "68% of viewers are between 18 and 34.", + audienceBody: + "A focused community that influences technical decisions, tries new tools, and shows strong interest in technology products.", + ageTitle: "Age distribution", + genderTitle: "Gender distribution", + formatTitle: "Views by content format", + formatDescription: + "A strong long-form focus creates room to explain products and brand stories in depth and with the right context.", + reachTitle: "Content rhythm in the last 28 days", + reachItems: [ + { label: "New viewers", value: "6.8K" }, + { label: "Regular viewers", value: "801" }, + { label: "Published pieces", value: "9" }, + ], + reachNote: "5 long-form videos · 4 Shorts", + partnersEyebrow: "Selected partnerships", + partnersTitle: "Brands I have built with.", + partnersDescription: + "Partnerships grounded in real product experience while protecting the natural flow of the content and audience trust.", + collaborationTitle: "Partnership formats", + collaborationItems: [ + "Sponsored YouTube video or native product integration", + "Technical product review and use-case content", + "Short-form video and multi-platform content package", + "Long-term brand ambassadorship and content series", + ], + ctaEyebrow: "Let’s build together", + ctaTitle: "Reach a technology audience through a credible story.", + ctaDescription: + "Let’s introduce your brand through content that understands the product and speaks clearly to its audience.", + emailCta: "Send an email", + youtubeCta: "Open YouTube channel", + footer: "Poyraz Avsever · Media Kit", + updated: "Last updated: July 1, 2026", + derivedNote: + "Average watch time is an estimate calculated from the shared total watch hours and view count.", + }, +} as const; + +function AudienceBar({ + item, + locale, + max = 100, +}: { + item: MediaKitAudienceRow; + locale: MediaKitLocale; + max?: number; +}) { + const width = Math.max((item.value / max) * 100, item.value > 0 ? 2 : 0); + const value = item.value.toLocaleString(locale === "tr" ? "tr-TR" : "en-US", { + maximumFractionDigits: 1, + }); + + return ( +
+ + {item.label} + +
+
+
+ + %{value} + +
+ ); +} + +export function MediaKitContent({ locale }: { locale: MediaKitLocale }) { + const copy = COPY[locale]; + + return ( +
+
+
+ + Poyraz Avsever +
+ + {copy.name} + + + {copy.eyebrow} + +
+
+ + + + {copy.availability} + +
+ +
+
+ +
+
+
+ + {copy.statsTitle} + + + {copy.statsDescription} + +
+
+ + {copy.periodLabel} + + + {MEDIA_KIT_PERIOD[locale]} + +
+
+ +
+ {MEDIA_KIT_METRICS.map((metric) => ( + + + + } + /> + ))} +
+ + + * {copy.derivedNote} + +
+ +
+
+ + {copy.audienceHeadline} + + + {copy.audienceBody} + + + + + {copy.audienceTitle} + + + {copy.audienceDescription} + +
+ {MEDIA_KIT_TOPICS.map((topic) => ( + + {topic.label[locale]} + + ))} +
+
+
+ +
+ +
+ + {copy.genderTitle} + + +
+
+ {MEDIA_KIT_GENDER.map((item) => ( + + ))} +
+
+ + +
+ + {copy.ageTitle} + + +
+
+ {MEDIA_KIT_AGES.map((item) => ( + + ))} +
+
+
+
+ +
+ +
+
+ + {copy.formatTitle} + + + {copy.formatDescription} + +
+ +
+ +
+ {MEDIA_KIT_CONTENT_BREAKDOWN.map((item) => ( +
+
+ + {item.label[locale]} + +
+ + {item.value[locale]} + + + %{item.percentage.toLocaleString( + locale === "tr" ? "tr-TR" : "en-US", + )} + +
+
+
+
+
+
+ ))} +
+ + + +
+ + {copy.reachTitle} + + +
+ +
+ {copy.reachItems.map((item) => ( +
+ + {item.label} + + + {item.value} + +
+ ))} +
+ + {copy.reachNote} + +
+
+ +
+
+
+ + {copy.partnersTitle} + + + {copy.partnersDescription} + +
+ +
+ {SPONSORS.map((sponsor) => ( + + +
+ {sponsor.name} +
+
+
+ ))} +
+
+ + + +
+ + {copy.collaborationTitle} + +
+ {copy.collaborationItems.map((item) => ( +
+ + + + + {item} + +
+ ))} +
+
+
+ +
+ + +
+ +
+ + {copy.footer} + + + {copy.updated} + +
+
+
+ ); +} diff --git a/data/media-kit.ts b/data/media-kit.ts new file mode 100644 index 0000000..ef41cd9 --- /dev/null +++ b/data/media-kit.ts @@ -0,0 +1,163 @@ +export type MediaKitLocale = "tr" | "en"; + +export type MediaKitMetric = { + id: string; + label: Record; + value: Record; + detail: Record; + icon: string; +}; + +export type MediaKitAudienceRow = { + id: string; + label: string; + value: number; +}; + +export const MEDIA_KIT_PERIOD = { + tr: "20 Haziran – 17 Temmuz 2026", + en: "June 20 – July 17, 2026", +} satisfies Record; + +export const MEDIA_KIT_METRICS: MediaKitMetric[] = [ + { + id: "subscribers", + label: { + tr: "YouTube abonesi", + en: "YouTube subscribers", + }, + value: { + tr: "8 B+", + en: "8K+", + }, + detail: { + tr: "Son 28 günde +715", + en: "+715 in the last 28 days", + }, + icon: "mdi:account-multiple-outline", + }, + { + id: "views", + label: { + tr: "Görüntüleme", + en: "Views", + }, + value: { + tr: "31,1 B", + en: "31.1K", + }, + detail: { + tr: "Son 28 gün", + en: "Last 28 days", + }, + icon: "mdi:play-circle-outline", + }, + { + id: "watch-time", + label: { + tr: "İzlenme süresi", + en: "Watch time", + }, + value: { + tr: "2,0 B saat", + en: "2.0K hours", + }, + detail: { + tr: "≈ 3:52 / görüntüleme", + en: "≈ 3:52 per view", + }, + icon: "mdi:clock-outline", + }, + { + id: "monthly-audience", + label: { + tr: "Aylık kitle", + en: "Monthly audience", + }, + value: { + tr: "15,3 B", + en: "15.3K", + }, + detail: { + tr: "Aktif izleyici", + en: "Active viewers", + }, + icon: "mdi:chart-line", + }, +]; + +export const MEDIA_KIT_CONTENT_BREAKDOWN = [ + { + id: "videos", + label: { + tr: "Uzun videolar", + en: "Long-form videos", + }, + value: { + tr: "24,3 B", + en: "24.3K", + }, + percentage: 78.4, + }, + { + id: "shorts", + label: { + tr: "Shorts", + en: "Shorts", + }, + value: { + tr: "6,7 B", + en: "6.7K", + }, + percentage: 21.6, + }, +] as const; + +export const MEDIA_KIT_GENDER: MediaKitAudienceRow[] = [ + { id: "male", label: "Erkek", value: 98 }, + { id: "female", label: "Kadın", value: 2 }, +]; + +export const MEDIA_KIT_AGES: MediaKitAudienceRow[] = [ + { id: "18-24", label: "18–24", value: 21.9 }, + { id: "25-34", label: "25–34", value: 46.1 }, + { id: "35-44", label: "35–44", value: 20.8 }, + { id: "45-54", label: "45–54", value: 9.8 }, + { id: "55-64", label: "55–64", value: 1.2 }, + { id: "65+", label: "65+", value: 0.1 }, +]; + +export const MEDIA_KIT_TOPICS = [ + { + id: "software", + label: { + tr: "Yazılım geliştirme", + en: "Software development", + }, + icon: "mdi:code-tags", + }, + { + id: "systems", + label: { + tr: "Sistem & araçlar", + en: "Systems & tooling", + }, + icon: "mdi:server-outline", + }, + { + id: "design", + label: { + tr: "Tasarım & ürün", + en: "Design & product", + }, + icon: "mdi:palette-outline", + }, + { + id: "technology", + label: { + tr: "Teknoloji", + en: "Technology", + }, + icon: "mdi:laptop", + }, +] as const;