format: Apply Prettier to existing codebase

Formatting-only changes across all component and story files.
No logic or behaviour changes — only whitespace, line breaks, and trailing commas.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-27 16:42:16 +11:00
parent aa7cdeecf0
commit 047d913960
46 changed files with 1510 additions and 886 deletions

View File

@@ -78,12 +78,24 @@ export const AllColoursFilled: Story = {
name: 'All Colours — Filled',
render: () => (
<div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
<Badge variant="filled" color="default">Default</Badge>
<Badge variant="filled" color="brand">Brand</Badge>
<Badge variant="filled" color="success">Success</Badge>
<Badge variant="filled" color="warning">Warning</Badge>
<Badge variant="filled" color="error">Error</Badge>
<Badge variant="filled" color="info">Info</Badge>
<Badge variant="filled" color="default">
Default
</Badge>
<Badge variant="filled" color="brand">
Brand
</Badge>
<Badge variant="filled" color="success">
Success
</Badge>
<Badge variant="filled" color="warning">
Warning
</Badge>
<Badge variant="filled" color="error">
Error
</Badge>
<Badge variant="filled" color="info">
Info
</Badge>
</div>
),
};
@@ -95,11 +107,21 @@ export const WithIcons: Story = {
name: 'With Icons',
render: () => (
<div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
<Badge color="brand" icon={<StarIcon />}>Popular</Badge>
<Badge color="success" icon={<CheckCircleIcon />}>Verified</Badge>
<Badge color="warning" icon={<WarningAmberIcon />}>Limited</Badge>
<Badge color="error" icon={<ErrorOutlineIcon />}>Sold out</Badge>
<Badge color="info" icon={<InfoOutlinedIcon />}>New</Badge>
<Badge color="brand" icon={<StarIcon />}>
Popular
</Badge>
<Badge color="success" icon={<CheckCircleIcon />}>
Verified
</Badge>
<Badge color="warning" icon={<WarningAmberIcon />}>
Limited
</Badge>
<Badge color="error" icon={<ErrorOutlineIcon />}>
Sold out
</Badge>
<Badge color="info" icon={<InfoOutlinedIcon />}>
New
</Badge>
</div>
),
};
@@ -109,11 +131,21 @@ export const WithIconsFilled: Story = {
name: 'With Icons — Filled',
render: () => (
<div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
<Badge variant="filled" color="brand" icon={<StarIcon />}>Popular</Badge>
<Badge variant="filled" color="success" icon={<CheckCircleIcon />}>Included</Badge>
<Badge variant="filled" color="warning" icon={<WarningAmberIcon />}>Attention</Badge>
<Badge variant="filled" color="error" icon={<ErrorOutlineIcon />}>Unavailable</Badge>
<Badge variant="filled" color="info" icon={<InfoOutlinedIcon />}>Updated</Badge>
<Badge variant="filled" color="brand" icon={<StarIcon />}>
Popular
</Badge>
<Badge variant="filled" color="success" icon={<CheckCircleIcon />}>
Included
</Badge>
<Badge variant="filled" color="warning" icon={<WarningAmberIcon />}>
Attention
</Badge>
<Badge variant="filled" color="error" icon={<ErrorOutlineIcon />}>
Unavailable
</Badge>
<Badge variant="filled" color="info" icon={<InfoOutlinedIcon />}>
Updated
</Badge>
</div>
),
};
@@ -124,9 +156,15 @@ export const WithIconsFilled: Story = {
export const Sizes: Story = {
render: () => (
<div style={{ display: 'flex', gap: 16, alignItems: 'center' }}>
<Badge size="small" color="brand" icon={<StarIcon />}>Small</Badge>
<Badge size="medium" color="brand" icon={<StarIcon />}>Medium</Badge>
<Badge size="large" color="brand" icon={<StarIcon />}>Large</Badge>
<Badge size="small" color="brand" icon={<StarIcon />}>
Small
</Badge>
<Badge size="medium" color="brand" icon={<StarIcon />}>
Medium
</Badge>
<Badge size="large" color="brand" icon={<StarIcon />}>
Large
</Badge>
</div>
),
};
@@ -146,7 +184,9 @@ export const InPriceCard: Story = {
<Typography variant="overline" color="text.secondary">
Essential
</Typography>
<Badge size="small" color="default">Standard</Badge>
<Badge size="small" color="default">
Standard
</Badge>
</Box>
<Typography variant="display3" color="primary" sx={{ mb: 1 }}>
$3,200
@@ -162,7 +202,9 @@ export const InPriceCard: Story = {
<Typography variant="overline" color="text.secondary">
Premium
</Typography>
<Badge color="brand" icon={<StarIcon />}>Most popular</Badge>
<Badge color="brand" icon={<StarIcon />}>
Most popular
</Badge>
</Box>
<Typography variant="display3" color="primary" sx={{ mb: 1 }}>
$5,800
@@ -178,7 +220,9 @@ export const InPriceCard: Story = {
<Typography variant="overline" color="text.secondary">
Bespoke
</Typography>
<Badge color="info" icon={<LocalOfferIcon />}>Best value</Badge>
<Badge color="info" icon={<LocalOfferIcon />}>
Best value
</Badge>
</Box>
<Typography variant="display3" color="primary" sx={{ mb: 1 }}>
$8,500
@@ -202,11 +246,46 @@ export const ServiceStatus: Story = {
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 12, maxWidth: 500 }}>
{[
{ service: 'Chapel ceremony', badge: <Badge color="success" icon={<CheckCircleIcon />}>Confirmed</Badge> },
{ service: 'Floral arrangements', badge: <Badge color="warning" icon={<WarningAmberIcon />}>Pending</Badge> },
{ service: 'Catering', badge: <Badge color="error" icon={<ErrorOutlineIcon />}>Unavailable</Badge> },
{ service: 'Memorial printing', badge: <Badge color="info" icon={<NewReleasesIcon />}>New option</Badge> },
{ service: 'Premium casket', badge: <Badge variant="filled" color="brand" icon={<VerifiedIcon />}>Included</Badge> },
{
service: 'Chapel ceremony',
badge: (
<Badge color="success" icon={<CheckCircleIcon />}>
Confirmed
</Badge>
),
},
{
service: 'Floral arrangements',
badge: (
<Badge color="warning" icon={<WarningAmberIcon />}>
Pending
</Badge>
),
},
{
service: 'Catering',
badge: (
<Badge color="error" icon={<ErrorOutlineIcon />}>
Unavailable
</Badge>
),
},
{
service: 'Memorial printing',
badge: (
<Badge color="info" icon={<NewReleasesIcon />}>
New option
</Badge>
),
},
{
service: 'Premium casket',
badge: (
<Badge variant="filled" color="brand" icon={<VerifiedIcon />}>
Included
</Badge>
),
},
].map((item) => (
<Card key={item.service} variant="outlined" padding="compact">
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
@@ -231,7 +310,14 @@ export const CompleteMatrix: Story = {
<div style={{ display: 'flex', flexDirection: 'column', gap: 24 }}>
{(['soft', 'filled'] as const).map((variant) => (
<div key={variant}>
<div style={{ marginBottom: 8, fontWeight: 600, fontSize: 14, textTransform: 'capitalize' }}>
<div
style={{
marginBottom: 8,
fontWeight: 600,
fontSize: 14,
textTransform: 'capitalize',
}}
>
{variant}
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
@@ -239,7 +325,13 @@ export const CompleteMatrix: Story = {
<div key={size} style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
<span style={{ width: 60, fontSize: 12, color: '#737373' }}>{size}</span>
{colors.map((color) => (
<Badge key={color} variant={variant} color={color} size={size} icon={<StarIcon />}>
<Badge
key={color}
variant={variant}
color={color}
size={size}
icon={<StarIcon />}
>
{color}
</Badge>
))}

View File

@@ -87,7 +87,9 @@ export const FigmaMapping: Story = {
<div style={{ display: 'flex', gap: 16, alignItems: 'center' }}>
<Button variant="contained">Primary</Button>
<Button variant="soft">Sec / Brand</Button>
<Button variant="soft" color="secondary">Sec / Grey</Button>
<Button variant="soft" color="secondary">
Sec / Grey
</Button>
<Button variant="text">Ghost</Button>
</div>
),
@@ -113,10 +115,18 @@ export const VariantsSecondary: Story = {
name: 'Variants — Secondary',
render: () => (
<div style={{ display: 'flex', gap: 16, alignItems: 'center' }}>
<Button variant="contained" color="secondary">Contained</Button>
<Button variant="soft" color="secondary">Soft</Button>
<Button variant="outlined" color="secondary">Outlined</Button>
<Button variant="text" color="secondary">Text</Button>
<Button variant="contained" color="secondary">
Contained
</Button>
<Button variant="soft" color="secondary">
Soft
</Button>
<Button variant="outlined" color="secondary">
Outlined
</Button>
<Button variant="text" color="secondary">
Text
</Button>
</div>
),
};
@@ -140,10 +150,18 @@ export const AllSizesSoft: Story = {
name: 'All Sizes — Soft',
render: () => (
<div style={{ display: 'flex', gap: 16, alignItems: 'center' }}>
<Button variant="soft" size="xs">Extra small</Button>
<Button variant="soft" size="small">Small</Button>
<Button variant="soft" size="medium">Medium</Button>
<Button variant="soft" size="large">Large</Button>
<Button variant="soft" size="xs">
Extra small
</Button>
<Button variant="soft" size="small">
Small
</Button>
<Button variant="soft" size="medium">
Medium
</Button>
<Button variant="soft" size="large">
Large
</Button>
</div>
),
};
@@ -180,10 +198,18 @@ export const IconsAllSizes: Story = {
name: 'Icons — All Sizes',
render: () => (
<div style={{ display: 'flex', gap: 16, alignItems: 'center' }}>
<Button size="xs" startIcon={<AddIcon />}>Add</Button>
<Button size="small" startIcon={<AddIcon />}>Add</Button>
<Button size="medium" startIcon={<AddIcon />}>Add</Button>
<Button size="large" startIcon={<AddIcon />}>Add</Button>
<Button size="xs" startIcon={<AddIcon />}>
Add
</Button>
<Button size="small" startIcon={<AddIcon />}>
Add
</Button>
<Button size="medium" startIcon={<AddIcon />}>
Add
</Button>
<Button size="large" startIcon={<AddIcon />}>
Add
</Button>
</div>
),
};
@@ -204,9 +230,15 @@ export const DisabledAllVariants: Story = {
render: () => (
<div style={{ display: 'flex', gap: 16, alignItems: 'center' }}>
<Button disabled>Contained</Button>
<Button disabled variant="soft">Soft</Button>
<Button disabled variant="outlined">Outlined</Button>
<Button disabled variant="text">Text</Button>
<Button disabled variant="soft">
Soft
</Button>
<Button disabled variant="outlined">
Outlined
</Button>
<Button disabled variant="text">
Text
</Button>
</div>
),
};
@@ -225,9 +257,15 @@ export const LoadingAllVariants: Story = {
render: () => (
<div style={{ display: 'flex', gap: 16, alignItems: 'center' }}>
<Button loading>Submitting...</Button>
<Button loading variant="soft">Processing...</Button>
<Button loading variant="outlined">Processing...</Button>
<Button loading variant="text">Loading...</Button>
<Button loading variant="soft">
Processing...
</Button>
<Button loading variant="outlined">
Processing...
</Button>
<Button loading variant="text">
Loading...
</Button>
</div>
),
};
@@ -293,9 +331,15 @@ export const TextButtonComparison: Story = {
render: () => (
<div style={{ display: 'flex', gap: 24, alignItems: 'center' }}>
<Button variant="text">No underline</Button>
<Button variant="text" underline>With underline</Button>
<Button variant="text" color="secondary">Secondary</Button>
<Button variant="text" color="secondary" underline>Secondary underlined</Button>
<Button variant="text" underline>
With underline
</Button>
<Button variant="text" color="secondary">
Secondary
</Button>
<Button variant="text" color="secondary" underline>
Secondary underlined
</Button>
</div>
),
};
@@ -305,10 +349,18 @@ export const TextButtonSizes: Story = {
name: 'Text Buttons — All Sizes',
render: () => (
<div style={{ display: 'flex', gap: 16, alignItems: 'center' }}>
<Button variant="text" size="xs">Extra small</Button>
<Button variant="text" size="small">Small</Button>
<Button variant="text" size="medium">Medium</Button>
<Button variant="text" size="large">Large</Button>
<Button variant="text" size="xs">
Extra small
</Button>
<Button variant="text" size="small">
Small
</Button>
<Button variant="text" size="medium">
Medium
</Button>
<Button variant="text" size="large">
Large
</Button>
</div>
),
};
@@ -348,15 +400,27 @@ export const CompleteMatrix: Story = {
<div style={{ display: 'flex', flexDirection: 'column', gap: 24 }}>
{(['contained', 'soft', 'outlined', 'text'] as const).map((variant) => (
<div key={variant}>
<div style={{ marginBottom: 8, fontWeight: 600, fontSize: 14, textTransform: 'capitalize' }}>
<div
style={{ marginBottom: 8, fontWeight: 600, fontSize: 14, textTransform: 'capitalize' }}
>
{variant}
</div>
<div style={{ display: 'flex', gap: 12, alignItems: 'center', flexWrap: 'wrap' }}>
<Button variant={variant} color="primary">Primary</Button>
<Button variant={variant} color="secondary">Secondary</Button>
<Button variant={variant} color="primary" startIcon={<AddIcon />}>With icon</Button>
<Button variant={variant} color="primary" disabled>Disabled</Button>
<Button variant={variant} color="primary" loading>Loading...</Button>
<Button variant={variant} color="primary">
Primary
</Button>
<Button variant={variant} color="secondary">
Secondary
</Button>
<Button variant={variant} color="primary" startIcon={<AddIcon />}>
With icon
</Button>
<Button variant={variant} color="primary" disabled>
Disabled
</Button>
<Button variant={variant} color="primary" loading>
Loading...
</Button>
</div>
</div>
))}

View File

@@ -69,13 +69,7 @@ export const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
{children}
{loading && (
<>
<CircularProgress
size={16}
color="inherit"
thickness={3}
aria-hidden
sx={{ ml: 1 }}
/>
<CircularProgress size={16} color="inherit" thickness={3} aria-hidden sx={{ ml: 1 }} />
<span
style={{
position: 'absolute',

View File

@@ -52,8 +52,8 @@ export const Default: Story = {
Funeral package
</Typography>
<Typography variant="body1" color="text.secondary">
A comprehensive service including chapel ceremony, transport, and
preparation. Suitable for families seeking a traditional farewell.
A comprehensive service including chapel ceremony, transport, and preparation. Suitable
for families seeking a traditional farewell.
</Typography>
</>
),
@@ -99,12 +99,7 @@ export const Variants: Story = {
export const Interactive: Story = {
render: () => (
<div style={{ display: 'flex', gap: 24, maxWidth: 800 }}>
<Card
interactive
sx={{ flex: 1 }}
tabIndex={0}
onClick={() => alert('Card clicked')}
>
<Card interactive sx={{ flex: 1 }} tabIndex={0} onClick={() => alert('Card clicked')}>
<Typography variant="h5" gutterBottom>
Elevated + Interactive
</Typography>
@@ -305,11 +300,15 @@ export const OnDifferentBackgrounds: Story = {
<div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
<Card variant="elevated">
<Typography variant="labelLg">Elevated</Typography>
<Typography variant="body2" color="text.secondary">Shadow defines edges</Typography>
<Typography variant="body2" color="text.secondary">
Shadow defines edges
</Typography>
</Card>
<Card variant="outlined">
<Typography variant="labelLg">Outlined</Typography>
<Typography variant="body2" color="text.secondary">Border defines edges</Typography>
<Typography variant="body2" color="text.secondary">
Border defines edges
</Typography>
</Card>
</div>
</div>
@@ -328,11 +327,15 @@ export const OnDifferentBackgrounds: Story = {
<div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
<Card variant="elevated">
<Typography variant="labelLg">Elevated</Typography>
<Typography variant="body2" color="text.secondary">White card + shadow on grey</Typography>
<Typography variant="body2" color="text.secondary">
White card + shadow on grey
</Typography>
</Card>
<Card variant="outlined">
<Typography variant="labelLg">Outlined</Typography>
<Typography variant="body2" color="text.secondary">Contrast + border on grey</Typography>
<Typography variant="body2" color="text.secondary">
Contrast + border on grey
</Typography>
</Card>
</div>
</div>
@@ -395,8 +398,8 @@ export const PriceCardPreview: Story = {
$3,200
</Typography>
<Typography variant="body2" color="text.secondary" sx={{ mb: 3 }}>
A respectful and simple service with chapel ceremony, transport, and
professional preparation.
A respectful and simple service with chapel ceremony, transport, and professional
preparation.
</Typography>
<Button fullWidth size="large">
Select this package
@@ -432,8 +435,8 @@ export const WithImage: Story = {
Parsons Chapel
</Typography>
<Typography variant="body2" color="text.secondary">
Our heritage-listed chapel seats up to 120 guests and features
modern audio-visual facilities.
Our heritage-listed chapel seats up to 120 guests and features modern audio-visual
facilities.
</Typography>
</Box>
</Card>

View File

@@ -58,9 +58,7 @@ export const Card = React.forwardRef<HTMLDivElement, CardProps>(
const muiVariant = variant === 'outlined' ? 'outlined' : undefined;
// Interactive cards need keyboard operability
const interactiveProps = interactive
? { tabIndex: 0 as const, role: 'button' as const }
: {};
const interactiveProps = interactive ? { tabIndex: 0 as const, role: 'button' as const } : {};
return (
<MuiCard
@@ -88,8 +86,7 @@ export const Card = React.forwardRef<HTMLDivElement, CardProps>(
// Focus-visible for keyboard accessibility on interactive cards
interactive && {
'&:focus-visible': {
outline: (theme: Theme) =>
`2px solid ${theme.palette.primary.main}`,
outline: (theme: Theme) => `2px solid ${theme.palette.primary.main}`,
outlineOffset: '2px',
},
},

View File

@@ -117,7 +117,12 @@ export const Clickable: Story = {
<Chip label="Clickable default" onClick={() => {}} />
<Chip label="Clickable primary" color="primary" onClick={() => {}} />
<Chip label="Clickable outlined" variant="outlined" onClick={() => {}} />
<Chip label="Clickable outlined primary" variant="outlined" color="primary" onClick={() => {}} />
<Chip
label="Clickable outlined primary"
variant="outlined"
color="primary"
onClick={() => {}}
/>
</Box>
),
};
@@ -143,14 +148,18 @@ export const Selected: Story = {
render: () => (
<Box sx={{ display: 'flex', gap: 2, flexDirection: 'column' }}>
<Box>
<Typography variant="label" sx={{ mb: 1 }}>Filled</Typography>
<Typography variant="label" sx={{ mb: 1 }}>
Filled
</Typography>
<Box sx={{ display: 'flex', gap: 1.5 }}>
<Chip label="Not selected" onClick={() => {}} />
<Chip label="Selected" selected onClick={() => {}} />
</Box>
</Box>
<Box>
<Typography variant="label" sx={{ mb: 1 }}>Outlined</Typography>
<Typography variant="label" sx={{ mb: 1 }}>
Outlined
</Typography>
<Box sx={{ display: 'flex', gap: 1.5 }}>
<Chip variant="outlined" label="Not selected" onClick={() => {}} />
<Chip variant="outlined" label="Selected" selected onClick={() => {}} />
@@ -253,12 +262,7 @@ export const RemovableTags: Story = {
</Typography>
) : (
tags.map((tag) => (
<Chip
key={tag}
label={tag}
color="primary"
onDelete={() => remove(tag)}
/>
<Chip key={tag} label={tag} color="primary" onDelete={() => remove(tag)} />
))
)}
</Box>
@@ -283,7 +287,9 @@ export const InServiceOption: Story = {
<Card interactive>
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'start', mb: 1 }}>
<Typography variant="h5">Chapel Ceremony</Typography>
<Typography variant="display3" color="primary">$1,200</Typography>
<Typography variant="display3" color="primary">
$1,200
</Typography>
</Box>
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
Traditional chapel service with celebrant and music of your choosing.
@@ -298,7 +304,9 @@ export const InServiceOption: Story = {
<Card interactive>
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'start', mb: 1 }}>
<Typography variant="h5">Graveside Service</Typography>
<Typography variant="display3" color="primary">$900</Typography>
<Typography variant="display3" color="primary">
$900
</Typography>
</Box>
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
Intimate outdoor farewell at the burial site.
@@ -337,8 +345,20 @@ export const CompleteMatrix: Story = {
{colors.map((color) => (
<React.Fragment key={color}>
<Chip variant={variant} color={color} size={size} label={color} />
<Chip variant={variant} color={color} size={size} label={`${color} + icon`} icon={<LocalOfferIcon />} />
<Chip variant={variant} color={color} size={size} label={`${color} delete`} onDelete={() => {}} />
<Chip
variant={variant}
color={color}
size={size}
label={`${color} + icon`}
icon={<LocalOfferIcon />}
/>
<Chip
variant={variant}
color={color}
size={size}
label={`${color} delete`}
onDelete={() => {}}
/>
</React.Fragment>
))}
</Box>
@@ -348,7 +368,9 @@ export const CompleteMatrix: Story = {
))}
<Box>
<Typography variant="label" sx={{ mb: 1 }}>Selected state</Typography>
<Typography variant="label" sx={{ mb: 1 }}>
Selected state
</Typography>
<Box sx={{ display: 'flex', gap: 1, alignItems: 'center' }}>
<Chip selected label="Filled selected" onClick={() => {}} />
<Chip selected variant="outlined" label="Outlined selected" onClick={() => {}} />

View File

@@ -44,16 +44,7 @@ export interface ChipProps extends MuiChipProps {
* is being removed.
*/
export const Chip = React.forwardRef<HTMLDivElement, ChipProps>(
(
{
selected = false,
variant = 'filled',
color,
sx,
...props
},
ref,
) => {
({ selected = false, variant = 'filled', color, sx, ...props }, ref) => {
// When selected, promote to primary colour unless explicitly set
const resolvedColor = color ?? (selected ? 'primary' : 'default');
@@ -63,11 +54,12 @@ export const Chip = React.forwardRef<HTMLDivElement, ChipProps>(
variant={variant}
color={resolvedColor}
sx={[
selected && variant === 'outlined' && {
borderWidth: 2,
borderColor: 'var(--fa-color-brand-500)',
backgroundColor: 'var(--fa-color-brand-50)',
},
selected &&
variant === 'outlined' && {
borderWidth: 2,
borderColor: 'var(--fa-color-brand-500)',
backgroundColor: 'var(--fa-color-brand-50)',
},
...(Array.isArray(sx) ? sx : [sx]),
]}
{...props}

View File

@@ -19,7 +19,13 @@ type Story = StoryObj<typeof Divider>;
// ─── Default ────────────────────────────────────────────────────────────────
export const Default: Story = {
decorators: [(Story) => <Box sx={{ width: 400 }}><Story /></Box>],
decorators: [
(Story) => (
<Box sx={{ width: 400 }}>
<Story />
</Box>
),
],
};
// ─── Variants ───────────────────────────────────────────────────────────────
@@ -84,9 +90,7 @@ export const InContent: Story = {
</Box>
<Divider />
<Box sx={{ fontWeight: 600, mt: 2, mb: 1 }}>Venue</Box>
<Box sx={{ fontSize: 14, color: 'text.secondary', mb: 2 }}>
West Chapel, Strathfield
</Box>
<Box sx={{ fontSize: 14, color: 'text.secondary', mb: 2 }}>West Chapel, Strathfield</Box>
<Divider />
<Box sx={{ fontWeight: 600, mt: 2, mb: 1 }}>Total</Box>
<Box sx={{ fontSize: 14, color: 'text.primary' }}>$2,400</Box>

View File

@@ -116,7 +116,17 @@ export const CommonUseCases: Story = {
{/* Card actions toolbar */}
<Box>
<Box sx={{ fontSize: 12, color: 'text.secondary', mb: 1 }}>Card action toolbar</Box>
<Box sx={{ display: 'flex', gap: 1, p: 1, border: '1px solid', borderColor: 'divider', borderRadius: 1, width: 'fit-content' }}>
<Box
sx={{
display: 'flex',
gap: 1,
p: 1,
border: '1px solid',
borderColor: 'divider',
borderRadius: 1,
width: 'fit-content',
}}
>
<IconButton size="small" color="primary" aria-label="Favourite">
<FavoriteBorderIcon />
</IconButton>
@@ -132,7 +142,18 @@ export const CommonUseCases: Story = {
{/* Dialog close */}
<Box>
<Box sx={{ fontSize: 12, color: 'text.secondary', mb: 1 }}>Dialog close button</Box>
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', p: 2, border: '1px solid', borderColor: 'divider', borderRadius: 1, width: 300 }}>
<Box
sx={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
p: 2,
border: '1px solid',
borderColor: 'divider',
borderRadius: 1,
width: 300,
}}
>
<Box sx={{ fontWeight: 600 }}>Confirm Selection</Box>
<IconButton size="small" aria-label="Close dialog">
<CloseIcon />
@@ -143,7 +164,17 @@ export const CommonUseCases: Story = {
{/* Navigation header */}
<Box>
<Box sx={{ fontSize: 12, color: 'text.secondary', mb: 1 }}>Mobile navigation toggle</Box>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1, p: 1, backgroundColor: 'var(--fa-color-brand-50)', borderRadius: 1, width: 'fit-content' }}>
<Box
sx={{
display: 'flex',
alignItems: 'center',
gap: 1,
p: 1,
backgroundColor: 'var(--fa-color-brand-50)',
borderRadius: 1,
width: 'fit-content',
}}
>
<IconButton size="large" aria-label="Open menu">
<MenuIcon />
</IconButton>

View File

@@ -122,10 +122,7 @@ export const FigmaMapping: Story = {
helperText="Input Label - Description"
endIcon={<SearchIcon />}
/>
<Input
placeholder="Select an option"
endIcon={<SearchIcon />}
/>
<Input placeholder="Select an option" endIcon={<SearchIcon />} />
<Input placeholder="Select an option" />
</div>
),
@@ -222,20 +219,16 @@ export const SizeAlignment: Story = {
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 24 }}>
<div style={{ display: 'flex', gap: 8, alignItems: 'flex-end' }}>
<Input
placeholder="Search arrangements..."
endIcon={<SearchIcon />}
size="medium"
/>
<Button size="large" sx={{ minWidth: 100, minHeight: 48 }}>Search</Button>
<Input placeholder="Search arrangements..." endIcon={<SearchIcon />} size="medium" />
<Button size="large" sx={{ minWidth: 100, minHeight: 48 }}>
Search
</Button>
</div>
<div style={{ display: 'flex', gap: 8, alignItems: 'flex-end' }}>
<Input
placeholder="Quick search..."
endIcon={<SearchIcon />}
size="small"
/>
<Button size="medium" sx={{ minWidth: 100, minHeight: 40 }}>Search</Button>
<Input placeholder="Quick search..." endIcon={<SearchIcon />} size="small" />
<Button size="medium" sx={{ minWidth: 100, minHeight: 40 }}>
Search
</Button>
</div>
</div>
),
@@ -248,11 +241,7 @@ export const WithIcons: Story = {
name: 'With Icons',
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 24 }}>
<Input
label="Search"
placeholder="Search services..."
endIcon={<SearchIcon />}
/>
<Input label="Search" placeholder="Search services..." endIcon={<SearchIcon />} />
<Input
label="Email"
placeholder="you@example.com"
@@ -265,12 +254,7 @@ export const WithIcons: Story = {
startIcon={<PhoneOutlinedIcon />}
type="tel"
/>
<Input
label="Amount"
placeholder="0.00"
startIcon={<AttachMoneyIcon />}
type="number"
/>
<Input label="Amount" placeholder="0.00" startIcon={<AttachMoneyIcon />} type="number" />
<Input
label="Email verified"
defaultValue="john@example.com"
@@ -355,18 +339,22 @@ export const ValidationFlow: Story = {
required
startIcon={<EmailOutlinedIcon />}
endIcon={
showSuccess ? <CheckCircleOutlineIcon sx={{ color: 'success.main' }} /> :
showError ? <ErrorOutlineIcon sx={{ color: 'error.main' }} /> :
undefined
showSuccess ? (
<CheckCircleOutlineIcon sx={{ color: 'success.main' }} />
) : showError ? (
<ErrorOutlineIcon sx={{ color: 'error.main' }} />
) : undefined
}
value={value}
onChange={(e) => setValue(e.target.value)}
error={showError}
success={showSuccess}
helperText={
showError ? 'Please enter a valid email address' :
showSuccess ? 'Looks good!' :
'Required for arrangement confirmation'
showError
? 'Please enter a valid email address'
: showSuccess
? 'Looks good!'
: 'Required for arrangement confirmation'
}
/>
);
@@ -387,9 +375,7 @@ export const ArrangementForm: Story = {
],
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>
<div style={{ fontWeight: 700, fontSize: 20, marginBottom: 4 }}>
Contact details
</div>
<div style={{ fontWeight: 700, fontSize: 20, marginBottom: 4 }}>Contact details</div>
<Input
label="Full name"
placeholder="Enter your full name"
@@ -443,7 +429,16 @@ export const CompleteMatrix: Story = {
<div style={{ display: 'flex', flexDirection: 'column', gap: 32 }}>
{(['medium', 'small'] as const).map((size) => (
<div key={size}>
<div style={{ marginBottom: 12, fontWeight: 600, fontSize: 14, textTransform: 'uppercase', letterSpacing: 1, color: '#737373' }}>
<div
style={{
marginBottom: 12,
fontWeight: 600,
fontSize: 14,
textTransform: 'uppercase',
letterSpacing: 1,
color: '#737373',
}}
>
Size: {size} ({size === 'medium' ? '48px' : '40px'})
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>

View File

@@ -77,11 +77,15 @@ export const Input = React.forwardRef<HTMLDivElement, InputProps>(
// Prefer convenience icon props; fall back to raw adornment props
const resolvedStart = startIcon ? (
<InputAdornment position="start">{startIcon}</InputAdornment>
) : startAdornment;
) : (
startAdornment
);
const resolvedEnd = endIcon ? (
<InputAdornment position="end">{endIcon}</InputAdornment>
) : endAdornment;
) : (
endAdornment
);
return (
<FormControl
@@ -133,18 +137,19 @@ export const Input = React.forwardRef<HTMLDivElement, InputProps>(
aria-describedby={helperId}
sx={[
// Success border + focus ring (not a native MUI state)
success && !error && {
'& .MuiOutlinedInput-notchedOutline': {
borderColor: 'success.main',
success &&
!error && {
'& .MuiOutlinedInput-notchedOutline': {
borderColor: 'success.main',
},
'&.Mui-focused .MuiOutlinedInput-notchedOutline': {
borderColor: 'success.main',
},
'&.Mui-focused': {
boxShadow: (theme: Theme) =>
`0 0 0 3px ${theme.palette.common.white}, 0 0 0 5px ${theme.palette.success.main}`,
},
},
'&.Mui-focused .MuiOutlinedInput-notchedOutline': {
borderColor: 'success.main',
},
'&.Mui-focused': {
boxShadow: (theme: Theme) =>
`0 0 0 3px ${theme.palette.common.white}, 0 0 0 5px ${theme.palette.success.main}`,
},
},
...(Array.isArray(sx) ? sx : [sx]),
]}
{...props}

View File

@@ -32,15 +32,21 @@ export const UnderlineVariants: Story = {
render: () => (
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
<Link href="#" underline="hover">Hover (default)</Link>
<Link href="#" underline="hover">
Hover (default)
</Link>
<Box sx={{ fontSize: 11, color: 'text.secondary' }}>underline="hover"</Box>
</Box>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
<Link href="#" underline="always">Always underlined</Link>
<Link href="#" underline="always">
Always underlined
</Link>
<Box sx={{ fontSize: 11, color: 'text.secondary' }}>underline="always"</Box>
</Box>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
<Link href="#" underline="none">No underline</Link>
<Link href="#" underline="none">
No underline
</Link>
<Box sx={{ fontSize: 11, color: 'text.secondary' }}>underline="none"</Box>
</Box>
</Box>
@@ -58,13 +64,19 @@ export const ColourVariants: Story = {
<Link href="#">Brand link (default copper, 4.8:1 contrast)</Link>
</Box>
<Box>
<Link href="#" color="text.secondary">Secondary link (neutral grey)</Link>
<Link href="#" color="text.secondary">
Secondary link (neutral grey)
</Link>
</Box>
<Box>
<Link href="#" color="text.primary">Primary text link (charcoal)</Link>
<Link href="#" color="text.primary">
Primary text link (charcoal)
</Link>
</Box>
<Box>
<Link href="#" color="error.main">Error link (red for destructive actions)</Link>
<Link href="#" color="error.main">
Error link (red for destructive actions)
</Link>
</Box>
</Box>
),
@@ -76,12 +88,10 @@ export const ColourVariants: Story = {
export const Inline: Story = {
render: () => (
<Box sx={{ maxWidth: 500, lineHeight: 1.7 }}>
If you need help planning a funeral, our{' '}
<Link href="#">arrangement guide</Link> walks you through each
step. You can also browse our{' '}
<Link href="#">provider directory</Link> to find local funeral
directors, or <Link href="#">contact us</Link> directly for
personalised assistance.
If you need help planning a funeral, our <Link href="#">arrangement guide</Link> walks you
through each step. You can also browse our <Link href="#">provider directory</Link> to find
local funeral directors, or <Link href="#">contact us</Link> directly for personalised
assistance.
</Box>
),
};
@@ -92,9 +102,15 @@ export const Inline: Story = {
export const Navigation: Story = {
render: () => (
<Box sx={{ display: 'flex', gap: 3 }}>
<Link href="#" underline="none" sx={{ fontWeight: 600 }}>FAQ</Link>
<Link href="#" underline="none" sx={{ fontWeight: 600 }}>Contact Us</Link>
<Link href="#" underline="none" sx={{ fontWeight: 600 }}>Log In</Link>
<Link href="#" underline="none" sx={{ fontWeight: 600 }}>
FAQ
</Link>
<Link href="#" underline="none" sx={{ fontWeight: 600 }}>
Contact Us
</Link>
<Link href="#" underline="none" sx={{ fontWeight: 600 }}>
Log In
</Link>
</Box>
),
};
@@ -106,10 +122,18 @@ export const FooterLinks: Story = {
name: 'Footer Links',
render: () => (
<Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap' }}>
<Link href="#" color="text.secondary" variant="body2">Privacy Policy</Link>
<Link href="#" color="text.secondary" variant="body2">Terms of Service</Link>
<Link href="#" color="text.secondary" variant="body2">Accessibility</Link>
<Link href="#" color="text.secondary" variant="body2">Cookie Settings</Link>
<Link href="#" color="text.secondary" variant="body2">
Privacy Policy
</Link>
<Link href="#" color="text.secondary" variant="body2">
Terms of Service
</Link>
<Link href="#" color="text.secondary" variant="body2">
Accessibility
</Link>
<Link href="#" color="text.secondary" variant="body2">
Cookie Settings
</Link>
</Box>
),
};
@@ -121,7 +145,15 @@ export const OnDifferentBackgrounds: Story = {
name: 'On Different Backgrounds',
render: () => (
<Box sx={{ display: 'flex', gap: 3 }}>
<Box sx={{ p: 3, backgroundColor: 'background.default', borderRadius: 1, border: '1px solid', borderColor: 'divider' }}>
<Box
sx={{
p: 3,
backgroundColor: 'background.default',
borderRadius: 1,
border: '1px solid',
borderColor: 'divider',
}}
>
<Box sx={{ fontSize: 11, color: 'text.secondary', mb: 1 }}>White</Box>
<Link href="#">Learn more</Link>
</Box>

View File

@@ -63,7 +63,9 @@ export const Group: Story = {
name: 'Radio Group',
render: () => (
<FormControl>
<Typography variant="label" sx={{ mb: 1 }}>Service type</Typography>
<Typography variant="label" sx={{ mb: 1 }}>
Service type
</Typography>
<RadioGroup defaultValue="chapel">
<FormControlLabel value="chapel" control={<Radio />} label="Chapel ceremony" />
<FormControlLabel value="graveside" control={<Radio />} label="Graveside service" />
@@ -88,14 +90,31 @@ export const CardSelection: Story = {
const [selected, setSelected] = useState('standard');
const options = [
{ value: 'direct', label: 'Direct cremation', desc: 'Simple, dignified cremation with no service.', price: '$1,800' },
{ value: 'standard', label: 'Standard service', desc: 'Traditional chapel ceremony with viewing.', price: '$4,200' },
{ value: 'premium', label: 'Premium service', desc: 'Full service with personalised memorial.', price: '$7,500' },
{
value: 'direct',
label: 'Direct cremation',
desc: 'Simple, dignified cremation with no service.',
price: '$1,800',
},
{
value: 'standard',
label: 'Standard service',
desc: 'Traditional chapel ceremony with viewing.',
price: '$4,200',
},
{
value: 'premium',
label: 'Premium service',
desc: 'Full service with personalised memorial.',
price: '$7,500',
},
];
return (
<Box sx={{ maxWidth: 420 }}>
<Typography variant="h4" sx={{ mb: 2 }}>Choose a package</Typography>
<Typography variant="h4" sx={{ mb: 2 }}>
Choose a package
</Typography>
<RadioGroup value={selected} onChange={(e) => setSelected(e.target.value)}>
{options.map((opt) => (
<Card
@@ -110,11 +129,21 @@ export const CardSelection: Story = {
<Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1 }}>
<Radio value={opt.value} sx={{ mt: -0.5 }} />
<Box sx={{ flex: 1 }}>
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
<Box
sx={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
}}
>
<Typography variant="label">{opt.label}</Typography>
<Typography variant="labelLg" color="primary">{opt.price}</Typography>
<Typography variant="labelLg" color="primary">
{opt.price}
</Typography>
</Box>
<Typography variant="body2" color="text.secondary">{opt.desc}</Typography>
<Typography variant="body2" color="text.secondary">
{opt.desc}
</Typography>
</Box>
</Box>
</Card>
@@ -135,7 +164,9 @@ export const PaymentMethod: Story = {
name: 'Interactive — Payment Method',
render: () => (
<FormControl>
<Typography variant="label" sx={{ mb: 1 }}>Payment method</Typography>
<Typography variant="label" sx={{ mb: 1 }}>
Payment method
</Typography>
<RadioGroup defaultValue="card" row>
<FormControlLabel value="card" control={<Radio />} label="Credit card" />
<FormControlLabel value="bank" control={<Radio />} label="Bank transfer" />

View File

@@ -77,39 +77,84 @@ export const ServiceAddOns: Story = {
};
const items = [
{ key: 'catering' as const, label: 'Catering', desc: 'Light refreshments after the service', price: '$450' },
{ key: 'flowers' as const, label: 'Floral arrangements', desc: 'Seasonal flowers for the chapel', price: '$280' },
{ key: 'music' as const, label: 'Live music', desc: 'Organist or solo musician', price: '$350' },
{ key: 'memorial' as const, label: 'Memorial video', desc: 'Photo slideshow with music', price: '$200' },
{ key: 'guestBook' as const, label: 'Guest book', desc: 'Leather-bound memorial guest book', price: '$85' },
{
key: 'catering' as const,
label: 'Catering',
desc: 'Light refreshments after the service',
price: '$450',
},
{
key: 'flowers' as const,
label: 'Floral arrangements',
desc: 'Seasonal flowers for the chapel',
price: '$280',
},
{
key: 'music' as const,
label: 'Live music',
desc: 'Organist or solo musician',
price: '$350',
},
{
key: 'memorial' as const,
label: 'Memorial video',
desc: 'Photo slideshow with music',
price: '$200',
},
{
key: 'guestBook' as const,
label: 'Guest book',
desc: 'Leather-bound memorial guest book',
price: '$85',
},
];
const total = items.reduce((sum, item) =>
addOns[item.key] ? sum + parseInt(item.price.replace('$', ''), 10) : sum, 0,
const total = items.reduce(
(sum, item) => (addOns[item.key] ? sum + parseInt(item.price.replace('$', ''), 10) : sum),
0,
);
return (
<Box sx={{ maxWidth: 420 }}>
<Typography variant="h4" sx={{ mb: 2 }}>Service add-ons</Typography>
<Typography variant="h4" sx={{ mb: 2 }}>
Service add-ons
</Typography>
<FormGroup>
{items.map((item) => (
<Card key={item.key} variant="outlined" padding="compact" sx={{ mb: 1 }}>
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<Box
sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}
>
<Box sx={{ flex: 1 }}>
<Typography variant="label">{item.label}</Typography>
<Typography variant="body2" color="text.secondary">{item.desc}</Typography>
<Typography variant="body2" color="text.secondary">
{item.desc}
</Typography>
</Box>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
<Typography variant="label" color="text.secondary">{item.price}</Typography>
<Typography variant="label" color="text.secondary">
{item.price}
</Typography>
<Switch checked={addOns[item.key]} onChange={() => toggle(item.key)} />
</Box>
</Box>
</Card>
))}
</FormGroup>
<Box sx={{ display: 'flex', justifyContent: 'space-between', mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>
<Box
sx={{
display: 'flex',
justifyContent: 'space-between',
mt: 2,
pt: 2,
borderTop: 1,
borderColor: 'divider',
}}
>
<Typography variant="labelLg">Total add-ons</Typography>
<Typography variant="labelLg" color="primary">${total}</Typography>
<Typography variant="labelLg" color="primary">
${total}
</Typography>
</Box>
</Box>
);

View File

@@ -16,22 +16,35 @@ const meta: Meta<typeof Typography> = {
variant: {
control: 'select',
options: [
'displayHero', 'display1', 'display2', 'display3', 'displaySm',
'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
'bodyLg', 'body1', 'body2', 'bodyXs',
'labelLg', 'label', 'labelSm',
'caption', 'captionSm',
'overline', 'overlineSm',
'displayHero',
'display1',
'display2',
'display3',
'displaySm',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'bodyLg',
'body1',
'body2',
'bodyXs',
'labelLg',
'label',
'labelSm',
'caption',
'captionSm',
'overline',
'overlineSm',
],
description: 'Typography variant — 21 variants across 6 categories',
table: { defaultValue: { summary: 'body1' } },
},
color: {
control: 'select',
options: [
'textPrimary', 'textSecondary', 'textDisabled',
'primary', 'secondary', 'error',
],
options: ['textPrimary', 'textSecondary', 'textDisabled', 'primary', 'secondary', 'error'],
},
maxLines: { control: 'number' },
gutterBottom: { control: 'boolean' },
@@ -47,7 +60,8 @@ const SAMPLE = 'Discover, Explore, and Plan Funerals in Minutes, Not Hours';
export const Default: Story = {
args: {
children: 'Funeral Arranger helps families find transparent, affordable funeral services across Australia.',
children:
'Funeral Arranger helps families find transparent, affordable funeral services across Australia.',
},
};
@@ -59,23 +73,33 @@ export const Display: Story = {
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
<div>
<Typography variant="captionSm" color="textSecondary">displayHero 80px</Typography>
<Typography variant="captionSm" color="textSecondary">
displayHero 80px
</Typography>
<Typography variant="displayHero">{SAMPLE}</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">display1 64px</Typography>
<Typography variant="captionSm" color="textSecondary">
display1 64px
</Typography>
<Typography variant="display1">{SAMPLE}</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">display2 52px</Typography>
<Typography variant="captionSm" color="textSecondary">
display2 52px
</Typography>
<Typography variant="display2">{SAMPLE}</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">display3 40px</Typography>
<Typography variant="captionSm" color="textSecondary">
display3 40px
</Typography>
<Typography variant="display3">{SAMPLE}</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">displaySm 32px</Typography>
<Typography variant="captionSm" color="textSecondary">
displaySm 32px
</Typography>
<Typography variant="displaySm">{SAMPLE}</Typography>
</div>
</div>
@@ -90,27 +114,39 @@ export const Headings: Story = {
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
<div>
<Typography variant="captionSm" color="textSecondary">h1 36px</Typography>
<Typography variant="captionSm" color="textSecondary">
h1 36px
</Typography>
<Typography variant="h1">{SAMPLE}</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">h2 30px</Typography>
<Typography variant="captionSm" color="textSecondary">
h2 30px
</Typography>
<Typography variant="h2">{SAMPLE}</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">h3 24px</Typography>
<Typography variant="captionSm" color="textSecondary">
h3 24px
</Typography>
<Typography variant="h3">{SAMPLE}</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">h4 20px</Typography>
<Typography variant="captionSm" color="textSecondary">
h4 20px
</Typography>
<Typography variant="h4">{SAMPLE}</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">h5 18px</Typography>
<Typography variant="captionSm" color="textSecondary">
h5 18px
</Typography>
<Typography variant="h5">{SAMPLE}</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">h6 16px</Typography>
<Typography variant="captionSm" color="textSecondary">
h6 16px
</Typography>
<Typography variant="h6">{SAMPLE}</Typography>
</div>
</div>
@@ -125,31 +161,39 @@ export const Body: Story = {
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 16, maxWidth: 640 }}>
<div>
<Typography variant="overline" gutterBottom>bodyLg 18px</Typography>
<Typography variant="overline" gutterBottom>
bodyLg 18px
</Typography>
<Typography variant="bodyLg">
Planning a funeral is one of the most difficult tasks a family faces. Funeral Arranger
is here to help you navigate this process with care and transparency.
Planning a funeral is one of the most difficult tasks a family faces. Funeral Arranger is
here to help you navigate this process with care and transparency.
</Typography>
</div>
<div>
<Typography variant="overline" gutterBottom>body1 (default) 16px</Typography>
<Typography variant="overline" gutterBottom>
body1 (default) 16px
</Typography>
<Typography variant="body1">
Compare funeral directors in your area, view transparent pricing, and make informed
decisions at your own pace. Every family deserves clarity during this time.
</Typography>
</div>
<div>
<Typography variant="overline" gutterBottom>body2 (small) 14px</Typography>
<Typography variant="overline" gutterBottom>
body2 (small) 14px
</Typography>
<Typography variant="body2">
Prices shown are indicative and may vary based on your specific requirements.
Contact the funeral director directly for a detailed quote.
Prices shown are indicative and may vary based on your specific requirements. Contact the
funeral director directly for a detailed quote.
</Typography>
</div>
<div>
<Typography variant="overline" gutterBottom>bodyXs 12px</Typography>
<Typography variant="overline" gutterBottom>
bodyXs 12px
</Typography>
<Typography variant="bodyXs">
Terms and conditions apply. Funeral Arranger is a comparison service and does not
directly provide funeral services. ABN 12 345 678 901.
Terms and conditions apply. Funeral Arranger is a comparison service and does not directly
provide funeral services. ABN 12 345 678 901.
</Typography>
</div>
</div>
@@ -164,32 +208,60 @@ export const UIText: Story = {
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
<div>
<Typography variant="captionSm" color="textSecondary">labelLg 16px medium</Typography>
<Typography variant="labelLg" display="block">Form label or section label</Typography>
<Typography variant="captionSm" color="textSecondary">
labelLg 16px medium
</Typography>
<Typography variant="labelLg" display="block">
Form label or section label
</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">label 14px medium</Typography>
<Typography variant="label" display="block">Default form label</Typography>
<Typography variant="captionSm" color="textSecondary">
label 14px medium
</Typography>
<Typography variant="label" display="block">
Default form label
</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">labelSm 12px medium</Typography>
<Typography variant="labelSm" display="block">Compact label or tag text</Typography>
<Typography variant="captionSm" color="textSecondary">
labelSm 12px medium
</Typography>
<Typography variant="labelSm" display="block">
Compact label or tag text
</Typography>
</div>
<div style={{ marginTop: 8 }}>
<Typography variant="captionSm" color="textSecondary">caption 12px regular</Typography>
<Typography variant="caption" display="block">Fine print, timestamps, metadata</Typography>
<Typography variant="captionSm" color="textSecondary">
caption 12px regular
</Typography>
<Typography variant="caption" display="block">
Fine print, timestamps, metadata
</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">captionSm 11px regular</Typography>
<Typography variant="captionSm" display="block">Compact metadata, footnotes</Typography>
<Typography variant="captionSm" color="textSecondary">
captionSm 11px regular
</Typography>
<Typography variant="captionSm" display="block">
Compact metadata, footnotes
</Typography>
</div>
<div style={{ marginTop: 8 }}>
<Typography variant="captionSm" color="textSecondary">overline 12px semibold uppercase</Typography>
<Typography variant="overline" display="block">Section overline</Typography>
<Typography variant="captionSm" color="textSecondary">
overline 12px semibold uppercase
</Typography>
<Typography variant="overline" display="block">
Section overline
</Typography>
</div>
<div>
<Typography variant="captionSm" color="textSecondary">overlineSm 11px semibold uppercase</Typography>
<Typography variant="overlineSm" display="block">Compact overline</Typography>
<Typography variant="captionSm" color="textSecondary">
overlineSm 11px semibold uppercase
</Typography>
<Typography variant="overlineSm" display="block">
Compact overline
</Typography>
</div>
</div>
),
@@ -222,20 +294,25 @@ export const FontFamilies: Story = {
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 24 }}>
<div>
<Typography variant="overline" gutterBottom>Display font Noto Serif SC (Regular 400)</Typography>
<Typography variant="display3">
Warm, trustworthy, and professional
<Typography variant="overline" gutterBottom>
Display font Noto Serif SC (Regular 400)
</Typography>
<Typography variant="display3">Warm, trustworthy, and professional</Typography>
<Typography variant="caption" color="textSecondary" sx={{ mt: 1 }}>
Used exclusively for display variants (hero through sm). Regular weight serif carries inherent visual weight at large sizes.
Used exclusively for display variants (hero through sm). Regular weight serif carries
inherent visual weight at large sizes.
</Typography>
</div>
<div>
<Typography variant="overline" gutterBottom>Body font Montserrat</Typography>
<Typography variant="h3" gutterBottom>Clean, modern, and highly readable</Typography>
<Typography variant="overline" gutterBottom>
Body font Montserrat
</Typography>
<Typography variant="h3" gutterBottom>
Clean, modern, and highly readable
</Typography>
<Typography>
Used for all headings (h1h6), body text, labels, captions, and UI elements.
Headings use Bold (700), body uses Medium (500), captions use Regular (400).
Used for all headings (h1h6), body text, labels, captions, and UI elements. Headings use
Bold (700), body uses Medium (500), captions use Regular (400).
</Typography>
</div>
</div>
@@ -249,18 +326,21 @@ export const MaxLines: Story = {
render: () => (
<div style={{ display: 'flex', flexDirection: 'column', gap: 24, maxWidth: 400 }}>
<div>
<Typography variant="label" gutterBottom>maxLines=1</Typography>
<Typography variant="label" gutterBottom>
maxLines=1
</Typography>
<Typography maxLines={1}>
H. Parsons Funeral Directors trusted by Australian families for over 30 years,
providing compassionate and transparent funeral services.
H. Parsons Funeral Directors trusted by Australian families for over 30 years, providing
compassionate and transparent funeral services.
</Typography>
</div>
<div>
<Typography variant="label" gutterBottom>maxLines=2</Typography>
<Typography variant="label" gutterBottom>
maxLines=2
</Typography>
<Typography maxLines={2}>
H. Parsons Funeral Directors trusted by Australian families for over 30 years,
providing compassionate and transparent funeral services across metropolitan
and regional areas.
H. Parsons Funeral Directors trusted by Australian families for over 30 years, providing
compassionate and transparent funeral services across metropolitan and regional areas.
</Typography>
</div>
</div>
@@ -276,23 +356,27 @@ export const RealisticContent: Story = {
<Typography variant="overline">Funeral planning</Typography>
<Typography variant="display3">Compare funeral services in your area</Typography>
<Typography variant="bodyLg" color="textSecondary">
Transparent pricing and service comparison to help you make informed
decisions during a difficult time.
Transparent pricing and service comparison to help you make informed decisions during a
difficult time.
</Typography>
<Typography variant="h2" sx={{ mt: 2 }}>How it works</Typography>
<Typography>
Enter your suburb or postcode to find funeral directors near you. Each
listing includes a full price breakdown, service inclusions, and reviews
from families who have used their services.
<Typography variant="h2" sx={{ mt: 2 }}>
How it works
</Typography>
<Typography variant="h3" sx={{ mt: 1 }}>Step 1: Browse packages</Typography>
<Typography>
Compare packages side by side. Each package clearly shows what is and
isn't included, so there are no surprises.
Enter your suburb or postcode to find funeral directors near you. Each listing includes a
full price breakdown, service inclusions, and reviews from families who have used their
services.
</Typography>
<Typography variant="h3" sx={{ mt: 1 }}>
Step 1: Browse packages
</Typography>
<Typography>
Compare packages side by side. Each package clearly shows what is and isn't included, so
there are no surprises.
</Typography>
<Typography variant="caption" color="textSecondary" sx={{ mt: 2 }}>
Prices are indicative and current as of March 2026. Contact the funeral
director for a binding quote.
Prices are indicative and current as of March 2026. Contact the funeral director for a
binding quote.
</Typography>
</div>
),
@@ -333,7 +417,11 @@ export const CompleteScale: Story = {
<div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
{variants.map(({ variant, label }) => (
<div key={variant} style={{ display: 'flex', alignItems: 'baseline', gap: 16 }}>
<Typography variant="captionSm" color="textSecondary" sx={{ width: 160, flexShrink: 0, textAlign: 'right' }}>
<Typography
variant="captionSm"
color="textSecondary"
sx={{ width: 160, flexShrink: 0, textAlign: 'right' }}
>
{label}
</Typography>
<Typography variant={variant}>{SAMPLE}</Typography>