kapwa
blockarticlessource: ok · hit
Articles Section
A section showcasing article cards and content styles.
npx shadcn add "https://kapwa-two.vercel.app/r/articles.json"free
Where it goes
blog-list
Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.
Dependencies
Bundle weight · lightRegistry dependencies
cardbutton
Files1 · source cached 10/14/2026, 4:27:07 PM
src/lib/demo/blocks/sections/articles/index.tsx
import React from 'react';
import { Card, CardHeader, CardContent } from '@kapwa/card';
import {
ArticleCard,
ArticleCardItem,
ArticleContentSection,
ArticleContent,
} from '@kapwa/article';
type ArticlesSectionProps = {
headerTitle: string;
headerSubtitle?: string;
articleCardTitle?: string;
articleCards: ArticleCardItem[];
showArticleContent?: boolean;
articleContentTitle?: string;
articleContent?: ArticleContentSection[];
};
const ArticlesSection: React.FC<ArticlesSectionProps> = ({
headerTitle,
headerSubtitle,
articleCardTitle = 'Article Card',
articleCards,
showArticleContent = true,
articleContentTitle = 'Article Content',
articleContent,
}: ArticlesSectionProps) => {
return (
<Card className='mb-2'>
<CardHeader>
<h2 className='text-2xl font-semibold'>{headerTitle}</h2>
{headerSubtitle && <p className='text-gray-800'>{headerSubtitle}</p>}
</CardHeader>
<CardContent>
<div className='space-y-8'>
{/* Article Card */}
<div>
<h3 className='font-medium mb-4'>{articleCardTitle}</h3>
<div className='grid grid-cols-1 md:grid-cols-2 gap-6'>
{articleCards.map(article => (
<ArticleCard key={article.id} article={article} />
))}
</div>
</div>
{/* Article Content */}
{showArticleContent && articleContent && (
<ArticleContent
articleContentTitle={articleContentTitle}
articleContent={articleContent}
/>
)}
</div>
</CardContent>
</Card>
);
};
export { ArticlesSection };
export type { ArticleCardItem, ArticleContentSection, ArticlesSectionProps };