<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Effeilo</title>
    <description>The latest articles on Forem by Effeilo (@effeilo).</description>
    <link>https://forem.com/effeilo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3861115%2F7caf2681-f773-4c10-b3eb-c2be2b46e66a.png</url>
      <title>Forem: Effeilo</title>
      <link>https://forem.com/effeilo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/effeilo"/>
    <language>en</language>
    <item>
      <title>Normalize.css Is Dead. Here's What to Use Instead.</title>
      <dc:creator>Effeilo</dc:creator>
      <pubDate>Sat, 04 Apr 2026 14:40:31 +0000</pubDate>
      <link>https://forem.com/effeilo/normalizecss-is-dead-heres-what-to-use-instead-537k</link>
      <guid>https://forem.com/effeilo/normalizecss-is-dead-heres-what-to-use-instead-537k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2xly79sfoh9ku4zghnj5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2xly79sfoh9ku4zghnj5.jpg" alt="Normalize.css Is Dead. Here's What to Use Instead." width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not just a reset. A browser upgrade.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Normalize.css was a landmark project. For years, it was the go-to starting point for web projects: a reliable, well-documented file that ironed out browser inconsistencies without erasing everything like a CSS reset would.&lt;/p&gt;

&lt;p&gt;But normalize.css is no longer maintained. The last commit was in 2019. The browsers it was written for have moved on. And the web has moved on with them.&lt;/p&gt;

&lt;p&gt;So what should you use instead in 2026?&lt;/p&gt;




&lt;h2&gt;
  
  
  What Normalize.css Actually Did
&lt;/h2&gt;

&lt;p&gt;Normalize.css had a clear, singular goal: make browsers render HTML elements consistently, without removing styles that are useful by default.&lt;/p&gt;

&lt;p&gt;It preserved heading sizes, list markers, and form element rendering. It fixed known browser bugs. It was deliberately minimal and unopinionated.&lt;/p&gt;

&lt;p&gt;That philosophy was sound. But it left a lot on the table.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It Is No Longer Enough
&lt;/h2&gt;

&lt;p&gt;Normalize.css was never designed to handle what modern web development requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User preferences.&lt;/strong&gt; &lt;code&gt;prefers-color-scheme&lt;/code&gt;, &lt;code&gt;prefers-reduced-motion&lt;/code&gt;, &lt;code&gt;prefers-contrast&lt;/code&gt;, &lt;code&gt;forced-colors&lt;/code&gt;. None of these existed when normalize.css was written. None of them are handled by its successors either.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern CSS properties.&lt;/strong&gt; &lt;code&gt;text-wrap: balance&lt;/code&gt;, &lt;code&gt;field-sizing: content&lt;/code&gt;, &lt;code&gt;scrollbar-gutter&lt;/code&gt;, &lt;code&gt;@starting-style&lt;/code&gt;. These are production-ready today and belong in a base stylesheet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard accessibility.&lt;/strong&gt; &lt;code&gt;:focus-visible&lt;/code&gt; replaces the blunt &lt;code&gt;:focus&lt;/code&gt; selector. Without it, removing the default outline harms keyboard users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Form UX.&lt;/strong&gt; &lt;code&gt;:user-valid&lt;/code&gt; and &lt;code&gt;:user-invalid&lt;/code&gt; enable validation feedback only after the user has interacted with a field, not on page load.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Normalize.css does none of this. Neither does its most direct successor, modern-normalize.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Passed On
&lt;/h2&gt;

&lt;p&gt;Normalize.css also established quality standards worth acknowledging: a readable file, organized into clear sections, with a precise comment above each CSS rule explaining why it is there and what bug or behavior it addresses.&lt;/p&gt;

&lt;p&gt;That care for inline documentation is rare in stylesheets. It turns a CSS file into a learning resource: you understand the reasoning, not just the result.&lt;/p&gt;

&lt;p&gt;browserux.css was directly inspired by this approach. Every rule is commented, every section is delimited, every choice is justified. The goal is the same: the file should be readable and understandable by anyone who opens it, not just its author.&lt;/p&gt;

&lt;p&gt;That is normalize.css's most lasting contribution, and it is worth carrying forward.&lt;/p&gt;




&lt;h2&gt;
  
  
  What About modern-normalize?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/sindresorhus/modern-normalize" rel="noopener noreferrer"&gt;modern-normalize&lt;/a&gt; is actively maintained and well-regarded. It inherits normalize.css's philosophy of doing one thing: fixing cross-browser inconsistencies.&lt;/p&gt;

&lt;p&gt;It is a good choice if that is all you need. But it deliberately stops there. No user preferences, no modern CSS features, no accessibility improvements beyond what browsers already provide.&lt;/p&gt;

&lt;p&gt;If you reach for modern-normalize, you will still end up adding the rest yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  A More Complete Alternative: browserux.css
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Effeilo/browserux.css" rel="noopener noreferrer"&gt;browserux.css&lt;/a&gt; starts where normalize.css and modern-normalize stop.&lt;/p&gt;

&lt;p&gt;It handles cross-browser normalization, adds a minimal reset where practical (because nobody actually stops at pure normalization), and layers in the modern CSS features and accessibility improvements that a base stylesheet should cover in 2026.&lt;/p&gt;

&lt;p&gt;Here is what you get that normalize.css never provided:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System preference support:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-contrast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-transparency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forced-colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Keyboard focus, done right:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;:focus-visible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--bux-color-focus&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;outline-offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Auto-resizing textarea:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;field-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Layout shift prevention:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;scrollbar-gutter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Balanced headings:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h6&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Which One Should You Use?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;normalize.css&lt;/th&gt;
&lt;th&gt;modern-normalize&lt;/th&gt;
&lt;th&gt;browserux.css&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Actively maintained&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-browser normalization&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User preference support&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modern CSS features&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keyboard focus (&lt;code&gt;:focus-visible&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Form validation UX&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native dark mode&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you are starting a new project today and writing your CSS manually, browserux.css is the more complete starting point. If you only need cross-browser normalization and nothing else, modern-normalize is the right tool. You can explore what browserux.css adds on the &lt;a href="https://browseruxcss.com/demo/" rel="noopener noreferrer"&gt;interactive demo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What you should not use is normalize.css. It served its purpose. It is no longer maintained. The web has moved on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try browserux.css
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/gh/Effeilo/browserux.css/browserux.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://browseruxcss.com/" rel="noopener noreferrer"&gt;Project website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://browseruxcss.com/demo/" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Effeilo/browserux.css" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Effeilo/browserux.css/blob/main/docs/index.md" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>opensource</category>
    </item>
    <item>
      <title>5 Modern CSS Features Your Reset Sheet Is Probably Missing in 2026</title>
      <dc:creator>Effeilo</dc:creator>
      <pubDate>Sat, 04 Apr 2026 14:38:02 +0000</pubDate>
      <link>https://forem.com/effeilo/5-modern-css-features-your-reset-sheet-is-probably-missing-in-2026-4l16</link>
      <guid>https://forem.com/effeilo/5-modern-css-features-your-reset-sheet-is-probably-missing-in-2026-4l16</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Famnxor0ey1wk4z8606it.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Famnxor0ey1wk4z8606it.jpg" alt="5 Modern CSS Features Your Reset Sheet Is Probably Missing in 2026" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not just a reset. A browser upgrade.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most CSS reset sheets were written years ago and have not changed much since. They handle the basics: &lt;code&gt;box-sizing&lt;/code&gt;, margins, font inheritance. But CSS has moved fast, and a new generation of properties is now widely supported enough to use in production.&lt;/p&gt;

&lt;p&gt;Here are five modern CSS features that belong in your base stylesheet in 2026, and that most reset sheets are still ignoring.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;code&gt;text-wrap: balance&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Unbalanced headings are one of the most common typographic issues on the web. A title breaks onto two lines, with one long line and one word hanging alone underneath. It looks unfinished, and it is entirely avoidable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;h6&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;text-wrap: balance&lt;/code&gt; tells the browser to distribute text as evenly as possible across lines. No JavaScript, no manual &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt;, no magic numbers. One line of CSS, applied globally to all headings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; Chrome 114+, Firefox 121+, Safari 17.5+.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;code&gt;field-sizing: content&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Textareas have always been a pain point. By default, they are a fixed size and do not grow as the user types. The traditional solution involves a JavaScript resize observer or a hidden mirror element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;field-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;field-sizing: content&lt;/code&gt; makes the textarea grow automatically as content is added, with no script required. It also works on &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; elements, making them expand to fit their content.&lt;/p&gt;

&lt;p&gt;As a fallback for unsupported browsers (currently Firefox and Safari), keep &lt;code&gt;resize: vertical&lt;/code&gt; so the user can resize manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; Chrome 123+, Edge 123+. Firefox and Safari support is in progress.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;code&gt;scrollbar-gutter: stable&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Layout shifts caused by the scrollbar are a classic problem. When a page transitions from short to tall content, the scrollbar appears and pushes the layout by 15 to 17 pixels. The content jumps. It looks broken.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;scrollbar-gutter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;scrollbar-gutter: stable&lt;/code&gt; reserves space for the scrollbar permanently, even when it is not visible. The layout never shifts. No padding hacks, no JavaScript measurement, no &lt;code&gt;overflow-y: scroll&lt;/code&gt; side effects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; Chrome 94+, Firefox 97+, Safari 15.4+.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;code&gt;@starting-style&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Entry animations on the web have always required JavaScript: adding a class after the element is inserted into the DOM, waiting a frame, triggering a transition. It is boilerplate everyone has written a dozen times.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;dialog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;0.3s&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="err"&gt;@starting-style&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;@starting-style&lt;/code&gt; defines the initial state of an element before its first render. The browser transitions from that state to the normal state automatically. No JavaScript, no class toggling, no &lt;code&gt;requestAnimationFrame&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It works particularly well with the native &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; element, which now has broad support and is the right way to handle modals in 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; Chrome 117+, Firefox 129+, Safari 17.5+.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;code&gt;color-scheme: light dark&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Dark mode support is often treated as a feature to build later, with CSS variables, a toggle button, and a &lt;code&gt;localStorage&lt;/code&gt; preference. That works, but there is a simpler approach for the base layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single declaration tells the browser to adapt its native elements (scrollbars, form controls, dialogs, the page background) to the user's system preference automatically. No media query, no variable swap, no JavaScript.&lt;/p&gt;

&lt;p&gt;For a complete dark mode implementation with CSS variables, you still need &lt;code&gt;prefers-color-scheme&lt;/code&gt;. But &lt;code&gt;color-scheme&lt;/code&gt; alone already handles everything the browser controls natively.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;--bux-color-background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1a1a1a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;--bux-color-text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#e8e8e8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Browser support:&lt;/strong&gt; Chrome 81+, Firefox 96+, Safari 13+.&lt;/p&gt;




&lt;h2&gt;
  
  
  All Five, Already in Your Base Stylesheet
&lt;/h2&gt;

&lt;p&gt;These five properties are included in &lt;a href="https://github.com/Effeilo/browserux.css" rel="noopener noreferrer"&gt;browserux.css&lt;/a&gt;, a minimal CSS foundation built around modern UX and accessibility. Drop it in before your own styles and you get all of this, plus consistent cross-browser normalization, keyboard focus management, form validation UX, and full system preference support. See it in action on the &lt;a href="https://browseruxcss.com/demo/" rel="noopener noreferrer"&gt;interactive demo&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/gh/Effeilo/browserux.css/browserux.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://browseruxcss.com/" rel="noopener noreferrer"&gt;Project website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://browseruxcss.com/demo/" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Effeilo/browserux.css" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>a11y</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Why I Built browserux.css</title>
      <dc:creator>Effeilo</dc:creator>
      <pubDate>Sat, 04 Apr 2026 14:35:00 +0000</pubDate>
      <link>https://forem.com/effeilo/why-i-built-browseruxcss-1hao</link>
      <guid>https://forem.com/effeilo/why-i-built-browseruxcss-1hao</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4nhcwfp1w6ryd0wgrpb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4nhcwfp1w6ryd0wgrpb.jpg" alt="Why I Built browserux.css" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not just a reset. A browser upgrade.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every web project starts the same way. You add normalize.css or a CSS reset, and move on. Then three hours later, you add a media query for &lt;code&gt;prefers-reduced-motion&lt;/code&gt;. Two weeks after that, you copy a scrollbar snippet from Stack Overflow. A month later, you fix focus styles for keyboard users.&lt;/p&gt;

&lt;p&gt;By the end of the project, you have accumulated a dozen CSS fragments scattered across files, pulled from different sources, with no structure and no coherence. Then you do it again on the next project.&lt;/p&gt;

&lt;p&gt;browserux.css was born from that observation.&lt;/p&gt;




&lt;h2&gt;
  
  
  It Started with ergonomize.css
&lt;/h2&gt;

&lt;p&gt;Before browserux.css, I built &lt;a href="https://github.com/Effeilo/ergonomize.css" rel="noopener noreferrer"&gt;ergonomize.css&lt;/a&gt;: a CSS file designed to complement normalize.css with practical UX improvements. It handled things normalize.css deliberately ignored: form ergonomics, media queries for user preferences, mobile tap delays.&lt;/p&gt;

&lt;p&gt;It worked, but it was a complement, not a foundation. Over time, I wanted to go further: merge the normalization, the ergonomics, and the accessibility into a single, structured file. That file became browserux.css.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem It Solves
&lt;/h2&gt;

&lt;p&gt;In most web projects, the CSS foundation is assembled on the fly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A reset or normalize.css to start&lt;/li&gt;
&lt;li&gt;A few snippets for better form rendering&lt;/li&gt;
&lt;li&gt;Some media queries for user preferences&lt;/li&gt;
&lt;li&gt;Focus style fixes for keyboard navigation&lt;/li&gt;
&lt;li&gt;Scrollbar tweaks copied from a blog post&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These adjustments come from different sources, added at different times, with no global structure. The result: a growing pile of scattered CSS that every new project inherits and rarely cleans up.&lt;/p&gt;

&lt;p&gt;There is also an unspoken lie in how normalize.css gets used. In theory, it is enough: it normalizes without resetting, preserves useful styles, and lets the browser do its job. That is a respectable philosophy. In practice, nobody stops there. A global &lt;code&gt;box-sizing: border-box&lt;/code&gt;, margin resets on headings, padding removal on lists... these adjustments are nearly universal, but normalize.css does not make them because that is not its purpose.&lt;/p&gt;

&lt;p&gt;The real-world result: normalize.css plus a custom reset plus additional snippets. Three stacked layers where one would do. browserux.css starts from that observation and is honest about it: yes, there is some reset in there. Better to do it cleanly, once, in a single structured file.&lt;/p&gt;

&lt;p&gt;There is a third problem, more subtle: CSS moves fast. New properties regularly reach enough browser adoption to be used safely in production. &lt;code&gt;field-sizing&lt;/code&gt;, &lt;code&gt;text-wrap: balance&lt;/code&gt;, &lt;code&gt;@starting-style&lt;/code&gt;, &lt;code&gt;scrollbar-gutter&lt;/code&gt;... Knowing what to adopt, when, and with which fallbacks, requires constant monitoring that most projects cannot afford.&lt;/p&gt;

&lt;p&gt;browserux.css also solves that: staying current with the latest CSS features as browser support matures, without having to do that research yourself. Each version integrates new properties at the point where their support is broad enough to use with confidence.&lt;/p&gt;

&lt;p&gt;browserux.css replaces that pile with a single unified file: opinionated where it needs to be, minimal everywhere else.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;Built around four pillars:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reset.&lt;/strong&gt; Removes unwanted browser defaults while preserving behaviors that are useful and semantic. Not a scorched-earth reset that strips everything indiscriminately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normalization.&lt;/strong&gt; Consistent rendering across browsers, without overriding styles that already work well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usability.&lt;/strong&gt; Smooth scrolling, responsive media, auto-resizing textareas, layout shift prevention, mobile tap optimization. Better UX by default, before JavaScript enters the picture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessibility.&lt;/strong&gt; Native dark mode, reduced motion, high contrast support, forced colors for Windows High Contrast Mode, keyboard-only focus with &lt;code&gt;:focus-visible&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That last pillar is what truly sets browserux.css apart. Five system preferences covered natively, in pure CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-contrast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-transparency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forced-colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No other mainstream CSS foundation covers all five. Zero JavaScript required.&lt;/p&gt;

&lt;p&gt;You can see all of these features in action on the &lt;a href="https://browseruxcss.com/demo/" rel="noopener noreferrer"&gt;interactive demo&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who It Is For
&lt;/h2&gt;

&lt;p&gt;browserux.css is for developers who write their CSS manually, with or without a preprocessor (Sass, PostCSS), and want a solid foundation without starting from scratch on every project.&lt;/p&gt;

&lt;p&gt;If you use Tailwind, Bootstrap, or another CSS framework, their built-in base is likely a better fit for your context. browserux.css is not designed to sit on top of a utility framework.&lt;/p&gt;

&lt;p&gt;It is also not a framework itself. It provides no grid, no components, no utility classes. It prepares the ground so everything you build on top of it starts from a clean, accessible, up-to-date baseline.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/gh/Effeilo/browserux.css/browserux.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://browseruxcss.com/" rel="noopener noreferrer"&gt;Project website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://browseruxcss.com/demo/" rel="noopener noreferrer"&gt;Live demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Effeilo/browserux.css" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Effeilo/browserux.css/blob/main/docs/index.md" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>a11y</category>
    </item>
  </channel>
</rss>
