Dashboard Project
Create professional admin dashboards with sidebar navigation, stat cards, charts, and data tables.
💻 Dashboard Layout
<div class="dashboard">
<aside class="sidebar">
<!-- Sidebar content -->
</aside>
<div class="main-content">
<header class="header">
<!-- Header content -->
</header>
<main class="content">
<!-- Main content -->
</main>
</div>
</div>
/* Dashboard Grid Layout */
.dashboard {
display: grid;
grid-template-columns: 260px 1fr;
min-height: 100vh;
background: #f5f7fa;
}
.sidebar {
background: #1a1d2e;
color: white;
display: flex;
flex-direction: column;
position: sticky;
top: 0;
height: 100vh;
overflow-y: auto;
}
.main-content {
display: flex;
flex-direction: column;
}
.header {
background: white;
padding: 1.5rem 2rem;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
position: sticky;
top: 0;
z-index: 100;
}
.content {
padding: 2rem;
}
/* Responsive */
@media (max-width: 1024px) {
.dashboard {
grid-template-columns: 1fr;
}
.sidebar {
position: fixed;
left: 0;
top: 0;
z-index: 1000;
transform: translateX(-100%);
transition: transform 0.3s ease;
}
.sidebar.active {
transform: translateX(0);
}
}
🎨 Sidebar Navigation
<aside class="sidebar">
<div class="sidebar__header">
<h2 class="sidebar__logo">Dashboard</h2>
</div>
<nav class="sidebar__nav">
<a href="#" class="sidebar__link sidebar__link--active">
<svg class="sidebar__icon">...</svg>
<span>Dashboard</span>
</a>
<a href="#" class="sidebar__link">
<svg class="sidebar__icon">...</svg>
<span>Analytics</span>
</a>
<a href="#" class="sidebar__link">
<svg class="sidebar__icon">...</svg>
<span>Users</span>
<span class="sidebar__badge">12</span>
</a>
<a href="#" class="sidebar__link">
<svg class="sidebar__icon">...</svg>
<span>Products</span>
</a>
<a href="#" class="sidebar__link">
<svg class="sidebar__icon">...</svg>
<span>Orders</span>
</a>
<a href="#" class="sidebar__link">
<svg class="sidebar__icon">...</svg>
<span>Settings</span>
</a>
</nav>
<div class="sidebar__footer">
<div class="sidebar__user">
<img src="avatar.jpg" alt="User">
<div>
<strong>John Doe</strong>
<span>Admin</span>
</div>
</div>
</div>
</aside>
.sidebar__header {
padding: 2rem 1.5rem;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.sidebar__logo {
margin: 0;
font-size: 1.5rem;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.sidebar__nav {
flex: 1;
padding: 1rem 0;
}
.sidebar__link {
display: flex;
align-items: center;
gap: 1rem;
padding: 1rem 1.5rem;
color: rgba(255, 255, 255, 0.7);
text-decoration: none;
transition: all 0.2s ease;
position: relative;
}
.sidebar__link::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transform: scaleY(0);
transition: transform 0.2s ease;
}
.sidebar__link:hover,
.sidebar__link--active {
background: rgba(255, 255, 255, 0.05);
color: white;
}
.sidebar__link:hover::before,
.sidebar__link--active::before {
transform: scaleY(1);
}
.sidebar__icon {
width: 20px;
height: 20px;
stroke: currentColor;
fill: none;
}
.sidebar__badge {
margin-left: auto;
background: #667eea;
color: white;
padding: 0.25rem 0.5rem;
border-radius: 12px;
font-size: 0.75rem;
font-weight: 600;
}
.sidebar__footer {
border-top: 1px solid rgba(255, 255, 255, 0.1);
padding: 1.5rem;
}
.sidebar__user {
display: flex;
align-items: center;
gap: 1rem;
}
.sidebar__user img {
width: 40px;
height: 40px;
border-radius: 50%;
}
.sidebar__user div {
display: flex;
flex-direction: column;
}
.sidebar__user strong {
font-size: 0.875rem;
}
.sidebar__user span {
font-size: 0.75rem;
color: rgba(255, 255, 255, 0.5);
}
📊 Header & Search
<header class="header">
<div class="header__left">
<button class="header__menu-toggle">☰</button>
<h1 class="header__title">Dashboard Overview</h1>
</div>
<div class="header__search">
<input type="search" placeholder="Search...">
<svg class="header__search-icon">...</svg>
</div>
<div class="header__actions">
<button class="header__action" title="Notifications">
<svg>...</svg>
<span class="header__badge">3</span>
</button>
<button class="header__action" title="Messages">
<svg>...</svg>
<span class="header__badge">5</span>
</button>
<button class="header__action" title="Profile">
<img src="avatar.jpg" alt="Profile">
</button>
</div>
</header>
.header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 2rem;
}
.header__left {
display: flex;
align-items: center;
gap: 1rem;
}
.header__menu-toggle {
display: none;
background: none;
border: none;
font-size: 1.5rem;
cursor: pointer;
color: #1a1d2e;
}
@media (max-width: 1024px) {
.header__menu-toggle {
display: block;
}
}
.header__title {
margin: 0;
font-size: 1.5rem;
color: #1a1d2e;
}
.header__search {
flex: 1;
max-width: 400px;
position: relative;
}
.header__search input {
width: 100%;
padding: 0.75rem 1rem 0.75rem 3rem;
border: 2px solid #e0e0e0;
border-radius: 10px;
font-size: 0.875rem;
transition: all 0.3s ease;
}
.header__search input:focus {
outline: none;
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
.header__search-icon {
position: absolute;
left: 1rem;
top: 50%;
transform: translateY(-50%);
width: 18px;
height: 18px;
stroke: #999;
}
.header__actions {
display: flex;
gap: 1rem;
align-items: center;
}
.header__action {
position: relative;
background: none;
border: none;
padding: 0.5rem;
cursor: pointer;
border-radius: 10px;
transition: background 0.2s ease;
}
.header__action:hover {
background: #f5f5f5;
}
.header__action svg {
width: 20px;
height: 20px;
stroke: #666;
}
.header__action img {
width: 35px;
height: 35px;
border-radius: 50%;
}
.header__badge {
position: absolute;
top: 0;
right: 0;
background: #ef4444;
color: white;
font-size: 0.625rem;
padding: 0.125rem 0.375rem;
border-radius: 10px;
font-weight: 700;
}
📈 Stats Cards
<div class="stats-grid">
<div class="stat-card">
<div class="stat-card__icon stat-card__icon--primary">💰</div>
<div class="stat-card__content">
<span class="stat-card__label">Total Revenue</span>
<h3 class="stat-card__value">$45,231</h3>
<span class="stat-card__change stat-card__change--up">
↑ 12% from last month
</span>
</div>
</div>
<div class="stat-card">
<div class="stat-card__icon stat-card__icon--success">👥</div>
<div class="stat-card__content">
<span class="stat-card__label">Total Users</span>
<h3 class="stat-card__value">2,845</h3>
<span class="stat-card__change stat-card__change--up">
↑ 8% from last month
</span>
</div>
</div>
<div class="stat-card">
<div class="stat-card__icon stat-card__icon--warning">📦</div>
<div class="stat-card__content">
<span class="stat-card__label">Orders</span>
<h3 class="stat-card__value">1,423</h3>
<span class="stat-card__change stat-card__change--down">
↓ 3% from last month
</span>
</div>
</div>
<div class="stat-card">
<div class="stat-card__icon stat-card__icon--info">⭐</div>
<div class="stat-card__content">
<span class="stat-card__label">Satisfaction</span>
<h3 class="stat-card__value">98%</h3>
<span class="stat-card__change stat-card__change--up">
↑ 2% from last month
</span>
</div>
</div>
</div>
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.stat-card {
background: white;
border-radius: 16px;
padding: 1.5rem;
display: flex;
gap: 1rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
transition: all 0.3s ease;
}
.stat-card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
}
.stat-card__icon {
width: 60px;
height: 60px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 2rem;
}
.stat-card__icon--primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.stat-card__icon--success {
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
}
.stat-card__icon--warning {
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
}
.stat-card__icon--info {
background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
}
.stat-card__content {
flex: 1;
display: flex;
flex-direction: column;
}
.stat-card__label {
font-size: 0.875rem;
color: #666;
margin-bottom: 0.5rem;
}
.stat-card__value {
font-size: 2rem;
font-weight: 800;
margin: 0 0 0.5rem;
color: #1a1d2e;
}
.stat-card__change {
font-size: 0.875rem;
font-weight: 600;
}
.stat-card__change--up {
color: #10b981;
}
.stat-card__change--down {
color: #ef4444;
}
📋 Data Table
<div class="card">
<div class="card__header">
<h3>Recent Orders</h3>
<button class="btn btn--sm">View All</button>
</div>
<div class="table-container">
<table class="table">
<thead>
<tr>
<th>Order ID</th>
<th>Customer</th>
<th>Product</th>
<th>Amount</th>
<th>Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td>#12345</td>
<td>
<div class="table__user">
<img src="avatar.jpg" alt="User">
<span>John Doe</span>
</div>
</td>
<td>Wireless Headphones</td>
<td>$299.00</td>
<td><span class="badge badge--success">Delivered</span></td>
<td>
<button class="btn-icon" title="View">👁️</button>
<button class="btn-icon" title="Edit">✏️</button>
</td>
</tr>
<!-- More rows -->
</tbody>
</table>
</div>
</div>
.card {
background: white;
border-radius: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
overflow: hidden;
}
.card__header {
padding: 1.5rem;
border-bottom: 1px solid #f0f0f0;
display: flex;
justify-content: space-between;
align-items: center;
}
.card__header h3 {
margin: 0;
font-size: 1.25rem;
color: #1a1d2e;
}
.table-container {
overflow-x: auto;
}
.table {
width: 100%;
border-collapse: collapse;
}
.table thead {
background: #f9fafb;
}
.table th {
padding: 1rem 1.5rem;
text-align: left;
font-weight: 600;
color: #666;
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.table td {
padding: 1rem 1.5rem;
border-bottom: 1px solid #f0f0f0;
}
.table tbody tr:hover {
background: #f9fafb;
}
.table__user {
display: flex;
align-items: center;
gap: 0.75rem;
}
.table__user img {
width: 32px;
height: 32px;
border-radius: 50%;
}
.badge {
display: inline-block;
padding: 0.375rem 0.75rem;
border-radius: 20px;
font-size: 0.75rem;
font-weight: 600;
}
.badge--success {
background: #d1fae5;
color: #065f46;
}
.badge--warning {
background: #fef3c7;
color: #92400e;
}
.badge--danger {
background: #fee2e2;
color: #991b1b;
}
.btn-icon {
background: none;
border: none;
cursor: pointer;
padding: 0.25rem;
font-size: 1.125rem;
opacity: 0.6;
transition: opacity 0.2s;
}
.btn-icon:hover {
opacity: 1;
}
📊 Chart Placeholder
<div class="card">
<div class="card__header">
<h3>Revenue Overview</h3>
<select class="select-sm">
<option>Last 7 days</option>
<option>Last 30 days</option>
<option>Last 90 days</option>
</select>
</div>
<div class="chart-placeholder">
<div class="chart-placeholder__bars">
<div class="bar" style="--height: 60%"></div>
<div class="bar" style="--height: 80%"></div>
<div class="bar" style="--height: 45%"></div>
<div class="bar" style="--height: 90%"></div>
<div class="bar" style="--height: 70%"></div>
<div class="bar" style="--height: 95%"></div>
<div class="bar" style="--height: 75%"></div>
</div>
<div class="chart-placeholder__labels">
<span>Mon</span>
<span>Tue</span>
<span>Wed</span>
<span>Thu</span>
<span>Fri</span>
<span>Sat</span>
<span>Sun</span>
</div>
</div>
</div>
.chart-placeholder {
padding: 2rem 1.5rem;
}
.chart-placeholder__bars {
display: flex;
align-items: flex-end;
gap: 1rem;
height: 200px;
margin-bottom: 1rem;
}
.bar {
flex: 1;
height: var(--height);
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 8px 8px 0 0;
transition: all 0.3s ease;
animation: barGrow 0.6s ease-out backwards;
}
.bar:hover {
opacity: 0.8;
transform: translateY(-5px);
}
@keyframes barGrow {
from {
height: 0;
}
to {
height: var(--height);
}
}
.bar:nth-child(2) { animation-delay: 0.1s; }
.bar:nth-child(3) { animation-delay: 0.2s; }
.bar:nth-child(4) { animation-delay: 0.3s; }
.bar:nth-child(5) { animation-delay: 0.4s; }
.bar:nth-child(6) { animation-delay: 0.5s; }
.bar:nth-child(7) { animation-delay: 0.6s; }
.chart-placeholder__labels {
display: flex;
justify-content: space-between;
color: #666;
font-size: 0.875rem;
}
.select-sm {
padding: 0.5rem 1rem;
border: 1px solid #e0e0e0;
border-radius: 8px;
font-size: 0.875rem;
cursor: pointer;
}
.select-sm:focus {
outline: none;
border-color: #667eea;
}
🎯 Complete Dashboard
<!-- Full dashboard layout -->
.content {
display: grid;
gap: 2rem;
}
/* Two-column layout for charts */
.chart-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
gap: 1.5rem;
}
/* Activity feed */
.activity {
background: white;
border-radius: 16px;
padding: 1.5rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
.activity__item {
display: flex;
gap: 1rem;
padding: 1rem 0;
border-bottom: 1px solid #f0f0f0;
}
.activity__item:last-child {
border-bottom: none;
}
.activity__icon {
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background: #f0f0f0;
flex-shrink: 0;
}
.activity__content h4 {
margin: 0 0 0.25rem;
font-size: 0.875rem;
color: #1a1d2e;
}
.activity__content p {
margin: 0;
font-size: 0.75rem;
color: #999;
}
/* Responsive layout */
@media (max-width: 768px) {
.stats-grid {
grid-template-columns: 1fr;
}
.chart-grid {
grid-template-columns: 1fr;
}
}
🎯 Key Takeaways
- Grid layout: Sidebar + main content using CSS Grid
- Sticky elements: Fixed sidebar and header for navigation
- Stats cards: Visual data representation with icons
- Data tables: Responsive tables with hover effects
- Charts: CSS-only bar charts with animations
- Responsive design: Mobile-friendly with collapsible sidebar
- Color coding: Status badges and visual indicators
- Microinteractions: Hover effects, transitions, animations