story-az-card-kit
Version:
A flexible and customizable story card component with multiple layouts
58 lines (53 loc) • 1.5 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import StoryCard from '../components/StoryCard';
const GridCard = ({
stories = [],
columns = 3,
gap = 'medium',
theme = 'default',
onCardClick,
className = '',
responsive = true,
children,
...props
}) => {
const gridClass = `story-card-grid story-card-grid--${columns}-cols story-card-grid--gap-${gap}`;
const responsiveClass = responsive ? 'story-card-grid--responsive' : '';
const gridClasses = [
gridClass,
responsiveClass,
className
].filter(Boolean).join(' ');
return (
<div className={gridClasses} {...props}>
{stories.map((story, index) => (
<StoryCard
key={index}
{...story}
theme={theme}
onClick={onCardClick ? (e, data) => onCardClick(e, data, index) : undefined}
/>
))}
{children}
</div>
);
};
GridCard.propTypes = {
stories: PropTypes.arrayOf(PropTypes.shape({
title: PropTypes.string,
description: PropTypes.string,
image: PropTypes.string,
author: PropTypes.string,
date: PropTypes.string,
tags: PropTypes.arrayOf(PropTypes.string)
})),
columns: PropTypes.oneOf([1, 2, 3, 4, 5, 6]),
gap: PropTypes.oneOf(['small', 'medium', 'large']),
theme: PropTypes.oneOf(['default', 'dark', 'minimal', 'elegant', 'modern']),
onCardClick: PropTypes.func,
className: PropTypes.string,
responsive: PropTypes.bool,
children: PropTypes.node
};
export default GridCard;