Atlas
12 pages
MCSS-Lite is a pure-CSS design system where every class, state and token is written down in a contract. People and AI agents read the same contract, and mcss-lite validate rejects any part that isn't in it.
An agent guesses c-button--warning
error Unknown class "c-button--warning". Valid modifiers of c-button: --primary, --secondary, --ghost, --danger, --sm, --lg. Only classes from the MCSS-Lite contracts exist.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/gabrielcpule/mcss-lite@v0.4.1/dist/mcss-lite.min.css">
Or install it from GitHub: npm install github:gabrielcpule/mcss-lite#v0.4.1. MCSS-Lite is not on the npm registry.
Every class says what it is: l- for layouts, c- for components, u- for utilities. Layouts own all spacing and components never set their own outer margin, so any part fits anywhere. Each dashed outline below is one layout.
New parts (× is how many times a part is used in this build)
l-section, used 1 time in this buildl-container, used 1 time in this buildl-stack, used 2 times in this buildl-center, used 1 time in this buildl-sidebar, used 1 time in this buildl-switcher, used 1 time in this buildAlso in this build c-button, used 2 times in this build l-grid, used 1 time in this build c-card, used 5 times in this build u-text-center, used 1 time in this build
Centered at reading width.
l-cluster lines parts up in a row that wraps. Primary goes last; destructive actions get the danger brick.
Add a publish date to schedule the post.
Short status labels. The text carries the meaning; the color only reinforces it.
New parts (× is how many times a part is used in this build)
c-badge, used 6 times in this buildAlso in this build l-cluster, used 1 time in this build
l-grid sets the gap. Cards group related content; an interactive card is one real link. A utility such as u-margin-0 is the last resort, for the one override no part covers.
12 of 20 seats used. Renews on 1 March.
Updated 2 hours ago
Invoices go to finance@example.com on the 1st of each month.
Each field wraps its label, control, help and error. States live in data-state, paired with ARIA.
New parts (× is how many times a part is used in this build)
c-form-field, used 3 times in this buildc-input, used 3 times in this buildAlso in this build l-stack, used 1 time in this build l-cluster, used 1 time in this build c-button, used 1 time in this build
Checkboxes pick any number, radios pick exactly one, a toggle applies straight away. All three keep the native input, so every state is a real attribute, not a class.
New parts (× is how many times a part is used in this build)
c-checkbox, used 2 times in this buildc-radio, used 2 times in this buildc-toggle, used 1 time in this buildAlso in this build l-grid, used 1 time in this build c-form-field, used 2 times in this build l-stack, used 3 times in this build
Alerts are printed notices, not bricks: paper and a keyline, no shadow. Severity shows three ways at once, as a shaped icon, a hidden word and a heavier bottom edge, so it never rests on color.
Information: Maintenance on 3 October 2026
Sign-in is paused from 22:00 to 23:00 UTC.
Success: Invoice sent
Acme Inc. will get it by email in a few minutes.
Error: The changes weren't saved
The connection dropped. Check your network and save again.
Prefer a native dialog opened with showModal(). The preview below is contained; the button opens the real thing.
New parts (× is how many times a part is used in this build)
c-modal, used 1 time in this buildAlso in this build u-margin-0, used 1 time in this build c-button, used 2 times in this build
An agent wrote this sign-up form from memory. npx mcss-lite validate found 4 problems, and the rebuilt form passes with 0 issues. Both results come from the real validator, run when this page was built.
What the agent wrote
<form class="c-form">
<input class="c-input" type="email" placeholder="Work email">
<p style="color: #d93025">We never share your email.</p>
<button class="c-button c-button--primary">Submit</button>
</form>
validate: 1 error, 3 warnings
[unknown-class][label-missing][raw-color][content-vague]The piece that fits
<form class="l-stack">
<div class="c-form-field">
<label class="c-form-field__label" for="signup-email">Work email</label>
<input class="c-input" type="email" id="signup-email" aria-describedby="signup-email-help">
<p class="c-form-field__help" id="signup-email-help">We never share your email.</p>
</div>
<div class="l-cluster">
<button type="submit" class="c-button c-button--primary">Create account</button>
</div>
</form>
validate: 0 issues
Point your agent at AGENTS.md before it writes markup, and run npx mcss-lite validate after every edit.
The agent's form: 4 problems caught by validate, 0 in the rebuild.
Every build is checked: text and controls meet WCAG AA contrast in light and dark, every token name from 0.1.0 still exists, and every example on these pages passes the validator.
Good fit
mcss-lite validate checks what they wrote.Pick something else