Slide A
Scroll right to see siblings snap.
Solves the pain points modern CSS finally lets you solve —
light-dark() theming, JS-free menus via Popover +
Anchor Positioning, :user-invalid forms, container
queries, and Cascade Layers. ~24 KB gzipped.
Tip: click the coloured dot in the top-right to change the brand
colour — every accent re-tints automatically via
color-mix().
What you actually get when you drop the framework in.
Set the accent colour once and every button, link, focus ring, hover state, and shade follows. No config rebuild, no Sass recompile, no hunting through variables. Try the colour picker in the top-right.
Light and dark modes are defined together, not in two
separate files. No dark: prefix on every
utility, no parallel theme to maintain — just flip the
attribute and everything adapts.
Empty required fields don't turn red the moment the page loads. Validation styling only appears after the user actually interacts with the field. Helper text, required asterisks, and error colours are handled for you.
Built on the browser's own dialog, popover, and details elements. You get accessible overlays, escape-to-close, focus restoration, and click-outside dismissal without writing or importing any JS.
!important battles
Utility classes are guaranteed to win over component
styles. Adjust a margin, override a colour, change a
border — it just works. No specificity wars, no
!important chains.
The same card looks right whether it's in a narrow sidebar or a wide hero. Components respond to the space they're given, not the size of the page.
Stack things vertically, cluster them in a wrap-friendly row, put a sidebar next to main content — each layout is one class. Less hand-written flex and grid, fewer breakpoint guesses.
Modals, toasts, and slideovers fade in when opening and fade out when closing — automatically, both directions. No manual timing code, no animation-end juggling.
Buttons, modals, tables, navigation, cards, alerts, tabs, badges, avatars, tooltips, toasts, pagination, skeletons, empty states, popovers, forms — drop them in and they look right.
Focus rings that show only on keyboard navigation, AA-grade contrast, motion that respects user preferences, touch-friendly hit areas, a real print stylesheet — all built in, no setup.
The whole framework drops in with a single
<link> tag. No external fonts to load,
no icon pack to bundle, no JavaScript runtime. Open the
page and it works.
Uses what browsers can actually do today — modern layout, modern theming, modern selectors. No polyfills, no legacy workarounds, no fighting with things the platform handles natively.
Fluid headings via clamp(). Orphan-free wrapping via
text-wrap: balance on headings and
pretty on paragraphs.
A paragraph of body text. Long enough to wrap onto two lines so
the text-wrap: pretty default avoids leaving a
single orphan word on the last line.
Blockquotes get a left accent border and a subtle tinted background that adapts to light or dark mode.
Inline code and a preformatted block:
const greet = name => `hello, ${name}`;
A 12-column CSS Grid with gap. No negative margins,
no per-column padding. Plus auto-fit and auto-flow patterns.
.row + .col-N)<div class="row"> <div class="col-6">…</div> <div class="col-6">…</div> </div>
.row-auto)Each child takes an equal share — no column numbers needed.
.grid-auto-fit)
Wraps to as many columns as fit, each at least
--cell-min wide. No media queries.
<div class="grid-auto-fit" style="--cell-min: 10rem;"> <div>…</div> </div>
Native form controls, brand-tinted via accent-color.
Validation uses :user-invalid — it only kicks in
after the user interacts, so a pristine form never looks angry.
Container queries in action — each card adapts its padding to its own width, not the viewport.
A card with just a body.
Header + body + footer.
1,284
Active users this week.
Resize your window — both cards stay readable, but the wider one
picks up generous padding via @container.
Smaller padding because this card is < 32rem wide.
More padding kicks in at @container (min-width: 32rem).
Inline contextual messaging.
Above the divider.
Below the divider.
<details>)Baseline 2024+ — Safari 17.5+, Chrome 117+, Firefox 121+.
Build from source — comment out the @use lines in
src/minimacss.scss you don't need, then
npm run build.
It's plain CSS. It works with any framework that renders HTML.
Modal uses the native <dialog> +
@starting-style +
transition-behavior: allow-discrete — it animates
both open and close, including from display: none.
| # | Name | Role | Status |
|---|---|---|---|
| 1 | Ada Lovelace | Engineer | Active |
| 2 | Alan Turing | Cryptographer | Active |
| 3 | Grace Hopper | Compiler architect | Away |
| 4 | Edsger Dijkstra | Theorist | Inactive |
<details>)
Modal, slideover and toast all transition both directions —
including from display: none — by combining
transition-behavior: allow-discrete with a
@starting-style rule. Open and close any of the
overlays in the previous section to see it in action.
The native pseudo-class only matches once the user has interacted with the field. No JS class toggling. Try the form below: empty + un-touched looks neutral; submit it to trigger invalid styling.
.py-fluid-xl, .px-fluid-lg etc. scale
with viewport using clamp(). Resize your window to
watch the panel grow and shrink.
Utilities live in @layer utilities; components in
@layer components. Utility classes win over
component styles without ever needing !important.
Here, the .bg-success utility overrides the
.btn-primary background — no specificity hacks.
One-line solutions for the layouts you currently write by hand.
Each takes a --space variable for instance-level
tuning.
Native popover attribute +
popovertarget button + CSS Anchor Positioning. The
browser handles open/close, light dismiss, escape-to-close,
focus restoration. Zero JavaScript.
Auto-asterisk on required (:has(:required)).
Auto-invalid helper colour on :has(:user-invalid).
No JavaScript to toggle .is-invalid.
.kbd
Prefix/suffix slots that share a single focus ring via
:has(:focus-visible). Native keyboard chip via
.kbd.
Press ⌘ + K to search, or Esc to dismiss this modal.
Drop-in loading placeholders and "no data yet" panels. Skeleton
shimmer is automatically disabled under
prefers-reduced-motion.
When your customers place an order it'll appear here. Want to test the dashboard? Create a sample order.
CSS-only carousels and horizontal chip rows. Drag, swipe, or
arrow-key. Children snap to start,
center, or end.
Scroll right to see siblings snap.
Each card snaps to start.
No JavaScript carousel library.
Just scroll-snap-type.