/* ============================================================
   Тема Синапса поверх стандартной темы LibreChat.
   Подключается через sub_filter в nginx последним в <head>,
   поэтому переопределяет штатные стили без !important.

   Правка образа не требуется — обновление LibreChat это переживёт.
   ============================================================ */

/* ---------- Шрифт -----------------------------------------
   Manrope, свой, с сервера. Переменное начертание 400–800:
   один файл на все насыщенности вместо пяти.
   Подмножества разделены по unicode-range — браузер скачает
   только нужные: для русского интерфейса это кириллица плюс
   латиница, около 38 КБ.
   font-display: swap — текст виден сразу системным шрифтом
   и не мигает пустотой, пока грузится свой.              */

@font-face {
  font-family: 'Manrope';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url('/brand/fonts/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('/brand/fonts/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+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Manrope';
  font-style: normal;
  font-weight: 400 800;
  font-display: swap;
  src: url('/brand/fonts/manrope-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
                 U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF,
                 U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0,
                 U+2113, U+2C60-2C7F, U+A720-A7FF;
}

:root {
  --syn-font: 'Manrope', 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;

  /* Фирменные цвета, снятые с иконки */
  --syn-blue:   #3b5bff;
  --syn-violet: #8b5cf6;
  --syn-cyan:   #38bdf8;
  --syn-deep:   #0b0d1c;
  --syn-gradient: linear-gradient(135deg, var(--syn-blue) 0%, var(--syn-violet) 100%);
}

/* Моноширинный оставляем как был: код и формулы своим шрифтом. */
html, body, input, textarea, select, button, optgroup,
h1, h2, h3, h4, h5, h6, .font-sans {
  font-family: var(--syn-font);
}

/* Manrope геометричный, в плотном интерфейсе выигрывает от
   чуть уменьшенного межбуквенного просвета. */
body { letter-spacing: -0.011em; }

/* ---------- Шкала серого ----------------------------------
   LibreChat строит весь интерфейс на --gray-*: тёмная тема
   раздаёт эти переменные поверхностям, границам и тексту.
   Перекрашиваем саму шкалу, а не полсотни селекторов — тон
   меняется у всего разом. Светлота ступеней сохранена,
   меняется только оттенок, поэтому контраст текста остаётся
   таким, каким его задумывали авторы.                     */

:root {
  --gray-900: #0a0c1a;
  --gray-850: #10132a;
  --gray-800: #161a33;
  --gray-700: #1f2442;
  --gray-600: #2c3256;
  --gray-500: #454b75;
  --gray-400: #9a9bc0;
  --gray-300: #cbcce4;
  --gray-200: #e2e3f1;
  --gray-100: #ecedf7;
  --gray-50:  #f7f7fc;
  --gray-20:  #eceef6;

  --brand-purple: #8b7cff;

  /* Кнопка отправки. В светлой теме она была зелёной —
     цвет чужого бренда, который переопределяли только в .dark. */
  --surface-submit:       var(--syn-blue);
  --surface-submit-hover: #2c46de;
  --ring-primary:         var(--syn-blue);
}

.dark {
  --surface-submit:       var(--syn-blue);
  --surface-submit-hover: #2c46de;
  --background: 230 43% 6%;
  --ring:       232 100% 74%;
}

/* ============================================================
   ЭКРАН ВХОДА
   Прицел через :has(.w-authPageWidth) — это признак страниц
   входа, регистрации и восстановления. Оформление не протекает
   в сам чат.
   ============================================================ */

:root {
  /* Тёмная «таблетка» — единственный сильный акцент на экране.
     Не чёрная: холодный синий подтон роднит её с иконкой. */
  --syn-ink:       #171a2e;
  --syn-ink-hover: #23273f;
  --syn-muted:     #7c83a8;
  --syn-line:      #e8eaf5;
}

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

body:has(.w-authPageWidth) {
  background-color: #eef0fb;
  background-image:
    radial-gradient(120% 95% at  8%   0%, #dcd9fb 0%, transparent 55%),
    radial-gradient(115% 85% at 96%   6%, #d2e5fd 0%, transparent 52%),
    radial-gradient(105% 85% at 88% 100%, #fae3ee 0%, transparent 50%),
    radial-gradient(115% 90% at  2%  96%, #dee6fd 0%, transparent 55%),
    linear-gradient(180deg, #f1f3fd 0%, #fcfcff 100%);
  background-attachment: fixed;
}

body:has(.w-authPageWidth) #root > div,
body:has(.w-authPageWidth) main,
body:has(.w-authPageWidth) main > div {
  background-color: transparent;
}

body:has(.w-authPageWidth) #root > div { justify-content: center; }
body:has(.w-authPageWidth) main        { flex-grow: 0; }

/* ---------- Бренд в углу ----------------------------------
   Тёмная таблетка со знаком и названием, как в примере NanoAI.
   :has() надёжнее классов: вёрстка LibreChat меняется от версии
   к версии, а картинка с этим alt остаётся. */

body:has(.w-authPageWidth) div:has(> img[alt*="Синапс"]) {
  position: fixed;
  top: 22px;
  left: 22px;
  z-index: 20;
  width: auto;
  height: auto;
  margin: 0;
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 7px 16px 7px 8px;
  background: var(--syn-ink);
  border-radius: 999px;
  box-shadow: 0 8px 22px rgba(23, 26, 46, 0.20);
}

body:has(.w-authPageWidth) img[alt*="Синапс"] {
  height: 28px;
  width: 28px;
  border-radius: 9px;
}

body:has(.w-authPageWidth) div:has(> img[alt*="Синапс"])::after {
  content: 'Синапс';
  color: #fff;
  font-size: 0.95rem;
  font-weight: 700;
  letter-spacing: -0.01em;
}

/* ---------- Карточка --------------------------------------
   Плотная белая плоскость, а не матовое стекло: в примерах
   карточки именно непрозрачные, за счёт этого читается край. */

body:has(.w-authPageWidth) .w-authPageWidth {
  width: 416px;
  max-width: calc(100vw - 2rem);
  background-color: #fff;
  border: 1px solid rgba(255, 255, 255, 0.9);
  border-radius: 24px;
  padding: 2rem 2rem 1.9rem;
  box-shadow:
    0 24px 56px rgba(74, 84, 150, 0.13),
    0 4px  12px rgba(74, 84, 150, 0.05);
}

/* Плашка с иконкой над заголовком — приём из примера Ebolt.
   Мелкая вложенная плоскость сразу задаёт всей карточке
   ощущение слоёности. */
body:has(.w-authPageWidth) .w-authPageWidth::before {
  content: '';
  display: block;
  width: 52px;
  height: 52px;
  margin: 0 auto 1.1rem;
  border-radius: 15px;
  background-color: #fff;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%233b5bff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4'/%3E%3Cpolyline points='10 17 15 12 10 7'/%3E%3Cline x1='15' y1='12' x2='3' y2='12'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  border: 1px solid var(--syn-line);
  box-shadow: 0 4px 12px rgba(74, 84, 150, 0.10);
}

body:has(.w-authPageWidth) .w-authPageWidth h1 {
  font-size: 1.4rem;
  font-weight: 700;
  letter-spacing: -0.022em;
  color: #1b1f38;
  margin-bottom: 0;
}

/* Пояснение под заголовком. Регистрация закрыта, и человек
   должен понимать это до того, как начнёт искать кнопку. */
body:has(.w-authPageWidth) .w-authPageWidth h1::after {
  content: 'Войдите, чтобы продолжить работу. Доступ к сервису открывает администратор.';
  display: block;
  max-width: 19rem;
  margin: 0.5rem auto 1.6rem;
  font-size: 0.855rem;
  font-weight: 500;
  line-height: 1.45;
  letter-spacing: 0;
  color: var(--syn-muted);
}

/* ---------- Поля ------------------------------------------ */

body:has(.w-authPageWidth) form > div        { margin-bottom: 0.7rem; }
body:has(.w-authPageWidth) form > div:last-child {
  margin-bottom: 0;
  margin-top: 1.25rem;
}

body:has(.w-authPageWidth) form input {
  height: 52px;
  border-radius: 14px;
  background-color: #f4f6fc;
  border: 1px solid var(--syn-line);
  /* У поля стоит background-clip: content-box — заливка рисуется
     только под текстом, а иконка в области отступа обрезается.
     Возвращаем обычное поведение, иначе вместо иконки получается
     серая полоса посреди поля. */
  background-clip: border-box;
  background-origin: border-box;
  /* Место слева под иконку, сверху — под всплывающую подпись. */
  padding-left: 2.75rem;
  padding-top: 1.25rem;
  padding-bottom: 0.45rem;
  font-size: 0.94rem;
  color: #1b1f38;
  background-repeat: no-repeat;
  background-position: 0.95rem center;
  background-size: 18px 18px;
  /* У поля класс webkit-dark-styles с внутренней тенью на 360px —
     приём против жёлтой подсветки автозаполнения. Она закрашивает
     фоновую картинку, поэтому в обычном состоянии тень снимаем. */
  box-shadow: none;
  transition: border-color 0.16s, box-shadow 0.16s, background-color 0.16s;
}

/* А вот здесь тень нужна по назначению — иначе Chrome зальёт поле
   своим жёлтым. Цвет совпадает с фоном поля, поэтому не заметна. */
body:has(.w-authPageWidth) form input:-webkit-autofill,
body:has(.w-authPageWidth) form input:-webkit-autofill:hover,
body:has(.w-authPageWidth) form input:-webkit-autofill:focus {
  box-shadow: 0 0 0 360px #f4f6fc inset;
  -webkit-text-fill-color: #1b1f38;
}


/* Иконка полей.
   Раньше она была фоном самого поля, но LibreChat кладёт на поле
   внутреннюю тень на пол-экрана (приём против жёлтой подсветки
   автозаполнения), причём цветом, зашитым мимо переменных. Тень
   закрашивала иконку и не поддавалась даже !important.
   Поэтому иконка вынесена в псевдоэлемент обёртки: он рисуется
   поверх поля, и закрасить его нечем.

   Обёртки у почты и пароля разной вложенности, поэтому выбираем
   не по классу, а по тому, что внутри лежит нужное поле. */
body:has(.w-authPageWidth) form div:has(> input[name="email"])::before,
body:has(.w-authPageWidth) form div:has(> input[name="password"])::before {
  content: '';
  position: absolute;
  left: 15px;
  top: 50%;
  transform: translateY(-50%);
  width: 18px;
  height: 18px;
  background-repeat: no-repeat;
  background-position: center;
  background-size: 18px 18px;
  /* Иконка декоративная: клик по ней должен попадать в поле. */
  pointer-events: none;
  z-index: 2;
}

body:has(.w-authPageWidth) form div:has(> input[name="email"])::before {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%238f96b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2' y='4' width='20' height='16' rx='2'/%3E%3Cpath d='m22 7-10 6L2 7'/%3E%3C/svg%3E");
}

body:has(.w-authPageWidth) form div:has(> input[name="password"])::before {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%238f96b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='11' width='18' height='11' rx='2'/%3E%3Cpath d='M7 11V7a5 5 0 0 1 10 0v4'/%3E%3C/svg%3E");
}

body:has(.w-authPageWidth) form input:hover { border-color: #d7dbeb; }

body:has(.w-authPageWidth) form input:focus,
body:has(.w-authPageWidth) form input:focus-visible {
  background-color: #fff;
  border-color: var(--syn-blue);
  /* Кольцо вместо утолщения рамки: поле не «прыгает». */
  box-shadow: 0 0 0 3.5px rgba(59, 91, 255, 0.13);
  outline: none;
}

/* Всплывающая подпись. Пока поле пустое, она стоит рядом с
   иконкой и работает как подсказка; при вводе уезжает вверх
   и влево, освобождая строку. */
body:has(.w-authPageWidth) form label {
  background-color: transparent;
  color: var(--syn-muted);
  font-weight: 500;
  left: 0.85rem;
  inset-inline-start: 0.85rem;
  top: 0.8rem;
}

body:has(.w-authPageWidth) form input:placeholder-shown ~ label {
  left: 2.6rem;
  inset-inline-start: 2.6rem;
}

body:has(.w-authPageWidth) form input:focus ~ label { color: var(--syn-blue); }

/* Глазок показа пароля */
body:has(.w-authPageWidth) form button[type="button"] { color: var(--syn-muted); }

/* ---------- Кнопка ----------------------------------------
   Тёмная и сплошная. Градиент здесь удешевляет: в примерах
   главное действие всегда решается плотным тёмным пятном. */

body:has(.w-authPageWidth) button[type="submit"] {
  background-color: var(--syn-ink);
  background-image: none;
  border-radius: 14px;
  height: 52px;
  font-size: 0.95rem;
  font-weight: 600;
  letter-spacing: -0.005em;
  box-shadow: 0 8px 20px rgba(23, 26, 46, 0.20);
  transition: background-color 0.16s, transform 0.16s, box-shadow 0.16s;
}

body:has(.w-authPageWidth) button[type="submit"]:hover:not(:disabled) {
  background-color: var(--syn-ink-hover);
  box-shadow: 0 11px 26px rgba(23, 26, 46, 0.26);
  transform: translateY(-1px);
}

body:has(.w-authPageWidth) button[type="submit"]:active:not(:disabled) {
  transform: translateY(0);
  box-shadow: 0 5px 14px rgba(23, 26, 46, 0.20);
}

body:has(.w-authPageWidth) a {
  color: var(--syn-blue);
  font-weight: 600;
}
body:has(.w-authPageWidth) a:hover { color: #2c46de; }

body:has(.w-authPageWidth) .align-end {
  opacity: 0.6;
  font-size: 0.82rem;
}

/* Появление — один раз при загрузке, не цикл. */
@keyframes syn-rise {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: none; }
}
body:has(.w-authPageWidth) .w-authPageWidth {
  animation: syn-rise 0.4s ease-out both;
}

@media (prefers-reduced-motion: reduce) {
  body:has(.w-authPageWidth) *,
  body:has(.w-authPageWidth) *::before,
  body:has(.w-authPageWidth) *::after {
    animation: none !important;
    transition: none !important;
  }
}

/* Телефон: таблетка бренда перестаёт быть плавающей, иначе
   налезает на карточку на коротком экране. */
@media (max-width: 640px) {
  body:has(.w-authPageWidth) div:has(> img[alt*="Синапс"]) {
    position: static;
    margin: 0 auto 1.4rem;
  }
  body:has(.w-authPageWidth) .w-authPageWidth { padding: 1.5rem 1.25rem; }
}

/* ---------- Тёмная тема ----------------------------------- */

html.dark body:has(.w-authPageWidth) {
  background-color: var(--gray-900);
  background-image:
    radial-gradient(120% 95% at  8%   0%, #221f4d 0%, transparent 55%),
    radial-gradient(115% 85% at 96%   6%, #16294f 0%, transparent 52%),
    radial-gradient(105% 85% at 88% 100%, #2a1c3c 0%, transparent 50%),
    linear-gradient(180deg, #0b0d1c 0%, #101327 100%);
}

html.dark body:has(.w-authPageWidth) .w-authPageWidth {
  background-color: #141830;
  border-color: rgba(255, 255, 255, 0.07);
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
}
html.dark body:has(.w-authPageWidth) .w-authPageWidth::before {
  background-color: #1b2040;
  border-color: rgba(255, 255, 255, 0.09);
  box-shadow: none;
}
html.dark body:has(.w-authPageWidth) .w-authPageWidth h1 { color: #eef0ff; }
html.dark body:has(.w-authPageWidth) form input {
  background-color: #10132a;
  border-color: #262b4d;
  color: #eef0ff;
}
html.dark body:has(.w-authPageWidth) form input:hover { border-color: #333a63; }
html.dark body:has(.w-authPageWidth) form input:-webkit-autofill,
html.dark body:has(.w-authPageWidth) form input:-webkit-autofill:hover,
html.dark body:has(.w-authPageWidth) form input:-webkit-autofill:focus {
  box-shadow: 0 0 0 360px #10132a inset;
  -webkit-text-fill-color: #eef0ff;
}
html.dark body:has(.w-authPageWidth) form input:focus {
  background-color: #0c0f22;
  border-color: #6d81ff;
  box-shadow: 0 0 0 3.5px rgba(59, 91, 255, 0.20);
}
/* На тёмном фоне тёмная кнопка пропала бы — здесь акцент светлый. */
html.dark body:has(.w-authPageWidth) button[type="submit"] {
  background-color: #f2f3fb;
  color: #171a2e;
  box-shadow: 0 8px 22px rgba(0, 0, 0, 0.40);
}
html.dark body:has(.w-authPageWidth) button[type="submit"]:hover:not(:disabled) {
  background-color: #fff;
}
html.dark body:has(.w-authPageWidth) div:has(> img[alt*="Синапс"]) {
  background: rgba(255, 255, 255, 0.07);
  border: 1px solid rgba(255, 255, 255, 0.10);
  box-shadow: none;
}

/* ============================================================
   ЧАТ
   ============================================================ */

html.dark,
.dark body {
  /* Едва заметное свечение из углов: плоская заливка выглядит
     мертво, а яркий градиент отвлекал бы от текста. */
  background-color: var(--gray-900);
  background-image:
    radial-gradient(60rem 40rem at 12% -10%, rgba(59, 91, 255, 0.10), transparent 60%),
    radial-gradient(50rem 36rem at 88% 108%, rgba(139, 92, 246, 0.09), transparent 60%);
  background-attachment: fixed;
}

.dark button[data-testid="send-button"]:not(:disabled) {
  background-image: var(--syn-gradient);
  border-color: transparent;
}

.dark form textarea:focus,
.dark form:focus-within {
  border-color: rgba(59, 91, 255, 0.55);
}

.dark ::-webkit-scrollbar-thumb        { background-color: #2c3256; border-radius: 8px; }
.dark ::-webkit-scrollbar-thumb:hover  { background-color: #454b75; }

::selection { background: rgba(59, 91, 255, 0.28); }
