feat(seo): GEO paketi — yapılandırılmış metadata, AI bot erişimi, veri tazelik sinyali

- sayfaMetadata(): indekslenebilir sayfalar için tek kaynaklı canonical +
  eksiksiz openGraph üretimi; sayfalar buna geçirildi
- robots.ts: yalnızca /api/ engellenir; noindex'li sayfalar robots engeli
  yerine meta ile yönetilir, AI botları niyeti belgeleyen açık grupla izinli
- next.config: htmlLimitedBots'a AI botları eklendi (JS çalıştırmayan
  botlara metadata head içinde bloklanarak verilir)
- sitemap lastmod + katalogda görünür 'Kaynak/son güncelleme' satırı
  (VeriKaynagi) KATALOG_VERI_TARIHI tek kaynağından
- docs/geo/geo-raporu.md: çalışmanın raporu

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-21 00:51:16 +03:00
parent d2651eadb9
commit 53eb07bb34
18 changed files with 718 additions and 73 deletions

View File

@@ -60,19 +60,31 @@ function AccordionContent({
children,
...props
}: React.ComponentProps<typeof AccordionPrimitive.Content>) {
// forceMount: kapalı içerik de ilk HTML'de kalır — JS çalıştırmayan
// tarayıcılar (arama/AI botları) cevapları okuyabilsin. Radix kapalıyken
// içeriği hiç render etmez; forceMount ile de yükseklik ölçümü kapalıyken 0
// çıktığı için accordion-up/down keyframe'leri çalışmaz. Aç/kapa bu yüzden
// grid-rows geçişiyle yapılır; geçiş Content'in KENDİSİNDE değil çocuğunda
// durur, çünkü Radix ölçüm sırasında Content'in transition-duration'ını
// sıfırlar. visibility geçişi kapalı içeriği odak/ekran okuyucudan çıkarır.
return (
<AccordionPrimitive.Content
forceMount
data-slot="accordion-content"
className="overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up"
className="group/accordion-content text-sm"
{...props}
>
<div
className={cn(
"h-(--radix-accordion-content-height) pt-0 pb-2.5 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
className
)}
>
{children}
<div className="grid grid-rows-[1fr] transition-[grid-template-rows,visibility] duration-200 ease-out group-data-[state=closed]/accordion-content:invisible group-data-[state=closed]/accordion-content:grid-rows-[0fr] motion-reduce:transition-none">
<div className="min-h-0 overflow-hidden">
<div
className={cn(
"pt-0 pb-2.5 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
className
)}
>
{children}
</div>
</div>
</div>
</AccordionPrimitive.Content>
)