CSS is Awesome

the sketchbook

Notes from the margins.

Three drawers: how the system gets built, the new CSS found along the way, and where AI meets stylesheets. New posts when there's something worth saying.

CSS Is Awesome

Post-mortems and build stories from the repo — published only after the fix ships.

engineering6 min

Printing a design system

cia's pages turn into real printed documents — cover, table index, numbered sheets, followable links — with zero JavaScript and no PDF library. The generator was in the browser the whole time; we only had to ship the styling layer, and each honest-looking feature hid a smaller, sharper bug than we expected.

  • css
  • print
  • pdf
  • page-breaks
  • design-system

engineering4 min

The tabs that highlighted but never switched

A zero-JS tabs component shipped with a one-element off-by-one that CSS can't even express a fix for — and the only reason we found it was converting the docs to live demos. A post-mortem, plus everything else that changed in one very long day.

  • css
  • post-mortem
  • mobile
  • layout
  • design-system

engineering5 min

The import in our README did not work

Sass does not read package.json exports. Both documented imports failed on a clean install, and every check we had stayed green.

  • sass
  • packaging
  • npm
  • post-mortem
  • testing

architecture7 min

A barrel that emits nothing

Next.js CSS Modules reject a top-level :root, so cia's authoring entry point had to print zero bytes until a mixin is called. Here is how, and what it cost.

  • sass
  • scss
  • css-modules
  • nextjs
  • api-design

engineering8 min

An MCP server for a CSS library

Agents guess at mixin signatures because prose docs give them nothing to query. cia ships a stdio MCP server that reads the SCSS instead. What broke along the way.

  • mcp
  • ai
  • tooling
  • developer-experience

engineering8 min

From 0.8 to 1.0

We cut 1.0 on 2026-08-17 with 24 of 42 planned stories done and an entire epic unstarted. Here is the reasoning, and what actually changed.

  • release
  • semver
  • versioning

technique8 min

Print to PDF with zero JavaScript

The browser already ships a PDF generator. cia's print layer is four mixins, three CSS variables, and no JavaScript at all.

  • print
  • pdf
  • css
  • zero-js

architecture6 min

Recipes, not components

cia ships markdown patterns instead of a component library. Here is what that buys you, and the bug fix you give up to get it.

  • recipes
  • accessibility
  • architecture
  • zero-js

engineering7 min

The validator that wasn't looking

Seven themes scored 0 of 17 contrast pairs and the validator still printed a green check. A post-mortem on 119 silent skips and the parser that caused them.

  • accessibility
  • testing
  • post-mortem
  • css

technique6 min

Your brand comes with you

npx cia migrate reads your Tailwind config or Bootstrap variables and writes a cia theme.scss, with a confidence rating on every token it maps.

  • migration
  • tailwind
  • bootstrap
  • cli

CSS

New and cool CSS from the platform's edge — the discovery is the star; cia is the sponsor.

discovery4 min

CSS anchor positioning is a dropdown engine

anchor-name, three inset lines, and position-try-fallbacks replace the positioning half of a dropdown library — trigger-width menus that flip above the trigger when the viewport would clip them, re-evaluated by the browser on every open.

  • css
  • anchor-positioning
  • popover
  • layout
  • progressive-enhancement

discovery4 min

The popover attribute's invisible UA stylesheet

Half of what makes [popover] work is user-agent CSS you can silently destroy with one innocent declaration. Three ways we broke it — a permanently open menu, a menu that refused to be full-width, and the inset trick that un-centers the overlay.

  • css
  • popover
  • cascade
  • ua-styles
  • debugging

discovery4 min

There is no :nth-of-class, and it will bite you

nth-of-type counts element types, not classes — and the selector everyone assumes exists, :nth-of-class, never has. How one same-type sibling shifts every index by one, why the bug looks wired while being broken, and the modern selector that finally fixes it.

  • css
  • selectors
  • nth-of-type
  • nth-child
  • debugging
Theme