Guide
Documentation
Template Docs
Everything in the components library, explained. Copy/paste props, see small demos, and jump to the full /components-library page for live previews.
Utilities
Typography classes
.heading--xl
, .heading--l
, .heading
, .heading--s
.subheading--l
, .subheading
, .subheading--s
.eyebrow
.body--xl
, .body--l
, .body
, .body--s
, .body--xs
Color utilities
Backgrounds:
Text:
.bg-primary
, .bg-secondary
, .bg-dark
, .bg-light
, .bg-accent
, .bg-white
, .bg-off-white
Text:
.text-primary
, .text-secondary
, .text-dark
, .text-light
, .text-accent
, .text-white
, .text-off-white
Buttons
Use
Themes:
.button
+ size + theme. Sizes: .btn--s
, .btn
, .btn--l
.Themes:
.btn-primary
, .btn-secondary
, .btn-primary--outline
, .btn-secondary--outline
.Layout
.container
centers content with max-width..row
+ .col
builds grids..box
is a padded surface for component content.Responsive mixins available in SCSS:
@include mobile { ... }
and @include desktop { ... }
.Hero
Full-bleed hero with image or video background.
Props
Prop | Type | Default | Notes |
---|---|---|---|
bgType | 'image' | 'video' | 'image' | Select background type. |
imageUrl | string | - | Required for bgType="image" . |
imageAlt | string | - | Alt text for image background. |
videoSrc | string | - | Local MP4 recommended; autoplay/muted/loop/playsInline handled in component. |
videoPoster | string | - | Poster image for video. |
overlay | boolean | false | Adds a dark overlay for contrast. |
overlayOpacity | number (0–1) | 0.35 | Overlay strength. |
overline | string | - | Small text above heading. |
heading | string | - | Main heading text. |
body | string | - | Supporting copy. |
button | { label, link, theme, size } | - | Primary CTA. |
align | 'left' | 'center' | 'right' | 'left' | Text/content alignment. |
Minimal Demo
MediaBlock
Split layout with image/video on one side and text/buttons on the other.
Props
Prop | Type | Default | Notes |
---|---|---|---|
imageUrl | string | - | Media image URL. |
imageAlt | string | - | Alt text (if implemented in your component). |
eyebrow | string | - | Small label above heading. |
heading | string | - | Section heading. |
body | string | - | Copy text. |
isReversed | boolean | false | Swap media/text sides. |
buttons | Array<{label, link, theme, size?}> | [] | CTA buttons. |
Minimal Demo
VideoBlock
Lightweight YouTube embed with optional custom thumbnail.
Props
Prop | Type | Default | Notes |
---|---|---|---|
youTubeUrl | string | - | Full YouTube URL. |
thumbnailUrl | string | auto | Optional explicit thumbnail. |
playIconUrl | string | built-in | Optional custom play icon. |
Minimal Demo
Waypoint
IntersectionObserver wrapper. Adds/removes classes and triggers callbacks as its child enters/leaves the viewport. Useful for color swaps, counters, lazy mounting, sticky CTAs, progress dots, etc.
Props
Prop | Type | Default | Notes |
---|---|---|---|
threshold | number (0–1) | 0.5 | Percent of target visible to trigger. |
activeClass | string | '' | Class added when intersecting. |
inactiveClass | string | '' | Class added when not intersecting. |
onEnter | () => void | - | Callback when entering. |
onExit | () => void | - | Callback when leaving. |
Pattern
<Waypoint threshold={0.75} activeClass="bg-white" inactiveClass="bg-off-white" onEnter={() => console.log('entered')} onExit={() => console.log('left')} > <div className="box bg-off-white"> {/* content to color-swap / animate */} </div> </Waypoint>
Modals
TextModal and VideoModal share the same trigger/close API.
TextModal Props
Prop | Type | Default | Notes |
---|---|---|---|
triggerLabel | string | 'Open' | Button text. |
triggerTheme | string | 'btn-primary' | Button theme class. |
triggerSize | string | 'btn' | Button size class. |
title | string | - | Modal title. |
body | string | - | Modal content text. |
closeLabel | string | 'Close' | Close button text. |
closeTheme | string | 'btn-primary' | Close button theme. |
closeSize | string | 'btn--s' | Close button size. |
TextModal Demo
VideoModal Demo
FAQ
Accordion with single-open or multi-open modes.
Props
Prop | Type | Default | Notes |
---|---|---|---|
allowMultiple | boolean | false | Allow multiple items open simultaneously. |
defaultOpen | number[] | [] | Indices to open initially. |
items | Array<{question, answer}> | [] | FAQ content. |
Yes—client work and personal projects are fine.
See the components library at /components-library.
Card
Single content card with image, text, and CTA.
Props
Prop | Type | Default | Notes |
---|---|---|---|
imageUrl | string | - | Card image. |
eyebrow | string | - | Small label. |
heading | string | - | Card title. |
body | string | - | Description. |
button | { label, href, theme, size } | - | CTA. |
CardRow (slider)
Horizontal slider. Display 3-up, slide by N, with optional dots.
Props
Prop | Type | Default | Notes |
---|---|---|---|
items | Array<CardProps> | [] | Cards to render. |
perPage | number | 3 | Cards visible at once. |
slideBy | number | 3 | Cards to move per slide. |
showDots | boolean | false | Enable pagination dots. |
buttonThemeOverride | string | undefined | Force a single button theme for all cards. |
CardGrid
Responsive grid with initial/step/max and an optional Load More.
Props
Prop | Type | Default | Notes |
---|---|---|---|
items | Array<CardProps> | [] | Cards to render. |
initial | number | 6 | Cards shown initially. |
step | number | 3 | Cards added per click. |
max | number | Infinity | Hard cap on items shown. |
showLoadMore | boolean | true | Toggle the Load More button. |
align | 'left' | 'center' | 'left' | Grid alignment. |
buttonThemeOverride | string | undefined | Force a single button theme for all cards. |
Release
v1.0
Guide
Theming
Case