We use cookies to improve your experience on our website. By clicking “Accept all’, you agree to the use of all cookies. Privacy policy

Saddle Framework

A Developer-First, Client-Focused Webflow Framework

After building countless websites and experimenting with various popular frameworks such as Tailwind, BEM & Client-First we were driven to develop our very own framework: Saddle.



Much like a saddle on a mule helps maintain control, Saddle is designed to keep control over your projects.

Easy

The framework is intentionally designed to be as straightforward as possible, enabling quick onboarding for freelancers. Updates and bug fixes are quick and uncomplicated.

Empowering

Saddle redefines the limits of Webflow's capabilities, merging code with the platform to enhance its efficiency, performance, and user-friendliness.

Fast

Saddle uses variables for efficient reuse and updates of design elements like colors and fonts, enhancing both efficiency and user experience.

The mindset

Our objective was to maximize reusability and utility, enabling any editor to enhance functionality effortlessly by incorporating a component or attribute to a page or element. For instance, implementing a fade-in animation using GSAP could be achieved by targeting any element with the "fade-in" attribute. This approach is efficient, customizable, and adaptable.

Naming

Classes

Class names are all lowercase, with dashes and underscores to separate words. Use underscores for children elements. For example, a blog-card class could have a child element called blog-card_image.
Do not use automatically created classes.

Combo classes

Combo classes need to be distinct from base classes to avoid collisions. We have global utility classes, and scoped combo classes. Utility classes have a u- prefix, while other combo classes have a cc- prefix.

Components

They should be upper case with spaces. i.e.: Blog Card

Size Variants

We use the 2-letter abbreviation of the sizes: xs, sm, md, lg, xl.
We do not use one letter abbreviations like s, m, l.

Element Variants

Unless they are very different, try using combo classes to create variants.

button-large
button
cc-large
Animations

Name of element + [state/action]. Keep the names short, but descriptive.
Examples: Nav Dropdown [Open], Section [Fade in].
"While scrolling" and "Mouse move" animations are special. They don't typically change to a specific state, so you can get more descriptive with them. Examples: Background change to white, Case studies floating cards.
If you are using GSAP animations, put them in an embed element and turn them to components so that you can drop them in any page needed.

Page Structure

Body
page
Nav
Global Code
css
js
main
section
css
js
container
hero_layout
title-wrapper
h1
text-wrapper
text-xl
cta-wrapper
Button
section
Footer

You can use the interactive element tree above as a quick reference of the basic structure. There should be a clear distinction between sections, and section-specific code should be inside that section to make it easy to find.

page

This div contains the entire page’s content. It doesn’t have any styling, but makes it easier to copy pages around. It should contain the nav, footer, main, global code, and page transition if it applies.

Global Code

This component is actually a div that contains two embeds.

css

global CSS styles for the project, like font-smoothing, defaults, utilities, etc.

js

global JavaScript that is used for global animations or similar.

css (optional)

page-specific CSS styles for the page.

js (optional)

page-specific JS for the page, like interactions.

main

The Main wrapper of the page. This should NOT include the nav and footer. It should always have the Main HTML tag.

section

A section controls the vertical spacing between sections and has the HTML tag Section. It can include two embeds if it needs custom code.

css (optional)

Custom CSS specific to that section.

js (optional)

Custom JS specific to that section.

container

A container controls the horizontal spacing and max-width of the content.

{name}-layout

This name can either be something generic that will be used again (i.e. “hero-layout”), or it could be page and section-specific. Take a good look at the design and look for opportunities to reuse a layout class.

Layout

Although you should try using flex/grid with gap to space things evenly, you often need some standard spacing under/above headings, CTA’s, or a max-width on paragraphs.

We provide a few classes to help with this:

title-wrapper

A wrapper div that holds a heading inside and provides a margin-bottom property. Add combo classes for smaller or larger margin.

text-wrapper

A wrapper div for paragraphs, mostly used to set a max-width or align text.

cta-wrapper

A wrapper div for buttons which gives you margin-top. It is also set to flex with a gap to be able to hold multiple buttons.

image

The image class is set to cover by default and has combo classes to control its aspect ratio or set it to contain. You can add more or modify them. Default: cc-1x1 cc-4x3 cc-16x9 and cc-contain