Building a Component Library – Our Design System Journey
September 15, 2019
Creating a component library helped us unify the look and feel of an application while speeding up development and improving collaboration with designers.
Why Build a Component Library?
- Keep styles and behaviors consistent across the app
- Reuse logic and reduce code duplication
- Improve onboarding for new team members
- Share visual language with design team
Step 1: Identify Reusable Components
Start with the basics:
- Buttons
- Form inputs (text fields, checkboxes, radios)
- Modals and popups
- Notifications and alerts
- Layout containers (grids, wrappers)
List what you use often and generalize patterns that repeat.
Step 2: Set Up the Component Folder
We created a /components
folder and grouped things by type.
src/
├── components/
│ ├── Button/
│ │ ├── Button.tsx
│ │ ├── Button.stories.tsx
│ │ └── index.ts
│ ├── Modal/
│ └── ...
Each component has:
- The code
- A test (optional)
- A Storybook story (for visual testing)
Step 3: Use Storybook
Storybook helped us:
- Document how each component works
- Preview variants (sizes, colors, states)
- Share with designers and QA
npx sb init
npm run storybook
This setup made it easier to demo and test components in isolation.
Step 4: Add Tokens and Themes
We also added a theme.ts
file to centralize colors, spacing, font sizes, and other values.
export const theme = {
colors: {
primary: "#0070f3",
danger: "#e00",
gray: "#666"
},
spacing: [4, 8, 16, 32, 64]
};
Then passed the theme into styled components or context providers.
What We Gained
- Faster development with ready-to-use blocks
- Consistency across screens and developers
- Better handoff from Figma to code
- Easier testing and documentation
A component library is not just for large teams. Even solo projects benefit from consistent UI and code reuse. Once you start building with shared pieces, it’s hard to go back.
Recent posts
- At-Least-Once vs. Exactly-Once - Understanding Message Delivery Guarantees
June 12, 2025
Learn about message delivery guarantees in distributed systems. Understand why most production systems implement at-least-once delivery with idempotency rather than attempting exactly-once delivery.
- How Idempotency Saves Your API from Chaos
June 11, 2025
Learn how to implement idempotency in your APIs to prevent duplicate actions and ensure data consistency. Includes practical examples with Supabase and Node.js.
- Vibe Coding ‑ Notes from the First Try
June 6, 2025
Quick lessons from spinning up a new blog with an AI pair‑programmer and Cursor.