<?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: Andres Clavijo Reyes</title>
    <description>The latest articles on DEV Community by Andres Clavijo Reyes (@andresclavijo).</description>
    <link>https://dev.to/andresclavijo</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%2F3850205%2F229ce2d6-bb20-4290-8a44-951e8014a483.jpg</url>
      <title>DEV Community: Andres Clavijo Reyes</title>
      <link>https://dev.to/andresclavijo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andresclavijo"/>
    <language>en</language>
    <item>
      <title>Design Tokens Are Not CSS Variables. Here's the Difference That Matters.</title>
      <dc:creator>Andres Clavijo Reyes</dc:creator>
      <pubDate>Thu, 02 Apr 2026 14:15:25 +0000</pubDate>
      <link>https://dev.to/andresclavijo/design-tokens-are-not-css-variables-heres-the-difference-that-matters-3557</link>
      <guid>https://dev.to/andresclavijo/design-tokens-are-not-css-variables-heres-the-difference-that-matters-3557</guid>
      <description>&lt;h2&gt;
  
  
  The Confusion Is Everywhere
&lt;/h2&gt;

&lt;p&gt;Ask ten frontend engineers what a design token is and nine of them will show you a CSS custom property.&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%2F50q279mrzr18s2b0kcl1.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%2F50q279mrzr18s2b0kcl1.png" alt=" " width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's not wrong. But it's also not the whole story — and the difference matters more than most teams realize until they're deep in a multi-platform codebase with drift between iOS, web, and Figma.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Design Token Actually Is
&lt;/h2&gt;

&lt;p&gt;A design token is a platform-agnostic name-value pair with semantic meaning.&lt;br&gt;
The key word: &lt;em&gt;platform-agnostic.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;CSS variables live in CSS. A design token lives in a format that can compile into CSS, Swift, Kotlin, Tailwind config, or whatever your stack needs. The token is the source of truth. The CSS variable is one output of that source of truth.&lt;/p&gt;

&lt;p&gt;The W3C DTCG (Design Token Community Group) format makes this concrete:&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%2Fj4ntx4gl2g5bcxdciqxm.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%2Fj4ntx4gl2g5bcxdciqxm.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is what tools like Style Dictionary, Theo, and Supernova expect. This is what Figma Variables exports. This is what enables one palette to compile into every target format your team ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Distinction Breaks Teams
&lt;/h2&gt;

&lt;p&gt;Scenario 1: You hardcode CSS variables.&lt;/p&gt;

&lt;p&gt;Six months in, your iOS engineer asks for the same palette in Swift. Now someone has to manually translate 120 tokens. Drift is guaranteed.&lt;/p&gt;

&lt;p&gt;Scenario 2: You define tokens in Figma manually.&lt;/p&gt;

&lt;p&gt;You've got 40 variables named &lt;code&gt;Primary/500&lt;/code&gt;. Your Figma file and your codebase are "the same" until someone changes a shade in one place and forgets the other. Now they're not.&lt;/p&gt;

&lt;p&gt;Scenario 3: You skip the shade scale.&lt;br&gt;
You pick &lt;code&gt;#6C47FF&lt;/code&gt; as primary and define three states: default, hover, disabled. Then a new surface needs a 10% opacity tint. Your "token system" has no answer. Someone invents &lt;code&gt;--color-primary-light&lt;/code&gt; and the naming debt begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Real Token Architecture Looks Like
&lt;/h2&gt;

&lt;p&gt;Three layers. This is the pattern that doesn't break:&lt;/p&gt;

&lt;p&gt;Layer 1 — Primitive tokens&lt;br&gt;
The raw values. Every shade from 50–900, generated mathematically so perceptual weight is uniform across the scale.&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%2Fabziwwrc9qil376xslwu.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%2Fabziwwrc9qil376xslwu.png" alt=" " width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Layer 2 — Semantic tokens&lt;br&gt;
Meaning mapped to primitives. This is what components reference.&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%2F98inxjj3hzqt0v4j9vox.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%2F98inxjj3hzqt0v4j9vox.png" alt=" " width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Layer 3 — Component tokens (optional, but worth it at scale)&lt;br&gt;
Scoped overrides for specific components.&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%2Fzjj19pbludxo06a8cbzo.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%2Fzjj19pbludxo06a8cbzo.png" alt=" " width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result: you can retheme an entire product by changing one primitive. No grep. No find-and-replace.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tailwind Problem No One Talks About
&lt;/h2&gt;

&lt;p&gt;Tailwind is great. But out of the box, it encourages a pattern that breaks token systems:&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%2Fof8lvsryvyh7ivdwzrri.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%2Fof8lvsryvyh7ivdwzrri.png" alt=" " width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now your color values live in your markup, not in your tokens. If you ever change &lt;code&gt;purple-500&lt;/code&gt;, you're doing a codebase-wide find-and-replace, not changing one token.&lt;/p&gt;

&lt;p&gt;The fix is to extend Tailwind's config to reference your CSS variables:&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%2Ff94yhrv4inmi140jyjrv.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%2Ff94yhrv4inmi140jyjrv.png" alt=" " width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now your Tailwind classes reference your token layer. Change the variable, change the whole system. No component edits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gap This Creates for Every Design Tool
&lt;/h2&gt;

&lt;p&gt;The workflow most teams run today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Designer picks colors in Figma&lt;/li&gt;
&lt;li&gt;Designer documents hex codes in a Notion page&lt;/li&gt;
&lt;li&gt;Engineer manually creates CSS variables&lt;/li&gt;
&lt;li&gt;Engineer adds those to Tailwind config by hand&lt;/li&gt;
&lt;li&gt;Six months later, Figma and code have drifted&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The gap between "we have a palette" and "our tokens are in code" is still entirely manual.&lt;/p&gt;

&lt;p&gt;This is the exact problem I built Paletta to close. Generate a palette → validate accessibility → export as CSS variables, Tailwind config, or DTCG-format tokens in one step. No translation. No drift.&lt;/p&gt;

&lt;p&gt;The Design Tokens export (DTCG format) is shipping next. It's the piece that completes the workflow from Figma to code without the manual step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to Start if You're Rebuilding Your System
&lt;/h2&gt;

&lt;p&gt;You don't have to adopt the full three-layer architecture on day one.&lt;/p&gt;

&lt;p&gt;Start here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate your full shade scale (50–900) before you name a single token. You need the raw material before you build the semantic layer.&lt;/li&gt;
&lt;li&gt;Run accessibility validation on your base colors before you commit. Your 500 shade needs to pass WCAG AA on white. Discover that now, not in QA.&lt;/li&gt;
&lt;li&gt;Name your semantic tokens for intent, not value. color-primary is good. color-purple is a primitive, not a semantic token. color-brand-purple is naming debt.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;CSS variables are an output. Tokens are the source.&lt;/p&gt;

&lt;p&gt;Getting this right up front means zero translation step between design and code, zero drift between platforms, and the ability to retheme without touching components.&lt;/p&gt;

&lt;p&gt;The tooling is finally good enough to do this from day one. There's no reason to still be doing it manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Paletta
&lt;/h2&gt;

&lt;p&gt;usepaletta.io — free tier available. Design Tokens export (DTCG format) shipping soon.&lt;br&gt;
The Figma plugin is in Community review. Follow @andresmclavijo on X or @usepaletta.io on Instagram for updates.&lt;/p&gt;

&lt;p&gt;Next: How accessibility-first color selection changes the way you build design systems — not just how you audit them.&lt;/p&gt;

</description>
      <category>designsystem</category>
      <category>css</category>
      <category>tailwindcss</category>
      <category>figma</category>
    </item>
    <item>
      <title>Your Figma Color System Is Manual. Here's Why That Breaks at Scale.</title>
      <dc:creator>Andres Clavijo Reyes</dc:creator>
      <pubDate>Mon, 30 Mar 2026 13:10:20 +0000</pubDate>
      <link>https://dev.to/andresclavijo/your-figma-color-system-is-manual-heres-why-that-breaks-at-scale-4b8j</link>
      <guid>https://dev.to/andresclavijo/your-figma-color-system-is-manual-heres-why-that-breaks-at-scale-4b8j</guid>
      <description>&lt;h2&gt;
  
  
  The Reality No One Talks About
&lt;/h2&gt;

&lt;p&gt;You start a project with three brand colors. Six months later, your Figma file has 42 &lt;br&gt;
different shades of "slightly different light grey" and your accessibility contrast &lt;br&gt;
ratios are a disaster.&lt;/p&gt;

&lt;p&gt;Building a color system isn't about picking hex codes. It's about logic, scalability, &lt;br&gt;
and accessibility from day one. But why is the process still entirely manual?&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Mistakes That Break Every Color System
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The Eyeball Method&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Picking shades by moving the cursor until it looks right. The result: perceptual &lt;br&gt;
inconsistency across displays and zero reproducibility when someone else opens the file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Accessibility as an Afterthought&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Checking contrast ratios after the design is finished only to discover your primary &lt;br&gt;
brand color fails WCAG. Now you're making late-stage decisions with downstream &lt;br&gt;
consequences across every component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Naming Debt&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Blue-Light-1&lt;/code&gt;, &lt;code&gt;Blue-Light-Final-v2&lt;/code&gt;, &lt;code&gt;Blue-Light-Final-FINAL&lt;/code&gt;. Without a systematic token approach, your color library becomes archaeology within a year.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Generative System Actually Solves
&lt;/h2&gt;

&lt;p&gt;To scale, you need a system that generates shades from mathematical curves, not vibes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Perceptual uniformity&lt;/strong&gt; Every "500" weight shade feels equivalent to the human 
eye across your entire palette.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant iteration&lt;/strong&gt; Change one base color; the full shade scale updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer-ready output&lt;/strong&gt; Your tokens exist the moment the palette does. No translation step.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why I Built Paletta
&lt;/h2&gt;

&lt;p&gt;The gap between "I have a brand color" and "my system is dev ready" was still entirely manual. I built &lt;a href="https://usepaletta.io" rel="noopener noreferrer"&gt;Paletta&lt;/a&gt; to close it.&lt;/p&gt;

&lt;p&gt;The workflow is three steps: &lt;strong&gt;Generate. Validate. Implement.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shade scales from 50–900, generated mathematically.&lt;/strong&gt;&lt;br&gt;
No more eyeballing. Paletta generates the full spectrum from your base color perceptually uniform, systematically named, ready to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessibility lens built into the palette view.&lt;/strong&gt;&lt;br&gt;
Run vision simulations (deuteranopia, protanopia, tritanopia, achromatopsia) directly on your palette before you design a single component. WCAG contrast validation isn't a separate step — it's built into color selection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Export to CSS variables, Tailwind config, or design tokens.&lt;/strong&gt;&lt;br&gt;
One palette, three export formats. Frontend engineers get production-ready output without translation overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figma plugin (currently in Community review).&lt;/strong&gt;&lt;br&gt;
Build your palette in Paletta, push it into your Figma file. No copy-paste. No drift.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Shift Worth Making
&lt;/h2&gt;

&lt;p&gt;The era of "picking colors" is ending. The era of managing color systems is here.&lt;/p&gt;

&lt;p&gt;If you want to spend less time tweaking hex codes and more time on actual UX problems, the system should handle the math. Paletta does.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try Paletta&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://usepaletta.io" rel="noopener noreferrer"&gt;usepaletta.io&lt;/a&gt; — free tier available&lt;/p&gt;

&lt;p&gt;The Figma plugin is in Community review. Follow &lt;a href="https://x.com/andresmclavijo" rel="noopener noreferrer"&gt;@andresmclavijo&lt;/a&gt; on X for launch updates.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm documenting the full build process here on dev.to — follow for the next post on design token architecture.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>designsystem</category>
      <category>figma</category>
      <category>css</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
