FA Design System
This is the living design system specification. It is the primary reference for
all agents when creating tokens, components, or compositions.
This file will be updated progressively as the system is built.
Brand context
Funeral Arranger is an Australian online funeral planning platform. It connects
families with funeral directors and provides transparent pricing and service
comparison. The design must:
- Feel warm and trustworthy — families are often in grief or distress
- Prioritise clarity — reduce cognitive load, no visual noise
- Be transparent — pricing, options, and processes should feel open
- Respect cultural sensitivity — serve diverse Australian communities
- Be accessible — WCAG 2.1 AA minimum across all components
Brand colours
Primary palette — Brand (warm gold/copper)
Derived from Parsons brand swatches. The warm gold family conveys trust and warmth.
| Step |
Token |
Value |
Usage |
| 50 |
color.brand.50 |
#FEF9F5 |
Warm section backgrounds |
| 100 |
color.brand.100 |
#F7ECDF |
Hover backgrounds, subtle fills |
| 200 |
color.brand.200 |
#EBDAC8 |
Secondary backgrounds |
| 300 |
color.brand.300 |
#D8C3B5 |
Surface warmth, card tints |
| 400 |
color.brand.400 |
#D0A070 |
Secondary interactive, step indicators |
| 500 |
color.brand.500 |
#BA834E |
Primary CTA, main interactive |
| 600 |
color.brand.600 |
#B0610F |
Hover/emphasis, brand links (4.8:1 on white) |
| 700 |
color.brand.700 |
#8B4E0D |
Active states, brand text (6.7:1 on white) |
| 800 |
color.brand.800 |
#6B3C13 |
Bold brand accents |
| 900 |
color.brand.900 |
#51301B |
Deep emphasis, dark brand surfaces |
| 950 |
color.brand.950 |
#251913 |
Darkest brand tone |
Secondary palette — Sage (cool grey-green)
Calming, professional secondary palette for the funeral services context.
| Step |
Token |
Value |
Usage |
| 50 |
color.sage.50 |
#F2F5F6 |
Cool section backgrounds |
| 200 |
color.sage.200 |
#D7E1E2 |
Light cool surfaces |
| 400 |
color.sage.400 |
#B9C7C9 |
Mid sage accents |
| 700 |
color.sage.700 |
#4C5B6B |
Secondary buttons, dark accents (6.1:1 on white) |
| 800 |
color.sage.800 |
#4C5459 |
Supplementary text (6.7:1 on white) |
Neutral palette
True grey for text, borders, and UI chrome. Cool-tinted charcoal (#2C2E35) for primary text.
| Step |
Token |
Value |
Usage |
| 50 |
color.neutral.50 |
#FAFAFA |
Page background alternative |
| 100 |
color.neutral.100 |
#F5F5F5 |
Subtle backgrounds |
| 200 |
color.neutral.200 |
#E8E8E8 |
Borders, dividers |
| 300 |
color.neutral.300 |
#D4D4D4 |
Disabled borders |
| 400 |
color.neutral.400 |
#A3A3A3 |
Placeholder text, disabled content |
| 500 |
color.neutral.500 |
#737373 |
Tertiary text, icons |
| 600 |
color.neutral.600 |
#525252 |
Secondary text (7.1:1 on white) |
| 700 |
color.neutral.700 |
#404040 |
Strong text (9.7:1 on white) |
| 800 |
color.neutral.800 |
#2C2E35 |
Primary text colour (13.2:1 on white) |
| 900 |
color.neutral.900 |
#1A1A1C |
Maximum contrast |
Feedback colours
| Type |
Token |
Value |
Background token |
Background value |
| Success |
color.feedback.success |
#3B7A3B (green.600) |
color.feedback.success-subtle |
#F0F7F0 |
| Warning |
color.feedback.warning |
#CC8500 (amber.600) |
color.feedback.warning-subtle |
#FFF9EB |
| Error |
color.feedback.error |
#BC2F2F (red.600) |
color.feedback.error-subtle |
#FEF2F2 |
| Info |
color.feedback.info |
#2563EB (blue.600) |
color.feedback.info-subtle |
#EFF6FF |
Typography
Font stack
| Role |
Family |
Fallback |
Weight range |
| Display/Headings (H1-H2) |
Noto Serif SC |
Georgia, Times New Roman, serif |
600-700 |
| Body/Headings (H3+) |
Montserrat |
Helvetica Neue, Arial, sans-serif |
400-700 |
| Mono |
JetBrains Mono |
Fira Code, Consolas, monospace |
400 |
Type scale
| Role |
Size |
Line height |
Weight |
Letter spacing |
Token |
| Display |
36px |
44px |
700 |
-0.02em |
typography.display |
| H1 |
30px |
38px |
700 |
-0.01em |
typography.h1 |
| H2 |
24px |
32px |
600 |
0 |
typography.h2 |
| H3 |
20px |
28px |
600 |
0 |
typography.h3 |
| H4 |
18px |
24px |
600 |
0 |
typography.h4 |
| Body Large |
18px |
28px |
400 |
0 |
typography.bodyLarge |
| Body |
16px |
24px |
400 |
0 |
typography.body |
| Body Small |
14px |
20px |
400 |
0 |
typography.bodySmall |
| Caption |
12px |
16px |
400 |
0.02em |
typography.caption |
| Label |
14px |
20px |
500 |
0.01em |
typography.label |
| Overline |
12px |
16px |
600 |
0.08em |
typography.overline |
Spacing system
Base unit: 4px. All spacing values are multiples of 4.
| Token |
Value |
Typical usage |
| spacing.0.5 |
2px |
Hairline gaps (icon-to-text tight) |
| spacing.1 |
4px |
Tight inline spacing |
| spacing.2 |
8px |
Related element gap, small padding |
| spacing.3 |
12px |
Component internal padding (small) |
| spacing.4 |
16px |
Component internal padding (default), form field gap |
| spacing.5 |
20px |
Medium component spacing |
| spacing.6 |
24px |
Card padding, section gap (small) |
| spacing.8 |
32px |
Section gap (medium) |
| spacing.10 |
40px |
Section gap (large) |
| spacing.12 |
48px |
Page section separation |
| spacing.16 |
64px |
Hero/banner vertical spacing |
| spacing.20 |
80px |
Major page sections |
Border radius
| Token |
Value |
Usage |
| borderRadius.none |
0px |
Square corners (tables, dividers) |
| borderRadius.sm |
4px |
Inputs, small interactive elements |
| borderRadius.md |
8px |
Cards, buttons, dropdowns |
| borderRadius.lg |
12px |
Modals, large cards |
| borderRadius.xl |
16px |
Feature cards, hero elements |
| borderRadius.full |
9999px |
Pills, avatars, circular elements |
Shadows
| Token |
Value |
Usage |
| shadow.sm |
0 1px 2px rgba(0,0,0,0.05) |
Subtle lift (buttons on hover) |
| shadow.md |
0 4px 6px rgba(0,0,0,0.07) |
Cards, dropdowns |
| shadow.lg |
0 10px 15px rgba(0,0,0,0.1) |
Modals, popovers |
| shadow.xl |
0 20px 25px rgba(0,0,0,0.1) |
Elevated panels |
Responsive breakpoints
| Name |
Value |
Target |
| xs |
0px |
Mobile portrait |
| sm |
600px |
Mobile landscape / small tablet |
| md |
900px |
Tablet |
| lg |
1200px |
Desktop |
| xl |
1536px |
Large desktop |
Layout conventions
- Max content width: 1200px (
Container maxWidth="lg")
- Page horizontal padding:
spacing.4 (mobile), spacing.8 (desktop)
- Section vertical spacing:
spacing.12
- Card grid gutter:
spacing.4 (mobile), spacing.6 (desktop)
Component conventions
Interactive elements
- Minimum touch target: 44px height on mobile
- Focus-visible outline: 2px solid
color.interactive.default, 2px offset
- Hover transition: 150ms ease-in-out
- Active state: slightly darkened background (5-10%)
- Disabled: 40% opacity, no pointer events
Cards
- Border radius:
borderRadius.md (8px)
- Internal padding:
spacing.4 (mobile), spacing.6 (desktop)
- Shadow:
shadow.md by default, shadow.lg on hover
- Price displays: use Display or H2 typography with brand primary colour
Forms
- Labels above inputs, using Label typography
- Helper text below inputs, using Caption typography in
color.text.secondary
- Error text replaces helper text in
color.feedback.error
- Input height: 44px (matching button medium height)
- Field gap:
spacing.4 (16px)
- Section gap within forms:
spacing.8 (32px)