/* ============================================================
   ГофроТайм — слой освежения.
   Подключается ПОСЛЕ style.css и ничего не переписывает в шаблоне:
   те же цвета, тот же шрифт, та же сетка. Меняются только детали,
   по которым видно возраст вёрстки: тени, радиусы, ритм, состояния.
   ============================================================ */

:root {
  /* фирменный красный оставлен как есть, добавлены рабочие оттенки */
  --gt-red: #b82323;
  --gt-red-600: #9d1c1c;
  --gt-red-50: rgba(184, 35, 35, 0.08);

  --gt-radius: 14px;
  --gt-radius-sm: 10px;

  /* слоистые тени вместо равномерного размытия по кругу */
  --gt-shadow-1: 0 1px 2px rgba(16, 18, 22, 0.04),
    0 2px 8px rgba(16, 18, 22, 0.05);
  --gt-shadow-2: 0 2px 4px rgba(16, 18, 22, 0.05),
    0 12px 28px rgba(16, 18, 22, 0.09);
  --gt-shadow-3: 0 4px 10px rgba(16, 18, 22, 0.07),
    0 24px 48px rgba(16, 18, 22, 0.13);

  --gt-ease: cubic-bezier(0.22, 1, 0.36, 1);
  --gt-fast: 0.2s;
  --gt-mid: 0.32s;
}

/* ============================================================
   Шрифт. Open Sans — стандартная поставка любого шаблона, от него
   веет двухтысячными. Onest: современный гротеск с честной кириллицей,
   выше строчные, плотнее заголовки. Переменный, два файла на 46 КБ.
   ============================================================ */
@font-face {
  font-family: "Manrope";
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url("../lib/google-webfonts/manrope-cyrillic.woff2") format("woff2");
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

@font-face {
  font-family: "Manrope";
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url("../lib/google-webfonts/manrope-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
    U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Onest";
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url("../lib/google-webfonts/onest-cyrillic.woff2") format("woff2");
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

@font-face {
  font-family: "Onest";
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url("../lib/google-webfonts/onest-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
    U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

:root,
[data-bs-theme="light"],
[data-bs-theme="dark"] {
  --bs-body-font-family: "Manrope", "Onest", "Open Sans", system-ui, sans-serif;
}

/* ---------- типографика ---------- */
body {
  font-family: "Manrope", "Onest", "Open Sans", system-ui, sans-serif;
  line-height: 1.6;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

h1,
h2,
h3,
h4,
h5,
h6,
.btn,
.navbar,
input,
select,
textarea,
button {
  font-family: "Manrope", "Onest", "Open Sans", system-ui, sans-serif;
}

/* Заголовки секций были одного роста с обычным текстом — страница
   читалась сплошной лентой. Крупнее и плотнее: сразу видно структуру. */
.container-xxl h1,
.container-fluid h1,
.about-text h1,
.feature-text h1,
.quote-text h1 {
  font-size: clamp(2rem, 3.4vw, 3.25rem);
  font-weight: 700;
  letter-spacing: -0.03em;
  line-height: 1.1;
}

/* надзаголовок с номером раздела: страница читается как оглавление */
body {
  counter-reset: gt-section;
}

h6.text-primary {
  display: inline-flex;
  align-items: baseline;
  gap: 0.75rem;
  font-size: 0.9rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  margin-bottom: 0.9rem;
}

h6.text-primary::before {
  counter-increment: gt-section;
  content: counter(gt-section, decimal-leading-zero);
  font-size: 0.78rem;
  font-weight: 800;
  letter-spacing: 0.04em;
  padding: 0.28rem 0.5rem;
  border: 1.5px solid currentColor;
  border-radius: 4px;
  opacity: 0.75;
}

h1,
h2,
h3,
h4,
h5,
.display-1,
.display-2,
.display-3,
.display-4,
.display-5,
.display-6 {
  letter-spacing: -0.02em;
  line-height: 1.18;
}

.display-4,
.display-5 {
  letter-spacing: -0.03em;
}

/* выключка по формату — главный признак старой вёрстки, читается рвано */
.about-text p,
.feature-text p,
.quote-text p,
.item-page p,
p[style*="justify"] {
  text-align: left !important;
  hyphens: none;
}

/* подзаголовок-надпись над h1 в секциях */
.section-title,
h6.text-primary,
.text-primary.text-uppercase {
  letter-spacing: 0.08em;
}

/* ---------- анимации: было .5s на всё ---------- */
.btn,
.service-item,
.service-icon,
.navbar .navbar-nav .nav-link,
.testimonial-item,
.owl-dot,
a {
  transition-duration: var(--gt-fast) !important;
  transition-timing-function: var(--gt-ease) !important;
}

/* ---------- кнопки ---------- */
.btn {
  border-radius: var(--gt-radius-sm);
  font-weight: 600;
  letter-spacing: 0.01em;
}

/* основные кнопки были мелкими для промышленного сайта */
.btn.btn-primary.py-3,
.btn.btn-primary.py-md-3,
.btn-lg.btn-primary {
  padding: 0.95rem 2.1rem;
  font-size: 1.02rem;
}

/* секция каталога уходит на светлый фон, чтобы кадры не сливались
   с белым листом и страница читалась по слоям */
.service-wrap {
  background: var(--bs-secondary-bg);
}

[data-bs-theme="dark"] .service-wrap {
  background: rgba(var(--bs-secondary-bg-rgb), 0.4);
}

.btn-lg,
.btn.py-3 {
  border-radius: var(--gt-radius-sm);
}

.btn.btn-primary {
  box-shadow: 0 1px 2px rgba(184, 35, 35, 0.2);
}

.btn.btn-primary:hover {
  background-color: var(--gt-red-600);
  border-color: var(--gt-red-600);
  box-shadow: 0 6px 18px rgba(184, 35, 35, 0.28);
  transform: translateY(-1px);
}

.btn.btn-primary:active {
  transform: translateY(0);
  box-shadow: 0 1px 2px rgba(184, 35, 35, 0.24);
}

.btn:focus-visible,
a:focus-visible,
.form-control:focus-visible,
button:focus-visible {
  outline: 3px solid rgba(184, 35, 35, 0.35);
  outline-offset: 2px;
  box-shadow: none;
}

.btn-square,
.btn-sm-square,
.btn-lg-square {
  border-radius: var(--gt-radius-sm);
}

.back-to-top {
  border-radius: 999px !important;
  box-shadow: var(--gt-shadow-2);
}

/* ---------- шапка ---------- */
.navbar.sticky-top {
  box-shadow: 0 1px 0 rgba(16, 18, 22, 0.08) !important;
}

.navbar .navbar-nav .nav-link {
  position: relative;
}

/* активный пункт подчёркивается, а не только красится */
.navbar .navbar-nav > .nav-item > .nav-link::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 18px;
  height: 2px;
  background: var(--gt-red);
  border-radius: 2px;
  opacity: 0;
  transform: scaleX(0.4);
  transition:
    opacity var(--gt-fast) var(--gt-ease),
    transform var(--gt-fast) var(--gt-ease);
}

.navbar .navbar-nav > .nav-item > .nav-link.active::after,
.navbar .navbar-nav > .nav-item > .nav-link:hover::after {
  opacity: 1;
  transform: scaleX(1);
}

@media (max-width: 1199.98px) {
  .navbar .navbar-nav > .nav-item > .nav-link::after {
    display: none;
  }

  /* в мобильном меню пункты стояли впритык и без границ —
     труднее попасть пальцем и не видно, где кончается строка */
  .navbar .navbar-nav .nav-link {
    padding: 0.85rem 0 !important;
    border-bottom: 1px solid var(--bs-border-color);
  }

  .navbar .navbar-nav .nav-item:last-child .nav-link {
    border-bottom: 0;
  }

  .navbar .navbar-nav .dropdown-menu {
    box-shadow: none;
    background: transparent;
    padding-left: 0.5rem;
  }
}

.navbar .dropdown-menu {
  border-radius: var(--gt-radius);
  box-shadow: var(--gt-shadow-2);
  padding: 0.5rem;
  overflow: hidden;
}

.navbar .dropdown-item {
  border-radius: var(--gt-radius-sm);
  padding: 0.55rem 0.85rem;
}

.navbar .dropdown-item:hover,
.navbar .dropdown-item:focus {
  background: var(--gt-red-50);
  color: var(--gt-red);
}

/* верхняя строка с адресом и телефонами */
.topbar,
.container-fluid.bg-body-tertiary.px-5.d-none.d-lg-block {
  font-size: 0.925rem;
}

/* ---------- карусель героя ---------- */
/* было: ровная плёнка 45% по всей площади. Стало: градиент снизу,
   фотография остаётся читаемой, текст не тонет */
.owl-carousel-inner {
  background:
    linear-gradient(
      to top,
      rgba(10, 12, 16, 0.88) 0%,
      rgba(10, 12, 16, 0.72) 30%,
      rgba(10, 12, 16, 0.4) 58%,
      rgba(10, 12, 16, 0.12) 100%
    ),
    linear-gradient(
      to right,
      rgba(10, 12, 16, 0.45) 0%,
      rgba(10, 12, 16, 0.1) 55%,
      rgba(10, 12, 16, 0) 100%
    ) !important;
}

.header-carousel .owl-carousel-item {
  min-height: min(88vh, 860px);
}

/* Заголовки соседних слайдов лежали друг на друге: подпись вынесена
   из потока, поэтому её видно у всех кадров сразу, а не только у
   текущего. Показываем только активный. Ошибка есть и на живом сайте. */
.owl-item .owl-carousel-inner {
  opacity: 0;
  transition: opacity 0.45s var(--gt-ease);
  pointer-events: none;
}

.owl-item.active .owl-carousel-inner {
  opacity: 1;
  pointer-events: auto;
}

/* подпись под заголовком: куда листать дальше */
.gt-home .carousel-wrap::after {
  content: "листайте вниз";
  position: absolute;
  left: 50%;
  bottom: 26px;
  transform: translateX(-50%);
  z-index: 3;
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.75);
  pointer-events: none;
  animation: gt-hint 2.6s var(--gt-ease) infinite;
}

.carousel-wrap {
  position: relative;
}

@keyframes gt-hint {
  0%,
  100% {
    transform: translate(-50%, 0);
    opacity: 0.75;
  }
  50% {
    transform: translate(-50%, 6px);
    opacity: 0.35;
  }
}

@media (max-width: 767.98px) {
  .gt-home .carousel-wrap::after {
    display: none;
  }
}

/* заголовок на первом экране был вровень с остальным текстом —
   теперь это заглавие, как на обложке */
.owl-carousel-inner h1,
.owl-carousel-inner .display-1,
.owl-carousel-inner .display-2,
.owl-carousel-inner .display-3 {
  font-size: clamp(2.1rem, 4.6vw, 4.25rem) !important;
  font-weight: 700;
  line-height: 1.06;
  letter-spacing: -0.035em;
  max-width: 20ch;
}

/* наезд кадра увеличивает картинку — держим её в границах слайда */
.header-carousel .owl-carousel-item {
  overflow: hidden;
}

/* Наезд кадра убран: из-за него первый экран выглядел приближённым, а
   снимок и без того растянут на всю ширину — лишний масштаб только
   съедал резкость. Кадр стоит ровно так же, как на действующем сайте. */
.header-carousel .owl-item .owl-carousel-item > img {
  transform: none !important;
}

.owl-carousel-inner h1,
.owl-carousel-inner .h1,
.owl-carousel-inner .display-1,
.owl-carousel-inner .display-2,
.owl-carousel-inner .display-3 {
  text-shadow: 0 2px 24px rgba(0, 0, 0, 0.35);
}

.header-carousel .owl-dots .owl-dot {
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.35);
  border: 2px solid transparent;
}

.header-carousel .owl-dots .owl-dot.active {
  border-color: var(--gt-red);
}

@media (max-width: 991.98px) {
  .header-carousel .owl-carousel-item {
    min-height: 560px;
  }
  .header-carousel .owl-dots {
    display: none;
  }
}

/* ---------- карточки ---------- */
.service-item,
.testimonial-item,
.blog-featured .card,
.card {
  border-radius: var(--gt-radius) !important;
  box-shadow: var(--gt-shadow-1) !important;
  border: 1px solid rgba(16, 18, 22, 0.06);
  transition:
    transform var(--gt-mid) var(--gt-ease),
    box-shadow var(--gt-mid) var(--gt-ease);
}

.service-item:hover,
.blog-featured .card:hover {
  transform: translateY(-4px);
  box-shadow: var(--gt-shadow-3) !important;
}

/* картинка в карточке слегка приближается на наведении */
.service-item .overflow-hidden img,
.service-item > img,
.service-item a > img {
  transition: transform 0.5s var(--gt-ease);
}

.service-item:hover img {
  transform: scale(1.04);
}

.service-icon {
  box-shadow: var(--gt-shadow-1);
  border-radius: var(--gt-radius);
}

/* карточка-строка на внутренних страницах: текст висел у верхнего края,
   под ним оставалась дыра во всю высоту фотографии */
@media (min-width: 768px) {
  .service-item.row > .about-text,
  .service-item.row > [class*="col-"]:last-child {
    display: flex;
    flex-direction: column;
    justify-content: center;
  }
  /* колонка с фотографией центрировать себя не должна */
  .service-item.row > [class*="col-"]:first-child {
    display: block;
  }
}

/* ============================================================
   Каталог на главной. Было: фотография, под ней подпись на белом —
   двенадцать одинаковых блоков подряд, глазу не за что зацепиться.
   Стало: подпись лежит на снимке, карточки одной высоты, при наведении
   кадр приближается и появляется стрелка.
   ============================================================ */
@media (min-width: 576px) {
  .service-wrap .service-item {
    overflow: hidden;
  }

  .service-wrap .service-item > .position-relative {
    position: absolute !important;
    inset: auto 0 0 0;
    z-index: 2;
    padding: 1.5rem 1.35rem 1.25rem !important;
    background: linear-gradient(
      to top,
      rgba(12, 14, 18, 0.92) 0%,
      rgba(12, 14, 18, 0.75) 45%,
      rgba(12, 14, 18, 0) 100%
    );
  }

  .service-wrap .service-item .service-title a {
    color: #fff !important;
    font-weight: 700;
  }

  .service-wrap .service-item .service-title {
    margin: 0;
    padding-right: 2.2rem;
    text-shadow: 0 1px 12px rgba(0, 0, 0, 0.4);
  }

  /* подпись лежит поверх снимка и перехватывала нажатия: мимо текста
     клик проваливался в пустоту вместо ссылки на кадре */
  .service-wrap .service-item > .position-relative {
    pointer-events: none;
  }

  .service-wrap .service-item > .position-relative a {
    pointer-events: auto;
  }

  /* ссылка подписи растягивается на всю плашку с текстом, поэтому
     нажатие рядом со строкой тоже ведёт в раздел */
  .service-wrap .service-item .service-title a::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
  }

  /* стрелка в углу — знак, что карточка ведёт дальше */
  .service-wrap .service-item > .position-relative::after {
    content: "";
    position: absolute;
    right: 1.35rem;
    bottom: 1.5rem;
    width: 22px;
    height: 22px;
    background: var(--gt-red);
    -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M5 12h13M13 6l6 6-6 6' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/></svg>")
      center / contain no-repeat;
    mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M5 12h13M13 6l6 6-6 6' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/></svg>")
      center / contain no-repeat;
    opacity: 0;
    transform: translateX(-6px);
    transition:
      opacity var(--gt-mid) var(--gt-ease),
      transform var(--gt-mid) var(--gt-ease);
  }

  .service-wrap .service-item:hover > .position-relative::after {
    opacity: 1;
    transform: none;
  }

  /* пропорцию кадра не трогаем: она и держит одинаковую высоту в ряду */
}

/* ---------- каталог крупной сеткой ---------- */
/* Ровные три в ряд читаются как таблица. Первая позиция занимает
   четверть экрана, остальные выстраиваются вокруг — витрина, а не список. */
@media (min-width: 992px) {
  .service-wrap .row {
    display: grid !important;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    grid-auto-rows: 1fr;
    gap: 1.5rem;
    margin: 0;
  }

  .service-wrap .row > [class*="col-"] {
    width: auto !important;
    max-width: none !important;
    flex: none !important;
    padding: 0 !important;
    margin: 0 !important;
  }

  .service-wrap .row > [class*="col-"]:first-child {
    grid-column: span 2;
    grid-row: span 2;
  }

  /* карточка тянется на всю ячейку, кадр — вместе с ней */
  .service-wrap .service-item,
  .service-wrap .service-item .ratio {
    height: 100% !important;
  }

  .service-wrap .service-item .ratio {
    padding-top: 0 !important;
  }

  .service-wrap .service-item .ratio > * {
    position: absolute;
    inset: 0;
  }

  /* у крупной плитки подпись крупнее — она задаёт тон всей сетке */
  .service-wrap .row > [class*="col-"]:first-child .service-title {
    font-size: clamp(1.3rem, 1.7vw, 1.75rem);
  }

  .service-wrap .row > [class*="col-"]:first-child > .service-item
    > .position-relative {
    padding: 2.2rem 2rem 1.9rem !important;
  }
}

/* на телефоне подпись остаётся под снимком: поверх фото её труднее читать */
@media (max-width: 575.98px) {
  .service-wrap .service-item > .position-relative {
    padding: 1rem 1.1rem 1.15rem !important;
  }
}

/* ============================================================
   Тёмный разворот. Секция преимуществ уходит в графит: страница
   перестаёт быть сплошным белым листом и получает точку опоры.
   ============================================================ */
.feature-wrap2 {
  background: #14171c !important;
  color: #fff;
}

.feature-wrap2 h1,
.feature-wrap2 h2,
.feature-wrap2 h3,
.feature-wrap2 h4,
.feature-wrap2 h5,
.feature-wrap2 .text-dark,
.feature-wrap2 .text-body {
  color: #fff !important;
}

.feature-wrap2 p,
.feature-wrap2 .content,
.feature-wrap2 li {
  color: rgba(255, 255, 255, 0.72) !important;
}

.feature-wrap2 h6.text-primary {
  color: var(--gt-red) !important;
}

/* галочки и иконки в списке преимуществ */
.feature-wrap2 .btn-sm-square,
.feature-wrap2 .btn-square,
.feature-wrap2 .bg-primary {
  box-shadow: 0 6px 20px rgba(184, 35, 35, 0.35);
}

/* красим только иконки на тёмном фоне: внутри красных кружков
   значок обязан остаться белым, иначе он пропадает */
.feature-wrap2 i.text-primary:not(.text-white) {
  color: var(--gt-red) !important;
}

.feature-wrap2 .bg-primary i,
.feature-wrap2 .btn-primary i,
.feature-wrap2 .rounded-circle i {
  color: #fff !important;
}

/* ---------- блок с цифрами ---------- */
/* колонки висели в воздухе разной высоты — собираем их в карточки */
/* подложка рисуется псевдоэлементом внутри колонки: сетка bootstrap
   остаётся нетронутой, разметку в шаблоне править не нужно */
.feature-wrap .row.g-5 {
  --bs-gutter-x: 1.75rem;
  --bs-gutter-y: 1.75rem;
}

.feature-wrap .row > [class*="col-"] {
  position: relative;
  padding-top: 1.75rem;
  padding-bottom: 1.75rem;
  padding-left: calc(var(--bs-gutter-x) * 0.5 + 1.5rem);
  padding-right: calc(var(--bs-gutter-x) * 0.5 + 1.5rem);
}

.feature-wrap .row > [class*="col-"]::before {
  content: "";
  position: absolute;
  inset: 0 calc(var(--bs-gutter-x) * 0.5);
  background: var(--bs-body-bg);
  border: 1px solid rgba(16, 18, 22, 0.07);
  border-radius: var(--gt-radius);
  box-shadow: var(--gt-shadow-1);
  transition:
    transform var(--gt-mid) var(--gt-ease),
    box-shadow var(--gt-mid) var(--gt-ease);
}

.feature-wrap .row > [class*="col-"] > * {
  position: relative;
}

.feature-wrap .row > [class*="col-"]:hover::before {
  transform: translateY(-3px);
  box-shadow: var(--gt-shadow-2);
}

.feature-wrap h1 {
  font-size: clamp(2.6rem, 4.2vw, 4rem);
  font-weight: 700;
  color: var(--gt-red);
  line-height: 1;
}

/* цифры — самое сильное место на странице, поэтому крупно и цветом */
.feature-wrap .d-flex.align-items-center {
  gap: 0.25rem;
}

.feature-wrap h5 {
  font-weight: 700;
}

.feature-wrap .content {
  color: var(--bs-secondary-color);
}

.feature-wrap .btn-lg-square.bg-primary {
  box-shadow: 0 6px 18px rgba(184, 35, 35, 0.25);
}

[data-bs-theme="dark"] .feature-wrap .row > [class*="col-"]::before {
  border-color: rgba(255, 255, 255, 0.08);
  background: rgba(var(--bs-secondary-bg-rgb), 1);
}

/* ---------- формы ---------- */
.form-control,
.form-select,
textarea.form-control {
  border-radius: var(--gt-radius-sm);
  border-color: rgba(16, 18, 22, 0.14);
  padding: 0.85rem 1rem;
  transition:
    border-color var(--gt-fast) var(--gt-ease),
    box-shadow var(--gt-fast) var(--gt-ease);
}

.form-control:focus,
.form-select:focus {
  border-color: var(--gt-red);
  box-shadow: 0 0 0 4px rgba(184, 35, 35, 0.12);
}

.form-floating > label {
  padding-left: 1rem;
}

/* ============================================================
   Длинные тексты. Полотно в девять строк без отбивок не читается:
   даём красную строку, воздух между абзацами, комфортную длину строки
   и заметные подзаголовки — текст разбивается на подразделы.
   ============================================================ */
.item-page .content,
.component-wrap .content,
.blog-item .content,
.item-page .article-body,
.category-desc {
  --gt-measure: 74ch;
}

.item-page .content > p,
.component-wrap .content > p,
.blog-item .content > p,
.category-desc > p {
  max-width: var(--gt-measure);
  margin-bottom: 1.15rem;
  text-indent: 1.7em;
  hyphens: none;
}

/* первый абзац чуть крупнее — это лид. Красную строку ему тоже
   оставляем: заказчик просил, чтобы абзацы начинались одинаково. */
.item-page .content > h1 + p,
.item-page .content > h2 + p,
.item-page .content > h3 + p,
.component-wrap .content > h2 + p,
.component-wrap .content > h3 + p {
  text-indent: 0;
}

.item-page .content > p:first-of-type,
.component-wrap .content > p:first-of-type {
  font-size: 1.08em;
  color: var(--bs-emphasis-color);
}

/* абзац после картинки или списка тоже начинает мысль заново */
.item-page .content > ul + p,
.item-page .content > ol + p,
.component-wrap .content > ul + p,
.component-wrap .content > ol + p {
  text-indent: 0;
}

/* подзаголовки внутри статьи: отбивка сверху и метка слева,
   чтобы полотно распадалось на разделы */
.item-page .content h2,
.item-page .content h3,
.component-wrap .content h2,
.component-wrap .content h3,
.item-page .content h4,
.component-wrap .content h4 {
  position: relative;
  max-width: var(--gt-measure);
  margin-top: 2.6rem;
  margin-bottom: 1rem;
  padding-left: 1.1rem;
  font-size: clamp(1.25rem, 1.7vw, 1.6rem);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.25;
}

.item-page .content h2::before,
.item-page .content h3::before,
.item-page .content h4::before,
.component-wrap .content h2::before,
.component-wrap .content h3::before,
.component-wrap .content h4::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.22em;
  bottom: 0.22em;
  width: 3px;
  border-radius: 2px;
  background: var(--gt-red);
}

/* списки в статьях: тот же ритм, что у абзацев */
.item-page .content ul,
.item-page .content ol,
.component-wrap .content ul,
.component-wrap .content ol {
  max-width: var(--gt-measure);
  margin-bottom: 1.4rem;
  padding-left: 1.35rem;
}

.item-page .content li,
.component-wrap .content li {
  margin-bottom: 0.5rem;
}

.item-page .content li::marker,
.component-wrap .content li::marker {
  color: var(--gt-red);
}

/* на телефоне красная строка съедает и без того узкую колонку */
@media (max-width: 575.98px) {
  .item-page .content > p,
  .component-wrap .content > p,
  .blog-item .content > p,
  .category-desc > p {
    text-indent: 0;
  }
}

/* ---------- длинные слова ---------- */
/* «МОГИЛЕВЛИФТМАШ» в списке поставок вылезал за правый край и давал
   горизонтальную прокрутку на узких экранах */
h1,
h2,
h3,
h4,
h5,
h6,
.h1,
.h2,
.h3,
.h4,
.h5,
.h6,
.service-title,
.timeline-year,
td,
th {
  /* break-word рвёт слово только когда оно правда не влезает,
     поэтому «ПромАгроПак-2007» остаётся целым */
  overflow-wrap: break-word;
  word-break: normal;
}

/* настоящая причина прокрутки: flex-колонка не давала себя сжать */
.flex-grow-1,
.d-flex > .flex-grow-1 {
  min-width: 0;
}

/* список поставок: фото 150 px не оставляло названию места на телефоне */
@media (max-width: 575.98px) {
  .marker-tags img.rounded-circle {
    width: 92px !important;
    height: 92px !important;
  }
}

/* ---------- область нажатия ---------- */
/* заголовок карточки был ссылкой высотой 20 px — теперь нажимается
   вся карточка, ссылка та же, разметку не меняли */
.service-wrap .service-item,
.projects-wrap .service-item,
.component-wrap .service-item {
  position: relative;
}

.service-wrap .service-item h5 > a::after,
.service-wrap .service-item .service-title > a::after,
.projects-wrap .service-item h5 > a::after,
.projects-wrap .service-item .service-title > a::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
}

@media (max-width: 991.98px) {
  /* контактные ссылки: телефон и почта под палец */
  .footer a[href^="mailto:"],
  .footer a[href^="tel:"],
  .quote-text a[href^="mailto:"],
  .quote-text a[href^="tel:"],
  .footer ul a,
  .modal-body a,
  .list-unstyled a {
    display: inline-block;
    padding-block: 0.4rem;
  }

  .navbar .dropdown-item {
    padding-block: 0.7rem;
  }
}

/* ---------- ссылки в тексте ---------- */
.item-page a:not(.btn),
.quote-text a:not(.btn),
.about-text a:not(.btn) {
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
}

/* ---------- разделы ---------- */
.container-xxl.py-5 {
  padding-top: 4.5rem !important;
  padding-bottom: 4.5rem !important;
}

@media (max-width: 767.98px) {
  .container-xxl.py-5 {
    padding-top: 3rem !important;
    padding-bottom: 3rem !important;
  }

  /* под каруселью было 48 px её собственного отступа плюс отступ
     секции — на телефоне выходила пустая полоса почти в экран */
  .carousel-wrap.mb-5 {
    margin-bottom: 0 !important;
  }

  .container-xxl.my-5,
  .container-fluid.my-5 {
    margin-top: 1.5rem !important;
    margin-bottom: 1.5rem !important;
  }
}

/* ---------- подвал ---------- */
.footer a:not(.btn) {
  transition: color var(--gt-fast) var(--gt-ease);
}

.footer a:not(.btn):hover {
  color: var(--gt-red) !important;
}

/* превью склада в подвале были голыми прямоугольниками */
.footer img {
  border-radius: var(--gt-radius-sm);
  transition: transform var(--gt-mid) var(--gt-ease);
}

.footer a:hover img {
  transform: scale(1.03);
}

/* ---------- чекбокс согласия ---------- */
.form-check-input {
  width: 1.25rem;
  height: 1.25rem;
  margin-top: 0.2rem;
  border-color: rgba(16, 18, 22, 0.28);
  cursor: pointer;
  flex-shrink: 0;
}

.form-check-input:checked {
  background-color: var(--gt-red);
  border-color: var(--gt-red);
}

.form-check-input:focus {
  border-color: var(--gt-red);
  box-shadow: 0 0 0 4px rgba(184, 35, 35, 0.12);
}

.form-check-label {
  cursor: pointer;
  padding-left: 0.25rem;
}

/* ---------- лишние двойные отступы между секциями ---------- */
.container-xxl.my-5 {
  margin-top: 2.5rem !important;
  margin-bottom: 2.5rem !important;
}

.container-fluid.my-5 {
  margin-top: 3rem !important;
  margin-bottom: 3rem !important;
}

/* ---------- карусель партнёров ---------- */
.testimonial-carousel .owl-nav button {
  transition:
    background-color var(--gt-fast) var(--gt-ease),
    color var(--gt-fast) var(--gt-ease);
}

.testimonial-item {
  padding: 1.5rem;
}

/* ---------- тёмная тема: не ломаем ---------- */
[data-bs-theme="dark"] .service-item,
[data-bs-theme="dark"] .testimonial-item,
[data-bs-theme="dark"] .card {
  border-color: rgba(255, 255, 255, 0.08);
  box-shadow:
    0 1px 2px rgba(0, 0, 0, 0.4),
    0 10px 24px rgba(0, 0, 0, 0.35) !important;
}

[data-bs-theme="dark"] .navbar.sticky-top {
  box-shadow: 0 1px 0 rgba(255, 255, 255, 0.08) !important;
}

[data-bs-theme="dark"] .form-control,
[data-bs-theme="dark"] .form-select {
  border-color: rgba(255, 255, 255, 0.14);
}

/* ---------- появление при прокрутке ---------- */
/* класс gt-reveal ставит refresh.js: без скрипта контент виден как есть */
/* Ход сделан заметнее: блок приезжает с большего расстояния и с лёгким
   уменьшением, а выходит на место упруго. Заказчик просил, чтобы
   движение читалось, а не угадывалось. */
.gt-reveal .gt-anim {
  opacity: 0;
  transform: translateY(42px) scale(0.97);
  will-change: opacity, transform;
}

.gt-reveal .gt-anim.gt-in {
  opacity: 1;
  transform: none;
  transition:
    opacity 0.42s cubic-bezier(0.22, 1, 0.32, 1),
    transform 0.62s cubic-bezier(0.19, 1.12, 0.3, 1);
}

/* карусель героя не прячем: она первый экран */
.gt-reveal .carousel-wrap.gt-anim {
  opacity: 1;
  transform: none;
}

/* у шаблона на этих блоках висит animate.css без библиотеки —
   гасим, чтобы не спорил с нашим появлением */
.wow {
  animation-name: none !important;
  visibility: visible !important;
}

/* ============================================================
   Движение. Всё сдержанное: короткие дистанции, никакого пружинения
   и разлёта. Задача — ощущение выверенности, а не аттракцион.
   ============================================================ */

/* ---------- заголовки по словам ---------- */
.gt-word {
  display: inline-block;
  overflow: hidden;
  vertical-align: bottom;
  /* запас под выносные элементы, иначе маска срезает «р» и «у» */
  padding-bottom: 0.12em;
  margin-bottom: -0.12em;
}

.gt-word > span {
  display: inline-block;
  transform: translateY(110%);
  transition: transform 0.75s var(--gt-ease);
}

.gt-reveal .gt-in .gt-word > span,
.gt-in .gt-word > span {
  transform: none;
}

/* если блок не участвует в появлении, слова показываем сразу */
.gt-reveal h1:not(.gt-anim):not(.gt-in) .gt-word > span {
  transform: none;
}

/* ---------- полоса прочитанного ---------- */
.gt-progress {
  position: fixed;
  top: 0;
  left: 0;
  height: 2px;
  width: 100%;
  transform: scaleX(0);
  transform-origin: 0 50%;
  background: var(--gt-red);
  z-index: 2000;
  pointer-events: none;
  will-change: transform;
}

/* ---------- фотографии проявляются ---------- */
/* лёгкий отъезд масштаба вместо простого включения картинки */
.gt-reveal .gt-anim .ratio > a > .position-relative > img,
.gt-reveal .gt-anim .ratio img,
.gt-reveal .gt-anim > .cover img {
  transform: scale(1.06);
  transition: transform 0.9s var(--gt-ease);
}

.gt-reveal .gt-anim.gt-in .ratio img,
.gt-reveal .gt-anim.gt-in > .cover img {
  transform: scale(1);
}

/* наведение и появление не должны спорить друг с другом */
.service-item:hover .ratio img {
  transform: scale(1.04);
}

/* ---------- шапка ---------- */
/* тень появляется, только когда под шапку что-то уехало */
.navbar.sticky-top {
  box-shadow: none !important;
  transition:
    box-shadow 0.25s var(--gt-ease),
    background-color 0.25s var(--gt-ease);
}

.navbar.sticky-top.gt-stuck {
  box-shadow:
    0 1px 0 rgba(16, 18, 22, 0.08),
    0 6px 20px rgba(16, 18, 22, 0.07) !important;
}

[data-bs-theme="dark"] .navbar.sticky-top.gt-stuck {
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.09),
    0 6px 20px rgba(0, 0, 0, 0.5) !important;
}

/* ---------- кнопки: стрелка подаётся вперёд ---------- */
.btn i.fa-arrow-right,
.btn i.fa-angle-right,
.btn i.fa-chevron-right {
  transition: transform var(--gt-fast) var(--gt-ease);
}

.btn:hover i.fa-arrow-right,
.btn:hover i.fa-angle-right,
.btn:hover i.fa-chevron-right {
  transform: translateX(3px);
}

/* ---------- иконки в блоке цифр ---------- */
.feature-wrap .btn-lg-square.bg-primary {
  transition:
    transform 0.5s var(--gt-ease),
    box-shadow 0.5s var(--gt-ease);
  transform: scale(0.82);
}

.feature-wrap .gt-in .btn-lg-square.bg-primary,
.feature-wrap .gt-in.btn-lg-square.bg-primary {
  transform: scale(1);
}

.feature-wrap .row > [class*="col-"]:hover .btn-lg-square.bg-primary {
  transform: scale(1.06);
}

/* ---------- подчёркивание ссылок в тексте ---------- */
.item-page .content a:not(.btn):not(.text-body),
.about-text a:not(.btn):not(.text-body),
.feature-text a:not(.btn):not(.text-body) {
  background-image: linear-gradient(var(--gt-red), var(--gt-red));
  background-size: 0% 1px;
  background-repeat: no-repeat;
  background-position: 0 100%;
  text-decoration: none;
  transition: background-size 0.28s var(--gt-ease);
}

.item-page .content a:not(.btn):not(.text-body):hover,
.about-text a:not(.btn):not(.text-body):hover,
.feature-text a:not(.btn):not(.text-body):hover {
  background-size: 100% 1px;
}

/* ---------- список поставок ---------- */
.marker-tags .d-flex {
  transition: transform var(--gt-mid) var(--gt-ease);
}

.marker-tags .d-flex img {
  transition:
    transform var(--gt-mid) var(--gt-ease),
    box-shadow var(--gt-mid) var(--gt-ease);
}

.marker-tags .d-flex:hover img {
  transform: scale(1.04);
  box-shadow: var(--gt-shadow-2);
}

.marker-tags h5 a {
  transition: color var(--gt-fast) var(--gt-ease);
}

.marker-tags .d-flex:hover h5 a {
  color: var(--gt-red) !important;
}

/* ---------- кнопка наверх ---------- */
.back-to-top {
  transition:
    transform var(--gt-mid) var(--gt-ease),
    box-shadow var(--gt-mid) var(--gt-ease) !important;
}

.back-to-top:hover {
  transform: translateY(-3px);
  box-shadow: var(--gt-shadow-3);
}

/* ---------- модальное окно каталога ---------- */
.modal.fade .modal-dialog {
  transform: translateY(14px) scale(0.99);
  transition: transform 0.28s var(--gt-ease);
}

.modal.show .modal-dialog {
  transform: none;
}

/* ---------- уважение к настройкам движения ---------- */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.001ms !important;
    transition-duration: 0.001ms !important;
  }
  .service-item:hover,
  .blog-featured .card:hover,
  .marker-tags .d-flex:hover img,
  .back-to-top:hover {
    transform: none;
  }

  .gt-progress {
    display: none;
  }

  .gt-reveal .gt-anim .ratio img,
  .feature-wrap .btn-lg-square.bg-primary {
    transform: none;
  }
}

/* ============================================================
   ПРАВКИ ПО ВИДЕО ЗАКАЗЧИКА
   ============================================================ */

/* ---------- 1. Карточка каталога выходит вперёд ---------- */
/* «навожусь на плитку — она становится больше остальных».
   Соседи при этом слегка отступают, поэтому эффект читается сразу. */
@media (min-width: 992px) {
  .service-wrap .row > [class*="col-"] {
    transition: transform 0.4s var(--gt-ease);
  }

  .service-wrap .row:hover > [class*="col-"] {
    transform: scale(0.985);
  }

  .service-wrap .row > [class*="col-"]:hover {
    transform: scale(1.045);
    z-index: 5;
  }

  .service-wrap .service-item {
    transition:
      box-shadow 0.4s var(--gt-ease),
      border-color 0.4s var(--gt-ease);
  }

  .service-wrap .row > [class*="col-"]:hover .service-item {
    box-shadow:
      0 12px 24px rgba(16, 18, 22, 0.14),
      0 40px 80px rgba(16, 18, 22, 0.22) !important;
    border-color: rgba(184, 35, 35, 0.35);
  }

  /* карточку не двигаем дважды: подъём остаётся только у соседей */
  .service-wrap .service-item:hover {
    transform: none;
  }

  .service-wrap .row > [class*="col-"]:hover .service-item .ratio img {
    transform: scale(1.06);
  }
}

/* ---------- 2. Реализованные проекты крупной сеткой ---------- */
/* «слева одна большая, справа три поменьше» */
@media (min-width: 992px) {
  .projects-wrap .row {
    display: grid !important;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    grid-auto-rows: 1fr;
    gap: 1.5rem;
    margin: 0;
  }

  .projects-wrap .row > [class*="col-"] {
    width: auto !important;
    max-width: none !important;
    flex: none !important;
    padding: 0 !important;
    margin: 0 !important;
    transition: transform 0.4s var(--gt-ease);
  }

  /* первая карточка занимает левую половину во всю высоту */
  .projects-wrap .row > [class*="col-"]:first-child {
    grid-column: span 2;
    grid-row: span 2;
  }

  .projects-wrap .service-item,
  .projects-wrap .service-item .ratio {
    height: 100% !important;
  }

  .projects-wrap .service-item .ratio {
    padding-top: 0 !important;
  }

  .projects-wrap .service-item .ratio > * {
    position: absolute;
    inset: 0;
  }

  /* подпись ложится на снимок, как в каталоге */
  .projects-wrap .service-item > .position-relative,
  .projects-wrap .service-item > .p-4,
  .projects-wrap .service-item > div:not(.ratio) {
    position: absolute !important;
    inset: auto 0 0 0;
    z-index: 2;
    padding: 1.4rem 1.3rem 1.2rem !important;
    background: linear-gradient(
      to top,
      rgba(12, 14, 18, 0.93) 0%,
      rgba(12, 14, 18, 0.78) 45%,
      rgba(12, 14, 18, 0) 100%
    );
    pointer-events: none;
  }

  .projects-wrap .service-item > div:not(.ratio) a {
    pointer-events: auto;
    color: #fff !important;
    font-weight: 700;
  }

  .projects-wrap .service-item > div:not(.ratio) * {
    color: #fff !important;
  }

  .projects-wrap .row > [class*="col-"]:first-child h5,
  .projects-wrap .row > [class*="col-"]:first-child .h5 {
    font-size: clamp(1.25rem, 1.6vw, 1.7rem);
  }

  .projects-wrap .row:hover > [class*="col-"] {
    transform: scale(0.985);
  }

  .projects-wrap .row > [class*="col-"]:hover {
    transform: scale(1.04);
    z-index: 5;
  }
}

/* ---------- 3. Разные направления появления ---------- */
/* «чтобы всё двигалось»: блоки приезжают с той стороны, где логичнее */
.gt-reveal .gt-anim.gt-from-right {
  transform: translate3d(64px, 14px, 0);
}

.gt-reveal .gt-anim.gt-from-left {
  transform: translate3d(-64px, 14px, 0);
}

.gt-reveal .gt-anim.gt-zoom {
  transform: scale(0.88);
  opacity: 0;
}

.gt-reveal .gt-anim.gt-from-right.gt-in,
.gt-reveal .gt-anim.gt-from-left.gt-in,
.gt-reveal .gt-anim.gt-zoom.gt-in {
  transform: none;
  opacity: 1;
}

/* ---------- 4. Живой фон ---------- */
/* Два медленно плывущих пятна и тонкая сетка. Всё на прозрачности
   фирменного красного, поэтому фон не спорит с фотографиями. */
.gt-bg {
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  overflow: hidden;
  background: var(--bs-body-bg);
}

.gt-bg::before,
.gt-bg::after {
  content: "";
  position: absolute;
  width: 58vw;
  height: 58vw;
  border-radius: 50%;
  opacity: 0.85;
}

.gt-bg::before {
  top: -18vw;
  left: -12vw;
  background: radial-gradient(
    circle,
    rgba(184, 35, 35, 0.16) 0%,
    rgba(184, 35, 35, 0) 70%
  );
  animation: gt-drift-a 26s ease-in-out infinite alternate;
}

.gt-bg::after {
  bottom: -22vw;
  right: -14vw;
  background: radial-gradient(
    circle,
    rgba(40, 60, 110, 0.14) 0%,
    rgba(40, 60, 110, 0) 70%
  );
  animation: gt-drift-b 34s ease-in-out infinite alternate;
}

@keyframes gt-drift-a {
  from {
    transform: translate3d(0, 0, 0);
  }
  to {
    transform: translate3d(10vw, 8vh, 0);
  }
}

@keyframes gt-drift-b {
  from {
    transform: translate3d(0, 0, 0);
  }
  to {
    transform: translate3d(-9vw, -7vh, 0);
  }
}

/* тонкая техническая сетка поверх пятен */
.gt-bg .gt-grid {
  position: absolute;
  inset: -2px;
  background-image:
    linear-gradient(rgba(16, 18, 22, 0.045) 1px, transparent 1px),
    linear-gradient(90deg, rgba(16, 18, 22, 0.045) 1px, transparent 1px);
  background-size: 64px 64px;
  mask-image: radial-gradient(circle at 50% 40%, #000 0%, transparent 78%);
  -webkit-mask-image: radial-gradient(
    circle at 50% 40%,
    #000 0%,
    transparent 78%
  );
}

[data-bs-theme="dark"] .gt-bg .gt-grid {
  background-image:
    linear-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px);
}

/* секции поверх фона: сплошные остаются сплошными, светлые пропускают */
.gt-bg-on .container-xxl,
.gt-bg-on .about-wrap,
.gt-bg-on .feature-wrap2,
.gt-bg-on .footer {
  position: relative;
}

.gt-bg-on .service-wrap {
  background: rgba(233, 236, 239, 0.88);
}

[data-bs-theme="dark"].gt-bg-on .service-wrap {
  background: rgba(33, 37, 41, 0.5);
}

@media (prefers-reduced-motion: reduce) {
  .gt-bg::before,
  .gt-bg::after {
    animation: none;
  }
}

/* размытие в 90 пикселей на всю ширину экрана — дорогая операция,
   на телефонах оставляем только сетку */
@media (max-width: 991.98px) {
  .gt-bg::before,
  .gt-bg::after {
    display: none;
  }

  .gt-bg .gt-grid {
    background-size: 44px 44px;
  }

  .gt-bg-on .service-wrap {
    background: var(--bs-secondary-bg);
    backdrop-filter: none;
  }
}

/* ---------- 5. Отклик на наведение по всей странице ---------- */
/* «чтобы везде всё жило»: блоки, на которые можно нажать, должны
   отзываться. Раньше реагировали только карточки каталога. */

/* строки преимуществ на тёмном развороте */
.feature-wrap2 .d-flex {
  padding: 0.55rem 0.7rem;
  margin-left: -0.7rem;
  border-radius: var(--gt-radius-sm);
  transition:
    background-color var(--gt-mid) var(--gt-ease),
    transform var(--gt-mid) var(--gt-ease);
}

.feature-wrap2 .d-flex:hover {
  background: rgba(255, 255, 255, 0.05);
  transform: translateX(6px);
}

.feature-wrap2 .d-flex .btn-lg-square,
.feature-wrap2 .d-flex .btn-square,
.feature-wrap2 .d-flex .rounded-circle {
  transition: transform var(--gt-mid) var(--gt-ease);
}

.feature-wrap2 .d-flex:hover .btn-lg-square,
.feature-wrap2 .d-flex:hover .rounded-circle {
  transform: scale(1.1) rotate(-6deg);
}

/* карточки партнёров */
.testimonial-item {
  transition:
    transform var(--gt-mid) var(--gt-ease),
    box-shadow var(--gt-mid) var(--gt-ease);
}

.testimonial-item:hover {
  transform: translateY(-5px);
  box-shadow: var(--gt-shadow-3) !important;
}

/* кнопка отправки формы: стрелка выезжает, как на референсе */
.quote-text .btn-primary,
form .btn-primary {
  position: relative;
  overflow: hidden;
}

.quote-text .btn-primary::before,
form .btn-primary::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    100deg,
    transparent 30%,
    rgba(255, 255, 255, 0.22) 50%,
    transparent 70%
  );
  transform: translateX(-100%);
  transition: transform 0.7s var(--gt-ease);
}

.quote-text .btn-primary:hover::before,
form .btn-primary:hover::before {
  transform: translateX(100%);
}

/* колонки подвала отзываются на наведение */
.footer ul li {
  transition: transform var(--gt-fast) var(--gt-ease);
}

.footer ul li:hover {
  transform: translateX(4px);
}

@media (prefers-reduced-motion: reduce) {
  .feature-wrap2 .d-flex:hover,
  .testimonial-item:hover,
  .footer ul li:hover {
    transform: none;
  }
  .quote-text .btn-primary::before,
  form .btn-primary::before {
    display: none;
  }
}


/* ============================================================
   Вторая волна правок по видео заказчика: живее везде
   ============================================================ */

/* ---------- шапка не уезжает ---------- */
/* Шаблонный main.js прячет шапку на -100 px, пока прокрутили меньше
   300 px, и только потом возвращает: меню исчезает как раз тогда,
   когда человек начал листать, и возвращается прыжком.
   Тень и фон у шапки уже переключаются классом .gt-stuck. */
.navbar.sticky-top {
  top: 0 !important;
}

/* ---------- шапка лежит на кадре ---------- */
/* Кадр начинался под 137 px светлой шапки и выглядел вставленной
   картинкой, а не первым экраном. Поднимаем карусель под шапку.
   Только xl и выше — ниже 1200 px работает бургер, туда не лезем.
   76 px — высота, заданная шаблоном (.navbar .navbar-brand). */
@media (min-width: 1200px) {
  .gt-home .carousel-wrap {
    margin-top: -76px;
  }

  /* тёмная растяжка сверху: белые надписи шапки должны читаться
     и на светлых кадрах цеха, а не только на тёмных */
  .gt-home .carousel-wrap::before {
    content: "";
    position: absolute;
    inset: 0 0 auto 0;
    height: 210px;
    z-index: 2;
    pointer-events: none;
    background: linear-gradient(
      to bottom,
      rgba(10, 12, 16, 0.72) 0%,
      rgba(10, 12, 16, 0.34) 46%,
      rgba(10, 12, 16, 0) 100%
    );
  }

  /* пока не прокрутили (класс .gt-stuck ставит refresh.js) шапка
     прозрачная; при прокрутке возвращается обычная плашка */
  .gt-home .navbar.sticky-top:not(.gt-stuck) {
    background: transparent !important;
    box-shadow: none !important;
    backdrop-filter: none;
  }

  .gt-home .navbar.sticky-top:not(.gt-stuck) .navbar-brand {
    border-color: rgba(255, 255, 255, 0.22) !important;
  }

  /* на кадре нужен светлый знак — тот же, что шаблон
     показывает в тёмной теме */
  .gt-home .navbar.sticky-top:not(.gt-stuck) .logo-light {
    display: none !important;
  }
  .gt-home .navbar.sticky-top:not(.gt-stuck) .logo-dark {
    display: inline-block !important;
  }

  .gt-home .navbar.sticky-top:not(.gt-stuck) .navbar-nav .nav-link {
    color: #fff !important;
  }

  .gt-home .navbar.sticky-top:not(.gt-stuck) .btn-secondary {
    color: #fff !important;
    background: rgba(255, 255, 255, 0.13) !important;
    border-color: rgba(255, 255, 255, 0.24) !important;
  }

  .gt-home .navbar.sticky-top:not(.gt-stuck) .btn-secondary:hover {
    background: rgba(255, 255, 255, 0.26) !important;
  }
}

/* строка с адресом и телефонами — часть той же тёмной шапки, иначе
   светлая полоса висит над кадром отдельной деталью. Возвращается
   в обычный вид одновременно с шапкой. */
@media (min-width: 1400px) {
  .gt-home body > .container-fluid.bg-body-secondary.p-0 {
    transition: background-color 0.3s var(--gt-ease);
  }

  .gt-home body:has(.navbar.sticky-top:not(.gt-stuck)) > .container-fluid.bg-body-secondary.p-0 {
    background: #0e1116 !important;
  }

  .gt-home body:has(.navbar.sticky-top:not(.gt-stuck)) > .container-fluid.bg-body-secondary.p-0 .text-body {
    color: rgba(255, 255, 255, 0.8) !important;
  }

  .gt-home body:has(.navbar.sticky-top:not(.gt-stuck)) > .container-fluid.bg-body-secondary.p-0 a:hover .text-body {
    color: #fff !important;
  }
}

/* ---------- текст кадра появляется на каждом слайде ---------- */
/* animate.css отыгрывает slideInDown один раз при загрузке, поэтому
   на втором и следующих кадрах подпись просто есть. Гасим одноразовую
   анимацию точечно — у h2 и кнопки, но НЕ у всего .animated: класс
   animated owl вешает на уходящий слайд и ждёт от него animationend,
   без этого события карусель залипает и перестаёт листать. */
.header-carousel .owl-item h2.animated,
.header-carousel .owl-item .owl-carousel-inner .btn.animated {
  animation-name: none !important;
}

.header-carousel .owl-item h2,
.header-carousel .owl-item .owl-carousel-inner .btn {
  opacity: 0;
  transform: translateY(26px);
  transition:
    opacity 0.7s var(--gt-ease),
    transform 0.7s var(--gt-ease);
}

.header-carousel .owl-item.active h2 {
  opacity: 1;
  transform: none;
  transition-delay: 0.18s;
}

/* кнопка подтягивается следом за заголовком, а не вместе с ним */
.header-carousel .owl-item.active .owl-carousel-inner .btn {
  opacity: 1;
  transform: none;
  transition-delay: 0.36s;
}

@media (prefers-reduced-motion: reduce) {
  .header-carousel .owl-item h2,
  .header-carousel .owl-item .owl-carousel-inner .btn {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ---------- заголовки «О компании» и «Преимущества» ---------- */
/* Слова у этих h1 уже нарезаны скриптом, но сам h1 не участвует
   в появлении, поэтому срабатывала страховка и маска не играла.
   Считаем сигналом появление самой колонки — она в списке есть
   по классу .wow и класс .gt-in получает. */
.gt-reveal .about-text:not(.gt-in) h1 .gt-word > span,
.gt-reveal .feature-text:not(.gt-in) h1 .gt-word > span {
  transform: translateY(110%);
}

.gt-reveal .about-text.gt-in h1 .gt-word > span,
.gt-reveal .feature-text.gt-in h1 .gt-word > span {
  transform: none;
}

/* На главной колонка .about-text из анимации исключена (каскад идёт по
   элементам), поэтому сигнал для слов берём с самого заголовка. */
.gt-reveal .about-wrap .about-text h1:not(.gt-in) .gt-word > span {
  transform: translateY(110%);
}

.gt-reveal .about-wrap .about-text h1.gt-in .gt-word > span {
  transform: none;
}

/* ---------- «О компании» собирается по частям ---------- */
/* Весь текст лежит в одном div, поэтому появление цепляло его
   целиком: самая длинная секция главной выезжала одной плитой.
   Разбираем на смысловые строки. */
.gt-reveal .about-text h6.text-primary,
.gt-reveal .about-text .content > p,
.gt-reveal .about-text .content > h4,
.gt-reveal .about-text .content > ul > li,
.gt-reveal .about-text a.btn {
  opacity: 0;
  transform: translate3d(0, 16px, 0);
  transition:
    opacity 0.5s var(--gt-ease),
    transform 0.5s var(--gt-ease);
}

.gt-reveal .about-text.gt-in h6.text-primary,
.gt-reveal .about-text.gt-in .content > p,
.gt-reveal .about-text.gt-in .content > h4,
.gt-reveal .about-text.gt-in .content > ul > li,
.gt-reveal .about-text.gt-in a.btn {
  opacity: 1;
  transform: none;
}

/* лесенка: список идёт следом за заголовком, кнопка замыкает */
.gt-reveal .about-text.gt-in h6.text-primary { transition-delay: 0.04s; }
.gt-reveal .about-text.gt-in .content > p { transition-delay: 0.2s; }
.gt-reveal .about-text.gt-in .content > h4 { transition-delay: 0.28s; }
.gt-reveal .about-text.gt-in .content > ul > li:nth-child(1) { transition-delay: 0.36s; }
.gt-reveal .about-text.gt-in .content > ul > li:nth-child(2) { transition-delay: 0.42s; }
.gt-reveal .about-text.gt-in .content > ul > li:nth-child(3) { transition-delay: 0.48s; }
.gt-reveal .about-text.gt-in .content > ul > li:nth-child(4) { transition-delay: 0.54s; }
.gt-reveal .about-text.gt-in .content > ul > li:nth-child(n + 5) { transition-delay: 0.6s; }
.gt-reveal .about-text.gt-in a.btn { transition-delay: 0.68s; }

/* ---------- карточка цифр собирается ---------- */
/* Число, подпись и описание включались одновременно, внутри
   карточки не было ни движения, ни границы между числом и текстом. */
.feature-wrap .row > [class*="col-"] > .d-flex.align-items-center {
  position: relative;
  padding-bottom: 0.9rem;
  margin-bottom: 1.1rem;
}

.feature-wrap .row > [class*="col-"] > .d-flex.align-items-center::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 2px;
  border-radius: 2px;
  background: linear-gradient(90deg, var(--gt-red) 0%, rgba(184, 35, 35, 0) 100%);
  transform-origin: 0 50%;
  transition: transform 0.9s var(--gt-ease) 0.22s;
}

/* без скрипта линия просто нарисована — прячем её только когда
   появление реально работает */
.gt-reveal .feature-wrap .row > [class*="col-"] > .d-flex.align-items-center::after {
  transform: scaleX(0);
}

.gt-reveal .feature-wrap .row > [class*="col-"].gt-in > .d-flex.align-items-center::after {
  transform: scaleX(1);
}

/* подпись и описание догоняют число */
.gt-reveal .feature-wrap .row > [class*="col-"] h5,
.gt-reveal .feature-wrap .row > [class*="col-"] .content {
  opacity: 0;
  transform: translate3d(0, 10px, 0);
  transition:
    opacity 0.5s var(--gt-ease),
    transform 0.5s var(--gt-ease);
}

.gt-reveal .feature-wrap .row > [class*="col-"].gt-in h5 {
  opacity: 1;
  transform: none;
  transition-delay: 0.16s;
}

.gt-reveal .feature-wrap .row > [class*="col-"].gt-in .content {
  opacity: 1;
  transform: none;
  transition-delay: 0.26s;
}

/* ---------- партнёры: центр в фокусе ---------- */
/* Шторки шаблона в 300 px залиты сплошным цветом темы и не совпадали
   с живым фоном страницы — соседние логотипы тонули в мутном пятне.
   Край гасим маской (она не зависит от цвета фона), а разницу между
   центром и соседями отдаём приглушению и масштабу всей карточки. */
.testimonial-carousel::before,
.testimonial-carousel::after {
  width: 0 !important;
  background: none !important;
}

.testimonial-carousel .owl-stage-outer {
  -webkit-mask-image: linear-gradient(
    to right,
    transparent 0,
    #000 7%,
    #000 93%,
    transparent 100%
  );
  mask-image: linear-gradient(
    to right,
    transparent 0,
    #000 7%,
    #000 93%,
    transparent 100%
  );
}

.testimonial-carousel .owl-item {
  opacity: 0.42;
  transform: scale(0.93);
  filter: saturate(0.15);
  transition:
    opacity 0.6s var(--gt-ease),
    transform 0.6s var(--gt-ease),
    filter 0.6s var(--gt-ease);
}

.testimonial-carousel .owl-item.center {
  opacity: 1;
  transform: none;
  filter: none;
}

/* шаблон двигал только подпись — переносим движение на всю карточку */
.testimonial-carousel .owl-item .testimonial-text,
.testimonial-carousel .owl-item.center .testimonial-text {
  transform: none;
  margin-bottom: 0;
}

/* обесцвечивание на телефоне лишнее: там всё равно виден один слайд */
@media (max-width: 767.98px) {
  .testimonial-carousel .owl-item {
    filter: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .testimonial-carousel .owl-item {
    transform: none;
  }
}

/* ---------- партнёры: плашка под логотип ---------- */
/* Логотипы шли как есть: разного масштаба (267, 293 px по ширине при
   общей высоте 200) и со своей белой заливкой. В тёмной теме каждый
   выглядел куском бумаги на тёмном фоне. Ставим их на одну светлую
   плашку и вписываем в одинаковый размер. */
.testimonial-carousel .testimonial-img {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 190px;
  margin-bottom: 1.25rem;
  padding: 1.1rem 1.4rem;
  border-radius: var(--gt-radius-sm);
  background: #fff;
  box-shadow: inset 0 0 0 1px rgba(16, 18, 22, 0.07);
  overflow: hidden;
}

.testimonial-carousel .testimonial-img img {
  width: 100%;
  height: 100%;
  max-height: 148px;
  margin: 0 !important;
  object-fit: contain;
  transition: transform 0.45s var(--gt-ease);
}

/* карточка уже обведена рамкой — вторая тень внутри неё лишняя */
.testimonial-carousel .owl-item .testimonial-text {
  box-shadow: none;
}

.testimonial-carousel .testimonial-item:hover .testimonial-img img {
  transform: scale(1.05);
}

[data-bs-theme="dark"] .testimonial-carousel .testimonial-img {
  box-shadow: 0 8px 22px rgba(0, 0, 0, 0.45);
}

@media (prefers-reduced-motion: reduce) {
  .testimonial-carousel .testimonial-item:hover .testimonial-img img {
    transform: none;
  }
}

/* ---------- форма обратной связи ---------- */
/* Форма отвечала на работу пользователя только цветом рамки: пять
   одинаковых прямоугольников, непонятно, где курсор, и кнопка не
   отзывается вовсе. Линию рисуем псевдоэлементом: на самом
   .form-floating висит инлайновая задержка появления, и трансформ
   на нём самом с ней бы спорил. */
.quote-text .form-floating::after {
  content: "";
  position: absolute;
  left: 14px;
  right: 14px;
  bottom: 1px;
  height: 2px;
  border-radius: 2px;
  background: var(--gt-red);
  transform: scaleX(0);
  transform-origin: 0 50%;
  transition: transform 0.4s var(--gt-ease);
  pointer-events: none;
}

.quote-text .form-floating:focus-within::after {
  transform: scaleX(1);
}

.quote-text .form-floating:focus-within > label {
  color: var(--gt-red);
}

/* кнопка: подъём и один проход блика по заливке.
   transition-property дописываем отдельно — у .btn длительность
   перехода задана через !important, и она тут как раз подходит */
.quote-text .btn-primary {
  position: relative;
  overflow: hidden;
  isolation: isolate;
  transition-property: color, background-color, border-color, box-shadow,
    transform;
}

.quote-text .btn-primary::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(
    115deg,
    transparent 25%,
    rgba(255, 255, 255, 0.3) 50%,
    transparent 75%
  );
  transform: translateX(-115%);
  transition: transform 0.75s var(--gt-ease);
}

.quote-text .btn-primary:hover {
  transform: translateY(-2px);
  box-shadow: 0 10px 24px rgba(184, 35, 35, 0.3);
}

.quote-text .btn-primary:hover::before {
  transform: translateX(115%);
}

@media (prefers-reduced-motion: reduce) {
  .quote-text .btn-primary:hover {
    transform: none;
  }

  .quote-text .form-floating::after {
    transition: none;
  }
}

/* ---------- карточки-строки внутренних страниц ---------- */
/* Разделы «Оборудование», «Новости» и подразделы каталога — это
   от шести до двенадцати одинаковых карточек подряд. Пока все они
   въезжали одним и тем же движением снизу, прокрутка читалась
   как повтор одного кадра. */

/* markGroups выдал всем карточкам, кроме первых трёх, одинаковую
   задержку 180 мс: карточки во всю ширину идут одна под другой,
   лесенка их только притормаживает */
.gt-reveal .component-wrap .service-item.row.gt-anim {
  transition-delay: 0ms !important;
}

/* сдвиг вбок только там, где карточка идёт в две колонки:
   на телефоне она разложена в столбик и 34 px увели бы её за край */
@media (min-width: 768px) {
  .gt-reveal .component-wrap .service-item.row.gt-anim:nth-of-type(odd) {
    transform: translate3d(-34px, 12px, 0);
  }

  .gt-reveal .component-wrap .service-item.row.gt-anim:nth-of-type(even) {
    transform: translate3d(34px, 12px, 0);
  }

  .gt-reveal .component-wrap .service-item.row.gt-anim.gt-in {
    transform: none;
  }

  /* второй слой: сначала кадр, следом текст.
     :not(.gt-anim) — чтобы не спорить с «Новостями», где колонки
     помечены классом .wow и появляются сами по себе */
  .gt-reveal
    .component-wrap
    .service-item.row.gt-anim
    > [class*="col-"]:last-child:not(.gt-anim) {
    opacity: 0;
    transform: translate3d(0, 16px, 0);
  }

  .gt-reveal
    .component-wrap
    .service-item.row.gt-anim.gt-in
    > [class*="col-"]:last-child:not(.gt-anim) {
    opacity: 1;
    transform: none;
    transition:
      opacity 0.5s var(--gt-ease) 0.14s,
      transform 0.5s var(--gt-ease) 0.14s;
  }
}

/* ---------- прилипающая колонка новостей ---------- */
/* Колонка выше окна (1041 px против 900): в прилипшем состоянии
   шаблонный StickySidebar фиксирует её по нижнему краю, и первая
   новость целиком уходит за верх экрана — до конца страницы её
   не достать. Ограничиваем ленту высотой окна и отдаём остаток
   её собственной прокрутке. */
@media (min-width: 1400px) {
  /* Ленту новостей раньше обрезали по высоте окна и включали ей свою
     прокрутку: содержимое резалось посреди строки, а колесо над этой
     колонкой сначала докручивало её и только потом страницу. Пусть
     колонка будет обычной высоты и едет вместе со страницей. */
  #sidebar-inner > .bg-body-secondary {
    max-height: none;
    overflow: visible;
  }

  /* лента висит на экране весь скролл и при этом не отзывалась
     на курсор — берём тот же отклик, что у списка поставок */
  #sidebar-inner .pe-3 > a {
    display: block;
    overflow: hidden;
    border-radius: var(--gt-radius-sm);
    line-height: 0;
  }

  #sidebar-inner .pe-3 img {
    transition: transform var(--gt-mid) var(--gt-ease);
  }

  #sidebar-inner .d-flex:hover .pe-3 img {
    transform: scale(1.06);
  }

  #sidebar-inner a.text-body {
    transition: color var(--gt-fast) var(--gt-ease);
  }

  #sidebar-inner .d-flex:hover a.text-body {
    color: var(--gt-red) !important;
  }
}

@media (prefers-reduced-motion: reduce) {
  #sidebar-inner .d-flex:hover .pe-3 img {
    transform: none;
  }
}

/* ---------- линейка над шапкой секции ---------- */
/* Разделы отбивались только отступом и на длинной странице
   сливались в одну ленту. Линейка над шапкой секции — главный
   повторяющийся приём референса. Прочерчивается вместе с появлением
   блока: цепляемся к уже существующему классу gt-in, второй
   наблюдатель не нужен. */
.gt-reveal .container-xxl.py-5 > .container {
  position: relative;
}

.gt-reveal .container-xxl.py-5 > .container > .text-center.mx-auto::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: -2.2rem;
  height: 1px;
  background: var(--bs-border-color);
  transform: scaleX(0);
  transform-origin: 0 50%;
  transition: transform 0.9s var(--gt-ease) 0.05s;
}

.gt-reveal .container-xxl.py-5 > .container > .text-center.mx-auto.gt-in::before {
  transform: scaleX(1);
}

@media (prefers-reduced-motion: reduce) {
  .gt-reveal .container-xxl.py-5 > .container > .text-center.mx-auto::before {
    transition: none;
    transform: scaleX(1);
  }
}

/* ---------- видно, что кадры сменяются сами ---------- */
/* Смена кадра происходила внезапно, а точки справа выглядели просто
   кружками поверх фотографии. Полоса внизу кадра показывает, сколько
   осталось до следующего снимка; она перезапускается сама, потому что
   owl переставляет .active на новый слайд. 4.6s — чуть меньше
   autoplayTimeout карусели (5000 мс): полоса успевает добежать до
   смены и не мешает её собственному затуханию. */
.header-carousel .owl-item.active .owl-carousel-inner::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 3px;
  z-index: 3;
  background: var(--gt-red);
  transform-origin: 0 50%;
  animation: gt-slide-timer 4.6s linear both;
}

@keyframes gt-slide-timer {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}

/* карусель на наведении и так встаёт (autoplayHoverPause) —
   полоса должна вставать вместе с ней */
.header-carousel:hover .owl-item.active .owl-carousel-inner::after {
  animation-play-state: paused;
}

/* на уходящем слайде полосу глушим: owl ждёт от него animationend
   своего затухания и чужое событие ему мешает */
.header-carousel .owl-item.owl-animated-out .owl-carousel-inner::after {
  animation: none !important;
}

/* миниатюры кадров: неактивные отходят в серый и уменьшаются,
   текущая выходит вперёд — сразу видно, сколько всего кадров */
@media (min-width: 992px) {
  .header-carousel .owl-dots .owl-dot {
    transform: scale(0.7);
    opacity: 0.55;
    filter: grayscale(1);
    transition:
      transform 0.5s var(--gt-ease),
      opacity 0.5s var(--gt-ease),
      filter 0.5s var(--gt-ease);
  }

  .header-carousel .owl-dots .owl-dot:hover {
    transform: scale(0.86) translateX(-5px);
    opacity: 1;
    filter: none;
  }

  .header-carousel .owl-dots .owl-dot.active {
    transform: scale(1);
    opacity: 1;
    filter: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .header-carousel .owl-item.active .owl-carousel-inner::after { display: none; }
  .header-carousel .owl-dots .owl-dot { transition: none; }
}

/* ---------- строки преимуществ на тёмном ---------- */
/* Пункты сливались друг с другом и никак не отвечали на курсор. */
.feature-wrap2 .row > .col-12 > .d-flex.align-items-center {
  position: relative;
}

.feature-wrap2 .row > .col-12 + .col-12 > .d-flex.align-items-center::before {
  content: "";
  position: absolute;
  top: -0.75rem;
  left: 0;
  right: 0;
  height: 1px;
  background: rgba(255, 255, 255, 0.16);
  transform-origin: 0 50%;
  transition: transform 0.85s var(--gt-ease) 0.12s;
}

.gt-reveal .feature-wrap2 .row > .col-12 + .col-12 > .d-flex.align-items-center::before {
  transform: scaleX(0);
}

.gt-reveal .feature-wrap2 .row > .col-12 + .col-12 > .d-flex.align-items-center.gt-in::before {
  transform: scaleX(1);
}

@media (hover: hover) and (min-width: 992px) {
  /* двигаем содержимое строки, а не строку: разделитель остаётся
     на месте и не сбивает вертикаль */
  .feature-wrap2 .row > .col-12 > .d-flex.align-items-center > * {
    transition:
      opacity 0.45s var(--gt-ease),
      transform 0.4s var(--gt-ease),
      box-shadow 0.4s var(--gt-ease);
  }

  .feature-wrap2 .row > .col-12 > .d-flex.align-items-center:hover > * {
    transform: translate3d(8px, 0, 0);
  }

  .feature-wrap2 .row > .col-12 > .d-flex.align-items-center:hover > .btn-lg-square {
    transform: translate3d(8px, 0, 0);
    box-shadow: 0 10px 30px rgba(184, 35, 35, 0.55);
  }
}

@media (prefers-reduced-motion: reduce) {
  .feature-wrap2 .row > .col-12 > .d-flex.align-items-center::before {
    transition: none;
  }
}

/* ---------- партнёры: стрелки ---------- */
/* Стрелки проявлялись только при наведении, значит на телефоне их не
   видел никто. При этом невидимая полоса .owl-nav (500x72, opacity 0,
   pointer-events auto) лежала поверх логотипа и перехватывала
   касание — свайп по карусели не работал. */
.testimonial-carousel .owl-nav,
.testimonial-carousel:hover .owl-nav {
  top: 50%;
  left: 50%;
  width: 100%;
  max-width: 100%;
  transform: translate(-50%, -50%);
  opacity: 1;
  pointer-events: none;
}

.testimonial-carousel .owl-nav .owl-prev,
.testimonial-carousel .owl-nav .owl-next {
  pointer-events: auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  height: 46px;
  font-size: 17px;
  border-radius: 50%;
  background: var(--bs-body-bg);
  opacity: 0.5;
  box-shadow:
    0 0 0 1px rgba(16, 18, 22, 0.08),
    0 8px 22px rgba(16, 18, 22, 0.14);
  transition:
    transform 0.3s var(--gt-ease),
    opacity 0.3s var(--gt-ease);
}

.testimonial-carousel:hover .owl-nav .owl-prev,
.testimonial-carousel:hover .owl-nav .owl-next {
  opacity: 1;
}

.testimonial-carousel .owl-nav .owl-prev:hover,
.testimonial-carousel .owl-nav .owl-next:hover {
  transform: scale(1.09);
}

[data-bs-theme="dark"] .testimonial-carousel .owl-nav .owl-prev,
[data-bs-theme="dark"] .testimonial-carousel .owl-nav .owl-next {
  box-shadow:
    0 0 0 1px rgba(255, 255, 255, 0.12),
    0 10px 24px rgba(0, 0, 0, 0.5);
}

@media (max-width: 767.98px) {
  /* на телефоне слайд один: держим стрелки по центру плашки логотипа
     и оставляем заметными — наведения там не бывает */
  .testimonial-carousel .owl-nav,
  .testimonial-carousel:hover .owl-nav {
    top: 118px;
  }

  .testimonial-carousel .owl-nav .owl-prev,
  .testimonial-carousel .owl-nav .owl-next {
    width: 40px;
    height: 40px;
    font-size: 15px;
    opacity: 0.9;
  }
}

@media (prefers-reduced-motion: reduce) {
  .testimonial-carousel .owl-nav .owl-prev:hover,
  .testimonial-carousel .owl-nav .owl-next:hover {
    transform: none;
  }
}

/* ---------- обложка внутренней страницы ---------- */
/* Раздел открывался заголовком на пустом фоне: слова выезжают
   из-под маски, и на этом движение первого экрана заканчивается.
   Линия раскрывается следом за словами и даёт заголовку опору. */
.component-wrap .section-title h1 {
  position: relative;
  padding-bottom: 1.1rem;
}

.component-wrap .section-title h1::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: clamp(72px, 11vw, 160px);
  height: 3px;
  border-radius: 2px;
  background: var(--gt-red);
  transform: scaleX(0);
  transform-origin: 0 50%;
  /* задержка равна времени, за которое договаривает последнее слово */
  transition: transform 0.7s var(--gt-ease) 0.3s;
}

/* :not(.gt-reveal) — страховка на случай, когда скрипт не отработал
   или у пользователя выключено движение: линия просто стоит на месте */
.component-wrap .section-title h1.gt-in::after,
html:not(.gt-reveal) .component-wrap .section-title h1::after {
  transform: scaleX(1);
}

/* ---------- список поставок: волна по колонкам ---------- */
/* markGroups раздал 128 карточкам общую задержку 180 мс, потому что
   считает их соседями одной строки. В итоге ряд вспыхивал разом
   и с паузой. Раскладываем задержку по колонкам — ряд собирается
   слева направо. !important нужен потому, что markGroups пишет
   задержку в инлайн-стиль элемента. */
@media (min-width: 1200px) {
  .marker-tags .row > [class*="col-"]:nth-child(3n + 1) {
    transition-delay: 0ms !important;
  }
  .marker-tags .row > [class*="col-"]:nth-child(3n + 2) {
    transition-delay: 80ms !important;
  }
  .marker-tags .row > [class*="col-"]:nth-child(3n) {
    transition-delay: 160ms !important;
  }
}

/* до 1200 px сетка двухколоночная — шаг другой */
@media (min-width: 992px) and (max-width: 1199.98px) {
  .marker-tags .row > [class*="col-"]:nth-child(2n + 1) {
    transition-delay: 0ms !important;
  }
  .marker-tags .row > [class*="col-"]:nth-child(2n) {
    transition-delay: 90ms !important;
  }
}

/* на телефоне карточки идут в один столбик:
   любая задержка там — просто ожидание */
@media (max-width: 991.98px) {
  .marker-tags .row > [class*="col-"] {
    transition-delay: 0ms !important;
  }
}

/* ---------- мобильное меню ---------- */
/* Меню раскрывалось разом готовым куском, а бургер оставался бургером
   при открытом меню — нечем закрыть. Классы show и aria-expanded
   ставит сам бутстрап, скрипт не нужен. */
@keyframes gt-menu-in {
  from { opacity: 0; transform: translate3d(0, -0.6rem, 0); }
  to   { opacity: 1; transform: none; }
}

@media (max-width: 1199.98px) {
  #navbarCollapse.show .navbar-nav > .nav-item {
    animation: gt-menu-in 0.36s var(--gt-ease) both;
  }
  #navbarCollapse.show .navbar-nav > .nav-item:nth-child(1) { animation-delay: 0.02s; }
  #navbarCollapse.show .navbar-nav > .nav-item:nth-child(2) { animation-delay: 0.06s; }
  #navbarCollapse.show .navbar-nav > .nav-item:nth-child(3) { animation-delay: 0.10s; }
  #navbarCollapse.show .navbar-nav > .nav-item:nth-child(4) { animation-delay: 0.14s; }
  #navbarCollapse.show .navbar-nav > .nav-item:nth-child(5) { animation-delay: 0.18s; }
  #navbarCollapse.show .navbar-nav > .nav-item:nth-child(6) { animation-delay: 0.22s; }
  /* хвост списка не растягиваем: длинная лесенка начинает тормозить */
  #navbarCollapse.show .navbar-nav > .nav-item:nth-child(n + 7) { animation-delay: 0.26s; }

  /* бургер разворачивается и подменяется крестиком */
  [data-bs-target="#navbarCollapse"] i {
    transition: transform var(--gt-mid) var(--gt-ease);
  }
  [data-bs-target="#navbarCollapse"][aria-expanded="true"] i {
    transform: rotate(90deg);
  }
  [data-bs-target="#navbarCollapse"][aria-expanded="true"] i.fa-bars::before {
    content: "\f00d"; /* fa-xmark, FontAwesome 6 Free — на сайте подключён */
  }
}

@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {
  #navbarCollapse.show .navbar-nav > .nav-item { animation: none; }
  [data-bs-target="#navbarCollapse"] i { transition: none; }
}

/* ---------- читаемость шапки поверх кадра ---------- */
/* Белый знак и белые пункты меню лежат на фотографии цеха: кадры
   бывают светлыми, поэтому под текстом нужна мягкая тень. Тёмная
   растяжка сверху помогает, но одной её мало. */
@media (min-width: 1200px) {
  .gt-home .navbar.sticky-top:not(.gt-stuck) .navbar-brand img {
    filter: drop-shadow(0 2px 10px rgba(0, 0, 0, 0.55));
  }

  .gt-home .navbar.sticky-top:not(.gt-stuck) .navbar-nav .nav-link {
    text-shadow: 0 1px 10px rgba(0, 0, 0, 0.5);
  }
}

/* на узком экране «высокотехнологичное» не влезало в строку и рвалось
   посреди слова — уменьшаем кегль первого экрана, перенос уходит */
@media (max-width: 575.98px) {
  .owl-carousel-inner h1,
  .owl-carousel-inner h2,
  .owl-carousel-inner .display-1,
  .owl-carousel-inner .display-2,
  .owl-carousel-inner .display-3 {
    font-size: clamp(1.55rem, 6.6vw, 2rem) !important;
    line-height: 1.12;
  }
}

/* ============================================================
   Внутренние страницы: текст перестаёт быть вордовским документом
   ============================================================ */

/* Перечни занимали до семидесяти процентов страницы и шли сплошной
   лентой с точками. Раскладываем их плитками с номерами: страница
   получает структуру, а читать становится можно по диагонали. */
.component-wrap .content > ul,
.item-page .content > ul {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 290px), 1fr));
  gap: 0.9rem;
  max-width: none;
  margin: 1.8rem 0 2.4rem;
  padding: 0;
  list-style: none;
  counter-reset: gt-li;
}

.component-wrap .content > ul > li,
.item-page .content > ul > li {
  counter-increment: gt-li;
  /* номер стоял абсолютом и на узких карточках залезал на рамку.
     Теперь это обычный элемент строки — уехать ему некуда. */
  display: flex;
  align-items: baseline;
  gap: 0.8rem;
  margin: 0;
  padding: 1.35rem;
  background: var(--bs-body-bg);
  border: 1px solid rgba(16, 18, 22, 0.08);
  border-radius: var(--gt-radius);
  box-shadow: var(--gt-shadow-1);
  font-size: 0.99rem;
  line-height: 1.5;
  transition:
    transform var(--gt-mid) var(--gt-ease),
    box-shadow var(--gt-mid) var(--gt-ease),
    border-color var(--gt-mid) var(--gt-ease);
}

.component-wrap .content > ul > li::marker,
.item-page .content > ul > li::marker {
  content: "";
}

/* номер плитки: тот же приём, что у разделов на главной */
.component-wrap .content > ul > li::before,
.item-page .content > ul > li::before {
  content: counter(gt-li) ".";
  flex: 0 0 auto;
  margin: 0;
  min-width: 1.1rem;
  font-size: 0.95rem;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  color: var(--gt-red);
  /* рамка вокруг цифры давала волосяную линию в полтора пикселя:
     на дробных координатах браузер обрезал ей то одну сторону, то
     другую, и номера выглядели кривыми. Цифре рамка не нужна. */
  border: 0;
  padding: 0;
  opacity: 1;
}

.component-wrap .content > ul > li:hover,
.item-page .content > ul > li:hover {
  transform: translateY(-3px);
  border-color: rgba(184, 35, 35, 0.32);
  box-shadow: var(--gt-shadow-2);
}

[data-bs-theme="dark"] .component-wrap .content > ul > li,
[data-bs-theme="dark"] .item-page .content > ul > li {
  background: rgba(var(--bs-secondary-bg-rgb), 0.5);
  border-color: rgba(255, 255, 255, 0.09);
}

/* нумерованные перечни оставляем списком: там важен порядок шагов,
   плитки сбили бы последовательность */
.component-wrap .content > ol,
.item-page .content > ol {
  padding-left: 1.4rem;
}

/* абзац, набранный жирным, — это подзаголовок, набранный руками:
   в тексте таких несколько, и они теряются между обычными абзацами */
.component-wrap .content > p > strong:only-child,
.item-page .content > p > strong:only-child {
  display: block;
  margin-top: 1.6rem;
  font-size: clamp(1.1rem, 1.35vw, 1.32rem);
  line-height: 1.3;
  letter-spacing: -0.015em;
}

@media (prefers-reduced-motion: reduce) {
  .component-wrap .content > ul > li:hover,
  .item-page .content > ul > li:hover {
    transform: none;
  }
}

/* ============================================================
   Главная: усиление
   ============================================================ */

/* Цифры — самое сильное место страницы, но набраны были вровень
   с заголовками. У референса это огромные числа во всю высоту блока. */
.feature-wrap h1 {
  font-size: clamp(3rem, 5.4vw, 5.2rem) !important;
  line-height: 0.95;
  letter-spacing: -0.045em;
}

.feature-wrap .row > [class*="col-"] {
  padding-top: 2rem;
  padding-bottom: 2rem;
}

.feature-wrap h5 {
  font-size: clamp(1.02rem, 1.25vw, 1.2rem);
  margin-top: 0.35rem;
}

/* заголовки секций на главной набираем ещё крупнее: страница
   должна читаться с расстояния, как обложка, а не как документ */
.container-xxl h1,
.about-text h1,
.feature-text h1,
.quote-text h1 {
  font-size: clamp(2.2rem, 4vw, 3.9rem) !important;
}

/* фотография в «О компании» наезжает при появлении, а не просто
   проявляется — блок перестаёт быть статичной иллюстрацией */
.about-wrap .cover,
.feature-wrap2 .cover {
  overflow: hidden;
}

.gt-reveal .about-wrap .cover img,
.gt-reveal .feature-wrap2 .cover img {
  transform: scale(1.12);
  transition: transform 1.4s var(--gt-ease);
}

.gt-reveal .about-wrap.gt-in .cover img,
.gt-reveal .about-wrap .gt-in .cover img,
.gt-reveal .feature-wrap2 .gt-in .cover img {
  transform: scale(1);
}

/* галочки в списке направлений подаются вперёд по очереди */
.about-text .d-flex,
.about-text li {
  transition: transform var(--gt-fast) var(--gt-ease);
}

.about-text .d-flex:hover,
.about-text li:hover {
  transform: translateX(5px);
}

@media (prefers-reduced-motion: reduce) {
  .gt-reveal .about-wrap .cover img,
  .gt-reveal .feature-wrap2 .cover img {
    transform: none;
  }
}

/* наезд кадра увеличивает картинку — держим её внутри карусели,
   иначе на узких экранах появляется прокрутка вбок */
.carousel-wrap,
.header-carousel .owl-stage-outer {
  overflow: hidden;
}

/* Заголовки разбиты на слова, а маска слова не переносится: на узком
   экране самое длинное слово вылезало на несколько пикселей и давало
   прокрутку вбок. Уменьшаем кегль там, где строка короткая. */
@media (max-width: 575.98px) {
  .container-xxl h1,
  .container-fluid h1,
  .about-text h1,
  .feature-text h1,
  .quote-text h1,
  .component-wrap .section-title h1 {
    font-size: clamp(1.5rem, 6.4vw, 1.95rem) !important;
  }

  .feature-wrap h1 {
    font-size: clamp(2.4rem, 12vw, 3.2rem) !important;
  }
}

/* ============================================================
   Перестройка структуры страниц
   ============================================================ */

/* ---------- список направлений на главной ---------- */
/* Были галочки-кружки из шаблона: мелкие, все одинаковые, взгляд по
   ним не идёт. Ставим тот же язык, что на внутренних страницах —
   номер в рамке и разделительная линия. */
.about-text .content > ul,
.feature-text .content > ul {
  list-style: none;
  padding-left: 0;
  margin-top: 1.4rem;
  counter-reset: gt-dir;
}

.about-text .content > ul > li,
.feature-text .content > ul > li {
  counter-increment: gt-dir;
  display: flex;
  align-items: baseline;
  gap: 0.9rem;
  padding: 0.85rem 0;
  border-top: 1px solid var(--bs-border-color);
  text-align: left !important;
  transition:
    background-color var(--gt-fast) var(--gt-ease),
    padding-left var(--gt-fast) var(--gt-ease);
}

.about-text .content > ul > li:last-child,
.feature-text .content > ul > li:last-child {
  border-bottom: 1px solid var(--bs-border-color);
}

.about-text .content > ul > li::marker,
.feature-text .content > ul > li::marker {
  content: "";
}

.about-text .content > ul > li::before,
.feature-text .content > ul > li::before {
  content: counter(gt-dir, decimal-leading-zero);
  flex: 0 0 auto;
  margin: 0;
  font-size: 0.74rem;
  font-weight: 800;
  letter-spacing: 0.04em;
  color: var(--gt-red);
  border: 1.5px solid currentColor;
  border-radius: 4px;
  padding: 0.2rem 0.42rem;
}

.about-text .content > ul > li:hover,
.feature-text .content > ul > li:hover {
  padding-left: 0.4rem;
  background: var(--gt-red-50);
}

/* ---------- «Оборудование»: крупная сетка вместо строк ---------- */
/* Раздел был вертикальной лентой из широких строк: фотография слева,
   текст справа, и так двенадцать раз подряд — тот же вордовский
   документ, только с картинками. Собираем витриной: снимок сверху,
   подпись под ним. Текст поверх фотографии здесь не годится —
   описания длинные и на светлых кадрах не читаются. */
@media (min-width: 992px) {
  /* карточки лежат прямо в .container рядом с заголовком и крошками,
     поэтому сеткой делаем контейнер, а всё некарточное растягиваем */
  .component-wrap .gt-cards {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1.6rem;
    align-items: stretch;
  }

  .component-wrap .gt-cards > *:not(.service-item) {
    grid-column: 1 / -1;
  }

  /* служебная форма сортировки товаров ячейку сетки не занимает */
  .component-wrap .jshop_list_product > form#sort_count {
    display: none;
  }

  .component-wrap .gt-cards .service-item.row {
    display: flex !important;
    flex-direction: column;
    margin: 0 !important;
    height: 100%;
    overflow: hidden;
    border-radius: var(--gt-radius) !important;
    transition:
      transform var(--gt-mid) var(--gt-ease),
      box-shadow var(--gt-mid) var(--gt-ease);
  }

  .component-wrap .gt-cards .service-item.row > [class*="col-"] {
    width: 100% !important;
    max-width: none !important;
    flex: none !important;
    padding: 0 !important;
  }

  /* кадр 4:3 — как у самих фотографий (91% ровно 4:3), поэтому кадр
     показывает станок целиком, без «приближения» и обрезки сверху-снизу */
  .component-wrap .gt-cards .service-item.row .ratio {
    --bs-aspect-ratio: 75%;
    height: auto !important;
  }

  .component-wrap .gt-cards .service-item.row > [class*="col-"]:last-child {
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    padding: 1.15rem 1.25rem 1.35rem !important;
  }

  .component-wrap .gt-cards .service-item.row h3,
  .component-wrap .gt-cards .service-item.row h4,
  .component-wrap .gt-cards .service-item.row h5,
  .component-wrap .gt-cards .service-item.row .service-title {
    font-size: clamp(1.02rem, 1.2vw, 1.24rem);
    line-height: 1.25;
    margin: 0 0 0.4rem;
  }

  .component-wrap .gt-cards .service-item.row:hover {
    transform: translateY(-4px);
    box-shadow: var(--gt-shadow-3) !important;
  }

  .component-wrap .gt-cards .service-item.row img {
    transition: transform 0.6s var(--gt-ease);
  }

  .component-wrap .gt-cards .service-item.row:hover img {
    transform: scale(1.05);
  }
}


/* фотография должна заполнять кадр плитки, а не висеть с полями */
@media (min-width: 992px) {
  .component-wrap .gt-cards .service-item.row .ratio img,
  .component-wrap .gt-cards .service-item.row .ratio .image-bg,
  .component-wrap .gt-cards .service-item.row .ratio .image-wrapper,
  .component-wrap .gt-cards .service-item.row .ratio .image-inner {
    position: absolute;
    inset: 0;
    width: 100% !important;
    height: 100% !important;
    max-width: none;
    object-fit: cover;
  }

  .component-wrap .gt-cards .service-item.row > [class*="col-"]:last-child p {
    font-size: 0.9rem;
    line-height: 1.45;
    color: var(--bs-secondary-color);
    margin: 0;
  }
}

/* ============================================================
   Ритм главной: секции перестают быть одной белой лентой
   ============================================================ */

/* Разделы шли подряд на одном фоне, поэтому страница читалась
   сплошным полотном. Чередуем подложку и добавляем волосяную
   границу — на прокрутке видно, где кончается один раздел. */
.gt-home .projects-wrap {
  background: var(--bs-secondary-bg);
}

[data-bs-theme="dark"].gt-home .projects-wrap {
  background: rgba(var(--bs-secondary-bg-rgb), 0.4);
}

.gt-home .service-wrap,
.gt-home .projects-wrap,
.gt-home .testimonial-wrap,
.gt-home .feature-wrap {
  position: relative;
}

.gt-home .service-wrap::before,
.gt-home .projects-wrap::before,
.gt-home .testimonial-wrap::before {
  content: "";
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: min(1320px, 92vw);
  height: 1px;
  background: linear-gradient(
    to right,
    transparent,
    var(--bs-border-color) 18%,
    var(--bs-border-color) 82%,
    transparent
  );
}

/* блок с формой — самая важная точка страницы, отделяем его сильнее */
.gt-home .quote-text {
  position: relative;
}

@media (min-width: 992px) {
  .gt-home .quote-text {
    padding-left: 3rem;
  }

  .gt-home .quote-text::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0.6rem;
    bottom: 0.6rem;
    width: 3px;
    border-radius: 2px;
    background: linear-gradient(
      to bottom,
      var(--gt-red),
      rgba(184, 35, 35, 0)
    );
  }
}

/* ============================================================
   Прокрутка должна быть обычной
   ============================================================ */

/* Бутстрап включает scroll-behavior: smooth на :root — из-за этого
   страница едет с задержкой на любое действие: колесо, клавиши,
   переход по якорю, кнопку «наверх». Возвращаем обычное поведение. */
:root,
html,
body,
[data-bs-theme="light"],
[data-bs-theme="dark"] {
  scroll-behavior: auto !important;
}

/* появление блоков — короче: длинный переход читается как задержка
   при листании, особенно когда блоков на экране несколько */
.gt-reveal .gt-anim.gt-in {
  transition:
    opacity 0.42s cubic-bezier(0.22, 1, 0.32, 1),
    transform 0.62s cubic-bezier(0.19, 1.12, 0.3, 1);
}

.gt-word > span {
  transition: transform 0.45s var(--gt-ease);
}

/* ============================================================
   Разбор замечаний по внутренним страницам
   ============================================================ */

/* ---------- короткие перечни — обычным столбиком ---------- */
/* Перечисления вроде «Список поставляемого оборудования» — это
   короткие строки в одну-две. Плитками они превращались в поле
   почти пустых прямоугольников. Ставим их столбиком: читается
   сверху вниз, ничего не гуляет. */
.component-wrap .content > ul.gt-list-plain,
.item-page .content > ul.gt-list-plain {
  display: block;
  max-width: 62rem;
  margin: 1.4rem 0 2.2rem;
}

.component-wrap .content > ul.gt-list-plain > li,
.item-page .content > ul.gt-list-plain > li {
  padding: 0.72rem 0.2rem;
  background: none;
  border: 0;
  border-bottom: 1px solid var(--bs-border-color);
  border-radius: 0;
  box-shadow: none;
  gap: 0.85rem;
}

.component-wrap .content > ul.gt-list-plain > li:first-child,
.item-page .content > ul.gt-list-plain > li:first-child {
  border-top: 1px solid var(--bs-border-color);
}

.component-wrap .content > ul.gt-list-plain > li:hover,
.item-page .content > ul.gt-list-plain > li:hover {
  transform: none;
  box-shadow: none;
  border-color: var(--bs-border-color);
  background: var(--gt-red-50);
}

.component-wrap .content > ul.gt-list-plain > li::before,
.item-page .content > ul.gt-list-plain > li::before {
  border: 0;
  padding: 0;
  min-width: 1.7rem;
  opacity: 1;
}

/* ---------- реквизиты ---------- */
/* Шли сплошным столбцом одинаковых абзацев, взгляду не за что
   зацепиться. Ставим тире в начало каждой строки. */
.item-page .content > p.gt-req,
.component-wrap .content > p.gt-req,
.blog-item .content > p.gt-req,
.gt-req {
  display: flex;
  gap: 0.6rem;
  margin-bottom: 0.5rem;
  /* красная строка тут не нужна: она отодвигала текст от тире и
     ломала выравнивание второй строки длинного адреса */
  text-indent: 0;
}

.gt-req::before {
  content: "—";
  flex: 0 0 auto;
  color: var(--gt-red);
}

.gt-req-head {
  margin-bottom: 0.9rem;
}

/* ---------- подпись разработчика шаблона в подвале ---------- */
.copyright #copyright-2 {
  display: none;
}

.copyright #copyright {
  width: 100%;
  flex: 0 0 100%;
  max-width: 100%;
  text-align: center;
}

/* ---------- шапка на широких экранах ---------- */
/* Кнопка «Оборудование на складе» включалась с 1400px, но целиком
   помещалась только с 1660px: между этими значениями её сплющивало
   до нулевой ширины, а на 1600px строка вылезала за край окна и
   появлялась горизонтальная прокрутка. */
.navbar .button-wrap {
  flex: 0 0 auto;
}


/* ---------- фотографии увеличиваются под курсором ---------- */
/* Заказчик просил, чтобы снимки оживали при наведении. */
.jg-images .jg-image-thumbnail,
.blog .item-image,
.newsflash-image {
  overflow: hidden;
  border-radius: var(--gt-radius);
}

.jg-images .jg-image-thumbnail img,
.blog .item-image img,
.newsflash-image img {
  display: block;
  width: 100%;
  transition: transform 0.5s var(--gt-ease);
}

.jg-images .jg-image-thumbnail:hover img,
.blog .item-image:hover img,
.newsflash-image:hover img {
  transform: scale(1.06);
}

@media (prefers-reduced-motion: reduce) {
  .jg-images .jg-image-thumbnail:hover img,
  .blog .item-image:hover img,
  .newsflash-image:hover img {
    transform: none;
  }
}

/* ---------- шапки секций на главной ---------- */
/* В шаблоне ширина заголовка зашита в разметку: max-width 600px.
   Длинное название разваливалось на пять строк узкой колонкой, и
   секция выглядела полупустой. Даём заголовку нормальную ширину. */
.container-xxl .text-center.mx-auto {
  max-width: 60rem !important;
}

@media (min-width: 768px) {
  .container-xxl .text-center.mx-auto h1,
  .container-xxl .text-center.mx-auto .h1 {
    font-size: clamp(1.9rem, 3.4vw, 2.9rem);
    line-height: 1.12;
  }
}

/* ---------- проявление фотографий: возврат масштаба ---------- */
/* Снимок при появлении отъезжает с 1.06 до 1. Для карточек каталога
   сброс не срабатывал: у правила, которое задаёт увеличение, оказался
   более длинный путь до картинки, и оно перебивало возврат. Снимки
   так и оставались увеличенными, а наведение их уменьшало вместо
   увеличения. Возвращаем масштаб тем же путём. */
.gt-reveal .gt-anim.gt-in .ratio > a > .position-relative > img {
  transform: scale(1);
}

/* наведение теперь всегда крупнее исходного размера */
.service-item:hover .ratio > a > .position-relative > img,
.service-item:hover .ratio img,
.service-item:hover img {
  transform: scale(1.07);
}

.service-wrap .row > [class*="col-"]:hover .service-item .ratio > a > .position-relative > img {
  transform: scale(1.07);
}

/* ---------- карточка под курсором крупнее соседей ---------- */
/* Заказчик просил этого прямо: наводишь — карточка выходит вперёд.
   Правила появления задают собственный transform, поэтому здесь
   селекторы заведомо тяжелее, иначе наведение до карточки не доходит. */
@media (min-width: 992px) and (hover: hover) {
  .gt-reveal .projects-wrap .row > [class*="col-"],
  .gt-reveal .service-wrap .row > [class*="col-"] {
    transition:
      transform 0.4s var(--gt-ease),
      box-shadow 0.4s var(--gt-ease);
  }

  .gt-reveal .projects-wrap .row:hover > [class*="col-"].gt-anim.gt-in,
  .gt-reveal .service-wrap .row:hover > [class*="col-"].gt-anim.gt-in {
    transform: scale(0.984);
  }

  .gt-reveal .projects-wrap .row > [class*="col-"].gt-anim.gt-in:hover,
  .gt-reveal .service-wrap .row > [class*="col-"].gt-anim.gt-in:hover {
    transform: scale(1.038);
    z-index: 5;
  }
}


/* ---------- значки в перечнях направлений ---------- */
/* Набор Font Awesome подключён самим шаблоном, свои файлы не нужны.
   Какой значок какому пункту — решает refresh.js по смыслу текста. */
.component-wrap .content > ul.gt-list-icons > li::before,
.item-page .content > ul.gt-list-icons > li::before {
  content: var(--gt-icon, "\f111");
  font-family: "Font Awesome 6 Free";
  font-weight: 900;
  font-size: 1.05rem;
  line-height: 1;
  min-width: 1.6rem;
  text-align: center;
  color: var(--gt-red);
  position: relative;
  top: 0.12rem;
}

.component-wrap .content > ul.gt-list-icons > li,
.item-page .content > ul.gt-list-icons > li {
  gap: 0.95rem;
}

/* ---------- перечни на главной: точки вместо номеров ---------- */
/* Это не последовательность шагов, а просто перечисление. Номер здесь
   обещает порядок, которого нет. */
.about-text .content > ul > li::before,
.feature-text .content > ul > li::before {
  content: "";
  width: 7px;
  height: 7px;
  min-width: 7px;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: var(--gt-red);
  align-self: flex-start;
  position: relative;
  top: 0.62rem;
}

.about-text .content > ul > li,
.feature-text .content > ul > li {
  gap: 0.85rem;
}

/* ---------- длинные перечни: номер без ведущего нуля ---------- */
.component-wrap .content > ul.gt-list-plain > li::before,
.item-page .content > ul.gt-list-plain > li::before {
  content: counter(gt-li) ".";
  min-width: 1.6rem;
}

/* ---------- страница с единственным разделом ---------- */
/* Одинокая «01» рядом с надзаголовком ничего не нумерует. */
.gt-one-section h6.text-primary::before {
  display: none;
}

/* ---------- кнопка не должна липнуть к тексту ---------- */
/* «Подробнее» стояла сразу под последней строкой описания. Отодвигаем
   её и заодно прижимаем к низу карточки: в ряду описания разной длины,
   и без этого кнопки скакали бы по высоте. */
.gt-cards .service-item > [class*="col-"]:last-child > div {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
}

.gt-cards .service-item .btn,
.header-carousel .owl-carousel-inner .btn,
.blog .btn.rounded-pill,
.item-page .btn.rounded-pill {
  margin-top: 1.5rem;
  align-self: flex-start;
}

.gt-cards .service-item .btn {
  padding-top: 0.75rem !important;
  padding-bottom: 0.75rem !important;
}

.gt-cards .service-item .content,
.gt-cards .service-item .content + * {
  margin-bottom: 1.2rem;
}

/* ============================================================
   Логотип ГофроДетейл — вместо белой картинки, меняется по теме
   ============================================================ */
/* Была белая JPG-картинка (лого + QR): на тёмной теме она светилась
   белым прямоугольником, на светлой — спорила с обновлённым фоном.
   Само лого — чёрная графика, поэтому красим его текущим цветом текста
   через маску: на светлой теме тёмное, на тёмной — светлое. QR держим
   на белом чипе, иначе он перестанет сканироваться. */
.gt-deteil {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: clamp(1.4rem, 4vw, 2.8rem);
  flex-wrap: wrap;
  margin: 1.6rem auto 0.6rem;
  padding: 1.6rem 1.8rem;
  max-width: 32rem;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--gt-radius);
  background: var(--bs-body-bg);
}

.gt-deteil-logo {
  display: block;
  width: clamp(150px, 20vw, 200px);
  aspect-ratio: 289 / 154;
  background-color: currentColor;
  color: var(--bs-body-color);
  -webkit-mask: url("../../../../../images/brand/gofrodeteil-logo.png") center / contain no-repeat;
  mask: url("../../../../../images/brand/gofrodeteil-logo.png") center / contain no-repeat;
  transition: opacity var(--gt-fast) var(--gt-ease);
}

.gt-deteil-logo:hover {
  opacity: 0.72;
}

.gt-deteil-qr {
  display: block;
  flex: 0 0 auto;
  padding: 7px;
  background: #fff;
  border-radius: 10px;
  line-height: 0;
  box-shadow: var(--gt-shadow-1);
}

.gt-deteil-qr img {
  display: block;
  width: clamp(96px, 12vw, 118px);
  height: auto;
}

@media (max-width: 420px) {
  .gt-deteil {
    padding: 1.2rem;
  }
}

/* ============================================================
   Наведение: элемент увеличивается ЦЕЛИКОМ и выходит за рамки
   ============================================================ */
/* Раньше внутри карточки увеличивалась картинка, а рамка её обрезала —
   получался зум-кроп. Теперь при наведении растёт весь блок и всплывает
   над соседями. Ячейки сеток по краям не обрезают, поэтому блок реально
   выходит за свои границы. */
@media (hover: hover) {
  /* --- каталожные карточки --- */
  .gt-cards .service-item.row {
    transition:
      transform 0.35s var(--gt-ease),
      box-shadow 0.35s var(--gt-ease) !important;
    will-change: transform;
  }
  .gt-cards .service-item.row:hover {
    transform: scale(1.07) !important;
    z-index: 6;
    box-shadow: var(--gt-shadow-3) !important;
  }
  /* внутреннюю картинку больше не зумим отдельно — иначе снова кроп */
  .gt-cards .service-item.row:hover img,
  .gt-cards .service-item.row:hover .ratio img {
    transform: none !important;
  }

  /* --- каталог/проекты на главной --- */
  .service-wrap .row > [class*="col-"],
  .projects-wrap .row > [class*="col-"] {
    transition: transform 0.35s var(--gt-ease), z-index 0s;
  }
  .service-wrap .row > [class*="col-"]:hover,
  .projects-wrap .row > [class*="col-"]:hover {
    z-index: 6;
  }
  .service-wrap .service-item:hover img,
  .service-wrap .service-item:hover .ratio img,
  .projects-wrap .service-item:hover img {
    transform: none !important;
  }

  /* --- фотогалерея --- */
  /* Колонка галереи — элемент флекса, а он рисуется целиком, как
     строчный блок: поднятая внутри него карточка всё равно оставалась
     под следующей колонкой. Поэтому слой поднимаем у самой колонки. */
  .jg-images > .jg-image {
    position: relative;
    z-index: 1;
  }

  .jg-images > .jg-image:has(.jg-image-thumbnail:hover) {
    z-index: 20;
  }

  .jg-images .jg-image-thumbnail {
    transition: transform 0.4s var(--gt-ease), box-shadow 0.4s var(--gt-ease);
    will-change: transform;
  }
  .jg-images .jg-image-thumbnail:hover {
    transform: scale(1.13);
    z-index: 6;
    box-shadow: var(--gt-shadow-3);
    position: relative;
  }
  .jg-images .jg-image-thumbnail:hover img {
    transform: none !important;
  }

  /* --- плитки в модалке «Оборудование» --- */
  .modal .thumbnail,
  .joomla-modal img.thumbnail {
    transition: transform 0.32s var(--gt-ease), box-shadow 0.32s var(--gt-ease);
    transform-origin: center;
    will-change: transform;
  }
  .modal a:hover .thumbnail,
  .modal .d-flex:hover .thumbnail {
    transform: scale(1.22);
    box-shadow: var(--gt-shadow-3);
    position: relative;
    z-index: 3;
  }

  /* --- миниатюры новостей в боковой колонке --- */
  #sidebar-inner .d-flex {
    transition: transform 0.3s var(--gt-ease);
  }
  #sidebar-inner .d-flex:hover {
    transform: scale(1.03);
    z-index: 4;
    position: relative;
  }
  #sidebar-inner .d-flex:hover .pe-3 img {
    transform: none !important;
  }
}

@media (prefers-reduced-motion: reduce) {
  .gt-cards .service-item.row:hover,
  .jg-images .jg-image-thumbnail:hover,
  .modal a:hover .thumbnail,
  #sidebar-inner .d-flex:hover {
    transform: none !important;
  }
}

/* ---------- колонка новостей: миниатюры одного размера ---------- */
/* Колонка со снимком — флекс-элемент и сжималась тем сильнее, чем
   длиннее заголовок рядом; к тому же у снимков разные пропорции.
   Кадр фиксированный, снимок заполняет его по центру. */
#sidebar-inner .d-flex > .pe-3 {
  flex: 0 0 auto;
}

#sidebar-inner .d-flex > .pe-3 img {
  display: block;
  width: 120px !important;
  height: 86px !important;
  max-width: none !important;
  object-fit: cover;
  object-position: center;
}

/* ---------- модалка «Оборудование»: ровная таблица разделов ---------- */
/* Колонка со снимком — обычный элемент флекса, и он сжимался тем
   сильнее, чем длиннее название рядом: кадры получались все разного
   размера, а названия начинались на разном расстоянии от края.
   Задаём кадру постоянный размер и запрещаем сжатие. */
/* Только модалка с плитками разделов (есть миниатюры). Раньше правила
   цеплялись ко всем модалкам, и в форме обратной связи колонки
   становились флексом: поля ужимались до своей «естественной» ширины. */
.modal .modal-body .d-flex:has(> .pe-3 img.thumbnail) > .pe-3 {
  flex: 0 0 auto;
}

.modal .modal-body .d-flex:has(> .pe-3 img.thumbnail) {
  align-items: center;
}

.modal .modal-body img.thumbnail {
  width: 124px;
  height: 88px;
  max-width: none;
  object-fit: cover;
}

.modal .modal-body .row > [class*="col-"]:has(img.thumbnail) {
  display: flex;
}

.modal .modal-body .row > [class*="col-"]:has(img.thumbnail) > .d-flex {
  width: 100%;
}


/* увеличенная под курсором плитка должна выходить поверх соседних:
   колонка — элемент флекса, поэтому слой поднимаем именно у неё */
@media (min-width: 992px) and (hover: hover) {
  .modal .modal-body .row > [class*="col-"]:has(img.thumbnail) {
    position: relative;
    z-index: 1;
  }

  .modal .modal-body .row > [class*="col-"]:has(img.thumbnail):hover {
    z-index: 20;
  }
}

/* ---------- встроенные видео и рамки не должны вылезать ---------- */
/* На части страниц товара в тексте вставлен iframe фиксированной ширины
   (видео работы линии). На телефоне он вылезал за край и создавал
   горизонтальную прокрутку. Прижимаем к ширине контейнера. */
/* Ролики вставлены в текст обычным блоком с width=720 в атрибуте, и на
   части страниц этот блок оказывается прямым потомком body — вне
   обёртки контента. Поэтому целимся по адресу видеосервиса глобально,
   без привязки к родителю. Карту Яндекса это не трогает (она не iframe). */
iframe[src*="youtube"],
iframe[src*="youtu.be"],
iframe[src*="rutube"],
iframe[src*="vk.com"],
iframe[src*="vkvideo"],
iframe[src*="vimeo"],
iframe[src*="dzen"] {
  width: 100% !important;
  max-width: 640px !important;
  aspect-ratio: 16 / 9;
  height: auto !important;
  border: 0;
  border-radius: var(--gt-radius);
  display: block;
  margin: 0.6rem 0;
}

/* ---------- широкие таблицы: прокрутка внутри контейнера ---------- */
/* Шаблон уже кладёт таблицы характеристик в .scrollbox — но без самой
   прокрутки, поэтому на телефоне они распирали страницу. Включаем. */
.scrollbox,
.gt-table-scroll {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  max-width: 100%;
  margin: 1.2rem 0 1.8rem;
  border-radius: var(--gt-radius);
}

.gt-table-scroll > table {
  margin: 0;
}

/* длинные неразрывные строки (модели, размеры) не должны распирать текст */
.content,
.item-page .content,
.component-wrap .content {
  overflow-wrap: break-word;
}

/* ---------- содержимое страницы не выпускает прокрутку вбок ---------- */
/* Единая страховка от горизонтальной прокрутки: что бы ни оказалось
   шире экрана (длинная строка в списке, таблица без обёртки, встройка),
   секция контента подрезает лишнее по горизонтали. Внутренние
   контейнеры с прокруткой (таблицы характеристик) при этом работают:
   у них своя прокрутка. Шапка и полоса прогресса не затронуты — они
   вне этого контейнера. clip (а не hidden) не плодит лишних скроллов. */
.container-xxl.component-wrap {
  overflow-x: clip;
}

/* длинные неразрывные строки переносим и в списках, и в описаниях */
.component-wrap li,
.component-wrap p,
.about-text,
.about-text * {
  overflow-wrap: break-word;
  word-break: normal;
}

/* ============================================================
   Страница товара: убираем дубль текста, чистим структуру
   ============================================================ */
@media (min-width: 992px) {
  .gt-hero .about-text .p-lg-5,
  .gt-hero .about-text .p-4 {
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: flex-start;
    gap: 1.2rem;
  }

  .gt-hero .about-text .mod-custom .text-center {
    text-align: left !important;
  }
}

/* ---------- переключатели моделей (2GL100, 2GL120…) ---------- */
/* Плагин вкладок собирает свою разметку: ряд кнопок, стрелки прокрутки
   и контейнер панелей. Своих стилей в нашей копии у него нет, поэтому
   оформляем сами — как на действующем сайте: активная модель красной
   таблеткой, остальные серыми. */
[data-rlta-element="button-list"] {
  display: flex;
  flex-wrap: wrap;
  gap: 0.55rem;
  margin: 1.3rem 0 0.2rem;
  padding: 0;
  list-style: none;
}

[data-rlta-element="button"] {
  padding: 0.62rem 1.25rem;
  border: 1px solid var(--bs-border-color);
  border-radius: 999px;
  background: var(--bs-secondary-bg);
  color: var(--bs-body-color);
  font-weight: 700;
  font-size: 0.95rem;
  line-height: 1.1;
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
  transition:
    background-color var(--gt-fast) var(--gt-ease),
    color var(--gt-fast) var(--gt-ease),
    border-color var(--gt-fast) var(--gt-ease),
    transform var(--gt-fast) var(--gt-ease);
}

[data-rlta-element="button"]:hover {
  border-color: rgba(184, 35, 35, 0.5);
  transform: translateY(-1px);
}

[data-rlta-element="button"][data-rlta-state="open"] {
  background: var(--gt-red);
  border-color: var(--gt-red);
  color: #fff;
}

[data-rlta-element="button"] [data-rlta-element="heading"] {
  font: inherit;
  color: inherit;
}

/* стрелки прокрутки ряда кнопок нужны только когда моделей много */
[data-rlta-element="button-scroller"] {
  display: none;
}

[data-rlta-element="panels"] {
  width: 100%;
}

[data-rlta-element="panel"][data-rlta-state="closed"] {
  display: none;
}

[data-rlta-element="panel-content"] > h3 {
  font-size: clamp(1.15rem, 1.5vw, 1.4rem);
  margin: 1.4rem 0 0.8rem;
}


/* ============================================================
   Каталог разделов — лентой, как на действующем сайте
   ============================================================ */
/* Заказчик попросил вернуть привычную ленту: снимок слева, название и
   описание справа, по одному разделу в строку. Плитками в три колонки
   остаются только разделы «Проектирование и внедрение …». Оформление
   при этом наше: скругления, подсветка и увеличение под курсором. */
@media (min-width: 992px) {
  .component-wrap .gt-rows .service-item.row {
    align-items: stretch;
    margin: 0 0 1.6rem !important;
    overflow: hidden;
    border-radius: var(--gt-radius) !important;
    background: var(--bs-secondary-bg);
    /* рамку рисуем тенью внутрь, а не border: настоящая рамка съедала
       два пикселя внутренней ширины, колонки шаблона переставали
       помещаться и правая уезжала под первую */
    box-shadow: inset 0 0 0 1px var(--bs-border-color);
    transition:
      transform 0.35s var(--gt-ease),
      box-shadow 0.35s var(--gt-ease);
  }

  .component-wrap .gt-rows .service-item.row .ratio {
    --bs-aspect-ratio: 75%;
    height: 100% !important;
  }

  .component-wrap .gt-rows .service-item.row .ratio img,
  .component-wrap .gt-rows .service-item.row .ratio .image-bg,
  .component-wrap .gt-rows .service-item.row .ratio .image-wrapper,
  .component-wrap .gt-rows .service-item.row .ratio .image-inner {
    position: absolute;
    inset: 0;
    width: 100% !important;
    height: 100% !important;
    max-width: none;
    object-fit: cover;
  }

  .component-wrap .gt-rows .service-item.row > [class*="col-"]:last-child {
    display: flex;
    flex-direction: column;
    justify-content: center;
  }

  .component-wrap .gt-rows .service-item.row .service-title {
    font-size: clamp(1.15rem, 1.5vw, 1.5rem);
    line-height: 1.25;
    margin-bottom: 0.6rem;
  }
}

/* ---------- страница товара: фото заполняет кадр ---------- */
/* Кадр у товара тянется под высоту описания (h-100), а фото в нём было
   обычным потоком с height:auto: при длинном тексте кадр становился выше
   4:3, и над и под фото оставались полосы фона. Кладём фото на весь кадр
   с обрезкой, как в ленте каталога. */
@media (min-width: 992px) {
  .component-wrap .gt-hero > .service-item.row .ratio > .image-wrapper,
  .component-wrap .gt-hero > .service-item.row .ratio .image-inner {
    position: absolute !important;
    inset: 0;
    width: 100% !important;
    height: 100% !important;
  }

  .component-wrap .gt-hero > .service-item.row .ratio img {
    position: absolute !important;
    inset: 0;
    width: 100% !important;
    height: 100% !important;
    max-width: none !important;
    object-fit: cover;
  }
}

/* ---------- колонки в ленте не должны срываться на вторую строку -------- */
/* Здесь пряталось описание сразу на десятке разделов. Колонки шаблона
   занимают ровно 100% ширины карточки, и любой лишний пиксель — рамка,
   зазор — сбрасывает правую колонку на вторую строку. Карточка обрезает
   всё, что вышло за её границы, поэтому название и описание просто
   исчезали. Рамку убрали выше, здесь запрещаем перенос: доли колонок
   остаются те, что заданы в разметке. */
@media (min-width: 992px) {
  .component-wrap .gt-rows .service-item.row,
  .component-wrap .gt-hero > .service-item.row,
  .component-wrap .gt-hero-lead > .service-item.row,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type,
  .component-wrap > .container > .service-item.row {
    flex-wrap: nowrap !important;
  }

  .component-wrap .gt-rows .service-item.row > [class*="col-"],
  .component-wrap .gt-hero > .service-item.row > [class*="col-"],
  .component-wrap .gt-hero-lead > .service-item.row > [class*="col-"],
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type
    > [class*="col-"] {
    min-width: 0;
  }
}

/* ---------- отклик на курсор в каталоге ---------- */
/* Заказчик просил вернуть увеличение: карточка выходит вперёд соседей,
   а снимок внутри неё ещё и наезжает. Раньше зум у ленты был почти
   незаметным, а у плиток я его вовсе отключил. */
@media (hover: hover) {
  .component-wrap .gt-rows .service-item.row:hover,
  .component-wrap .gt-cards .service-item.row:hover,
  .component-wrap .gt-hero-lead > .service-item.row:hover {
    transform: scale(1.035) !important;
    z-index: 6;
    border-color: rgba(184, 35, 35, 0.4);
    box-shadow: var(--gt-shadow-3) !important;
  }

  .component-wrap .gt-rows .service-item.row .ratio img,
  .component-wrap .gt-rows .service-item.row .ratio .image-bg,
  .component-wrap .gt-cards .service-item.row .ratio img,
  .component-wrap .gt-cards .service-item.row .ratio .image-bg,
  .component-wrap .gt-hero-lead > .service-item.row .ratio img,
  .component-wrap .gt-hero-lead > .service-item.row .ratio .image-bg {
    transition: transform 0.55s var(--gt-ease);
  }

  /* крупный блок раздела (холдер gt-hero-lead) раньше не попадал ни в
     одно из правил наведения — единственная карточка без увеличения */
  .component-wrap .gt-rows .service-item.row:hover .ratio img,
  .component-wrap .gt-rows .service-item.row:hover .ratio .image-bg,
  .component-wrap .gt-cards .service-item.row:hover .ratio img,
  .component-wrap .gt-cards .service-item.row:hover .ratio .image-bg,
  .component-wrap .gt-hero-lead > .service-item.row:hover .ratio img,
  .component-wrap .gt-hero-lead > .service-item.row:hover .ratio .image-bg {
    transform: scale(1.07) !important;
  }

  /* сетка товаров (вспомогательное оборудование и подобные разделы) */
  .component-wrap .row > [class*="col-"] > .service-item {
    transition:
      transform 0.35s var(--gt-ease),
      box-shadow 0.35s var(--gt-ease);
  }

  .component-wrap .row > [class*="col-"] > .service-item:hover {
    transform: scale(1.04);
    z-index: 6;
    position: relative;
    box-shadow: var(--gt-shadow-3);
  }

  .component-wrap .row > [class*="col-"] > .service-item .ratio img {
    transition: transform 0.55s var(--gt-ease);
  }

  .component-wrap .row > [class*="col-"] > .service-item:hover .ratio img {
    transform: scale(1.07);
  }
}

/* ---------- раздел «Проектирование и внедрение …» ---------- */
/* Первый блок крупный во всю ширину, остальные — мелкими плитками. */
@media (min-width: 992px) {
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type {
    grid-column: 1 / -1;
    flex-direction: row !important;
  }

  .component-wrap .gt-cards-lead > .service-item.row:first-of-type > [class*="col-"] {
    width: 50% !important;
    flex: 0 0 50% !important;
  }

  /* снимок в крупном блоке заполняет свою половину целиком, иначе под
     ним оставалась пустая полоса, а по бокам торчал фон студии */
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .ratio {
    --bs-aspect-ratio: 75%;
    height: 100% !important;
  }

  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .ratio img,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .ratio .image-bg,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .ratio .image-wrapper,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .ratio .image-inner {
    position: absolute;
    inset: 0;
    width: 100% !important;
    height: 100% !important;
    object-fit: cover;
  }

  .component-wrap .gt-cards-lead > .service-item.row:first-of-type
    > [class*="col-"]:last-child {
    justify-content: center;
    padding: 1.8rem 2rem !important;
  }

  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .service-title {
    font-size: clamp(1.3rem, 1.9vw, 1.75rem);
  }
}

/* ---------- в плитке под названием остаётся описание ---------- */
/* Сначала я прятал описание в плитках: оно длинное и растягивало ряд.
   Заказчик считает пропавший текст потерей, поэтому описание вернулось,
   но обрезано по трём строкам — ряд остаётся ровным, а смысл понятен.
   У шаблона на этом блоке класс d-md-block с !important, поэтому и
   здесь без него не обойтись. */
.component-wrap .gt-cards-tiles .service-item.row .d-none.d-md-block,
.component-wrap .gt-cards-lead > .service-item.row:not(:first-of-type)
  .d-none.d-md-block {
  display: -webkit-box !important;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  overflow: hidden;
  margin-top: 0.55rem;
  font-size: 0.94rem;
  line-height: 1.5;
  color: var(--bs-secondary-color);
}

.component-wrap .gt-cards-tiles .service-item.row .service-title,
.component-wrap .gt-cards-lead > .service-item.row:not(:first-of-type)
  .service-title {
  margin-bottom: 0;
}

/* ============================================================
   Цвет текста, вшитый в содержимое из редактора
   ============================================================ */
/* В части статей и таблиц цвет задан прямо в разметке: чёрный, почти
   чёрный или белый. На тёмной теме такой текст пропадал на тёмном фоне,
   на светлой — белый на белом. Отменяем только заведомо «слепые»
   значения, фирменные красный и синий не трогаем. */
[data-bs-theme="dark"] .content [style*="color: #2a2a2a"],
[data-bs-theme="dark"] .content [style*="color:#2a2a2a"],
[data-bs-theme="dark"] .content [style*="color: #212529"],
[data-bs-theme="dark"] .content [style*="color:#212529"],
[data-bs-theme="dark"] .content [style*="color: #333"],
[data-bs-theme="dark"] .content [style*="color:#333"],
[data-bs-theme="dark"] .content [style*="color: #000"],
[data-bs-theme="dark"] .content [style*="color:#000"],
[data-bs-theme="dark"] .content [style*="color: black"],
[data-bs-theme="dark"] .content [style*="color:black"],
[data-bs-theme="dark"] .content [style*="color: windowtext"],
[data-bs-theme="dark"] .content [style*="color:windowtext"],
[data-bs-theme="dark"] .component-wrap table [style*="color: #2a2a2a"],
[data-bs-theme="dark"] .component-wrap table [style*="color: black"],
[data-bs-theme="dark"] .component-wrap table [style*="color: windowtext"],
[data-bs-theme="dark"] .component-wrap table [style*="color: #000"] {
  color: inherit !important;
}

:root:not([data-bs-theme="dark"]) .content [style*="color: white"],
:root:not([data-bs-theme="dark"]) .content [style*="color:white"],
:root:not([data-bs-theme="dark"]) .content [style*="color: #fff"],
:root:not([data-bs-theme="dark"]) .content [style*="color:#fff"],
:root:not([data-bs-theme="dark"]) .component-wrap table [style*="color: white"],
:root:not([data-bs-theme="dark"]) .component-wrap table [style*="color: #fff"] {
  color: inherit !important;
}

/* ============================================================
   Свечение фона: красное только в тёмной теме
   ============================================================ */
/* На тёмной теме красноватое свечение смотрится хорошо и заказчику
   нравится. На светлой то же пятно давало розовый оттенок — вместо него
   ставим нейтральный серый, а синее пятно приглушаем до такого же
   серого, чтобы фон не спорил с фотографиями. */
:root:not([data-bs-theme="dark"]) .gt-bg::before {
  background: radial-gradient(
    circle,
    rgba(94, 100, 110, 0.14) 0%,
    rgba(94, 100, 110, 0) 70%
  );
}

:root:not([data-bs-theme="dark"]) .gt-bg::after {
  background: radial-gradient(
    circle,
    rgba(110, 116, 126, 0.12) 0%,
    rgba(110, 116, 126, 0) 70%
  );
}

/* ============================================================
   Лента новостей
   ============================================================ */
/* В карточке остаётся снимок, дата и заголовок: подробный текст всё
   равно повторяется на самой странице новости и в плитке только
   удлинял её. Заодно последний ряд перестал висеть одной карточкой
   у левого края — неполный ряд встаёт по центру. */
@media (min-width: 992px) {
  /* Ровно по три в ряд и одинаковой высоты. Раньше карточки стояли
     гибкой строкой: соседи по ряду тянулись каждый под свой текст, и
     ряд получался рваным по нижнему краю. Сетка из трёх равных колонок
     выравнивает и ширину, и высоту. Ряд заполняется слева направо, без
     центрирования: неполным остаётся только последний ряд последней
     страницы, а на самих страницах теперь по девять новостей. */
  .component-wrap .gt-cards.gt-cards-news {
    display: grid !important;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    justify-content: start;
    row-gap: 2.4rem;
    column-gap: 1.9rem;
  }

  .component-wrap .gt-cards.gt-cards-news > .service-item.row {
    max-width: none;
    height: 100%;
  }

  /* служебные вставки между карточками занимают всю строку */
  .component-wrap .gt-cards-news > *:not(.service-item) {
    grid-column: 1 / -1;
  }

  /* кнопка «Подробнее» встаёт у нижнего края: заголовки разной длины
     больше не двигают её по карточке */
  .component-wrap .gt-cards-news .service-item.row > [class*="col-"]:last-child,
  .component-wrap .gt-cards-news .service-item.row .p-lg-5 {
    display: flex !important;
    flex-direction: column;
    flex: 1 1 auto !important;
  }

  .component-wrap .gt-cards-news .service-item.row .d-none.d-lg-block {
    margin-top: auto;
  }
}

.component-wrap .gt-cards-news .service-item.row .content,
.component-wrap .gt-cards-news .service-item.row .d-none.d-md-block,
.component-wrap .gt-cards-news .service-item.row p {
  display: none !important;
}

.component-wrap .gt-cards-news .service-item.row .service-title,
.component-wrap .gt-cards-news .service-item.row h3,
.component-wrap .gt-cards-news .service-item.row h4 {
  margin-bottom: 0;
}


/* ============================================================
   Выключка текста по формату
   ============================================================ */
/* Заказчик просил ровный правый край: так текст читается собраннее и
   похож на печатную страницу. Переносы включаем, иначе выключка рвёт
   строки большими пробелами. Списки и подписи не трогаем. */
.item-page .content > p,
.component-wrap .content > p,
.blog-item .content > p,
.category-desc > p,
.about-text .content > p,
.feature-text .content > p {
  /* !important нужен: выше стоит общее правило, которое снимает
     инлайновую выключку из старого редактора (p[style*="justify"])
     тем же !important — из-за него правый край снова уезжал. */
  text-align: justify !important;
  hyphens: auto;
  -webkit-hyphens: auto;
}

/* Абзац-подзаголовок, набранный жирным («Основными направлениями…
   являются:»), выключать и переносить нельзя: получалось «яв-ляются».
   Ставим влево и ровняем строки по длине. */
.component-wrap .content > p:has(> strong:only-child),
.item-page .content > p:has(> strong:only-child) {
  text-align: left !important;
  text-indent: 0;
  hyphens: manual;
  -webkit-hyphens: manual;
}

.component-wrap .content > p > strong:only-child,
.item-page .content > p > strong:only-child {
  text-wrap: balance;
  hyphens: manual;
  -webkit-hyphens: manual;
}

/* короткие строки выключать нечем — оставляем как есть */
.gt-req,
.gt-list-plain > li,
.service-title,
figcaption {
  text-align: left !important;
  hyphens: manual;
}

/* ============================================================
   Прелоадер
   ============================================================
   Живёт на html::before / html::after и рисуется самим CSS с первого
   кадра: refresh.css подключён в head, а тема к этому моменту уже
   проставлена инлайн-скриптом шаблона — поэтому цвет фона сразу
   правильный и в светлой, и в тёмной теме. Скрипт только снимает
   класс, когда страница догрузилась; если скрипта нет, страховочная
   анимация уберёт заставку сама через несколько секунд.
   html::before — фон и логотип, html::after — гофрированная волна,
   которая «прочерчивается» слева направо, пока идёт загрузка. */
html:not(.gt-loaded)::before,
html:not(.gt-loaded)::after {
  content: "";
  position: fixed;
  z-index: 100000;
  pointer-events: none;
}

html::before {
  inset: 0;
  background-color: var(--bs-body-bg, #fff);
  background-image: url("/images/brand/logo.svg");
  background-repeat: no-repeat;
  background-position: center calc(50% - 26px);
  background-size: 168px auto;
  animation: gt-pre-logo 0.7s cubic-bezier(0.22, 1, 0.36, 1) both,
             gt-pre-bye 0.5s ease 5.5s forwards;
}

html[data-bs-theme="dark"]::before {
  background-image: url("/images/brand/logo-invert.svg");
}

html::after {
  left: 50%;
  top: 50%;
  width: 160px;
  height: 20px;
  margin: 48px 0 0 -80px;
  background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 20'><path d='M0 10 C 6.7 0, 13.3 0, 20 10 S 33.3 20, 40 10 S 53.3 0, 60 10 S 73.3 20, 80 10 S 93.3 0, 100 10 S 113.3 20, 120 10 S 133.3 0, 140 10 S 153.3 20, 160 10' fill='none' stroke='%23b82323' stroke-width='3' stroke-linecap='round'/></svg>") center / 160px 20px no-repeat;
  -webkit-mask: linear-gradient(90deg, #000 0 42%, transparent 58% 100%) 0 0 / 260% 100% no-repeat;
  mask: linear-gradient(90deg, #000 0 42%, transparent 58% 100%) 0 0 / 260% 100% no-repeat;
  animation: gt-pre-wave 1.35s cubic-bezier(0.45, 0, 0.25, 1) 0.15s infinite,
             gt-pre-bye 0.5s ease 5.5s forwards;
}

/* фон должен быть непрозрачным с первого кадра — анимируется только
   положение логотипа: он мягко поднимается на своё место */
@keyframes gt-pre-logo {
  from { background-position: center calc(50% - 8px); }
}

@keyframes gt-pre-wave {
  0% { -webkit-mask-position: 100% 0; mask-position: 100% 0; opacity: 1; }
  70% { -webkit-mask-position: 0 0; mask-position: 0 0; opacity: 1; }
  100% { -webkit-mask-position: 0 0; mask-position: 0 0; opacity: 0; }
}

@keyframes gt-pre-bye {
  to { opacity: 0; visibility: hidden; }
}

/* уход: фон растворяется и чуть уезжает вверх, волна гаснет первой */
html.gt-loaded::before,
html.gt-loaded::after {
  content: "";
  position: fixed;
  z-index: 100000;
  pointer-events: none;
  opacity: 0;
  visibility: hidden;
  animation: none;
}

html.gt-loaded::before {
  inset: 0;
  transform: translateY(-2.5%);
  transition:
    opacity 0.55s cubic-bezier(0.22, 1, 0.36, 1) 0.08s,
    transform 0.55s cubic-bezier(0.22, 1, 0.36, 1) 0.08s,
    visibility 0s linear 0.65s;
}

html.gt-loaded::after {
  transition: opacity 0.2s ease, visibility 0s linear 0.2s;
}

/* пока заставка на экране, страница под ней не листается */
html:not(.gt-loaded) body {
  overflow: hidden;
}

@media (prefers-reduced-motion: reduce) {
  html::before,
  html::after {
    animation: gt-pre-bye 0.3s ease 1.2s forwards;
  }
  html.gt-loaded::before,
  html.gt-loaded::after {
    transition: none;
    transform: none;
  }
}

/* ============================================================
   Подвал: знак компании и навигация вместо списка склада
   ============================================================ */
.gt-foot-brand .gt-foot-logo {
  display: inline-block;
  margin-bottom: 1.1rem;
}

.gt-foot-brand .gt-foot-logo img {
  height: 58px;
  width: auto;
  max-width: none;
  display: block;
  overflow: visible;
}

.gt-foot-brand .gt-foot-logo .logo-dark,
[data-bs-theme="dark"] .gt-foot-brand .gt-foot-logo .logo-light {
  display: none;
}

[data-bs-theme="dark"] .gt-foot-brand .gt-foot-logo .logo-dark {
  display: block;
}

.gt-foot-note {
  max-width: 30rem;
  color: var(--bs-secondary-color);
  text-indent: 0 !important;
  text-align: left !important;
}

.gt-foot-nav ul {
  list-style: none;
  margin: 0;
  padding: 0;
  columns: 2;
  column-gap: 1.4rem;
}

.gt-foot-nav li {
  margin-bottom: 0.7rem;
  break-inside: avoid;
}

.gt-foot-nav a {
  position: relative;
  color: var(--bs-body-color);
  text-decoration: none;
  transition: color var(--gt-fast) var(--gt-ease);
}

.gt-foot-nav a::before {
  content: "";
  position: absolute;
  left: -0.75rem;
  top: 50%;
  width: 4px;
  height: 4px;
  margin-top: -2px;
  border-radius: 50%;
  background: var(--gt-red);
  opacity: 0;
  transition: opacity var(--gt-fast) var(--gt-ease);
}

.gt-foot-nav a:hover {
  color: var(--gt-red);
}

.gt-foot-nav a:hover::before {
  opacity: 1;
}

@media (max-width: 767.98px) {
  .gt-foot-nav ul {
    columns: 1;
  }
}

/* ============================================================
   Шестерни в боковых полях
   ============================================================ */
/* Слой лежит под содержимым и не перехватывает курсор, поэтому на текст
   и кнопки шестерни не залезают. Видны они только там, где секция
   пропускает фон — то есть в пустых местах, как и просил заказчик. */

/* слой должен покрывать всю страницу, а не первый экран, поэтому
   телу задаём точку отсчёта для абсолютного позиционирования */
body {
  position: relative;
}

.gt-gears {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
}

.gt-gear-pair {
  position: absolute;
  width: 0;
  height: 0;
}

/* Пара стоит целиком в кадре: раньше она наполовину уходила за край
   окна и колёса выглядели обрезанными. Отступаем от края не меньше
   чем на палец, а на широких экранах прижимаемся к колонке текста. */
.gt-gear-pair--left {
  left: max(0.9rem, calc((100% - 1272px) / 2 - var(--gt-pair-w, 18rem) + 3rem));
}

.gt-gear-pair--right {
  right: max(0.9rem, calc((100% - 1272px) / 2 - var(--gt-pair-w, 18rem) + 3rem));
  transform: scaleX(-1);
}

.gt-gear {
  position: absolute;
  top: 0;
  left: 0;
  color: var(--bs-secondary-color);
  opacity: 0.1;
  animation-name: gt-gear-spin;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
  will-change: transform;
}

[data-bs-theme="dark"] .gt-gear {
  opacity: 0.075;
}

.gt-gear svg {
  display: block;
}

@keyframes gt-gear-spin {
  to {
    transform: rotate(360deg);
  }
}

/* содержимое всегда выше декоративного слоя */
body > .container-xxl,
body > .container-fluid,
body > nav,
body > .footer,
.component-wrap,
.footer {
  position: relative;
  z-index: 1;
}

@media (prefers-reduced-motion: reduce) {
  .gt-gear {
    animation: none;
  }
}

/* ============================================================
   Гофровал: ровное полотно входит, гофрированное выходит
   ============================================================ */
.gt-corrugator {
  position: relative;
  z-index: 1;
  pointer-events: none;
  /* Над лентой лежит зазор от секции выше, поэтому валы казались
     прижатыми к подвалу. Снизу даём больше поля, чем сверху, — валы
     всплывают к середине промежутка между последним блоком и подвалом. */
  /* Центр — между ВИДИМЫМ низом последней секции (карточки отзывов) и
     подвалом. У секции 72px внутреннего отступа снизу, поэтому лента
     заходит на него отрицательным полем, а снизу добирает столько же. */
  margin-top: -2rem;
  padding: 0.4rem 0 5.4rem;
  overflow: hidden;
}

.gt-corrugator-inner {
  max-width: 1272px;
  margin: 0 auto;
  padding: 0 1.5rem;
}

.gt-corrugator svg {
  display: block;
  width: 100%;
  height: auto;
  max-height: 170px;
  color: var(--bs-secondary-color);
}

/* полотно: сплошная лента, а не пунктир */
.gt-corrugator .gt-web {
  fill: none;
  stroke-width: 3;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.gt-corrugator .gt-web-flat {
  stroke: currentColor;
  opacity: 0.5;
}

.gt-corrugator .gt-web-flute {
  stroke: var(--gt-red);
  opacity: 0.85;
}

/* гофра уезжает вправо ровно на один шаг — стык не виден */
.gt-corrugator .gt-web-run {
  animation: gt-web-feed 0.85s linear infinite;
}

@keyframes gt-web-feed {
  to {
    transform: translateX(var(--gt-pitch));
  }
}

/* валы: окружность с рифлями, внутри — вал */
.gt-corrugator .gt-roll-body {
  fill: none;
  stroke: currentColor;
  stroke-width: 2.6;
  stroke-linejoin: round;
  opacity: 0.62;
}

.gt-corrugator .gt-roll-hub {
  fill: none;
  stroke: currentColor;
  stroke-width: 2.2;
  opacity: 0.4;
}

/* Направление задаёт полотно: оно идёт слева направо, значит у верхнего
   вала поверхность в месте прижима движется вправо — сам вал крутится
   против часовой, а нижний по часовой. Раньше было наоборот, и валы
   как будто тянули полотно обратно.

   Период согласован с подачей: за один оборот проходит длина окружности,
   то есть восемнадцать шагов гофры по 0.85 секунды. */
.gt-corrugator .gt-roll--top {
  animation: gt-gear-spin 15.3s linear infinite reverse;
}

.gt-corrugator .gt-roll--bottom {
  animation: gt-gear-spin 15.3s linear infinite;
}

@media (prefers-reduced-motion: reduce) {
  .gt-corrugator .gt-roll--top,
  .gt-corrugator .gt-roll--bottom,
  .gt-corrugator .gt-web-run {
    animation: none;
  }
}

@media (max-width: 767.98px) {
  .gt-corrugator {
    margin-top: -1rem;
    padding: 0.4rem 0 3.4rem;
  }
  .gt-corrugator svg {
    max-height: 112px;
  }
}

/* ============================================================
   Лента лет: тонкая направляющая вместо цветных стрелок
   ============================================================ */
/* Было: под каждым годом толстая красная или синяя полоса со стрелкой —
   приём из середины двухтысячных. Оставляем одну тонкую линию через всю
   ленту, а годы отмечаем точками на ней. Снимок становится кружком с
   кольцом, под курсором кольцо краснеет и год приподнимается. */
.timeline-section1 .timeline-icon-section,
.timeline-section2 .timeline-content {
  /* линию рисуем одной рельсой на всей ленте (ниже), у элементов её нет:
     иначе на стыках карусели она рвалась на отрезки */
  border-bottom: 2px solid transparent !important;
}

.timeline-carousel .owl-stage-outer {
  position: relative;
}

.timeline-carousel .owl-stage-outer::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 159px;                 /* граница верхней и нижней половин элемента */
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--bs-border-color) 6%, var(--bs-border-color) 94%, transparent);
  pointer-events: none;
}

.timeline-section1 .timeline-icon-section::before,
.timeline-section1 .timeline-icon-section::after,
.timeline-section2 .timeline-content::before,
.timeline-section2 .timeline-content::after {
  content: "";
  position: absolute;
  top: auto;
  bottom: -7px;
  left: 50%;
  right: auto;
  width: 12px;
  height: 12px;
  margin-left: -6px;
  border: 2px solid var(--bs-body-bg);
  border-radius: 50%;
  background: var(--gt-red);
  transition:
    transform var(--gt-mid) var(--gt-ease),
    background-color var(--gt-mid) var(--gt-ease);
}

/* второй псевдоэлемент не нужен — прячем, чтобы точка была одна */
.timeline-section1 .timeline-icon-section::before,
.timeline-section2 .timeline-content::before {
  display: none;
}

.timeline-icon-section img {
  border: 3px solid var(--bs-border-color) !important;
  padding: 3px;
  background: var(--bs-body-bg);
  transition:
    transform var(--gt-mid) var(--gt-ease),
    border-color var(--gt-mid) var(--gt-ease),
    box-shadow var(--gt-mid) var(--gt-ease);
}

.timeline-icon-section a:hover img {
  transform: scale(1.09);
  border-color: var(--gt-red) !important;
  box-shadow: var(--gt-shadow-2);
}

.timeline-year {
  font-size: clamp(1.7rem, 2.4vw, 2.25rem) !important;
  font-weight: 800;
  letter-spacing: -0.02em;
  display: inline-block;
  transition:
    color var(--gt-fast) var(--gt-ease),
    transform var(--gt-fast) var(--gt-ease);
}

.timeline-year:hover {
  color: var(--gt-red) !important;
  transform: translateY(-2px);
}

.timeline-content small {
  display: block;
  margin-top: 0.2rem;
  color: var(--bs-secondary-color);
  font-size: 0.85rem;
}

/* стрелки прокрутки — скромные кружки, а не крупные красные кнопки */
.timeline-carousel .owl-nav button.btn {
  width: 42px !important;
  height: 42px !important;
  min-width: 42px !important;
  padding: 0 !important;
  border-radius: 50% !important;
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  margin: 0 0.4rem !important;
  background: transparent !important;
  border: 1px solid var(--bs-border-color) !important;
  color: var(--bs-body-color) !important;
  transition:
    border-color var(--gt-fast) var(--gt-ease),
    color var(--gt-fast) var(--gt-ease),
    background-color var(--gt-fast) var(--gt-ease);
}

.timeline-carousel .owl-nav button.btn:hover {
  border-color: var(--gt-red) !important;
  background: var(--gt-red) !important;
  color: #fff !important;
}

.timeline-carousel .owl-nav {
  margin-top: 0.6rem;
}

/* ============================================================
   Таблицы характеристик
   ============================================================ */
/* Были голой сеткой из линий. Делаем читаемо и живо: шапка отбита
   фоном и не уезжает при прокрутке вбок, строки чередуются, под
   курсором строка подсвечивается, колонка со значением выделена. */
.component-wrap table.table,
.item-page table.table {
  --bs-table-bg: transparent;
  width: 100%;
  margin: 0;
  border-collapse: separate;
  border-spacing: 0;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--gt-radius);
  overflow: hidden;
}

.component-wrap table.table th,
.component-wrap table.table td,
.item-page table.table th,
.item-page table.table td {
  border: 0;
  border-bottom: 1px solid var(--bs-border-color);
  padding: 0.78rem 1.05rem;
  vertical-align: middle;
}

.component-wrap table.table tr:last-child td,
.item-page table.table tr:last-child td {
  border-bottom: 0;
}

/* первая строка — шапка, даже если размечена как обычная */
.component-wrap table.table tr:first-child td,
.component-wrap table.table thead td,
.component-wrap table.table thead th,
.item-page table.table tr:first-child td {
  background: var(--bs-secondary-bg);
  font-weight: 700;
  color: var(--bs-emphasis-color);
  border-bottom: 2px solid var(--bs-border-color);
}

.component-wrap table.table tr:nth-child(even) td,
.item-page table.table tr:nth-child(even) td {
  background: rgba(var(--bs-secondary-bg-rgb), 0.42);
}

.component-wrap table.table tr:first-child td {
  background: var(--bs-secondary-bg);
}

@media (hover: hover) {
  .component-wrap table.table tr:hover td,
  .item-page table.table tr:hover td {
    background: var(--gt-red-50);
  }

  .component-wrap table.table tr:first-child:hover td {
    background: var(--bs-secondary-bg);
  }
}

/* колонка со значением — крупнее и с цифрами одной ширины */
.component-wrap table.table td:not(:first-child),
.item-page table.table td:not(:first-child) {
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  color: var(--bs-emphasis-color);
}

.component-wrap table.table td:first-child,
.item-page table.table td:first-child {
  color: var(--bs-secondary-color);
}

.component-wrap table.table tr:first-child td:first-child {
  color: var(--bs-emphasis-color);
}

/* ============================================================
   Глобус поставок
   ============================================================ */
/* Планета стоит свободно на фоне страницы, без рамки и подложки:
   заказчик просил именно такую компоновку — слева заголовок с
   описанием, по центру шар, справа список. */
.gt-globe-wrap {
  display: grid;
  /* Планете отдаём почти всё место: она главная на странице. Подпись
     слева стоит вверху, а не по центру блока — так она читается первой
     и не спорит с шаром. */
  grid-template-columns: minmax(0, 0.6fr) minmax(0, 2.1fr) minmax(250px, 0.72fr);
  grid-template-areas: "lead stage side";
  align-items: start;
  gap: 1rem;
  max-width: 1720px;
  margin: 0 auto 2.4rem;
  padding: 0 clamp(1.25rem, 3.5vw, 4rem);
}

.gt-globe-lead {
  grid-area: lead;
  align-self: start;
  padding-top: 0.2rem;
}

.gt-globe-title {
  font-size: clamp(1.7rem, 2.6vw, 2.5rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin-bottom: 0.8rem;
}

.gt-globe-title span {
  color: var(--gt-red);
}

.gt-globe-text {
  max-width: 22rem;
  color: var(--bs-secondary-color);
  text-indent: 0 !important;
  text-align: left !important;
}

.gt-globe-stage {
  grid-area: stage;
  position: relative;
  /* высота под самый крупный шар, какой помещается на экране */
  height: clamp(520px, 62vw, 780px);
  background: none;
  border: 0;
  overflow: visible;
}

.gt-globe {
  display: block;
  width: 100%;
  height: 100%;
  cursor: grab;
  touch-action: none;
  outline: none;
}

.gt-globe--drag {
  cursor: grabbing !important;
}

.gt-globe:focus-visible {
  box-shadow: 0 0 0 2px var(--gt-red);
  border-radius: 50%;
}

.gt-globe-tip {
  position: absolute;
  z-index: 3;
  transform: translate(-50%, -155%);
  padding: 0.34rem 0.66rem;
  border-radius: 8px;
  background: var(--gt-red);
  color: #fff;
  font-size: 0.82rem;
  font-weight: 700;
  white-space: nowrap;
  pointer-events: none;
  box-shadow: var(--gt-shadow-2);
}

/* подсказка по центру под шаром */
.gt-globe-hint {
  position: absolute;
  left: 50%;
  bottom: -0.2rem;
  transform: translateX(-50%);
  font-size: 0.8rem;
  color: var(--bs-secondary-color);
  pointer-events: none;
  white-space: nowrap;
}

.gt-globe-side {
  grid-area: side;
  align-self: start;
  margin-top: 0.4rem;
  display: flex;
  flex-direction: column;
  height: clamp(460px, 52vw, 640px);
  border: 0;
  border-left: 1px solid var(--bs-border-color);
  border-radius: 0;
  background: none;
  overflow: hidden;
}

.gt-globe-head {
  padding: 0 0 0.9rem 1.2rem;
  border-bottom: 1px solid var(--bs-border-color);
}

.gt-globe-city {
  display: block;
  font-size: 1.12rem;
  line-height: 1.2;
  color: var(--bs-emphasis-color);
}

.gt-globe-sub {
  display: block;
  margin-top: 0.2rem;
  font-size: 0.82rem;
  color: var(--bs-secondary-color);
}

.gt-globe-list {
  flex: 1 1 auto;
  min-height: 0;
  margin: 0;
  padding: 0.4rem 0;
  list-style: none;
  overflow-y: auto;
  overscroll-behavior: contain;
  counter-reset: gt-geo;
}

.gt-globe-list li {
  margin: 0;
}

.gt-globe-list a {
  display: flex;
  align-items: baseline;
  gap: 0.7rem;
  padding: 0.5rem 0.6rem 0.5rem 1.2rem;
  color: var(--bs-body-color);
  text-decoration: none;
  transition:
    background-color var(--gt-fast) var(--gt-ease),
    color var(--gt-fast) var(--gt-ease);
}

.gt-globe-list--ranked a::before {
  counter-increment: gt-geo;
  content: counter(gt-geo);
  flex: 0 0 1.6rem;
  font-size: 0.78rem;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  color: var(--bs-secondary-color);
}

.gt-globe-name {
  flex: 1 1 auto;
  line-height: 1.3;
}

.gt-globe-count {
  flex: 0 0 auto;
  min-width: 1.9rem;
  padding: 0.08rem 0.44rem;
  border-radius: 999px;
  background: var(--gt-red-50);
  color: var(--gt-red);
  font-size: 0.78rem;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  text-align: center;
}

.gt-globe-list a:hover {
  background: var(--gt-red-50);
  color: var(--gt-red);
}

.gt-globe-back {
  padding: 0.7rem 0.6rem 0.4rem 1.2rem;
}

.gt-globe-back button {
  width: 100%;
  padding: 0.5rem 0.8rem;
  border: 1px solid var(--bs-border-color);
  border-radius: 999px;
  background: transparent;
  color: var(--bs-body-color);
  font-weight: 700;
  font-size: 0.85rem;
  cursor: pointer;
  transition:
    border-color var(--gt-fast) var(--gt-ease),
    color var(--gt-fast) var(--gt-ease);
}

.gt-globe-back button:hover {
  border-color: var(--gt-red);
  color: var(--gt-red);
}

/* карточка завода-партнёра в боковой колонке глобуса */
.gt-globe-maker {
  padding: 0.9rem 0.6rem 0.4rem 1.2rem;
}

.gt-globe-maker img {
  display: block;
  width: auto;
  max-width: 180px;
  max-height: 72px;
  height: auto;
  margin-bottom: 0.7rem;
  padding: 0.4rem 0.6rem;
  border-radius: 10px;
  background: #fff;
  border: 1px solid var(--bs-border-color);
  object-fit: contain;
}

.gt-globe-maker p {
  margin: 0;
  font-size: 0.9rem;
  line-height: 1.45;
  color: var(--bs-body-color);
}

.gt-hint-touch {
  display: none;
}

@media (hover: none) {
  .gt-hint-wide {
    display: none;
  }
  .gt-hint-touch {
    display: inline;
  }
}

@media (max-width: 1199.98px) {
  .gt-globe-wrap {
    grid-template-columns: minmax(0, 1.4fr) minmax(240px, 0.9fr);
    grid-template-areas:
      "lead lead"
      "stage side";
  }
  .gt-globe-lead {
    margin-bottom: 0.6rem;
  }
}

@media (max-width: 991.98px) {
  .gt-globe-wrap {
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas:
      "lead"
      "stage"
      "side";
    padding: 0 1rem;
  }
  .gt-globe-stage {
    height: 380px;
  }
  .gt-globe-side {
    height: 420px;
    border-left: 0;
    border-top: 1px solid var(--bs-border-color);
  }
  .gt-globe-head {
    padding-left: 0;
  }
  .gt-globe-list a {
    padding-left: 0;
  }
  .gt-globe-back {
    padding-left: 0;
  }
}


/* ============================================================
   Разбор замечаний приёмки
   ============================================================ */

/* ---------- лента каталога: снимок не растягивается ---------- */
/* Колонка с фотографией тянулась под высокий текст и кадрировала станок
   по бокам, поэтому кадру задана пропорция и потолок высоты. Высоту
   карточки при этом не ограничиваем: раньше здесь стояло max-height и
   на ноутбучных ширинах, где колонка текста уже, длинное описание
   просто обрезалось вместе с названием. Карточка растёт под текст, а
   кадр остаётся прежним и встаёт по центру своей колонки. */
@media (min-width: 992px) {
  /* Кадр тянется на всю высоту карточки. Раньше у него стоял потолок
     340px и он вставал по центру колонки: при длинном описании карточка
     росла, а над и под снимком проступал фон — те самые «серые полосы».
     Теперь колонка со снимком — флекс-стопка, кадр в ней растягивается,
     а фотография заполняет его обрезкой (object-fit: cover). Пропорция
     64.3% даёт те же 340px при короткой карточке, вид не меняется. */
  .component-wrap .gt-rows .service-item.row > [class*="col-"]:first-child {
    align-self: stretch;
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }

  .component-wrap .gt-rows .service-item.row > [class*="col-"]:first-child > a,
  .component-wrap .gt-rows .service-item.row > [class*="col-"]:first-child
    > .ratio {
    width: 100%;
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
  }

  .component-wrap .gt-rows .service-item.row .ratio {
    --bs-aspect-ratio: 64.3%;
    height: auto !important;
    max-height: none;
    flex: 1 1 auto;
    min-height: 0;
  }

  .component-wrap .gt-rows .service-item.row > [class*="col-"]:last-child {
    overflow: visible;
    padding: 1.5rem 1.8rem !important;
  }
}

/* ---------- пустые заголовки разделов статьи ---------- */
/* «Фотографии:» и «Видео:» иногда остаются без содержимого: галерея
   не заполнена или ролик убрали. Пустой заголовок выглядит обрывом. */
.gt-empty-head {
  display: none !important;
}

/* ---------- кнопка «Подробнее» видна и на телефоне ---------- */
@media (max-width: 991.98px) {
  .gt-cards-news .service-item .btn,
  .gt-cards-news .service-item .d-none.d-lg-block {
    display: block !important;
  }

  .gt-cards-news .service-item .btn {
    width: auto;
    align-self: flex-start;
  }
}

/* ---------- поиск в модалке ---------- */
.gt-modal-filter-empty {
  padding: 0.9rem 0.2rem;
  color: var(--bs-secondary-color);
}

/* ---------- раздел узлов: сетка по три с описаниями ---------- */
/* Отличается от плиток тем, что описание остаётся: у узлов оно
   короткое и по названию одному не понять, о чём речь. */
@media (min-width: 992px) {
  .component-wrap .gt-cards-desc {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    align-items: stretch;
  }

  /* Заказчик попросил оставить в узлах только названия: описания
     здесь короткие и повторяют страницу самого узла. Класс стоит
     только на этой странице (GRID_PAGES), остальных не касается. */
  .component-wrap .gt-cards-desc .service-item.row .d-none.d-md-block {
    display: none !important;
  }

  .component-wrap .gt-cards-desc .service-item.row .service-title {
    margin-bottom: 0;
  }

  /* под одну строку названия не нужны поля шаблона по 48px */
  .component-wrap .gt-cards-desc .service-item.row .p-lg-5 {
    padding: 0.85rem 0 0.6rem !important;
  }

  .component-wrap .gt-cards-desc .service-item.row {
    max-height: none;
  }

  .component-wrap .gt-cards-desc .service-item.row .ratio {
    --bs-aspect-ratio: 75%;
    max-height: none;
  }

  .component-wrap .gt-cards-desc .service-item.row .service-title {
    font-size: clamp(1.02rem, 1.2vw, 1.22rem);
    margin-bottom: 0.45rem;
  }
}

/* ---------- крупный блок раздела: снимок слева, текст справа ---------- */
/* Раньше снимок в этом блоке показывался целиком, без обрезки: у него
   отключалась рамка кадра и высота бралась от самой картинки. На
   разделе «переработка макулатуры» это давало нулевую высоту — колонка
   схлопывалась, и в блоке оставался один текст. Считаем этот блок такой
   же лентой, как остальные разделы: слева кадр 4:3, справа название и
   описание. Поведение одинаковое везде, схлопнуться нечему. */
@media (min-width: 992px) {
  .component-wrap .gt-hero-lead > .service-item.row,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type {
    grid-column: 1 / -1;
    flex-direction: row !important;
    flex-wrap: nowrap !important;
    align-items: stretch;
    position: relative;
    z-index: 1;
    transition:
      transform 0.35s var(--gt-ease),
      box-shadow 0.35s var(--gt-ease);
  }

  .component-wrap .gt-hero-lead > .service-item.row .ratio,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .ratio {
    --bs-aspect-ratio: 75%;
    height: 100% !important;
    max-height: none;
    border-radius: calc(var(--gt-radius) - 0.35rem);
    overflow: hidden;
  }

  .component-wrap .gt-hero-lead > .service-item.row .ratio > *,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .ratio > * {
    position: absolute !important;
    inset: 0;
    width: 100% !important;
    height: 100% !important;
  }

  .component-wrap .gt-hero-lead > .service-item.row .ratio img,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .ratio img {
    position: absolute !important;
    inset: 0;
    width: 100% !important;
    height: 100% !important;
    max-width: none !important;
    object-fit: cover;
  }

  /* Снимок заполняет колонку до края, как у всех остальных карточек
     ленты. Отступ вокруг кадра стоял по прежней просьбе «не впритык»,
     но заказчик увидел в нём пустое серое поле вокруг фотографии. */
  .component-wrap .gt-hero-lead > .service-item.row > [class*="col-"]:first-child,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type
    > [class*="col-"]:first-child {
    align-self: stretch;
    padding: 0 !important;
  }

  .component-wrap .gt-hero-lead > .service-item.row .ratio,
  .component-wrap .gt-cards-lead > .service-item.row:first-of-type .ratio {
    border-radius: 0;
  }
}

/* ============================================================
   Интерактивная схема линии
   ============================================================ */
/* Схема — чёрный чертёж на белом. На тёмной теме он выглядел листом,
   вырезанным ножницами и положенным на страницу. Кладём его на светлый
   планшет со скруглением и полями: так это читается как приложенный
   документ, а не как дырка в макете. */
.content a.imagemap-modal {
  display: block;
  max-width: 100%;
  margin: 0 0 1.4rem;
  padding: 1.1rem 1.3rem;
  border-radius: var(--gt-radius);
  background: #f4f6f8;
  border: 1px solid var(--bs-border-color);
  box-shadow: var(--gt-shadow-1);
  transition:
    box-shadow var(--gt-mid) var(--gt-ease),
    border-color var(--gt-mid) var(--gt-ease),
    transform var(--gt-mid) var(--gt-ease);
}

.content a.imagemap-modal:hover {
  border-color: rgba(184, 35, 35, 0.45);
  box-shadow: var(--gt-shadow-2);
  transform: translateY(-2px);
}

.content a.imagemap-modal img {
  display: block;
  width: 100%;
  height: auto;
  border: 0 !important;
  margin: 0 !important;
  mix-blend-mode: multiply;
}

/* кнопка «открыть схему» под планшетом остаётся кнопкой */
.content a.imagemap-modal.btn {
  display: inline-block;
  width: auto;
  padding: 0.7rem 1.4rem;
  background: var(--gt-red);
  border-color: var(--gt-red);
  color: #fff;
  box-shadow: none;
  mix-blend-mode: normal;
}

/* ---------- наведение: карточки не налезают друг на друга ---------- */
/* Увеличенная карточка перекрывалась соседями, потому что у соседей
   свой слой. Поднимаем наведённую карточку выше и даём рядам чуть
   больше воздуха, чтобы увеличение было куда разложить. */
@media (min-width: 992px) and (hover: hover) {
  .component-wrap .gt-cards,
  .component-wrap .gt-cards-desc {
    row-gap: 2.4rem;
    column-gap: 1.9rem;
  }

  /* У бутстрап-сетки ширина колонок уже ровно треть, а зазор сделан
     внутренними полями. Добавленный сюда column-gap не помещался, и
     третья карточка срывалась на новую строку — в ряду оставалось две.
     Вертикальный воздух даём родной переменной, горизонтальный не
     трогаем вовсе. */
  /* только сетка товаров: сами карточки тоже имеют класс row, и общий
     gutter сдвигал бы в них колонку со снимком вниз */
  .component-wrap .jshop_list_product > .row:not(.service-item) {
    --bs-gutter-y: 2.4rem;
  }

  .component-wrap .service-item.row,
  .component-wrap [class*="col-"] > .service-item {
    position: relative;
    z-index: 1;
  }

  .component-wrap .service-item.row:hover,
  .component-wrap [class*="col-"] > .service-item:hover,
  .component-wrap [class*="col-"]:hover > .service-item {
    z-index: 20;
  }

  /* у сетки товаров ячейка тоже должна пропускать увеличение наружу */
  .component-wrap .row > [class*="col-"]:has(> .service-item) {
    position: relative;
  }

  .component-wrap .row > [class*="col-"]:has(> .service-item:hover) {
    z-index: 20;
  }
}

/* ---------- подвал шире и с ровными колонками ---------- */
/* Подвал жался к узкой колонке, а три блока стояли разной ширины.
   Даём ему ту же ширину, что и остальным широким секциям, и делим
   поровну: контакты, знак с подписью, навигация. */
@media (min-width: 1200px) {
  .footer > .container,
  .footer .copyright {
    max-width: 1480px;
  }
}

.gt-foot-brand,
.gt-foot-nav,
.gt-foot-contacts {
  display: flex;
  flex-direction: column;
}

.gt-foot-brand .gt-foot-logo {
  align-self: flex-start;
  margin-bottom: 1.2rem;
  line-height: 0;
}

@media (min-width: 992px) {
  .gt-foot-nav ul {
    columns: 2;
    column-gap: 2rem;
  }
}

/* ============================================================
   Подложки секций — во всю ширину окна
   ============================================================ */
/* Подложка висела на контейнере с ограниченной шириной, поэтому на
   широком экране по краям торчал другой фон и секция выглядела
   обрезанной. Растягиваем заливку за пределы контейнера, не трогая
   саму сетку: тень нужного цвета плюс обрезка по вертикали. */
.gt-home .projects-wrap,
.gt-bg-on .service-wrap,
.gt-home .service-wrap,
.gt-home .testimonial-wrap,
.gt-home .feature-wrap {
  position: relative;
  clip-path: inset(0 -100vmax);
}

.gt-home .projects-wrap {
  box-shadow: 0 0 0 100vmax rgba(var(--bs-secondary-bg-rgb), 0.4);
}

.gt-bg-on .service-wrap,
.gt-home .service-wrap {
  box-shadow: 0 0 0 100vmax rgba(233, 236, 239, 0.88);
}

[data-bs-theme="dark"].gt-bg-on .service-wrap,
[data-bs-theme="dark"] .gt-home .service-wrap {
  box-shadow: 0 0 0 100vmax rgba(33, 37, 41, 0.5);
}

[data-bs-theme="dark"].gt-home .projects-wrap {
  box-shadow: 0 0 0 100vmax rgba(var(--bs-secondary-bg-rgb), 0.4);
}

/* ---------- «О компании» на главной: заметный каскад ---------- */
/* Каждый элемент текста едет из-за правого края дальше и дольше, чем
   обычные блоки, и с шагом задержки — движение видно даже при быстром
   листании. Задержка ставится в refresh.js по порядку элементов. */
.gt-reveal .about-wrap .about-text .gt-anim.gt-cascade {
  transform: translateX(72px);
}

/* заказчику каскад показался заторможенным — шаг 45 мс вместо 90,
   сам выезд вдвое короче; весь блок собирается за ~0.9 с вместо 1.8 */
.gt-reveal .about-wrap .about-text .gt-anim.gt-cascade.gt-in {
  transform: none;
  transition:
    opacity 0.32s cubic-bezier(0.22, 1, 0.32, 1),
    transform 0.48s cubic-bezier(0.19, 1.12, 0.3, 1);
}

/* ---------- круглые аватары партнёров ---------- */
/* Круг задан атрибутами 150×150 и обрезкой по кругу. Колонка со снимком
   — элемент флекса и сжималась под длинное название (117 вместо 150),
   а сам снимок получал height:auto и превращался в овал. */
.d-flex > .pe-3:has(> a > img.rounded-circle),
.d-flex > .pe-3:has(> img.rounded-circle) {
  flex: 0 0 auto;
}

.pe-3 > a > img.rounded-circle,
.pe-3 > img.rounded-circle {
  width: 150px;
  height: 150px !important;
  max-width: none;
  object-fit: cover;
}

/* ---------- карта на контактах: цветная, но спокойная ---------- */
/* Шаблон обесцвечивал подложку Яндекс-карты (grayscale в style.css) —
   заказчик назвал её скучной. Возвращаем цвет, но приглушённый; в тёмной
   теме карту не высветляем, а инвертируем с поворотом оттенка — она
   остаётся тёмной, вода и парки получают свой цвет. Класс с версией API
   у Яндекса меняется, поэтому цепляемся по подстроке. */
[class*="ymaps-"][class*="-ground-pane"] {
  filter: saturate(0.78) contrast(1.03) !important;
}

[data-bs-theme="dark"] [class*="ymaps-"][class*="-ground-pane"] {
  filter: invert(1) hue-rotate(185deg) brightness(0.82) contrast(0.92) saturate(0.6) !important;
}

/* ---------- переключатель вида глобуса ---------- */
.gt-globe-mode {
  position: absolute;
  top: 0.4rem;
  right: 0.4rem;
  z-index: 4;
  display: inline-flex;
  gap: 0.15rem;
  padding: 0.2rem;
  border-radius: 999px;
  background: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color);
  box-shadow: var(--gt-shadow-1);
}

.gt-globe-mode button {
  border: 0;
  background: transparent;
  color: var(--bs-secondary-color);
  font: inherit;
  font-size: 0.82rem;
  font-weight: 600;
  padding: 0.35rem 0.85rem;
  border-radius: 999px;
  cursor: pointer;
  transition: background var(--gt-mid) var(--gt-ease), color var(--gt-mid) var(--gt-ease);
}

.gt-globe-mode button:hover {
  color: var(--bs-body-color);
}

.gt-globe-mode button[aria-pressed="true"] {
  background: var(--gt-red);
  color: #fff;
}

.gt-globe-mode button[disabled] {
  opacity: 0.55;
  cursor: progress;
}

/* ---------- подвал компактнее по вертикали ---------- */
/* Заказчик: подвал слишком высокий. Было 527px: 48 сверху, контейнер
   с полями по 48, колонки по 249 с щедрыми интервалами, копирайт 134.
   Ужимаем всё разом — внешние поля, заголовки, интервалы строк,
   копирайт — не трогая состав и ширину. */
.footer.pt-5 {
  padding-top: 2rem !important;
}

.footer > .container.py-5 {
  padding-top: 1.5rem !important;
  padding-bottom: 1rem !important;
}

.footer > .container > .row.g-5 {
  --bs-gutter-y: 1.5rem;
}

.footer h3 {
  font-size: 1.25rem;
  margin-bottom: 0.75rem !important;
}

.footer p {
  margin-bottom: 0.4rem;
}

.gt-foot-contacts p {
  line-height: 1.45;
}

.gt-foot-nav li {
  margin-bottom: 0.35rem;
}

.gt-foot-brand .gt-foot-logo {
  margin-bottom: 0.7rem !important;
}

.gt-foot-brand .gt-foot-logo img {
  height: 48px;
}

.gt-foot-note {
  font-size: 0.92rem;
  line-height: 1.45;
}

.footer .copyright {
  padding-top: 0.75rem !important;
  padding-bottom: 0.75rem !important;
}

.footer .copyright p,
.footer .copyright .mb-3,
.footer .copyright .mb-2 {
  margin-bottom: 0.25rem !important;
}

.footer .copyright .row {
  --bs-gutter-y: 0.25rem;
  align-items: center;
}

/* ---------- кнопка «Оборудование на складе» в шапке ---------- */
/* Был красный прямоугольник во всю высоту шапки — заказчик назвал его
   некрасивым. Делаем пилюлю по центру строки: мягкий красный градиент,
   тень цвета кнопки, стрелка уезжает вправо под курсором. */
.navbar .button-wrap {
  /* d-xxl-block шаблона ставит display:block с !important — перебиваем */
  display: flex !important;
  align-items: center;
  align-self: stretch;
  padding: 0 1.25rem 0 1.1rem;
}

.navbar .button-wrap .btn.btn-primary {
  display: inline-flex !important;
  align-items: center;
  align-self: center;
  height: auto !important;
  gap: 0.6rem;
  padding: 0.72rem 1.35rem 0.72rem 1.45rem !important;
  border: 0;
  border-radius: 999px !important;
  font-size: 0.95rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  line-height: 1;
  color: #fff !important;
  background: linear-gradient(135deg, #d63a3a 0%, #b82323 60%, #9f1c1c 100%) !important;
  box-shadow:
    0 10px 22px -12px rgba(184, 35, 35, 0.75),
    inset 0 1px 0 rgba(255, 255, 255, 0.16);
  transition:
    transform var(--gt-mid) var(--gt-ease),
    box-shadow var(--gt-mid) var(--gt-ease),
    filter var(--gt-mid) var(--gt-ease);
}

.navbar .button-wrap .btn.btn-primary i {
  margin: 0 !important;
  font-size: 0.85em;
  transition: transform var(--gt-mid) var(--gt-ease);
}

.navbar .button-wrap .btn.btn-primary:hover {
  transform: translateY(-1px);
  filter: brightness(1.06);
  box-shadow:
    0 14px 28px -12px rgba(184, 35, 35, 0.85),
    inset 0 1px 0 rgba(255, 255, 255, 0.2);
}

.navbar .button-wrap .btn.btn-primary:hover i {
  transform: translateX(4px);
}

.navbar .button-wrap .btn.btn-primary:active {
  transform: translateY(0);
  filter: brightness(0.98);
}

/* Компактная пилюля помещается с 1600px; уже — уходит в прокрутку вбок.
   !important нужен: выше display:flex тоже с !important. */
@media (max-width: 1599.98px) {
  .navbar .button-wrap {
    display: none !important;
  }
}

/* ---------- лента новостей: по одной в строку, с текстом ---------- */
/* Раскладку строки даёт gt-rows (снимок 5/12 слева, текст справа, кадр
   на всю высоту). Здесь — новостные мелочи: дата над заголовком,
   вступление видно, кнопка «Подробнее» с воздухом. */
@media (min-width: 992px) {
  .component-wrap .gt-rows-news .service-item.row .d-none.d-lg-block {
    display: block !important;
    margin-top: 0.4rem;
  }

  .component-wrap .gt-rows-news .service-item.row .d-none.d-lg-block p {
    margin-bottom: 1.1rem;
    color: var(--bs-secondary-color);
  }

  .component-wrap .gt-rows-news .service-item.row .article-info {
    margin-bottom: 0.6rem;
  }

  .component-wrap .gt-rows-news .service-item.row .service-title {
    font-size: clamp(1.25rem, 1.7vw, 1.65rem);
    margin-bottom: 0.7rem;
  }

  .component-wrap .gt-rows-news .service-item.row .btn {
    margin-top: 0.2rem;
  }
}

@media (max-width: 991.98px) {
  .gt-rows-news .service-item .btn,
  .gt-rows-news .service-item .d-none.d-lg-block {
    display: block !important;
  }

  .gt-rows-news .service-item .btn {
    width: auto;
  }
}
