The input fields in GenerateBlocks might look harmless — but if you’re not careful, the limitless customization can quickly turn your project into a chaotic, inconsistent mess.
Every time you add padding, tweak a font size, or set a border radius, you’re making a decision. On a large site, that can mean hundreds (or even thousands) of tiny decisions.
The mistake many people make? Using one-off values everywhere. Sure, it works in the moment — but it leads to inconsistencies, wasted time, and painful maintenance later.
Imagine realizing your section padding is too small across the entire site. Without a system, you’d have to edit every section manually. That’s a nightmare no one wants to relive.
The solution: a framework.
Why You Need a Framework
A framework is simply a system that narrows down your options, keeps everything consistent, and speeds up your workflow.
The best part? You don’t need to install Bootstrap, Tailwind, or any bloated external system. Instead, you can build a lightweight mini framework directly in GenerateBlocks with just three parts:
- Custom properties
- Utility classes
- Patterns
This combination gives you the flexibility of GenerateBlocks with the consistency of a framework — without the bulk.
Step 1: Custom Properties (Your Ingredients)
Custom properties (also known as CSS variables) are like nicknames for your values.
Instead of typing 8px
or .5em
a hundred times, you create a variable — for example, --padding-small
— and assign it the value 8px
. From then on, you can use var(--padding-small)
anywhere you need that spacing.
Think of them like phone contacts. You don’t memorize phone numbers — you save them under names. When you call “Mom,” your phone knows which number to dial.
This narrows down your choices, makes your designs consistent, and allows you to change a value once and update it everywhere.
You’ve already seen this in action with the GeneratePress color palette. Change a color in the customizer, and it updates sitewide. That’s powered by custom properties.
But you’re not limited to colors — you can create variables for padding, font sizes, spacing, border radius, transitions, and more.
Setting Up Custom Properties
You’ll need to add these manually in your CSS, but it’s straightforward.
- Open your child theme’s
style.css
file (or use the Customizer’s “Additional CSS” or a code snippet plugin). - Add your variables under the
:root
selector.
Example:
:root {
--padding-xs: 8px;
--padding-s: 16px;
--padding-m: 32px;
--padding-l: 64px;
--padding-xl: 128px;
}
I recommend:
- Using full words (like
padding
) instead of abbreviations (pad
) so they’re easier to remember. - Consistent naming (like t-shirt sizes) so you can reuse the same system across spacing, radii, or anything else.
Now, anytime you need spacing, you just call var(--padding-m)
instead of typing in a random number.
Step 2: Utility Classes (Your Recipes)
So far, we’ve set up custom properties (our “ingredients”). They’re powerful, but typing var(--padding-m)
into every new block still gets tedious. That’s where utility classes come in.
Think of a utility class as a little recipe card. Instead of remembering every ingredient and measurement, you just grab the card and follow the steps. In GenerateBlocks, you apply that class to any block, and it instantly picks up the styles you saved.
Utility classes come with a lot of benefits, including:
- Consistency – Every section styled with the
.section
class has the same padding. No “eyeballing” values each time. - Speed – Drop in a block, apply the class, done.
- Global updates – Change the class once, and every block using it updates.
- Flexibility – The same class can be used on completely different elements. A
.stack-m
class might space out blog post teasers, form fields, or testimonial cards.
But when you combine them with custom properties, that’s where the magic multiplies. Instead of locking a class to a fixed number (say, padding: 32px
), you reference your custom properties:
- A “section” class might use
--padding-l
for the top and bottom, and--padding-m
for the sides. - A “card” class could combine
--padding-m
with--radius-m
for consistent spacing and rounded corners.

Now your classes aren’t just reusable — they’re scalable. Update your padding variables once, and suddenly every section, card, or button using those utilities gets the new spacing.
The beauty of utility classes is how portable they are. You’ll start seeing opportunities all over your site:
- Sections → Add
.section
for consistent padding. - Cards → Apply
.card
with padding and border radius. - Buttons → Use
.btn-primary
that pulls from the same spacing and color variables. - Forms → A
.stack-m
class can make sure every field has even spacing between them.
Instead of “recreating the wheel” for each new block, you build a toolbox of reusable styles you can drop in anywhere.
Step 3: Patterns (Your Final Dish)
By now we’ve got our ingredients (custom properties) and our recipe cards (utility classes). The last piece of the puzzle is putting them together into something ready to serve — that’s what Patterns are all about.
Patterns let you save an arrangement of blocks you know you’ll use again, so instead of rebuilding from scratch each time, you just drop it in. Think of them like a frozen dinner you’ve prepped in advance — all the ingredients are already measured and cooked, you just heat it up when you need it.
Take a section, for example. You’ve already created your .section
class that handles consistent padding. You’ve got your inner container to keep content at the right width. And you’ve set the outer container to use the <section>
tag for good semantic structure. That’s a lot of little steps to repeat every time you need a new section. By saving that setup as a Pattern, you cut the whole process down to one click.
Patterns are also smart about how they interact with the utilities you’ve already built. Since the styling is handled by classes and variables, the pattern doesn’t lock you into a single look — it just saves the structure. If you decide later that all your sections need more breathing room, you don’t have to go back and update every pattern. You just tweak your padding variable or update your class, and all your patterns instantly reflect that change. The pattern is just the delivery vehicle.
And the best part is you can use this idea anywhere you find yourself repeating the same structure. A testimonial card with an image, some text, and a button. A pricing table. A feature row with an icon and headline. Save each one as a pattern, and instead of reinventing them on every page, you’ll just slot them in and move on.
When you combine all three — variables to keep values consistent, utility classes to apply them everywhere, and patterns to package your favorite setups — you end up with a lightweight framework that makes building in GenerateBlocks faster, easier, and way more consistent. It’s like going from cooking every meal from scratch to having a stocked kitchen, recipe cards, and prepped meals all ready for you.
Putting It All Together
With these three pieces, you’ve built a framework:
- Custom properties keep your values consistent.
- Utility classes apply those values everywhere without repetition.
- Patterns package it all into reusable, ready-to-drop structures.
This approach makes your sites faster to build, easier to maintain, and more consistent — all without adding heavy frameworks or extra bloat.
And while we demonstrated this with sections, the same system works for buttons, cards, transitions, or anything you find yourself rebuilding over and over.
Frameworks don’t have to be intimidating or bloated. By combining variables, classes, and patterns, you can create your own streamlined system right inside GenerateBlocks.
Start with one element — like sections — and build from there. Soon, you’ll have a consistent, reusable toolkit that saves you hours on every project.