12 size card for full width in case of single article ONLY

This commit is contained in:
2025-11-15 17:33:29 +05:30
parent 4a8c59895e
commit a7e3ed46cb
3 changed files with 67 additions and 1 deletions

View File

@@ -0,0 +1,51 @@
import React from 'react';
import { CardMedia, Typography } from '@mui/material';
import { ArticleMeta } from "../ArticleMeta";
import { ArticleCardProps } from "../../types/props";
import { StyledCard, StyledCardContent, StyledTypography } from "../../types/styles";
export default function ArticleCardSize12({
article,
index,
focusedCardIndex,
onSelectArticle,
onFocus,
onBlur,
}: ArticleCardProps) {
return (
<StyledCard
variant="outlined"
onClick={() => onSelectArticle(index)}
onFocus={() => onFocus(index)}
onBlur={onBlur}
tabIndex={0}
className={focusedCardIndex === index ? 'Mui-focused' : ''}
>
<CardMedia
component="img"
alt={article.title}
image={(
import.meta.env.VITE_API_BASE_URL.replace(/\/+$/, "") +
"/" +
(article.img?.replace(/^\/+/, "") || "")
)}
sx={{
aspectRatio: '16 / 9',
}}
/>
<StyledCardContent>
<Typography gutterBottom variant="caption" component="div">
{article.tag}
</Typography>
<Typography gutterBottom variant="h6" component="div">
{article.title}
</Typography>
<StyledTypography variant="body2" color="text.secondary" gutterBottom>
{article.description}
</StyledTypography>
</StyledCardContent>
<ArticleMeta article={article} />
</StyledCard>
);
};

View File

@@ -1,5 +1,6 @@
import React from 'react';
import { Grid, Box } from '@mui/material';
import ArticleCardSize12 from './ArticleCardSize12';
import ArticleCardSize6 from './ArticleCardSize6';
import ArticleCardSize4 from './ArticleCardSize4';
import ArticleCardSize2 from './ArticleCardSize2';
@@ -10,6 +11,7 @@ export default function ArticleCardsGrid({
articles,
onSelectArticle,
xs = 12,
md12 = 12,
md6 = 6,
md4 = 4,
nested = 2,
@@ -30,8 +32,9 @@ export default function ArticleCardsGrid({
setFocusedCardIndex(null);
};
const renderCard = (article: ArticleModel, index: number, type: '6' | '4' | '2' = '6') => {
const renderCard = (article: ArticleModel, index: number, type: '12' | '6' | '4' | '2' = '12') => {
const CardComponent =
type === '12' ? ArticleCardSize12 :
type === '6' ? ArticleCardSize6 :
type === '4' ? ArticleCardSize4 :
ArticleCardSize2;
@@ -51,6 +54,17 @@ export default function ArticleCardsGrid({
return (
<Grid container spacing={2} columns={12}>
{/* ---- 1 article: 12 ---- */}
{count === 1 && (
<>
{visibleArticles.map((a, i) => (
<Grid key={i} size={{ xs, md: md12 }}>
{renderCard(a, i, '12')}
</Grid>
))}
</>
)}
{/* ---- 2 articles: 6 | 6 ---- */}
{count === 2 && (
<>

View File

@@ -34,6 +34,7 @@ export interface ArticleGridProps {
articles: ArticleModel[];
onSelectArticle: (index: number) => void;
xs?: number; // default 12 for mobile full-width
md12?: number, // default 12 (full-width)
md6?: number; // default 6 (half-width)
md4?: number; // default 4 (third-width)
nested?: 1 | 2; // number of stacked cards in a nested column