UIverse is a clean, minimal React component library built from scratch β no Tailwind, no heavy UI frameworks, just pure React + CSS.
The goal is simple:
Make it easy for beginners to learn React by building and contributing real UI components.
Every component is:
- π Fully commented for learning
- π§© Reusable and prop-driven
- π¨ Styled with plain, readable CSS
- β‘ Instantly usable β drop it in and it works
| Goal | Description |
|---|---|
| π§βπ» Beginner Friendly | Every file has comments explaining what and why |
| π€ Contributor Ready | Clear folder structure, easy to add new components |
| π GSSoC Ready | Structured for open-source programs like GSSoC |
| π¦ Minimal Dependencies | Uses React, React Router, and react-icons while keeping the project lightweight |
| π¨ Plain CSS | No Tailwind β so contributors learn real CSS |
Make sure you have these installed:
Click the Fork button at the top right of this page to create your own copy.
git clone https://github.com/YOUR_USERNAME/uiverse.git
cd uiversenpm installnpm run devOpen http://localhost:5173 in your browser. You're good to go! π
uiverse/
βββ index.html # HTML entry point
βββ vite.config.js # Vite configuration
βββ package.json
β
βββ src/
βββ main.jsx # App entry β sets up BrowserRouter
βββ App.jsx # Route definitions
βββ index.css # Global base styles
β
βββ components/ # β
All reusable UI components live here
β βββ Button/
β β βββ Button.jsx # Component logic + props
β β βββ Button.css # Component styles
β βββ Navbar/
β βββ Navbar.jsx
β βββ Navbar.css
β
βββ pages/ # Route-level page components
β βββ Home.jsx # Landing page β route: "/"
β βββ Home.css
β βββ Components.jsx # Showcase page β route: "/components"
β βββ Components.css
β
βββ data/
βββ componentsList.js # π Registry of all components (metadata)
Rule of thumb: Each component gets its own folder inside
src/components/. One.jsxfile + one.cssfile. That's it.
| Component | Category | Status | Description |
|---|---|---|---|
Button |
Inputs | β Stable | Primary, Secondary, Danger variants + sm/md/lg sizes |
Navbar |
Navigation | β Stable | Sticky navbar with active link highlighting |
Input |
Inputs | π Planned | Text input with label and validation |
Card |
Layout | π Planned | Content card with header/body/footer slots |
Modal |
Overlay | π Planned | Accessible dialog with backdrop |
Badge |
Display | π Planned | Status indicator with color variants |
This is the most important section if you want to contribute. Follow these 3 steps:
Create a new folder inside src/components/ with your component name:
src/components/YourComponent/
βββ YourComponent.jsx
βββ YourComponent.css
YourComponent.jsx β minimal template:
// YourComponent.jsx
// Props:
// propName (type) β description
import React from 'react'
import './YourComponent.css'
function YourComponent({ propName }) {
return (
<div className="your-component">
{/* your JSX here */}
</div>
)
}
export default YourComponentYourComponent.css β minimal template:
/* YourComponent.css */
.your-component {
/* your styles here */
}Open src/data/componentsList.js and add your component to the array:
{
id: 7, // next available id
name: 'YourComponent',
category: 'Layout', // Inputs | Layout | Overlay | Display | Navigation
status: 'Beta', // Stable | Beta | Planned
description: 'One line about what this component does.',
},Open src/pages/Components.jsx and:
- Import your component at the top:
import YourComponent from '../components/YourComponent/YourComponent.jsx'- Add it to the
sectionsarray (for sidebar navigation):
{ id: 'your-component', label: 'π YourComponent' },- Add a
<section>block in the JSX (copy the Button section as a template).
That's it. Open a PR and you're a UIverse contributor! π
# 1. Create a new branch for your feature
git checkout -b feat/add-card-component
# 2. Make your changes
# 3. Stage and commit
git add .
git commit -m "feat: add Card component with header/body/footer slots"
# 4. Push to your fork
git push origin feat/add-card-component
# 5. Open a Pull Request on GitHubWe follow a simple convention:
| Prefix | When to use |
|---|---|
feat: |
Adding a new component or feature |
fix: |
Fixing a bug |
style: |
CSS/UI changes only |
docs: |
README or comment updates |
refactor: |
Code cleanup, no behavior change |
chore: |
Config, deps, tooling |
Examples:
feat: add Badge component with color variants
fix: button hover state not working on Safari
style: improve Card component spacing
docs: update contributing steps in README
Before opening a PR, make sure:
- Component is inside its own folder in
src/components/ - Component has a
.jsxand a.cssfile - Props are documented in comments at the top of the
.jsxfile - Component is registered in
src/data/componentsList.js - A showcase section is added in
src/pages/Components.jsx - Code runs without errors (
npm run dev) - CSS class names follow the pattern:
uiverse-<componentname> - No external libraries added without discussion
Looking for something to build? Here are some ideas:
| Component | Difficulty | Notes |
|---|---|---|
Input |
π’ Easy | Text input with label + placeholder props |
Badge |
π’ Easy | Colored pill badge, similar to Button variants |
Card |
π‘ Medium | Header, body, footer slots via props/children |
Alert |
π‘ Medium | Info, success, warning, error variants |
Modal |
π΄ Hard | Needs portal, backdrop, keyboard close (Esc) |
Tooltip |
π΄ Hard | Hover-triggered, position-aware |
Toggle |
π‘ Medium | On/off switch with controlled state |
Avatar |
π’ Easy | Image or initials fallback, size variants |
| Tool | Version | Purpose |
|---|---|---|
| React | 18 | UI rendering |
| Vite | 5 | Dev server + bundler |
| React Router | 6 | Client-side routing |
| Plain CSS | β | Component styling |
| React Icons | 5 | Lightweight icon library for React components |
npm run dev # Start development server at localhost:5173
npm run build # Build for production (outputs to /dist)
npm run preview # Preview the production build locally- Be respectful and welcoming to all contributors
- Give constructive feedback on PRs
- Help beginners β everyone starts somewhere
- No spam PRs (e.g. only whitespace changes)
This project is licensed under the MIT License β you're free to use, modify, and distribute it.
Made with β€οΈ for the open-source community
If this project helped you, consider giving it a β on GitHub!