/* Шрифты приложения — локальные копии Google Fonts (внешних запросов НЕТ) */
@font-face{font-family:"Onest";src:url("/fonts/onest-400-cyrillic-ext.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:"Onest";src:url("/fonts/onest-400-cyrillic.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:"Onest";src:url("/fonts/onest-400-latin-ext.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;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;}
@font-face{font-family:"Onest";src:url("/fonts/onest-400-latin.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;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:"Onest";src:url("/fonts/onest-500-cyrillic-ext.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap;unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:"Onest";src:url("/fonts/onest-500-cyrillic.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap;unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:"Onest";src:url("/fonts/onest-500-latin-ext.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap;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;}
@font-face{font-family:"Onest";src:url("/fonts/onest-500-latin.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap;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:"Onest";src:url("/fonts/onest-600-cyrillic-ext.woff2") format("woff2");font-weight:600;font-style:normal;font-display:swap;unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:"Onest";src:url("/fonts/onest-600-cyrillic.woff2") format("woff2");font-weight:600;font-style:normal;font-display:swap;unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:"Onest";src:url("/fonts/onest-600-latin-ext.woff2") format("woff2");font-weight:600;font-style:normal;font-display:swap;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;}
@font-face{font-family:"Onest";src:url("/fonts/onest-600-latin.woff2") format("woff2");font-weight:600;font-style:normal;font-display:swap;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:"Onest";src:url("/fonts/onest-700-cyrillic-ext.woff2") format("woff2");font-weight:700;font-style:normal;font-display:swap;unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:"Onest";src:url("/fonts/onest-700-cyrillic.woff2") format("woff2");font-weight:700;font-style:normal;font-display:swap;unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:"Onest";src:url("/fonts/onest-700-latin-ext.woff2") format("woff2");font-weight:700;font-style:normal;font-display:swap;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;}
@font-face{font-family:"Onest";src:url("/fonts/onest-700-latin.woff2") format("woff2");font-weight:700;font-style:normal;font-display:swap;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:"Unbounded";src:url("/fonts/unbounded-600-cyrillic-ext.woff2") format("woff2");font-weight:600;font-style:normal;font-display:swap;unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:"Unbounded";src:url("/fonts/unbounded-600-cyrillic.woff2") format("woff2");font-weight:600;font-style:normal;font-display:swap;unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:"Unbounded";src:url("/fonts/unbounded-600-latin-ext.woff2") format("woff2");font-weight:600;font-style:normal;font-display:swap;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;}
@font-face{font-family:"Unbounded";src:url("/fonts/unbounded-600-latin.woff2") format("woff2");font-weight:600;font-style:normal;font-display:swap;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:"JetBrains Mono";src:url("/fonts/jbmono-400-cyrillic-ext.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:"JetBrains Mono";src:url("/fonts/jbmono-400-cyrillic.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:"JetBrains Mono";src:url("/fonts/jbmono-400-latin-ext.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;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;}
@font-face{font-family:"JetBrains Mono";src:url("/fonts/jbmono-400-latin.woff2") format("woff2");font-weight:400;font-style:normal;font-display:swap;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:"JetBrains Mono";src:url("/fonts/jbmono-500-cyrillic-ext.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap;unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}
@font-face{font-family:"JetBrains Mono";src:url("/fonts/jbmono-500-cyrillic.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap;unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}
@font-face{font-family:"JetBrains Mono";src:url("/fonts/jbmono-500-latin-ext.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap;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;}
@font-face{font-family:"JetBrains Mono";src:url("/fonts/jbmono-500-latin.woff2") format("woff2");font-weight:500;font-style:normal;font-display:swap;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;}
/* ═══════════════════════════════════════════════════════════════════════════
   «Мой бюджет» — style.css  [A7]
   Все компоненты §5.4 спеки. Стилизация ТОЛЬКО через семантические переменные
   tokens.css (базовые --ink-*/--brass-*/--mint-*/--coral-* здесь запрещены).
   Правила: внешних margin у компонентов нет (только gap контейнера),
   вложенность селекторов ≤2, один слой утилит .u-*, никаких CDN/сетевых импортов.

   КОНТРАКТ РАЗМЕТКИ (для app.js / screens.js):
   · цвет категории/счёта передаётся инлайном: style="--c:var(--cat-food)"
     (синонимы --cat-color / --tint тоже поддержаны, дефолт — --cat-other);
   · прогресс: <div class="progress" data-status="good|warning|serious|critical"
     style="--p:64;--pace:52"> <i class="progress__fill"></i><i class="progress__pace"></i></div>
     при ≥100% добавить .is-over;
   · сегмент-контрол: .segmented style="--n:3;--i:1" + <span class="segmented__thumb">;
   · сумма: <span class="num">…</span>, окраска — .u-income / .u-expense
     (или data-dir="income|expense" на .num либо на .op-row);
   · иконка операции/строки: <span class="op-ic"> со вложенным <svg>.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 0. ЛОКАЛЬНЫЕ ШРИФТЫ (только с диска, ноль сети) ─────────────────────── */

/* ── 1. СОБСТВЕННЫЕ ПРОИЗВОДНЫЕ ПЕРЕМЕННЫЕ КОМПОНЕНТОВ ──────────────────── */
:root{
  --tile-mix:16%;          /* заливка пузыря категории (тёмная тема — 22%) */
  --tint-mix:12%;          /* мягкая подложка под иконку строки */
  --ring-mix:38%;          /* кольцо выбранного/предупреждающего элемента */
  --hatch:repeating-linear-gradient(135deg,rgba(255,255,255,.22) 0 4px,transparent 4px 8px);
  --blur-bar:saturate(180%) blur(16px);
  --sep-left:68px;         /* отступ разделителя .op-row слева: 16 + 40 + 12 */
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){ --tile-mix:22%; --tint-mix:18%; --ring-mix:46%; }
}
:root[data-theme="dark"]{ --tile-mix:22%; --tint-mix:18%; --ring-mix:46%; }

/* ── 2. БАЗА ─────────────────────────────────────────────────────────────── */
*,*::before,*::after{box-sizing:border-box}
html{
  -webkit-text-size-adjust:100%;
  text-size-adjust:100%;
  scroll-behavior:smooth;
  background:var(--bg-app);
}
body{
  margin:0;
  min-height:100dvh;
  font-family:var(--font-ui);
  font-size:var(--fs-body);
  line-height:var(--lh-body);
  font-weight:400;
  color:var(--fg);
  background:var(--bg-app);
  overflow-x:hidden;                 /* body по горизонтали не скроллится никогда */
  overscroll-behavior-y:none;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  text-rendering:optimizeLegibility;
}
h1,h2,h3,h4,p,figure,dl,dd{margin:0}
ul,ol{margin:0;padding:0;list-style:none}
img,svg,canvas{display:block;max-width:100%}
a{color:var(--accent);text-decoration:none}
button,input,select,textarea{font:inherit;color:inherit;margin:0}
button{background:none;border:0;padding:0;cursor:pointer;-webkit-tap-highlight-color:transparent;touch-action:manipulation}
button:disabled{cursor:not-allowed;opacity:.45}
table{border-collapse:collapse;width:100%}
hr{border:0;height:1px;background:var(--stroke)}
[hidden]{display:none!important}
::selection{background:var(--accent-soft);color:var(--fg-strong)}

/* Кастомный скроллбар (десктоп) */
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-thumb{background:var(--stroke-strong);border-radius:var(--r-full);border:3px solid transparent;background-clip:content-box}
*::-webkit-scrollbar-track{background:transparent}

/* Единое фокус-кольцо на всём интерактивном */
:focus{outline:none}
:focus-visible{outline:2px solid var(--accent-ring);outline-offset:2px;border-radius:var(--r-xs)}

/* ── 3. ТИПОГРАФИКА И ЧИСЛА ─────────────────────────────────────────────── */
.sec-title{
  display:flex;align-items:center;gap:var(--sp-2);
  font-size:var(--fs-eyebrow);line-height:1.2;letter-spacing:var(--ls-eyebrow);
  font-weight:600;text-transform:uppercase;color:var(--fg-faint);
  padding-inline:var(--sp-1);
}
.sec-title button{
  margin-inline-start:auto;flex:0 0 auto;
  font-size:var(--fs-xs);letter-spacing:0;text-transform:none;white-space:nowrap;
  color:var(--accent);font-weight:600;
  min-height:var(--tap);min-width:var(--tap);padding-inline:var(--sp-2);
  display:inline-flex;align-items:center;justify-content:flex-end;gap:4px;
}
.num{
  font-family:var(--font-num);
  font-variant-numeric:tabular-nums;
  font-feature-settings:"tnum" 1,"zero" 1;
  letter-spacing:-.015em;
  font-weight:500;
  white-space:nowrap;
  color:var(--fg-strong);
}
.num[data-dir="income"],.op-row[data-kind="income"] .num{color:var(--income)}
.num[data-dir="expense"],.op-row[data-kind="expense"] .num{color:var(--fg-strong)}
.op-row[data-kind="transfer"] .num{color:var(--fg-muted)}

/* ── 4. УТИЛИТЫ (единственный слой) ─────────────────────────────────────── */
.u-row{display:flex;align-items:center;gap:var(--sp-2)}
.u-col{display:flex;flex-direction:column;gap:var(--sp-2)}
.u-between{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3)}
.u-center{display:flex;align-items:center;justify-content:center}
.u-wrap{flex-wrap:wrap}
.u-grow{flex:1 1 auto;min-width:0}
.u-end{margin-inline-start:auto}
.u-trunc{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.u-clamp2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.u-scroll-x{overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch}
.u-strong{color:var(--fg-strong);font-weight:600}
.u-muted{color:var(--fg-muted)}
.u-faint{color:var(--fg-faint)}
.u-accent{color:var(--accent)}
.u-income{color:var(--income)}
.u-expense{color:var(--expense)}
.u-warn{color:var(--heat-mid)}
.u-sm{font-size:var(--fs-sm);line-height:var(--lh-sm)}
.u-xs{font-size:var(--fs-xs);line-height:var(--lh-xs)}
.u-h1{font-size:var(--fs-h1);line-height:var(--lh-h1);letter-spacing:var(--ls-h1);font-weight:700;color:var(--fg-strong)}
.u-h2{font-size:var(--fs-h2);line-height:var(--lh-h2);letter-spacing:var(--ls-h2);font-weight:600;color:var(--fg-strong)}
.u-h3{font-size:var(--fs-h3);line-height:var(--lh-h3);letter-spacing:var(--ls-h3);font-weight:600;color:var(--fg-strong)}
.u-eyebrow{font-size:var(--fs-eyebrow);letter-spacing:var(--ls-eyebrow);text-transform:uppercase;font-weight:600;color:var(--fg-faint)}
.u-mono{font-family:var(--font-num);font-variant-numeric:tabular-nums}
.u-gap-1{gap:var(--sp-1)}
.u-gap-2{gap:var(--sp-2)}
.u-gap-3{gap:var(--sp-3)}
.u-gap-4{gap:var(--sp-4)}
.u-gap-5{gap:var(--sp-5)}
.u-pad{padding:var(--sp-4)}
.u-nowrap{white-space:nowrap}
.u-right{text-align:right}
.u-hide{display:none!important}
.u-sr{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ── 5. КАРКАС ПРИЛОЖЕНИЯ ───────────────────────────────────────────────── */
#app{
  min-height:100dvh;
  display:flex;flex-direction:column;
  isolation:isolate;
}

/* 5.1 Шапка */
#topbar{
  position:sticky;top:0;z-index:var(--z-header);
  /* центр (месяц) — по содержимому, чтобы не резался; сжимаются боковые колонки */
  display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,auto);align-items:center;gap:var(--sp-2);
  width:100%;max-width:var(--w-app);margin-inline:auto;
  height:calc(var(--h-header) + var(--safe-t));
  padding:var(--safe-t) var(--pad-x) 0;
  background:var(--bg-header);
  backdrop-filter:var(--blur-bar);-webkit-backdrop-filter:var(--blur-bar);
  transition:box-shadow var(--dur-base) var(--ease-out),background-color var(--dur-base) var(--ease-out);
}
#topbar::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:var(--stroke);opacity:0;
  transition:opacity var(--dur-base) var(--ease-out);
}
.is-scrolled #topbar::after{opacity:1}
.is-scrolled #topbar{box-shadow:0 6px 20px -18px rgba(0,0,0,.55)}
#topbar > .u-row{justify-self:end;gap:var(--sp-1)}

.brand{
  display:inline-flex;align-items:center;gap:var(--sp-2);flex:0 0 auto;
  font-family:var(--font-display);font-weight:600;
  font-size:var(--fs-h3);line-height:1;letter-spacing:var(--ls-h2);
  color:var(--fg-strong);
  overflow:hidden;white-space:nowrap;
}
.brand svg,.brand i,.brand b{
  flex:0 0 auto;
  width:26px;height:26px;border-radius:9px;
  display:grid;place-items:center;
  background:var(--accent-grad);color:var(--fg-on-accent);
  font-style:normal;font-weight:700;font-size:14px;font-family:var(--font-ui);
  box-shadow:var(--shadow-1);
}

#month-pill{
  /* название месяца не сжимаем: иначе при появлении чипа синхронизации оно режется («Август 202») */
  justify-self:center;max-width:100%;flex:0 0 auto;
  display:inline-flex;align-items:center;gap:6px;
  min-height:var(--tap);padding:0 var(--sp-3);
  border-radius:var(--r-full);
  background:var(--bg-surface);box-shadow:var(--shadow-1);
  font-size:var(--fs-sm);font-weight:600;color:var(--fg-strong);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  transition:transform var(--dur-tap) var(--ease-out),background-color var(--dur-fast) linear;
}
#month-pill:active{transform:scale(.96)}
/* на узком телефоне название приложения уступает место месяцу и чипу синхронизации:
   вместо обрезанного «Мой бюдж…» остаётся только значок ₽ */
@media (max-width:430px){ .brand__name{display:none} }
/* пилюля месяца открывает выбор списком ⇒ стрелка вниз, а не «вперёд» */
#month-pill svg{width:14px;height:14px;color:var(--fg-faint);transform:rotate(90deg)}

#btn-search,#topbar button:not(#month-pill){
  flex:0 0 auto;
  width:var(--tap);height:var(--tap);
  display:grid;place-items:center;border-radius:var(--r-full);
  color:var(--fg-muted);
  transition:background-color var(--dur-fast) linear,color var(--dur-fast) linear,transform var(--dur-tap) var(--ease-out);
}
#btn-search:active,#topbar button:not(#month-pill):active{transform:scale(.92);background:var(--bg-sunken)}
#btn-search svg{width:21px;height:21px}

/* 5.2 Чип синхронизации */
#sync-chip{
  display:inline-flex;align-items:center;gap:6px;
  min-height:28px;padding:0 10px;
  border-radius:var(--r-full);
  background:var(--bg-surface-2);box-shadow:var(--shadow-1);
  font-size:var(--fs-xs);font-weight:600;color:var(--fg-muted);
  white-space:nowrap;
  transition:color var(--dur-base) linear,background-color var(--dur-base) linear;
}
#sync-chip::before{
  content:"";width:7px;height:7px;border-radius:50%;
  background:currentColor;flex:0 0 auto;
  transition:background-color var(--dur-base) linear;
}
#sync-chip svg{width:14px;height:14px}
#sync-chip[data-state="idle"]{color:var(--fg-faint)}
#sync-chip[data-state="syncing"]{color:var(--accent)}
#sync-chip[data-state="syncing"]::before{animation:pulse-dot 1.1s var(--ease-inout) infinite}
#sync-chip[data-state="pending"]{color:var(--heat-mid);background:color-mix(in oklab,var(--heat-mid) 10%,transparent)}
#sync-chip[data-state="offline"]{color:var(--fg-muted);background:var(--bg-sunken)}
#sync-chip[data-state="error"]{color:var(--heat-mid);background:color-mix(in oklab,var(--heat-mid) 14%,transparent);box-shadow:inset 0 0 0 1px color-mix(in oklab,var(--heat-mid) 40%,transparent)}
#sync-chip[data-state="error"]::before{animation:pulse-dot .8s var(--ease-inout) infinite}

/* 5.3 Баннер сети */
#net-banner{
  position:sticky;top:calc(var(--h-header) + var(--safe-t));z-index:var(--z-banner);
  width:100%;max-width:var(--w-app);margin-inline:auto;
  display:flex;align-items:center;gap:var(--sp-2);
  padding:10px var(--pad-x);
  font-size:var(--fs-sm);font-weight:500;
  color:var(--fg-strong);
  background:color-mix(in oklab,var(--heat-mid) 16%,var(--bg-surface));
  box-shadow:0 8px 18px -14px rgba(0,0,0,.5);
  animation:slide-down var(--dur-base) var(--ease-out) both;
}
#net-banner svg{width:17px;height:17px;color:var(--heat-mid);flex:0 0 auto}
#net-banner button{margin-inline-start:auto;font-size:var(--fs-sm);font-weight:600;color:var(--accent);min-height:var(--tap);display:inline-flex;align-items:center}

/* 5.4 Область экрана */
#view{
  flex:1 1 auto;
  width:100%;max-width:var(--w-app);margin-inline:auto;
  padding:var(--sp-4) var(--pad-x) calc(var(--h-nav) + var(--safe-b) + var(--sp-9));
}
#view > *{animation:screen-in var(--dur-base) var(--ease-out) both}
[id^="screen-"]{display:flex;flex-direction:column;gap:var(--sp-5)}

/* 5.5 Нижняя навигация */
#tabbar{
  position:fixed;left:0;right:0;bottom:0;z-index:var(--z-nav);
  width:100%;max-width:var(--w-app);margin-inline:auto;
  display:grid;grid-template-columns:repeat(5,1fr);
  height:calc(var(--h-nav) + var(--safe-b));
  padding-bottom:var(--safe-b);
  /* меню полностью непрозрачное: размытие убрано, контент под ним не просвечивает */
  background:var(--bg-nav);
  box-shadow:0 -1px 0 var(--stroke),0 -10px 30px -24px rgba(0,0,0,.6);
}
.tab{
  position:relative;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  min-height:var(--tap);padding-top:2px;
  font-size:var(--fs-xs);line-height:1.1;font-weight:600;letter-spacing:-.005em;
  color:var(--fg-faint);
  transition:color var(--dur-fast) var(--ease-out);
}
.tab svg{width:23px;height:23px;transition:transform var(--dur-base) var(--ease-spring)}
.tab:active svg{transform:scale(.88)}
.tab[aria-selected="true"],.tab.is-active{color:var(--accent)}
.tab[aria-selected="true"] svg,.tab.is-active svg{transform:translateY(-1px) scale(1.06)}
.tab__dot{
  position:absolute;top:6px;left:calc(50% + 8px);
  min-width:8px;height:8px;padding:0 2px;
  border-radius:var(--r-full);
  background:var(--heat-mid);
  box-shadow:0 0 0 2px var(--bg-nav);
  font-size:9px;line-height:8px;font-weight:700;color:var(--fg-on-accent);
  text-align:center;
}
#tab-indicator{
  position:absolute;top:0;left:0;
  width:20%;height:2px;
  border-radius:0 0 var(--r-full) var(--r-full);
  background:var(--accent-grad);
  transform:translateX(calc(var(--i,0) * 100%));
  transition:transform var(--dur-base) var(--ease-out);
  pointer-events:none;
}

/* 5.6 FAB и «наверх» */
#fab{
  position:fixed;z-index:var(--z-fab);
  right:max(var(--pad-x),calc(50vw - var(--w-app)/2 + var(--pad-x)));
  bottom:calc(var(--h-nav) + var(--safe-b) + var(--sp-4));
  width:58px;height:58px;border-radius:var(--r-full);
  display:grid;place-items:center;
  background:var(--accent-grad);color:var(--fg-on-accent);
  box-shadow:var(--shadow-fab);
  transition:transform var(--dur-base) var(--ease-spring),box-shadow var(--dur-base) var(--ease-out),opacity var(--dur-fast) linear;
  animation:fab-in var(--dur-slow) var(--ease-spring) both;
}
#fab svg{width:26px;height:26px;stroke-width:2}
#fab:active{transform:scale(.9)}
#fab:hover{transform:translateY(-2px)}
#btn-top{
  position:fixed;z-index:var(--z-fab);
  right:max(var(--pad-x),calc(50vw - var(--w-app)/2 + var(--pad-x)));
  bottom:calc(var(--h-nav) + var(--safe-b) + var(--sp-4) + 58px + var(--sp-3));
  width:var(--tap);height:var(--tap);border-radius:var(--r-full);
  display:grid;place-items:center;
  background:var(--bg-elevated);color:var(--fg-muted);
  box-shadow:var(--shadow-2);
  animation:fab-in var(--dur-base) var(--ease-spring) both;
}
#btn-top svg{width:19px;height:19px}
#btn-top:active{transform:scale(.9)}

/* ── 6. ПРИМИТИВЫ: КАРТОЧКИ, КНОПКИ, ПОЛЯ ──────────────────────────────── */
/* Карточка: тень уже содержит кольцо 1px → border НЕ ставим */
.card,#card-balance,#card-daily,#recent-ops,#card-top-cats,#ops-summary,#budget-summary,
#cat-table,#screen-more section,#budgets-preview{
  background:var(--bg-surface);
  border-radius:var(--r-lg);
  box-shadow:var(--shadow-1);
  overflow:hidden;
}
.card{padding:var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-4)}
.card--flush{padding:0}
.card--sunken{background:var(--bg-surface-2);box-shadow:none}

.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);
  min-height:var(--tap);padding:0 var(--sp-5);
  border-radius:var(--r-full);
  font-size:var(--fs-body);font-weight:600;letter-spacing:-.01em;
  color:var(--fg-strong);background:var(--bg-surface-2);
  box-shadow:var(--shadow-1);
  transition:transform var(--dur-tap) var(--ease-out),background-color var(--dur-fast) linear,
             box-shadow var(--dur-fast) linear,opacity var(--dur-fast) linear;
}
.btn:active{transform:scale(.97)}
.btn svg{width:19px;height:19px}
.btn--primary{background:var(--accent-grad);color:var(--fg-on-accent);box-shadow:var(--shadow-2)}
.btn--primary:hover{filter:brightness(1.04)}
.btn--ghost{background:transparent;box-shadow:inset 0 0 0 1px var(--stroke-strong);color:var(--fg)}
.btn--quiet{background:transparent;box-shadow:none;color:var(--fg-muted)}
.btn--danger{background:var(--expense-soft);color:var(--expense);box-shadow:none}
.btn--block{width:100%}
.btn--icon{width:var(--tap);padding:0;border-radius:var(--r-full)}
.btn--lg{min-height:52px;font-size:var(--fs-h3);border-radius:var(--r-lg)}

.field{display:flex;flex-direction:column;gap:6px}
.field > span{font-size:var(--fs-xs);font-weight:600;letter-spacing:.02em;color:var(--fg-muted)}
.input,input[type="text"],input[type="search"],input[type="number"],input[type="date"],
input[type="time"],input[type="password"],select,textarea{
  width:100%;min-height:var(--tap);
  padding:10px var(--sp-4);
  border:0;border-radius:var(--r-md);
  background:var(--bg-surface-2);
  box-shadow:inset 0 0 0 1px var(--stroke);
  color:var(--fg-strong);font-size:var(--fs-body);
  transition:box-shadow var(--dur-fast) var(--ease-out),background-color var(--dur-fast) linear;
  -webkit-appearance:none;appearance:none;
}
input::placeholder,textarea::placeholder{color:var(--fg-faint)}
.input:focus,input:focus,select:focus,textarea:focus{
  box-shadow:inset 0 0 0 1.5px var(--accent),0 0 0 4px var(--accent-soft);
  background:var(--bg-surface);
}
textarea{min-height:88px;resize:vertical;line-height:1.5}
select{background-image:none;padding-inline-end:var(--sp-6)}
input[type="checkbox"],input[type="radio"]{
  width:22px;height:22px;min-height:0;flex:0 0 auto;
  accent-color:var(--accent);box-shadow:none;padding:0;
}
.switch{
  position:relative;flex:0 0 auto;
  width:46px;height:28px;border-radius:var(--r-full);
  background:var(--bg-sunken);box-shadow:inset 0 0 0 1px var(--stroke);
  transition:background-color var(--dur-base) var(--ease-out);
}
.switch::after{
  content:"";position:absolute;top:3px;left:3px;
  width:22px;height:22px;border-radius:50%;
  background:var(--bg-surface);box-shadow:var(--shadow-1);
  transition:transform var(--dur-base) var(--ease-spring);
}
.switch[aria-checked="true"],.switch.is-on{background:var(--accent)}
.switch[aria-checked="true"]::after,.switch.is-on::after{transform:translateX(18px)}

/* ── 7. ЧИПЫ И СЕГМЕНТЫ ────────────────────────────────────────────────── */
.chip{
  position:relative;
  display:inline-flex;align-items:center;gap:6px;
  min-height:var(--tap);padding:0 var(--sp-4);
  border-radius:var(--r-full);
  background:var(--bg-surface);
  box-shadow:var(--shadow-1);
  font-size:var(--fs-sm);font-weight:600;letter-spacing:-.005em;
  color:var(--fg-muted);white-space:nowrap;
  transition:color var(--dur-fast) var(--ease-out),background-color var(--dur-fast) var(--ease-out),
             box-shadow var(--dur-fast) var(--ease-out),transform var(--dur-tap) var(--ease-out);
}
.chip svg{width:16px;height:16px}
.chip:active{transform:scale(.96)}
.chip.is-active,.chip[aria-pressed="true"]{
  color:var(--fg-on-accent);
  background:var(--accent);
  box-shadow:0 4px 12px -6px var(--accent-ring);
}
.chip--dot::before{content:"";width:8px;height:8px;border-radius:50%;background:var(--c,var(--cat-color,var(--cat-other)))}
.chip.is-active.chip--dot::before{background:var(--fg-on-accent);opacity:.6}
.chip--count{padding-inline-end:10px}
.chip--count b{
  display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;
  border-radius:var(--r-full);background:var(--bg-sunken);color:var(--fg-muted);
  font-size:var(--fs-xs);font-weight:700;
}
.chip.is-active b{background:rgba(0,0,0,.14);color:var(--fg-on-accent)}

.segmented{
  --n:3;--i:0;
  position:relative;
  display:grid;grid-auto-flow:column;grid-auto-columns:1fr;
  padding:3px;
  border-radius:var(--r-full);
  background:var(--bg-sunken);
  isolation:isolate;
}
.segmented button{
  position:relative;z-index:1;
  min-height:var(--tap);padding:0 var(--sp-2);
  border-radius:var(--r-full);
  font-size:var(--fs-sm);font-weight:600;
  color:var(--fg-muted);white-space:nowrap;
  transition:color var(--dur-base) var(--ease-out);
}
.segmented button[aria-selected="true"],.segmented button.is-active{color:var(--fg-strong)}
.segmented__thumb{
  position:absolute;z-index:0;top:3px;bottom:3px;left:3px;
  width:calc((100% - 6px) / var(--n));
  border-radius:var(--r-full);
  background:var(--bg-surface);
  box-shadow:var(--shadow-1);
  transform:translateX(calc(var(--i) * 100%));
  transition:transform var(--dur-base) var(--ease-out);
}

/* ── 8. ПЛИТКИ КАТЕГОРИЙ ───────────────────────────────────────────────── */
.cat-tile{
  --tc:var(--c,var(--cat-color,var(--cat-other)));
  position:relative;
  display:flex;flex-direction:column;align-items:center;gap:6px;
  min-width:var(--tap);min-height:var(--tap);padding:2px 0;
  color:var(--fg-muted);
  transition:transform var(--dur-fast) var(--ease-spring),color var(--dur-fast) linear;
}
.cat-tile > :first-child{
  width:52px;height:52px;border-radius:var(--r-full);
  display:grid;place-items:center;
  color:var(--tc);
  background:color-mix(in oklab,var(--tc) var(--tile-mix),transparent);
  box-shadow:inset 0 0 0 1px color-mix(in oklab,var(--tc) 14%,transparent);
  transition:background-color var(--dur-base) var(--ease-out),color var(--dur-base) var(--ease-out),
             box-shadow var(--dur-base) var(--ease-out),transform var(--dur-base) var(--ease-spring);
}
.cat-tile svg{width:25px;height:25px}
.cat-tile span,.cat-tile small{
  font-size:var(--fs-xs);line-height:1.15;font-weight:500;
  text-align:center;max-width:76px;
  overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
}
.cat-tile:active > :first-child{transform:scale(.94)}
.cat-tile.is-selected{color:var(--fg-strong)}
.cat-tile.is-selected > :first-child{
  background:var(--tc);color:#fff;
  box-shadow:0 0 0 2px var(--bg-surface),0 0 0 4px color-mix(in oklab,var(--tc) var(--ring-mix),transparent),
             0 8px 18px -10px color-mix(in oklab,var(--tc) 70%,transparent);
  transform:scale(1.06);
}

/* ── 9. ПРОГРЕСС (R3: латунь → --heat-mid → --expense; зелёного НЕТ) ───── */
.progress{
  --p:0;--pace:0;
  position:relative;
  display:block;                 /* работает и на <span>, и на <div> */
  height:8px;width:100%;
  border-radius:var(--r-full);
  background:var(--bg-sunken);
  overflow:hidden;
}
.progress--lg{height:12px}
.progress__fill{
  display:block;height:100%;
  width:clamp(0%,calc(var(--p) * 1%),100%);
  min-width:0;
  border-radius:inherit;
  background:var(--accent);
  transition:width var(--dur-roll) var(--ease-out),background-color var(--dur-base) var(--ease-out);
}
.progress[data-status="warning"] .progress__fill,
.progress[data-status="serious"] .progress__fill{background:var(--heat-mid)}
.progress[data-status="critical"] .progress__fill,
.progress.is-over .progress__fill{
  width:100%;
  background-color:var(--expense);
  background-image:var(--hatch);
  background-size:auto;
}
/* Риска темпа. Элемент рендерится ТОЛЬКО когда темп осмыслен (см. контракт вверху). */
.progress__pace{
  position:absolute;top:-2px;bottom:-2px;
  left:clamp(0%,calc(var(--pace) * 1%),100%);
  width:2px;margin-left:-1px;
  background:var(--fg-faint);
  border-radius:var(--r-full);
  opacity:.85;
  transition:left var(--dur-roll) var(--ease-out);
}

/* ── 10. СЧЕТА (обзор) ─────────────────────────────────────────────────── */
#accounts-rail{
  display:flex;gap:var(--sp-3);
  overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x proximity;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
  padding:var(--sp-1) var(--pad-x) var(--sp-3);
  margin-inline:calc(var(--pad-x) * -1);
}
#accounts-rail::-webkit-scrollbar{display:none}
.acct-card{
  --tc:var(--c,var(--cat-color,var(--cat-tech)));
  position:relative;flex:0 0 auto;
  width:162px;min-height:104px;
  display:flex;flex-direction:column;justify-content:space-between;gap:var(--sp-3);
  padding:var(--sp-4);
  border-radius:var(--r-lg);
  background:var(--bg-surface);
  box-shadow:var(--shadow-1);
  scroll-snap-align:start;
  overflow:hidden;
  text-align:start;
  transition:transform var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);
}
.acct-card::before{
  content:"";position:absolute;inset:0 auto 0 0;width:3px;
  background:var(--tc);opacity:.9;
}
.acct-card::after{
  content:"";position:absolute;right:-34px;top:-34px;width:88px;height:88px;border-radius:50%;
  background:radial-gradient(closest-side,color-mix(in oklab,var(--tc) 20%,transparent),transparent 72%);
  pointer-events:none;
}
.acct-card:active{transform:scale(.98)}
.acct-card svg{width:19px;height:19px;color:var(--tc)}
.acct-card b{
  display:block;font-size:var(--fs-sm);font-weight:600;color:var(--fg-muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.acct-card .num{font-size:var(--fs-num-lg);letter-spacing:-.025em}
.acct-card small{font-size:var(--fs-xs);color:var(--fg-faint);font-weight:500}
.acct-card--add{
  background:transparent;
  box-shadow:none;
  outline:1.5px dashed var(--stroke-strong);outline-offset:-1.5px;
  border-radius:var(--r-lg);
  align-items:center;justify-content:center;
  color:var(--fg-faint);
  gap:var(--sp-2);
}
.acct-card--add::before,.acct-card--add::after{display:none}
.acct-card--add svg{width:22px;height:22px;color:var(--fg-faint)}
.acct-card--add:hover{outline-color:var(--accent);color:var(--accent)}

/* ── 11. КАРТОЧКИ ОБЗОРА ───────────────────────────────────────────────── */
#card-balance{
  position:relative;
  padding:var(--sp-6) var(--sp-5) var(--sp-5);
  border-radius:var(--r-xl);
  box-shadow:var(--shadow-2);
  display:flex;flex-direction:column;gap:var(--sp-3);
}
#card-balance::before{
  content:"";position:absolute;top:-90px;right:-60px;
  width:260px;height:260px;border-radius:50%;
  background:radial-gradient(closest-side,var(--accent-soft),transparent 70%);
  pointer-events:none;
}
#card-balance > *{position:relative}
#hero-amount{
  position:relative;align-self:flex-start;
  font-family:var(--font-num);font-weight:500;
  font-size:var(--fs-hero);line-height:var(--lh-hero);letter-spacing:var(--ls-hero);
  color:var(--fg-strong);
  padding-bottom:8px;
  cursor:pointer;user-select:none;-webkit-user-select:none;
  transition:opacity var(--dur-fast) linear;
}
#hero-amount::after{
  content:"";position:absolute;left:0;bottom:0;
  width:100%;height:3px;border-radius:var(--r-full);
  background:var(--accent-grad);
  opacity:.95;
}
#spark-balance{height:36px;width:100%}
#card-daily{
  padding:var(--sp-5);
  display:flex;flex-direction:column;gap:var(--sp-3);
}
#card-daily .num{font-size:var(--fs-num-xl);letter-spacing:-.03em}
#budgets-preview{display:flex;flex-direction:column}
#recent-ops{display:flex;flex-direction:column}
#card-top-cats{padding:var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-4)}
#donut-overview,#donut-report{width:100%;min-height:200px}
#bars-report{width:100%;min-height:220px}

/* ── 12. ОПЕРАЦИИ ──────────────────────────────────────────────────────── */
#ops-filters{
  position:sticky;top:calc(var(--h-header) + var(--safe-t));z-index:var(--z-sticky);
  display:flex;flex-direction:column;gap:var(--sp-3);
  padding:var(--sp-2) 0 var(--sp-3);
  background:var(--bg-app);
}
#ops-filters .u-scroll-x,#ops-filters > div:last-child{
  display:flex;gap:var(--sp-2);
  overflow-x:auto;scrollbar-width:none;
  padding-inline:var(--pad-x);margin-inline:calc(var(--pad-x) * -1);
}
#ops-filters ::-webkit-scrollbar{display:none}
#ops-search{
  width:100%;
  padding-inline-start:var(--sp-7);
  background:var(--bg-surface);
  box-shadow:var(--shadow-1);
}
#ops-summary{
  display:grid;grid-template-columns:repeat(3,1fr);
  padding:var(--sp-4) var(--sp-3);
  text-align:center;
}
#ops-summary > *{display:flex;flex-direction:column;gap:2px;min-width:0}
#ops-summary .num{font-size:var(--fs-num-md)}
#ops-summary > * + *{box-shadow:inset 1px 0 0 var(--stroke)}
#ops-list{display:flex;flex-direction:column;gap:0}
#ops-sentinel{height:1px;width:100%}

.day-head{
  position:sticky;top:calc(var(--h-header) + var(--safe-t) + var(--stick-extra,0px));
  z-index:calc(var(--z-sticky) - 1);
  display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-3);
  padding:var(--sp-3) var(--sp-4) var(--sp-2);
  background:var(--bg-app);
  font-size:var(--fs-xs);font-weight:700;letter-spacing:.03em;text-transform:uppercase;
  color:var(--fg-faint);
  transition:box-shadow var(--dur-fast) var(--ease-out),background-color var(--dur-fast) linear;
}
.day-head .num{font-size:var(--fs-num-sm);font-weight:500;color:var(--fg-muted);letter-spacing:0}
/* Внутри карточки заголовок дня подхватывает цвет карточки, а не фон приложения */
#recent-ops .day-head{background:var(--bg-surface)}
/* В «Операциях» над лентой висит панель фильтров — заголовок дня встаёт под неё.
   Точную высоту панели screens.js может уточнить через --stick-extra на #ops-list. */
#ops-list .day-head{top:calc(var(--h-header) + var(--safe-t) + var(--stick-extra,58px))}
.day-head.is-stuck{
  background:var(--bg-header);
  backdrop-filter:var(--blur-bar);-webkit-backdrop-filter:var(--blur-bar);
  box-shadow:0 8px 16px -16px rgba(0,0,0,.6),inset 0 -1px 0 var(--stroke);
}

/* Свайп-контейнер строки */
.op-swipe{
  position:relative;
  overflow:hidden;
  background:var(--bg-surface);
  border-radius:var(--r-md);
  touch-action:pan-y;
}
.op-act--edit,.op-act--del{
  position:absolute;top:0;bottom:0;
  width:88px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  font-size:var(--fs-xs);font-weight:700;letter-spacing:.02em;
}
.op-act--edit{left:0;background:var(--accent-soft);color:var(--accent)}
.op-act--del{right:0;background:var(--expense-soft);color:var(--expense)}
.op-act--edit svg,.op-act--del svg{width:20px;height:20px}

/* Строка операции: grid 40px | 1fr | auto, высота --h-row */
.op-row{
  position:relative;
  display:grid;grid-template-columns:40px 1fr auto;align-items:center;
  gap:var(--sp-3);
  width:100%;min-height:var(--h-row);
  padding:var(--sp-2) var(--pad-x);
  background:var(--bg-surface);
  text-align:start;
  transition:transform var(--dur-base) var(--ease-out),background-color var(--dur-fast) linear;
  will-change:transform;
}
.op-row::after{
  content:"";position:absolute;left:var(--sep-left);right:0;bottom:0;height:1px;
  background:var(--stroke);
}
.op-row:last-child::after{display:none}
.op-row:active{background:var(--bg-surface-2)}
.op-row > *{min-width:0}
.op-row > *:nth-child(2){display:flex;flex-direction:column;gap:2px}
.op-ic,.op-row .ic{
  --tc:var(--c,var(--cat-color,var(--cat-other)));
  width:40px;height:40px;border-radius:var(--r-full);
  display:grid;place-items:center;
  color:var(--tc);
  background:color-mix(in oklab,var(--tc) var(--tint-mix),transparent);
}
.op-ic svg,.op-row svg{width:21px;height:21px}
.op-row b{
  display:block;
  font-size:var(--fs-body);font-weight:600;line-height:1.25;color:var(--fg-strong);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.op-row small{
  display:block;
  font-size:var(--fs-sm);line-height:1.3;color:var(--fg-muted);font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.op-row .num{font-size:var(--fs-num-md);text-align:end}
/* Гасим СОДЕРЖИМОЕ, а не саму строку: opacity на .op-row делала её полупрозрачной,
   и сквозь неё просвечивали кнопки свайпа (.op-act--del) из .op-swipe под ней. */
.op-row--pending > *{opacity:.72}
.op-row--pending::before{
  content:"";position:absolute;left:6px;top:calc(50% - 3px);
  width:6px;height:6px;border-radius:50%;
  background:var(--heat-mid);
  animation:pulse-dot 1.6s var(--ease-inout) infinite;
}

/* ── 13. БЮДЖЕТЫ (R3, зелёного нет) ───────────────────────────────────── */
#budget-summary{padding:var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-4)}
#budget-summary .num{font-size:var(--fs-num-xl);letter-spacing:-.03em}
#budget-list{display:flex;flex-direction:column;gap:var(--sp-3)}
.budget-card{
  display:flex;flex-direction:column;gap:var(--sp-3);
  padding:var(--sp-4) var(--sp-5);
  border-radius:var(--r-lg);
  background:var(--bg-surface);
  box-shadow:var(--shadow-1);
  text-align:start;width:100%;
  transition:transform var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);
}
.budget-card:active{transform:scale(.99)}
.budget-card.is-over{
  box-shadow:var(--shadow-1),inset 0 0 0 1.5px color-mix(in oklab,var(--expense) 42%,transparent);
  background:color-mix(in oklab,var(--expense) 4%,var(--bg-surface));
}
.budget-card .num{font-size:var(--fs-num-md)}
.budget-card b{font-size:var(--fs-h3);font-weight:600;color:var(--fg-strong)}

.budget-row{
  display:grid;grid-template-columns:40px 1fr auto;align-items:center;
  gap:var(--sp-3);
  width:100%;min-height:var(--tap);
  padding:var(--sp-3) var(--sp-5);
  text-align:start;
  transition:background-color var(--dur-fast) linear;
}
.budget-row:active{background:var(--bg-surface-2)}
.budget-row > *{min-width:0}
.budget-row > *:nth-child(2){display:flex;flex-direction:column;gap:5px}
.budget-row b{font-size:var(--fs-body);font-weight:600;color:var(--fg-strong);display:block}
.budget-row small{font-size:var(--fs-sm);color:var(--fg-muted);display:block}
.budget-add{
  display:flex;align-items:center;justify-content:center;gap:var(--sp-2);
  width:100%;min-height:56px;
  border-radius:var(--r-lg);
  outline:1.5px dashed var(--stroke-strong);outline-offset:-1.5px;
  color:var(--fg-muted);font-size:var(--fs-sm);font-weight:600;
  background:transparent;
  transition:color var(--dur-fast) linear,outline-color var(--dur-fast) linear,background-color var(--dur-fast) linear;
}
.budget-add svg{width:19px;height:19px}
.budget-add:hover{color:var(--accent);outline-color:var(--accent);background:var(--accent-soft)}

/* ── 14. ОТЧЁТЫ ───────────────────────────────────────────────────────── */
#period-seg{width:100%}
#report-tabs{
  display:flex;gap:var(--sp-2);
  overflow-x:auto;scrollbar-width:none;
  padding-inline:var(--pad-x);margin-inline:calc(var(--pad-x) * -1);
}
#report-tabs::-webkit-scrollbar{display:none}
#cat-table{overflow-x:auto;padding:var(--sp-2) 0}
#cat-table table{min-width:340px;font-size:var(--fs-sm)}
#cat-table th{
  text-align:start;font-size:var(--fs-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--fg-faint);padding:var(--sp-2) var(--sp-4);white-space:nowrap;
}
#cat-table td{
  padding:10px var(--sp-4);color:var(--fg);
  box-shadow:inset 0 1px 0 var(--stroke);
  white-space:nowrap;
}
#cat-table td:first-child{white-space:normal;color:var(--fg-strong);font-weight:500}
#cat-table td:last-child,#cat-table th:last-child{text-align:end}

/* ── 15. «ЕЩЁ» — НАСТРОЙКИ ────────────────────────────────────────────── */
#screen-more section{display:flex;flex-direction:column}
.set-row{
  display:grid;grid-template-columns:34px 1fr auto;align-items:center;
  gap:var(--sp-3);
  width:100%;min-height:56px;
  padding:var(--sp-3) var(--sp-5);
  text-align:start;
  color:var(--fg-strong);
  transition:background-color var(--dur-fast) linear;
}
.set-row + .set-row{box-shadow:inset 0 1px 0 var(--stroke)}
.set-row:active{background:var(--bg-surface-2)}
.set-row svg{width:20px;height:20px;color:var(--fg-muted)}
.set-row b{font-size:var(--fs-body);font-weight:500;display:block}
.set-row small{font-size:var(--fs-sm);color:var(--fg-muted);display:block;line-height:1.35}
.set-row--danger{color:var(--expense)}
.set-row--danger svg{color:var(--expense)}

/* ── 16. ПУСТЫЕ СОСТОЯНИЯ ─────────────────────────────────────────────── */
.empty{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-3);
  padding:var(--sp-8) var(--sp-5);
  text-align:center;
  color:var(--fg-muted);
}
.empty svg{width:28px;height:28px;color:var(--fg-faint)}
.empty > :first-child{
  width:64px;height:64px;border-radius:var(--r-full);
  display:grid;place-items:center;
  background:var(--bg-sunken);
}
.empty b{font-size:var(--fs-h3);font-weight:600;color:var(--fg-strong);letter-spacing:var(--ls-h3)}
.empty p,.empty small{font-size:var(--fs-sm);color:var(--fg-muted);max-width:30ch;line-height:1.45}

/* ── 17. ШТОРКИ СНИЗУ ─────────────────────────────────────────────────── */
#sheet-root{
  position:fixed;inset:0;z-index:var(--z-sheet);
  display:flex;align-items:flex-end;justify-content:center;
  background:var(--bg-scrim);
  backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity var(--dur-base) var(--ease-out),visibility 0s linear var(--dur-base);
}
#sheet-root:not(:empty),#sheet-root.is-open{
  opacity:1;visibility:visible;pointer-events:auto;
  transition-delay:0s;
}
.sheet{
  position:relative;
  width:100%;max-width:var(--w-app);
  max-height:min(92dvh,860px);
  display:flex;flex-direction:column;
  padding:0 var(--pad-x) calc(var(--safe-b) + var(--sp-5));
  border-radius:var(--r-xl) var(--r-xl) 0 0;
  background:var(--bg-elevated);
  box-shadow:var(--shadow-3);
  overflow-y:auto;overflow-x:hidden;
  -webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;
  animation:sheet-in var(--dur-base) var(--ease-out) both;
}
.sheet.is-closing{animation:sheet-out var(--dur-fast) var(--ease-inout) both}
.sheet > *{flex:0 0 auto}
.sheet__handle{
  position:sticky;top:0;z-index:2;
  flex:0 0 auto;
  align-self:center;
  width:100%;
  padding:10px 0 var(--sp-3);
  display:flex;justify-content:center;
  background:linear-gradient(var(--bg-elevated) 70%,transparent);
  cursor:grab;
}
.sheet__handle::before{
  content:"";width:40px;height:4px;border-radius:var(--r-full);
  background:var(--stroke-strong);
}
.sheet header,.sheet > .u-between:first-of-type{
  display:flex;align-items:center;gap:var(--sp-3);
  padding-bottom:var(--sp-4);
}
.sheet h2,.sheet h3{
  font-size:var(--fs-h2);line-height:var(--lh-h2);letter-spacing:var(--ls-h2);
  font-weight:600;color:var(--fg-strong);
}
.sheet--tall{min-height:70dvh}

/* 17.1 Шит быстрого добавления */
#sheet-add{display:flex;flex-direction:column;gap:var(--sp-4)}
#add-type{--n:3}
#add-amount{
  display:flex;align-items:baseline;justify-content:flex-end;gap:4px;
  min-height:64px;padding:var(--sp-2) var(--sp-3);
  border-radius:var(--r-lg);
  background:var(--bg-surface-2);
  font-family:var(--font-num);font-weight:500;
  font-size:var(--fs-display);line-height:var(--lh-display);letter-spacing:var(--ls-display);
  color:var(--fg-strong);
  overflow-x:auto;white-space:nowrap;scrollbar-width:none;
  user-select:none;-webkit-user-select:none;
  transition:box-shadow var(--dur-fast) var(--ease-out),color var(--dur-fast) linear;
}
#add-amount::-webkit-scrollbar{display:none}
#add-amount:focus-visible{box-shadow:inset 0 0 0 1.5px var(--accent)}
#add-amount[data-empty="1"]{color:var(--fg-faint)}
#add-amount::after{
  content:"";width:2px;height:1em;border-radius:1px;
  background:var(--accent);
  animation:caret 1.05s steps(1,end) infinite;
}
#add-context{
  display:flex;gap:var(--sp-2);
  overflow-x:auto;scrollbar-width:none;
  padding-inline:var(--pad-x);margin-inline:calc(var(--pad-x) * -1);
}
#add-context::-webkit-scrollbar{display:none}
#add-cats{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:var(--sp-4) var(--sp-2);
  padding:var(--sp-1) 0;
}
#add-pad{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:var(--sp-2);
}
#add-pad button{
  min-height:54px;
  border-radius:var(--r-md);
  background:var(--bg-surface-2);
  box-shadow:var(--shadow-1);
  font-family:var(--font-num);font-size:20px;font-weight:500;
  color:var(--fg-strong);
  display:grid;place-items:center;
  transition:transform var(--dur-tap) var(--ease-out),background-color var(--dur-tap) linear;
}
#add-pad button:active{transform:scale(.95);background:var(--bg-sunken)}
#add-pad button[data-key="del"],#add-pad button[data-op]{
  background:var(--bg-sunken);color:var(--fg-muted);box-shadow:none;
}
#add-pad button[data-key="eq"]{background:var(--accent-soft);color:var(--accent)}
#add-pad svg{width:22px;height:22px}
#add-submit{
  width:100%;min-height:52px;
  border-radius:var(--r-lg);
  background:var(--accent-grad);color:var(--fg-on-accent);
  box-shadow:var(--shadow-2);
  font-size:var(--fs-h3);font-weight:700;letter-spacing:-.01em;
  display:flex;align-items:center;justify-content:center;gap:var(--sp-2);
  transition:transform var(--dur-tap) var(--ease-out),opacity var(--dur-fast) linear;
}
#add-submit:active{transform:scale(.98)}
#sheet-cats-all{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-4) var(--sp-2)}

/* 17.2 Шит одной операции */
#sheet-op{display:flex;flex-direction:column;gap:var(--sp-4)}
#sheet-op .num{font-size:var(--fs-num-xl);letter-spacing:-.03em}

/* SVG-спрайт не занимает места и не влияет на поток */
#icon-sprite{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none}

/* ── 18. ТОСТЫ ────────────────────────────────────────────────────────── */
#toast-root{
  position:fixed;left:0;right:0;
  bottom:calc(var(--h-nav) + var(--safe-b) + var(--sp-3));
  z-index:var(--z-toast);
  display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);
  padding-inline:var(--pad-x);
  pointer-events:none;
}
.toast{
  pointer-events:auto;
  width:100%;max-width:calc(var(--w-app) - var(--pad-x) * 2);
  display:flex;align-items:center;gap:var(--sp-3);
  min-height:var(--tap);
  padding:6px var(--sp-2) 6px var(--sp-4);
  border-radius:var(--r-md);
  background:var(--bg-elevated);
  box-shadow:var(--shadow-3);
  font-size:var(--fs-sm);font-weight:500;color:var(--fg-strong);
  animation:toast-in var(--dur-base) var(--ease-spring) both;
}
.toast.is-hiding{animation:toast-out var(--dur-fast) var(--ease-inout) both}
.toast svg{width:18px;height:18px;color:var(--fg-muted);flex:0 0 auto}
.toast span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.toast button{
  flex:0 0 auto;
  min-height:var(--tap);padding:0 var(--sp-4);
  border-radius:var(--r-full);
  background:var(--accent-soft);color:var(--accent);
  font-size:var(--fs-sm);font-weight:700;
}
.toast--error{box-shadow:var(--shadow-3),inset 0 0 0 1.5px color-mix(in oklab,var(--expense) 40%,transparent)}
.toast--error svg{color:var(--expense)}

/* ── 19. СКЕЛЕТОНЫ ───────────────────────────────────────────────────── */
.skel{
  position:relative;
  border-radius:var(--r-sm);
  background:var(--bg-sunken);
  overflow:hidden;
}
.skel::after{
  content:"";position:absolute;inset:0;
  transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,var(--skeleton-shine),transparent);
  animation:skel-shine 1.35s var(--ease-inout) infinite;
}
.skel-hero{
  height:150px;border-radius:var(--r-xl);
  background:var(--bg-sunken);position:relative;overflow:hidden;
}
.skel-acct{
  flex:0 0 auto;width:162px;height:104px;border-radius:var(--r-lg);
  background:var(--bg-sunken);position:relative;overflow:hidden;
}
.skel-op-row{
  height:var(--h-row);border-radius:var(--r-md);
  background:var(--bg-sunken);position:relative;overflow:hidden;
}
.skel-budget{
  height:86px;border-radius:var(--r-lg);
  background:var(--bg-sunken);position:relative;overflow:hidden;
}
.skel-chart{
  height:208px;border-radius:var(--r-lg);
  background:var(--bg-sunken);position:relative;overflow:hidden;
}
.skel-hero::after,.skel-acct::after,.skel-op-row::after,.skel-budget::after,.skel-chart::after{
  content:"";position:absolute;inset:0;
  transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,var(--skeleton-shine),transparent);
  animation:skel-shine 1.35s var(--ease-inout) infinite;
}

/* ── 20. РЕЖИМЫ И СОСТОЯНИЯ ──────────────────────────────────────────── */
/* Приватный режим: суммы скрыты, но верстка не прыгает */
.is-private .num,.is-private #hero-amount,.is-private [data-private]{
  filter:blur(9px);
  user-select:none;-webkit-user-select:none;
  transition:filter var(--dur-base) var(--ease-out);
}
.is-private #spark-balance,.is-private .progress__fill{filter:blur(4px)}

/* Плавная перекраска при ручной смене темы */
.theme-anim,.theme-anim *,.theme-anim *::before,.theme-anim *::after{
  transition:background-color var(--dur-base) var(--ease-out),
             color var(--dur-base) var(--ease-out),
             box-shadow var(--dur-base) var(--ease-out),
             outline-color var(--dur-base) var(--ease-out),
             fill var(--dur-base) var(--ease-out),
             stroke var(--dur-base) var(--ease-out) !important;
}

/* Данные перезагружаются: карточка держит прежний рендер, просто тускнеет */
.is-loading{opacity:.55;transition:opacity var(--dur-fast) linear;pointer-events:none}

/* ── 21. АНИМАЦИИ ────────────────────────────────────────────────────── */
@keyframes screen-in{
  from{opacity:0;transform:translateY(8px)}
  to{opacity:1;transform:none}
}
@keyframes slide-down{
  from{opacity:0;transform:translateY(-100%)}
  to{opacity:1;transform:none}
}
@keyframes sheet-in{
  from{opacity:.4;transform:translateY(24px) scale(.99)}
  to{opacity:1;transform:none}
}
@keyframes sheet-out{
  from{opacity:1;transform:none}
  to{opacity:0;transform:translateY(100%)}
}
@keyframes toast-in{
  from{opacity:0;transform:translateY(16px) scale(.96)}
  to{opacity:1;transform:none}
}
@keyframes toast-out{
  from{opacity:1;transform:none}
  to{opacity:0;transform:translateY(10px) scale(.97)}
}
@keyframes fab-in{
  from{opacity:0;transform:scale(.6)}
  to{opacity:1;transform:none}
}
@keyframes skel-shine{
  0%{transform:translateX(-100%)}
  60%,100%{transform:translateX(100%)}
}
@keyframes pulse-dot{
  0%,100%{opacity:1;transform:scale(1)}
  50%{opacity:.35;transform:scale(.75)}
}
@keyframes caret{
  0%,45%{opacity:1}
  50%,100%{opacity:0}
}
@keyframes spin{to{transform:rotate(360deg)}}
.is-spinning,[data-state="syncing"] .i-refresh{animation:spin 900ms linear infinite}

/* ── 22. АДАПТИВ ─────────────────────────────────────────────────────── */
/* Узкие телефоны (≤360px) — ужимаем горизонтальные отступы */
@media (max-width:360px){
  :root{--pad-x:12px}
  .cat-tile > :first-child{width:48px;height:48px}
  #add-pad button{min-height:50px;font-size:19px}
  .acct-card{width:150px}
}

/* Планшет/десктоп: колонка по центру, «плавающая» навигация */
@media (min-width:640px){
  body{background:var(--bg-app)}
  #view{padding-top:var(--sp-5)}
  #tabbar{
    left:50%;transform:translateX(-50%);
    bottom:var(--sp-4);
    width:min(calc(var(--w-app) - var(--sp-6)),calc(100vw - var(--sp-8)));
    height:var(--h-nav);
    padding-bottom:0;
    border-radius:var(--r-xl);
    box-shadow:var(--shadow-3);
  }
  #tab-indicator{border-radius:var(--r-full)}
  #fab{bottom:calc(var(--h-nav) + var(--sp-4) + var(--sp-4))}
  #btn-top{bottom:calc(var(--h-nav) + var(--sp-4) + var(--sp-4) + 58px + var(--sp-3))}
  #toast-root{bottom:calc(var(--h-nav) + var(--sp-4) + var(--sp-3))}
  #view{padding-bottom:calc(var(--h-nav) + var(--sp-9) + var(--sp-6))}
  .sheet{
    border-radius:var(--r-xl);
    margin-bottom:var(--sp-6);
    max-height:min(86dvh,860px);
  }
  #sheet-root{align-items:center}
}

/* Мышь есть — включаем hover-эффекты только там (на тач не «залипает») */
@media (hover:hover) and (pointer:fine){
  .chip:hover{color:var(--fg-strong);box-shadow:var(--shadow-2)}
  .chip.is-active:hover{color:var(--fg-on-accent);background:var(--accent-hover)}
  .btn:hover{box-shadow:var(--shadow-2)}
  .btn--quiet:hover{background:var(--bg-surface-2)}
  .op-row:hover{background:var(--bg-surface-2)}
  .set-row:hover{background:var(--bg-surface-2)}
  .acct-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-2)}
  .budget-card:hover{box-shadow:var(--shadow-2)}
  .cat-tile:hover > :first-child{transform:scale(1.05)}
  #month-pill:hover{box-shadow:var(--shadow-2)}
  #btn-search:hover{background:var(--bg-sunken);color:var(--fg-strong)}
  .tab:hover{color:var(--fg)}
  .tab[aria-selected="true"]:hover{color:var(--accent-hover)}
}

/* Печать: только содержимое */
@media print{
  #topbar,#tabbar,#fab,#btn-top,#sheet-root,#toast-root,#net-banner{display:none!important}
  #view{max-width:none;padding:0}
  body{background:#fff;color:#000}
}
