<?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>DEV Community: NuvoUI</title>
    <description>The latest articles on DEV Community by NuvoUI (@nuvoui).</description>
    <link>https://dev.to/nuvoui</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3076038%2F6af6ca47-3500-4b0b-8c01-6714a392e02b.png</url>
      <title>DEV Community: NuvoUI</title>
      <link>https://dev.to/nuvoui</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nuvoui"/>
    <language>en</language>
    <item>
      <title>NuvoUI 2.0: The SCSS Foundation for Design Systems</title>
      <dc:creator>NuvoUI</dc:creator>
      <pubDate>Wed, 14 Oct 2026 05:32:44 +0000</pubDate>
      <link>https://dev.to/nuvoui/nuvoui-20-the-scss-foundation-for-design-systems-2k75</link>
      <guid>https://dev.to/nuvoui/nuvoui-20-the-scss-foundation-for-design-systems-2k75</guid>
      <description>&lt;p&gt;In April 2025 we introduced NuvoUI, an SCSS framework built around readable class names and an &lt;code&gt;apply()&lt;/code&gt; mixin that takes any value. Version 2.0 keeps both and rebuilds core as the foundation layer of a design system. &lt;code&gt;@nuvoui/core&lt;/code&gt; 2.0.1 is now on npm.&lt;/p&gt;

&lt;p&gt;This post covers what changed, why, and how to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  What NuvoUI is
&lt;/h2&gt;

&lt;p&gt;NuvoUI core is a human-readable, utility-first SCSS framework and the foundation layer of a design system. It gives you design tokens as CSS custom properties, utility classes with names in plain words (&lt;code&gt;between&lt;/code&gt;, &lt;code&gt;x-center&lt;/code&gt;), and SCSS mixins through &lt;code&gt;@include apply(...)&lt;/code&gt; that output the same tokens as the classes. It ships SCSS and CSS only: no JavaScript, no runtime, no PostCSS plugin. It requires Dart Sass 1.79.0 or later, below 2.0, because the OKLCH shade generator uses the colour space API added in Sass 1.79.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in 2.0, and why
&lt;/h2&gt;

&lt;p&gt;In 1.x, colour mixins output fixed colour values, and the custom properties had unprefixed names such as &lt;code&gt;--primary&lt;/code&gt; and &lt;code&gt;--text-color&lt;/code&gt;. A design system needs one set of decisions that every class, mixin and theme reads from. So 2.0 moves everything onto one token model, and light and dark themes are built from it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every scale is a &lt;code&gt;--nu-&lt;/code&gt; token.&lt;/strong&gt; Colour, space, radius, border width, font size, weight, line height, shadow, opacity, z-index, duration and easing are all emitted as custom properties: &lt;code&gt;--nu-space-4&lt;/code&gt;, &lt;code&gt;--nu-radius-md&lt;/code&gt;, &lt;code&gt;--nu-font-size-lg&lt;/code&gt;, &lt;code&gt;--nu-duration-200&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A fixed palette, and roles that flip.&lt;/strong&gt; Palette shades such as &lt;code&gt;--nu-red-500&lt;/code&gt; hold the same value in every theme and are declared on &lt;code&gt;:root&lt;/code&gt; only. Theme and role tokens (&lt;code&gt;--nu-bg-surface&lt;/code&gt;, &lt;code&gt;--nu-text-muted&lt;/code&gt;, &lt;code&gt;--nu-brand&lt;/code&gt;, &lt;code&gt;--nu-danger-subtle&lt;/code&gt;) change per theme: the dark theme points them at other stops of the same scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bare role names.&lt;/strong&gt; The roles are &lt;code&gt;brand&lt;/code&gt;, &lt;code&gt;success&lt;/code&gt;, &lt;code&gt;danger&lt;/code&gt;, &lt;code&gt;warning&lt;/code&gt; and &lt;code&gt;info&lt;/code&gt;. The fill is the bare name, &lt;code&gt;--nu-brand&lt;/code&gt;, with &lt;code&gt;-hover&lt;/code&gt;, &lt;code&gt;-active&lt;/code&gt;, &lt;code&gt;-subtle&lt;/code&gt; and &lt;code&gt;-border&lt;/code&gt; variants plus &lt;code&gt;--nu-text-brand&lt;/code&gt; and &lt;code&gt;--nu-text-on-brand&lt;/code&gt;. &lt;code&gt;primary&lt;/code&gt; is now &lt;code&gt;brand&lt;/code&gt;, and &lt;code&gt;secondary&lt;/code&gt; is gone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OKLCH scales.&lt;/strong&gt; Every role, palette hue and custom colour gets a generated scale in stops 50, 100 to 900, and 950.&lt;/p&gt;

&lt;p&gt;Configuration happens once, in the first &lt;code&gt;@use&lt;/code&gt;. Theme maps hold overrides only, and a value can reference a scale stop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"@nuvoui/core"&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;brand&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#4361ee&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;light-theme&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"brand"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;brand&lt;/span&gt; &lt;span class="nt"&gt;800&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;dark-theme&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"bg-base"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#121212&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;generate-utility-classes&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;true&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;An excerpt of what that compiles to:&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;--nu-brand-800&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#20309d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--nu-space-4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&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="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;light&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--nu-brand&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-brand-800&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="nt"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;dark&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;inverse&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--nu-bg-base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#121212&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--nu-brand&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-brand-400&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;h3&gt;
  
  
  Themes
&lt;/h3&gt;

&lt;p&gt;Themes are selected with attributes, not separate stylesheets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;data-theme="light"&lt;/code&gt; or &lt;code&gt;data-theme="dark"&lt;/code&gt; on any element themes that element and its subtree, so sections can be nested.&lt;/li&gt;
&lt;li&gt;Without a &lt;code&gt;data-theme&lt;/code&gt; attribute on the root, the page follows the operating system through &lt;code&gt;prefers-color-scheme&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data-theme="inverse"&lt;/code&gt; gives a section the opposite theme of the page.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;data-contrast="high"&lt;/code&gt; applies your &lt;code&gt;$high-contrast-light&lt;/code&gt; and &lt;code&gt;$high-contrast-dark&lt;/code&gt; maps. Both are empty by default, so nothing is emitted until you set values.
&lt;/li&gt;
&lt;/ul&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;html&lt;/span&gt; &lt;span class="na"&gt;data-theme=&lt;/span&gt;&lt;span class="s"&gt;"dark"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;data-theme=&lt;/span&gt;&lt;span class="s"&gt;"light"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;A light section inside a dark page&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;data-theme=&lt;/span&gt;&lt;span class="s"&gt;"inverse"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;The opposite of the page (light here)&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The class names do not change between themes. Only the attributes do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Readable classes
&lt;/h2&gt;

&lt;p&gt;Utility classes are opt-in through &lt;code&gt;$generate-utility-classes: true&lt;/code&gt;, as in 1.x. Tokens and base styles are emitted either way. Colour classes use theme words and roles, so markup stays theme-aware without extra work:&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;article&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-surface border border-regular rounded-md p-4 p-6@md"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-regular font-bold"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Invoice 1042&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-muted ms-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Due in 3 days&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-danger-subtle text-danger rounded-md p-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Payment failed&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-brand text-on-brand px-4 py-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Pay now&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex between x-center wrap gap-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Left&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Right&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A breakpoint is an &lt;code&gt;@&lt;/code&gt; suffix and applies from that width up (&lt;code&gt;p-6@md&lt;/code&gt;). A state is a prefix (&lt;code&gt;hover:bg-hover&lt;/code&gt;). Flex modifiers such as &lt;code&gt;between&lt;/code&gt; and &lt;code&gt;x-center&lt;/code&gt; go on the same element as &lt;code&gt;.flex&lt;/code&gt;, and flex child classes such as &lt;code&gt;grow&lt;/code&gt; and &lt;code&gt;fill-6&lt;/code&gt; work only on direct children of a &lt;code&gt;.flex&lt;/code&gt; parent.&lt;/p&gt;

&lt;p&gt;Colour classes have no responsive variants. There is no &lt;code&gt;bg-brand@md&lt;/code&gt;. For a colour that changes at a breakpoint, use the mixin.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;apply()&lt;/code&gt; with any value
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;apply()&lt;/code&gt; is where NuvoUI differs most from class-only tools. Every utility is also a mixin, and modifiers come after the call: state first, then breakpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"@nuvoui/core"&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;.mail-row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x-center&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;px&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="mi"&gt;.125rem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.hero&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;surface&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;lg&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;brand-subtle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;lg&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;Compiled:&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="nc"&gt;.mail-row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-space-3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.mail-row&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--nu-flex-gap&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-space-3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.mail-row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;padding-inline&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-space-4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;padding-block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.125rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.mail-row&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-bg-hover&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.hero&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-bg-surface&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-space-4&lt;/span&gt;&lt;span class="p"&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;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1024px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.hero&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-space-8&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;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1024px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.hero&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-brand-subtle&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;Two rules make this predictable. A unitless number is a configuration key: &lt;code&gt;p(4)&lt;/code&gt; gives &lt;code&gt;var(--nu-space-4)&lt;/code&gt;, the same value as the &lt;code&gt;.p-4&lt;/code&gt; class. (In 1.x, &lt;code&gt;p(4)&lt;/code&gt; gave &lt;code&gt;4rem&lt;/code&gt;.) A value with a unit passes through as written: &lt;code&gt;py(1.125rem)&lt;/code&gt; is exactly &lt;code&gt;1.125rem&lt;/code&gt;. Colour mixins output tokens, so &lt;code&gt;bg(brand-subtle)&lt;/code&gt; follows the theme: &lt;code&gt;--nu-brand-subtle&lt;/code&gt; points at &lt;code&gt;brand-50&lt;/code&gt; in the light theme and &lt;code&gt;brand-950&lt;/code&gt; in the dark theme.&lt;/p&gt;

&lt;p&gt;For hand-written properties, &lt;code&gt;token()&lt;/code&gt; returns the custom property for a name: &lt;code&gt;token(bg-raised)&lt;/code&gt; gives &lt;code&gt;var(--nu-bg-raised)&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errors that name the fix
&lt;/h2&gt;

&lt;p&gt;In 2.0, unknown keys, modifiers, colour names and theme tokens stop the compile, and the message tells you what to write instead. Drop the unit from the example above (&lt;code&gt;py(1.125)&lt;/code&gt;) and Dart Sass prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: "py: 1.125 is not a configured key. Valid keys: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64. Write a unit for a custom value (1.125px, 1.125rem)."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A misspelt state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: "apply(bg(hover) hovr): unknown modifier hovr. Use a breakpoint (xs, sm, md, lg, xl, 2xl) or a state (hover, focus, focus-visible, focus-within, active, visited, disabled, enabled, checked, required, invalid, valid, placeholder-shown, read-only, first-child, last-child, only-child, first-of-type, last-of-type, empty, target, group-hover)."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A token typo, and a typo in a theme map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: "token(text-mute): unknown token. Close matches: text-muted."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: "$light-theme has unknown tokens: bg-surfce. Fix the typo, or add a custom token to both $light-theme and $dark-theme."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 1.x name carried over:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: "bg(brand-default): renamed in 2.0, use bg(brand)."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compiler also warns when a computed &lt;code&gt;text-on-{role}&lt;/code&gt; colour reaches less than 4.5:1 contrast on its fill, and names the theme map that fixes it.&lt;/p&gt;

&lt;p&gt;This matters more now that a lot of UI code is written by AI assistants. With a framework that accepts anything, a hallucinated class or value ships silently and you find it in the browser. With NuvoUI, wrong code does not compile, and the error message is the instruction the agent needs for the next attempt.&lt;/p&gt;

&lt;p&gt;To make the first attempt more likely to be right, we publish &lt;a href="https://nuvoui.io/llms.txt" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt; with the rules that are easy to get wrong, and a full usage guide at &lt;a href="https://nuvoui.io/llms-full.txt" rel="noopener noreferrer"&gt;nuvoui.io/llms-full.txt&lt;/a&gt;. The same guide ships inside the npm package at &lt;code&gt;node_modules/@nuvoui/core/docs/llms-full.txt&lt;/code&gt;, next to the token reference and migration guide, so it matches the version you installed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Right to left
&lt;/h2&gt;

&lt;p&gt;2.0 adds logical utilities and mixins alongside the physical ones: &lt;code&gt;ms-*&lt;/code&gt;, &lt;code&gt;me-*&lt;/code&gt;, &lt;code&gt;ps-*&lt;/code&gt;, &lt;code&gt;pe-*&lt;/code&gt;, &lt;code&gt;start-*&lt;/code&gt;, &lt;code&gt;end-*&lt;/code&gt;, &lt;code&gt;border-s&lt;/code&gt;, &lt;code&gt;border-e&lt;/code&gt;, the &lt;code&gt;rounded-s*&lt;/code&gt; and &lt;code&gt;rounded-e*&lt;/code&gt; families, &lt;code&gt;text-start&lt;/code&gt; and &lt;code&gt;text-end&lt;/code&gt;. They follow the text direction under &lt;code&gt;dir="rtl"&lt;/code&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="nc"&gt;.ms-4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;margin-inline-start&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-space-4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.ml-4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&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;--nu-space-4&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;The physical classes (&lt;code&gt;ml-*&lt;/code&gt;, &lt;code&gt;pr-*&lt;/code&gt;, &lt;code&gt;text-left&lt;/code&gt;) remain for content that keeps its side in both directions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compile-time performance
&lt;/h2&gt;

&lt;p&gt;In 1.5.7, &lt;code&gt;apply()&lt;/code&gt; cached every parsed item and copied the whole cache on each insert, so compile time grew quadratically with the number of unique raw values. A stylesheet of 4,000 rules with three unique values each took 33 seconds. In 2.0 the caches are bounded and the cost per call does not grow with the rule count; a performance guard in the test suite checks it against the previous release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in the playground
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://nuvoui.io/playground/" rel="noopener noreferrer"&gt;playground&lt;/a&gt; runs Dart Sass in your browser. Write SCSS and HTML, see the compiled CSS, and preview the result in light, dark, an inverse section, high contrast and right to left. Compile errors show in a console panel, and you can copy a link to share what you wrote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrading from 1.x
&lt;/h2&gt;

&lt;p&gt;2.0 is a breaking release, and there is no compatibility layer for 1.x names. Every custom property is renamed to the &lt;code&gt;--nu-&lt;/code&gt; model, &lt;code&gt;primary&lt;/code&gt; becomes &lt;code&gt;brand&lt;/code&gt;, &lt;code&gt;secondary&lt;/code&gt; is removed, mixin numbers become configuration keys, shade values change because they are now generated in OKLCH, and validation is stricter throughout.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/NuvoUI/core/blob/main/docs/MIGRATION-v2.md" rel="noopener noreferrer"&gt;migration guide&lt;/a&gt; lists every rename with an upgrade checklist, and the &lt;a href="https://github.com/NuvoUI/core/blob/main/docs/TOKENS.md" rel="noopener noreferrer"&gt;token reference&lt;/a&gt; lists every token with its light and dark value. Many leftovers are caught for you: as shown above, the compiler points old names at their 2.0 replacements. Projects that cannot migrate now can stay on 1.x.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install and first steps
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; sass @nuvoui/core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure once in your main stylesheet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"@nuvoui/core"&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;brand&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#4361ee&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;generate-utility-classes&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;true&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;That form resolves through the package &lt;code&gt;sass&lt;/code&gt; export in Vite and webpack &lt;code&gt;sass-loader&lt;/code&gt;. With the Dart Sass command line, use the Node package importer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s2"&gt;"pkg:@nuvoui/core"&lt;/span&gt; &lt;span class="nt"&gt;as&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sass &lt;span class="nt"&gt;--pkg-importer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;node src/app.scss dist/app.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each compiled entry that loads the package emits the tokens, reset, base layer and tooltips (about 42 KB compressed, under 6 KB gzipped), so compile one entry that imports your partials rather than one stylesheet per component. If you want the default configuration with no build step, the package also ships &lt;code&gt;dist/nuvoui.min.css&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Core styles plain HTML buttons and form fields and includes CSS-only tooltips. It is a foundation layer, not a component library. If you are weighing it against other tools, the &lt;a href="https://nuvoui.io/vs/" rel="noopener noreferrer"&gt;comparison pages&lt;/a&gt; set out the differences with Tailwind CSS, Bootstrap and Ant Design, with sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Documentation: &lt;a href="https://nuvoui.io/core/" rel="noopener noreferrer"&gt;nuvoui.io/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Playground: &lt;a href="https://nuvoui.io/playground/" rel="noopener noreferrer"&gt;nuvoui.io/playground&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/NuvoUI/core" rel="noopener noreferrer"&gt;github.com/NuvoUI/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@nuvoui/core" rel="noopener noreferrer"&gt;@nuvoui/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;For AI tools: &lt;a href="https://nuvoui.io/llms.txt" rel="noopener noreferrer"&gt;nuvoui.io/llms.txt&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NuvoUI is MIT licensed. Bug reports and questions are welcome on &lt;a href="https://github.com/NuvoUI/core/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>scss</category>
      <category>designsystem</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introducing NuvoUI: A Developer-First SCSS Framework</title>
      <dc:creator>NuvoUI</dc:creator>
      <pubDate>Tue, 22 Apr 2025 17:03:14 +0000</pubDate>
      <link>https://dev.to/nuvoui/introducing-nuvoui-a-developer-first-scss-framework-4ndc</link>
      <guid>https://dev.to/nuvoui/introducing-nuvoui-a-developer-first-scss-framework-4ndc</guid>
      <description>&lt;p&gt;In the ever-evolving world of front-end development, speed, flexibility, and scalability are critical. After working extensively across projects of every scale - from startups to enterprises — we realized the existing CSS frameworks either overloaded projects with unnecessary styles or lacked true developer-first flexibility.&lt;/p&gt;

&lt;p&gt;This insight led to the birth of NuvoUI — a lightweight, modular, and powerfully customizable SCSS framework designed by developers, for developers.&lt;/p&gt;

&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%2Fpakanz2gednbv53p7r48.png" 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%2Fpakanz2gednbv53p7r48.png" alt="NuvoUI Logo "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why We Built NuvoUI
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Performance at the Core
&lt;/h4&gt;

&lt;p&gt;NuvoUI’s default behavior generates zero utility classes unless explicitly enabled, keeping your compiled CSS extremely lightweight and fast. &lt;/p&gt;

&lt;h4&gt;
  
  
  Developer Control Like Never Before
&lt;/h4&gt;

&lt;p&gt;With the powerful &lt;code&gt;@include NuvoUI.apply()&lt;/code&gt; mixin, developers can compose utility classes on the fly, fully type-safe, modular, and ready for complex state and responsive scenarios — without bloating the codebase.&lt;/p&gt;

&lt;h4&gt;
  
  
  Real-World Experience Integrated
&lt;/h4&gt;

&lt;p&gt;NuvoUI solves common layout problems directly, such as advanced gap and fill handling in flex layouts, removing typical flexbox frustrations seen in other frameworks, responsive mixins and lots of other great ones. &lt;/p&gt;

&lt;h4&gt;
  
  
  BEM-First Thinking, Utility-Class Flexibility
&lt;/h4&gt;

&lt;p&gt;Whether you prefer scalable BEM structures or utility-driven designs, NuvoUI adapts without forcing you into a rigid system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Minimal Setup, Maximum Scalability
&lt;/h4&gt;

&lt;p&gt;Configure only what you need. Enable or disable any feature individually to perfectly match project requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Small example of layout creating with Utility Classes
&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/L9ipgX4wRd0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Following example on our &lt;a href="https://nuvoui.io" rel="noopener noreferrer"&gt;NuvoUI&lt;/a&gt; page is created by utility classes&lt;/p&gt;

&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%2Fnx0xdm2t40olc292suia.png" 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%2Fnx0xdm2t40olc292suia.png" alt="Example layout created with NuvoUI Utility Classes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Who Should Use NuvoUI?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developers tired of bloated frameworks slowing down their projects&lt;/li&gt;
&lt;li&gt;Teams who demand precise control over CSS output&lt;/li&gt;
&lt;li&gt;Projects where scalability and maintainability are critical from day one&lt;/li&gt;
&lt;li&gt;Designers and developers seeking cleaner SCSS architecture with real responsive and state control baked-in&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Utility Mixins
&lt;/h3&gt;

&lt;p&gt;Below are solid examples of NuvoUI utility classes and how they are used both directly and via the &lt;strong&gt;include NuvoUI.apply()&lt;/strong&gt; mixin, along with their expected CSS output.&lt;/p&gt;

&lt;p&gt;First include the NuvoUI into your SCSS file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s1"&gt;'@nuvoui/core/src/styles/index.scss'&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="nt"&gt;NuvoUI&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and just start using the power of NuvoUI. &lt;/p&gt;

&lt;h4&gt;
  
  
  Simple spacing:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nt"&gt;navbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;NuvoUI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mt&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;will output&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;navbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&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;h3&gt;
  
  
  NuvoUI.apply mixin
&lt;/h3&gt;

&lt;p&gt;The real power comes with the NuvoUI.apply mixin. Here are few examples &lt;/p&gt;

&lt;h4&gt;
  
  
  Typography and color:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;NuvoUI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;semibold&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;gray&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ouptput&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;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;25&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;font-weight&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;600&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#374151&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Based&lt;/span&gt; &lt;span class="nt"&gt;on&lt;/span&gt; &lt;span class="nt"&gt;theme&lt;/span&gt; &lt;span class="nt"&gt;scale&lt;/span&gt; &lt;span class="nt"&gt;for&lt;/span&gt; &lt;span class="nt"&gt;gray-700&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Flexbox layout:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;NuvoUI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;between&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="mi"&gt;.75&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&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;display&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;flex&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;flex-direction&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;row&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;align-items&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;center&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;justify-content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;space-between&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;gap&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;75&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Responsive + state:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;NuvoUI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;rounded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;gray&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;hover&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&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;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;#ffffff&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;border-radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;5&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&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;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f3f4f6&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;h4&gt;
  
  
  Combined utilities for button:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@include&lt;/span&gt; &lt;span class="nd"&gt;NuvoUI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;px&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;rounded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;shadow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
 &lt;span class="nf"&gt;bg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;hover&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;.95&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&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;padding-left&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;padding-right&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;padding-top&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;padding-bottom&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#3&lt;/span&gt;&lt;span class="nt"&gt;b82f6&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;#ffffff&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;border-radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;375&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;box-shadow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt; &lt;span class="nt"&gt;rgba&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;05&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1d4ed8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nd"&gt;:active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0.95&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;Some example for customizing SCSS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@use&lt;/span&gt; &lt;span class="s1"&gt;'@nuvoui/core/src/styles/index.scss'&lt;/span&gt; &lt;span class="nt"&gt;as&lt;/span&gt; &lt;span class="nt"&gt;NuvoUI&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Number&lt;/span&gt; &lt;span class="nt"&gt;of&lt;/span&gt; &lt;span class="nt"&gt;Columns&lt;/span&gt; &lt;span class="nt"&gt;for&lt;/span&gt; &lt;span class="nt"&gt;column&lt;/span&gt; &lt;span class="nt"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;default&lt;/span&gt; &lt;span class="nt"&gt;is&lt;/span&gt; &lt;span class="nt"&gt;12&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;column-count&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;16&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 

  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Change&lt;/span&gt; &lt;span class="nt"&gt;the&lt;/span&gt; &lt;span class="nt"&gt;default&lt;/span&gt; &lt;span class="nt"&gt;colors&lt;/span&gt; &lt;span class="nt"&gt;available&lt;/span&gt; 
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;primary&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#0091ff&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;warning&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#F8AF08&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;danger&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#FF3B30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;success&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#34C759&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;color-primitives&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"gray"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#6b7280&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"red"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#ef4444&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"blue"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#3b82f6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"green"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#22c55e&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"yellow"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#eab308&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"purple"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#a855f7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"pink"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#FF88FF&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"orange"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;#ff6f00&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="o"&gt;),&lt;/span&gt;

  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Enable&lt;/span&gt; &lt;span class="nt"&gt;utility&lt;/span&gt; &lt;span class="nt"&gt;classes&lt;/span&gt; &lt;span class="nt"&gt;generation&lt;/span&gt; &lt;span class="nt"&gt;so&lt;/span&gt; &lt;span class="nt"&gt;you&lt;/span&gt; &lt;span class="nt"&gt;can&lt;/span&gt; &lt;span class="nt"&gt;directly&lt;/span&gt; &lt;span class="nt"&gt;use&lt;/span&gt; &lt;span class="nt"&gt;them&lt;/span&gt; &lt;span class="nt"&gt;in&lt;/span&gt; &lt;span class="nt"&gt;your&lt;/span&gt; &lt;span class="nt"&gt;HTML&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;generate-utility-classes&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;After&lt;/span&gt; &lt;span class="nt"&gt;enabling&lt;/span&gt; &lt;span class="nt"&gt;utility&lt;/span&gt; &lt;span class="nt"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;you&lt;/span&gt; &lt;span class="nt"&gt;can&lt;/span&gt; &lt;span class="nt"&gt;choose&lt;/span&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="nt"&gt;disable&lt;/span&gt; &lt;span class="nt"&gt;specific&lt;/span&gt; &lt;span class="nt"&gt;utility&lt;/span&gt; &lt;span class="nt"&gt;classes&lt;/span&gt;
  &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;feature-flags&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"alignments"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"animations"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"backdrops"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"container-queries"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"cursors"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"grid"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"opacity"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"position"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"shadows"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"transforms"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"transitions"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"z-index"&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="o"&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;h4&gt;
  
  
  NuvoUI Learning Curve
&lt;/h4&gt;

&lt;p&gt;NuvoUI is designed for SCSS-first developers who value structure, readability, and modularity.&lt;/p&gt;

&lt;h4&gt;
  
  
  Easy for:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Developers with strong SCSS experience.&lt;/li&gt;
&lt;li&gt;Teams familiar with mixins, media queries, and nested styles.&lt;/li&gt;
&lt;li&gt;Projects preferring clean HTML with logic in stylesheets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Challenging for:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Freshers or beginners with limited SCSS background.&lt;/li&gt;
&lt;li&gt;Developers expecting pre-built components or visual design tools.&lt;/li&gt;
&lt;li&gt;Those unfamiliar with BEM or utility logic patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;h4&gt;
  
  
  Current State
&lt;/h4&gt;

&lt;p&gt;NuvoUI is in active development. Documentation is evolving and features are being refined. Your feedback will directly shape its future.&lt;/p&gt;

&lt;p&gt;This is just the beginning—lightweight, powerful, and community-driven.&lt;/p&gt;

&lt;p&gt;We invite you to explore it and contribute your ideas.&lt;/p&gt;

&lt;p&gt;🔗 Website: &lt;a href="https://nuvoui.io" rel="noopener noreferrer"&gt;nuvoui.io&lt;/a&gt;&lt;br&gt;
💬 Community: &lt;a href="https://discord.gg/dhxxKTK5Zx" rel="noopener noreferrer"&gt;Join our Discord&lt;/a&gt;&lt;br&gt;
🛠 Docs: &lt;a href="https://nuvoui.io/docs/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>scss</category>
    </item>
  </channel>
</rss>
