:root{
  --ground:#FBFAF8; --panel:#FFFFFF; --ink:#171A1F; --ink-soft:#5A626E;
  --line:#E3E1DC; --accent:#A16207; --accent-soft:#FDF6E7; --arrow:#B9B4AA;
  --mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,monospace;
  --sans:system-ui,-apple-system,"Segoe UI",sans-serif;
  --serif:Georgia,"Iowan Old Style",Cambria,serif;
}
@media (prefers-color-scheme:dark){:root{
  --ground:#14161A; --panel:#1B1E24; --ink:#E8E6E1; --ink-soft:#9AA1AC;
  --line:#2A2E36; --accent:#D9A441; --accent-soft:#221C10; --arrow:#4A505A;
}}
*{box-sizing:border-box}
body{margin:0;background:var(--ground);color:var(--ink);font-family:var(--sans);
  font-size:15px;line-height:1.5;-webkit-font-smoothing:antialiased}
.wrap{max-width:1180px;margin:0 auto;padding:40px 24px 72px;
  display:flex;flex-direction:column;gap:22px}
/* Ширша сітка потрібна транзакціям через одинадцять колонок (просять ~1460px,
   у 1180 не влазять). Гаманці її взяли теж — не заради таблиці, а заради
   РАМКИ: плитки, фільтри, період і повзунок мусять стояти однаково на обох
   сторінках, інакше при перемиканні вкладок сторінка помітно «стрибає», і
   вужча здається старішою.
   На вужчому екрані таблиця, як і раніше, прокручується всередині .scroll —
   від одинадцяти колонок на ноутбуці нікуди не подітися. */
.wrap.wide{max-width:1600px}
/* Одинадцять колонок не влазять навіть у 1600: таблиці мінімально треба ~1460px,
   а на екрані 1440 доступно 1375. Тому на цій сторінці комірки щільніші —
   8px замість 12 дають 88px на одинадцяти колонках, тобто рівно те, чого
   бракувало. Сторінки гаманців це не чіпає: там сім колонок і місця вдосталь. */
.wide th, .wide td{padding-left:5px;padding-right:5px}
/* 5px, а не типові 12: одинадцять колонок зі значками просять ~1340px, і
   кожен піксель відступу коштує одинадцять. Заміряно, що найдовший
   можливий маршрут (Avalanche → Algorand) уже в даних, тобто ця колонка
   не зросте; а от суми зростуть, тож запас лишаємо саме під них. */
h1{font-family:var(--serif);font-size:clamp(26px,4vw,38px);font-weight:400;
  margin:0;letter-spacing:-.01em}
.sub{color:var(--ink-soft);font-size:14px;max-width:64ch}
.tabs{display:flex;gap:4px;margin:-6px 0 4px}
.tab{font-size:14px;padding:6px 14px;border-radius:999px;text-decoration:none;
  color:var(--ink-soft);border:1px solid transparent}
.tab[aria-current="page"]{background:var(--accent-soft);color:var(--accent);
  border-color:var(--accent)}
.tab:hover:not([aria-current]){border-color:var(--line)}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1px;
  background:var(--line);border:1px solid var(--line);border-radius:3px;overflow:hidden}
.kpi{background:var(--panel);padding:14px 16px;display:flex;flex-direction:column;gap:3px}
.kpi .lbl{font-size:11px;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-soft)}
.kpi .val{font-family:var(--mono);font-size:20px;font-variant-numeric:tabular-nums}
.kpi .val.accent{color:var(--accent)}
.bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.grp-lbl{font-size:11px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--ink-soft);margin-right:2px}
.grp{display:flex;flex-wrap:wrap;gap:7px;align-items:center}
/* Дві смуги фільтрів — один стос, тому проміжок між ними менший за проміжок між
   блоками сторінки: це одна річ, а не дві сусідні. */
.filters{display:flex;flex-direction:column;gap:10px}
/* Смуга мереж не переносить свій підпис під кнопки: nowrap тримає «Куди
   забирали» ліворуч, а переносяться самі кнопки — усередині .grp. */
.nets-bar{flex-wrap:nowrap;align-items:flex-start}
.nets-bar .grp-lbl{padding-top:7px;white-space:nowrap}
.nets-bar .grp{flex-wrap:wrap;flex:1;min-width:0}
/* Стан вибору — біля підпису, бо без нього «нічого не золоте» читається
   двозначно: чи то фільтра нема, чи то він усе відсік.
   min-width — під найдовше можливе «13 із 17», і це не педантизм: підпис стоїть
   ЗЛІВА від кнопок у смузі з flex-wrap:nowrap, тож кожен його зайвий символ
   забирає ширину в самих кнопок. Заміряно: «усі» → «1 із 17» звужувало смугу на
   27px, і остання кнопка стрибала в панель «ще N» рівно від кліку по сусідній.
   Зарезервоване місце коштує ~30px порожнечі, поки вибору нема, — дешевше, ніж
   смуга, що перебудовується під рукою. */
#net-state{font-family:var(--mono);letter-spacing:0;text-transform:none;opacity:.75;
  display:inline-block;min-width:8ch}
#net-state.on{color:var(--accent);opacity:1}
button.n,button.f{font:inherit;font-size:13px;padding:5px 11px;border:1px solid var(--line);
  background:var(--panel);color:var(--ink-soft);border-radius:999px;cursor:pointer;
  display:inline-flex;align-items:center;gap:6px}
/* Назва мережі — ОСНОВНИМ чорнилом, лічильник — приглушеним. Доти обоє були
   приглушені, і то успадковано з часів, коли КОЖНА кнопка світилась золотом і
   читалася по фону: щойно порожній вибір став означати «усі» і фон зробився
   нейтральним, назви попливли. .f (єдина — «Очистити» в панелі періоду)
   лишається приглушеною: вона не назва, а дія. */
button.n{color:var(--ink)}
button.n b{font-family:var(--mono);font-size:11px;font-weight:500;opacity:.55}
button.n:hover{border-color:var(--accent);color:var(--accent)}
/* Не вміщені в два рядки кнопки лишаються в DOM: замір (fitNets) ховає їх саме
   класом, щоб не перебудовувати смугу з нуля на кожному кроці циклу. */
button.n.hid{display:none}
/* Лише .n: єдина кнопка з класом .f у проєкті — «Очистити» в панелі періоду, і
   aria-pressed їй ніхто не ставить (перевірено grep'ом по web/). Тобто
   ,button.f[aria-pressed="true"] у цьому селекторі не міг збігтися НІКОЛИ —
   лишався б обіцянкою стану, якого нема. */
button.n[aria-pressed="true"]{background:var(--accent);
  border-color:var(--accent);color:var(--ground)}
/* Обрана мережа під мишею не «гасне»: фон уже акцентний, і акцентний текст на
   ньому зник би зовсім. Селектор специфічніший за button.n:hover навмисно —
   інакше правильний колір тримався б лише на порядку правил у файлі. */
button.n[aria-pressed="true"]:hover{color:var(--ground)}
/* Мережа без жодного рядка в поточному зрізі — глухий кут: натиснеш і отримаєш
   порожню таблицю. Лишаємо видимою і натисною (нуль — теж відповідь), але
   тьмяною, і тримаємо в панелі, а не в головній смузі, де вона займала б цілий
   рядок задарма. */
button.n.zero{opacity:.4}
/* «ще N» — вхід у панель із рештою мереж. Пунктир, бо це не фільтр, а двері:
   суцільна рамка ставила б її в один ряд із кнопками мереж. */
button.more{font:inherit;font-size:13px;padding:5px 11px;border:1px dashed var(--line);
  background:transparent;color:var(--ink-soft);border-radius:999px;cursor:pointer;flex:none}
button.more:hover{border-color:var(--accent);color:var(--accent)}
button.more[aria-expanded="true"]{border-style:solid;border-color:var(--accent);
  color:var(--accent)}
button.more[hidden]{display:none}
/* «скинути» — скидання, а не ще одна мережа, тож і виглядає не пігулкою:
   підкреслений текст без рамки. Стоїть усередині #nets, за останньою кнопкою.
   align-self:stretch — НЕ косметика, а умова, на якій тримається замір смуги.
   .grp вирівнює по центру (align-items:center), і ця кнопка на 6px нижча за
   пігулки, тож у ТОМУ Ж рядку її offsetTop відрізнявся на 3px. рядків() рахує
   різні offsetTop — і бачила три рядки там, де око бачило два, після чого
   fitNets() зрізáв зайвий десяток кнопок «щоб влізло». Заміряно: смуга
   згорталась у ОДИН рядок і рапортувала про два. Розтягнута кнопка починається
   з верху свого рядка, як і решта; текст усередині <button> лишається
   відцентрованим сам. */
button.clr{font:inherit;font-size:12px;padding:4px 9px;border:0;background:none;
  color:var(--ink-soft);cursor:pointer;flex:none;align-self:stretch;
  text-decoration:underline;
  text-underline-offset:3px;text-decoration-color:var(--line)}
button.clr:hover{color:var(--accent)}
button.clr[hidden]{display:none}
/* Кільце фокуса — на ВСІ посилання, не лише на вкладки: кожен рядок таблиці несе
   адреси, міст і хеші, тобто на живих даних це тисячі <a>. Поки в селекторі стояв
   самий .tab, усі вони лишалися з дефолтним кільцем браузера, а список довелося б
   дописувати класом за класом. th — бо фокус йому дає tabindex, а не тег. */
button:focus-visible,input:focus-visible,th:focus-visible,a:focus-visible{
  outline:2px solid var(--accent);outline-offset:2px}
input[type=search]{font:inherit;font-size:13px;padding:6px 12px;border:1px solid var(--line);
  border-radius:999px;background:var(--panel);color:var(--ink);min-width:190px}
/* Селектор — за КЛАСОМ, а не за типом поля. Раніше тут стояло input[type=date],
   і щойно поле стало текстовим (свій календар замість браузерного), правило
   перестало збігатися: поля відпали на типовий білий фон браузера посеред
   темної сторінки. Клас від типу не залежить. */
.dt{font:inherit;font-size:13px;padding:5px 11px;border:1px solid var(--line);
  border-radius:999px;background:var(--panel);color:var(--ink);
  font-variant-numeric:tabular-nums;width:9.5em;cursor:pointer;font-family:var(--mono)}
.dt:hover{border-color:var(--accent)}
.dt::placeholder{color:var(--ink-soft)}
.dash{color:var(--ink-soft)}
/* Кнопка-випадайка: назва фільтра, його поточне значення й каретка. Значення —
   моноширинним і ОСНОВНИМ чорнилом, бо читають саме його, а назва фільтра поруч
   лише пояснює, чого воно стосується. */
button.dd{font:inherit;font-size:13px;padding:5px 12px;border:1px solid var(--line);
  background:var(--panel);color:var(--ink-soft);border-radius:999px;cursor:pointer;
  display:inline-flex;align-items:center;gap:7px;white-space:nowrap}
button.dd:hover{border-color:var(--accent)}
button.dd b{font-family:var(--mono);font-size:12.5px;font-weight:500;color:var(--ink)}
/* .on означає «фільтр діє» — ставить його draw() з тих самих меж, якими міряє
   таблицю, тож підсвітка не може розійтися з дійсністю. */
button.dd.on{border-color:var(--accent);background:var(--accent-soft)}
button.dd.on b{color:var(--accent)}
button.dd .car{font-size:9px;opacity:.6}
/* Лічильник «скільки з чого» стоїть між випадайками й експортом, і саме він
   тепер тягне margin-left:auto — тому в .exp нижче звичайний відступ, а не
   другий auto: два auto в одному flex поділили б вільне місце навпіл і
   відірвали б кнопки експорту від правого краю. */
.tally{font-size:12.5px;color:var(--ink-soft);font-variant-numeric:tabular-nums;
  margin-left:auto;white-space:nowrap}
.exp{display:flex;gap:7px;align-items:center;margin-left:14px}
button.x{font:inherit;font-size:13px;padding:6px 14px;border:1px solid var(--accent);
  background:transparent;color:var(--accent);border-radius:999px;cursor:pointer;
  display:inline-flex;gap:7px;white-space:nowrap}
button.x:hover,button.x.done{background:var(--accent);color:var(--ground)}
button.x b{font-family:var(--mono);font-size:11px;opacity:.75}
/* Запасне поле експорту (показуємо, коли clipboard недоступний). display:none
   тут, а не інлайном у розмітці: app.js вмикає його інлайновим display:block,
   який усе одно переб'є цей рядок. Обидві сторінки беруть саме цей клас. */
.dump{display:none;width:100%;min-height:130px;font-family:var(--mono);font-size:12px;
  padding:12px;border:1px solid var(--line);border-radius:3px;
  background:var(--panel);color:var(--ink)}
/* Повзунок і поле порога живуть у панелі профіту (.pop), але правила лишаються
   тут, серед решти елементів керування: одягають вони те саме, чим були й на
   смузі, і ховати їх у секцію «панелі» означало б шукати стиль поля за тим, у
   якому контейнері воно сьогодні висить. */
input[type=range]{flex:1;min-width:220px;accent-color:var(--accent)}
#t-num{font:inherit;font-size:13px;padding:6px 12px;border:1px solid var(--line);
  border-radius:999px;background:var(--ground);color:var(--ink);width:120px;
  font-family:var(--mono);text-align:right}
.presets{display:flex;gap:6px;flex-wrap:wrap}
button.p{font:inherit;font-size:12px;font-family:var(--mono);padding:4px 10px;
  border:1px solid var(--line);background:var(--ground);color:var(--ink-soft);
  border-radius:3px;cursor:pointer}
button.p:hover{border-color:var(--accent);color:var(--accent)}
.scroll{overflow-x:auto;border:1px solid var(--line);border-radius:3px;background:var(--panel)}
table{border-collapse:collapse;width:100%;font-size:14px}
th{text-align:left;font-size:11px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-soft);font-weight:600;padding:11px 12px;border-bottom:1px solid var(--line);
  white-space:nowrap;cursor:pointer;background:var(--panel);position:sticky;top:0}
/* Курсор-палець лише там, де клік справді сортує. buildHead() дає data-k тільки
   сортовним колонкам; у транзакцій чотири несортовні колонки МАЮТЬ підписи, і
   палець на них обіцяв би сортування, якого нема. */
th:not([data-k]){cursor:default}
th[data-num]{text-align:right}
th .ind{opacity:.45;font-size:10px}
td{padding:9px 12px;border-bottom:1px solid var(--line)}
tr:last-child td{border-bottom:0}
td.num{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums;
  white-space:nowrap}
td.money{font-weight:600}
td.arrow{padding:0;text-align:center;color:var(--arrow);width:20px}
/* Рядок-місток на сторінці гаманців: клік (і Enter/Space) веде в транзакції цього
   гаманця. Кільце фокуса — те саме, що в a/button/input/th вище, але зміщене
   ВСЕРЕДИНУ, і це не косметика: рядок завширшки рівно з .scroll, а .scroll
   ОБРІЗАЄ — overflow-x:auto змушує й overflow-y порахуватись у auto, тож
   контейнер відтинає все, що вилізло за padding-box, в обидва боки — навіть
   коли смуг прокрутки не видно взагалі.
   Заміряно (Chrome, 1280×900, світла тема, різниця знімків «у фокусі» проти «без»):
     offset  +2px, рядок посередині — верх 100% ширини, низ 100%, боки 0%
     offset  +2px, ПЕРШИЙ рядок     — верху нема, низ 100%, боки 0%
     offset  -2px, будь-який рядок  — усі чотири сторони 100%: замкнений прямокутник
   Тобто з +2px кільце не зникає — зникають лише БОКИ, і рамка лишається розімкненою.
   А в першого рядка ще й верх з'їдає sticky-<th>: він позиційований, тому свій
   непрозорий фон малює ПОВЕРХ кільця сусіда. «Липне» він при цьому чисто
   номінально — .scroll сам собі скролпорт і по вертикалі не прокручується
   (scrollHeight == clientHeight, скільки б рядків не було), тож заголовок нікуди
   від верху таблиці не їде й нічого, крім першого рядка, накрити не може. */
tr.clickable{cursor:pointer}
tr.clickable:hover td{background:var(--accent-soft)}
tr.clickable:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
a.addr,span.addr{font-family:var(--mono);font-size:12.5px;color:var(--ink);
  text-decoration:none;white-space:nowrap}
a.addr{border-bottom:1px solid var(--line)}
a.addr:hover{color:var(--accent);border-bottom-color:var(--accent)}
/* Сторінка транзакцій: профіт акцентом, маршрут одним рядком, посилання на міст
   «пігулкою», хеші — моно з ледь помітним підкресленням. */
.prof{color:var(--accent);font-weight:600}
.rt{font-weight:500;white-space:nowrap}
/* У маршруті значків двоє в одній комірці — найширша колонка таблиці,
   тож тут вони тиснуться до назви щільніше, ніж деінде. */
.rt .ic{margin-right:4px}
/* OUT/IN несуть значок чейну своєї ноги: OUT — мережа відправлення,
   IN — призначення. Колонки й так найправіші й найвужчі, тож щільно. */
.tx .ic{margin-right:4px}
.brg,.hash{font-family:var(--mono);font-size:12px;text-decoration:none;white-space:nowrap}
/* Марка мосту — теж фоном, а не картинкою в розмітці: назва «Allbridge»
   лишається текстом (її читає скрінрідер і копіює пошук), а логотип
   лише супроводжує. Зʼявиться другий міст — отримає свій клас поруч. */
/* Логотип тепер окремим .ic усередині, а не фоном пігулки: фон не можна
   заокруглити незалежно, і марка Allbridge стирчала квадратом серед
   круглих значків мереж. */
.brg{padding:3px 9px;border:1px solid var(--accent);color:var(--accent);
  border-radius:999px;display:inline-flex;align-items:center}
.hash{color:var(--ink);border-bottom:1px solid var(--line)}
/* Мертва гілка txlink (мережа без відомого explorer'а) — та сама конвенція, що в
   cell() вище: обіцянку кліку носить лише <a>. Інакше span не відрізнити від
   посилання, та ще й :hover підсвічував би його під мишею — тому й hover звужено
   до a. Рамку знебарвлюємо, а не прибираємо: ширина лишається, колонка не
   «стрибає». */
span.brg,span.hash{color:var(--ink-soft);border-color:transparent}
a.hash:hover,a.brg:hover{color:var(--accent)}
.same{display:inline-block;margin-left:6px;font-size:10px;text-transform:uppercase;
  padding:1px 5px;border-radius:3px;background:var(--accent-soft);color:var(--accent);
  border:1px solid currentColor}
/* Сторінка входу. Живе в ЦЬОМУ файлі, а не в окремому, бо app.css — єдина
   статика, відкрита без пароля (web/auth.py, PUBLIC_PATHS): другий публічний
   файл був би другим місцем, де треба пам'ятати про виняток. Тих самих змінних
   і того самого набору (--panel, --line, кнопка .x) вистачає повністю — форма
   свідомо виглядає як шматок сайту, а не як чужий екран. */
.login-wrap{min-height:100vh;justify-content:center;max-width:420px}
.login{display:flex;flex-direction:column;gap:12px;background:var(--panel);
  border:1px solid var(--line);border-radius:3px;padding:26px 24px}
.login h1{font-size:26px}
.login .sub{margin:0}
.login-lbl{font-size:11px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--ink-soft);margin-top:6px}
/* Обидва поля одним правилом: логін і пароль мусять виглядати однаково —
   різна рамка на сусідніх рядках форми читається як «з цим щось не так». */
.login input[type=text],.login input[type=password]{font:inherit;font-size:15px;padding:9px 13px;
  border:1px solid var(--line);border-radius:3px;background:var(--ground);
  color:var(--ink);width:100%}
button.login-go{justify-content:center;padding:9px 14px;font-size:14px}
/* Помилка внизу форми, а не над нею: інакше поява напису зсуває поле під
   курсором рівно в мить, коли користувач уже цілиться в нього вдруге. */
.login-err{margin:2px 0 0;font-size:13px;color:var(--accent)}
.state{padding:28px 14px;text-align:center;color:var(--ink-soft);font-size:14px}
footer{font-size:12px;color:var(--ink-soft);border-top:1px solid var(--line);padding-top:14px}

/* --- Логотипи мереж ------------------------------------------------------
   Набір ОДИН на весь сайт: та сама марка в кружечку і в таблиці, і в кнопках
   фільтра. Спершу було два — плоский для таблиці, у кружечку для кнопок, — і
   один чейн виглядав по-різному залежно від місця. Кружечок несе власний фон,
   тож читається і на темному рядку, і на золотій пігулці; окремий плоский
   варіант існував лише заради кнопок і зник разом із їхньою проблемою.
   Клас на КОД мережі, а не адреса у розмітці: код приходить із чужої відповіді
   API, і склеювати з нього шлях до файлу означало б пускати чужий рядок у URL.
   Клас такого не вміє — невідомий код просто не збігається з жодним правилом і
   лишається без значка, замість «битої картинки» чи, гірше, чужого шляху.
   Файли лежать у нас (web/static/chains, ліцензія там же): сайт назовні не
   ходить, і логотипи цього не міняють. */
.ic{display:inline-block;width:14px;height:14px;flex:none;vertical-align:-3px;
  border-radius:50%;overflow:hidden;
  margin-right:5px;background-size:contain;background-repeat:no-repeat;
  background-position:center}
.ic-ALG{background-image:url("/static/chains/ALG.svg")}
.ic-ALLBRIDGE{background-image:url("/static/chains/ALLBRIDGE.svg")}
.ic-ARB{background-image:url("/static/chains/ARB.svg")}
.ic-AVA{background-image:url("/static/chains/AVA.svg")}
.ic-BAS{background-image:url("/static/chains/BAS.svg")}
.ic-BSC{background-image:url("/static/chains/BSC.svg")}
/* Celo жовтий і фоном, і маркою — на золотій пігулці зливався з нею.
   Тому в нього єдиного плоский варіант на темному кружечку: контраст
   з’являється, а фірмовий колір лишається. */
.ic-CEL{background-image:url("/static/chains/CEL.svg");background-color:#171512;
  background-size:80%}
.ic-ETH{background-image:url("/static/chains/ETH.svg")}
.ic-LIN{background-image:url("/static/chains/LIN.svg")}
.ic-OPT{background-image:url("/static/chains/OPT.svg")}
.ic-POL{background-image:url("/static/chains/POL.svg")}
.ic-SNC{background-image:url("/static/chains/SNC.svg")}
/* Solana — офіційна марка з solana.com/branding, а не з набору: там градієнт
   був #599DB0→#47F8C3, тобто синьо-бірюзовий, тоді як фірмовий — #9945FF→
   #14F195 (фіолетовий у зелений). Полотно в неї не квадратне (101×88), тож
   саджаємо з полями на темний кружечок — саме так виглядає їхня аватарка. */
.ic-SOL{background-image:url("/static/chains/SOL.svg");background-color:#121212;
  background-size:62%}
.ic-SRB{background-image:url("/static/chains/SRB.svg")}
.ic-STX{background-image:url("/static/chains/STX.svg")}
.ic-SUI{background-image:url("/static/chains/SUI.svg")}
.ic-TRX{background-image:url("/static/chains/TRX.svg")}
.ic-UNI{background-image:url("/static/chains/UNI.svg")}

/* --- Логотипи монет ------------------------------------------------------
   Окремий набір від мереж навмисно: це різні сутності, і плутати їх в одному
   каталозі означало б плутати їх і в голові. Всередині ж підхід той самий —
   клас на символ, файли в себе, кружечок із власним фоном.
   Символ ЛИШАЄТЬСЯ текстом поруч, значок його не замінює: USDC і USDCx за
   картинкою не відрізнити, а різниця між ними справжня. Тому підпис дрібніший
   і приглушений — він уточнення до числа, а не рівноправний із ним напис. */
.cn{display:inline-block;width:12px;height:12px;flex:none;vertical-align:-2px;
  margin-right:2px;border-radius:50%;overflow:hidden;
  background-size:contain;background-repeat:no-repeat;background-position:center}
.cn-USDT{background-image:url("/static/coins/USDT.svg")}
.cn-USDC{background-image:url("/static/coins/USDC.svg")}
.cn-USDe{background-image:url("/static/coins/USDe.svg")}
/* Значок стоїть ВСЕРЕДИНІ .sym, одразу перед тікером: він означає монету,
   а не суму, тож і триматися має біля її назви. */
.sym{font-size:10px;color:var(--ink-soft);margin-left:4px;white-space:nowrap}

/* --- Налаштування ---------------------------------------------------------
   Панель і шестерню будує app.js, а не розмітка сторінок: вони спільні для
   обох поглядів, і дві копії в HTML розійшлися б на першій же правці.
   Значення живе в localStorage браузера, тобто налаштування ваше й на цьому
   пристрої — сервер про нього не знає й нічого не зберігає. */
.wrap{position:relative}
.gear{position:absolute;top:36px;right:24px;width:34px;height:34px;padding:0;
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  background:none;border:1px solid var(--line);border-radius:50%;color:var(--ink-soft)}
.gear:hover{color:var(--accent);border-color:var(--accent)}
.gear svg{width:17px;height:17px;fill:currentColor}
.cfg{position:absolute;top:78px;right:24px;z-index:20;width:290px;padding:16px;
  background:var(--panel);border:1px solid var(--line);border-radius:4px;
  box-shadow:0 10px 30px rgba(0,0,0,.5)}
.cfg[hidden]{display:none}
.cfg h2{margin:0 0 12px;font-size:12px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-soft);font-weight:600}
.cfg label{display:block;font-size:13px;color:var(--ink);margin-bottom:6px}
.cfg .hint{font-size:11px;color:var(--ink-soft);margin:6px 0 0;line-height:1.5}
.cfg input{width:100%;padding:7px 10px;font-family:var(--mono);font-size:13px;
  background:var(--bg);border:1px solid var(--line);border-radius:3px;color:var(--ink)}

/* --- Поява нового рядка ---------------------------------------------------
   Свіжий своп «спалахує» й гасне: рух ловить око там, куди воно не дивилось,
   а стала підсвітка перетворилась би на постійний шум.
   prefers-reduced-motion шануємо — для декого рух на сторінці це не прикраса,
   а причина закрити вкладку. */
@keyframes впав {
  from { background-color:var(--accent-soft); }
  to   { background-color:transparent; }
}
tr.is-new td{animation:впав 2.2s ease-out}
@media (prefers-reduced-motion: reduce){
  tr.is-new td{animation:none;background-color:var(--accent-soft)}
}

/* --- Панелі фільтрів ------------------------------------------------------
   Спільний вигляд усіх випадайок смуги (період, профіт, «ще N» мереж). Будує їх
   app.js (makePop) з тієї ж причини, що й календар із налаштуваннями: панель
   однакова для обох поглядів, і дві копії в розмітці розійшлися б на першій же
   правці. */
.pop{position:absolute;z-index:40;padding:14px;background:var(--panel);
  border:1px solid var(--line);border-radius:4px;box-shadow:0 12px 34px rgba(0,0,0,.55)}
.pop[hidden]{display:none}
.pop h3{margin:0 0 9px;font-size:11px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-soft);font-weight:600}
.pop .sep{border-top:1px solid var(--line);margin:13px 0 11px}
.pop .hint{font-size:11px;color:var(--ink-soft);margin:9px 0 0;line-height:1.5}
.pop .hint[hidden]{display:none}
.pop .row{display:flex;align-items:center;gap:7px}

/* Панель періоду. Ширина фіксована, бо сітка пресетів мусить лишатися сіткою
   4×2, а не «скільки влізло»: підписи в ній різної довжини («24 год» проти
   «365 дн»), і від вмісту вона б стрибала. */
#pop-per{width:340px}
/* «Очистити» — у шапці, поруч із заголовком панелі: кнопка скидає ВСЕ (і пресет,
   і дати), а поставлена біля самих полів обіцяла б, що чистить лише їх. */
#pop-per .head{justify-content:space-between;margin-bottom:9px}
#pop-per .head h3{margin:0}
#pop-per .grid{display:grid;grid-template-columns:repeat(4,1fr);gap:5px}
#pop-per .grid button{font:inherit;font-family:var(--mono);font-size:12px;padding:6px 0;
  border:1px solid var(--line);background:var(--ground);color:var(--ink-soft);
  border-radius:3px;cursor:pointer}
#pop-per .grid button:hover{border-color:var(--accent);color:var(--accent)}
/* Обраний пресет підсвічуємо тим самим способом, що й кнопки мереж, — щоб було
   видно, який проміжок зараз діє: без цього натиснута кнопка нічим не
   відрізнялась би від ненатиснутої, і єдиним натяком лишався б підпис на кнопці
   «Період» за межами відкритої панелі. */
#pop-per .grid button[aria-pressed="true"]{background:var(--accent);
  border-color:var(--accent);color:var(--ground)}

/* Панель порога ширша за панель періоду, і це не смак: повзунку треба хід.
   Шкала логарифмічна ($1 → $1 000 000 за 1000 кроків), тож на короткій доріжці
   один піксель миші коштував би десятки доларів порога. */
#pop-prof{width:400px}
#pop-prof .val{font-family:var(--mono);font-size:22px;color:var(--accent);
  display:block;margin-bottom:9px}
#pop-prof .row{gap:11px;margin-bottom:10px}

/* Панель мереж. Вужча за решту: у ній самі пігулки, і на широкій вони
   розтяглися б рідким рядком. Підпис секції «Без свопів у цьому зрізі» —
   блоком, бо в смузі .grp-lbl стоїть у рядок із кнопками, а тут він відкриває
   власну секцію. */
#pop-nets{width:300px}
#pop-nets .grp{gap:6px}
.pop .grp-lbl{display:block;margin:12px 0 7px}
.pop .grp-lbl[hidden],.pop h3[hidden]{display:none}

/* --- Свій календар --------------------------------------------------------
   Рідне віконце date-поля стилізувати неможливо — це інтерфейс браузера. Тож
   поле стало звичайним текстовим (readonly, щоб не набирали руками й не
   вигадували формат), а панель нижче малюємо самі. */
/* z-index ВИЩИЙ за .pop (40), а не нижчий, як було: поля дат переїжджають
   усередину панелі періоду, і календар, який відкривається з них, мусить лягати
   ПОВЕРХ панелі. Інакше він відкривався б за нею — тобто «клік нічого не робить»
   при цілком живому календарі. */
.cal{position:absolute;z-index:50;width:252px;padding:12px;
  background:var(--panel);border:1px solid var(--line);border-radius:4px;
  box-shadow:0 12px 34px rgba(0,0,0,.55)}
.cal[hidden]{display:none}
.cal-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.cal-title{font-size:13px;color:var(--ink)}
.cal-nav{width:26px;height:26px;padding:0;font-size:16px;line-height:1;cursor:pointer;
  background:none;border:1px solid var(--line);border-radius:3px;color:var(--ink-soft)}
.cal-nav:hover{color:var(--accent);border-color:var(--accent)}
.cal-week,.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.cal-week span{text-align:center;font-size:10px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--ink-soft);padding-bottom:4px}
.cal .c{height:30px;padding:0;font-size:12px;font-family:var(--mono);cursor:pointer;
  background:none;border:1px solid transparent;border-radius:3px;color:var(--ink)}
.cal .c:hover{border-color:var(--accent);color:var(--accent)}
.cal .c.out{cursor:default;border:0}
/* Кінці проміжку — суцільним акцентом, середина — приглушеним: так видно і
   МЕЖІ, і що саме потрапило між ними. Однаковим кольором проміжок читався б
   як суцільна пляма без початку й кінця. */
.cal .c.edge{background:var(--accent);color:var(--bg);border-color:var(--accent)}
.cal .c.span{background:var(--accent-soft)}
.cal .c.today{border-color:var(--ink-soft)}
