<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>css-is-awesome blog</title>
  <subtitle>Engineering the system, and the new CSS found along the way.</subtitle>
  <id>https://cssisawesome.com/feed.xml</id>
  <link rel="self" type="application/atom+xml" href="https://cssisawesome.com/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/"/>
  <updated>2026-09-06T00:00:00Z</updated>
  <entry>
    <title>CSS anchor positioning is a dropdown engine</title>
    <id>https://cssisawesome.com/blog/css-anchor-positioning-dropdown-engine/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/css-anchor-positioning-dropdown-engine/"/>
    <published>2026-09-06T00:00:00Z</published>
    <updated>2026-09-06T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="discovery" label="discovery"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Printing a design system</title>
    <id>https://cssisawesome.com/blog/printing-a-design-system/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/printing-a-design-system/"/>
    <published>2026-09-06T00:00:00Z</published>
    <updated>2026-09-06T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="engineering" label="engineering"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>The popover attribute's invisible UA stylesheet</title>
    <id>https://cssisawesome.com/blog/the-popover-attributes-invisible-ua-stylesheet/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/the-popover-attributes-invisible-ua-stylesheet/"/>
    <published>2026-09-06T00:00:00Z</published>
    <updated>2026-09-06T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="discovery" label="discovery"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>There is no :nth-of-class, and it will bite you</title>
    <id>https://cssisawesome.com/blog/there-is-no-nth-of-class/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/there-is-no-nth-of-class/"/>
    <published>2026-09-06T00:00:00Z</published>
    <updated>2026-09-06T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="discovery" label="discovery"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>The tabs that highlighted but never switched</title>
    <id>https://cssisawesome.com/blog/the-tabs-that-highlighted-but-never-switched/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/the-tabs-that-highlighted-but-never-switched/"/>
    <published>2026-09-04T00:00:00Z</published>
    <updated>2026-09-04T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="engineering" label="engineering"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>The import in our README did not work</title>
    <id>https://cssisawesome.com/blog/the-import-in-our-readme-did-not-work/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/the-import-in-our-readme-did-not-work/"/>
    <published>2026-08-18T00:00:00Z</published>
    <updated>2026-08-18T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="engineering" label="engineering"/>
    <summary>Sass does not read package.json exports. Both documented imports failed on a clean install, and every check we had stayed green.</summary>
  </entry>
  <entry>
    <title>A barrel that emits nothing</title>
    <id>https://cssisawesome.com/blog/a-barrel-that-emits-nothing/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/a-barrel-that-emits-nothing/"/>
    <published>2026-08-17T00:00:00Z</published>
    <updated>2026-08-17T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="architecture" label="engineering"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>An MCP server for a CSS library</title>
    <id>https://cssisawesome.com/blog/an-mcp-server-for-a-css-library/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/an-mcp-server-for-a-css-library/"/>
    <published>2026-08-17T00:00:00Z</published>
    <updated>2026-08-17T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="engineering" label="engineering"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>From 0.8 to 1.0</title>
    <id>https://cssisawesome.com/blog/from-0-8-to-1-0/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/from-0-8-to-1-0/"/>
    <published>2026-08-17T00:00:00Z</published>
    <updated>2026-08-17T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="engineering" label="engineering"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Print to PDF with zero JavaScript</title>
    <id>https://cssisawesome.com/blog/print-to-pdf-with-zero-javascript/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/print-to-pdf-with-zero-javascript/"/>
    <published>2026-08-17T00:00:00Z</published>
    <updated>2026-08-26T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="technique" label="engineering"/>
    <summary>The browser already ships a PDF generator. cia's print layer is four mixins, three CSS variables, and no JavaScript at all.</summary>
  </entry>
  <entry>
    <title>Recipes, not components</title>
    <id>https://cssisawesome.com/blog/recipes-not-components/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/recipes-not-components/"/>
    <published>2026-08-17T00:00:00Z</published>
    <updated>2026-08-17T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="architecture" label="engineering"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>The validator that wasn't looking</title>
    <id>https://cssisawesome.com/blog/the-validator-that-wasnt-looking/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/the-validator-that-wasnt-looking/"/>
    <published>2026-08-17T00:00:00Z</published>
    <updated>2026-08-17T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="engineering" label="engineering"/>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Your brand comes with you</title>
    <id>https://cssisawesome.com/blog/your-brand-comes-with-you/</id>
    <link rel="alternate" type="text/html" href="https://cssisawesome.com/blog/your-brand-comes-with-you/"/>
    <published>2026-08-17T00:00:00Z</published>
    <updated>2026-08-17T00:00:00Z</updated>
    <author><name>Jerry Hansen</name></author>
    <category term="technique" label="engineering"/>
    <summary>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.</summary>
  </entry>
</feed>
