Template Bootstrap 5 de dashboard d'administration avec header fixe et sidebar collapsible pour navigation fluide.
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="copyright" content="MEZGANI Said" />
<meta name="author" content="AngularForAll" />
<meta name="robots" content="noindex, nofollow" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin Template - Dashboard | AngularForAll</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Bootstrap Icons -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css">
<style>
:root {
--primary-color: #6366f1;
--secondary-color: #8b5cf6;
--dark-bg: #0f172a;
--sidebar-bg: #1e293b;
--header-bg: #ffffff;
--text-primary: #0f172a;
--text-secondary: #64748b;
--border-color: #e2e8f0;
--sidebar-width: 260px;
--sidebar-width-sm: 80px;
--header-height: 70px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f8fafc;
color: var(--text-primary);
overflow-x: hidden;
}
/* Conteneur Principal */
.admin-container {
display: flex;
min-height: 100vh;
}
/* ========== SIDEBAR ========== */
.sidebar {
width: var(--sidebar-width);
background: linear-gradient(135deg, var(--dark-bg) 0%, var(--sidebar-bg) 100%);
color: #e2e8f0;
transition: all 0.3s ease;
position: fixed;
top: 0;
left: 0;
height: 100vh;
overflow-y: auto;
z-index: 999;
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
}
.sidebar-header {
padding: 20px 15px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
}
.logo {
font-size: 1.8rem;
font-weight: 700;
background: linear-gradient(135deg, #6366f1, #8b5cf6);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
display: flex;
align-items: center;
gap: 10px;
}
.nav-menu {
list-style: none;
padding: 20px 0;
}
.nav-item {
padding: 0 15px;
margin-bottom: 8px;
}
.nav-link {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 15px;
color: #cbd5e1;
text-decoration: none;
border-radius: 8px;
transition: all 0.3s ease;
position: relative;
}
.nav-link i {
font-size: 1.2rem;
min-width: 20px;
text-align: center;
}
.nav-link:hover {
background-color: rgba(99, 102, 241, 0.2);
color: #e2e8f0;
padding-left: 20px;
}
.nav-link.active {
background: linear-gradient(90deg, rgba(99, 102, 241, 0.3), transparent);
color: #6366f1;
border-left: 3px solid #6366f1;
padding-left: 12px;
}
.nav-title {
font-size: 0.75rem;
font-weight: 600;
color: #94a3b8;
text-transform: uppercase;
letter-spacing: 1px;
padding: 15px 15px 8px;
margin-top: 15px;
}
/* ========== MAIN CONTENT ========== */
.main-content {
flex: 1;
margin-left: var(--sidebar-width);
transition: all 0.3s ease;
display: flex;
flex-direction: column;
}
/* ========== HEADER ========== */
.header {
background-color: var(--header-bg);
border-bottom: 1px solid var(--border-color);
padding: 0 30px;
height: var(--header-height);
display: flex;
align-items: center;
justify-content: space-between;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
position: sticky;
top: 0;
z-index: 99;
}
.header-left {
display: flex;
align-items: center;
gap: 20px;
flex: 1;
}
.toggle-sidebar {
background: none;
border: none;
color: var(--text-primary);
font-size: 1.5rem;
cursor: pointer;
transition: all 0.3s ease;
display: none;
}
.toggle-sidebar:hover {
color: var(--primary-color);
}
.breadcrumb-nav {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.9rem;
}
.breadcrumb-nav a {
color: var(--primary-color);
text-decoration: none;
transition: all 0.3s ease;
}
.breadcrumb-nav a:hover {
text-decoration: underline;
}
.breadcrumb-separator {
color: var(--text-secondary);
}
.breadcrumb-current {
color: var(--text-primary);
font-weight: 500;
}
.header-middle {
flex: 1;
display: flex;
justify-content: center;
gap: 20px;
}
.search-box {
position: relative;
width: 300px;
}
.search-box input {
width: 100%;
padding: 10px 15px 10px 40px;
border: 1px solid var(--border-color);
border-radius: 8px;
background-color: #f8fafc;
font-size: 0.9rem;
transition: all 0.3s ease;
}
.search-box input:focus {
outline: none;
background-color: white;
border-color: var(--primary-color);
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
}
.search-box i {
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
color: var(--text-secondary);
}
.header-right {
display: flex;
align-items: center;
gap: 20px;
}
.header-icon-btn {
background: none;
border: none;
color: var(--text-secondary);
font-size: 1.3rem;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
}
.header-icon-btn:hover {
color: var(--primary-color);
}
.notification-badge {
position: absolute;
top: -8px;
right: -8px;
background-color: #ef4444;
color: white;
font-size: 0.65rem;
width: 18px;
height: 18px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
font-weight: 700;
}
.divider {
width: 1px;
height: 30px;
background-color: var(--border-color);
}
.user-profile {
display: flex;
align-items: center;
gap: 12px;
cursor: pointer;
transition: all 0.3s ease;
}
.user-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: linear-gradient(135deg, #6366f1, #8b5cf6);
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: 600;
font-size: 1rem;
}
.user-info {
display: flex;
flex-direction: column;
gap: 2px;
}
.user-name {
font-size: 0.85rem;
font-weight: 600;
color: var(--text-primary);
}
.user-role {
font-size: 0.75rem;
color: var(--text-secondary);
}
.user-profile:hover .user-name {
color: var(--primary-color);
}
/* ========== MAIN AREA ========== */
.main-area {
flex: 1;
padding: 30px;
overflow-y: auto;
}
.page-title {
font-size: 1.8rem;
font-weight: 700;
margin-bottom: 10px;
color: var(--text-primary);
}
.page-subtitle {
font-size: 0.95rem;
color: var(--text-secondary);
margin-bottom: 30px;
}
/* ========== RESPONSIVE ========== */
@media (max-width: 992px) {
:root {
--sidebar-width: 80px;
}
.sidebar {
width: 80px;
}
.logo {
font-size: 1.5rem;
}
.nav-link {
justify-content: center;
}
.nav-link span {
display: none;
}
.nav-title {
display: none;
}
.search-box {
width: 200px;
}
.user-info {
display: none;
}
}
@media (max-width: 768px) {
:root {
--sidebar-width: 0;
}
.sidebar {
width: 0;
overflow: hidden;
}
.sidebar.active {
width: 260px;
}
.main-content {
margin-left: 0;
}
.toggle-sidebar {
display: block;
}
.header {
padding: 0 15px;
}
.header-middle {
display: none;
}
.search-box {
display: none;
}
.breadcrumb-nav {
display: none;
}
.main-area {
padding: 20px 15px;
}
.page-title {
font-size: 1.4rem;
}
}
@media (max-width: 576px) {
.header-right {
gap: 10px;
}
.divider {
display: none;
}
.user-profile {
gap: 8px;
}
.user-avatar {
width: 35px;
height: 35px;
font-size: 0.85rem;
}
}
/* ========== SCROLLBAR ========== */
.sidebar::-webkit-scrollbar {
width: 6px;
}
.sidebar::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
}
.sidebar::-webkit-scrollbar-thumb {
background: rgba(99, 102, 241, 0.3);
border-radius: 3px;
}
.sidebar::-webkit-scrollbar-thumb:hover {
background: rgba(99, 102, 241, 0.5);
}
</style>
</head>
<body>
<div class="admin-container">
<!-- SIDEBAR -->
<aside class="sidebar" id="sidebar">
<div class="sidebar-header">
<div class="logo">
<i class="bi bi-speedometer2"></i>
<span>Admin</span>
</div>
</div>
<ul class="nav-menu">
<li class="nav-title">Menu Principal</li>
<li class="nav-item">
<a href="#" class="nav-link active">
<i class="bi bi-house-door"></i>
<span>Tableau de Bord</span>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="bi bi-people"></i>
<span>Utilisateurs</span>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="bi bi-box"></i>
<span>Produits</span>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="bi bi-receipt"></i>
<span>Commandes</span>
</a>
</li>
<li class="nav-title">Gestion</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="bi bi-graph-up"></i>
<span>Analytiques</span>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="bi bi-file-text"></i>
<span>Rapports</span>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="bi bi-gear"></i>
<span>Paramètres</span>
</a>
</li>
<li class="nav-title">Support</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="bi bi-question-circle"></i>
<span>Aide</span>
</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="bi bi-chat-dots"></i>
<span>Support</span>
</a>
</li>
</ul>
</aside>
<!-- MAIN CONTENT -->
<div class="main-content">
<!-- HEADER -->
<header class="header">
<div class="header-left">
<button class="toggle-sidebar" id="toggleSidebar" aria-label="Toggle Sidebar">
<i class="bi bi-list"></i>
</button>
<div class="breadcrumb-nav">
<a href="#">Accueil</a>
<span class="breadcrumb-separator">/</span>
<span class="breadcrumb-current">Tableau de Bord</span>
</div>
</div>
<div class="header-middle">
<div class="search-box">
<i class="bi bi-search"></i>
<input type="text" placeholder="Rechercher...">
</div>
</div>
<div class="header-right">
<button class="header-icon-btn" aria-label="Notifications">
<i class="bi bi-bell"></i>
<span class="notification-badge">3</span>
</button>
<button class="header-icon-btn" aria-label="Messages">
<i class="bi bi-chat-left-dots"></i>
</button>
<div class="divider"></div>
<div class="user-profile">
<div class="user-avatar">AD</div>
<div class="user-info">
<div class="user-name">Admin User</div>
<div class="user-role">Administrateur</div>
</div>
<i class="bi bi-chevron-down" style="font-size: 0.8rem; color: var(--text-secondary);"></i>
</div>
</div>
</header>
<!-- MAIN AREA -->
<main class="main-area">
<h1 class="page-title">Bienvenue au Tableau de Bord</h1>
<p class="page-subtitle">Gérez votre plateforme depuis cet interface moderne</p>
<!-- Contenu du Dashboard -->
<div class="row">
<div class="col-md-3 mb-4">
<div class="card border-0 shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start">
<div>
<p class="text-muted small mb-1">Utilisateurs</p>
<h3 class="mb-0">1,234</h3>
</div>
<i class="bi bi-people" style="font-size: 2rem; color: #6366f1;"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-4">
<div class="card border-0 shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start">
<div>
<p class="text-muted small mb-1">Commandes</p>
<h3 class="mb-0">567</h3>
</div>
<i class="bi bi-receipt" style="font-size: 2rem; color: #8b5cf6;"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-4">
<div class="card border-0 shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start">
<div>
<p class="text-muted small mb-1">Revenus</p>
<h3 class="mb-0">$45,892</h3>
</div>
<i class="bi bi-graph-up" style="font-size: 2rem; color: #06b6d4;"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-4">
<div class="card border-0 shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start">
<div>
<p class="text-muted small mb-1">Taux Croissance</p>
<h3 class="mb-0">+24.5%</h3>
</div>
<i class="bi bi-arrow-up-right" style="font-size: 2rem; color: #10b981;"></i>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<!-- Script pour toggle sidebar (CSS seulement pour animation) -->
<script>
const toggleBtn = document.getElementById('toggleSidebar');
const sidebar = document.getElementById('sidebar');
toggleBtn?.addEventListener('click', function() {
sidebar.classList.toggle('active');
});
// Fermer la sidebar en cliquant ailleurs sur mobile
document.addEventListener('click', function(event) {
if (window.innerWidth <= 768) {
if (!sidebar.contains(event.target) && !toggleBtn.contains(event.target)) {
sidebar.classList.remove('active');
}
}
});
</script>
</body>
</html>