Reusable blocks
Components
Drop-in components built on framework tokens. Tone + size variants where they matter. For raw color / spacing / type tokens, see Style guide.
Navigation 2
Sections 6
Hero
Props: eyebrow?, title, lede?,
align: "start" | "center", tone: "default" | "dark" | "brand".
Slot: actions.
tone="default" · align="start"
Default hero
A starter you can actually launch from.
Opinionated defaults, OKLCH color engine, fluid type. Edit override.scss, you're done.
tone="brand" · align="center"
Brand tone
Build something worth shipping.
Primary ultra-light background, rounded corners, generous padding.
tone="dark" · align="center"
Dark tone
For high-contrast moments.
Neutral ultra-dark background, primary-light eyebrow, inverted text.
CTA
Props: title, body?,
tone: "default" | "brand" | "dark" | "accent",
align: "start" | "center". Slot: actions.
tone="default"
tone="brand"
Make it yours in minutes.
Tune brand colors in override.scss — the whole palette rebuilds via OKLCH.
tone="accent"
Got feedback?
Tell us what's missing — hakbase grows from real project feedback.
tone="dark"
Still reading?
Clone the repo and see how little configuration it takes to ship something clean.
Feature grid
Props: features (array of {icon?, title, body}),
columns: 2 | 3 | 4, align: "start" | "center",
tone: "default" | "muted".
columns=3 · align="start"
OKLCH palette
10 families × 8 shades, generated perceptually uniform from hue alone.
Fluid scale
Spacing + type interpolate between mobile and desktop via clamp().
One file tuning
Edit override.scss, the whole system rebuilds. Framework file stays untouched.
columns=3 · align="center" · tone="muted"
OKLCH palette
10 families × 8 shades, generated perceptually uniform from hue alone.
Fluid scale
Spacing + type interpolate between mobile and desktop via clamp().
One file tuning
Edit override.scss, the whole system rebuilds. Framework file stays untouched.
Astro native
SCSS compiled by Astro — no extra build step, no runtime CSS-in-JS.
Dark mode
Flip the palette via [data-theme='dark']. All components follow automatically.
Three layers
framework.scss upstream; override.scss is your tuning surface; base.scss is opt-in reset.
columns=4
OKLCH palette
10 families × 8 shades, generated perceptually uniform from hue alone.
Fluid scale
Spacing + type interpolate between mobile and desktop via clamp().
One file tuning
Edit override.scss, the whole system rebuilds. Framework file stays untouched.
Astro native
SCSS compiled by Astro — no extra build step, no runtime CSS-in-JS.
Stats
Props: stats (array of {value, label, hint?}),
columns: 2 | 3 | 4, align: "start" | "center",
tone: "default" | "muted". Uses <dl>/<dt>/<dd> + tabular-nums for aligned values.
columns=4 · align="start"
- Color tokens
- 10×8
- Body baseline
- 18px
- Framework
- 0.5.0
- Runtime CSS
- 0ms
Families × shades generated from hue + lightness + chroma.
Fluid to 16px on mobile. Type scale 1.25 / 1.2.
SemVer versioned; changelog in /css-framework.
Static SCSS → plain CSS. Zero CSS-in-JS overhead.
columns=4 · align="center" · tone="muted"
- Color tokens
- 10×8
- Body baseline
- 18px
- Framework
- 0.5.0
- Runtime CSS
- 0ms
Families × shades generated from hue + lightness + chroma.
Fluid to 16px on mobile. Type scale 1.25 / 1.2.
SemVer versioned; changelog in /css-framework.
Static SCSS → plain CSS. Zero CSS-in-JS overhead.
Testimonial
Props: quote, author, role?,
avatar?, tone: "default" | "muted" | "brand" | "dark".
tone="default"
The OKLCH palette is the cleanest color system I've shipped against. Edit one hue, the whole palette re-derives.
tone="brand"
Fluid type and spacing out of the box. I stopped writing media queries and started writing features.
tone="dark"
Clone, tune override.scss, push. First marketing site of the year that didn't turn into a config swamp.
Logo cloud
Props: title?, logos (array of {name, src?, href?}),
align: "start" | "center", tone: "default" | "muted".
Text fallback when src omitted.
align="center"
Trusted by teams at
- Acme
- Corta
- Nimbus
- Folio
- Relay
- Pilot
align="start" · tone="muted"
Powering product launches
- Acme
- Corta
- Nimbus
- Folio
- Relay
- Pilot
Content 3
Card
Props: eyebrow?, title?, href?,
tone: "default" | "muted" | "brand",
padding: "md" | "lg". Slots: default (body), media.
Default trio
Guide
Getting started
Clone hakbase, run npm install, tune override.scss, and you're shipping.
Reference
Style guide
Every token live-rendered — colors, spacing, type, radius, and primitives.
Framework
Three layers
framework.scss is upstream. override.scss is yours. base.scss is opt-in.
tone="brand" · pad-lg
Launch
Ready when you are
Primary-tinted card for emphasis. Use sparingly — hero piece of a grid.
Accordion
Props: items (array of {question, answer}),
exclusive? (only one item open at a time — native <details name> group, Chromium 120+/Safari 17+).
Uses native <details> so it works without JS.
default (independent)
Can I use a different font?
Yes — swap the @font-face block in main.scss and update the $font-family-* tokens. The framework itself is font-agnostic.
How do I customize the palette?
Set your brand hues in the $color-bases map in override.scss. Each family generates a full 8-shade scale from a single hue, lightness, and chroma in OKLCH.
Do I style each component twice for dark mode?
No. [data-theme="dark"] flips the whole shade palette; any component that uses palette tokens follows automatically — no per-component overrides required.
What do I change when cloning hakbase?
Rename the Astro package, edit override.scss for your brand, build pages under src/pages, and point a deploy webhook at main. That's the whole setup.
exclusive=true
Can I use a different font?
Yes — swap the @font-face block in main.scss and update the $font-family-* tokens. The framework itself is font-agnostic.
How do I customize the palette?
Set your brand hues in the $color-bases map in override.scss. Each family generates a full 8-shade scale from a single hue, lightness, and chroma in OKLCH.
Do I style each component twice for dark mode?
No. [data-theme="dark"] flips the whole shade palette; any component that uses palette tokens follows automatically — no per-component overrides required.
What do I change when cloning hakbase?
Rename the Astro package, edit override.scss for your brand, build pages under src/pages, and point a deploy webhook at main. That's the whole setup.
Alert
Props: variant: "info" | "success" | "warning" | "danger",
title?, icon? (overrides default glyph).
Renders with role="alert" for warning/danger, role="status" for info/success.
All four variants
Heads up
This is an info alert. Uses role="status" so screen readers announce it politely.
Deploy complete
Your site is live.
Pending action
Framework 0.5.0 changed the default palette. Review your override.scss.
Build failed
SCSS compilation errored at framework.scss:352. Check the CI logs.
Title only (no body)
Framework version 0.5.0 is live.
All systems operational.
Primitives 3
Badge
Props: variant (9 families, all soft by default),
size: "sm" | "md", solid?.
Soft (default) — 9 variants
Solid
Sizes
Divider
Props: label?, align: "start" | "center" | "end",
spacing: "sm" | "md" | "lg". Without a label, renders a plain <hr>.
Plain
Text above the rule.
Text below the rule.
With label — align="center"
Some content.
More content.
align="start"