MQ
QURASHI
Blog
MQ
MOHAMED QURASHI

© 2026 Mohamed Qurashi. All rights reserved.

Built with precisionDesigned for impactPowered by innovation
MQ
QURASHI
Blog
Back to Blog
Design

shadcn/ui in 2025: Building a Complete Design System

Mohamed Qurashi
May 1, 2026
4 min read
shadcn/ui in 2025: Building a Complete Design System

Share

TwitterFacebookLinkedIn

Tags

Shadcn/uiDesign systemReact componentsTailwind CSS

# shadcn/ui in 2025: Building a Complete Design System


Picked up shadcn on a Friday. By Sunday, I had something running in production. Here's my actual learning path.


Why This Matters (and Why I Care)


Most design systems React developers use are bloated. MUI? 50MB+ in node_modules. Chakra? Great DX, but you fight their opinionated styling. shadcn ui flips everything. It's not a library—it's a collection of headless UI components you copy directly into your project. Full control. Zero dependencies beyond Tailwind. At Beyin Digital, we switched our e-commerce client from MUI to shadcn components. Build time dropped 40%. Bundle size? Cut in half. That's real.


The Basics You Actually Need


Install is deceptively simple:


// No npm install shadcn/ui

npx shadcn@latest init

// Then add components:

npx shadcn@latest add button card dialog


Each component is a file in `components/ui/`. You own it. Modify it. Break it. Fix it. That's the point.


How I Build With It (Step by Step)


For our Abu Dhabi client's dashboard, I built a complete design system React in 3 hours:


// components/ui/data-table.tsx - real production code

import { Table, TableHeader, TableRow } from "@/components/ui/table"

import { Button } from "@/components/ui/button"


export function DataTable({ data }: { data: Item[] }) {

return (

<Table>

<TableHeader>

<TableRow>Name</TableRow>

<TableRow>Status</TableRow>

<TableRow>

<Button variant="outline" size="sm">Actions</Button>

</TableRow>

</TableHeader>

{/* ... */}

</Table>

)

}


Customize the `button.tsx` file to match your brand colors. That's it. No theme provider. No CSS-in-JS overhead.


Mistakes I Made (So You Don't Have To)


1. **Over-customizing early.** I changed every Tailwind default before shipping. Don't. Ship with defaults, iterate later.

2. **Not reading the source.** The beauty is you can see exactly how `Dialog` or `DropdownMenu` works. I wasted 2 hours on a focus trap issue—the fix was in the source code.

3. **Forgetting accessibility.** shadcn components are built on Radix UI—they handle ARIA attributes. But I broke them once by overriding a `role` prop. Don't touch what you don't understand.


Advanced Tips From Production


  • **Use `cn()` for conditional classes.** shadcn exports it. Saves you from writing `clsx` or `classnames` manually.
  • **Create a `components/ui/index.ts`** barrel export. Keeps imports clean.
  • **Extend, don't modify.** Instead of editing `button.tsx`, create `components/custom/primary-button.tsx` that wraps the shadcn button with your app-specific logic.

  • My Honest Take


    shadcn/ui isn't perfect. If you need a 100-component library out of the box, look elsewhere. But if you value control, performance, and learning how components actually work under the hood? This is the best design system React approach I've used in 5 years. It's not just a tool—it's a philosophy.


    ---

    *Mohamed Qurashi | Full-Stack Developer at Beyin Digital | [https://qurashi.dev](https://qurashi.dev)*


    ---

    **Further reading:**

  • [Why is conditional processing of a sorted array faster than of an unsorted array](https://stackoverflow.com/questions/11227809/why-is-conditional-processing-of-a-sorted-array-faster-than-of-an-unsorted-array)
  • [How do I undo the most recent local commits in Git?](https://stackoverflow.com/questions/927358/how-do-i-undo-the-most-recent-local-commits-in-git)

  • **Related articles on this blog:**

  • [tailwind css best practices](/blog/tailwind-css-best-practices)
  • [react component library guide](/blog/react-component-library-guide)

  • Related Articles

    Tailwind CSS 4.0: Everything Changed & Migration Guide
    Design

    Tailwind CSS 4.0: Everything Changed & Migration Guide

    Complete guide to Tailwind CSS 4.0 changes and migration. Learn about CSS-native config, @theme directives, build time improvements, and step-by-step migration from v3.

    UX Design: The Essential Principles
    Design

    UX Design: The Essential Principles

    Learn the basics of user experience design and how to create user-friendly interfaces that achieve your business goals.