7-1 is a starting point, not the whole answer
The 7-1 pattern — seven folders (abstracts, base, components, layout, pages, themes, vendors) rolled up into one `main.scss` — gives a codebase a shared vocabulary. That's valuable, but it's also where most teams stop, and folders alone don't stop stylesheet sprawl.
What actually keeps a large SCSS codebase healthy over years and multiple contributors is the rules about what's allowed to depend on what, and who owns each layer. The folder structure is just where those rules become visible.
The rules that make it hold
Dependencies flow one direction
Abstracts and base can be imported by anything. Components can import abstracts, never the reverse. Pages can import components, never the reverse. No cycles, ever.
Abstracts hold no output CSS
Variables, functions and mixins only. If a file in `abstracts/` ever compiles to actual CSS, it's in the wrong folder — that's a silent source of duplicated rules.
One component, one file, one owner
Every component file maps to exactly one UI component and one team's responsibility. Shared components live in a clearly separate, explicitly reviewed folder.
Pages compose, they don't define
Page-level SCSS should only handle layout composition — grid, spacing between sections. New colors or component styles in a page file are a sign something belongs one layer down.
Theme layer owns every token override
Light/dark and brand variants live entirely in `themes/`, redefining tokens from `abstracts/`. No other layer is allowed to branch on theme.
Lint the dependency direction
Stylelint's import-order rules catch a component importing a page file, or a rogue cross-team import, before it reaches review — where it's much harder to unwind.
Blast radius is the metric that matters
The real test of a CSS architecture isn't how it looks in the folder tree — it's what happens when someone changes a variable. In a well-scoped 7-1 setup, changing a component's internal spacing touches one file. Changing a design token touches the theme layer and ripples predictably through everything that references it, with no surprises outside that path.
When a "small" style change starts requiring a search across the whole codebase to find every place it might break, that's the architecture telling you a boundary is missing — usually a shared value that should be a token but got hardcoded somewhere instead.
The takeaway
7-1 gives you folders; enforced dependency direction and clear per-layer ownership are what make it survive multiple teams. Lint the import direction, keep abstracts free of output CSS, and push every theme decision into one layer — and a style change stays a one-file change, no matter how large the codebase gets.
Let's talk about your frontendRelated reading
Angular · Theming
PrimeUIX Theming in Practice: Customizing a Design System Without Forking It
Architecture
The Case for a Thin Wrapper Layer Around Every UI Library
Angular · Architecture
What "Reusable Component" Actually Means in a 6-Module Enterprise App
See this architecture applied in production on the Compito case study.