2026-02-05 17:58:28 +03:30
|
|
|
import type { BlockquoteBlockPayload } from "@/lib/blog-blocks";
|
2026-07-02 02:46:20 +03:30
|
|
|
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";
|
2026-02-05 17:58:28 +03:30
|
|
|
|
|
|
|
|
interface BlogPullquoteProps {
|
|
|
|
|
payload: BlockquoteBlockPayload;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function BlogPullquote({ payload }: BlogPullquoteProps) {
|
2026-07-02 02:46:20 +03:30
|
|
|
const { content, citation, variant = "gray" } = payload;
|
|
|
|
|
const cleanContent = sanitizeBlockquoteContent(content);
|
|
|
|
|
if (!cleanContent.trim()) return null;
|
2026-02-05 17:58:28 +03:30
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<figure className="my-10 not-prose">
|
2026-07-02 02:46:20 +03:30
|
|
|
<blockquote
|
|
|
|
|
className={cn(
|
|
|
|
|
"blog-blockquote blog-pullquote text-foreground",
|
|
|
|
|
blockquoteVariantClass[variant]
|
|
|
|
|
)}
|
|
|
|
|
>
|
|
|
|
|
<BlogBlockquoteDecorations variant={variant} />
|
|
|
|
|
<Quote className="blog-blockquote__icon" aria-hidden />
|
2026-02-05 17:58:28 +03:30
|
|
|
<div
|
2026-07-02 02:46:20 +03:30
|
|
|
className="blog-blockquote__content"
|
|
|
|
|
dangerouslySetInnerHTML={{ __html: cleanContent }}
|
2026-02-05 17:58:28 +03:30
|
|
|
/>
|
|
|
|
|
{citation ? (
|
2026-07-02 02:46:20 +03:30
|
|
|
<footer className="blog-blockquote__footer">
|
2026-02-05 17:58:28 +03:30
|
|
|
<cite className="text-sm text-muted-foreground not-italic">
|
2026-06-17 21:35:35 +03:30
|
|
|
{citation}
|
2026-02-05 17:58:28 +03:30
|
|
|
</cite>
|
|
|
|
|
</footer>
|
|
|
|
|
) : null}
|
|
|
|
|
</blockquote>
|
|
|
|
|
</figure>
|
|
|
|
|
);
|
|
|
|
|
}
|