/* ============ Theme tokens — дизайн-система Rozetka ============ */
:root {
    /* Нейтралі — з `tokens/colors.css` ДС Rozetka (шкала --global-black-*),
       без власних відтінків: фон сторінки = --surface-subtle, обводки =
       --border-default / --border-strong, текст = --text-body/secondary/muted. */
    --bg: #f5f5f5;             /* --global-black-5 (--surface-subtle) */
    --bg-2: #e9e9e9;           /* --global-black-10 (--border-default) */
    --panel: #ffffff;          /* --surface-card */
    --panel-2: #fafafa;
    --panel-hover: #f5f5f5;    /* --global-black-5 */
    --border: #d2d2d2;         /* --global-black-20 (--border-strong) */
    --border-soft: #e9e9e9;    /* --global-black-10 (--border-default) */
    --text: #221f1f;           /* --global-black (--text-body) */
    --muted: #4d4b4b;          /* --global-black-80 (--text-secondary) */
    --muted-2: #797878;        /* --global-black-60 (--text-muted) */
    --accent: #00a046;         /* фірмовий зелений Rozetka («Купити») */
    --accent-2: #00bc52;       /* зелений hover (--global-green-active з ДС) */
    --accent-ink: #ffffff;
    --accent-glow: color-mix(in srgb, var(--accent) 18%, transparent);
    --link: #3e77aa;           /* сині текстові посилання Rozetka */
    --link-hover: #4096e3;     /* hover посилань і тексту сірих кнопок (ДС) */
    --navy: #3e77aa;           /* secondary-кнопка (не міняється в темній темі) */
    --navy-hover: #4096e3;
    --btn-gray-bg: #f5f5f5;    /* tertiary-кнопка: --global-black-5 */
    --btn-hairline: #ebebeb;   /* inset-обводка tertiary-кнопки */
    --btn-disabled-bg: #e9e9e9;    /* --global-black-10 */
    --btn-disabled-ink: #a6a5a5;   /* --global-black-40 (--text-disabled) */
    --header-bg: #221f1f;      /* темна шапка Rozetka */
    --header-ink: #ffffff;
    --ok: #00a046;             /* --global-green */
    --ok-soft: rgba(0, 160, 70, .10);
    /* Жовтий ДС (--global-yellow #ffa900) тримає контраст лише як тло, не як
       текст, тож попередження: тінт — з жовтого ДС, текст — темніший тон. */
    --warn: #a05a00;
    --warn-soft: rgba(255, 169, 0, .14);
    --error: #f84147;          /* --global-red: помилки й ціна (--price-discount) */
    --error-soft: rgba(248, 65, 71, .10);
    --price-up: #f84147;       /* --price-discount з ДС: ціна завжди червона */
    --commerce: #ff5c00;       /* --global-orange з ДС: комерційний акцент */
    --brand-tint: #e5f5ec;     /* --surface-brand-tint (--global-green-10) з ДС */
    --shadow: 0 1px 5px rgba(0, 0, 0, .08);
    --shadow-lg: 0 6px 20px rgba(0, 0, 0, .15);
    --shadow-card-hover: 0 8px 24px rgba(34, 31, 31, .12);   /* --shadow-card-hover з ДС */
    --shadow-tile-hover: 0 4px 16px rgba(34, 31, 31, .12);   /* --shadow-tile-hover з ДС */
    --radius: 8px;             /* --radius-md з ДС: кнопки, картки, чипи */
    --radius-sm: 4px;          /* --radius-sm з ДС: icon-кнопки */
    --radius-pill: 50px;       /* PromoLabel з ДС: промо-плашки на картках */
    /* Кольори промо-плашок — з палітри ДС напряму, а не з теми: білий текст по
       суцільному кольору мусить читатись однаково у світлій і темній темі
       (тематичні --ok/--error у темній світлішають, і білий на них тоне). */
    --promo-discount: #f84147; /* --global-red: «несумісно» (у ДС — знижка) */
    --promo-top: #ffa900;      /* --global-yellow: «популярний» (у ДС — ТОП ПРОДАЖІВ) */
    --btn-transition: color .2s ease-in-out, background-color .2s ease-in-out, border-color .2s ease-in-out;
    /* Картки ДС: лише тінь/обводка/колір, без зсуву — --transition-fast .15s */
    --card-transition: box-shadow .15s, border-color .15s, background-color .15s, color .15s;
}

* { box-sizing: border-box; }

html, body {
    margin: 0;
    padding: 0;
    font-family: 'Roboto', 'Helvetica Neue', Arial, system-ui, -apple-system, sans-serif;
    background: var(--bg);
    color: var(--text);
    font-size: 15px;
    line-height: 1.45;
    -webkit-font-smoothing: antialiased;
}

a { color: var(--link); text-decoration: none; }
a:hover { text-decoration: underline; }
h1, h2, h3, h4 { margin: 0; font-weight: 700; }

.app-shell {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    background: var(--bg);
}

.container { max-width: 1360px; margin: 0 auto; padding: 0 20px; width: 100%; }

/* ============ Widget bar — темна шапка в стилі Rozetka ============ */
.widget-bar {
    display: flex;
    align-items: center;
    gap: 12px;
    width: 100%;
    padding: 12px 24px;
    background: var(--header-bg);
    color: var(--header-ink);
}
.widget-brand { display: flex; align-items: center; gap: 10px; font-weight: 700; letter-spacing: .3px; font-size: 17px; color: var(--header-ink); }
.widget-brand .logo__mark { width: 32px; height: 32px; border-radius: 8px; font-size: 16px; }
.widget-bar__spacer { flex: 1; }
/* Хлібні крихти в шапці: дім → назва збірки → «Поділитися». Назва — не посилання,
   тож вона єдина без hover-стану; розділювач — звичайний слеш, як у навігації ДС. */
.crumbs { display: flex; align-items: center; gap: 8px; min-width: 0; }
.crumbs__sep { color: rgba(255, 255, 255, .4); font-size: 13px; user-select: none; }
.crumbs__here {
    font-size: 13.5px; font-weight: 600; color: #fff;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 34ch;
}
.crumbs__home, .crumbs__link {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 5px 8px; border: 0; border-radius: 8px; background: transparent; cursor: pointer;
    font-size: 13.5px; font-weight: 500; color: rgba(255, 255, 255, .8);
    transition: var(--btn-transition);
}
.crumbs__home:hover, .crumbs__link:hover { color: #fff; background: rgba(255, 255, 255, .12); }
.crumbs__home svg, .crumbs__link svg { width: 17px; height: 17px; }

/* onDark-варіант IconButton на темній шапці */
.widget-bar .icon-btn { color: rgba(255, 255, 255, .85); }
.widget-bar .icon-btn:hover { color: #fff; background: rgba(255, 255, 255, .12); }
.widget-total { display: flex; align-items: baseline; gap: 8px; padding: 8px 16px; border-radius: 8px; border: 1px solid rgba(255, 255, 255, .3); background: rgba(255, 255, 255, .06); white-space: nowrap; }
.widget-total span { font-size: 11px; text-transform: uppercase; letter-spacing: 1px; color: rgba(255, 255, 255, .65); }
.widget-total b { color: #fff; font-size: 16px; }

/* ============ Header ============ */
.site-header {
    position: sticky;
    top: 0;
    z-index: 40;
    background: color-mix(in srgb, var(--bg) 82%, transparent);
    backdrop-filter: blur(14px);
    border-bottom: 1px solid var(--border-soft);
}
.site-header__row { display: flex; align-items: center; gap: 22px; height: 68px; }
.logo { display: flex; align-items: center; gap: 11px; font-weight: 800; font-size: 20px; letter-spacing: 1px; color: var(--text); flex-shrink: 0; }
.logo__mark {
    width: 40px; height: 40px; border-radius: 8px;
    background: var(--accent);
    color: var(--accent-ink); display: grid; place-items: center; font-size: 20px; font-weight: 900;
}
.logo b { color: var(--accent); }
.main-nav { display: flex; gap: 26px; }
.main-nav a { color: var(--muted); font-weight: 600; font-size: 14px; letter-spacing: .5px; text-transform: uppercase; padding: 4px 0; position: relative; }
.main-nav a.active, .main-nav a:hover { color: var(--text); text-decoration: none; }
.main-nav a.active::after { content: ""; position: absolute; left: 0; right: 0; bottom: -6px; height: 2px; background: var(--accent); }
.header-spacer { flex: 1; }
.header-search { position: relative; width: 280px; }
.header-search input {
    width: 100%; height: 42px; border-radius: 22px; border: 1px solid var(--border);
    background: var(--panel); color: var(--text); padding: 0 16px 0 40px; outline: none; font-size: 14px;
}
.header-search input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }
.header-search .mag { position: absolute; left: 14px; top: 50%; transform: translateY(-50%); color: var(--muted); }
/* IconButton з ДС: 40×40, радіус 4, прозорий фон, hover — плашка */
.icon-btn { width: 40px; height: 40px; border-radius: var(--radius-sm); border: none; background: transparent; color: var(--muted); display: grid; place-items: center; cursor: pointer; font-size: 16px; transition: var(--btn-transition); }
.icon-btn:hover { color: var(--text); background: var(--btn-gray-bg); }
.cart-pill {
    display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 16px; border-radius: var(--radius);
    border: none; background: var(--accent);
    color: #fff; font-weight: 500; cursor: pointer; white-space: nowrap; transition: var(--btn-transition);
}
.cart-pill:hover { background: var(--accent-2); }
.cart-pill .amt { color: #fff; }

/* «Аналіз збірки» у шапці — secondary-кнопка (navy) з ДС */
/* «Аналіз збірки» під шкалою оцінки: повна ширина рейки, тон другорядної дії —
   головна дія екрана лишається «Збірка · сума» в шапці. */
.build-score__more {
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    width: 100%; height: 34px; margin-top: 4px; padding: 0 12px;
    border: 1px solid var(--border); border-radius: var(--radius);
    background: var(--surface); color: var(--text);
    font-size: 13px; font-weight: 500; cursor: pointer; transition: var(--btn-transition);
}
.build-score__more:hover { border-color: var(--accent); color: var(--accent); }
.build-score__more svg { width: 16px; height: 16px; }

/* «Збірка · сума» у шапці конфігуратора — несе підсумок замість окремого блока «Разом» */
.summary-pill {
    display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 16px; border-radius: var(--radius);
    border: none; background: var(--accent); color: var(--accent-ink);
    font-weight: 500; cursor: pointer; white-space: nowrap; font-size: 14px; transition: var(--btn-transition);
}
.summary-pill:hover { background: var(--accent-2); }
.summary-pill .amt { font-weight: 800; }
@media (max-width: 720px) { .summary-pill .lbl { display: none; } }

/* ============ Теги, бейджі, чипи — за дизайн-системою Rozetka ============ */
/*
 * У ДС три примітиви тегів, і кожна плашка на екрані — це один із них:
 *   PromoLabel — промо-пігулка на картці: радіус 50, padding 0 8px, 10px/700,
 *                line-height 20, letter-spacing .3px, білий uppercase по кольору;
 *   Chip       — тег з обводкою: радіус 8, 1px black-20, білий фон, текст
 *                --global-black; зелений hover — лише для клікабельних чипів;
 *   Badge      — лічильник: пігулка 16px (min-width 16 / height 16 / padding 0 4px,
 *                радіус 8), 10px/500 білим; оранж у ДС зарезервований під кошик.
 * Класи нижче — ці ж примітиви під іменами, що вже стоять у розмітці, тому
 * геометрія кожного тега описана тут, а не в блоці свого компонента.
 */

/* --- PromoLabel --- */
.prod-card__badge,
.tier-badge,
.ad-banner__tag {
    display: inline-flex;
    align-items: center;
    padding: 0 8px;
    border-radius: var(--radius-pill);
    font-size: 10px;
    font-weight: 700;
    line-height: 20px;
    letter-spacing: .3px;
    text-transform: uppercase;
    color: #fff;
    white-space: nowrap;
}

/* Стан позиції каталогу. ProductCard у ДС тримає промо в лівому верхньому куті —
   у нас там порожньо, гліф категорії відцентрований. */
.prod-card__badge { position: absolute; top: 12px; left: 12px; z-index: 2; }  /* над мініатюрою фото */
.prod-card__badge.no { background: var(--promo-discount); }

/* Клас збірки в «Аналізі» — та ж пігулка з іконкою, лише більша;
   градієнтів у ДС немає, тож суцільний --global-orange. */
.tier-badge { gap: 8px; padding: 6px 16px; font-size: 12px; background: var(--commerce); }

/* Плашка банера лежить на темній графіці, тож замість суцільного кольору —
   прозора обводка; геометрія та сама. */
.ad-banner__tag { border: 1px solid rgba(255, 255, 255, .45); }

/* --- Chip --- */
.spec-chip,
.hero .kicker,
.landing .kicker {
    display: inline-flex;
    align-items: center;
    border: 1px solid var(--border);        /* --border-strong (black-20) з ДС */
    border-radius: var(--radius);
    background: var(--panel);
    color: var(--muted);
    font-weight: 400;
    line-height: 14px;
}

/* Чип у картці — розмір --text-chip-card (11px) з ДС, padding вполовину від 8px. */
.spec-chip { padding: 4px 8px; font-size: 11px; }


/* Kicker — той самий Chip, але на фірмовому тінті (--surface-brand-tint +
   зелений текст): це не характеристика, а акцентний надзаголовок. */
.hero .kicker,
.landing .kicker {
    gap: 8px; padding: 8px; font-size: 12px;
    text-transform: uppercase; letter-spacing: .3px;
    background: var(--brand-tint); border-color: transparent; color: var(--accent);
}

/* --- Badge --- */
.cart-pill .badge,
.mini-badge {
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    border-radius: 8px;
    font-size: 10px;
    font-weight: 500;
    line-height: 16px;
    text-align: center;
}

/* Лічильник на зеленій кнопці кошика — інверсія: оранж по зеленому не читається. */
.cart-pill .badge { background: #fff; color: var(--accent); }

/* ============ Hero strip ============ */
.hero { padding: 26px 0 10px; }
.hero h1 { font-size: 34px; margin: 14px 0 6px; }
.hero h1 b { color: var(--accent); }
.hero p { color: var(--muted); max-width: 720px; margin: 0; }

/* ============ Builder grid ============ */
.builder-grid { display: grid; grid-template-columns: 268px 1fr; gap: 22px; padding: 18px 0 40px; align-items: start; }

/* ---- Category nav ---- */
.cat-nav { position: sticky; top: 84px; display: flex; flex-direction: column; gap: 8px; }
/* Заголовки секцій рейки («Оцінка збірки», «Що варто виправити», «Комплектуючі»)
   — один рівень, тож і одна типографіка: caps 11/1.4, muted-2. */
.cat-nav__title,
.recommend__caption,
.build-score__label > span:first-child {
    font-size: 11px; letter-spacing: 1.4px; text-transform: uppercase; color: var(--muted-2); font-weight: 600;
}
.cat-nav__title { margin: 4px 4px 6px; }
.cat-list { display: flex; flex-direction: column; gap: 8px; }
.cat-item {
    display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
    padding: 12px 14px; border-radius: 13px; border: 1px solid var(--border-soft);
    background: var(--panel); color: var(--text); cursor: pointer; transition: .15s;
}
.cat-item:hover { border-color: var(--accent); background: var(--panel-hover); }
/* Рінг активної категорії — INSET: у горизонтальній рейці (max-width:1000px)
   .cat-list має overflow-x:auto, через що overflow-y обчислюється в auto і
   контейнер ріже по вертикалі. Зовнішня тінь там обрізалася зверху й лишалася
   знизу — обводка виглядала товстою й змазаною. Inset малюється всередині
   padding-box, тож не залежить від того, чи ріже предок. */
.cat-item.active { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; background: color-mix(in srgb, var(--accent) 8%, var(--panel)); }
.cat-item.error { border-color: var(--error); }
.cat-item__ic { width: 34px; height: 34px; border-radius: 9px; display: grid; place-items: center; font-size: 18px; background: var(--panel-2); flex-shrink: 0; }
.cat-item.active .cat-item__ic { background: color-mix(in srgb, var(--accent) 18%, transparent); }
.cat-item__body { flex: 1; min-width: 0; }
.cat-item__name { font-weight: 600; font-size: 14px; display: flex; align-items: center; gap: 6px; }
.cat-item__sub { display: block; font-size: 12px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Обрана позиція — звичайний текст, а не акцент: зеленою лишається тільки галка. */
.cat-item__sub.picked { color: var(--text); font-weight: 500; }
.cat-item__check { color: var(--ok); font-size: 15px; flex-shrink: 0; }
/* Незаповнена обов'язкова категорія: той самий слот, що й галка, але попереджувальний
   тон — це ще не помилка, а робота, яку лишилось доробити. */
.cat-item__todo { color: var(--warn); font-size: 14px; flex-shrink: 0; display: inline-flex; }

/* ---- Catalog main ---- */
.catalog { background: var(--panel); border: 1px solid var(--border-soft); border-radius: var(--radius); padding: 20px; box-shadow: var(--shadow); }
.catalog__head { display: flex; align-items: center; gap: 14px; margin-bottom: 16px; flex-wrap: wrap; }
.catalog__title { font-size: 22px; }
.catalog__title span { color: var(--muted-2); font-size: 13px; font-weight: 600; margin-left: 10px; }
.catalog__spacer { flex: 1; }
/* Пошук і сортування — геометрія полів з ДС Rozetka (SearchBar / SortSelect):
   40px висота, --radius-md, біле тло, обводка --global-black-20, текст 14px.
   Фокус-рінг у ДС не описаний, лишаємо свій (акцент ДС) — без нього поле не
   проходить по доступності. */
.search-box { position: relative; flex: 1; min-width: 200px; max-width: 380px; }
.search-box input { width: 100%; height: 40px; border-radius: var(--radius); border: 1px solid var(--border); background: var(--panel); color: var(--text); padding: 0 12px 0 44px; outline: none; font-size: 14px; }
.search-box input::placeholder { color: var(--muted-2); }
.search-box input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }
.search-box .mag { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--text); }
/* SortSelect з ДС: власна шеврон-іконка (--global-black-60) справа, 16px,
   нативна стрілка знята — інакше поле виглядає системним, не фірмовим. */
.sort-select {
    height: 40px; border-radius: var(--radius); border: 1px solid var(--border);
    background-color: var(--panel); color: var(--text); padding: 0 36px 0 12px;
    font-size: 14px; font-family: inherit; cursor: pointer; outline: none;
    appearance: none; -webkit-appearance: none;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23797878'><path d='m6.91 9.09c.39-.39 1.02-.39 1.41 0l3.88 3.87 3.89-3.87c.39-.39 1.02-.39 1.41 0s.39 1.02 0 1.41l-5.3 5.29-5.29-5.29c-.39-.39-.39-1.02 0-1.41z'/></svg>");
    background-repeat: no-repeat; background-position: right 12px center; background-size: 16px;
}
.sort-select:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }
/* Тогл «тільки сумісні» — як у фільтрах Rozetka. Компонента Switch у ДС немає,
   тож збираємо з її ж примітивів: доріжка — пігулка на --global-black-20, увімкнена
   — --global-green (як Checkbox у стані checked), бігунок білий, перехід .15s
   (--transition-fast). <input> лишається справжнім чекбоксом, лише схований:
   так працюють Tab, Space і озвучування стану. */
.switch { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; font-size: 13.5px; color: var(--muted); user-select: none; white-space: nowrap; }
.switch input { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); border: 0; }
.switch__track {
    position: relative; flex: 0 0 auto; width: 36px; height: 20px; border-radius: var(--radius-pill);
    background: var(--border); transition: background-color .15s;
}
.switch__knob {
    position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%;
    background: #fff; box-shadow: 0 1px 3px rgba(34, 31, 31, .2); transition: transform .15s;
}
.switch input:checked + .switch__track { background: var(--accent); }
.switch input:checked + .switch__track .switch__knob { transform: translateX(16px); }
.switch input:focus-visible + .switch__track { box-shadow: 0 0 0 3px var(--accent-glow); }
.switch:hover .switch__track { background: color-mix(in srgb, var(--muted-2) 45%, var(--border)); }
.switch:hover input:checked + .switch__track { background: var(--accent-2); }
.switch input:checked ~ .switch__label { color: var(--text); }

/* ---- Product grid ---- */
/* Сітка каталогу впирається в 5 колонок: max() у minmax() тримає п'яту колонку
   на широкому екрані (трек = (100% − 4×gap)/5) і не дає картці стати вужчою за
   176px — далі auto-fill сам переходить на 4/3/2 колонки. */
.prod-grid { --prod-gap: 14px; display: grid; grid-template-columns: repeat(auto-fill, minmax(max(176px, calc((100% - 4 * var(--prod-gap)) / 5)), 1fr)); gap: var(--prod-gap); }
.prod-card {
    display: flex; flex-direction: column; background: var(--panel); border: 1px solid var(--border-soft);
    border-radius: 8px; padding: 15px; transition: .16s; position: relative; overflow: hidden;
}
.prod-card:hover { border-color: var(--accent); transform: translateY(-2px); box-shadow: var(--shadow-lg); }
.prod-card.selected { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
.prod-card.incompatible { opacity: .55; }
.prod-card.incompatible:hover { transform: none; border-color: var(--error); box-shadow: none; }
.prod-card__img { height: 92px; display: grid; place-items: center; font-size: 46px; background: radial-gradient(circle at 50% 35%, color-mix(in srgb, var(--accent) 12%, transparent), transparent 70%); border-radius: 10px; margin-bottom: 10px; overflow: hidden; }
.prod-card__img .prod-photo { width: 100%; height: 100%; }
.prod-card__name { font-weight: 600; font-size: 13px; line-height: 1.3; margin: 2px 0 8px; min-height: 34px; }
.prod-card__specs { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 10px; }
.prod-card__reason { font-size: 11.5px; color: var(--error); display: flex; gap: 5px; margin-bottom: 10px; line-height: 1.35; }
.prod-card__foot { margin-top: auto; }
.prod-card__price { font-size: 19px; font-weight: 700; color: var(--text); margin-bottom: 10px; }
.prod-card__price small { font-size: 12px; color: var(--muted); font-weight: 600; margin-right: 4px; }
.prod-card__actions { display: flex; gap: 8px; }
.btn-select {
    flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 40px;
    border-radius: var(--radius); border: none; background: var(--accent);
    color: #fff; font-weight: 500; cursor: pointer; font-size: 14px; transition: var(--btn-transition);
}
.btn-select:hover:not(:disabled) { background: var(--accent-2); color: var(--accent-ink); }
.btn-select:disabled { color: var(--btn-disabled-ink); background: var(--btn-disabled-bg); cursor: not-allowed; }
/*
 * У каталозі заливку носить обрана позиція, а не «Обрати»: обраний компонент має
 * бути видно з сітки, і тоді стан читається з кнопки — окремої плашки ОБРАНО на
 * картці немає. Тож .chosen лишається primary-кнопкою з ДС (успадковує .btn-select),
 * а «Обрати» — світлий варіант: акцентний тінт + обводка акцентом, на hover
 * заливається (підказка, що саме зробить клік).
 * Тінт рахується з --accent, бо цей колір задає партнер (ThemeState), а не тема.
 */
.prod-card__actions .btn-select:not(.chosen):not(:disabled) {
    background: color-mix(in srgb, var(--accent) 10%, var(--panel));
    box-shadow: 0 0 0 1px var(--accent) inset;
    color: var(--accent);
}
.prod-card__actions .btn-select:not(.chosen):hover:not(:disabled) {
    background: var(--accent);
    color: #fff;
}
/* tertiary-кнопка з ДС: сірий фон + hairline, «синій текст-посилання».
   У каталозі більше не використовується (деталі відкриває вся картка) — лишається
   для шухляди складу збірки. */
.btn-view { width: 44px; height: 40px; border-radius: var(--radius); border: none; background: var(--btn-gray-bg); box-shadow: 0 0 0 1px var(--btn-hairline) inset; color: var(--link); cursor: pointer; transition: var(--btn-transition); }
.btn-view:hover { color: var(--link-hover); }

/*
 * Вхід у деталі компонента — уся площа картки.
 * Клікабельного <div> тут немає: клік ловить кнопка з назвою, а її ::after розтягнутий
 * на картку. Так безкоштовно працюють Tab, Enter/Space й озвучування скрінрідером.
 * Дії («Обрати», дельта) підняті на z-index: 1, тож лежать над оверлеєм.
 */
.prod-card { cursor: pointer; }
.prod-card__open { display: block; width: 100%; padding: 0; border: 0; background: none; font: inherit; color: inherit; text-align: left; cursor: pointer; }
.prod-card__open::after { content: ''; position: absolute; inset: 0; border-radius: 8px; }
.prod-card__open:focus { outline: none; }
.prod-card__open:focus-visible::after { outline: 2px solid var(--accent); outline-offset: -3px; }
.prod-card:hover .prod-card__name { color: var(--link); }
.prod-card__delta, .prod-card__actions { position: relative; z-index: 1; }
/* Підказка-affordance замість колишньої іконки «око»: не мішень, а обіцянка кліку. */
.prod-card__more { pointer-events: none; display: flex; align-items: center; gap: 4px; font-size: 12px; color: var(--muted); margin-bottom: 8px; transition: color .16s; }
.prod-card:hover .prod-card__more { color: var(--link); }

.empty-note { grid-column: 1/-1; padding: 40px; text-align: center; color: var(--muted); }

.app-shell > .container { flex: 1 0 auto; }
/* ---- Поради «що варто виправити» — у рейці категорій, не в нижній панелі ----
   Блок стоїть між шкалою збірки й списком комплектуючих, тож колонка вузька:
   поради — вертикальним стеком, текст переносимо, «перейти» лишається стрілкою. */
.recommend { display: flex; flex-direction: column; gap: 6px; padding: 0 4px 4px; }
.recommend__list { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.advice {
    display: flex; align-items: flex-start; gap: 8px; width: 100%; text-align: left;
    padding: 8px 10px; border-radius: 10px; font-size: 12px; line-height: 1.35;
    border: 1px solid transparent; background: var(--bg-2); color: var(--text);
}
.advice > span:first-of-type { flex: 1; min-width: 0; }
.advice .ui-svg { font-size: 15px; flex: 0 0 auto; margin-top: 1px; }
/* Повідомлення: тінт + рамка кольору стану, текст звичайний темний — колір несуть
   рамка й іконка. Кольоровий абзац читається гірше й «кричить» більше, ніж треба. */
.advice--error { background: var(--error-soft); color: var(--text); border-color: color-mix(in srgb, var(--error) 45%, transparent); }
.advice--error .ui-svg { color: var(--error); }
.advice--warn { background: var(--warn-soft); color: var(--text); border-color: color-mix(in srgb, var(--warn) 45%, transparent); }
.advice--warn .ui-svg { color: var(--warn); }
.advice--info { color: var(--muted); }
button.advice { cursor: pointer; font-family: inherit; }
button.advice:hover { border-color: var(--accent); }
.advice__go { flex: 0 0 auto; font-size: 13px; font-weight: 700; color: var(--accent); line-height: 1.35; }
/* Порада зі станом лишається у своєму кольорі й на hover, і в стрілці: зелена рамка
   на помаранчевому блоці читалась як «усе гаразд» — протилежно до змісту. */
button.advice--error:hover { border-color: var(--error); }
.advice--error .advice__go { color: var(--error); }
button.advice--warn:hover { border-color: var(--warn); }
.advice--warn .advice__go { color: var(--warn); }
.recommend__more { font-size: 11px; color: var(--muted-2); }

/* ---- Стан каталогу (006/T060a, T064) ----
   Смуга про вік даних — та сама .advice, що й поради, але на всю ширину екрана:
   вона говорить не про збірку, а про весь конфігуратор, і мусить читатися як
   повідомлення сторінки, а не як ще одна порада в рейці. */
.catalog-notice { margin-bottom: 16px; font-size: 13px; }
/* Каталог ще не наповнений: стан замість вітрини, тому по центру й із повітрям —
   порожній екран без пояснення читався б як зламана сторінка. */
.catalog-empty { display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 64px 20px; text-align: center; }
.catalog-empty__ic { font-size: 40px; color: var(--muted-2); display: inline-flex; }
.catalog-empty__title { margin: 0; font-size: 20px; font-weight: 700; }
.catalog-empty__text { margin: 0; max-width: 420px; color: var(--muted); line-height: 1.45; }

/* tertiary-кнопка з ДС («Показати ще»): сірий фон + hairline + синій текст */
.tbtn { display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 16px; border-radius: var(--radius); border: none; background: var(--btn-gray-bg); box-shadow: 0 0 0 1px var(--btn-hairline) inset; color: var(--link); cursor: pointer; font-weight: 500; font-size: 14px; transition: var(--btn-transition); }
.tbtn:hover { color: var(--link-hover); }
.tbtn.danger:hover { color: var(--error); }
.tbtn.analyze { background: var(--navy); box-shadow: none; color: #fff; }
.tbtn.analyze:hover { background: var(--navy-hover); color: #fff; }
.tbtn.summary { background: var(--accent); box-shadow: none; color: var(--accent-ink); }
.tbtn.summary:hover { background: var(--accent-2); color: var(--accent-ink); }
.tbtn .total { font-weight: 800; }

/* ============ Модалки (збірка / аналіз / деталі компонента) ============
 * Один діалог на всі три поверхні: затемнене тло на весь екран, картка по центру.
 * Розмір задає модифікатор --lg / --xl; шапка й підвал закріплені, скролиться тіло.
 */
.overlay { position: fixed; inset: 0; background: rgba(2, 5, 12, .68); z-index: 100; backdrop-filter: blur(2px); }
.x-btn { background: none; border: none; width: 36px; height: 36px; border-radius: var(--radius-sm); color: var(--muted); font-size: 24px; cursor: pointer; line-height: 1; display: grid; place-items: center; transition: var(--btn-transition); }
.x-btn:hover { color: var(--text); background: var(--btn-gray-bg); }

.status-banner { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border-radius: 11px; font-weight: 600; font-size: 14px; margin-bottom: 14px; }
.status-banner.ok { background: var(--ok-soft); border: 1px solid color-mix(in srgb, var(--ok) 45%, transparent); color: var(--text); }
.status-banner.ok .ui-svg { color: var(--ok); }
.status-banner.error { background: var(--error-soft); border: 1px solid color-mix(in srgb, var(--error) 45%, transparent); color: var(--text); }
.status-banner.error .ui-svg { color: var(--error); }
.status-banner.warn { background: var(--warn-soft); border: 1px solid color-mix(in srgb, var(--warn) 45%, transparent); color: var(--text); }
.status-banner.warn .ui-svg { color: var(--warn); }
.status-banner.neutral { background: var(--bg-2); border: 1px solid var(--border-soft); color: var(--muted); }

.sum-item { display: flex; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--border-soft); }
.sum-item__ic { width: 38px; height: 38px; border-radius: 9px; background: var(--panel-2); display: grid; place-items: center; font-size: 18px; flex-shrink: 0; }
.sum-item__main { flex: 1; min-width: 0; }
.sum-item__cat { font-size: 11px; text-transform: uppercase; letter-spacing: 1px; color: var(--muted-2); }
.sum-item__name { font-size: 13.5px; font-weight: 600; }
.sum-item__right { text-align: right; flex-shrink: 0; }
.sum-item__price { font-weight: 700; color: var(--text); white-space: nowrap; }
.sum-item.err { }
.sum-item.err .sum-item__ic { background: var(--error-soft); }
/* 016/T026 (FR-005): причина несумісності під назвою позиції в складі збірки. */
.sum-item .prod-card__reason { margin: 4px 0 0; }
.mini-link { background: none; border: none; color: var(--muted); font-size: 12px; cursor: pointer; padding: 0; }
.mini-link:hover { color: var(--accent); }
.mini-link.danger:hover { color: var(--error); }

.issue-line { display: flex; gap: 8px; font-size: 12.5px; padding: 8px 10px; border-radius: 8px; margin-top: 8px; line-height: 1.4; }
.issue-line.error { background: var(--error-soft); border: 1px solid color-mix(in srgb, var(--error) 45%, transparent); color: var(--text); }
.issue-line.error .ui-svg { color: var(--error); }
.issue-line.warn { background: var(--warn-soft); border: 1px solid color-mix(in srgb, var(--warn) 45%, transparent); color: var(--text); }
.issue-line.warn .ui-svg { color: var(--warn); }

.total-row { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 14px; }
.total-row span { color: var(--muted); text-transform: uppercase; font-size: 12px; letter-spacing: 1px; }
.total-row b { font-size: 28px; color: var(--text); }
.btn-cta { width: 100%; height: 40px; border-radius: var(--radius); border: none; background: var(--accent); color: var(--accent-ink); font-weight: 500; font-size: 16px; cursor: pointer; transition: var(--btn-transition); }
.btn-cta:hover:not(:disabled) { background: var(--accent-2); }
.btn-cta:disabled { background: var(--btn-disabled-bg); color: var(--btn-disabled-ink); cursor: not-allowed; }
.toast { text-align: center; margin-top: 10px; padding: 8px; border-radius: 9px; background: var(--ok-soft); color: var(--ok); font-size: 13px; }

/* Тло діалога: клік по ньому закриває, тому це окремий шар під карткою. */
.modal-wrap {
    position: fixed; inset: 0; z-index: 100; display: flex; align-items: center; justify-content: center;
    padding: 24px; background: rgba(2, 5, 12, .7); backdrop-filter: blur(3px); overflow-y: auto;
    animation: fade-in .16s ease-out;
}
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
.modal-card {
    width: 100%; max-width: 560px; max-height: calc(100vh - 48px);
    display: flex; flex-direction: column;
    background: var(--panel); border: 1px solid var(--border); border-radius: 18px;
    box-shadow: var(--shadow); animation: pop .18s ease-out;
}
.modal-card:focus { outline: none; }
@keyframes pop { from { transform: scale(.97); opacity: 0; } to { transform: none; opacity: 1; } }
/* Склад збірки — довгий список; деталі компонента — фото + характеристики у дві колонки. */
.modal-card--lg { max-width: 620px; }
.modal-card--xl { max-width: 1000px; }
.modal-card__head {
    display: flex; align-items: center; gap: 16px; justify-content: space-between;
    padding: 20px; border-bottom: 1px solid var(--border-soft); flex: 0 0 auto;
}
.modal-card__head h3 { font-size: 18px; display: flex; align-items: center; gap: 10px; }
/* Склад збірки: рубрика — заголовок, назва конкретної збірки — підпис під ним. */
.modal-card--lg .modal-card__head h3 { align-items: flex-start; line-height: 1.25; }
/* Підпис у шапці модалки — назва збірки / гри, під яку її обрали. Це не службовий
   дрібний текст, а відповідь на «що це взагалі»: сірий 13px під жирною рубрикою
   читався як виноска й губився. Тому власне тло — чип відриває підпис від
   заголовка, а сам текст іде повним контрастом. Нейтральний, не брендовий:
   зелений тінт на цьому екрані означає «сумісно». */
/* Окремим рядком під заголовком, а не поруч: назви бувають довгі («Збірка Ultra
   · змінена»), і в один рядок із рубрикою вони починають тіснити хрестик. */
.modal-card--lg .modal-card__head h3 small,
.modal-card__sub {
    display: block; width: fit-content; margin-top: 7px;
    padding: 3px 10px; border-radius: 999px;
    background: var(--bg); border: 1px solid var(--border-soft);
    color: var(--text); font-size: 13px; font-weight: 600; line-height: 1.35;
    text-transform: none; letter-spacing: normal;
}
/* Деталі компонента: назва в два рядки, тож заголовок вирівнюємо по верху. */
.modal-card--xl .modal-card__head h3 { align-items: flex-start; line-height: 1.25; }
.modal-card__head h3 small { display: block; margin-top: 4px; font-size: 12px; font-weight: 500; letter-spacing: .6px; text-transform: uppercase; color: var(--muted-2); }
.modal-card__body { padding: 20px; overflow-y: auto; flex: 1 1 auto; min-height: 0; }
.modal-card__foot {
    display: flex; align-items: center; gap: 16px; justify-content: flex-end;
    padding: 16px 20px; border-top: 1px solid var(--border-soft); flex: 0 0 auto;
}
/* .btn-cta базово width:100% — у підвалі вона фіксованої ширини, щоб «Замінить: …» помістилось. */
.modal-card__foot .btn-cta { flex: 0 0 auto; width: auto; min-width: 240px; padding: 0 24px; }
/* Підвал складу збірки — сума над кнопкою на всю ширину. */
.modal-card--lg .modal-card__foot { display: block; }
.view-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 32px; align-content: start; }
.view-replaces { font-size: 13px; color: var(--muted); margin-right: auto; }
.view-replaces b { color: var(--text); font-weight: 600; }

/* Фото компонента: заглушка нейтральна — гліф категорії, а не ілюстрація товару. */
/* flex, а не grid: висота кадру береться з aspect-ratio, і в grid відсотки на
   <img> нема від чого рахувати — `height: 100%` вироджувалось в auto, кадр
   виростав до натуральних пропорцій і overflow різав його зверху й знизу
   (object-fit не рятує: за межі виходив сам бокс <img>, а не картинка в ньому).
   Та сама причина, що й у .prod-photo--sm нижче — тому й ліки ті самі: max-*. */
.prod-photo {
    margin: 0; aspect-ratio: 4 / 3; display: flex; flex-direction: column;
    align-items: center; justify-content: center; gap: 10px;
    background: var(--bg-2); border: 1px solid var(--border-soft); border-radius: 8px; overflow: hidden;
}
.prod-photo__img { width: auto; height: auto; max-width: 100%; max-height: 100%; object-fit: contain; }
.prod-photo__glyph { font-size: 84px; color: var(--muted-2); }
.prod-photo__empty { font-size: 12.5px; color: var(--muted); }
/* 006/T032, FR-008a: заповнювач лежить у розмітці завжди, а onerror прибирає <img>,
   що не завантажився (картинка каналу — чужий хост, а на сторінці партнера ще й його
   CSP). Поки <img> у кадрі є — заповнювач схований; зник <img> — заповнювач проступає
   сам, разом із ним ховається підпис «для прикладу», який без кадру безпредметний. */
.prod-photo:has(.prod-photo__img) .prod-photo__glyph,
.prod-photo:has(.prod-photo__img) .prod-photo__empty { display: none; }
.prod-photo:not(:has(.prod-photo__img)) .prod-photo__note,
.prod-photo:not(:has(.prod-photo__img)) .prod-photo__tag { display: none; }
/* Підпис під кадром «для прикладу»: це не фото цієї конкретної модифікації. */
.prod-photo { position: relative; }
.prod-photo__note { position: absolute; left: 0; right: 0; bottom: 0; padding: 6px 10px; font-size: 11.5px; text-align: center; color: var(--muted); background: color-mix(in srgb, var(--panel) 88%, transparent); }

/* Мініатюра на картці каталогу: без рамки й фону — фон дає .prod-card__img.
   flex, а не grid: у grid із авто-рядком `height: 100%` на <img> нема від чого рахуватися,
   і кадр вилазив за 92 пікселі. Тут кадр вписується цілком (max-height). */
.prod-photo--sm { aspect-ratio: auto; background: none; border: none; border-radius: 0; display: flex; align-items: center; justify-content: center; }
.prod-photo--sm .prod-photo__img { width: auto; height: auto; max-width: 100%; max-height: 100%; }
/* На 92 пікселях повний підпис не читається — коротка плашка, повний текст у тултипі. */
.prod-photo__tag { position: absolute; left: 4px; bottom: 4px; padding: 2px 6px; border-radius: 4px; font-size: 10px; line-height: 14px; color: var(--muted); background: color-mix(in srgb, var(--panel) 86%, transparent); }

/* Характеристики — повний перелік, «label — значення» в один рядок. */
.view-specs { margin: 0; display: flex; flex-direction: column; }
.view-specs__row { display: flex; justify-content: space-between; gap: 16px; padding: 10px 0; border-bottom: 1px solid var(--border-soft); font-size: 14px; }
.view-specs dt { color: var(--muted); }
.view-specs dd { margin: 0; font-weight: 600; text-align: right; }
.view-info .issue-line { margin-bottom: 14px; }

@media (max-width: 860px) {
    .view-body { grid-template-columns: 1fr; gap: 20px; }
    .modal-card__head, .modal-card__foot, .modal-card__body { padding: 14px 16px; }
    /* Тісно для одного рядка: «Замінить: …» стає окремим рядком над CTA. */
    .modal-card__foot { flex-direction: column; align-items: stretch; gap: 10px; }
    .modal-card__foot .btn-cta { flex: 1; width: 100%; min-width: 0; }
    .view-replaces { margin-right: 0; }
    .prod-photo { aspect-ratio: 3 / 2; }
}

/* Аналіз збірки: підзаголовок, бали кільцями, клас плашкою — розкладка віджета
   (`Widget/src/ui/widget.css`, блок `.an-*`). Тон блоку — дві змінні: --t (дуга,
   іконка) і --ts (м'яке тло). */
.an-sub { margin: -6px 0 14px; font-size: 13px; color: var(--muted); }
.an-scores { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 16px; margin-bottom: 14px; }
.an-score { display: grid; grid-template-columns: 92px 1fr; align-items: center; column-gap: 14px; }
.an-ring, .an-score__num { grid-area: 1 / 1; }
.an-ring { width: 92px; height: 92px; transform: rotate(-90deg); fill: none; stroke-width: 9; }
.an-ring circle { stroke: var(--bg-2); }
.an-ring circle + circle { stroke: var(--t); stroke-linecap: round; transition: stroke-dasharray .5s; }
.an-ring, .an-badge, .an-note, .power-cell.ok { --t: var(--ok); --ts: var(--ok-soft); }
.an-ring.warn, .an-note.warn { --t: var(--warn); --ts: var(--warn-soft); }
.an-ring.bad, .an-note.bad, .power-cell.bad { --t: var(--error); --ts: var(--error-soft); }
/* Дуга кільця — фіксовані зелений і бурштин, як у смуг FPS (30.09.2026); .an-ring.bad специфічніший і лишає червоний. */
.an-ring { --t: #009a26; }
.an-ring.warn { --t: #fca600; }
.an-score__num { display: grid; justify-items: center; font-size: 11px; line-height: 1.1; color: var(--muted); }
.an-score__num b { font-size: 26px; color: var(--text); }
.an-score__text { display: grid; gap: 4px; font-size: 12.5px; line-height: 1.35; color: var(--muted); }
.an-score__text b { font-size: 15px; color: var(--text); }
.an-class { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 10px 0; border-top: 1px solid var(--border-soft); border-bottom: 1px solid var(--border-soft); margin-bottom: 12px; }
.an-class__l { font-size: 11px; letter-spacing: 1px; text-transform: uppercase; color: var(--muted-2); }
.an-badge { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: var(--radius); background: var(--ts); font-size: 14px; }
.an-badge .ui-svg, .an-note .ui-svg, .power-cell .ui-svg { flex: none; color: var(--t); }
.an-note { display: flex; gap: 10px; align-items: flex-start; margin-top: 14px; padding: 12px 14px; border-radius: 11px; background: var(--ts); font-size: 13px; line-height: 1.45; }
.fps-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 16px 0; }
.fps-card { background: var(--bg-2); border: 1px solid var(--border-soft); border-radius: 12px; padding: 14px; text-align: center; }
.fps-card .v { font-size: 26px; font-weight: 800; color: var(--accent); }
.fps-card .l { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: 1px; }
/* 012/T044 — ряди перемикачів «роздільна здатність» і «рівень графіки». */
.fps-switch { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
.fps-switch__btn { flex: 1 1 auto; padding: 7px 10px; border-radius: 9px; border: 1px solid var(--border); background: var(--panel-2); color: var(--muted); font: inherit; font-size: 12.5px; cursor: pointer; }
.fps-switch__btn:hover { border-color: var(--accent); color: var(--text); }
.fps-switch__btn.is-active { border-color: var(--accent); background: var(--accent-glow); color: var(--text); font-weight: 700; }

/* FPS по конкретних іграх: рядок «гра + число обраної комбінації». */
.fps-games { margin: 4px 0 10px; }
.fps-games__row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 5px 8px; align-items: baseline; padding: 7px 2px; border-bottom: 1px dashed var(--border-soft); font-size: 13px; }
.fps-games__row b { text-align: right; font-variant-numeric: tabular-nums; }
.fps-games__row b.ok { color: var(--ok); }
.fps-games__row b.warn { color: var(--warn); }
.fps-games__row b.bad { color: var(--error); }
.fps-games__row--head { border-bottom: 1px solid var(--border-soft); font-size: 10.5px; letter-spacing: 1px; text-transform: uppercase; color: var(--muted-2); }
.fps-games__row--head span { text-align: right; }
.fps-games__row--head span:first-child { text-align: left; }
.fps-games__name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Смуга під числом на фіксованій шкалі 0–300 (зустріч 23.09.2026) — другий рядок сітки на всю ширину. */
.fps-bar { grid-column: 1 / -1; display: block; height: 8px; border-radius: 4px; background: var(--bg-2); overflow: hidden; }
.fps-bar > i { display: block; height: 100%; border-radius: 4px; background: #009a26; transition: width .4s; }
.fps-bar > i.warn { background: #fca600; } /* зелений і бурштин фіксовані в усіх темах (30.09.2026); червоний — токен */
.fps-bar > i.bad { background: var(--error); }
.fps-scale { display: flex; justify-content: space-between; padding: 4px 2px 0; font-size: 10px; font-variant-numeric: tabular-nums; color: var(--muted-2); }
/* 012/T048: рядок зведення — кнопка вибору гри, а не підпис. */
.fps-games__row--pick { width: 100%; background: none; color: inherit; font: inherit; font-size: 13px; text-align: left; border-left: 0; border-right: 0; border-top: 0; cursor: pointer; }
.fps-games__row--pick:hover { color: var(--accent); }
.fps-pick-hint { margin: 10px 0 0; font-size: 12.5px; color: var(--muted); }
/* 012/T051: «перелік ігор не налаштований» — названий стан налаштування, не помилка. */
.fps-unset { margin: 10px 0 2px; padding: 12px 14px; border-radius: 11px; border: 1px dashed var(--border); background: var(--bg-2); }
.fps-unset__title { display: flex; gap: 8px; align-items: center; font-weight: 700; font-size: 13px; }
.fps-unset__text { margin: 6px 0 0; font-size: 12.5px; color: var(--muted); line-height: 1.45; }
.audit-note { display: flex; gap: 10px; padding: 12px 14px; border-radius: 11px; font-size: 13px; line-height: 1.45; margin-top: 6px; }
.audit-note.info { background: var(--bg-2); color: var(--muted); }
.audit-note.warn { background: var(--warn-soft); color: var(--warn); }

.preset-grid { display: flex; flex-direction: column; gap: 12px; }
.preset { display: flex; gap: 14px; align-items: center; padding: 16px; border-radius: 13px; border: 1px solid var(--border); background: var(--panel-2); color: var(--text); cursor: pointer; text-align: left; font: inherit; }
.preset:hover { border-color: var(--accent); box-shadow: var(--shadow); }
.preset__ic { font-size: 30px; }
.preset__name { font-weight: 700; }
.preset__desc { font-size: 12.5px; color: var(--muted); }

.theme-toggle { display: inline-flex; align-items: center; gap: 0; }

/* completeness progress */
/* ---- Єдина шкала збірки: бал 0–100 (BuildAdvisor) + повнота як підпис ----
   Раніше тут була окрема полоса «готовність N/M», а бал жив у нижній панелі —
   дві шкали на ту саму збірку. Бал уже враховує брак обов'язкових позицій
   (−18 за кожну, стеля 70, підпис «Неповна»), тож полоса одна, а «N / M
   обов'язкових» лишається текстовим уточненням під нею. */
.build-score { padding: 6px 4px 10px; display: flex; flex-direction: column; gap: 6px; }
.build-score__label { display: flex; justify-content: space-between; align-items: baseline; font-size: 12px; color: var(--muted); }
.build-score__value b { font-size: 15px; font-weight: 800; line-height: 1; color: var(--text); }
.build-score__value small { font-size: 11px; color: var(--muted-2); }
.build-score__bar { height: 6px; border-radius: 4px; background: var(--bg-2); overflow: hidden; }
.build-score__bar > i { display: block; height: 100%; border-radius: 4px; transition: width .4s; }
.build-score__foot { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; font-size: 11px; color: var(--muted-2); }
.build-score__tier { font-size: 12px; font-weight: 700; color: var(--muted); }

/* Кольори бала: чим повніша й збалансованіша збірка, тим «зеленіше».
   Число — тільки колір тексту, полоса — тільки тло (інакше цифра зникає на плашці). */
.build-score__value b.good, .build-score__tier.good { color: var(--ok); }
.build-score__value b.ok, .build-score__tier.ok { color: var(--accent); }
.build-score__value b.mid, .build-score__tier.mid { color: var(--warn); }
.build-score__value b.low, .build-score__tier.low { color: var(--error); }
.build-score__bar > i.good { background: var(--ok); }
.build-score__bar > i.ok { background: var(--accent); }
.build-score__bar > i.mid { background: var(--warn); }
.build-score__bar > i.low { background: var(--error); }

/* 010/T034: оцінки може не бути (FR-008) — прочерк замість числа, і жодного
   кольору: «нема з чого рахувати» не рівень якості. */
.build-score__value--none { font-size: 15px; font-weight: 800; color: var(--muted-2); }
.build-score__tier.none { color: var(--muted-2); }

/* FR-008a: на скількох парах стоїть число. Оцінка з половини пар виглядає так
   само, як із усіх — цей рядок і є та різниця. */
.build-score__pairs { font-size: 11px; color: var(--muted-2); }

/* FR-009: найгірша пара — те, що тягне оцінку вниз. */
.build-score__worst { font-size: 11px; color: var(--muted); }

/* Розбір по парах у панелі аналізу. */
.pair-line { display: flex; justify-content: space-between; gap: 12px; padding: 6px 0; border-bottom: 1px solid var(--border); font-size: 12px; }
.pair-line:last-child { border-bottom: none; }
.pair-line__what { color: var(--muted); }
.pair-line__msg { color: var(--text); text-align: right; }
.pair-line--unmet .pair-line__msg { color: var(--error); }
.pair-line--unscored .pair-line__msg { color: var(--muted-2); }

/* text field */
.text-field { width: 100%; height: 44px; border-radius: 11px; border: 1px solid var(--border); background: var(--bg-2); color: var(--text); padding: 0 14px; outline: none; margin-top: 6px; font-size: 15px; }
.text-field:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }

/* saved builds list */
.saved-list { display: flex; flex-direction: column; gap: 10px; }
.saved-item { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border-radius: 12px; border: 1px solid var(--border-soft); background: var(--panel-2); }
.saved-item__main { flex: 1; min-width: 0; }
.saved-item__name { font-weight: 700; }
.saved-item__meta { font-size: 12px; color: var(--muted); margin-top: 2px; }

/* floating toast: угорі під шапкою, не внизу — низ екрана поза увагою (панель
   рекомендацій, край в'юпорта), і підтвердження «додано в кошик» губилось. */
.floating-toast { position: fixed; left: 50%; top: 78px; z-index: 130; background: var(--panel); border: 1px solid var(--accent); color: var(--text); padding: 12px 22px; border-radius: 8px; box-shadow: var(--shadow-lg); font-weight: 600; animation: toast-in .2s ease-out; transform: translateX(-50%); }
@keyframes toast-in { from { transform: translate(-50%, -10px); opacity: 0; } to { transform: translate(-50%, 0); opacity: 1; } }

/* print sheet */
.print-sheet { display: none; }
@media print {
    body, .app-shell { background: #fff !important; }
    .site-header, .hero, .builder-grid, .overlay, .modal-wrap, .floating-toast { display: none !important; }
    .print-sheet { display: block !important; padding: 24px; color: #000; }
    .print-sheet * { color: #000 !important; }
    .print-sheet h2 { font-size: 22px; margin-bottom: 4px; }
    .print-meta { font-size: 12px; color: #555 !important; margin: 4px 0 16px; }
    .print-table { width: 100%; border-collapse: collapse; }
    .print-table th, .print-table td { text-align: left; padding: 8px 10px; border-bottom: 1px solid #ddd; font-size: 13px; }
    .print-table th { text-transform: uppercase; font-size: 11px; color: #666 !important; }
    .print-table td:last-child, .print-table th:last-child { text-align: right; white-space: nowrap; }
}

/* ============ Component icons ============ */
/* Деталізовані монохромні іконки: контур + два напівтони заливки. */
.cat-svg, .intent-svg { display: block; }
.hardware-icon, .intent-svg {
    color: #4b5563;
    filter: drop-shadow(0 1px 0 rgba(255, 255, 255, .55));
}
.ui-svg { display: block; width: 1em; height: 1em; flex: 0 0 auto; }
.prod-card__img { color: #3f4853; font-size: 56px; }
.cat-item__ic { color: #66707d; font-size: 20px; }
.cat-item.active .cat-item__ic,
.cat-item:hover .cat-item__ic { color: #343b44; }
.sum-item__ic { color: #46505c; font-size: 20px; }
.cat-title-ico { display: inline-flex; align-items: center; color: #3f4853; vertical-align: -0.18em; margin-right: 6px; }
.modal-card__head .cat-title-ico { vertical-align: -0.15em; }
.scenario-card__ic { color: #2b3138; }
.preset__ic { color: #2b3138; }

/* Вирівнювання UI-гліфів у типових контекстах */
.kicker .ui-svg { color: var(--accent); }
.tbtn .ui-svg, .icon-btn .ui-svg { font-size: 17px; }
.btn-select .ui-svg { font-size: 15px; }
.mag .ui-svg { font-size: 16px; }
/* Лупа в ДС — 24px; у полі каталогу лишаємо трохи менший розмір, бо поле 40px. */
.search-box .mag .ui-svg { font-size: 20px; }
.status-banner .ui-svg, .issue-line .ui-svg, .audit-note .ui-svg { font-size: 16px; margin-top: 1px; }
.btn-cta { display: inline-flex; align-items: center; justify-content: center; gap: 8px; }
.btn-view { display: inline-flex; align-items: center; justify-content: center; }
.floating-toast { display: inline-flex; align-items: center; gap: 8px; }
.floating-toast .ui-svg { color: var(--ok); }
.floating-toast .toast-x { background: none; border: none; color: var(--muted); font-size: 20px; line-height: 1; cursor: pointer; padding: 0 2px; margin-left: 4px; }
.floating-toast .toast-x:hover { color: var(--text); }
.lbl-ico { display: inline-flex; align-items: center; gap: 7px; }
.logo__mark svg { width: 60%; height: 60%; }

/* ============ Landing (вибір сценарію) ============ */
.landing { max-width: 1000px; margin: 0 auto; padding: 52px 20px 80px; text-align: center; flex: 1 0 auto; }
.landing__q { font-size: 40px; letter-spacing: .5px; margin: 20px 0 10px; }
.landing__sub { color: var(--muted); max-width: 640px; margin: 0 auto 38px; font-size: 16px; }
.intent-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; margin-bottom: 30px; }
/* Картка-плитка ДС: біла поверхня, 1px black-10, радіус 8, padding 16, тінь лише на hover */
.intent-card { position: relative; display: flex; flex-direction: column; align-items: center; text-align: center; gap: 10px; padding: 16px; border-radius: var(--radius); border: 1px solid var(--border-soft); background: var(--panel); color: var(--text); cursor: pointer; transition: var(--card-transition); overflow: hidden; font: inherit; }
.intent-card:hover { border-color: var(--border); box-shadow: var(--shadow-card-hover); }
.intent-card__title { font-size: 22px; font-weight: 700; }
.intent-card:hover .intent-card__title { color: var(--accent); }   /* hover-стан посилань ДС — зелений */
.intent-card__desc { color: var(--muted); font-size: 13.5px; line-height: 1.5; }
.intent-card__go { margin-top: 8px; color: var(--accent); font-weight: 700; font-size: 14px; }


/* ============ Scenarios (каталог сценаріїв) ============ */
.scenarios { padding: 24px 20px 90px; flex: 1 0 auto; }
.scenario-head { display: flex; align-items: center; gap: 16px; margin-bottom: 22px; }
.scenario-head h2 { font-size: 25px; }
.scenario-head__hint { color: var(--muted); font-size: 13px; }
.back-btn { display: inline-flex; align-items: center; gap: 6px; height: 40px; padding: 0 16px; border-radius: var(--radius); border: none; background: var(--btn-gray-bg); box-shadow: 0 0 0 1px var(--btn-hairline) inset; color: var(--link); cursor: pointer; font-weight: 500; flex-shrink: 0; transition: var(--btn-transition); }
.back-btn:hover { color: var(--link-hover); }
/* Як у сітці каталогу: auto-fill із нижньою межею треку, а max() тримає стелю —
   не більше 4 колонок (трек не вужчає за (100% − 3×gap)/4). Вниз сітка сама
   спадає до 3/2/1 колонок без окремих брейкпоінтів. */
.scenario-grid { --sc-gap: 14px; display: grid; grid-template-columns: repeat(auto-fill, minmax(max(240px, calc((100% - 3 * var(--sc-gap)) / 4)), 1fr)); gap: var(--sc-gap); margin-bottom: 20px; }
/* Напрямок без жодного сценарію: категорію могли створити в CMS до того, як її
   наповнили. Порожній екран без підпису читається як збій сторінки. */
.scenario-empty { display: flex; flex-direction: column; align-items: flex-start; gap: 12px; padding: 28px 0 8px; color: var(--muted); }
/* .btn-select базово flex:1 — вона живе в рядку кнопок картки товару. У колонці
   це б'є по ВИСОТІ: flex-basis 0% перебиває height:40px, і кнопка сплющується. */
.scenario-empty .btn-select { flex: 0 0 auto; padding: 0 20px; }

/* Картка сценарію — така сама, як картки готових збірок і каталогу: біла поверхня,
   hairline, радіус 8, padding 16. Hover за ДС — тільки тінь: обводка акцентом і
   підстрибування лишились із прототипу й вибивалися з решти карток. */
.scenario-card { display: flex; flex-direction: column; gap: 10px; padding: 16px; border-radius: var(--radius); border: 1px solid var(--border-soft); background: var(--panel); transition: var(--card-transition); }
.scenario-card:hover { box-shadow: var(--shadow-card-hover); }
.scenario-card__ic { font-size: 34px; }
.scenario-card__body { flex: 1; }
.scenario-card__name { font-weight: 700; font-size: 16px; }
.scenario-card__sub { color: var(--muted); font-size: 13px; margin-top: 3px; }
/* Wrap, а не обрізання: більша ціна (від 169 111 грн) із кнопкою в один рядок не
   вміщається у вузькій картці — кнопка з'їжджає на другий рядок і тримається правого
   краю (як ціна в шапці tier-card). */
.scenario-card__foot { display: flex; align-items: center; justify-content: space-between; gap: 6px 10px; margin-top: 6px; flex-wrap: wrap; }
/* Ціна — тією ж типографікою, що в готових збірках: підпис black-60 12px,
   сума 16px medium, табличні цифри. */
.scenario-card__price { font-size: 12px; color: var(--muted-2); white-space: nowrap; }
.scenario-card__price b { color: var(--text); font-size: 16px; font-weight: 500; font-variant-numeric: tabular-nums; }
.scenario-card__foot .btn-select { flex: 0 0 auto; width: auto; padding: 0 16px; height: 32px; margin-left: auto; }

/* Уся картка — одна ціль натискання: клік по грі веде до драбини збірок під неї.
   Тому cursor/focus-visible живуть на картці, а не на вкладеній кнопці. */
.scenario-card { position: relative; cursor: pointer; user-select: none; }
.scenario-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.scenario-card__pick { margin-left: auto; font-size: 12px; font-weight: 600; color: var(--muted-2); }
.scenario-card:hover .scenario-card__pick { color: var(--accent); }

/* ---- Драбина збірок під сценарій ---- */
.ladder-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; }
.ladder-card { display: flex; flex-direction: column; align-items: stretch; gap: 6px; text-align: left;
    padding: 12px; border-radius: var(--radius); border: 1px solid var(--border-soft);
    background: var(--panel); cursor: pointer; transition: var(--card-transition); font: inherit; color: inherit; }
.ladder-card:hover { border-color: var(--accent); box-shadow: var(--shadow-card-hover); }
.ladder-card__tier { font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--accent); }
.ladder-card__name { font-weight: 700; font-size: 15px; }
.ladder-card__specs { color: var(--muted); font-size: 12px; }
.ladder-card__fit { font-size: 12px; font-weight: 600; color: var(--muted-2); }
/* «Не тягне» видно окремо: така сходинка з'являється лише коли нічого кращого
   в каталозі немає, і мовчати про це не можна. */
.ladder-card__fit.fit-weak { color: var(--error); }
.ladder-card__fit.fit-ideal { color: var(--ok, var(--accent)); }
.ladder-card__price { margin-top: auto; padding-top: 6px; font-size: 17px; font-weight: 600; font-variant-numeric: tabular-nums; }

/* Ігрові картки з «обкладинкою» */
.scenario-card.cover { padding: 0; gap: 0; overflow: hidden; }
.scenario-card.cover .scenario-card__body { padding: 14px 16px 0; }
.scenario-card.cover .scenario-card__foot { padding: 8px 16px 16px; margin-top: auto; }
.game-cover { position: relative; height: 118px; display: grid; place-items: center; overflow: hidden;
    background: linear-gradient(135deg, var(--c1, #3b82f6), var(--c2, #111827)); }
.game-scene { position: absolute; inset: 0; width: 100%; height: 100%; display: block; z-index: 0; }
.game-cover::before { content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
    background: linear-gradient(180deg, transparent 58%, rgba(0, 0, 0, .26)); }
/* Реальна обкладинка (якщо додано файл у wwwroot/img/games/) перекриває ілюстрацію */
.game-photo { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 2; }

/* ============ 011: кероване зображення й названий порожній стан ============
   Плашка (T007, FR-015, FR-020) — ОДИН вигляд для напрямку, підсценарію й
   збірки. Вона несе НАЗВУ, а не є порожнім прямокутником: порожній прямокутник
   читається як збій завантаження, названий стан — як «ще не набрано» (SC-009). */
.media-plate { display: grid; place-items: center; padding: 10px; text-align: center;
    font-size: 12px; line-height: 1.35; font-weight: 600; color: var(--muted-2); }

/* Обкладинка підсценарію без картинки: акцентного градієнта під плашкою немає —
   він читався б як «тут щось є, просто не видно». */
.game-cover:has(.media-plate) { background: var(--panel-2); }
.game-cover__empty { position: absolute; inset: 0; z-index: 2; }

/* Фото напрямку (T029, FR-010) — велика картка головного екрана, і тільки вона:
   гліф нижче лишається на місці (FR-027). */
.intent-card__shot { position: relative; display: block; width: 100%; align-self: stretch;
    aspect-ratio: 16 / 9; border-radius: 8px; overflow: hidden; background: var(--panel-2); }
.intent-card__img { position: absolute; inset: 0; width: 100%; height: 100%;
    object-fit: cover; display: block; }
.intent-card__empty { position: absolute; inset: 0; }

#blazor-error-ui { position: fixed; bottom: 0; left: 0; width: 100%; z-index: 1000; background: #2a1215; color: #fb7185; border-top: 1px solid var(--error); padding: 12px 20px; display: none; }
#blazor-error-ui .dismiss { cursor: pointer; position: absolute; right: 16px; top: 12px; }

/* ============ Responsive ============
   Kept at the END of the file so these overrides win the cascade
   (media queries add no specificity — earlier @media blocks were being
   clobbered by base rules defined later in the source). */

/* ---- Tablet / small laptop: sidebar collapses above the catalog ---- */
@media (max-width: 1000px) {
    .builder-grid { grid-template-columns: 1fr; }
    /* Рейка перестає бути колонкою збоку: min-width:0 дає їй звузитись до треку.
       Комплектуючі — сітка чипів, що переносяться (паритет із віджетом): смуга
       з горизонтальною прокруткою — жест дотику, і у вузькому ВІКНІ на робочому
       столі вона лишала половину категорій за кадром. Для дотику смуга
       відновлюється правилом (pointer: coarse) нижче. */
    .cat-nav { position: static; min-width: 0; }
    .cat-list {
        display: grid; flex-direction: row;
        grid-template-columns: repeat(auto-fill, minmax(max(150px, calc((100% - 8px) / 2)), 1fr));
        gap: 8px;
    }
    .cat-item { width: auto; min-width: 0; max-width: none; padding: 10px 12px; gap: 10px; }
    .cat-item__name { min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; display: block; }
    .cat-item__sub { display: none; }   /* chips show icon + category only */
    .main-nav, .header-search { display: none; }
    .intent-grid { grid-template-columns: repeat(2, 1fr); }
}

/* Дотик у тій самій ширині: смуга зі свайпом лишається — на планшеті й телефоні
   це рідний жест, і вона не з'їдає екран під дев'ять рядів чипів. Розрізняє не
   ширина (її вже сказав @media вище), а спосіб уведення.
   padding-top: 2px — overflow-x:auto змушує overflow-y обчислитись в auto, тож
   контейнер ріже по вертикалі; без відступу рінг активного чипа зрізається. */
@media (max-width: 1000px) and (hover: none) and (pointer: coarse) {
    .cat-list {
        display: flex; flex-direction: row; flex-wrap: nowrap; overflow-x: auto;
        gap: 8px; padding-top: 2px; padding-bottom: 8px; scrollbar-width: thin;
        -webkit-overflow-scrolling: touch;
    }
    .cat-item { flex-shrink: 0; width: auto; max-width: 240px; padding: 12px 14px; gap: 12px; }
}

/* ---- Phone ---- */
@media (max-width: 620px) {
    .prod-grid { grid-template-columns: 1fr 1fr; }
    /* Паритет із віджетом: обкладинка пропорцією, а не фіксованими 118px — одна
       колонка тут ~370px, і той самий кадр виходив приплюснутим.
       Футер у колонку тут НЕ ставимо: на цьому екрані в ньому не кнопка, а
       короткий підпис «Обрати» (клікабельна вся картка), і рядком він читається
       краще. У віджеті там справжня кнопка — тому розкладка різна свідомо. */
    .game-cover { aspect-ratio: 16 / 9; height: auto; max-height: 120px; }
    .scenario-card__name { overflow-wrap: anywhere; }
    .intent-grid { grid-template-columns: 1fr; }
    .landing__q { font-size: 26px; }
    .landing__sub { font-size: 14px; margin-bottom: 30px; }
    .landing { padding: 32px 16px 64px; }
    .tbtn span.lbl { display: none; }        /* icon-only utility buttons */

    /* Header: the build total is duplicated in the sticky bottom toolbar,
       so drop that pill; the cart shrinks to an icon + count badge. */
    .widget-bar { padding: 12px 14px; gap: 10px; flex-wrap: wrap; }
    .widget-brand { font-size: 15px; }
    .widget-total { display: none; }
    /* Телефон: у крихтах лишаються дім і слеш-ланки, підпис «Поділитися» ховаємо,
       а назву збірки вкорочуємо — вона повністю є в підписі під фото й у шухляді. */
    .crumbs__link .lbl { display: none; }
    .crumbs__here { max-width: 14ch; }
    /* Logo/brand already navigates home, so the extra home icon is redundant here. */
    .home-btn { display: none; }
    .cart-pill { padding: 0 12px; height: 42px; }
    .cart-pill .amt { display: none; }

    /* Catalog controls stack full-width instead of wrapping awkwardly. */
    .container { padding: 0 14px; }
    .catalog { padding: 16px 14px; }
    .catalog__head { flex-direction: column; align-items: stretch; gap: 10px; }
    .catalog__spacer { display: none; }
    .catalog__title { font-size: 19px; }
    .search-box { max-width: none; width: 100%; }
    .sort-select { width: 100%; }

    .scenarios { padding: 20px 14px 84px; }
    .scenario-head h2 { font-size: 22px; }

    /* Overlays use the full width on a phone. */
    .modal-wrap { padding: 12px; }
    .modal-card { max-height: calc(100vh - 24px); }
}

/* ============================================================
   Розширення демо: пресети, білінг, кастомізація, докси, кошик
   ============================================================ */

/* Логотип бренду у шапці / прев'ю */
.brand-logo { height: 30px; width: auto; max-width: 150px; object-fit: contain; border-radius: 6px; display: block; }

/* Закрита модель цін: картка товару без ціни — дії на всю ширину */
.prod-card__foot.no-price .prod-card__actions { width: 100%; }
.prod-card__foot.no-price .btn-select { flex: 1; }

/* Зміна підсумку збірки при заміні компонента (замість ціни компонента) */
.prod-card__delta { font-size: 13px; font-weight: 700; margin-bottom: 8px; font-variant-numeric: tabular-nums; }
/* Ціна в ДС Rozetka завжди червона (--price-discount / --global-red), тож
   подорожчання підсумку — червоним, а не оранжевим «попередженням»:
   оранжевий там комерційний акцент (кнопки акцій), не ціна. */
.prod-card__delta.up { color: var(--price-up); }
.prod-card__delta.down { color: var(--ok); }
.prod-card__delta.same { color: var(--muted); font-weight: 600; font-size: 12px; }

/* --- FPS: три роздільні здатності (FHD / QHD / 4K) --- */
.fps-row { grid-template-columns: repeat(3, 1fr) !important; }
.fps-card .l span { display: block; font-size: 10px; letter-spacing: 1.5px; color: var(--muted-2); margin-top: 2px; }

/* --- Енергоспоживання та тепло (в аналізі) --- */
.power-section { margin-top: 16px; border-top: 1px solid var(--border-soft); padding-top: 14px; }
.power-section__title { display: flex; align-items: center; gap: 8px; font-weight: 700; margin-bottom: 12px; }
/* Плитки енергоспоживання: іконка, підпис, число; нейтральна (запас кулера) —
   тло сторінки й вторинний синій. */
/* NNC-WID-049: чотири плитки — фіксовані стовпці, без стрибків 4 → 3 + 1 на browser zoom; вузько — 2 × 2. */
.power-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; }
@media (max-width: 480px) { .power-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.power-cell { --t: var(--navy); --ts: var(--bg); display: grid; gap: 4px; padding: 12px; border-radius: 12px; background: var(--ts); font-size: 12px; color: var(--muted); min-width: 0; overflow-wrap: anywhere; }
.power-cell .ui-svg { width: 20px; height: 20px; }
.power-cell b { font-size: 18px; color: var(--text); font-variant-numeric: tabular-nums; }
.power-formula { font-size: 12px; color: var(--muted-2); margin: 10px 0 6px; line-height: 1.5; }

/* --- Ігрові пресети на головному екрані --- */
.tiers { max-width: 1100px; margin: 8px auto 0; padding: 0 20px; width: 100%; }
.tiers__head { text-align: center; margin-bottom: 20px; }
.tiers__head h2 { font-size: 24px; }
.tiers__head span { color: var(--muted); font-size: 14px; }
.tiers-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
/* Картка збірки за ДС: 1px black-10, радіус 8, padding 16, у спокої без тіні */
.tier-card { position: relative; background: var(--panel); border: 1px solid var(--border-soft); border-radius: var(--radius); padding: 16px; display: flex; flex-direction: column; gap: 12px; overflow: hidden; color: var(--text); transition: var(--card-transition); }
.tier-pro { border-color: var(--accent); }
.tier-pro::after { content: "Популярний"; position: absolute; top: 14px; right: -34px; transform: rotate(45deg); background: var(--accent); color: #fff; font-size: 10px; font-weight: 800; letter-spacing: 1px; padding: 3px 40px; }
.tier-card__top { display: flex; flex-direction: column; gap: 6px; }
.tier-card__badge { font-size: 20px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; }
.tier-starter .tier-card__badge { color: var(--ok); }
.tier-pro .tier-card__badge { color: var(--accent); }
.tier-ultra .tier-card__badge { color: var(--commerce); }
.tier-education .tier-card__badge { color: var(--accent); }
.tier-office .tier-card__badge { color: var(--muted); }
.tier-home .tier-card__badge { color: var(--warn); }
.tier-card__tagline { color: var(--muted); font-size: 13.5px; min-height: 34px; }
.tier-card__specs { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.tier-card__specs li { display: flex; justify-content: space-between; gap: 12px; font-size: 13.5px; border-bottom: 1px dashed var(--border-soft); padding-bottom: 8px; }
.tier-card__specs li span { color: var(--muted-2); text-transform: uppercase; font-size: 11px; letter-spacing: 1px; padding-top: 2px; }
.tier-card__specs li b { text-align: right; }
.tier-card__foot { margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.tier-card__price { font-size: 13px; color: var(--muted); }
.tier-card__price b { font-size: 18px; color: var(--text); }
.tier-card__foot .btn-select { flex: 0 0 auto; width: auto; padding: 0 16px; height: 40px; }

/* --- Посилання у футері --- */
.footer-links { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; margin: 34px auto 0; padding: 0 20px; }
.footer-links button { display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 16px; border-radius: var(--radius); border: none; background: var(--btn-gray-bg); box-shadow: 0 0 0 1px var(--btn-hairline) inset; color: var(--link); cursor: pointer; font-weight: 500; font-size: 14px; transition: var(--btn-transition); }
.footer-links button:hover { color: var(--link-hover); }

/* --- Кошик: промокод, тоталі, авторизація --- */
.issue-line.ok { background: var(--ok-soft); border: 1px solid color-mix(in srgb, var(--ok) 45%, transparent); color: var(--text); align-items: center; }
.issue-line.ok .ui-svg { color: var(--ok); }
.promo-row { display: flex; gap: 8px; align-items: center; margin: 16px 0 4px; }
.promo-row__ic { color: var(--muted); display: inline-flex; }
.promo-row .text-field { margin-top: 0; }
.promo-row .btn-select { flex: 0 0 auto; width: auto; padding: 0 16px; height: 44px; }
.cart-totals { margin: 14px 0; border-top: 1px solid var(--border-soft); padding-top: 12px; }
.total-row.minor { margin-bottom: 6px; }
.total-row.minor span { font-size: 11px; }
.total-row.minor b { font-size: 15px; font-weight: 700; }
.total-row.minor.discount b { color: var(--ok); }
.cart-auth { background: var(--bg-2); border: 1px solid var(--border-soft); border-radius: 12px; padding: 14px; margin-bottom: 14px; }
.cart-auth__title { display: flex; align-items: center; gap: 8px; font-weight: 700; font-size: 14px; margin-bottom: 10px; }
.cart-auth__fields { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 10px; }
.cart-auth__fields .text-field { margin-top: 0; }
.cart-auth .btn-select { width: 100%; }
/* Перемикач «Створити обліковий запис» / «Увійти в систему» */
.auth-tabs { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; background: var(--panel-2); border: 1px solid var(--border-soft); border-radius: 10px; padding: 4px; margin-bottom: 12px; }
.auth-tabs button { height: 32px; border: 0; border-radius: 7px; background: transparent; color: var(--muted); font: inherit; font-size: 12.5px; font-weight: 700; cursor: pointer; padding: 0 6px; }
.auth-tabs button:hover:not(.on) { color: var(--text); }
.auth-tabs button.on { background: var(--panel); color: var(--accent); box-shadow: var(--shadow); }

/* Форми реєстрації / входу */
.auth-form { display: flex; flex-direction: column; gap: 10px; }
.auth-field { display: block; }
.auth-field > span { display: block; font-size: 12px; color: var(--muted); margin-bottom: 2px; }
.auth-field .text-field { margin-top: 0; }
.auth-form .btn-select { width: 100%; margin-top: 2px; }

.cart-auth__ok { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; color: var(--ok); font-size: 13.5px; }
.cart-auth__ok b { color: var(--text); }
.token-box { margin-top: 10px; }
.token-box summary { cursor: pointer; font-size: 12.5px; color: var(--muted); }
.token-box code { display: block; margin-top: 8px; background: #0f172a; color: #93c5fd; padding: 10px; border-radius: 8px; font-family: ui-monospace, monospace; font-size: 11px; word-break: break-all; line-height: 1.5; }
.cart-hint { font-size: 12.5px; color: var(--muted-2); text-align: center; margin: 8px 0 0; }

/* --- Модалка JSON замовлення --- */
.json-modal { max-width: 640px; }
.json-view { background: #0f172a; color: #e2e8f0; border-radius: 12px; padding: 16px; font-family: ui-monospace, monospace; font-size: 12px; line-height: 1.55; max-height: 46vh; overflow: auto; white-space: pre; margin: 0 0 14px; }
.json-actions { display: flex; gap: 10px; align-items: center; }
.json-actions .tbtn { flex: 0 0 auto; }

@media (max-width: 900px) {
    .tiers-grid { grid-template-columns: 1fr; }
    .cart-auth__fields { grid-template-columns: 1fr; }
}

/* ============ Компактний головний екран (віджет — вміщується в 1 екран) ============ */
.landing--compact { flex: 1 1 auto; display: flex; flex-direction: column; align-items: center; justify-content: center; max-width: 1120px; padding: 18px 20px 22px; }
.landing--compact .kicker { margin-bottom: 0; }
.landing--compact .landing__q { font-size: clamp(21px, 2.6vw, 30px); margin: 12px 0 6px; }
.landing--compact .landing__sub { font-size: 14px; margin: 0 auto 18px; max-width: 560px; }

/* --- Зразок рекламного банера над категоріями --- */
.ad-banner {
    position: relative; width: 100%; margin: 0 0 16px; overflow: hidden; text-align: left;
    border-radius: var(--radius); border: 1px solid var(--border-soft); box-shadow: none;
    min-height: clamp(150px, 19vw, 215px); display: flex;
}
/* Банер-картинка: висоту диктує сам файл, рамка не потрібна — краї в макеті. */
.ad-banner--img { display: block; min-height: 0; border: 0; }
.ad-banner--img img { display: block; width: 100%; height: auto; }
.ad-banner__art { position: absolute; inset: 0; }
.ad-banner__art svg { display: block; width: 100%; height: 100%; }
.ad-banner__copy {
    /* Тло банера рівне й темне, тож затемнення під текстом не потрібне. */
    position: relative; z-index: 1; display: flex; flex-direction: column; align-items: flex-start;
    gap: 7px; padding: 18px 22px; max-width: 560px;
}
.ad-banner__title { font-size: clamp(17px, 2.1vw, 24px); font-weight: 800; color: #fff; line-height: 1.2; }
.ad-banner__text { font-size: 12.5px; line-height: 1.5; color: rgba(228,240,255,.86); }
.ad-banner__cta {
    display: inline-flex; align-items: center; gap: 6px; margin-top: 3px; padding: 7px 14px;
    font-size: 13px; font-weight: 700; color: #fff; border-radius: 10px;
    background: rgba(255,255,255,.17); border: 1px solid rgba(255,255,255,.38);
}

/* Картки-входи (Ігри / Робота / AI + додаткові категорії) — компактні.
   Сітка як у плиток категорій ДС: repeat(auto-fill, minmax(216px, 1fr)), gap 16px. */
.intent-grid--3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; width: 100%; margin-bottom: 18px; }
/* Картки напрямків — вміст по лівому краю, як у решті карток (пресети, каталог):
   центрування лишало їх єдиним центрованим блоком на екрані.
   Заливка — та сама сіра, що під іконкою сценарію (--global-black-5 з ДС).
   Hairline лишається: тло сторінки — той самий black-5, без рамки плитка зникає. */
.landing--compact .intent-card {
    padding: 16px; gap: 10px; align-items: flex-start; text-align: left;
    background: var(--btn-gray-bg);
}
/* Назва сценарію — тією ж типографікою, що назви готових збірок
   (.tier-card__badge у компактній сітці): caps 16/700, той самий трекінг. */
.landing--compact .intent-card__title { font-size: 16px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; }

/* Заголовки секцій лендінга («Сценарії», «Готові ігрові збірки») — справжні h3
   одного рівня, по лівому краю; декоративних ліній обабіч більше немає. */
.landing__section { width: 100%; margin: 4px 0 12px; text-align: left; font-size: 18px; font-weight: 700; line-height: 1.3; color: var(--text); }

/* Пресети Starter / Pro / Ultra — компактні клікабельні картки */
.tiers-grid--compact { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; width: 100%; margin-bottom: 16px; }
.tiers-grid--compact .tier-card { padding: 16px; gap: 10px; text-align: left; align-items: stretch; cursor: pointer; min-height: 0; font: inherit; color: var(--text); appearance: none; }
.tiers-grid--compact .tier-card::after { display: none; }
.tiers-grid--compact .tier-card:hover { border-color: var(--border); box-shadow: var(--shadow-card-hover); }
/* Wrap, а не обрізання: якщо бейдж із драбинкою і ціна не вміщаються в рядок,
   ціна з'їжджає на другий — назву тарифу ховати не можна. */
.tier-card__head { display: flex; align-items: baseline; justify-content: space-between; gap: 4px 10px; flex-wrap: wrap; }
.tiers-grid--compact .tier-card__badge { font-size: 16px; }
/* Ціна за типографікою ДС: підпис black-60 12px, сума 16px medium, табличні цифри */
.tiers-grid--compact .tier-card__price { font-size: 12px; color: var(--muted-2); white-space: nowrap; flex: 0 0 auto; margin-left: auto; }
.tiers-grid--compact .tier-card__price b { font-size: 16px; font-weight: 500; color: var(--text); font-variant-numeric: tabular-nums; }
.tiers-grid--compact .tier-card__specs { font-size: 12px; line-height: 1.4; color: var(--muted-2); }

/* Фото системника на картці: мініатюра зліва, текст справа (дві рядки — head + specs) */
.tiers-grid--compact .tier-card { display: grid; grid-template-columns: 72px minmax(0, 1fr); grid-template-rows: auto auto; column-gap: 14px; row-gap: 6px; align-items: center; }
.tiers-grid--compact .tier-card > .build-shot { grid-row: 1 / span 2; align-self: stretch; }

/* Фото системника: без підложки — фото на білому фоні картки, картинка не
   спотворюється (contain). Рамка й фон лишаються тільки під плашкою «фото готується»,
   інакше вона висіла б у повітрі. */
.build-shot { position: relative; display: grid; place-items: center; overflow: hidden; border-radius: 8px; }
.build-shot:has(.build-shot__empty) { background: var(--panel-2); border: 1px solid var(--border-soft); }
.build-shot__img { width: 100%; height: 100%; object-fit: contain; display: block; }
.build-shot__empty { padding: 8px; text-align: center; font-size: 11px; line-height: 1.3; color: var(--muted-2); }
.build-shot--sm { min-height: 72px; }
.build-shot--sm .build-shot__empty { font-size: 10px; }

/* Блок «вигляд системника» у шухляді складу збірки. Висоту задає співвідношення
   сторін кадру (фото системника вертикальні, ~4:5), а не фікс — інакше з боків
   лишаються порожні поля. */
/* У модалці складу збірки фото не має з'їдати весь перший екран — тримаємо його
   по центру в межах 200px, список комплектуючих має бути видно одразу. */
.build-shot-block { margin: 0 auto 14px; max-width: 200px; }
.build-shot-block .build-shot { aspect-ratio: 4 / 5; max-height: 240px; }
.build-shot-block figcaption { margin-top: 6px; font-size: 12px; color: var(--muted-2); text-align: center; }
/* Той самий блок у рейці категорій на екрані конфігурації — компактніший */
/* На вузькому екрані рейка категорій розтягується на всю ширину — фото тримаємо
   в межах 220px і по центру, інакше кадр тулиться до лівого краю, а підпис — до центру. */
.build-shot-block--nav { margin: 0 auto 12px; max-width: 220px; }
.build-shot-block--nav .build-shot { aspect-ratio: 4 / 5; max-height: 240px; }

/* Службові екрани — мінімальний ряд тільки з іконок, притиснутий до низу сторінки */
.footer-links--mini { gap: 8px; margin: 0 auto; padding: 10px 20px 14px; flex: 0 0 auto; }
.footer-links--mini button {
    position: relative;   /* база для попапа-підказки */
    width: 28px; height: 28px; padding: 0; gap: 0; border-radius: 8px;
    /* Базове .footer-links button — inline-flex без justify-content, тож із
       нульовим padding іконка тулилася б до лівого краю. */
    display: inline-grid; place-items: center;
    color: var(--muted-2); background: transparent; border-color: var(--border-soft);
}
.footer-links--mini button:hover { background: var(--panel); }
.footer-links--mini .ui-svg { font-size: 14px; }

/* Кошик у нижньому ряду: та ж мінікнопка + Badge з ДС (геометрія — у блоці тегів).
   Колір оранжевий: у ДС він зарезервований саме під лічильник кошика. */
.mini-badge {
    position: absolute; top: -5px; right: -5px;
    background: var(--commerce); color: #fff;
}
.footer-links--mini .mini-cart { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 40%, var(--border-soft)); }

/* Підказка до мінікнопки — розкривається вгору (ряд стоїть біля нижнього краю) */
.mini-tip {
    position: absolute; z-index: 40; bottom: calc(100% + 9px); left: 50%;
    display: flex; flex-direction: column; gap: 2px; text-align: center;
    width: max-content; max-width: min(240px, 70vw); padding: 8px 12px;
    border-radius: 10px; background: var(--panel); border: 1px solid var(--border);
    box-shadow: var(--shadow-lg); pointer-events: none;
    font-weight: 400;   /* скидаємо 600, успадковані від кнопки футера */
    opacity: 0; visibility: hidden; transform: translate(-50%, 4px);
    transition: opacity .16s ease, transform .16s ease, visibility .16s;
}
.mini-tip b { font-size: 12.5px; font-weight: 700; color: var(--text); white-space: nowrap; }
.mini-tip i { font-style: normal; font-weight: 400; font-size: 11.5px; line-height: 1.35; color: var(--muted); }
.mini-tip::after {   /* хвостик, що вказує на кнопку */
    content: ""; position: absolute; top: 100%; left: 50%; margin-top: -4px;
    width: 8px; height: 8px; background: var(--panel);
    border-right: 1px solid var(--border); border-bottom: 1px solid var(--border);
    transform: translateX(-50%) rotate(45deg);
}
.footer-links--mini button:hover .mini-tip,
.footer-links--mini button:focus-visible .mini-tip {
    opacity: 1; visibility: visible; transform: translate(-50%, 0);
}

/* ============ Перемикач мови інтерфейсу «UA | EN» ============
 * Сегментований контрол (LangSwitch.razor) — у темній шапці (`WidgetBar`) на кожному
 * екрані, як у віджеті. Лише токени теми, тож лягає і в темну поверхню, і в іменовані
 * теми (rozetka/comfy/foxtrot) без окремих блоків.
 * Селектори подвійні (.lang-switch .lang-switch__btn): вага, якої вистачає проти
 * загальних правил кнопок у шапці й темах. */
.lang-switch {
    display: inline-flex; align-items: center; gap: 2px; flex: 0 0 auto;
    padding: 2px; border-radius: var(--radius);
    border: 1px solid var(--border-soft); background: var(--panel);
}
.lang-switch .lang-switch__btn {
    display: inline-grid; place-items: center;
    width: auto; min-width: 32px; height: 24px; padding: 0 8px; gap: 0;
    border: 0; border-radius: calc(var(--radius) - 2px); box-shadow: none;
    background: transparent; color: var(--muted);
    font: inherit; font-size: 12px; font-weight: 600; letter-spacing: .4px; line-height: 1;
    cursor: pointer; transition: var(--btn-transition);
}
.lang-switch .lang-switch__btn:hover { color: var(--text); background: var(--panel-hover); }
.lang-switch .lang-switch__btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.lang-switch .lang-switch__btn.is-active,
.lang-switch .lang-switch__btn.is-active:hover { background: var(--accent); color: var(--accent-ink); cursor: default; }
/* Темна шапка: ті самі напівпрозорі тони, що в хлібних крихтах поруч. */
.widget-bar .lang-switch { border-color: rgba(255, 255, 255, .22); background: rgba(255, 255, 255, .06); }
.widget-bar .lang-switch .lang-switch__btn { color: rgba(255, 255, 255, .8); }
.widget-bar .lang-switch .lang-switch__btn:hover { color: #fff; background: rgba(255, 255, 255, .12); }
.widget-bar .lang-switch .lang-switch__btn.is-active,
.widget-bar .lang-switch .lang-switch__btn.is-active:hover { background: var(--accent); color: var(--accent-ink); }

@media (max-width: 720px) {
    .intent-grid--3 { grid-template-columns: repeat(2, 1fr); }
    .tiers-grid--compact { grid-template-columns: 1fr; }

    /* Вузький екран: текст банера займає всю ширину */
    .ad-banner__copy { max-width: 100%; }
}

/* ============ Клікабельний логотип ============ */
.widget-bar .widget-brand { cursor: pointer; user-select: none; border-radius: 10px; }
.widget-bar .widget-brand:hover { opacity: .85; }


/* ============ Ієрархія Starter → PRO → Ultra ============ */
/* Кольорових планок і градієнтів немає (у ДС картка рівна) — рівень читається
   з драбинки й кольору бейджа: сірий → фірмовий зелений → комерційний оранж. */
.tier-card__lead { display: inline-flex; align-items: center; gap: 8px; min-width: 0; flex: 0 1 auto; }
.tier-meter { display: inline-flex; gap: 3px; flex: 0 0 auto; }
.tier-meter i { width: 10px; height: 4px; border-radius: var(--radius-sm); background: var(--border); }
/* Заповнені полоски = рівень збірки (задається розміткою, а не класом тиру) */
.tier-meter i.on { background: var(--accent); }

/* Starter — базовий (нейтральний black-60, 1/3) */
.tier-starter .tier-card__badge { color: var(--muted-2); }
.tier-starter .tier-meter i.on { background: var(--muted-2); }

/* PRO — оптимальний (фірмовий зелений, 2/3); рекомендований, тож обводка
   фірмова і в спокої, і на hover */
.tier-pro .tier-card__badge { color: var(--accent); }
.tier-pro .tier-meter i.on { background: var(--accent); }
.tiers-grid--compact .tier-card.tier-pro,
.tiers-grid--compact .tier-card.tier-pro:hover { border-color: var(--accent); }

/* Ultra — максимальний (--global-orange, 3/3) */
.tier-ultra .tier-card__badge { color: var(--commerce); }
.tier-ultra .tier-meter i.on { background: var(--commerce); }

/* Вогник Ultra — той самий оранж, без ореолу й мерехтіння (у ДС рух лише в переходах) */
.tier-flame { display: inline-flex; color: var(--commerce); font-size: 16px; }


/* ============ Темна тема (?theme=dark; екран кастомізації переїхав в адмінку) ============ */
/* =============================================================================
 * ІМЕНОВАНА ТЕМА `rozetka` — ?theme=rozetka (клас .theme-rozetka на app-shell).
 *
 * ⚠️ Блок КОРОТКИЙ, і це головне, що про нього треба знати: дефолтна палітра
 * цього екрана вже розеткова (--accent:#00a046, --text:#221f1f,
 * --border:#d2d2d2, --brand-tint:#e5f5ec, --radius:8px) — екран малювався під
 * їхню сторінку. Тобто перефарбовувати нічого; лишились рівно ті токени, де
 * наш дефолт справді розходиться з їхнім ДС.
 *
 * Вісь усе одно потрібна: у тега `<pc-configurator>` `theme="rozetka"` працює,
 * і без цього класу той самий ?theme=rozetka в <iframe> тихо ігнорувався б.
 *
 * ⚠️ Стоїть ПЕРЕД .app-shell.theme-dark навмисно: класи на одному елементі
 * мають однакову специфічність, тож темна тема перебиває поверхні саме тим, що
 * оголошена нижче. Переставиш після — mode="dark" перестане діяти під
 * іменованою темою.
 *
 * --warn НЕ перевизначається: у їхньому ДС це #ffa900, а на білому тлі такий
 * текст не дає 4.5:1 — наш #a05a00 узятий саме для контрасту. Приводити колір
 * до специфікації ціною доступності тут не варто.
 * ========================================================================= */

.app-shell.theme-rozetka {
    --bg: #ffffff;          /* плоский білий замість нашого #f5f5f5 */
    --bg-2: #f5f5f5;
    --panel-2: #f5f5f5;
    --panel-hover: #f4faf6; /* зеленуватий hover замість нейтрального */
    --ok-soft: #e5f5ec;     /* непрозорий тінт, як у ДС */
    --error-soft: #ffeced;
}

/* =============================================================================
 * ІМЕНОВАНА ТЕМА `comfy` — ?theme=comfy (клас .theme-comfy на app-shell).
 *
 * ⚠️ Цей блок ДОВГИЙ, на відміну від розеткового вище, і це не непослідовність:
 * дефолтна палітра екрана вже розеткова, тож там перефарбовувати було нічого.
 * Comfy розходиться з нею майже в усьому — зелений світліший і жовтіший, hover
 * темніший (а не світліший), посилання сині, ціна червона тільки коли акційна,
 * шрифт Inter, і радіус не одне значення, а драбина 8px / 20px / пігулка.
 *
 * Значення зняті з живої сторінки comfy.ua (їхні `:root`-токени `--primary`,
 * `--color-*`), тобто це той самий словник, що в `.pcc-t-comfy` у
 * `Widget/src/ui/widget.css` — однакове `theme="comfy"` по обидва боки має
 * давати однаковий тон, а не два різні Comfy.
 *
 * ⚠️ Стоїть ПЕРЕД .app-shell.theme-dark навмисно: класи на одному елементі
 * мають однакову специфічність, тож темна тема перебиває поверхні саме тим, що
 * оголошена нижче. Переставиш після — mode="dark" перестане діяти під цією
 * темою.
 *
 * --header-bg НЕ їхній: шапка Comfy біла з чорним текстом, а вміст .widget-bar
 * тут onDark за побудовою (крихти й «Поділитися» хардкодять #fff і
 * rgba(255,255,255,…)). Перефарбувати їх — це правка структури екрана, а не
 * теми, тож шапка бере їхній же чорний (--items-black-bg / --color-black, ним
 * у них залитий активний перемикач). Зелена шапка тут не варіант окремо: білий
 * текст на #2abd13 дає 2.5:1.
 * ========================================================================= */

.app-shell.theme-comfy {
    /* Inter Variable — їхній єдиний текстовий шрифт. Оголошення фейса тут немає
       свідомо: екран не тягне зовнішній CDN, а Inter майже завжди є системно;
       де немає — падає на system-ui, який до нього близький. */
    font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, Helvetica, sans-serif;

    /* Поверхні: на десктопі сторінка в них плоско біла, а #f2f2f2
       (--color-light-gray) — друга поверхня (нейтральні кнопки, поля фільтра),
       не фон сторінки. */
    --bg: #ffffff;
    --bg-2: #f2f2f2;
    --panel: #ffffff;
    --panel-2: #f2f2f2;
    --panel-hover: #edf8e1;    /* --color-very-light-green */
    --border: #e0e0e0;         /* --color-alto */
    --border-soft: #e5e5e5;    /* --color-border-color */

    /* Текст чистий чорний (--color-text), не «майже чорний» #221f1f Rozetka. */
    --text: #000000;
    --muted: #313131;          /* --color-light-black: назви товарів */
    --muted-2: #666666;        /* --color-middle-gray #999 давав 2.85:1 — WCAG 1.4.3: текст стану мусить давати 4.5:1 на білому (зустріч 23.09.2026, «доступність кольорів в аналізі збірки»). */

    /* Дві зелені, і вони не взаємозамінні: --primary — дії, --color-green —
       фірмова смуга, кнопка «Каталог» і обводка пошуку. Hover ТЕМНІШИЙ
       (--color-dark-green), протилежно до Rozetka. */
    --accent: #43b02a;
    --accent-2: #2abd13;
    --accent-ink: #ffffff;
    --accent-glow: rgba(67, 176, 42, .20);

    /* Посилання й secondary-кнопка — їхній синій --color-blue. */
    --link: #0b6ac1;
    --link-hover: #2b98f0;
    --navy: #0b6ac1;
    --navy-hover: #2b98f0;

    --btn-gray-bg: #f2f2f2;    /* їхня нейтральна кнопка «Показати ще» */
    --btn-hairline: #e5e5e5;
    --btn-disabled-bg: #f0f0f0;    /* --color-gallery */
    --btn-disabled-ink: #999999;

    --header-bg: #000000;      /* див. примітку в шапці блоку */
    --header-ink: #ffffff;

    /* Стан «добре» — не їхній --primary (2.81:1): ним фарбуються числа й галочки. */
    --ok: #2c7a1b;
    --ok-soft: #edf8e1;
    /* Їхній жовтий (--warning #f2c037) як текст на білому не дає 4.5:1, тож
       беремо їхню ж читабельну пару: ink --color-warning-btn, тінт
       --color-warning-tertiary, на тон темніше (#9e7100 давав 4.36:1).
       Той самий компроміс, що в дефолтному --warn. */
    --warn: #8a6200;
    --warn-soft: #fffcf0;
    --error: #d92d20;          /* --color-red3 #f04438 давав 3.76:1 — WCAG 1.4.3: текст стану мусить давати 4.5:1 на білому (зустріч 23.09.2026, «доступність кольорів в аналізі збірки»). */
    --error-soft: #fdd9d7;     /* --color-red-light */
    --price-up: #f04438;
    --commerce: #fc5e0f;       /* --color-orange */
    --brand-tint: #edf8e1;

    /* Тіні розсіяні й без зсуву — напрямлених у їхніх правилах немає жодної
       (hover плитки в них узагалі filter: drop-shadow(0 0 4px)). */
    --shadow: 0 0 8px rgba(0, 0, 0, .12);
    --shadow-lg: 0 0 15px rgba(0, 0, 0, .20);
    --shadow-card-hover: 0 0 8px rgba(0, 0, 0, .28);
    --shadow-tile-hover: 0 0 8px rgba(0, 0, 0, .20);

    /* Драбина радіусів. --radius тут один на картки й на кнопки, і 20px влучає
       в обидві цілі: плитка Comfy — рівно 20px, а на кнопці висотою 40px той
       самий радіус і є пігулкою, якою в них головна дія й намальована
       (border-radius: 56px на кнопці 56px заввишки). --radius-sm піднятий з 4
       до 8 — це їхня сходинка дрібного контрола. */
    --radius: 20px;
    --radius-sm: 8px;
    --radius-pill: 50px;

    --promo-discount: #f04438;
    --promo-top: #f2c037;      /* --warning: у них ним залиті акційні плашки */

    /* Переходи їхні: кнопки .3s на фарбі, картки .18s. */
    --btn-transition: background-color .3s, color .3s, border-color .3s;
    --card-transition: box-shadow .18s, border-color .18s, background-color .18s, color .18s;
}

/* Поле пошуку й сортування — ЄДИНІ контроли, які виламуються з пігулки, і це
   їхнє власне рішення: рядок пошуку в шапці Comfy має радіус 8px і обводку 2px
   фірмовим зеленим (він склеєний з кнопкою «Знайти»), поля фільтра — теж
   дрібний радіус. Під пігулкою поле читалось би як ще одна кнопка. */
.app-shell.theme-comfy .search-box input,
.app-shell.theme-comfy .sort-select {
    border-radius: 8px;
}

.app-shell.theme-comfy .search-box input {
    border: 2px solid var(--accent-2);
}

/* Головна дія в них важча за нашу: 700 замість 500. */
.app-shell.theme-comfy .btn-cta,
.app-shell.theme-comfy .btn-select,
.app-shell.theme-comfy .tbtn {
    font-weight: 700;
}

/* Ціна — головний типографічний акцент системи: 24px/800 (у картці товару 34px).
   Чорна, бо «від X грн» у драбині пресетів — не акція; червоною вона в них лише
   коли акційна. */
.app-shell.theme-comfy .tier-card__price b {
    font-size: 24px;
    font-weight: 800;
    line-height: 30px;
    color: var(--text);
}

/* Назва пресета — стиль назви товару в їхній плитці (14/20, звичайна насиченість,
   без капслока), а не наш 20px/700 uppercase: капслоку на назві товару їхня
   система не має ніде. Індикатор рівня біля назви прибраний із тієї ж причини:
   у їхній плитці поряд із заголовком нічого не висить.
   ⚠️ Ті самі два правила є в `.pcc-t-comfy` (widget.css) — інакше та сама тема
   давала б різні картки в тегу й на екрані, а це рівно та розбіжність, задля
   якої словник токенів і зроблений спільним. */
.app-shell.theme-comfy .tier-card__badge {
    font-size: 14px;
    font-weight: 400;
    line-height: 20px;
    letter-spacing: normal;
    text-transform: none;
    color: var(--muted);
}

.app-shell.theme-comfy .tier-meter,
.app-shell.theme-comfy .tier-flame {
    display: none;
}

/* --- Напрямок як плитка-ярлик категорії Comfy ------------------------------
 * Дзеркало блоку `.pcc-t-comfy .intent-card` у `Widget/src/ui/widget.css` —
 * причини кожного значення описані там, тут лише ті самі числа: їхня
 * `.catalog-list__item` — 80px заввишки, радіус 12, `padding: 0 0 0 16px`,
 * `space-between`, підпис 14/21 ліворуч, картинка 70×80 праворуч і впритул.
 *
 * ⚠️ Дзеркалиться свідомо: однакове `theme="comfy"` по обидва боки має давати
 * однаковий вигляд. Тема `foxtrot` цього для плитки напрямку НЕ робить (там
 * розкладка живе лише у віджеті) — розбіжність відома, але множити її не буду.
 */
/* Напрямки — драбина 3 / 2 / 1, а не «скільки влізе»: фіксовані стовпці
   прибирають сироту, яку давав `auto-fill`, щойно ширина не поділиться націло.
   Той самий прийом, що в `.app-shell.theme-foxtrot`.
   ⚠️ Верхня сходинка — ТРИ, і сюди вона прийшла з шести (рішення власника,
   23.09.2026). Шість технічно влазили — сітка тут упирається в 1080px, і це було
   шість плиток по 167px, — але такий щільний ряд ярликів на цьому екрані не
   потрібен. Разом із шісткою знятий і поріг «6 → 3» (був 1040px): три стовпці
   тепер базові.
   ⚠️ Медіазапити стоять тут, поруч із базовим правилом, а не в адаптивній секції
   в кінці файла: специфічність (0,3,0) у них однакова, тож вирішує порядок. */
.app-shell.theme-comfy .intent-grid {
    grid-template-columns: repeat(3, 1fr);
    gap: 16px;
}

@media (max-width: 600px) {
    .app-shell.theme-comfy .intent-grid { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 420px) {
    .app-shell.theme-comfy .intent-grid { grid-template-columns: 1fr; }
}

/* Готові збірки — від чотирьох у ряд. Дзеркало `.pcc-t-comfy .tiers-grid` у
   widget.css, причини й арифметика описані там. Базове правило екрана дає рівно
   три (`repeat(3, 1fr)`), тож тема переходить на `auto-fill` із підлогою 230px:
   на сітці 1080px це чотири по 258px, а на ширшій поверхні — більше. */
.app-shell.theme-comfy .tiers-grid {
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
}

/* Картка збірки без рамки в усіх станах: у них товарна плитка теж без неї
   (`border: 0px none`, заміряно), а відділяє її проміжок сітки й розсіяна тінь
   на hover. Знімається КОЛЬОРОМ, не `border: 0` — ширина лишається в розкладці,
   тож стан, який рамку повертає, не зсуває сусідів. Дзеркало
   `.pcc-t-comfy .tier-card` у widget.css. */
.app-shell.theme-comfy .tier-card,
.app-shell.theme-comfy .tier-card:hover,
.app-shell.theme-comfy .tier-card.tier-pro,
.app-shell.theme-comfy .tier-card.tier-pro:hover {
    border-color: transparent;
}

.app-shell.theme-comfy .intent-card {
    /* Фіолетовий — дефолт: у їхньому циклі він стоїть на трьох позиціях із восьми. */
    --int-tint: 135, 80, 255;
    --int-tint-a: .102;
    --int-tint-a-hover: .227;

    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    gap: 0;
    height: 80px;
    padding: 0 16px;
    border: 0;
    border-radius: 12px;
    text-align: left;
    background: rgba(var(--int-tint), var(--int-tint-a));
    transition: background .3s ease-in-out;
}

/* Підпис — увесь вміст плитки (кадр прихований нижче). Дрібні eyebrow-підписи (11px із розрядкою)
   тема НЕ чіпає: це наш патерн, а не заявка на бренд партнера. */
.app-shell.theme-comfy .intent-card__title,
.app-shell.theme-comfy .landing--compact .intent-card__title {
    flex: 1 1 auto;
    min-width: 0;
    font-size: 14px;
    font-weight: 400;
    line-height: 21px;
    letter-spacing: normal;
    text-transform: none;
    color: var(--muted);
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* Кадр на цій темі не показуємо (причина — у блоці `.pcc-t-comfy` в widget.css):
   слот у них портретний під вирізані товари, а в нас у полі широкі фотобанери з
   CMS. Разом із кадром іде й плашка з назвою, яка в ньому живе при порожньому
   полі, — інакше назва стояла б у плитці двічі. Кероване зображення лишається на
   дефолтній темі, `rozetka` і `foxtrot`, де слот 16:9. */
.app-shell.theme-comfy .intent-card__shot { display: none; }

/* Hover — рівно їхній: те саме тло густіше (.102 → .227) із переходом .3s.
   ⚠️ Тінь, рамку І ЗЕЛЕНЬ глушимо: базове правило фарбує на hover підпис
   (`.intent-card:hover .intent-card__title`) акцентом. Не додати свого зеленого — недостатньо, треба перекрити чужий;
   доти зелень лишалася, бо блок перевизначав лише тло. Значення нижче ті самі,
   що в спокої, тобто правила глушать, а не перефарбовують. */
.app-shell.theme-comfy .intent-card:hover {
    background: rgba(var(--int-tint), var(--int-tint-a-hover));
    box-shadow: none;
    border-color: transparent;
}

.app-shell.theme-comfy .intent-card:hover .intent-card__title { color: var(--muted); }

/* Цикл їхній: ВІСІМ позицій на шість відтінків, де `8n+3`, `8n+6` і `8n+7`
   діляться фіолетовим — тому правила мають лише позиції, що від нього відходять.
   Насичений тон під малою alpha, тож ті самі рядки працюють і на темній поверхні. */
.app-shell.theme-comfy .intent-card:nth-child(8n + 1) {
    --int-tint: 80, 138, 255;
    /* Синій густішає слабше за решту — їхнє значення, не описка. */
    --int-tint-a-hover: .165;
}
.app-shell.theme-comfy .intent-card:nth-child(8n + 2) { --int-tint: 194, 80, 255; }
.app-shell.theme-comfy .intent-card:nth-child(8n + 4) { --int-tint: 255, 194, 80; }
.app-shell.theme-comfy .intent-card:nth-child(8n + 5) { --int-tint: 80, 220, 255; }
.app-shell.theme-comfy .intent-card:nth-child(8n + 8) { --int-tint: 80, 255, 176; }

/* =============================================================================
 * ІМЕНОВАНА ТЕМА `foxtrot` — ?theme=foxtrot (клас .theme-foxtrot на app-shell).
 *
 * Значення зняті з живої категорійної сторінки
 * https://www.foxtrot.com.ua/uk/shop/personalnye_kompyutery_gejmerskije.html —
 * з computed-стилів їхніх власних правил, бо :root-токенів вони не оголошують.
 * Це той самий словник, що в `.pcc-t-foxtrot` у `Widget/src/ui/widget.css`:
 * однакове `theme="foxtrot"` по обидва боки має давати однаковий тон.
 *
 * ⚠️ Головна відмінність від двох наявних тем — ФОН. Rozetka й Comfy плоско
 * білі, а тут сторінка сіра (#f7f8fb), а картки білі. Тому цей блок обов'язково
 * перевизначає і --bg, і --panel: узяти лише акцент означало б білі картки на
 * білому.
 *
 * Друга — драбина радіусів ЗВОРОТНА до комфівської: плитка 4px, дія 16px.
 *
 * ⚠️ Стоїть ПЕРЕД .app-shell.theme-dark навмисно: класи на одному елементі
 * мають однакову специфічність, тож темна тема перебиває поверхні саме тим, що
 * оголошена нижче.
 *
 * --header-bg НЕ їхній (шапка Foxtrot біла з чорним текстом): вміст .widget-bar
 * тут onDark за побудовою — крихти й «Поділитися» хардкодять #fff. Та сама
 * причина й те саме рішення, що в темі `comfy`: шапка бере їхнє чорнило.
 * ========================================================================= */

.app-shell.theme-foxtrot {
    /* Foxtrot — їхній власний шрифт. Оголошення фейса тут немає свідомо: екран
       не тягне зовнішній CDN, а поза їхнім сайтом цього фейса не існує, тож
       падаємо на system-ui. Ім'я лишається, щоб на їхній сторінці (де фейс
       оголошений документом) підхопився саме він. */
    font-family: 'Foxtrot', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, Helvetica, sans-serif;

    /* Сіра сторінка, білі картки — див. примітку в шапці блоку. */
    --bg: #f7f8fb;
    --bg-2: #f6f6f6;
    --panel: #ffffff;
    --panel-2: #f6f6f6;
    --panel-hover: #fff7f0;    /* оранжевий тінт замість нейтрального */
    --border: #e5e4e4;
    --border-soft: #efefef;

    /* Чорнило #0c061a — ним підписані назви товарів і ціни. */
    --text: #0c061a;
    --muted: #666666;
    --muted-2: #6e6e6e;        /* #888 давав 3.54:1 — WCAG 1.4.3 (зустріч 23.09.2026) */

    /* Оранж — єдиний колір дії в системі. hover СВІТЛІШИЙ (#fc5b20),
       :active темніший (#db411b) — обидва з їхніх власних правил. */
    --accent: #e95d2a;
    --accent-2: #fc5b20;
    --accent-ink: #ffffff;
    --accent-glow: rgba(233, 93, 42, .20);

    /* Посилання в них теж оранжеві — окремого «кольору посилання» немає.
       Другорядна брендована дія — фіолетовий рейтингу/лояльності. */
    --link: #e95d2a;
    --link-hover: #fc5b20;
    --navy: #825dc7;
    --navy-hover: #9a7bd6;

    --btn-gray-bg: #f2f2f2;    /* їхні нейтральні чипи фільтра */
    --btn-hairline: #efefef;
    --btn-disabled-bg: #ffffff;
    --btn-disabled-ink: #666666;   /* їхня .btn-disabled: біла з сірим текстом */

    --header-bg: #0c061a;      /* див. примітку в шапці блоку */
    --header-ink: #ffffff;

    --ok: #126d38;
    --ok-soft: #ecf7ec;
    /* Їхній жовтий #ffa900 як текст на білому не дає 4.5:1, тож беремо їхню ж
       читабельну пару з тієї самої гами: ink #632204, тінт #fff7f0. Той самий
       компроміс, що в дефолтному --warn і в темі `comfy`. */
    --warn: #632204;
    --warn-soft: #fff7f0;
    /* Окремої червоної в системі немає — найтривожніше в ній це :active
       головної дії, на тон темніше: сам #db411b давав 4.39:1 (WCAG 1.4.3). */
    --error: #c93a17;
    --error-soft: #ffeae1;
    --price-up: #db411b;
    --commerce: #fc5b20;       /* гарячий оранж плашки знижки */
    --brand-tint: #fff7f0;

    /* Тіні тоновані їхнім чорнилом і дуже слабкі: 0 1px 6px/.05 на шапці,
       0 0 20px/.10 на hover плитки. */
    --shadow: 0 1px 6px rgba(12, 6, 25, .05);
    --shadow-lg: 0 0 20px rgba(12, 6, 25, .14);
    --shadow-card-hover: 0 0 20px rgba(12, 6, 25, .10);
    --shadow-tile-hover: 0 0 20px rgba(12, 6, 25, .10);

    /* Драбина радіусів, зворотна до комфівської: плитка майже квадратна,
       а дія — 16px. --radius один на картки й кнопки, тож він тут 12px
       (сходинка блоків), а плитка й дрібне беруть --radius-sm. */
    --radius: 12px;
    --radius-sm: 4px;
    --radius-pill: 500px;

    --promo-discount: #fc5b20;
    --promo-top: #f3e500;      /* їхня жовта плашка знижки */

    /* Переходи їхні: кнопки .3s ease-in-out, картки .18s. */
    --btn-transition: background-color .3s ease-in-out, color .3s ease-in-out, border-color .3s ease-in-out;
    --card-transition: box-shadow .18s, border-color .18s, background-color .18s, color .18s;
}

/* Кнопки й поля — 16px, це їхня сходинка дії (кнопка «Купити», рядок пошуку),
   а не 12px блоків. Обводка поля нейтральна: кольорових обводок у полях їхня
   система не має — оранж лишається кольором дії. */
.app-shell.theme-foxtrot .btn-cta,
.app-shell.theme-foxtrot .btn-select,
.app-shell.theme-foxtrot .tbtn,
.app-shell.theme-foxtrot .search-box input,
.app-shell.theme-foxtrot .sort-select {
    border-radius: 16px;
}

.app-shell.theme-foxtrot .search-box input,
.app-shell.theme-foxtrot .sort-select {
    border-color: #cecece;
}

/* Плитка напрямку («Сценарії») — без обводки. Тло в неї вже біле (`--panel`),
   тож тут, на відміну від віджета, міняти треба лише рамку.
   ⚠️ Те саме правило є в `.pcc-t-foxtrot` (widget.css). */
.app-shell.theme-foxtrot .intent-card,
.app-shell.theme-foxtrot .intent-card:hover {
    background: var(--panel);
    border-color: transparent;
}

/* --- Плитки БЕЗ обводки ---------------------------------------------------
   У Foxtrot товарна плитка рамки не має взагалі (`border: 0px none` на їхній
   `.product-card`): від сірої сторінки її відділяє біле тло, а на hover —
   розсіяна тінь. Це працює саме тому, що сторінка сіра; у Rozetka й Comfy на
   плоско білому тлі без обводки картка зникла б, і там вона лишається.

   ⚠️ Рамка знімається КОЛЬОРОМ (`transparent`), а не `border: 0`: ширина
   лишається в розкладці, тож обрана позиція (`.selected`, яка малює обводку
   акцентом) не стрибає на 2px і не зсуває сусідів у сітці.

   ⚠️ Ті самі правила є в `.pcc-t-foxtrot` (widget.css) — інакше та сама тема
   давала б картки з рамкою на екрані й без рамки в тегу. */
.app-shell.theme-foxtrot .prod-card,
.app-shell.theme-foxtrot .prod-card:hover,
.app-shell.theme-foxtrot .tier-card,
.app-shell.theme-foxtrot .tier-card:hover,
.app-shell.theme-foxtrot .tiers-grid--compact .tier-card:hover,
.app-shell.theme-foxtrot .tier-pro {
    border-color: transparent;
}

/* Hover без зсуву — у їхніх правилах прямо `transform: unset` плюс тінь. */
.app-shell.theme-foxtrot .prod-card:hover {
    transform: none;
    box-shadow: var(--shadow-card-hover);
}

/* ⚠️ Обрана й несумісна позиції обводку ЗБЕРІГАЮТЬ: це стан вибору, а не
   оздоблення. У їхній системі такого стану немає взагалі — у каталозі нічого
   не «обирають», — тож і взяти його звідти нема звідки. */
.app-shell.theme-foxtrot .prod-card.selected,
.app-shell.theme-foxtrot .prod-card.selected:hover {
    border-color: var(--accent);
}

.app-shell.theme-foxtrot .prod-card.incompatible:hover {
    border-color: var(--error);
}

/* Плашка «Популярний» на рекомендованій збірці лишається — вона не рамка. */

/* Банер лендінга — прибраний: це наш власний рекламний макет, і на сторінці
   мережі він читається як чужий банер усередині їхньої категорії. ⚠️ Те саме
   правило є в `.pcc-t-foxtrot` (widget.css) — інакше банер зник би в тегу й
   лишився б в <iframe>. */
.app-shell.theme-foxtrot .ad-banner {
    display: none;
}

/* Ціна — 18px/700 чорнилом. ⚠️ Скромніше за комфівські 24/800 навмисно:
   головний акцент плитки в Foxtrot — оранжева кнопка, а не число. */
.app-shell.theme-foxtrot .tier-card__price b {
    font-size: 18px;
    font-weight: 700;
    line-height: 24px;
    color: var(--text);
}

/* Назва пресета — стиль назви товару в їхній плитці (14/18/500, без капслока),
   а не наш 20px/700 uppercase. Індикатор рівня прибраний із тієї ж причини:
   у їхній плитці поряд із заголовком нічого не висить.
   ⚠️ Ті самі правила є в `.pcc-t-foxtrot` (widget.css) — інакше та сама тема
   давала б різні картки в тегу й на екрані. */
.app-shell.theme-foxtrot .tier-card__badge {
    font-size: 14px;
    font-weight: 500;
    line-height: 18px;
    letter-spacing: normal;
    text-transform: none;
    color: var(--text);
}

.app-shell.theme-foxtrot .tier-meter,
.app-shell.theme-foxtrot .tier-flame {
    display: none;
}

/* --- Плитка напрямку як промо-плитка Foxtrot -------------------------------
   Розкладка їхніх «Актуальних пропозицій»: кольорове поле з діагональним білим
   клином, важкий капслок ліворуч, товар фотографією праворуч, радіус 15px
   (реальне значення їхньої `.r-img`).

   ⚠️ Сама плитка в них — РАСТРОВИЙ БАНЕР (`SpecialOffersNew/*.jpg|png`,
   намальований дизайнером), а не компонент: ні діагоналі, ні капслока, ні
   палітри в їхньому CSS немає. Скопійована ФОРМА; кольори — з тих їхніх
   токенів, які ми справді зняли зі сторінки (акцент, фіолетовий рейтингу,
   жовтий плашки знижки), висвітлених до пастелі.

   ⚠️ Колір нічого не значить і циклиться за позицією: напрямки заводить
   менеджер, їх може бути скільки завгодно.

   ⚠️ Селектор навмисно БЕЗ `:not(.landing--compact)`: на цьому екрані лендінг
   рівно один і він завжди `landing landing--compact` (LandingScreen.razor) —
   тобто «компактний» тут не варіант поруч зі звичайним, а сам екран. Спроба
   вивести його з-під теми лишає правила без жодного споживача.

   ⚠️ Ті самі правила є в `.pcc-t-foxtrot` (widget.css). */
.app-shell.theme-foxtrot .landing .intent-card {
    /* Кадр зверху, підпис під ним — розкладка на прохання власника (21.09.2026).
       Доти фото лежало тлом на всю картку, а назва — на діагональному клині
       поверх нього. Тепер це звичайна картка з кадром і підвалом: `padding: 0`,
       бо кадр іде від краю до краю, `gap: 0`, бо верхній відступ підвалу вже
       дає власний відступ підпису, і без `min-height` — висоту задає кадр
       сталою пропорцією плюс сам підпис.
       ⚠️ Кольору тут НЕМАЄ — ні поля, ні смуги (рішення власника, 21.09.2026):
       картка біла, а вирізняє її на сірій сторінці те саме, що й товарну
       плитку — біле тло плюс тінь на hover. Банерний цикл із п'яти барв
       прибраний разом зі змінними, щоб не лишати мертвої палітри. */
    /* Кадр зверху, назва під ним. Гліфа біля назви більше немає (поле «Іконка»
       прибране, рішення власника 29.09.2026), тож колонка одна.
       ⚠️ Те саме є в `.pcc-t-foxtrot` (widget.css). */
    display: grid;
    grid-template-columns: 1fr;
    align-items: center;
    padding: 0 0 14px;
    border-radius: 20px;
    text-align: left;
    gap: 0;

    /* ⚠️ Рамки тут НУЛЬ, а не «прозора»: у плитки напрямку немає стану, який
       рамку повертав би кольором, тримати ширину нічого, а прозора рамка під
       фоном — це рівно та смужка, у якій заводяться волосини. */
    border: 0;
    background: var(--panel);
    overflow: hidden;
}

/* ⚠️ Діагонального клина (`::before` + `clip-path`) тут БІЛЬШЕ НЕМАЄ: він мав
   сенс, поки фото лежало тлом на всю картку. За новою розкладкою підпис живе
   під кадром, і клин перекривав би фото ні за чим. Урок на майбутнє: той самий
   колір ГРАДІЄНТОМ у фоні давав кольорові волосини по краях (жорсткий стоп
   усередині одного зображення згладжується субпіксельно) — знадобиться
   діагональ знову, робити її окремим шаром із `clip-path`. */

/* Заголовок секції — їхня пара 18/28 середньою насиченістю (h1 категорії й h2
   секцій у них саме такі), а не наші 18/700: інакше на сторінці мережі два
   рівні тих самих 18px сперечаються між собою. */
.app-shell.theme-foxtrot .landing__section {
    font-size: 18px;
    font-weight: 500;
    line-height: 28px;
}

/* Палітра ЗАГЛУШКИ — лише для напрямків без фото (правила нижче).
   ⚠️ ЗВІДКИ КОЛЬОРИ: п'ять полів їхнього ряду «Актуальні пропозиції» (бузкове
   «Ноутбуки», оранжеве «Новинки», блакитне «Товар дня», коралове «Залишайся в
   мережі», жовте «Смарт-гаджети») — зняті з банерів, бо в CSS сторінки цієї
   палітри немає.
   ⚠️ Раніше вона заливала ВСЮ картку й була прибрана на прохання власника;
   повернулась у вужчій ролі — як заміна фотографії, а не оздоблення плитки.
   ⚠️ Барви ПРИГЛУШЕНІ (21.09.2026): банерні значення, розбілені на 55% і 72% —
   заглушка не має кричати поряд із фотографіями сусідів. Спокій — світліший із
   72%, hover — щільніший із 55% (стани переставлені місцями на прохання
   власника). Тобто hover тут ТЕМНІШАЄ, тоді як у системі Фокстрота hover
   головної дії світлішає, а темніше — `:active`: відгук на курсор при
   світлішанні з 72% просто не читався б.
   ⚠️ Колір нічого не значить і циклиться за позицією.
   ⚠️ Ті самі значення є в `.pcc-t-foxtrot` (widget.css). */
.app-shell.theme-foxtrot .landing .intent-card {
    --plate: #f0ebf9;
    --plate-hover: #e7def6;
}

.app-shell.theme-foxtrot .landing .intent-card:nth-child(5n + 2) {
    --plate: #fbe5cd;
    --plate-hover: #f8d5af;
}

.app-shell.theme-foxtrot .landing .intent-card:nth-child(5n + 3) {
    --plate: #ecf5fb;
    --plate-hover: #e1eff8;
}

.app-shell.theme-foxtrot .landing .intent-card:nth-child(5n + 4) {
    --plate: #fad6da;
    --plate-hover: #f6bcc3;
}

.app-shell.theme-foxtrot .landing .intent-card:nth-child(5n + 5) {
    --plate: #fcface;
    --plate-hover: #faf7b0;
}

/* Кадр — зверху, на всю ширину, у звичайному потоці. Пропорція 16:9, бо висота
   картки тепер = кадр + підпис: без сталої пропорції сусідні плитки розійшлися
   б за розміром кадру, підписи ж різної довжини. ⚠️ `cover` лишається — у полі
   `Intents.ImageUrl` широкі фотосцени (1.76–2.49), і `contain` дав би поля
   обабіч; кадрується верх/низ сцени, а не лівий край, як було під клином. */
.app-shell.theme-foxtrot .landing .intent-card__shot {
    position: relative;
    z-index: 0;
    inset: auto;
    grid-area: 1 / 1 / 2 / -1;
    width: 100%;
    height: auto;
    aspect-ratio: 16 / 9;
    border-radius: 0;
    background: transparent;
}

.app-shell.theme-foxtrot .landing .intent-card__img {
    object-fit: cover;
    object-position: center;
}

/* Назва — важкий капслок під кадром. */
.app-shell.theme-foxtrot .landing .intent-card__title {
    margin: 12px 16px 0;
    max-width: none;
    font-size: 20px;
    font-weight: 800;
    line-height: 1.1;
    letter-spacing: 0;
    text-transform: uppercase;
    color: var(--text);
}

/* --- Напрямок БЕЗ фото: кольорова заглушка ---------------------------------
   Кадр заливається приглушеною барвою циклу. Водяного гліфа більше немає —
   разом із полем «Іконка» (рішення власника, 29.09.2026).
   ⚠️ Спрацьовує там, де показується плашка `ManagedImage` → `MediaPlate`:
   порожній `Intents.ImageUrl` АБО картинка не завантажилась.
   ⚠️ Ті самі правила є в `.pcc-t-foxtrot` (widget.css). */
.app-shell.theme-foxtrot .landing .intent-card:has(.intent-card__empty) .intent-card__shot {
    background: var(--plate);
    transition: background-color .18s;
}

.app-shell.theme-foxtrot .landing .intent-card:has(.intent-card__empty):hover .intent-card__shot {
    background: var(--plate-hover);
}

/* Текст плашки гаситься: повторює назву, що стоїть підписом під кадром. */
.app-shell.theme-foxtrot .landing .intent-card:has(.intent-card__empty) .intent-card__empty {
    display: none;
}

/* Hover не чіпає КОЛІР підпису. ⚠️ Те саме правило є в `.pcc-t-foxtrot`
   (widget.css). Назва лежить на банерному полі, і чорнило тримає на
   ньому 4.7–16:1 в обох станах; акцентний читався б як оранж на оранжі, а
   білий вимагав би темного поля — тобто підміни самої банерної барви. */
.app-shell.theme-foxtrot .landing .intent-card:hover .intent-card__title {
    color: var(--text);
}


/* =============================================================================
 * ІМЕНОВАНА ТЕМА `citrus` — ?theme=citrus (клас .theme-citrus на app-shell).
 *
 * Значення зняті з https://citrus.ua/personalni-kompyuteri/ (05.10.2026) — з
 * їхніх `:root`-токенів (`--color-orange`, `--color-black-text`,
 * `--shadow-*dp`) і computed-стилів плитки й кнопок. Це той самий словник, що в
 * `.pcc-t-citrus` у `Widget/src/ui/widget.css`: однакове `theme="citrus"` по
 * обидва боки має давати однаковий тон.
 *
 * Чим відрізняється від `foxtrot`, хоч обидві оранжеві: сторінка не сіра, а
 * біла з пастельними плямами; дія — пігулка (22px), плитка — 16px, блоки —
 * 10px; hover дії світлішає й підіймається тінню; тіні — драбина «dp»,
 * тонована rgba(0, 8, 29, …); назви й ціни — Montserrat, решта — Roboto.
 *
 * ⚠️ Стоїть ПЕРЕД .app-shell.theme-dark навмисно — темна тема перебиває
 * поверхні саме тим, що оголошена нижче.
 *
 * --header-bg — їхній `--color-header` #3f4e5d: вміст .widget-bar тут onDark
 * за побудовою (крихти й «Поділитися» хардкодять #fff), а цей синьо-сірий у
 * системі так і називається.
 * ========================================================================= */

.app-shell.theme-citrus {
    font-family: 'Roboto', system-ui, -apple-system, 'Segoe UI', Arial, Helvetica, sans-serif;

    --bg: #ffffff;
    --bg-2: #edeff2;
    --panel: #ffffff;
    --panel-2: #edeff2;
    --panel-hover: #f5f6f7;
    --border: #e1e1e3;
    --border-soft: #efeff0;

    /* 87% чорнила (rgba(5,6,17,.87)) — колір тексту їхньої системи. */
    --text: #262630;
    --muted: #666666;
    --muted-2: #5f6b77;

    /* hover — їхній `--color-orange-lite`. */
    --accent: #ff680a;
    --accent-2: #ff8637;
    --accent-ink: #ffffff;
    --accent-glow: rgba(255, 104, 10, .20);

    --link: #3b6d9a;
    --link-hover: #4a7fae;
    --navy: #3b6d9a;
    --navy-hover: #4a7fae;

    --btn-gray-bg: #edeff2;
    --btn-hairline: #efeff0;
    --btn-disabled-bg: #f5f6f7;
    --btn-disabled-ink: #666666;

    --header-bg: #3f4e5d;
    --header-ink: #ffffff;

    /* Системні #57ae00 і #f30 як текст на білому дають 2.8 і 3.7:1 — затемнено
       до ≥ 4.5:1 у тій самій гамі. */
    --ok: #3a7300;
    --ok-soft: #eef7e6;
    --warn: #a84300;
    --warn-soft: #fff3ea;
    --error: #cc2900;
    --error-soft: #ffebe5;
    --price-up: #cc2900;
    --commerce: #ff3300;
    --brand-tint: #fff0e6;

    --shadow: 0 2px 2px rgba(0, 8, 29, .05), 0 0 2px rgba(0, 8, 29, .06), 0 1px 3px rgba(0, 8, 29, .08);
    --shadow-lg: 0 12px 17px rgba(0, 8, 29, .05), 0 5px 22px rgba(0, 8, 29, .06), 0 7px 8px rgba(0, 8, 29, .08);
    --shadow-card-hover: 0 10px 24px rgba(0, 19, 81, .08);
    --shadow-tile-hover: 0 10px 24px rgba(0, 19, 81, .08);

    /* --radius один на картки й кнопки — тут 16px плитки; дрібне — 10px. */
    --radius: 16px;
    --radius-sm: 10px;
    --radius-pill: 500px;

    --promo-discount: #ff3300;
    --promo-top: #ffc107;

    --btn-transition: background-color .3s, color .3s, border-color .3s, box-shadow .3s;
    --card-transition: box-shadow .3s, border-color .3s, background-color .3s, color .3s;
}

/* Сторінка — біла з їхніми пастельними плямами (`.rootBg`), спрощено до трьох.
   `:not(.theme-dark)` — бо темна тема міняє лише `--bg`, і плями лишились би
   поверх темного тла. */
.app-shell.theme-citrus:not(.theme-dark) {
    background:
        radial-gradient(60% 40% at 15% 10%, #ffe9dc 0, rgba(255, 233, 220, 0) 100%),
        radial-gradient(50% 60% at 100% 40%, #d4d8fc 0, rgba(212, 216, 252, 0) 100%),
        radial-gradient(45% 25% at 70% 0, #fff8d1 0, rgba(255, 248, 209, 0) 100%),
        #ffffff;
}

/* Дія — пігулка; поле пошуку — пігулка на сірому без обводки, як у них. */
.app-shell.theme-citrus .btn-cta,
.app-shell.theme-citrus .btn-select,
.app-shell.theme-citrus .tbtn,
.app-shell.theme-citrus .search-box input,
.app-shell.theme-citrus .sort-select {
    border-radius: 22px;
}

.app-shell.theme-citrus .search-box input,
.app-shell.theme-citrus .sort-select {
    border-color: var(--bg-2);
    background: var(--bg-2);
}

.app-shell.theme-citrus .btn-cta:hover,
.app-shell.theme-citrus .btn-select:hover {
    box-shadow: 0 3px 5px rgba(0, 8, 29, .05), 0 3px 4px rgba(0, 8, 29, .06), 0 2px 5px rgba(0, 8, 29, .08);
}

/* Плитки — біле тло й хейрлайн. ⚠️ Ті самі правила є в `.pcc-t-citrus`
   (widget.css). Рамка кольором, а не шириною: `.selected` не зсуває сусідів. */
.app-shell.theme-citrus .intent-card,
.app-shell.theme-citrus .intent-card:hover,
.app-shell.theme-citrus .prod-card,
.app-shell.theme-citrus .prod-card:hover,
.app-shell.theme-citrus .tier-card,
.app-shell.theme-citrus .tier-card:hover,
.app-shell.theme-citrus .tiers-grid--compact .tier-card:hover,
.app-shell.theme-citrus .tier-pro {
    background: var(--panel);
    border-color: var(--border-soft);
}

.app-shell.theme-citrus .prod-card:hover {
    transform: none;
    box-shadow: var(--shadow-card-hover);
}

.app-shell.theme-citrus .prod-card.selected,
.app-shell.theme-citrus .prod-card.selected:hover {
    border-color: var(--accent);
}

.app-shell.theme-citrus .prod-card.incompatible:hover {
    border-color: var(--error);
}

/* Банер лендінга прибраний — ⚠️ те саме правило є в `.pcc-t-citrus`. */
.app-shell.theme-citrus .ad-banner,
.app-shell.theme-citrus .tier-meter,
.app-shell.theme-citrus .tier-flame {
    display: none;
}

.app-shell.theme-citrus .landing__section {
    font-size: 20px;
    font-weight: 500;
}

/* Назви й ціни — Montserrat: назва 14/16/500, ціна 20/24/500. ⚠️ Те саме є в
   `.pcc-t-citrus` (widget.css). */
.app-shell.theme-citrus .tier-card__badge,
.app-shell.theme-citrus .prod-card__name,
.app-shell.theme-citrus .intent-card__title,
.app-shell.theme-citrus .tier-card__price b {
    font-family: 'Montserrat', 'Roboto', system-ui, -apple-system, 'Segoe UI', Arial, sans-serif;
    font-weight: 500;
    letter-spacing: normal;
    text-transform: none;
    color: var(--text);
}

.app-shell.theme-citrus .tier-card__badge,
.app-shell.theme-citrus .prod-card__name {
    font-size: 14px;
    line-height: 16px;
}

.app-shell.theme-citrus .intent-card__title {
    font-size: 16px;
    font-weight: 600;
}

.app-shell.theme-citrus .tier-card__price b {
    font-size: 20px;
    line-height: 24px;
}

.app-shell.theme-citrus .tier-card:hover .tier-card__badge {
    color: var(--accent);
}


/* =============================================================================
 * ІМЕНОВАНА ТЕМА `jabko` — ?theme=jabko (клас .theme-jabko на app-shell).
 *
 * Значення зняті з https://jabko.ua/kompjutery/ і їхнього конфігуратора
 * https://jabko.ua/pc-configuration/ (05.10.2026) — computed-стилі плитки,
 * кнопок і блоків. Той самий словник, що в `.pcc-t-jabko` у
 * `Widget/src/ui/widget.css`.
 *
 * ⚠️ Перша ТЕМНА тема: сторінка #000, блоки #1d1d1d, світлої версії сайту
 * немає — тому поверхні темні й під `theme-light`. Акцент стану — білий
 * (чорний текст), червоний #c42a2c — лише дія купівлі (`.btn-cta`).
 * Радіус 3px на все, тіней немає: hover плитки — сіре кільце 1px.
 *
 * ⚠️ Стоїть ПЕРЕД .app-shell.theme-dark навмисно — темна тема перебиває
 * поверхні саме тим, що оголошена нижче.
 *
 * --navy тут під БІЛИМ текстом (`.tbtn.analyze` хардкодить #fff), тож їхній
 * синій «Кабінет» #2681ce (4.1:1) затемнено до #1f6fb2.
 * ========================================================================= */

.app-shell.theme-jabko {
    font-family: 'Gotham Pro', 'Montserrat', system-ui, -apple-system, 'Segoe UI', Arial, sans-serif;
    font-weight: 500;
    color-scheme: dark;

    --bg: #000000;
    --bg-2: #333333;
    --panel: #1d1d1d;
    --panel-2: #242424;
    --panel-hover: #2a2a2a;
    --border: #4d4d4d;
    --border-soft: #313131;

    --text: #ffffff;
    --muted: #a6a6a6;
    --muted-2: #999999;

    /* hover — на тон сіріший. */
    --accent: #ffffff;
    --accent-2: #e0e0e0;
    --accent-ink: #111111;
    --accent-glow: rgba(255, 255, 255, .18);

    --link: #6aa6dd;
    --link-hover: #8fbce6;
    --navy: #1f6fb2;
    --navy-hover: #2681ce;

    --btn-gray-bg: #333333;
    --btn-hairline: #4d4d4d;
    --btn-disabled-bg: #2a2a2a;
    --btn-disabled-ink: #797979;

    --header-bg: #000000;
    --header-ink: #ffffff;

    /* Успіх — бірюзовий «Trade-IN»; червоний як текст на #1d1d1d дає 3:1 —
       помилка світліша. */
    --ok: #00a397;
    --ok-soft: rgba(0, 163, 151, .16);
    --warn: #ffab5e;
    --warn-soft: rgba(255, 122, 0, .16);
    --error: #ff6b6b;
    --error-soft: rgba(196, 42, 44, .22);
    --price-up: #ff6b6b;
    --commerce: #8985c5;
    --brand-tint: #242424;

    --shadow: 0 1px 5px rgba(0, 0, 0, .45);
    --shadow-lg: 0 6px 20px rgba(0, 0, 0, .6);
    --shadow-card-hover: 0 0 0 1px #999999;
    --shadow-tile-hover: 0 0 0 1px #999999;

    --radius: 3px;
    --radius-sm: 3px;
    --radius-pill: 3px;

    --promo-discount: #8985c5;
    --promo-top: #8985c5;

    --btn-transition: background-color .3s ease-in-out, color .3s ease-in-out, border-color .3s ease-in-out;
    --card-transition: box-shadow .2s, border-color .2s, background-color .2s, color .2s;

    color: var(--text);
}

/* Дія купівлі — їхній червоний «Купити» / «Замовити». ⚠️ Те саме правило є в
   `.pcc-t-jabko` (widget.css). */
.app-shell.theme-jabko .btn-cta:not(:disabled) {
    background: #c42a2c;
    color: #ffffff;
    font-weight: 700;
}

.app-shell.theme-jabko .btn-cta:hover:not(:disabled) {
    background: #d6393b;
}

/* База хардкодить білий поверх акценту (штрих знака лого, повзунок перемикача),
   а акцент тут сам білий — без цих двох правил вони зникали. Знак — їхнім
   червоним, повзунок — чорнилом акценту, як відмічений чекбокс у них. */
.app-shell.theme-jabko .logo__mark { background: #c42a2c; }
.app-shell.theme-jabko .switch input:checked + .switch__track .switch__knob { background: var(--accent-ink); }

/* Іконки заліза на темних блоках — ті самі світлі тони, що в `.theme-dark`. */
.app-shell.theme-jabko .hardware-icon,
.app-shell.theme-jabko .prod-card__img,
.app-shell.theme-jabko .sum-item__ic,
.app-shell.theme-jabko .cat-title-ico { color: #aeb6c2; filter: none; }
.app-shell.theme-jabko .cat-item__ic { color: #9aa4b1; }
.app-shell.theme-jabko .cat-item.active .cat-item__ic,
.app-shell.theme-jabko .cat-item:hover .cat-item__ic { color: #dde2e8; }
.app-shell.theme-jabko .mini-tip,
.app-shell.theme-jabko .mini-tip::after { background: var(--panel-2); }

/* Плитки — блок #1d1d1d без рамки, hover — сіре кільце без зсуву, обрана —
   біла обвідка. ⚠️ Ті самі правила є в `.pcc-t-jabko` (widget.css). */
.app-shell.theme-jabko .intent-card,
.app-shell.theme-jabko .intent-card:hover,
.app-shell.theme-jabko .prod-card,
.app-shell.theme-jabko .prod-card:hover,
.app-shell.theme-jabko .tier-card,
.app-shell.theme-jabko .tier-card:hover,
.app-shell.theme-jabko .tiers-grid--compact .tier-card:hover,
.app-shell.theme-jabko .tier-pro {
    background: var(--panel);
    border-color: transparent;
}

.app-shell.theme-jabko .intent-card:hover,
.app-shell.theme-jabko .prod-card:hover,
.app-shell.theme-jabko .tier-card:hover {
    transform: none;
    box-shadow: var(--shadow-card-hover);
}

.app-shell.theme-jabko .prod-card.selected,
.app-shell.theme-jabko .prod-card.selected:hover {
    border-color: var(--accent);
}

.app-shell.theme-jabko .prod-card.incompatible:hover {
    border-color: var(--error);
}

.app-shell.theme-jabko .search-box input,
.app-shell.theme-jabko .sort-select {
    border-color: var(--bg-2);
    background: var(--bg-2);
}

/* Банер лендінга прибраний — ⚠️ те саме правило є в `.pcc-t-jabko`. */
.app-shell.theme-jabko .ad-banner,
.app-shell.theme-jabko .tier-meter,
.app-shell.theme-jabko .tier-flame {
    display: none;
}

.app-shell.theme-jabko .landing__section {
    font-size: 20px;
    font-weight: 700;
}

/* Назва — сіра 15/700, на hover біліє; ціна — біла 18/600. ⚠️ Те саме є в
   `.pcc-t-jabko` (widget.css). */
.app-shell.theme-jabko .tier-card__badge,
.app-shell.theme-jabko .prod-card__name {
    font-size: 15px;
    font-weight: 700;
    line-height: 1.4;
    letter-spacing: normal;
    text-transform: none;
    color: var(--muted-2);
}

.app-shell.theme-jabko .tier-card:hover .tier-card__badge,
.app-shell.theme-jabko .prod-card:hover .prod-card__name,
.app-shell.theme-jabko .intent-card:hover .intent-card__title {
    color: var(--text);
}

.app-shell.theme-jabko .intent-card__title {
    font-size: 16px;
    font-weight: 700;
}

.app-shell.theme-jabko .tier-card__price b {
    font-size: 18px;
    font-weight: 600;
    line-height: 22px;
    color: var(--text);
}

.app-shell.theme-dark {
    --bg: #171717;
    --bg-2: #2e2e2e;
    --panel: #222222;
    --panel-2: #2b2a29;
    --panel-hover: #333231;
    --border: #4c4c4c;
    --border-soft: #3a3a3a;
    --text: #f5f5f5;
    --muted: #c9c7c5;
    --muted-2: #a6a5a5;
    --link: #7fb0d8;
    --link-hover: #a5cbee;
    --btn-gray-bg: #333231;
    --btn-hairline: #4c4c4c;
    --btn-disabled-bg: #2e2e2e;
    --btn-disabled-ink: #797878;
    --header-bg: #000000;
    --ok-soft: rgba(0, 160, 70, .20);
    --warn: #ffab5e;
    --warn-soft: rgba(255, 122, 0, .16);
    --error: #ff7378;
    --error-soft: rgba(248, 65, 71, .18);
    --shadow: 0 1px 5px rgba(0, 0, 0, .45);
    --shadow-lg: 0 6px 20px rgba(0, 0, 0, .55);
    --shadow-card-hover: 0 8px 24px rgba(0, 0, 0, .55);
    --shadow-tile-hover: 0 4px 16px rgba(0, 0, 0, .5);
    --brand-tint: #123626;     /* зелений тінт на темній панелі замість green-10 */
    background: var(--bg);
    color: var(--text);
}

/* Монохромні іконки заліза — світліші, без білої підсвітки */
.theme-dark .hardware-icon, .theme-dark .intent-svg { color: #aeb6c2; filter: none; }
.theme-dark .prod-card__img { color: #aeb6c2; }
.theme-dark .cat-item__ic { color: #9aa4b1; }
.theme-dark .cat-item.active .cat-item__ic,
.theme-dark .cat-item:hover .cat-item__ic { color: #dde2e8; }
.theme-dark .sum-item__ic { color: #aeb6c2; }
.theme-dark .cat-title-ico { color: #aeb6c2; }
.theme-dark .scenario-card__ic { color: #ccd3db; }
.theme-dark .preset__ic { color: #ccd3db; }

/* На темній панелі беремо світліший green-active — контраст вищий за 4.5:1 */
.theme-dark .intent-card:hover .intent-card__title { color: var(--accent-2); }

/* «Обрати» на темній панелі: тінт трохи щільніший, а обводка й текст — світліший
   green-active, інакше фірмовий зелений на темному тінті дає менше 4.5:1. */
.theme-dark .prod-card__actions .btn-select:not(.chosen):not(:disabled) {
    background: color-mix(in srgb, var(--accent) 14%, var(--panel));
    box-shadow: 0 0 0 1px var(--accent-2) inset;
    color: var(--accent-2);
}

/* Kicker-чип: на темній панелі зелений тінт стає майже чорним і зелений текст на
   ньому тоне — беремо панельний фон і світліший green-active (контраст > 4.5:1). */
.theme-dark .hero .kicker,
.theme-dark .landing .kicker { background: var(--panel-2); color: var(--accent-2); }

/* Дрібниці */
.theme-dark .mini-tip { background: var(--panel-2); }
.theme-dark .mini-tip::after { background: var(--panel-2); }
.theme-dark .footer-links--mini button:hover { background: var(--panel-2); }

/* ─────────────────────────────────────────────────────────────────────────────
 * 006/T108 (FR-062) — кількість позиції в кількісному слоті: пам'ять,
 * накопичувачі, корпусні вентилятори. Той самий елемент у картці каталогу й у
 * складі збірки, бо це та сама дія — і покупець не мусить учитися їй двічі.
 *
 * Кнопка «+» гаситься, коли межа вичерпана (FR-067a): дія лишається видимою й
 * поясненою підказкою, а не зникає — зникла кнопка читається як збій верстки.
 * ────────────────────────────────────────────────────────────────────────── */
.qty {
    display: inline-flex; align-items: center; gap: 2px; height: 40px; flex: 1;
    border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden;
    background: var(--card);
}
.qty__btn {
    width: 34px; height: 100%; border: none; background: none; cursor: pointer;
    color: var(--text); font-size: 17px; line-height: 1; transition: var(--btn-transition);
}
.qty__btn:hover:not(:disabled) { background: var(--accent); color: #fff; }
.qty__btn:disabled { color: var(--btn-disabled-ink); cursor: not-allowed; }
.qty__v { flex: 1; text-align: center; font-weight: 600; font-size: 14px; }
.qty__v small { display: block; font-size: 10.5px; font-weight: 500; color: var(--muted); }

/* Межа слота — рядок «зайнято з межі» під складом і в аналізі. */
.slot-cap { font-size: 12px; color: var(--muted); display: flex; gap: 6px; align-items: baseline; }
.slot-cap b { color: var(--text); font-weight: 600; }
.slot-cap.over b { color: var(--error); }
.slot-cap.unknown { color: var(--muted-2); font-style: italic; }
.sum-item__acts { display: flex; flex-wrap: wrap; gap: 6px; align-items: baseline; }
.sum-item__acts > span { color: var(--muted-2); font-size: 12px; }
.sum-item__acts .mini-link:disabled { color: var(--btn-disabled-ink); cursor: not-allowed; }

/* 008/T010 (FR-033): «готових збірок поки немає» — названий стан на місці
   драбини лендінга. Те саме, що у віджеті (Widget/src/ui/widget.css): пунктирна
   рамка й приглушений текст, бо це порожнє місце з поясненням, а не картка. */
.tiers-empty { display: flex; flex-direction: column; gap: 4px; width: 100%; padding: 20px 16px; border: 1px dashed var(--border-soft); border-radius: var(--radius); color: var(--muted); text-align: center; }
.tiers-empty b { color: var(--text); }
