Template

Style guide. Every token on one page.

The colors, type, buttons and elements that build every Basalt page. Each one maps to a global class or CSS variable.

Color variables
10 base, 12 semantic
Typefaces
3 Google fonts
Breakpoints
991 / 767 / 479

Colors

Base colors are CSS variables at the top of src/styles/template.css. Semantic tokens point at them, so a change to one base color updates every surface that uses it.

Base

--color--neutral-950
#0A0A0B
--color--neutral-900
#111113
--color--neutral-850
#17171A
--color--neutral-800
#202024
--color--neutral-600
#5C5C63
--color--neutral-500
#7A7A81
--color--neutral-300
#B4B4B9
--color--neutral-100
#EDEDEA
--color--white
#FFFFFF
--color--green-300
#9FD4A8

Semantic

--background--primary
neutral-950 · #0A0A0B
--background--secondary
neutral-900 · #111113
--background--tertiary
neutral-850 · #17171A
--background--chip
neutral-800 · #202024
--text--primary
neutral-100 · #EDEDEA
--text--secondary
neutral-300 · #B4B4B9
--text--muted
neutral-500 · #7A7A81
--border--primary
rgba(237,237,234,.08)
--border--secondary
rgba(237,237,234,.15)
--border--rail
rgba(237,237,234,.045)
--border--mark
rgba(237,237,234,.4)
--status--live
green-300 · #9FD4A8

Typography

Headings
Fraunces

Weight 360, opsz 72, SOFT 0, WONK 0, tracking -0.02em. Used by H1 to H3 and statements.

Body
Inter Tight

Weights 400 to 700. Body copy, H4, navigation, FAQ triggers and tables.

Labels
Martian Mono

Uppercase at 87.5% width. Eyebrows, tags, buttons, form labels and metadata.

heading-style-h1
5.75rem / 94% · Fraunces

Molten streams.

heading-style-h2
3.75rem / 100% · Fraunces

Three plans, one engine.

heading-style-h3
2.375rem / 104% · Fraunces

Joins that never go stale

heading-style-h4
1.5rem / 120% · Inter Tight 500

CDC from Postgres in four minutes

text-statement
2.5rem / 116% · Fraunces 340

Basalt forms when lava cools fast. Your data should set just as quickly.

text-size-large
1.25rem / 150%

Event streams become typed, joined, queryable tables in milliseconds.

text-size-medium
1.0625rem / 155%

Every materialized view keeps its lineage, so you can trace a number back to the event that changed it.

text-size-regular
0.9375rem / 155%

Time travel lets you query any table as it stood at any second in the last 30 days.

text-size-small
0.875rem / 150%

Runs in 38 regions. p99 query latency under 5 ms on Scale.

text-style-mono
0.6875rem / 140% · Martian Mono
Events / second · eu-north-1

Buttons

One size for every button. Use the primary for the main action and the secondary for everything beside it.

Button is-inverseOn light cards, such as the featured pricing plan

Elements

Labels

Eyebrow
Tag Tag is-solid Status dot · live

Card and line system

card corner-frame
01

Square corners with four bracket marks drawn by the corner-frame combo class.

--c: status--live
02

Set the --c custom property on the element to recolor its corner marks.

section-line · ┌ ┐ marks where the rails meet the top border

Form fields

Message sent · an engineer replies within 4 business hours
Couldn't send · try again or write to hello@example.com

FAQ item

An IX3 click interaction on faq_trigger toggles the is-open class on its faq_item. CSS animates the row height and turns the plus into a minus.

Table

Regionp99 latencyStatus
Europe
eu-north-1 · Reykjavík3.8 msLive
eu-west-2 · London4.1 msLive
Americas
us-east-1 · Virginia4.4 msLive

Grid & spacing

All content sits inside two vertical rails. The rail width is the container width, so every section, card and line shares the same edges.

Token / classDesktop991px767px
--rail--widthmin(80rem, 100vw − 2 × gutter)
--site--max (container-large)80rem80rem80rem
--site--gutter (padding-global)2.5rem2rem0.75rem
--rail--pad (inside the rails)2.5rem1.75rem1rem
--nav--height4.5rem4.5rem4rem
padding-section-large10rem8rem6rem
padding-section-medium7rem5.5rem4.5rem
grid-2 / grid-3 / grid-42 / 3 / 4 cols2 / 2 / 2 cols1 col
Tablet · 991px Mobile landscape · 767px Mobile portrait · 479px