Page cover

Theory

Block
Element
Modifier

Hero

Header

`Navigation

Testimonial

Gallery

Team

Logo

Footer

Blog

FAQ

Newsletter

CTA

Timeline

Contact

404

Features

Form

Filter

Carousel

Banner

Wrapper

Card

Grid

Input

Content

Image

Footnote

Button

List

Item

Slide

Icon

Heading

Tabs

Link

Dropdown

Select

Divider

Details

Description

Large

Small

Primary

Secondary

Tertiary

Ghost

Disabled

Active

Filled

Empty

Featured

Left

Center

Right

Top

Bottom

Error

Success

Wide

Tall

FAQ

Q: Can I use lowercase or underscores instead of capitalized words and spaces? → Yes. At Flowbase, we use plain English with capital letters and spaces for readability, but the Base System works with any style you prefer — kebab-case, camelCase, or snake_case.

Q: What if something doesn’t fit into the system? → That’s totally fine. Use your best judgment — or reach out to us for help if you're unsure.

1.1. Global Classes

Some classes are meant to be reused across the entire site — such as those for typography, buttons, sections, or containers.

These are considered global classes, and they should still follow a consistent naming convention. For example:

  • Section Large

  • Container Small

  • Button Primary

The Starter Project includes a helpful set of global classes, but you’re encouraged to create more as needed.


Appendix

Class Name Examples

Combo Classes

There are two types of combo classes, combo classes that are tied to the and 'global' combo classes.

Global Combo classes have a number of frustrations in Webflow.

  1. If you rename a global combo classes, everywhere that global combo class is used will break as its referencing a class that no longer exists.

  2. If you copy paste an element which uses global combo classes, it will break as it no longer has the global combo class to reference it

  3. If you go to a smaller breakpoint and try to change a style, you need to remove the combo class

Lets use variables instead

If you rename a regular combo class thats tied to another class then it will update that name.


Responsive Units

In Webflow, you can use either pixels (px) or rem units to define sizes for elements, typography, and spacing. Pixels are an absolute unit, meaning they provide fixed sizes that do not scale with user preferences. This makes them ideal for precise control over elements when a fixed layout is required, but it can limit flexibility and responsiveness. As the default unit, pixels are easier to use without needing to convert our units to rem or work with large decimal values.

On the other hand, rem (root em) is a relative unit based on the root font size of the document, which is typically 16px by default. Using rem allows for better scalability and accessibility, ensuring that text and spacing adjust dynamically based on user settings or browser defaults.

When working with typography in Webflow, using rem is generally recommended because it ensures that text sizes remain consistent and adaptable across different screen sizes. For layout and spacing, Webflow primarily defaults to pixels, but switching to rem can improve responsiveness, especially when working across multiple breakpoints. To set rem values in Webflow, simply enter the desired value followed by “rem” in the style panel, such as 2rem for a size that scales with the root font size.

For reference, if the default root font size is 16px, then 1rem equals 16px, 2rem equals 32px, and 0.5rem equals 8px. Using rem ensures a more fluid and scalable design, making it a great choice for modern, accessible web development. However, for cases where exact sizing is needed, pixels may still be the better option.

If you prefer working with REM, the Base System provides a REM Starter Project tailored to those needs, allowing you to adopt your preferred approach. You can also choose between copying components from Flowbase in either REM or Pixels.


The Base System uses plain English words, with spaces and capital letters. We believe using natural language makes class names more readable and intuitive.

Naming Theory

The Base System uses plain English words and avoids using "code-speak" formats like camelCase, snake_case, kebab-case, or special characters such as acronyms, underscores, slashes, or hyphens. This may seem like a controversial decision but there are a few reasons behind this approach.

1. Aligning with Webflow’s Core Philosophy

Webflow is a visual development platform, designed to empower designers and non-coders to build sophisticated websites without needing to write code. By naming classes in plain English, we fully embrace this philosophy. Traditional coding formats—such as camelCase, snake_case, and kebab-case—are remnants of text-based programming, which Webflow abstracts away. There's no longer a need to decipher style sheets, allowing us to make class names more intuitive and accessible.

2. Enhancing Readability and Collaboration

Using natural language for class names makes Webflow projects easier to understand at a glance. Instead of seeing something like btn-primary or grid--two-col, a class named "Button Primary" or "Two Column Grid" reads like a sentence and is immediately clear to designers, developers, and stakeholders alike. This approach mirrors how tools like Figma and Framer allow users to name elements descriptively, creating a seamless workflow between design and development.

3. Webflow Handles Hyphens Automatically

One might assume that spaces in class names would create issues, but Webflow automatically converts spaces into hyphens. This means that while we type and read "Primary Button Large" in the UI, Webflow still maintains the correct syntax (primary-button-large) behind the scenes. Regardless, we recommend separating style (class names) from functionality (attributes). Instead of relying on class names for scripting, using custom attributes (like data-button="primary") makes the project more flexible and avoids class name dependency. This keeps our styles clean and ensures our scripts remain unaffected by class name changes.


Variables Theory

1. Consistency and Scalability

Design systems evolve over time. Without a structured approach, managing design updates can become chaotic.

  • Primitives ensure consistency: A primary color should always be the same shade of blue across all components. Instead of manually applying hex codes, we reference a variable, ensuring uniformity across the project.

  • Semantic variables improve maintainability: If we need to tweak how a brand color is applied, we only need to update the mapping of "Background Brand," not search for every instance of a hex code.

This separation allows the same primitive colors to be reused in different contexts, enabling design flexibility without redundancy.

2. Making Design Intent Clear

A major advantage of semantic variables is clarity in design decisions. Instead of seeing an arbitrary #f5f5f5 value and wondering why it was applied, semantic variables explain the purpose behind each choice.

For example:

  • Background Primary → The main page background

  • Background Secondary → A subtle contrast for sections

  • Background Tertiary → An even more subdued background for less prominent elements

  • Background Brand → The brand’s key accent color

This makes it easier for teams to understand, use, and modify the system without guessing why a particular color was chosen.

3. Faster Adaptation to New Themes & Branding

One of the biggest benefits of semantic variables is their ability to adapt without disrupting the entire system.

  • If a company rebrands, we don’t need to manually update every instance of "Primary Blue." Instead, we remap the Primary semantic variable to a new color, instantly updating all relevant elements.

  • If a website has dark mode, we can redefine "Background Primary" from white to dark gray without touching individual components.

Semantic variables allow for global updates with minimal effort, making it easy to support multiple themes.

4. Why We Use Variables for Border Radius, Sections, and Headings

Beyond colors, we apply the same principle to other design properties such as:

  • Border Radius: Ensures uniformity across buttons, cards, modals, etc. If we want to tweak the global radius, we only update one variable.

  • Sections: Consistent padding and spacing scales keep layouts aligned.

  • Headings: A predefined hierarchy prevents inconsistency in typography styling.

By defining variables for every key design decision, we create a system that is cohesive, scalable, and easy to manage.


Structure Theory

1. Embracing Established Layout Practices

Many design systems introduce extra layers like page wrappers to make copying and pasting layouts easier. However, in the Base System, we focus on simplicity and flexibility—keeping nesting to a minimum. If a page wrapper is needed, users can add one, but it's not enforced by default.

At the core of most web layouts are sections and containers, both of which are familiar concepts used across Webflow, Figma, Framer, and traditional web development. Sticking with these foundational structures makes it easier for designers and developers to build layouts without unnecessary complexity.


Structure Theory

2. Using Flex Gap Instead of Margin Wrappers or Spacing Blocks

Spacing is one of the most debated topics in web development. Different systems handle it in various ways:

  • Margin wrappers introduce extra divs solely for spacing.

  • Spacing blocks require users to manually insert elements for padding.

  • Combo-classes or utility classes can get deep and difficult to manage.

Instead of these approaches, the Base System uses flex gap as the primary method of handling spacing. This approach is more efficient, intuitive, and adaptable.

Why Flex Gap?

  1. Minimizes Unnecessary Classes and Wrappers

    • Instead of adding extra divs for spacing, flex gap lets you apply spacing directly to the parent element.

    • One utility class applied to a parent controls the spacing between all child elements, reducing class clutter.

  2. Increases Reusability and Flexibility

    • With flex gap, elements can be rearranged and reused without manually adjusting margins.

    • No need to override styles when moving elements across different sections.

  3. Aligns with Figma’s Auto Layout

    • Many designers are used to Frames and Auto Layout in Figma, where gaps are applied at the parent level.

    • The Base System replicates this structure:

      • Columns act as Figma Frames.

      • Spacing is applied through flex gap utility classes.

    • This familiarity makes it easier for designers transitioning from Figma or Framer to Webflow.

  4. Creates a Clear, Intuitive Structure

    • Flex gap encourages better hierarchy by grouping related elements together in the Layers Panel.

    • It ensures paired elements remain visually and structurally aligned, making designs more organized and predictable.

  5. Prevents Deep Combo-Class Stacking

    • Traditional margin-based spacing often requires stacking multiple combo-classes to achieve the right spacing.

    • Flex gap eliminates this need, making layouts easier to manage for both beginners and advanced users.


3. Why We Don’t Use Pre-Defined Flex Classes Like "V Flex" or "H Flex"

Some systems use pre-applied vertical or horizontal flex classes, but these can create limitations: ❌ If you want to change an element to no longer use flex, you must remove or override the class. ❌ These classes often introduce unexpected layout shifts, making them harder to control.

Instead, the Base System provides simple utility classes for flex-based spacing that allow you to apply flex gap without locking an element into a rigid layout structure.

4. CSS Grid vs. Flexbox for Spacing

While CSS Grid is a powerful tool, it's not always the best choice for simple one-dimensional layouts. Flexbox provides: ✅ Better performance in Webflow (Webflow grids add extra layers that can slow down page rendering). ✅ More intuitive alignment and wrapping behavior for common use cases like buttons, content blocks, and forms.

For more complex grid-based layouts, Grid is still an option, but for spacing and content alignment, flex gap is the simpler and more efficient choice

The Base System does not seek to reinvent the wheel. It is intended to be incredibly familiar

Familiar industry standard development practices

  • Useful global variables

familiar, and fast, making it easy to learn and adopt without

We avoid deep nesting combo classes, and stacking multiple divs in favor of clear, purposeful, custom classes. We can leverage modern Webflow features like CSS variables, flex gap, custom properties, and scoped CSS to build layouts with fewer elements and cleaner code.

Overview

How do we name plain English class names, with a

These modifiers make it clear that both classes serve the same function, but with meaningful differences. We should keep names short and meaningful. Avoid mimicking the full DOM structure, which leads to overly long class names. Shorter, flatter naming works better in a visual builder like Webflow, where structure is already visible.

Class Naming

By default, classes are named using plain English words, with spaces and capital letters.

We believe using natural language makes class names more readable, accessible and intuitive. Visual builders like Webflow abstract away the need to decipher style sheets. Webflow automatically converts spaces into hyphens. This means that while we type and read "Primary Button Large" in the UI, Webflow still maintains the correct syntax (primary-button-large) behind the scenes. Generally, we recommend separating style (class names) from functionality (attributes). Instead of relying on class names for scripting, using custom attributes (like data-button="primary") makes the project more flexible and avoids class name dependency. This keeps our styles clean and ensures our scripts remain unaffected by class name changes.

Appendix

Starter Styles

Section

Class Name
Vertical Padding
Vertical Padding (Mobile)

Section X Large

128px / 8rem

96px / 6rem

Section Large

96px / 6rem

64px / 4rem

Section Regular

64px / 4rem

48px / 3rem

Section Small

48px / 3rem

40px / 2.5rem

Section X Small

32px / 2rem

{Custom} Section

Container

Class Name
Max Width

Container X Large

1280px / 80rem

Container Large

1120px / 70rem

Container Regular

960px / 60rem

Container Small

800px / 50rem

Container X Small

640px / 40rem

{Custom} Container

{Custom}

Column

Class Name
Flex Gap

Column 2X Large

40px / 2.5rem

Column X Large

32px / 2rem

Column Large

24px / 1.5rem

Column Regular

16px / 1rem

Column Small

12px / 0.75rem

Column X Small

8px / 0.5rem

Column 2X Small

4px / 0.25rem

{Custom} Column

X

Class Name
Flex Gap

Column Center

align-items: center, text-align: center

Column Left

align-items: left

Column Right

align-items: flex-end

Column Space Between

justify-content: space-between

Row

Name
Flex Gap

Row 2X Large

40px / 2.5rem

Row X Large

32px / 2rem

Row Large

24px / 1.5rem

Row Regular

16px / 1rem

Row Small

12px / 0.75rem

Row X Small

8px / 0.5rem

Row 2X Small

4px / 0.25rem

{Custom} Row

X

Name
Flex Gap

Row Left

justify-content: flex-start

Row Center

justify-content: center

Row Right

justify-content: flex-end

Row Space Between

justify-content: space-between

Row Wrap

flex-wrap: wrap

Max Width

Class Name
Max Width

Max Width X Large

832px / 52rem

Max Width Large

640px / 40rem

Max Width Regular

512px / 32rem

Max Width Small

384px / 24rem

Max Width X Small

320px / 20rem

{Custom} Max Width

X

Appendix

Heading

HTML Tag & Class
Font Size
Font Size (Mobile)
Line Height

H1 Heading

64px / 4rem

48px / 3rem

1.3

H2 Heading

56px / 3.5rem

40px / 2.5rem

1.3

H3 Heading

48px / 3rem

32px / 2rem

1.4

H4 Heading

40px / 2.5rem

28px / 1.75rem

1.4

H5 Heading

32px / 2rem

1.5

H6 Heading

24px / 1.5rem

1.5

Paragraph

Class Name
Font Size
Line Height

Paragraph X Large

20px / 1.25rem

32px / 2rem

Paragraph Large

18px / 1.1125rem

28px / 1.75rem

Paragraph Regular

16px / 1rem

24px / 1.5rem

Paragraph Small

14px / 0.875rem

20px / 1.25rem

Paragraph X Small

12px / 0.75rem

16px / 1rem

Subheading

Class Name
Font Size
Line Height
Font Weight

Subheading X Large

20px

36px

Bold

Subheading Large

18px

32px

Bold

Subheading Regular

16px

28px

Bold

Subheading Small

14px

24px

Bold

Subheading X Small

12px

20px

Bold

Overline

Class Name
Font Size
Line Height
Style

Overline X Large

20px

36px

All Caps

Overline Large

18px

32px

All Caps

Overline Regular

16px

28px

All Caps

Overline Small

14px

24px

All Caps

Overline X Small

12px

20px

All Caps

Font Weight

Class Name
Text Weight

Text Weight Black

900

Text Weight Extra Bold

800

Text Weight Bold

700

Text Weight Semibold

600

Text Weight Medium

500

Text Weight Regular

400

Text Weight Light

300

Font Color

Name
Color Variable

Text Color Primary

text-color-primary

Text Color Secondary

text-color-secondary

Text Color Tertiary

text-color-tertiary

Text Color Light

text-color-light

Text Color Dark

text-color-dark

Text Color Brand

text-color-brand

Text Color Inherit

color: inherit

Font Style

Class Name
Text Style

Text Underline

Underline

Text Strike

Strike

Text Italic

Italic

Buttons

Base Classes
Property

Button Primary

Main call to action button

Button Secondary

Secondary call to action button

Button Outline

Button with a border

Button Ghost

Button with no background or border

Button Link

Text Link

Form

Class Name
Property

Form Field Label

Default <label> style

Form Input

Default <input> style

Form Text Area

Variant of <input> for <textarea>

Form Select

Variant of <input> for <select>

Form Checkbox

Default <input type="checkbox">

Form Radio

Default <input type="radio">

Form Success Message

Form Error Message

Icons

Class Name
Size

Icon X Large

32x32(px)

Icon Large

28x28(px)

Icon Regular

24x24(px)

Icon Small

20x20(px)

Icon X Small

16x16(px)

Icon

No fixed size, used to center icon.

Badges

Name
Text & Line Size
Padding Top & Bottom
Padding Right & Left

Badge Large

16px / 24px

4px

10px

Badge Regular

14px / 16px

4px

8px

Badge Small

12px / 16px

4px

8px

Avatars

Class Name
Size (px)
Border Radius

Avatar X Large

64px

100%

Avatar Large

52px

100%

Avatar Regular

42px

100%

Avatar Small

32px

100%

Avatar X Small

24px

100%

Last updated