/* Календарь отчётов (Kamron 02.08, макет calendar-mobile.html) — страница «Отчёты» (#earnings).
   Палитра и шрифты ТОЛЬКО из variables.css: макет вёз собственные --accent/--card/--tx, но
   заводить второй набор токенов в проекте, где он уже есть, значит гарантировать расхождение
   при первой же правке темы. Соответствия: --accent → --blue, --card → --surface,
   --cell → --elevated, --line → --border, --tx/--tx-2/--tx-3 → --text/--muted/--dim. */

.ec-toggle{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:40px;
  margin:10px 0 2px;padding:0 14px;border:1px solid var(--border);border-radius:10px;background:none;
  font-family:var(--font);font-size:13px;color:var(--muted);cursor:pointer}
.ec-toggle i{width:7px;height:7px;border-radius:6px;background:var(--blue);flex:none}
.ec-toggle[aria-pressed="true"]{background:var(--blue-dim);border-color:rgba(47,129,247,.4);color:var(--blue)}

/* ── навигация по месяцам ── */
/* Ряд навигации переносится, а не выпихивает кнопку «›» за край: на 390px заголовок месяца,
   счётчик и три кнопки в одну строку не помещаются — правый край срезался (замер: scrollWidth
   больше clientWidth). Перенос дешевле, чем ужимать шрифт заголовка. */
.ec-nav{display:flex;align-items:center;justify-content:space-between;gap:10px 12px;margin:12px 0;flex-wrap:wrap}
.ec-nav-l{display:flex;flex-direction:column;min-width:0;flex:1 1 auto}
.ec-month{font-size:18px;font-weight:600;letter-spacing:-.01em;color:var(--text);text-transform:capitalize}
.ec-count{font-family:var(--mono);font-size:12px;color:var(--dim)}
.ec-nav-r{display:flex;align-items:center;gap:5px;flex:0 0 auto;margin-left:auto}
.ec-nb{min-width:40px;height:40px;padding:0 10px;display:grid;place-items:center;border:1px solid var(--border);
  border-radius:10px;background:none;color:var(--muted);font-family:var(--font);font-size:16px;cursor:pointer;
  flex:none;white-space:nowrap}
.ec-today-btn{font-size:13px}
.ec-nb:hover{color:var(--text);background:var(--elevated)}

/* ── сетка ── */
.ec-dow{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:4px}
.ec-dow span{font-family:var(--mono);font-size:10px;
  color:var(--dim);text-align:center}
.ec-days{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;touch-action:pan-y}
.ec-day{position:relative;display:flex;flex-direction:column;justify-content:space-between;
  /* квадрат — цель, но не любой ценой: min-height не даёт ячейке стать ниже пальца */
  /* 🔴 Kamron 02.08: сначала «пусть все блоки дней будут тёмными как выходные» (деление на
     будни/выходные снято — фон у всех один), затем «цвета блоков дней сделай цветом как блоки
     в другой части этой страницы». Блоки витрины акций (карточка героя, плитки режима) — это
     --sd-surface с рамкой --sd-line; берём ровно их, а не свой оттенок, иначе календарь
     остаётся чужим пятном на странице.
     День выделяют признаки, которые что-то значат: логотипы и счётчик, синяя рамка «моей»
     бумаги, точка сегодняшнего дня, светлая рамка выбранного. */
  /* 🔴 Kamron 02.08: «блоки дат сделать цветом тем», затем «свет светлее у карточек с дат,
     чем те что в блоках» — значит ровно ТОТ ЖЕ тон, что у блоков витрины (--sd-surface), а не
     ступень выше. Ступень --sd-elevated читалась как «эти карточки главнее соседних», хотя
     они того же уровня.
     Фолбэк обязателен: sd-палитра объявлена под #page-stocks, а календарь живёт на
     #page-earnings — без него переменная не резолвится и ячейка выходит ПРОЗРАЧНОЙ
     (замер: rgba(0,0,0,0)). */
  aspect-ratio:1/1;min-height:44px;padding:4px;text-align:left;
  /* 🔴 Запасное значение — --elevated, а НЕ --surface (Kamron 07.08: «блоки дней сделай чуть
     светло чёрный, который мы используем»). sd-палитра объявлена под #page-stocks, календарь
     живёт на #page-earnings, поэтому здесь всегда срабатывает запасное — а --surface это 4
     из 255 над чёрным, ячейка практически сливалась с фоном. --elevated даёт видимую
     ступень, ту же, что у блоков в остальном интерфейсе. */
  background:var(--sd-surface,var(--elevated));
  /* 🔴 Kamron 02.08: «обводку теперь убери из блоков дней». Рамка --sd-line снята: ячейки и так
     отделены друг от друга зазором сетки, а сплошная обводка на каждой из тридцати одной давала
     рябь. Прозрачная 1px оставлена НАМЕРЕННО — на ней держатся состояния (синяя у «моей»
     бумаги, светлая у выбранного дня), и без неё они бы дёргали размер ячейки при появлении. */
  border:1px solid transparent;border-radius:6px;cursor:pointer;font-family:var(--font);
  /* Логотип + счётчик «+195» в узкой ячейке шире неё, и без обрезки строка вылезала наружу:
     ширина всей сетки росла, и блок начинал скроллиться вбок (замер @390). */
  overflow:hidden;min-width:0}
.ec-day:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
.ec-empty{background:none;pointer-events:none;border-color:transparent}
.ec-num{font-family:var(--mono);font-size:12px;line-height:1;color:var(--muted)}
.ec-off .ec-num,.ec-past .ec-num{color:var(--dim)}
.ec-today .ec-num{color:var(--text);font-weight:500}
.ec-today::after{content:"";position:absolute;top:5px;right:4px;width:4px;height:4px;border-radius:50%;
  background:var(--blue)}
.ec-mine{border-color:rgba(47,129,247,.45);background:rgba(47,129,247,.05)}
.ec-sel{border-color:var(--text);background:var(--surface)}
.ec-sel.ec-mine{border-color:var(--blue)}

.ec-logos{display:flex;flex-wrap:nowrap;align-items:center;gap:3px;overflow:hidden;min-width:0}
/* В ячейке счётчик важнее логотипа: «+195» сообщает, что день загруженный, а один значок из
   195 — почти ничего. Поэтому ужимается логотип (flex:0 1 auto), а счётчик держит ширину. */
.ec-lg{position:relative;width:14px;height:14px;border-radius:6px;flex:0 1 auto;min-width:10px;display:grid;place-items:center;
  overflow:hidden;background:var(--surface);color:var(--muted);font-family:var(--mono);font-size:10px;font-weight:500}
.ec-lg .stk-logo{width:100%;height:100%;object-fit:contain}
.ec-more{font-family:var(--mono);font-size:10px;color:var(--dim);white-space:nowrap;flex:none}

/* ── модалка дня ──────────────────────────────────────────────────────────────────────────────
   🔴 Kamron 02.08: сначала «сделаем появляющимся попапом при нажатии на дату», затем «давай
   попап сделаем как модалку — не снизу появляется, а скейлом, и чтобы не на всю страницу, чтобы
   по бокам было пространство и сверху-снизу больше».

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

   Размеры заданы так, чтобы фон был виден со ВСЕХ сторон: ширина = экран минус поля,
   высота ограничена 68% — остаток делится поровну сверху и снизу центрированием.
   z-index 2000/2001: выше таббара (120), листа «Ещё» (140) и FAB, ниже полноэкранной панели
   профиля (3000) — она перекрывает всё по замыслу. */
.ec-bd{position:fixed;inset:0;background:rgba(5,7,10,.66);z-index:2000;opacity:0;pointer-events:none;
  /* Одна длительность с окном: затемнение, отстающее от окна, само по себе читается как рывок. */
  transition:opacity .24s cubic-bezier(.22,1,.36,1)}
.ec-bd.open{opacity:1;pointer-events:auto}
body.ec-locked{overflow:hidden}

.ec-pop{position:fixed;top:50%;left:50%;z-index:2001;display:flex;flex-direction:column;
  width:min(520px,calc(100vw - 40px));
  /* dvh — вторым: на мобильных браузерах vh считает по «полному» экрану с убранной адресной
     строкой, и окно оказывалось выше видимой области. Первая строка — фолбэк для старых. */
  max-height:68vh;max-height:68dvh;
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);
  ;
  padding:16px 16px 8px;
  transform:translate(-50%,-50%) scale(.96);opacity:0;
  /* 🔴 pointer-events обязателен. Закрытая модалка остаётся ПО ЦЕНТРУ экрана — невидимая
     (opacity:0), но кликабельная, и она накрывала собой сетку: после первого закрытия дни
     переставали нажиматься совсем (баг Kamron'а 02.08). Листом снизу этого не было — тот
     уезжал за экран целиком. */
  pointer-events:none;
  /* 🔴 Плавность появления (Kamron 03.08: «анимация чуть багуется»). Было .16s на прозрачность
     и .2s на масштаб разными кривыми: слои приезжали вразнобой, и окно успевало проявиться
     раньше, чем доезжал масштаб — хвост движения читался как подёргивание. Теперь одна
     длительность и одна кривая на оба свойства, движение воспринимается как одно.
     Масштаб мягче (.96 вместо .94): при высоте окна под 600px разница в 6% даёт заметный
     «прыжок» краёв, 4% — тот же смысл появления без рывка. */
  /* 🔴 max-height здесь, а НЕ на .ec-pop-tall. Переход, объявленный на классе состояния,
     исчезает вместе с этим классом — и обратное изменение происходит МГНОВЕННО. Именно
     поэтому при сворачивании окно схлопывалось с 760px до 574 за один кадр, хотя
     раскрытие шло плавно: «раскрывашка отлично, скрывашка всё равно дёргается».
     Классическая ловушка: переход принадлежит элементу, а не состоянию. */
  transition:opacity .24s cubic-bezier(.22,1,.36,1),transform .24s cubic-bezier(.22,1,.36,1),
             /* 🔴 У высоты СВОЯ кривая. Общая (.22,1,.36,1) стартует почти вертикально —
                для появления это правильно (быстро выходит, мягко садится), а для сжатия
                означает рывок на старте: замер дал −27px в первом же кадре. Симметричная
                (.4,0,.2,1) трогается плавно и так же плавно останавливается, поэтому
                годится в ОБЕ стороны — а переход у нас теперь общий на элементе. */
             max-height .26s cubic-bezier(.4,0,.2,1);
  will-change:transform,opacity}
.ec-pop.open{transform:translate(-50%,-50%) scale(1);opacity:1;pointer-events:auto}
/* Появление масштабом — это движение; кому оно противопоказано, тому просто показываем окно. */
@media(prefers-reduced-motion:reduce){
  .ec-pop{transition:none;transform:translate(-50%,-50%) scale(1)}
}

.ec-ph{display:flex;align-items:baseline;gap:10px;flex:none;padding-bottom:2px}
/* Без capitalize: в русском «12 августа» пишется со строчной, а правило из макета давало
   «12 Августа». Заглавная нужна только названию месяца в заголовке (.ec-month). */
.ec-pd{font-size:18px;font-weight:600;letter-spacing:-.01em;color:var(--text)}
.ec-plbl{font-family:var(--mono);font-size:11px;color:var(--dim)}
.ec-x{margin-left:auto;flex:none;width:32px;height:32px;display:grid;place-items:center;border:0;
  border-radius:10px;background:none;color:var(--muted);font-size:15px;cursor:pointer}
.ec-x:hover{color:var(--text);background:var(--elevated)}
.ec-psub{margin:6px 0 2px;flex:none;font-family:var(--mono);font-size:12px;color:var(--dim)}
/* Скроллится СПИСОК, а не весь лист: шапка с датой и счётчиком остаётся на месте, и видно,
   какой день открыт, даже на двухсотой строке. */
.ec-plist{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain}
.ec-none{padding:26px 0;text-align:center;color:var(--dim);font-size:13px}

.ec-row{display:flex;gap:12px;padding:13px 0;border-top:1px solid var(--border)}
.ec-row:first-child{border-top:0}
.ec-lg-b{width:32px;height:32px;min-width:32px;border-radius:6px;font-size:11px;flex:none}
.ec-lg-mine{border:1.5px solid var(--blue)}
.ec-rb{flex:1;min-width:0}
.ec-rh{display:flex;align-items:baseline;gap:8px}
.ec-tk{font-family:var(--mono);font-size:15px;font-weight:500;color:var(--text)}
.ec-chip{padding:2px 6px;border-radius:6px;background:var(--blue-dim);font-family:var(--mono);font-size:10px;
  color:var(--blue);flex:none}
.ec-when{font-family:var(--mono);font-size:10px;color:var(--dim);
  flex:none;margin-left:auto}
.ec-name{font-size:12px;color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ec-rv{display:flex;align-items:baseline;flex-wrap:wrap;gap:3px 7px;margin-top:5px;font-family:var(--mono);
  font-size:12px;color:var(--dim)}
.ec-val{font-size:15px;font-weight:500;color:var(--text)}
.ec-val.ec-u{color:var(--up)}
.ec-val.ec-d{color:var(--dn)}
.ec-dlt{font-size:11px}
.ec-dlt.ec-u{color:var(--up)}
.ec-dlt.ec-d{color:var(--dn)}

/* узкие телефоны: ширину отыгрываем у отступов, а не у содержимого */
@media(max-width:360px){
  .ec-days,.ec-dow{gap:3px}
  .ec-day{padding:3px}
  .ec-num{font-size:11px}
  .ec-lg{width:12px;height:12px;border-radius:6px;font-size:10px}
  .ec-more{font-size:10px}
}
@media(min-width:480px){
  .ec-lg{width:18px;height:18px}
  .ec-day{padding:6px;min-height:52px}
  .ec-num{font-size:13px}
}

/* ── отбивка блока ────────────────────────────────────────────────────────────────────────────
   🔴 Kamron 02.08: «в календаре разделим страницу разделительными линиями сверху и снизу».
   Только мобилка: там `.so-panel` намеренно раздет (css/mobile.css — ни фона, ни рамки, ни
   радиуса), секции идут сплошной лентой, и календарь сливался с соседями. На десктопе панель
   уже карточка с рамкой — вторая линия рядом с ней была бы отбивкой поверх отбивки.
   Два id в селекторе (#page-stocks #so-earncal) — чтобы перебить `#page-stocks .so-panel:not(…)`,
   который обнуляет паддинги; иначе линии легли бы вплотную к содержимому. */
@media(max-width:768px){
  /* !important здесь вынужденное: мобильный сброс панелей объявлен как `border:none!important`,
     и без него линии не появлялись вовсе (замер: computed border-top-width = 0px). */
  #page-stocks #so-earncal{border-top:1px solid var(--border)!important;
    border-bottom:1px solid var(--border)!important;padding:20px 0;margin:4px 0 20px}
}

/* ── цвет текста ──────────────────────────────────────────────────────────────────────────────
   🔴 Kamron 02.08: «тексты в календаре сделай белыми». Серые --dim/--muted заменены на --text
   и в сетке, и в модалке дня. Иерархия держится на размере, начертании и моно-шрифте, а не на
   приглушении — держать её ещё и цветом теперь нечем, и это осознанный размен.
   Цвет ОСТАВЛЕН там, где он несёт смысл, а не оформление: зелёный/красный у факта EPS и дельты
   (превышение прогноза против промаха), синий у чипа «моя» и у точки сегодняшнего дня.
   ВЕРНУТЬ ПРИГЛУШЕНИЕ = удалить этот блок целиком, остальные правила не тронуты. */
/* Заголовок секции и подпись «биржи США» тоже внутри календаря — красить половину блока
   значило бы оставить ровно ту пестроту, от которой уходим. Скоуп по #so-earncal: у соседних
   секций .so-ph2/.so-hint остаются прежними. */
.ec-root .so-ph2,
.ec-root .so-hint,
/* Счётчик отчётов под названием месяца оставлен приглушённым (Kamron 02.08: «текст про
   количество отчётов можешь сделать прошлым цветом»): он подпись к заголовку, и белым спорил
   с самим названием месяца за внимание. */
.ec-root .ec-toggle,
.ec-root .ec-nb,
.ec-root .ec-dow span,
.ec-root .ec-num,
.ec-root .ec-off .ec-num,
.ec-root .ec-past .ec-num,
.ec-root .ec-lg,
.ec-root .ec-more,
.ec-pop .ec-plbl,
.ec-pop .ec-x,
.ec-pop .ec-psub,
.ec-pop .ec-none,
.ec-pop .ec-when,
.ec-pop .ec-name,
.ec-pop .ec-rv,
.ec-pop .ec-vs{color:var(--text)}

/* ── страница «Отчёты» ────────────────────────────────────────────────────────────────────────
   Kamron 02.08: «создадим отдельную страницу для него, там будут и отчёты, и описания отчётов,
   что было и что будет». Стили лежат рядом с календарём намеренно: страница переиспользует его
   разметку строк (.ec-row/.ec-tk/.ec-val), и разносить это по двум файлам значило бы править
   в двух местах. */
#page-earnings .erp-sec,#page-earnings .erp-lede,#page-earnings .ec-toggle{max-width:820px}
/* «биржи США» — вправо от заголовка (Kamron 02.08: «текст биржи сша поставь справа»). */
#page-earnings .pg-title{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap}
#page-earnings .pg-title .cnt{margin-left:auto}
/* Фильтры: две независимые оси (размер и «мои»), каждая своей строкой с подписью.
   🔴 Текст в чипе ЦЕНТРИРУЕТСЯ (Kamron 02.08: «текста там не по центру») — было выравнивание
   по базовой линии без justify-content, и подпись липла к левому краю кнопки. */
#page-earnings .erp-fbar{display:flex;flex-direction:column;gap:14px;margin:4px 0 20px}
#page-earnings .erp-frow{display:flex;flex-direction:column;gap:8px}
#page-earnings .erp-flbl{font-family:var(--mono);font-size:10px;color:var(--dim)}
#page-earnings .erp-chips{display:flex;gap:8px;flex-wrap:wrap}
#page-earnings .erp-chip{display:inline-flex;align-items:center;justify-content:center;
  min-height:38px;padding:0 14px;border:1px solid var(--border);border-radius:10px;background:none;
  color:var(--muted);font-family:var(--font);font-size:13px;line-height:1;text-align:center;cursor:pointer}
#page-earnings .erp-chip[aria-pressed="true"]{background:var(--blue-dim);
  border-color:rgba(47,129,247,.4);color:var(--blue)}
/* Пагинация лент: страницы по 10 компаний со стрелками. */
/* По центру (Kamron 02.08): ряд страниц — навигация по ленте, а не её продолжение, и по
   левому краю он читался как ещё одна строка списка. */
#page-earnings .erp-pg{display:flex;align-items:center;justify-content:center;gap:6px;
  flex-wrap:wrap;padding:16px 0 4px}
#page-earnings .erp-pg button{min-width:34px;height:34px;padding:0 9px;border:1px solid var(--border);
  border-radius:6px;background:none;color:var(--text);font-family:var(--mono);font-size:12px;cursor:pointer}
#page-earnings .erp-pg button[aria-current="true"]{background:var(--blue-dim);border-color:rgba(47,129,247,.4);color:var(--blue)}
#page-earnings .erp-pg button[disabled]{opacity:.35;cursor:default}
#page-earnings .erp-pg .erp-gap{color:var(--dim);font-family:var(--mono);font-size:12px;padding:0 2px}
#page-earnings .erp-lede{margin:6px 0 18px;max-width:70ch;font-size:14px;line-height:1.6;color:var(--muted)}
/* Ширину календаря на странице ограничиваем: ячейка квадратная, и на всю ширину десктопа она
   вырастала в плитку под 180px — календарь занимал экран, а ради него страницу не открывают.
   640px дают ячейку ~84px: и палец попадает, и логотипы читаются. */
#page-earnings .erp-panel{padding:16px;margin-bottom:20px;max-width:640px;
  /* .so-panel описан под #page-stocks и сюда не достаёт — повторяем ту же карточку токенами,
     чтобы календарь на странице выглядел ровно как на витрине. */
  background:var(--sd-surface,var(--surface));border:1px solid var(--sd-line,var(--border));border-radius:var(--radius)}
/* Внутри страницы календарь идёт БЕЗ собственной шапки и без своего тумблера: заголовок
   «Отчёты» с подписью «биржи США» уже стоит выше, а фильтр общий и живёт над календарём —
   два тумблера с одной подписью на одном экране показывали бы разное по одному признаку. */
#page-earnings .ec-root .so-shead,
#page-earnings .ec-root .ec-toggle{display:none}
#page-earnings .erp-sec{margin-top:28px}
#page-earnings .erp-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding-bottom:8px;border-bottom:1px solid var(--border)}
#page-earnings .erp-h{font-size:16px;font-weight:600;letter-spacing:-.01em;color:var(--text)}
#page-earnings .erp-sub{font-family:var(--mono);font-size:12px;color:var(--dim);margin-left:auto}
/* Счёт «выше/ниже прогноза» — единственный агрегат страницы: он считается по показанным
   отчётам и отвечает на вопрос «как проходит сезон» одним взглядом. */
#page-earnings .erp-tally{display:flex;gap:8px;margin:12px 0 10px;font-family:var(--mono);font-size:12px}
#page-earnings .erp-row{cursor:pointer}
#page-earnings .erp-row:hover{background:rgba(255,255,255,.02)}
#page-earnings .erp-rev{font-family:var(--mono);font-size:11px;color:var(--dim)}
/* Сколько отчётов НЕ показано — открытым текстом: молчаливая обрезка читается как «это всё». */
#page-earnings .erp-cut{padding:12px 0 2px;font-size:12px;color:var(--dim)}
#page-earnings .ec-none{text-align:left}
@media(max-width:768px){
  /* 🔴 Kamron 02.08: «добавь разделительные линии». На мобилке карточка календаря раздета
     (как и остальные секции витрины), и без отбивки он сливался с тем, что идёт выше и ниже.
     Линии сверху и снизу — ровно та граница, которую на десктопе рисует рамка карточки. */
  #page-earnings .erp-panel{padding:18px 0;background:none!important;box-shadow:none!important;
    border:none!important;border-top:1px solid var(--border)!important;
    border-bottom:1px solid var(--border)!important;border-radius:0;max-width:none}
  #page-earnings .erp-sub{margin-left:0;width:100%}
}

/* ── Раскрытие строки отчёта: отчётность SEC + события (02.08.2026) ────────────────────────────
   Цвета только из variables.css — своих не заводим (правило проекта). */
.ec-row-x { cursor: pointer; position: relative; padding-right: 22px; }
.ec-row-x .ec-cv {
  position: absolute; right: 8px; top: 50%; width: 7px; height: 7px;
  border-right: 1.5px solid var(--muted); border-bottom: 1.5px solid var(--muted);
  transform: translateY(-70%) rotate(45deg); transition: transform .18s ease;
}
.ec-row-x.on .ec-cv { transform: translateY(-30%) rotate(-135deg); }

.efn-host { display: block; }
.efn-body { padding: 10px 10px 14px; }
.efn-load, .efn-body.efn-none { color: var(--muted); font-size: 12px; padding: 8px; }

.efn-tabs { display: flex; gap: 8px; margin: 2px 0 14px; }
.efn-tab {
  flex: 0 0 auto; padding: 4px 10px; border-radius: 999px; cursor: pointer;
  background: var(--surface); color: var(--muted);
  border: 1px solid var(--border2);
  font: inherit; font-size: 12px;
}
.efn-tab.on { background: var(--elevated); color: var(--text); border-color: transparent; }

/* Заголовок секции: воздух СВЕРХУ больше, чем снизу — так блок читается как новый
   раздел, а не как подпись к предыдущей строке. */
.efn-sec { font-size: 11px; color: var(--muted); margin: 18px 0 6px; font-family: var(--font); }
.efn-body > .efn-sec:first-of-type { margin-top: 6px; }

/* Строка «ключ — значение»: волосинка-разделитель вместо буллета, как в разборе по фактам. */
.efn-r {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 9px 0; border-bottom: 1px solid var(--border);
}
.efn-r:last-child { border-bottom: 0; }
.efn-k { display: flex; flex-direction: column; gap: 2px; font-size: 13px; color: var(--text); }
/* Период обязателен рядом с цифрой: «выручка 109.4 млрд» без него означает непонятно что. */
.efn-per { font-size: 11px; color: var(--muted); }
.efn-v { display: flex; flex-direction: column; align-items: flex-end; gap: 2px;
         font-size: 13px; color: var(--text); text-align: right;
         font-variant-numeric: tabular-nums; font-family: var(--mono); }
.efn-p { font-size: 11px; color: var(--muted); font-family: var(--font); }
.efn-g { font-size: 12px; color: var(--muted); }
.efn-g.efn-u { color: var(--up); }
.efn-g.efn-d { color: var(--dn); }
.efn-none .efn-v { color: var(--muted); font-family: var(--font); }

/* ── Фильтры лент + поиск (03.08.2026) ────────────────────────────────────────────────────────
   Чипы фильтра лент отличаются от чипов размера счётчиком: он подписывает, сколько бумаг за
   кнопкой, и «ниже прогноза 0» сразу видно как пустую ветку, а не как обещание. */
.erp-tfilter { display: flex; flex-wrap: wrap; gap: 6px; }
.erp-fchip { display: inline-flex; align-items: center; gap: 6px; }
.erp-fn {
  font-family: var(--mono); font-size: 11px; font-variant-numeric: tabular-nums;
  color: var(--muted);
}
.erp-fchip[aria-pressed="true"] .erp-fn { color: inherit; }

.erp-search input::placeholder { color: var(--dim); }
/* Крестик очистки у type=search в WebKit свой — гасим, иначе их два подряд. */
.erp-search input::-webkit-search-cancel-button { -webkit-appearance: none; appearance: none; }
.erp-sic {
  position: absolute; left: 10px; width: 11px; height: 11px; border-radius: 50%;
  border: 1.5px solid var(--muted);
}
.erp-sic::after {
  content: ''; position: absolute; right: -4px; bottom: -3px;
  width: 6px; height: 1.5px; background: var(--muted); transform: rotate(45deg);
}
.erp-sx {
  position: absolute; right: 6px; width: 22px; height: 22px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  background: transparent; border: 0; cursor: pointer;
  color: var(--muted); font-size: 12px; line-height: 1;
}
.erp-sx[hidden] { display: none; }

/* График кварталов внутри раскрытой строки: панель детали акции даёт ему свой отступ, здесь
   контейнер собственный, поэтому задаём поля сами. Классы .se-* — общие, из stocks.css. */
.efn-chart { margin: 4px 0 2px; }
.efn-chart .se-svg { max-height: 210px; margin: 0 auto; }

/* ── Поиск: над заголовком, во всю ширину (Kamron 03.08) ──────────────────────────────────────
   Стоял в панели фильтров рядом с подписью и занимал 210 px из 354 — «растяни по всей длине».
   Поднят выше заголовка страницы: искать бумагу хотят до того, как читать, что это за раздел. */
#page-earnings .erp-srow { margin: 0 0 14px; }
#page-earnings .erp-search {
  position: relative; display: flex; align-items: center; width: 100%;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r);
  padding: 0 34px; height: 40px;
}
#page-earnings .erp-search input {
  flex: 1 1 auto; min-width: 0; width: 100%; height: 100%;
  background: transparent; border: 0; outline: none;
  /* Шрифты только наши: у input type=search WebKit подставляет системный, и поле выбивалось
     из остальной страницы (Kamron 03.08 «шрифты используй наши»). */
  color: var(--text); font-family: var(--font); font-size: 14px; font-weight: 500;
}
#page-earnings .erp-search input::placeholder { color: var(--dim); font-family: var(--font); }
#page-earnings .erp-search input::-webkit-search-cancel-button { -webkit-appearance: none; appearance: none; }
#page-earnings .erp-search:focus-within { border-color: rgba(47,129,247,.4); }
#page-earnings .erp-sic {
  position: absolute; left: 12px; width: 12px; height: 12px; border-radius: 50%;
  border: 1.5px solid var(--muted);
}
#page-earnings .erp-sic::after {
  content: ''; position: absolute; right: -4px; bottom: -3px;
  width: 6px; height: 1.5px; background: var(--muted); transform: rotate(45deg);
}
#page-earnings .erp-sx {
  position: absolute; right: 8px; width: 24px; height: 24px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  background: transparent; border: 0; cursor: pointer;
  color: var(--muted); font-family: var(--font); font-size: 13px; line-height: 1;
}
#page-earnings .erp-sx[hidden] { display: none; }

/* Чипы фильтра лент — тот же шрифт и та же высота, что у чипов панели: до этого они были
   ниже и в другом кегле, из-за чего два ряда кнопок выглядели как разные элементы. */
#page-earnings .erp-fchip { min-height: 34px; padding: 0 12px; font-family: var(--font); font-size: 13px; }
#page-earnings .erp-fn { font-family: var(--mono); font-size: 11px; font-variant-numeric: tabular-nums; color: var(--dim); }
#page-earnings .erp-fchip[aria-pressed="true"] .erp-fn { color: inherit; }
/* Раскрытие строки: заголовки секций и подписи — наш шрифт, а не наследованный от svg/системы. */
#page-earnings .efn-sec, .ec-pop .efn-sec { font-family: var(--font); }
#page-earnings .efn-k, .ec-pop .efn-k { font-family: var(--font); }

/* Раскрытая карточка занимает попап целиком: остальные строки дня уходят (Kamron 03.08).
   🔴 НЕ display:none. Оно срабатывает мгновенно и не анимируется, поэтому список «тупо пропадал
   за раз», а содержимое приезжало через несколько секунд — рывок, который и заметил владелец.
   Сворачиваем высотой и прозрачностью: это анимируется, и переход читается как одно движение.
   Длительность .22s — из диапазона проекта для крупных перестроений (микро-hover там .12–.15s). */
/* 🔴 max-height ставим ТОЛЬКО строкам. Первая версия вешала его и на контейнер раскрытия — и
   он обрезал карточку: та занимает 1316px, а лимит стоял 320, отчего попап схлопывался до 488px
   вместо доступных 810. Закрытые контейнеры и так нулевой высоты, анимировать их незачем. */
.ec-plist .ec-row-x {
  transition: opacity .18s ease, max-height .22s ease, padding .22s ease, margin .22s ease;
  /* 🔴 240px было перелётом почти втрое: реальная строка 84–85px на обеих ширинах (замер по 73
     строкам). Из-за этого весь видимый рост укладывался в первую треть перехода — строки
     «выстреливали» и замирали, что и читалось как рывок при возврате списка.
     130px оставляют запас в половину строки на случай переноса длинного названия, но убирают
     холостую часть анимации. */
  max-height: 130px;
  /* 🔴 Не вешать сюда content-visibility: проверено 03.08 замером — не помогает. Гипотеза была,
     что кадр 44мс при открытии уходит на раскладку 73 строк за пределами экрана; A/B на живых
     данных дал 39мс с ним против 36мс без (то есть в пределах шума и без выигрыша). Настоящая
     причина оказалась в JS — полная пересборка сетки календаря на клик, см. earnings-calendar.js. */
}
.ec-plist.efn-focus .ec-row-x:not(.on) {
  opacity: 0; max-height: 0; padding-top: 0; padding-bottom: 0;
  margin: 0; border: 0; overflow: hidden; pointer-events: none;
}
.ec-plist.efn-focus .efn-host[data-open="0"] { display: none; }
/* Тело карточки появляется своим движением, а не возникает: короткое проявление с подъёмом —
   тот же приём, что у входа страницы (pageEnter). */
@keyframes efnIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
.efn-body { animation: efnIn .18s ease both; }

/* ── Каркас на время загрузки (03.08) ─────────────────────────────────────────────────────────
   🔴 Порядок движений, как просил владелец: СНАЧАЛА плавно уходят нижние бумаги, ПОТОМ приезжает
   карточка. Отсюда задержка .22s — ровно длительность сворачивания строк выше по файлу. Два
   движения перестают накладываться и читаются как одно последовательное.
   Побочный выигрыш: если данные пришли быстрее задержки, каркас не успевает проявиться (у
   анимации `both`, до старта элемент держит начальный кадр с opacity 0) — мигания нет. */
.efn-load { animation-delay:0s; }

.efn-sk-b {
  display: block; height: 11px; border-radius: 6px;
  /* Полоса светлее фона идёт слева направо — «здесь будет содержимое», а не «здесь пусто». */
  background: linear-gradient(90deg, var(--elevated) 25%,
              rgba(255,255,255,.10) 37%, var(--elevated) 63%);
  background-size: 400% 100%;
  animation: efnSk 1.4s ease-in-out infinite;
}
@keyframes efnSk { from { background-position: 100% 0; } to { background-position: 0 0; } }

.efn-sk-tabs { display: flex; gap: 8px; margin: 2px 0 12px; }
.efn-sk-tabs .efn-sk-b { width: 68px; height: 26px; border-radius: 6px; }
.efn-sk-r { display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 9px 0; border-bottom: 1px solid var(--border); }
.efn-sk-r .efn-sk-v { width: 64px; flex: none; }
.efn-sk-chart { height: 132px; margin: 14px 0; border-radius: 10px;
  background: var(--elevated); }

/* Мерцание — это движение. Кому оно противопоказано, тому ровный фон и мгновенный каркас. */
@media (prefers-reduced-motion: reduce) {
  .efn-load { animation-delay: 0s; }
  .efn-sk-b { animation: none; background: var(--elevated); }
}
@media (prefers-reduced-motion: reduce) {
  .ec-plist .ec-row-x { transition: none; }
  .efn-body { animation: none; }
}

/* Кнопка «свернуть» в конце карточки. */
.efn-close {
  display: block; width: 100%; margin: 14px 0 2px; padding: 11px 0;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--r);
  color: var(--muted); font-family: var(--font); font-size: 13px; cursor: pointer;
  transition: color .12s ease, border-color .12s ease;
}
.efn-close:active { color: var(--blue); border-color: rgba(47,129,247,.4); }

/* ── ИИ-сводка дня под календарём (03.08.2026) ────────────────────────────────────────────────
   Отдельная карточка, а не строка в потоке: текст объясняет день целиком и не должен читаться
   как подпись к календарю. */
#page-earnings .erp-dg {
  margin: 14px 0 6px; padding: 14px 16px;
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius);
}
#page-earnings .erp-dg-load { color: var(--muted); font-size: 13px; }
#page-earnings .erp-dg-h { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
#page-earnings .erp-dg-ai {
  font-family: var(--mono); font-size: 10px; color: var(--blue); background: var(--blue-dim); padding: 3px 8px; border-radius: 999px;
}
/* Когда текста от модели нет и показана арифметика — значок нейтральный, не «ИИ». */
#page-earnings .erp-dg-plain { color: var(--muted); background: none; border: 1px solid var(--border); }
#page-earnings .erp-dg-when { font-family: var(--mono); font-size: 11px; color: var(--dim); }
#page-earnings .erp-dg-t {
  margin: 0; font-family: var(--font); font-size: 14px; line-height: 1.65; color: var(--text);
}

/* Пояснение к блоку реакции: называет размер выборки, чтобы четыре наблюдения не читались
   как статистика. */
.efn-note { font-size: 12px; line-height: 1.5; color: var(--muted); padding: 2px 0 8px; font-family: var(--font); }

/* Новости: строка-ссылка. Заголовок в две строки максимум — дальше многоточие, иначе одна
   длинная новость занимает раскрытие целиком. */
.efn-n {
  display: flex; flex-direction: column; gap: 3px; padding: 8px 0;
  border-bottom: 1px solid var(--border); text-decoration: none; color: inherit;
}
.efn-n:last-child { border-bottom: 0; }
.efn-nt {
  font-family: var(--font); font-size: 13px; line-height: 1.45; color: var(--text);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.efn-nm { font-family: var(--font); font-size: 11px; color: var(--dim); }
a.efn-n:active .efn-nt { color: var(--blue); }

/* Режим одной компании: попап забирает почти весь экран. В обычном режиме он остаётся низким —
   список дня и так листается, а высокий попап перекрывал бы календарь целиком. */
.ec-pop.ec-pop-tall { max-height: 90vh; }
.ec-pop.ec-pop-tall .ec-plist { max-height: none; }
@media (prefers-reduced-motion: reduce) { .ec-pop { transition: none; } }

/* Уход карточки — то же движение, что и приход, только назад (03.08).
   Раньше содержимое стиралось мгновенно, и в тот же кадр возвращались соседние строки: два
   движения накладывались, и это читалось как сбой. Длительность чуть короче входа: уход не
   должен заставлять ждать. */
@keyframes efnOut { from { opacity: 1; transform: none; } to { opacity: 0; transform: translateY(6px); } }
.efn-body.efn-out { animation: efnOut .16s ease both; }
@media (prefers-reduced-motion: reduce) { .efn-body.efn-out { animation: none; opacity: 0; } }

/* ── поиск за пределами окна ±14 дней (Kamron 06.08: «почему оракла нет») ──────────────────── */
/* Блок отвечает на вопрос «когда эта бумага отчитывается», поэтому дата здесь — главное, а не
   подпись: она стоит справа моноширинно и читается колонкой при нескольких совпадениях. */
#page-earnings .erp-wide-load{font-size:13px;color:var(--dim);padding:12px 0}
#page-earnings .erp-wlist{display:flex;flex-direction:column;gap:2px;margin-top:8px}
#page-earnings .erp-wrow{display:flex;align-items:baseline;gap:10px;width:100%;
  padding:10px 12px;min-height:44px;text-align:left;cursor:pointer;
  background:transparent;border:0;border-radius:var(--r-sm,8px);color:var(--text)}
#page-earnings .erp-wrow:hover{background:rgba(255,255,255,.02)}
#page-earnings .erp-wt{font-weight:600;font-size:13px;flex:0 0 auto}
/* Название сжимаемое, дата — нет: обрезать нужно то, что можно дочитать в детали бумаги. */
#page-earnings .erp-wn{font-size:13px;color:var(--muted);flex:1 1 auto;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Табличные цифры здесь обязательны: колонка дат — смысл этого блока. `--mono` в проекте
   это Inter (одна гарнитура на весь интерфейс), а у Inter ширины цифр РАЗНЫЕ. */
#page-earnings .erp-wd{font-family:var(--mono);font-size:12px;color:var(--dim);flex:0 0 auto;
  font-variant-numeric:tabular-nums}
@media (max-width:520px){
  /* На узком экране дата уезжает под название: три колонки в 390px дают либо обрезанное имя,
     либо перенос даты по слогам. */
  #page-earnings .erp-wrow{flex-wrap:wrap}
  #page-earnings .erp-wn{flex:1 1 100%;order:3;white-space:normal}
  #page-earnings .erp-wd{margin-left:auto}
}
