Admin Dashboard - Template Bootstrap 4 v6

🏷️ Extraits de code HTML 📅 17/04/2026 👤 Mezgani said
Bootstrap Bootstrap4 Dashboard Admin Professionnel Html

Dernière variante Bootstrap 4 du dashboard avec interface professionnelle, tables avancées et contrôles admin.

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>ArchitectUI — Layout</title>
  <link href="https://fonts.googleapis.com/css2?family=Sarabun:wght@300;400;500;600;700&display=swap" rel="stylesheet" />
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
  <style>

    /* ══════════════════════════════════════════
       RESET & TOKENS
    ══════════════════════════════════════════ */
    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

    :root {
      --primary:        #6770d2;
      --primary-dark:   #5560c2;
      --primary-light:  #8a91de;
      --primary-glow:   rgba(103,112,210,.18);

      --sidebar-bg:     #252733;
      --sidebar-hover:  rgba(255,255,255,.05);
      --sidebar-active: rgba(103,112,210,.15);
      --sidebar-border: rgba(255,255,255,.06);
      --sidebar-width:  260px;
      --sidebar-collapsed: 68px;

      --header-bg:      #363740;
      --header-height:  60px;

      --page-bg:        #f2f4f6;
      --card-bg:        #ffffff;

      --text-white:     #ffffff;
      --text-sidebar:   rgba(255,255,255,.65);
      --text-sidebar-h: rgba(255,255,255,.92);
      --text-section:   rgba(255,255,255,.28);

      --text-dark:      #1c1e2e;
      --text-muted:     #6c757d;
      --text-light:     #adb5bd;
      --border:         #e9ecef;

      --success: #3ac47d;
      --warning: #f7b731;
      --danger:  #e55353;
      --info:    #16aaff;

      --radius: 10px;
      --shadow: 0 2px 14px rgba(0,0,0,.08);
      --transition: .22s ease;
    }

    html, body {
      height: 100%;
      font-family: 'Sarabun', sans-serif;
      font-size: 14px;
      background: var(--page-bg);
      color: var(--text-dark);
    }

    /* ══════════════════════════════════════════
       ROOT LAYOUT
    ══════════════════════════════════════════ */
    .app {
      display: flex;
      height: 100vh;
      overflow: hidden;
    }

    /* ══════════════════════════════════════════
       SIDEBAR
    ══════════════════════════════════════════ */
    .sidebar {
      width: var(--sidebar-width);
      height: 100vh;
      background: var(--sidebar-bg);
      display: flex;
      flex-direction: column;
      flex-shrink: 0;
      overflow: hidden;
      transition: width var(--transition);
      position: relative;
      z-index: 200;
    }

    /* ── Logo ─────────────────────────────── */
    .sidebar-logo {
      height: var(--header-height);
      display: flex;
      align-items: center;
      padding: 0 18px;
      gap: 11px;
      border-bottom: 1px solid var(--sidebar-border);
      flex-shrink: 0;
      text-decoration: none;
      overflow: hidden;
      white-space: nowrap;
    }
    .logo-mark {
      width: 34px;
      height: 34px;
      border-radius: 9px;
      background: var(--primary);
      display: flex;
      align-items: center;
      justify-content: center;
      flex-shrink: 0;
      box-shadow: 0 4px 12px rgba(103,112,210,.45);
    }
    .logo-mark svg { width: 18px; height: 18px; }
    .logo-text {
      font-size: 15.5px;
      font-weight: 700;
      color: var(--text-white);
      letter-spacing: .2px;
      line-height: 1;
    }
    .logo-text span { color: var(--primary-light); }
    .logo-version {
      font-size: 10px;
      color: var(--text-section);
      font-weight: 400;
      margin-top: 3px;
    }

    /* ── Nav Scroll ───────────────────────── */
    .sidebar-scroll {
      flex: 1;
      overflow-y: auto;
      overflow-x: hidden;
      padding: 10px 0 16px;
    }
    .sidebar-scroll::-webkit-scrollbar { width: 3px; }
    .sidebar-scroll::-webkit-scrollbar-thumb {
      background: rgba(255,255,255,.08);
      border-radius: 4px;
    }

    /* ── Section Labels ───────────────────── */
    .nav-section {
      font-size: 10px;
      font-weight: 700;
      letter-spacing: 1.4px;
      text-transform: uppercase;
      color: var(--text-section);
      padding: 18px 20px 6px;
      white-space: nowrap;
      overflow: hidden;
      transition: opacity var(--transition);
    }

    /* ── Nav Items ────────────────────────── */
    .nav-item {
      display: flex;
      align-items: center;
      gap: 11px;
      padding: 9px 18px;
      margin: 1px 8px;
      border-radius: 8px;
      cursor: pointer;
      color: var(--text-sidebar);
      transition: background var(--transition), color var(--transition);
      position: relative;
      white-space: nowrap;
      overflow: hidden;
      user-select: none;
    }
    .nav-item:hover {
      background: var(--sidebar-hover);
      color: var(--text-sidebar-h);
    }
    .nav-item.active {
      background: var(--sidebar-active);
      color: var(--text-white);
    }
    .nav-item.active::before {
      content: '';
      position: absolute;
      left: 0; top: 50%;
      transform: translateY(-50%);
      width: 3px;
      height: 60%;
      background: var(--primary);
      border-radius: 0 3px 3px 0;
    }

    .nav-icon {
      width: 34px;
      height: 34px;
      border-radius: 7px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 14px;
      flex-shrink: 0;
      transition: background var(--transition);
    }
    .nav-item.active .nav-icon   { background: var(--primary-glow); color: var(--primary-light); }
    .nav-item:hover  .nav-icon   { background: rgba(255,255,255,.06); }

    .nav-label {
      flex: 1;
      font-size: 13.5px;
      font-weight: 500;
    }

    /* pill badge */
    .nav-badge {
      font-size: 10px;
      font-weight: 700;
      padding: 2px 7px;
      border-radius: 20px;
      flex-shrink: 0;
      line-height: 1.6;
    }
    .badge-primary { background: var(--primary);  color: #fff; }
    .badge-success { background: var(--success);  color: #fff; }
    .badge-danger  { background: var(--danger);   color: #fff; }
    .badge-warning { background: var(--warning);  color: #fff; }
    .badge-dot {
      width: 7px; height: 7px;
      border-radius: 50%;
      flex-shrink: 0;
    }

    /* chevron for sub-menu toggle */
    .nav-chevron {
      font-size: 10px;
      color: var(--text-section);
      transition: transform var(--transition);
      flex-shrink: 0;
    }
    .nav-item.open .nav-chevron { transform: rotate(90deg); }

    /* Sub-menu */
    .sub-menu {
      max-height: 0;
      overflow: hidden;
      transition: max-height .3s ease;
    }
    .sub-menu.open { max-height: 300px; }
    .sub-item {
      display: flex;
      align-items: center;
      gap: 8px;
      padding: 7px 18px 7px 54px;
      margin: 1px 8px;
      border-radius: 8px;
      cursor: pointer;
      color: var(--text-sidebar);
      font-size: 13px;
      transition: background var(--transition), color var(--transition);
      white-space: nowrap;
      overflow: hidden;
    }
    .sub-item::before {
      content: '';
      width: 5px; height: 5px;
      border-radius: 50%;
      background: currentColor;
      opacity: .4;
      flex-shrink: 0;
    }
    .sub-item:hover   { background: var(--sidebar-hover); color: var(--text-sidebar-h); }
    .sub-item.active  { color: var(--primary-light); font-weight: 600; }
    .sub-item.active::before { opacity: 1; background: var(--primary); }

    /* ── Divider ──────────────────────────── */
    .nav-divider {
      height: 1px;
      background: var(--sidebar-border);
      margin: 10px 18px;
    }

    /* ── Sidebar Footer ───────────────────── */
    .sidebar-footer {
      border-top: 1px solid var(--sidebar-border);
      padding: 14px 18px;
      display: flex;
      align-items: center;
      gap: 10px;
      overflow: hidden;
      white-space: nowrap;
      flex-shrink: 0;
    }
    .sf-avatar {
      width: 36px; height: 36px;
      border-radius: 50%;
      background: linear-gradient(135deg, var(--primary), var(--primary-light));
      display: flex; align-items: center; justify-content: center;
      font-size: 13px; font-weight: 700; color: #fff;
      flex-shrink: 0;
      box-shadow: 0 2px 8px rgba(103,112,210,.4);
    }
    .sf-info { flex: 1; overflow: hidden; }
    .sf-name  { font-size: 13px; font-weight: 600; color: var(--text-white);    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .sf-role  { font-size: 11px; color: var(--text-section); margin-top: 1px; }
    .sf-btn {
      background: none; border: none;
      color: var(--text-section);
      cursor: pointer; padding: 4px;
      border-radius: 6px;
      transition: color var(--transition), background var(--transition);
      font-size: 13px;
      flex-shrink: 0;
    }
    .sf-btn:hover { color: var(--text-sidebar-h); background: rgba(255,255,255,.06); }

    /* ══════════════════════════════════════════
       COLLAPSED STATE
    ══════════════════════════════════════════ */
    .sidebar.collapsed { width: var(--sidebar-collapsed); }
    .sidebar.collapsed .nav-section { opacity: 0; pointer-events: none; }
    .sidebar.collapsed .nav-label,
    .sidebar.collapsed .nav-badge,
    .sidebar.collapsed .nav-chevron,
    .sidebar.collapsed .logo-text,
    .sidebar.collapsed .sf-info,
    .sidebar.collapsed .sf-btn { display: none; }
    .sidebar.collapsed .nav-item   { margin: 2px 10px; padding: 9px 0; justify-content: center; }
    .sidebar.collapsed .nav-icon   { width: 38px; height: 38px; }
    .sidebar.collapsed .sub-menu   { display: none; }
    .sidebar.collapsed .sidebar-footer { justify-content: center; padding: 14px 0; }
    .sidebar.collapsed .nav-item.active::before { display: none; }
    .sidebar.collapsed .nav-divider { margin: 8px 12px; }

    /* Tooltip on collapsed */
    .sidebar.collapsed .nav-item { position: relative; }
    .sidebar.collapsed .nav-item:hover::after {
      content: attr(data-label);
      position: absolute;
      left: calc(var(--sidebar-collapsed) - 4px);
      top: 50%;
      transform: translateY(-50%);
      background: #1a1c27;
      color: #fff;
      font-size: 12px;
      font-weight: 500;
      padding: 5px 10px;
      border-radius: 6px;
      white-space: nowrap;
      pointer-events: none;
      z-index: 999;
      box-shadow: 0 4px 12px rgba(0,0,0,.3);
    }

    /* ══════════════════════════════════════════
       MAIN WRAPPER
    ══════════════════════════════════════════ */
    .main-wrapper {
      flex: 1;
      display: flex;
      flex-direction: column;
      height: 100vh;
      overflow: hidden;
      min-width: 0;
    }

    /* ══════════════════════════════════════════
       HEADER
    ══════════════════════════════════════════ */
    .header {
      height: var(--header-height);
      background: var(--header-bg);
      display: flex;
      align-items: center;
      padding: 0 22px;
      gap: 14px;
      flex-shrink: 0;
      z-index: 100;
      box-shadow: 0 1px 0 rgba(255,255,255,.04), 0 2px 10px rgba(0,0,0,.15);
    }

    /* Toggle button */
    .header-toggle {
      width: 36px; height: 36px;
      background: none; border: none;
      color: rgba(255,255,255,.6);
      border-radius: 8px;
      cursor: pointer;
      display: flex; align-items: center; justify-content: center;
      font-size: 16px;
      transition: background var(--transition), color var(--transition);
      flex-shrink: 0;
    }
    .header-toggle:hover { background: rgba(255,255,255,.08); color: #fff; }

    /* Search */
    .header-search {
      display: flex;
      align-items: center;
      gap: 9px;
      background: rgba(255,255,255,.07);
      border: 1px solid rgba(255,255,255,.08);
      border-radius: 9px;
      padding: 0 14px;
      height: 36px;
      flex: 1;
      max-width: 360px;
      transition: background var(--transition), border-color var(--transition);
    }
    .header-search:focus-within {
      background: rgba(255,255,255,.1);
      border-color: rgba(103,112,210,.5);
    }
    .header-search i { color: rgba(255,255,255,.35); font-size: 13px; }
    .header-search input {
      background: none; border: none; outline: none;
      color: rgba(255,255,255,.85);
      font-family: 'Sarabun', sans-serif;
      font-size: 13.5px;
      width: 100%;
    }
    .header-search input::placeholder { color: rgba(255,255,255,.3); }

    /* Spacer */
    .header-spacer { flex: 1; }

    /* Header right actions */
    .header-actions { display: flex; align-items: center; gap: 4px; }

    .hbtn {
      width: 36px; height: 36px;
      background: none; border: none;
      color: rgba(255,255,255,.6);
      border-radius: 8px;
      cursor: pointer;
      display: flex; align-items: center; justify-content: center;
      font-size: 16px;
      position: relative;
      transition: background var(--transition), color var(--transition);
    }
    .hbtn:hover { background: rgba(255,255,255,.08); color: #fff; }

    .hbtn-dot {
      position: absolute;
      top: 6px; right: 6px;
      width: 8px; height: 8px;
      border-radius: 50%;
      border: 2px solid var(--header-bg);
    }
    .hbtn-dot.red    { background: var(--danger); }
    .hbtn-dot.green  { background: var(--success); }
    .hbtn-dot.orange { background: var(--warning); }

    /* Separator */
    .header-sep {
      width: 1px; height: 24px;
      background: rgba(255,255,255,.08);
      margin: 0 6px;
    }

    /* Breadcrumb in header */
    .header-breadcrumb {
      display: flex;
      align-items: center;
      gap: 6px;
      font-size: 13px;
      color: rgba(255,255,255,.4);
      margin-left: 4px;
    }
    .header-breadcrumb .crumb-active {
      color: rgba(255,255,255,.85);
      font-weight: 600;
    }
    .header-breadcrumb i { font-size: 10px; }

    /* Avatar dropdown trigger */
    .header-avatar-wrap {
      display: flex;
      align-items: center;
      gap: 9px;
      padding: 4px 10px 4px 4px;
      border-radius: 9px;
      cursor: pointer;
      transition: background var(--transition);
      margin-left: 4px;
    }
    .header-avatar-wrap:hover { background: rgba(255,255,255,.07); }
    .h-avatar {
      width: 32px; height: 32px;
      border-radius: 50%;
      background: linear-gradient(135deg, var(--primary), var(--primary-light));
      display: flex; align-items: center; justify-content: center;
      font-size: 12px; font-weight: 700; color: #fff;
      border: 2px solid rgba(255,255,255,.15);
    }
    .h-avatar-info { line-height: 1.3; }
    .h-avatar-name { font-size: 12.5px; font-weight: 600; color: rgba(255,255,255,.9); }
    .h-avatar-role { font-size: 10.5px; color: rgba(255,255,255,.35); }
    .h-avatar-chevron { font-size: 9px; color: rgba(255,255,255,.3); margin-left: 2px; }

    /* ══════════════════════════════════════════
       PAGE CONTENT (BLANK)
    ══════════════════════════════════════════ */
    .page-content {
      flex: 1;
      overflow-y: auto;
      padding: 30px;
      display: flex;
      flex-direction: column;
      gap: 0;
    }
    .page-content::-webkit-scrollbar { width: 5px; }
    .page-content::-webkit-scrollbar-thumb { background: #d0d5dd; border-radius: 4px; }

    /* ── Page title bar ───────────────────── */
    .page-topbar {
      display: flex;
      align-items: flex-start;
      justify-content: space-between;
      margin-bottom: 28px;
    }
    .page-title-main {
      font-size: 20px;
      font-weight: 700;
      color: var(--text-dark);
      line-height: 1.2;
    }
    .page-subtitle {
      font-size: 13px;
      color: var(--text-muted);
      margin-top: 4px;
    }
    .page-topbar-actions { display: flex; gap: 10px; align-items: center; }

    .btn {
      display: inline-flex; align-items: center; gap: 7px;
      padding: 8px 18px;
      border-radius: 8px;
      font-family: 'Sarabun', sans-serif;
      font-size: 13.5px;
      font-weight: 600;
      border: none;
      cursor: pointer;
      transition: opacity .2s, transform .15s;
      line-height: 1;
    }
    .btn:hover { opacity: .88; transform: translateY(-1px); }
    .btn-primary { background: var(--primary);     color: #fff; box-shadow: 0 4px 12px rgba(103,112,210,.35); }
    .btn-outline  {
      background: transparent;
      border: 1.5px solid var(--border);
      color: var(--text-muted);
    }

    /* ── Blank slot ───────────────────────── */
    .blank-slot {
      flex: 1;
      min-height: 300px;
      background: var(--card-bg);
      border-radius: 14px;
      border: 2px dashed var(--border);
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      gap: 14px;
      color: var(--text-light);
      box-shadow: var(--shadow);
    }
    .blank-slot-icon {
      width: 60px; height: 60px;
      border-radius: 16px;
      background: #f0f2ff;
      display: flex; align-items: center; justify-content: center;
      font-size: 24px;
      color: var(--primary-light);
    }
    .blank-slot-title {
      font-size: 15px;
      font-weight: 600;
      color: var(--text-muted);
    }
    .blank-slot-text {
      font-size: 13px;
      color: var(--text-light);
      text-align: center;
      max-width: 280px;
      line-height: 1.6;
    }

    /* ══════════════════════════════════════════
       MOBILE OVERLAY
    ══════════════════════════════════════════ */
    .sidebar-overlay {
      display: none;
      position: fixed; inset: 0;
      background: rgba(0,0,0,.4);
      z-index: 199;
      backdrop-filter: blur(2px);
    }
    @media (max-width: 768px) {
      .sidebar {
        position: fixed;
        top: 0; left: 0;
        transform: translateX(-100%);
        transition: transform var(--transition), width var(--transition);
        width: var(--sidebar-width) !important;
        box-shadow: 4px 0 24px rgba(0,0,0,.3);
      }
      .sidebar.mobile-open {
        transform: translateX(0);
      }
      .sidebar-overlay.visible { display: block; }
      .header-search { max-width: 200px; }
      .h-avatar-info, .h-avatar-chevron { display: none; }
    }

  </style>
</head>
<body>

<div class="app">

  <!-- ═══════════════════════════════════════
       SIDEBAR
  ════════════════════════════════════════ -->
  <aside class="sidebar" id="sidebar">

    <!-- Logo -->
    <a class="sidebar-logo" href="#">
      <div class="logo-mark">
        <svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
          <rect x="2" y="2" width="7" height="7" rx="2" fill="white"/>
          <rect x="11" y="2" width="7" height="7" rx="2" fill="rgba(255,255,255,.5)"/>
          <rect x="2" y="11" width="7" height="7" rx="2" fill="rgba(255,255,255,.5)"/>
          <rect x="11" y="11" width="7" height="7" rx="2" fill="white"/>
        </svg>
      </div>
      <div>
        <div class="logo-text">Architect<span>UI</span></div>
        <div class="logo-version">v4.0 — Dashboard</div>
      </div>
    </a>

    <!-- Navigation -->
    <div class="sidebar-scroll">

      <!-- Dashboards -->
      <div class="nav-section">Dashboards</div>

      <div class="nav-item active" data-label="Analytics" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-chart-pie"></i></div>
        <span class="nav-label">Analytics</span>
      </div>

      <div class="nav-item" data-label="Commerce" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-store"></i></div>
        <span class="nav-label">Commerce</span>
        <span class="nav-badge badge-primary">New</span>
      </div>

      <div class="nav-item" data-label="CRM" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-handshake"></i></div>
        <span class="nav-label">CRM</span>
      </div>

      <div class="nav-item" data-label="Reports" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-chart-bar"></i></div>
        <span class="nav-label">Reports</span>
        <span class="nav-badge badge-danger">3</span>
      </div>

      <div class="nav-divider"></div>

      <!-- Apps -->
      <div class="nav-section">Applications</div>

      <div class="nav-item" data-label="Users" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-users"></i></div>
        <span class="nav-label">Users</span>
      </div>

      <div class="nav-item" data-label="Orders" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-shopping-cart"></i></div>
        <span class="nav-label">Orders</span>
        <span class="nav-badge badge-warning">12</span>
      </div>

      <!-- Products with sub-menu -->
      <div class="nav-item" data-label="Products" onclick="toggleSub(this)">
        <div class="nav-icon"><i class="fas fa-box-open"></i></div>
        <span class="nav-label">Products</span>
        <i class="fas fa-chevron-right nav-chevron"></i>
      </div>
      <div class="sub-menu" id="sub-products">
        <div class="sub-item" onclick="setSubActive(this)">All Products</div>
        <div class="sub-item active" onclick="setSubActive(this)">Categories</div>
        <div class="sub-item" onclick="setSubActive(this)">Inventory</div>
        <div class="sub-item" onclick="setSubActive(this)">Pricing Rules</div>
      </div>

      <div class="nav-item" data-label="Inbox" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-inbox"></i></div>
        <span class="nav-label">Inbox</span>
        <span class="nav-badge badge-success">8</span>
      </div>

      <div class="nav-item" data-label="Calendar" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-calendar-alt"></i></div>
        <span class="nav-label">Calendar</span>
      </div>

      <!-- Pages with sub-menu -->
      <div class="nav-item" data-label="Pages" onclick="toggleSub(this)">
        <div class="nav-icon"><i class="fas fa-file-alt"></i></div>
        <span class="nav-label">Pages</span>
        <i class="fas fa-chevron-right nav-chevron"></i>
      </div>
      <div class="sub-menu" id="sub-pages">
        <div class="sub-item" onclick="setSubActive(this)">Login</div>
        <div class="sub-item" onclick="setSubActive(this)">Register</div>
        <div class="sub-item" onclick="setSubActive(this)">Forgot Password</div>
        <div class="sub-item" onclick="setSubActive(this)">404 Not Found</div>
        <div class="sub-item" onclick="setSubActive(this)">Maintenance</div>
      </div>

      <div class="nav-divider"></div>

      <!-- UI Kit -->
      <div class="nav-section">UI Components</div>

      <!-- Elements with sub-menu -->
      <div class="nav-item" data-label="Elements" onclick="toggleSub(this)">
        <div class="nav-icon"><i class="fas fa-layer-group"></i></div>
        <span class="nav-label">Elements</span>
        <i class="fas fa-chevron-right nav-chevron"></i>
      </div>
      <div class="sub-menu" id="sub-elements">
        <div class="sub-item" onclick="setSubActive(this)">Buttons</div>
        <div class="sub-item" onclick="setSubActive(this)">Badges &amp; Labels</div>
        <div class="sub-item" onclick="setSubActive(this)">Cards</div>
        <div class="sub-item" onclick="setSubActive(this)">Modals</div>
        <div class="sub-item" onclick="setSubActive(this)">Notifications</div>
      </div>

      <!-- Charts with sub-menu -->
      <div class="nav-item" data-label="Charts" onclick="toggleSub(this)">
        <div class="nav-icon"><i class="fas fa-chart-line"></i></div>
        <span class="nav-label">Charts</span>
        <i class="fas fa-chevron-right nav-chevron"></i>
      </div>
      <div class="sub-menu" id="sub-charts">
        <div class="sub-item" onclick="setSubActive(this)">Line &amp; Area</div>
        <div class="sub-item" onclick="setSubActive(this)">Bar &amp; Column</div>
        <div class="sub-item" onclick="setSubActive(this)">Pie &amp; Donut</div>
        <div class="sub-item" onclick="setSubActive(this)">Radar &amp; Polar</div>
      </div>

      <div class="nav-item" data-label="Tables" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-table"></i></div>
        <span class="nav-label">Tables</span>
      </div>

      <div class="nav-item" data-label="Forms" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-wpforms"></i></div>
        <span class="nav-label">Forms</span>
      </div>

      <div class="nav-divider"></div>

      <!-- System -->
      <div class="nav-section">System</div>

      <div class="nav-item" data-label="Notifications" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-bell"></i></div>
        <span class="nav-label">Notifications</span>
        <span class="nav-badge badge-danger">5</span>
      </div>

      <div class="nav-item" data-label="Security" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-shield-halved"></i></div>
        <span class="nav-label">Security</span>
      </div>

      <div class="nav-item" data-label="Integrations" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-puzzle-piece"></i></div>
        <span class="nav-label">Integrations</span>
        <span class="badge-dot" style="background:var(--success)"></span>
      </div>

      <div class="nav-item" data-label="Settings" onclick="setActive(this)">
        <div class="nav-icon"><i class="fas fa-gear"></i></div>
        <span class="nav-label">Settings</span>
      </div>

    </div><!-- /sidebar-scroll -->

    <!-- Footer -->
    <div class="sidebar-footer">
      <div class="sf-avatar">JD</div>
      <div class="sf-info">
        <div class="sf-name">John Doe</div>
        <div class="sf-role">Administrator</div>
      </div>
      <button class="sf-btn" title="Logout"><i class="fas fa-right-from-bracket"></i></button>
    </div>

  </aside><!-- /sidebar -->

  <!-- Mobile overlay -->
  <div class="sidebar-overlay" id="sidebarOverlay" onclick="closeMobileSidebar()"></div>

  <!-- ═══════════════════════════════════════
       MAIN WRAPPER
  ════════════════════════════════════════ -->
  <div class="main-wrapper">

    <!-- HEADER -->
    <header class="header">

      <!-- Toggle -->
      <button class="header-toggle" id="toggleBtn" title="Toggle sidebar">
        <i class="fas fa-bars"></i>
      </button>

      <!-- Breadcrumb -->
      <div class="header-breadcrumb">
        <span>Home</span>
        <i class="fas fa-chevron-right"></i>
        <span>Dashboard</span>
        <i class="fas fa-chevron-right"></i>
        <span class="crumb-active">Analytics</span>
      </div>

      <!-- Search -->
      <div class="header-search">
        <i class="fas fa-magnifying-glass"></i>
        <input type="text" placeholder="Search users, pages, reports…" />
      </div>

      <div class="header-spacer"></div>

      <!-- Actions -->
      <div class="header-actions">

        <button class="hbtn" title="Notifications">
          <i class="fas fa-bell"></i>
          <span class="hbtn-dot red"></span>
        </button>

        <button class="hbtn" title="Messages">
          <i class="fas fa-envelope"></i>
          <span class="hbtn-dot green"></span>
        </button>

        <button class="hbtn" title="Tasks">
          <i class="fas fa-list-check"></i>
          <span class="hbtn-dot orange"></span>
        </button>

        <button class="hbtn" title="Fullscreen" id="fullscreenBtn">
          <i class="fas fa-expand"></i>
        </button>

        <div class="header-sep"></div>

        <!-- Avatar -->
        <div class="header-avatar-wrap">
          <div class="h-avatar">JD</div>
          <div class="h-avatar-info">
            <div class="h-avatar-name">John Doe</div>
            <div class="h-avatar-role">Admin</div>
          </div>
          <i class="fas fa-chevron-down h-avatar-chevron"></i>
        </div>

      </div><!-- /header-actions -->
    </header><!-- /header -->

    <!-- PAGE CONTENT -->
    <main class="page-content">

      <div class="page-topbar">
        <div>
          <div class="page-title-main">Votre page ici</div>
          <div class="page-subtitle">Ajoutez vos composants dans cette zone</div>
        </div>
        <div class="page-topbar-actions">
          <button class="btn btn-outline"><i class="fas fa-filter"></i> Filtrer</button>
          <button class="btn btn-primary"><i class="fas fa-plus"></i> Nouveau</button>
        </div>
      </div>

      <!-- BLANK SLOT -->
      <div class="blank-slot">
        <div class="blank-slot-icon"><i class="fas fa-table-cells-large"></i></div>
        <div class="blank-slot-title">Page vierge</div>
        <div class="blank-slot-text">
          Le layout est prêt. Ajoutez vos widgets, tableaux,<br>
          graphiques ou tout autre composant ici.
        </div>
        <button class="btn btn-primary" style="margin-top:4px">
          <i class="fas fa-plus"></i> Ajouter un composant
        </button>
      </div>

    </main>
  </div><!-- /main-wrapper -->

</div><!-- /app -->

<!-- ═══════════════════════════════════════
     SCRIPTS
════════════════════════════════════════ -->
<script>
  const sidebar  = document.getElementById('sidebar');
  const toggleBtn = document.getElementById('toggleBtn');
  const overlay  = document.getElementById('sidebarOverlay');
  const isMobile = () => window.innerWidth <= 768;

  /* ── Toggle sidebar ──────────────────── */
  toggleBtn.addEventListener('click', () => {
    if (isMobile()) {
      sidebar.classList.toggle('mobile-open');
      overlay.classList.toggle('visible');
    } else {
      sidebar.classList.toggle('collapsed');
    }
  });

  function closeMobileSidebar() {
    sidebar.classList.remove('mobile-open');
    overlay.classList.remove('visible');
  }

  /* ── Nav: set active ──────────────────── */
  function setActive(el) {
    document.querySelectorAll('.nav-item').forEach(i => i.classList.remove('active'));
    el.classList.add('active');
    if (isMobile()) closeMobileSidebar();
  }

  /* ── Sub-menu toggle ──────────────────── */
  function toggleSub(el) {
    const chevron = el.querySelector('.nav-chevron');
    const sub = el.nextElementSibling;
    if (!sub || !sub.classList.contains('sub-menu')) return;

    const isOpen = sub.classList.contains('open');

    // Close all others
    document.querySelectorAll('.sub-menu.open').forEach(s => {
      s.classList.remove('open');
      s.previousElementSibling?.classList.remove('open');
    });

    if (!isOpen) {
      sub.classList.add('open');
      el.classList.add('open');
    }
  }

  /* ── Sub-item active ──────────────────── */
  function setSubActive(el) {
    document.querySelectorAll('.sub-item').forEach(i => i.classList.remove('active'));
    el.classList.add('active');
    if (isMobile()) closeMobileSidebar();
  }

  /* ── Fullscreen ───────────────────────── */
  const fsBtn = document.getElementById('fullscreenBtn');
  fsBtn.addEventListener('click', () => {
    if (!document.fullscreenElement) {
      document.documentElement.requestFullscreen();
      fsBtn.querySelector('i').className = 'fas fa-compress';
    } else {
      document.exitFullscreen();
      fsBtn.querySelector('i').className = 'fas fa-expand';
    }
  });

  /* ── Responsive: reset on resize ─────── */
  window.addEventListener('resize', () => {
    if (!isMobile()) {
      sidebar.classList.remove('mobile-open');
      overlay.classList.remove('visible');
    }
  });
</script>
</body>
</html>