Styleguide

The design decisions behind the 2026 pages, the home and contact sales. Everything here is built from the live classes and tokens: if something looks wrong on this page, it is wrong on the site too.

Updated 1 Oct 2026 · Tokens: Variables › folk 2026 · Previous guide: /style-guide-old

Principles

The rules every page follows. When a new case comes up, it gets solved inside these, not around them.

01 Native first
Client-First · Variables

Client-First class names, Webflow Variables and Designer controls. Custom code only for what the Designer cannot express (:has, :checked, autofill, keyframes), kept in the page head and commented.

02 Padding and gap
no margins

Vertical rhythm is padding on the section, never margin between sections. Inside a section, space is a flex or grid gap, never margin-bottom. Every text class resets its top and bottom margin to 0, or Webflow's default heading and paragraph margins leak in.

03 Units
px · rem · ch · em

px only for borders and shadows, which are decoration. rem for type, padding and gaps, so they grow with the reader's font size. ch for reading measure (max-width-text is 60ch). Letter-spacing in em, so tracking scales with the type.

04 Type per breakpoint
no clamp()

Sizes are set per breakpoint in the Designer (desktop, tablet, mobile), never with clamp(). What you see in a breakpoint is exactly what ships.

05 Text says how, layout says where
section-header.is-center

Text classes own font, size and colour. Alignment and width come from the container: the same heading-style-h1 is centred on the home (inside section-header.is-center) and left-aligned on contact sales.

06 Black hairlines
border/hairline #21201c

Every rule is near-black, never grey; grey rules read as missing. border/subtle is only for panel edges.

07 Combos for one-offs
heading-style-h1.is-tight

A page-specific tweak becomes a combo class, so the shared class stays untouched everywhere else. Name the combo after what it does (is-line, is-full, is-tight), and rename it when that changes.

08 Never hijack scroll
no pin · snap · step

No pinned stages, scroll-snap or wheel steppers. Motion only styles content that scrolls normally; native CSS sticky is allowed because the reader still drives it.

Colour

Semantic tokens in the folk 2026 collection. Most alias the legacy default collection, so each hex value lives in one place. The ui/* tokens are for the product mockups only and never style the page.

Text
text-size-regular is always text/primary
text/primary
black at 89%
text/secondary
black at 63% · placeholders, notes
text/muted
#8d8d8d
Surface
warm greys, never cool
surface/page
white
surface/subtle
#fcfcfc
surface/card
#f4f2f0 · media panels
surface/chip
#e7e3df · hover, logo tiles
Border
rules = hairline
border/hairline
#21201c · every rule
border/subtle
#e4e4e4 · panel edges only
border/strong
#d4d4d4
border/warm
rgba(133,111,90,.4) · cards
Brand
accents, sparingly
brand/blue
#94c4ff
brand/purple
#c1aaf9
brand/orange
#ffc53d
brand/green
#bdee63
Tint
media bands, card hovers
tint/blue
#c3d3d6 · Capture
tint/pink
#d8c0d0 · Enrich
tint/cream
#c9c9a8 · Track
tint/sand
#cfc4a6 · Outreach
tint/peach
Call
tint/dark
#0a0a0a · hero band

Typography

Three families, one scale. The class must match the heading level: heading-style-h1 only on the page's single H1, heading-style-h2 on every section title, h3 on feature titles.

Families
font/display · font/body · font/mono
Uxum Grotesque 500, headings

Inter, body text, fields, buttons, product UI

Geist Mono, numbers and labels (01 Prospect)
heading-style-display
6rem / 1.04 / −0.027em · tablet 4rem · mobile 2.5rem
Your entire sales motion
heading-style-h1
4.5rem / 1 / −0.025em · max 30ch · tablet 3rem · mobile 2rem · .is-tight = line-height 0.9 (contact sales)
One platform for your entire sales motion
heading-style-h2
4rem / 1 / −0.023em · tablet 2.75rem · mobile 2rem
Loved by closers
heading-style-h3
2.25rem / 1.1 / −0.021em · tablet 2.125rem · mobile 1.75rem
Find your next clients
text-size-xlarge
1.75rem / 2.125rem / −0.021em · tablet 1.5rem · mobile 1.375rem

A lead paragraph, used sparingly when a section needs one more step of emphasis.

text-size-regular
1.25rem / 1.225 / −0.017em · tablet 1.125rem · mobile 1rem · always text/primary

Body copy. Black, never muted or secondary. Pair it with max-width-text (60ch) for anything longer than a line.

text-size-small
0.875rem / 1.225 / −0.017em

Secondary detail: roles under a testimonial name, card descriptions.

eyebrow
0.6875rem / 1rem / +0.045em · uppercase · border/hairline
Replaces
eyebrow-number
Geist Mono 0.875rem / 1.225
01 Prospect

Spacing

Two layers. A unit-free numeric scale, and six semantic names that point at it. Classes bind to the semantic name so the Designer reads by intent; the numbers are the escape hatch. No t-shirt sizes, no px names.

spacing/1
0.125rem
spacing/2
0.25rem · v-stack
spacing/3 = tight
0.5rem · a label and its value, form fields
spacing/4
0.75rem · icon to text
spacing/5 = stack
1rem · title to paragraph, button to note
spacing/6 = gutter
1.5rem · page side padding, grid gap, rule to content
spacing/7 = block
2rem · between groups in a column
spacing/8
3rem · hero top padding
spacing/9 = inset
4rem · section header to content, mobile section padding
spacing/10 = section
6rem · section padding, two-column gap
spacing/11
7.5rem
spacing/12
10rem

Layout

Every section is the same four layers: section_name › padding-section › padding-global › container-large. Sections then reorder freely, with no margin maths.

Containers
container/large · medium · small

container-large 90rem (1440px), so 1440 to 1728 laptops keep a side margin. container-medium 64rem, container-small 48rem. Media bands sit inside the container, not full-bleed; only the hero band bleeds past it.

padding-global
gutter, left and right

1.5rem on each side at every breakpoint.

padding-section
section 6rem · tablet 6rem · mobile 4rem

Top and bottom padding of every section. .is-hero sets 3rem on top so the product shot shows on landing.

section-header
gap gutter · margin-bottom inset

Title and intro of a section. .is-tight closes the gap to the content, .is-center centres everything inside it (home hero).

No 12-column grid
columns + is-2 … is-6

Measured on the Figma: the 5-up cards and the 6-up logo row do not fit a 12-column grid. What is constant is the measure and the 1.5rem gutter, so rows are equal fractions. Two-column heroes use their own grid (contact-hero: 1fr 1fr, 6rem gap, stacked on tablet).

Breakpoints
Webflow defaults

Desktop from 992px (with 1440 and 1920 above it), tablet up to 991px, mobile landscape up to 767px, mobile portrait up to 479px. Type and spacing change at tablet and mobile.

Rules and shape

The rows on this page are the system's own hairline: 1px, border/hairline, with gutter padding.

container-large.has-rule
1px hairline + gutter padding-top

How a section starts: a rule across the container, then its title. Used on every home section after the hero, and on the contact sales hero.

container-large.is-hairline
1px hairline, no padding

The rule alone, when the content sets its own spacing (footer CTA).

Rows
testimonial-row · feature-row_text

Lists are separated by a top hairline on each row, never by gaps alone.

Corners
0 · except the CTA pill

Sharp corners everywhere: cards, panels, fields, logo tiles. The one exception is the primary CTA, a full pill (999px radius).

Outline, not border
strokes sit outside the box

Panel strokes use outline (all four longhands) so they take no layout space and paint above children. Anything one-sided, like a row rule or an underline, uses border.

Forms

Every demo form is wired to the site-wide qualification script. Style it freely; keep the wiring below exactly as it is.

Wiring (do not break)
site footer demo script

Wrapper .signup-form_wrap, form with data-folk-demo="contact", one input[type=email], one .js-select whose values are 1-2, 3-9, 10-49, 50-249, 250-999, 1000+. The script looks up the company on email blur, then routes qualified 10+ to /demo-calendly, qualified 3–9 to /book-a-folk-demo-2, everyone else to the unqualified redirect.

Inline form
signup-form · home hero, footer CTA

Email, team size and button in one bordered row, 0.875rem, 3rem tall.

Line fields
signup-form_input.is-line · signup-form_select.js-select.is-line

Contact sales. No box, no background, 1.25rem text, a 1px black underline, 4rem tall. The placeholder is the title (no labels; each field carries an aria-label). Placeholder and unpicked select in text/secondary. No focus underline: the caret is the cue, and the select shows a 2px line on keyboard focus only.

Primary button
signup-form_submit.is-full

Black pill, full width, 1rem, 3.5rem tall.

Rhythm
contact-form_fields · contact-form_actions

Fields tight (0.5rem), button and note stack (1rem), block (2rem) between the two groups.

Decisions
why it is like this

A native select over option tiles: tiles needed a bridge script to reach the qualification script, the select needs none. The page head paints over Chrome's blue autofill and keeps the field font on suggested values.

Motion

Entrances are attributes, not interactions. Elements rise and fade in turn; no blur, and nothing waits on the reader's scroll position beyond entering the screen.

data-reveal-group
load · view · scroll

On a section or a grid. load plays with the page (heroes), view when the group enters the screen, scroll item by item as they enter. data-reveal-at="60%" delays it until the top reaches that height.

data-reveal
up · lines · fade

up: fade and rise 1rem. lines: a title revealed line by line. fade: opacity only, used for hairline containers so the rule appears with its section.

data-reveal-preset
links · column · items · cards · block · list · menu · footnote

One attribute instead of three for the usual patterns.

The H1 rule
data-reveal-css="hero"

Above-the-fold titles use the CSS-only reveal, so they count as painted straight away (LCP). Never put a JS fade on a container that holds the H1.

Always visible
reduced motion · no JS · Designer

With reduced motion, without JavaScript, or in the Designer, everything is simply visible. The engine is reveal.js in the site footer; home-only modes live in reveal-extra.js.

Components

Shared sections live as Webflow components, so a change in one place updates every page that uses them.

Navbar · Footer
site-wide

Editing either changes every page. The Footer's Base variant includes the CTA form. Never rename .nav-items-wrapper, .nav-item-wrapper, .logo-context-menu or .sub-nav-item: scripts and CSS target them.

Sections 2026
Logos 2026 · Testimonials 2026

The home's logo wall and testimonial rows, reused on contact sales.

Form hero qualification
home hero form

The inline demo form, already wired to the qualification script.

Product mockups
ui- namespace · ui/* tokens

Illustrations are coded Webflow elements, not images: sharp at any DPI, interactive, animatable. They use their own ui- classes and tokens and never borrow the page's spacing.

Checklist
checklist › checklist-item › checklist-icon
  • Get a demo
  • Learn which plan is right for you