/* Финальная широкая композиция спецноминации.
   Загружается после student-startup.css и заменяет её визуальную часть,
   сохраняя правила спецпункта навигации из исходного файла. */

.startup {
  --frame-open: clamp(250px, 27vw, 450px);
  --frame-crop: 0%;
  --track-film-brightness: 1;
  --track-film-contrast: 0.83;
  --track-film-grain-opacity: 0.5;

  position: relative;
  isolation: isolate;
  overflow: clip;
  border-top: 1px solid var(--film-line);
  border-bottom: 1px solid var(--film-line);
}

.startup__scene {
  position: relative;
  isolation: isolate;
  overflow: clip;
}

.startup__frame {
  position: absolute;
  inset: 0;
  z-index: -4;
}

.startup__frame img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center bottom;
  filter: brightness(var(--track-film-brightness, 1)) contrast(var(--track-film-contrast, 1));
}

.startup__veil {
  position: absolute;
  inset: 0;
  z-index: -3;
  opacity: 1;
  background:
    linear-gradient(
      202deg,
      rgba(255, 255, 255, 0) 25%,
      rgba(255, 255, 255, 0.035) 35%,
      rgba(255, 255, 255, 0.16) 46%,
      rgba(255, 255, 255, 0.065) 55%,
      rgba(255, 255, 255, 0) 64%
    ),
    radial-gradient(ellipse 52% 42% at 88% 88%, rgba(255, 255, 255, 0.08), transparent 72%),
    linear-gradient(
      202deg,
      rgba(10, 12, 16, 0) 0%,
      rgba(10, 12, 16, 0) 40%,
      rgba(10, 12, 16, 0.16) 52%,
      rgba(10, 12, 16, 0.55) 69%,
      rgba(10, 12, 16, 0.82) 86%,
      rgba(10, 12, 16, 0.9) 100%
    );
}

.startup__grain {
  position: absolute;
  inset: 0;
  z-index: -2;
  pointer-events: none;
  opacity: var(--track-film-grain-opacity, 0.5);
  mix-blend-mode: soft-light;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 180px 180px;
}

.startup__body {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 48ch);
  grid-template-rows: 1fr 32px auto auto;
  column-gap: clamp(48px, 6vw, 96px);
  align-items: end;
  width: calc(100% - 2 * clamp(10px, 1.4vw, 20px));
  min-height: calc(var(--frame-open) + clamp(370px, 29.3vw, 412px));
  margin: 0 auto;
  padding: var(--frame-open) 0 clamp(24px, 2.2vw, 36px);
}

.startup__eyebrow,
.startup__title,
.startup__lead {
  text-shadow: var(--track-title-edge);
}

.startup__eyebrow {
  position: absolute;
  z-index: 3;
  top: clamp(12px, 1.4vw, 20px);
  left: clamp(10px, 1.4vw, 20px);
  display: inline-flex;
  grid-column: 1 / -1;
  grid-row: 2;
  align-items: center;
  justify-self: start;
  gap: 10px;
  max-width: calc(100% - 2 * clamp(10px, 1.4vw, 20px));
  margin: 0;
  padding: 8px 14px;
  border: 1px solid var(--line);
  border-radius: var(--radius-pill);
  background: var(--glass-strong);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  color: var(--ink);
  font: 800 var(--text-xs) / 1.2 var(--font-ui);
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
}

.startup__eyebrow-accent {
  color: var(--color-gold-text);
}

.startup__partner-link {
  display: inline-grid;
  place-items: center;
  margin: -3px -6px;
  padding: 3px 6px;
  border-radius: 5px;
  transition: background-color 180ms ease;
}

.startup__partner-link img {
  grid-area: 1 / 1;
  width: auto;
  height: 15px;
  pointer-events: none;
  transition: opacity 180ms ease;
}

.startup__partner--mono {
  opacity: 0.72;
}

.startup__partner--color {
  opacity: 0;
}

.startup__partner-link:hover,
.startup__partner-link:focus-visible {
  background: rgba(243, 240, 234, 0.94);
}

.startup__partner-link:hover .startup__partner--mono,
.startup__partner-link:focus-visible .startup__partner--mono {
  opacity: 0;
}

.startup__partner-link:hover .startup__partner--color,
.startup__partner-link:focus-visible .startup__partner--color {
  opacity: 1;
}

.startup__partner-link:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 4px;
}

/* Ширина держит титул в четыре строки — по слову на строку. После
   переименования «спортивный» → «спорттех» слово стало короче, и при 21ch
   «студенческий спорттех» вставало в одну строку: заголовок собирался в три.
   17ch выбраны с запасом: самое длинное слово «студенческий» занимает 14.3ch,
   а пара «лучший студенческий» — 22.7ch, и она не влезает ни на какой ширине.
   Обе величины считаются от кегля, а кегль сам масштабируется по vw, поэтому
   пропорция держится на всех окнах, а не только на замеренных. */
.startup__title {
  grid-column: 1;
  grid-row: 3;
  max-width: 17ch;
  margin: clamp(12px, 1.2vw, 16px) 0 0;
  font: 700 clamp(3rem, 5vw, 5.4rem) / 0.95 var(--font-display);
  letter-spacing: -0.03em;
  text-transform: uppercase;
}

.startup__lead {
  grid-column: 1 / -1;
  grid-row: 4;
  width: 100%;
  max-width: none;
  margin: clamp(14px, 1.6vw, 22px) 0 0;
  color: rgba(243, 240, 234, 0.88);
  font: 400 var(--text-lg) / 1.6 var(--font-body);
}

.startup__bar {
  position: relative;
  border-top: 1px solid var(--line-strong);
  border-bottom: 0;
  background: rgba(10, 12, 16, 0.86);
  backdrop-filter: blur(16px) saturate(120%);
  -webkit-backdrop-filter: blur(16px) saturate(120%);
}

/* Четыре ячейки условий. Пятая, с каналом, ушла из ленты в пол секции
   (.startup__floor) — она больше не колонка этой сетки. */
.startup__cells {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  width: calc(100% - 2 * clamp(10px, 1.4vw, 20px));
  margin: 0 auto;
}

.startup__terms {
  display: contents;
  margin: 0;
}

.startup__cell {
  padding: clamp(18px, 2vw, 28px) clamp(14px, 1.7vw, 26px);
  border-left: 1px solid var(--line-soft);
}

.startup__cell:first-child {
  padding-left: 0;
  border-left: 0;
}

.startup__cell dt,
.startup__live-label {
  margin: 0 0 8px;
  color: var(--color-text-muted);
  font: 800 var(--text-xs) / 1.2 var(--font-ui);
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
}

.startup__cell dd,
.startup__live-title {
  margin: 0;
  font: 700 clamp(22px, 1.9vw, 31px) / 1.05 var(--font-display);
  letter-spacing: -0.02em;
}

.startup__cell dd span,
.startup__live-status {
  display: block;
  margin-top: 7px;
  color: var(--muted-soft);
  font: 400 var(--text-sm) / 1.5 var(--font-body);
  letter-spacing: 0;
}

.startup__live {
  padding: clamp(18px, 2vw, 28px) 0 clamp(18px, 2vw, 28px) clamp(14px, 1.7vw, 26px);
  border-left: 1px solid var(--line-soft);
  background: transparent;
  min-width: 0;
}

.startup__live-card {
  display: grid;
  align-content: start;
  color: inherit;
  text-decoration: none;
}

.startup__live-title {
  width: fit-content;
  color: var(--color-gold-text);
  transition: color 160ms ease;
}

.startup__live-title--desktop {
  display: flex;
  align-items: center;
  gap: 10px;
}

.startup__live-title--mobile {
  display: none;
}

.startup__live-label--mobile {
  display: none;
}

.startup__live-title-icon {
  width: 22px;
  height: 22px;
  flex: 0 0 auto;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
  transition: transform 180ms ease;
}

.startup__live-card:hover .startup__live-title-icon,
.startup__live-card:focus-visible .startup__live-title-icon {
  transform: translate(2px, -2px);
}

.startup__live-card:hover .startup__live-title,
.startup__live-card:focus-visible .startup__live-title {
  color: var(--gold);
}

.startup__live-card:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 5px;
}

/* Одноразовый вход секции: сначала проявляется кадр, затем информация и
   измеримые условия номинации. Начальные состояния включаются только после
   инициализации наблюдателя — без JavaScript контент остаётся видимым. */
@media (prefers-reduced-motion: no-preference) {
  .startup.startup--reveal-ready .startup__frame img {
    opacity: 0;
    transform: scale(1.055);
    transform-origin: 50% 55%;
  }

  .startup.startup--reveal-ready .startup__veil {
    opacity: 0;
  }

  .startup.startup--reveal-ready .startup__eyebrow,
  .startup.startup--reveal-ready .startup__title,
  .startup.startup--reveal-ready .startup__lead,
  .startup.startup--reveal-ready .startup__cell,
  .startup.startup--reveal-ready .startup__live {
    opacity: 0;
    transform: translateY(22px);
  }

  .startup.startup--reveal-armed .startup__frame img {
    transition:
      opacity 760ms ease-out,
      transform 1100ms cubic-bezier(0.2, 0.72, 0.18, 1);
  }

  .startup.startup--reveal-armed .startup__veil {
    transition: opacity 900ms ease-out 80ms;
  }

  .startup.startup--reveal-armed .startup__eyebrow,
  .startup.startup--reveal-armed .startup__title,
  .startup.startup--reveal-armed .startup__lead,
  .startup.startup--reveal-armed .startup__cell,
  .startup.startup--reveal-armed .startup__live {
    transition:
      opacity 520ms ease-out,
      transform 700ms cubic-bezier(0.2, 0.72, 0.18, 1);
  }

  .startup.startup--reveal-ready .startup__eyebrow {
    transform: translateY(-12px) scale(0.98);
  }

  .startup.startup--reveal-ready .startup__title {
    transform: translateY(42px);
  }

  .startup.startup--reveal-ready .startup__lead {
    transform: translateY(30px);
  }

  .startup.startup--reveal-ready.is-scene-revealed .startup__frame img,
  .startup.startup--reveal-ready.is-scene-revealed .startup__eyebrow,
  .startup.startup--reveal-ready.is-copy-revealed .startup__title,
  .startup.startup--reveal-ready.is-copy-revealed .startup__lead,
  .startup.startup--reveal-ready.is-bar-revealed .startup__cell,
  .startup.startup--reveal-ready.is-bar-revealed .startup__live {
    opacity: 1;
    transform: none;
  }

  .startup.startup--reveal-ready.is-scene-revealed .startup__veil {
    opacity: 1;
  }

  .startup.startup--reveal-armed .startup__eyebrow {
    transition-delay: 120ms;
  }

  .startup.startup--reveal-armed .startup__title {
    transition-delay: 80ms;
  }

  .startup.startup--reveal-armed .startup__lead {
    transition-delay: 220ms;
  }

  .startup.startup--reveal-armed .startup__cell:nth-child(1) {
    transition-delay: 0ms;
  }

  .startup.startup--reveal-armed .startup__cell:nth-child(2) {
    transition-delay: 90ms;
  }

  .startup.startup--reveal-armed .startup__cell:nth-child(3) {
    transition-delay: 180ms;
  }

  .startup.startup--reveal-armed .startup__cell:nth-child(4) {
    transition-delay: 270ms;
  }

  .startup.startup--reveal-armed .startup__live {
    transition-delay: 380ms;
  }
}

@media (max-width: 1080px) {
  .startup__body {
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: auto;
  }

  .startup__eyebrow,
  .startup__title,
  .startup__lead {
    grid-column: 1;
    grid-row: auto;
  }

  .startup__cells {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .startup__cell:nth-child(odd) {
    padding-left: 0;
    border-left: 0;
  }

  .startup__cell:nth-child(n + 3) {
    border-top: 1px solid var(--line-soft);
  }

  .startup__live {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    grid-column: 1 / -1;
    padding-left: 0;
    border-top: 1px solid var(--gold-border);
    border-left: 0;
  }

  .startup__live-card {
    justify-items: center;
    align-content: center;
    gap: 10px;
    width: 100%;
    text-align: center;
  }

  .startup__live-label--desktop,
  .startup__live-title--desktop,
  .startup__live-status {
    display: none;
  }

  .startup__live-label--mobile {
    display: block;
    margin: 0;
    font-size: clamp(10px, 0.95vw, 12px);
    letter-spacing: 0.1em;
  }

  .startup__live-title--mobile {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    font-size: clamp(22px, 2.4vw, 28px);
    white-space: nowrap;
  }
}

@media (max-width: 720px) and (prefers-reduced-motion: no-preference) {
  .startup.startup--reveal-ready .startup__frame img {
    transform: scale(1.035);
  }

  .startup.startup--reveal-ready .startup__title,
  .startup.startup--reveal-ready .startup__lead,
  .startup.startup--reveal-ready .startup__cell,
  .startup.startup--reveal-ready .startup__live {
    transform: translateY(20px);
  }
}

@media (max-width: 640px) {
  .startup {
    --frame-open: clamp(210px, 62vw, 300px);
  }

  .startup__body {
    width: calc(100% - 24px);
    min-height: auto;
    padding-bottom: 24px;
  }

  .startup__eyebrow {
    gap: 8px;
    padding-inline: 10px;
    font-size: 9px;
    letter-spacing: 0.1em;
  }

  .startup__partner-link img {
    height: 13px;
  }

  .startup__title {
    max-width: none;
    font-size: clamp(2.35rem, 12vw, 3rem);
  }

  .startup__lead {
    font-size: var(--text-md);
  }

  .startup__cells {
    grid-template-columns: minmax(0, 1fr);
    width: calc(100% - 24px);
  }

  .startup__cell {
    padding-left: 0;
    border-top: 1px solid var(--line-soft);
    border-left: 0;
  }

  .startup__cell:first-child {
    border-top: 0;
  }

  .startup__live {
    padding-left: 0;
    border-left: 0;
  }
}


/* ============================================================================
   ПОЛОСА ДЕЙСТВИЯ, КНОПКА ЗАЯВКИ И ПОЛ СЕКЦИИ — 28.08.2026
   Перенесено со стенда student-startup-cta.html. Правила ниже дописывают и
   перекрывают то, что выше, тем же способом, каким этот файл перекрывает
   student-startup.css: сначала база, потом новое.

   Коротко, что изменилось: под лентой условий появилась полоса действия
   (знак Чемпионата, кнопка на форму во всю ширину, ссылки на положение и
   согласие), лента и канал сложены в общий пол под одной подложкой, а
   открытая часть кадра уменьшилась — высота секции уходит за счёт верха
   снимка, низ с чашей и пламенем остаётся на месте.
   ============================================================================ */

/* ==========================================================================
   ДЕЛЬТА — ПЕРЕНОСИТСЯ В styles/student-startup-wide.css
   Всё, что ниже до отметки «конец дельты», — новое. Стенд поверх боевых
   файлов, поэтому здесь только то, что меняется.
   ========================================================================== */

/* ── 1. Высота секции: открытая часть кадра ниже ────────────────────────
   Кадр прибит к низу (`object-position: center bottom` в боевой), поэтому
   меньший --frame-open срезает ВЕРХ снимка, а не низ: чаша стадиона,
   пламя и корпуса атлетов остаются, уходит небо. Было
   clamp(250px, 27vw, 450px) — при 1920 это 450px, из них верхняя треть
   пустое небо. Карточка партнёра занимает эту зону слева, поэтому она же
   и оправдывает остаток высоты.

   Ниже 641px формулу не трогаем: там своя, clamp(210px, 62vw, 300px), и
   кадр работает не открытой частью полосы, а баннером фиксированной
   высоты — та же цифра значит другое. */
@media (min-width: 641px) {
  .startup {
    --frame-open: clamp(230px, 21.8vw, 365px);
  }

}

/* ── 2. Полоса действия под лентой ──────────────────────────────────────
   Кнопка отдельной строкой под лентой условий, знак Чемпионата — там же
   (стенд student-startup-strip-variants.html, вариант 2, выбран 28.08).

   Что это решает разом: действие в секции ровно одно и во всю ширину —
   мимо него не пройти; знак партнёра стоит при действии, а не в углу
   кадра; слова «Спецноминация совместно с» наконец произносятся — ни
   в чипе, ни в карточке их не было; пятая ячейка ленты остаётся каналу,
   и Telegram больше не пропадает на ПК.

   Верхней карточки партнёра нет: она была ответом на тот же вопрос
   («присутствие Чемпионата на ПК»), и держать оба ответа разом незачем.
   Наверху остаётся боевой чип на всех ширинах. */
.startup__deal {
  display: grid;
  justify-items: center;
  gap: 14px;
  width: calc(100% - 2 * clamp(10px, 1.4vw, 20px));
  margin: 0 auto;
  padding: clamp(16px, 1.7vw, 24px) 0 clamp(20px, 2.1vw, 30px);
}

/* Пол секции: лента условий, полоса действия и канал под одной подложкой.
   На планшете и телефоне Telegram уезжает под полосу действия (порядок
   в DOM: bar → deal → live), на ПК возвращается колонкой справа от
   условий — без лишнего воздуха.
   .startup__bar обязан оставаться боксом: на него смотрит reveal.

   Стекло держит пол, а не лента: подложка под блоком одна на всех
   ширинах. Пока блюр был у ленты, ниже 1081px полоса действия и канал
   оказывались уже на базе страницы — под одним блоком получалось две
   разные подложки. */
.startup__floor {
  position: relative;
  border-top: 1px solid var(--line-strong);
  background: rgba(10, 12, 16, 0.86);
  backdrop-filter: blur(16px) saturate(120%);
  -webkit-backdrop-filter: blur(16px) saturate(120%);
}

.startup__floor > .startup__bar {
  border-top: 0;
  border-bottom: 0;
  background: transparent;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

@media (min-width: 1081px) {
  .startup__floor {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    width: 100%;
    padding-inline: clamp(10px, 1.4vw, 20px);
    box-sizing: border-box;
  }

  .startup__floor > .startup__bar {
    grid-column: 1;
    grid-row: 1;
  }

  .startup__floor > .startup__live {
    grid-column: 2;
    grid-row: 1;
    align-self: stretch;
  }

  .startup__floor > .startup__deal {
    grid-column: 1 / -1;
    grid-row: 2;
    width: 100%;
    margin: 0;
    border-top: 1px solid var(--line-soft);
  }

  .startup__floor .startup__cells {
    grid-template-columns: repeat(4, minmax(0, 1fr));
    width: 100%;
    margin: 0;
  }
}

@media (max-width: 1080px) {
  .startup__floor {
    display: flex;
    flex-direction: column;
  }

  .startup__floor > .startup__live {
    width: calc(100% - 2 * clamp(10px, 1.4vw, 20px));
    margin-inline: auto;
  }
}

/* Лента условий и полоса действия — два разных ритма; без линии они
   читаются одним блоком, и кнопка выглядит пятой ячейкой. */
.startup__bar {
  border-bottom: 1px solid var(--line-soft);
}

.startup__deal-inner {
  display: grid;
  justify-items: center;
  gap: 14px;
  width: 100%;
}

.startup__deal-partner {
  display: flex;
  align-items: center;
  gap: clamp(14px, 1.5vw, 22px);
}

.startup__deal-tier {
  color: var(--color-text-muted);
  font: 900 var(--text-sm) / 1.3 var(--font-ui);
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
  white-space: nowrap;
}

.startup__deal-tier b {
  color: var(--color-gold-text);
  font-weight: 900;
}

/* Плитка со знаком: та же механика, что в ростере партнёров — при
   наведении плитка становится светлой подложкой, монохром гаснет,
   проступает фирменный цвет. Иначе нельзя: цветной знак Чемпионата
   нарисован под светлый фон. Здесь лок-ап положен вдоль: высота ниже
   карточной, поля шире — знак работает горизонталью, а не плиткой. */
.startup__deal-plate {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: clamp(48px, 3.6vw, 60px);
  padding: 8px clamp(16px, 1.5vw, 24px);
  border: 1px solid var(--line-soft);
  border-radius: var(--radius-md);
  background: rgba(255, 255, 255, 0.025);
  text-decoration: none;
  transition:
    border-color 180ms ease,
    background-color 180ms ease,
    transform 180ms ease;
}

.startup__deal-mark {
  display: grid;
  place-items: center;
  max-width: 100%;
}

/* Знак крупнее, плитка прежняя: рост съеден полями, не высотой коробки.
   При 1675 знак 38.5px против прежних 31.8 — плюс к весу партнёра в полосе,
   а min-height плитки (60px) по-прежнему больше суммы знака и полей (56.5). */
.startup__deal-logo {
  grid-area: 1 / 1;
  width: auto;
  height: clamp(1.7rem, 2.3vw, 2.5rem);
  max-width: 100%;
  object-fit: contain;
  transition: opacity 200ms ease;
}

.startup__deal-logo--color {
  opacity: 0;
}

@media (hover: hover) {
  .startup__deal-plate:hover {
    border-color: rgba(243, 240, 234, 0.42);
    background: rgba(243, 240, 234, 0.94);
    transform: translateY(-1px);
  }

  .startup__deal-plate:hover .startup__deal-logo--mono {
    opacity: 0;
  }

  .startup__deal-plate:hover .startup__deal-logo--color {
    opacity: 1;
  }
}

.startup__deal-plate:focus-visible {
  border-color: rgba(243, 240, 234, 0.42);
  background: rgba(243, 240, 234, 0.94);
  outline: 2px solid var(--gold);
  outline-offset: 3px;
}

.startup__deal-plate:focus-visible .startup__deal-logo--mono {
  opacity: 0;
}

.startup__deal-plate:focus-visible .startup__deal-logo--color {
  opacity: 1;
}

@media (max-width: 640px) {
  .startup__deal-partner {
    flex-direction: column;
    gap: 10px;
  }

  /* Плитку во всю ширину не растягиваем: две широкие плашки подряд
     (знак и кнопка) читаются как две кнопки. */
}

/* ── 3. Кнопка «Подать заявку» и документы ──────────────────────────────
   Форма собирает ПД, поэтому кнопка живёт только вместе со ссылками на
   положение и согласие: они стоят под ней, а не над (стенд размещений
   student-startup-docs-variants.html, вариант Б).

   Мест у кнопки больше нет — она одна и во всю ширину полосы. Прежняя
   развилка «под лидом / в ленте / и там, и там» из стенда убрана вместе
   с выбором: она держалась на атрибуте data-cta, которого в проекте
   не будет. */
.startup__cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  width: 100%;
  height: 3.75rem;
  padding: 0 1.75rem;
  border-radius: var(--radius-sm);
  /* Кегль поднят с 13px до 15px 29.08 по просьбе владельца. Коробка кнопки
     при этом та же: высота задана жёстко (3.75rem), а не набирается из строки,
     поэтому крупнее становится только надпись. Трекинг 0.08em оставлен: на
     15px с капсовым 0.16em «ПОДАТЬ ЗАЯВКУ» расползается на треть кнопки. */
  font: 800 var(--text-md) / 1 var(--font-ui);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  white-space: nowrap;
  text-decoration: none;
  transition:
    background-color 180ms ease,
    border-color 180ms ease,
    color 180ms ease,
    transform 180ms ease;
}

.startup__cta-arrow {
  width: 1.2rem;
  height: 1.2rem;
  flex: 0 0 auto;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
  transition: transform 180ms ease;
}

.startup__cta:hover .startup__cta-arrow,
.startup__cta:focus-visible .startup__cta-arrow {
  transform: translateX(3px);
}

.startup__cta:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 3px;
}

/* Заливка: единственное сплошное золото на странице — на действии,
   которого больше нигде нет. */
.startup__cta {
  border: 1px solid var(--gold);
  background: var(--gold);
  color: #12141a;
}

.startup__cta:hover {
  background: #f2d489;
  border-color: #f2d489;
  transform: translateY(-1px);
}

/* Приём закрыт (19.10.2026): кнопка снята из разметки, на её месте плашка
   той же коробки — высота полосы не меняется. Не ссылка, поэтому ни блик,
   ни огонёк под курсором (они висят на .startup__cta) её не трогают.
   Золота нет: по системе границ оно только на состояниях и действиях. */
.startup__closed {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  width: 100%;
  height: 3.75rem;
  margin: 0;
  padding: 0 1.75rem;
  box-sizing: border-box;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  background: rgba(255, 255, 255, 0.03);
  text-align: center;
}

.startup__closed-main {
  font: 800 var(--text-md) / 1 var(--font-ui);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(244, 241, 234, 0.78);
}

.startup__closed-sub {
  font: 400 var(--text-sm) / 1.2 var(--font-body);
  color: var(--muted-soft);
}

.startup__closed-sub::before {
  content: '·';
  margin-right: 0.75rem;
}

/* На телефоне в одну строку не влезает: подпись уходит под основную, коробка
   та же 3.75rem — обе строки помещаются в неё с запасом. */
@media (max-width: 640px) {
  .startup__closed {
    flex-direction: column;
    gap: 5px;
    padding: 0 1rem;
  }

  .startup__closed-sub::before {
    content: none;
  }
}


/* Документы — сноской под кнопкой, по центру полосы. */
.startup__docs {
  margin: 0;
  font: 400 12px / 1.5 var(--font-body);
  color: var(--muted-soft);
  text-align: center;
}

.startup__docs a {
  color: rgba(243, 240, 234, 0.88);
  text-decoration: none;
  border-bottom: 1px solid rgba(232, 195, 106, 0.45);
  transition:
    border-color 160ms ease,
    color 160ms ease;
}

.startup__docs a:hover {
  color: #e8c36a;
  border-bottom-color: #e8c36a;
}

.startup__docs span {
  margin: 0 7px;
}

@media (max-width: 640px) {
  .startup__docs span {
    margin: 0 6px;
  }
}

/* ── 4. Вход секции ─────────────────────────────────────────────────────
   Полоса действия — самостоятельный узел прямо в .startup, не ребёнок
   ленты, поэтому прозрачность ей не наследуется и вписывать её надо
   во ВСЕ ТРИ правила reveal: --reveal-ready (opacity 0), --reveal-armed
   (transition) и .is-*-revealed (opacity 1). Пропуск третьего оставляет
   узел невидимым навсегда — так уже было со строкой документов 27.08.
   Едет вместе с лентой, последней ступенью. */
@media (prefers-reduced-motion: no-preference) {
  .startup.startup--reveal-ready .startup__deal {
    opacity: 0;
    transform: translateY(24px);
  }

  .startup.startup--reveal-armed .startup__deal {
    transition:
      opacity 520ms ease-out,
      transform 700ms cubic-bezier(0.2, 0.72, 0.18, 1);
    transition-delay: 460ms;
  }

  .startup.startup--reveal-ready.is-bar-revealed .startup__deal {
    opacity: 1;
    transform: none;
  }
}

/* ==========================================================================
   ДВИЖЕНИЕ СЕКЦИИ — 29.08.2026
   Перенесено со стенда student-startup-motion.html, где приёмы смотрели
   по одному через атрибут data-motion. Владелец взял все восемь, атрибут
   снят, селекторы схлопнулись до классов. Четыре приёма играют на входе
   (титул, нить, вспышка знака, разделители), четыре живут постоянно
   (дыхание кадра, свет факела, блик по кнопке, огонёк под курсором).

   Всё внутри @media (prefers-reduced-motion: no-preference): человеку,
   который просил не двигать, секция остаётся ровно такой, как сейчас.
   Анимируются только opacity и transform — по тем же соображениям, по
   которым в перф-проходе CLS убирали с width на transform.
   ========================================================================== */

@media (prefers-reduced-motion: no-preference) {
  /* ── 1. Кадр дышит ────────────────────────────────────────────────────
     Очень медленный наезд, 24 секунды в одну сторону. Ловушка: вход
     секции анимирует у картинки тот же transform, и бесконечная анимация
     перебила бы его на полпути — поэтому включается только после того,
     как сцена проявилась, и с задержкой. */
  .startup.is-scene-revealed .startup__frame img {
    animation: startup-breath 24s ease-in-out 1.4s infinite alternate;
  }

  @keyframes startup-breath {
    from {
      transform: scale(1);
    }
    to {
      transform: scale(1.055);
    }
  }

  /* ── 2. Свет факела ───────────────────────────────────────────────────
     Тёплое пятно там, где на снимке пламя, с неровным пульсом: огонь не
     дышит ровно. Лежит на завесе через ::after, новых узлов не заводит.
     Пятно в экранном режиме — оно добавляет свет, а не красит кадр. */
  .startup .startup__veil::after {
    content: '';
    position: absolute;
    inset: 0;
    pointer-events: none;
    background: radial-gradient(ellipse 24% 30% at 45% 32%, rgba(255, 206, 130, 0.2), transparent 68%);
    mix-blend-mode: screen;
    animation: startup-torch 5.5s ease-in-out infinite;
  }

  @keyframes startup-torch {
    0%,
    100% {
      opacity: 0.5;
      transform: scale(1);
    }
    28% {
      opacity: 0.95;
      transform: scale(1.05);
    }
    44% {
      opacity: 0.62;
      transform: scale(1.01);
    }
    70% {
      opacity: 0.85;
      transform: scale(1.03);
    }
  }

  /* ── 3. Титул по строкам ──────────────────────────────────────────────
     Сейчас заголовок въезжает целиком одним блоком. Здесь каждое слово
     выходит из-под своей кромки со сдвигом в 90мс — читается как набор
     строки за строкой. Маску даёт обёртка с overflow: clip, поэтому
     слово появляется не из пустоты, а из-за края.
     Для переноса нужны спаны в разметке; на стенде их ставит скрипт.

     Что проверить перед переносом: у титула есть --track-title-edge,
     тёмная кромка под буквами поверх кадра, и overflow: clip срезает её
     по верху первой и низу последней строки. Контраст мерить композитом
     по строкам, как в прошлый раз, а не на глаз. */
  .startup .startup__title-line {
    display: block;
    overflow: clip;
    /* «Й» в «ЛУЧШИЙ» и «СТУДЕНЧЕСКИЙ» выносит бревис выше строчного бокса: при
       line-height 0.95 чернила уходят за верх на 4.8px при кегле 72 (мерено
       через actualBoundingBoxAscent), и маска срезала бы его. Поле поднимает
       верхнюю кромку маски, отрицательный отступ возвращает строку на место —
       буквы целы, геометрия титула прежняя. Снизу поля нет намеренно: там
       кромка и прячет слово до выхода, а лишние 6px открыли бы его край. */
    padding-top: 0.09em;
    margin-top: -0.09em;
  }

  .startup .startup__title-line > span {
    display: block;
    transform: translateY(112%);
  }

  .startup.startup--reveal-armed .startup__title-line > span {
    transition: transform 900ms cubic-bezier(0.22, 1, 0.36, 1);
  }

  .startup.is-copy-revealed .startup__title-line > span {
    transform: none;
  }

  .startup .startup__title-line:nth-child(2) > span {
    transition-delay: 90ms;
  }

  .startup .startup__title-line:nth-child(3) > span {
    transition-delay: 180ms;
  }

  .startup .startup__title-line:nth-child(4) > span {
    transition-delay: 270ms;
  }

  /* Пока строки едут сами, общий сдвиг титула не нужен: иначе он едет
     дважды и приезжает рывком. */
  .startup.startup--reveal-ready .startup__title {
    opacity: 1;
    transform: none;
  }

  /* ── 4. Блик по кнопке ────────────────────────────────────────────────
     Та же грамматика, что у золотых шевронов перехода на страницу трека:
     узкая светлая полоса проходит по кнопке и надолго уходит. Пауза
     длиннее прохода — иначе кнопка мигает и начинает раздражать. */
  .startup .startup__cta {
    position: relative;
    overflow: hidden;
  }

  .startup .startup__cta::after {
    content: '';
    position: absolute;
    inset: 0;
    pointer-events: none;
    background: linear-gradient(
      105deg,
      rgba(255, 255, 255, 0) 42%,
      rgba(255, 255, 255, 0.5) 50%,
      rgba(255, 255, 255, 0) 58%
    );
    transform: translateX(-130%);
    animation: startup-sheen 7s cubic-bezier(0.45, 0, 0.25, 1) 2.4s infinite;
  }

  @keyframes startup-sheen {
    0% {
      transform: translateX(-130%);
    }
    18%,
    100% {
      transform: translateX(130%);
    }
  }

  /* ── 5. Золотая нить над полосой ──────────────────────────────────────
     Волосок между лентой условий и полосой действия прочерчивается слева
     направо, когда пол приезжает: он же и разделитель, и жест «здесь
     начинается действие». Гаснет вправо, чтобы не читаться линейкой. */
  .startup .startup__deal {
    position: relative;
  }

  .startup .startup__deal::before {
    content: '';
    position: absolute;
    top: -1px;
    right: 0;
    left: 0;
    height: 1px;
    background: linear-gradient(90deg, var(--gold), rgba(232, 195, 106, 0));
    transform: scaleX(0);
    transform-origin: left center;
  }

  .startup.startup--reveal-armed .startup__deal::before {
    transition: transform 1100ms cubic-bezier(0.22, 1, 0.36, 1) 320ms;
  }

  .startup.is-bar-revealed .startup__deal::before {
    transform: scaleX(1);
  }

  /* ── 6. Вспышка фирменного цвета ──────────────────────────────────────
     Знак Чемпионата на секунду становится оранжевым и возвращается
     к белому: цвет партнёра показан, но постоянного оранжевого рядом
     с золотом кнопки на экране нет. Белый остаётся штатным состоянием —
     именно его партнёр прислал для тёмного фона. */
  .startup.is-bar-revealed .startup__deal-logo--color {
    animation: startup-brandflash 2200ms ease-in-out 900ms 1;
  }

  .startup.is-bar-revealed .startup__deal-logo--mono {
    animation: startup-brandflash-mono 2200ms ease-in-out 900ms 1;
  }

  @keyframes startup-brandflash {
    0%,
    100% {
      opacity: 0;
    }
    28%,
    62% {
      opacity: 1;
    }
  }

  @keyframes startup-brandflash-mono {
    0%,
    100% {
      opacity: 1;
    }
    28%,
    62% {
      opacity: 0;
    }
  }

  /* ── 7. Разделители ленты прочерчиваются ──────────────────────────────
     Вертикальные волоски между ячейками условий не проявляются вместе
     с текстом, а прорастают сверху вниз по очереди. Родная граница на
     это время снимается — тянется псевдоэлемент. */
  .startup .startup__cell {
    position: relative;
    border-left-color: transparent;
  }

  .startup .startup__cell::before {
    content: '';
    position: absolute;
    top: 0;
    bottom: 0;
    left: -1px;
    width: 1px;
    background: var(--line-soft);
    transform: scaleY(0);
    transform-origin: top center;
  }

  .startup .startup__cell:first-child::before {
    display: none;
  }

  .startup.startup--reveal-armed .startup__cell::before {
    transition: transform 700ms cubic-bezier(0.22, 1, 0.36, 1);
  }

  .startup.is-bar-revealed .startup__cell::before {
    transform: scaleY(1);
  }

  .startup .startup__cell:nth-child(2)::before {
    transition-delay: 120ms;
  }

  .startup .startup__cell:nth-child(3)::before {
    transition-delay: 210ms;
  }

  .startup .startup__cell:nth-child(4)::before {
    transition-delay: 300ms;
  }

  /* ── 8. Огонёк под курсором ───────────────────────────────────────────
     Тёплое пятно внутри кнопки идёт за указателем: координаты пишет
     скрипт в --mx/--my. Только там, где есть настоящий курсор, — на
     тач-экране пятно замирало бы в точке последнего тапа. */
  @media (hover: hover) {
    .startup .startup__cta {
      position: relative;
      overflow: hidden;
    }

    .startup .startup__cta::before {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      width: 180px;
      height: 180px;
      margin: -90px 0 0 -90px;
      border-radius: 50%;
      pointer-events: none;
      background: radial-gradient(circle, rgba(255, 255, 255, 0.55), transparent 65%);
      opacity: 0;
      transform: translate(var(--mx, 0px), var(--my, 0px));
      transition: opacity 220ms ease;
    }

    .startup .startup__cta:hover::before {
      opacity: 1;
    }
  }
}


/* ==========================================================================
   ЭТАП «НОМИНАНТЫ» — 23.10.2026
   Перенесено со стенда student-startup-7b-variants.html. Основа — вариант
   Claude Design «Startup 7b Conditions Left», правки — по разбору 23.10.
   Выбор владельца: на телефоне «Падение», условия плитой, стекло 0.82, шаг
   ленты 3 с с отскоком, контраст лида — как есть.

   Секция целиком в кадре, пола нет: слева титул, лид и плита условий с
   документами, справа колонка — Чемпионат, лента номинантов, Telegram. Ниже
   1081px кадр — баннер, как раньше, блоки встают в колонку, номинанты —
   сразу под лидом.

   Модификатор .startup--lineup поднимает специфичность над правилами
   mobile-home.css (#student-startup .x): с ними правила ниже иначе
   сравнялись бы, и мобильный файл победил бы порядком подключения.
   Правила пола выше (.startup__floor, __deal, __closed, __live) остались без
   разметки — на случай повторного приёма.
   ========================================================================== */

/* ── 1. Ручки ──────────────────────────────────────────────────────────────
   Высота на ПК — как у треков (live-track-base.css): секция в один экран,
   вровень с соседями. Стекло плит одно на всю секцию — .82, как у карточек
   номинантов треков (выбор владельца 21.10: «неприятно просвечивает фон»). */
#student-startup.startup--lineup {
  --gut: clamp(12px, 1.4vw, 20px);
  --side-w: clamp(296px, min(26.5vw, 33.3vw - 44px, 50vw - 244px), 420px);
  --ss-h: max(800px, calc(100svh - clamp(20px, 2.8vw, 40px)));
  --plate-bg: rgba(11, 13, 16, 0.82);
  --plate-bg-hover: rgba(20, 23, 28, 0.9);
  --plate-blur: var(--glass-blur-strong);
  --proj-h: 120px;
  --proj-gap: 12px;
}

#student-startup.startup--lineup :is(.startup__bar, .startup__champ, .startup__proj-inner, .startup__tg) {
  border: 1px solid var(--glass-line);
  border-radius: var(--radius-lg);
  background: var(--plate-bg);
  -webkit-backdrop-filter: blur(var(--plate-blur)) saturate(var(--glass-sat));
  backdrop-filter: blur(var(--plate-blur)) saturate(var(--glass-sat));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);
}

/* Обёртка сцены держит свои поля: overflow: clip их не держит, и отступ
   раскладки под баннер (ниже 1081px) проваливался сквозь неё — баннер
   уезжал вниз под титул */
#student-startup.startup--lineup .startup__scene {
  display: flow-root;
}

/* ── 2. ПК: всё в кадре ────────────────────────────────────────────────────
   Колонка и плита тянутся от ширины, чтобы не закрыть руки с факелами. Края
   кулаков при cover и привязке к низу (секция 800 в высоту): левый —
   0.347·W, пока кадр упирается в ширину (от 1200px), и W/2 − 184 уже;
   правый — 0.667·W и W/2 + 200. Отсюда формулы ширин: до кулака остаётся
   не меньше 24px. */
@media (min-width: 1081px) {
  #student-startup.startup--lineup .startup__scene,
  #student-startup.startup--lineup .startup__layout {
    min-height: var(--ss-h);
  }

  /* Текст сверху слева, колонка справа: плотность копится в левом верхнем
     углу, у правого борта и у низа. Диагональ 202deg выше копила её внизу
     слева, под прежний пол */
  #student-startup.startup--lineup .startup__veil {
    background:
      linear-gradient(
        158deg,
        rgba(10, 12, 16, 0.9) 0%,
        rgba(10, 12, 16, 0.8) 16%,
        rgba(10, 12, 16, 0.5) 31%,
        rgba(10, 12, 16, 0.14) 46%,
        rgba(10, 12, 16, 0) 56%
      ),
      linear-gradient(270deg, rgba(10, 12, 16, 0.62) 0%, rgba(10, 12, 16, 0.4) 20%, rgba(10, 12, 16, 0) 34%),
      linear-gradient(0deg, rgba(10, 12, 16, 0.78) 0%, rgba(10, 12, 16, 0.32) 14%, rgba(10, 12, 16, 0) 30%),
      linear-gradient(
        202deg,
        rgba(255, 255, 255, 0) 25%,
        rgba(255, 255, 255, 0.035) 35%,
        rgba(255, 255, 255, 0.12) 46%,
        rgba(255, 255, 255, 0.05) 55%,
        rgba(255, 255, 255, 0) 64%
      );
  }

  #student-startup.startup--lineup .startup__layout {
    position: relative;
  }

  /* Левая колонка — во всю высоту кадра: титул и лид сверху, плита условий
     прижата к низу, вровень с Telegram. align-items сброшен явно: боевое
     end от сетки прижало бы блоки вправо */
  #student-startup.startup--lineup .startup__body {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    box-sizing: border-box;
    width: auto;
    max-width: calc(100% - var(--side-w) - 3 * var(--gut));
    min-height: var(--ss-h);
    margin: 0;
    padding: calc(var(--gut) + 33px + clamp(22px, 2.3vw, 33px)) 0 var(--gut) var(--gut);
  }

  #student-startup.startup--lineup .startup__title {
    margin: 0;
  }

  /* Лид кончается до пламени: левый край огня при 1440 — 560px, при 1280 —
     497. Нижнее поле — наименьший зазор до плиты, когда кадру тесно.
     Контраст лида по худшей точке 2.5–3.2 при норме 4.5 (у прежней
     раскладки 2.8–3.1): слабое место — небо между атлетом и огнём, а плотнее
     завеса погасила бы край пламени. Владелец оставил как есть 23.10 */
  #student-startup.startup--lineup .startup__lead {
    max-width: clamp(340px, 52vw - 230px, 560px);
    margin: clamp(16px, 1.6vw, 22px) 0 clamp(20px, 2vw, 28px);
  }

  #student-startup.startup--lineup .startup__bar {
    width: clamp(300px, min(34.7vw - 44px, 50vw - 228px), 480px);
    margin-top: auto;
  }

  #student-startup.startup--lineup .startup__side {
    position: absolute;
    z-index: 4;
    top: var(--gut);
    right: var(--gut);
    bottom: var(--gut);
    display: flex;
    flex-direction: column;
    gap: 14px;
    width: var(--side-w);
  }

  /* Знак в чипе повторял большую карточку на той же высоте */
  #student-startup.startup--lineup .startup__partner-link {
    display: none;
  }
}

@media (min-width: 1081px) and (prefers-reduced-motion: no-preference) {
  /* Свет факела — там, где пламя в кадре высотой в экран */
  #student-startup.startup--lineup .startup__veil::after {
    background: radial-gradient(ellipse 24% 30% at 46% 40%, rgba(255, 206, 130, 0.2), transparent 68%);
  }
}

/* ── 3. Плита условий ──────────────────────────────────────────────────────
   Одна подложка, ячейки 2×2 через волоски: отдельными карточками на кадре
   остаются только номинанты. .startup__bar сохранён — на него смотрит вход
   секции (landing-interactions.js). Документы — нижней строкой: над снимком
   12px давали контраст 2.4–3.3, на плите — 11–12. */
#student-startup.startup--lineup .startup__bar {
  position: relative;
  overflow: hidden;
}

#student-startup.startup--lineup .startup__cells {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  width: 100%;
  margin: 0;
}

#student-startup.startup--lineup .startup__cell {
  min-width: 0;
  padding: 15px clamp(13px, 1.25vw, 18px) 14px;
  border-top: 0;
  border-left: 1px solid var(--line-soft);
}

#student-startup.startup--lineup .startup__cell:nth-child(odd) {
  border-left: 0;
}

#student-startup.startup--lineup .startup__cell:nth-child(odd)::before {
  display: none;
}

#student-startup.startup--lineup .startup__cell:nth-child(n + 3) {
  border-top: 1px solid var(--line-soft);
}

#student-startup.startup--lineup .startup__cell dd {
  font-size: clamp(17px, 1.6vw, 24px);
}

@media (prefers-reduced-motion: no-preference) {
  /* Вертикальный волосок прорастает на входе, как в прежней ленте */
  #student-startup.startup--lineup .startup__cell {
    border-left-color: transparent;
  }
}

#student-startup.startup--lineup .startup__bar .startup__docs {
  margin: 0;
  padding: 11px clamp(13px, 1.25vw, 18px) 12px;
  border-top: 1px solid var(--line-soft);
  text-align: left;
}

/* ── 4. Колонка: Чемпионат ── */
#student-startup.startup--lineup .startup__champ {
  display: grid;
  flex: none;
  gap: 13px;
  padding: 17px;
  box-shadow:
    var(--glass-shadow),
    inset 0 1px 0 rgba(255, 255, 255, 0.08);
}

#student-startup.startup--lineup .startup__champ .startup__deal-tier {
  font-size: 10.5px;
  white-space: normal;
}

#student-startup.startup--lineup .startup__champ .startup__deal-plate {
  min-height: clamp(96px, 8.9vw, 128px);
  padding: 14px;
}

#student-startup.startup--lineup .startup__champ .startup__deal-logo {
  height: clamp(38px, 3.6vw, 52px);
}

/* ── 5. Номинанты ──────────────────────────────────────────────────────────
   Подпись «Номинанты» без числа — счётчика нет по правилу владельца. Стоит
   на снимке, поэтому светлее серого: #a8adb7 давал по худшей точке 2.9.
   Колесо мыши лента не перехватывает: список бесконечный, края нет, и
   страница застревала бы, пока курсор над колонкой. Листают кнопки,
   перетаскивание мышью и стрелки; палец листает страницу (pan-y). */
#student-startup.startup--lineup .startup__picks {
  display: flex;
  flex: 1;
  flex-direction: column;
  min-width: 0;
  min-height: 0;
}

#student-startup.startup--lineup .startup__picks-head {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 28px;
  padding: 0 2px 8px 4px;
}

#student-startup.startup--lineup .startup__picks-label {
  margin: 0 auto 0 0;
  color: rgba(244, 241, 234, 0.9);
  font: 800 var(--text-xs) / 1.2 var(--font-ui);
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
  text-shadow: var(--track-title-edge);
}

#student-startup.startup--lineup .startup__picks-nav {
  display: flex;
  gap: 6px;
}

#student-startup.startup--lineup .startup__picks-nav button {
  display: grid;
  place-items: center;
  width: 28px;
  height: 28px;
  padding: 0;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: rgba(18, 20, 24, 0.55);
  color: rgba(244, 241, 234, 0.72);
  cursor: pointer;
  transition:
    border-color 180ms ease,
    background-color 180ms ease,
    color 180ms ease;
}

#student-startup.startup--lineup .startup__picks-nav button:hover {
  border-color: var(--gold-border);
  background: rgba(232, 195, 106, 0.1);
  color: var(--gold);
}

#student-startup.startup--lineup .startup__picks-nav button:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
}

#student-startup.startup--lineup .startup__picks-nav svg {
  width: 12px;
  height: 12px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
}

#student-startup.startup--lineup .startup__rail {
  position: relative;
  flex: 1;
  min-height: 0;
  overflow: hidden;
  cursor: grab;
  touch-action: pan-y;
  user-select: none;
  -webkit-mask-image: linear-gradient(180deg, transparent 0, #000 14px, #000 calc(100% - 56px), transparent);
  mask-image: linear-gradient(180deg, transparent 0, #000 14px, #000 calc(100% - 56px), transparent);
}

#student-startup.startup--lineup .startup__rail.is-dragging {
  cursor: grabbing;
}

#student-startup.startup--lineup .startup__list {
  display: flex;
  flex-direction: column;
  gap: var(--proj-gap);
  margin: 0;
  padding: 14px 0 0;
  list-style: none;
  will-change: transform;
}

#student-startup.startup--lineup .startup__proj {
  flex: none;
  height: var(--proj-h);
}

#student-startup.startup--lineup .startup__proj-inner {
  display: flex;
  flex-direction: column;
  height: 100%;
  padding: 15px 17px 14px;
  cursor: pointer;
  transition:
    border-color 180ms ease,
    background-color 180ms ease;
}

#student-startup.startup--lineup .startup__proj-inner:hover {
  border-color: rgba(243, 240, 234, 0.42);
  background: var(--plate-bg-hover);
}

/* Внутрь: снаружи кольцо срезали бы обрез ленты и маска */
#student-startup.startup--lineup .startup__proj-inner:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: -3px;
}

#student-startup.startup--lineup .startup__proj-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}

#student-startup.startup--lineup .startup__proj-uni {
  min-width: 0;
  overflow: hidden;
  color: rgba(244, 241, 234, 0.62);
  font: 500 10px / 1.2 'IBM Plex Mono', monospace;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  white-space: nowrap;
  text-overflow: ellipsis;
}

#student-startup.startup--lineup .startup__proj-plus {
  position: relative;
  flex: none;
  width: 20px;
  height: 20px;
  border: 1px solid var(--gold-border);
  border-radius: 50%;
  transition: background-color 180ms ease;
}

#student-startup.startup--lineup .startup__proj-plus::before,
#student-startup.startup--lineup .startup__proj-plus::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 8px;
  height: 1.5px;
  margin: -0.75px 0 0 -4px;
  background: var(--gold);
}

#student-startup.startup--lineup .startup__proj-plus::after {
  transform: rotate(90deg);
}

#student-startup.startup--lineup .startup__proj-inner:hover .startup__proj-plus {
  background: rgba(232, 195, 106, 0.14);
}

#student-startup.startup--lineup .startup__proj-name {
  display: -webkit-box;
  margin: 8px 0 0;
  overflow: hidden;
  color: var(--ink);
  font: 700 19px / 1.05 var(--font-display);
  letter-spacing: -0.005em;
  text-transform: uppercase;
  text-wrap: balance;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
}

#student-startup.startup--lineup .startup__proj--long .startup__proj-name {
  font-size: 15px;
  -webkit-line-clamp: 3;
}

#student-startup.startup--lineup .startup__proj-site {
  display: inline-flex;
  align-items: center;
  align-self: flex-start;
  max-width: 100%;
  margin-top: auto;
  color: rgba(244, 241, 234, 0.78);
  font: 600 12.5px / 1.3 var(--font-ui);
  text-decoration: none;
  white-space: nowrap;
  transition: color 160ms ease;
}

#student-startup.startup--lineup .startup__proj-url {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}

#student-startup.startup--lineup .startup__proj-site:hover,
#student-startup.startup--lineup .startup__proj-site:focus-visible {
  color: var(--gold);
}

/* ── 6. Telegram ───────────────────────────────────────────────────────────
   Подпись — дата церемонии: «Приём заявок завершён» уже сказан в лиде, а
   итогов 19 ноября без пола в секции больше нигде нет. */
#student-startup.startup--lineup .startup__tg {
  display: grid;
  flex: none;
  align-content: start;
  padding: 17px;
  color: var(--color-gold-text);
  text-decoration: none;
  transition: border-color 180ms ease;
}

#student-startup.startup--lineup .startup__tg:hover {
  border-color: rgba(243, 240, 234, 0.42);
}

#student-startup.startup--lineup .startup__tg .startup__live-label {
  display: block;
  margin: 0 0 8px;
}

#student-startup.startup--lineup .startup__tg .startup__live-title {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: clamp(22px, 1.9vw, 27px);
}

#student-startup.startup--lineup .startup__tg .startup__live-status {
  display: block;
}

/* ── 7. Вход секции ────────────────────────────────────────────────────────
   Новые узлы — во все три правила reveal: --reveal-ready, --reveal-armed и
   .is-*-revealed, иначе узел остаётся с opacity 0 навсегда (так уже было со
   строкой документов 27.08). Колонка едет со сценой — она стоит наверху
   кадра; документы — с ячейками плиты, последними. */
@media (prefers-reduced-motion: no-preference) {
  .startup.startup--lineup.startup--reveal-ready :is(.startup__docs, .startup__champ, .startup__picks, .startup__tg) {
    opacity: 0;
    transform: translateY(18px);
  }

  .startup.startup--lineup.startup--reveal-armed :is(.startup__docs, .startup__champ, .startup__picks, .startup__tg) {
    transition:
      opacity 520ms ease-out,
      transform 700ms cubic-bezier(0.2, 0.72, 0.18, 1);
  }

  .startup.startup--lineup.startup--reveal-armed .startup__champ {
    transition-delay: 220ms;
  }

  .startup.startup--lineup.startup--reveal-armed .startup__picks {
    transition-delay: 340ms;
  }

  .startup.startup--lineup.startup--reveal-armed :is(.startup__docs, .startup__tg) {
    transition-delay: 380ms;
  }

  .startup.startup--lineup.startup--reveal-ready.is-bar-revealed .startup__docs,
  .startup.startup--lineup.startup--reveal-ready.is-scene-revealed :is(.startup__champ, .startup__picks, .startup__tg) {
    opacity: 1;
    transform: none;
  }
}

/* ── 8. Планшет и телефон: кадр баннером, блоки в колонку ──────────────────
   Поведение ниже 1080px прежнее: завеса снята, кадр обрезан по
   --frame-open, текст стоит на базе страницы — под ним нет снимка, поэтому
   и блюр не нужен, плиты непрозрачные. Порядок: титул, лид, номинанты,
   условия, Чемпионат, Telegram — обёртки колонок на это время исчезают
   (display: contents). Лента — та же, что на ПК, окном в три карточки. */
@media (max-width: 1080px) {
  #student-startup.startup--lineup {
    --gut-m: 12px;
    --plate-bg: rgba(16, 19, 24, 0.94);
    --plate-bg-hover: rgba(22, 25, 31, 0.96);
  }

  #student-startup.startup--lineup :is(.startup__bar, .startup__champ, .startup__proj-inner, .startup__tg) {
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
  }

  #student-startup.startup--lineup .startup__proj-inner {
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
  }

  #student-startup.startup--lineup .startup__layout {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    margin-top: var(--frame-open);
    padding: clamp(22px, 4vw, 34px) var(--gut-m) clamp(26px, 5vw, 36px);
    border-top: 1px solid var(--line-strong);
  }

  #student-startup.startup--lineup :is(.startup__body, .startup__side) {
    display: contents;
  }

  #student-startup.startup--lineup .startup__title {
    order: 1;
    margin: 0;
  }

  #student-startup.startup--lineup .startup__lead {
    order: 2;
  }

  #student-startup.startup--lineup .startup__picks {
    order: 4;
    margin-top: 28px;
  }

  #student-startup.startup--lineup .startup__picks-head {
    padding: 0 0 10px;
  }

  #student-startup.startup--lineup .startup__rail {
    flex: none;
    height: calc(3 * (var(--proj-h) + var(--proj-gap)) + 22px);
  }

  #student-startup.startup--lineup .startup__bar {
    order: 5;
    margin-top: 24px;
  }

  #student-startup.startup--lineup .startup__champ {
    order: 6;
    margin-top: 12px;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
  }

  #student-startup.startup--lineup .startup__tg {
    order: 7;
    margin-top: 12px;
    justify-items: start;
    align-items: start;
    justify-content: normal;
    min-height: 0;
    text-align: left;
  }
}

/* Планшет: лента колонкой рядом с условиями, иначе карточка была бы во всю
   ширину — 870px на 120; Чемпионат и Telegram в ряд */
@media (min-width: 641px) and (max-width: 1080px) {
  #student-startup.startup--lineup .startup__layout {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: 12px;
  }

  #student-startup.startup--lineup :is(.startup__title, .startup__lead) {
    grid-column: 1 / -1;
  }

  #student-startup.startup--lineup .startup__bar {
    grid-column: 1;
    grid-row: 3;
    align-self: start;
    margin-top: 28px;
  }

  #student-startup.startup--lineup .startup__picks {
    grid-column: 2;
    grid-row: 3;
  }
}

@media (max-width: 640px) {
  /* Ссылка не рвётся посередине: «Согласие на обработку / данных» */
  #student-startup.startup--lineup .startup__docs a {
    white-space: nowrap;
  }

  #student-startup.startup--lineup .startup__champ .startup__deal-plate {
    min-height: 84px;
  }

  #student-startup.startup--lineup .startup__champ .startup__deal-logo {
    height: 34px;
  }
}
