A modern front-end architecture creating a single source of truth for all our CSS — across WordPress, React, static, or any future builds.
KNI Cascade unifies structure, tooling, and logic into a maintainable, portable system for all front-end projects.
It’s designed for clarity, scalability, and minimal friction — a single shared foundation that powers every KNI build.
| Category | Description |
|---|---|
| SCSS Boilerplate |
|
| Sass (SCSS) |
|
| PostCSS PXV | Our custom viewport unit plugin |
| Stylelint config | Centralized configs for Stylelint |
scss/
├── 00-sass/ # Settings, Sass vars, mixins, functions, no CSS output
├── 01-base/ # Resets, type, layout, and core utilities
├── 02-components/ # Globally-available UI elements (header, footer, buttons, etc.)
├── 03-modules/ # Page body building blocks
├── 04-pages/ # Template- and page-specific styles, intended to imported only into the relevant file
└── styles.scss # Public entry file for global CSS build
- Fluid Typography – Scales seamlessly across breakpoints using
$type-scalemaps - Viewport-Based Units (
pxv) – Uniform responsive sizing with fallback support - Token-Driven Architecture – Edit
_settings.scssto update a project globally - Predictable Cascade – Each layer builds safely on the one before it
- Framework-Agnostic – Single source of truth across any kni boilerplate
# install dependencies
npm install
# run local dev build
npx gulpBy default, Gulp runs:
sass→ compile SCSS → CSSpostcss→ apply pxvstylelint→ lint & auto-fix code stylebrowsersync→ live-reload for local development
- No CSS output in 00-sass – Logic, not styling.
- Small overrides > big rewrites – The cascade should always work with you.
- Readable by default – Comments are documentation.
- Node v18+
- npm or pnpm
- Gulp CLI (global)
- Clone this repo
- Create a new branch
- Run
npx gulpand make your changes - Submit a PR with a clear summary
If it defines how the system works is a Sass function, mixin or variable, it lives in sass. If it’s a globally-used reset, type, or layout rule, it lives in base. If it’s a globally-used element, it lives in components. If it's a page body building block, it lives in modules. If it’s page-specific, it lives in pages.