/* ==========================================================================
   02-layout.css — каркас страницы: сетка, шапка, мобильное меню, подвал.
   Третий: перекрывает базовые умолчания 01, но подчиняется компонентам 03,
   которые лежат ВНУТРИ этого каркаса.

   Внутри (в исходном порядке blog.css):
     • .container / .main-grid / .main-content / .main-sidebar;
     • .header, .header-nav, .header-logo, .header-actions;
     • мобильное меню целиком, включая кластер
       .theme-toggle-btn.mobile-theme-toggle;
     • раскрывающийся мобильный подвал (.footer-collapse*) и оба медиазапроса
       подвала — (max-width: 767px) и (min-width: 768px);
     • базовые .footer-* (сам подвал, ссылки, соцсети, .footer-bottom).

   ДВА МЕСТА, ГДЕ ПОРЯДОК ЗНАЧИМ И СОХРАНЁН:

   1) Базовые правила .footer-* объявлены НИЖЕ медиазапросов подвала — так
      было в blog.css и так осталось здесь (см. коммит c84bbc0). Медиазапрос
      (min-width: 768px) держится на !important именно потому, что базовые
      правила идут после него; переставь блоки местами — и десктопный подвал
      поедет. Оба блока лежат в этом файле и в исходном относительном порядке.

   2) Кластер .theme-toggle-btn.mobile-theme-toggle (мобильная кнопка темы)
      находится ВЫШЕ базового .theme-toggle-btn, который живёт в
      03-components.css. Порядок сохранён: 02 подключается раньше 03.
      Кластер побеждает не порядком, а специфичностью (0-2-0 против 0-1-0) —
      см. подробный комментарий у самого правила. Трогать кластер можно
      только целиком: у всех его правил ровно +1 класс к исходным.
   ========================================================================== */

/* 3. LAYOUT
/* ========================================================================== */

.container {
  max-width: 1280px;
  margin-left: auto;
  margin-right: auto;
  padding-left: 1rem;
  padding-right: 1rem;
}

.main-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 2rem;
  padding-top: 3rem;
  padding-bottom: 3rem;
}

/* ЭЛЕМЕНТЫ ГРИДА ОБЯЗАНЫ УМЕТЬ СЖИМАТЬСЯ.

   У элемента грида (и флекса) `min-width` по умолчанию равен `auto`, а не 0.
   Это значит, что дорожка 1fr не может стать уже, чем min-content её
   содержимого: одна длинная строка кода или неразрывный URL внутри статьи
   раздували .main-content до 824px внутри контейнера в 342px. Полосы
   прокрутки при этом не появлялось — на html/body стоит overflow-x: hidden
   (см. 01-base.css), — и правая половина каждой строки текста просто
   становилась недостижимой: заголовки и абзацы обрывались на середине слова.

   Раньше это маскировало правило Bootstrap `pre{word-break:break-all}`: оно
   рвало строки кода где попало и тем держало min-content маленьким. Bootstrap
   снят на этапе 10.4 — маскировка ушла, механизм обнажился.

   Правило собрано в одном месте намеренно, хотя .post-card-grid объявлен в
   03-components.css: «элемент грида должен уметь сжиматься» — это инвариант
   каркаса, а не оформление карточки, и держать его лучше одной строкой, к
   которой дописывается каждая новая сетка. Селектор `> *`, а не перечисление
   .main-content/.main-sidebar: в дорожку может попасть что угодно, включая
   обёртки из {% block %}. */
.main-grid > *,
.footer-grid > *,
.post-card-grid > * {
  min-width: 0;
}

@media (min-width: 1024px) {
  .main-grid {
    grid-template-columns: repeat(4, 1fr);
  }
  .main-content {
    grid-column: span 3 / span 3;
  }
  .main-sidebar {
    grid-column: span 1 / span 1;
  }
}
/* 4. COMPONENTS
/* ========================================================================== */

/* Header */
.header {
  background-color: oklch(var(--background-raw) / 0.65);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--border);
  position: sticky;
  top: 0;
  z-index: 50;
}
.header .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 4rem;
}
.header-logo {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 1.25rem;
  font-weight: 700;
  color: var(--foreground);
  text-decoration: none;
}
.header-nav {
  display: none; /* Hidden on mobile */
}
@media (min-width: 768px) {
  .header-nav {
    display: flex;
    align-items: center;
    gap: 1.5rem;
  }
  .header-nav a {
    font-size: 0.9375rem;
    font-weight: 500;
    color: var(--muted-foreground);
    text-decoration: none;
    transition: color 0.2s ease;
  }
  .header-nav a:hover {
    color: var(--foreground);
  }
  .header-nav a.active {
    color: var(--primary);
    font-weight: 600;
  }
}

/* Mobile Menu Styles */
.mobile-menu-toggle {
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  width: 30px;
  height: 30px;
  background: transparent;
  border: none;
  cursor: pointer;
  padding: 0;
  z-index: 1001;
}

.hamburger-line {
  width: 100%;
  height: 3px;
  background-color: var(--foreground);
  border-radius: 2px;
  transition: all 0.3s ease;
  transform-origin: center;
}

.mobile-menu-toggle.active .hamburger-line:nth-child(1) {
  transform: rotate(45deg) translate(6px, 6px);
}

.mobile-menu-toggle.active .hamburger-line:nth-child(2) {
  opacity: 0;
}

.mobile-menu-toggle.active .hamburger-line:nth-child(3) {
  transform: rotate(-45deg) translate(6px, -6px);
}

.mobile-nav {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100vh;
  background-color: var(--background);
  z-index: 1000;
  transform: translateX(-100%);
  transition: transform 0.3s ease;
  overflow-y: auto;
}

.mobile-nav.active {
  transform: translateX(0);
}

.mobile-nav-content {
  padding: 80px 20px 20px;
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.mobile-nav a {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1rem;
  font-size: 1.0625rem;
  font-weight: 500;
  color: var(--muted-foreground);
  text-decoration: none;
  border-radius: 0.5rem;
  transition: all 0.2s ease;
}

.mobile-nav a:hover {
  color: var(--foreground);
  background-color: var(--muted);
}

.mobile-nav a.active {
  color: var(--primary);
  background-color: var(--accent);
  font-weight: 600;
}

.mobile-nav a i {
  font-size: 1.125rem;
  width: 24px;
  text-align: center;
}

.mobile-user-actions {
  margin-top: 2rem;
  padding-top: 2rem;
  border-top: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

/* Кнопка темы в мобильной панели.
   Селектор намеренно двойной — `.theme-toggle-btn.mobile-theme-toggle`, хотя
   класс `.mobile-theme-toggle` и так уникален. Причина в каскаде: это ОДИН
   элемент <button class="theme-toggle-btn mobile-theme-toggle"> (см.
   templates/partials/mobile_nav.html), а базовые правила `.theme-toggle-btn`
   объявлены НИЖЕ по файлу. При равной специфичности (0-1-0) побеждал бы тот,
   что ниже, — то есть десктопная кнопка 2.5rem затирала бы мобильную во всю
   ширину. Раньше это лечилось `!important` на каждом свойстве (36 штук);
   уточнение селектора до 0-2-0 даёт тот же результат каскадом.
   ВАЖНО: все правила кластера `.mobile-theme-toggle` получили ровно +1 к числу
   классов, поэтому их взаимный порядок не изменился — трогать по одному нельзя,
   только весь кластер целиком. */
.theme-toggle-btn.mobile-theme-toggle {
  width: 100%;
  height: auto;
  padding: 1rem;
  border-radius: 0.75rem;
  background: linear-gradient(135deg, var(--card) 0%, var(--muted) 100%);
  border: 2px solid var(--border);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  position: relative;
  overflow: hidden;
  margin-bottom: 1rem;
}

.theme-toggle-btn.mobile-theme-toggle:hover {
  /* Заливка, а не акцентная линия: поверх лежит белая иконка (см. правило
     `:hover #mobile-theme-icon`), поэтому здесь --primary-surface. */
  background: linear-gradient(135deg, var(--accent) 0%, var(--primary-surface) 100%);
  border-color: var(--primary);
  box-shadow: 0 4px 16px rgba(52, 152, 219, 0.3);
  transform: translateY(-2px);
}

.theme-toggle-btn.mobile-theme-toggle:active {
  transform: translateY(0);
  box-shadow: 0 2px 8px rgba(52, 152, 219, 0.4);
}

.theme-toggle-btn.mobile-theme-toggle #mobile-theme-icon {
  font-size: 1.25rem;
  font-weight: 600;
  transition: all 0.3s ease;
}

.theme-toggle-btn.mobile-theme-toggle:hover #mobile-theme-icon {
  transform: scale(1.2) rotate(15deg);
  color: white;
}

/* Кнопка темы в закрытой панели — обычное состояние.
   Тёмных дублей с хардкодами (#2d3748/#4a5568 в покое и зелёные rgba
   в ховере) здесь больше нет: --muted, --secondary и --border-interactive
   темозависимы и дают то же различие поверхностей сами. Зелёный ховер к тому же
   не имел отношения к смыслу кнопки — он остался от прежней палитры. */
body[data-theme="dark"] .theme-toggle-btn.mobile-theme-toggle {
  background: linear-gradient(135deg, var(--muted) 0%, var(--secondary) 100%);
  border-color: var(--border-interactive);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}

body[data-theme="dark"] .theme-toggle-btn.mobile-theme-toggle:hover {
  background: linear-gradient(135deg, var(--secondary) 0%, var(--accent) 100%);
  border-color: var(--primary);
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
}

/* Ripple effect for mobile button */
.theme-toggle-btn.mobile-theme-toggle::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 0;
  height: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.3);
  transform: translate(-50%, -50%);
  transition: width 0.6s ease, height 0.6s ease;
}

.theme-toggle-btn.mobile-theme-toggle:active::before {
  width: 300px;
  height: 300px;
}

/* Enhanced mobile theme toggle for better visibility in active nav */
.mobile-nav.active .theme-toggle-btn.mobile-theme-toggle {
  /* Оба стопа градиента — заливочные токены. Раньше дальним стопом стоял
     --accent (почти белый в светлой теме): белая иконка на нём давала 1.09:1,
     а в середине кнопки, где иконка и находится, — 2.24:1 при норме 3:1 для
     нетекстовой графики. Проверять надо именно оба края и середину: с одним
     заливочным стопом градиент незаметно уводит контраст в ноль.
     Рамка остаётся на --primary: это линия, текста поверх неё нет, и в тёмной
     теме более светлый --primary лучше очерчивает кнопку. */
  background: linear-gradient(135deg, var(--primary-surface) 0%, var(--primary-surface-hover) 100%);
  border: 2px solid var(--primary);
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);
  transform: scale(1.02);
}

.mobile-nav.active .theme-toggle-btn.mobile-theme-toggle #mobile-theme-icon {
  color: white;
  transform: scale(1.1);
  text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}

.mobile-nav.active .theme-toggle-btn.mobile-theme-toggle:hover {
  /* hsl(220,70%,60%) вторым стопом давал ту же ловушку, что и --accent:
     светлая плашка под белой иконкой. Ховер уходит на затемнение, как у всех
     остальных залитых кнопок проекта. */
  background: linear-gradient(135deg, var(--primary-surface-hover) 0%, var(--primary-surface) 100%);
  box-shadow: 0 6px 24px rgba(0, 0, 0, 0.3);
  transform: translateY(-3px) scale(1.05);
}

.mobile-nav.active .theme-toggle-btn.mobile-theme-toggle:hover #mobile-theme-icon {
  transform: scale(1.3) rotate(20deg);
  color: #fff;
}

/* Pulse animation removed as requested */

/* Ручных тёмных дублей здесь больше нет: оба состояния кнопки выражены
   через --primary-surface/--primary-surface-hover, а они темозависимы.
   Раньше тут лежали linear-gradient(#2ecc71, #27ae60) и (#2ecc71, #16a085)
   с белой иконкой поверх — 2.10:1 и 2.87:1 при норме 3:1. */

/* Dark theme animation reference removed */

.mobile-user-info {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1rem;
  background-color: var(--muted);
  border-radius: 0.5rem;
  margin-bottom: 1rem;
}

.mobile-user-avatar {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  /* Кружок с инициалом поверх — это поверхность, а не акцентный цвет текста. */
  background-color: var(--primary-surface);
  color: var(--primary-foreground);
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 600;
  font-size: 1.2rem;
}

.mobile-user-name {
  font-size: 1rem;
  font-weight: 500;
  color: var(--foreground);
}

.mobile-user-menu {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.mobile-dropdown-item {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1rem;
  font-size: 1rem;
  color: var(--muted-foreground);
  text-decoration: none;
  border-radius: 0.5rem;
  transition: all 0.2s ease;
}

.mobile-dropdown-item:hover {
  color: var(--foreground);
  background-color: var(--muted);
}

.mobile-dropdown-item i {
  font-size: 1.2rem;
  width: 20px;
  text-align: center;
}

.mobile-auth-buttons {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.mobile-button {
  width: 100%;
  justify-content: center;
  padding: 1rem;
  font-size: 1rem;
}

/* Hide mobile menu on desktop */
@media (min-width: 768px) {
  .mobile-menu-toggle {
    display: none;
  }
  
  .mobile-nav {
    display: none;
  }
}

/* Footer Collapse Styles for Mobile

   С этапа 10.6 триггер — <button> внутри <h3.footer-title>, а не сам
   заголовок: <h3> не фокусируется, и раскрыть секцию с клавиатуры было
   нельзя. Отсюда две группы свойств ниже: раскладка, переехавшая с
   заголовка (flex/space-between/gap), и сброс UA-оформления кнопки, чтобы
   внешне ничего не изменилось. */
.footer-collapse-trigger {
  cursor: pointer;
  user-select: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  /* Тот же зазор между значком и текстом, что задавал .footer-title. */
  gap: 0.75rem;
  /* Кнопка — единственный ребёнок flex-заголовка; без ширины она сжалась бы
     по содержимому и space-between не отодвинул бы стрелку к правому краю. */
  width: 100%;
  text-align: left;
  /* Сброс UA-оформления кнопки: шрифт и цвет наследуем от .footer-title. */
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  color: inherit;
  transition: color 0.2s ease;
}

.footer-collapse-trigger:hover {
  color: var(--primary);
}

/* На десктопе секции раскрыты всегда, и JS выключает кнопку (см.
   static/js/footer-collapse.js) — иначе в порядке табуляции висели бы три
   элемента, которые ничего не делают. Оформление при этом не меняется:
   font/color наследуются, и браузерное «серое» для disabled не применяется. */
.footer-collapse-trigger:disabled {
  cursor: default;
}

.footer-collapse-icon {
  margin-left: 0.5rem;
  transition: transform 0.3s ease;
  display: flex;
  align-items: center;
}

.footer-collapse-trigger.collapsed .footer-collapse-icon {
  transform: rotate(-90deg);
}

/* visibility, а не только max-height/opacity: свёрнутая на нулевую высоту и
   прозрачная секция остаётся в порядке табуляции, и на телефоне Tab проходил
   12 невидимых ссылок подряд, причём раскрыть секцию было нечем. visibility:
   hidden убирает содержимое и из табуляции, и из дерева доступности, но, в
   отличие от display:none, участвует в переходах — анимация раскрытия на
   max-height сохраняется как была.

   Задержка `visibility 0s linear 0.3s` в базовом правиле: при сворачивании
   содержимое обязано оставаться видимым, пока идёт анимация (иначе оно
   исчезло бы мгновенно, до схлопывания высоты). При раскрытии задержка не
   нужна — её снимает transition-delay в .show. */
.footer-collapse {
  overflow: hidden;
  transition: max-height 0.3s ease, opacity 0.3s ease, visibility 0s linear 0.3s;
}

.footer-collapse.show {
  max-height: 500px;
  opacity: 1;
  visibility: visible;
  transition-delay: 0s;
}

.footer-collapse.hide {
  max-height: 0;
  opacity: 0;
  visibility: hidden;
}

/* Mobile Footer Styles */
@media (max-width: 767px) {
  .footer {
    padding: 1rem 0;
    margin-top: 2rem;
  }
  
  .footer-grid {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
  }
  
  .footer-section {
    border-bottom: 1px solid var(--border);
    padding-bottom: 0.5rem;
  }
  
  .footer-section:last-child {
    border-bottom: none;
    padding-bottom: 0;
  }
  
  .footer-title {
    font-size: 1rem;
    margin-bottom: 0.25rem;
    padding: 0.5rem 0;
  }
  
  .footer-collapse-icon {
    display: flex !important;
  }

  /* Раньше кликом по секции управлял сам заголовок, и его вертикальный
     padding (см. .footer-title выше) входил в область нажатия. Теперь
     управляет вложенная кнопка, а padding остался на заголовке — без этой
     пары «padding + такой же отрицательный margin» область нажатия
     съёжилась бы до высоты строки (25px). Отрицательный margin гасит
     собственный отступ кнопки, поэтому высота заголовка не меняется, а
     нажимается вся его строка целиком (41px — это и WCAG 2.5.8, 24px). */
  .footer-collapse-trigger {
    padding: 0.5rem 0;
    margin: -0.5rem 0;
  }


  /* Состояние до того, как отработал JS: на мобильной ширине секция свёрнута,
     значит её ссылки не должны быть ни видимы, ни доступны с клавиатуры.
     Класс .show возвращает visibility из базового правила выше. */
  .footer-collapse {
    max-height: 0;
    opacity: 0;
    visibility: hidden;
    margin-top: 0.25rem;
  }

  .footer-collapse.show {
    max-height: 250px;
    opacity: 1;
  }
  
  .footer-links {
    margin: 0;
    padding-left: 0.75rem;
  }
  
  .footer-links li {
    margin-bottom: 0.25rem;
  }
  
  .footer-links a {
    font-size: 0.85rem;
    padding: 0.15rem 0;
  }
  
  .footer-bottom {
    margin-top: 1rem;
    padding-top: 1.5rem;
    border-top: 1px solid var(--border);
    text-align: center;
  }
  
  .footer-bottom p {
    font-size: 0.75rem;
    margin: 0;
    color: var(--muted-foreground);
  }
}

/* Desktop Footer - Hide collapse icons and ensure proper display */
@media (min-width: 768px) {
  .footer {
    padding: 0 0 2rem !important;
  }
  
  .footer-collapse-icon {
    display: none !important;
  }
  
  .footer-collapse-trigger {
    cursor: default;
    justify-content: flex-start;
  }
  
  /* На десктопе секции раскрыты всегда — visibility страхует случай, когда
     класс .hide остался с мобильной ширины и JS ещё не пересчитал состояние
     (пересчёт после resize идёт с debounce). */
  .footer-collapse {
    max-height: none !important;
    opacity: 1 !important;
    visibility: visible !important;
    overflow: visible;
    margin-top: 0 !important;
  }
  
  .footer-section {
    border-bottom: none !important;
    padding-bottom: 0;
  }
  
  .footer-grid {
    display: grid !important;
    grid-template-columns: repeat(3, 1fr) !important;
    gap: 2rem !important;
  }
  
  .footer {
    padding: 0 0 2rem !important;
  }
  
  .footer-title {
    font-size: 1.25rem !important;
    margin-bottom: 1rem !important;
    padding: 0 !important;
  }
  
  .footer-links {
    margin: 0 !important;
    padding-left: 0 !important;
    list-style: none !important;
  }
  
  .footer-links li {
    margin-bottom: 0.75rem !important;
  }
  
  .footer-links a {
    font-size: 0.9375rem !important;
    padding: 0 !important;
  }
  
  .footer-bottom {
    margin-top: 1rem !important;
    padding-top: 1.5rem !important;
    border-top: 1px solid var(--border) !important;
    text-align: center !important;
  }
  
  .footer-bottom p {
    font-size: 0.875rem !important;
    margin: 0 !important;
    color: var(--muted-foreground) !important;
  }
}
/* Desktop-only actions (ВК/Войти/Регистрация, user dropdown, theme toggle).
   On mobile these live inside the mobile-nav drawer instead. Showing them
   inline here forced .header to overflow on phones (the buttons pushed the
   page ~170px wider than the viewport). */
.header-actions {
    display: none;
    align-items: center;
    gap: 1rem;
}

@media (min-width: 768px) {
    .header-actions {
        display: flex;
    }
}

/* Footer */
.footer {
  /* Оба стопа — токены. Раньше вторым стоял хардкод #4a5568, который не
     менялся вместе с темой: в светлой теме подвал уезжал в тёмный сине-серый. */
  background: linear-gradient(135deg, var(--card) 0%, var(--muted) 100%);
  border-top: 1px solid var(--border);
  margin-top: 5rem;
  position: relative;
  overflow: hidden;
}

.footer::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--primary), transparent);
}

.footer .container {
  padding-top: 2rem;
  padding-bottom: 0;
}

.footer-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 3rem;
}

@media (min-width: 768px) {
  .footer-grid {
    grid-template-columns: repeat(3, 1fr);
    gap: 3rem;
  }
}

.footer-section {
  position: relative;
}

.footer-title {
  font-size: 0.9375rem;
  font-weight: 700;
  color: var(--foreground);
  margin-bottom: 1.5rem;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  position: relative;
}

.footer-title svg {
  color: var(--primary);
  transition: transform 0.3s ease;
}

.footer-title:hover svg {
  transform: scale(1.1);
}

.footer-links {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

.footer-links a {
  font-size: 1rem;
  color: var(--muted-foreground);
  text-decoration: none;
  transition: all 0.3s ease;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.5rem 0;
  border-radius: 0.375rem;
  position: relative;
  overflow: hidden;
}

.footer-links a::before {
  content: '';
  position: absolute;
  left: -100%;
  top: 0;
  width: 100%;
  height: 100%;
  background: linear-gradient(90deg, transparent, rgba(52, 152, 219, 0.1), transparent);
  transition: left 0.5s ease;
}

.footer-links a:hover {
  color: var(--primary);
  transform: translateX(5px);
  background: rgba(52, 152, 219, 0.05);
}

.footer-links a:hover::before {
  left: 100%;
}

.footer-links a svg {
  color: var(--muted-foreground);
  transition: all 0.3s ease;
  flex-shrink: 0;
}

.footer-links a:hover svg {
  color: var(--primary);
  transform: scale(1.1);
}

/* Social links specific styles */
.social-link {
  position: relative;
  overflow: hidden;
}

.social-link.github:hover {
  color: #333 !important;
}

.social-link.github:hover svg {
  color: #333 !important;
}

.social-link.twitter:hover {
  color: #1da1f2;
}

.social-link.twitter:hover svg {
  color: #1da1f2 !important;
}

.social-link.telegram:hover {
  color: #0088cc !important;
}

.social-link.telegram:hover svg {
  color: #0088cc !important;
}

.social-link.rss:hover {
  color: #ff6600 !important;
}

.social-link.rss:hover svg {
  color: #ff6600 !important;
}

.footer-bottom {
  border-top: 1px solid rgba(255, 255, 255, 0.1);
  margin-top: 1rem;
  padding-top: 2rem;
  text-align: center;
  font-size: 0.9375rem;
  color: var(--muted-foreground);
  position: relative;
}

.footer-bottom::before {
  content: '';
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 100px;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--primary), transparent);
}

/* Dark theme adjustments */
body[data-theme="dark"] .footer {
  /* Те же токены, что и в базовом правиле: --card/--muted уже темозависимы,
     поэтому хардкоды #2d3748/#4a5568 больше не нужны. */
  background: linear-gradient(135deg, var(--card) 0%, var(--muted) 100%);
}

body[data-theme="dark"] .footer-links a:hover {
  background: rgba(46, 204, 113, 0.05);
}

body[data-theme="dark"] .footer-links a::before {
  background: linear-gradient(90deg, transparent, rgba(46, 204, 113, 0.1), transparent);
}

body[data-theme="dark"] .social-link.github:hover {
  color: #f0f6fc !important;
}

body[data-theme="dark"] .social-link.github:hover svg {
  color: #f0f6fc !important;
}

/* Mobile responsiveness */
@media (max-width: 768px) {
  .footer .container {
    padding-top: 0.5rem;
    padding-bottom: 1rem;
  }
  
  .footer-grid {
    gap: 2rem;
  }
  
  .footer-title {
    font-size: 1.2rem;
    margin-bottom: 1rem;
  }
  
  .footer-links a {
    padding: 0.375rem 0;
    font-size: 0.95rem;
  }
}

/* ==========================================================================
   ДВИЖЕНИЕ И КОНТРАСТ: точечные исключения к глобальным правилам (этап 10.6)

   Глобальный блок в 01-base.css сводит длительность анимаций и переходов к
   0.01ms. Для 95% эффектов этого достаточно: «плавно» превращается в
   «мгновенно», конечное состояние остаётся прежним. Ниже — те случаи, где
   мгновенное конечное состояние САМО является проблемой, и эффект надо
   убирать целиком, а не ускорять.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  /* Ripple мобильной кнопки темы: ::before растёт 0 → 300px за 0.6s.
     Ускорить нельзя — при мгновенном переходе полупрозрачный белый круг
     втрое больше кнопки ВОЗНИКАЕТ разом. Это уже не движение, а вспышка,
     то есть замена одного триггера (укачивание) на другой, худший
     (WCAG 2.3.1 Three Flashes or Below Threshold — по смыслу, порог по
     площади формально не достигается). Убираем эффект целиком: обратная
     связь на нажатие остаётся — у кнопки меняются фон, рамка и тень. */
  .theme-toggle-btn.mobile-theme-toggle::before {
    display: none;
  }

  /* Декоративные transform по наведению. Мгновенный скачок иконки на 130%
     с поворотом на 20° — по-прежнему движение, просто быстрое; вращение
     как раз и есть то, что провоцирует вестибулярную реакцию. Обратная
     связь на ховер не теряется: у всех перечисленных элементов вместе с
     transform меняется цвет или фон.

     Перечислены ТОЛЬКО эффекты, вызванные ховером. Статические состояния
     (`.mobile-nav.active … { transform: scale(1.02) }` и scale(1.1) у иконки
     внутри раскрытого меню) оставлены: это не движение, а размер элемента
     в данном состоянии, и снимать его — уже правка дизайна.

     Гамбургер (`.mobile-menu-toggle.active .hamburger-line` — rotate(±45deg))
     тоже оставлен намеренно: поворот линий В КРЕСТ несёт смысл «меню
     открыто, нажатие закроет». Это не декорация, а иконка состояния;
     под reduce она просто перестраивается мгновенно.

     Специфичность каждого селектора совпадает с исходным правилом, а блок
     стоит в конце файла — при равенстве побеждает более позднее. */
  .theme-toggle-btn.mobile-theme-toggle:hover,
  .theme-toggle-btn.mobile-theme-toggle:hover #mobile-theme-icon,
  .mobile-nav.active .theme-toggle-btn.mobile-theme-toggle:hover,
  .mobile-nav.active .theme-toggle-btn.mobile-theme-toggle:hover #mobile-theme-icon,
  .footer-title:hover svg,
  .footer-links a:hover,
  .footer-links a:hover svg {
    transform: none;
  }
}

@media (prefers-contrast: more) {
  /* Полупрозрачная белая подложка (rgba(255,255,255,0.3)) поверх залитой
     кнопки темы гасит контраст белой иконки на ней ровно в момент нажатия —
     когда пользователь на кнопку и смотрит. При запросе «больше контраста»
     это прямо противоположно требуемому, поэтому подложки просто нет. */
  .theme-toggle-btn.mobile-theme-toggle::before {
    display: none;
  }

  /* Ховер-подсветка ссылок подвала — заливка с альфой 0.05 поверх фона
     подвала. На 5% она не различима вообще (разница светлоты < 1%), то есть
     как индикатор ховера не работает. Заменяем на непрозрачный --muted:
     он темозависим, даёт видимую плашку и не размывает цвет текста поверх.
     Тёмная ветка перечислена отдельно — там своё правило с зелёной альфой
     (специфичность 0,3,1), голым `.footer-links a:hover` его не перебить. */
  .footer-links a:hover,
  body[data-theme="dark"] .footer-links a:hover {
    background: var(--muted);
  }

  /* Бегущий блик по ссылке подвала (::before, градиент с альфой 0.1) —
     чистая декорация, при повышенном контрасте только зашумляет плашку. */
  .footer-links a::before {
    display: none;
  }
}
