Introduce a footer-triggered Version History drawer with categorized release notes, hardcoded release data, and semver tracking at v0.3.0. Also ships blog blockquote/table styling, site-wide typography, home page image updates, header refinements, and related bug fixes. Co-authored-by: Cursor <cursoragent@cursor.com>
39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
import type { BlockquoteBlockPayload } from "@/lib/blog-blocks";
|
|
import { sanitizeBlockquoteContent } from "@/lib/blockquote-content";
|
|
import { blockquoteVariantClass } from "@/components/blog-blockquote-styles";
|
|
import { BlogBlockquoteDecorations } from "@/components/blog-blockquote-decorations";
|
|
import { cn } from "@/lib/utils";
|
|
import { Quote } from "lucide-react";
|
|
|
|
interface BlogBlockquoteProps {
|
|
payload: BlockquoteBlockPayload;
|
|
}
|
|
|
|
export function BlogBlockquote({ payload }: BlogBlockquoteProps) {
|
|
const { content, citation, variant = "gray" } = payload;
|
|
const cleanContent = sanitizeBlockquoteContent(content);
|
|
if (!cleanContent.trim()) return null;
|
|
|
|
return (
|
|
<figure className="my-8 not-prose">
|
|
<blockquote
|
|
className={cn("blog-blockquote text-foreground", blockquoteVariantClass[variant])}
|
|
>
|
|
<BlogBlockquoteDecorations variant={variant} />
|
|
<Quote className="blog-blockquote__icon" aria-hidden />
|
|
<div
|
|
className="blog-blockquote__content"
|
|
dangerouslySetInnerHTML={{ __html: cleanContent }}
|
|
/>
|
|
{citation ? (
|
|
<footer className="blog-blockquote__footer">
|
|
<cite className="text-sm text-muted-foreground not-italic">
|
|
{citation}
|
|
</cite>
|
|
</footer>
|
|
) : null}
|
|
</blockquote>
|
|
</figure>
|
|
);
|
|
}
|