Let Your Framework Serve Your Design, Not the Other Way Around
Admin User
Author
I had a moment last year that stuck with me. I was onboarding a junior developer to a project we'd built with a popular CSS framework, and after twenty minutes of explaining which utility classes we override, which we never use, and which ones we've monkey-patched because they didn't quite match our brand, she looked at me and asked: "Why are we fighting the framework instead of just owning our own styles?"
That question haunted me because she was right. We'd chosen a framework to speed up development, but we'd spent weeks bending it to our will instead of just building the design system we actually needed. The framework had become a middleman between our brand and our CSS, and nobody was happy about it.
This is exactly the tension that Juice is trying to solve, and after reading about their approach, I realize it's a philosophy I've been moving toward without consciously recognizing it.
The Problem With Framework Ownership
Here's what happens in most projects I've worked on: you pick a framework for its capabilities, and somewhere around week three, you realize it wasn't built for your specific use case. So you override things. You add custom classes. You write more CSS fighting the framework than you would have writing from scratch.
The real issue isn't the framework's fault—it's that frameworks are designed to be general purpose. They can't know your brand. They can't anticipate your spacing scale or color palette. But many frameworks act like they can, shipping entire stylesheets that you either use or override. It's bloat either way.
Juice's insight is cleaner: don't ship fixed styles. Instead, generate the exact styles your project needs based on what you actually define. Your configuration becomes the single source of truth.
Configuration as a Design System
I like this idea more the more I think about it. Instead of digging through framework documentation and fighting against preset conventions, you define your design tokens once—colors, typography, spacing, radius, shadows—and the framework generates the CSS. That's it.
What you get out of the other end is plain CSS. No special syntax. No framework-specific logic. Just stylesheets that match your design system exactly.
/* This is what Juice generates based on your config */
:root {
--color-primary: #0066cc;
--color-secondary: #6c757d;
--spacing-xs: 0.25rem;
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
--spacing-lg: 1.5rem;
--font-family-base: 'Inter', sans-serif;
--font-size-body: 1rem;
--font-size-heading: 1.5rem;
}
.btn-primary {
background-color: var(--color-primary);
padding: var(--spacing-sm) var(--spacing-md);
font-family: var(--font-family-base);
font-size: var(--font-size-body);
}
The beauty here is that you're not locked into anything. You can modify the generated CSS. You can layer on more styles. You can migrate away from the framework entirely if you need to, because you still own the output.
My Take on This Approach
I think Juice is onto something important that gets overlooked in the tool-obsessed JavaScript ecosystem: the best framework is the one that gets out of your way. Every design decision shouldn't be "What does the framework recommend?" It should be "What does our project need?"
What I appreciate most is the shift from "framework as the source of truth" to "configuration as the source of truth." That's genuinely different. It means your design language exists independently from the tooling. The framework is just the translator.
But here's what I'd be curious about: what happens when your design system gets complex? Real projects have nuances—conditional colors based on context, responsive spacing that doesn't fit into neat token scales, accessibility considerations that aren't just tokens. Can configuration scale to that, or does it eventually become another language you have to learn?
And practically speaking, I'd want to understand the build-time cost. Generating stylesheets on every build is fine, but how much does it slow things down as projects grow? Does the configuration file become a bottleneck or a blessing?
The Real Shift
What's happening here is a philosophical one. Instead of picking a framework and adapting your design to it, you're defining your design and picking a framework that can implement it without fighting back. The framework becomes a tool that respects your authority over your own brand.
That's the kind of framework relationship I want in my projects going forward.
Your Turn
Are you currently fighting a framework to implement your design system, or have you found a good balance? I'm genuinely interested in what's worked for teams that have tried configuration-first approaches. Hit me up on Twitter or drop a comment—I'd like to hear about your actual experience.
Source: This post was inspired by "Why Juice Generates CSS Instead of Owning It" by Dev.to. Read the original article