LinkDetailPage

These templates include the full document shell. Each variant is shown in a separate frame (same URL as “open alone”).


src/ui/3_templates/LinkDetailPage.astro
---
import type { LinkOpenGraphPreview } from '../../lib/link-open-graph'
import type { BacklinkSource } from '../../lib/internal-links/backlink-graph'
import '../../styles/link-open-graph-preview.css'
import MarkdownBlock from '../2_organisms/MarkdownBlock.astro'
import PostHeader from '../2_organisms/PostHeader.astro'
import Backlinks from '../2_organisms/Backlinks.astro'
import LinkOpenGraphCard from '../2_organisms/LinkOpenGraphCard.astro'
import Base from './Base.astro'
interface OpenGraphProps {
url: string
imageUrl: string
imageAlt: string
ogTitle: string
ogDescription?: string
}
interface Props {
title: string
/** `<meta name="description">` and related fallbacks. */
description: string
noindex: boolean
canonicalHref?: string
copyablePostId?: string
githubEditHref?: string
openGraph?: OpenGraphProps
width?: 'default' | 'wide' | 'full'
/** Real pages use `Date` from content; Storybook static prerender fixtures may use ISO strings. */
publishedAt: Date | string
tags: string[]
/** Pages pass a `Map`; Storybook static args serialize to a plain object — both are supported. */
tagCounts: Map<string, number> | Record<string, number>
postId: string
linkUrl: string
openGraphPreview: LinkOpenGraphPreview | null
backlinks: BacklinkSource[]
}
const {
title,
description,
noindex,
canonicalHref,
copyablePostId,
githubEditHref,
openGraph,
width = 'default',
publishedAt,
tags,
tagCounts,
postId,
linkUrl,
openGraphPreview,
backlinks,
} = Astro.props
---
<Base
title={title}
description={description}
noindex={noindex}
width={width}
canonicalHref={canonicalHref}
copyablePostId={copyablePostId}
githubEditHref={githubEditHref}
openGraph={openGraph}
>
<article>
<PostHeader
title={title}
postType="link"
publishedAt={publishedAt}
tags={tags}
tagCounts={tagCounts}
postId={postId}
secret={noindex}
class="mb-1"
/>
<div class="mb-6">
<LinkOpenGraphCard href={linkUrl} openGraphPreview={openGraphPreview} />
</div>
<MarkdownBlock>
<slot />
</MarkdownBlock>
<Backlinks sources={backlinks} />
</article>
</Base>