<?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: Harsh Parmar</title>
    <description>The latest articles on DEV Community by Harsh Parmar (@harsh_dev_01).</description>
    <link>https://dev.to/harsh_dev_01</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%2F2220432%2F52aa3f16-65c8-40bf-a7cd-6c18db719979.png</url>
      <title>DEV Community: Harsh Parmar</title>
      <link>https://dev.to/harsh_dev_01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harsh_dev_01"/>
    <language>en</language>
    <item>
      <title>3 layer of design token matter</title>
      <dc:creator>Harsh Parmar</dc:creator>
      <pubDate>Sat, 11 Apr 2026 09:07:58 +0000</pubDate>
      <link>https://dev.to/harsh_dev_01/3-layer-of-design-token-matter-44f6</link>
      <guid>https://dev.to/harsh_dev_01/3-layer-of-design-token-matter-44f6</guid>
      <description>&lt;p&gt;"Why do you need 3 layers of CSS variables? Just use brand-800 directly."&lt;/p&gt;

&lt;p&gt;That was me. Here's what changed my mind.&lt;/p&gt;

&lt;p&gt;I made a table of how shades map in light vs dark mode:&lt;/p&gt;

&lt;p&gt;Button surface: 800 → 200 (flip to light)&lt;br&gt;
Badge surface:  100 → 900 (flip to dark)&lt;br&gt;
Disabled state: 400 → 600 (shift middle)&lt;br&gt;
Border color:  200 → 800 (flip to dark)&lt;/p&gt;

&lt;p&gt;See the problem? Every row flips in a DIFFERENT direction. There's no single "reverse the palette" trick that handles all of them.&lt;/p&gt;

&lt;p&gt;That's the whole reason semantic tokens exist.&lt;/p&gt;

&lt;p&gt;Layer 1: --color-brand-800 (the raw color)&lt;br&gt;
Layer 2: --color-surface-brand-primary: var(--color-brand-800)&lt;br&gt;
Layer 3: --color-button-brand-default-surface: var(--color-surface-brand-primary)&lt;/p&gt;

&lt;p&gt;Dark mode? Override Layer 2. &lt;br&gt;
Theme switch? Swap Layer 1. &lt;br&gt;
One component needs something different? Override Layer 3.&lt;/p&gt;

&lt;p&gt;Let me show you the real math at scale.&lt;/p&gt;

&lt;p&gt;Say your design system has:&lt;br&gt;
• 30 components (button, checkbox, input, badge, tab, card...)&lt;br&gt;
• 4 states each (default, hover, focus, disabled)&lt;br&gt;
• 3 properties per state (surface, text, icon)&lt;br&gt;
• 2 modes (light + dark)&lt;br&gt;
• 5 color themes (blue, violet, pink, cyan, orange)&lt;/p&gt;

&lt;p&gt;WITHOUT layers (direct brand-800 usage):&lt;br&gt;
Dark mode overrides: 30 × 4 × 3 = 360 per theme&lt;br&gt;
Across 5 themes: 360 × 5 = 1,800 overrides&lt;br&gt;
Plus base dark mode: + 360&lt;br&gt;
Total: ~2,160 CSS overrides to maintain&lt;/p&gt;

&lt;p&gt;WITH 3 layers:&lt;br&gt;
Layer 1 — Theme switch: 12 palette values × 5 themes = 60 overrides&lt;br&gt;
Layer 2 — Dark mode: ~30 semantic tokens (covers ALL components at once)&lt;br&gt;
Layer 3 — Exceptions: maybe 5-10 one-off component overrides&lt;br&gt;
Total: ~100 CSS overrides&lt;/p&gt;

&lt;p&gt;That's a 95% reduction. And it gets better as you grow.&lt;/p&gt;

&lt;p&gt;Add 10 more components?&lt;br&gt;
• Without layers: +400 new overrides to write and maintain&lt;br&gt;
• With layers: +0 (they just reference existing semantic tokens)&lt;/p&gt;

&lt;p&gt;Add a new theme?&lt;br&gt;
• Without layers: +360 overrides&lt;br&gt;
• With layers: +12 (just swap the base palette)&lt;/p&gt;

&lt;p&gt;Add a new mode (high contrast)?&lt;br&gt;
• Without layers: +1,800 overrides&lt;br&gt;
• With layers: +30 (new semantic mapping)&lt;/p&gt;

&lt;p&gt;The cost of maintaining without layers grows EXPONENTIALLY:&lt;br&gt;
components × states × properties × modes × themes&lt;/p&gt;

&lt;p&gt;The cost with layers grows LINEARLY:&lt;br&gt;
palette values + semantic mappings + exceptions&lt;/p&gt;

&lt;p&gt;At 30 components it's 2,160 vs 100.&lt;br&gt;
At 100 components it's 6,000+ vs ~120.&lt;br&gt;
At 200 components it's 12,000+ vs ~140.&lt;/p&gt;

&lt;p&gt;The overhead of setting up 3 layers pays for itself after your 3rd component.&lt;/p&gt;

&lt;p&gt;More work upfront. Orders of magnitude less work over time.&lt;br&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%2Fu5uabx2anyueh5wd01nc.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%2Fu5uabx2anyueh5wd01nc.png" alt=" " width="800" height="940"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>designsystem</category>
      <category>ui</category>
      <category>componentlibrary</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
