:root{
  --bg:#eceef2; --card:#ffffff; --text:#1c1c1e; --text2:#8e8e93;
  --sep:#e5e5ea; --accent:#007aff; --link:#007aff; --accent2:#34c759; --danger:#ff3b30; --on-accent:#fff;
  --warn-bg:#fff4e5; --warn-text:#b25e00; --radius:14px;
  /* тема (выставляются theme.js под Telegram) */
  --dayhead-bg:#cfe0fa; --dayhead-text:#2f6ad9; --slot-active:#f4f4f7; --search-bg:#e9e9ec;
  /* выходные (сб/вс): едва заметный болотный оттенок шапки; today-выходной — яркий болотный акцент */
  --weekend-bg:#cfe6d8; --weekend-accent:#2a9d8f;
  --accent-soft:#e7f0ff;  /* мягкий фон акцента (кнопка «Вернуться», активный чип) */
  /* safe-area для fullscreen (Bot API 8.0): вырезы устройства + зона кнопок Telegram.
     В обычном режиме и в браузере = 0 (выставляет app.js при fullscreen). */
  --safe-top:0px; --safe-bot:0px; --safe-left:0px; --safe-right:0px;
}
/* тёмная тема: warn-блоки (рекорд, заполненная заметка-памятка, инфо-плашки) — тёмный тёплый фон вместо кремового + оранжевый текст. Иначе светлый --warn-bg из :root остаётся белёсым пятном на тёмном (theme.js его не переопределяет). */
body.dark{ --warn-bg:#33291a; --warn-text:#ffab51; }
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;margin:0;padding:0;}
html,body{height:100%;overscroll-behavior:none;}
body{
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  background:#000;display:flex;justify-content:center;align-items:center;
  min-height:100vh;color:var(--text);-webkit-font-smoothing:antialiased;
}
/* в Telegram WebView (класс .tg) запираем body (overflow:hidden) — скролл только внутри .content.
   От «резинового» оттягивания webview за нескроллируемую область (заголовок, пустота) защищают
   overscroll-behavior:none (html,body) + telegram disableVerticalSwipes(). БЕЗ position:fixed —
   он ломал НАТИВНУЮ обработку клавиатуры на iOS (дёрг экрана при открытии). В обычном браузере
   (без .tg) не трогаем, чтобы демо-рамка телефона жила. */
body.tg,body.web{overflow:hidden;}
.phone{
  width:390px;max-width:100vw;height:844px;max-height:100vh;
  background:var(--bg);overflow:hidden;position:relative;display:flex;flex-direction:column;
}
@media(min-width:430px){.phone{border-radius:44px;box-shadow:0 30px 80px rgba(0,0,0,.5);border:10px solid #1a1a1a;}}
.statusbar{height:44px;flex:0 0 44px;display:flex;align-items:center;justify-content:space-between;padding:0 26px;font-size:14px;font-weight:600;}
.statusbar .dots{letter-spacing:1px;}

/* шапка: в fullscreen опускаем под чёлку + кнопки Telegram (--safe-top); иначе 4px как было */
.nav{flex:0 0 auto;background:var(--bg);padding:calc(4px + var(--safe-top)) 16px 8px;}
.nav .row{display:flex;align-items:center;justify-content:space-between;min-height:34px;gap:8px;}
.nav .title{font-size:30px;font-weight:700;letter-spacing:-.5px;}
.nav .title.small{font-size:20px;}
.gear{font-size:22px;cursor:pointer;opacity:.8;line-height:1;padding:2px;user-select:none;}
.gear:active{opacity:.5;}
/* экран «Настройки»: секции-карточки (.group) */
.set-sec{padding:16px;}
.set-title{font-size:13px;font-weight:600;color:var(--text2);text-transform:uppercase;letter-spacing:.3px;margin-bottom:10px;}
.set-desc{font-size:14px;color:var(--text2);line-height:1.45;margin-bottom:14px;}
.set-row{display:flex;justify-content:space-between;align-items:center;font-size:17px;margin-bottom:8px;}
.set-row .muted{color:var(--text2);}
.segmented{display:flex;gap:6px;}
.tseg{flex:1;display:flex;align-items:center;justify-content:center;gap:5px;padding:10px 4px;border-radius:10px;background:var(--search-bg);color:var(--text);font-size:14px;font-weight:500;cursor:pointer;white-space:nowrap;user-select:none;}
.tseg.active{background:var(--accent);color:var(--on-accent);font-weight:600;}
/* плитки цветных тем */
.theme-tiles{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:10px;}
.ttile{position:relative;border-radius:10px;padding:13px 12px;min-height:50px;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:14px;font-weight:600;overflow:hidden;border:2px solid transparent;}
.ttile.active{border-color:currentColor;}
.ttile .ttile-dot{width:16px;height:16px;border-radius:50%;flex:0 0 auto;}
.ttile .ttile-check{position:absolute;top:4px;right:6px;font-size:13px;font-weight:700;}
.back{color:var(--link);font-size:17px;cursor:pointer;display:flex;align-items:center;gap:2px;background:none;border:none;white-space:nowrap;}
.nav-btn{color:var(--link);font-size:17px;cursor:pointer;background:none;border:none;font-weight:400;white-space:nowrap;}
.tpl-link{display:inline-block;color:var(--link);font-size:14px;cursor:pointer;padding:6px 2px;}
.noscrollbar{scrollbar-width:none;-ms-overflow-style:none;}
.noscrollbar::-webkit-scrollbar{display:none;width:0;height:0;}

/* #app занимает всю оставшуюся высоту телефона и сам flex — чтобы .screen зажался по высоте */
#app{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;}
.screen{display:none;flex-direction:column;flex:1 1 auto;min-height:0;}
.screen.active{display:flex;}
.content{flex:1 1 auto;overflow-y:auto;overscroll-behavior:contain;padding:6px 16px calc(96px + var(--safe-bot));-webkit-overflow-scrolling:touch;min-height:0;scrollbar-width:none;-ms-overflow-style:none;}
.content::-webkit-scrollbar{display:none;}
/* когда внизу плавающая кнопка + таббар — добавляем место, чтобы последний пункт не прятался */
.content.hasfab{padding-bottom:calc(150px + var(--safe-bot));}
/* при фокусе iOS сам скроллит поле в зону видимости — небольшой отступ от края клавиатуры */
input,textarea,select{scroll-margin-bottom:20px;}
/* запас прокрутки снизу (журнал/замеры): чтобы последний подход/замер можно было поднять выше клавиатуры вручную.
   Фиксированные px (не vh): в fullscreen vh ссылается на бо́льшую высоту экрана — запас был бы чрезмерным. */
.kbspace{height:300px;}
/* список упражнений скроллится вместе с экраном (без вложенного скролла) */

/* ===== Анимация смены недели (слайд, как перелистывание страницы) ===== */
/* фаза 1: старый контент уезжает за край */
.content.slide-out-left{transition:transform .09s ease-out, opacity .09s ease-out; transform:translateX(-100%); opacity:0;}
.content.slide-out-right{transition:transform .09s ease-out, opacity .09s ease-out; transform:translateX(100%); opacity:0;}
/* фаза 2: новый контент стартует за противоположным краем (без анимации — это исходная точка) */
.content.slide-start-right{transform:translateX(100%); opacity:0;}
.content.slide-start-left{transform:translateX(-100%); opacity:0;}
/* фаза 2: и едет на место */
.content.slide-settle{transition:transform .11s ease-out, opacity .11s ease-out; transform:translateX(0); opacity:1;}

.weekbar{display:flex;align-items:center;justify-content:space-between;padding:0 16px 6px;}
.weekbar .wkmid{display:flex;flex-direction:column;align-items:center;gap:3px;}
.weekbar .wk{color:var(--text2);font-size:15px;}
.weekbar .todaybtn{color:var(--accent);font-size:12px;font-weight:600;cursor:pointer;background:var(--accent-soft);border-radius:12px;padding:2px 10px;}
.weekbar .todaybtn:active{opacity:.7;}
.weekbar .arrow{color:var(--link);font-size:22px;cursor:pointer;padding:4px 10px;}
/* карточка дня: голубоватая шапка сверху + белый блок клиентов снизу */
.daycard{border-radius:var(--radius);margin-bottom:12px;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.06);}
.daycard.todaycard{box-shadow:0 0 0 1.5px var(--accent),0 1px 3px rgba(0,0,0,.06);}
/* сегодня-выходной: рамка в болотном акценте (вместо синего) */
.daycard.todaycard.weekend{box-shadow:0 0 0 1.5px var(--weekend-accent),0 1px 3px rgba(0,0,0,.06);}
/* шапка дня — голубоватый фон */
.dayhead{display:flex;justify-content:space-between;align-items:center;font-size:13px;font-weight:700;color:var(--dayhead-text);text-transform:uppercase;letter-spacing:.5px;padding:10px 14px;background:var(--dayhead-bg);}
.dayhead.today{color:var(--on-accent);background:var(--accent);}
/* выходной (не сегодня): мягкий болотный фон, текст прежний (отличие едва заметное) */
.dayhead.weekend{background:var(--weekend-bg);}
/* сегодня-выходной: яркий болотный, выделенный (3 класса — переопределяет и today, и weekend) */
.dayhead.today.weekend{color:var(--on-accent);background:var(--weekend-accent);}
.dayhead.today .dayplus{color:var(--on-accent);}
/* плюсик — единственный кликабельный элемент шапки (добавить тренировку); шире зона нажатия */
.dayhead .dayplus{color:var(--link);font-size:22px;font-weight:400;cursor:pointer;padding:2px 8px;margin:-2px -8px;}
.dayhead .dayplus:active{opacity:.6;}
/* блок клиентов — карточка, под шапкой */
.dayempty{color:var(--text2);font-size:14px;padding:12px 14px;background:var(--card);cursor:pointer;}
.dayempty:active{background:var(--slot-active);}
/* клиенты — строки в блоке, тонкая линия между ними (снизу, кроме последнего) */
.slot{background:var(--card);padding:13px 14px;margin:0;display:flex;align-items:center;justify-content:space-between;cursor:pointer;border-bottom:1px solid var(--sep);}
.slot:last-child{border-bottom:none;}
.slot:active{background:var(--slot-active);}
.slot .left{display:flex;align-items:center;gap:12px;min-width:0;flex:1;}
.slot .time{font-size:15px;font-weight:600;color:var(--accent);min-width:48px;align-self:flex-start;padding-top:1px;}
.slot .slottext{display:flex;flex-direction:column;gap:2px;min-width:0;}
.slot .cname{font-size:17px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.slot .slotmuscle{font-size:13px;color:var(--text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.slot .chev{color:#c7c7cc;font-size:20px;}
.empty{color:var(--text2);font-size:15px;padding:6px 4px 0;}

.group{background:var(--card);border-radius:var(--radius);overflow:hidden;margin-bottom:18px;}
.item{padding:13px 16px;border-bottom:1px solid var(--sep);display:flex;align-items:center;justify-content:space-between;cursor:pointer;}
.item:last-child{border-bottom:none;}
.item:active{background:var(--slot-active);}
.item .ititle{font-size:17px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.item .isub{font-size:14px;color:var(--text2);}
.item .chev{color:#c7c7cc;font-size:20px;margin-left:8px;}
.item .ileft{display:flex;flex-direction:column;gap:2px;min-width:0;}
/* отдельная карточка клиента в списке */
.ccard{background:var(--card);border-radius:12px;padding:14px 16px;margin-bottom:8px;display:flex;align-items:center;justify-content:space-between;cursor:pointer;box-shadow:0 1px 3px rgba(0,0,0,.10);}
.ccard:active{background:var(--slot-active);}
.ccard .ileft{display:flex;flex-direction:column;gap:2px;min-width:0;}
.ccard .ititle{font-size:17px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ccard .isub{font-size:14px;color:var(--text2);}
.ccard .isub.live{color:var(--accent2);font-weight:600;}   /* «идёт сейчас» — зелёным, заметно */
.ccard .chev{color:#c7c7cc;font-size:20px;margin-left:8px;}
.ccard .chev.accent{color:var(--link);font-size:26px;font-weight:600;}   /* список клиентов: явная цветная стрелка — видно, что карточка кликабельна */

.sectionlabel{font-size:13px;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;margin:8px 6px 8px;}

.bigbtn{display:block;width:100%;background:var(--accent);color:var(--on-accent);border:none;border-radius:var(--radius);padding:16px;font-size:17px;font-weight:600;cursor:pointer;margin-top:4px;}
.bigbtn:active{opacity:.85;}
.bigbtn.green{background:var(--accent2);}
body.colortheme .bigbtn.green{background:var(--accent);}   /* в цветных темах кнопка-действие — в тон теме, не универсальный зелёный */
.bigbtn.ghost{background:var(--card);color:var(--link);}
.bigbtn.danger{background:var(--card);color:var(--danger);}
/* «+ Добавить упражнение» липнет к верху области тренировки при скролле (position:sticky — НЕ fixed,
   безопасно для iOS-клавиатуры: липнет ВНУТРИ .content, а не поверх экрана). Фон var(--bg), чтобы
   упражнения не просвечивали под прилипшей кнопкой. Короткая тренировка (без скролла) — стоит на месте. */
.addex-sticky{position:sticky;top:-6px;z-index:5;background:var(--bg);padding:8px 0 8px;}
.rowbtns{display:flex;gap:10px;margin-top:10px;}
.rowbtns .bigbtn{margin-top:0;}

/* плавающая кнопка: учитываем паддинги, чтобы не вылазила */
.fab{position:absolute;left:16px;right:16px;bottom:calc(78px + var(--safe-bot));width:auto;}

/* таббар: в fullscreen добавляем снизу запас под системную полосу (--safe-bot), иконки остаются в верхних 64px */
.tabbar{position:absolute;bottom:0;left:0;right:0;height:calc(64px + var(--safe-bot));padding-bottom:var(--safe-bot);background:var(--card);border-top:1px solid var(--sep);display:flex;align-items:flex-start;padding-top:8px;}
.tab{flex:1;text-align:center;color:var(--text2);font-size:11px;cursor:pointer;}
.tab .ic{font-size:24px;display:block;line-height:1.1;}
.tab.active{color:var(--accent);}

.ex{background:var(--card);border-radius:var(--radius);padding:14px 16px;margin-bottom:8px;cursor:pointer;}
.ex:active{background:var(--slot-active);}
.ex .exname{font-size:17px;font-weight:600;}
.ex .exdet{font-size:15px;color:var(--text2);margin-top:3px;}
.ex .more{color:var(--link);font-size:14px;}
/* инлайн-редактор упражнения прямо в карточке (персоналка) — без курсора-указателя */
.ex.inline{cursor:default;}
.ex.inline:active{background:var(--card);}
.ex .exhead{display:flex;align-items:baseline;gap:8px;margin-bottom:8px;}
.ex .exsub{font-size:13px;color:var(--text2);}
.ex .exdel{margin-left:auto;font-size:22px;font-weight:600;line-height:1;color:var(--danger);cursor:pointer;padding:0 2px;}
.ex .exdel:active{opacity:.6;}
/* сноска «прошлый раз» — что клиент реально делал по упражнению в предыдущий раз (мелкая, серая, некликабельная) */
.prevperf{font-size:12px;color:var(--text2);line-height:1.35;margin:0 0 9px;}
.exset{display:flex;align-items:center;gap:8px;padding:6px 0;}
.exset .setlab{font-size:14px;color:var(--text2);min-width:78px;}
.exset .setin{display:flex;align-items:center;gap:5px;flex:1;color:var(--text2);font-size:14px;}
.exset .setin input{width:60px;background:var(--search-bg);border:none;border-radius:8px;padding:8px 7px;font-size:16px;text-align:center;color:var(--text);}
.exset .setin .set-r,.exset .setin .td-sets{width:52px;}
.exset .setdel{color:var(--danger);font-size:17px;font-weight:600;padding:4px 6px;cursor:pointer;margin-left:auto;}
.exset .setdel:active{opacity:.6;}
/* крестик подхода на странице детализации сплита (там .setdel вне .exset) */
.setdel{color:var(--danger);font-weight:600;cursor:pointer;}
.setdel:active{opacity:.6;}
/* выполненная клиентом онлайн-тренировка (frozen): поля read-only И не кликабельны (нельзя даже сфокусировать) */
.ex.inline.frozen input,.ex.inline.frozen textarea{pointer-events:none;}
/* «!» у подхода — клиент отошёл от плана (иной вес/повторы) */
.devmark{color:var(--danger);font-weight:800;margin-left:2px;}
/* ── Перемещение упражнений (drag-on-place): зажал карточку → тащишь пальцем вверх/вниз ── */
/* при зажатии карточка не выделяет текст / не вызывает системное меню iOS */
.ex .exname,.splitcol .ex .exname{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;}
/* во время перетаскивания — блокируем выделение текста по всей странице */
body.dragging-active,body.dragging-active *{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;}
/* перетаскиваемая карточка «примагничена» к пальцу: приподнята, следует за пальцем (top задаётся из JS) */
.ex.dragging{position:fixed;z-index:130;box-sizing:border-box;margin:0;pointer-events:none;
  transform:scale(1.03);opacity:.97;box-shadow:0 10px 26px rgba(0,0,0,.30);transition:none;}
/* «дырка» на месте карточки — куда она встанет при отпускании */
.drag-ph{border:2px dashed var(--link);border-radius:var(--radius);margin-bottom:8px;box-sizing:border-box;
  background:var(--slot-active);}
/* inline-block — кликабельная зона по самой надписи, а не на всю ширину строки */
.addset{display:inline-block;color:var(--link);font-size:15px;font-weight:600;padding:8px 0 2px;cursor:pointer;}
.addset:active{opacity:.6;}
/* заметка по упражнению (одноразовая): пусто = нейтральный фон, есть текст = оранжевый (как .has-note памятки) */
.exnote{width:100%;box-sizing:border-box;min-height:38px;background:var(--search-bg);color:var(--text);border:none;border-radius:10px;padding:8px 10px;font:inherit;font-size:15px;resize:none;overflow:hidden;}
.exnote::placeholder{color:var(--text2);opacity:.6;}
.exnote.has-note{background:var(--warn-bg);color:var(--warn-text);}
.exnote.has-note::placeholder{color:var(--warn-text);opacity:.5;}
/* кнопка-строка «Каталог упражнений ▾/▴» */
.catbtn{text-align:center;padding:13px;margin:2px 0 12px;background:var(--card);border-radius:var(--radius);color:var(--link);font-size:16px;font-weight:600;cursor:pointer;}
.catbtn:active{opacity:.6;}
/* ссылка «Удалить упражнение» в пикере «моего» */
.del-custom{text-align:center;margin-top:8px;color:var(--danger);font-size:13px;cursor:pointer;}
.del-custom:active{opacity:.6;}
.pasttrain{display:flex;gap:8px;flex-wrap:wrap;margin:4px 0 16px;}
.chip{background:var(--card);border:1px solid var(--sep);border-radius:20px;padding:7px 14px;font-size:14px;cursor:pointer;display:flex;align-items:center;gap:6px;}
.chip .ok{color:var(--accent2);}

.note{background:var(--warn-bg);color:var(--warn-text);border-radius:var(--radius);padding:12px 14px;font-size:14px;margin-bottom:16px;display:flex;gap:8px;}
/* заметка-памятка клиента: пустая — обычная; заполненная — жёлтая (знак внимания, травмы/ограничения) */
#cl-note{transition:background .15s ease,color .15s ease;}
#cl-note.has-note{background:var(--warn-bg);color:var(--warn-text);}
#cl-note::placeholder{color:var(--text2);opacity:.45;font-style:italic;}
/* поля-заметки (массаж, памятка клиента): фон/текст по теме Telegram, как у полей ввода — иначе дефолтный белый фон textarea не подстраивается под тёмную тему */
.note-ta{background:var(--search-bg);color:var(--text);border:none;}
.note-ta::placeholder{color:var(--text2);opacity:.55;}
/* заметка к тренировке: маркер «заметка» сигнальным оранжевым ТОЛЬКО в расписании/истории.
   Само поле — внутри блока .field (Клиент/День/Время), обычный нейтральный вид (без оранжевого). */
.notetag{color:var(--warn-text);font-weight:600;}
.field .addnote-row{color:var(--link);font-weight:600;justify-content:flex-start;}
.field .delnote-row{color:var(--danger);font-size:14px;justify-content:flex-start;padding-top:6px;}
/* кликабельна только сама фраза кнопки заметки, а не вся строка-frow вокруг неё */
.field .addnote-row span,.field .delnote-row span{cursor:pointer;display:inline-block;}
.field .notefield{border-bottom:none;padding-bottom:4px;}
.field .notefield textarea::placeholder{color:var(--text2);opacity:.5;font-style:italic;}
/* заметка к тренировке с текстом → оранжевая (как поле заметки по упражнению и памятка клиента) */
#slot-note.has-note{background:var(--warn-bg);color:var(--warn-text);border-radius:10px;padding:8px 10px;}
#slot-note.has-note::placeholder{color:var(--warn-text);opacity:.5;}

/* ===== Прогресс клиента ===== */
.ctabs{display:flex;gap:6px;background:var(--card);border-radius:12px;padding:4px;margin-bottom:14px;}
.ctab{flex:1;text-align:center;padding:8px;border-radius:9px;font-size:15px;font-weight:600;color:var(--text2);cursor:pointer;}
.ctab.on{background:var(--accent);color:var(--on-accent);}
/* карточка общего силового прогресса (над поиском) */
.prog-overall{background:var(--card);border-radius:var(--radius);padding:16px;margin-bottom:14px;text-align:center;}
.po-title{font-size:12px;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;}
.po-val{font-size:34px;font-weight:700;line-height:1.15;margin-top:4px;}
.prog-overall.pos .po-val{color:var(--accent2);} .prog-overall.neg .po-val{color:var(--danger);} .prog-overall.flat .po-val{color:var(--text);}
.po-sub{font-size:13px;color:var(--text2);margin-top:2px;}
/* замеры — инлайн-строки прямо во вкладке */
.ar-n{color:var(--text2);font-weight:700;margin-left:2px;}   /* нейтральная стрелка (для замеров «лучше» зависит от цели) */
.mrow2{display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--card);padding:11px 14px;border-bottom:1px solid var(--sep);}
.group .mrow2:last-child{border-bottom:none;}
.mname2{cursor:pointer;min-width:0;flex:1;overflow:hidden;}
.mnm{display:block;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.mname2 .msub{display:block;font-size:12px;color:var(--text2);margin-top:1px;}
.mctl{display:flex;align-items:center;gap:6px;white-space:nowrap;}
.munit{color:var(--text2);font-size:14px;}
.minput{width:80px;background:var(--search-bg);border:none;border-radius:8px;padding:9px 11px;font-size:16px;text-align:center;color:var(--text);}
.minput.name{flex:1;text-align:left;width:auto;}
.addrow{text-align:center;padding:13px;margin:8px 0;color:var(--link);font-size:16px;font-weight:600;}
.addrow span{cursor:pointer;}   /* кликается ТОЛЬКО текст «+ Свой замер», не вся область вокруг */
.delx{color:var(--danger);margin-left:8px;cursor:pointer;font-weight:700;}
.mfrozen{font-size:16px;color:var(--text);}        /* зафиксированное последнее значение замера */
.mrow2.done{cursor:pointer;}                       /* строка с историей — кликабельна в деталь */
.mname2.nolink{cursor:default;}                    /* без истории — название не кликабельно */
.mchev{color:var(--link);font-size:22px;font-weight:600;margin-left:2px;}
.progrow{background:var(--card);border-radius:var(--radius);padding:12px 14px;margin-bottom:8px;cursor:pointer;}
.prog-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;}
.prog-name{font-size:15px;font-weight:600;}
.prog-pct{font-size:15px;font-weight:700;}
.prog-pct.pos{color:var(--accent2);} .prog-pct.neg{color:var(--danger);} .prog-pct.flat{color:var(--text2);}
.prog-blocks{display:flex;align-items:stretch;gap:8px;}
.prog-blk{flex:1;background:var(--bg);border-radius:10px;padding:8px 10px;min-width:0;}
.prog-blk .bn{font-size:12px;color:var(--text2);margin-bottom:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.prog-blk .bv{font-size:16px;font-weight:600;}
.prog-blk.new .bv{color:var(--text);}   /* нейтральный по умолчанию (разделитель «×», старая цифра) */
.dv.pos{color:var(--accent2);} .dv.neg{color:var(--danger);} .dv.flat{color:var(--text);}   /* цифра в цвете своей стрелки */
.prog-arrow{align-self:center;color:var(--text2);font-size:18px;}
.progrow.single{cursor:default;}
.prog-hint{flex:1;align-self:center;font-size:12px;color:var(--text2);line-height:1.3;}
.ar{font-size:.78em;margin-left:1px;}
.ar.up{color:var(--accent2);font-weight:700;} .ar.down{color:var(--danger);font-weight:700;}
.gtabs{display:flex;gap:6px;margin:4px 0 10px;overflow-x:auto;}
.gtab{padding:6px 12px;border-radius:16px;background:var(--card);color:var(--text2);font-size:14px;font-weight:600;cursor:pointer;white-space:nowrap;}
.gtab.on{background:var(--accent);color:var(--on-accent);}
.prog-unit{font-size:12px;color:var(--text2);font-weight:600;margin:0 0 6px 4px;}
.pgraph{width:100%;height:auto;background:var(--card);border-radius:var(--radius);margin-bottom:12px;}
.prog-record{background:var(--warn-bg);color:var(--warn-text);border-radius:var(--radius);padding:10px 14px;font-size:14px;font-weight:600;margin-bottom:12px;}
.phist-row{display:flex;justify-content:space-between;gap:10px;padding:10px 14px;border-bottom:1px solid var(--sep);font-size:14px;}
.phist-row .pd{color:var(--text2);white-space:nowrap;}
.phist-row .ps{text-align:right;}

.search{width:100%;background:var(--search-bg);border:none;border-radius:10px;padding:11px 14px;font-size:16px;margin-bottom:14px;color:var(--text);caret-color:var(--accent);}
/* акцентный поиск упражнений — крупнее, с рамкой акцента (печатать быстрее, чем листать) */
.search.big{padding:14px 16px;font-size:17px;border:1.5px solid var(--accent);border-radius:13px;margin-bottom:16px;}
.search.big:focus{outline:none;box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);}
/* иконка-подсказка типа упражнения справа в списке */
.item .extype{font-size:15px;margin-right:4px;opacity:.85;}
/* кнопка «Развернуть» под свёрнутым списком каталога (3 → все) */
.expandbtn{text-align:center;padding:11px;margin:6px 0 14px;color:var(--link);font-size:15px;font-weight:600;cursor:pointer;}
.expandbtn:active{opacity:.6;}
/* поля ручного ввода в пикере */
#picker-manual{padding:8px 4px 2px;}
.mrow{display:flex;align-items:center;justify-content:space-between;padding:9px 6px;border-bottom:1px solid var(--line);}
.mrow:last-child{border-bottom:none;}
.mlab{color:var(--text2);font-size:15px;}
.mfield{display:flex;align-items:center;gap:6px;color:var(--text2);font-size:15px;}
.mfield input{width:84px;background:var(--search-bg);border:none;border-radius:9px;padding:9px 11px;font-size:17px;text-align:center;color:var(--text);}
/* число-подсказка на фоне — очень бледное, сразу видно что это placeholder, а не введённое значение */
.mfield input::placeholder{color:var(--text2);opacity:.35;}
.muscles{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-bottom:16px;}
.muscle{background:var(--card);border-radius:12px;padding:14px 6px;text-align:center;font-size:14px;font-weight:500;cursor:pointer;}
.muscle.sel{background:var(--accent);color:var(--on-accent);}
.subbar{display:flex;gap:8px;overflow-x:auto;padding-bottom:12px;margin-bottom:6px;-webkit-overflow-scrolling:touch;}
.subbar::-webkit-scrollbar{display:none;}
.subchip{flex:0 0 auto;background:var(--card);border:1px solid var(--sep);border-radius:18px;padding:7px 14px;font-size:14px;cursor:pointer;white-space:nowrap;}
.subchip.on{background:var(--accent-soft);border-color:var(--accent);color:var(--accent);font-weight:600;}

/* формы ввода */
.field{background:var(--card);border-radius:var(--radius);margin-bottom:14px;overflow:hidden;}
.field .frow{display:flex;align-items:center;justify-content:space-between;padding:13px 16px;border-bottom:1px solid var(--sep);}
.field .frow:last-child{border-bottom:none;}
.field .flab{font-size:16px;color:var(--text2);flex:0 0 120px;}
.field input,.field select,.field textarea{border:none;outline:none;font-size:16px;text-align:right;flex:1;background:none;font-family:inherit;color:var(--text);}
.field select{color-scheme:light dark;}
.field select option{background:var(--card);color:var(--text);}
.field textarea{text-align:left;resize:none;min-height:48px;}
.pval{font-size:16px;color:var(--link);cursor:pointer;}
.seg{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end;}
.seg.wrap{justify-content:flex-start;width:100%;}
.seg .opt{padding:8px 14px;border-radius:9px;background:var(--search-bg);font-size:14px;cursor:pointer;white-space:nowrap;}
.seg .opt.on{background:var(--accent);color:var(--on-accent);}

/* скролл-пикер */
.picker-wrap{position:absolute;inset:0;background:rgba(0,0,0,.35);display:none;align-items:flex-end;z-index:30;}
.picker-wrap.show{display:flex;}
.picker{background:var(--bg);width:100%;border-radius:18px 18px 0 0;padding:10px 16px calc(26px + var(--safe-bot));animation:up .25s ease;}
@keyframes up{from{transform:translateY(100%);}to{transform:translateY(0);}}
.picker .ph{display:flex;justify-content:space-between;align-items:center;padding:8px 0 14px;}
.picker .ph .ttl{font-size:17px;font-weight:600;}
.picker .ph button{background:none;border:none;color:var(--link);font-size:17px;font-weight:600;cursor:pointer;}
.pickrow{display:flex;gap:10px;align-items:center;}
.pickcol{flex:1;text-align:center;}
.pickcol .lab{font-size:12px;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px;}
.roll{height:132px;overflow-y:scroll;scroll-snap-type:y mandatory;background:var(--card);border-radius:12px;position:relative;}
.roll::-webkit-scrollbar{display:none;}
.roll .opt{height:44px;line-height:44px;text-align:center;font-size:20px;scroll-snap-align:center;color:var(--text2);}
.roll .opt.cur{color:var(--text);font-weight:600;}
.selband{position:absolute;top:44px;left:0;right:0;height:44px;border-top:1px solid var(--sep);border-bottom:1px solid var(--sep);pointer-events:none;}
/* высокий список (клиент/программа): 7 строк видно, полоса выбора по центру (4-я строка, top=3*44) */
.roll.tall{height:308px;}
.roll.tall .selband{top:132px;}

/* ===== Сплит-журнал: две колонки рядом ===== */
.splitgrid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px;}
.splitcol{background:var(--card);border-radius:12px;padding:8px;min-width:0;}
.splithead{font-size:15px;font-weight:600;color:var(--link);padding:4px 2px 8px;border-bottom:1px solid var(--sep);margin-bottom:8px;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.splitcol .ex{padding:6px 2px;border-bottom:1px solid var(--sep);}
.splitcol .ex:last-of-type{border-bottom:none;}
/* оранжевая обводка карточки упражнения в колонке сплита/мини — у упражнения есть заметка */
.splitcol .ex.hasnote{border:1.5px solid var(--warn-text);border-radius:9px;padding:6px 8px;}
.splitcol .exname{font-size:14px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.splitcol .exdet{font-size:12px;color:var(--text2);}
/* шапка колонки участника: имя (растягивается) · рычажок оплаты · крестик — в один ряд */
.splithead{display:flex;align-items:center;gap:6px;white-space:normal;overflow:visible;}
.splithead .shname{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;}
.splithead .splitrm{flex:0 0 auto;color:var(--danger);font-size:18px;line-height:1;font-weight:600;cursor:pointer;}
.splithead .splitrm:active{opacity:.6;}
/* маленький рычажок оплаты участника (без подписи) */
.paidtoggle.mini{margin:0;padding:0;gap:0;flex:0 0 auto;}
.paidtoggle.mini .toggle{width:34px;height:20px;transform:none;box-shadow:none;background:#c7c7cc;}
.paidtoggle.mini .toggle.on{background:var(--accent);}
.paidtoggle.mini .toggle-knob{width:15px;height:15px;top:2.5px;left:3px;}
.paidtoggle.mini .toggle.on .toggle-knob{left:16px;}
.bigbtn.splitadd{font-size:13px;padding:8px 6px;margin-top:6px;}
.splitpastlabel{font-size:11px;color:var(--text2);text-transform:uppercase;letter-spacing:.4px;margin:10px 0 6px;}
.chip.mini{font-size:12px;padding:5px 8px;margin-bottom:4px;display:block;}
.manual{display:flex;align-items:center;justify-content:center;gap:6px;margin-top:12px;color:var(--link);font-size:14px;cursor:pointer;}
/* кнопка-чекбокс «Добавить обоим» в пикере сплита — крупная и заметная */
.bothbox{align-items:center;gap:10px;margin:14px 2px 2px;padding:14px 16px;font-size:16px;font-weight:600;color:var(--accent);background:var(--accent-soft);border:1.5px solid var(--accent);border-radius:13px;cursor:default;}
.bothbox input{width:22px;height:22px;flex:0 0 auto;accent-color:var(--accent);cursor:pointer;}
.bothbox input:active{opacity:.7;}

.kv{display:flex;justify-content:space-between;padding:13px 16px;border-bottom:1px solid var(--sep);font-size:16px;}
.kv:last-child{border-bottom:none;}
.kv .k{color:var(--text2);}
.write{color:var(--link);font-size:16px;background:none;border:none;cursor:pointer;font-weight:500;}
/* блок аватарки — относительный, чтобы приклеить ссылку «Сформировать PDF» к правому краю на уровне аватарки */
.clienthead{position:relative;}
.pdflink{position:absolute;top:6px;right:0;color:var(--link);font-weight:600;font-size:14px;cursor:pointer;text-align:center;line-height:1.15;}
.pdflink:active{opacity:.6;}
.avatar{width:64px;height:64px;border-radius:50%;background:linear-gradient(135deg,#a1c4fd,#c2e9fb);display:flex;align-items:center;justify-content:center;font-size:26px;font-weight:600;color:#fff;margin:0 auto 10px;}
.cname-big{text-align:center;font-size:22px;font-weight:700;margin-bottom:2px;overflow-wrap:anywhere;}
.ccount{text-align:center;color:var(--text2);font-size:14px;margin-bottom:4px;}
/* шапка профиля: всего проведённых тренировок */
.ctrained{text-align:center;color:var(--text2);font-size:14px;margin-bottom:18px;}
.ctrained b{color:var(--text);font-weight:700;}
/* номер тренировки в истории (список профиля) — бейдж слева */
.item .histnum{flex:0 0 auto;min-width:34px;text-align:center;font-size:13px;font-weight:700;color:var(--accent);background:var(--accent-soft);border-radius:10px;padding:4px 7px;margin-right:10px;}
.item .ileft{flex:1;}
/* номер тренировки в чипах «Прошлые»: персоналка — жирный голубой; сплит/мини-группа — бледный как дата */
.chip .seqn{font-weight:700;color:var(--accent);font-size:13px;}
.chip.mini .seqn{font-size:11px;font-weight:400;color:var(--text2);}

/* ===== Пакеты тренировок (абонементы) ===== */
/* карточка активного пакета в профиле */
.pkgcard{display:block;padding:14px;}
.pkgtop{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:8px;}
.pkgcount{font-size:17px;font-weight:600;}
.pkgrem{font-size:14px;color:var(--text2);}
.pkgbar{height:8px;border-radius:5px;background:var(--search-bg);overflow:hidden;margin-bottom:12px;}
.pkgbar-fill{height:100%;background:var(--accent);border-radius:5px;}
.pkgbtns{display:flex;gap:18px;}
.pkgbtn{color:var(--link);font-size:15px;font-weight:500;cursor:pointer;padding:6px 2px;}
.pkgbtn.danger{color:var(--danger);}
/* история — два столбца (тренировки | пакеты) */
.histcols{display:flex;gap:10px;}
.histcol{flex:1;min-width:0;}
.hitem{display:flex;align-items:center;padding:10px 12px;border-bottom:1px solid var(--sep);cursor:pointer;gap:8px;}
.hitem:last-child{border-bottom:none;}
.hitem .ileft{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1;}
.hitem .ititle{font-size:15px;line-height:1.25;overflow-wrap:anywhere;}
.hitem .isub{font-size:13px;color:var(--text2);}
.hitem .histnum{flex:0 0 auto;min-width:24px;text-align:center;font-size:12px;font-weight:700;color:var(--accent);background:var(--accent-soft);border-radius:8px;padding:3px 5px;}
.histmore{text-align:center;color:var(--link);font-size:13px;font-weight:500;padding:4px 12px 2px;margin-top:-2px;cursor:pointer;}
/* список «зачесть прошлые» — чекбоксы */
.pkgpick{display:flex;align-items:center;gap:10px;padding:11px 14px;border-bottom:1px solid var(--sep);}
.pkgpick:last-child{border-bottom:none;}
.chk{width:22px;height:22px;border-radius:6px;border:2px solid var(--sep);display:flex;align-items:center;justify-content:center;color:var(--on-accent);font-size:14px;flex:0 0 auto;}
.chk.on{background:var(--accent);border-color:var(--accent);}
/* сводка «Активные пакеты» (вкладка Клиенты) — горизонтальный свайп */
.pkgsum-lab{font-size:13px;font-weight:600;color:var(--text2);text-transform:uppercase;letter-spacing:.3px;margin:10px 2px 6px;}
.pkgsum{display:flex;gap:8px;overflow-x:auto;padding-bottom:6px;margin-bottom:6px;scrollbar-width:none;-webkit-overflow-scrolling:touch;}
.pkgsum::-webkit-scrollbar{display:none;}
.pkgchip{flex:0 0 auto;background:var(--card);border:1px solid var(--sep);border-radius:18px;padding:7px 13px;font-size:14px;cursor:pointer;white-space:nowrap;}
.pkgchip b{color:var(--accent);}
.pkgchip.warn b{color:#eab308;}               /* осталась 1 — жёлтая надпись (ярче), рамка обычная */
body.dark .pkgchip.warn b{color:#facc15;}     /* на тёмной теме — ярче жёлтый */
.pkgchip.low{border-color:var(--danger);color:var(--danger);}   /* осталось 0 — красный весь чип */
.pkgchip.low b{color:var(--danger);}
/* компактный чип прогресса онлайн-программы рядом с 🌐 в списке клиентов (цвета как у свайп-чипов) */
.onprog{display:inline-block;font-size:12px;font-weight:600;border-radius:10px;padding:1px 8px;margin-left:6px;background:var(--search-bg);color:var(--accent);vertical-align:middle;white-space:nowrap;}
.onprog.warn{color:#eab308;} body.dark .onprog.warn{color:#facc15;}
.onprog.low{color:var(--danger);}
/* тумблер (вкл/выкл) в настройках уведомлений */
.toggle{width:46px;height:28px;border-radius:14px;background:var(--search-bg);position:relative;display:inline-block;flex:0 0 auto;cursor:pointer;transition:background .15s;}
.toggle.on{background:var(--accent);}
.toggle-knob{position:absolute;top:3px;left:3px;width:22px;height:22px;border-radius:50%;background:#fff;transition:left .15s;box-shadow:0 1px 3px rgba(0,0,0,.3);}
.toggle.on .toggle-knob{left:21px;}
/* iOS-стиль промпт «включить уведомления?» (по центру) */
.np-title{font-size:18px;font-weight:700;text-align:center;margin-bottom:10px;}
.np-desc{font-size:14px;color:var(--text2);line-height:1.45;text-align:center;margin-bottom:18px;}
.np-btns{display:flex;gap:10px;}
.np-no{flex:1;padding:12px;border-radius:12px;border:none;background:var(--search-bg);color:var(--text);font-size:16px;font-weight:500;cursor:pointer;font-family:inherit;}
.np-yes{flex:1;padding:12px;border-radius:12px;border:none;background:var(--accent);color:var(--on-accent);font-size:16px;font-weight:600;cursor:pointer;font-family:inherit;}

.toast{position:absolute;bottom:90px;left:50%;transform:translateX(-50%);background:rgba(0,0,0,.82);color:#fff;padding:11px 18px;border-radius:22px;font-size:14px;opacity:0;transition:.3s;pointer-events:none;white-space:nowrap;z-index:40;}
.toast.show{opacity:1;}

/* G1: своё окно подтверждения (вместо showConfirm, не работающего в Telegram 6.0) */
.cmodal-wrap{position:absolute;inset:0;background:rgba(0,0,0,.4);display:none;align-items:center;justify-content:center;z-index:50;padding:24px;}
.cmodal-wrap.show{display:flex;}
.cmodal{background:var(--card);border-radius:16px;padding:20px 18px 14px;max-width:300px;width:100%;box-shadow:0 8px 30px rgba(0,0,0,.25);}
.cmodal .cmsg{font-size:16px;color:var(--text);text-align:center;margin-bottom:16px;line-height:1.35;}
.cmodal .cbtns{display:flex;gap:10px;}
.cmodal .cbtns button{flex:1;padding:12px;border:none;border-radius:11px;font-size:16px;font-weight:600;cursor:pointer;}
.cmodal .cno{background:var(--search-bg);color:var(--text);}
.cmodal .cyes{background:var(--danger);color:#fff;}
.cmodal .cbtns button:active{opacity:.7;}
/* модалка завершения блока: шапка (вопрос+тумблер) и кнопки закреплены, список скроллится */
.cmodal.pkgfin{max-width:340px;display:flex;flex-direction:column;max-height:80vh;padding:18px 16px 14px;}
.pkgfin .pkgfin-head{flex:0 0 auto;}
.pkgfin .pkgfin-head .cmsg{margin-bottom:12px;}
.pkgfin-tog{display:flex;align-items:center;gap:9px;width:max-content;margin:0 auto 14px;padding:9px 16px;border-radius:12px;background:var(--search-bg);cursor:pointer;}
.pkgfin-tog .pft-label{font-size:15px;font-weight:600;color:var(--text2);}
.pkgfin-tog.on .pft-label{color:var(--accent2);}
.pkgfin-list{flex:1 1 auto;min-height:0;overflow-y:auto;margin-bottom:14px;}
.pkgfin-row{display:flex;align-items:center;gap:8px;padding:9px 2px;border-bottom:1px solid var(--sep);}
.pkgfin-row:last-child{border-bottom:none;}
.pkgfin-row .pfr-title{flex:1;font-size:14px;color:var(--text);}
.pkgfin-row .pfr-sub{font-size:12px;color:var(--text2);white-space:nowrap;}
.cmodal.pkgfin .cbtns{flex:0 0 auto;}
.cmodal.pkgfin .cyes{background:var(--accent);}

/* ===== Полный экран без муляж-рамки: и Telegram Mini App (.tg), и обычный браузер/PWA (.web) ===== */
body.tg,body.web{background:var(--bg);}
body.tg .phone,body.web .phone{width:100%;height:100vh;max-height:100vh;border-radius:0;border:none;box-shadow:none;}
body.tg .statusbar,body.web .statusbar{display:none;}


/* ===== Профиль тренера (3-я вкладка) ===== */
.profhead{display:flex;flex-direction:column;align-items:center;gap:3px;padding:12px 0 16px;}
.profava{width:72px;height:72px;border-radius:50%;background:var(--accent);color:var(--on-accent);display:flex;align-items:center;justify-content:center;font-size:30px;font-weight:600;margin-bottom:4px;}
.profname{font-size:20px;font-weight:700;color:var(--text);text-align:center;}
.profuser{font-size:14px;color:var(--text2);}
.statcard .frow:last-child{border-bottom:none;}
.statrow .slabel{color:var(--text);}
.statrow .sval{font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;}
.profmonthbar{padding-top:2px;}
.profmonthbar .wk.curmonth{color:var(--accent);font-weight:600;}
.profmonthbar .arrow.disabled{opacity:.22;pointer-events:none;}
.statmini{background:var(--card);border-radius:var(--radius);margin-bottom:14px;padding:8px 16px;}
.statmini .mrow{display:flex;justify-content:space-between;align-items:center;padding:4px 0;border:none;}
.statmini .mlabel{color:var(--text2);font-size:14px;}
.statmini .mval{color:var(--text);font-size:14px;font-weight:400;font-variant-numeric:tabular-nums;}
.statcard .statrow.profrow{cursor:pointer;}
.statcard .rval{display:flex;align-items:center;gap:5px;}
.statcard .sval.green{color:var(--accent2);font-weight:700;}
.histrow{cursor:pointer;}
.histtext{display:flex;flex-direction:column;gap:2px;min-width:0;}
.histname{color:var(--text);font-size:15px;font-weight:500;}
.histsub{color:var(--text2);font-size:13px;}
.histsub.attn{color:var(--warn-text);}
.attnlist{display:flex;flex-direction:column;gap:10px;margin-bottom:14px;}
.attncard{background:var(--card);border:1.5px solid var(--accent);border-radius:16px;padding:12px 16px;cursor:pointer;display:flex;flex-direction:column;gap:3px;}
/* оплата тренировки */
.paidchip{display:inline-block;font-size:11px;line-height:1.5;padding:0 7px;border-radius:8px;border:1px solid var(--text2);color:var(--text2);white-space:nowrap;vertical-align:middle;}
.paidchip.on{border-color:var(--accent2);color:var(--accent2);}
.slot .paidchip{align-self:flex-start;margin-top:1px;}
.paidtoggle{display:inline-flex;align-items:center;gap:8px;padding:7px 13px;border-radius:12px;background:var(--card);cursor:pointer;margin-bottom:12px;}
.paidtoggle .ptlabel{font-size:14px;color:var(--text2);}
.paidtoggle.on .ptlabel{color:var(--accent2);font-weight:600;}
.statmini .mrow.mrow-click{cursor:pointer;}
.statmini .mrow.mrow-click .mval{color:var(--accent);}
.titlepaid{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.titlepaid .tpname{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.paidtoggle{background:none;padding:0;margin:0;gap:5px;flex:none;}
.paidtoggle .toggle{transform:scale(0.8);}
.paidtoggle .ptlabel{font-size:13px;}
.paidtoggle .toggle{box-shadow:inset 0 0 0 1.5px var(--text2);}
.paidtoggle .toggle.on{box-shadow:none;}
.paidtoggle .toggle{box-shadow:none;background:#c7c7cc;}
.paidtoggle .toggle.on{background:var(--accent);}
.histsub.attn-red{color:var(--danger);}
.histrow{gap:8px;}
.histrow .histtext{flex:1;}
.paidtoggle.ptlist .ptlabel{font-size:12px;}
.slot .paidchip{margin-right:10px;}
.paidsum{display:inline-flex;gap:9px;font-size:12px;font-weight:600;margin-right:9px;white-space:nowrap;}
.paidsum .psum-g{color:var(--accent2);}
.paidsum .psum-r{color:var(--danger);}
.bigleft{display:flex;flex-direction:column;gap:3px;min-width:0;}

/* ===== Скелетон-заглушки вкладок (каркас рисуется мгновенно на тапе) + мягкое появление контента ===== */
.skelwrap{padding:6px 0;}
.skel-block{height:60px;margin:12px 4px;border-radius:14px;background:var(--card);animation:skelPulse 1.15s ease-in-out infinite;}
@keyframes skelPulse{0%,100%{opacity:.38}50%{opacity:.72}}
/* появление только на .fx-reveal (навесили на контент, заменивший скелетон при промахе) —
   свайпы недель (.slide-*) и инлайн-перерисовки НЕ трогаем */
.content.fx-reveal{animation:fxReveal .17s ease-out;}
@keyframes fxReveal{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.content.fx-reveal{animation:none}.skel-block{animation:none}}

/* ===== Подписка: шапка режима просмотра + модалка «нет подписки» ===== */
/* шапка «нет подписки» — ФИКСИРОВАННЫЙ оверлей ПОВЕРХ всего приложения (расписания/клиентов/…),
   а не блок в потоке. top=--safe-top → на телефоне (fullscreen) висит под чёлкой+кнопкой Telegram,
   не уезжает за верхнюю границу экрана. z-index ниже модалки (1000), выше контента. */
#sub-banner{position:fixed;left:0;right:0;top:var(--safe-top);z-index:960;display:flex;align-items:center;justify-content:space-between;
  gap:10px;background:var(--warn-bg,#33291a);color:var(--warn-text,#ffab51);padding:10px 14px;
  font-size:13px;font-weight:600;box-shadow:0 2px 10px rgba(0,0,0,.25);}
#sub-banner .subban-btn{flex:none;background:var(--accent);color:var(--on-accent,#fff);border:none;
  border-radius:9px;padding:7px 12px;font-size:13px;font-weight:600;cursor:pointer;}
#sub-modal, #login-modal{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;}
#sub-modal .submodal-back, #login-modal .submodal-back{position:absolute;inset:0;background:rgba(0,0,0,.5);}
#sub-modal .submodal-card, #login-modal .submodal-card{position:relative;background:var(--card,#fff);color:var(--text,#111);
  border-radius:18px;padding:22px 20px;width:min(92vw,340px);box-shadow:0 12px 40px rgba(0,0,0,.3);}
#sub-modal .submodal-title, #login-modal .submodal-title{font-size:18px;font-weight:700;text-align:center;margin-top:8px;}
#sub-modal .submodal-sub, #login-modal .submodal-sub{font-size:13px;color:var(--text2,#888);text-align:center;margin:8px 0 16px;line-height:1.45;}
#sub-modal .submodal-plans{display:flex;flex-direction:column;gap:8px;}
#sub-modal .submodal-plan, #login-modal .submodal-plan{background:var(--accent);color:var(--on-accent,#fff);border:none;border-radius:12px;
  padding:13px;font-size:15px;font-weight:600;cursor:pointer;}
#sub-modal .submodal-close, #login-modal .submodal-close{width:100%;margin-top:12px;background:none;border:none;color:var(--text2,#888);
  font-size:14px;padding:8px;cursor:pointer;}

/* мягкая плашка согласия на обработку ПД при первом заходе (не блокирует, над таббаром) */
#consent-banner{position:fixed;left:10px;right:10px;bottom:calc(74px + var(--safe-bot));z-index:940;
  background:var(--card);border:1px solid var(--sep);border-radius:12px;padding:10px 12px;
  display:flex;align-items:center;gap:10px;font-size:12px;line-height:1.4;color:var(--text2);
  box-shadow:0 4px 16px rgba(0,0,0,.22);}
#consent-banner b{color:var(--link);cursor:pointer;font-weight:600;}
#consent-banner button{flex:none;background:var(--accent);color:var(--on-accent,#fff);border:none;
  border-radius:8px;padding:7px 12px;font-size:12px;font-weight:600;cursor:pointer;}
