Traditional UI libraries make it easy to start, but they can become restrictive when a product needs a distinct visual identity. That is one reason Shadcn/UI and Tailwind CSS became my standard.
The important part of Shadcn/UI is not just its appearance. It is the philosophy: components become part of the project instead of remaining a distant black box.
Code ownership
With a traditional library, I often import a component from node_modules.
With Shadcn/UI, the component is added to the repository:
components/
ui/
button.tsx
dialog.tsx
input.tsx
dropdown-menu.tsx
I can therefore change its structure, variants, accessibility, and behavior.
Tailwind as the design layer
Tailwind lets me express visual decisions directly inside components.
<Button className="rounded-xl px-5">
Create project
</Button>
For a project with its own design system, keeping structure and styling close together is extremely practical.
Building a real Design System
I do not want just a collection of components.
I progressively define:
- typography;
- spacing;
- radii;
- color tokens;
- interactive states;
- form components;
- feedback patterns;
- responsive behavior.
The goal is for different pages to feel like parts of the same product.
Accessibility
Customization must not remove accessible behavior.
For interactive components, I check:
- keyboard navigation;
- visible focus;
- labels;
- ARIA roles when necessary;
- contrast;
- disabled/loading states.
A beautiful interface that cannot be comfortably used with a keyboard is not a good design system.
Dark mode
Tailwind also makes theme variants easy to organize.
I prefer centralizing tokens instead of scattering arbitrary colors across components.
Design tokens
│
▼
UI primitives
│
▼
Feature components
│
▼
Pages
This prevents every page from inventing its own visual language.
Why I prefer this approach
I want three things:
Control — I own the code.
Consistency — components follow the same rules.
Lightweight delivery — I do not ship a huge component suite when I only use a small portion of it.
Shadcn/UI + Tailwind is therefore not just an aesthetic choice. It is a way to keep the design system close to both the code and the product.
