Files
Parsons/src/components/molecules/MiniCard/MiniCard.stories.tsx
Richie f7efa7165c Add MiniCard molecule and component tokens for MiniCard + MapPin
MiniCard: compact vertical card for grids, recommendations, and map
popups. Image + title + optional price/badges/chips/meta. Lighter
than ProviderCard — no verified tiers, no logo. Audit: 20/20.

MapPin tokens added (build next): price-pill markers for map views.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:47:26 +10:00

158 lines
3.8 KiB
TypeScript

import type { Meta, StoryObj } from '@storybook/react';
import Box from '@mui/material/Box';
import VerifiedOutlinedIcon from '@mui/icons-material/VerifiedOutlined';
import { MiniCard } from './MiniCard';
// Placeholder images for stories
const IMG_PROVIDER =
'https://images.unsplash.com/photo-1600585154340-be6161a56a0c?w=400&h=240&fit=crop&auto=format';
const IMG_VENUE =
'https://images.unsplash.com/photo-1497366216548-37526070297c?w=400&h=240&fit=crop&auto=format';
const IMG_CHAPEL =
'https://images.unsplash.com/photo-1548625149-fc4a29cf7092?w=400&h=240&fit=crop&auto=format';
const IMG_GARDEN =
'https://images.unsplash.com/photo-1585320806297-9794b3e4eeae?w=400&h=240&fit=crop&auto=format';
const meta: Meta<typeof MiniCard> = {
title: 'Molecules/MiniCard',
component: MiniCard,
tags: ['autodocs'],
parameters: {
layout: 'centered',
},
decorators: [
(Story) => (
<Box sx={{ width: 240 }}>
<Story />
</Box>
),
],
};
export default meta;
type Story = StoryObj<typeof MiniCard>;
/** Default mini card with title, image, and price */
export const Default: Story = {
args: {
title: 'H.Parsons Funeral Directors',
imageUrl: IMG_PROVIDER,
price: 900,
location: 'Wollongong',
},
};
/** With all optional fields populated */
export const FullyLoaded: Story = {
args: {
title: 'H.Parsons Funeral Directors',
imageUrl: IMG_PROVIDER,
price: 900,
location: 'Wollongong',
rating: 4.8,
badges: [
{ label: 'Verified', color: 'brand', variant: 'filled', icon: <VerifiedOutlinedIcon /> },
{ label: 'Online Arrangement', color: 'success' },
],
chips: ['Burial', 'Cremation'],
},
};
/** Venue card usage — capacity instead of rating */
export const Venue: Story = {
args: {
title: 'Albany Creek Memorial Park',
imageUrl: IMG_CHAPEL,
price: 450,
location: 'Albany Creek',
capacity: 120,
},
};
/** Package card usage — custom price label */
export const Package: Story = {
args: {
title: 'Essential Cremation Package',
imageUrl: IMG_GARDEN,
priceLabel: 'From $2,800',
badges: [{ label: 'Most Popular', color: 'brand' }],
},
};
/** Minimal — just title and image */
export const Minimal: Story = {
args: {
title: 'Lady Anne Funerals',
imageUrl: IMG_VENUE,
},
};
/** Selected state — brand border + warm background */
export const Selected: Story = {
args: {
title: 'H.Parsons Funeral Directors',
imageUrl: IMG_PROVIDER,
price: 900,
location: 'Wollongong',
selected: true,
},
};
/** Long title truncated at 2 lines */
export const LongTitle: Story = {
args: {
title: 'Botanical Funerals by Ian Allison — Sustainable & Eco-Friendly Services',
imageUrl: IMG_GARDEN,
price: 1200,
location: 'Northern Beaches',
rating: 4.9,
},
};
/** Multiple cards in a responsive grid */
export const Grid: Story = {
decorators: [
(Story) => (
<Box
sx={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))',
gap: 2,
width: 680,
}}
>
<Story />
</Box>
),
],
render: () => (
<>
<MiniCard
title="H.Parsons Funeral Directors"
imageUrl={IMG_PROVIDER}
price={900}
location="Wollongong"
rating={4.8}
badges={[
{ label: 'Verified', color: 'brand', variant: 'filled', icon: <VerifiedOutlinedIcon /> },
]}
onClick={() => {}}
/>
<MiniCard
title="Albany Creek Memorial Park"
imageUrl={IMG_CHAPEL}
price={450}
location="Albany Creek"
capacity={120}
onClick={() => {}}
/>
<MiniCard
title="Lady Anne Funerals"
imageUrl={IMG_VENUE}
location="Sutherland Shire"
onClick={() => {}}
/>
</>
),
};