📊 Каркас дашборда

Сайдбар, шапка и прокручиваемый контент

Каркас: сайдбар, шапка, контент

Сетка grid-rows-[auto_1fr] и lg:grid-cols-[13rem_1fr]: сайдбар занимает обе строки.

Заказы

348

Выручка

1,2 млн

Клиенты

86

Возвраты

12

Прокручивается только эта область — сайдбар и шапка остаются на месте.
Блок 2
Блок 3
Блок 4
<div class="grid h-72 grid-rows-[auto_1fr] overflow-hidden rounded-xl border border-slate-200 bg-white
            lg:grid-cols-[13rem_1fr] dark:border-slate-700 dark:bg-slate-900">
  <aside class="hidden border-r border-slate-200 bg-slate-50 p-3 lg:col-start-1 lg:row-span-2 lg:block
                dark:border-slate-700 dark:bg-slate-950">
    <div class="flex items-center gap-2">
      <div class="size-6 rounded bg-slate-900 dark:bg-slate-100"></div>
      <span class="text-sm font-semibold text-slate-900 dark:text-slate-50">Панель</span>
    </div>
    <nav class="mt-3 flex flex-col gap-1 text-sm">
      <a href="#" aria-current="page" class="rounded-md bg-slate-200 px-2 py-1.5 font-medium text-slate-900 dark:bg-slate-800 dark:text-slate-100">Обзор</a>
      <a href="#" class="rounded-md px-2 py-1.5 text-slate-600 hover:bg-slate-200 dark:text-slate-300 dark:hover:bg-slate-800">Заказы</a>
      <a href="#" class="rounded-md px-2 py-1.5 text-slate-600 hover:bg-slate-200 dark:text-slate-300 dark:hover:bg-slate-800">Клиенты</a>
    </nav>
  </aside>
  <header class="flex items-center gap-2 border-b border-slate-200 px-3 py-2 lg:col-start-2 dark:border-slate-700">
    <button class="rounded-md border border-slate-300 p-1.5 text-slate-600 lg:hidden dark:border-slate-600 dark:text-slate-300" aria-label="Меню">☰</button>
    <input class="min-w-0 flex-1 rounded-md border border-slate-300 bg-transparent px-2 py-1 text-sm dark:border-slate-600 dark:text-slate-100" placeholder="Поиск">
    <div class="size-7 shrink-0 rounded-full bg-slate-200 dark:bg-slate-700"></div>
  </header>
  <main class="space-y-3 overflow-y-auto p-3 lg:col-start-2">
    <div class="grid grid-cols-2 gap-3 xl:grid-cols-4">
      <div class="rounded-lg border border-slate-200 p-3 dark:border-slate-700"><p class="text-xs text-slate-500 dark:text-slate-400">Заказы</p><p class="mt-1 text-lg font-semibold tabular-nums text-slate-900 dark:text-slate-50">348</p></div>
      <div class="rounded-lg border border-slate-200 p-3 dark:border-slate-700"><p class="text-xs text-slate-500 dark:text-slate-400">Выручка</p><p class="mt-1 text-lg font-semibold tabular-nums text-slate-900 dark:text-slate-50">1,2 млн</p></div>
      <div class="rounded-lg border border-slate-200 p-3 dark:border-slate-700"><p class="text-xs text-slate-500 dark:text-slate-400">Клиенты</p><p class="mt-1 text-lg font-semibold tabular-nums text-slate-900 dark:text-slate-50">86</p></div>
      <div class="rounded-lg border border-slate-200 p-3 dark:border-slate-700"><p class="text-xs text-slate-500 dark:text-slate-400">Возвраты</p><p class="mt-1 text-lg font-semibold tabular-nums text-slate-900 dark:text-slate-50">12</p></div>
    </div>
    <div class="rounded-lg border border-slate-200 p-3 text-sm text-slate-600 dark:border-slate-700 dark:text-slate-400">
      Прокручивается только эта область — сайдбар и шапка остаются на месте.
    </div>
    <div class="rounded-lg border border-slate-200 p-3 text-sm text-slate-600 dark:border-slate-700 dark:text-slate-400">Блок 2</div>
    <div class="rounded-lg border border-slate-200 p-3 text-sm text-slate-600 dark:border-slate-700 dark:text-slate-400">Блок 3</div>
    <div class="rounded-lg border border-slate-200 p-3 text-sm text-slate-600 dark:border-slate-700 dark:text-slate-400">Блок 4</div>
  </main>
</div>

Сворачиваемый сайдбар

Иконочный режим — хороший компромисс между полной панелью и её отсутствием.

Узкий сайдбар экономит место. Каждой кнопке нужен aria-label.
<div class="flex h-56 overflow-hidden rounded-xl border border-slate-200 dark:border-slate-700">
  <aside class="flex w-14 flex-col items-center gap-2 border-r border-slate-200 bg-slate-50 py-3 dark:border-slate-700 dark:bg-slate-950">
    <div class="size-7 rounded bg-slate-900 dark:bg-slate-100"></div>
    <button class="flex size-8 items-center justify-center rounded-md bg-slate-200 dark:bg-slate-800" aria-label="Обзор">▦</button>
    <button class="flex size-8 items-center justify-center rounded-md text-slate-500 hover:bg-slate-200 dark:hover:bg-slate-800" aria-label="Заказы">▤</button>
    <button class="flex size-8 items-center justify-center rounded-md text-slate-500 hover:bg-slate-200 dark:hover:bg-slate-800" aria-label="Настройки">⚙</button>
  </aside>
  <div class="flex-1 p-4 text-sm text-slate-600 dark:text-slate-400">
    Узкий сайдбар экономит место. Каждой кнопке нужен <code class="rounded bg-slate-100 px-1 dark:bg-slate-800">aria-label</code>.
  </div>
</div>

Разбор

КлассЗачем
grid grid-rows-[auto_1fr]шапка по содержимому, контент занимает остальное
lg:grid-cols-[16rem_1fr]фиксированный сайдбар и гибкий контент
lg:row-span-2сайдбар на всю высоту, включая строку шапки
h-svh + overflow-y-autoпрокручивается только контент
hidden lg:blockсайдбар появляется на широких экранах
aria-current="page"активный пункт навигации
sticky top-0 z-10липкая шапка внутри области контента

Частые ошибки

  • Прокручивается вся страница: сайдбар уезжает вместе с контентом.
  • Две копии навигации — десктопная и мобильная — расходятся со временем.
  • Сайдбар на position: fixed с margin-left у контента: ломается на мобильных.
  • Активный пункт отмечен только цветом.
  • Иконочные кнопки без aria-label.