Close Menu
    DevStackTipsDevStackTips
    • Home
    • News & Updates
      1. Tech & Work
      2. View All

      Stop writing tests: Automate fully with Generative AI

      August 19, 2025

      Opsera’s Codeglide.ai lets developers easily turn legacy APIs into MCP servers

      August 19, 2025

      Black Duck Security GitHub App, NuGet MCP Server preview, and more – Daily News Digest

      August 19, 2025

      10 Ways Node.js Development Boosts AI & Real-Time Data (2025-2026 Edition)

      August 18, 2025

      This new Coros watch has 3 weeks of battery life and tracks way more – even fly fishing

      August 20, 2025

      5 ways automation can speed up your daily workflow – and implementation is easy

      August 20, 2025

      This new C-suite role is more important than ever in the AI era – here’s why

      August 20, 2025

      iPhone users may finally be able to send encrypted texts to Android friends with iOS 26

      August 20, 2025
    • Development
      1. Algorithms & Data Structures
      2. Artificial Intelligence
      3. Back-End Development
      4. Databases
      5. Front-End Development
      6. Libraries & Frameworks
      7. Machine Learning
      8. Security
      9. Software Engineering
      10. Tools & IDEs
      11. Web Design
      12. Web Development
      13. Web Security
      14. Programming Languages
        • PHP
        • JavaScript
      Featured

      Creating Dynamic Real-Time Features with Laravel Broadcasting

      August 20, 2025
      Recent

      Creating Dynamic Real-Time Features with Laravel Broadcasting

      August 20, 2025

      Understanding Tailwind CSS Safelist: Keep Your Dynamic Classes Safe!

      August 19, 2025

      Sitecore’s Content SDK: Everything You Need to Know

      August 19, 2025
    • Operating Systems
      1. Windows
      2. Linux
      3. macOS
      Featured

      Why GNOME Replaced Eye of GNOME with Loupe as the Default Image Viewer

      August 19, 2025
      Recent

      Why GNOME Replaced Eye of GNOME with Loupe as the Default Image Viewer

      August 19, 2025

      Microsoft admits it broke “Reset this PC” in Windows 11 23H2 KB5063875, Windows 10 KB5063709

      August 19, 2025

      Windows 11 can now screen record specific app windows using Win + Shift + R (Snipping Tool)

      August 19, 2025
    • Learning Resources
      • Books
      • Cheatsheets
      • Tutorials & Guides
    Home»Development»Understanding Tailwind CSS Safelist: Keep Your Dynamic Classes Safe!

    Understanding Tailwind CSS Safelist: Keep Your Dynamic Classes Safe!

    August 19, 2025

    Tailwind CSS has revolutionized modern front-end development by offering a utility-first approach. It’s fast, flexible, and makes styling a breeze. But if you’ve ever seen some of your classes disappear after production builds, especially when they’re dynamically generated, then you’re not alone. That’s where Tailwind’s safelist feature comes in!

    In this post, we’ll break down what the Safelist is, why it’s important, and how to use it correctly with real-world examples.

    Why Do My Tailwind Classes Disappear?

    Tailwind CSS uses a feature called “PurgeCSS” (now called Content Scanning) to remove unused CSS during the production build. This drastically reduces your CSS file size. However, any class names not explicitly written in your code (e.g., those generated at runtime or passed from APIs) will be purged, gone from the final stylesheet.

    For Example

    <!-- This will stay -->
    <div class="text-red-500">Hello</div>
    <!-- This might get purged -->
    <div class={`text-${color}-500`}>Hi</div>
    

    Since text-${color}-500 is dynamically created, Tailwind doesn’t “see” it during build time, so it assumes it’s unused and removes it.

    What is the Tailwind Safelist?

    The Safelist (formerly purge. Safelist) is a way to manually tell Tailwind CSS to always include specific classes, even if it doesn’t find them in your files.

    It ensures your dynamic classes or edge cases are not purged from the final CSS output.

    How to Use Safelist in tailwind.config.js

    Simple Array Format

    // tailwind.config.js
    module.exports = {
      content: ['./src/**/*.{html,js}'],
      safelist: ['text-red-500', 'bg-blue-200', 'hover:underline']
    };

    Tailwind will always include these classes, even if they don’t appear in your source code.

    Pattern-Based Safelisting with Regex

    For dynamic utilities (e.g., text-red-100 to text-red-900), use patterns:

    module.exports = {
      safelist: [
        {
          pattern: /text-(red|blue|green)-(100|200|300|400|500)/,
        },
        {
          pattern: /bg-(gray|yellow)-(50|100|200|300)/,
          variants: ['hover', 'focus'],
        },
      ]
    };

    This tells Tailwind to include all matching combinations like text-red-100, bg-yellow-200:hover, etc.

    Real-World Use Cases

    Dynamic Theme Switcher

    In any jsx file:

    <div className={`bg-${theme}-500 text-white`}>
      Welcome!
    </div>

    Classes like bg-blue-500, bg-green-500, etc., won’t be detected at build time.

    In the tailwind config file, add:

    safelist: [
      {
        pattern: /bg-(blue|green|red)-(500)/,
      }
    ]

    Button Variants from CMS or API

    If buttons come from a CMS:

    In JSON:

    { "btnColor": "yellow", "textColor": "gray" }

    Your component HTML:

    <button class={`bg-${btnColor}-400 text-${textColor}-900`}>Click Me</button>

    Tailwind won’t see these classes. Safelist them like:

    safelist: [
      {
        pattern: /bg-(yellow|blue|green)-400/,
      },
      {
        pattern: /text-(gray|black|white)-900/,
      }
    ]

    Dark Mode Variants

    In HTML:

    <div class="dark:bg-gray-800 dark:text-white">Night Mode</div>

    In config.js:

    safelist: [
      'dark:bg-gray-800',
      'dark:text-white'
    ]

    Advanced Tips

    • You can use variants with patterns to include states like hover, focus, sm, md, etc.
    • Combine multiple patterns for color, size, and responsiveness.

    In config.js:

    {
      pattern: /(bg|text)-(red|blue|green)-(100|200|300)/,
      variants: ['sm', 'md', 'hover']
    }

    Clean Code Strategy: When to Safelist vs Refactor

    Use Safelist when

    • You can’t avoid dynamic class generation (e.g., from CMS, user settings)
    • Classes are predictable

    Avoid Safelist if

    • You can rewrite the logic to use static class names
    • You can use conditional class tools like clsx, classnames, or Tailwind’s own recommended patterns

    Common Mistakes

    • Correct: Safelist: [‘text-red-500’]
    • Wrong: Safelist: ‘text-red-500’ (must be an array)
    • Expecting dynamic regex to catch invalid formats like text-${color} if color is from unknown sources

    Tailwind : Final Best Practices

    TipWhy It Matters
    Use pattern with clear boundariesAvoid bloated final CSS
    Only safelist what’s truly neededReduce bundle size
    Test in production mode (NODE_ENV=production)To simulate purge behavior
    Use utilities like clsx or classnamesKeep dynamic class logic readable
    Always document your safelistHelps future maintainers understand why

    Useful Tools

    • Tailwind Play – Test safelisting live
    • PurgeCSS Analyzer – See what gets purged
    • NODE_ENV=production npx tailwindcss -o build.css – Test your build locally

    Conclusion

    The Tailwind CSS safelist is a powerful tool that ensures your dynamic class names survive the purge process. Whether you’re building a theme engine, integrating CMS content, or just using creative component logic, Safelist saves you from frustrating styling bugs in production.

    By mastering safelisting, you gain better control over your final CSS bundle while still enjoying the dynamic flexibility Tailwind offers.

    Source: Read More 

    Facebook Twitter Reddit Email Copy Link
    Previous ArticleSitecore’s Content SDK: Everything You Need to Know
    Next Article What are Data Transfer Objects? Learn to Use DTOs in Your Java Spring-Based Projects

    Related Posts

    Development

    Creating Dynamic Real-Time Features with Laravel Broadcasting

    August 20, 2025
    Repurposing Protein Folding Models for Generation with Latent Diffusion
    Artificial Intelligence

    Repurposing Protein Folding Models for Generation with Latent Diffusion

    August 20, 2025
    Leave A Reply Cancel Reply

    For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.

    Continue Reading

    Cherrybomb – audit, validate, run API tests

    Linux

    Adobe’s First-Ever Creative Campus Innovators

    Web Development

    CVE-2025-5195 – GitLab Compliance Framework Unauthorized Data Disclosure

    Common Vulnerabilities and Exposures (CVEs)

    filepack – file hashing and verification

    Linux

    Highlights

    CVE-2025-54058 – WeGIA SQL Injection Vulnerability

    July 17, 2025

    CVE ID : CVE-2025-54058

    Published : July 17, 2025, 3:15 p.m. | 3 hours, 21 minutes ago

    Description : WeGIA is an open source web manager with a focus on the Portuguese language and charitable institutions. A SQL Injection vulnerability was identified in versions prior to 3.4.6 in the `idatendido_familiares` parameter of the `/html/funcionario/dependente_editarEndereco.php` endpoint. This vulnerability allows attacker to manipulate SQL queries and access sensitive database information, such as table names and sensitive data. Version 3.4.6 fixes the issue.

    Severity: 0.0 | NA

    Visit the link for more details, such as CVSS details, affected products, timeline, and more…

    Microsoft says Copilot can use location to change Outlook’s UI on Android

    June 2, 2025

    This Linux distro combines the best parts of Windows and MacOS – and it’s gorgeous

    July 10, 2025

    New Rust Botnet Hijacking Routers to Inject Commands Remotely

    April 22, 2025
    © DevStackTips 2025. All rights reserved.
    • Contact
    • Privacy Policy

    Type above and press Enter to search. Press Esc to cancel.