11import { GitHubButton } from "@/app/(home)/components/GitHubButton/GitHubButton" ;
22import { Footer } from "@/app/(home)/sections/Footer/Footer" ;
3+ import { createIndexablePageMetadata } from "@/lib/seo/metadata" ;
34import { blog } from "@/lib/source" ;
45import { getMDXComponents } from "@/mdx-components" ;
5- import { TOCItem , TOCItems } from "fumadocs-ui/components/toc/default" ;
66import { TOCProvider , TOCScrollArea } from "fumadocs-ui/components/toc" ;
7+ import { TOCItem , TOCItems } from "fumadocs-ui/components/toc/default" ;
78import type { Metadata } from "next" ;
89import { notFound } from "next/navigation" ;
910
@@ -20,40 +21,40 @@ export default async function BlogPostPage(props: { params: Promise<{ slug: stri
2021 footer's surface — matching the home content band (light: foreground->background->foreground;
2122 dark: black -> neutral-950 -> black, so the edges meet the black menu + footer). */ }
2223 < div className = "min-h-screen bg-[linear-gradient(to_bottom,var(--openui-foreground),var(--openui-background)_10rem,var(--openui-background)_calc(100%_-_10rem),var(--openui-foreground))] [[data-theme=dark]_&]:bg-[linear-gradient(to_bottom,#000,var(--swatch-neutral-950)_28rem,var(--swatch-neutral-950)_calc(100%_-_28rem),#000)]" >
23- < main className = "mx-auto flex w-full max-w-[var(--home-container-wide)] gap-4 px-4 pt-16 pb-40 lg:gap-28 lg:pr-8 min-[1249px]:pl-0 min-[1024px]:max-[1248px]:pl-8" >
24- < aside className = "hidden w-56 shrink-0 lg:block" >
25- < div className = "sticky top-24" >
26- < p className = "mb-3 text-sm font-medium text-fd-foreground" > On this page</ p >
27- < TOCScrollArea className = "max-h-[calc(100vh-8rem)]" >
28- < TOCItems >
29- { page . data . toc . map ( ( item ) => (
30- < TOCItem key = { item . url } item = { item } />
31- ) ) }
32- </ TOCItems >
33- </ TOCScrollArea >
34- </ div >
35- </ aside >
24+ < main className = "mx-auto flex w-full max-w-[var(--home-container-wide)] gap-4 px-4 pt-16 pb-40 lg:gap-28 lg:pr-8 min-[1249px]:pl-0 min-[1024px]:max-[1248px]:pl-8" >
25+ < aside className = "hidden w-56 shrink-0 lg:block" >
26+ < div className = "sticky top-24" >
27+ < p className = "mb-3 text-sm font-medium text-fd-foreground" > On this page</ p >
28+ < TOCScrollArea className = "max-h-[calc(100vh-8rem)]" >
29+ < TOCItems >
30+ { page . data . toc . map ( ( item ) => (
31+ < TOCItem key = { item . url } item = { item } />
32+ ) ) }
33+ </ TOCItems >
34+ </ TOCScrollArea >
35+ </ div >
36+ </ aside >
3637
37- < div className = "min-w-0 flex-1" >
38- < h1 className = "mb-2 text-[length:var(--home-title-size)] font-[family-name:var(--home-font-display)] font-medium leading-[var(--home-title-leading)] tracking-[var(--home-title-tracking)] text-[color:var(--openui-text-neutral-primary)]" >
39- { page . data . title }
40- </ h1 >
41- < p className = "mb-4 text-[length:var(--home-lead-size)] font-[family-name:var(--home-font-text)] leading-[var(--home-lead-leading)] text-[color:var(--openui-text-neutral-secondary)]" >
42- { page . data . description }
43- </ p >
44- < div className = "flex items-center gap-3 border-b border-[color:var(--home-hairline)] pb-6 text-[length:var(--home-body-size)] font-[family-name:var(--home-font-text)] text-[color:var(--openui-text-neutral-tertiary)]" >
45- < span > { page . data . author } </ span >
46- < span > ·</ span >
47- < time > { new Date ( page . data . date ) . toDateString ( ) } </ time >
48- </ div >
49- < article className = "prose mt-8 min-w-0" >
50- < Mdx components = { getMDXComponents ( ) } />
51- </ article >
52- < div className = "mt-12 border-t border-[color:var(--home-hairline)] pt-8" >
53- < GitHubButton variant = "desktopGlow" />
38+ < div className = "min-w-0 flex-1" >
39+ < h1 className = "mb-2 text-[length:var(--home-title-size)] font-[family-name:var(--home-font-display)] font-medium leading-[var(--home-title-leading)] tracking-[var(--home-title-tracking)] text-[color:var(--openui-text-neutral-primary)]" >
40+ { page . data . title }
41+ </ h1 >
42+ < p className = "mb-4 text-[length:var(--home-lead-size)] font-[family-name:var(--home-font-text)] leading-[var(--home-lead-leading)] text-[color:var(--openui-text-neutral-secondary)]" >
43+ { page . data . description }
44+ </ p >
45+ < div className = "flex items-center gap-3 border-b border-[color:var(--home-hairline)] pb-6 text-[length:var(--home-body-size)] font-[family-name:var(--home-font-text)] text-[color:var(--openui-text-neutral-tertiary)]" >
46+ < span > { page . data . author } </ span >
47+ < span > ·</ span >
48+ < time > { new Date ( page . data . date ) . toDateString ( ) } </ time >
49+ </ div >
50+ < article className = "prose mt-8 min-w-0" >
51+ < Mdx components = { getMDXComponents ( ) } />
52+ </ article >
53+ < div className = "mt-12 border-t border-[color:var(--home-hairline)] pt-8" >
54+ < GitHubButton variant = "desktopGlow" />
55+ </ div >
5456 </ div >
55- </ div >
56- </ main >
57+ </ main >
5758 </ div >
5859 < Footer />
5960 </ TOCProvider >
@@ -68,13 +69,14 @@ export async function generateMetadata(props: {
6869
6970 if ( ! page ) notFound ( ) ;
7071
71- return {
72+ return createIndexablePageMetadata ( {
73+ pathname : page . url ,
7274 title : page . data . title ,
7375 description : page . data . description ,
74- alternates : {
75- canonical : page . url ,
76- } ,
77- } ;
76+ image : `/images/blog/ ${ params . slug } .png` ,
77+ openGraphType : "article" ,
78+ publishedTime : new Date ( page . data . date ) . toISOString ( ) ,
79+ } ) ;
7880}
7981
8082export function generateStaticParams ( ) : { slug : string } [ ] {
0 commit comments