/* znohub-ui v2.57.4 · зібрано 2026-09-07 */
/* ============================================================
   znohub-ui · РІВЕНЬ 1 — примітиви
   Сирі значення живуть ЛИШЕ тут. Компоненти примітиви не беруть —
   тільки семантичні ролі з semantic.css.
   Шкали: менший номер = світліший. Сіра шкала: hue ≈220, темні
   щаблі десатуровані (хрома в 3–4 рази нижча за старі сині).
   Альфи: --ui-<сім'я>-a<відсоток>; база кольорових альф — щабель 500.
   ============================================================ */
:root {
    /* ---- gray (нейтральна, холодний підтон) ----
       Шкала вирівняна: у ВСІХ щаблів один тон 219° і одна насиченість 17%,
       крок веде лише світлість. Раніше тон гуляв 210–230°, а насиченість
       14.2–20% — сусідні поверхні (сторінка vs вкладена картка) через це
       мали різний відтінок. Числа не підібрані: 219°/17% — медіана й
       середнє самої шкали, тож жоден щабель не зрушив більш ніж на 3/255,
       і контрасти лишились ті самі (найбільший зсув 0.12). Значення —
       найкраще представлення 219°/17% у цілих RGB: на найсвітліших щаблях
       хроми лише 2–4 одиниці, тож точно потрапити в тон 8 біт не дають.
       Залишковий розкид H 10° тримає майже сам gray-25 (chroma 2 одиниці).
       Новий щабель рахують так само: беруть потрібну світлість, тон і
       насиченість — звідси, і округлюють до найближчого за тоном. ---- */
    --ui-gray-0:   #FFFFFF;
    --ui-gray-25:  #F8F9FA;
    --ui-gray-50:  #F4F5F7;
    --ui-gray-100: #EEF0F3;
    --ui-gray-200: #D6DAE2;   /* виведені рівним кроком в OKLab між 100 і 400 */
    --ui-gray-300: #BEC5D1;   /* виведені рівним кроком в OKLab між 100 і 400 */
    --ui-gray-400: #A6AFC0;
    --ui-gray-500: #8390A7;
    --ui-gray-600: #5A677F;
    --ui-gray-700: #38404F;
    --ui-gray-800: #242933;
    --ui-gray-900: #1A1E25;
    --ui-gray-950: #0F1115;   /* ink */

    /* ---- indigo (бренд) ---- */
    --ui-indigo-300: #8FA1FF;
    --ui-indigo-500: #0C01FF;
    --ui-indigo-600: #0A01D9;
    --ui-indigo-700: #0901C0;

    /* ---- хроматика: 300=текст темної теми · 500=заливка · 600/700=текст світлої.
       Тінти — не солідні щаблі, а альфи від 500 (нижче), тому 100-шкали немає ---- */
    --ui-blue-300:   #389DFF;  --ui-blue-500:   #0583F2;  --ui-blue-700:   #0960AD;
    --ui-green-500:  #14C249;  --ui-green-600:  #109338;  --ui-green-700:  #0C752C;
    --ui-orange-500: #FD8D00;  --ui-orange-600: #A56412;  --ui-orange-700: #8A5510;
    --ui-yellow-500: #FDDA0F;  --ui-yellow-600: #917F12;  --ui-yellow-700: #786A00;
    --ui-purple-300: #CD72FF;  --ui-purple-500: #AB35DE;  --ui-purple-700: #761A9E;
    /* teal — виведений, не підібраний: тон 187° узятий із наявного кольору
       карти прогресу (#2FA0AC, вибір дизайнера), щаблі поставлені на ті самі
       позиції S/L, що й у решти сімей. teal-700 дає 5.78 на білому — усередині
       смуги текстових щаблів кита (5.44…8.71). */
    --ui-teal-300:   #6BEEFF;  --ui-teal-500:   #10D9F4;  --ui-teal-700:   #0D707D;
    --ui-red-300:    #FF6C85;  --ui-red-500:    #F25A45;  --ui-red-700:    #BC2915;  --ui-red-800:    #9E2212;

    /* ---- рампа карти прогресу (адаптивне навчання) ----
       Власна п'ятикрокова шкала «дотягнув до цілі → далеко від цілі»,
       історична для продукту. НЕ збігається з green/teal/yellow/red: там
       свої тони, і зводити їх докупи означало б перефарбувати карту.
       Заливки (-c*) і тінти лишаються такими, якими були в легасі, до байта.
       Щабель -ink — той самий відтінок (H і S незмінні), затемнений рівно
       до 4.5:1 на власному тінті: у легасі текст стояв кольором заливки й
       давав 2.33…4.22, тобто бал на плитці не читався.
       -lift — освітлений щабель для темної теми (потрібен лише червоному). */
    --ui-map-c5: #3CB45A;  --ui-map-c5-a10: rgba(60, 180, 90, 0.10);   --ui-map-c5-ink: #2B8040;
    --ui-map-c4: #35AF7E;  --ui-map-c4-a10: rgba(53, 175, 126, 0.10);  --ui-map-c4-ink: #267E5B;
    --ui-map-c3: #2FA0AC;  --ui-map-c3-a10: rgba(47, 160, 172, 0.10);  --ui-map-c3-ink: #247A83;
    --ui-map-c2: #B7A024;  --ui-map-c2-a13: rgba(199, 178, 59, 0.13);  --ui-map-c2-ink: #7F6F19;
    --ui-map-c1: #C24B33;  --ui-map-c1-a10: rgba(194, 75, 51, 0.10);   --ui-map-c1-ink: #BA4831;
    --ui-map-c1-lift: #D36E59;

    /* ---- альфи ---- */
    --ui-white-a4:  rgba(255, 255, 255, 0.04);
    --ui-white-a6:  rgba(255, 255, 255, 0.06);
    --ui-white-a8:  rgba(255, 255, 255, 0.08);
    --ui-white-a10: rgba(255, 255, 255, 0.10);
    --ui-white-a12: rgba(255, 255, 255, 0.12);
    --ui-white-a16: rgba(255, 255, 255, 0.16);
    --ui-white-a40: rgba(255, 255, 255, 0.40);
    --ui-white-a50: rgba(255, 255, 255, 0.50);
    --ui-ink-a2:  rgba(15, 16, 21, 0.02);
    --ui-ink-a4:  rgba(15, 16, 21, 0.04);
    --ui-ink-a8:  rgba(15, 16, 21, 0.08);
    --ui-ink-a24: rgba(15, 16, 21, 0.24);
    --ui-ink-a60: rgba(15, 16, 21, 0.60);
    --ui-black-a60: rgba(0, 0, 0, 0.60);
    --ui-black-a70: rgba(0, 0, 0, 0.70);
    --ui-gray-900-a50: rgba(25, 29, 36, 0.50);
    /* Альфи від щабля 300 — для ТЕМНОЇ теми. Індиго-500 (#0C01FF) має дуже
       низьку світлість, тож його альфа на темній поверхні майже не піднімає
       її (ΔL 0.0006 при a20 — тінт фактично невидимий, лише синій намул).
       Іменування «сімʼя-щабель-альфа», як у --ui-gray-900-a50. */
    --ui-indigo-300-a12: rgba(143, 161, 255, 0.12);
    --ui-indigo-300-a32: rgba(143, 161, 255, 0.32);   /* пік блиску преміум-рамки, темна */
    --ui-indigo-300-a16: rgba(143, 161, 255, 0.16);
    --ui-indigo-a8:  rgba(12, 1, 255, 0.08);
    --ui-indigo-a16: rgba(12, 1, 255, 0.16);
    --ui-indigo-a32: rgba(12, 1, 255, 0.32);
    --ui-indigo-a20: rgba(12, 1, 255, 0.20);
    --ui-indigo-a28: rgba(12, 1, 255, 0.28);   /* пік блиску преміум-рамки, світла */
    --ui-indigo-a56: rgba(12, 1, 255, 0.56);   /* світіння під плаваючою кнопкою */
    --ui-blue-a16:   rgba(5, 131, 242, 0.16);   --ui-blue-a20:   rgba(5, 131, 242, 0.20);   --ui-blue-a32:   rgba(5, 131, 242, 0.32);
    --ui-green-a8:   rgba(20, 194, 73, 0.08);   --ui-green-a16:  rgba(20, 194, 73, 0.16);  --ui-green-a20: rgba(20, 194, 73, 0.20);  --ui-green-a32: rgba(20, 194, 73, 0.32);
    --ui-orange-a16: rgba(253, 141, 0, 0.16);   --ui-orange-a20: rgba(253, 141, 0, 0.20);   --ui-orange-a32: rgba(253, 141, 0, 0.32);
    --ui-yellow-a16: rgba(253, 218, 15, 0.16);  --ui-yellow-a20: rgba(253, 218, 15, 0.20);  --ui-yellow-a32: rgba(253, 218, 15, 0.32);
    --ui-purple-a16: rgba(171, 53, 222, 0.16);  --ui-purple-a20: rgba(171, 53, 222, 0.20);  --ui-purple-a32: rgba(171, 53, 222, 0.32);
    --ui-teal-a16:   rgba(16, 217, 244, 0.16);  --ui-teal-a20:   rgba(16, 217, 244, 0.20);
    --ui-red-a8:     rgba(242, 90, 69, 0.08);   --ui-red-a16:    rgba(242, 90, 69, 0.16);  --ui-red-a20:  rgba(242, 90, 69, 0.20);  --ui-red-a32:  rgba(242, 90, 69, 0.32);
}
/* ============================================================
   znohub-ui · РІВЕНЬ 2 — семантичні ролі
   Граматика: --ui-<властивість>-<роль>[-<стан>]. Компоненти беруть
   ТІЛЬКИ ці ролі. Кожен рядок: роль · контрастний контракт.
   Темна тема (dark.css) перевизначає РОЛІ, не примітиви.
   ============================================================ */
:root {
    /* ---- Поверхні ---- */
    --ui-surface: var(--ui-gray-0);                 /* картки, модалки, поля */
    --ui-surface-page: var(--ui-gray-25);           /* фон сторінки */
    --ui-surface-sunken: var(--ui-gray-50);         /* вкладені: рядки, чіпи, селект */
    --ui-surface-hover: var(--ui-ink-a4);           /* ховер нейтральних елементів */
    --ui-surface-translucent: var(--ui-white-a50);
    --ui-surface-inverse: var(--ui-gray-900);       /* тост, тултіп — темна пігулка */
    --ui-text-on-inverse: var(--ui-gray-100);
    --ui-on-inverse-success: var(--ui-green-500);
    --ui-on-inverse-danger: var(--ui-red-300);
    --ui-on-inverse-accent: var(--ui-indigo-300);

    /* ---- Текст (і іконки) · всі text-* ≥4.5:1 на поверхнях і своїх тінтах ---- */
    --ui-text-primary: var(--ui-gray-950);
    --ui-text-secondary: var(--ui-gray-600);
    --ui-text-muted: var(--ui-gray-500);            /* плейсхолдери, третьорядне */
    /* Підпис, який читається майже нарівні зі значенням: рядки підсумку,
       де ліва колонка не менш важлива за праву. Між secondary та ink. */
    --ui-text-strong: var(--ui-gray-700);
    --ui-text-accent: var(--ui-indigo-500);
    --ui-text-success: var(--ui-green-700);
    --ui-text-danger: var(--ui-red-700);
    /* Текст на власному тлі елемента (заливка, банер-ілюстрація). Ці ролі
       НЕ темуються: тло під ними однакове в обох темах */
    --ui-text-on-fill: var(--ui-gray-0);
    /* Текст/гліф НА АКЦЕНТНІЙ заливці — окремо від --ui-text-on-fill, бо
       в темній акцент світлішає до indigo-300 і білий на ньому дає 2.41,
       а чорнильний 7.88. Решта заливок (success, danger, предметні) у
       темній лишаються темними й далі тримають білий. */
    --ui-text-on-accent: var(--ui-text-on-fill);
    --ui-text-on-dark: var(--ui-gray-400);          /* другорядний на темному банері */
    --ui-text-on-light: var(--ui-gray-950);         /* заголовок на світлому банері */
    /* Біла заливка для елементів НА банері-ілюстрації. Як і сусідні on-*
       ролі, НЕ темується: під нею картинка, однакова в обох темах. */
    --ui-fill-on-light: var(--ui-gray-0);
    /* Кнопка НА ЗАЛИВЦІ (шапка курсу): під нею не полотно сторінки, а
       насичений колір, тож контур і підсвітка мають власні ролі — вони,
       як і --ui-fill-on-light, темі не підкоряються. */
    --ui-border-on-fill: var(--ui-white-a40);
    --ui-border-on-fill-hover: var(--ui-white-a50);
    --ui-surface-on-fill-hover: var(--ui-white-a16);
    --ui-surface-on-fill-active: var(--ui-white-a8);
    --ui-text-on-light-muted: var(--ui-gray-600);   /* другорядний там само */

    /* ---- Межі ---- */
    --ui-border-subtle: var(--ui-gray-100);         /* розділювачі, декор */
    --ui-border-field: var(--ui-gray-100);          /* поля вводу (у темній сильніша) */
    --ui-border-strong: var(--ui-gray-500);         /* контроли з вимогою 3:1 (бланк) */
    --ui-border-card: var(--ui-border-subtle);      /* контур усіх карткових поверхонь */
    --ui-border-accent: var(--ui-indigo-500);       /* selected/active межі й маркери */
    /* Ті самі маркерні межі в ключі успіху/небезпеки — свій рядок у турнірній
       таблиці, підсвічений стан у зоні. Беруть графічний відтінок (500), а не
       текстовий (700): текстові розраховані на читабельність на тінті й на
       тонкій лінії виглядають майже чорними. */
    --ui-border-success: var(--ui-green-500);
    --ui-border-danger: var(--ui-red-500);
    /* Натяк, а не лінія: тиха межа, над якою йде переливання */
    --ui-border-success-soft: var(--ui-green-a32);
    --ui-focus-ring: var(--ui-border-accent);       /* :focus-visible */

    /* ---- Заливки й тінти ---- */
    --ui-fill-accent: var(--ui-indigo-500);
    --ui-fill-accent-hover: var(--ui-indigo-600);    /* ховери лендингу #0A01D9/#0901C0 */
    --ui-fill-accent-active: var(--ui-indigo-700);
    --ui-fill-danger-hover: var(--ui-red-800);
    --ui-tint-accent-hover: var(--ui-indigo-a16);
    --ui-surface-sunken-hover: var(--ui-gray-100);
    --ui-fill-success: var(--ui-green-500);
    /* Успіх під БІЛИЙ текст: штатна --ui-fill-success це green-500, під смуги
       й кільця добре, а білий текст на ній 2.37 — нечитабельно. green-600 дає
       4.0: трохи нижче за норму 4.5 для дрібного тексту, свідомий компроміс
       на користь соковитішого зеленого (рішення власника, 2026-08-31).
       green-700 дав би 5.84. */
    --ui-fill-success-strong: var(--ui-green-600);
    --ui-fill-success-strong-hover: var(--ui-green-700);
    --ui-fill-danger: var(--ui-red-700);            /* білий текст на ній 6.1:1 в обох темах */
    --ui-tint-accent: var(--ui-indigo-a8);
    --ui-tint-success: var(--ui-green-a8);
    --ui-tint-success-hover: var(--ui-green-a16);
    --ui-tint-danger: var(--ui-red-a8);
    --ui-tint-danger-hover: var(--ui-red-a16);
    /* Заливка великого поля роллю (банер): СУЦІЛЬНИЙ колір. Прозорість йому
       задає маска компонента, а не сам токен — інакше альфа множилась би на
       альфу і поле виходило б удвічі блідішим, ніж намальовано. Ім'я окреме
       від --ui-sheen-*: то блиск переливної МЕЖІ, зовсім інша роль. */
    --ui-wash-accent: var(--ui-fill-accent);
    --ui-wash-success: var(--ui-fill-success-strong);
    --ui-wash-danger: var(--ui-fill-danger);
    /* Стрік: заливка + свій текст-на-заливці. У темній заливка світлішає
       (синій 500 на темному тлі ~2:1), тож гліф на ній стає чорнильним */
    --ui-fill-streak: var(--ui-fill-accent);
    --ui-text-on-streak: var(--ui-text-on-fill);
    /* warning — власна роль: збіг значень із предметом d (жовтим) навмисний,
       але перефарбування предмета НЕ має перефарбовувати попередження */
    --ui-tint-warning: var(--ui-yellow-a16);
    --ui-text-warning: var(--ui-yellow-700);

    /* ---- Предмети: 6 колірних слотів, ролі fill · tint · tint-strong · text · accent · on-fill.
       Класи sub-a…sub-f шле бекенд (subjects.class). Мапа ЗНО/НМТ (дані, не API):
       a=математика b=географія c=біологія d=англійська e=укрмова f=історія.
       on-fill: білий скрізь, крім жовтого d (бренд-рішення; формальний контраст
       білого на b/c нижче 3:1 — зафіксовано в АУДИТ як прийнятий виняток).
       accent — соковиті ink-и лендингу для ВЕЛИКИХ цифр/іконок (AA large ≥3:1).
       Ховер заливок — не токен, а filter: brightness(0.92) (active — 0.84). ---- */
    --ui-subject-a-fill: var(--ui-blue-500);   --ui-subject-a-tint: var(--ui-blue-a16);   --ui-subject-a-text: var(--ui-blue-500);   --ui-subject-a-on-fill: var(--ui-text-on-fill);
    --ui-subject-b-fill: var(--ui-green-500);  --ui-subject-b-tint: var(--ui-green-a16);  --ui-subject-b-text: var(--ui-green-700);  --ui-subject-b-on-fill: var(--ui-text-on-fill);
    --ui-subject-c-fill: var(--ui-orange-500); --ui-subject-c-tint: var(--ui-orange-a16); --ui-subject-c-text: var(--ui-orange-700); --ui-subject-c-on-fill: var(--ui-text-on-fill);
    --ui-subject-d-fill: var(--ui-yellow-500); --ui-subject-d-tint: var(--ui-yellow-a16); --ui-subject-d-text: var(--ui-yellow-700); --ui-subject-d-on-fill: var(--ui-gray-950);
    --ui-subject-e-fill: var(--ui-purple-500); --ui-subject-e-tint: var(--ui-purple-a16); --ui-subject-e-text: var(--ui-purple-700); --ui-subject-e-on-fill: var(--ui-text-on-fill);
    --ui-subject-f-fill: var(--ui-red-500);    --ui-subject-f-tint: var(--ui-red-a16);    --ui-subject-f-text: var(--ui-red-700);    --ui-subject-f-on-fill: var(--ui-text-on-fill);

    /* предметні: idle-підкладки іконок (32%) і великі акценти */
    --ui-subject-a-tint-strong: var(--ui-blue-a32);   --ui-subject-a-accent: var(--ui-blue-700);
    --ui-subject-b-tint-strong: var(--ui-green-a32);  --ui-subject-b-accent: var(--ui-green-600);
    --ui-subject-c-tint-strong: var(--ui-orange-a32); --ui-subject-c-accent: var(--ui-orange-600);
    --ui-subject-d-tint-strong: var(--ui-yellow-a32); --ui-subject-d-accent: var(--ui-yellow-600);
    --ui-subject-e-tint-strong: var(--ui-purple-a32); --ui-subject-e-accent: var(--ui-purple-700);
    --ui-subject-f-tint-strong: var(--ui-red-a32);    --ui-subject-f-accent: var(--ui-red-700);

    /* карта прогресу: 5 = ціль узято, 1 = далеко від цілі. Заливка йде на
       декор плитки, тінт — на її фон, text — на бал і підпис статусу.
       Стани «в процесі» й «не розпочато» беруть акцент і сірі ролі. */
    --ui-map-5-fill: var(--ui-map-c5); --ui-map-5-tint: var(--ui-map-c5-a10); --ui-map-5-text: var(--ui-map-c5-ink);
    --ui-map-4-fill: var(--ui-map-c4); --ui-map-4-tint: var(--ui-map-c4-a10); --ui-map-4-text: var(--ui-map-c4-ink);
    --ui-map-3-fill: var(--ui-map-c3); --ui-map-3-tint: var(--ui-map-c3-a10); --ui-map-3-text: var(--ui-map-c3-ink);
    --ui-map-2-fill: var(--ui-map-c2); --ui-map-2-tint: var(--ui-map-c2-a13); --ui-map-2-text: var(--ui-map-c2-ink);
    --ui-map-1-fill: var(--ui-map-c1); --ui-map-1-tint: var(--ui-map-c1-a10); --ui-map-1-text: var(--ui-map-c1-ink);

    /* ---- Службові й компонентні ---- */
    --ui-overlay: var(--ui-ink-a60);
    /* Блиск преміум-рамки — КОЛІР піку, а не готовий градієнт: форму (конус,
       дві комети, кути) тримає компонент, бо вона однакова в обох темах, а
       по темах різниться лише колір. Краї градієнта в компоненті —
       transparent: інтерполяція йде в premultiplied sRGB, тож сірої
       облямівки на переході в прозоре не буде.
       Альфи підібрані так, щоб пік давав однаковий контраст до поверхні
       картки в обох темах: світла 1.84, темна 1.87. */
    --ui-sheen-color: var(--ui-indigo-a28);
    /* Зелений відповідник блиску — для переливної межі в ключі успіху
       (свій рядок у турнірній таблиці) */
    --ui-sheen-success: var(--ui-green-a32);
    --ui-shadow-card: 0 2px 4px 0 var(--ui-ink-a2);
    --ui-shadow-card-hover: 0 6px 16px -6px var(--ui-ink-a8);  /* «підняття» картки */
    --ui-shadow-color: var(--ui-ink-a24);
    /* Кольорове світіння під плаваючою кнопкою: не «підняття» картки, а
       акцент, що тримає кнопку окремо від контенту під нею. У темній темі
       лишається — на темному тлі воно і є єдиним, що відділяє кнопку. */
    --ui-shadow-accent: 0 8px 24px -10px var(--ui-indigo-a56);
    --ui-shadow-accent-hover: 0 12px 28px -10px var(--ui-indigo-a56);
    --ui-progress-track: var(--ui-gray-50);
    /* Заливки смуг: у світлій — яскраві предметні (текст поруч дублює число),
       жовтий — золотим 600 (чистий жовтий на треку 1.26:1); у темній — світлі пари */
    --ui-progress-fill-success: var(--ui-fill-success);
    --ui-progress-fill-danger: var(--ui-red-500);   /* смуга «слабко» — графічна червона, не текстова */
    /* ===== Шкала рівня засвоєння (карта прогресу) =====
       П'ять щаблів від «засвоєно» до «потребує особливої уваги». Трійка
       ролей та сама, що в предметів: -fill (декор, смуги), -tint (тло
       плитки), -text (підпис — саме він мусить проходити контраст).
       Легасі-рампа малювала й підпис, і декор ОДНИМ кольором, тому підпис
       на 13px давав 2.6–3.1 при нормі 4.5. Розділення на fill/text це знімає. */
    --ui-level-5-fill: var(--ui-green-500);   --ui-level-5-tint: var(--ui-green-a16);   --ui-level-5-text: var(--ui-green-700);
    --ui-level-4-fill: var(--ui-teal-500);    --ui-level-4-tint: var(--ui-teal-a16);    --ui-level-4-text: var(--ui-teal-700);
    --ui-level-3-fill: var(--ui-yellow-500);  --ui-level-3-tint: var(--ui-yellow-a16);  --ui-level-3-text: var(--ui-yellow-700);
    --ui-level-2-fill: var(--ui-orange-500);  --ui-level-2-tint: var(--ui-orange-a16);  --ui-level-2-text: var(--ui-orange-700);
    --ui-level-1-fill: var(--ui-red-500);     --ui-level-1-tint: var(--ui-red-a16);     --ui-level-1-text: var(--ui-red-700);

    --ui-subject-a-bar: var(--ui-subject-a-fill);
    --ui-subject-b-bar: var(--ui-subject-b-fill);
    --ui-subject-c-bar: var(--ui-subject-c-fill);
    --ui-subject-e-bar: var(--ui-subject-e-fill);
    --ui-subject-f-bar: var(--ui-subject-f-fill);
    --ui-subject-d-bar: var(--ui-yellow-600);
    --ui-progress-fill: var(--ui-fill-accent);
    --ui-blank-surface: var(--ui-surface);          /* клітинки бланка НМТ */

    /* ---- Каркас шелу ----
       Ширина сайдбару — не «відступ», а контракт розкладки: від неї залежать
       margin контенту і зсув усіх фіксованих панелей (напр. .ui-quiz-actions.bar
       у quiz.css). Число мусить бути одне на бібліотеку, інакше липкі панелі
       розсинхронюються з контентом при зміні ширини сайдбару. */
    --ui-sidebar-width: 248px;
    /* Ширина колонки контенту — стандарт бібліотеки (рішення власника
       2026-09-01). Те саме, що й ширина легасі-контейнера .max-content на
       платформі, тож кітова сторінка в старому шелі стає з ним урівень.
       Змінною, а не числом: її ділять колонка сторінки, липка панель дій
       і колонка тесту — при розбіжності кнопки панелей стають не під
       краями карток. */
    --ui-content-width: 1240px;

    /* ---- Радіуси ---- */
    --ui-radius-s: 8px;
    --ui-radius-m: 12px;
    --ui-radius-l: 16px;
    --ui-radius-xl: 24px;
    /* Найбільший щабель — поки що лише під вікна: на широкому екрані 24
       губилися, вікно читалось як прямокутна плита. */
    --ui-radius-2xl: 32px;
    --ui-radius-pill: 100px;

    /* ---- Рух ---- */
    /* Перелік властивостей, які компонент має право анімувати. Голе
       `transition: 0.2s` означає `all` — а це анімує й visibility, яка
       успадковується: після відкриття модалки її вміст лишався
       visibility: hidden ще ~100 мс (половина переходу) і браузер не давав
       його сфокусувати. Той самий `all` чіпляє й розкладку — width, padding,
       height, — і компонент «їде» там, де мав лише перефарбуватись.
       Кому треба більше — дописує явно, не повертаючись до all:
       transition-property: var(--ui-transition-props), width;
       filter тут, бо ним працює спільна прес-модель заливок
       (brightness 0.92): без нього кнопка темніла ривком, поки все інше
       поруч плавно перетікало. */
    --ui-transition-props: background-color, border-color, box-shadow, color, opacity, transform, filter;
    /* Крива одна на весь кіт. Стандартний `ease` рушає мляво — на ховерах
       це читається як затримка відгуку; ця стартує різко й гальмує довго,
       тобто «відповідає одразу, зупиняється мʼяко». Її вже вживає чат,
       тепер це домашня крива, а не виняток. */
    --ui-ease: cubic-bezier(0.3, 0, 0.2, 1);
    /* Дві тривалості з чітким поділом: коротка — для того, що під
       курсором просто перефарбовується; звичайна — для того, що ще й
       рухається чи відкидає тінь, бо рух на 0.15s читається як смик. */
    --ui-duration-fast: 0.15s;
    --ui-duration: 0.2s;
}
/* ============================================================
   znohub-ui · темна тема — перевизначає ТІЛЬКИ семантичні ролі.
   Примітиви тема-інваріантні; поверхні — темні щаблі тієї самої
   сірої шкали (десатуровані, «менш кольорові»).
   ============================================================ */
html[data-theme="dark"] {
    --ui-surface: var(--ui-gray-900);
    --ui-surface-page: var(--ui-gray-950);
    --ui-surface-sunken: var(--ui-gray-800);
    --ui-surface-hover: var(--ui-white-a8);
    --ui-surface-translucent: var(--ui-gray-900-a50);
    --ui-surface-inverse: var(--ui-gray-700);

    --ui-text-primary: var(--ui-gray-100);
    --ui-text-secondary: var(--ui-gray-400);
    --ui-text-strong: var(--ui-gray-200);
    --ui-text-muted: var(--ui-gray-500);
    --ui-text-accent: var(--ui-indigo-300);
    --ui-text-success: var(--ui-green-500);
    --ui-text-danger: var(--ui-red-300);

    --ui-border-subtle: var(--ui-white-a10);
    --ui-border-field: var(--ui-white-a40);
    --ui-border-card: var(--ui-white-a4);
    --ui-border-accent: var(--ui-indigo-300);

    /* Тінти акценту беруть щабель 300, як і решта акцентних ролей вище:
       на 500 вони не читались (див. коментар у palette.css). Альфи низькі
       навмисно — обмежувач це --ui-surface-sunken, де текст indigo-300 на
       тінті дає 4.90 при a12 і 4.53 при a16; a20 вже 4.19, нижче AA. */
    /* Акцентна заливка теж світлішає — indigo-500 на темному тлі читався
       як майже чорна пляма. Ховер/актив окремих щаблів не мають (200 у
       палітрі немає), тож там працює модель предметних заливок: brightness. */
    --ui-fill-accent: var(--ui-indigo-300);
    --ui-fill-accent-hover: var(--ui-indigo-300);
    --ui-fill-accent-active: var(--ui-indigo-300);
    --ui-text-on-accent: var(--ui-gray-950);
    --ui-tint-accent: var(--ui-indigo-300-a12);
    --ui-tint-accent-hover: var(--ui-indigo-300-a16);
    --ui-surface-sunken-hover: var(--ui-gray-700);
    --ui-tint-success: var(--ui-green-a16);
    --ui-tint-success-hover: var(--ui-green-a32);
    --ui-tint-danger: var(--ui-red-a16);
    --ui-tint-danger-hover: var(--ui-red-a32);
    /* На темному полотні темні заливки гаснуть: під маскою з піком 0.3 над
       майже чорним вони не дають жодного відтінку. Тож усі три світлішають. */
    --ui-wash-accent: var(--ui-indigo-300);
    --ui-wash-success: var(--ui-green-500);
    --ui-wash-danger: var(--ui-red-300);
    --ui-tint-warning: var(--ui-yellow-a20);
    --ui-text-warning: var(--ui-yellow-500);
    --ui-fill-streak: var(--ui-indigo-300);
    --ui-text-on-streak: var(--ui-gray-950);

    --ui-subject-a-tint: var(--ui-blue-a20);   --ui-subject-a-text: var(--ui-blue-300);
    --ui-subject-b-tint: var(--ui-green-a20);  --ui-subject-b-text: var(--ui-green-500);
    --ui-subject-c-tint: var(--ui-orange-a20); --ui-subject-c-text: var(--ui-orange-500);
    --ui-subject-d-tint: var(--ui-yellow-a20); --ui-subject-d-text: var(--ui-yellow-500);
    --ui-subject-e-tint: var(--ui-purple-a20); --ui-subject-e-text: var(--ui-purple-300);
    --ui-subject-f-tint: var(--ui-red-a20);    --ui-subject-f-text: var(--ui-red-300);
    --ui-subject-a-accent: var(--ui-subject-a-text); --ui-subject-b-accent: var(--ui-subject-b-text);
    --ui-subject-c-accent: var(--ui-subject-c-text); --ui-subject-d-accent: var(--ui-subject-d-text);
    --ui-subject-e-accent: var(--ui-subject-e-text); --ui-subject-f-accent: var(--ui-subject-f-text);

    /* У темній акцент світлішає до щабля 300 — як і всі акцентні ролі вище.
       indigo-500 на темній поверхні дав би контраст 1.15 замість 1.87. */
    --ui-sheen-color: var(--ui-indigo-300-a32);
    --ui-sheen-success: var(--ui-green-a32);
    --ui-overlay: var(--ui-black-a70);
    --ui-shadow-card: none;
    --ui-shadow-card-hover: none;
    --ui-shadow-color: var(--ui-black-a60);
    --ui-progress-track: var(--ui-white-a12);
    --ui-progress-fill-success: var(--ui-text-success);
    --ui-progress-fill-danger: var(--ui-red-300);
    /* Шкала рівня: текст підіймається на світліший щабель, тінт — на a20.
       Та сама логіка, що в статусних і предметних ролей. */
    --ui-level-5-text: var(--ui-green-500);   --ui-level-5-tint: var(--ui-green-a20);
    --ui-level-4-text: var(--ui-teal-300);    --ui-level-4-tint: var(--ui-teal-a20);
    --ui-level-3-text: var(--ui-yellow-500);  --ui-level-3-tint: var(--ui-yellow-a20);
    --ui-level-2-text: var(--ui-orange-500);  --ui-level-2-tint: var(--ui-orange-a20);
    --ui-level-1-text: var(--ui-red-300);     --ui-level-1-tint: var(--ui-red-a20);

    /* Карта прогресу: на темній картці тінт лягає поверх --ui-surface, і сам
       колір заливки вже дає 4.68…5.39 — затемнений щабель тут зайвий, він
       читався б гірше. Виняток червоний: 3.19, тому в темній він світлішає. */
    --ui-map-5-text: var(--ui-map-c5);
    --ui-map-4-text: var(--ui-map-c4);
    --ui-map-3-text: var(--ui-map-c3);
    --ui-map-2-text: var(--ui-map-c2);
    --ui-map-1-text: var(--ui-map-c1-lift);

    --ui-subject-a-bar: var(--ui-subject-a-text);
    --ui-subject-b-bar: var(--ui-subject-b-text);
    --ui-subject-c-bar: var(--ui-subject-c-text);
    --ui-subject-d-bar: var(--ui-subject-d-text);
    --ui-subject-e-bar: var(--ui-subject-e-text);
    --ui-subject-f-bar: var(--ui-subject-f-text);
    --ui-progress-fill: var(--ui-indigo-300);
    --ui-blank-surface: var(--ui-white-a6);
}
/* ============================================================
   znohub-ui · типографіка
   Гарнітура: Nexa Text (Fontfabric) через Adobe Fonts:
   <link rel="stylesheet" href="https://use.typekit.net/lqf4wll.css">
   Ім'я сім'ї в кіті Adobe — "nexa-text" (нарізки 100–900 + italic).
   Фолбек: Geologica — фактичний шрифт платформи (new_style.css
   вантажиться останнім, його * { Geologica } перекриває Open Sans).
   Шкала виведена з фактичного вжитку платформи (перепис new_style.css:
   домінують 14/12/16/20, трекінг від'ємний на заголовках).
   ============================================================ */

:root {
    --ui-font: 'nexa-text', 'Nexa Text', 'Geologica', 'Open Sans', -apple-system,
        BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;

}
/* Ваги системи: 400 (Book) · 500 (Regular) · 700 (Bold) · 800 (Heavy) —
   компоненти пишуть числа. Adobe віддає і 300/600/900: 300 нечитабельний
   на кеглях платформи, 600 дублює роль 700 — у системі не вживаються. */

/* Компоненти kit говорять цією гарнітурою; стара платформа лишається
   на своєму * { Open Sans } — межа міграції видима і контрольована */
[class^="ui-"], [class*=" ui-"],
[class^="ui-"] *, [class*=" ui-"] * { font-family: var(--ui-font); }

/* ---------- Ролі. Розмір/інтерлінʼяж/вага/трекінг — одним класом ---------- */
.ui-text-display  { font-size: 32px; line-height: 40px; font-weight: 700; letter-spacing: -0.64px; }
.ui-text-h1       { font-size: 28px; line-height: 34px; font-weight: 700; letter-spacing: -0.56px; }
.ui-text-h2       { font-size: 24px; line-height: 30px; font-weight: 700; letter-spacing: -0.48px; }
.ui-text-h3       { font-size: 20px; line-height: 26px; font-weight: 700; letter-spacing: -0.4px; }
.ui-text-h4       { font-size: 17px; line-height: 23px; font-weight: 700; letter-spacing: -0.3px; }
.ui-text-body-lg  { font-size: 16px; line-height: 24px; font-weight: 400; letter-spacing: -0.2px; }
.ui-text-body     { font-size: 15px; line-height: 22px; font-weight: 400; letter-spacing: -0.1px; }
.ui-text-body-sm  { font-size: 14px; line-height: 20px; font-weight: 400; }
.ui-text-small    { font-size: 13px; line-height: 18px; font-weight: 400; }
.ui-text-caption  { font-size: 12px; line-height: 16px; font-weight: 700; letter-spacing: 0.2px; }
.ui-text-overline { font-size: 11px; line-height: 14px; font-weight: 700; letter-spacing: 0.8px;
    text-transform: uppercase; }
/* znohub-ui · іконки — Iconly Light (stroke 1.5, viewBox 24)
   Джерело: mcp.iconly.pro, стиль Light. Оригінали в icons-src/light/.
   Малювати іконки від руки НЕ МОЖНА — правило 6 у README. Назви в бібліотеці
   бувають оманливі (Light-«Info Circle» насправді квадрат), тож звіряй сам SVG.
   Кожна іконка задана ШОРТКАТОМ mask: — легасі new_style.css має голі
   селектори .xi-* із власним mask-шорткатом, які при лонгхендах
   скидали repeat/position/size (іконка обрізалась від лівого кута).
   У кнопках і навігації напрямок — ШЕВРОНАМИ (i-chevron-*), стрілки
   i-arrow-* лишаються для дій «перемістити/вивантажити» тощо.
   Аліаси xi-* лишаються для сторінок, зверстаних до переходу на Iconly.
   Суфікс -fill — Iconly BOLD, тобто ЗАЛИВКА, а не штрих. Це виняток із
   правила «тільки Light», і він має свій суфікс, бо -bold у цьому наборі
   вже зайнятий: там той самий Light-гліф зі штрихом 1.75.
   i-time-bold — той самий Time Circle, але зі штрихом 2: у 14px паковий
   1.5 дає 0.875px лінії, і гліф виглядає примарно поруч із текстом.
   i-plus-bare — плюс без рамки: у Light голого плюса немає взагалі, він
   скрізь у скругленому квадраті (Essential, Math, усі три типи). Штрихи
   пака розраховані на цю рамку й самі по собі займають третину квадрата,
   тож тут вони масштабовані до розмаху легасі .xi-add — того плюса, що
   стояв на платформі. Аліас xi-add веде сюди ж.
   i-pen — Light «Pen» із категорії Design (id 56699), а не Essential-«Edit»:
   у пігулці банера потрібна саме ручка без підкреслення — на 16px зайва
   риска Edit зливалась із текстом поруч. */
.ui-icon { display: flex; flex: none; width: 20px; height: 20px; position: relative; }
/* Гліф перетікає разом із контейнером: ховери кіта перефарбовують іконку
   поруч із тлом кнопки чи картки, і без переходу вона стрибала в новий
   колір, поки все навколо ще їхало. */
.ui-icon::before { position: absolute; content: ""; inset: 0; width: 100%; height: 100%;
    pointer-events: none; background: var(--ui-text-primary);
    transition-property: background-color, opacity;
    transition-duration: var(--ui-duration-fast);
    transition-timing-function: var(--ui-ease); }
.ui-icon.s  { width: 16px; height: 16px; }
.ui-icon.l  { width: 24px; height: 24px; }

.ui-icon.i-activity { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Activity%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Activity%22%20transform=%22translate(2.000000,%201.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Path_33966%22%20points=%225.24485128%2013.2814646%208.23798631%209.39130439%2011.652174%2012.0732266%2014.5812358%208.29290622%22%3E%3C/polyline%3E%3Ccircle%20id=%22Ellipse_741%22%20cx=%2217.9954234%22%20cy=%222.70022885%22%20r=%221.92219681%22%3E%3C/circle%3E%3Cpath%20d=%22M12.9244852,1.62013731%20L5.6567506,1.62013731%20C2.64530894,1.62013731%200.778032041,3.75286043%200.778032041,6.76430209%20L0.778032041,14.846682%20C0.778032041,17.8581237%202.60869567,19.9816935%205.6567506,19.9816935%20L14.2608696,19.9816935%20C17.2723113,19.9816935%2019.1395882,17.8581237%2019.1395882,14.846682%20L19.1395882,7.80778036%22%20id=%22Path%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Activity%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Activity%22%20transform=%22translate(2.000000,%201.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Path_33966%22%20points=%225.24485128%2013.2814646%208.23798631%209.39130439%2011.652174%2012.0732266%2014.5812358%208.29290622%22%3E%3C/polyline%3E%3Ccircle%20id=%22Ellipse_741%22%20cx=%2217.9954234%22%20cy=%222.70022885%22%20r=%221.92219681%22%3E%3C/circle%3E%3Cpath%20d=%22M12.9244852,1.62013731%20L5.6567506,1.62013731%20C2.64530894,1.62013731%200.778032041,3.75286043%200.778032041,6.76430209%20L0.778032041,14.846682%20C0.778032041,17.8581237%202.60869567,19.9816935%205.6567506,19.9816935%20L14.2608696,19.9816935%20C17.2723113,19.9816935%2019.1395882,17.8581237%2019.1395882,14.846682%20L19.1395882,7.80778036%22%20id=%22Path%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-activity-bold { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Activity%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Activity%22%20transform=%22translate(2.000000,%201.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%3E%3Cpolyline%20id=%22Path_33966%22%20points=%225.24485128%2013.2814646%208.23798631%209.39130439%2011.652174%2012.0732266%2014.5812358%208.29290622%22%3E%3C/polyline%3E%3Ccircle%20id=%22Ellipse_741%22%20cx=%2217.9954234%22%20cy=%222.70022885%22%20r=%221.92219681%22%3E%3C/circle%3E%3Cpath%20d=%22M12.9244852,1.62013731%20L5.6567506,1.62013731%20C2.64530894,1.62013731%200.778032041,3.75286043%200.778032041,6.76430209%20L0.778032041,14.846682%20C0.778032041,17.8581237%202.60869567,19.9816935%205.6567506,19.9816935%20L14.2608696,19.9816935%20C17.2723113,19.9816935%2019.1395882,17.8581237%2019.1395882,14.846682%20L19.1395882,7.80778036%22%20id=%22Path%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Activity%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Activity%22%20transform=%22translate(2.000000,%201.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%3E%3Cpolyline%20id=%22Path_33966%22%20points=%225.24485128%2013.2814646%208.23798631%209.39130439%2011.652174%2012.0732266%2014.5812358%208.29290622%22%3E%3C/polyline%3E%3Ccircle%20id=%22Ellipse_741%22%20cx=%2217.9954234%22%20cy=%222.70022885%22%20r=%221.92219681%22%3E%3C/circle%3E%3Cpath%20d=%22M12.9244852,1.62013731%20L5.6567506,1.62013731%20C2.64530894,1.62013731%200.778032041,3.75286043%200.778032041,6.76430209%20L0.778032041,14.846682%20C0.778032041,17.8581237%202.60869567,19.9816935%205.6567506,19.9816935%20L14.2608696,19.9816935%20C17.2723113,19.9816935%2019.1395882,17.8581237%2019.1395882,14.846682%20L19.1395882,7.80778036%22%20id=%22Path%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-arrow-down { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12%203V21M12%2021L17%2016M12%2021L7%2016%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12%203V21M12%2021L17%2016M12%2021L7%2016%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-arrow-left { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M21%2012H3M3%2012L8%2017M3%2012L8%207%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M21%2012H3M3%2012L8%2017M3%2012L8%207%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-arrow-right { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2012H21M21%2012L16%207M21%2012L16%2017%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2012H21M21%2012L16%207M21%2012L16%2017%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-arrow-up, .ui-icon.xi-arrow-top { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12%2021V3M12%203L7%208M12%203L17%208%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12%2021V3M12%203L7%208M12%203L17%208%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-book-open { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M5.17459%2018.3741C7.55059%2018.5454%209.61913%2019.5174%2010.8383%2020.2238C11.5592%2020.6412%2012.4408%2020.6412%2013.1617%2020.2238C14.3809%2019.5174%2016.4494%2018.5454%2018.8254%2018.3741C20.0406%2018.2866%2021%2017.3136%2021%2016.0954V5.75371C21%204.38182%2019.7994%203.33004%2018.4362%203.4789C16.2246%203.72117%2014.3137%204.62507%2013.1617%205.2935C12.4408%205.7109%2011.5592%205.7109%2010.8383%205.2935C9.68627%204.62507%207.77535%203.72117%205.56378%203.4789C4.19968%203.33004%203%204.38182%203%205.75371V16.0954C3%2017.3136%203.95935%2018.2866%205.17459%2018.3741Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M12%209.65039V16.4028%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M5.17459%2018.3741C7.55059%2018.5454%209.61913%2019.5174%2010.8383%2020.2238C11.5592%2020.6412%2012.4408%2020.6412%2013.1617%2020.2238C14.3809%2019.5174%2016.4494%2018.5454%2018.8254%2018.3741C20.0406%2018.2866%2021%2017.3136%2021%2016.0954V5.75371C21%204.38182%2019.7994%203.33004%2018.4362%203.4789C16.2246%203.72117%2014.3137%204.62507%2013.1617%205.2935C12.4408%205.7109%2011.5592%205.7109%2010.8383%205.2935C9.68627%204.62507%207.77535%203.72117%205.56378%203.4789C4.19968%203.33004%203%204.38182%203%205.75371V16.0954C3%2017.3136%203.95935%2018.2866%205.17459%2018.3741Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M12%209.65039V16.4028%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-book { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M7.04356%2016.0254H19.4373L19.4441%2019.8044C19.4422%2020.4651%2018.906%2020.9992%2018.2454%2020.9992H7.04356C5.66972%2020.9992%204.55664%2019.8861%204.55664%2018.5123C4.55664%2017.1385%205.66972%2016.0254%207.04356%2016.0254Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4.55664%2018.5131V5.59103C4.55664%204.15978%205.71642%203%207.14767%203H18.2386C18.9002%203%2019.4373%203.53708%2019.4373%204.1987V16.0262%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M9.10742%207.13086H11.8522M9.10742%2011.1168H14.5512%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M7.04356%2016.0254H19.4373L19.4441%2019.8044C19.4422%2020.4651%2018.906%2020.9992%2018.2454%2020.9992H7.04356C5.66972%2020.9992%204.55664%2019.8861%204.55664%2018.5123C4.55664%2017.1385%205.66972%2016.0254%207.04356%2016.0254Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4.55664%2018.5131V5.59103C4.55664%204.15978%205.71642%203%207.14767%203H18.2386C18.9002%203%2019.4373%203.53708%2019.4373%204.1987V16.0262%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M9.10742%207.13086H11.8522M9.10742%2011.1168H14.5512%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
/* Навігація кабінету (вибір 2026-08-29): pie-chart 56394, calendar-check 63210,
   king 12258, star-award 60460, bag 60529, checklist («Sorts complete») 25560 */
.ui-icon.i-pie-chart { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M21%2012.0005C21%207.03054%2016.9709%203.00049%2012%203.00049C7.02908%203.00049%203%207.03054%203%2012.0005C3%2016.9714%207.02908%2021.0005%2012%2021.0005C16.9709%2021.0005%2021%2016.9714%2021%2012.0005Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M11.6895%203.00439V11.3089C11.6895%2011.8612%2012.1372%2012.3089%2012.6895%2012.3089H20.994%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M21%2012.0005C21%207.03054%2016.9709%203.00049%2012%203.00049C7.02908%203.00049%203%207.03054%203%2012.0005C3%2016.9714%207.02908%2021.0005%2012%2021.0005C16.9709%2021.0005%2021%2016.9714%2021%2012.0005Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M11.6895%203.00439V11.3089C11.6895%2011.8612%2012.1372%2012.3089%2012.6895%2012.3089H20.994%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-calendar-check { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M3.98389%209.66447H20.0253%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M15.6408%203V5.96174%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M8.36979%203V5.96174%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M15.8145%204.42151H8.19413C5.55056%204.42151%203.90039%205.89362%203.90039%208.59947V16.7452C3.90039%2019.4939%205.55056%2021.0001%208.19413%2021.0001H15.8067C18.4581%2021.0001%2020.1004%2019.5202%2020.1004%2016.8133V8.59947C20.1082%205.89362%2018.4658%204.42151%2015.8145%204.42151Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M9.85986%2015.0842L11.6151%2016.8424L15.2317%2013.2239%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M3.98389%209.66447H20.0253%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M15.6408%203V5.96174%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M8.36979%203V5.96174%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M15.8145%204.42151H8.19413C5.55056%204.42151%203.90039%205.89362%203.90039%208.59947V16.7452C3.90039%2019.4939%205.55056%2021.0001%208.19413%2021.0001H15.8067C18.4581%2021.0001%2020.1004%2019.5202%2020.1004%2016.8133V8.59947C20.1082%205.89362%2018.4658%204.42151%2015.8145%204.42151Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M9.85986%2015.0842L11.6151%2016.8424L15.2317%2013.2239%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-king { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M20.039%205.41086C18.3588%206.77201%2016.3224%208.42213%2016.1346%208.57391C15.9488%208.36667%2013.4668%205.57529%2012.4403%204.42041C12.2059%204.15674%2011.7943%204.15674%2011.5598%204.42041C10.5324%205.57529%208.05139%208.36667%207.86556%208.57391C7.67778%208.42213%205.64141%206.77201%203.96113%205.41086C3.5379%205.06742%202.91522%205.43422%203.0096%205.97031C3.25672%207.37621%203.78698%2010.9878%204.13529%2013.3939C4.32696%2014.72%205.46336%2015.7007%206.8031%2015.7007H17.1971C18.5368%2015.7007%2019.6732%2014.72%2019.8649%2013.3939C20.2132%2010.9878%2020.7434%207.37621%2020.9906%205.97031C21.084%205.43324%2020.4623%205.06742%2020.039%205.41086Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M5.33398%2019.7812H18.6643%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M20.039%205.41086C18.3588%206.77201%2016.3224%208.42213%2016.1346%208.57391C15.9488%208.36667%2013.4668%205.57529%2012.4403%204.42041C12.2059%204.15674%2011.7943%204.15674%2011.5598%204.42041C10.5324%205.57529%208.05139%208.36667%207.86556%208.57391C7.67778%208.42213%205.64141%206.77201%203.96113%205.41086C3.5379%205.06742%202.91522%205.43422%203.0096%205.97031C3.25672%207.37621%203.78698%2010.9878%204.13529%2013.3939C4.32696%2014.72%205.46336%2015.7007%206.8031%2015.7007H17.1971C18.5368%2015.7007%2019.6732%2014.72%2019.8649%2013.3939C20.2132%2010.9878%2020.7434%207.37621%2020.9906%205.97031C21.084%205.43324%2020.4623%205.06742%2020.039%205.41086Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M5.33398%2019.7812H18.6643%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
/* Сніжинка заморозки стріка (Snow 60047) */
.ui-icon.i-snow { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M12%203V21%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M9.5%204.78955L11.9999%207.28955L14.4999%204.78955%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M9.33594%2019.2104L12.0003%2016.546L14.6648%2019.2104%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M19.7939%207.50024L4.20549%2016.5002%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M16.9941%206.22949L16.0791%209.64451L19.4941%2010.5596%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4.42383%2013.2979L8.06349%2014.2731L7.08824%2017.9127%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M19.7939%2016.4999L4.20549%207.49988%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M16.9941%2017.7706L16.0791%2014.3556L19.4941%2013.4405%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4.42383%2010.7023L8.06349%209.72707L7.08824%206.08737%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M12%203V21%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M9.5%204.78955L11.9999%207.28955L14.4999%204.78955%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M9.33594%2019.2104L12.0003%2016.546L14.6648%2019.2104%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M19.7939%207.50024L4.20549%2016.5002%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M16.9941%206.22949L16.0791%209.64451L19.4941%2010.5596%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4.42383%2013.2979L8.06349%2014.2731L7.08824%2017.9127%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M19.7939%2016.4999L4.20549%207.49988%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M16.9941%2017.7706L16.0791%2014.3556L19.4941%2013.4405%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4.42383%2010.7023L8.06349%209.72707L7.08824%206.08737%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-star-award { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M13.1026%204.16836L14.9306%207.82136C15.1116%208.18136%2015.4586%208.42936%2015.8576%208.48536L19.9476%209.07435C20.6106%209.16138%2021.0766%209.77038%2020.9896%2010.4334C20.9536%2010.7044%2020.8266%2010.9564%2020.6296%2011.1464L17.6716%2013.9884C17.3806%2014.2654%2017.2476%2014.6684%2017.3176%2015.0644L18.0176%2019.0764C18.1256%2019.7464%2017.6696%2020.3764%2016.9996%2020.4844C16.7356%2020.5264%2016.4656%2020.4814%2016.2296%2020.3564L12.5756%2018.4624C12.2156%2018.2764%2011.7886%2018.2764%2011.4286%2018.4624L7.77259%2020.3573C7.17359%2020.6753%206.4306%2020.4473%206.1126%2019.8484C5.9876%2019.6114%205.94258%2019.3414%205.98558%2019.0774L6.6856%2015.0644C6.7546%2014.6694%206.62159%2014.2664%206.33159%2013.9894L3.37059%2011.1474C2.88959%2010.6834%202.8746%209.91738%203.3386%209.43538C3.5286%209.23838%203.78058%209.11138%204.05258%209.07535L8.1426%208.48636C8.5416%208.43036%208.88859%208.18236%209.07059%207.82236L10.9016%204.16836C11.2166%203.56037%2011.9646%203.32337%2012.5726%203.63837C12.7996%203.75537%2012.9846%203.94037%2013.1026%204.16836Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M13.1026%204.16836L14.9306%207.82136C15.1116%208.18136%2015.4586%208.42936%2015.8576%208.48536L19.9476%209.07435C20.6106%209.16138%2021.0766%209.77038%2020.9896%2010.4334C20.9536%2010.7044%2020.8266%2010.9564%2020.6296%2011.1464L17.6716%2013.9884C17.3806%2014.2654%2017.2476%2014.6684%2017.3176%2015.0644L18.0176%2019.0764C18.1256%2019.7464%2017.6696%2020.3764%2016.9996%2020.4844C16.7356%2020.5264%2016.4656%2020.4814%2016.2296%2020.3564L12.5756%2018.4624C12.2156%2018.2764%2011.7886%2018.2764%2011.4286%2018.4624L7.77259%2020.3573C7.17359%2020.6753%206.4306%2020.4473%206.1126%2019.8484C5.9876%2019.6114%205.94258%2019.3414%205.98558%2019.0774L6.6856%2015.0644C6.7546%2014.6694%206.62159%2014.2664%206.33159%2013.9894L3.37059%2011.1474C2.88959%2010.6834%202.8746%209.91738%203.3386%209.43538C3.5286%209.23838%203.78058%209.11138%204.05258%209.07535L8.1426%208.48636C8.5416%208.43036%208.88859%208.18236%209.07059%207.82236L10.9016%204.16836C11.2166%203.56037%2011.9646%203.32337%2012.5726%203.63837C12.7996%203.75537%2012.9846%203.94037%2013.1026%204.16836Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-bag { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M16.2169%203H7.78216C4.84281%203%203%205.08119%203%208.02638V15.9736C3%2018.9188%204.83308%2021%207.78216%2021H16.2159C19.165%2021%2021%2018.9188%2021%2015.9736V8.02638C21%205.08119%2019.165%203%2016.2169%203Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M15.5791%208.82031C15.5791%2010.7974%2013.9766%2012.3999%2011.9995%2012.3999V12.3999C10.0224%2012.3999%208.41992%2010.7974%208.41992%208.82031%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M16.2169%203H7.78216C4.84281%203%203%205.08119%203%208.02638V15.9736C3%2018.9188%204.83308%2021%207.78216%2021H16.2159C19.165%2021%2021%2018.9188%2021%2015.9736V8.02638C21%205.08119%2019.165%203%2016.2169%203Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M15.5791%208.82031C15.5791%2010.7974%2013.9766%2012.3999%2011.9995%2012.3999V12.3999C10.0224%2012.3999%208.41992%2010.7974%208.41992%208.82031%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-checklist { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M4%2017.575L5.45469%2019.0297L7.87888%2016.6055%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4%2011.7586L5.45469%2013.2133L7.87888%2010.7891%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4%205.93825L5.45469%207.39294L7.87888%204.96875%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M11.2734%2018.0586H20.0007%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M11.2734%2012.2422H20.0007%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M11.2734%206.42188H20.0007%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M4%2017.575L5.45469%2019.0297L7.87888%2016.6055%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4%2011.7586L5.45469%2013.2133L7.87888%2010.7891%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M4%205.93825L5.45469%207.39294L7.87888%204.96875%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M11.2734%2018.0586H20.0007%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M11.2734%2012.2422H20.0007%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20d=%22M11.2734%206.42188H20.0007%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-bookmark { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Bookmark%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Bookmark%22%20transform=%22translate(4.200000,%202.300000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M15.5388471,3.85363409%20C15.5388471,1.10275689%2013.6581454,-2.13162821e-14%2010.9503759,-2.13162821e-14%20L4.5914787,-2.13162821e-14%20C1.96691729,-2.13162821e-14%202.66453526e-15,1.02756892%202.66453526e-15,3.67017544%20L2.66453526e-15,18.393985%20C2.66453526e-15,19.1197995%200.780952381,19.5769424%201.41353383,19.2220551%20L7.79548872,15.6421053%20L14.1223058,19.2160401%20C14.7558897,19.5729323%2015.5388471,19.1157895%2015.5388471,18.3889724%20L15.5388471,3.85363409%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cline%20x1=%224.071178%22%20y1=%226.72802013%22%20x2=%2211.3894737%22%20y2=%226.72802013%22%20id=%22Stroke-3%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Bookmark%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Bookmark%22%20transform=%22translate(4.200000,%202.300000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M15.5388471,3.85363409%20C15.5388471,1.10275689%2013.6581454,-2.13162821e-14%2010.9503759,-2.13162821e-14%20L4.5914787,-2.13162821e-14%20C1.96691729,-2.13162821e-14%202.66453526e-15,1.02756892%202.66453526e-15,3.67017544%20L2.66453526e-15,18.393985%20C2.66453526e-15,19.1197995%200.780952381,19.5769424%201.41353383,19.2220551%20L7.79548872,15.6421053%20L14.1223058,19.2160401%20C14.7558897,19.5729323%2015.5388471,19.1157895%2015.5388471,18.3889724%20L15.5388471,3.85363409%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cline%20x1=%224.071178%22%20y1=%226.72802013%22%20x2=%2211.3894737%22%20y2=%226.72802013%22%20id=%22Stroke-3%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-calendar, .ui-icon.xi-calendar { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Calendar%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Calendar%22%20transform=%22translate(3.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%220.0926400664%22%20y1=%227.40425532%22%20x2=%2217.9165888%22%20y2=%227.40425532%22%20id=%22Line_200%22%3E%3C/line%3E%3Cline%20x1=%2213.4420736%22%20y1=%2211.3096927%22%20x2=%2213.4513376%22%20y2=%2211.3096927%22%20id=%22Line_201%22%3E%3C/line%3E%3Cline%20x1=%229.00461445%22%20y1=%2211.3096927%22%20x2=%229.01387846%22%20y2=%2211.3096927%22%20id=%22Line_202%22%3E%3C/line%3E%3Cline%20x1=%224.55789127%22%20y1=%2211.3096927%22%20x2=%224.56715527%22%20y2=%2211.3096927%22%20id=%22Line_203%22%3E%3C/line%3E%3Cline%20x1=%2213.4420736%22%20y1=%2215.1962175%22%20x2=%2213.4513376%22%20y2=%2215.1962175%22%20id=%22Line_204%22%3E%3C/line%3E%3Cline%20x1=%229.00461445%22%20y1=%2215.1962175%22%20x2=%229.01387846%22%20y2=%2215.1962175%22%20id=%22Line_205%22%3E%3C/line%3E%3Cline%20x1=%224.55789127%22%20y1=%2215.1962175%22%20x2=%224.56715527%22%20y2=%2215.1962175%22%20id=%22Line_206%22%3E%3C/line%3E%3Cline%20x1=%2213.0437213%22%20y1=%22-2.26485497e-14%22%20x2=%2213.0437213%22%20y2=%223.29078014%22%20id=%22Line_207%22%3E%3C/line%3E%3Cline%20x1=%224.96550756%22%20y1=%22-2.26485497e-14%22%20x2=%224.96550756%22%20y2=%223.29078014%22%20id=%22Line_208%22%3E%3C/line%3E%3Cpath%20d=%22M13.2382655,1.57919622%20L4.77096342,1.57919622%20C1.83427331,1.57919622%200,3.21513002%200,6.22222222%20L0,15.2718676%20C0,18.3262411%201.83427331,20%204.77096342,20%20L13.2290015,20%20C16.1749556,20%2018,18.3546099%2018,15.3475177%20L18,6.22222222%20C18.0092289,3.21513002%2016.1842196,1.57919622%2013.2382655,1.57919622%20Z%22%20id=%22Path%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Calendar%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Calendar%22%20transform=%22translate(3.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%220.0926400664%22%20y1=%227.40425532%22%20x2=%2217.9165888%22%20y2=%227.40425532%22%20id=%22Line_200%22%3E%3C/line%3E%3Cline%20x1=%2213.4420736%22%20y1=%2211.3096927%22%20x2=%2213.4513376%22%20y2=%2211.3096927%22%20id=%22Line_201%22%3E%3C/line%3E%3Cline%20x1=%229.00461445%22%20y1=%2211.3096927%22%20x2=%229.01387846%22%20y2=%2211.3096927%22%20id=%22Line_202%22%3E%3C/line%3E%3Cline%20x1=%224.55789127%22%20y1=%2211.3096927%22%20x2=%224.56715527%22%20y2=%2211.3096927%22%20id=%22Line_203%22%3E%3C/line%3E%3Cline%20x1=%2213.4420736%22%20y1=%2215.1962175%22%20x2=%2213.4513376%22%20y2=%2215.1962175%22%20id=%22Line_204%22%3E%3C/line%3E%3Cline%20x1=%229.00461445%22%20y1=%2215.1962175%22%20x2=%229.01387846%22%20y2=%2215.1962175%22%20id=%22Line_205%22%3E%3C/line%3E%3Cline%20x1=%224.55789127%22%20y1=%2215.1962175%22%20x2=%224.56715527%22%20y2=%2215.1962175%22%20id=%22Line_206%22%3E%3C/line%3E%3Cline%20x1=%2213.0437213%22%20y1=%22-2.26485497e-14%22%20x2=%2213.0437213%22%20y2=%223.29078014%22%20id=%22Line_207%22%3E%3C/line%3E%3Cline%20x1=%224.96550756%22%20y1=%22-2.26485497e-14%22%20x2=%224.96550756%22%20y2=%223.29078014%22%20id=%22Line_208%22%3E%3C/line%3E%3Cpath%20d=%22M13.2382655,1.57919622%20L4.77096342,1.57919622%20C1.83427331,1.57919622%200,3.21513002%200,6.22222222%20L0,15.2718676%20C0,18.3262411%201.83427331,20%204.77096342,20%20L13.2290015,20%20C16.1749556,20%2018,18.3546099%2018,15.3475177%20L18,6.22222222%20C18.0092289,3.21513002%2016.1842196,1.57919622%2013.2382655,1.57919622%20Z%22%20id=%22Path%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-category { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Category%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Category%22%20transform=%22translate(2.999141,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M0.000858865205,3.5%20C0.000858865205,0.874787053%200.0289681101,0%203.50085887,0%20C6.9727494,0%207.00085887,0.874787053%207.00085887,3.5%20C7.00085887,6.12521295%207.01193168,7%203.50085887,7%20C-0.010214169,7%200.000858865205,6.12521295%200.000858865205,3.5%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M11.0008589,3.5%20C11.0008589,0.874787053%2011.0289681,0%2014.5008589,0%20C17.9727494,0%2018.0008589,0.874787053%2018.0008589,3.5%20C18.0008589,6.12521295%2018.0119317,7%2014.5008589,7%20C10.9897858,7%2011.0008589,6.12521295%2011.0008589,3.5%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cpath%20d=%22M0.000858865205,14.5%20C0.000858865205,11.8747871%200.0289681101,11%203.50085887,11%20C6.9727494,11%207.00085887,11.8747871%207.00085887,14.5%20C7.00085887,17.1252129%207.01193168,18%203.50085887,18%20C-0.010214169,18%200.000858865205,17.1252129%200.000858865205,14.5%20Z%22%20id=%22Stroke-5%22%3E%3C/path%3E%3Cpath%20d=%22M11.0008589,14.5%20C11.0008589,11.8747871%2011.0289681,11%2014.5008589,11%20C17.9727494,11%2018.0008589,11.8747871%2018.0008589,14.5%20C18.0008589,17.1252129%2018.0119317,18%2014.5008589,18%20C10.9897858,18%2011.0008589,17.1252129%2011.0008589,14.5%20Z%22%20id=%22Stroke-7%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Category%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Category%22%20transform=%22translate(2.999141,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M0.000858865205,3.5%20C0.000858865205,0.874787053%200.0289681101,0%203.50085887,0%20C6.9727494,0%207.00085887,0.874787053%207.00085887,3.5%20C7.00085887,6.12521295%207.01193168,7%203.50085887,7%20C-0.010214169,7%200.000858865205,6.12521295%200.000858865205,3.5%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M11.0008589,3.5%20C11.0008589,0.874787053%2011.0289681,0%2014.5008589,0%20C17.9727494,0%2018.0008589,0.874787053%2018.0008589,3.5%20C18.0008589,6.12521295%2018.0119317,7%2014.5008589,7%20C10.9897858,7%2011.0008589,6.12521295%2011.0008589,3.5%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cpath%20d=%22M0.000858865205,14.5%20C0.000858865205,11.8747871%200.0289681101,11%203.50085887,11%20C6.9727494,11%207.00085887,11.8747871%207.00085887,14.5%20C7.00085887,17.1252129%207.01193168,18%203.50085887,18%20C-0.010214169,18%200.000858865205,17.1252129%200.000858865205,14.5%20Z%22%20id=%22Stroke-5%22%3E%3C/path%3E%3Cpath%20d=%22M11.0008589,14.5%20C11.0008589,11.8747871%2011.0289681,11%2014.5008589,11%20C17.9727494,11%2018.0008589,11.8747871%2018.0008589,14.5%20C18.0008589,17.1252129%2018.0119317,18%2014.5008589,18%20C10.9897858,18%2011.0008589,17.1252129%2011.0008589,14.5%20Z%22%20id=%22Stroke-7%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-chart { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Chart%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Chart%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%225.37142857%22%20y1=%228.20171265%22%20x2=%225.37142857%22%20y2=%2215.0618459%22%20id=%22Line_182%22%3E%3C/line%3E%3Cline%20x1=%2210.0380952%22%20y1=%224.91912464%22%20x2=%2210.0380952%22%20y2=%2215.0618459%22%20id=%22Line_183%22%3E%3C/line%3E%3Cline%20x1=%2214.6285714%22%20y1=%2211.8268316%22%20x2=%2214.6285714%22%20y2=%2215.0618459%22%20id=%22Line_184%22%3E%3C/line%3E%3Cpath%20d=%22M14.6857143,0%20L5.31428571,0%20C2.04761905,0%200,2.31208373%200,5.58515699%20L0,14.414843%20C0,17.6879163%202.03809524,20%205.31428571,20%20L14.6857143,20%20C17.9619048,20%2020,17.6879163%2020,14.414843%20L20,5.58515699%20C20,2.31208373%2017.9619048,0%2014.6857143,0%20Z%22%20id=%22Path%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Chart%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Chart%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%225.37142857%22%20y1=%228.20171265%22%20x2=%225.37142857%22%20y2=%2215.0618459%22%20id=%22Line_182%22%3E%3C/line%3E%3Cline%20x1=%2210.0380952%22%20y1=%224.91912464%22%20x2=%2210.0380952%22%20y2=%2215.0618459%22%20id=%22Line_183%22%3E%3C/line%3E%3Cline%20x1=%2214.6285714%22%20y1=%2211.8268316%22%20x2=%2214.6285714%22%20y2=%2215.0618459%22%20id=%22Line_184%22%3E%3C/line%3E%3Cpath%20d=%22M14.6857143,0%20L5.31428571,0%20C2.04761905,0%200,2.31208373%200,5.58515699%20L0,14.414843%20C0,17.6879163%202.03809524,20%205.31428571,20%20L14.6857143,20%20C17.9619048,20%2020,17.6879163%2020,14.414843%20L20,5.58515699%20C20,2.31208373%2017.9619048,0%2014.6857143,0%20Z%22%20id=%22Path%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-chat { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Chat%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Chat%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%3E%3Cpath%20d=%22M17.0713569,17.0698633%20C14.0152073,20.1263497%209.48977439,20.7866955%205.78641655,19.0740178%20C5.23970647,18.8539025%204.7914846,18.6760012%204.36537232,18.6760012%20C3.17848885,18.6830368%201.70116564,19.8338678%200.933359565,19.0669822%20C0.165553489,18.2990915%201.3172626,16.8206004%201.3172626,15.6265504%20C1.3172626,15.2003912%201.1464157,14.7601607%200.926324692,14.2123853%20C-0.787169233,10.5096244%20-0.125891225,5.98268764%202.93025835,2.92720636%20C6.8315976,-0.975567922%2013.1700176,-0.975567922%2017.0713569,2.92620127%20C20.979731,6.83500611%2020.9726961,13.1680941%2017.0713569,17.0698633%20Z%22%20id=%22Stroke-4%22%20stroke-width=%221.5%22%3E%3C/path%3E%3Cline%20x1=%2213.9394%22%20y1=%2210.413%22%20x2=%2213.9484%22%20y2=%2210.413%22%20id=%22Stroke-11%22%20stroke-width=%222%22%3E%3C/line%3E%3Cline%20x1=%229.9304%22%20y1=%2210.413%22%20x2=%229.9394%22%20y2=%2210.413%22%20id=%22Stroke-13%22%20stroke-width=%222%22%3E%3C/line%3E%3Cline%20x1=%225.9214%22%20y1=%2210.413%22%20x2=%225.9304%22%20y2=%2210.413%22%20id=%22Stroke-15%22%20stroke-width=%222%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Chat%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Chat%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%3E%3Cpath%20d=%22M17.0713569,17.0698633%20C14.0152073,20.1263497%209.48977439,20.7866955%205.78641655,19.0740178%20C5.23970647,18.8539025%204.7914846,18.6760012%204.36537232,18.6760012%20C3.17848885,18.6830368%201.70116564,19.8338678%200.933359565,19.0669822%20C0.165553489,18.2990915%201.3172626,16.8206004%201.3172626,15.6265504%20C1.3172626,15.2003912%201.1464157,14.7601607%200.926324692,14.2123853%20C-0.787169233,10.5096244%20-0.125891225,5.98268764%202.93025835,2.92720636%20C6.8315976,-0.975567922%2013.1700176,-0.975567922%2017.0713569,2.92620127%20C20.979731,6.83500611%2020.9726961,13.1680941%2017.0713569,17.0698633%20Z%22%20id=%22Stroke-4%22%20stroke-width=%221.5%22%3E%3C/path%3E%3Cline%20x1=%2213.9394%22%20y1=%2210.413%22%20x2=%2213.9484%22%20y2=%2210.413%22%20id=%22Stroke-11%22%20stroke-width=%222%22%3E%3C/line%3E%3Cline%20x1=%229.9304%22%20y1=%2210.413%22%20x2=%229.9394%22%20y2=%2210.413%22%20id=%22Stroke-13%22%20stroke-width=%222%22%3E%3C/line%3E%3Cline%20x1=%225.9214%22%20y1=%2210.413%22%20x2=%225.9304%22%20y2=%2210.413%22%20id=%22Stroke-15%22%20stroke-width=%222%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-chevron-down { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Down-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Down-2%22%20transform=%22translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Down-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Down-2%22%20transform=%22translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-chevron-left, .ui-icon.xi-arrow-left { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Left-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Left-2%22%20transform=%22translate(12.000000,%2012.000000)%20rotate(-270.000000)%20translate(-12.000000,%20-12.000000)%20translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Left-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Left-2%22%20transform=%22translate(12.000000,%2012.000000)%20rotate(-270.000000)%20translate(-12.000000,%20-12.000000)%20translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-chevron-right, .ui-icon.xi-arrow-right { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Right-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Right-2%22%20transform=%22translate(12.000000,%2012.000000)%20rotate(-90.000000)%20translate(-12.000000,%20-12.000000)%20translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Right-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Right-2%22%20transform=%22translate(12.000000,%2012.000000)%20rotate(-90.000000)%20translate(-12.000000,%20-12.000000)%20translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-chevron-up { mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2224%22%20viewBox=%220%200%2025%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M19.25%2015.5L12.25%208.5L5.25%2015.5%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2224%22%20viewBox=%220%200%2025%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M19.25%2015.5L12.25%208.5L5.25%2015.5%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-close { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Close-Square%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Close-Square%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%2212.3955%22%20y1=%227.5949%22%20x2=%227.6035%22%20y2=%2212.3869%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cline%20x1=%2212.397%22%20y1=%2212.3898%22%20x2=%227.601%22%20y2=%227.5928%22%20id=%22Stroke-2%22%3E%3C/line%3E%3Cpath%20d=%22M14.3345,0.7502%20L5.6655,0.7502%20C2.6445,0.7502%200.7505,2.8892%200.7505,5.9162%20L0.7505,14.0842%20C0.7505,17.1112%202.6355,19.2502%205.6655,19.2502%20L14.3335,19.2502%20C17.3645,19.2502%2019.2505,17.1112%2019.2505,14.0842%20L19.2505,5.9162%20C19.2505,2.8892%2017.3645,0.7502%2014.3345,0.7502%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Close-Square%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Close-Square%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%2212.3955%22%20y1=%227.5949%22%20x2=%227.6035%22%20y2=%2212.3869%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cline%20x1=%2212.397%22%20y1=%2212.3898%22%20x2=%227.601%22%20y2=%227.5928%22%20id=%22Stroke-2%22%3E%3C/line%3E%3Cpath%20d=%22M14.3345,0.7502%20L5.6655,0.7502%20C2.6445,0.7502%200.7505,2.8892%200.7505,5.9162%20L0.7505,14.0842%20C0.7505,17.1112%202.6355,19.2502%205.6655,19.2502%20L14.3335,19.2502%20C17.3645,19.2502%2019.2505,17.1112%2019.2505,14.0842%20L19.2505,5.9162%20C19.2505,2.8892%2017.3645,0.7502%2014.3345,0.7502%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-danger { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Danger-Circle%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Danger-Circle%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%3E%3Cpath%20d=%22M10.0001,0.7501%20C15.1081,0.7501%2019.2501,4.8911%2019.2501,10.0001%20C19.2501,15.1081%2015.1081,19.2501%2010.0001,19.2501%20C4.8911,19.2501%200.7501,15.1081%200.7501,10.0001%20C0.7501,4.8911%204.8911,0.7501%2010.0001,0.7501%20Z%22%20id=%22Stroke-1%22%20stroke-width=%221.5%22%3E%3C/path%3E%3Cline%20x1=%229.9952%22%20y1=%226.2042%22%20x2=%229.9952%22%20y2=%2210.6232%22%20id=%22Stroke-3%22%20stroke-width=%221.5%22%3E%3C/line%3E%3Cline%20x1=%229.995%22%20y1=%2213.7961%22%20x2=%2210.005%22%20y2=%2213.7961%22%20id=%22Stroke-5%22%20stroke-width=%222%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Danger-Circle%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Danger-Circle%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%3E%3Cpath%20d=%22M10.0001,0.7501%20C15.1081,0.7501%2019.2501,4.8911%2019.2501,10.0001%20C19.2501,15.1081%2015.1081,19.2501%2010.0001,19.2501%20C4.8911,19.2501%200.7501,15.1081%200.7501,10.0001%20C0.7501,4.8911%204.8911,0.7501%2010.0001,0.7501%20Z%22%20id=%22Stroke-1%22%20stroke-width=%221.5%22%3E%3C/path%3E%3Cline%20x1=%229.9952%22%20y1=%226.2042%22%20x2=%229.9952%22%20y2=%2210.6232%22%20id=%22Stroke-3%22%20stroke-width=%221.5%22%3E%3C/line%3E%3Cline%20x1=%229.995%22%20y1=%2213.7961%22%20x2=%2210.005%22%20y2=%2213.7961%22%20id=%22Stroke-5%22%20stroke-width=%222%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-delete { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M18.9166%209.54688L18.3047%2017.9235C18.1782%2019.6562%2016.7354%2020.9988%2014.9968%2020.9988H9.00378C7.26619%2020.9988%205.82241%2019.6562%205.69594%2017.9225L5.08398%209.54688%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M20.2649%206.40234H3.73535%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M15.7714%206.40125L15.2684%203.92523C15.1225%203.37944%2014.6273%203.00001%2014.063%203.00001H9.9418C9.3746%202.99806%208.87745%203.37749%208.73054%203.92523L8.23242%206.40125%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M10.1016%2011.7812V16.2896M13.482%2011.7812V16.2896%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M18.9166%209.54688L18.3047%2017.9235C18.1782%2019.6562%2016.7354%2020.9988%2014.9968%2020.9988H9.00378C7.26619%2020.9988%205.82241%2019.6562%205.69594%2017.9225L5.08398%209.54688%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M20.2649%206.40234H3.73535%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M15.7714%206.40125L15.2684%203.92523C15.1225%203.37944%2014.6273%203.00001%2014.063%203.00001H9.9418C9.3746%202.99806%208.87745%203.37749%208.73054%203.92523L8.23242%206.40125%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M10.1016%2011.7812V16.2896M13.482%2011.7812V16.2896%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-document, .ui-icon.xi-document { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Document%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Document%22%20transform=%22translate(3.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%2212.7162%22%20y1=%2214.2234%22%20x2=%225.4962%22%20y2=%2214.2234%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cline%20x1=%2212.7162%22%20y1=%2210.0369%22%20x2=%225.4962%22%20y2=%2210.0369%22%20id=%22Stroke-2%22%3E%3C/line%3E%3Cline%20x1=%228.2513%22%20y1=%225.8601%22%20x2=%225.4963%22%20y2=%225.8601%22%20id=%22Stroke-3%22%3E%3C/line%3E%3Cpath%20d=%22M12.9086,0.7498%20C12.9086,0.7498%205.2316,0.7538%205.2196,0.7538%20C2.4596,0.7708%200.7506,2.5868%200.7506,5.3568%20L0.7506,14.5528%20C0.7506,17.3368%202.4726,19.1598%205.2566,19.1598%20C5.2566,19.1598%2012.9326,19.1568%2012.9456,19.1568%20C15.7056,19.1398%2017.4156,17.3228%2017.4156,14.5528%20L17.4156,5.3568%20C17.4156,2.5728%2015.6926,0.7498%2012.9086,0.7498%20Z%22%20id=%22Stroke-4%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Document%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Document%22%20transform=%22translate(3.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%2212.7162%22%20y1=%2214.2234%22%20x2=%225.4962%22%20y2=%2214.2234%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cline%20x1=%2212.7162%22%20y1=%2210.0369%22%20x2=%225.4962%22%20y2=%2210.0369%22%20id=%22Stroke-2%22%3E%3C/line%3E%3Cline%20x1=%228.2513%22%20y1=%225.8601%22%20x2=%225.4963%22%20y2=%225.8601%22%20id=%22Stroke-3%22%3E%3C/line%3E%3Cpath%20d=%22M12.9086,0.7498%20C12.9086,0.7498%205.2316,0.7538%205.2196,0.7538%20C2.4596,0.7708%200.7506,2.5868%200.7506,5.3568%20L0.7506,14.5528%20C0.7506,17.3368%202.4726,19.1598%205.2566,19.1598%20C5.2566,19.1598%2012.9326,19.1568%2012.9456,19.1568%20C15.7056,19.1398%2017.4156,17.3228%2017.4156,14.5528%20L17.4156,5.3568%20C17.4156,2.5728%2015.6926,0.7498%2012.9086,0.7498%20Z%22%20id=%22Stroke-4%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-download { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2015V15.0798C3%2017.1521%203%2018.1883%203.40328%2018.9798C3.75801%2019.676%204.32404%2020.242%205.02024%2020.5967C5.81171%2021%206.84781%2021%208.92%2021H15.08C17.1522%2021%2018.1883%2021%2018.9798%2020.5967C19.676%2020.242%2020.242%2019.676%2020.5967%2018.9798C21%2018.1883%2021%2017.1521%2021%2015.0798V15%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M7.78125%2011.2066L11.9997%2015.5509M11.9997%2015.5509L16.2182%2011.2066M11.9997%2015.5509L12.0002%203%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2015V15.0798C3%2017.1521%203%2018.1883%203.40328%2018.9798C3.75801%2019.676%204.32404%2020.242%205.02024%2020.5967C5.81171%2021%206.84781%2021%208.92%2021H15.08C17.1522%2021%2018.1883%2021%2018.9798%2020.5967C19.676%2020.242%2020.242%2019.676%2020.5967%2018.9798C21%2018.1883%2021%2017.1521%2021%2015.0798V15%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M7.78125%2011.2066L11.9997%2015.5509M11.9997%2015.5509L16.2182%2011.2066M11.9997%2015.5509L12.0002%203%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-edit-square { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Edit-Square%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Edit-Square%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M9.4923,0.789%20L5.7533,0.789%20C2.6783,0.789%200.7503,2.966%200.7503,6.048%20L0.7503,14.362%20C0.7503,17.444%202.6693,19.621%205.7533,19.621%20L14.5773,19.621%20C17.6623,19.621%2019.5813,17.444%2019.5813,14.362%20L19.5813,10.334%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M6.8278,8.9209%20L14.3008,1.4479%20C15.2318,0.5179%2016.7408,0.5179%2017.6718,1.4479%20L18.8888,2.6649%20C19.8198,3.5959%2019.8198,5.1059%2018.8888,6.0359%20L11.3798,13.5449%20C10.9728,13.9519%2010.4208,14.1809%209.8448,14.1809%20L6.0988,14.1809%20L6.1928,10.4009%20C6.2068,9.8449%206.4338,9.3149%206.8278,8.9209%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%2213.1652%22%20y1=%222.6025%22%20x2=%2217.7312%22%20y2=%227.1685%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Edit-Square%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Edit-Square%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M9.4923,0.789%20L5.7533,0.789%20C2.6783,0.789%200.7503,2.966%200.7503,6.048%20L0.7503,14.362%20C0.7503,17.444%202.6693,19.621%205.7533,19.621%20L14.5773,19.621%20C17.6623,19.621%2019.5813,17.444%2019.5813,14.362%20L19.5813,10.334%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M6.8278,8.9209%20L14.3008,1.4479%20C15.2318,0.5179%2016.7408,0.5179%2017.6718,1.4479%20L18.8888,2.6649%20C19.8198,3.5959%2019.8198,5.1059%2018.8888,6.0359%20L11.3798,13.5449%20C10.9728,13.9519%2010.4208,14.1809%209.8448,14.1809%20L6.0988,14.1809%20L6.1928,10.4009%20C6.2068,9.8449%206.4338,9.3149%206.8278,8.9209%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%2213.1652%22%20y1=%222.6025%22%20x2=%2217.7312%22%20y2=%227.1685%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-edit, .ui-icon.xi-edit { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Edit%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Edit%22%20transform=%22translate(3.000000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%2210.7473996%22%20y1=%2217.4429051%22%20x2=%2218%22%20y2=%2217.4429051%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cpath%20d=%22M9.7800071,0.794792587%20C10.5556498,-0.132213323%2011.949987,-0.268144478%2012.8962256,0.491732963%20C12.9485416,0.532957985%2014.6294799,1.83878843%2014.6294799,1.83878843%20C15.6689776,2.46719147%2015.9919725,3.80310504%2015.3493946,4.8225887%20C15.3152754,4.877184%205.81194644,16.7644749%205.81194644,16.7644749%20C5.49577537,17.1588981%205.01583223,17.3917638%204.50290722,17.3973347%20L0.863527997,17.4430165%20L0.0435303654,13.9723153%20C-0.0713375414,13.4843002%200.0435303654,12.9717729%200.359701436,12.5773497%20L9.7800071,0.794792587%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%228.02082217%22%20y1=%223.00088838%22%20x2=%2213.4730672%22%20y2=%227.18801364%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Edit%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Edit%22%20transform=%22translate(3.000000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%2210.7473996%22%20y1=%2217.4429051%22%20x2=%2218%22%20y2=%2217.4429051%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cpath%20d=%22M9.7800071,0.794792587%20C10.5556498,-0.132213323%2011.949987,-0.268144478%2012.8962256,0.491732963%20C12.9485416,0.532957985%2014.6294799,1.83878843%2014.6294799,1.83878843%20C15.6689776,2.46719147%2015.9919725,3.80310504%2015.3493946,4.8225887%20C15.3152754,4.877184%205.81194644,16.7644749%205.81194644,16.7644749%20C5.49577537,17.1588981%205.01583223,17.3917638%204.50290722,17.3973347%20L0.863527997,17.4430165%20L0.0435303654,13.9723153%20C-0.0713375414,13.4843002%200.0435303654,12.9717729%200.359701436,12.5773497%20L9.7800071,0.794792587%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%228.02082217%22%20y1=%223.00088838%22%20x2=%2213.4730672%22%20y2=%227.18801364%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
/* Жирніші варіанти для пігулок банера: у 16px світлий штрих 1.5 тане поруч
   із текстом. Той самий прийом, що в i-time-bold та i-info-circle-bold —
   не нова іконка з пака, а той самий контур зі штрихом 1.75. */
.ui-icon.i-edit-bold { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Edit%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Edit%22%20transform=%22translate(3.000000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%3E%3Cline%20x1=%2210.7473996%22%20y1=%2217.4429051%22%20x2=%2218%22%20y2=%2217.4429051%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cpath%20d=%22M9.7800071,0.794792587%20C10.5556498,-0.132213323%2011.949987,-0.268144478%2012.8962256,0.491732963%20C12.9485416,0.532957985%2014.6294799,1.83878843%2014.6294799,1.83878843%20C15.6689776,2.46719147%2015.9919725,3.80310504%2015.3493946,4.8225887%20C15.3152754,4.877184%205.81194644,16.7644749%205.81194644,16.7644749%20C5.49577537,17.1588981%205.01583223,17.3917638%204.50290722,17.3973347%20L0.863527997,17.4430165%20L0.0435303654,13.9723153%20C-0.0713375414,13.4843002%200.0435303654,12.9717729%200.359701436,12.5773497%20L9.7800071,0.794792587%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%228.02082217%22%20y1=%223.00088838%22%20x2=%2213.4730672%22%20y2=%227.18801364%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Edit%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Edit%22%20transform=%22translate(3.000000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%3E%3Cline%20x1=%2210.7473996%22%20y1=%2217.4429051%22%20x2=%2218%22%20y2=%2217.4429051%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cpath%20d=%22M9.7800071,0.794792587%20C10.5556498,-0.132213323%2011.949987,-0.268144478%2012.8962256,0.491732963%20C12.9485416,0.532957985%2014.6294799,1.83878843%2014.6294799,1.83878843%20C15.6689776,2.46719147%2015.9919725,3.80310504%2015.3493946,4.8225887%20C15.3152754,4.877184%205.81194644,16.7644749%205.81194644,16.7644749%20C5.49577537,17.1588981%205.01583223,17.3917638%204.50290722,17.3973347%20L0.863527997,17.4430165%20L0.0435303654,13.9723153%20C-0.0713375414,13.4843002%200.0435303654,12.9717729%200.359701436,12.5773497%20L9.7800071,0.794792587%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%228.02082217%22%20y1=%223.00088838%22%20x2=%2213.4730672%22%20y2=%227.18801364%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-filter { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Filter%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Filter%22%20transform=%22translate(4.000000,%204.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%226.33015655%22%20y1=%2212.0929063%22%20x2=%220.0294393477%22%20y2=%2212.0929063%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cline%20x1=%229.14048198%22%20y1=%222.40037662%22%20x2=%2215.4411992%22%20y2=%222.40037662%22%20id=%22Stroke-3%22%3E%3C/line%3E%3Cpath%20d=%22M4.72628792,2.34625359%20C4.72628792,1.05059752%203.66812728,1.79725516e-14%202.36314396,1.79725516e-14%20C1.05816064,1.79725516e-14%201.25389895e-15,1.05059752%201.25389895e-15,2.34625359%20C1.25389895e-15,3.64190965%201.05816064,4.69250717%202.36314396,4.69250717%20C3.66812728,4.69250717%204.72628792,3.64190965%204.72628792,2.34625359%20Z%22%20id=%22Stroke-5%22%3E%3C/path%3E%3Cpath%20d=%22M16,12.0537464%20C16,10.7580903%2014.942654,9.70749283%2013.6376706,9.70749283%20C12.3318727,9.70749283%2011.2737121,10.7580903%2011.2737121,12.0537464%20C11.2737121,13.3494025%2012.3318727,14.4%2013.6376706,14.4%20C14.942654,14.4%2016,13.3494025%2016,12.0537464%20Z%22%20id=%22Stroke-7%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Filter%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Filter%22%20transform=%22translate(4.000000,%204.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%226.33015655%22%20y1=%2212.0929063%22%20x2=%220.0294393477%22%20y2=%2212.0929063%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cline%20x1=%229.14048198%22%20y1=%222.40037662%22%20x2=%2215.4411992%22%20y2=%222.40037662%22%20id=%22Stroke-3%22%3E%3C/line%3E%3Cpath%20d=%22M4.72628792,2.34625359%20C4.72628792,1.05059752%203.66812728,1.79725516e-14%202.36314396,1.79725516e-14%20C1.05816064,1.79725516e-14%201.25389895e-15,1.05059752%201.25389895e-15,2.34625359%20C1.25389895e-15,3.64190965%201.05816064,4.69250717%202.36314396,4.69250717%20C3.66812728,4.69250717%204.72628792,3.64190965%204.72628792,2.34625359%20Z%22%20id=%22Stroke-5%22%3E%3C/path%3E%3Cpath%20d=%22M16,12.0537464%20C16,10.7580903%2014.942654,9.70749283%2013.6376706,9.70749283%20C12.3318727,9.70749283%2011.2737121,10.7580903%2011.2737121,12.0537464%20C11.2737121,13.3494025%2012.3318727,14.4%2013.6376706,14.4%20C14.942654,14.4%2016,13.3494025%2016,12.0537464%20Z%22%20id=%22Stroke-7%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
/* Кастомний вогник стріка (бренд-іконка, не Iconly) */
.ui-icon.i-flame { mask: url("data:image/svg+xml,%3Csvg%20width=%2232%22%20height=%2232%22%20viewBox=%220%200%2032%2032%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M15.5049%201.19451C16.0269%201.16378%2016.3874%201.46602%2017.1074%202.06951C20.8169%205.17895%2019.2735%2010.2199%2020.499%2010.2199C21.7399%2010.2196%2021.3827%207.55938%2022.8525%208.05584C23.1048%208.14113%2023.3094%208.37745%2023.7178%208.85076C26.311%2011.8566%2027.9569%2015.9847%2027.957%2019.3791C27.957%2025.5037%2022.5977%2030.4689%2015.9863%2030.4689C9.37507%2030.4688%204.01562%2025.5036%204.01562%2019.3791C4.01585%2010.7816%2010.3419%206.15179%2013.5723%202.72283C14.5126%201.72468%2014.983%201.22544%2015.5049%201.19451ZM17.2939%2017.3654C15.0347%2017.3654%2014.1918%2011.169%2012.9697%2012.2892C10.5199%2014.535%209.99224%2017.4589%209.99219%2020.0451C9.99219%2023.1074%2012.6719%2025.59%2015.9775%2025.59C19.2832%2025.59%2021.9629%2023.1074%2021.9629%2020.0451C21.9627%2017.9289%2020.4895%2015.3908%2020.0195%2015.3908C18.7978%2015.3912%2018.0224%2017.365%2017.2939%2017.3654Z%22%20fill=%22black%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2232%22%20height=%2232%22%20viewBox=%220%200%2032%2032%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M15.5049%201.19451C16.0269%201.16378%2016.3874%201.46602%2017.1074%202.06951C20.8169%205.17895%2019.2735%2010.2199%2020.499%2010.2199C21.7399%2010.2196%2021.3827%207.55938%2022.8525%208.05584C23.1048%208.14113%2023.3094%208.37745%2023.7178%208.85076C26.311%2011.8566%2027.9569%2015.9847%2027.957%2019.3791C27.957%2025.5037%2022.5977%2030.4689%2015.9863%2030.4689C9.37507%2030.4688%204.01562%2025.5036%204.01562%2019.3791C4.01585%2010.7816%2010.3419%206.15179%2013.5723%202.72283C14.5126%201.72468%2014.983%201.22544%2015.5049%201.19451ZM17.2939%2017.3654C15.0347%2017.3654%2014.1918%2011.169%2012.9697%2012.2892C10.5199%2014.535%209.99224%2017.4589%209.99219%2020.0451C9.99219%2023.1074%2012.6719%2025.59%2015.9775%2025.59C19.2832%2025.59%2021.9629%2023.1074%2021.9629%2020.0451C21.9627%2017.9289%2020.4895%2015.3908%2020.0195%2015.3908C18.7978%2015.3912%2018.0224%2017.365%2017.2939%2017.3654Z%22%20fill=%22black%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-graph { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Graph%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Graph%22%20transform=%22translate(2.300000,%202.100000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M14.9778947,11.789176%20C15.6526316,11.789176%2016.2189474,12.3460181%2016.1157895,13.0123339%20C15.5105263,16.9323339%2012.1547368,19.8428602%208.10736842,19.8428602%20C3.62947368,19.8428602%20-3.55271368e-15,16.2133865%20-3.55271368e-15,11.7365444%20C-3.55271368e-15,8.04812338%202.80210526,4.6123339%205.95684211,3.8354918%20C6.63473684,3.66812338%207.32947368,4.14496548%207.32947368,4.84286022%20C7.32947368,9.57128127%207.48842105,10.7944392%208.38631579,11.4597023%20C9.28421053,12.1249655%2010.34,11.789176%2014.9778947,11.789176%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M19.3925267,7.85159824%20C19.4462109,4.8137035%2015.714632,-0.0831386003%2011.1672636,0.00107192599%20C10.8135794,0.00738771546%2010.5304215,0.302124558%2010.514632,0.654756137%20C10.3998952,3.15265087%2010.554632,6.38949298%2010.6409478,7.8568614%20C10.6672636,8.3137035%2011.0262109,8.67265087%2011.4820004,8.69896666%20C12.9904215,8.78528245%2016.3451583,8.90317719%2018.8072636,8.53054561%20C19.1420004,8.48001929%2019.3872636,8.18949298%2019.3925267,7.85159824%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Graph%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Graph%22%20transform=%22translate(2.300000,%202.100000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M14.9778947,11.789176%20C15.6526316,11.789176%2016.2189474,12.3460181%2016.1157895,13.0123339%20C15.5105263,16.9323339%2012.1547368,19.8428602%208.10736842,19.8428602%20C3.62947368,19.8428602%20-3.55271368e-15,16.2133865%20-3.55271368e-15,11.7365444%20C-3.55271368e-15,8.04812338%202.80210526,4.6123339%205.95684211,3.8354918%20C6.63473684,3.66812338%207.32947368,4.14496548%207.32947368,4.84286022%20C7.32947368,9.57128127%207.48842105,10.7944392%208.38631579,11.4597023%20C9.28421053,12.1249655%2010.34,11.789176%2014.9778947,11.789176%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M19.3925267,7.85159824%20C19.4462109,4.8137035%2015.714632,-0.0831386003%2011.1672636,0.00107192599%20C10.8135794,0.00738771546%2010.5304215,0.302124558%2010.514632,0.654756137%20C10.3998952,3.15265087%2010.554632,6.38949298%2010.6409478,7.8568614%20C10.6672636,8.3137035%2011.0262109,8.67265087%2011.4820004,8.69896666%20C12.9904215,8.78528245%2016.3451583,8.90317719%2018.8072636,8.53054561%20C19.1420004,8.48001929%2019.3872636,8.18949298%2019.3925267,7.85159824%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-heart { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Heart%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Heart%22%20transform=%22translate(2.500000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M0.371865331,8.59832177%20C-0.701134669,5.24832177%200.552865331,1.41932177%204.06986533,0.28632177%20C5.91986533,-0.31067823%207.96186533,0.0413217701%209.49986533,1.19832177%20C10.9548653,0.0733217701%2013.0718653,-0.30667823%2014.9198653,0.28632177%20C18.4368653,1.41932177%2019.6988653,5.24832177%2018.6268653,8.59832177%20C16.9568653,13.9083218%209.49986533,17.9983218%209.49986533,17.9983218%20C9.49986533,17.9983218%202.09786533,13.9703218%200.371865331,8.59832177%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M13.5,3.7%20C14.57,4.046%2015.326,5.001%2015.417,6.122%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Heart%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Heart%22%20transform=%22translate(2.500000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M0.371865331,8.59832177%20C-0.701134669,5.24832177%200.552865331,1.41932177%204.06986533,0.28632177%20C5.91986533,-0.31067823%207.96186533,0.0413217701%209.49986533,1.19832177%20C10.9548653,0.0733217701%2013.0718653,-0.30667823%2014.9198653,0.28632177%20C18.4368653,1.41932177%2019.6988653,5.24832177%2018.6268653,8.59832177%20C16.9568653,13.9083218%209.49986533,17.9983218%209.49986533,17.9983218%20C9.49986533,17.9983218%202.09786533,13.9703218%200.371865331,8.59832177%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M13.5,3.7%20C14.57,4.046%2015.326,5.001%2015.417,6.122%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-hide { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Hide%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Hide%22%20transform=%22translate(2.000000,%203.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M7.7606,10.8668%20C7.1856,10.2928%206.8356,9.5128%206.8356,8.6378%20C6.8356,6.8848%208.2476,5.4718%209.9996,5.4718%20C10.8666,5.4718%2011.6646,5.8228%2012.2296,6.3968%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M13.1048,9.1989%20C12.8728,10.4889%2011.8568,11.5069%2010.5678,11.7409%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cpath%20d=%22M4.6546,13.9723%20C3.0676,12.7263%201.7236,10.9063%200.7496,8.6373%20C1.7336,6.3583%203.0866,4.5283%204.6836,3.2723%20C6.2706,2.0163%208.1016,1.3343%209.9996,1.3343%20C11.9086,1.3343%2013.7386,2.0263%2015.3356,3.2913%22%20id=%22Stroke-5%22%3E%3C/path%3E%3Cpath%20d=%22M17.4476,5.4908%20C18.1356,6.4048%2018.7406,7.4598%2019.2496,8.6368%20C17.2826,13.1938%2013.8066,15.9388%209.9996,15.9388%20C9.1366,15.9388%208.2856,15.7988%207.4676,15.5258%22%20id=%22Stroke-7%22%3E%3C/path%3E%3Cline%20x1=%2217.887%22%20y1=%220.7496%22%20x2=%222.113%22%20y2=%2216.5236%22%20id=%22Stroke-9%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Hide%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Hide%22%20transform=%22translate(2.000000,%203.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M7.7606,10.8668%20C7.1856,10.2928%206.8356,9.5128%206.8356,8.6378%20C6.8356,6.8848%208.2476,5.4718%209.9996,5.4718%20C10.8666,5.4718%2011.6646,5.8228%2012.2296,6.3968%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M13.1048,9.1989%20C12.8728,10.4889%2011.8568,11.5069%2010.5678,11.7409%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cpath%20d=%22M4.6546,13.9723%20C3.0676,12.7263%201.7236,10.9063%200.7496,8.6373%20C1.7336,6.3583%203.0866,4.5283%204.6836,3.2723%20C6.2706,2.0163%208.1016,1.3343%209.9996,1.3343%20C11.9086,1.3343%2013.7386,2.0263%2015.3356,3.2913%22%20id=%22Stroke-5%22%3E%3C/path%3E%3Cpath%20d=%22M17.4476,5.4908%20C18.1356,6.4048%2018.7406,7.4598%2019.2496,8.6368%20C17.2826,13.1938%2013.8066,15.9388%209.9996,15.9388%20C9.1366,15.9388%208.2856,15.7988%207.4676,15.5258%22%20id=%22Stroke-7%22%3E%3C/path%3E%3Cline%20x1=%2217.887%22%20y1=%220.7496%22%20x2=%222.113%22%20y2=%2216.5236%22%20id=%22Stroke-9%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-home { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Home%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Home%22%20transform=%22translate(2.500000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M6.65721519,18.7714023%20L6.65721519,15.70467%20C6.65719744,14.9246392%207.29311743,14.2908272%208.08101266,14.2855921%20L10.9670886,14.2855921%20C11.7587434,14.2855921%2012.4005063,14.9209349%2012.4005063,15.70467%20L12.4005063,15.70467%20L12.4005063,18.7809263%20C12.4003226,19.4432001%2012.9342557,19.984478%2013.603038,20%20L15.5270886,20%20C17.4451246,20%2019,18.4606794%2019,16.5618312%20L19,16.5618312%20L19,7.8378351%20C18.9897577,7.09082692%2018.6354747,6.38934919%2018.0379747,5.93303245%20L11.4577215,0.685301154%20C10.3049347,-0.228433718%208.66620456,-0.228433718%207.51341772,0.685301154%20L0.962025316,5.94255646%20C0.362258604,6.39702249%200.00738668938,7.09966612%200,7.84735911%20L0,16.5618312%20C0,18.4606794%201.55487539,20%203.47291139,20%20L5.39696203,20%20C6.08235439,20%206.63797468,19.4499381%206.63797468,18.7714023%20L6.63797468,18.7714023%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Home%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Home%22%20transform=%22translate(2.500000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M6.65721519,18.7714023%20L6.65721519,15.70467%20C6.65719744,14.9246392%207.29311743,14.2908272%208.08101266,14.2855921%20L10.9670886,14.2855921%20C11.7587434,14.2855921%2012.4005063,14.9209349%2012.4005063,15.70467%20L12.4005063,15.70467%20L12.4005063,18.7809263%20C12.4003226,19.4432001%2012.9342557,19.984478%2013.603038,20%20L15.5270886,20%20C17.4451246,20%2019,18.4606794%2019,16.5618312%20L19,16.5618312%20L19,7.8378351%20C18.9897577,7.09082692%2018.6354747,6.38934919%2018.0379747,5.93303245%20L11.4577215,0.685301154%20C10.3049347,-0.228433718%208.66620456,-0.228433718%207.51341772,0.685301154%20L0.962025316,5.94255646%20C0.362258604,6.39702249%200.00738668938,7.09966612%200,7.84735911%20L0,16.5618312%20C0,18.4606794%201.55487539,20%203.47291139,20%20L5.39696203,20%20C6.08235439,20%206.63797468,19.4499381%206.63797468,18.7714023%20L6.63797468,18.7714023%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-info, .ui-icon.xi-info { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12%205V5.06543%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12%2019.0006V9.80078%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12%205V5.06543%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12%2019.0006V9.80078%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-info-circle { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2012C3%2016.9699%207.02908%2021%2012%2021C16.9709%2021%2021%2016.9699%2021%2012C21%207.02908%2016.9709%203%2012%203C7.02908%203%203%207.02908%203%2012Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12.0057%2015.6932V11.3936M12%208.35426V8.29102%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2012C3%2016.9699%207.02908%2021%2012%2021C16.9709%2021%2021%2016.9699%2021%2012C21%207.02908%2016.9709%203%2012%203C7.02908%203%203%207.02908%203%2012Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12.0057%2015.6932V11.3936M12%208.35426V8.29102%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
/* Той самий Info Circle, але зі штрихом 1.75 — для великого медальйона:
   у 36px світлий штрих 1.5 читається як волосина. Той самий прийом, що
   в i-time-bold. */
.ui-icon.i-info-circle-bold { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2012C3%2016.9699%207.02908%2021%2012%2021C16.9709%2021%2021%2016.9699%2021%2012C21%207.02908%2016.9709%203%2012%203C7.02908%203%203%207.02908%203%2012Z%22%20stroke=%22black%22%20stroke-width=%221.75%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12.0057%2015.6932V11.3936M12%208.35426V8.29102%22%20stroke=%22black%22%20stroke-width=%221.75%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2012C3%2016.9699%207.02908%2021%2012%2021C16.9709%2021%2021%2016.9699%2021%2012C21%207.02908%2016.9709%203%2012%203C7.02908%203%203%207.02908%203%2012Z%22%20stroke=%22black%22%20stroke-width=%221.75%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12.0057%2015.6932V11.3936M12%208.35426V8.29102%22%20stroke=%22black%22%20stroke-width=%221.75%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
/* Заливна корона — для дрібних бейджів: Iconly Light (i-king) на 14px
   перетворюється на кашу, бо обведення 1.5 при масштабі 0.58 зникає. */
.ui-icon.i-king-fill { mask: url("data:image/svg+xml,%3Csvg%20width=%2226%22%20height=%2226%22%20viewBox=%220%200%2026%2026%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M2.15101%2020.7502C2.23757%2021.605%202.28086%2022.0324%202.56644%2022.2906C2.85203%2022.5487%203.28163%2022.5487%204.14083%2022.5487H21.8588C22.718%2022.5487%2023.1476%2022.5487%2023.4332%2022.2906C23.7187%2022.0324%2023.762%2021.605%2023.8486%2020.7502L24.7957%2011.3977C24.9969%209.41045%2025.0975%208.41682%2024.5203%208.09744C23.943%207.77806%2023.1546%208.39121%2021.578%209.61751L19.9922%2010.8509C19.1012%2011.5439%2018.6557%2011.8904%2018.1942%2011.7857C17.7326%2011.681%2017.4802%2011.1762%2016.9754%2010.1666L14.7887%205.79306C14.0081%204.23196%2013.6178%203.45142%2012.9998%203.45142C12.3818%203.45142%2011.9915%204.23196%2011.2109%205.79306L9.02416%2010.1666C8.51938%2011.1762%208.26699%2011.681%207.80543%2011.7857C7.34387%2011.8904%206.89839%2011.5439%206.00742%2010.8509L4.42163%209.61751C2.84496%208.39121%202.05662%207.77806%201.47934%208.09744C0.902061%208.41682%201.00268%209.41045%201.20392%2011.3977L2.15101%2020.7502Z%22%20fill=%22black%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2226%22%20height=%2226%22%20viewBox=%220%200%2026%2026%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M2.15101%2020.7502C2.23757%2021.605%202.28086%2022.0324%202.56644%2022.2906C2.85203%2022.5487%203.28163%2022.5487%204.14083%2022.5487H21.8588C22.718%2022.5487%2023.1476%2022.5487%2023.4332%2022.2906C23.7187%2022.0324%2023.762%2021.605%2023.8486%2020.7502L24.7957%2011.3977C24.9969%209.41045%2025.0975%208.41682%2024.5203%208.09744C23.943%207.77806%2023.1546%208.39121%2021.578%209.61751L19.9922%2010.8509C19.1012%2011.5439%2018.6557%2011.8904%2018.1942%2011.7857C17.7326%2011.681%2017.4802%2011.1762%2016.9754%2010.1666L14.7887%205.79306C14.0081%204.23196%2013.6178%203.45142%2012.9998%203.45142C12.3818%203.45142%2011.9915%204.23196%2011.2109%205.79306L9.02416%2010.1666C8.51938%2011.1762%208.26699%2011.681%207.80543%2011.7857C7.34387%2011.8904%206.89839%2011.5439%206.00742%2010.8509L4.42163%209.61751C2.84496%208.39121%202.05662%207.77806%201.47934%208.09744C0.902061%208.41682%201.00268%209.41045%201.20392%2011.3977L2.15101%2020.7502Z%22%20fill=%22black%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-location { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Location%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Location%22%20transform=%22translate(4.500000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M10,7.50050782%20C10,6.11923624%208.88076376,5%207.50050782,5%20C6.11923624,5%205,6.11923624%205,7.50050782%20C5,8.88076376%206.11923624,10%207.50050782,10%20C8.88076376,10%2010,8.88076376%2010,7.50050782%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M7.49951162,18%20C6.30103536,18%200,12.8983747%200,7.5632901%20C0,3.38663602%203.357101,0%207.49951162,0%20C11.6419223,0%2015,3.38663602%2015,7.5632901%20C15,12.8983747%208.69798789,18%207.49951162,18%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Location%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Location%22%20transform=%22translate(4.500000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M10,7.50050782%20C10,6.11923624%208.88076376,5%207.50050782,5%20C6.11923624,5%205,6.11923624%205,7.50050782%20C5,8.88076376%206.11923624,10%207.50050782,10%20C8.88076376,10%2010,8.88076376%2010,7.50050782%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M7.49951162,18%20C6.30103536,18%200,12.8983747%200,7.5632901%20C0,3.38663602%203.357101,0%207.49951162,0%20C11.6419223,0%2015,3.38663602%2015,7.5632901%20C15,12.8983747%208.69798789,18%207.49951162,18%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-lock, .ui-icon.xi-lock { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Lock%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Lock%22%20transform=%22translate(3.500000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M12.9234,7.4478%20L12.9234,5.3008%20C12.9234,2.7878%2010.8854,0.749755462%208.3724,0.749755462%20C5.8594,0.7388%203.8134,2.7668%203.8024,5.2808%20L3.8024,5.3008%20L3.8024,7.4478%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M12.1832,19.2496%20L4.5422,19.2496%20C2.4482,19.2496%200.7502,17.5526%200.7502,15.4576%20L0.7502,11.1686%20C0.7502,9.0736%202.4482,7.3766%204.5422,7.3766%20L12.1832,7.3766%20C14.2772,7.3766%2015.9752,9.0736%2015.9752,11.1686%20L15.9752,15.4576%20C15.9752,17.5526%2014.2772,19.2496%2012.1832,19.2496%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%228.3629%22%20y1=%2212.2027%22%20x2=%228.3629%22%20y2=%2214.4237%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Lock%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Lock%22%20transform=%22translate(3.500000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M12.9234,7.4478%20L12.9234,5.3008%20C12.9234,2.7878%2010.8854,0.749755462%208.3724,0.749755462%20C5.8594,0.7388%203.8134,2.7668%203.8024,5.2808%20L3.8024,5.3008%20L3.8024,7.4478%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M12.1832,19.2496%20L4.5422,19.2496%20C2.4482,19.2496%200.7502,17.5526%200.7502,15.4576%20L0.7502,11.1686%20C0.7502,9.0736%202.4482,7.3766%204.5422,7.3766%20L12.1832,7.3766%20C14.2772,7.3766%2015.9752,9.0736%2015.9752,11.1686%20L15.9752,15.4576%20C15.9752,17.5526%2014.2772,19.2496%2012.1832,19.2496%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%228.3629%22%20y1=%2212.2027%22%20x2=%228.3629%22%20y2=%2214.4237%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-logout { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Logout%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Logout%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M13.016,5.3895%20L13.016,4.4565%20C13.016,2.4215%2011.366,0.7715%209.331,0.7715%20L4.456,0.7715%20C2.422,0.7715%200.772,2.4215%200.772,4.4565%20L0.772,15.5865%20C0.772,17.6215%202.422,19.2715%204.456,19.2715%20L9.341,19.2715%20C11.37,19.2715%2013.016,17.6265%2013.016,15.5975%20L13.016,14.6545%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cline%20x1=%2219.8095%22%20y1=%2210.0214%22%20x2=%227.7685%22%20y2=%2210.0214%22%20id=%22Stroke-3%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-5%22%20points=%2216.8812%207.1063%2019.8092%2010.0213%2016.8812%2012.9373%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Logout%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Logout%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M13.016,5.3895%20L13.016,4.4565%20C13.016,2.4215%2011.366,0.7715%209.331,0.7715%20L4.456,0.7715%20C2.422,0.7715%200.772,2.4215%200.772,4.4565%20L0.772,15.5865%20C0.772,17.6215%202.422,19.2715%204.456,19.2715%20L9.341,19.2715%20C11.37,19.2715%2013.016,17.6265%2013.016,15.5975%20L13.016,14.6545%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cline%20x1=%2219.8095%22%20y1=%2210.0214%22%20x2=%227.7685%22%20y2=%2210.0214%22%20id=%22Stroke-3%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-5%22%20points=%2216.8812%207.1063%2019.8092%2010.0213%2016.8812%2012.9373%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-message { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M17.5448%209.01892C17.5448%209.01892%2014.3348%2012.8716%2011.9869%2012.8716C9.64004%2012.8716%206.39392%209.01892%206.39392%209.01892%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M2.45203%2011.9687C2.45203%205.13063%204.83298%202.85193%2011.9758%202.85193C19.1187%202.85193%2021.4996%205.13063%2021.4996%2011.9687C21.4996%2018.8058%2019.1187%2021.0855%2011.9758%2021.0855C4.83298%2021.0855%202.45203%2018.8058%202.45203%2011.9687Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M17.5448%209.01892C17.5448%209.01892%2014.3348%2012.8716%2011.9869%2012.8716C9.64004%2012.8716%206.39392%209.01892%206.39392%209.01892%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M2.45203%2011.9687C2.45203%205.13063%204.83298%202.85193%2011.9758%202.85193C19.1187%202.85193%2021.4996%205.13063%2021.4996%2011.9687C21.4996%2018.8058%2019.1187%2021.0855%2011.9758%2021.0855C4.83298%2021.0855%202.45203%2018.8058%202.45203%2011.9687Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
/* Перемикач теми: moon 59997 / sun 60059 */
.ui-icon.i-moon { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M20.9993%2012.7168C20.5284%2018.6138%2014.3619%2022.9259%207.99109%2020.1248C6.1386%2019.3104%204.64222%2017.8043%203.84343%2015.945C1.11044%209.5878%205.39722%203.48161%2011.2738%203C10.7144%205.52381%2011.411%208.46988%2013.2469%2010.3058C15.0838%2012.1437%2018.2663%2013.3327%2020.9993%2012.7168Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M20.9993%2012.7168C20.5284%2018.6138%2014.3619%2022.9259%207.99109%2020.1248C6.1386%2019.3104%204.64222%2017.8043%203.84343%2015.945C1.11044%209.5878%205.39722%203.48161%2011.2738%203C10.7144%205.52381%2011.411%208.46988%2013.2469%2010.3058C15.0838%2012.1437%2018.2663%2013.3327%2020.9993%2012.7168Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-sun { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M12.0001%203V4.3719M12.0001%2019.6281V21M21%2012.0001H19.6281M4.3719%2012.0001H3M18.3639%205.63582L17.3938%206.60589M6.60636%2017.3938L5.6363%2018.3639M18.3639%2018.3639L17.3938%2017.3938M6.60636%206.60636L5.6363%205.6363%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M12.0002%207.80469C14.3178%207.80469%2016.1957%209.68351%2016.1957%2012.0002C16.1957%2014.3178%2014.3178%2016.1966%2012.0002%2016.1966C9.68254%2016.1966%207.80469%2014.3178%207.80469%2012.0002C7.80469%209.68351%209.68254%207.80469%2012.0002%207.80469Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%0A%3Cpath%20d=%22M12.0001%203V4.3719M12.0001%2019.6281V21M21%2012.0001H19.6281M4.3719%2012.0001H3M18.3639%205.63582L17.3938%206.60589M6.60636%2017.3938L5.6363%2018.3639M18.3639%2018.3639L17.3938%2017.3938M6.60636%206.60636L5.6363%205.6363%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M12.0002%207.80469C14.3178%207.80469%2016.1957%209.68351%2016.1957%2012.0002C16.1957%2014.3178%2014.3178%2016.1966%2012.0002%2016.1966C9.68254%2016.1966%207.80469%2014.3178%207.80469%2012.0002C7.80469%209.68351%209.68254%207.80469%2012.0002%207.80469Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%0A%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-notification { mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2224%22%20viewBox=%220%200%2025%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M6.06222%208.93778C6.06222%205.52036%208.83258%202.75%2012.25%202.75C15.6674%202.75%2018.4378%205.52036%2018.4378%208.93777V13.5184L20.0504%2017.8572H4.44958L6.06222%2013.5184V8.93778Z%22%20stroke=%22black%22%20stroke-width=%221.5%22/%3E%3Cpath%20d=%22M15.4177%2017.8574V18.0834C15.4177%2019.8323%2013.9999%2021.2501%2012.251%2021.2501C10.5021%2021.2501%209.08435%2019.8323%209.08435%2018.0834V17.8574%22%20stroke=%22black%22%20stroke-width=%221.5%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2224%22%20viewBox=%220%200%2025%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M6.06222%208.93778C6.06222%205.52036%208.83258%202.75%2012.25%202.75C15.6674%202.75%2018.4378%205.52036%2018.4378%208.93777V13.5184L20.0504%2017.8572H4.44958L6.06222%2013.5184V8.93778Z%22%20stroke=%22black%22%20stroke-width=%221.5%22/%3E%3Cpath%20d=%22M15.4177%2017.8574V18.0834C15.4177%2019.8323%2013.9999%2021.2501%2012.251%2021.2501C10.5021%2021.2501%209.08435%2019.8323%209.08435%2018.0834V17.8574%22%20stroke=%22black%22%20stroke-width=%221.5%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-paper { mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2224%22%20viewBox=%220%200%2025%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M14.3429%2016.2865H8.89966%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12.2816%2012.504H8.89868%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M14.8182%202.75L4.57544%202.75V21.25H19.9247V8.06826L14.8182%202.75Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3Cpath%20d=%22M14.342%203.30469V8.65011H19.4491%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2224%22%20viewBox=%220%200%2025%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M14.3429%2016.2865H8.89966%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12.2816%2012.504H8.89868%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M14.8182%202.75L4.57544%202.75V21.25H19.9247V8.06826L14.8182%202.75Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3Cpath%20d=%22M14.342%203.30469V8.65011H19.4491%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-pen { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M15.4064%207.83887L13.7695%2010.1765%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M10.0757%2020.4805C11.0493%2020.1801%2011.8919%2019.5578%2012.464%2018.7161L18.6329%209.87749C19.8131%208.18648%2019.4009%205.85911%2017.7117%204.67631C16.0187%203.49089%2013.6851%203.90431%2012.5024%205.59917L6.27871%2014.5181C5.75257%2015.293%205.48261%2016.2129%205.50522%2017.1499C5.53273%2018.26%205.73651%2020.3486%206.41318%2020.8089C7.08986%2021.2692%209.06195%2020.7929%2010.0757%2020.4805Z%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M15.4064%207.83887L13.7695%2010.1765%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M10.0757%2020.4805C11.0493%2020.1801%2011.8919%2019.5578%2012.464%2018.7161L18.6329%209.87749C19.8131%208.18648%2019.4009%205.85911%2017.7117%204.67631C16.0187%203.49089%2013.6851%203.90431%2012.5024%205.59917L6.27871%2014.5181C5.75257%2015.293%205.48261%2016.2129%205.50522%2017.1499C5.53273%2018.26%205.73651%2020.3486%206.41318%2020.8089C7.08986%2021.2692%209.06195%2020.7929%2010.0757%2020.4805Z%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-pen-bold { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M15.4064%207.83887L13.7695%2010.1765%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M10.0757%2020.4805C11.0493%2020.1801%2011.8919%2019.5578%2012.464%2018.7161L18.6329%209.87749C19.8131%208.18648%2019.4009%205.85911%2017.7117%204.67631C16.0187%203.49089%2013.6851%203.90431%2012.5024%205.59917L6.27871%2014.5181C5.75257%2015.293%205.48261%2016.2129%205.50522%2017.1499C5.53273%2018.26%205.73651%2020.3486%206.41318%2020.8089C7.08986%2021.2692%209.06195%2020.7929%2010.0757%2020.4805Z%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M15.4064%207.83887L13.7695%2010.1765%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M10.0757%2020.4805C11.0493%2020.1801%2011.8919%2019.5578%2012.464%2018.7161L18.6329%209.87749C19.8131%208.18648%2019.4009%205.85911%2017.7117%204.67631C16.0187%203.49089%2013.6851%203.90431%2012.5024%205.59917L6.27871%2014.5181C5.75257%2015.293%205.48261%2016.2129%205.50522%2017.1499C5.53273%2018.26%205.73651%2020.3486%206.41318%2020.8089C7.08986%2021.2692%209.06195%2020.7929%2010.0757%2020.4805Z%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-play { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M17.5761%2014.9395C15.4971%2016.8226%2012.899%2018.5166%2010.04%2019.6686C7.60702%2020.6276%205.56901%2019.4316%205.27001%2017.0336C4.90601%2013.4985%204.91401%2010.1145%205.27001%206.95551C5.59601%204.4635%207.84102%203.4055%2010.04%204.3315C12.855%205.48451%2015.3801%207.04951%2017.5761%209.06052C19.4521%2010.7595%2019.4961%2013.1745%2017.5761%2014.9395Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M17.5761%2014.9395C15.4971%2016.8226%2012.899%2018.5166%2010.04%2019.6686C7.60702%2020.6276%205.56901%2019.4316%205.27001%2017.0336C4.90601%2013.4985%204.91401%2010.1145%205.27001%206.95551C5.59601%204.4635%207.84102%203.4055%2010.04%204.3315C12.855%205.48451%2015.3801%207.04951%2017.5761%209.06052C19.4521%2010.7595%2019.4961%2013.1745%2017.5761%2014.9395Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-plus { mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2225%22%20viewBox=%220%200%2025%2025%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12.2496%208.8623V16.1887%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M15.9173%2012.5251H8.58398%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M21.5%2021.7847L21.5%203.28467L3%203.28467L3%2021.7847L21.5%2021.7847Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2225%22%20viewBox=%220%200%2025%2025%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12.2496%208.8623V16.1887%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M15.9173%2012.5251H8.58398%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M21.5%2021.7847L21.5%203.28467L3%203.28467L3%2021.7847L21.5%2021.7847Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-plus-circle { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M12%203C16.9709%203%2021%207.02908%2021%2012C21%2016.9699%2016.9709%2021%2012%2021C7.02908%2021%203%2016.9699%203%2012C3%207.02908%207.02908%203%2012%203Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M15.2989%2012.002H8.69922%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12%208.70386V15.2967%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M12%203C16.9709%203%2021%207.02908%2021%2012C21%2016.9699%2016.9709%2021%2012%2021C7.02908%2021%203%2016.9699%203%2012C3%207.02908%207.02908%203%2012%203Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M15.2989%2012.002H8.69922%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M12%208.70386V15.2967%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-plus-bare, .ui-icon.xi-add { mask: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%205V19%22%20stroke%3D%22black%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3Cpath%20d%3D%22M19%2012H5%22%20stroke%3D%22black%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%205V19%22%20stroke%3D%22black%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3Cpath%20d%3D%22M19%2012H5%22%20stroke%3D%22black%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E") no-repeat center / contain; }
.ui-icon.i-profile { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Profile%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Profile%22%20transform=%22translate(4.814286,%202.814476)%22%20stroke=%22%23000000%22%3E%3Cpath%20d=%22M7.17047619,12.531714%20C3.30285714,12.531714%20-4.08562073e-14,13.1164759%20-4.08562073e-14,15.4583807%20C-4.08562073e-14,17.8002854%203.28190476,18.4059997%207.17047619,18.4059997%20C11.0380952,18.4059997%2014.34,17.8202854%2014.34,15.479333%20C14.34,13.1383807%2011.0590476,12.531714%207.17047619,12.531714%20Z%22%20id=%22Stroke-1%22%20stroke-width=%221.5%22%3E%3C/path%3E%3Cpath%20d=%22M7.17047634,9.19142857%20C9.70857158,9.19142857%2011.7657144,7.13333333%2011.7657144,4.5952381%20C11.7657144,2.05714286%209.70857158,-5.32907052e-15%207.17047634,-5.32907052e-15%20C4.6323811,-5.32907052e-15%202.574259,2.05714286%202.574259,4.5952381%20C2.56571443,7.1247619%204.60952396,9.18285714%207.13809539,9.19142857%20L7.17047634,9.19142857%20Z%22%20id=%22Stroke-3%22%20stroke-width=%221.42857143%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Profile%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Profile%22%20transform=%22translate(4.814286,%202.814476)%22%20stroke=%22%23000000%22%3E%3Cpath%20d=%22M7.17047619,12.531714%20C3.30285714,12.531714%20-4.08562073e-14,13.1164759%20-4.08562073e-14,15.4583807%20C-4.08562073e-14,17.8002854%203.28190476,18.4059997%207.17047619,18.4059997%20C11.0380952,18.4059997%2014.34,17.8202854%2014.34,15.479333%20C14.34,13.1383807%2011.0590476,12.531714%207.17047619,12.531714%20Z%22%20id=%22Stroke-1%22%20stroke-width=%221.5%22%3E%3C/path%3E%3Cpath%20d=%22M7.17047634,9.19142857%20C9.70857158,9.19142857%2011.7657144,7.13333333%2011.7657144,4.5952381%20C11.7657144,2.05714286%209.70857158,-5.32907052e-15%207.17047634,-5.32907052e-15%20C4.6323811,-5.32907052e-15%202.574259,2.05714286%202.574259,4.5952381%20C2.56571443,7.1247619%204.60952396,9.18285714%207.13809539,9.19142857%20L7.17047634,9.19142857%20Z%22%20id=%22Stroke-3%22%20stroke-width=%221.42857143%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-search { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M11.6324%203C16.2814%203%2020.0499%206.76847%2020.0499%2011.4175C20.0499%2016.0666%2016.2814%2019.836%2011.6324%2019.836C6.98331%2019.836%203.21484%2016.0666%203.21484%2011.4175C3.21484%206.76847%206.98331%203%2011.6324%203Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M17.3613%2017.584L20.7863%2021.0002%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M11.6324%203C16.2814%203%2020.0499%206.76847%2020.0499%2011.4175C20.0499%2016.0666%2016.2814%2019.836%2011.6324%2019.836C6.98331%2019.836%203.21484%2016.0666%203.21484%2011.4175C3.21484%206.76847%206.98331%203%2011.6324%203Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M17.3613%2017.584L20.7863%2021.0002%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-send { mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2224%22%20viewBox=%220%200%2025%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M21.5481%202.71887L16.0583%2021.315H16.0333L10.7932%2013.4737L2.95187%208.2335V8.20447L21.5154%202.68494L21.5481%202.71887Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3Cpath%20d=%22M11.0393%2013.2855L15.4816%208.84314%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2224%22%20viewBox=%220%200%2025%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M21.5481%202.71887L16.0583%2021.315H16.0333L10.7932%2013.4737L2.95187%208.2335V8.20447L21.5154%202.68494L21.5481%202.71887Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3Cpath%20d=%22M11.0393%2013.2855L15.4816%208.84314%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-share { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M10.1206%203.5H8.01633C5.24061%203.5%203.5%205.46539%203.5%208.24678V15.7532C3.5%2018.5346%205.23211%2020.5%208.01633%2020.5H15.9818C18.7669%2020.5%2020.5%2018.5346%2020.5%2015.7532V14.1089%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M20.4997%208.07394V3.5M20.4997%203.5H15.9258M20.4997%203.5L13.3691%2010.6306%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M10.1206%203.5H8.01633C5.24061%203.5%203.5%205.46539%203.5%208.24678V15.7532C3.5%2018.5346%205.23211%2020.5%208.01633%2020.5H15.9818C18.7669%2020.5%2020.5%2018.5346%2020.5%2015.7532V14.1089%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M20.4997%208.07394V3.5M20.4997%203.5H15.9258M20.4997%203.5L13.3691%2010.6306%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-setting { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M19.4004%2014.0864L19.3984%2014.0824C19.3351%2013.9724%2019.2957%2013.8497%2019.2977%2013.7223L19.3051%2013.3076C19.3084%2013.0935%2019.209%2012.8895%2019.0363%2012.7641C18.851%2012.6301%2018.6529%2012.5154%2018.4436%2012.4227C18.2489%2012.3361%2018.0221%2012.3521%2017.8394%2012.4621L17.484%2012.6748C17.3747%2012.7408%2017.2487%2012.7688%2017.1206%2012.7681H17.1166C16.9893%2012.7681%2016.8639%2012.7408%2016.7546%2012.6755L16.3985%2012.4621C16.2151%2012.3521%2015.9891%2012.3361%2015.7937%2012.4227C15.585%2012.5161%2015.3863%2012.6308%2015.2016%2012.7648C15.0289%2012.8908%2014.9302%2013.0949%2014.9335%2013.3083L14.9409%2013.7223C14.9429%2013.8504%2014.9035%2013.9731%2014.8395%2014.0837L14.8375%2014.0877C14.7735%2014.1978%2014.6868%2014.2924%2014.5761%2014.3538L14.2134%2014.5552C14.022%2014.6619%2013.8973%2014.8566%2013.8753%2015.0739C13.8533%2015.292%2013.8533%2015.512%2013.876%2015.7301C13.898%2015.9474%2014.0227%2016.1422%2014.214%2016.2482L14.5754%2016.4489C14.6875%2016.5109%2014.7742%2016.6062%2014.8382%2016.7169L14.8402%2016.7203C14.9035%2016.831%2014.9429%2016.9536%2014.9409%2017.081L14.9335%2017.4951C14.9302%2017.7091%2015.0295%2017.9132%2015.2029%2018.0392C15.3876%2018.1732%2015.5857%2018.2879%2015.795%2018.3806C15.9897%2018.4673%2016.2164%2018.4513%2016.3991%2018.3413L16.7546%2018.1279C16.8639%2018.0625%2016.9899%2018.0345%2017.1173%2018.0352H17.122C17.2493%2018.0352%2017.3747%2018.0625%2017.484%2018.1279L17.8394%2018.3413C18.0228%2018.4513%2018.2495%2018.4673%2018.4449%2018.3806C18.6536%2018.2873%2018.8523%2018.1726%2019.037%2018.0385C19.2097%2017.9125%2019.3084%2017.7085%2019.3051%2017.4951L19.2977%2017.081C19.2957%2016.953%2019.3351%2016.8303%2019.3991%2016.7203L19.4011%2016.7156C19.4651%2016.6056%2019.5518%2016.5109%2019.6631%2016.4489L20.0252%2016.2482C20.2166%2016.1415%2020.3413%2015.9468%2020.3633%2015.7294C20.3853%2015.5107%2020.3853%2015.2913%2020.3626%2015.0726C20.3406%2014.8552%2020.2159%2014.6612%2020.0245%2014.5552L19.6631%2014.3545C19.5511%2014.2924%2019.4644%2014.1971%2019.4004%2014.0864Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M17.1252%2015.3834V15.335M17.1189%2015.1914C17.0025%2015.1914%2016.9078%2015.2862%2016.9087%2015.4026C16.9087%2015.5189%2017.0035%2015.6137%2017.1199%2015.6137C17.2362%2015.6137%2017.331%2015.5189%2017.331%2015.4026C17.331%2015.2853%2017.2362%2015.1914%2017.1189%2015.1914Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M8.74016%2015.6152V16.5128M8.74016%2020.1029V21.0005M6.40576%2016.9614L7.1807%2017.4102M10.2984%2019.2057L11.0725%2019.6545M6.40576%2019.6545L7.1807%2019.2057M10.2984%2017.4102L11.0725%2016.9614M10.0086%2017.0378C10.7093%2017.7385%2010.7093%2018.8763%2010.0086%2019.577C9.30794%2020.2777%208.17097%2020.2777%207.47027%2019.577C6.76957%2018.8763%206.76957%2017.7385%207.47027%2017.0378C8.17097%2016.338%209.30794%2016.338%2010.0086%2017.0378Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M7.67162%203.02202C7.77921%202.97729%207.90316%203.00198%207.9854%203.08451L8.53635%203.63742C8.64862%203.75009%208.83108%203.75009%208.94335%203.63742L9.4943%203.08451C9.57654%203.00198%209.70049%202.97729%209.80808%203.02202L11.5876%203.76173C11.6947%203.80629%2011.7646%203.91095%2011.7646%204.02701V4.80724C11.7646%204.9659%2011.8932%205.09452%2012.0519%205.09452H12.8321C12.9481%205.09452%2013.0528%205.16436%2013.0974%205.27153L13.8371%207.05102C13.8818%207.15861%2013.8571%207.28255%2013.7746%207.36479L13.2217%207.91574C13.109%208.02802%2013.109%208.21047%2013.2217%208.32275L13.7746%208.8737C13.8571%208.95594%2013.8818%209.07989%2013.8371%209.18747L13.0974%2010.967C13.0528%2011.0741%2012.9481%2011.144%2012.8321%2011.144H12.0519C11.8932%2011.144%2011.7646%2011.2726%2011.7646%2011.4313V12.2115C11.7646%2012.3275%2011.6947%2012.4322%2011.5876%2012.4768L9.80807%2013.2165C9.70048%2013.2612%209.57654%2013.2365%209.4943%2013.154L8.94335%2012.6011C8.83108%2012.4884%208.64862%2012.4884%208.53635%2012.6011L7.9854%2013.154C7.90316%2013.2365%207.77921%2013.2612%207.67163%2013.2165L5.89214%2012.4768C5.78496%2012.4322%205.71512%2012.3275%205.71512%2012.2115V11.4313C5.71512%2011.2726%205.5865%2011.144%205.42784%2011.144H4.64762C4.53156%2011.144%204.42689%2011.0741%204.38234%2010.967L3.64262%209.18747C3.5979%209.07988%203.62258%208.95593%203.70512%208.87369L4.25802%208.32275C4.37069%208.21047%204.37069%208.02802%204.25802%207.91574L3.70512%207.3648C3.62258%207.28256%203.5979%207.15861%203.64262%207.05102L4.38235%205.27153C4.4269%205.16436%204.53156%205.09452%204.64763%205.09452L5.42784%205.09452C5.58651%205.09452%205.71513%204.9659%205.71513%204.80723V4.02702C5.71513%203.91095%205.78497%203.80629%205.89214%203.76174L7.67162%203.02202Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M8.93547%209.9494C8.81402%2010.0195%208.66438%2010.0195%208.54292%209.9494L7.25145%209.20378C7.13%209.13365%207.05518%209.00406%207.05518%208.86381L7.05518%207.37256C7.05518%207.23231%207.13%207.10272%207.25145%207.0326L8.54292%206.28697C8.66438%206.21684%208.81402%206.21684%208.93547%206.28697L10.2269%207.0326C10.3484%207.10272%2010.4232%207.23231%2010.4232%207.37256V8.86381C10.4232%209.00406%2010.3484%209.13365%2010.2269%209.20378L8.93547%209.9494Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M19.4004%2014.0864L19.3984%2014.0824C19.3351%2013.9724%2019.2957%2013.8497%2019.2977%2013.7223L19.3051%2013.3076C19.3084%2013.0935%2019.209%2012.8895%2019.0363%2012.7641C18.851%2012.6301%2018.6529%2012.5154%2018.4436%2012.4227C18.2489%2012.3361%2018.0221%2012.3521%2017.8394%2012.4621L17.484%2012.6748C17.3747%2012.7408%2017.2487%2012.7688%2017.1206%2012.7681H17.1166C16.9893%2012.7681%2016.8639%2012.7408%2016.7546%2012.6755L16.3985%2012.4621C16.2151%2012.3521%2015.9891%2012.3361%2015.7937%2012.4227C15.585%2012.5161%2015.3863%2012.6308%2015.2016%2012.7648C15.0289%2012.8908%2014.9302%2013.0949%2014.9335%2013.3083L14.9409%2013.7223C14.9429%2013.8504%2014.9035%2013.9731%2014.8395%2014.0837L14.8375%2014.0877C14.7735%2014.1978%2014.6868%2014.2924%2014.5761%2014.3538L14.2134%2014.5552C14.022%2014.6619%2013.8973%2014.8566%2013.8753%2015.0739C13.8533%2015.292%2013.8533%2015.512%2013.876%2015.7301C13.898%2015.9474%2014.0227%2016.1422%2014.214%2016.2482L14.5754%2016.4489C14.6875%2016.5109%2014.7742%2016.6062%2014.8382%2016.7169L14.8402%2016.7203C14.9035%2016.831%2014.9429%2016.9536%2014.9409%2017.081L14.9335%2017.4951C14.9302%2017.7091%2015.0295%2017.9132%2015.2029%2018.0392C15.3876%2018.1732%2015.5857%2018.2879%2015.795%2018.3806C15.9897%2018.4673%2016.2164%2018.4513%2016.3991%2018.3413L16.7546%2018.1279C16.8639%2018.0625%2016.9899%2018.0345%2017.1173%2018.0352H17.122C17.2493%2018.0352%2017.3747%2018.0625%2017.484%2018.1279L17.8394%2018.3413C18.0228%2018.4513%2018.2495%2018.4673%2018.4449%2018.3806C18.6536%2018.2873%2018.8523%2018.1726%2019.037%2018.0385C19.2097%2017.9125%2019.3084%2017.7085%2019.3051%2017.4951L19.2977%2017.081C19.2957%2016.953%2019.3351%2016.8303%2019.3991%2016.7203L19.4011%2016.7156C19.4651%2016.6056%2019.5518%2016.5109%2019.6631%2016.4489L20.0252%2016.2482C20.2166%2016.1415%2020.3413%2015.9468%2020.3633%2015.7294C20.3853%2015.5107%2020.3853%2015.2913%2020.3626%2015.0726C20.3406%2014.8552%2020.2159%2014.6612%2020.0245%2014.5552L19.6631%2014.3545C19.5511%2014.2924%2019.4644%2014.1971%2019.4004%2014.0864Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M17.1252%2015.3834V15.335M17.1189%2015.1914C17.0025%2015.1914%2016.9078%2015.2862%2016.9087%2015.4026C16.9087%2015.5189%2017.0035%2015.6137%2017.1199%2015.6137C17.2362%2015.6137%2017.331%2015.5189%2017.331%2015.4026C17.331%2015.2853%2017.2362%2015.1914%2017.1189%2015.1914Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M8.74016%2015.6152V16.5128M8.74016%2020.1029V21.0005M6.40576%2016.9614L7.1807%2017.4102M10.2984%2019.2057L11.0725%2019.6545M6.40576%2019.6545L7.1807%2019.2057M10.2984%2017.4102L11.0725%2016.9614M10.0086%2017.0378C10.7093%2017.7385%2010.7093%2018.8763%2010.0086%2019.577C9.30794%2020.2777%208.17097%2020.2777%207.47027%2019.577C6.76957%2018.8763%206.76957%2017.7385%207.47027%2017.0378C8.17097%2016.338%209.30794%2016.338%2010.0086%2017.0378Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M7.67162%203.02202C7.77921%202.97729%207.90316%203.00198%207.9854%203.08451L8.53635%203.63742C8.64862%203.75009%208.83108%203.75009%208.94335%203.63742L9.4943%203.08451C9.57654%203.00198%209.70049%202.97729%209.80808%203.02202L11.5876%203.76173C11.6947%203.80629%2011.7646%203.91095%2011.7646%204.02701V4.80724C11.7646%204.9659%2011.8932%205.09452%2012.0519%205.09452H12.8321C12.9481%205.09452%2013.0528%205.16436%2013.0974%205.27153L13.8371%207.05102C13.8818%207.15861%2013.8571%207.28255%2013.7746%207.36479L13.2217%207.91574C13.109%208.02802%2013.109%208.21047%2013.2217%208.32275L13.7746%208.8737C13.8571%208.95594%2013.8818%209.07989%2013.8371%209.18747L13.0974%2010.967C13.0528%2011.0741%2012.9481%2011.144%2012.8321%2011.144H12.0519C11.8932%2011.144%2011.7646%2011.2726%2011.7646%2011.4313V12.2115C11.7646%2012.3275%2011.6947%2012.4322%2011.5876%2012.4768L9.80807%2013.2165C9.70048%2013.2612%209.57654%2013.2365%209.4943%2013.154L8.94335%2012.6011C8.83108%2012.4884%208.64862%2012.4884%208.53635%2012.6011L7.9854%2013.154C7.90316%2013.2365%207.77921%2013.2612%207.67163%2013.2165L5.89214%2012.4768C5.78496%2012.4322%205.71512%2012.3275%205.71512%2012.2115V11.4313C5.71512%2011.2726%205.5865%2011.144%205.42784%2011.144H4.64762C4.53156%2011.144%204.42689%2011.0741%204.38234%2010.967L3.64262%209.18747C3.5979%209.07988%203.62258%208.95593%203.70512%208.87369L4.25802%208.32275C4.37069%208.21047%204.37069%208.02802%204.25802%207.91574L3.70512%207.3648C3.62258%207.28256%203.5979%207.15861%203.64262%207.05102L4.38235%205.27153C4.4269%205.16436%204.53156%205.09452%204.64763%205.09452L5.42784%205.09452C5.58651%205.09452%205.71513%204.9659%205.71513%204.80723V4.02702C5.71513%203.91095%205.78497%203.80629%205.89214%203.76174L7.67162%203.02202Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M8.93547%209.9494C8.81402%2010.0195%208.66438%2010.0195%208.54292%209.9494L7.25145%209.20378C7.13%209.13365%207.05518%209.00406%207.05518%208.86381L7.05518%207.37256C7.05518%207.23231%207.13%207.10272%207.25145%207.0326L8.54292%206.28697C8.66438%206.21684%208.81402%206.21684%208.93547%206.28697L10.2269%207.0326C10.3484%207.10272%2010.4232%207.23231%2010.4232%207.37256V8.86381C10.4232%209.00406%2010.3484%209.13365%2010.2269%209.20378L8.93547%209.9494Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-shield-done { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Shield-Done%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Shield-Done%22%20transform=%22translate(3.500000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M8.4845,19.606%20C8.4845,19.606%2016.1565,17.283%2016.1565,10.879%20C16.1565,4.474%2016.4345,3.974%2015.8195,3.358%20C15.2035,2.742%209.4905,0.75%208.4845,0.75%20C7.4785,0.75%201.7655,2.742%201.1505,3.358%20C0.5345,3.974%200.8125,4.474%200.8125,10.879%20C0.8125,17.283%208.4845,19.606%208.4845,19.606%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%225.8859%209.8746%207.7779%2011.7696%2011.6759%207.8696%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Shield-Done%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Shield-Done%22%20transform=%22translate(3.500000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M8.4845,19.606%20C8.4845,19.606%2016.1565,17.283%2016.1565,10.879%20C16.1565,4.474%2016.4345,3.974%2015.8195,3.358%20C15.2035,2.742%209.4905,0.75%208.4845,0.75%20C7.4785,0.75%201.7655,2.742%201.1505,3.358%20C0.5345,3.974%200.8125,4.474%200.8125,10.879%20C0.8125,17.283%208.4845,19.606%208.4845,19.606%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%225.8859%209.8746%207.7779%2011.7696%2011.6759%207.8696%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-show, .ui-icon.xi-eye { mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2225%22%20viewBox=%220%200%2025%2025%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M15.4109%2014.3262C15.4109%2016.0722%2013.9949%2017.4872%2012.2489%2017.4872C10.5029%2017.4872%209.08789%2016.0722%209.08789%2014.3262C9.08789%2012.5792%2010.5029%2011.1642%2012.2489%2011.1642C13.9949%2011.1642%2015.4109%2012.5792%2015.4109%2014.3262Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3Cpath%20d=%22M21.5%2014.3254C19.539%2010.1973%2016.056%207.72083%2012.248%207.72083H12.252C8.444%207.72083%204.961%2010.1973%203%2014.3254%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2225%22%20height=%2225%22%20viewBox=%220%200%2025%2025%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M15.4109%2014.3262C15.4109%2016.0722%2013.9949%2017.4872%2012.2489%2017.4872C10.5029%2017.4872%209.08789%2016.0722%209.08789%2014.3262C9.08789%2012.5792%2010.5029%2011.1642%2012.2489%2011.1642C13.9949%2011.1642%2015.4109%2012.5792%2015.4109%2014.3262Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3Cpath%20d=%22M21.5%2014.3254C19.539%2010.1973%2016.056%207.72083%2012.248%207.72083H12.252C8.444%207.72083%204.961%2010.1973%203%2014.3254%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22square%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-sparkling { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M21%2012.0722C18.2601%2012.9604%2016.1125%2015.1081%2015.2242%2017.8492C14.3358%2015.1081%2012.1881%2012.9604%209.44825%2012.0722C12.1881%2011.1838%2014.3358%209.03615%2015.2242%206.29626C16.1125%209.03615%2018.2601%2011.1838%2021%2012.0722Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M8.86914%205.5688C7.9133%205.87867%207.16407%206.62792%206.85417%207.58418C6.54426%206.62792%205.79501%205.87867%204.83917%205.5688C5.79501%205.25889%206.54426%204.50964%206.85417%203.5538C7.16407%204.50964%207.9133%205.25889%208.86914%205.5688Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M8.97852%2017.4564C7.56051%2017.9161%206.44901%2019.0276%205.98927%2020.4462C5.52952%2019.0276%204.418%2017.9161%203%2017.4564C4.418%2016.9966%205.52952%2015.8851%205.98927%2014.4671C6.44901%2015.8851%207.56051%2016.9966%208.97852%2017.4564Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M21%2012.0722C18.2601%2012.9604%2016.1125%2015.1081%2015.2242%2017.8492C14.3358%2015.1081%2012.1881%2012.9604%209.44825%2012.0722C12.1881%2011.1838%2014.3358%209.03615%2015.2242%206.29626C16.1125%209.03615%2018.2601%2011.1838%2021%2012.0722Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M8.86914%205.5688C7.9133%205.87867%207.16407%206.62792%206.85417%207.58418C6.54426%206.62792%205.79501%205.87867%204.83917%205.5688C5.79501%205.25889%206.54426%204.50964%206.85417%203.5538C7.16407%204.50964%207.9133%205.25889%208.86914%205.5688Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M8.97852%2017.4564C7.56051%2017.9161%206.44901%2019.0276%205.98927%2020.4462C5.52952%2019.0276%204.418%2017.9161%203%2017.4564C4.418%2016.9966%205.52952%2015.8851%205.98927%2014.4671C6.44901%2015.8851%207.56051%2016.9966%208.97852%2017.4564Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-star { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Star%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Star%22%20transform=%22translate(3.000000,%203.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M10.1042564,0.67700614%20L11.9316681,4.32775597%20C12.1107648,4.68615589%2012.4564632,4.93467388%2012.8573484,4.99218218%20L16.9453359,5.58061527%20C17.9553583,5.72643988%2018.3572847,6.95054503%2017.6263201,7.65194084%20L14.6701824,10.4924399%20C14.3796708,10.7717659%2014.2474307,11.173297%2014.3161539,11.5676396%20L15.0137982,15.5778163%20C15.1856062,16.5698344%2014.1297683,17.3266846%2013.2269958,16.8573759%20L9.57321374,14.9626829%20C9.21502023,14.7768079%208.78602103,14.7768079%208.42678626,14.9626829%20L4.77300425,16.8573759%20C3.87023166,17.3266846%202.81439382,16.5698344%202.98724301,15.5778163%20L3.68384608,11.5676396%20C3.75256926,11.173297%203.62032921,10.7717659%203.32981762,10.4924399%20L0.373679928,7.65194084%20C-0.357284727,6.95054503%200.0446417073,5.72643988%201.05466409,5.58061527%20L5.14265161,4.99218218%20C5.54353679,4.93467388%205.89027643,4.68615589%206.06937319,4.32775597%20L7.89574356,0.67700614%20C8.34765049,-0.225668713%209.65234951,-0.225668713%2010.1042564,0.67700614%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Star%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Star%22%20transform=%22translate(3.000000,%203.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M10.1042564,0.67700614%20L11.9316681,4.32775597%20C12.1107648,4.68615589%2012.4564632,4.93467388%2012.8573484,4.99218218%20L16.9453359,5.58061527%20C17.9553583,5.72643988%2018.3572847,6.95054503%2017.6263201,7.65194084%20L14.6701824,10.4924399%20C14.3796708,10.7717659%2014.2474307,11.173297%2014.3161539,11.5676396%20L15.0137982,15.5778163%20C15.1856062,16.5698344%2014.1297683,17.3266846%2013.2269958,16.8573759%20L9.57321374,14.9626829%20C9.21502023,14.7768079%208.78602103,14.7768079%208.42678626,14.9626829%20L4.77300425,16.8573759%20C3.87023166,17.3266846%202.81439382,16.5698344%202.98724301,15.5778163%20L3.68384608,11.5676396%20C3.75256926,11.173297%203.62032921,10.7717659%203.32981762,10.4924399%20L0.373679928,7.65194084%20C-0.357284727,6.95054503%200.0446417073,5.72643988%201.05466409,5.58061527%20L5.14265161,4.99218218%20C5.54353679,4.93467388%205.89027643,4.68615589%206.06937319,4.32775597%20L7.89574356,0.67700614%20C8.34765049,-0.225668713%209.65234951,-0.225668713%2010.1042564,0.67700614%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-swap { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Swap%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Swap%22%20transform=%22translate(2.000000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%2214.8395556%22%20y1=%2217.1642222%22%20x2=%2214.8395556%22%20y2=%223.54644444%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%2218.9172222%2013.0681111%2014.8394444%2017.1647778%2010.7616667%2013.0681111%22%3E%3C/polyline%3E%3Cline%20x1=%224.91111111%22%20y1=%220.832888889%22%20x2=%224.91111111%22%20y2=%2214.4506667%22%20id=%22Stroke-5%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-7%22%20points=%220.833444444%204.929%204.91122222%200.832333333%208.989%204.929%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Swap%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Swap%22%20transform=%22translate(2.000000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cline%20x1=%2214.8395556%22%20y1=%2217.1642222%22%20x2=%2214.8395556%22%20y2=%223.54644444%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%2218.9172222%2013.0681111%2014.8394444%2017.1647778%2010.7616667%2013.0681111%22%3E%3C/polyline%3E%3Cline%20x1=%224.91111111%22%20y1=%220.832888889%22%20x2=%224.91111111%22%20y2=%2214.4506667%22%20id=%22Stroke-5%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-7%22%20points=%220.833444444%204.929%204.91122222%200.832333333%208.989%204.929%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-swap-bold { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Swap%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Swap%22%20transform=%22translate(2.000000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%3E%3Cline%20x1=%2214.8395556%22%20y1=%2217.1642222%22%20x2=%2214.8395556%22%20y2=%223.54644444%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%2218.9172222%2013.0681111%2014.8394444%2017.1647778%2010.7616667%2013.0681111%22%3E%3C/polyline%3E%3Cline%20x1=%224.91111111%22%20y1=%220.832888889%22%20x2=%224.91111111%22%20y2=%2214.4506667%22%20id=%22Stroke-5%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-7%22%20points=%220.833444444%204.929%204.91122222%200.832333333%208.989%204.929%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Swap%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Swap%22%20transform=%22translate(2.000000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%3E%3Cline%20x1=%2214.8395556%22%20y1=%2217.1642222%22%20x2=%2214.8395556%22%20y2=%223.54644444%22%20id=%22Stroke-1%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%2218.9172222%2013.0681111%2014.8394444%2017.1647778%2010.7616667%2013.0681111%22%3E%3C/polyline%3E%3Cline%20x1=%224.91111111%22%20y1=%220.832888889%22%20x2=%224.91111111%22%20y2=%2214.4506667%22%20id=%22Stroke-5%22%3E%3C/line%3E%3Cpolyline%20id=%22Stroke-7%22%20points=%220.833444444%204.929%204.91122222%200.832333333%208.989%204.929%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
/* Телеграм — власний контур замовника, а не Iconly: у паку немає
   бренд-гліфа з таким штрихом, а контакт куратора має виглядати
   впізнаваним саме телеграмом. viewBox 20, не 24 — маска бере contain,
   тож у слоті будь-якого розміру гліф лягає правильно. */
.ui-icon.i-telegram { mask: url("data:image/svg+xml,%3Csvg%20width=%2220%22%20height=%2220%22%20viewBox=%220%200%2020%2020%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M17.4258%202.79883C17.7159%202.82411%2018.1093%202.93116%2018.4043%203.27832C18.6981%203.62408%2018.7787%204.07308%2018.7402%204.53613L18.7412%204.53711C18.7177%204.86699%2018.6064%205.56285%2018.4766%206.38867C18.3429%207.23926%2018.1796%208.28222%2018.0371%209.36426L18.0361%209.37207L18.0352%209.37891L17.0518%2015.8311V15.833C17.0502%2015.8465%2017.0478%2015.8635%2017.0449%2015.8838C17.0392%2015.9247%2017.0302%2015.9796%2017.0166%2016.0439C16.9899%2016.1705%2016.943%2016.3467%2016.8604%2016.5352C16.6998%2016.9008%2016.3477%2017.428%2015.6475%2017.584C15.0158%2017.7246%2014.353%2017.478%2013.9395%2017.2842C13.5058%2017.081%2013.1381%2016.8326%2012.9785%2016.708V16.709C12.9737%2016.7058%2012.9335%2016.6792%2012.835%2016.6143C12.7381%2016.5504%2012.6079%2016.4649%2012.4502%2016.3613C12.1367%2016.1554%2011.7214%2015.8818%2011.2783%2015.583C10.4076%2014.9958%209.37836%2014.2785%208.82129%2013.7871V13.7861C8.61977%2013.6112%208.31867%2013.2814%208.24316%2012.8057C8.15762%2012.2664%208.39154%2011.7664%208.84082%2011.3623L10.1436%2010.1172L7.27246%2012.0713L7.24902%2012.0869L6.85059%2011.4512L7.24805%2012.0869L7.24512%2012.0889C7.24415%2012.0895%207.24322%2012.0902%207.24219%2012.0908C7.23977%2012.0923%207.23715%2012.094%207.23438%2012.0957C7.22879%2012.099%207.22188%2012.1024%207.21484%2012.1064C7.20083%2012.1145%207.1838%2012.1236%207.16406%2012.1338C7.12441%2012.1543%207.07333%2012.1787%207.01074%2012.2041C6.8851%2012.2551%206.71374%2012.3105%206.49902%2012.3486C6.06529%2012.4257%205.47298%2012.4294%204.74316%2012.21L4.73828%2012.209L2.06641%2011.3848L1.97266%2011.3555L1.88867%2011.3037L2.28711%2010.668L1.88867%2011.3027H1.8877L1.88574%2011.3018C1.8846%2011.301%201.88312%2011.2996%201.88184%2011.2988C1.87948%2011.2973%201.87682%2011.2958%201.87402%2011.2939C1.86792%2011.2899%201.86057%2011.2848%201.85254%2011.2793C1.83638%2011.2682%201.81586%2011.2538%201.79297%2011.2363C1.74775%2011.2018%201.68671%2011.151%201.62305%2011.0859C1.50898%2010.9693%201.31641%2010.7352%201.26367%2010.3965C1.20268%2010.004%201.35201%209.63816%201.63379%209.35547C1.87984%209.10863%202.23368%208.91471%202.6748%208.74805C6.80619%206.8017%2011.8922%204.81154%2016.3486%202.9668L16.3564%202.96387L16.3633%202.96094H16.3643L16.3652%202.95996C16.3662%202.95961%2016.368%202.95941%2016.3691%202.95898C16.3712%202.95821%2016.3734%202.95704%2016.376%202.95605C16.3818%202.95385%2016.3897%202.95137%2016.3984%202.94824C16.416%202.94192%2016.4396%202.93298%2016.4678%202.92383C16.5238%202.90567%2016.6015%202.88296%2016.6934%202.86133C16.8683%202.82015%2017.1369%202.77371%2017.4258%202.79883Z%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2220%22%20height=%2220%22%20viewBox=%220%200%2020%2020%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M17.4258%202.79883C17.7159%202.82411%2018.1093%202.93116%2018.4043%203.27832C18.6981%203.62408%2018.7787%204.07308%2018.7402%204.53613L18.7412%204.53711C18.7177%204.86699%2018.6064%205.56285%2018.4766%206.38867C18.3429%207.23926%2018.1796%208.28222%2018.0371%209.36426L18.0361%209.37207L18.0352%209.37891L17.0518%2015.8311V15.833C17.0502%2015.8465%2017.0478%2015.8635%2017.0449%2015.8838C17.0392%2015.9247%2017.0302%2015.9796%2017.0166%2016.0439C16.9899%2016.1705%2016.943%2016.3467%2016.8604%2016.5352C16.6998%2016.9008%2016.3477%2017.428%2015.6475%2017.584C15.0158%2017.7246%2014.353%2017.478%2013.9395%2017.2842C13.5058%2017.081%2013.1381%2016.8326%2012.9785%2016.708V16.709C12.9737%2016.7058%2012.9335%2016.6792%2012.835%2016.6143C12.7381%2016.5504%2012.6079%2016.4649%2012.4502%2016.3613C12.1367%2016.1554%2011.7214%2015.8818%2011.2783%2015.583C10.4076%2014.9958%209.37836%2014.2785%208.82129%2013.7871V13.7861C8.61977%2013.6112%208.31867%2013.2814%208.24316%2012.8057C8.15762%2012.2664%208.39154%2011.7664%208.84082%2011.3623L10.1436%2010.1172L7.27246%2012.0713L7.24902%2012.0869L6.85059%2011.4512L7.24805%2012.0869L7.24512%2012.0889C7.24415%2012.0895%207.24322%2012.0902%207.24219%2012.0908C7.23977%2012.0923%207.23715%2012.094%207.23438%2012.0957C7.22879%2012.099%207.22188%2012.1024%207.21484%2012.1064C7.20083%2012.1145%207.1838%2012.1236%207.16406%2012.1338C7.12441%2012.1543%207.07333%2012.1787%207.01074%2012.2041C6.8851%2012.2551%206.71374%2012.3105%206.49902%2012.3486C6.06529%2012.4257%205.47298%2012.4294%204.74316%2012.21L4.73828%2012.209L2.06641%2011.3848L1.97266%2011.3555L1.88867%2011.3037L2.28711%2010.668L1.88867%2011.3027H1.8877L1.88574%2011.3018C1.8846%2011.301%201.88312%2011.2996%201.88184%2011.2988C1.87948%2011.2973%201.87682%2011.2958%201.87402%2011.2939C1.86792%2011.2899%201.86057%2011.2848%201.85254%2011.2793C1.83638%2011.2682%201.81586%2011.2538%201.79297%2011.2363C1.74775%2011.2018%201.68671%2011.151%201.62305%2011.0859C1.50898%2010.9693%201.31641%2010.7352%201.26367%2010.3965C1.20268%2010.004%201.35201%209.63816%201.63379%209.35547C1.87984%209.10863%202.23368%208.91471%202.6748%208.74805C6.80619%206.8017%2011.8922%204.81154%2016.3486%202.9668L16.3564%202.96387L16.3633%202.96094H16.3643L16.3652%202.95996C16.3662%202.95961%2016.368%202.95941%2016.3691%202.95898C16.3712%202.95821%2016.3734%202.95704%2016.376%202.95605C16.3818%202.95385%2016.3897%202.95137%2016.3984%202.94824C16.416%202.94192%2016.4396%202.93298%2016.4678%202.92383C16.5238%202.90567%2016.6015%202.88296%2016.6934%202.86133C16.8683%202.82015%2017.1369%202.77371%2017.4258%202.79883Z%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-telegram-fill { mask: url("data:image/svg+xml,%3Csvg%20width=%2220%22%20height=%2220%22%20viewBox=%220%200%2020%2020%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M16.6357%203.6598C16.6357%203.6598%2018.1161%203.08247%2017.9928%204.48392C17.9517%205.06107%2017.5815%207.08121%2017.2937%209.26613L16.3071%2015.7386C16.3071%2015.7386%2016.2248%2016.687%2015.4848%2016.852C14.7452%2017.0167%2013.6362%2016.2756%2013.4294%2016.11C13.2649%2015.9863%2010.3459%2014.1313%209.31771%2013.2242C9.02989%2012.9769%208.70094%2012.4817%209.35878%2011.9046L13.6758%207.78218C14.1692%207.28747%2014.6625%206.13347%2012.607%207.53486L6.85071%2011.451C6.85071%2011.451%206.1929%2011.863%204.95961%2011.4921L2.28725%2010.6679C2.28725%2010.6679%201.30021%2010.0497%202.98547%209.43132C7.09689%207.49377%2012.1542%205.51488%2016.6357%203.6598Z%22%20fill=%22%23000000%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2220%22%20height=%2220%22%20viewBox=%220%200%2020%2020%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M16.6357%203.6598C16.6357%203.6598%2018.1161%203.08247%2017.9928%204.48392C17.9517%205.06107%2017.5815%207.08121%2017.2937%209.26613L16.3071%2015.7386C16.3071%2015.7386%2016.2248%2016.687%2015.4848%2016.852C14.7452%2017.0167%2013.6362%2016.2756%2013.4294%2016.11C13.2649%2015.9863%2010.3459%2014.1313%209.31771%2013.2242C9.02989%2012.9769%208.70094%2012.4817%209.35878%2011.9046L13.6758%207.78218C14.1692%207.28747%2014.6625%206.13347%2012.607%207.53486L6.85071%2011.451C6.85071%2011.451%206.1929%2011.863%204.95961%2011.4921L2.28725%2010.6679C2.28725%2010.6679%201.30021%2010.0497%202.98547%209.43132C7.09689%207.49377%2012.1542%205.51488%2016.6357%203.6598Z%22%20fill=%22%23000000%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-tick, .ui-icon.xi-check-circle { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Tick-Square%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Tick-Square%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M14.3344,0.7502%20L5.6654,0.7502%20C2.6444,0.7502%200.7504,2.8892%200.7504,5.9162%20L0.7504,14.0842%20C0.7504,17.1112%202.6354,19.2502%205.6654,19.2502%20L14.3334,19.2502%20C17.3644,19.2502%2019.2504,17.1112%2019.2504,14.0842%20L19.2504,5.9162%20C19.2504,2.8892%2017.3644,0.7502%2014.3344,0.7502%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%226.4399%2010.0002%208.8139%2012.3732%2013.5599%207.6272%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Tick-Square%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Tick-Square%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M14.3344,0.7502%20L5.6654,0.7502%20C2.6444,0.7502%200.7504,2.8892%200.7504,5.9162%20L0.7504,14.0842%20C0.7504,17.1112%202.6354,19.2502%205.6654,19.2502%20L14.3334,19.2502%20C17.3644,19.2502%2019.2504,17.1112%2019.2504,14.0842%20L19.2504,5.9162%20C19.2504,2.8892%2017.3644,0.7502%2014.3344,0.7502%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%226.4399%2010.0002%208.8139%2012.3732%2013.5599%207.6272%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-tick-bold { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Tick-Square%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Tick-Square%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%3E%3Cpath%20d=%22M14.3344,0.7502%20L5.6654,0.7502%20C2.6444,0.7502%200.7504,2.8892%200.7504,5.9162%20L0.7504,14.0842%20C0.7504,17.1112%202.6354,19.2502%205.6654,19.2502%20L14.3334,19.2502%20C17.3644,19.2502%2019.2504,17.1112%2019.2504,14.0842%20L19.2504,5.9162%20C19.2504,2.8892%2017.3644,0.7502%2014.3344,0.7502%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%226.4399%2010.0002%208.8139%2012.3732%2013.5599%207.6272%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Tick-Square%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Tick-Square%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.75%22%3E%3Cpath%20d=%22M14.3344,0.7502%20L5.6654,0.7502%20C2.6444,0.7502%200.7504,2.8892%200.7504,5.9162%20L0.7504,14.0842%20C0.7504,17.1112%202.6354,19.2502%205.6654,19.2502%20L14.3334,19.2502%20C17.3644,19.2502%2019.2504,17.1112%2019.2504,14.0842%20L19.2504,5.9162%20C19.2504,2.8892%2017.3644,0.7502%2014.3344,0.7502%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%226.4399%2010.0002%208.8139%2012.3732%2013.5599%207.6272%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-tick-circle { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M21%2012C21%207.02908%2016.9709%203%2012%203C7.02908%203%203%207.02908%203%2012C3%2016.9699%207.02908%2021%2012%2021C16.9709%2021%2021%2016.9699%2021%2012Z%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M8.53516%2012.0003L10.845%2014.3091L15.4627%209.69141%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M21%2012C21%207.02908%2016.9709%203%2012%203C7.02908%203%203%207.02908%203%2012C3%2016.9699%207.02908%2021%2012%2021C16.9709%2021%2021%2016.9699%2021%2012Z%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M8.53516%2012.0003L10.845%2014.3091L15.4627%209.69141%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-time, .ui-icon.xi-clock { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Time-Circle%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Time-Circle%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M19.2498,10.0005%20C19.2498,15.1095%2015.1088,19.2505%209.9998,19.2505%20C4.8908,19.2505%200.7498,15.1095%200.7498,10.0005%20C0.7498,4.8915%204.8908,0.7505%209.9998,0.7505%20C15.1088,0.7505%2019.2498,4.8915%2019.2498,10.0005%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%2213.4314%2012.9429%209.6614%2010.6939%209.6614%205.8469%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Time-Circle%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Time-Circle%22%20transform=%22translate(2.000000,%202.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M19.2498,10.0005%20C19.2498,15.1095%2015.1088,19.2505%209.9998,19.2505%20C4.8908,19.2505%200.7498,15.1095%200.7498,10.0005%20C0.7498,4.8915%204.8908,0.7505%209.9998,0.7505%20C15.1088,0.7505%2019.2498,4.8915%2019.2498,10.0005%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpolyline%20id=%22Stroke-3%22%20points=%2213.4314%2012.9429%209.6614%2010.6939%209.6614%205.8469%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-time-bold { mask: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20transform%3D%22translate%282%202%29%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M19.2498%2C10.0005%20C19.2498%2C15.1095%2015.1088%2C19.2505%209.9998%2C19.2505%20C4.8908%2C19.2505%200.7498%2C15.1095%200.7498%2C10.0005%20C0.7498%2C4.8915%204.8908%2C0.7505%209.9998%2C0.7505%20C15.1088%2C0.7505%2019.2498%2C4.8915%2019.2498%2C10.0005%20Z%22%2F%3E%3Cpolyline%20points%3D%2213.4314%2012.9429%209.6614%2010.6939%209.6614%205.8469%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cg%20transform%3D%22translate%282%202%29%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M19.2498%2C10.0005%20C19.2498%2C15.1095%2015.1088%2C19.2505%209.9998%2C19.2505%20C4.8908%2C19.2505%200.7498%2C15.1095%200.7498%2C10.0005%20C0.7498%2C4.8915%204.8908%2C0.7505%209.9998%2C0.7505%20C15.1088%2C0.7505%2019.2498%2C4.8915%2019.2498%2C10.0005%20Z%22%2F%3E%3Cpolyline%20points%3D%2213.4314%2012.9429%209.6614%2010.6939%209.6614%205.8469%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") no-repeat center / contain; }
.ui-icon.i-unlock { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Unlock%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Unlock%22%20transform=%22translate(4.500000,%202.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M11.9242,3.06203682%20C11.3072,1.28003682%209.6142,0%207.6222,0%20C5.1092,-0.00996317625%203.0632,2.01803682%203.0522,4.53103682%20L3.0522,4.55103682%20L3.0522,6.69803682%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M11.433,18.5004368%20L3.792,18.5004368%20C1.698,18.5004368%201.13686838e-13,16.8024368%201.13686838e-13,14.7074368%20L1.13686838e-13,10.4194368%20C1.13686838e-13,8.32443682%201.698,6.62643682%203.792,6.62643682%20L11.433,6.62643682%20C13.527,6.62643682%2015.225,8.32443682%2015.225,10.4194368%20L15.225,14.7074368%20C15.225,16.8024368%2013.527,18.5004368%2011.433,18.5004368%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%227.6127%22%20y1=%2211.4526368%22%20x2=%227.6127%22%20y2=%2213.6746368%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Unlock%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Unlock%22%20transform=%22translate(4.500000,%202.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M11.9242,3.06203682%20C11.3072,1.28003682%209.6142,0%207.6222,0%20C5.1092,-0.00996317625%203.0632,2.01803682%203.0522,4.53103682%20L3.0522,4.55103682%20L3.0522,6.69803682%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M11.433,18.5004368%20L3.792,18.5004368%20C1.698,18.5004368%201.13686838e-13,16.8024368%201.13686838e-13,14.7074368%20L1.13686838e-13,10.4194368%20C1.13686838e-13,8.32443682%201.698,6.62643682%203.792,6.62643682%20L11.433,6.62643682%20C13.527,6.62643682%2015.225,8.32443682%2015.225,10.4194368%20L15.225,14.7074368%20C15.225,16.8024368%2013.527,18.5004368%2011.433,18.5004368%20Z%22%20id=%22Stroke-3%22%3E%3C/path%3E%3Cline%20x1=%227.6127%22%20y1=%2211.4526368%22%20x2=%227.6127%22%20y2=%2213.6746368%22%20id=%22Stroke-5%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-update { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2014.8048L4.88126%2011.9982L7.67224%2013.869%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M21.0004%209.19141L19.1191%2011.9981L16.3281%2010.1272%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M4.91211%2012.1523C4.9922%2015.9984%208.13576%2019.0924%2012.001%2019.0924C14.422%2019.0924%2016.5601%2017.8788%2017.8389%2016.0272%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M19.0889%2011.8463C19.0088%208.00019%2015.8653%204.90625%2012%204.90625C9.57902%204.90625%207.44095%206.1198%206.16211%207.97146%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2014.8048L4.88126%2011.9982L7.67224%2013.869%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M21.0004%209.19141L19.1191%2011.9981L16.3281%2010.1272%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M4.91211%2012.1523C4.9922%2015.9984%208.13576%2019.0924%2012.001%2019.0924C14.422%2019.0924%2016.5601%2017.8788%2017.8389%2016.0272%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M19.0889%2011.8463C19.0088%208.00019%2015.8653%204.90625%2012%204.90625C9.57902%204.90625%207.44095%206.1198%206.16211%207.97146%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-upload { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2015V15.0798C3%2017.1521%203%2018.1883%203.40328%2018.9798C3.75801%2019.676%204.32404%2020.242%205.02024%2020.5967C5.81171%2021%206.84781%2021%208.92%2021H15.08C17.1522%2021%2018.1883%2021%2018.9798%2020.5967C19.676%2020.242%2020.242%2019.676%2020.5967%2018.9798C21%2018.1883%2021%2017.1521%2021%2015.0798V15%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M7.78125%207.34418L11.9997%202.9999M11.9997%202.9999L16.2182%207.34418M11.9997%202.9999L12.0002%2015.5508%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M3%2015V15.0798C3%2017.1521%203%2018.1883%203.40328%2018.9798C3.75801%2019.676%204.32404%2020.242%205.02024%2020.5967C5.81171%2021%206.84781%2021%208.92%2021H15.08C17.1522%2021%2018.1883%2021%2018.9798%2020.5967C19.676%2020.242%2020.242%2019.676%2020.5967%2018.9798C21%2018.1883%2021%2017.1521%2021%2015.0798V15%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M7.78125%207.34418L11.9997%202.9999M11.9997%202.9999L16.2182%207.34418M11.9997%202.9999L12.0002%2015.5508%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-users { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M5.02223%2019.5447C3.79445%2019.5447%203.05253%2018.6623%203%2017.4331C3%2014.9312%205.44463%2014.0682%209.12798%2014.0391C12.8179%2014.0779%2015.2691%2014.9409%2015.256%2017.4331C15.1969%2018.6623%2014.4593%2019.5447%2013.2337%2019.5447H5.02223Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-miterlimit=%2210%22/%3E%3Cpath%20d=%22M17.7933%2018.8155H19.3592C20.3532%2018.8155%2020.9514%2018.0998%2020.9993%2017.1029C21.0085%2015.3462%2019.508%2014.5876%2017.1504%2014.3984%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-miterlimit=%2210%22%20stroke-linecap=%22round%22/%3E%3Cpath%20d=%22M9.10877%2010.9011C10.8883%2010.9011%2012.3308%209.45857%2012.3308%207.67908C12.3308%205.89959%2010.8883%204.45703%209.10877%204.45703C7.32928%204.45703%205.88672%205.89959%205.88672%207.67908C5.88672%209.45857%207.32928%2010.9011%209.10877%2010.9011Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-miterlimit=%2210%22/%3E%3Cpath%20d=%22M17.1357%2010.7598C18.2948%2010.7598%2019.2344%209.82018%2019.2344%208.66113C19.2344%207.50209%2018.2948%206.5625%2017.1357%206.5625C15.9767%206.5625%2015.0371%207.50209%2015.0371%208.66113C15.0371%209.82018%2015.9767%2010.7598%2017.1357%2010.7598Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-miterlimit=%2210%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M5.02223%2019.5447C3.79445%2019.5447%203.05253%2018.6623%203%2017.4331C3%2014.9312%205.44463%2014.0682%209.12798%2014.0391C12.8179%2014.0779%2015.2691%2014.9409%2015.256%2017.4331C15.1969%2018.6623%2014.4593%2019.5447%2013.2337%2019.5447H5.02223Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-miterlimit=%2210%22/%3E%3Cpath%20d=%22M17.7933%2018.8155H19.3592C20.3532%2018.8155%2020.9514%2018.0998%2020.9993%2017.1029C21.0085%2015.3462%2019.508%2014.5876%2017.1504%2014.3984%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-miterlimit=%2210%22%20stroke-linecap=%22round%22/%3E%3Cpath%20d=%22M9.10877%2010.9011C10.8883%2010.9011%2012.3308%209.45857%2012.3308%207.67908C12.3308%205.89959%2010.8883%204.45703%209.10877%204.45703C7.32928%204.45703%205.88672%205.89959%205.88672%207.67908C5.88672%209.45857%207.32928%2010.9011%209.10877%2010.9011Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-miterlimit=%2210%22/%3E%3Cpath%20d=%22M17.1357%2010.7598C18.2948%2010.7598%2019.2344%209.82018%2019.2344%208.66113C19.2344%207.50209%2018.2948%206.5625%2017.1357%206.5625C15.9767%206.5625%2015.0371%207.50209%2015.0371%208.66113C15.0371%209.82018%2015.9767%2010.7598%2017.1357%2010.7598Z%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-miterlimit=%2210%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-video { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Video%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Video%22%20transform=%22translate(2.300000,%205.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M13.9968329,10.5383104%20C14.0777257,12.3703766%2012.599129,13.9196009%2010.6945655,13.9974564%20C10.5542831,14.0033694%203.71526168,13.9895723%203.71526168,13.9895723%20C1.81991377,14.133457%200.161100366,12.7714799%200.0116023677,10.9463123%20C0.000338819853,10.8103117%200.00341069653,3.47219182%200.00341069653,3.47219182%20C-0.0805539327,1.63815461%201.39599479,0.0849882318%203.30158229,0.00417627553%20C3.44391258,-0.00272230611%2010.2737184,0.0100893455%2010.2737184,0.0100893455%20C12.1782819,-0.131824334%2013.8422151,1.2400079%2013.9896652,3.0740451%20C14,3.20610367%2013.9968329,10.5383104%2013.9968329,10.5383104%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M14,4.97983717%20L17.293,2.28483717%20C18.109,1.61683717%2019.333,2.19883717%2019.3320006,3.25183717%20L19.32,10.6008372%20C19.319,11.6538372%2018.094,12.2308372%2017.28,11.5628372%20L14,8.86783717%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Video%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Video%22%20transform=%22translate(2.300000,%205.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M13.9968329,10.5383104%20C14.0777257,12.3703766%2012.599129,13.9196009%2010.6945655,13.9974564%20C10.5542831,14.0033694%203.71526168,13.9895723%203.71526168,13.9895723%20C1.81991377,14.133457%200.161100366,12.7714799%200.0116023677,10.9463123%20C0.000338819853,10.8103117%200.00341069653,3.47219182%200.00341069653,3.47219182%20C-0.0805539327,1.63815461%201.39599479,0.0849882318%203.30158229,0.00417627553%20C3.44391258,-0.00272230611%2010.2737184,0.0100893455%2010.2737184,0.0100893455%20C12.1782819,-0.131824334%2013.8422151,1.2400079%2013.9896652,3.0740451%20C14,3.20610367%2013.9968329,10.5383104%2013.9968329,10.5383104%20Z%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cpath%20d=%22M14,4.97983717%20L17.293,2.28483717%20C18.109,1.61683717%2019.333,2.19883717%2019.3320006,3.25183717%20L19.32,10.6008372%20C19.319,11.6538372%2018.094,12.2308372%2017.28,11.5628372%20L14,8.86783717%22%20id=%22Stroke-3%22%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-wallet { mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Wallet%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Wallet%22%20transform=%22translate(2.500000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M19.1389383,11.3957621%20L15.0906357,11.3957621%20C13.6041923,11.3948508%2012.399362,10.1909319%2012.3984507,8.70448849%20C12.3984507,7.21804511%2013.6041923,6.01412622%2015.0906357,6.01321486%20L19.1389383,6.01321486%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cline%20x1=%2215.5485988%22%20y1=%228.64287993%22%20x2=%2215.2369105%22%20y2=%228.64287993%22%20id=%22Stroke-3%22%3E%3C/line%3E%3Cpath%20d=%22M5.24766462,1.52259158e-14%20L13.8910914,1.52259158e-14%20C16.7892458,1.52259158e-14%2019.138756,2.34951014%2019.138756,5.24766462%20L19.138756,12.4246981%20C19.138756,15.3228526%2016.7892458,17.6723627%2013.8910914,17.6723627%20L5.24766462,17.6723627%20C2.34951014,17.6723627%201.69176842e-15,15.3228526%201.69176842e-15,12.4246981%20L1.69176842e-15,5.24766462%20C1.69176842e-15,2.34951014%202.34951014,1.52259158e-14%205.24766462,1.52259158e-14%20Z%22%20id=%22Stroke-5%22%3E%3C/path%3E%3Cline%20x1=%224.53561176%22%20y1=%224.53816359%22%20x2=%229.93456368%22%20y2=%224.53816359%22%20id=%22Stroke-7%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Wallet%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Wallet%22%20transform=%22translate(2.500000,%203.000000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpath%20d=%22M19.1389383,11.3957621%20L15.0906357,11.3957621%20C13.6041923,11.3948508%2012.399362,10.1909319%2012.3984507,8.70448849%20C12.3984507,7.21804511%2013.6041923,6.01412622%2015.0906357,6.01321486%20L19.1389383,6.01321486%22%20id=%22Stroke-1%22%3E%3C/path%3E%3Cline%20x1=%2215.5485988%22%20y1=%228.64287993%22%20x2=%2215.2369105%22%20y2=%228.64287993%22%20id=%22Stroke-3%22%3E%3C/line%3E%3Cpath%20d=%22M5.24766462,1.52259158e-14%20L13.8910914,1.52259158e-14%20C16.7892458,1.52259158e-14%2019.138756,2.34951014%2019.138756,5.24766462%20L19.138756,12.4246981%20C19.138756,15.3228526%2016.7892458,17.6723627%2013.8910914,17.6723627%20L5.24766462,17.6723627%20C2.34951014,17.6723627%201.69176842e-15,15.3228526%201.69176842e-15,12.4246981%20L1.69176842e-15,5.24766462%20C1.69176842e-15,2.34951014%202.34951014,1.52259158e-14%205.24766462,1.52259158e-14%20Z%22%20id=%22Stroke-5%22%3E%3C/path%3E%3Cline%20x1=%224.53561176%22%20y1=%224.53816359%22%20x2=%229.93456368%22%20y2=%224.53816359%22%20id=%22Stroke-7%22%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
/* Гола галочка — товща за Iconly-набір (stroke 2.6 проти 1.5): у тегах
   і на дрібних кеглях тонка лінія Light-стилю просто зникає.
   i-tick лишається окремо — то Tick-Square, галочка в рамці. */
.ui-icon.i-check { mask: url("data:image/svg+xml,%3Csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3E%3Cpath%20d='M5%2012.5L9.5%2017L19%207.5'%20stroke='black'%20stroke-width='2.6'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3E%3Cpath%20d='M5%2012.5L9.5%2017L19%207.5'%20stroke='black'%20stroke-width='2.6'%20stroke-linecap='round'%20stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain; }

/* ---- Iconly BOLD (заливка, не штрих) ----
   Виняток із правила «тільки Light»: у великому банері з суцільною заливкою
   світлий штрих 1.5 на 20px читався як подряпина. Суфікс -fill, а не -bold:
   -bold у цьому наборі вже означає ІНШЕ — той самий Light-гліф зі штрихом
   1.75. Джерела в icons-src/bold/. */
.ui-icon.i-update-square-fill { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2225%22%20viewBox=%220%200%2024%2025%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M18.229%2010.79L17.156%2012.62C17.055%2012.792%2016.89%2012.916%2016.698%2012.967C16.635%2012.983%2016.573%2012.991%2016.509%2012.991C16.376%2012.991%2016.245%2012.956%2016.128%2012.887L14.311%2011.817C13.955%2011.606%2013.835%2011.146%2014.045%2010.79C14.254%2010.433%2014.712%2010.313%2015.073%2010.524L15.333%2010.677C14.735%209.426%2013.461%208.55%2012%208.55C10.784%208.55%209.645%209.147%208.953%2010.147C8.717%2010.487%208.251%2010.574%207.91%2010.337C7.569%2010.101%207.484%209.634%207.72%209.293C8.692%207.889%2010.292%207.05%2012%207.05C14.146%207.05%2016.005%208.391%2016.792%2010.276L16.936%2010.031C17.143%209.673%2017.602%209.553%2017.962%209.764C18.319%209.973%2018.439%2010.433%2018.229%2010.79ZM16.279%2015.207C15.307%2016.612%2013.708%2017.451%2011.999%2017.451C9.85%2017.451%207.991%2016.111%207.205%2014.228L7.063%2014.47C6.924%2014.708%206.673%2014.84%206.416%2014.84C6.287%2014.84%206.157%2014.807%206.037%2014.737C5.68%2014.528%205.56%2014.068%205.77%2013.711L6.843%2011.881C6.944%2011.709%207.109%2011.584%207.301%2011.534C7.495%2011.484%207.699%2011.513%207.871%2011.614L9.688%2012.684C10.044%2012.894%2010.164%2013.354%209.954%2013.711C9.744%2014.067%209.286%2014.187%208.926%2013.977L8.66%2013.82C9.256%2015.073%2010.533%2015.951%2011.999%2015.951C13.214%2015.951%2014.354%2015.354%2015.044%2014.354C15.279%2014.014%2015.744%2013.927%2016.088%2014.164C16.429%2014.399%2016.514%2014.867%2016.279%2015.207ZM15.974%202.75H8.027C4.721%202.75%202.5%204.873%202.5%208.031V16.47C2.5%2019.628%204.721%2021.75%208.027%2021.75H15.974C19.28%2021.75%2021.5%2019.628%2021.5%2016.47V8.031C21.5%204.873%2019.28%202.75%2015.974%202.75Z%22%20fill=%22%23000000%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2225%22%20viewBox=%220%200%2024%2025%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M18.229%2010.79L17.156%2012.62C17.055%2012.792%2016.89%2012.916%2016.698%2012.967C16.635%2012.983%2016.573%2012.991%2016.509%2012.991C16.376%2012.991%2016.245%2012.956%2016.128%2012.887L14.311%2011.817C13.955%2011.606%2013.835%2011.146%2014.045%2010.79C14.254%2010.433%2014.712%2010.313%2015.073%2010.524L15.333%2010.677C14.735%209.426%2013.461%208.55%2012%208.55C10.784%208.55%209.645%209.147%208.953%2010.147C8.717%2010.487%208.251%2010.574%207.91%2010.337C7.569%2010.101%207.484%209.634%207.72%209.293C8.692%207.889%2010.292%207.05%2012%207.05C14.146%207.05%2016.005%208.391%2016.792%2010.276L16.936%2010.031C17.143%209.673%2017.602%209.553%2017.962%209.764C18.319%209.973%2018.439%2010.433%2018.229%2010.79ZM16.279%2015.207C15.307%2016.612%2013.708%2017.451%2011.999%2017.451C9.85%2017.451%207.991%2016.111%207.205%2014.228L7.063%2014.47C6.924%2014.708%206.673%2014.84%206.416%2014.84C6.287%2014.84%206.157%2014.807%206.037%2014.737C5.68%2014.528%205.56%2014.068%205.77%2013.711L6.843%2011.881C6.944%2011.709%207.109%2011.584%207.301%2011.534C7.495%2011.484%207.699%2011.513%207.871%2011.614L9.688%2012.684C10.044%2012.894%2010.164%2013.354%209.954%2013.711C9.744%2014.067%209.286%2014.187%208.926%2013.977L8.66%2013.82C9.256%2015.073%2010.533%2015.951%2011.999%2015.951C13.214%2015.951%2014.354%2015.354%2015.044%2014.354C15.279%2014.014%2015.744%2013.927%2016.088%2014.164C16.429%2014.399%2016.514%2014.867%2016.279%2015.207ZM15.974%202.75H8.027C4.721%202.75%202.5%204.873%202.5%208.031V16.47C2.5%2019.628%204.721%2021.75%208.027%2021.75H15.974C19.28%2021.75%2021.5%2019.628%2021.5%2016.47V8.031C21.5%204.873%2019.28%202.75%2015.974%202.75Z%22%20fill=%22%23000000%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-chat-fill { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cg%20transform=%22translate(2,2)%22%20fill=%22%23000000%22%20fill-rule=%22nonzero%22%3E%3Cpath%20d=%22M10.02,0%20C15.7,0%2020,4.657%2020,9.985%20C20,16.164%2014.96,20%2010,20%20C8.36,20%206.54,19.559%205.08,18.698%20C4.57,18.388%204.14,18.157%203.59,18.338%20L1.57,18.938%20C1.06,19.099%200.6,18.698%200.75,18.157%20L1.42,15.914%20C1.53,15.603%201.51,15.273%201.35,15.013%20C0.49,13.43%200,11.698%200,10.015%20C0,4.747%204.21,0%2010.02,0%20Z%20M14.59,8.743%20C13.88,8.743%2013.31,9.314%2013.31,10.025%20C13.31,10.726%2013.88,11.307%2014.59,11.307%20C15.3,11.307%2015.87,10.726%2015.87,10.025%20C15.87,9.314%2015.3,8.743%2014.59,8.743%20Z%20M9.98,8.743%20C9.28,8.733%208.7,9.314%208.7,10.015%20C8.7,10.726%209.27,11.297%209.98,11.307%20C10.69,11.307%2011.26,10.726%2011.26,10.025%20C11.26,9.314%2010.69,8.743%209.98,8.743%20Z%20M5.37,8.743%20C4.66,8.743%204.09,9.314%204.09,10.025%20C4.09,10.726%204.67,11.307%205.37,11.307%20C6.08,11.297%206.65,10.726%206.65,10.025%20C6.65,9.314%206.08,8.743%205.37,8.743%20Z%22/%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cg%20transform=%22translate(2,2)%22%20fill=%22%23000000%22%20fill-rule=%22nonzero%22%3E%3Cpath%20d=%22M10.02,0%20C15.7,0%2020,4.657%2020,9.985%20C20,16.164%2014.96,20%2010,20%20C8.36,20%206.54,19.559%205.08,18.698%20C4.57,18.388%204.14,18.157%203.59,18.338%20L1.57,18.938%20C1.06,19.099%200.6,18.698%200.75,18.157%20L1.42,15.914%20C1.53,15.603%201.51,15.273%201.35,15.013%20C0.49,13.43%200,11.698%200,10.015%20C0,4.747%204.21,0%2010.02,0%20Z%20M14.59,8.743%20C13.88,8.743%2013.31,9.314%2013.31,10.025%20C13.31,10.726%2013.88,11.307%2014.59,11.307%20C15.3,11.307%2015.87,10.726%2015.87,10.025%20C15.87,9.314%2015.3,8.743%2014.59,8.743%20Z%20M9.98,8.743%20C9.28,8.733%208.7,9.314%208.7,10.015%20C8.7,10.726%209.27,11.297%209.98,11.307%20C10.69,11.307%2011.26,10.726%2011.26,10.025%20C11.26,9.314%2010.69,8.743%209.98,8.743%20Z%20M5.37,8.743%20C4.66,8.743%204.09,9.314%204.09,10.025%20C4.09,10.726%204.67,11.307%205.37,11.307%20C6.08,11.297%206.65,10.726%206.65,10.025%20C6.65,9.314%206.08,8.743%205.37,8.743%20Z%22/%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-danger-fill { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cg%20transform=%22translate(2,3)%22%20fill=%22%23000000%22%20fill-rule=%22nonzero%22%3E%3Cpath%20d=%22M8.628,0.353%20C9.988,-0.401%2011.717,0.094%2012.477,1.442%20L19.746,14.057%20C19.906,14.434%2019.976,14.74%2019.996,15.058%20C20.036,15.801%2019.776,16.524%2019.266,17.079%20C18.756,17.633%2018.066,17.96%2017.316,18%20L2.679,18%20C2.369,17.981%202.059,17.911%201.769,17.802%20C0.319,17.217%20-0.381,15.572%200.209,14.146%20L7.528,1.433%20C7.778,0.986%208.158,0.601%208.628,0.353%20Z%20M9.998,12.273%20C9.518,12.273%209.118,12.669%209.118,13.146%20C9.118,13.62%209.518,14.018%209.998,14.018%20C10.478,14.018%2010.868,13.62%2010.868,13.135%20C10.868,12.66%2010.478,12.273%209.998,12.273%20Z%20M9.998,6.09%20C9.518,6.09%209.118,6.476%209.118,6.952%20L9.118,9.756%20C9.118,10.231%209.518,10.629%209.998,10.629%20C10.478,10.629%2010.868,10.231%2010.868,9.756%20L10.868,6.952%20C10.868,6.476%2010.478,6.09%209.998,6.09%20Z%22/%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cg%20transform=%22translate(2,3)%22%20fill=%22%23000000%22%20fill-rule=%22nonzero%22%3E%3Cpath%20d=%22M8.628,0.353%20C9.988,-0.401%2011.717,0.094%2012.477,1.442%20L19.746,14.057%20C19.906,14.434%2019.976,14.74%2019.996,15.058%20C20.036,15.801%2019.776,16.524%2019.266,17.079%20C18.756,17.633%2018.066,17.96%2017.316,18%20L2.679,18%20C2.369,17.981%202.059,17.911%201.769,17.802%20C0.319,17.217%20-0.381,15.572%200.209,14.146%20L7.528,1.433%20C7.778,0.986%208.158,0.601%208.628,0.353%20Z%20M9.998,12.273%20C9.518,12.273%209.118,12.669%209.118,13.146%20C9.118,13.62%209.518,14.018%209.998,14.018%20C10.478,14.018%2010.868,13.62%2010.868,13.135%20C10.868,12.66%2010.478,12.273%209.998,12.273%20Z%20M9.998,6.09%20C9.518,6.09%209.118,6.476%209.118,6.952%20L9.118,9.756%20C9.118,10.231%209.518,10.629%209.998,10.629%20C10.478,10.629%2010.868,10.231%2010.868,9.756%20L10.868,6.952%20C10.868,6.476%2010.478,6.09%209.998,6.09%20Z%22/%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-info-fill { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cg%20transform=%22translate(2,2)%22%20fill=%22%23000000%22%20fill-rule=%22nonzero%22%3E%3Cpath%20d=%22M14.34,0%20C17.73,0%2020,2.38%2020,5.92%20L20,14.091%20C20,17.621%2017.73,20%2014.34,20%20L5.67,20%20C2.28,20%200,17.621%200,14.091%20L0,5.92%20C0,2.38%202.28,0%205.67,0%20Z%20M9.99,8.481%20C9.51,8.481%209.12,8.88%209.12,9.361%20L9.12,13.781%20C9.12,14.261%209.51,14.651%209.99,14.651%20C10.48,14.651%2010.87,14.261%2010.87,13.781%20L10.87,9.361%20C10.87,8.88%2010.48,8.481%209.99,8.481%20Z%20M10.01,5.311%20C9.52,5.311%209.13,5.701%209.13,6.191%20C9.13,6.67%209.52,7.061%209.99,7.061%20C10.49,7.061%2010.88,6.67%2010.88,6.191%20C10.88,5.701%2010.49,5.311%2010.01,5.311%20Z%22/%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cg%20transform=%22translate(2,2)%22%20fill=%22%23000000%22%20fill-rule=%22nonzero%22%3E%3Cpath%20d=%22M14.34,0%20C17.73,0%2020,2.38%2020,5.92%20L20,14.091%20C20,17.621%2017.73,20%2014.34,20%20L5.67,20%20C2.28,20%200,17.621%200,14.091%20L0,5.92%20C0,2.38%202.28,0%205.67,0%20Z%20M9.99,8.481%20C9.51,8.481%209.12,8.88%209.12,9.361%20L9.12,13.781%20C9.12,14.261%209.51,14.651%209.99,14.651%20C10.48,14.651%2010.87,14.261%2010.87,13.781%20L10.87,9.361%20C10.87,8.88%2010.48,8.481%209.99,8.481%20Z%20M10.01,5.311%20C9.52,5.311%209.13,5.701%209.13,6.191%20C9.13,6.67%209.52,7.061%209.99,7.061%20C10.49,7.061%2010.88,6.67%2010.88,6.191%20C10.88,5.701%2010.49,5.311%2010.01,5.311%20Z%22/%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-icon.i-tick-square-fill { mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cg%20transform=%22translate(2,2)%22%20fill=%22%23000000%22%20fill-rule=%22nonzero%22%3E%3Cpath%20d=%22M14.34,0%20C17.73,0%2020,2.38%2020,5.92%20L20,14.091%20C20,17.62%2017.73,20%2014.34,20%20L5.67,20%20C2.28,20%200,17.62%200,14.091%20L0,5.92%20C0,2.38%202.28,0%205.67,0%20Z%20M14.18,7%20C13.84,6.66%2013.28,6.66%2012.94,7%20L8.81,11.13%20L7.06,9.38%20C6.72,9.04%206.16,9.04%205.82,9.38%20C5.48,9.72%205.48,10.27%205.82,10.62%20L8.2,12.99%20C8.37,13.16%208.59,13.24%208.81,13.24%20C9.04,13.24%209.26,13.16%209.43,12.99%20L14.18,8.24%20C14.52,7.9%2014.52,7.35%2014.18,7%20Z%22/%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cg%20transform=%22translate(2,2)%22%20fill=%22%23000000%22%20fill-rule=%22nonzero%22%3E%3Cpath%20d=%22M14.34,0%20C17.73,0%2020,2.38%2020,5.92%20L20,14.091%20C20,17.62%2017.73,20%2014.34,20%20L5.67,20%20C2.28,20%200,17.62%200,14.091%20L0,5.92%20C0,2.38%202.28,0%205.67,0%20Z%20M14.18,7%20C13.84,6.66%2013.28,6.66%2012.94,7%20L8.81,11.13%20L7.06,9.38%20C6.72,9.04%206.16,9.04%205.82,9.38%20C5.48,9.72%205.48,10.27%205.82,10.62%20L8.2,12.99%20C8.37,13.16%208.59,13.24%208.81,13.24%20C9.04,13.24%209.26,13.16%209.43,12.99%20L14.18,8.24%20C14.52,7.9%2014.52,7.35%2014.18,7%20Z%22/%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
/* znohub-ui · кнопка
   Канон: .button.button-base платформи. Варіанти: (база=primary) / secondary /
   neutral / ghost / danger / success; danger і success мають тінтову пару .soft.
   Модифікатори: .icon (квадратна без тексту) · .wide (на всю ширину) ·
   .loading (спінер) · .disabled · .ghost.on-fill (привид на заливці). Предметне забарвлення — класом sub-a…sub-f;
   на жовтому (sub-d) текст завжди темний — контраст.
   Розміри: 48 (.l) · 40 (база) · 36 (.m) · 32 (.s); гліф іде за розміром
   кнопки — 22 / 20 / 18 / 16. На телефоні (≤640) .l дорівнює базовій.
   Відступ іконка↔текст дає падинг тексту (4px), не gap — так краї
   вирівняні і з іконкою, і без. */
.ui-btn { display: inline-flex; align-items: center; justify-content: center; gap: 0;
    height: 40px; padding: 0 16px; border: none; border-radius: var(--ui-radius-pill);
    background: var(--ui-fill-accent); cursor: pointer; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease);
    text-decoration: none; width: fit-content; position: relative;
    color: var(--ui-text-on-accent); }
/* Ряд кнопок: переноситься на вузькому, не розтягується в колонці-контенті */
.ui-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
    align-self: flex-start; max-width: 100%; }
/* .end — ряд притиснутий до правого краю колонки (перехід між заняттями
   під оцінкою). Дзеркало типового flex-start, а не окремий випадок. */
.ui-actions.end { align-self: flex-end; justify-content: flex-end; }
/* Партікли (текст, іконка, спінер) — завжди кольором тексту кнопки:
   колір задає сама кнопка, вміст успадковує через currentColor */
/* Підпис кнопки не переноситься: рядок, розбитий надвоє, читається як
   зламана кнопка, а не як довга назва. Кнопка радше поїде за край вузької
   колонки — це видно одразу і лікується коротшим підписом. */
.ui-btn > p { color: inherit; font-size: 14px; font-weight: 500;
    line-height: 20px; padding: 0 4px; white-space: nowrap; }
.ui-btn > .ui-icon::before { background: currentColor; }
/* Ховери по ролях: заливки темнішають на щабель (модель лендингу),
   тінти густішають, привид проявляється. Предметні — brightness (спільна
   прес-модель, окремих ховер-примітивів на 6 кольорів не плодимо). */
@media (hover: hover) {
    .ui-btn:hover { filter: brightness(0.92); }
    .ui-btn:not(.secondary):not(.neutral):not(.ghost):not(.danger):not(.success):not(.sub-a):not(.sub-b):not(.sub-c):not(.sub-d):not(.sub-e):not(.sub-f):not(.on-light):not(.outline):hover {
        filter: none; background: var(--ui-fill-accent-hover); }
    .ui-btn.secondary:hover { filter: none; background: var(--ui-scope-tint-hover, var(--ui-tint-accent-hover)); }
    .ui-btn.neutral:hover { filter: none; background: var(--ui-surface-sunken-hover); }
    .ui-btn.danger:not(.soft):hover { filter: none; background: var(--ui-fill-danger-hover); }
    .ui-btn.success:not(.soft):hover { filter: none; background: var(--ui-fill-success-strong-hover); }
    .ui-btn.danger.soft:hover { filter: none; background: var(--ui-tint-danger-hover); }
    .ui-btn.success.soft:hover { filter: none; background: var(--ui-tint-success-hover); }
}
.ui-btn:active { transform: translateY(1px); filter: brightness(0.86); }
.ui-btn:not(.secondary):not(.neutral):not(.ghost):not(.danger):not(.success):not(.sub-a):not(.sub-b):not(.sub-c):not(.sub-d):not(.sub-e):not(.sub-f):not(.on-light):not(.outline):active {
    filter: none; background: var(--ui-fill-accent-active); }
.ui-btn.secondary:active { filter: none; background: var(--ui-scope-tint-hover, var(--ui-tint-accent-hover)); }
.ui-btn.neutral:active { filter: none; background: var(--ui-surface-sunken-hover); }
.ui-btn.danger:not(.soft):active { filter: none; background: var(--ui-fill-danger-hover); }
.ui-btn.success:not(.soft):active { filter: none; background: var(--ui-fill-success-strong-hover); }
.ui-btn.danger.soft:active { filter: none; background: var(--ui-tint-danger-hover); }
.ui-btn.success.soft:active { filter: none; background: var(--ui-tint-success-hover); }
.ui-btn:disabled, .ui-btn.disabled { opacity: 0.5; pointer-events: none; }

/* Велика — герой-дія екрана («Обрати тариф», «Почати тест»), одна на
   сторінку. Числа зі шкали 48-кнопок платформи (.button-ar-*: висота 48,
   падинг 20, текст 16); інтерліньяж 24 — Body LG кіта. */
.ui-btn.l { height: 48px; padding: 0 20px; }
.ui-btn.l > p { font-size: 16px; line-height: 24px; }
.ui-btn.m { height: 36px; padding: 0 14px; }
.ui-btn.s { height: 32px; padding: 0 12px; }
.ui-btn.s > p { font-size: 13px; line-height: 18px; }

/* Гліф іде за розміром кнопки: 22 / 20 / 18 / 16. Задає їх кнопка, а не
   виклик: доти розмір ставили руками (.ui-icon чи .ui-icon.s), і однакова
   кнопка на сусідніх сторінках мала різну іконку. icons.css іде в збірці
   ПЕРЕД button.css, тож ці правила перекривають базові 20px без !important. */
.ui-btn > .ui-icon { width: 20px; height: 20px; }
.ui-btn.l > .ui-icon { width: 22px; height: 22px; }
.ui-btn.m > .ui-icon { width: 18px; height: 18px; }
.ui-btn.s > .ui-icon { width: 16px; height: 16px; }

/* Велика — десктопний щабель. На телефоні героїчних розмірів немає: рядок
   вузький, і 48 просто з'їдають висоту, а підпис 16 тисне сусіда. Тому на
   ≤640 .l дорівнює базовій кнопці. Числа тут навмисно ті самі, що в базі
   вище: скидати їх через initial/unset не можна — база задана не на .ui-btn.l,
   і скидання лишило б висоту за вмістом. */
@media screen and (max-width: 640px) {
    .ui-btn.l { height: 40px; padding: 0 16px; }
    .ui-btn.l > p { font-size: 14px; line-height: 20px; }
    .ui-btn.l > .ui-icon { width: 20px; height: 20px; }
}
/* Темна: акцент світлий, окремих щаблів ховера немає — беремо ту саму
   модель, що й предметні заливки (brightness), інакше кнопка на ховері
   стрибала б через півшкали до indigo-500. */
html[data-theme="dark"] .ui-btn:not(.secondary):not(.neutral):not(.ghost):not(.danger):not(.success):not(.sub-a):not(.sub-b):not(.sub-c):not(.sub-d):not(.sub-e):not(.sub-f):not(.on-light):not(.outline):hover,
html[data-theme="dark"] .ui-btn:not(.secondary):not(.neutral):not(.ghost):not(.danger):not(.success):not(.sub-a):not(.sub-b):not(.sub-c):not(.sub-d):not(.sub-e):not(.sub-f):not(.on-light):not(.outline):active {
    filter: brightness(0.92); }
.ui-btn.wide { width: 100%; }

/* Тінтована кнопка бере колір предметного скоупу, якщо він є (сторінка
   курсу), інакше акцент. Іконка йде за color через currentColor. */
.ui-btn.secondary { background: var(--ui-scope-tint, var(--ui-tint-accent));
    color: var(--ui-scope-text, var(--ui-text-accent)); }


.ui-btn.neutral { background: var(--ui-surface-sunken); color: var(--ui-text-primary); }
/* .on-light — біла кнопка на банері-ілюстрації. Єдиний варіант, який НЕ
   реагує на тему: тло під ним — картинка, і темна кнопка на світлому небі
   виглядала б чужою. Ховер бере спільний brightness, як предметні. */
.ui-btn.on-light { background: var(--ui-fill-on-light); color: var(--ui-text-on-light); }

/* .outline — прозора з обведенням. Потрібна там, де під кнопкою не полотно
   сторінки, а заливка чи картинка: .secondary з її тінтом на такому тлі
   каламутніє, а .on-light своєю білою плямою забирає першість у головної
   дії поруч. Обведення лишає дію видимою, не додаючи ще однієї плями.
   Контур — inset-тінню, а не border: у кнопки фіксована висота, і справжня
   межа або зʼїла б два пікселі всередині, або додала б їх зовні.
   .on-fill — та сама конвенція, що в .ghost: під кнопкою заливка, тож
   темі вона не підкоряється, а бере білу пару. */
.ui-btn.outline { background: none; color: var(--ui-text-primary);
    box-shadow: inset 0 0 0 1px var(--ui-border-card); }
.ui-btn.outline.on-fill { color: var(--ui-text-on-fill);
    box-shadow: inset 0 0 0 1px var(--ui-border-on-fill); }
@media (hover: hover) {
    /* Ховер підсвічує тлом, а не brightness: у прозорої кнопки яскравість
       нема чого міняти — під фільтр потрапив би сам контур. */
    .ui-btn.outline:hover { background: var(--ui-surface-sunken-hover); filter: none; }
    /* На заливці ховер — білий тінт плюс яскравіший контур: brightness тут
       нічого не дав би (кнопка прозора), а сам лише тінт на насиченому тлі
       ледь читається. */
    .ui-btn.outline.on-fill:hover { background: var(--ui-surface-on-fill-hover);
        box-shadow: inset 0 0 0 1px var(--ui-border-on-fill-hover); filter: none; }
}
.ui-btn.outline:active { filter: none; }
.ui-btn.outline.on-fill:active { background: var(--ui-surface-on-fill-active); }

.ui-btn.ghost { background: none; padding: 0 4px; opacity: 0.8; color: var(--ui-text-primary); }
/* Привид на насиченому банері (шапка курсу): підпис і гліф білі — текстова
   пара заливки. Без цього ghost бере --ui-text-primary і зникає на синьому.
   Дзеркало .on-light для протилежної поверхні; як і той, темі не
   підкоряється — під ним завжди заливка, а не тло сторінки. */
.ui-btn.ghost.on-fill { color: var(--ui-text-on-fill); }
.ui-btn.ghost > p { font-weight: 400; }
@media (hover: hover) {
    .ui-btn.ghost:hover { opacity: 1; filter: none; background: none; }
}
.ui-btn.ghost:active { opacity: 1; filter: none; background: none; }

/* Насичено-червона заливка (#F25A45) тримає білий текст лише на 3.3 — беремо темний */
.ui-btn.danger { background: var(--ui-fill-danger); color: var(--ui-text-on-fill); }
.ui-btn.success { background: var(--ui-fill-success-strong); color: var(--ui-text-on-fill); }
/* Другорядні статусні (.soft — як у .ui-subject): тінт + текстова пара,
   ховер/прес — тінт густішає (модель secondary) */
.ui-btn.danger.soft { background: var(--ui-tint-danger); color: var(--ui-text-danger); }
.ui-btn.success.soft { background: var(--ui-tint-success); color: var(--ui-text-success); }

/* Предметні */
.ui-btn.sub-a { background: var(--ui-subject-a-fill); color: var(--ui-text-on-fill); }
.ui-btn.sub-b { background: var(--ui-subject-b-fill); color: var(--ui-text-on-fill); }
.ui-btn.sub-c { background: var(--ui-subject-c-fill); color: var(--ui-text-on-fill); }
.ui-btn.sub-e { background: var(--ui-subject-e-fill); color: var(--ui-text-on-fill); }
.ui-btn.sub-f { background: var(--ui-subject-f-fill); color: var(--ui-text-on-fill); }
.ui-btn.sub-d { background: var(--ui-subject-d-fill); color: var(--ui-subject-d-on-fill); }

/* Видимий фокус з клавіатури — спільне правило для інтерактивних ui-* */
.ui-btn:focus-visible, .ui-chip:focus-visible, .ui-quiz-variant:focus-visible,
.ui-blank-cell:focus-visible, .ui-quiz-palette > .item:focus-visible,
a.ui-row:focus-visible, a.ui-subject-card:focus-visible, .ui-select-head:focus-visible,
.ui-tabs > .item:focus-visible, .ui-nav-item:focus-visible, .ui-tabbar-item:focus-visible,
.ui-sidebar-profile:focus-visible, .ui-option:focus-visible,
.ui-toast-action:focus-visible {
    outline: 2px solid var(--ui-focus-ring); outline-offset: 2px;
}

/* Стан завантаження: спінер по центру, вміст ховається, кліки вимкнені */
.ui-btn.loading { pointer-events: none; }
.ui-btn.loading > p, .ui-btn.loading > .ui-icon { opacity: 0; }
.ui-btn.loading::after { content: ""; position: absolute; left: 50%; top: 50%;
    width: 16px; height: 16px; margin: -8px 0 0 -8px; border-radius: 50%;
    /* бліде повне кільце + яскравий сегмент: оптичний центр не пливе
       (повністю прозора чверть зміщувала видиму дугу вбік) */
    border: 2px solid color-mix(in srgb, currentColor 25%, transparent);
    border-top-color: currentColor;
    animation: ui-spin 0.7s linear infinite; }
@keyframes ui-spin { to { transform: rotate(360deg); } }

/* Лише іконка: квадрат за розмірною шкалою */
.ui-btn.icon { width: 40px; padding: 0; }
.ui-btn.icon.l { width: 48px; }
.ui-btn.icon.m { width: 36px; }
.ui-btn.icon.s { width: 32px; }
/* znohub-ui · поле вводу. Канон: .wr-field / .wr-dialog-field */
.ui-field { display: flex; flex-direction: column; gap: 4px; width: 100%; }
.ui-field > p { color: var(--ui-text-primary); font-size: 14px; font-weight: 400; line-height: 20px; }
.ui-field-box { display: flex; align-items: center; gap: 4px; width: 100%; cursor: text;
    padding: 0 18px; height: 48px; border-radius: var(--ui-radius-m);
    border: 1px solid var(--ui-border-field); background: var(--ui-surface); transition: border-color 0.2s; }
.ui-field-box:focus-within { border-color: var(--ui-border-accent); }
.ui-field-box > input { width: 100%; background: none; border: none; outline: none;
    color: var(--ui-text-primary); font-size: 16px; font-weight: 400; }
.ui-field-box > input::placeholder { color: var(--ui-text-muted); }
.ui-field > textarea { width: 100%; border-radius: var(--ui-radius-m); border: 1px solid var(--ui-border-field);
    background: var(--ui-surface); padding: 12px 20px; resize: none; height: 80px; outline: none;
    color: var(--ui-text-primary); font-size: 16px; font-weight: 400; line-height: 24px;
    transition: border-color 0.2s; }
.ui-field > textarea:focus { border-color: var(--ui-border-accent); }
.ui-field > textarea::placeholder { color: var(--ui-text-muted); }
.ui-field.error .ui-field-box, .ui-field.error > textarea { border-color: var(--ui-fill-danger); }
/* Вимкнене поле. Стан задає сам <input>/<select>, а не клас на обгортці —
   так анкета показує «Ще не визначився» і школу до вибору міста. Це перенос
   легасі-правила .wr-field:has(> input:disabled) на канон: там був
   --gray-bg-2, який compat уже мапить на --ui-surface-sunken.
   .ui-field.disabled (клас на обгортці) лишається окремим, грубішим станом. */
.ui-field-box:has(> input:disabled),
.ui-field-box:has(> select:disabled) { background: var(--ui-surface-sunken); cursor: default; }
.ui-field-box:has(> input:disabled) > input,
.ui-field-box:has(> select:disabled) > select { cursor: default; }

.ui-field > small { color: var(--ui-text-danger); font-size: 12px; line-height: 16px; }

/* ---- Нативний <select> у полі ----
   Кит має власний .ui-select (div + драйвер ui.js), але анкета вимагає
   СПРАВЖНЬОГО елемента форми з name: контролер оновлює поле лише якщо воно
   прийшло в запиті (порожнє значення = «очистити»). Тож це варіант поля,
   а не окремий компонент — розміри, межі й фокус спільні з .ui-field-box.
   Стрілка — та сама маска, що в .ui-select-head, і фарбується токеном:
   легасі .wr-field.select тримала колір запеченим у data-URI (#868F98)
   і тому не темувалась. */
.ui-field-box.select { position: relative; cursor: pointer; padding-right: 40px; }
.ui-field-box.select > select { width: 100%; height: 100%; appearance: none;
    background: none; border: none; outline: none; cursor: pointer;
    color: var(--ui-text-primary); font-size: 16px; font-weight: 400; }
/* Комбобокс: у полі не select, а input для пошуку — курсор той самий */
.ui-field-box.select > input { cursor: pointer; }
.ui-field-box.select::after { content: ""; position: absolute; right: 12px; top: 50%;
    width: 20px; height: 20px; margin-top: -10px; pointer-events: none;
    background: var(--ui-text-secondary);
    mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Down-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Down-2%22%20transform=%22translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Down-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Down-2%22%20transform=%22translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }

/* Іконка в полі (зліва від інпута) */
.ui-field-box > .ui-icon { flex: none; }
.ui-field-box > .ui-icon::before { background: var(--ui-text-muted); transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
.ui-field-box:focus-within > .ui-icon::before { background: var(--ui-text-accent); }
/* Кнопка очистки — зʼявляється, коли в полі є текст */
.ui-field-clear { flex: none; display: none; align-items: center; justify-content: center;
    width: 24px; height: 24px; margin-right: -6px; border: none; padding: 0;
    background: none; cursor: pointer; border-radius: 50%; }
.ui-field-clear::before { content: ""; width: 14px; height: 14px; background: var(--ui-text-muted);
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease);
    mask: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.6663 3.33301L3.33301 12.6663M3.33301 3.33301L12.6663 12.6663' stroke='black' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.6663 3.33301L3.33301 12.6663M3.33301 3.33301L12.6663 12.6663' stroke='black' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain; }
/* [placeholder] обовʼязковий: без нього :placeholder-shown не матчить ніколи
   і хрестик висів би постійно (достатньо placeholder=" ") */
.ui-field-box > input[placeholder]:not(:placeholder-shown) ~ .ui-field-clear { display: flex; }
@media (hover: hover) { .ui-field-clear:hover::before { background: var(--ui-text-primary); } }
.ui-field-clear:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
/* Лічильник символів */
.ui-field-count { flex: none; color: var(--ui-text-muted); font-size: 12px; line-height: 16px; }
/* Підказка (не помилка) */
.ui-field > small.hint { color: var(--ui-text-secondary); }
/* Посилання в підказці (напр. «Забули пароль?» під полем) */
.ui-field > small.hint a { color: var(--ui-text-accent); text-decoration: none; }
@media (hover: hover) { .ui-field > small.hint a:hover { text-decoration: underline; } }
/* Текст помилки під полем: пара до .ui-field.error, яка фарбує межу.
   Канон — .error-text сторінок входу. */
.ui-field > small.error { color: var(--ui-text-danger); }
/* Показати/сховати пароль. Кнопка стоїть У полі, тож бере його висоту й
   гасне разом із ним; іконка перемикається класом на самій кнопці. */
.ui-field-reveal { flex: none; display: flex; align-items: center; justify-content: center;
    width: 24px; height: 24px; margin-right: -4px; border: none; padding: 0;
    background: none; cursor: pointer; border-radius: 50%; }
.ui-field-reveal > .ui-icon::before { background: var(--ui-text-muted); transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
@media (hover: hover) { .ui-field-reveal:hover > .ui-icon::before { background: var(--ui-text-secondary); } }
.ui-field-reveal:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
/* Вимкнене поле */
.ui-field.disabled { opacity: 0.5; pointer-events: none; }

/* Вузьке поле: у формах опитувань текстовий інпут не має розтягуватись на всю
   ширину модалки — шість сторінок тримали це інлайновим max-width. */
.ui-field.narrow { max-width: 480px; }
/* znohub-ui · селект. Канон: .dropdown.secondary платформи (dropdown.js).
   Розмітка: .ui-select > .ui-select-head + .ui-select-body > .item */
.ui-select { position: relative; width: fit-content; }
/* Межа ледь помітна: роль --ui-border-subtle, а не --ui-border-field.
   Поле вводу просить сильний контур, бо в нього щось вводять; селект —
   це кнопка вибору на тінтованому тлі, їй досить натяку на край. Різниця
   найпомітніша в темній темі: у field це біле на 40%, у subtle — на 10%. */
.ui-select-head { display: flex; align-items: center; justify-content: center; gap: 8px;
    cursor: pointer; height: 40px; padding: 0 14px; border-radius: var(--ui-radius-m);
    border: 1px solid var(--ui-border-subtle);
    background: var(--ui-surface-sunken); transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
@media (hover: hover) { .ui-select-head:hover { background: var(--ui-surface-sunken-hover); } }
/* nowrap: підпис — це одне значення, а не текст; перенос розривав би
   пігулку на два рядки й ламав висоту 40. Центрування вмісту потрібне не
   лише симетрії: під час плавної зміни ширини вміст лишається посередині,
   а не притискається до лівого краю, поки праворуч росте порожнеча. */
.ui-select-head > p { color: var(--ui-text-primary); font-size: 14px; font-weight: 400;
    line-height: 20px; white-space: nowrap; }
/* Шеврон — БАЙТ-У-БАЙТ маска китової .i-chevron-down, а не власний
   малюнок: свій зі штрихом 2.16 виглядав жирнішим за шеврон у кнопці
   (там 1.5 у боксі 24 → 1.25px на екрані). Один компонент — один шеврон. */
.ui-select-head::after { content: ""; width: 20px; height: 20px; transition: transform 0.2s;
    background: var(--ui-text-secondary);
    mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Down-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Down-2%22%20transform=%22translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Down-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Down-2%22%20transform=%22translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }
.ui-select.active > .ui-select-head::after { transform: rotate(180deg); }
/* Тіло по центру голови, а не по лівому краю: коли опції довші за підпис,
   ліве вирівнювання зсувало список убік від того, що його відкрило.
   min-width: 100% рахується від .ui-select (він relative), тож тіло ніколи
   не вужче за саму голову. translateX(-50%) мусить бути в ОБОХ станах,
   інакше поява перекидала б список у бік на час анімації. */
.ui-select-body { position: absolute; top: calc(100% + 6px); left: 50%; min-width: 100%; z-index: 20;
    max-height: 320px; overflow-y: auto; max-width: min(400px, calc(100vw - 32px));
    display: flex; flex-direction: column; gap: 2px; padding: 6px; border-radius: var(--ui-radius-m);
    background: var(--ui-surface); border: 1px solid var(--ui-border-subtle); box-shadow: var(--ui-shadow-card);
    opacity: 0; pointer-events: none; transform: translateX(-50%) translateY(-4px); transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
.ui-select.active > .ui-select-body { opacity: 1; pointer-events: all; transform: translateX(-50%) translateY(0); }
.ui-select-body > .item { display: flex; align-items: center; gap: 8px; padding: 8px 10px;
    border-radius: var(--ui-radius-s); cursor: pointer; color: var(--ui-text-primary);
    font-size: 14px; line-height: 20px; white-space: nowrap; }
.ui-select-body > .item:hover { background: var(--ui-surface-hover); }
.ui-select-body > .item.selected { background: var(--ui-tint-accent); color: var(--ui-text-accent); }
.ui-select-body > .item.disabled { opacity: 0.45; cursor: default; pointer-events: none; }
/* Вибраний предметний пункт — у кольорі СВОГО предмета, а не акцентний:
   у списку предметів акцентний синій сперечався б із самим предметом
   (а на математиці ще й збігався б із ним). Гліф іде за currentColor,
   тож окремого правила на іконку не треба. */
.ui-select-body > .item.sub-a.selected { background: var(--ui-subject-a-tint);
    color: var(--ui-subject-a-text); }
.ui-select-body > .item.sub-b.selected { background: var(--ui-subject-b-tint);
    color: var(--ui-subject-b-text); }
.ui-select-body > .item.sub-c.selected { background: var(--ui-subject-c-tint);
    color: var(--ui-subject-c-text); }
.ui-select-body > .item.sub-d.selected { background: var(--ui-subject-d-tint);
    color: var(--ui-subject-d-text); }
.ui-select-body > .item.sub-e.selected { background: var(--ui-subject-e-tint);
    color: var(--ui-subject-e-text); }
.ui-select-body > .item.sub-f.selected { background: var(--ui-subject-f-tint);
    color: var(--ui-subject-f-text); }

/* На вузьких екранах довгі опції переносяться, а не тікають за край */
@media (max-width: 480px) { .ui-select-body > .item { white-space: normal; } }
.ui-select.disabled { opacity: 0.5; pointer-events: none; }
/* Предметний гліф у селекті. Готового класу іконки предмета в киті немає:
   .ui-subject — це кружок від 40px, у голову 40px він не влазить. Тому
   гліф береться маскою з --ui-glyph-sub-*, як це вже робить legacy-bridge.
   Колір дописувати не треба: правила вище фарбують .ui-select-head > .ui-icon
   у предметний текст, тож гліф сам стає потрібного кольору в обох темах.
   У ГОЛОВІ гліф диктує клас КОРЕНЯ (там живе вибраний предмет), у ПУНКТІ —
   клас самого пункту, інакше всі опції показували б предмет вибраного.
   КОЛІР у списку службовий, як у звичайних іконок: шість різних кольорів
   у стовпчик змагалися б із підписами. Предметний колір лишається голові,
   де він означає вибір, і вибраному пункту через currentColor. */
.ui-icon.i-sub { width: 22px; height: 22px;
    /* Токени --ui-glyph-sub-* містять ЛИШЕ картинку, без no-repeat/center/
       contain — ці параметри дописує споживач (так само робить .ui-subject).
       Без них маска малюється у власному розмірі 50×50 і обрізається до
       верхнього лівого кута — гліф виглядає покаліченим. */
    mask-repeat: no-repeat; mask-position: center; mask-size: contain;
    -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: contain;
    /* Без sub-* маски немає, а .ui-icon намалював би суцільний квадрат —
       тому порожня маска за замовчуванням, а не none. */
    mask-image: linear-gradient(transparent, transparent);
    -webkit-mask-image: linear-gradient(transparent, transparent); }
.ui-select.s > .ui-select-head > .ui-icon.i-sub { width: 20px; height: 20px; }
/* Без предмета гліфа немає — ховаємо слот, інакше в голові («Всі предмети»,
   «Не обрано») зяяла б порожня діра завширшки з іконку. */
.ui-select:not(.sub-a):not(.sub-b):not(.sub-c):not(.sub-d):not(.sub-e):not(.sub-f)
    > .ui-select-head > .ui-icon.i-sub { display: none; }
.ui-select-body > .item:not(.sub-a):not(.sub-b):not(.sub-c):not(.sub-d):not(.sub-e):not(.sub-f)
    > .ui-icon.i-sub { display: none; }
.ui-select.sub-a > .ui-select-head > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-a);
    -webkit-mask-image: var(--ui-glyph-sub-a); }
.ui-select.sub-b > .ui-select-head > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-b);
    -webkit-mask-image: var(--ui-glyph-sub-b); }
.ui-select.sub-c > .ui-select-head > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-c);
    -webkit-mask-image: var(--ui-glyph-sub-c); }
.ui-select.sub-d > .ui-select-head > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-d);
    -webkit-mask-image: var(--ui-glyph-sub-d); }
.ui-select.sub-e > .ui-select-head > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-e);
    -webkit-mask-image: var(--ui-glyph-sub-e); }
.ui-select.sub-f > .ui-select-head > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-f);
    -webkit-mask-image: var(--ui-glyph-sub-f); }
.ui-select-body > .item.sub-a > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-a);
    -webkit-mask-image: var(--ui-glyph-sub-a); }
.ui-select-body > .item.sub-b > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-b);
    -webkit-mask-image: var(--ui-glyph-sub-b); }
.ui-select-body > .item.sub-c > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-c);
    -webkit-mask-image: var(--ui-glyph-sub-c); }
.ui-select-body > .item.sub-d > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-d);
    -webkit-mask-image: var(--ui-glyph-sub-d); }
.ui-select-body > .item.sub-e > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-e);
    -webkit-mask-image: var(--ui-glyph-sub-e); }
.ui-select-body > .item.sub-f > .ui-icon.i-sub { mask-image: var(--ui-glyph-sub-f);
    -webkit-mask-image: var(--ui-glyph-sub-f); }

/* Іконка зліва від тексту — і в голові, і в опціях. Розмір і колір ті самі,
   що в шеврона: обидва службові, і різний вигляд читався б як помилка. */
.ui-select-head > .ui-icon { flex: none; width: 20px; height: 20px; }
.ui-select-head > .ui-icon::before { background: var(--ui-text-secondary); }
.ui-select-body > .item > .ui-icon { flex: none; width: 20px; height: 20px; }
.ui-select-body > .item > .ui-icon::before { background: var(--ui-text-secondary); }
.ui-select-body > .item.selected > .ui-icon::before { background: currentColor; }

/* Предметне забарвлення — тінт і текстова пара, як у чіпа. Не суцільна
   заливка (як у кнопки): селект — це фільтр, а не дія, і суцільний колір
   читався б як «натиснуто». Шеврон та іконка йдуть за текстом. */
.ui-select.sub-a > .ui-select-head { background: var(--ui-subject-a-tint); border-color: transparent; }
.ui-select.sub-b > .ui-select-head { background: var(--ui-subject-b-tint); border-color: transparent; }
.ui-select.sub-c > .ui-select-head { background: var(--ui-subject-c-tint); border-color: transparent; }
.ui-select.sub-d > .ui-select-head { background: var(--ui-subject-d-tint); border-color: transparent; }
.ui-select.sub-e > .ui-select-head { background: var(--ui-subject-e-tint); border-color: transparent; }
.ui-select.sub-f > .ui-select-head { background: var(--ui-subject-f-tint); border-color: transparent; }
.ui-select.sub-a > .ui-select-head > p { color: var(--ui-subject-a-text); }
.ui-select.sub-b > .ui-select-head > p { color: var(--ui-subject-b-text); }
.ui-select.sub-c > .ui-select-head > p { color: var(--ui-subject-c-text); }
.ui-select.sub-d > .ui-select-head > p { color: var(--ui-subject-d-text); }
.ui-select.sub-e > .ui-select-head > p { color: var(--ui-subject-e-text); }
.ui-select.sub-f > .ui-select-head > p { color: var(--ui-subject-f-text); }
.ui-select.sub-a > .ui-select-head::after, .ui-select.sub-a > .ui-select-head > .ui-icon::before { background: var(--ui-subject-a-text); }
.ui-select.sub-b > .ui-select-head::after, .ui-select.sub-b > .ui-select-head > .ui-icon::before { background: var(--ui-subject-b-text); }
.ui-select.sub-c > .ui-select-head::after, .ui-select.sub-c > .ui-select-head > .ui-icon::before { background: var(--ui-subject-c-text); }
.ui-select.sub-d > .ui-select-head::after, .ui-select.sub-d > .ui-select-head > .ui-icon::before { background: var(--ui-subject-d-text); }
.ui-select.sub-e > .ui-select-head::after, .ui-select.sub-e > .ui-select-head > .ui-icon::before { background: var(--ui-subject-e-text); }
.ui-select.sub-f > .ui-select-head::after, .ui-select.sub-f > .ui-select-head > .ui-icon::before { background: var(--ui-subject-f-text); }
@media (hover: hover) {
    .ui-select.sub-a > .ui-select-head:hover { background: var(--ui-subject-a-tint-strong); }
    .ui-select.sub-b > .ui-select-head:hover { background: var(--ui-subject-b-tint-strong); }
    .ui-select.sub-c > .ui-select-head:hover { background: var(--ui-subject-c-tint-strong); }
    .ui-select.sub-d > .ui-select-head:hover { background: var(--ui-subject-d-tint-strong); }
    .ui-select.sub-e > .ui-select-head:hover { background: var(--ui-subject-e-tint-strong); }
    .ui-select.sub-f > .ui-select-head:hover { background: var(--ui-subject-f-tint-strong); }
}

/* Малий розмір: 36 — той самий щабель, що й у кнопки .m; кегль падає на
   один крок шкали (14 → 13), іконки з 20 на 18, щоб пігулка не «заплила». */
.ui-select.s > .ui-select-head { height: 36px; padding: 0 10px 0 14px; gap: 6px; }
.ui-select.s > .ui-select-head > p { font-size: 13px; line-height: 18px; }
.ui-select.s > .ui-select-head::after,
.ui-select.s > .ui-select-head > .ui-icon { width: 18px; height: 18px; }

/* ---- Список під полем вводу (комбобокс, пошук із підказками) ----
   Не те саме, що .ui-select-body: той центрується під кнопкою-головою і
   керується класом .active, а цей лягає на всю ширину поля і вмикається
   атрибутом hidden — так його ведуть скрипти анкети. Обгортка мусить бути
   position: relative (це вже дає .ui-field). */
.ui-listbox { position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 30;
    max-height: 280px; overflow-y: auto;
    display: flex; flex-direction: column; gap: 2px; padding: 6px;
    border-radius: var(--ui-radius-m); background: var(--ui-surface);
    border: 1px solid var(--ui-border-subtle); box-shadow: var(--ui-shadow-card); }
.ui-listbox > .item { display: flex; align-items: center; justify-content: space-between; gap: 12px;
    padding: 9px 12px; border-radius: var(--ui-radius-s); cursor: pointer; }
.ui-listbox > .item > p { color: var(--ui-text-primary); font-size: 14px; font-weight: 400; line-height: 20px; }
/* Друга колонка — уточнення (область міста, місто школи): тихе й без переносу */
.ui-listbox > .item > span { color: var(--ui-text-secondary); font-size: 12px; line-height: 16px; white-space: nowrap; }
@media (hover: hover) { .ui-listbox > .item:hover { background: var(--ui-surface-hover); } }
/* .highlight — вибір з клавіатури (стрілки), візуально дорівнює ховеру */
.ui-listbox > .item.highlight { background: var(--ui-surface-hover); }
.ui-listbox > .item.active > p { color: var(--ui-text-accent); font-weight: 500; }
/* .note — «нічого не знайдено» і підказки: не пункт, клікати нема що */
.ui-listbox > .note { padding: 8px 12px; color: var(--ui-text-secondary);
    font-size: 13px; line-height: 18px; cursor: default; }
/* znohub-ui · чіпи, теги */
.ui-chip { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 14px;
    border-radius: var(--ui-radius-pill); background: var(--ui-surface-sunken); border: none; cursor: pointer;
    color: var(--ui-text-primary); font-size: 13px; font-weight: 500; line-height: 18px; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
@media (hover: hover) { .ui-chip:hover { background: var(--ui-surface-sunken-hover); } }
.ui-chip:disabled, .ui-chip.disabled { opacity: 0.5; pointer-events: none; }
.ui-chip.sub-a { color: var(--ui-subject-a-text); background: var(--ui-subject-a-tint); }
.ui-chip.sub-b { color: var(--ui-subject-b-text); background: var(--ui-subject-b-tint); }
.ui-chip.sub-c { color: var(--ui-subject-c-text); background: var(--ui-subject-c-tint); }
.ui-chip.sub-d { color: var(--ui-subject-d-text); background: var(--ui-subject-d-tint); }
.ui-chip.sub-e { color: var(--ui-subject-e-text); background: var(--ui-subject-e-tint); }
.ui-chip.sub-f { color: var(--ui-subject-f-text); background: var(--ui-subject-f-tint); }
/* .today — сьогоднішня дата у стрічці дат: не вибір, а орієнтир, тому
   обідок замість заливки. Оголошено ДО .active: обраний чіп лишається
   обраним, навіть якщо він і є сьогоднішнім. */
.ui-chip.today { box-shadow: inset 0 0 0 1.5px var(--ui-border-accent); }
/* .active оголошено ПІСЛЯ sub-*: обраний предметний чіп читається як обраний */
.ui-chip.active { background: var(--ui-text-primary); color: var(--ui-surface); }
.ui-chip.today.active { box-shadow: none; }

.ui-tag { display: inline-flex; align-items: center; gap: 4px; height: 24px; padding: 0 10px;
    border-radius: var(--ui-radius-pill); background: var(--ui-surface-sunken);
    color: var(--ui-text-primary); font-size: 12px; font-weight: 500; line-height: 16px; letter-spacing: 0; }
.ui-tag.green  { background: var(--ui-tint-success); color: var(--ui-text-success); }
.ui-tag.red    { background: var(--ui-tint-danger); color: var(--ui-text-danger); }
/* Акцентний тег теж іде за скоупом: контакт куратора в предметному
   вікні має бути кольором предмета, а не синім упоперек усього. */
.ui-tag.accent { background: var(--ui-scope-tint, var(--ui-tint-accent));
    color: var(--ui-scope-text, var(--ui-text-accent)); }
/* Тег на ТІНТОВАНОМУ рядку: базовий сірий на кольоровому тлі мутніє, а
   кольоровий зливається з ним. Роль поверхні відділяє тег і в темній темі
   (там це не біле, а колір картки) — тому surface, а не «white». */
.ui-tag.surface { background: var(--ui-surface); }
/* Суцільна заливка з білим текстом — коли тег звучить як статус, а не як
   тиха позначка. Зелена бере --ui-fill-success-strong, а не штатну заливку
   успіху: на green-500 білий текст дає 2.37 (див. коментар до ролі — там же
   компроміс по контрасту обраного green-600). */
.ui-tag.solid { background: var(--ui-fill-accent); color: var(--ui-text-on-accent); }
.ui-tag.solid.green { background: var(--ui-fill-success-strong); color: var(--ui-text-on-fill); }
.ui-tag.solid.red { background: var(--ui-fill-danger); color: var(--ui-text-on-fill); }
/* Тег-кнопка: позначка, що не констатує стан, а пропонує дію — «понови
   дедлайн за 25». На ховері тінт стає заливкою: інакше вона нічим не
   відрізняється від пасивних тегів поруч у тому самому рядку. Через ролі,
   а не brightness, — щоб працювало і в темній, де тінт сам темний. */
button.ui-tag { border: none; cursor: pointer; font-family: inherit; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
button.ui-tag:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
@media (hover: hover) {
    button.ui-tag.accent:hover { background: var(--ui-fill-accent); color: var(--ui-text-on-accent); }
}

.ui-tag > .ui-icon { width: 14px; height: 14px; }
/* Іконки тега — кольором його тексту (як партікли кнопки) */
.ui-tag > .ui-icon::before { background: currentColor; }

/* Лічильник у чіпі */
/* Розмір бейджа — варіант .s у misc.css; тут лише посадка в чіп */
.ui-chip > .ui-badge { margin-right: -6px; }
.ui-chip.active > .ui-badge { background: var(--ui-surface); color: var(--ui-text-primary); }
/* Хрестик видалення (чіп тоді — span/div, не button: кнопка в кнопці невалідна) */
.ui-chip-x { display: inline-flex; align-items: center; justify-content: center; flex: none;
    width: 16px; height: 16px; margin-right: -6px; border: none; padding: 0;
    background: none; cursor: pointer; border-radius: 50%; color: inherit; }
.ui-chip-x::before { content: ""; width: 12px; height: 12px; background: currentColor;
    opacity: 0.55; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease);
    mask: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.6663 3.33301L3.33301 12.6663M3.33301 3.33301L12.6663 12.6663' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.6663 3.33301L3.33301 12.6663M3.33301 3.33301L12.6663 12.6663' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain; }
@media (hover: hover) { .ui-chip-x:hover::before { opacity: 1; } }
.ui-chip-x:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 1px; }
/* znohub-ui · прогрес-бар. Канон: .wr-progress > span */
.ui-progress { width: 100%; height: 8px; border-radius: var(--ui-radius-pill);
    background: var(--ui-progress-track); overflow: hidden; }
.ui-progress > span { display: block; height: 100%; border-radius: var(--ui-radius-pill);
    background: var(--ui-progress-fill); transition: width 0.3s; }
.ui-progress.green > span { background: var(--ui-progress-fill-success); }
.ui-progress.s { height: 6px; }
.ui-progress.sub-a > span { background: var(--ui-subject-a-bar); }
.ui-progress.sub-b > span { background: var(--ui-subject-b-bar); }
.ui-progress.sub-c > span { background: var(--ui-subject-c-bar); }
/* Жовта смуга на світлому треку невидима (1.26:1) — беремо темний жовтий */
.ui-progress.sub-d > span { background: var(--ui-subject-d-bar); }
.ui-progress.sub-e > span { background: var(--ui-subject-e-bar); }
.ui-progress.sub-f > span { background: var(--ui-subject-f-bar); }
/* znohub-ui · картка */
.ui-card { display: flex; flex-direction: column; gap: 16px; padding: 20px;
    border-radius: var(--ui-radius-xl); background: var(--ui-surface);
    border: 1px solid var(--ui-border-card);
    box-shadow: var(--ui-shadow-card); }   /* тінь лендингу; у темній темі — none */
/* Падинг 24 — власний, а не успадкований від .ui-card (20): рядок тримає
   слот іконки 48, і на 20 поля виглядали тіснішими за нього. Мала .row.s
   лишається на 12 — вона важить трьома класами і цього не бачить. */
.ui-card.row { flex-direction: row; align-items: center; padding: 24px; }
/* .sunken — блок УСЕРЕДИНІ картки чи модалки: та сама коробка, але утоплена
   й без межі з тінню (контур дає батьківська поверхня). Заголовок рядком
   дає .ui-summary-row, пояснення під ним — <small>. */
.ui-card.sunken { background: var(--ui-surface-sunken); border-color: transparent;
    box-shadow: none; gap: 10px; padding: 16px; border-radius: var(--ui-radius-l); }
.ui-card.sunken > small { color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; }

/* ============ СПІЛЬНИЙ ХОВЕР КАРТОК ============
   Одна поведінка на всі картки кита: підняття на 1px і м'яка тінь під
   карткою, а предметний CTA і тиха предметна іконка всередині спалахують
   із тінту в заливку. Межа НЕ міняється — контур картки сталий.
   Новий тип картки НЕ пише свій ховер: його селектор додається у списки
   нижче (підняття, медіа-зона) і в списки спалаху наприкінці файлу. */
/* .ui-award теж лише з .hover — вмикає сторінка. Підйом тут не обіцянка
   кліку, а відгук на курсор: у сітці з тридцяти однакових плиток він
   показує, на якій ти зараз. Картка товару в маркеті веде у вікно покупки,
   картка досягнення нікуди не веде — обидві його беруть. */
.ui-card.hover, a.ui-subject-card, .ui-award.hover,
a.ui-row.card, .ui-row.card.hover, .ui-page-head.hover { transition: transform 0.2s, box-shadow 0.2s; }
@media (hover: hover) {
    .ui-card.hover:hover,
    a.ui-subject-card:hover,
    a.ui-row.card:hover, .ui-row.card.hover:hover,
    .ui-page-head.hover:hover,
    .ui-award.hover:hover { transform: translateY(-1px); box-shadow: var(--ui-shadow-card-hover); }
}
/* Шапка розділу підіймається лише з .hover: у семи з шістнадцяти вжитків
   у ній не кнопка, а стат-цифра — там підйом обіцяв би клік, якого немає.
   CTA всередині спалахує з тінту в заливку, як предметний у картці-рядку. */
@media (hover: hover) {
    .ui-page-head.hover:hover .ui-btn.secondary {
        background: var(--ui-fill-accent); color: var(--ui-text-on-accent); }
    .ui-page-head.hover:hover .ui-btn.secondary > .ui-icon::before {
        background: var(--ui-text-on-accent); }
}
/* Медіа-зона картки бейджем НЕ масштабується: підняття всієї картки вже
   каже, що вона жива, а другий рух усередині читався як окрема анімація
   картинки і сперечався з першим. */
@media (prefers-reduced-motion: reduce) {
    .ui-card.hover, a.ui-subject-card, .ui-award,
    a.ui-row.card, .ui-row.card.hover, .ui-page-head.hover { transition: none; }
    .ui-card.hover:hover, a.ui-subject-card:hover,
    a.ui-row.card:hover, .ui-row.card.hover:hover,
    .ui-page-head.hover:hover, .ui-award.hover:hover { transform: none; }
}
/* Зона іконки в горизонтальній картці — 48×48, та сама, що в картці
   предмета. Вміщає і .ui-subject, і аватар викладача (той розтягується
   на всю зону, бо його власна шкала 48 не має). */
.ui-card.row > .ui-subject-slot { position: relative; width: 48px; height: 48px; flex: none;
    display: flex; align-items: center; justify-content: center; }
.ui-card.row > .ui-subject-slot > .ui-avatar { width: 100%; height: 100%; font-size: 17px; }
/* Гола картинка в слоті (бейдж досягнення) теж мусить триматись зони:
   без цього вона бере натуральний розмір і розриває картку. Те саме
   правило вже є в шапці розділу — тут його бракувало. */
.ui-card.row > .ui-subject-slot > img { width: 100%; height: 100%; object-fit: contain; }
/* Текст у картці більший за текст рядка списку — кегль картки предмета */
/* Кінцева іконка рядкової картки подається так само тихо, як .ui-row-chev
   (opacity .55). Той клас тут не годиться: він сам малює шеврон маскою, а
   на цих картках гліф змінний — шеврон або замок без преміуму. Без правила
   сусідні картки в одному ряду мали стрілки різної насиченості. */
.ui-card.row > .ui-icon:last-child { opacity: 0.55; }
.ui-card.row > .ui-row-text > p { font-size: 17px; line-height: 23px; letter-spacing: -0.3px; }
.ui-card.row > .ui-row-text > span { font-size: 14px; line-height: 20px; }
/* Компактна горизонтальна картка: метрика рядка списку (.ui-row), але
   власним блоком — біле тло, рамка, тінь. Для стрічок, де карток багато
   й кожна коротка: операція в історії, подія в журналі. */
.ui-card.row.s { gap: 12px; padding: 12px; border-radius: var(--ui-radius-l); }
.ui-card.row.s > .ui-subject-slot { width: 36px; height: 36px; }
/* Бейдж преміуму на дрібному слоті: штатні 24px забирали б дві третини
   кружка 36×36 і читались як другий значок, а не як позначка на першому */
.ui-card.row.s > .ui-subject-slot > .ui-premium-badge { width: 18px; height: 18px;
    right: -3px; bottom: -3px; border-width: 1.5px; }
.ui-card.row.s > .ui-subject-slot > .ui-premium-badge > .ui-icon { width: 8px; height: 8px; }
.ui-card.row.s > .ui-row-text > p { font-size: 15px; line-height: 22px; letter-spacing: -0.1px; }
.ui-card.row.s > .ui-row-text > span { font-size: 13px; line-height: 18px; }
@media screen and (max-width: 640px) {
    /* Переноситься так само, як картка предмета: дії окремим рядком на
       всю ширину, а не притиснуті до правого краю. Падинг 16 замість 24:
       на 375 два рази по 24 забирають забагато від рядка, а дії тут ідуть
       другим рядком і без того додають висоти. */
    .ui-card.row { flex-wrap: wrap; padding: 16px; }
    .ui-card.row > .ui-row-meta { width: 100%; margin-left: 0; }
    /* Кнопки ділять рядок порівну замість того, щоб тулитись ліворуч і
       лишати хвіст порожнечі. Три класи, бо list.css тримає .ui-row-meta >
       .ui-btn на flex: none (0,2,0) — коротший запис програв би вагою.
       Тег (дедлайн пробного) сюди не входить: у нього власна min-width,
       і розтягувати його разом із кнопкою нема сенсу. */
    .ui-card.row > .ui-row-meta > .ui-btn { flex: 1; }
}

/* ---- Преміум-картка: рамка-переливання ----
   Градієнт малює псевдоелемент на всю картку, а двошарова маска з
   composite: exclude лишає від нього тільки смужку рамки — так контур
   виходить градієнтним, чого звичайний border не вміє.
   Форма — горизонтальний проблиск, що йде зліва направо: контур не
   обертається, бо в широкому рядку обертання читалось як лінія, що
   від'їжджає вбік від картки. Смуга вузька й має гарячу серцевину (заливка
   предмета) з мʼяким ореолом навколо: помітність дає контраст ядра й ореолу,
   а не загальна густина — саме тому попередній суцільний тінт під opacity
   .5 майже не читався.
   Анімуємо background-position (композитна властивість), а не сам градієнт:
   переливання йде на GPU і не змушує браузер перераховувати розкладку.
   Плитка завширшки 300%, зсув на -300% — рівно три плитки, тож цикл
   замикається без стрибка.
   inset: -1px і padding — рамка лягає поверх власної межі картки, тож
   висота не змінюється і сусідні картки в сітці лишаються на одній лінії.
   Той самий контур беруть .ui-page-head.premium (шапка курсу — та сама
   коробка з тими ж межею й радіусом) і .ui-alert.active — банер, який
   треба пройти зараз. */
.ui-card.premium, .ui-page-head.premium { position: relative; }
.ui-card.premium::before, .ui-page-head.premium::before, .ui-standings-row.me::before,
.ui-alert.active::before {
    content: ""; position: absolute; inset: -1px; z-index: 1; pointer-events: none;
    border-radius: inherit; padding: 1.5px;
    background: linear-gradient(90deg,
        transparent 0%,
        var(--ui-scope-sheen, var(--ui-sheen-color)) 44%,
        var(--ui-scope-fill, var(--ui-fill-accent)) 50%,
        var(--ui-scope-sheen, var(--ui-sheen-color)) 56%,
        transparent 100%);
    background-size: 300% 100%;
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
    mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    mask-composite: exclude;
    animation: ui-premium-sheen 5s linear infinite; }
@keyframes ui-premium-sheen {
    from { background-position: 0% 0; }
    to   { background-position: -300% 0; }
}
/* Рух — не носій сенсу: без анімації рамка лишається, просто не переливається */
@media (prefers-reduced-motion: reduce) {
    .ui-card.premium::before, .ui-page-head.premium::before,
    .ui-standings-row.me::before, .ui-alert.active::before {
        animation: none; background-position: 50% 0; }
}

/* Вимкнена картка-посилання: пара до .ui-choice-card.disabled. Без неї
   сторінка знімала лише хук модалки, а картка лишалась яскравою, підіймалась
   на ховері й вела на href="#" — тобто брехала двічі. */
.ui-card.disabled, a.ui-card.disabled { opacity: 0.55; pointer-events: none; }

/* Список карток; .grid — ті самі картки у колонки, поки є ширина.
   Мінімальну ширину колонки задає --ui-grid-min: база 300, .m 240, .s 190. */
.ui-cards { display: flex; flex-direction: column; gap: 6px; }
/* Картки тягнуться на висоту ряду: різна висота однотипних карток через
   довжину тексту читається як збій. Кому потрібна висота по вмісту —
   .ui-cards.grid.top (сусідні картки різного змісту). */
.ui-cards.grid { display: grid; align-items: stretch;
    grid-template-columns: repeat(auto-fit, minmax(var(--ui-grid-min, 300px), 1fr)); }
.ui-cards.grid.top { align-items: start; }
/* Розміри колонки для сіток однотипних карток: .s — дрібні (досягнення),
   .m — з кнопкою і довшою назвою (товари маркету). Обидві беруть auto-FILL
   замість auto-fit базової .grid: порожні колонки лишаються, тож неповний
   ряд (3 картки з 5) тримає ту саму ширину, що й повний, а не розтягує
   картки на всю сітку. Вирівнювання на висоту ряду — від базової .grid. */
.ui-cards.grid.s, .ui-cards.grid.m {
    grid-template-columns: repeat(auto-fill, minmax(var(--ui-grid-min), 1fr)); }
.ui-cards.grid.s { --ui-grid-min: 190px; }
.ui-cards.grid.m { --ui-grid-min: 240px; }

/* Картка досягнення: бейдж (відкрите) або кільце прогресу із замком
   (заблоковане) у зоні 96×96, під ним назва, умова і стан. Заблоковані
   лишаються в сітці — учень бачить, що попереду і скільки лишилось. */
.ui-award { position: relative; display: flex; flex-direction: column; align-items: center; gap: 12px;
    padding: 24px 16px; text-align: center; border-radius: var(--ui-radius-xl);
    background: var(--ui-surface); border: 1px solid var(--ui-border-card);
    box-shadow: var(--ui-shadow-card); }
/* Позначка в кутку: те, що стосується не товару, а самого учня — скільки
   цього запасу в нього вже є («×3» заморозок). У колонці назви їй не місце:
   там читається як характеристика товару. Селектор через прямого нащадка —
   щоб перебити position: relative від .ui-tip, коли позначка з тултіпом. */
.ui-award > .ui-award-corner { position: absolute; top: 12px; right: 12px; z-index: 1; }
.ui-award-badge { width: 96px; height: 96px; flex: none;
    display: flex; align-items: center; justify-content: center; }
.ui-award-badge > img { width: 100%; height: 100%; object-fit: contain; }
.ui-award-badge > .ui-ring > .ui-icon::before { background: var(--ui-text-muted); }
/* Назва й умова — одна група з тіснішим внутрішнім кроком: вони читаються
   разом, а 8px картки лишаються між групами (бейдж · текст · стан) */
.ui-award-text { display: flex; flex-direction: column; gap: 4px; }
.ui-award-text > b { color: var(--ui-text-primary); font-size: 15px; font-weight: 700;
    line-height: 22px; letter-spacing: -0.1px; }
.ui-award-text > span { color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; }
/* Тег стану — до низу картки, щоб у ряду вони стояли на одній лінії
   незалежно від довжини опису */
.ui-award > .ui-tag { margin-top: auto; }
/* Підвал: ціна і дія (картка товару в маркеті). Так само притискається
   донизу — у ряду ціни й кнопки стоять на одній лінії */
.ui-award-foot { margin-top: auto; width: 100%; display: flex;
    flex-direction: column; align-items: center; gap: 10px; }
/* .row — ціна й дія в один рядок. Стовпчик потрібен, коли підпис дії довгий
   і в колонку 190px не влазить поруч із ціною; у ширшій сітці товарів (.m)
   вони стоять поруч, і картка не витягується зайвим рядком. */
.ui-award-foot.row { flex-direction: row; justify-content: center; gap: 12px; }
@media screen and (max-width: 640px) {
    /* Дві колонки замість однієї: 28 досягнень стовпчиком — це нескінченне
       гортання, а сітка дає побачити секцію цілком */
    .ui-cards.grid.s, .ui-cards.grid.m { --ui-grid-min: 140px; }
    .ui-award { padding: 24px 10px; }
    .ui-award-badge { width: 76px; height: 76px; }
    .ui-award-badge > .ui-ring.xl { --ui-ring-size: 76px; }
    /* На вузькій картці бейдж займає майже всю ширину, і кутова позначка
       лягала б просто на нього. Тому картка з позначкою відсуває вміст на її
       висоту; сусідки в ряду тягнуться за нею — сітка вирівнює висоту. */
    .ui-award:has(> .ui-award-corner) { padding-top: 48px; }
}

/* .rows — на телефоні картки лягають в один стовпчик і РОЗГОРТАЮТЬСЯ в рядок:
   зображення ліворуч, назва і дія праворуч. Плитка з довгою назвою, ціною і
   кнопкою на 140px колонці ламала підпис на пʼять рядків і з'їдала пів
   екрана на дві картки. Дрібні плитки без дії (досягнення) цього НЕ беруть —
   там сітка по дві читається краще за стовпчик із 28 рядків.
   Розкладка — грід, а не флекс: у картці три сестри підряд (зображення,
   текст, підвал), і без обгортки лише грід ставить текст над підвалом
   праворуч від зображення, що тягнеться на обидва рядки. */
@media screen and (max-width: 640px) {
    .ui-cards.grid.rows { grid-template-columns: 1fr; }
    .ui-cards.grid.rows > .ui-award { display: grid; grid-template-columns: auto 1fr;
        align-items: center; gap: 8px 14px; padding: 14px; text-align: left; }
    .ui-cards.grid.rows > .ui-award > .ui-award-badge { grid-area: 1 / 1 / 3 / 2;
        width: 72px; height: 72px; }
    .ui-cards.grid.rows > .ui-award > .ui-award-text { grid-area: 1 / 2 / 2 / 3; }
    /* Назва в рядку тихіша за плиткову: у стовпчику вона займає два рядки на
       всю ширину екрана, і 700 читались як заголовок секції, а не як підпис
       товару. У плитці підпис короткий і центрований — там вага доречна. */
    .ui-cards.grid.rows > .ui-award > .ui-award-text > b { font-weight: 500; }
    /* Підвал уже не притискається донизу — картки в стовпчику вирівнюються
       не між собою, а всередині себе: ціна ліворуч, дія до правого краю. */
    .ui-cards.grid.rows > .ui-award > .ui-award-foot { grid-area: 2 / 2 / 3 / 4;
        margin-top: 0; justify-content: space-between; }
    /* Кутова позначка в рядку не висить над назвою, а бере власну колонку:
       у плитці над нею було порожнє поле, а тут довгий підпис заходив під
       неї. Колонка зʼявляється лише разом із позначкою, щоб решта карток не
       тримала порожній відступ праворуч. */
    .ui-cards.grid.rows > .ui-award:has(> .ui-award-corner) {
        grid-template-columns: auto 1fr auto; }
    .ui-cards.grid.rows > .ui-award > .ui-award-corner { position: static;
        grid-area: 1 / 3 / 2 / 4; }
}

/* Картка-вибір: сама лишається <div> і реагує на будь-який відмічений input
   усередині через :has. Не робимо її <label>, бо всередині живуть власні
   контроли (сегменти) — клік по них не має перемикати вибір самої картки.
   Перемикає вибір лише шапка .ui-choice-card-head (це <label for=…>).
   .ui-choice-card-more показується тільки в обраному стані. */
.ui-choice-card { position: relative; display: flex; flex-direction: column; gap: 14px;
    padding: 16px; border-radius: var(--ui-radius-l); background: var(--ui-surface);
    border: 1.5px solid var(--ui-border-card); transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
.ui-choice-card-head { display: flex; align-items: center; gap: 12px; min-width: 0;
    cursor: pointer; }
.ui-choice-card-head > .ui-row-text { flex: 1; }
/* Чекбокс картки: візуал бере .ui-check-box з controls.css, стан веде цей input */
.ui-choice-card-head > input { position: absolute; opacity: 0; width: 0; height: 0; }
.ui-choice-card-head > input:checked + .ui-check-box { background: var(--ui-fill-accent);
    border-color: var(--ui-fill-accent); }
.ui-choice-card-head > input:checked + .ui-check-box::after { opacity: 1; }
@media (hover: hover) { .ui-choice-card:hover { border-color: var(--ui-border-accent); } }
/* Стан веде ВЛАСНИЙ input картки, а не будь-який відмічений усередині:
   у розкритій частині живуть свої радіо (тариф, оплата), і вони завжди
   мають одне відмічене значення */
.ui-choice-card:has(> .ui-choice-card-head > input:checked) {
    border-color: var(--ui-border-accent); background: var(--ui-tint-accent); }
.ui-choice-card:has(> .ui-choice-card-head > input:focus-visible) {
    outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
.ui-choice-card.disabled { opacity: 0.55; pointer-events: none; }
.ui-choice-card-more { display: none; flex-direction: column; gap: 10px; }
.ui-choice-card:has(> .ui-choice-card-head > input:checked) .ui-choice-card-more { display: flex; }
/* Рядок «підпис + контрол» усередині розкритої картки */
.ui-choice-row { display: flex; align-items: center; justify-content: space-between;
    flex-wrap: wrap; gap: 8px; }
.ui-choice-row > p { color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; }

/* Промо-картка: ілюстрація на всю площину, текст і дія поверх неї.
   Канон .banner-interact платформи, але без свайпера — ряд .ui-promos
   сам стає стовпчиком на вузькому екрані. Текст бере ролі on-dark
   (світлий шрифт на насиченій ілюстрації) або on-light з класом .light. */
.ui-promos { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 12px; }
/* Без власного тла: радіус обрізає картинку, і крізь антиаліасинг кутів
   проступала б підкладка — тонкою темною обводкою по периметру. Тло має
   давати сама ілюстрація; демо без картинки задає його інлайном. */
.ui-promo { position: relative; isolation: isolate; overflow: hidden;
    display: flex; flex-direction: column; justify-content: space-between; gap: 16px;
    min-height: 200px; padding: 28px; border-radius: var(--ui-radius-xl); }
.ui-promo-bg { position: absolute; inset: 0; z-index: -1; width: 100%; height: 100%;
    object-fit: cover; object-position: center; user-select: none; pointer-events: none; }
.ui-promo-text { display: flex; flex-direction: column; gap: 4px; max-width: 340px; }
.ui-promo-text > p { color: var(--ui-text-on-fill); font-size: 20px; font-weight: 700;
    line-height: 26px; letter-spacing: -0.4px; }
.ui-promo-text > span { color: var(--ui-text-on-dark); font-size: 14px; line-height: 20px; }
.ui-promo.light > .ui-promo-text > p { color: var(--ui-text-on-light); }
.ui-promo.light > .ui-promo-text > span { color: var(--ui-text-on-light-muted); }
/* Наддрібний рядок над заголовком (дата, розділ) */
.ui-promo-over { color: var(--ui-text-on-dark); font-size: 12px; font-weight: 700;
    line-height: 16px; letter-spacing: 0.4px; text-transform: uppercase; }
.ui-promo.light .ui-promo-over { color: var(--ui-text-on-light-muted); }
/* Значок магазину застосунків — готове зображення, висота як у кнопки .m */
.ui-promo-store > img { display: block; height: 36px; width: auto; }
/* Бейджі сторів — посилання, тож мають реагувати. Власного вигляду в них
   немає (це чужі картинки), тому єдиний доречний афорданс — прозорість. */
.ui-promo-store { transition: opacity 0.2s; }
@media (hover: hover) { .ui-promo-store:hover { opacity: 0.85; } }
@media screen and (max-width: 640px) {
    .ui-promo { padding: 20px; min-height: 168px; }
    .ui-promo-text > p { font-size: 17px; line-height: 23px; letter-spacing: -0.3px; }
}

/* Картка предмета: зона іконки в лейауті завжди 48×48.
   Обидва стани загорнуті в .ui-subject-slot 48×48 (центрування) — блоки рівні.
   Без прогресу — іконка 48; з прогресом — кільце 52 (геометрію і розмір
   вмісту рахує сам компонент), виступає за слот на 2px */
.ui-subject-card .ui-subject-slot { width: 48px; height: 48px; flex: none;
    display: flex; align-items: center; justify-content: center; }
.ui-subject-card .ui-ring { --ui-ring-size: 52px; flex: none; }
/* гліф 24 в обох станах картки — і в кільці, і в повній іконці 48
   (варіант з .ui-ring > — щоб перебити базовий 22px компонента) */
.ui-subject-card .ui-subject::after,
.ui-subject-card .ui-ring > .ui-subject::after { width: 24px; height: 24px; }

a.ui-subject-card { text-decoration: none; }
.ui-subject-card { display: flex; align-items: center; gap: 12px; padding: 24px;
    border-radius: var(--ui-radius-xl); background: var(--ui-surface);
    border: 1px solid var(--ui-border-card);
    box-shadow: var(--ui-shadow-card); }
.ui-subject-card-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.ui-subject-card-text > p { color: var(--ui-text-primary); font-size: 17px; font-weight: 700;
    line-height: 23px; letter-spacing: -0.3px; }
.ui-subject-card-text > span { color: var(--ui-text-secondary); font-size: 14px; font-weight: 400; line-height: 20px; }
.ui-subject-card-side { display: flex; align-items: center; gap: 24px; margin-left: auto; flex: none; }

/* Спалах предметних елементів — друга частина спільного ховера карток
   (перша, підняття, — на початку файлу). Іконка «запалюється» заливкою,
   CTA прокидається з тихого тінту в заливку.

   Рядок-картка (.ui-card.row.hover) сюди БІЛЬШЕ НЕ входить. Раніше входила,
   і .hover означала дві незалежні речі: підйом картки і перефарбування
   предметного CTA в тихий тінт. Через друге .hover не можна було поставити
   на блок зі справжніми кнопками — кіт гасив їх до тінту. Тепер .hover на
   .ui-card означає рівно підйом, а кнопки лишаються тим, чим їх зробили
   роллю. Тихий CTA лишився там, де він і задуманий: у картці предмета і в
   шапці розділу, тобто на блоках, що клікаються цілком. */
@media (hover: hover) {
    a.ui-subject-card.sub-a:hover .ui-subject.soft { background: var(--ui-subject-a-fill); }
    a.ui-subject-card.sub-a:hover .ui-subject.soft::after { background: var(--ui-subject-a-on-fill); }
    a.ui-subject-card.sub-a:hover .ui-btn.sub-a { background: var(--ui-subject-a-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-a { background: var(--ui-subject-a-fill); }
    a.ui-subject-card.sub-a:hover .ui-btn.sub-a > p { color: var(--ui-subject-a-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-a > p { color: var(--ui-subject-a-on-fill); }
    a.ui-subject-card.sub-a:hover .ui-btn.sub-a > .ui-icon::before { background: var(--ui-subject-a-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-a > .ui-icon::before { background: var(--ui-subject-a-on-fill); }
}
@media (hover: hover) {
    a.ui-subject-card.sub-b:hover .ui-subject.soft { background: var(--ui-subject-b-fill); }
    a.ui-subject-card.sub-b:hover .ui-subject.soft::after { background: var(--ui-subject-b-on-fill); }
    a.ui-subject-card.sub-b:hover .ui-btn.sub-b { background: var(--ui-subject-b-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-b { background: var(--ui-subject-b-fill); }
    a.ui-subject-card.sub-b:hover .ui-btn.sub-b > p { color: var(--ui-subject-b-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-b > p { color: var(--ui-subject-b-on-fill); }
    a.ui-subject-card.sub-b:hover .ui-btn.sub-b > .ui-icon::before { background: var(--ui-subject-b-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-b > .ui-icon::before { background: var(--ui-subject-b-on-fill); }
}
@media (hover: hover) {
    a.ui-subject-card.sub-c:hover .ui-subject.soft { background: var(--ui-subject-c-fill); }
    a.ui-subject-card.sub-c:hover .ui-subject.soft::after { background: var(--ui-subject-c-on-fill); }
    a.ui-subject-card.sub-c:hover .ui-btn.sub-c { background: var(--ui-subject-c-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-c { background: var(--ui-subject-c-fill); }
    a.ui-subject-card.sub-c:hover .ui-btn.sub-c > p { color: var(--ui-subject-c-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-c > p { color: var(--ui-subject-c-on-fill); }
    a.ui-subject-card.sub-c:hover .ui-btn.sub-c > .ui-icon::before { background: var(--ui-subject-c-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-c > .ui-icon::before { background: var(--ui-subject-c-on-fill); }
}
@media (hover: hover) {
    a.ui-subject-card.sub-d:hover .ui-subject.soft { background: var(--ui-subject-d-fill); }
    a.ui-subject-card.sub-d:hover .ui-subject.soft::after { background: var(--ui-subject-d-on-fill); }
    a.ui-subject-card.sub-d:hover .ui-btn.sub-d { background: var(--ui-subject-d-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-d { background: var(--ui-subject-d-fill); }
    a.ui-subject-card.sub-d:hover .ui-btn.sub-d > p { color: var(--ui-subject-d-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-d > p { color: var(--ui-subject-d-on-fill); }
    a.ui-subject-card.sub-d:hover .ui-btn.sub-d > .ui-icon::before { background: var(--ui-subject-d-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-d > .ui-icon::before { background: var(--ui-subject-d-on-fill); }
}
@media (hover: hover) {
    a.ui-subject-card.sub-e:hover .ui-subject.soft { background: var(--ui-subject-e-fill); }
    a.ui-subject-card.sub-e:hover .ui-subject.soft::after { background: var(--ui-subject-e-on-fill); }
    a.ui-subject-card.sub-e:hover .ui-btn.sub-e { background: var(--ui-subject-e-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-e { background: var(--ui-subject-e-fill); }
    a.ui-subject-card.sub-e:hover .ui-btn.sub-e > p { color: var(--ui-subject-e-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-e > p { color: var(--ui-subject-e-on-fill); }
    a.ui-subject-card.sub-e:hover .ui-btn.sub-e > .ui-icon::before { background: var(--ui-subject-e-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-e > .ui-icon::before { background: var(--ui-subject-e-on-fill); }
}
@media (hover: hover) {
    a.ui-subject-card.sub-f:hover .ui-subject.soft { background: var(--ui-subject-f-fill); }
    a.ui-subject-card.sub-f:hover .ui-subject.soft::after { background: var(--ui-subject-f-on-fill); }
    a.ui-subject-card.sub-f:hover .ui-btn.sub-f { background: var(--ui-subject-f-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-f { background: var(--ui-subject-f-fill); }
    a.ui-subject-card.sub-f:hover .ui-btn.sub-f > p { color: var(--ui-subject-f-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-f > p { color: var(--ui-subject-f-on-fill); }
    a.ui-subject-card.sub-f:hover .ui-btn.sub-f > .ui-icon::before { background: var(--ui-subject-f-on-fill); }
    .ui-page-head.hover:hover .ui-btn.sub-f > .ui-icon::before { background: var(--ui-subject-f-on-fill); }
}
/* CTA у спокої — тихий тінт із текстовою парою */
.ui-subject-card .ui-btn.sub-a,
.ui-page-head.hover .ui-btn.sub-a { background: var(--ui-subject-a-tint); }
.ui-subject-card .ui-btn.sub-a > p,
.ui-page-head.hover .ui-btn.sub-a > p { color: var(--ui-subject-a-text); }
.ui-subject-card .ui-btn.sub-a > .ui-icon::before,
.ui-page-head.hover .ui-btn.sub-a > .ui-icon::before { background: var(--ui-subject-a-text); }
.ui-subject-card .ui-btn.sub-b,
.ui-page-head.hover .ui-btn.sub-b { background: var(--ui-subject-b-tint); }
.ui-subject-card .ui-btn.sub-b > p,
.ui-page-head.hover .ui-btn.sub-b > p { color: var(--ui-subject-b-text); }
.ui-subject-card .ui-btn.sub-b > .ui-icon::before,
.ui-page-head.hover .ui-btn.sub-b > .ui-icon::before { background: var(--ui-subject-b-text); }
.ui-subject-card .ui-btn.sub-c,
.ui-page-head.hover .ui-btn.sub-c { background: var(--ui-subject-c-tint); }
.ui-subject-card .ui-btn.sub-c > p,
.ui-page-head.hover .ui-btn.sub-c > p { color: var(--ui-subject-c-text); }
.ui-subject-card .ui-btn.sub-c > .ui-icon::before,
.ui-page-head.hover .ui-btn.sub-c > .ui-icon::before { background: var(--ui-subject-c-text); }
.ui-subject-card .ui-btn.sub-d,
.ui-page-head.hover .ui-btn.sub-d { background: var(--ui-subject-d-tint); }
.ui-subject-card .ui-btn.sub-d > p,
.ui-page-head.hover .ui-btn.sub-d > p { color: var(--ui-subject-d-text); }
.ui-subject-card .ui-btn.sub-d > .ui-icon::before,
.ui-page-head.hover .ui-btn.sub-d > .ui-icon::before { background: var(--ui-subject-d-text); }
.ui-subject-card .ui-btn.sub-e,
.ui-page-head.hover .ui-btn.sub-e { background: var(--ui-subject-e-tint); }
.ui-subject-card .ui-btn.sub-e > p,
.ui-page-head.hover .ui-btn.sub-e > p { color: var(--ui-subject-e-text); }
.ui-subject-card .ui-btn.sub-e > .ui-icon::before,
.ui-page-head.hover .ui-btn.sub-e > .ui-icon::before { background: var(--ui-subject-e-text); }
.ui-subject-card .ui-btn.sub-f,
.ui-page-head.hover .ui-btn.sub-f { background: var(--ui-subject-f-tint); }
.ui-subject-card .ui-btn.sub-f > p,
.ui-page-head.hover .ui-btn.sub-f > p { color: var(--ui-subject-f-text); }
.ui-subject-card .ui-btn.sub-f > .ui-icon::before,
.ui-page-head.hover .ui-btn.sub-f > .ui-icon::before { background: var(--ui-subject-f-text); }

@media screen and (max-width: 860px) {
    /* Падинг 16, а радіус лишається базовим (24) — перевизначення на
       --ui-radius-l (16) знято за рішенням власника: картка на вузькому
       має ті самі кути, що й на десктопі. */
    .ui-subject-card { padding: 16px; gap: 12px; }
    /* Текст забирає решту рядка — стрілка притискається до правого краю */
    .ui-subject-card-text { flex: 1; }
    /* CTA згортається до самої стрілки: на вузькому підпис дії не потрібен,
       напрямок показує шеврон. Вузол лишається кнопкою — розмітка картки одна
       на всіх ширинах, і висота (40 або 48 з .l) далі тримає зону дотику.
       Раніше тут був інший рядок: картка бралася предметним тінтом, а CTA
       переходив у власний рядок на всю ширину. Тінт знято за рішенням
       власника — картка біла на всіх ширинах, як на десктопі. Солідну іконку
       нерозпочатого предмета мобільний лишає собі.
       Селектор тримає три класи не для краси: предметний тінт CTA вище —
       .ui-subject-card .ui-btn.sub-* (0,3,0), і коротший запис програв би
       йому вагою, лишивши за стрілкою кольорову плашку. */
    .ui-subject-card .ui-subject-card-side > .ui-btn { background: none; padding: 0; }
    .ui-subject-card .ui-subject-card-side > .ui-btn > p { display: none; }
    /* Ховер не повертає стрілці тло. Спалах вище (a.ui-subject-card.sub-*:hover
       .ui-btn.sub-*) заливає CTA предметним кольором — на згорнутій стрілці це
       робило з неї пігулку. Селектор дзеркалить той спалах вагою (0,5,1):
       :is() важить найважчим аргументом, тобто одним класом, як і .sub-* там.
       Виграє порядком — цей блок у файлі нижче. Гард (hover: hover) не
       потрібен: правило тло знімає, а не додає. */
    a.ui-subject-card:is(.sub-a, .sub-b, .sub-c, .sub-d, .sub-e, .sub-f):hover
        .ui-subject-card-side > .ui-btn { background: none; }
    /* ...і гліф лишається предметним. Спалах перефарбовує його в пару до
       заливки (біле), а заливки тут уже немає — стрілка ставала невидимою
       на білій картці. Колір беремо зі скоупу: клас предмета висить на
       картці й віддає --ui-scope-text донизу. */
    a.ui-subject-card:is(.sub-a, .sub-b, .sub-c, .sub-d, .sub-e, .sub-f):hover
        .ui-subject-card-side > .ui-btn > .ui-icon::before { background: var(--ui-scope-text); }
    .ui-subject-card.sub-a .ui-subject.soft { background: var(--ui-subject-a-fill); }
    .ui-subject-card.sub-a .ui-subject.soft::after { background: var(--ui-subject-a-on-fill); }
    .ui-subject-card.sub-b .ui-subject.soft { background: var(--ui-subject-b-fill); }
    .ui-subject-card.sub-b .ui-subject.soft::after { background: var(--ui-subject-b-on-fill); }
    .ui-subject-card.sub-c .ui-subject.soft { background: var(--ui-subject-c-fill); }
    .ui-subject-card.sub-c .ui-subject.soft::after { background: var(--ui-subject-c-on-fill); }
    .ui-subject-card.sub-d .ui-subject.soft { background: var(--ui-subject-d-fill); }
    .ui-subject-card.sub-d .ui-subject.soft::after { background: var(--ui-subject-d-on-fill); }
    .ui-subject-card.sub-e .ui-subject.soft { background: var(--ui-subject-e-fill); }
    .ui-subject-card.sub-e .ui-subject.soft::after { background: var(--ui-subject-e-on-fill); }
    .ui-subject-card.sub-f .ui-subject.soft { background: var(--ui-subject-f-fill); }
    .ui-subject-card.sub-f .ui-subject.soft::after { background: var(--ui-subject-f-on-fill); }
}
/* znohub-ui · предметна іконка-кружок. Канон: .subject-icon платформи.
   Розміри: 48 (база) · 40 (.s) · 56 (.l); .soft — тінтова підкладка.
   Маски гліфів живуть тут же, у --ui-glyph-sub-a…f (кит не залежить
   від new_style: каталог і сторінки поза кабінетом малюють їх однаково). */
.ui-subject { display: flex; justify-content: center; align-items: center; flex: none;
    width: 48px; height: 48px; border-radius: var(--ui-radius-pill); }
.ui-subject.s { width: 40px; height: 40px; }
.ui-subject.l { width: 56px; height: 56px; }
.ui-subject.sub-a { background: var(--ui-subject-a-fill); }
.ui-subject.sub-b { background: var(--ui-subject-b-fill); }
.ui-subject.sub-c { background: var(--ui-subject-c-fill); }
.ui-subject.sub-d { background: var(--ui-subject-d-fill); }
.ui-subject.sub-e { background: var(--ui-subject-e-fill); }
.ui-subject.sub-f { background: var(--ui-subject-f-fill); }
/* Тихий варіант — патерн дропдауна лендингу: 32%-підкладка, чорнильний гліф.
   Плавний перехід дозволяє ховер-«спалах» до насиченої заливки */
.ui-subject { transition: background 0.35s; }
.ui-subject::after { transition: background 0.35s; }
.ui-subject.soft.sub-a { background: var(--ui-subject-a-tint-strong); }
.ui-subject.soft.sub-b { background: var(--ui-subject-b-tint-strong); }
.ui-subject.soft.sub-c { background: var(--ui-subject-c-tint-strong); }
.ui-subject.soft.sub-d { background: var(--ui-subject-d-tint-strong); }
.ui-subject.soft.sub-e { background: var(--ui-subject-e-tint-strong); }
.ui-subject.soft.sub-f { background: var(--ui-subject-f-tint-strong); }

/* Гліф — маска 50×50 (SVG лендингу landing/assets/icons/subject-*.svg:
   ті самі іконки бачить відвідувач на сайті) */
.ui-subject::after { content: ""; width: 26px; height: 26px; background: var(--ui-text-on-fill);
    mask-repeat: no-repeat; mask-position: center; mask-size: contain;
    -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: contain; }
.ui-subject.s::after { width: 22px; height: 22px; }
.ui-subject.l::after { width: 30px; height: 30px; }
.ui-subject.sub-d::after { background: var(--ui-subject-d-on-fill); }
.ui-subject.soft.sub-a::after { background: var(--ui-subject-a-accent); }
.ui-subject.soft.sub-b::after { background: var(--ui-subject-b-accent); }
.ui-subject.soft.sub-c::after { background: var(--ui-subject-c-accent); }
.ui-subject.soft.sub-d::after { background: var(--ui-subject-d-accent); }
.ui-subject.soft.sub-e::after { background: var(--ui-subject-e-accent); }
.ui-subject.soft.sub-f::after { background: var(--ui-subject-f-accent); }
/* Гліфи предметів — оголошені раз, ужиті і компонентом, і легасі-мостом */
:root {
    --ui-glyph-sub-a: url("data:image/svg+xml,%3Csvg%20width=%2250%22%20height=%2250%22%20viewBox=%220%200%2050%2050%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M17.6301%2021.9483C19.2476%2017.0956%2020.7271%2012.8146%2020.9181%2012.4351L21.2654%2011.7451L32.5701%2011.8101L43.8749%2011.8751V13.8751V15.8751L34.0006%2016.0001L24.1261%2016.1251L20.6071%2026.6251C18.6714%2032.4001%2016.8994%2037.3218%2016.6689%2037.5626C16.0859%2038.1713%2012.9711%2038.1913%2012.4679%2037.5898C12.2794%2037.3643%2011.3919%2035.3111%2010.4959%2033.0273L8.86663%2028.8751L7.49588%2028.7501L6.12488%2028.6251V26.6251V24.6251H8.98063H11.8364L13.0051%2027.6123C13.6481%2029.2556%2014.2901%2030.6386%2014.4319%2030.6858C14.5736%2030.7331%2016.0129%2026.8011%2017.6301%2021.9483Z%22%20fill=%22black%22/%3E%3Cpath%20d=%22M29.0414%2025.8088C26.2956%2021.5401%2026.4406%2021.7983%2026.6249%2021.5001C26.7099%2021.3626%2027.7176%2021.2501%2028.8646%2021.2501H30.9496L32.2874%2023.4028C33.0229%2024.5868%2033.7374%2025.5713%2033.8749%2025.5903C34.0124%2025.6093%2034.7759%2024.6408%2035.5716%2023.4376L37.0184%2021.2501H39.1341C40.8209%2021.2501%2041.2499%2021.3241%2041.2499%2021.6146C41.2499%2021.8151%2040.4289%2023.2493%2039.4256%2024.8021C38.4221%2026.3548%2037.3544%2028.0306%2037.0529%2028.5261L36.5044%2029.4268L39.0126%2033.3456C40.3919%2035.5008%2041.4531%2037.3736%2041.3706%2037.5071C41.2879%2037.6408%2040.2809%2037.7501%2039.1324%2037.7501H37.0446L35.6249%2035.5001C34.8441%2034.2626%2034.0746%2033.2506%2033.9151%2033.2511C33.7554%2033.2516%2032.9794%2034.2641%2032.1904%2035.5011L30.7561%2037.7501H28.6279C27.0594%2037.7501%2026.4999%2037.6656%2026.4999%2037.4283C26.4999%2037.1236%2030.5131%2030.6418%2031.0139%2030.1376C31.4554%2029.6931%2031.2506%2029.2436%2029.0414%2025.8088Z%22%20fill=%22black%22/%3E%3C/svg%3E");
    --ui-glyph-sub-b: url("data:image/svg+xml,%3Csvg%20width=%2250%22%20height=%2250%22%20viewBox=%220%200%2050%2050%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M21.2148%205.8309C29.7971%203.92051%2039.1448%208.71165%2042.8129%2016.8831L42.9213%2017.1283C44.0201%2019.6459%2044.4237%2021.7169%2044.4289%2024.7601C44.4339%2027.7849%2044.0187%2030.3225%2043.058%2032.6278C42.0972%2034.9335%2040.6001%2036.984%2038.4733%2039.0479C35.9559%2041.491%2033.6975%2042.8066%2030.2358%2043.8507C28.6304%2044.335%2027.7387%2044.4295%2025.0278%2044.4295C23.1572%2044.4295%2021.7256%2044.3189%2020.3468%2043.9972C18.9676%2043.6753%2017.6586%2043.1462%2016.0285%2042.3289C9.89226%2039.2524%205.89085%2033.2436%205.45207%2026.4408C4.9905%2019.2782%208.58236%2012.268%2014.6589%208.47568C16.8456%207.11083%2018.5501%206.42408%2021.2148%205.8309ZM28.3205%209.03452C25.5929%208.54988%2022.5969%208.43519%2019.9735%209.46373C19.6796%209.57897%2019.759%209.9711%2020.0731%2010.0036C20.5456%2010.0524%2021.0121%2010.138%2021.4618%2010.3194C21.8207%2010.4642%2022.1354%2010.6093%2022.3219%2010.847C23.739%2012.6534%2021.9087%2012.1972%2024.016%2014.6148C24.5769%2015.2584%2024.8546%2015.9769%2024.7328%2016.5907C24.6703%2016.9059%2024.5023%2017.1812%2024.2336%2017.3729C23.969%2017.5616%2023.6322%2017.6519%2023.2541%2017.6519C23.1134%2017.652%2023.0665%2017.6827%2023.0539%2017.6932C23.0437%2017.7017%2023.0094%2017.7348%2022.9906%2017.859C22.9494%2018.1315%2022.8203%2018.3624%2022.6032%2018.5406C22.3977%2018.7093%2022.1297%2018.8177%2021.8254%2018.8934C21.6938%2018.9262%2021.4645%2019.0566%2021.1674%2019.2987C20.8829%2019.5305%2020.5744%2019.8329%2020.289%2020.1556C20.0033%2020.4786%2019.7485%2020.813%2019.5678%2021.1063C19.4773%2021.253%2019.4093%2021.3833%2019.3649%2021.492C19.3184%2021.6058%2019.3081%2021.6717%2019.308%2021.6974C19.308%2022.4663%2018.8572%2023.0645%2018.2941%2023.3087C18.0118%2023.4311%2017.6898%2023.4687%2017.3813%2023.3785C17.0672%2023.2866%2016.797%2023.0707%2016.6149%2022.7423C16.5405%2022.6081%2016.4117%2022.5204%2016.224%2022.4845C16.03%2022.4473%2015.7899%2022.4711%2015.5556%2022.5558C15.3211%2022.6405%2015.1222%2022.7753%2014.9982%2022.9268C14.8786%2023.073%2014.837%2023.2207%2014.8666%2023.37C14.8636%2023.3544%2014.8824%2023.4209%2015.0273%2023.5313C15.1548%2023.6285%2015.3319%2023.722%2015.526%2023.7828C15.8047%2023.8701%2016.1173%2024.0438%2016.3966%2024.2411C16.678%2024.4397%2016.9537%2024.6819%2017.1508%2024.9251C17.4377%2025.2789%2017.5622%2025.3902%2017.7387%2025.4535C17.9495%2025.529%2018.2648%2025.5475%2018.9843%2025.5475C20.1123%2025.5475%2020.9969%2025.6523%2021.7841%2025.942C22.576%2026.2334%2023.2412%2026.7016%2023.9474%2027.3834C24.263%2027.6881%2024.5968%2027.9633%2024.8764%2028.1598C25.0166%2028.2583%2025.137%2028.3327%2025.2304%2028.3807C25.3141%2028.4237%2025.3473%2028.4302%2025.3434%2028.4308L25.3276%2028.4305C25.5779%2028.431%2025.8492%2028.5074%2026.0981%2028.6095C26.3524%2028.7138%2026.6106%2028.8563%2026.8422%2029.014C27.0726%2029.1709%2027.2886%2029.3513%2027.4516%2029.5357C27.5983%2029.7019%2027.766%2029.9418%2027.766%2030.2115C27.766%2030.3084%2027.7471%2030.4495%2027.7228%2030.5975C27.6971%2030.7546%2027.6604%2030.9478%2027.6159%2031.1632C27.5267%2031.5945%2027.4041%2032.1242%2027.2695%2032.6495C27.0709%2033.4243%2026.9026%2033.9656%2026.6852%2034.3919C26.4602%2034.8331%2026.1904%2035.137%2025.8171%2035.4544C25.399%2035.8102%2024.811%2036.6094%2024.5397%2037.2049C24.2571%2037.8251%2023.7612%2038.6425%2023.3857%2039.1031L23.3124%2039.1903C23.0901%2039.4454%2022.9673%2039.6425%2022.9006%2039.8307C22.8351%2040.0151%2022.8136%2040.219%2022.8385%2040.503C22.8756%2040.9262%2022.9166%2040.9957%2022.9479%2041.0269C22.9637%2041.0427%2023.003%2041.0726%2023.1139%2041.1107C23.227%2041.1495%2023.3829%2041.1867%2023.6117%2041.2345C24.6142%2041.4436%2026.1064%2041.3754%2027.6967%2041.0777C29.2798%2040.7814%2030.9158%2040.266%2032.1962%2039.6143C32.937%2039.2373%2034.1046%2038.452%2035.1186%2037.6886C35.6232%2037.3086%2036.0817%2036.94%2036.4228%2036.6375C36.5938%2036.4859%2036.7305%2036.3552%2036.8273%2036.2508C36.8731%2036.2014%2036.9061%2036.1613%2036.9289%2036.1309C36.9274%2036.1217%2036.926%2036.1109%2036.9237%2036.099C36.9084%2036.0188%2036.8797%2035.9063%2036.8376%2035.7672C36.7537%2035.4905%2036.6247%2035.1345%2036.4711%2034.7691C36.0449%2033.7551%2035.8786%2032.8852%2035.9096%2031.8141C35.9204%2031.437%2035.902%2031.0636%2035.8647%2030.7696C35.8459%2030.6221%2035.8231%2030.5017%2035.7997%2030.4142C35.7789%2030.3363%2035.7647%2030.3124%2035.7682%2030.3165C35.7043%2030.2382%2035.6478%2030.1366%2035.6015%2030.0426C35.5486%2029.9352%2035.4938%2029.8071%2035.4401%2029.6688C35.3325%2029.3918%2035.2231%2029.0568%2035.1364%2028.7279L34.9028%2027.8407L33.1469%2027.7296C32.3%2027.6759%2031.7309%2027.6188%2031.2995%2027.5033C30.8428%2027.381%2030.5444%2027.195%2030.2299%2026.9149C28.7423%2025.5898%2028.3868%2023.6474%2029.2607%2021.7904C29.6069%2021.0545%2030.148%2020.4301%2030.7877%2019.9474C31.1284%2019.6903%2031.1132%2019.0727%2030.855%2018.7329C30.7149%2018.5486%2030.6125%2018.3367%2030.5654%2018.0995L30.5502%2018.005C30.5048%2017.6321%2030.6689%2017.2613%2030.8893%2016.9461C31.1165%2016.6213%2031.442%2016.2999%2031.8171%2016.0079C32.5653%2015.4253%2033.5675%2014.9167%2034.5314%2014.7249C35.2579%2014.5805%2035.9166%2014.3805%2036.3857%2014.181C36.6078%2014.0865%2036.774%2013.9974%2036.8825%2013.9222C36.8158%2013.8463%2036.7268%2013.7511%2036.6178%2013.6407C36.3439%2013.363%2035.9621%2013.0048%2035.5397%2012.6349C34.6784%2011.8802%2033.3854%2011.0684%2032.039%2010.3976C30.7748%209.76766%2029.4946%209.27746%2028.5129%209.07187L28.3205%209.03452ZM8.97721%2022.2752C8.9574%2022.3388%208.9366%2022.4322%208.91911%2022.5648C8.89497%2022.7478%208.87922%2022.9837%208.87199%2023.2804C8.85753%2023.8741%208.87722%2024.6817%208.91813%2025.7415C9.02102%2028.406%209.14072%2029.1034%209.68156%2030.4644C10.9152%2033.5689%2012.6746%2035.9914%2014.9894%2037.7967C15.588%2038.2635%2016.5281%2038.8742%2017.3735%2039.3697C17.7951%2039.6169%2018.1872%2039.8318%2018.4955%2039.9837C18.5545%2040.0128%2018.61%2040.0387%2018.6611%2040.0623C18.6663%2039.957%2018.672%2039.8354%2018.6772%2039.6995C18.6971%2039.1738%2018.7146%2038.4463%2018.725%2037.6446L18.7607%2034.889L17.5597%2033.7826C16.6992%2032.9896%2016.1225%2032.261%2015.8368%2031.4683C15.5475%2030.6652%2015.573%2029.8424%2015.8244%2028.8956C15.9247%2028.5175%2015.9819%2028.2864%2015.9892%2028.1095C15.9951%2027.9647%2015.9667%2027.884%2015.8888%2027.795C15.7886%2027.6805%2015.5961%2027.5431%2015.2206%2027.3482C14.8518%2027.1568%2014.3492%2026.9306%2013.6625%2026.6231C12.8467%2026.258%2012.0454%2025.7535%2011.4433%2025.2608C11.1427%2025.0149%2010.8819%2024.7641%2010.6928%2024.5269C10.5319%2024.3252%2010.375%2024.0753%2010.352%2023.8155C10.3483%2023.8083%2010.3439%2023.7986%2010.3373%2023.7872C10.3075%2023.7351%2010.2595%2023.6618%2010.1938%2023.5714C10.0632%2023.3917%209.87891%2023.1663%209.67424%2022.9413C9.34834%2022.5829%209.12536%2022.3714%208.97721%2022.2752Z%22%20fill=%22black%22/%3E%3C/svg%3E");
    --ui-glyph-sub-c: url("data:image/svg+xml,%3Csvg%20width=%2250%22%20height=%2250%22%20viewBox=%220%200%2050%2050%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M40.6287%2011.3134C43.7212%2011.1163%2043.8361%2011.2214%2043.8001%2014.216C43.7477%2018.5981%2042.1426%2022.6226%2039.3114%2025.47C38.1137%2026.6745%2036.5068%2027.7401%2034.8085%2028.5268C34.7812%2028.5402%2034.753%2028.5542%2034.7234%2028.5679C34.4572%2028.6915%2034.1826%2028.8074%2033.9026%2028.9166C33.2067%2029.1931%2032.505%2029.4198%2031.8185%2029.5875C29.887%2030.0997%2028.005%2030.337%2026.9799%2030.4045L26.9148%2036.1269L26.8492%2041.8555H23.1582L22.9122%2030.2906L21.6819%2030.1007C15.3827%2029.1295%2013.5852%2028.3663%2010.6186%2025.4027C8.39476%2023.181%207.30438%2021.2807%206.51871%2018.2561C5.97911%2016.1798%205.88364%2011.9907%206.36444%2011.4922C6.59649%2011.2516%207.24544%2011.213%209.00962%2011.3343C14.0827%2011.6835%2017.5636%2013.1003%2020.428%2015.9822C22.6384%2018.2058%2023.6143%2019.9953%2024.5073%2023.4623C24.6554%2024.0375%2024.8603%2024.5079%2024.9624%2024.5081C25.0645%2024.5081%2025.2773%2023.8921%2025.4353%2023.1391C25.9725%2020.5786%2027.338%2018.2017%2029.5323%2016.0074C32.4708%2013.0689%2035.9105%2011.6139%2040.6287%2011.3134Z%22%20fill=%22black%22/%3E%3C/svg%3E");
    --ui-glyph-sub-d: url("data:image/svg+xml,%3Csvg%20width=%2250%22%20height=%2250%22%20viewBox=%220%200%2050%2050%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20fill-rule=%22evenodd%22%20clip-rule=%22evenodd%22%20d=%22M18.3095%207.50791C15.848%207.61666%2014.3267%207.80391%2013.5702%208.09141C9.94424%209.46841%206.94024%2012.8814%206.03299%2016.6547C5.58249%2018.5279%205.69474%2028.4782%206.18749%2030.3564C7.17099%2034.1059%209.64624%2036.9279%2013.2257%2038.3807L14.6845%2038.9729L14.8095%2041.6739L14.9345%2044.3752L16.045%2044.3232C17.0982%2044.2737%2017.292%2044.1349%2019.799%2041.6357L22.4427%2039.0002H28.4787C33.7007%2039.0002%2034.7202%2038.9362%2036.0367%2038.5264C39.047%2037.5897%2041.4972%2035.4619%2042.843%2032.6159C43.9455%2030.2849%2044.1165%2028.7719%2043.9995%2022.3834C43.9055%2017.2407%2043.8357%2016.4649%2043.3467%2015.1252C41.8477%2011.0189%2037.943%207.89591%2033.961%207.61816C31.0257%207.41341%2021.9035%207.34916%2018.3095%207.50791ZM20.936%2015.5024C21.0217%2015.6414%2021.8632%2017.9757%2022.8062%2020.6899C23.749%2023.4044%2024.8865%2026.6189%2025.3335%2027.8334C26.2672%2030.3694%2026.1855%2030.5697%2024.315%2030.3302C22.9267%2030.1524%2022.8647%2030.0972%2022.209%2028.4519L21.68%2027.1252H18.9407H16.2012L15.8525%2028.3752C15.6605%2029.0627%2015.39%2029.7659%2015.251%2029.9377C14.9602%2030.2972%2012.4125%2030.3692%2012.1992%2030.0242C12.0962%2029.8574%2015.2712%2020.1539%2016.9307%2015.5627C17.0697%2015.1782%2020.7017%2015.1234%2020.936%2015.5024ZM35.0545%2019.5627C37.083%2020.5992%2037.1845%2020.9039%2037.1845%2025.9554V30.3752L36.5055%2030.4534C36.132%2030.4964%2035.4497%2030.3529%2034.9892%2030.1344C34.234%2029.7759%2034.0622%2029.7744%2033.2387%2030.1187C32.085%2030.6007%2029.9977%2030.6104%2029.0842%2030.1379C28.0557%2029.6062%2027.4645%2028.5519%2027.4645%2027.2502C27.4645%2025.2232%2028.7522%2024.1027%2031.3722%2023.8499C34.2085%2023.5764%2034.3095%2023.5397%2034.3095%2022.7777C34.3095%2021.6989%2033.5372%2021.1539%2032.2525%2021.3259C31.5627%2021.4182%2031.063%2021.6514%2030.8415%2021.9844C30.573%2022.3879%2030.2332%2022.5002%2029.279%2022.5002C28.2162%2022.5002%2028.0595%2022.4342%2028.0595%2021.9877C28.0595%2020.7529%2028.9415%2019.8509%2030.8095%2019.1752C31.7955%2018.8187%2033.9902%2019.0189%2035.0545%2019.5627ZM18.5797%2019.8217C17.9887%2021.3759%2017.303%2024.0374%2017.4372%2024.2547C17.6232%2024.5557%2020.4782%2024.5839%2020.662%2024.2867C20.8442%2023.9917%2019.3002%2019.2502%2019.022%2019.2502C18.8982%2019.2502%2018.6992%2019.5074%2018.5797%2019.8217ZM31.8735%2025.7382C30.7377%2026.0157%2030.2715%2026.4739%2030.3592%2027.2269C30.4687%2028.1647%2031.5067%2028.6009%2032.8%2028.2527C33.908%2027.9544%2034.3805%2027.3234%2034.2625%2026.3004C34.1985%2025.7459%2034.0505%2025.6177%2033.4345%2025.5827C33.022%2025.5592%2032.3195%2025.6292%2031.8735%2025.7382Z%22%20fill=%22black%22/%3E%3C/svg%3E");
    --ui-glyph-sub-e: url("data:image/svg+xml,%3Csvg%20width=%2250%22%20height=%2250%22%20viewBox=%220%200%2050%2050%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M7.62476%2012.1251L8.62476%2011.9556C9.17476%2011.8623%2010.937%2011.8281%2012.5408%2011.8796C16.6405%2012.0113%2019.6715%2013.0381%2022.4545%2015.2378L23.7498%2016.2618V28.7558C23.7498%2037.6456%2023.6708%2041.2501%2023.4758%2041.2501C23.3253%2041.2501%2022.8765%2041.0183%2022.4788%2040.7353C21.2813%2039.8826%2018.2362%2038.5918%2016.364%2038.1433C15.227%2037.8711%2013.3673%2037.7046%2011.114%2037.6733L7.62476%2037.6251V24.8751V12.1251Z%22%20fill=%22black%22/%3E%3Cpath%20d=%22M27.3123%2015.4416C28.9998%2013.8823%2032.4418%2012.4211%2035.6248%2011.9126C36.853%2011.7166%2042.0163%2011.9166%2042.27%2012.1703C42.4115%2012.3118%2042.4787%2017.4018%2042.4395%2025.0148L42.3748%2037.6251L38.2498%2037.7723C33.5178%2037.9416%2031.4507%2038.4606%2028.4115%2040.2431C27.4692%2040.7956%2026.5972%2041.1853%2026.474%2041.1091C26.3465%2041.0303%2026.2498%2035.6703%2026.2498%2028.6968V16.4233L27.3123%2015.4416Z%22%20fill=%22black%22/%3E%3C/svg%3E");
    --ui-glyph-sub-f: url("data:image/svg+xml,%3Csvg%20width=%2250%22%20height=%2250%22%20viewBox=%220%200%2050%2050%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M23.4231%2011.1445C23.4231%207.16553%2023.5079%205.51529%2023.7231%205.30004C24.2116%204.81154%2025.7856%204.93378%2026.2981%205.50003C26.7039%205.94828%2027.0681%206.00003%2029.8221%206.00003C31.5114%206.00003%2032.9344%206.08428%2032.9841%206.18753C33.0336%206.29078%2033.0121%207.72503%2032.9364%209.37503L32.7981%2012.375L29.6731%2012.5L26.5481%2012.625L26.4746%2014.593C26.4196%2016.0605%2026.4951%2016.6653%2026.7709%2016.97C26.9744%2017.1948%2027.1761%2017.9403%2027.2194%2018.6268L27.2981%2019.875H28.2981H29.2981L29.4231%2018.5L29.5481%2017.125H31.9231H34.2981V21.1225V25.12L33.5481%2025.25L32.7981%2025.38V27.7525V30.125H35.0481H37.2981L37.4231%2028.25L37.5481%2026.375H40.1731H42.7981V35.625V44.875H36.0481H29.2981L29.1731%2040.6045C29.0501%2036.3985%2029.0376%2036.3203%2028.3476%2035.4168C27.3474%2034.1065%2026.3744%2033.6715%2024.7469%2033.8063C23.3219%2033.9245%2022.4439%2034.418%2021.5636%2035.5953C21.1034%2036.2108%2021.0346%2036.7455%2020.9231%2040.5798L20.7981%2044.875L14.1899%2044.9418C10.5554%2044.9785%207.49487%2044.9218%207.38887%2044.8158C7.05037%2044.4773%206.83612%2027.3798%207.16287%2026.7693C7.43187%2026.2668%207.61062%2026.2373%209.99912%2026.304L12.5481%2026.375L12.6731%2028.25L12.7981%2030.125H15.0481H17.2981V27.7525V25.38L16.5481%2025.2513L15.7981%2025.1225L15.5761%2021.4565C15.4539%2019.4403%2015.4224%2017.6128%2015.5056%2017.3953C15.6284%2017.0758%2016.0846%2017%2017.8846%2017C20.4281%2017%2020.6011%2017.1073%2020.7184%2018.755C20.7966%2019.8533%2020.8151%2019.875%2021.6731%2019.875H22.5481L22.6229%2018.5828C22.6659%2017.8405%2022.8521%2017.1628%2023.0604%2016.9898C23.3574%2016.7433%2023.4231%2015.6838%2023.4231%2011.1445Z%22%20fill=%22black%22/%3E%3C/svg%3E");
}
.ui-subject.sub-a::after { mask-image: var(--ui-glyph-sub-a); -webkit-mask-image: var(--ui-glyph-sub-a); }
.ui-subject.sub-b::after { mask-image: var(--ui-glyph-sub-b); -webkit-mask-image: var(--ui-glyph-sub-b); }
.ui-subject.sub-c::after { mask-image: var(--ui-glyph-sub-c); -webkit-mask-image: var(--ui-glyph-sub-c); }
.ui-subject.sub-d::after { mask-image: var(--ui-glyph-sub-d); -webkit-mask-image: var(--ui-glyph-sub-d); }
.ui-subject.sub-e::after { mask-image: var(--ui-glyph-sub-e); -webkit-mask-image: var(--ui-glyph-sub-e); }
.ui-subject.sub-f::after { mask-image: var(--ui-glyph-sub-f); -webkit-mask-image: var(--ui-glyph-sub-f); }

/* ---- Предметний скоуп ----
   sub-* на КОНТЕЙНЕРІ (сторінка курсу, картка предмета) перемикає локальні
   ролі на колір предмета: усе всередині, що вміє читати --ui-scope-*,
   забарвлюється разом. Так сторінка тримає один колір, не дописуючи sub-*
   кожній кнопці — і не заводячи по шість варіантів на компонент.
   Компоненти читають зі відкатом на акцент, тож поза скоупом нічого не
   змінюється. Текст предмета на власному тінті дає 5.03…6.91 у світлій
   і 4.64…7.21 у темній — уся шістка вище 4.5.
   fill/on-fill/sheen — для залитих плям предмета: бейдж преміуму й
   переливна рамка преміум-картки. */
.sub-a { --ui-scope-tint: var(--ui-subject-a-tint); --ui-scope-tint-hover: var(--ui-subject-a-tint-strong);
    --ui-scope-text: var(--ui-subject-a-text); --ui-scope-fill: var(--ui-subject-a-fill);
    --ui-scope-on-fill: var(--ui-subject-a-on-fill);
    --ui-scope-sheen: var(--ui-subject-a-tint-strong); }
.sub-b { --ui-scope-tint: var(--ui-subject-b-tint); --ui-scope-tint-hover: var(--ui-subject-b-tint-strong);
    --ui-scope-text: var(--ui-subject-b-text); --ui-scope-fill: var(--ui-subject-b-fill);
    --ui-scope-on-fill: var(--ui-subject-b-on-fill);
    --ui-scope-sheen: var(--ui-subject-b-tint-strong); }
.sub-c { --ui-scope-tint: var(--ui-subject-c-tint); --ui-scope-tint-hover: var(--ui-subject-c-tint-strong);
    --ui-scope-text: var(--ui-subject-c-text); --ui-scope-fill: var(--ui-subject-c-fill);
    --ui-scope-on-fill: var(--ui-subject-c-on-fill);
    --ui-scope-sheen: var(--ui-subject-c-tint-strong); }
.sub-d { --ui-scope-tint: var(--ui-subject-d-tint); --ui-scope-tint-hover: var(--ui-subject-d-tint-strong);
    --ui-scope-text: var(--ui-subject-d-text); --ui-scope-fill: var(--ui-subject-d-fill);
    --ui-scope-on-fill: var(--ui-subject-d-on-fill);
    --ui-scope-sheen: var(--ui-subject-d-tint-strong); }
.sub-e { --ui-scope-tint: var(--ui-subject-e-tint); --ui-scope-tint-hover: var(--ui-subject-e-tint-strong);
    --ui-scope-text: var(--ui-subject-e-text); --ui-scope-fill: var(--ui-subject-e-fill);
    --ui-scope-on-fill: var(--ui-subject-e-on-fill);
    --ui-scope-sheen: var(--ui-subject-e-tint-strong); }
.sub-f { --ui-scope-tint: var(--ui-subject-f-tint); --ui-scope-tint-hover: var(--ui-subject-f-tint-strong);
    --ui-scope-text: var(--ui-subject-f-text); --ui-scope-fill: var(--ui-subject-f-fill);
    --ui-scope-on-fill: var(--ui-subject-f-on-fill);
    --ui-scope-sheen: var(--ui-subject-f-tint-strong); }
/* znohub-ui · модалка. Канон: .wr-popup платформи, імена ui-*.
   Розмітка: .ui-modal > .ui-modal-box (.s/.m/.l/.xl; база 480) > .ui-modal-content
   + .ui-modal-close, у кінці .ui-modal-escape */
/* Не-кнопковий тригер модалки (картка товару, картка серії) мусить
   виглядати клікабельним: драйвер уже приймає такі елементи, включно з
   Enter/Space, а курсор лишався типовим і клік був невидимою можливістю. */
[data-modal-open]:not(a):not(button) { cursor: pointer; }
.ui-modal { z-index: 100; position: fixed; inset: 0; width: 100%; height: 100%;
    display: flex; flex-direction: column; overflow-y: auto;
    background: var(--ui-overlay); padding: 16px;
    opacity: 0; pointer-events: none; visibility: hidden;
    transition: opacity 0.24s ease, visibility 0s 0.24s; isolation: isolate; }
.ui-modal.active { opacity: 1; pointer-events: all; visibility: visible; transition: opacity 0.26s ease; }
/* Відкриття: бокс виїжджає знизу вгору й гальмує на місці. Крива —
   ease-out expo: майже весь шлях за перші ~150 мс, далі довге м'яке
   приземлення; тому 0.44s читається не як повільно, а як плавно.
   Пружного довильоту тут немає свідомо: вікно з'їжджає, а не підстрибує.
   Закриття вдвічі коротше і майже прямою кривою — сідає вниз і тане
   разом з оверлеєм, бо чекати на зникнення нема сенсу. */
.ui-modal-box { position: relative; z-index: 1; margin: auto; width: 100%; max-width: 480px;
    opacity: 0; transform: translateY(32px) scale(0.98);
    transition: transform 0.2s cubic-bezier(0.4, 0, 0.7, 0.2), opacity 0.16s ease; }
.ui-modal.active .ui-modal-box { opacity: 1; transform: none;
    transition: transform 0.44s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.3s ease; }
/* На телефоні вікно ширше й ближче до низу екрана — коротший шлях там
   майже не читався б, тож ходу більше. */
@media screen and (max-width: 640px) { .ui-modal-box { transform: translateY(48px) scale(0.98); } }
@media (prefers-reduced-motion: reduce) {
    .ui-modal-box, .ui-modal.active .ui-modal-box { transform: none; transition: opacity 0.15s ease; }
}
.ui-modal-box.s  { max-width: 400px; }
.ui-modal-box.m  { max-width: 560px; }
.ui-modal-box.l  { max-width: 640px; }
.ui-modal-box.xl { max-width: 720px; }
.ui-modal-content { display: flex; flex-direction: column; gap: 24px; padding: 32px;
    border-radius: var(--ui-radius-2xl); background: var(--ui-surface); }
/* Хрестик — привид: без підкладки, проявляється на ховері */
.ui-modal-close { position: absolute; top: 24px; right: 24px; z-index: 2; width: 32px; height: 32px;
    display: flex; align-items: center; justify-content: center; cursor: pointer;
    border: none; padding: 0; font-family: inherit;
    border-radius: var(--ui-radius-pill); background: none; opacity: 0.6; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
.ui-modal-close:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
@media (hover: hover) { .ui-modal-close:hover { opacity: 1; } }
.ui-modal-close::before { content: ""; width: 16px; height: 16px; background: var(--ui-text-primary);
    mask: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.6663 3.33301L3.33301 12.6663M3.33301 3.33301L12.6663 12.6663' stroke='black' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.6663 3.33301L3.33301 12.6663M3.33301 3.33301L12.6663 12.6663' stroke='black' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain; }
/* Гап 6: заголовок 20/26 і підпис 14/20 — різні за вагою рядки, при 4 вони
   читались одним абзацом; більше за 6 текстова пара вже розсипається на два
   окремі блоки. Медальйон свій відступ має власний — він не рядок тексту. */
.ui-modal-head { display: flex; flex-direction: column; gap: 6px; padding-right: 36px; }
.ui-modal-head > p { color: var(--ui-text-primary); font-size: 20px; font-weight: 700; line-height: 26px; letter-spacing: -0.4px; }
.ui-modal-head > span { color: var(--ui-text-secondary); font-size: 14px; font-weight: 400; line-height: 20px; }
/* .row — шапка з іконкою збоку (вікно серії): слот ліворуч, текст праворуч.
   Базова шапка лишається колонкою: заголовок над підзаголовком. */
/* .center — шапка по центру, на всю ширину: під медальйоном заголовок
   стоїть нижче хрестика, і місце під нього різати нема потреби. */
.ui-modal-head.center { align-items: center; text-align: center; padding: 0; }
/* Виняток — центрована шапка без медальйона: там заголовок стоїть якраз на
   висоті хрестика, тож місце під нього ріже САМ заголовок, і з обох боків —
   інакше текст поїхав би ліворуч від справжньої середини на пів відстані.
   Підзаголовок цього відступу не отримує: він уже нижчий за хрестик, а з
   ним у вузькому вікні (.s — 400) фраза ламалась на рівному місці. */
.ui-modal-head.center:not(:has(> .ui-modal-icon)) > p { padding: 0 36px; }
/* ...і не ріже його, коли над шапкою стоїть ілюстрація: заголовок і так
   нижчий за хрестик, рівно як із медальйоном (канон market-purchase). */
.ui-modal-media + .ui-modal-head.center > p { padding: 0; }
.ui-modal-head.row { flex-direction: row; align-items: center; gap: 16px; }
.ui-modal-head-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.ui-modal-head-text > p { color: var(--ui-text-primary); font-size: 20px; font-weight: 700;
    line-height: 26px; letter-spacing: -0.4px; }
.ui-modal-head-text > span { color: var(--ui-text-secondary); font-size: 14px;
    font-weight: 400; line-height: 20px; }
/* Блоки в модалці стоять просторіше за картки в списку: там 6px тримають
   стрічку однорідних рядків, а тут два утоплені блоки на світлій поверхні
   з 6px злилися б в один. Глобальний гап .ui-cards не чіпаємо — на нього
   спирається дюжина екранів.
   Мінімум колонки — 240 (те саме значення, що в .grid.m). Саму .m тут НЕ
   вживаємо навмисно: на ≤640px вона падає до 140px, бо розрахована на дрібні
   плитки (досягнення, маркет). Текстовий блок на 140px нечитабельний, тож у
   модалці колонка лишається 240 і на вузькому вони стають одна під одну. */
.ui-modal-content > .ui-cards { gap: 12px; }
.ui-modal-content > .ui-cards.grid { --ui-grid-min: 240px; }
/* Відео пояснення у вікні: 16:9 на всю ширину вмісту. Доти iframe брав
   розміри з легасі .explanation-question, і поза нею лишався 300×150. */
.ui-modal-video { display: block; width: 100%; aspect-ratio: 16 / 9; border: 0;
    border-radius: var(--ui-radius-l); background: var(--ui-surface-sunken); }
/* Рядок помилки у вікні: дія не пройшла, але вікно лишається відкритим.
   Окремий слот, бо це не підзаголовок — він у шапці й описує саму дію, а це
   відповідь сервера. Колір — роль danger, як у помилки під полем. */
.ui-modal-error { color: var(--ui-text-danger); font-size: 14px; font-weight: 400;
    line-height: 20px; text-align: center; }
/* Ціна у вікні стоїть по центру колонки: .ui-price — inline-flex, а колонка
   вмісту тягне його на всю ширину, і число сідало ліворуч під центрованим
   заголовком. */
.ui-modal-content > .ui-price { align-self: center; }
/* Тиха примітка під вмістом: пояснює, ЧОМУ дії немає (товар лише в іншому
   місці, зараз нема що продовжувати). Пара до .ui-modal-error, але це не
   помилка користувача, тож роль тексту вторинна, а не danger. */
.ui-modal-note { color: var(--ui-text-secondary); font-size: 13px; font-weight: 400;
    line-height: 18px; text-align: center; }
.ui-modal-action { display: flex; gap: 12px; }
.ui-modal-action > .ui-btn { flex: 1; }
.ui-modal-escape { position: absolute; inset: 0; z-index: 0; cursor: pointer; }
@media screen and (max-width: 640px) {
    /* На телефоні вікно майже на всю ширину екрана, і 32 там читаються як
       завал кутів: радіус на щабель менший. */
    /* Поле навколо вікна: на телефоні воно з'їдало ширину, якої й так мало. */
    .ui-modal { padding: 8px; }
    .ui-modal-content { padding: 20px; gap: 16px; border-radius: var(--ui-radius-xl); }
    /* Хрестик іде за падингом вмісту: на телефоні той 20, тож 24 лишали б
       його висіти надто далеко від кута. */
    .ui-modal-close { top: 16px; right: 16px; }
}

/* Модалка, керована ззовні через style.display (legacy JS: display none↔flex/block).
   Класу .active вона не отримує ніколи, тож базові стани мусить перебити
   сама: opacity 1 і на оверлеї, і на боксі — інакше з'являлось саме
   затемнення, а вміст лишався невидимим.
   Анімацію дає @starting-style: він каже, З ЧОГО почати, коли елемент лише
   стає видимим, а це рівно момент, коли JS міняє display. Без нього перехід
   не запускався взагалі — з display: none анімувати нема від чого, і ці
   модалки з'являлись ривком, поки решта кіта плавно виїжджала.
   display у списку переходу з allow-discrete — щоб і закриття встигало
   згаснути, а не зникало кадром. */
.ui-modal.jsdriven { opacity: 1; pointer-events: all; visibility: visible;
    transition: opacity 0.26s var(--ui-ease), display 0.26s allow-discrete; }
@starting-style { .ui-modal.jsdriven { opacity: 0; } }
.ui-modal.jsdriven .ui-modal-box { opacity: 1; transform: none; margin: auto;
    transition: transform 0.44s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.3s ease; }
@starting-style {
    .ui-modal.jsdriven .ui-modal-box { opacity: 0; transform: translateY(32px) scale(0.98); }
}
@media (prefers-reduced-motion: reduce) {
    .ui-modal.jsdriven .ui-modal-box { transition: opacity 0.15s ease; }
    @starting-style { .ui-modal.jsdriven .ui-modal-box { transform: none; } }
}
/* Хуки старої системи на нових модалках: legacy style.css вантажиться
   пізніше і при рівній специфічності перебивав kit — скидаємо ПОВНІСТЮ */
.ui-modal .close-modal { position: absolute; top: 16px; right: 16px; width: 32px; height: 32px;
    background: none; background-image: none; opacity: 0.6;
    border: none; font-size: 0; }
/* modal-wrapper на клік-зоні: легасі робив її fixed z-999 ПОВЕРХ вмісту —
   кліки по модалці закривали її, відео не запускалось */
.ui-modal .modal-wrapper { position: absolute; inset: 0; z-index: 0; background: none; }

/* ---- Слоти модалок (патерни платформи) ---- */
/* Текстове підтвердження без head */
.ui-modal-text { display: flex; flex-direction: column; gap: 4px; text-align: center; }
.ui-modal-text > p { color: var(--ui-text-primary); font-size: 17px; font-weight: 700; line-height: 23px; }
.ui-modal-text > span { color: var(--ui-text-secondary); font-size: 14px; line-height: 20px; }
/* Медіа/ілюстрація над текстом (канон market-purchase) */
.ui-modal-media { display: flex; justify-content: center; }
.ui-modal-media > img { max-width: 200px; max-height: 140px; object-fit: contain; }
/* Прогрес-крапки майстра (канон onboarding; дві самописні реалізації на платформі) */
.ui-steps-progress { display: flex; justify-content: center; gap: 8px; }
/* Активна крапка розтягується в пігулку — тут ширина й радіус анімуються
   свідомо, тому дописані до спільного переліку. */
.ui-steps-progress > i { width: 8px; height: 8px; border-radius: 50%;
    background: var(--ui-border-subtle);
    transition-property: var(--ui-transition-props), width, border-radius; transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
.ui-steps-progress > i.active { width: 24px; border-radius: var(--ui-radius-pill);
    background: var(--ui-fill-accent); }
.ui-steps-progress > i.done { background: var(--ui-fill-accent); opacity: 0.4; }
/* Список переваг (канон premium-list) — придатний і поза модалками */
.ui-feature-list { display: flex; flex-direction: column; gap: 14px; }
.ui-feature-list > li { display: flex; align-items: flex-start; gap: 12px; list-style: none; }
/* 1px згори — оптичне вирівнювання ГОЛОГО гліфа з першим рядком тексту.
   Селектор саме на прямого нащадка <li>: усередині медальйона (.rows) гліф
   центрує флекс кружка, і той самий піксель зсував би його з центру. */
.ui-feature-list > li > .ui-icon { margin-top: 1px; }
.ui-feature-list .ui-icon::before { background: var(--ui-text-accent); }
.ui-feature-list b { display: block; color: var(--ui-text-primary); font-size: 14px; font-weight: 700; line-height: 20px; }
.ui-feature-list span { color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; }
/* .cards — пункти як кольорові картки: тінт підкладкою, іконка кольором
   ролі. Колір бере sub-a…f на самому <li>; це ті самі шість ролей, що й у
   предметів, — інших шести відтінків кит не тримає, і заводити другу
   шістку означало б два джерела правди на ті самі кольори. Без sub-*
   картка сіра (--ui-surface-sunken), як рядок списку.
   Шрифт на щабель менший за базовий перелік: у картці текст іде з падингом
   і підкладкою, тож 14/13 читалися б важче, ніж 13/12 без них. */
.ui-feature-list.cards { gap: 6px; }
/* У картці іконка стоїть у рядку заголовка, а опис іде на всю ширину: під
   іконкою лишався б порожній стовпчик завширшки з неї, і абзац читався б
   вужчим, ніж є картка. Сітку задаємо на самому <li>, а обгортку тексту
   розчиняємо через display: contents — так заголовок і опис стають
   елементами цієї ж сітки, і розмітка лишається тією самою, що в базового
   переліку (li > іконка + div(b, span)). */
.ui-feature-list.cards > li { display: grid; grid-template-columns: auto 1fr;
    align-items: center; gap: 2px 8px; padding: 10px 12px;
    border-radius: var(--ui-radius-m); background: var(--ui-surface-sunken); }
.ui-feature-list.cards > li > div { display: contents; }
.ui-feature-list.cards > li > .ui-icon { grid-area: 1 / 1; }
.ui-feature-list.cards b { grid-area: 1 / 2; }
.ui-feature-list.cards > li > div > span { grid-area: 2 / 1 / 3 / 3; }
/* .two — картки у дві колонки. На телефоні колонка одна: 160px під абзац
   ріжуть його на слова по рядку. */
.ui-feature-list.cards.two { display: grid; grid-template-columns: 1fr 1fr; }
@media screen and (max-width: 640px) { .ui-feature-list.cards.two { grid-template-columns: 1fr; } }
.ui-feature-list.cards b { font-size: 13px; line-height: 18px; }
.ui-feature-list.cards span { font-size: 12px; line-height: 16px; }
.ui-feature-list.cards .ui-icon { width: 18px; height: 18px; margin-top: 0; }
.ui-feature-list.cards > li.sub-a { background: var(--ui-subject-a-tint); }
.ui-feature-list.cards > li.sub-b { background: var(--ui-subject-b-tint); }
.ui-feature-list.cards > li.sub-c { background: var(--ui-subject-c-tint); }
.ui-feature-list.cards > li.sub-d { background: var(--ui-subject-d-tint); }
.ui-feature-list.cards > li.sub-e { background: var(--ui-subject-e-tint); }
.ui-feature-list.cards > li.sub-f { background: var(--ui-subject-f-tint); }
.ui-feature-list.cards > li.sub-a > .ui-icon::before { background: var(--ui-subject-a-text); }
.ui-feature-list.cards > li.sub-b > .ui-icon::before { background: var(--ui-subject-b-text); }
.ui-feature-list.cards > li.sub-c > .ui-icon::before { background: var(--ui-subject-c-text); }
.ui-feature-list.cards > li.sub-d > .ui-icon::before { background: var(--ui-subject-d-text); }
.ui-feature-list.cards > li.sub-e > .ui-icon::before { background: var(--ui-subject-e-text); }
.ui-feature-list.cards > li.sub-f > .ui-icon::before { background: var(--ui-subject-f-text); }

/* .rows — пункти з медальйоном і роздільниками: іконка в кружку-тінті,
   заголовок на щабель крупніший за базовий, між пунктами волосінь. Плашок
   немає — колір тут лише в медальйоні, тож перелік читається спокійніше за
   .cards і годиться там, де пунктів мало, а важить кожен (апсел, онбординг).

   Кружок — це .ui-modal-icon, той самий медальйон, що над заголовком вікна:
   у .ui-icon маска гліфа стоїть на самому елементі, тож його власний фон
   обрізається в форму гліфа і кружка з нього не зробиш. Тому в цьому
   варіанті іконка загорнута:
   <li><span class="ui-modal-icon"><span class="ui-icon i-…"></span></span><div>…</div></li> */
.ui-feature-list.rows { gap: 0; }
.ui-feature-list.rows > li { align-items: flex-start; gap: 12px; padding: 14px 0; }
.ui-feature-list.rows > li + li { border-top: 1px solid var(--ui-border-subtle); }
/* Медальйон піднятий на 4px: рядок вирівняний по верху, і без зсуву кружок
   став би врівень із верхньою межею тексту, а не по центру рядка заголовка
   (32 проти 22 — різниця якраз близько 4px згори). Зсув трансформом, а не
   відступом, — щоб не міняти висоту рядка й не зсувати роздільники. */
.ui-feature-list.rows > li > .ui-modal-icon { flex: none; margin: 0; width: 32px; height: 32px;
    transform: translateY(-4px); }
.ui-feature-list.rows > li > .ui-modal-icon > .ui-icon,
/* .ui-coin — картинка, а не маска (коін фірмово синій і має власні
   відтінки), тож розмір їй ставимо тут же, щоб у рядку вона була така
   сама, як гліфи сусідів. */
.ui-feature-list.rows > li > .ui-modal-icon > .ui-coin { width: 20px; height: 20px; }
.ui-feature-list.rows b { font-size: 15px; line-height: 22px; }
.ui-feature-list.rows span { font-size: 13px; line-height: 18px; }
/* Колір медальйона — та сама роль sub-a…f, що й у карток; без неї кружок
   акцентний. Гліф бере текстовий щабель ролі, а не заливку: на тінті
   заливка 500 не дотягує до контрасту. */
.ui-feature-list.rows > li.sub-a > .ui-modal-icon { background: var(--ui-subject-a-tint); }
.ui-feature-list.rows > li.sub-b > .ui-modal-icon { background: var(--ui-subject-b-tint); }
.ui-feature-list.rows > li.sub-c > .ui-modal-icon { background: var(--ui-subject-c-tint); }
.ui-feature-list.rows > li.sub-d > .ui-modal-icon { background: var(--ui-subject-d-tint); }
.ui-feature-list.rows > li.sub-e > .ui-modal-icon { background: var(--ui-subject-e-tint); }
.ui-feature-list.rows > li.sub-f > .ui-modal-icon { background: var(--ui-subject-f-tint); }
.ui-feature-list.rows > li.sub-a > .ui-modal-icon > .ui-icon::before { background: var(--ui-subject-a-text); }
.ui-feature-list.rows > li.sub-b > .ui-modal-icon > .ui-icon::before { background: var(--ui-subject-b-text); }
.ui-feature-list.rows > li.sub-c > .ui-modal-icon > .ui-icon::before { background: var(--ui-subject-c-text); }
.ui-feature-list.rows > li.sub-d > .ui-modal-icon > .ui-icon::before { background: var(--ui-subject-d-text); }
.ui-feature-list.rows > li.sub-e > .ui-modal-icon > .ui-icon::before { background: var(--ui-subject-e-text); }
.ui-feature-list.rows > li.sub-f > .ui-modal-icon > .ui-icon::before { background: var(--ui-subject-f-text); }
@media screen and (max-width: 640px) {
    .ui-feature-list.rows > li { padding: 12px 0; }
}

/* Мітка в заголовку пункту (корона «лише на Преміумі»): менша за текст і в
   акценті — це позначка, а не друга іконка пункту. Inline-block, а не flex
   базового .ui-icon: у блоковому <b> флекс-іконка падала б під заголовок,
   а так вона стоїть у рядку, як гліф. */
.ui-feature-list b > .ui-icon { display: inline-block; width: 14px; height: 14px;
    margin-left: 6px; vertical-align: -2px; }
.ui-feature-list b > .ui-icon::before { background: var(--ui-text-accent); }
/* .dots — пункти без власної іконки: маркер списку замість гліфа. Для
   переліків, де рядки рівнозначні й іконка нічого не додає (правила ліги).
   7px згори — щоб крапка стала на оптичну середину першого рядка 13/18. */
.ui-feature-list.dots > li::before { content: ""; flex: none; width: 4px; height: 4px;
    margin-top: 7px; border-radius: 50%; background: var(--ui-text-muted);
    /* Зсув трансформом, а не відступом: крапка відходить від краю, але
       не рухає за собою текст і не змінює ширину рядка */
    transform: translateX(5px); }
/* Іконка-медальйон над заголовком (підтвердження, попередження) */
.ui-modal-icon { display: flex; align-items: center; justify-content: center;
    width: 48px; height: 48px; border-radius: 50%; background: var(--ui-tint-accent);
    margin: 0 auto; }
.ui-modal-icon > .ui-icon { width: 24px; height: 24px; }
.ui-modal-icon > .ui-icon::before { background: var(--ui-text-accent); }
/* .l — більший медальйон для діалогів, де він єдина картинка вікна:
   на 48 гліф губиться поруч із заголовком 20/26. Гліф росте разом із колом,
   пропорція та сама (половина діаметра). */
.ui-modal-icon.l { width: 64px; height: 64px; }
/* Медальйон у шапці — окремий блок, а не рядок тексту: з однаковим кроком 8
   він читався як частина заголовка. Тому власний відступ знизу, і крок між
   заголовком та підписом лишається тісним. */
.ui-modal-head > .ui-modal-icon { margin: 0 auto 8px; }
.ui-modal-icon.l > .ui-icon { width: 36px; height: 36px; }
/* .premium — корона «сідає на місце»: медальйон вискакує з пружиною, гліф
   при цьому хитається, як вінець, що лягає на голову, і слідом один раз
   розходиться німб. Ключове — анімація висить на .active, а не на самому
   медальйоні: інакше вона програлась би у ще прихованому вікні й до першого
   показу вже скінчилась. Так вона щоразу починається з відкриттям. */
@keyframes ui-crown-in {
    0%   { transform: scale(0.4); opacity: 0; }
    55%  { transform: scale(1.12); opacity: 1; }
    75%  { transform: scale(0.96); }
    100% { transform: scale(1); }
}
@keyframes ui-crown-tilt {
    0%   { transform: rotate(-16deg); }
    45%  { transform: rotate(7deg); }
    70%  { transform: rotate(-3deg); }
    100% { transform: rotate(0); }
}
/* Німб — spread тіні тим самим тінтом: розходиться і тане. Окремого вузла
   не треба, а тінь не впливає на розкладку сусідів. */
@keyframes ui-crown-halo {
    0%   { box-shadow: 0 0 0 0 var(--ui-tint-accent); }
    70%  { box-shadow: 0 0 0 16px rgba(0, 0, 0, 0); }
    100% { box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); }
}
.ui-modal-icon.premium { position: relative; width: 56px; height: 56px; }
.ui-modal-icon.premium > .ui-icon { width: 28px; height: 28px; }
/* Контур — той самий преміумний проблиск, що в .ui-card.premium і шапці
   курсу (card.css): вузька смуга з гарячою серцевиною їде вздовж рамки,
   маска з composite: exclude лишає від градієнта тільки обідок. Тут та сама
   механіка на колі — щоб медальйон у вікні світився так само, як картка,
   з якої учень сюди прийшов. Кейфрейми спільні, ui-premium-sheen. */
.ui-modal-icon.premium::before {
    content: ""; position: absolute; inset: -1px; z-index: 1; pointer-events: none;
    border-radius: 50%; padding: 2px;
    background: linear-gradient(90deg,
        transparent 0%,
        var(--ui-sheen-color) 44%,
        var(--ui-fill-accent) 50%,
        var(--ui-sheen-color) 56%,
        transparent 100%);
    background-size: 300% 100%;
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
    mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    mask-composite: exclude; }
.ui-modal.active .ui-modal-icon.premium {
    animation: ui-crown-in 0.5s cubic-bezier(0.2, 0.9, 0.3, 1.2) both,
               ui-crown-halo 1.5s ease-out 0.3s; }
/* Переливання — лише у відкритому вікні: інакше воно тихо мололо б кадри
   в кожному прихованому вікні сторінки. */
.ui-modal.active .ui-modal-icon.premium::before {
    animation: ui-premium-sheen 5s linear infinite; }
.ui-modal.active .ui-modal-icon.premium > .ui-icon {
    animation: ui-crown-tilt 0.7s cubic-bezier(0.2, 0.9, 0.3, 1.2) 0.1s both; }
@media (prefers-reduced-motion: reduce) {
    .ui-modal.active .ui-modal-icon.premium,
    .ui-modal.active .ui-modal-icon.premium::before,
    .ui-modal.active .ui-modal-icon.premium > .ui-icon { animation: none; }
    /* Контур лишається, просто не переливається — як у .ui-card.premium */
    .ui-modal.active .ui-modal-icon.premium::before { background-position: 50% 0; }
}
.ui-modal-icon.danger { background: var(--ui-tint-danger); }
.ui-modal-icon.danger > .ui-icon::before { background: var(--ui-text-danger); }
.ui-modal-icon.success { background: var(--ui-tint-success); }
.ui-modal-icon.success > .ui-icon::before { background: var(--ui-text-success); }
/* znohub-ui · карусель: горизонтальні сторінки з прилипанням.

   Сторінка (.ui-carousel-item) завжди на всю ширину доріжки, а що покласти
   всередину — пару карток, один рядок, ілюстрацію — вирішує сторінка.
   Карусель не диктує розкладку вмісту, лише гортає.

   Скрол лишається нативним: пальцем і трекпадом гортається без драйвера,
   він лише малює крапки і веде стрілки. Тому карусель працює і тоді, коли
   JS не встиг ініціалізуватись. */
.ui-carousel { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.ui-carousel-track { display: flex; gap: 16px; min-width: 0; overflow-x: auto;
    scroll-snap-type: x mandatory; scroll-behavior: smooth; scrollbar-width: none; }
.ui-carousel-track::-webkit-scrollbar { display: none; }
.ui-carousel-item { flex: 0 0 100%; min-width: 0; scroll-snap-align: start; }

/* Ряд керування: стрілки по краях, крапки посередині */
.ui-carousel-nav { display: flex; align-items: center; justify-content: center; gap: 16px; }
.ui-carousel-arrow { display: flex; align-items: center; justify-content: center; flex: none;
    width: 32px; height: 32px; padding: 0; border: none; cursor: pointer;
    border-radius: var(--ui-radius-pill); background: var(--ui-surface-sunken);
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
.ui-carousel-arrow > .ui-icon { width: 18px; height: 18px; }
.ui-carousel-arrow > .ui-icon::before { background: var(--ui-text-primary); }
@media (hover: hover) { .ui-carousel-arrow:hover { background: var(--ui-surface-sunken-hover); } }
.ui-carousel-arrow:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
/* На краю стрічки стрілка гасне, але лишається в потоці: якби вона
   зникала, ряд крапок стрибав би вбік на першій і останній сторінці. */
.ui-carousel-arrow[disabled] { opacity: 0.3; cursor: default; }

.ui-carousel-dots { display: flex; align-items: center; justify-content: center; gap: 6px; }
.ui-carousel-dots > button { flex: none; width: 8px; height: 8px; padding: 0; border: none;
    border-radius: 50%; background: var(--ui-border-subtle); cursor: pointer;
    transition-property: var(--ui-transition-props), width, border-radius;
    transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
.ui-carousel-dots > button.active { width: 20px; border-radius: var(--ui-radius-pill);
    background: var(--ui-fill-accent); }
.ui-carousel-dots > button:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 3px; }

@media (prefers-reduced-motion: reduce) { .ui-carousel-track { scroll-behavior: auto; } }
/* znohub-ui · урок курсу і блок уроків. Канон: .wr-course-lesson та
   .wr-group-lesson платформи.

   Розмітка уроку — ОДНЕ посилання на весь рядок:
   <a class="ui-lesson" href="…">
     <span class="ui-lesson-slot"><span class="ui-lesson-mark" style="--value: 62">
       <svg class="ui-lesson-ring" viewBox="0 0 48 48" aria-hidden="true"><circle cx="24" cy="24" r="22"/></svg>
       91
     </span></span>
     <span class="ui-lesson-text">
       <span class="ui-lesson-meta"><span class="ui-icon i-time-bold"></span>30.05.27 15:30</span>
       <b>Практичний урок</b>
     </span>
     <span class="ui-btn secondary l ui-lesson-go"><p>Перейти до уроку</p><span class="ui-icon i-chevron-right"></span></span>
   </a>
   Дія — кнопка кіта на span (посилання в посиланні невалідне, а веде воно
   туди ж), тож картка клікабельна цілком. На телефоні від неї лишається
   сама стрілка — рядок тримається в один поверх.

   Колір бере зі скоупа предмета (.sub-a…f вище по дереву), як і решта
   компонентів; поза скоупом — акцент. */
.ui-lessons { display: flex; flex-direction: column; gap: 8px; }

.ui-lesson { display: flex; align-items: center; gap: 16px; padding: 24px;
    border-radius: var(--ui-radius-xl); background: var(--ui-surface);
    border: 1px solid var(--ui-border-card); box-shadow: var(--ui-shadow-card);
    text-decoration: none; color: inherit;
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
/* Ховер: картка підводиться на піксель. Рух робимо трансформом, а не
   відступом — він не чіпає розкладку, тож сусідні картки не смикаються. */
@media (hover: hover) {
    .ui-lesson:hover { box-shadow: var(--ui-shadow-card-hover); transform: translateY(-1px); }
}
.ui-lesson:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }

/* Медальйон із кільцем прогресу. Кільце — conic-gradient за --value, без
   svg: значення й так приходить інлайновою змінною, а svg на кожен урок —
   це шість зайвих вузлів у стрічці, де уроків буває під сотню.
   Маска лишає від градієнта тільки обідок; 0% дає порожнє кільце само,
   без окремого стану. */
/* Слот тримає розкладку на 48, а сам медальйон на 52 — тобто виступає по
   два пікселі за слот. Так кільце прогресу малюється НАВКОЛО кружка, а не
   по його краю, і при цьому не розсуває рядок: місце в потоці рахується
   по слоту. */
.ui-lesson-slot { flex: none; display: flex; align-items: center; justify-content: center;
    width: 48px; height: 48px; }
.ui-lesson-mark { position: relative; flex: none; display: flex; align-items: center;
    justify-content: center; width: 52px; height: 52px; border-radius: 50%;
    background: var(--ui-lesson-mark-bg, var(--ui-scope-tint, var(--ui-tint-accent)));
    color: var(--ui-lesson-mark-ink, var(--ui-scope-text, var(--ui-text-accent)));
    font-size: var(--ui-lesson-mark-size, 20px); font-weight: 700; line-height: 1;
    letter-spacing: -0.02em; }
/* Кільце гаситься теж змінною, а не окремим селектором: тоді .done і .locked
   лишаються сильнішими за варіант і не залежать від порядку правил. */
/* Кільце — svg, а не conic-gradient: конічному градієнту не можна дати
   круглі торці, і дуга обривалась різаним кутом. Три вузли на урок це
   ціна за те, щоб прогрес виглядав як прогрес.
   viewBox 48 при r=22 і товщині 3 лишає обідок усередині кола; на 40px
   медальйоні svg масштабується разом із ним, тож товщина сама сідає на 2.5.
   Довжина кола 2πr = 138.23 — звідси dasharray. */
.ui-lesson-ring { position: absolute; inset: 0; width: 100%; height: 100%;
    display: var(--ui-lesson-mark-ring, block); transform: rotate(-90deg);
    pointer-events: none; }
.ui-lesson-ring > circle { fill: none; stroke-width: 3; stroke-linecap: round;
    stroke: var(--ui-scope-fill, var(--ui-fill-accent));
    stroke-dasharray: 138.23;
    stroke-dashoffset: calc(138.23px - 138.23px * var(--value, 0) / 100);
    transition: stroke-dashoffset 0.3s ease; }
.ui-lesson-mark > .ui-icon { width: 20px; height: 20px; }
.ui-lesson-mark > .ui-icon::before { background: var(--ui-lesson-mark-ink, var(--ui-scope-text, var(--ui-text-accent))); }
/* Пройдений урок: медальйон заливається, кільце зайве — воно вже 100%. */
.ui-lesson.done > .ui-lesson-mark { background: var(--ui-scope-fill, var(--ui-fill-accent));
    color: var(--ui-scope-on-fill, var(--ui-text-on-accent)); }
.ui-lesson.done > .ui-lesson-mark > .ui-lesson-ring { display: none; }
.ui-lesson.done > .ui-lesson-mark > .ui-icon::before { background: var(--ui-scope-on-fill, var(--ui-text-on-accent)); }
/* Ще не відкритий: медальйон тихий, сірий — колір предмета тут нічого не
   позначає, бо позначати ще нічого. */
.ui-lesson.locked > .ui-lesson-mark { background: var(--ui-surface-sunken); color: var(--ui-text-muted); }
.ui-lesson.locked > .ui-lesson-mark > .ui-lesson-ring { display: none; }
.ui-lesson.locked > .ui-lesson-mark > .ui-icon::before { background: var(--ui-text-muted); }

/* Залите коло з великою цифрою — коли в стрічці немає прогресу взагалі й
   медальйон лише НУМЕРУЄ урок (програма курсу, розклад). Клас на списку, а
   не на рядку: залите коло серед кілець читалося б як «пройдено», тому
   змішувати два види в одному переліку не можна. Одиничний .ui-lesson.numbered
   лишаємо для рядка, що стоїть сам.
   У такій стрічці пройдений урок позначають галкою в медальйоні
   (<span class="ui-icon i-tick">), бо заливкою його вже не відрізнити. */
.ui-lessons.numbered,
.ui-lesson-group-body.numbered,
.ui-lesson.numbered {
    --ui-lesson-mark-bg: var(--ui-scope-fill, var(--ui-fill-accent));
    --ui-lesson-mark-ink: var(--ui-scope-on-fill, var(--ui-text-on-accent));
    --ui-lesson-mark-size: 24px;
    --ui-lesson-mark-ring: none; }

.ui-lesson-text { display: flex; flex-direction: column; gap: 4px; flex: 1; min-width: 0; }
.ui-lesson-text > b { color: var(--ui-text-primary); font-size: 20px; font-weight: 700;
    line-height: 26px; letter-spacing: -0.4px; }
/* Фіксовані 20px, а не висота за вмістом: у рядку стоїть плашка коїнів на
   18, і рядки з нею та без неї розходились на два пікселі — у списку з
   сорока уроків це видно як збите вирівнювання. */
.ui-lesson-meta { display: flex; align-items: center; gap: 6px; height: 20px;
    color: var(--ui-text-muted); font-size: 13px; line-height: 18px; }
.ui-lesson-meta > .ui-icon { width: 14px; height: 14px; }
.ui-lesson-meta > .ui-icon::before { background: var(--ui-text-muted); }

/* Дія праворуч — кнопка кіта (.ui-btn): вона вже вміє ховер і натискання
   (тінт густішає, кнопка сідає на піксель), тож свого фону тут немає —
   він перекривав би ці стани. .ui-lesson-go лишається міткою місця: по
   ній ловиться мобільна поведінка й вирівнювання в рядку.
   Це span, а не button: посилання в посиланні невалідне, а картка вже є
   посиланням — стани :hover/:active працюють на будь-якому елементі. */
.ui-lesson-go { flex: none; }

/* ===== Блок уроків ===== */
.ui-lesson-group { display: flex; flex-direction: column; border-radius: var(--ui-radius-xl);
    background: var(--ui-surface); border: 1px solid var(--ui-border-card);
    box-shadow: var(--ui-shadow-card); overflow: hidden; }
/* Шапка без ховер-заливки: вона на всю ширину блоку, і підсвітка такої
   смуги читалась як зміна стану самого блоку, а не як «сюди можна тиснути».
   Клікабельність показує курсор і шеврон. */
.ui-lesson-group-head { display: flex; align-items: center; gap: 12px; width: 100%;
    padding: 24px; border: none; background: none; cursor: pointer; text-align: left;
    font-family: inherit;
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
.ui-lesson-group-head:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: -2px; }
.ui-lesson-group-icon { flex: none; width: 48px; height: 48px; border-radius: var(--ui-radius-m);
    object-fit: contain; }
.ui-lesson-group-title { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }
.ui-lesson-group-title > b { color: var(--ui-text-primary); font-size: 20px; font-weight: 700;
    line-height: 26px; letter-spacing: -0.4px; }
.ui-lesson-group-title > span { color: var(--ui-text-muted); font-size: 13px; line-height: 18px; }
/* Шеврон повертається станом .active, а не двома іконками в розмітці. */
.ui-lesson-group-head > .ui-icon { flex: none; width: 20px; height: 20px;
    transition-property: transform; transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
.ui-lesson-group.active .ui-lesson-group-head > .ui-icon { transform: rotate(180deg); }
/* Тіло блоку тримає рівно два види вмісту: список уроків і плашки тестів.
   Гап 8 розсуває саме їх — а рядки всередині списку лишаються щільними,
   бо список це власний контейнер із власним (нульовим) гапом. Без нього
   гап розліз би й між уроками, і волосінь між ними стала б зайвою. */
.ui-lesson-group-body { display: none; flex-direction: column; gap: 8px;
    padding: 0 12px 12px; }
.ui-lesson-group.active > .ui-lesson-group-body { display: flex; }
.ui-lesson-list { display: flex; flex-direction: column; }

/* ===== Урок усередині блоку =====
   Окремий компонент, а не варіант .ui-lesson: у блоці номер нічого не
   міряє — прогрес там живе на рівні самого блоку, — тож медальйон менший
   і без кільця. Власної картки теж немає: коробку дає блок, а рядки
   розділяє волосінь; картка в картці дала б подвійну рамку.
   Текст, мета й коло дії спільні з .ui-lesson — це ті самі шматки.
   <a class="ui-lesson-item" href="…">
     <span class="ui-lesson-item-mark">51</span>
     <span class="ui-lesson-text">…</span>
     <span class="ui-btn secondary icon s ui-lesson-go">…</span>
   </a> */
.ui-lesson-item { display: flex; align-items: center; gap: 12px; padding: 16px 20px;
    border-radius: var(--ui-radius-m); text-decoration: none; color: inherit;
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
/* Перегородка — окремий вузол, а не border-top на пункті: межа малюється
   по краю коробки, тобто пролазить під падинг і не збігається з текстом.
   Лінія ж має власні поля, ті самі 20, що й падинг пункту. */
.ui-lesson-line { flex: none; height: 1px; margin: 0 20px;
    background: var(--ui-border-subtle);
    transition-property: opacity; transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
/* Під курсором пункт «виймається» зі списку: обидві його перегородки
   гаснуть, і підсвічена смуга читається як цілий рядок, а не як шматок
   між лініями. Гасимо прозорістю, а не display — інакше зникнення 1px
   зсувало б усе, що нижче. Верхню лінію дістаємо через :has(+ …):
   попереднього сусіда інакше не вибрати. */
@media (hover: hover) {
    .ui-lesson-item:hover + .ui-lesson-line,
    .ui-lesson-line:has(+ .ui-lesson-item:hover) { opacity: 0; }
}
/* Ховер рядка — світлий тінт предмета, а не сірий: колір у скоупі вже є,
   і сірим він гасив би те, чим предмет позначений. 8% замість готового
   тінту 16%: на 16 фон зрівнявся б із медальйоном, і той зник би в рядку. */
@media (hover: hover) {
    .ui-lesson-item:hover {
        background: color-mix(in srgb, var(--ui-scope-fill, var(--ui-fill-accent)) 8%, transparent); }
    /* Медальйон і кнопка заливаються чистим кольором предмета — рядок під
       курсором читається як один вибраний об'єкт, а не як три окремі плями.
       Селектор із .ui-btn, щоб перебити власний ховер кнопки вагою, а не
       порядком правил; натискання лишається — воно додає яскравість і зсув,
       яких тут немає. Закритий урок не заливаємо: йому нікуди вести. */
    .ui-lesson-item:not(.locked):hover > .ui-lesson-item-mark,
    .ui-lesson-item:not(.locked):hover > .ui-btn.ui-lesson-go {
        background: var(--ui-scope-fill, var(--ui-fill-accent));
        color: var(--ui-scope-on-fill, var(--ui-text-on-accent)); }
}
.ui-lesson-item:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: -2px; }
.ui-lesson-item-mark { flex: none; display: flex; align-items: center; justify-content: center;
    width: 32px; height: 32px; border-radius: 50%;
    background: var(--ui-scope-tint, var(--ui-tint-accent));
    color: var(--ui-scope-text, var(--ui-text-accent));
    font-size: 15px; font-weight: 700; line-height: 1; letter-spacing: -0.02em; }
/* Назва пункту на щабель менша за назву блоку — інакше рядок сперечається
   з шапкою, під якою стоїть. */
.ui-lesson-item .ui-lesson-text { gap: 2px; }
/* Вага 500, а не 600: у гарнітури є 400 · 500 · 700 · 800, і 600 браузер
   або підтягнув би до 700, або підробив синтетично. Жирна 700 тут була
   зайвою — у списку з десятка рядків суцільний болд читається як суцільна
   пляма, і жоден рядок не виділяється. Ієрархію тримає розмір. */
.ui-lesson-item .ui-lesson-text > b { font-size: 15px; font-weight: 500; line-height: 20px;
    letter-spacing: -0.2px; }
.ui-lesson-item-mark > .ui-icon { width: 16px; height: 16px; }
.ui-lesson-item-mark > .ui-icon::before { background: currentColor; }
.ui-lesson-item.done > .ui-lesson-item-mark { background: var(--ui-scope-fill, var(--ui-fill-accent));
    color: var(--ui-scope-on-fill, var(--ui-text-on-accent)); }
.ui-lesson-item.locked > .ui-lesson-item-mark { background: var(--ui-surface-sunken);
    color: var(--ui-text-muted); }
/* Дія в пункті блоку — та сама кнопка кіта, але кругла й менша
   (.ui-btn.secondary.icon.m): підпис тут зайвий, бо рядок стоїть під
   шапкою, яка вже сказала, куди веде блок. */
.ui-lesson-item > .ui-lesson-go > p { display: none; }

/* ===== Телефон ===== */
/* Один брейкпойнт, той самий, що в решті кіта. Рядок лишається в один
   поверх: підпис дії ховається (картка клікабельна цілком), медальйон і
   шрифти на щабель менші. Саме згортання в колонку робило стрічку вдвічі
   вищою — на 40 уроків це були зайві дві тисячі пікселів. */
@media screen and (max-width: 640px) {
    .ui-lesson { gap: 12px; padding: 12px; border-radius: var(--ui-radius-l); }
    .ui-lesson-slot { width: 40px; height: 40px; }
    .ui-lesson-mark { width: 44px; height: 44px; font-size: var(--ui-lesson-mark-size, 17px); }
    .ui-lessons.numbered,
    .ui-lesson-group-body.numbered,
    .ui-lesson.numbered { --ui-lesson-mark-size: 20px; }
    .ui-lesson-text > b { font-size: 17px; line-height: 22px; }
    .ui-lesson-item .ui-lesson-text > b { font-size: 14px; line-height: 20px; }
    .ui-lesson-meta { font-size: 12px; line-height: 16px; }
    /* Замість пігулки — сама стрілка, як у рядків кіта: підпис на телефоні
       забирає надто багато вузької ширини, а ціль дотику це вся картка.
       Селектор із .ui-btn — щоб перебити фон кнопки за вагою, а не за
       порядком правил. */
    .ui-btn.ui-lesson-go { gap: 0; width: auto; height: auto; padding: 0;
        background: none; color: var(--ui-text-primary); opacity: 0.55; }
    .ui-lesson-go > p { display: none; }

    /* Закритий урок із «Долучитися онлайн»: це справжня кнопка .ui-btn, і
       на 375px вона з'їдала 178px із 257 — рядок ламався. Тому вона йде на
       власний рядок, врівень із текстовою колонкою (40 медальйон + 12 gap). */
    .ui-lesson.locked { flex-wrap: wrap; }
    .ui-lesson.locked > .ui-btn { flex: 1 0 100%; margin-left: 52px; }
    .ui-lesson-group-head { padding: 12px; gap: 10px; }
    .ui-lesson-group-icon { width: 40px; height: 40px; }
    .ui-lesson-group-title > b { font-size: 17px; line-height: 22px; }
    .ui-lesson-group-body { padding: 0 8px 4px; }
    .ui-lesson-item { gap: 10px; padding: 10px 6px; }
    .ui-lesson-line { margin: 0 6px; }
    .ui-lesson-item-mark { width: 28px; height: 28px; font-size: 13px; }
}
/* ================= Банер =================

   Один компонент замість трьох різних блоків правої колонки уроку:
   «Адаптивний тест», «Тест на повторення» і «Робота над помилками». Доти це
   були .wr-adaptive-item і .wr-lesson-item — різні висоти, різні внутрішні
   ритми й три набори кольорів на три сусідні картки.

   Будова (порядок фіксований — на ньому тримається ритм):
     a.ui-banner(.accent/.danger/.success)
       > .ui-banner-text
           > .ui-banner-head
               > .ui-coin-badge — нагорода, ЗАВЖДИ над заголовком
               > p              — заголовок
           > .ui-banner-pill    — стан або дія під заголовком
           > .ui-banner-stats   — пари «підпис / значення» замість пігулки
       > .ui-banner-action      — смуга дії на всю ширину внизу картки
           > .ui-banner-pills   — рядок із кількох пігулок, коли їх більше однієї
       > .ui-banner-art         — ілюстрація праворуч

   Фон — біле полотно, поверх нього окремий шар блиску кольору ролі, а не
   картинка.
   Легасі клав PNG у background із background-size: cover: він не мав розмірів,
   тож висоту тримали руками, а на вузькому екрані малюнок наїжджав на текст.
   Тепер тло малює CSS, а ілюстрація стоїть окремим елементом і має власне
   місце. Середина градієнта прозора — саме там лежить текст. */

.ui-banner { position: relative; overflow: hidden; display: flex; flex-wrap: wrap;
    align-items: center; gap: 12px;
    width: 100%; min-height: 96px; padding: 16px; box-sizing: border-box;
    /* Межа тінню, а не border: смуга дії внизу має лягти на самий край
       картки, а border лишається зовні padding-box, який обрізає overflow —
       і по краях смуги проступала б світла волосінь у піксель. */
    box-shadow: inset 0 0 0 1px var(--ui-border-card);
    border-radius: var(--ui-radius-l); text-decoration: none; cursor: pointer;
    background: var(--ui-surface);
    /* Локальна змінна, а не три копії правила: роль нижче міняє лише колір */
    --ui-banner-sheen: var(--ui-surface-sunken);
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
/* Блиск окремим шаром, а не градієнтом у фоні: колір бере суцільний (роль),
   а форму йому задає маска. Так один опис прозорості обслуговує всі три ролі
   — інакше кожна тягла б власний шестизупинковий градієнт зі своєю rgba, і
   правка кривої означала б правку в трьох місцях. Ліворуч блиск слабкий,
   у середині нуль (там текст), праворуч повний — під ілюстрацією. */
.ui-banner::before { content: ""; position: absolute; inset: 0; pointer-events: none;
    background: var(--ui-banner-sheen);
    -webkit-mask-image: linear-gradient(122deg, rgba(0, 0, 0, 0.02) 0%,
        rgba(0, 0, 0, 0.04) 18.77%, rgba(0, 0, 0, 0) 44.63%, rgba(0, 0, 0, 0.05) 62.31%,
        rgba(0, 0, 0, 0.13) 77.72%, rgba(0, 0, 0, 0.3) 100%);
            mask-image: linear-gradient(122deg, rgba(0, 0, 0, 0.02) 0%,
        rgba(0, 0, 0, 0.04) 18.77%, rgba(0, 0, 0, 0) 44.63%, rgba(0, 0, 0, 0.05) 62.31%,
        rgba(0, 0, 0, 0.13) 77.72%, rgba(0, 0, 0, 0.3) 100%); }
/* Вміст лежить над блиском: ::before — позиційований, тож без цього він
   малювався б поверх тексту й ілюстрації */
.ui-banner-text, .ui-banner-art, .ui-banner-action { position: relative; }

/* ---- Смуга дії внизу ----
   Дія на всю ширину, притиснута до низу картки. Виносимо її за падинг
   відʼємними марджинами: overflow: hidden самого банера обрізає кути, тож
   радіус лишається без жодного зайвого правила. Перенос на власний рядок
   дає flex-basis: 100% — саме заради нього в банера flex-wrap. */
/* Ширина — calc(100% + 32px), бо flex-basis міряє КОРОБКУ, і відʼємні
   марджини самі її не розтягують: із чистими 100% смуга не доїжджала до
   правого краю рівно на подвійний падинг. */
.ui-banner-action { flex: none; flex-basis: calc(100% + 32px); order: 9;
    display: flex; align-items: center; justify-content: center; gap: 8px;
    height: 40px; margin: 4px -16px -16px; padding: 0 16px;
    background: var(--ui-fill-accent); color: var(--ui-text-on-accent);
    font-size: 14px; font-weight: 500; line-height: 20px; text-decoration: none;
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
.ui-banner-action > .ui-icon { flex: none; }
.ui-banner-action > .ui-icon::before { background: currentColor; }
.ui-banner.danger  .ui-banner-action { background: var(--ui-fill-danger); }
.ui-banner.success .ui-banner-action { background: var(--ui-fill-success-strong); }
/* Ховер по всій картці запалює смугу: сам банер і є посиланням, тож
   підсвічувати треба те єдине, що в ньому читається як дія. */
@media (hover: hover) { .ui-banner:hover .ui-banner-action { filter: brightness(0.92); } }
/* Ховер — підняття на 1px і мʼяка тінь, як у решти карток кіта. Фон не
   чіпаємо: у банера він несе роль (акцент / danger / success), і затемнення
   робило б із неї сіру пляму. */
@media (hover: hover) {
    /* Межу треба повторити: box-shadow не додається, а заміщується цілком */
    .ui-banner:hover { transform: translateY(-1px);
        box-shadow: inset 0 0 0 1px var(--ui-border-card), var(--ui-shadow-card-hover); }
}
.ui-banner:active { transform: translateY(0); }
.ui-banner:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }

/* Ролі: акцент — те, що веде вперед; danger — робота над помилками;
   success — закріплене повторення. Роль міняє лише колір блиску: маска одна
   на всі три, тож картки в стосі мають однаковий ритм і різняться відтінком. */
.ui-banner.accent  { --ui-banner-sheen: var(--ui-wash-accent); }
.ui-banner.danger  { --ui-banner-sheen: var(--ui-wash-danger); }
.ui-banner.success { --ui-banner-sheen: var(--ui-wash-success); }

.ui-banner-text { display: flex; flex-direction: column; align-items: flex-start; gap: 8px;
    min-width: 0; flex: 1; }
/* Нагорода й заголовок — одна група, зі щільнішим ритмом (6 проти 8):
   плашка це підпис до самого заголовка («за це дають 50»), а пігулка нижче
   вже про інше — про дію. Однаковий гап на всі три робив із них рівний
   стос, у якому не видно, що з чим повʼязане. */
.ui-banner-head { display: flex; flex-direction: column; align-items: flex-start;
    gap: 6px; min-width: 0; }
.ui-banner-head > p { color: var(--ui-text-primary); font-size: 16px; font-weight: 600;
    line-height: 22px; letter-spacing: -0.2px; min-width: 0; }
/* Підпис — там, де замість дії потрібне пояснення */
.ui-banner-text > span:not([class]) { color: var(--ui-text-secondary); font-size: 14px;
    font-weight: 400; line-height: 20px; }

/* ---- Рядок статів ----
   Пари «підпис / значення», розділені вертикальною рискою. Стоїть там, де
   під заголовком не дія, а числа: результат і ціль видно ОДНОЧАСНО, тоді як
   пігулка показувала щось одне — або результат, або ціль, ніколи обидва.
   Значення набране 700: це справжня вага гарнітури, і саме на ній тримається
   різниця з підписом, бо кегль в обох однаковий (14). */
.ui-banner-stats { display: flex; align-items: center; gap: 16px; min-width: 0; }
.ui-banner-stat { display: flex; flex-direction: column; align-items: flex-start;
    min-width: 0; text-decoration: none; }
.ui-banner-stat > span { color: var(--ui-text-secondary); font-size: 14px;
    font-weight: 400; line-height: 20px; }
.ui-banner-stat > b { display: inline-flex; align-items: center; gap: 4px;
    color: var(--ui-text-primary); font-size: 14px; font-weight: 700; line-height: 20px; }
/* Риска окремим вузлом, а не межею стовпця: коли стат один, її бути не
   повинно, і порожній стовпець сам би її не прибрав. */
.ui-banner-stat-line { flex: none; width: 1px; height: 32px;
    background: var(--ui-border-subtle); }
/* Ціль веде колір ролі: її можна змінити, і олівець поруч це й каже */
.ui-banner-stat.editable { cursor: pointer; }
.ui-banner-stat.editable > b { color: var(--ui-text-accent); }
.ui-banner-stat.editable > b > .ui-icon::before { background: var(--ui-text-accent); }
.ui-banner.danger  .ui-banner-stat.editable > b { color: var(--ui-text-danger); }
.ui-banner.success .ui-banner-stat.editable > b { color: var(--ui-text-success); }

/* Рядок пігулок — коли під заголовком їх кілька: значення поруч із дією
   («Результат: 181 балів» і «Продовжити тренування»). Окремий вузол, а не
   гап самої колонки: у колонці пігулки стали б одна під одною, а тут вони
   мають ділити рядок і переноситись лише коли не влазять. */
.ui-banner-pills { display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
    max-width: 100%; min-width: 0; }

/* ---- Пігулка під заголовком ----
   Один елемент на всі випадки: показ значення («Ціль: 180 балів»), заклик
   («Задай ціль на НМТ»), лічильник («4 завдання»). Доти це були три різні
   легасі-блоки з власними кольорами й висотами. */
.ui-banner-pill { display: inline-flex; align-items: center; gap: 6px; height: 32px;
    padding: 0 12px; border: 0; border-radius: var(--ui-radius-pill);
    background: var(--ui-surface); color: var(--ui-text-secondary);
    font-family: inherit; font-size: 14px; font-weight: 400; line-height: 20px;
    white-space: nowrap; max-width: 100%; overflow: hidden; text-overflow: ellipsis;
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
.ui-banner-pill > .ui-icon { width: 16px; height: 16px; flex: none; }
.ui-banner-pill > .ui-icon::before { background: currentColor; }

/* Значення всередині пігулки — кольором ролі. Сигнал несе саме число
   («180 балів», «4 завдання»), підпис перед ним лишається сірим. Доти цим
   займалась заливка всієї пігулки тінтом ролі (.active): на градієнтному тлі
   банера виходило три відтінки одного кольору поспіль, і пігулка читалась як
   ще одна пляма фону, а не як значення. */
.ui-banner-pill > b { font-weight: 500; }
.ui-banner.accent  .ui-banner-pill > b { color: var(--ui-text-accent); }
.ui-banner.danger  .ui-banner-pill > b { color: var(--ui-text-danger); }
.ui-banner.success .ui-banner-pill > b { color: var(--ui-text-success); }
/* Гліф бере той самий колір ролі, що й значення: у парі «іконка + число»
   сірий гліф читався як вимкнений, хоч пігулка жива. */
.ui-banner.accent  .ui-banner-pill > .ui-icon::before { background: var(--ui-text-accent); }
.ui-banner.danger  .ui-banner-pill > .ui-icon::before { background: var(--ui-text-danger); }
.ui-banner.success .ui-banner-pill > .ui-icon::before { background: var(--ui-text-success); }
/* А в залитій і в приглушеній колір веде сама пігулка: там гліф має бути
   на заливці (білий) або згаслим разом із текстом. Зайвий .ui-banner на
   початку — щоб зрівняти специфічність із правилами ролі вище (4 класи):
   без нього вони перебивали б цей рядок і гліф зникав би на заливці. */
.ui-banner .ui-banner-pill.action > .ui-icon::before,
.ui-banner .ui-banner-pill.muted > .ui-icon::before { background: currentColor; }

/* Варіант .action — пігулка як дія: суцільна заливка ролі */
.ui-banner-pill.action { background: var(--ui-fill-accent); color: var(--ui-text-on-accent); cursor: pointer; }
.ui-banner.danger  .ui-banner-pill.action { background: var(--ui-fill-danger); color: var(--ui-text-on-accent); }
.ui-banner.success .ui-banner-pill.action { background: var(--ui-fill-success-strong); color: var(--ui-text-on-accent); }
.ui-banner-pill.action > b { color: inherit; }
@media (hover: hover) { .ui-banner-pill.action:hover { filter: brightness(0.92); } }

/* Варіант .muted — стан без дії: «Помилок немає», «Пройди навчання заново».
   Підкладка біла, як у звичайної пігулки: сіра на градієнтному тлі читалась
   як пляма бруду. Різницю тримає лише колір тексту. */
.ui-banner-pill.muted { background: var(--ui-surface); color: var(--ui-text-muted); }

/* Ілюстрація праворуч. Місце тримає сам слот, тож банер має однакову висоту
   і поки картинки немає (їх довезуть окремо). */
.ui-banner-art { display: flex; align-items: center; justify-content: center; flex: none;
    width: 88px; height: 72px; margin: -4px -4px -4px 0; }
.ui-banner-art > img { max-width: 100%; max-height: 100%; object-fit: contain; }
.ui-banner-art > .ui-icon { width: 44px; height: 44px; }
.ui-banner.accent  .ui-banner-art > .ui-icon::before { background: var(--ui-text-accent); }
.ui-banner.danger  .ui-banner-art > .ui-icon::before { background: var(--ui-text-danger); }
.ui-banner.success .ui-banner-art > .ui-icon::before { background: var(--ui-text-success); }

@media screen and (max-width: 640px) {
    .ui-banner { min-height: 88px; padding: 14px; gap: 10px; }
    /* Пігулка СТАНУ переносить рядок замість обрізання: «Пройди навчання
       заново» не влазить у колонку 320px, а обрізаний текст без крапок
       бреше — виглядає як повний. Дію (.action) лишаємо в один рядок:
       підписи там короткі, а кнопка на два рядки читається як абзац. */
    .ui-banner-pill:not(.action) { white-space: normal; height: auto;
        min-height: 32px; padding: 6px 12px; }
    .ui-banner-art { width: 64px; height: 56px; }
    .ui-banner-art > .ui-icon { width: 36px; height: 36px; }
}
/* znohub-ui · секції і рядки списків (тести, уроки, історія) */

/* Заголовок секції з лічильником */
.ui-section { display: flex; flex-direction: column; gap: 12px; }
/* .s — щільна секція (8): заголовок і його вміст читаються як один блок,
   а не як два сусідні. Той самий сенс «.s = тісніше», що й у решті кіта. */
.ui-section.s { gap: 8px; }
/* .l — секція, яку очолює заголовок СТОРІНКИ (28 px), а не підзаголовок
   розділу (17). Такій шапці треба більше повітря, інакше вона злипається
   зі списком під нею; 24 — той самий крок, яким шел відбиває блоки. */
.ui-section.l { gap: 24px; }
.ui-section-head { display: flex; align-items: center; gap: 8px; }
.ui-section-head > p { color: var(--ui-text-primary); font-size: 17px; font-weight: 700; line-height: 23px; letter-spacing: -0.3px; min-width: 0; }
.ui-section-head > .ui-tag { flex: none; }
/* Дія праворуч у шапці розділу (кнопка цілі на карті прогресу): шапка
   лишається flex-рядком, а кнопку відсуває auto-маргін — так само, як у
   титульному рядку сторінки. */
.ui-section-head > .ui-btn, .ui-section-head > .ui-actions { flex: none; margin-left: auto; }
/* Тихий заголовок групи (.s): дрібний сірий лейбл, фокус — на рядках.
   Відступ зліва 4 — лейбл стає на оптичну вертикаль вмісту картки під ним */
.ui-section-head.s { padding: 0 0 0 4px; }
/* Тихий заголовок секції. Вага 500, а не 700: він розділяє списки, а не
   конкурує з назвами всередині них. У коді колись стояла 600 — заборонена
   киту вага; 500 це найближчий легальний щабель у той самий бік. */
.ui-section-head.s > p { color: var(--ui-text-secondary); font-size: 13px;
    font-weight: 500; line-height: 18px; letter-spacing: 0; }
/* Кілька груп в одній картці — розділювач замість стопки карток */
.ui-card > .ui-section + .ui-section { padding-top: 20px; border-top: 1px solid var(--ui-border-subtle); }
/* Предметна смуга заголовка (патерн .compare лендингу): тінт кладеться
   через background-image, тому власний background-color рядка лишається
   вільним; текст — темний */
.ui-section-head.tinted { min-height: 44px; margin: 0 -8px; padding: 8px 12px; border-radius: var(--ui-radius-m); }
.ui-section-head.sub-a { background-image: linear-gradient(var(--ui-subject-a-tint), var(--ui-subject-a-tint)); }
.ui-section-head.sub-b { background-image: linear-gradient(var(--ui-subject-b-tint), var(--ui-subject-b-tint)); }
.ui-section-head.sub-c { background-image: linear-gradient(var(--ui-subject-c-tint), var(--ui-subject-c-tint)); }
.ui-section-head.sub-d { background-image: linear-gradient(var(--ui-subject-d-tint), var(--ui-subject-d-tint)); }
.ui-section-head.sub-e { background-image: linear-gradient(var(--ui-subject-e-tint), var(--ui-subject-e-tint)); }
.ui-section-head.sub-f { background-image: linear-gradient(var(--ui-subject-f-tint), var(--ui-subject-f-tint)); }

/* Рядок списку: номер/стан → текст → мета праворуч */
.ui-rows { display: flex; flex-direction: column; gap: 6px; }
.ui-row { position: relative; isolation: isolate; overflow: hidden; display: flex; align-items: center;
    gap: 12px; padding: 12px 16px 12px 12px; border-radius: var(--ui-radius-m);
    background: var(--ui-surface-sunken); text-decoration: none; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
@media (hover: hover) { a.ui-row:not(.card):hover { background: var(--ui-surface-sunken-hover); } }
/* Рядок як самостійна картка: коли рядки стоять окремими блоками, а не
   стопкою всередині спільної картки. Стани рядка (.done, смуга результату,
   номер) працюють без змін — міняється тільки оболонка. Ховер бере
   спільний карточний (підйом + тінь) із card.css, свого не пише. */
.ui-row.card { padding: 16px; border-radius: var(--ui-radius-l);
    background: var(--ui-surface); border: 1px solid var(--ui-border-card);
    box-shadow: var(--ui-shadow-card); }
/* Кружок номера на білому тлі має бути сірим, інакше він зникає */
.ui-row.card > .ui-row-num { background: var(--ui-surface-sunken); }
.ui-row-num { display: flex; align-items: center; justify-content: center; flex: none;
    width: 36px; height: 36px; border-radius: var(--ui-radius-pill); background: var(--ui-surface);
    color: var(--ui-text-secondary); font-size: 14px; font-weight: 700; }
/* flex-basis 0 — текст ніколи не переноситься сам під іконку на вузькому
   екрані (переносяться лише дії справа), а довгу назву стискає в багаторядок */
.ui-row-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
/* У рядку списку текст тримається в 40 і центрується по вертикалі. gap 0
   свідомо: два рядки рядка — це рівно 22 + 18, і з проміжком блок
   переростав би межу, обрізаючи нижні виносні. Правило саме для .ui-row —
   у більших картках (.ui-card.row) свій, вищий кегль. */
.ui-row > .ui-row-text { justify-content: center; gap: 0; max-height: 40px; }
.ui-row-text > p { color: var(--ui-text-primary); font-size: 15px; font-weight: 700; line-height: 22px;
    letter-spacing: -0.1px; }
.ui-row-text > span { color: var(--ui-text-secondary); font-size: 13px; font-weight: 400; line-height: 18px; }
/* Готове зображення замість номера чи аватара (нагорода, значок ліги) */
.ui-row-img { width: 36px; height: 36px; flex: none; object-fit: contain; }
/* Кружок з іконкою в рядку — 40, як аватар: слот під нейтральну позначку
   операції там, де ні предмета, ні картинки немає (історія коїнів). Сам
   .ui-icon-circle розміру не має — його задає слот, у який вкладений. */
.ui-row > .ui-icon-circle { width: 40px; height: 40px; flex: none; }
/* Виділений рядок — «це ти» в рейтингу, поточний елемент у списку */
.ui-row.accent { background: var(--ui-tint-accent); }
.ui-row-meta { display: flex; align-items: center; gap: 8px; margin-left: auto; flex: none; }
.ui-row-meta > .ui-btn { flex: none; }
.ui-row-meta > .ui-tag { min-width: 112px; justify-content: center; }
@media screen and (max-width: 640px) {
    /* flex-basis 100% обов'язковий: без нього текст із flex-basis 0 просто
       стискається до кількох пікселів, замість того щоб віддати меті окремий
       рядок — і .ui-row.flex-wrap не спрацьовує взагалі. Стелю висоти теж
       знімаємо: на вузькому екрані назва законно займає більше двох рядків,
       а .ui-row має overflow:hidden і різала б її посеред слова. */
    .ui-row { flex-wrap: wrap; }
    .ui-row > .ui-row-text { flex-basis: 100%; max-height: none; }
    .ui-row-meta { margin-left: 48px; }

    /* Рядок-картка лишається в один рядок. Перенос вище розрахований на
       рядок усередині спільної картки, де їх кілька поспіль і зайва висота
       не помітна. Тут кожен рядок — окрема картка з падингом 16, і перенос
       множив висоту втричі: сорок уроків давали майже 19 000 px стрічки.
       Тому дію згортаємо до її стрілки — той самий прийом, що в картці
       предмета: підпис дії на вузькому не потрібен, напрямок каже шеврон. */
    .ui-row.card { flex-wrap: nowrap; }
    .ui-row.card > .ui-row-text { flex-basis: 0; }
    .ui-row.card > .ui-row-meta { margin-left: auto; }
    .ui-row.card > .ui-row-meta > .ui-btn { background: none; padding: 0; }
    .ui-row.card > .ui-row-meta > .ui-btn > p { display: none; }
}
.ui-row-chev { flex: none; width: 20px; height: 20px; opacity: 0.55; background: var(--ui-text-primary);
    mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Right-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Right-2%22%20transform=%22translate(12.000000,%2012.000000)%20rotate(-90.000000)%20translate(-12.000000,%20-12.000000)%20translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224px%22%20height=%2224px%22%20viewBox=%220%200%2024%2024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%3E%3Cg%20id=%22Iconly/Light/Arrow---Right-2%22%20stroke=%22none%22%20stroke-width=%221%22%20fill=%22none%22%20fill-rule=%22evenodd%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22%3E%3Cg%20id=%22Arrow---Right-2%22%20transform=%22translate(12.000000,%2012.000000)%20rotate(-90.000000)%20translate(-12.000000,%20-12.000000)%20translate(5.000000,%208.500000)%22%20stroke=%22%23000000%22%20stroke-width=%221.5%22%3E%3Cpolyline%20id=%22Stroke-1%22%20points=%2214%200%207%207%200%200%22%3E%3C/polyline%3E%3C/g%3E%3C/g%3E%3C/svg%3E") no-repeat center / contain; }

/* ---- Підсумок замовлення ----
   Рядки «лейбл — значення», знижка зеленим, підсумковий рядок більшим кеглем. */
.ui-summary { display: flex; flex-direction: column; gap: 12px; }
.ui-summary-row { display: flex; align-items: baseline; justify-content: space-between;
    gap: 12px; color: var(--ui-text-strong); font-size: 14px; line-height: 20px; }
.ui-summary-row > span:last-child { color: var(--ui-text-primary); white-space: nowrap; }
/* Лейбл з іконкою: .ui-icon-circle тягнеться на 100% батька, тому слот
   під нього тут і розмірюється. Baseline-вирівнювання рядка на такий
   лейбл не годиться — перемикаємось на центр. */
.ui-summary-row > .ui-summary-label { display: inline-flex; align-items: center; gap: 8px;
    color: var(--ui-text-strong); }
.ui-summary-row > .ui-summary-label > .ui-icon-circle { width: 28px; height: 28px; flex: none;
    border-radius: var(--ui-radius-s); }
.ui-summary-row:has(> .ui-summary-label) { align-items: center; }
/* Дзеркало лейбла для правого боку: значення з монетою чи дрібним знаком.
   Baseline рядка вирівняв би монету по низу цифр, тому тут теж центр. */
.ui-summary-row > .ui-summary-value { display: inline-flex; align-items: center; gap: 6px;
    color: var(--ui-text-primary); white-space: nowrap; }
.ui-summary-row.discount, .ui-summary-row.discount > span:last-child { color: var(--ui-text-success); }
.ui-summary-row.quiet, .ui-summary-row.quiet > span:last-child {
    color: var(--ui-text-muted); font-size: 13px; line-height: 18px; }
.ui-summary-divider { height: 1px; background: var(--ui-border-subtle); margin: 2px 0; }
.ui-summary-total { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.ui-summary-total > p { color: var(--ui-text-primary); font-size: 15px; font-weight: 700; line-height: 22px; }
.ui-summary-total > b { color: var(--ui-text-primary); font-size: 24px; font-weight: 700;
    line-height: 30px; letter-spacing: -0.48px; white-space: nowrap; }

/* Пройдений: зелена галочка замість номера + тонка смуга результату знизу */
.ui-row.done .ui-row-num { background: var(--ui-tint-success); color: transparent; position: relative; }
.ui-row.done .ui-row-num::before { content: ""; position: absolute; inset: 0; margin: auto;
    width: 18px; height: 18px; background: var(--ui-text-success);
    mask: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3.75 9.75L7.125 13.125L14.25 5.25' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3.75 9.75L7.125 13.125L14.25 5.25' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-row-result { position: absolute; left: 0; bottom: 0; height: 3px; z-index: 1;
    border-radius: 0 var(--ui-radius-pill) var(--ui-radius-pill) 0; background: var(--ui-progress-fill-success); }
.ui-row-result.red { background: var(--ui-progress-fill-danger); }
/* Результатне забарвлення пройденого рядка — бінарне (.red на <50):
   кружок стану міняє пару тінт+гліф разом зі смугою */
.ui-row.done.red .ui-row-num { background: var(--ui-tint-danger); }
.ui-row.done.red .ui-row-num::before { background: var(--ui-text-danger); }

/* Недоступний: те, що ще не відкрилось. Рядок тихне цілком і не клікається —
   стан, а не opacity на місці виклику, щоб приглушення було однакове скрізь.
   pointer-events знімає й ховер картки: рядок не має вдавати клікабельний. */
.ui-row.muted { opacity: 0.6; pointer-events: none; }
.ui-row.muted .ui-ring > .ui-icon::before,
.ui-row.muted .ui-row-num > .ui-icon::before { background: var(--ui-text-muted); }

/* ============ Турнірна таблиця (ліга) ============
   Три десятки рядків мусять читатися одним поглядом, тому не список, а
   КОЛОНКИ: columns заповнює зверху вниз і не лишає дірок при непарній
   кількості, break-inside тримає рядок цілим.
   Метрики — рядка кита (.ui-row): той самий гап, падинги, радіус, бали тегом. Своє тут лише те, чого в .ui-row немає:
   зона (тло + напрямок стрілки) і виділення власного місця. */
.ui-standings { columns: 3; column-gap: 6px; }
@media screen and (max-width: 1100px) { .ui-standings { columns: 2; } }
@media screen and (max-width: 700px)  { .ui-standings { columns: 1; } }
.ui-standings-row { display: flex; align-items: center; gap: 12px; break-inside: avoid;
    margin-bottom: 6px; padding: 12px 16px; border-radius: var(--ui-radius-m);
    background: var(--ui-surface-sunken); border: 1px solid transparent; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
/* Стрілка зони — Iconly Light «Chevron Up/Down Duo» (53821 / 53809), тобто
   готова пакова іконка, а не два шеврони, складені вручну. Спокій — риска:
   не «нікуди», а «на місці». */
.ui-standings-row > .ui-standings-move { flex: none; width: 24px; height: 24px;
    background: var(--ui-text-muted); mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M6%2012H18%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M6%2012H18%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
/* Місце й імʼя — одного кегля: у сітці з тридцяти рядків різниця в розмірі
   дробила рядок на дві частини. Різняться вагою на один щабель (400 → 500)
   і кольором: номер тихий, імʼя основне. */
.ui-standings-row > .ui-standings-place { flex: none; color: var(--ui-text-secondary);
    font-size: 13px; font-weight: 400; line-height: 18px; }
.ui-standings-row > .ui-standings-name { flex: 1; min-width: 0; color: var(--ui-text-primary);
    font-size: 13px; font-weight: 500; line-height: 18px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ui-standings-row > .ui-tag { flex: none; margin-left: auto; }
/* Зони */
.ui-standings-row.up { background: var(--ui-tint-success); }
.ui-standings-row.up > .ui-standings-move { background: var(--ui-border-success); mask-image: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M8%2017L12%2013L16%2017M8%2011L12%207L16%2011%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M8%2017L12%2013L16%2017M8%2011L12%207L16%2011%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E"); }
.ui-standings-row.down { background: var(--ui-tint-danger); }
.ui-standings-row.down > .ui-standings-move { background: var(--ui-border-danger); mask-image: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M16%2013L12%2017L8%2013M16%207L12%2011L8%207%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E"); -webkit-mask-image: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M16%2013L12%2017L8%2013M16%207L12%2011L8%207%22%20stroke=%22black%22%20stroke-width=%221.5%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3C/svg%3E"); }
/* Своє місце — межею, як усі вибрані стани кита: тло вже зайняте зоною.
   Колір бере зону, щоб виділення не сперечалося з нею змістом. */
/* Своє місце — тиха межа плюс переливання по ній (той самий ефект, що на
   преміум-картках; правило спільне, у card.css). Колір переливання дають
   --ui-scope-*, які тут перемикаються на зелений. position: relative —
   щоб ::before чіплявся до рядка. */
.ui-standings-row.me { position: relative; border-color: var(--ui-border-success-soft);
    --ui-scope-fill: var(--ui-border-success);
    --ui-scope-sheen: var(--ui-sheen-success); }
.ui-standings-row.down.me { border-color: var(--ui-border-danger); }
/* znohub-ui · порожній стан */
.ui-empty { display: flex; flex-direction: column; align-items: center; gap: 8px;
    padding: 48px 24px; text-align: center; }
.ui-empty > p { color: var(--ui-text-primary); font-size: 17px; font-weight: 700; line-height: 23px; letter-spacing: -0.3px; }
.ui-empty > span { color: var(--ui-text-secondary); font-size: 14px; font-weight: 400; line-height: 20px; max-width: 360px; }
/* Іконка-медальйон над заголовком */
.ui-empty-icon { display: flex; align-items: center; justify-content: center;
    width: 56px; height: 56px; border-radius: 50%; background: var(--ui-surface-sunken);
    margin-bottom: 6px; }
.ui-empty-icon > .ui-icon { width: 26px; height: 26px; }
.ui-empty-icon > .ui-icon::before { background: var(--ui-text-muted); }
/* CTA під текстом */
.ui-empty > .ui-btn, .ui-empty-actions { margin-top: 10px; }
/* Дій може бути багато (швидкий вибір предмета на карті прогресу) —
   ряд переноситься і лишається центрованим під текстом */
.ui-empty-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; }
/* znohub-ui · заголовок сторінки */
.ui-page-title { color: var(--ui-text-primary); font-size: 28px; font-weight: 700;
    line-height: 34px; letter-spacing: -0.56px; }
/* Заголовок із діями праворуч. Це для дій, що стосуються СТОРІНКИ цілком
   (правила, поділитися), а не вмісту під заголовком — інакше вони мають
   стояти біля свого блоку. На вузькому переносяться під заголовок: тиснути
   кнопки в один рядок із 28px заголовком нема куди.
   Без заголовка це другий рядок шапки: щось ліворуч, дія праворуч (баланс і
   «Історія» в маркеті). Окремого класу під це не заводимо — геометрія та
   сама, а два імені на один рядок розходяться при першій же правці. */
.ui-page-titlebar { display: flex; align-items: center; justify-content: space-between;
    gap: 12px 16px; flex-wrap: wrap; }
.ui-page-titlebar > .ui-actions { margin-left: auto; }
@media screen and (max-width: 640px) {
    .ui-page-titlebar > .ui-actions { margin-left: 0; }
}

/* ---- Шапка з приміткою ----
   Примітка (фраза викладача) не окремий банер, а тінтована плита, з якої
   шапка виступає своєю карткою: обидва блоки читаються як один. Геометрія
   з макета — шапка 106, смуга 44, між ними нуль. Плита бере тінт
   предметного скоупу, той самий, що мав банер, з якого примітка переїхала.
   Без примітки фон плити зайвий: картка накриває її цілком, але тінь на
   краях підсвічувала б смужку — тому :has знімає фон. */
.ui-page-head-group { border-radius: var(--ui-radius-xl);
    background: var(--ui-scope-tint, var(--ui-tint-accent)); }
.ui-page-head-group:not(:has(> .ui-page-note)) { background: none; }
/* Текст примітки — кольором предмета, як і її іконка: плита під ним теж
   предметна, тож сірий на ній читався як чужий елемент. Поза предметним
   скоупом лишається акцент. */
.ui-page-note { display: flex; align-items: center; justify-content: center; gap: 12px;
    min-height: 44px; padding: 12px 16px; color: var(--ui-scope-text, var(--ui-text-accent));
    font-size: 14px; font-weight: 400; line-height: 20px; }
.ui-page-note > .ui-icon { flex: none; }
.ui-page-note > .ui-icon::before { background: var(--ui-scope-text, var(--ui-text-accent)); }

/* znohub-ui · шапка розділу: іконка предмета + назва + прогрес */
.ui-page-head { position: relative; display: flex; align-items: center; gap: 16px; padding: 20px;
    border-radius: var(--ui-radius-xl); background: var(--ui-surface);
    border: 1px solid var(--ui-border-card);
    box-shadow: var(--ui-shadow-card); }
.ui-page-head-text { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.ui-page-head-text > p { color: var(--ui-text-primary); font-size: 24px; font-weight: 700; line-height: 30px; letter-spacing: -0.48px; }
.ui-page-head-text > span { color: var(--ui-text-secondary); font-size: 14px; font-weight: 400; line-height: 20px; }
/* Бічна колонка: стат-цифра з підписом або дія. min-width, а не width —
   кнопка з довгою назвою не вилазить за межі колонки */
.ui-page-head-side { display: flex; flex-direction: column; align-items: flex-end; gap: 8px;
    margin-left: auto; flex: none; min-width: 200px; }
/* Поодинока дія праворуч у шапці. Без .ui-page-head-side: той тримає
   стат-колонку з min-width 200 — під одну кнопку це зайва порожнеча.
   Так само й перемикач (режим заняття Hard/Lite): смуга табів стоїть у
   правому краю шапки, а не окремим рядком під нею. */
.ui-page-head > .ui-btn,
.ui-page-head > .ui-tabs { margin-left: auto; flex: none; }
.ui-page-head-side > span { color: var(--ui-text-secondary); font-size: 13px; font-weight: 400; line-height: 18px; }
.ui-page-head-side > span > b { color: var(--ui-text-primary); font-weight: 700; }
@media screen and (max-width: 640px) {
    .ui-page-head { flex-wrap: wrap; }
    .ui-page-head-side { width: 100%; align-items: stretch; }
    /* Перенесені на свій рядок таби починаються від лівого краю разом із
       текстом, а не тиснуться до правого */
    .ui-page-head > .ui-tabs { margin-left: 0; }
}

/* Іконка предмета в шапці: зона 64×64 — вміщає і .ui-subject.l, і кільце .ui-ring.l */
/* position: relative — щоб накладка на кут (бейдж преміуму) чіплялась до
   слота, а не до всієї шапки: .ui-page-head теж relative, і без цього бейдж
   поїхав би в її правий нижній кут. */
.ui-page-head .ui-subject-slot { position: relative; width: 64px; height: 64px; flex: none;
    display: flex; align-items: center; justify-content: center; }
/* Картинка займає слот цілком — розмір веде сам слот, а не клас картинки:
   інакше зняття будь-якого модифікатора лишає її без розміру, і вона
   розповзається на всю ширину шапки. */
.ui-page-head .ui-subject-slot > img { width: 100%; height: 100%; object-fit: contain; }
/* Бейдж на кут аватара: у шапці слот 64px і аватар круглий, тож накладка
   стає в самий кут слота, а не звисає за нього на 4px, як у 40-піксельному
   слоті рядка-картки. */
.ui-page-head .ui-premium-badge { right: 0; bottom: 0; }
/* Слот із тегом на іконці: сама іконка каже, ЩО це, тег — де ти в ньому
   (місце в лізі). Тег АБСОЛЮТОМ: у потоці він робив слот колонкою і тягнув
   шапку вгору на цілий рядок, хоча місця в ній і так вдосталь. */
.ui-page-head .ui-subject-slot.tagged { position: relative; }
.ui-page-head .ui-subject-slot.tagged > .ui-tag { position: absolute; z-index: 1;
    left: 50%; bottom: -8px; transform: translateX(-50%); }

/* Стат-цифра банера (редукція .stats лендингу: кегль + вага + тихий підпис) */
.ui-page-head-side > span.ui-page-head-stat { font-size: 32px; line-height: 38px;
    font-weight: 700; letter-spacing: -0.64px; }
/* Тиха цифра: коли вона довідка, а не досягнення. Розмір і вага ті самі —
   міняється лише голос, тож поруч із яскравою вона не сперечається.
   Роль muted (3.17 на білому) годиться саме тут: при 44px це великий текст,
   для якого норма 3:1, а не 4.5. На дрібному кеглі так робити не можна. */
.ui-page-head-side > span.ui-page-head-stat.muted { color: var(--ui-text-muted); }
/* Декоративна цифра-водяний знак. АБСОЛЮТОМ і прямо в шапці, а не в
   .ui-page-head-side: у потоці вона диктувала висоту шапки і тримала
   колонку шириною 200px, хоча по суті це фон, а не вміст. Тепер шапка
   міряється текстом, а цифра лежить поверх, притиснута до правого краю.
   72px — далеко вище за верх шкали (Display 32), бо це не текст;
   трекінг лишається -0.02em. Градієнтна маска (значення дизайнера) робить
   її діагональною: ліворуч-угорі розчиняється, праворуч-унизу проступає.
   pointer-events: none — щоб не перехоплювала клік по шапці. */
.ui-page-head > .ui-page-head-stat.xl { position: absolute; right: 20px; top: 50%;
    transform: translateY(-50%); pointer-events: none; user-select: none;
    font-size: 72px; line-height: 1; font-weight: 700; letter-spacing: -1.44px;
    mask-image: linear-gradient(113deg, rgba(255, 255, 255, 0.00) -26.7%, rgba(255, 255, 255, 0.20) 105.11%);
    -webkit-mask-image: linear-gradient(113deg, rgba(255, 255, 255, 0.00) -26.7%, rgba(255, 255, 255, 0.20) 105.11%); }
.ui-page-head > .ui-page-head-stat.xl.muted { color: var(--ui-text-muted); }
.ui-page-head.sub-a span.ui-page-head-stat { color: var(--ui-subject-a-accent); }
.ui-page-head.sub-b span.ui-page-head-stat { color: var(--ui-subject-b-accent); }
.ui-page-head.sub-c span.ui-page-head-stat { color: var(--ui-subject-c-accent); }
.ui-page-head.sub-d span.ui-page-head-stat { color: var(--ui-subject-d-accent); }
.ui-page-head.sub-e span.ui-page-head-stat { color: var(--ui-subject-e-accent); }
.ui-page-head.sub-f span.ui-page-head-stat { color: var(--ui-subject-f-accent); }
/* znohub-ui · таби і сегментований перемикач. Канон: .wr-tab платформи.
   База скролиться горизонтально — на вузьких екранах таби не ламаються
   в два рядки і не тікають за край. */
.ui-tabs { display: flex; gap: 4px; padding: 5px; border-radius: var(--ui-radius-m);
    background: var(--ui-surface-sunken); width: fit-content; max-width: 100%;
    overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
.ui-tabs::-webkit-scrollbar { display: none; }
.ui-tabs > .item { display: flex; align-items: center; gap: 6px; padding: 8px 16px;
    border: none; border-radius: var(--ui-radius-s); background: none; cursor: pointer;
    color: var(--ui-text-secondary); font-family: inherit; font-size: 14px; font-weight: 500;
    line-height: 20px; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); flex: none; white-space: nowrap; }
@media (hover: hover) { .ui-tabs > .item:hover { color: var(--ui-text-primary); } }
.ui-tabs > .item.active { background: var(--ui-surface); color: var(--ui-text-primary);
    box-shadow: var(--ui-shadow-card); }
.ui-tabs.wide { width: 100%; }
.ui-tabs.wide > .item { flex: 1; justify-content: center; }
/* Бейдж-лічильник у табі — варіант .s, розміри в misc.css */
/* znohub-ui · контроли вибору: чекбокс, тумблер, чіп-радіо.
   На платформі 4 різні реалізації чекбокса і жодного тумблера — це канон. */

/* Чекбокс: label > input(hidden) + .box + текст */
.ui-check { display: inline-flex; align-items: center; gap: 10px; cursor: pointer;
    color: var(--ui-text-primary); font-size: 14px; line-height: 20px; }
.ui-check > input { position: absolute; opacity: 0; width: 0; height: 0; }
.ui-check-box { display: flex; align-items: center; justify-content: center; flex: none;
    width: 22px; height: 22px; border-radius: 6px; border: 1.5px solid var(--ui-border-strong);
    background: var(--ui-surface); transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
.ui-check-box::after { content: ""; width: 14px; height: 14px; opacity: 0;
    background: var(--ui-text-on-accent); transition: opacity 0.15s;
    mask: url("data:image/svg+xml,%3Csvg width='14' height='14' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.5 7.5L5.5 10.5L11.5 3.5' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='14' height='14' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.5 7.5L5.5 10.5L11.5 3.5' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain; }
@media (hover: hover) {
    .ui-check:hover .ui-check-box { border-color: var(--ui-border-accent); }
    .ui-check:hover input:checked + .ui-check-box { background: var(--ui-fill-accent-hover); border-color: var(--ui-fill-accent-hover); }
}
.ui-check > input:checked + .ui-check-box { background: var(--ui-fill-accent); border-color: var(--ui-fill-accent); }
.ui-check > input:checked + .ui-check-box::after { opacity: 1; }
.ui-check > input:focus-visible + .ui-check-box { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
.ui-check:has(> input:disabled) { opacity: 0.5; cursor: default; pointer-events: none; }
/* Розміри чекбокса: s 18 · база 22 · l 26 */
.ui-check.s { font-size: 13px; gap: 8px; }
.ui-check.s .ui-check-box { width: 18px; height: 18px; border-radius: 5px; }
.ui-check.s .ui-check-box::after { width: 11px; height: 11px; }
.ui-check.l { font-size: 15px; gap: 12px; }
.ui-check.l .ui-check-box { width: 26px; height: 26px; border-radius: 7px; }
.ui-check.l .ui-check-box::after { width: 16px; height: 16px; }

/* Тумблер */
.ui-switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer;
    color: var(--ui-text-primary); font-size: 14px; line-height: 20px; }
.ui-switch > input { position: absolute; opacity: 0; width: 0; height: 0; }
.ui-switch-track { display: flex; align-items: center; flex: none; width: 44px; height: 26px;
    padding: 3px; border-radius: var(--ui-radius-pill); background: var(--ui-border-strong);
    transition: background 0.2s; }
.ui-switch-track::after { content: ""; width: 20px; height: 20px; border-radius: 50%;
    background: var(--ui-text-on-fill); box-shadow: 0 1px 3px var(--ui-shadow-color);
    transition: transform 0.2s; }
@media (hover: hover) {
    .ui-switch:hover .ui-switch-track { background: var(--ui-text-secondary); }
    .ui-switch:hover input:checked + .ui-switch-track { background: var(--ui-fill-accent-hover); }
}
.ui-switch > input:checked + .ui-switch-track { background: var(--ui-fill-accent); }
.ui-switch > input:checked + .ui-switch-track::after { transform: translateX(18px); }
.ui-switch > input:focus-visible + .ui-switch-track { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
.ui-switch:has(> input:disabled) { opacity: 0.5; cursor: default; pointer-events: none; }
/* Розміри тумблера: s 36×22 · база 44×26 · l 52×30 */
.ui-switch.s { font-size: 13px; gap: 8px; }
.ui-switch.s .ui-switch-track { width: 36px; height: 22px; }
.ui-switch.s .ui-switch-track::after { width: 16px; height: 16px; }
.ui-switch.s > input:checked + .ui-switch-track::after { transform: translateX(14px); }
.ui-switch.l { font-size: 15px; gap: 12px; }
.ui-switch.l .ui-switch-track { width: 52px; height: 30px; }
.ui-switch.l .ui-switch-track::after { width: 24px; height: 24px; }
.ui-switch.l > input:checked + .ui-switch-track::after { transform: translateX(22px); }

/* Сегмент: 2–3 взаємовиключні варіанти в одній пігулці. На нативних radio,
   тож значення потрапляє у форму саме собою (на відміну від .ui-tabs, де
   стан веде JS). Розмітка: .ui-segment > label > input[type=radio] + span */
.ui-segment { display: inline-flex; padding: 3px; border-radius: var(--ui-radius-pill);
    background: var(--ui-surface-sunken); max-width: 100%; }
.ui-segment > label { position: relative; cursor: pointer; min-width: 0; }
.ui-segment input { position: absolute; opacity: 0; width: 0; height: 0; }
.ui-segment span { display: flex; align-items: center; justify-content: center; gap: 6px;
    height: 30px; padding: 0 14px; border-radius: var(--ui-radius-pill);
    color: var(--ui-text-secondary); font-size: 13px; font-weight: 500; line-height: 18px;
    white-space: nowrap; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
@media (hover: hover) { .ui-segment > label:hover span { color: var(--ui-text-primary); } }
.ui-segment input:checked + span { background: var(--ui-surface); color: var(--ui-text-primary);
    font-weight: 700; box-shadow: var(--ui-shadow-card); }
.ui-segment input:focus-visible + span { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
.ui-segment > label:has(input:disabled) { opacity: 0.5; cursor: default; pointer-events: none; }
/* .wide — сегмент на всю ширину, варіанти рівними частками */
.ui-segment.wide { display: flex; width: 100%; }
.ui-segment.wide > label { flex: 1; }

/* Чіп-радіо (сегментований вибір, канон item-poll-variants) */
.ui-radio-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.ui-radio-chips > label { position: relative; cursor: pointer; }
.ui-radio-chips input { position: absolute; opacity: 0; width: 0; height: 0; }
.ui-radio-chips .ui-chip { pointer-events: none; }
@media (hover: hover) {
    .ui-radio-chips > label:hover .ui-chip { background: var(--ui-surface-sunken-hover); }
    .ui-radio-chips > label:hover input:checked + .ui-chip { background: var(--ui-fill-accent-hover); color: var(--ui-text-on-accent); }
}
.ui-radio-chips input:checked + .ui-chip { background: var(--ui-fill-accent); color: var(--ui-text-on-accent); }
.ui-radio-chips input:focus-visible + .ui-chip { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
.ui-radio-chips > label:has(> input:disabled) { opacity: 0.5; cursor: default; pointer-events: none; }
/* Колонкою — коли варіант це речення, а не бал: пігулки в ряд там
   переносяться по словах і шкала перестає читатись як список. */
.ui-radio-chips.column { flex-direction: column; }
.ui-radio-chips.column > label { width: 100%; }
.ui-radio-chips.column .ui-chip { width: 100%; height: auto; min-height: 32px;
    padding: 7px 14px; justify-content: flex-start; text-align: left; }
/* znohub-ui · повідомлення: інлайн-банер і тост.
   Замінює 4 паралельні механізми (legacy notif-items, pl-toast, toastr, alert()). */

/* Інлайн-банер (канон wr-course-message: info/warning + CTA) */
/* Тінт банера теж іде за предметним скоупом: на сторінці курсу повідомлення
   викладача звучить кольором предмета, поза скоупом — акцентом. Статусні
   варіанти (.success/.danger/.warning/.neutral) стоять нижче й перебивають:
   стан важливіший за предмет. */
.ui-alert { display: flex; align-items: center; gap: 12px; padding: 14px 20px;
    border-radius: var(--ui-radius-m); background: var(--ui-scope-tint, var(--ui-tint-accent));
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
/* margin-top тут був оптичною поправкою під вирівнювання по першому
   рядку; з центруванням він зайвий */
/* Гліф лишається 20, але сидить у слоті 32×32: слот тримає ліву колонку
   однаковою незалежно від іконки й дає їй повітря, щоб вона не липла
   до тексту. mask-size задано явно — інакше маска з i-* розтягла б
   гліф на всі 32 (там вона contain по коробці). */
.ui-alert > .ui-icon { flex: none; width: 32px; height: 32px;
    -webkit-mask-size: 20px; mask-size: 20px; }
.ui-alert > .ui-icon::before { background: var(--ui-scope-text, var(--ui-text-accent)); }
/* flex-basis 0 — текст стискається, а не витісняє кнопки на власний рядок:
   без цього банер із двома діями розсипався на вузькому екрані по слову */
.ui-alert-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
/* Заголовок — та сама шкала, що в назви уроку (.ui-lesson-item ... > b):
   у стосі блоку банер стоїть впритул до списку, і два різні кеглі на
   сусідніх рядках читались як два різні рівні, хоч рівень один. */
.ui-alert-text > p { color: var(--ui-text-primary); font-size: 15px; font-weight: 500;
    line-height: 20px; letter-spacing: -0.2px; }
.ui-alert-text > span { color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; }
/* Дія праворуч. .ui-actions — коли дій дві або поруч із кнопкою стоїть
   тег (напр. нагорода коїнами): група їде вправо цілком. */
/* align-self — бо сам .ui-actions ставить собі flex-start (щоб ряд кнопок
   у колонці-контенті не розтягувався), і це перебивало центрування банера */
.ui-alert > .ui-btn, .ui-alert > .ui-actions { margin-left: auto; flex: none;
    align-self: center; }
.ui-alert.success { background: var(--ui-tint-success); }
.ui-alert.success > .ui-icon::before { background: var(--ui-text-success); }
.ui-alert.danger { background: var(--ui-tint-danger); }
.ui-alert.danger > .ui-icon::before { background: var(--ui-text-danger); }
.ui-alert.warning { background: var(--ui-tint-warning); }
.ui-alert.warning > .ui-icon::before { background: var(--ui-text-warning); }
/* Сірий банер: примітка, а не стан. Тінтовані варіанти кольором кажуть
   «зверни увагу», а тут якраз навпаки — довідка, що не має перетягувати
   на себе увагу з вмісту. Ролі ті самі, що в .ui-btn.neutral. */
.ui-alert.neutral { background: var(--ui-surface-sunken); }
.ui-alert.neutral > .ui-icon::before { background: var(--ui-text-secondary); }
/* Ховер по всьому банеру запалює його дію: тінт → заливка. Той самий
   патерн, що в картці-шапці (.ui-page-head.hover) — банер сам не клікається,
   тож підсвітка веде до єдиного, що в ньому клікається. У предметному скоупі
   спалах іде в колір предмета, поза ним — в акцент.
   Наведення прямо на кнопку додає власний щабель: спільна прес-модель
   предметних заливок (brightness), бо окремих ховер-примітивів на кожен
   колір кит не плодить. Перехід дає transition самої .ui-btn. */
@media (hover: hover) {
    /* Підняття на 1px — те саме, що в карток і банерів кіта: банер веде до
       дії, тож на наведення має відповідати всім тілом, а не самою кнопкою.
       Вимкнений не піднімається: у нього pointer-events: none, тож ховера
       на ньому й не буває. */
    .ui-alert:hover { transform: translateY(-1px); }
    /* Дві умови, без яких спалах бреше:
       1) банер не має власної залитої кнопки — інакше друга зрівнялася б з
          нею і різниця первинна/вторинна зникла б;
       2) кнопка не вимкнена — у вимкненої pointer-events: none, тож курсор
          проходить крізь неї на банер, і мертва кнопка спалахувала б як
          жива дія. Цілий недоступний банер має власний стан .disabled
          нижче: гасити треба весь блок, а не саму лише кнопку. */
    .ui-alert:not(:has(.ui-btn:not(.secondary))):hover .ui-btn.secondary:not(.disabled):not(:disabled) {
        background: var(--ui-scope-fill, var(--ui-fill-accent));
        color: var(--ui-scope-on-fill, var(--ui-text-on-accent)); }
    .ui-alert:hover .ui-btn.secondary:not(.disabled):not(:disabled):hover { filter: brightness(0.92); }
}
/* У статусному банері колір веде СТАН, а не предмет: предметна кнопка на
   помаранчевому тлі попередження читалась як чужа. Скидаємо скоуп на акцент
   — брендова кнопка на статусному тлі це звичний контраст. */
.ui-alert.success, .ui-alert.danger, .ui-alert.warning, .ui-alert.neutral {
    --ui-scope-tint: var(--ui-tint-accent); --ui-scope-text: var(--ui-text-accent);
    --ui-scope-fill: var(--ui-fill-accent); --ui-scope-on-fill: var(--ui-text-on-accent); }

@media screen and (max-width: 640px) {
    /* На вузькому екрані банер стає сіткою, а не переносить рядокflex-ом.
       Причина: з flex-wrap перенести можна лише те, що не влазить, а нам
       треба інше — іконка мусить лишитись ПРИ заголовку, а вниз піти сама
       дія. Сітка це каже прямо: перший рядок «іконка | текст», другий —
       кнопка в колонці тексту. Через flex це виходило лише через
       flex-basis: 100% на тексті, і тоді іконка лишалась сама в рядку.
       Сторона та сама, що на широкому екрані: іконка веде читання зліва,
       і міняти це між екранами означало б два різні компоненти. */
    /* Разом із назвою уроку: там на телефоні теж 14 */
    .ui-alert-text > p { font-size: 14px; }
    .ui-alert { display: grid; grid-template-columns: auto 1fr;
        align-items: start; gap: 10px 12px; }
    .ui-alert > .ui-icon { grid-area: 1 / 1; }
    .ui-alert > .ui-alert-text { grid-area: 1 / 2; }
    /* Дія під текстом і по його лівому краю, а не під іконкою */
    .ui-alert > .ui-btn, .ui-alert > .ui-actions { grid-area: 2 / 2;
        justify-self: start; margin-left: 0; }
}

/* Тост (канон pl-toast: темна пігулка знизу по центру).
   API: uiToast('Текст', { type: 'success'|'danger'|'info', timeout,
   action: { label, onClick } }). Клік по тосту закриває його одразу;
   у стеку максимум 3. danger оголошується як role=alert. */
.ui-toasts { position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%);
    z-index: 200; display: flex; flex-direction: column; align-items: center; gap: 8px;
    pointer-events: none; }
.ui-toast { display: flex; align-items: center; gap: 8px; padding: 10px 18px;
    border-radius: var(--ui-radius-pill); background: var(--ui-surface-inverse);
    color: var(--ui-text-on-inverse); font-size: 14px; line-height: 20px; pointer-events: all;
    box-shadow: 0 4px 16px var(--ui-shadow-color); cursor: pointer; max-width: min(92vw, 480px);
    animation: ui-toast-in 0.25s ease; }
.ui-toast.leaving { opacity: 0; transform: translateY(6px); transition-property: var(--ui-transition-props); transition-duration: 0.25s; transition-timing-function: var(--ui-ease); }
.ui-toast > .ui-icon.s { flex: none; }
.ui-toast > .ui-icon.s::before { background: var(--ui-text-on-inverse); }
.ui-toast.success > .ui-icon.s::before { background: var(--ui-on-inverse-success); }
.ui-toast.danger  > .ui-icon.s::before { background: var(--ui-on-inverse-danger); }
.ui-toast.info    > .ui-icon.s::before { background: var(--ui-on-inverse-accent); }
.ui-toast-action { border: none; background: none; cursor: pointer; font: inherit;
    font-weight: 700; color: var(--ui-on-inverse-accent); padding: 2px 4px; margin-left: 4px;
    border-radius: var(--ui-radius-s); white-space: nowrap; }
@media (hover: hover) { .ui-toast-action:hover { text-decoration: underline; } }
@keyframes ui-toast-in { from { opacity: 0; transform: translateY(8px); } }

/* ---- Розмір і колір ----
   .l — банер, що стоїть окремим блоком у стрічці, поруч із блоками тем, а не
   всередині картки. Тому й ритм у нього блоковий: просторіший падинг і той
   самий радіус 24, що в .ui-lesson-group — інакше на одній вертикалі стояли
   б два різні заокруглення й ряд читався б як зібраний з чужих деталей. */
.ui-alert.l { gap: 16px; padding: 20px 24px; border-radius: var(--ui-radius-xl); }
.ui-alert.l > .ui-icon { width: 40px; height: 40px; -webkit-mask-size: 24px; mask-size: 24px; }
.ui-alert.l > .ui-alert-text > p { font-size: 16px; line-height: 22px; }

/* .hero — банер, який має зупинити. Це не наступний щабель після .l, а інша
   роль: .l ще стоїть у стрічці нарівні з блоками тем, а .hero очолює сторінку
   й мусить прочитатись ДО того, як око піде у зміст. Звідси й пропорції: слот
   іконки 56, заголовок 20 (єдиний банер, де він більший за назву уроку) і
   підпис у первинному кольорі, а не в тихому — тут він несе саме те, заради
   чого банер стоїть, тож і читатись має нарівні із заголовком. */
.ui-alert.hero { gap: 20px; padding: 28px 32px; border-radius: var(--ui-radius-xl); }
.ui-alert.hero > .ui-icon { width: 56px; height: 56px; -webkit-mask-size: 32px; mask-size: 32px; }
.ui-alert.hero > .ui-alert-text { gap: 6px; }
.ui-alert.hero > .ui-alert-text > p { font-size: 20px; line-height: 26px; font-weight: 600;
    letter-spacing: -0.3px; }
.ui-alert.hero > .ui-alert-text > span { font-size: 15px; line-height: 22px;
    color: var(--ui-text-primary); }

@media screen and (max-width: 640px) {
    /* Сітку банера ставить спільне правило вище; тут лише масштаб. Кнопка
       розтягується на всю колонку тексту (замість justify-self: start): на
       телефоні цей банер і є заклик до дії, і напівширока кнопка під ним
       читалася б як другорядна. */
    .ui-alert.hero { padding: 20px; gap: 12px 14px; }
    .ui-alert.hero > .ui-icon { width: 40px; height: 40px; -webkit-mask-size: 24px; mask-size: 24px; }
    .ui-alert.hero > .ui-alert-text > p { font-size: 17px; line-height: 23px; }
    .ui-alert.hero > .ui-alert-text > span { font-size: 14px; line-height: 20px; }
    .ui-alert.hero > .ui-btn { justify-self: stretch; }
}

/* Явний акцент замість кольору предмета: сторінка курсу фарбує повідомлення
   в предмет, але не кожне повідомлення про предмет — «час повторити» чи
   опитування стосуються навчання загалом.
   Заливка СУЦІЛЬНА, не тінт: цей банер стоїть окремим блоком у стрічці між
   білими картками тем, і 8% акценту там читались як ще одна бліда картка.
   Текст двома щаблями, як і на світлому: заголовок білий, підпис на щабель
   тихіший — роль «текст на темному», а не біле з прозорістю. */
.ui-alert.accent { background: var(--ui-fill-accent);
    --ui-scope-tint: var(--ui-tint-accent);
    --ui-scope-text: var(--ui-text-accent);
    --ui-scope-fill: var(--ui-fill-accent);
    --ui-scope-on-fill: var(--ui-text-on-accent); }
.ui-alert.accent > .ui-icon::before { background: var(--ui-text-on-accent); }
.ui-alert.accent .ui-alert-text > p { color: var(--ui-text-on-accent); }
.ui-alert.accent .ui-alert-text > span { color: var(--ui-text-on-inverse); }

/* ---- Стани банера ----
   Недоступний. Гасне ВЕСЬ банер, а не сама лише кнопка: коли текст лишався
   яскравим, а кнопка блідою, банер читався як живий з поламаною дією. Тепер
   він цілком відступає на другий план — рівно те, що означає «ще зарано».
   Кнопці всередині власний .disabled не потрібен: pointer-events тут уже
   знято з батька. */
.ui-alert.disabled { opacity: 0.55; pointer-events: none; }

/* Банер, що чекає дії: та сама переливна рамка, що в преміум-картці
   (селектор — у card.css, щоб опис контуру лишався один). Обрана саме вона,
   а не колір чи розмір: у стосі блоку всі банери однакові за формою, і
   тільки рух виділяє той, який справді треба пройти зараз.
   Колір — акцент, а не предмет: скоуп сторінки курсу фарбує повідомлення
   в колір предмета, і на історії цей банер ставав рожевим, тобто ставав
   у той самий ряд, з якого його якраз треба виділити. */
/* Прозора межа в 1px — місце під переливний контур: ::before стоїть на
   inset: -1px, тож без неї він частиною лягав би за межі коробки й на
   сусідні банери в стосі. Платформа має box-sizing: border-box, тож висота
   не змінюється — межа зʼїдає піксель падингу, а не додає його зовні. */
.ui-alert.active { position: relative; border: 1px solid transparent;
    --ui-scope-tint: var(--ui-tint-accent);
    --ui-scope-text: var(--ui-text-accent);
    --ui-scope-fill: var(--ui-fill-accent);
    --ui-scope-on-fill: var(--ui-text-on-accent);
    --ui-scope-sheen: var(--ui-sheen-color); }
/* znohub-ui · KPI-плитка і радіальний прогрес */

/* Стат-плитка (канон stat-item сторінки статистики) */
.ui-stat { display: flex; align-items: center; gap: 14px; padding: 16px;
    border-radius: var(--ui-radius-l); background: var(--ui-surface);
    border: 1px solid var(--ui-border-card); box-shadow: var(--ui-shadow-card); }
.ui-stat-icon { display: flex; align-items: center; justify-content: center; flex: none;
    width: 44px; height: 44px; border-radius: var(--ui-radius-m); background: var(--ui-tint-accent); }
.ui-stat-icon > .ui-icon::before { background: var(--ui-text-accent); }
.ui-stat-text { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ui-stat-text > span { color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; }
.ui-stat-text > p { color: var(--ui-text-primary); font-size: 20px; font-weight: 700;
    line-height: 26px; letter-spacing: -0.4px; }
.ui-stat.success .ui-stat-icon { background: var(--ui-tint-success); }
.ui-stat.success .ui-stat-icon > .ui-icon::before { background: var(--ui-text-success); }
.ui-stat.danger .ui-stat-icon { background: var(--ui-tint-danger); }
.ui-stat.danger .ui-stat-icon > .ui-icon::before { background: var(--ui-text-danger); }
.ui-stat.warning .ui-stat-icon { background: var(--ui-tint-warning); }
.ui-stat.warning .ui-stat-icon > .ui-icon::before { background: var(--ui-text-warning); }

/* Радіальний прогрес — ЄДИНИЙ компонент .ui-ring на інлайн-SVG.
   Розмітка: <div class="ui-ring [s|l|xl] [sub-*|success]" style="--val: 65">
     <svg aria-hidden="true"><circle pathLength="100"/><circle pathLength="100"/></svg>
     <span>65%</span>  АБО  <div class="ui-subject sub-*">  АБО  <span class="ui-icon …">
   pathLength=100 → прогрес чистим CSS: stroke-dasharray = --val із 100.
   Геометрія кола — CSS (r: calc(50% − половина лінії)), тож розміри
   міняє сам компонент; лінія 4px, кінці круглі (stroke-linecap).
   Колір: .success/.sub-a…f або власний через --ui-ring-fill.
   Розміри: .s 44 (вміст 28) · база 48 (32) · .l 64 (48) · .xl 96 (80). */
.ui-ring { --val: 0; --ui-ring-size: 48px; --ui-ring-line: 4; --ui-ring-fill: var(--ui-progress-fill);
    position: relative; width: var(--ui-ring-size); height: var(--ui-ring-size);
    border-radius: 50%; display: flex; align-items: center; justify-content: center; flex: none; }
.ui-ring > svg { position: absolute; inset: 0; width: 100%; height: 100%;
    transform: rotate(-90deg); }
.ui-ring > svg circle { cx: 50%; cy: 50%; r: calc(50% - var(--ui-ring-line) * 0.5px);
    fill: none; stroke-width: var(--ui-ring-line); }
.ui-ring > svg circle:first-child { stroke: var(--ui-progress-track); }
.ui-ring > svg circle:last-child { stroke: var(--ui-ring-fill); stroke-linecap: round;
    stroke-dasharray: var(--val) 100;
    /* зміна --val анімується (ріст результату, оновлення прогресу) */
    transition: stroke-dasharray 0.8s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.2s;
    /* при 0 круглий кап малював би крапку — гасимо смугу повністю */
    opacity: min(var(--val), 1); }
.ui-ring.s  { --ui-ring-size: 44px; }
.ui-ring.l  { --ui-ring-size: 64px; }
.ui-ring.xl { --ui-ring-size: 96px; }
/* Вміст: цифри. Одиниця (%, «дн») — вкладеним <i>: дрібніша й тихіша,
   щоб у центрі кільця читалося число, а не знак. Розмір в em, тож
   масштабується разом із кільцем на всіх розмірах. */
.ui-ring > span { position: relative; color: var(--ui-text-primary); font-weight: 700;
 font-size: 12px; }
.ui-ring > span > i { font-style: normal; font-size: 0.75em;
    color: var(--ui-text-secondary); margin-left: 1px; }
.ui-ring.s > span  { font-size: 11px; }
.ui-ring.l > span  { font-size: 15px; }
.ui-ring.xl > span { font-size: 22px; }
/* Вміст: предметна іконка — завжди на 16px менша за кільце
   (по 8px на бік: лінія 4 + повітря 4), розмір рахується сам */
.ui-ring > .ui-subject { position: relative;
    width: calc(var(--ui-ring-size) - 16px); height: calc(var(--ui-ring-size) - 16px); }
.ui-ring > .ui-subject::after { width: 22px; height: 22px; }
.ui-ring.s > .ui-subject::after  { width: 20px; height: 20px; }
.ui-ring.l > .ui-subject::after  { width: 30px; height: 30px; }
.ui-ring.xl > .ui-subject::after { width: 46px; height: 46px; }
/* Вміст: картинка (нагорода). Відступ 12px на бік (проти 8 у предметного
   слота): нагорода — не гліф на весь круг, їй потрібне повітря до лінії.
   .locked — стан «ще не відкрито»: картинка знебарвлюється й гасне до 0.2,
   хай там нагорода чи замок. Носій стану — саме приглушення, тож картинку
   сторінка обирає сама, а кільце поруч каже, скільки ще лишилось. */
.ui-ring > img { position: relative; object-fit: contain;
    width: calc(var(--ui-ring-size) - 24px); height: calc(var(--ui-ring-size) - 24px); }
.ui-ring.locked > img { filter: grayscale(1); opacity: 0.2; }
/* Дрібні кільця — під гліф, а не під число: лінія тонша, інакше на 22px
   кільце «заплило» б і вогника не було видно */
.ui-ring.xs { --ui-ring-size: 22px; --ui-ring-line: 2; }
.ui-ring.m  { --ui-ring-size: 36px; --ui-ring-line: 3; }
/* Вміст: іконка-гліф. На відміну від предметної, вона не заповнює кільце,
   а читається в центрі — тож розмір свій на кожен щабель */
.ui-ring > .ui-icon { position: relative; width: 18px; height: 18px; }
.ui-ring.xs > .ui-icon { width: 12px; height: 12px; }
.ui-ring.m  > .ui-icon { width: 16px; height: 16px; }
.ui-ring.l  > .ui-icon { width: 28px; height: 28px; }
.ui-ring.xl > .ui-icon { width: 40px; height: 40px; }

/* Серія (вогник): заливка streak, гліф тим самим кольором.
   .done — денну норму виконано: диск заливається суцільним, кільце ховаємо
   (прогрес уже не інформація), гліф стає контрастним.
   .zero — ще нічого не зроблено: гліф тихий, кільце порожнє. */
.ui-ring.streak { --ui-ring-fill: var(--ui-fill-streak); }
.ui-ring.streak > .ui-icon::before { background: var(--ui-fill-streak); }
.ui-ring.streak.zero > .ui-icon::before { background: var(--ui-text-muted); }
.ui-ring.streak.done { background: var(--ui-fill-streak); }
.ui-ring.streak.done > svg { display: none; }
.ui-ring.streak.done > .ui-icon::before { background: var(--ui-text-on-streak); }

.ui-ring.success { --ui-ring-fill: var(--ui-progress-fill-success); }

/* Тренд у стат-плитці: <span class="ui-stat-trend up">+12%</span> у <p> */
.ui-stat-trend { display: inline-flex; align-items: center; gap: 1px; margin-left: 6px;
    font-size: 12px; font-weight: 700; line-height: 16px; color: var(--ui-text-success);
    vertical-align: 3px; letter-spacing: 0; }
.ui-stat-trend::before { content: ""; width: 12px; height: 12px; background: currentColor;
    mask: url("data:image/svg+xml,%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 9.5V2.5M6 2.5L2.5 6M6 2.5L9.5 6' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='12' height='12' viewBox='0 0 12 12' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 9.5V2.5M6 2.5L2.5 6M6 2.5L9.5 6' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-stat-trend.down { color: var(--ui-text-danger); }
.ui-stat-trend.down::before { transform: rotate(180deg); }

/* Кільце: предметне забарвлення (яскрава смуга -bar) та іконка в центрі */
.ui-ring.sub-a { --ui-ring-fill: var(--ui-subject-a-bar); }
.ui-ring.sub-b { --ui-ring-fill: var(--ui-subject-b-bar); }
.ui-ring.sub-c { --ui-ring-fill: var(--ui-subject-c-bar); }
.ui-ring.sub-d { --ui-ring-fill: var(--ui-subject-d-bar); }
.ui-ring.sub-e { --ui-ring-fill: var(--ui-subject-e-bar); }
.ui-ring.sub-f { --ui-ring-fill: var(--ui-subject-f-bar); }
.ui-ring > .ui-icon { position: relative; }
.ui-ring > .ui-icon::before { background: var(--ui-text-secondary); }

/* znohub-ui · слайдер діапазону.
   Класи навмисно легасі (.range-slider*): за ними ходить драйвер (ui.js,
   initRangeSliders) і розмітка модалок цілі — на сторінці статистики та в
   завданні курсу. Тобто це не міст, а повноцінний компонент кита під наявним
   контрактом імен: перейменування зламало б слайдер МОВЧКИ (драйвер робить
   `if (!input) return`).
   Правила-двійники в new_style.css видалені — вони перекривались киттю лише
   частково (position/transform на тіках лишались абсолютними) і накладали
   мітки одна на одну. Тут єдине джерело правди.
   Розмітку міток будує драйвер із data-marks. */
.range-slider { width: 100%; padding-top: 30px; }
.range-slider-field { position: relative; display: flex; align-items: center; height: 20px; }

/* Трек: незалита частина — роль смуги прогресу, залиту малює main.js
   градієнтом (акцент), бо нативний input не має окремого елемента заливки. */
.range-slider-input { -webkit-appearance: none; appearance: none; width: 100%; height: 6px;
    margin: 0; outline: none; cursor: pointer; border-radius: var(--ui-radius-pill);
    background: var(--ui-progress-track); }
.range-slider-input:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 3px; }

/* Повзунок — CSS, а не data-URI svg: інакше колір зашитий у картинку і
   темна тема повз нього проходить. Кільце робить box-shadow, тож розмір
   кола не залежить від товщини обводки. */
.range-slider-input::-webkit-slider-thumb { -webkit-appearance: none; appearance: none;
    width: 20px; height: 20px; border-radius: var(--ui-radius-pill); cursor: grab;
    background: var(--ui-surface);
    box-shadow: inset 0 0 0 2px var(--ui-fill-accent), var(--ui-shadow-card); }
.range-slider-input::-moz-range-thumb { width: 20px; height: 20px; border: none;
    border-radius: var(--ui-radius-pill); cursor: grab; background: var(--ui-surface);
    box-shadow: inset 0 0 0 2px var(--ui-fill-accent), var(--ui-shadow-card); }
.range-slider-input:active::-webkit-slider-thumb { cursor: grabbing; }
.range-slider-input::-moz-range-track { background: transparent; }

/* Бульбашка зі значенням. Хвостик — повернутий квадрат під плашкою:
   один вузол замість картинки, колір спільний із плашкою. */
.range-slider-bubble { position: absolute; bottom: calc(100% + 10px); transform: translateX(-50%);
    z-index: 1; display: flex; align-items: center; justify-content: center; min-width: 40px;
    height: 26px; padding: 0 8px; border-radius: var(--ui-radius-s); pointer-events: none;
    background: var(--ui-fill-accent); color: var(--ui-text-on-accent);
    font-size: 13px; font-weight: 700; line-height: 18px; }
.range-slider-bubble::after { content: ""; position: absolute; top: 100%; left: 50%;
    width: 8px; height: 8px; margin: -4px 0 0 -4px; transform: rotate(45deg);
    background: var(--ui-fill-accent); border-radius: 1px; }

/* Мітки під треком — ФЛЕКСОМ, не абсолютом. Одна мітка = один вузол, у якому
   риска й підпис стоять одне під одним і центровані. Ширина мітки 20px під
   риску: підпис ширший і виступає симетрично, тож лишається відцентрованим
   на рисці — те саме, що давав абсолют із translateX(-50%), але без
   поштучного позиціонування.
   Умова, за якої space-between коректний: мітки рівномірні (у нас 100/150/200
   на діапазоні 100–200 — рівно 0/50/100%). Для нерівномірних довелося б
   повертати абсолют із відсотком на кожну. */
.range-slider-marks { display: flex; justify-content: space-between; margin-top: 6px; }
.range-slider-mark { flex: none; width: 20px; display: flex; flex-direction: column;
    align-items: center; gap: 4px; }
.range-slider-tick { width: 2px; height: 6px;
    border-radius: var(--ui-radius-pill); background: var(--ui-border-strong); }
.range-slider-label { color: var(--ui-text-secondary); font-size: 12px;
    font-weight: 400; line-height: 16px; white-space: nowrap; }
/* znohub-ui · картки з графіками (Chart.js).
   Кит володіє коробкою: розміром полотна, пончиком і маркером легенди.
   Кольори серій ставить сторінка — вона читає ті самі ролі (--ui-subject-*-bar,
   --ui-fill-accent) через getComputedStyle, тож тема лишається спільною. */
.ui-chart { position: relative; flex: 1; min-height: 200px; }
.ui-chart > canvas { display: block; }

/* Пончик: кільце з підсумком усередині + легенда збоку.
   Легенда — звичайний .ui-summary: підпис ліворуч, значення праворуч.
   Власного списку компонент не заводить, бо це той самий рядок «назва —
   значення», що в модалках. */
.ui-donut { display: flex; align-items: center; gap: 24px; flex-wrap: wrap; }
/* Ширина легенди обмежена: у широкій картці рядок «назва — частка»
   розтягувався на всю ширину, і частка відлітала від назви. */
.ui-donut > .ui-summary { flex: 1 1 170px; min-width: 0; max-width: 360px; }
.ui-donut-ring { position: relative; flex: none; width: 168px; height: 168px; }
/* Chart.js із maintainAspectRatio:false пише розмір полотна інлайном —
   перебиваємо, інакше при зміні теми/періоду кільце «пливе» */
.ui-donut-ring > canvas { width: 100% !important; height: 100% !important; }
.ui-donut-center { position: absolute; inset: 0; display: flex; flex-direction: column;
    align-items: center; justify-content: center; text-align: center; pointer-events: none; }
.ui-donut-center > b { color: var(--ui-text-primary); font-size: 28px; font-weight: 700;
    line-height: 32px; letter-spacing: -0.5px; }
.ui-donut-center > span { color: var(--ui-text-secondary); font-size: 12px; line-height: 16px; }

/* Маркер серії. Колір ставить сторінка інлайном: він приходить із даних
   (предмет, режим), а не зі стану компонента. */
.ui-dot { flex: none; width: 10px; height: 10px; border-radius: var(--ui-radius-pill);
    background: var(--ui-border-strong); }
/* znohub-ui · карта прогресу (адаптивне навчання).
   Плитка = блок тем: назва, бал блоку і статус відносно цільового бала НМТ.
   Кольори — власна рампа продукту (--ui-map-*): не предметна й не рівнева,
   бо це історична шкала карти, див. коментар у palette.css. */
.ui-map { display: grid; grid-template-columns: repeat(auto-fill, minmax(224px, 1fr)); gap: 12px; }
.ui-map-tile { position: relative; overflow: hidden; display: flex; flex-direction: column;
    min-height: 116px; padding: 16px; border-radius: var(--ui-radius-l);
    background: var(--ui-map-tint); }

/* Декор «хвилі». Форма кодує відстань до цілі: засвоєний блок — довга
   спокійна хвиля, далекий — тісний гострий зигзаг; дрейф так само
   пришвидшується. Опасіті 0.1: на 0.5 десяток плиток із рухомими лініями
   мерехтів в очах — на цій прозорості лінія читається як фактура тла.
   Маска, а не svg у кожній плитці: розмітка лишається одним вузлом, а колір
   бере статус. Фрагмент маски — рівно один період, що починається й
   закінчується на тій самій висоті, тож repeat-x стикується без шва, а
   зсув на цілий період замикає цикл. */
.ui-map-tile::before { content: ""; position: absolute; inset: 0; pointer-events: none;
    opacity: 0.1; background: var(--ui-map-fill);
    mask: var(--ui-map-wave) repeat-x 0 50%;
    mask-size: var(--ui-map-wave-w) 100%;
    -webkit-mask: var(--ui-map-wave) repeat-x 0 50%;
    -webkit-mask-size: var(--ui-map-wave-w) 100%;
    animation: ui-map-drift var(--ui-map-wave-sp) linear infinite; }
@keyframes ui-map-drift {
    to { mask-position: calc(-1 * var(--ui-map-wave-w)) 50%;
         -webkit-mask-position: calc(-1 * var(--ui-map-wave-w)) 50%; }
}
/* Рух не несе змісту: без нього хвиля лишається, просто стоїть */
@media (prefers-reduced-motion: reduce) {
    .ui-map-tile::before { animation: none; }
}

/* Назва обрізається трьома рядками: інакше один довгий блок тем робить
   ряд удвічі вищим за решту, і сітка розсипається. */
.ui-map-tile > p { position: relative; color: var(--ui-text-primary); font-size: 15px;
    font-weight: 700; line-height: 20px; letter-spacing: -0.2px;
    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; }

/* Метрика притиснута до низу (margin-top: auto) — бали стоять на одній
   лінії в усьому ряду, хоч би на скільки рядків розповзлась назва. */
.ui-map-metric { position: relative; margin-top: auto; padding-top: 12px;
    display: flex; flex-direction: column; }
.ui-map-metric > b { color: var(--ui-map-text); font-size: 28px; font-weight: 700;
    line-height: 32px; letter-spacing: -0.5px; }
/* Бала ще немає — тире тримає ту саму висоту, що й число, тож ряд плиток
   не стрибає. Замість смужки-плейсхолдера: та читалась як недомальований
   елемент інтерфейсу, а тире прямо каже «поки нічого». */
.ui-map-metric > b.empty { color: var(--ui-text-muted); }
.ui-map-metric > span { color: var(--ui-map-text); font-size: 13px; font-weight: 500;
    line-height: 18px; }

/* CTA замість метрики: кнопка стає на її місце, тому теж притиснута до низу */
.ui-map-tile > .ui-btn { position: relative; margin-top: auto; align-self: flex-start; }

/* ---- Статуси. 5 — ціль узято, 1 — далеко від неї ---- */
.ui-map-tile.done   { --ui-map-fill: var(--ui-map-5-fill); --ui-map-tint: var(--ui-map-5-tint); --ui-map-text: var(--ui-map-5-text); }
.ui-map-tile.done { --ui-map-wave: url("data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20190%20120'%20fill='none'%20stroke='%23000'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'><path%20opacity='0.55'%20d='M0%2034%20Q47.5%2026%2095%2034%20T190%2034'/><path%20opacity='0.35'%20d='M0%2066%20Q47.5%2058%2095%2066%20T190%2066'/><path%20opacity='0.22'%20d='M0%2098%20Q47.5%2090%2095%2098%20T190%2098'/></svg>"); --ui-map-wave-w: 190px; --ui-map-wave-sp: 34s; }
.ui-map-tile.near10 { --ui-map-fill: var(--ui-map-4-fill); --ui-map-tint: var(--ui-map-4-tint); --ui-map-text: var(--ui-map-4-text); }
.ui-map-tile.near10 { --ui-map-wave: url("data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2095%20120'%20fill='none'%20stroke='%23000'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'><path%20opacity='0.55'%20d='M0%2034%20Q23.75%2022%2047.5%2034%20T95%2034'/><path%20opacity='0.35'%20d='M0%2066%20Q23.75%2054%2047.5%2066%20T95%2066'/><path%20opacity='0.22'%20d='M0%2098%20Q23.75%2086%2047.5%2098%20T95%2098'/></svg>"); --ui-map-wave-w: 95px; --ui-map-wave-sp: 26s; }
.ui-map-tile.near20 { --ui-map-fill: var(--ui-map-3-fill); --ui-map-tint: var(--ui-map-3-tint); --ui-map-text: var(--ui-map-3-text); }
.ui-map-tile.near20 { --ui-map-wave: url("data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2063%20120'%20fill='none'%20stroke='%23000'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'><path%20opacity='0.55'%20d='M0%2034%20Q15.75%2016%2031.5%2034%20T63%2034'/><path%20opacity='0.35'%20d='M0%2066%20Q15.75%2048%2031.5%2066%20T63%2066'/><path%20opacity='0.22'%20d='M0%2098%20Q15.75%2080%2031.5%2098%20T63%2098'/></svg>"); --ui-map-wave-w: 63px; --ui-map-wave-sp: 19s; }
.ui-map-tile.warn30 { --ui-map-fill: var(--ui-map-2-fill); --ui-map-tint: var(--ui-map-2-tint); --ui-map-text: var(--ui-map-2-text); }
.ui-map-tile.warn30 { --ui-map-wave: url("data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2048%20120'%20fill='none'%20stroke='%23000'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'><path%20opacity='0.55'%20d='M0%2034%20L12%2014%20L24%2034%20L36%2054%20L48%2034'/><path%20opacity='0.35'%20d='M0%2066%20L12%2046%20L24%2066%20L36%2086%20L48%2066'/><path%20opacity='0.22'%20d='M0%2098%20L12%2078%20L24%2098%20L36%20118%20L48%2098'/></svg>"); --ui-map-wave-w: 48px; --ui-map-wave-sp: 13s; }
.ui-map-tile.far    { --ui-map-fill: var(--ui-map-1-fill); --ui-map-tint: var(--ui-map-1-tint); --ui-map-text: var(--ui-map-1-text); }
.ui-map-tile.far { --ui-map-wave: url("data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2038%20120'%20fill='none'%20stroke='%23000'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'><path%20opacity='0.55'%20d='M0%2034%20L9.5%204%20L19%2034%20L28.5%2064%20L38%2034'/><path%20opacity='0.35'%20d='M0%2066%20L9.5%2036%20L19%2066%20L28.5%2096%20L38%2066'/><path%20opacity='0.22'%20d='M0%2098%20L9.5%2068%20L19%2098%20L28.5%20128%20L38%2098'/></svg>"); --ui-map-wave-w: 38px; --ui-map-wave-sp: 8s; }
/* Розпочато, бала ще немає */
.ui-map-tile.progress { --ui-map-fill: var(--ui-fill-accent); --ui-map-tint: var(--ui-tint-accent); --ui-map-text: var(--ui-text-accent); }
/* Не розпочато: сіра утоплена поверхня, а не світлий хекс — інакше в
   темній темі плитка світилась білою плямою (15.18 до картки). */
.ui-map-tile.idle { --ui-map-fill: var(--ui-border-strong); --ui-map-tint: var(--ui-surface-sunken);
    --ui-map-text: var(--ui-text-secondary); }
.ui-map-tile.idle > p { color: var(--ui-text-secondary); }
/* Плитка з CTA завжди акцентна, хоч би який статус мала */
.ui-map-tile.cta { --ui-map-fill: var(--ui-fill-accent); --ui-map-tint: var(--ui-tint-accent);
    --ui-map-text: var(--ui-text-accent); }

/* Бала ще немає — форма нічого не кодує, тож найспокійніша хвиля */
.ui-map-tile.progress, .ui-map-tile.idle, .ui-map-tile.cta {
    --ui-map-wave: url("data:image/svg+xml,<svg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20190%20120'%20fill='none'%20stroke='%23000'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'><path%20opacity='0.55'%20d='M0%2034%20Q47.5%2026%2095%2034%20T190%2034'/><path%20opacity='0.35'%20d='M0%2066%20Q47.5%2058%2095%2066%20T190%2066'/><path%20opacity='0.22'%20d='M0%2098%20Q47.5%2090%2095%2098%20T190%2098'/></svg>");
    --ui-map-wave-w: 190px; --ui-map-wave-sp: 40s; }

@media (max-width: 480px) {
    .ui-map { grid-template-columns: 1fr; }
}
/* znohub-ui · дрібні примітиви: аватар, бейдж, тултіп, скелетон, список опцій, fab */

/* Аватар: розмірна шкала + фолбек-ініціали */
/* Тінт і текст — зі скоупу з відкатом на акцент: у предметному контексті
   (вікно «команда підтримки» на сторінці курсу) фолбек-ініціали мають
   звучати кольором предмета, а поза скоупом нічого не змінюється. */
.ui-avatar { display: flex; align-items: center; justify-content: center; flex: none;
    width: 40px; height: 40px; border-radius: 50%; overflow: hidden;
    background: var(--ui-scope-tint, var(--ui-tint-accent));
    color: var(--ui-scope-text, var(--ui-text-accent));
    font-size: 15px; font-weight: 700; }
.ui-avatar > img { width: 100%; height: 100%; object-fit: cover; }
.ui-avatar.s { width: 32px; height: 32px; font-size: 12px; }
.ui-avatar.l { width: 56px; height: 56px; font-size: 20px; }
.ui-avatar.xl { width: 96px; height: 96px; font-size: 32px; }

/* ---- Людина ----
   Аватар, імʼя з роллю, контакт і дія — вікно «твоя команда» (куратор,
   бадді), картка викладача. Не .ui-row: там усе живе в один рядок, а тут
   під шапкою ще опис і кнопка на всю ширину. */
.ui-person { display: flex; flex-direction: column; gap: 12px; }
.ui-person-head { display: flex; align-items: center; gap: 12px; }
.ui-person-name { display: flex; flex-direction: column; align-items: flex-start;
    gap: 4px; min-width: 0; }
.ui-person-name > b { color: var(--ui-text-primary); font-size: 17px; font-weight: 700;
    line-height: 23px; letter-spacing: -0.3px; }
/* Роль і контакт — один рядок, а не два: це одна відповідь на питання «хто
   це і як писати», і в колонці вони читались як два різні факти. Перенос
   дозволений: на вузькому екрані тег іде під роль сам. */
.ui-person-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
    min-width: 0; color: var(--ui-text-secondary); font-size: 14px;
    font-weight: 400; line-height: 20px; }
.ui-person > p { color: var(--ui-text-secondary); font-size: 14px; line-height: 20px; }
/* Перегородка між людьми, коли їх кілька підряд — але лише для голих
   блоків: у карток межу вже несе сама підкладка. */
.ui-person:not(.card) + .ui-person:not(.card) {
    padding-top: 24px; border-top: 1px solid var(--ui-border-subtle); }
/* .card — людина окремою карткою. Потрібна там, де їх кілька і кожну можна
   вибрати: підкладка каже, де закінчується одна й починається наступна,
   виразніше за волосінь між ними. */
.ui-person.card { padding: 16px; border-radius: var(--ui-radius-l);
    background: var(--ui-surface-sunken); }

/* Бейдж-лічильник (канон wr-nav-badge) */
.ui-badge { display: inline-flex; align-items: center; justify-content: center;
    min-width: 20px; height: 20px; padding: 0 6px; border-radius: var(--ui-radius-pill);
    background: var(--ui-fill-accent); color: var(--ui-text-on-accent);
    font-size: 11px; font-weight: 700; line-height: 1; }
/* Розміри — варіанти канону, не окремі компоненти. Контекстні селектори
   стоять поруч із варіантом у тому самому правилі: чіп і таби беруть .s,
   таб-бар — .xs (бейдж накладається на іконку, тому дрібніший). Так само
   значення живуть в одному місці — раніше правило чіпа й правило табів
   були байт-у-байт однакові, а таб-бар тримав третій набір чисел. */
.ui-badge.s, .ui-chip > .ui-badge, .ui-tabs > .item > .ui-badge {
    min-width: 18px; height: 18px; padding: 0 5px; font-size: 10px; }
.ui-badge.xs, .ui-tabbar-item > .ui-badge {
    min-width: 16px; height: 16px; padding: 0 4px; font-size: 9px; }
.ui-badge.danger { background: var(--ui-fill-danger); color: var(--ui-text-on-fill); }
.ui-badge.quiet { background: var(--ui-surface-sunken); color: var(--ui-text-secondary); }

/* Тултіп: CSS-only через data-tip (на платформі був лише голий title="") */
.ui-tip { position: relative; }
.ui-tip::after { content: attr(data-tip); position: absolute; bottom: calc(100% + 8px);
    left: 50%; transform: translateX(-50%) translateY(2px); z-index: 50;
    padding: 6px 10px; border-radius: var(--ui-radius-s); background: var(--ui-surface-inverse);
    color: var(--ui-text-on-inverse); font-size: 12px; line-height: 16px;
    width: max-content; max-width: min(260px, 78vw);
    opacity: 0; pointer-events: none; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
.ui-tip:hover::after, .ui-tip:focus-visible::after { opacity: 1; transform: translateX(-50%); }

/* Скелетон */
.ui-skeleton { border-radius: var(--ui-radius-s); background: var(--ui-surface-sunken);
    position: relative; overflow: hidden; }
.ui-skeleton::after { content: ""; position: absolute; inset: 0;
    background: linear-gradient(90deg, transparent, var(--ui-surface-hover), transparent);
    animation: ui-skeleton 1.4s infinite; }
@keyframes ui-skeleton { from { transform: translateX(-100%); } to { transform: translateX(100%); } }
.ui-skeleton.text { height: 14px; }
.ui-skeleton.title { height: 22px; width: 60%; }
.ui-skeleton.circle { border-radius: 50%; }

/* Список опцій (іконка + назва + підпис + шеврон) — примара wr-calendar-options */
.ui-options { display: flex; flex-direction: column; gap: 6px; }
.ui-option { display: flex; align-items: center; gap: 12px; padding: 12px 14px;
    border: none; text-align: left; border-radius: var(--ui-radius-m);
    background: var(--ui-surface-sunken); cursor: pointer; font-family: inherit;
    text-decoration: none; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
@media (hover: hover) { .ui-option:hover { background: var(--ui-surface-sunken-hover); } }
.ui-option-icon { display: flex; align-items: center; justify-content: center; flex: none;
    width: 40px; height: 40px; border-radius: var(--ui-radius-m); background: var(--ui-surface); }
.ui-option-text { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ui-option-text > p { color: var(--ui-text-primary); font-size: 14px; font-weight: 500; line-height: 20px; }
.ui-option-text > span { color: var(--ui-text-secondary); font-size: 12.5px; line-height: 17px; }
.ui-option > .ui-row-chev { margin-left: auto; }

/* Кружок з іконкою — нейтральна заміна предмета чи аватара там, де
   картинки просто немає: операція в історії, подія в стрічці. Тягнеться
   на всю зону, в яку вкладений (як .ui-avatar), тож розмір задає слот. */
.ui-icon-circle { display: flex; align-items: center; justify-content: center;
    width: 100%; height: 100%; border-radius: 50%; background: var(--ui-surface-sunken); }
.ui-icon-circle > .ui-icon { width: 20px; height: 20px; }
.ui-icon-circle.s > .ui-icon { width: 18px; height: 18px; }
/* .l — слот шапки сторінки (64×64): рядковий гліф у ньому губився крапкою */
.ui-icon-circle.l > .ui-icon { width: 28px; height: 28px; }
.ui-icon-circle > .ui-icon::before { background: var(--ui-text-secondary); }

/* Монета внутрішньої валюти. Шкала: 14 (.s, у рядку) · 18 (база) · 24 (.l).
   .xl — не рядковий розмір, а іконка балансу в .ui-page-head: слот там
   рівно 64×64, тож монета заповнює його цілком */
/* Бейдж преміуму — накладка на кут слота аватара/предмета.
   Композиція, а не картинка: коло — заливка акценту, корона — маска i-king.
   Тому темується разом із рештою і не тягне окремий asset. Обідок кольору
   поверхні «вирізає» бейдж із аватарки, як крапка статусу.
   Слот-батько має бути position: relative — це дає .ui-subject-slot. */
.ui-premium-badge { position: absolute; right: -4px; bottom: -4px; z-index: 1;
    width: 24px; height: 24px; flex: none; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    background: var(--ui-scope-fill, var(--ui-fill-accent)); border: 2px solid var(--ui-surface); }
.ui-premium-badge > .ui-icon { width: 12px; height: 12px; }
.ui-premium-badge > .ui-icon::before { background: var(--ui-scope-on-fill, var(--ui-text-on-accent)); }

.ui-coin { width: 18px; height: 18px; flex: none; }
/* Плашка коїнів: сума → монетка → хвіст. Монетка стоїть саме МІЖ ними, бо
   вона тут одиниця виміру, а не іконка-прикраса: «+50 🪙 · до 12.03»
   читається як «плюс п'ятдесят монет до 12 березня». Тому й розмітка з
   трьох шматків, а не готовий рядок.
   Стани — ролі кіта, не власні кольори: строк іще є (акцент), дедлайн
   сьогодні (danger), уже нараховано (success), проґавлено (сіре).
   .extend — єдиний стан-кнопка: пропонує купити продовження, тож і межа
   пунктирна, щоб не читався як просто позначка.
   Розмір один — 22px: плашка стоїть і окремим елементом (над назвою картки,
   в банері), і в рядку метаданих поруч із датою, а два розміри на ці два
   випадки давали різнобій між сусідніми екранами. vertical-align на базі — щоб у рядковому
   контексті вона не сідала на базову лінію і не зʼїжджала вниз. */
.ui-coin-badge { display: inline-flex; align-items: center; gap: 4px; width: fit-content;
    height: 22px; padding: 0 8px; border: none; border-radius: var(--ui-radius-pill);
    /* Тінт лежить НА білому полотні, а не просто заливає плашку: усі
       --ui-tint-* напівпрозорі, тож на кольоровому тлі (банер із заливкою,
       тінтований алерт) вони змішувались із тим, що позаду, і той самий
       стан на двох екранах давав два різні кольори. Два шари — колір тла
       плюс градієнт з однієї барви — тримають відтінок чистим. */
    background-color: var(--ui-surface);
    background-image: linear-gradient(var(--ui-tint-accent), var(--ui-tint-accent));
    /* Межа прозора: контур малює переливна рамка нижче. Тінь лишається як
       опора — від неї відштовхується ::before, і геометрія плашки не
       залежить від box-sizing сторінки. */
    position: relative;
    box-shadow: inset 0 0 0 1px transparent;
    /* Колір переливу — свій на кожен стан */
    --ui-badge-sheen: var(--ui-tint-accent-hover);
    --ui-badge-fill: var(--ui-fill-accent);
    color: var(--ui-text-accent);
    font-family: inherit; font-size: 12px; font-weight: 500; line-height: 16px;
    white-space: nowrap; vertical-align: middle;
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration); transition-timing-function: var(--ui-ease); }
/* Монету міряє сама плашка: розмір тут не вибір автора розмітки, а частина
   компонента — на 22px це 12. Відʼємний відступ ліворуч підтягує її до суми:
   монета тут одиниця виміру при числі («+50 монет»), а не окремий елемент
   переліку, тож перед нею просвіт має бути вужчий, ніж перед хвостом. */
.ui-coin-badge > .ui-coin { width: 12px; height: 12px; margin-left: -2px; }
.ui-coin-badge.today { background-image: linear-gradient(var(--ui-tint-danger), var(--ui-tint-danger));
    --ui-badge-sheen: var(--ui-tint-danger-hover); --ui-badge-fill: var(--ui-fill-danger);
    color: var(--ui-text-danger); }
/* Уже нараховане — доконаний факт, а не те, за чим стежити: тому зелена
   плашка ще й тихіша за решту. Поруч із активними дедлайнами (акцент) і
   сьогоднішнім (danger) вона інакше тягнула б на себе стільки ж уваги. */
.ui-coin-badge.earned { background-image: linear-gradient(var(--ui-tint-success), var(--ui-tint-success));
    --ui-badge-sheen: var(--ui-tint-success-hover); --ui-badge-fill: var(--ui-fill-success-strong);
    color: var(--ui-text-success); opacity: 0.6; }
/* Проґавлений дедлайн: сіріє і сама монета — інакше вона світилась би
   синім на згаслій плашці й тягнула б увагу на те, чого вже не буде. */
.ui-coin-badge.expired { background-image: linear-gradient(var(--ui-surface-sunken), var(--ui-surface-sunken));
    box-shadow: inset 0 0 0 1px var(--ui-border-subtle); color: var(--ui-text-secondary); }
.ui-coin-badge.expired > .ui-coin { filter: grayscale(1); opacity: 0.55; }
/* Переливна рамка — той самий контур, що в преміум-картці (опис у card.css),
   лише в кольорі стану. Проґавлений і .extend її не беруть: перший мертвий,
   у другого вже є власна пунктирна межа, яка каже «сюди можна натиснути». */
.ui-coin-badge:not(.expired):not(.extend)::before {
    content: ""; position: absolute; inset: 0; pointer-events: none;
    border-radius: inherit; padding: 1px;
    background: linear-gradient(90deg, transparent 0%,
        var(--ui-badge-sheen) 44%, var(--ui-badge-fill) 50%,
        var(--ui-badge-sheen) 56%, transparent 100%);
    background-size: 300% 100%;
    -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    -webkit-mask-composite: xor;
    mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    mask-composite: exclude;
    animation: ui-premium-sheen 5s linear infinite; }
/* Рух — не носій сенсу: контур лишається, просто перестає переливатись */
@media (prefers-reduced-motion: reduce) {
    .ui-coin-badge::before { animation: none; background-position: 50% 0; }
}
/* У .extend межа своя — пунктирна й суцільного кольору: вона каже «сюди
   можна натиснути», тож тиха тінтова обводка тут зайва. */
.ui-coin-badge.extend { cursor: pointer; box-shadow: none;
    border: 1px dashed var(--ui-border-accent); }
.ui-coin-badge.extend:focus-visible { outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }
@media (hover: hover) {
    .ui-coin-badge.extend:hover {
        background-image: linear-gradient(var(--ui-tint-accent-hover), var(--ui-tint-accent-hover)); }
}
.ui-coin.s { width: 14px; height: 14px; }
.ui-coin.l { width: 24px; height: 24px; }
.ui-coin.xl { width: 64px; height: 64px; }

/* Ціна: число, одиниця тихим підписом, стара ціна — перекреслена muted.
   Стара ціна доречна лише там, де нова справді нижча; «−0%» не малюємо. */
.ui-price { display: inline-flex; align-items: baseline; gap: 6px; }
/* Монета в ціні вирівнюється по центру рядка, а не по базовій лінії */
.ui-price > .ui-coin { align-self: center; }
.ui-price > b { color: var(--ui-text-primary); font-size: 20px; font-weight: 700;
    line-height: 26px; letter-spacing: -0.4px; }
.ui-price > span { color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; }
.ui-price > s { color: var(--ui-text-muted); font-size: 13px; line-height: 18px; }
.ui-price.s > b { font-size: 17px; line-height: 23px; letter-spacing: -0.3px; }
/* Напрямок операції в історії: нарахування зелене, витрачене й згоріле —
   тихе. Списання не червоне свідомо: витратити коїни — це не помилка */
.ui-price.in > b { color: var(--ui-text-success); }
.ui-price.out > b { color: var(--ui-text-muted); }
.ui-price.l > b { font-size: 28px; line-height: 34px; letter-spacing: -0.56px; }

/* Плашка балансу монет: монета — сума — дія «як заробити». Шапка маркету.
   Не .ui-coin-badge: та рядкова (22px) і живе всередині тексту, а ця стоїть
   у ряду з кнопкою сторінки, тож і висота в неї контрольна — 40, як у
   кнопки, і штатна .s (32) всередині поміщається з полем 4. */
.ui-balance { display: inline-flex; align-items: center; gap: 8px; flex: none;
    height: 40px; padding: 0 4px 0 14px; border-radius: var(--ui-radius-pill);
    background: var(--ui-surface); border: 1px solid var(--ui-border-card);
    box-shadow: var(--ui-shadow-card); }
.ui-balance > b { color: var(--ui-text-primary); font-size: 15px; font-weight: 700;
    line-height: 22px; letter-spacing: -0.1px; }

/* Скелетон-пресети: рядок списку та картка */
.ui-skeleton-row { display: flex; align-items: center; gap: 12px; }
.ui-skeleton-row > .ui-skeleton.circle { width: 40px; height: 40px; flex: none; }
.ui-skeleton-stack { display: flex; flex-direction: column; gap: 8px; flex: 1; min-width: 0; }
@media (prefers-reduced-motion: reduce) { .ui-skeleton::after { animation: none; } }

/* Заголовок лише для читачів екрана: сторінка може не показувати h1 у
   макеті, але без нього втрачається орієнтир — і в скрінрідері, і в пошуку. */
.ui-sr-only { position: absolute; width: 1px; height: 1px; margin: -1px;
    padding: 0; border: 0; overflow: hidden; white-space: nowrap;
    clip: rect(0 0 0 0); clip-path: inset(50%); }
/* znohub-ui · шкала віх — трек із точками-етапами на шляху до цілі.
   Канон: .streak-win-scale платформи (вікно серії).

   Розмітка:
     .ui-milestones            трек
       > i.fill                заповнення (ширина інлайном, % від бекенда)
       > .ui-milestone         віха; позиція інлайном через --at
           > span              підпис зверху (число)
           > i                 точка на треку
           > .ui-tag           нагорода знизу (необовʼязково)

   Стани віхи: .done — досягнута поточним значенням · .past — брали раніше,
   але зараз лічильник нижчий (нагороду вже видано, тому тихіша).

   Позиції точок рахує бекенд і шле в --at: розкидання по треку залежить
   від кількості віх, а CSS про неї не знає. --}}
*/
.ui-milestones { position: relative; height: 6px; border-radius: var(--ui-radius-pill);
    background: var(--ui-progress-track); }
.ui-milestones > .fill { position: absolute; left: 0; top: 0; height: 100%;
    border-radius: var(--ui-radius-pill); background: var(--ui-progress-fill);
    transition: width 0.3s; }

.ui-milestone { position: absolute; top: 50%; left: var(--at, 0%); transform: translate(-50%, -50%); }
/* Точка «вирізана» з треку кільцем кольору поверхні — як у макеті */
.ui-milestone > i { position: relative; display: block; width: 20px; height: 20px;
    border-radius: 50%; border: 2px solid var(--ui-surface); background: var(--ui-progress-track); }
.ui-milestone.done > i { background: var(--ui-fill-accent); }
/* Взята раніше віха: та сама галочка, але тихим сірим — нагорода вже видана */
.ui-milestone.past > i { background: var(--ui-text-muted); }
/* Взята віха сіра, не акцентна — галочка на ній лишається білою в обох темах */
.ui-milestone.past > i::after { background: var(--ui-text-on-fill); }
.ui-milestone.done > i::after, .ui-milestone.past > i::after {
    content: ""; position: absolute; inset: 3px; background: var(--ui-text-on-accent);
    mask: url("data:image/svg+xml,%3Csvg width='14' height='14' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.5 7.5L5.5 10.5L11.5 3.5' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='14' height='14' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.5 7.5L5.5 10.5L11.5 3.5' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain; }

/* :not(.ui-tag) обовʼязково: нагорода — теж прямий <span>, і без цього
   вона діставала б і позицію підпису (bottom), і його колір */
.ui-milestone > span:not(.ui-tag) { position: absolute; bottom: calc(100% + 10px); left: 50%;
    transform: translateX(-50%); white-space: nowrap;
    color: var(--ui-text-secondary); font-size: 13px; font-weight: 500; line-height: 18px; }
.ui-milestone.done > span:not(.ui-tag),
.ui-milestone.past > span:not(.ui-tag) { color: var(--ui-text-muted); }

.ui-milestone > .ui-tag { position: absolute; top: calc(100% + 10px); left: 50%;
    transform: translateX(-50%); }
/* Нагорода вже отримана — тихне, але лишається читабельною (не opacity) */
.ui-milestone.past > .ui-tag { color: var(--ui-text-muted); }
/* znohub-ui · шелл застосунку
   Десктоп (≥1024): сайдбар зліва + контент. Мобільний (<1024): верхня
   панель + нижній таб-бар. Скрол — документний (сайдбар липкий),
   на відміну від legacy-шелла з overflow:hidden на body. */

/* isolation — під градієнт шелу (.ui-main::before, z-index -1): без власного
   контексту накладання псевдоелемент із відʼємним z-index пірнув би під фон
   самої .ui-app і став би невидимим. Модалки це не зачіпає: ті, що лежать у
   <body> перед шелом, мають z-index 100 і лишаються вище; ті, що всередині —
   у тому самому контексті, де сайдбар має лише 40. */
.ui-app { min-height: 100dvh; background: var(--ui-surface-page); isolation: isolate; }
/* Легасі style.css ставить body { overflow: hidden } під власну модель скролу —
   шелл kit працює документним скролом */
body.ui-shell { overflow: auto; height: auto; display: block; background: var(--ui-surface-page); }

/* ---- Сайдбар (десктоп) ---- */
.ui-sidebar { position: fixed; inset: 0 auto 0 0; z-index: 40; width: var(--ui-sidebar-width);
    display: flex; flex-direction: column; gap: 2px; padding: 12px;
    border-right: 1px solid var(--ui-border-subtle);
    overflow-y: auto; }
.ui-sidebar-head { display: flex; align-items: center; justify-content: space-between;
    padding: 4px 10px 16px; }
.ui-sidebar-logo { display: flex; align-items: center; transition: opacity 0.15s; }
.ui-sidebar-logo img { height: 24px; }
/* Лого веде на головну — єдине посилання шела, що не мало жодної реакції */
@media (hover: hover) { .ui-sidebar-logo:hover { opacity: 0.7; } }
.ui-sidebar-profile { display: flex; align-items: center; gap: 10px; padding: 12px;
    border-radius: var(--ui-radius-l); text-decoration: none; margin-bottom: 12px;
    background: var(--ui-surface); border: 1px solid var(--ui-border-card); transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
@media (hover: hover) { .ui-sidebar-profile:hover { box-shadow: var(--ui-shadow-card-hover); transform: translateY(-1px); } }
/* Прес: картка «сідає» назад і тінь зникає */
.ui-sidebar-profile:active { transform: translateY(0); box-shadow: none; }
.ui-sidebar-profile .ui-avatar { width: 36px; height: 36px; font-size: 13px; }
.ui-sidebar-profile-text { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ui-sidebar-profile-text > p { color: var(--ui-text-primary); font-size: 14px; font-weight: 700;
    line-height: 20px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ui-sidebar-profile-text > span { display: flex; align-items: center; gap: 6px;
    color: var(--ui-text-secondary); font-size: 12px; line-height: 16px; }
.ui-sidebar-profile > .ui-row-chev { margin-left: auto; }

/* Вогник стріка з кільцем денної цілі: --val = відсоток виконання
   (today_count/daily_target), .done — день зараховано */
/* Група «профіль + серія» вгорі сайдбара/шита */
/* flex: none — інакше блок профілю й серії стискається, коли колонці
   бракує висоти, і картка серії з'їжджає до кількох пікселів разом із
   вмістом. Вільну висоту забирає .ui-sidebar-spacer, не цей блок. */
.ui-sidebar-user { display: flex; flex-direction: column; gap: 8px;
    margin-bottom: 12px; flex: none; }
.ui-sidebar-user > .ui-sidebar-profile, .ui-sidebar-user > .ui-streak-card { margin-bottom: 0; }

/* Блок серії: шапка з вогником і числом днів + тижнева стрічка Пн–Нд.
   Стани днів: earned · frozen (заморозка) · pending (сьогодні) · missed · future */
.ui-streak-card { display: flex; flex-direction: column; gap: 10px; padding: 12px;
    border-radius: var(--ui-radius-l); background: var(--ui-surface);
    border: 1px solid var(--ui-border-card); margin-bottom: 12px; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
@media (hover: hover) { .ui-streak-card:hover { box-shadow: var(--ui-shadow-card-hover); transform: translateY(-1px); } }
.ui-streak-card:active { transform: translateY(0); box-shadow: none; }
.ui-streak-card-head { display: flex; align-items: center; gap: 8px; }
/* Стат-колонка (формула лендингу: число + тихий підпис) */
.ui-streak-stat { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ui-streak-stat > b { color: var(--ui-text-primary); font-size: 14px; font-weight: 700;
    line-height: 20px; letter-spacing: -0.4px;
    white-space: nowrap; }
.ui-streak-stat > span { color: var(--ui-text-secondary); font-size: 11px; line-height: 15px;
    white-space: nowrap; }
/* Клік по картці згортає деталі тижня (клас ставить ui.js, стан у localStorage) */
.ui-streak-card { cursor: pointer; }
/* .collapsed лишається як інертний клас: розгортання прибрано, картка
   тепер відкриває вікно серії. Правило тримаємо, щоб стара розмітка з
   цим класом не показала тиждень раптово. */
.ui-streak-card.collapsed .ui-streak-divider,
.ui-streak-card.collapsed .ui-streak-week { display: none; }
/* Штриховий розділювач «сьогодні | тиждень»: штрих 4px, проміжок 4px */
.ui-streak-divider { height: 1px;
    background: repeating-linear-gradient(90deg,
        var(--ui-border-subtle) 0 4px, transparent 4px 8px); }
.ui-streak-week { display: flex; justify-content: space-between; }
.ui-streak-day { display: flex; flex-direction: column; align-items: center; gap: 4px; }
.ui-streak-day > i { width: 22px; height: 22px; border-radius: 50%; position: relative;
    background: var(--ui-border-subtle); }
.ui-streak-day > span { font-size: 10px; font-weight: 700; letter-spacing: 0.2px;
    color: var(--ui-text-muted); }
.ui-streak-day.earned > i { background: var(--ui-fill-success); }
.ui-streak-day.earned > i::after { content: ""; position: absolute; inset: 5px;
    background: var(--ui-text-on-fill);
    mask: url("data:image/svg+xml,%3Csvg width='14' height='14' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.5 7.5L5.5 10.5L11.5 3.5' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='14' height='14' viewBox='0 0 14 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.5 7.5L5.5 10.5L11.5 3.5' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-streak-day.earned > span { color: var(--ui-text-success); }
.ui-streak-day.frozen > i { background: var(--ui-subject-a-tint-strong); }
.ui-streak-day.frozen > i::after { content: ""; position: absolute; inset: 5px;
    background: var(--ui-subject-a-text);
    mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12%203.5V20.5M19.36%207.75L4.64%2016.25M4.64%207.75L19.36%2016.25%22%20stroke=%22black%22%20stroke-width=%222.6%22%20stroke-linecap=%22round%22/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg%20width=%2224%22%20height=%2224%22%20viewBox=%220%200%2024%2024%22%20fill=%22none%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cpath%20d=%22M12%203.5V20.5M19.36%207.75L4.64%2016.25M4.64%207.75L19.36%2016.25%22%20stroke=%22black%22%20stroke-width=%222.6%22%20stroke-linecap=%22round%22/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-streak-day.pending > i { background: none; border: 2px dashed var(--ui-border-strong); }
.ui-streak-day.pending > span { color: var(--ui-text-primary); }
/* Пропущений — тихий мінус у червоному тінті: відрізняється від future,
   але не кричить (карати за пропуск не мета) */
.ui-streak-day.missed > i { background: var(--ui-tint-danger); }
.ui-streak-day.missed > i::after { content: ""; position: absolute; inset: 10px 6px;
    border-radius: 1px; background: var(--ui-text-danger); }


/* Стрік в аппбарі (мобільний): кільце + число */
.ui-appbar-streak { display: flex; align-items: center; gap: 6px;
    color: var(--ui-text-primary); font-size: 13px; font-weight: 700; }

.ui-nav-item { display: flex; align-items: center; gap: 12px; padding: 10px 12px;
    border-radius: var(--ui-radius-m); text-decoration: none; border: none;
    background: none; cursor: pointer; font-family: inherit; width: 100%;
    text-align: left; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
.ui-nav-item > .ui-icon::before { background: var(--ui-text-secondary); transition: background 0.15s; }
.ui-nav-item > p { color: var(--ui-text-secondary); font-size: 14px; font-weight: 500;
    line-height: 20px; flex: 1; min-width: 0; transition: color 0.15s; }
@media (hover: hover) {
    .ui-nav-item:hover { background: var(--ui-surface-hover); }
    .ui-nav-item:hover > p { color: var(--ui-text-primary); }
    .ui-nav-item:hover > .ui-icon::before { background: var(--ui-text-primary); }
}
.ui-nav-item.active { background: var(--ui-tint-accent); }
.ui-nav-item.active > p { color: var(--ui-text-accent); }
.ui-nav-item.active > .ui-icon::before { background: var(--ui-text-accent); }
.ui-nav-item > .ui-badge { flex: none; }
.ui-sidebar-spacer { flex: 1; }
/* Нижній блок (роль · підписки · вихід) — відділений розділювачем */
.ui-sidebar-foot { display: flex; flex-direction: column; gap: 2px;
    border-top: 1px solid var(--ui-border-subtle); padding-top: 10px; margin-top: 10px; }

/* ---- Контент ---- */
.ui-main { position: relative; margin-left: var(--ui-sidebar-width); padding: 32px 32px 64px; }
/* Градієнтна плашка вгорі колонки — розбавляє суцільну площину сторінки.
   Псевдоелементи, а не вузли в розмітці: жодна сторінка про неї не знає.
   ::before — рівний змив, ::after — дві плями, що повільно дрейфують.

   Колір бере предмет сторінки. Клас предмета лежить УСЕРЕДИНІ колонки
   (на .ui-page-head або на корені контенту), а кастомні властивості
   успадковуються лише вниз — тож :has тут не хитрість, а єдиний спосіб
   підняти предмет на шел. Сторінка без предмета лишається на акценті. */
.ui-main { --ui-page-tint: var(--ui-tint-accent); }
.ui-main:has(.ui-page-head.sub-a), .ui-main:has(> .ui-main-content > .sub-a) { --ui-page-tint: var(--ui-subject-a-tint); }
.ui-main:has(.ui-page-head.sub-b), .ui-main:has(> .ui-main-content > .sub-b) { --ui-page-tint: var(--ui-subject-b-tint); }
.ui-main:has(.ui-page-head.sub-c), .ui-main:has(> .ui-main-content > .sub-c) { --ui-page-tint: var(--ui-subject-c-tint); }
.ui-main:has(.ui-page-head.sub-d), .ui-main:has(> .ui-main-content > .sub-d) { --ui-page-tint: var(--ui-subject-d-tint); }
.ui-main:has(.ui-page-head.sub-e), .ui-main:has(> .ui-main-content > .sub-e) { --ui-page-tint: var(--ui-subject-e-tint); }
.ui-main:has(.ui-page-head.sub-f), .ui-main:has(> .ui-main-content > .sub-f) { --ui-page-tint: var(--ui-subject-f-tint); }

/* Плашка вмикається модифікатором .tinted — сторінка сама вирішує, чи їй
   потрібен кольоровий верх (у платформі це @section('main-class', 'tinted')).
   Без опт-іну шелл лишається чистим. */
.ui-main.tinted::before, .ui-main.tinted::after { content: ""; position: absolute; inset: 0 0 auto;
    z-index: -1; height: 320px; pointer-events: none; }
.ui-main.tinted::before { background: linear-gradient(to bottom, var(--ui-page-tint), transparent); }
/* Рухаємо background-position, а не сам шар: transform розсунув би псевдо
   за межі колонки й дав би горизонтальний скрол на всій сторінці. */
.ui-main.tinted::after { opacity: 0.7;
    background-image: radial-gradient(40% 62% at 24% 4%, var(--ui-page-tint), transparent 70%),
                      radial-gradient(34% 54% at 76% 0%, var(--ui-page-tint), transparent 68%);
    background-repeat: no-repeat, no-repeat;
    background-size: 150% 190%, 140% 175%;
    background-position: 8% 0%, 92% 0%;
    animation: ui-page-aurora 28s ease-in-out infinite alternate; }
@keyframes ui-page-aurora {
    to { background-position: 34% 16%, 62% 8%; }
}
@media (prefers-reduced-motion: reduce) {
    .ui-main.tinted::after { animation: none; }
}
.ui-main-content { max-width: var(--ui-content-width); margin: 0 auto; display: flex;
    flex-direction: column; gap: 24px; }
/* Колонка розтягує дітей — поодинока кнопка (напр. «назад») лишається за змістом */
.ui-main-content > .ui-btn,
.ui-main-content > .ui-contents > .ui-btn { align-self: flex-start; }
/* Корінь компонента (Livewire вимагає рівно один кореневий вузол) не має
   ставати зайвою коробкою: display:contents віддає його дітей прямо в
   колонку контенту, тож сторінка-компонент верстається точно так само, як
   звичайна blade-сторінка. Без цього вкладений .ui-main-content із власним
   margin:auto перестає розтягуватись і стискає сторінку до ширини вмісту. */
.ui-contents { display: contents; }
/* display:contents прибирає лише коробку, а в дереві елемент лишається —
   тож правила «прямий нащадок .ui-main-content» самі крізь нього не
   проходять і їх треба дублювати (див. .ui-btn і .ui-section вище) */
/* Секція на рівні сторінки більше не має власного гапу: базові 12 у
   .ui-section — це і є потрібна відстань між заголовком групи та списком.
   Раніше тут стояло 8, і сторінкова секція розходилась із вкладеною. */

/* Дві колонки: робота зліва, супровідний блок (підсумок) справа і липкий.
   Нижче 1024 колонки складаються в одну, липкість знімається — на мобільному
   роль підсумку бере .ui-actionbar. Відступ липкої колонки згори задає
   --ui-sticky-top: шелл із верхньою панеллю перевизначає його під себе. */
:root { --ui-sticky-top: 24px; }
.ui-main-content.split { display: grid; align-items: start;
    grid-template-columns: minmax(0, 1fr) 340px; gap: 24px; }
.ui-main-content.split > .ui-flow { display: flex; flex-direction: column; gap: 20px; min-width: 0; }
.ui-main-content.split > .ui-side { position: sticky; top: var(--ui-sticky-top);
    display: flex; flex-direction: column; gap: 12px; min-width: 0; }
@media (max-width: 1023px) {
    .ui-main-content.split { display: flex; }
    .ui-main-content.split > .ui-side { position: static; }
}

/* Липка панель дій сторінки — мобільна пара до липкої бічної колонки */
.ui-actionbar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 50;
    padding: 10px 16px calc(10px + env(safe-area-inset-bottom, 0px));
    background: var(--ui-surface); border-top: 1px solid var(--ui-border-subtle); }
.ui-actionbar-inner { display: flex; align-items: center; gap: 12px; min-width: 0;
    width: 100%; max-width: var(--ui-content-width); margin-inline: auto; }
.ui-actionbar-sum { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ui-actionbar-sum > b { color: var(--ui-text-primary); font-size: 17px; font-weight: 700;
    line-height: 23px; letter-spacing: -0.3px; }
.ui-actionbar-sum > span { color: var(--ui-text-secondary); font-size: 12px; line-height: 16px; }
.ui-actionbar-inner > .ui-btn { margin-left: auto; flex: none; }
@media (min-width: 1024px) { .ui-actionbar { display: none; } }

/* ---- Шелл оплати: логотип і вихід, без навігації ----
   На сторінці платежу навігація — це шлях зійти з неї, тому шелл мінімальний. */
.ui-checkout { min-height: 100dvh; background: var(--ui-surface-page); --ui-sticky-top: 88px; }
.ui-checkout-bar { position: sticky; top: 0; z-index: 40; display: flex; align-items: center;
    gap: 12px; height: 64px; padding: 0 24px; background: var(--ui-surface);
    border-bottom: 1px solid var(--ui-border-subtle); }
.ui-checkout-bar img { height: 22px; display: block; }
.ui-checkout-bar-side { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.ui-checkout-main { padding: 32px 24px 96px; }
@media (max-width: 1023px) {
    .ui-checkout { --ui-sticky-top: 80px; }
    .ui-checkout-bar { height: 56px; padding: 0 16px; }
    .ui-checkout-main { padding: 20px 16px calc(96px + env(safe-area-inset-bottom, 0px)); }
}

/* ---- Верхня панель (мобільний) ---- */
.ui-appbar { display: none; position: sticky; top: 0; z-index: 40;
    align-items: center; gap: 12px; height: 56px; padding: 0 16px;
    background: var(--ui-surface); border-bottom: 1px solid var(--ui-border-subtle); }
.ui-appbar-logo img { height: 22px; display: block; }
.ui-appbar-side { margin-left: auto; display: flex; align-items: center; gap: 10px; }

/* ---- Нижній таб-бар (мобільний) ---- */
.ui-tabbar { display: none; position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
    background: var(--ui-surface); border-top: 1px solid var(--ui-border-subtle);
    padding: 6px 4px calc(6px + env(safe-area-inset-bottom, 0px)); }
.ui-tabbar-items { display: flex; max-width: 520px; margin: 0 auto; }
.ui-tabbar-item { flex: 1; display: flex; flex-direction: column; align-items: center;
    gap: 3px; padding: 6px 2px; border: none; background: none; cursor: pointer;
    font-family: inherit; text-decoration: none; border-radius: var(--ui-radius-s);
    position: relative; }
.ui-tabbar-item > .ui-icon::before { background: var(--ui-text-secondary); }
.ui-tabbar-item > span { color: var(--ui-text-secondary); font-size: 10.5px;
    font-weight: 500; line-height: 13px; }
.ui-tabbar-item.active > .ui-icon::before { background: var(--ui-text-accent); }
.ui-tabbar-item.active > span { color: var(--ui-text-accent); }
/* Розмір — варіант .xs у misc.css; тут лише накладання на іконку */
.ui-tabbar-item > .ui-badge { position: absolute; top: 2px; left: calc(50% + 6px); }

/* ---- Нижній лист «Ще» (мобільний перелив решти пунктів) ---- */
/* z-95: модалка (100) поверх відкритого листа, не залежить від порядку DOM */
.ui-sheet { z-index: 95; position: fixed; inset: 0; background: var(--ui-overlay);
    display: flex; flex-direction: column; justify-content: flex-end;
    opacity: 0; pointer-events: none; visibility: hidden;
    transition: opacity 0.2s, visibility 0s 0.2s; }
.ui-sheet.active { opacity: 1; pointer-events: all; visibility: visible; transition: opacity 0.2s; }
.ui-sheet-body { position: relative; z-index: 1; background: var(--ui-surface);
    border-radius: var(--ui-radius-xl) var(--ui-radius-xl) 0 0;
    padding: 10px 16px calc(20px + env(safe-area-inset-bottom, 0px));
    max-height: 76dvh; overflow-y: auto;
    transform: translateY(16px); transition: transform 0.2s; }
.ui-sheet.active .ui-sheet-body { transform: translateY(0); }
.ui-sheet-grip { width: 36px; height: 4px; border-radius: var(--ui-radius-pill);
    background: var(--ui-border-strong); margin: 0 auto 14px; }
.ui-sheet .ui-modal-escape { z-index: 0; }

/* ---- Перемикання режимів ---- */
@media (max-width: 1023px) {
    .ui-sidebar { display: none; }
    .ui-appbar { display: flex; }
    .ui-tabbar { display: block; }
    .ui-main { margin-left: 0;
        padding: 16px 16px calc(84px + env(safe-area-inset-bottom, 0px)); }
}

/* Фокус-режим (проходження тесту). Мобільний таб-бар прибирається: він
   конфліктує з липкою панеллю дій квіза — обидва fixed bottom. Місце під
   панель уже віддає .ui-quiz, тож низ контейнера повертається до звичайного.
   Вмикається класом .ui-focus на <body>. Специфічність (0,2,0) перекриває
   базові правила режиму без !important — раніше кожна сторінка квіза
   тримала власну копію цих двох рядків у @push('extra-styles'). */
@media (max-width: 1023px) {
    body.ui-focus .ui-tabbar { display: none; }
    body.ui-focus .ui-main { padding-bottom: 16px; }
}

/* Скрол-лок під відкритою модалкою/шитом (ставить драйвер ui.js) */
body.ui-lock { overflow: hidden; }

/* Тости не лягають під нижній таб-бар */
@media (max-width: 1023px) {
    body.ui-shell .ui-toasts { bottom: calc(84px + env(safe-area-inset-bottom, 0px)); }
}

/* ---- Сторінки входу ----
   Власний шел: одна колонка по центру екрана. Кабінетного сайдбару тут
   немає, тож і .ui-main не годиться. */
.ui-auth { min-height: 100dvh; display: flex; align-items: center; justify-content: center;
    padding: 40px 20px; background: var(--ui-surface-page); }
.ui-auth-form { width: 100%; max-width: 420px; display: flex; flex-direction: column; gap: 20px; }
.ui-auth-logo { align-self: center; display: flex; }
.ui-auth-logo > img { height: 28px; width: auto; }
/* Заголовок і підпис під ним */
.ui-auth-head { display: flex; flex-direction: column; gap: 6px; text-align: center; }
.ui-auth-head > p { color: var(--ui-text-primary); font-size: 24px; font-weight: 700;
    line-height: 30px; letter-spacing: -0.4px; }
.ui-auth-head > span { color: var(--ui-text-secondary); font-size: 14px; line-height: 20px; }
/* Дрібний текст під формою: згода, посилання на реєстрацію */
.ui-auth-note { color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; text-align: center; }
.ui-auth-note a { color: var(--ui-text-accent); text-decoration: none; }
@media (hover: hover) { .ui-auth-note a:hover { text-decoration: underline; } }
/* Розділювач «або» між основним входом і соціальним */
.ui-auth-or { display: flex; align-items: center; gap: 12px;
    color: var(--ui-text-muted); font-size: 13px; line-height: 18px; }
.ui-auth-or::before, .ui-auth-or::after { content: ""; flex: 1; height: 1px; background: var(--ui-border-subtle); }
/* znohub-ui · проходження тесту (сторінка тесту, Vue)
   Класи .question-number і .responsive-question зберігаються як хуки
   (їх читає aiChatPageContext через jQuery), #timer пише таймер. */

/* Ширина колонки тесту — одним значенням: її ділять і сама колонка, і
   липка панель дій, інакше кнопки стають не під краями картки. Була 760
   (довжина рядка для читання), ширину до контейнера сторінки задав дизайн —
   тому й тягнеться з --ui-content-width, а не своїм числом. */
.ui-quiz { --ui-quiz-width: var(--ui-content-width); display: flex; flex-direction: column; gap: 20px; }
.ui-quiz--focus { max-width: var(--ui-quiz-width); margin-inline: auto; width: 100%; }


/* Палітра завжди на видноті: доти на телефоні вона ховалась у details, і
   учень не бачив, скільки питань лишилось, поки не тапне. Обгортка більше
   нічого не робить — вона є лише для того, щоб стрічка була прямою дитиною
   колонки на будь-якій ширині. */
.ui-quiz-nav { display: contents; }

/* Мікропідказка формату питання */
.ui-quiz-hint { color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; }

/* Бейдж «Збережено» */
.ui-save-badge { display: flex; align-items: center; gap: 4px;
    opacity: 0; transition: opacity 0.25s; }
.ui-save-badge.show { opacity: 1; }
.ui-save-badge > .ui-icon::before { background: var(--ui-text-success); }
.ui-save-badge p { color: var(--ui-text-success); font-size: 12px; font-weight: 700; }

/* Оверлей «Час вийшов» */
.ui-quiz-timeup { position: fixed; inset: 0; z-index: 300; display: flex;
    align-items: center; justify-content: center; background: var(--ui-overlay); }
.ui-quiz-timeup .box { background: var(--ui-surface); border-radius: var(--ui-radius-l);
    padding: 28px 36px; text-align: center; display: flex; flex-direction: column; gap: 6px; }
.ui-quiz-timeup .box p { color: var(--ui-text-primary); font-size: 20px; font-weight: 700; }
.ui-quiz-timeup .box span { color: var(--ui-text-secondary); font-size: 14px; }

/* Шапка: назад · назва + тип · таймер */
.ui-quiz-top { display: flex; align-items: flex-start; gap: 12px; }
/* Назва тесту стоїть ПІД карткою: зверху вона зʼїдала висоту до першого
   питання, а під час проходження це довідка, а не заголовок. Звідси тихий
   сірий і центрування — вона підписує блок, а не відкриває сторінку. */
.ui-quiz-title { display: flex; flex-direction: column; align-items: center;
    gap: 6px; min-width: 0; text-align: center; }
.ui-quiz-title > h1 { color: var(--ui-text-muted); font-size: 13px; font-weight: 400;
    line-height: 18px; letter-spacing: 0; opacity: 0.4; }
.ui-quiz-timer { display: flex; align-items: center; gap: 6px; margin-left: auto; flex: none;
    height: 32px; padding: 0 12px; border-radius: var(--ui-radius-pill);
    background: var(--ui-tint-accent); }
.ui-quiz-timer > .ui-icon::before { background: var(--ui-text-accent); }
.ui-quiz-timer p { color: var(--ui-text-accent); font-size: 14px; font-weight: 700; }
/* .count-up — секундомір без ліміту: інформація, а не тиск, тож тихий
   нейтральний вигляд замість акцентного. Стану danger у нього не буває. */
.ui-quiz-timer.count-up { background: var(--ui-surface-sunken); }
.ui-quiz-timer.count-up p { color: var(--ui-text-secondary); font-weight: 500; }
.ui-quiz-timer.count-up > .ui-icon::before { background: var(--ui-text-secondary); }
.ui-quiz-timer.danger { background: var(--ui-tint-danger); }
.ui-quiz-timer.danger p { color: var(--ui-text-danger); }
.ui-quiz-timer.danger > .ui-icon::before { background: var(--ui-text-danger); }

/* Палітра питань: сіре — без відповіді, зелене — є відповідь, синє — поточне.
   Один рядок з горизонтальним скролом (колесо шле deltaY — перекладає скрипт);
   стрілки по боках — кнопки кита, ховаються без переповнення і на мобільному */
/* Стрічка займає всю ширину, стрілки лежать НАКЛАДКАМИ на її краях —
   так вони не з'їдають місце під клітинки. --fade-* керують і маскою, і
   показом стрілок: обидва мають зʼявлятися рівно з того боку, куди ще є
   куди скролити. Значення ставить скрипт сторінки класами can-left/can-right. */
.ui-quiz-palette-wrap { position: relative; min-width: 0;
    --hold-l: 0px; --fade-l: 0px; --hold-r: 0px; --fade-r: 0px; }
/* hold — зона ПОВНОЇ прозорості: вона мусить накрити стрілку (36px) з
   запасом, інакше клітинки проступають одразу за кнопкою. fade — де
   стрічка вже проявилась повністю. */
/* hold — зона повної прозорості під стрілкою, fade — де стрічка вже цілком
   видима. Було 42/78: стрілка 36 плюс запас, і градієнт з'їдав другу клітинку
   майже повністю. Тепер прозорість рівно під стрілкою, а розтяжка коротка. */
.ui-quiz-palette-wrap.can-left  { --hold-l: 36px; --fade-l: 52px; }
.ui-quiz-palette-wrap.can-right { --hold-r: 36px; --fade-r: 52px; }
/* Варіант зі стрілками В ПОТОЦІ, а не накладками: стрічка дат на
   індивідуальних заняттях тримає обабіч скролера звичайні кнопки кита,
   видимі завжди (їхній стан веде Alpine, а не класи can-*). Без цього
   модифікатора обгортка — не флекс, і кнопки лягали б у стовпчик. */
.ui-quiz-palette-wrap.inline { display: flex; align-items: center; gap: 8px; }
.ui-quiz-palette-wrap.inline > .ui-quiz-palette { flex: 1; width: auto; }
/* Стрілка — того ж розміру і фону, що клітинка палітри */
.ui-quiz-palette-wrap > .ui-quiz-palette-arrow { position: absolute; top: 50%; z-index: 1;
    transform: translateY(-50%); display: none; align-items: center;
    justify-content: center; width: 36px; height: 36px; padding: 0;
    border: 1.5px solid var(--ui-border-subtle);
    border-radius: 10px; background: var(--ui-surface-sunken); cursor: pointer; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
.ui-quiz-palette-wrap > .ui-quiz-palette-arrow:first-child { left: 0; }
.ui-quiz-palette-wrap > .ui-quiz-palette-arrow:last-child { right: 0; }
.ui-quiz-palette-wrap.can-left  > .ui-quiz-palette-arrow:first-child { display: flex; }
.ui-quiz-palette-wrap.can-right > .ui-quiz-palette-arrow:last-child { display: flex; }
.ui-quiz-palette-arrow > .ui-icon::before { background: var(--ui-text-secondary); }
@media (hover: hover) {
    .ui-quiz-palette-wrap > .ui-quiz-palette-arrow:hover { background: var(--ui-surface-sunken-hover); }
}
/* На дотику стрілок немає — там гортають пальцем, а роль підказки
   «далі ще є» бере на себе маска. Специфічність тримаємо на рівні
   правил .can-*, інакше вони переважили б це приховування. */
@media (max-width: 640px) {
    .ui-quiz-palette-wrap.can-left > .ui-quiz-palette-arrow:first-child,
    .ui-quiz-palette-wrap.can-right > .ui-quiz-palette-arrow:last-child,
    .ui-quiz-palette-wrap > .ui-quiz-palette-arrow { display: none; }
}
/* Край гаситься маскою лише з того боку, куди ще є куди скролити: коли
   стрічка вперлась у початок, зліва нічого не ховаємо. При нульових
   --hold/--fade усі зупинки збігаються, і градієнт стає суцільно
   непрозорим — маски фактично немає. */
.ui-quiz-palette { display: flex; flex-wrap: nowrap; gap: 8px; min-width: 0; width: 100%;
    overflow-x: auto; scroll-behavior: smooth; scrollbar-width: none;
    mask-image: linear-gradient(90deg,
        transparent 0, transparent var(--hold-l), #000 var(--fade-l),
        #000 calc(100% - var(--fade-r)), transparent calc(100% - var(--hold-r)),
        transparent 100%);
    -webkit-mask-image: linear-gradient(90deg,
        transparent 0, transparent var(--hold-l), #000 var(--fade-l),
        #000 calc(100% - var(--fade-r)), transparent calc(100% - var(--hold-r)),
        transparent 100%); }
.ui-quiz-palette::-webkit-scrollbar { display: none; }
.ui-quiz-palette > .item { display: flex; align-items: center; justify-content: center;
    border: 1.5px solid var(--ui-border-subtle); padding: 0; font-family: inherit;
    position: relative; flex: none;
    width: 36px; height: 36px; border-radius: 10px; background: var(--ui-surface-sunken);
    cursor: pointer; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
/* Заповнені стани несуть колір самі — межа там тільки бруднила б край */
.ui-quiz-palette > .item.que, .ui-quiz-palette > .item.active { border-color: transparent; }
/* Тач-цілі ≥44px на дотикових екранах */
@media (pointer: coarse) {
    .ui-quiz-palette > .item { width: 44px; height: 44px; }
    .ui-quiz-palette-wrap > .ui-quiz-palette-arrow { width: 44px; height: 44px; }
    .ui-blank-cell { width: 40px; height: 40px; }
    .ui-blank-label { width: 40px; }
}
.ui-quiz-palette > .item > p { color: var(--ui-text-secondary); font-size: 14px; font-weight: 700; }
@media (hover: hover) {
    .ui-quiz-palette > .item:hover { background: var(--ui-surface-sunken-hover); }
    .ui-quiz-palette > .item.que:hover, .ui-quiz-palette > .item.active:hover { filter: brightness(0.94); }
}
.ui-quiz-palette > .item.que { background: var(--ui-tint-success); }
.ui-quiz-palette > .item.que > p { color: var(--ui-text-success); }
.ui-quiz-palette > .item.active { background: var(--ui-fill-accent); }
.ui-quiz-palette > .item.active > p { color: var(--ui-text-on-accent); }

/* Питання */
.ui-quiz-meta { display: flex; align-items: center; gap: 10px; }
/* Вигляд дає компонент .ui-tag.accent; тут лише гасіння легасі
   .question-number зі style.css (клас — jQuery-хук: бордер #0583F2,
   повна ширина) і успадкування типографіки тега вкладеним <p> */
.ui-quiz-meta .question-number { border: 0; width: auto; max-width: none; }
.ui-quiz-meta .question-number > p { color: inherit; font-size: inherit;
    font-weight: inherit; line-height: inherit; }
/* Довга назва навички не має ламати рядок надвоє: тег стискається, а хвіст
   ховається під «…» (повний текст лишається в title). Підказка формату
   коротка й важлива — їй flex: none, щоб не переносилась вона. */
.ui-quiz-meta > .ui-tag { min-width: 0; }
.ui-quiz-meta > .ui-tag > p { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ui-quiz-meta > .ui-quiz-hint { flex: none; }
/* h4-кегль із розширеним інтерлінʼяжем, вага Regular — довгі питання НМТ
   суцільним болдом важкі; акценти віддані strong */
.ui-quiz .responsive-question { color: var(--ui-text-primary); font-size: 17px; font-weight: 500;
    line-height: 26px; letter-spacing: -0.2px; }
/* Легасі .responsive-question>p (#000, 18px, margin 25px) перекривало все —
   абзаци успадковують типографіку контейнера */
.ui-quiz .responsive-question > p { color: inherit; font-size: inherit; font-weight: inherit;
    line-height: inherit; letter-spacing: inherit; margin-bottom: 0; }
.ui-quiz .responsive-question > p + p { margin-top: 10px; }
.ui-quiz .responsive-question strong { font-weight: 700; }
.ui-quiz .responsive-question img { max-width: 100%; height: auto; border-radius: var(--ui-radius-m); }

/* Варіанти: рядок клікабельний, вибір дублюється в бланку */
.ui-quiz-variants { display: flex; flex-direction: column; gap: 8px; }
.ui-quiz-variant { display: flex; align-items: flex-start; gap: 12px; padding: 12px;
    width: 100%; text-align: left; font-family: inherit;
    border-radius: var(--ui-radius-m); background: var(--ui-surface-sunken); cursor: pointer;
    transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); border: 1.5px solid var(--ui-border-card); }
/* Під курсором темнішає САМЕ межа, і саме сіра: акцентна тут зайнята
   вибраною відповіддю (.active, .pair-picked), тож синій контур на
   наведенні змазував би два різні стани. --ui-border-strong — єдиний
   темніший сірий серед ролей меж.
   .peer стоїть у ЦЬОМУ ж правилі, а не серед решти peer-станів нижче:
   інакше він опинявся б у каскаді після .active і перемальовував синю
   межу відповіді сірою. Тут же обидва стани мають однакову позицію, і
   .active нижче перекриває їх обох — рівно як для власного ховера. */
@media (hover: hover) {
    .ui-quiz-variant:hover,
    .ui-quiz-variant.peer { background: var(--ui-surface-sunken-hover);
        border-color: var(--ui-border-strong); }
}
.ui-quiz-variant.peer:focus-visible { background: var(--ui-surface-sunken-hover);
    border-color: var(--ui-border-strong); }
.ui-quiz-variant.active { border-color: var(--ui-border-accent); background: var(--ui-tint-accent); }
.ui-quiz-variant.static { cursor: default; }
@media (hover: hover) { .ui-quiz-variant.static:hover { background: var(--ui-surface-sunken); } }
/* Пара в juxt: клік по лівій картці підсвічує її і «підморгує» правою
   колонкою — натяк обрати відповідник; пару ставить скрипт через клітинку матриці */
/* Вигляд клікабельності — лише там, де парування справді підключене
   скриптом (він ставить data-pairing). Без цього адаптивний тест
   показував курсор і ховер на картках, клік по яких нічого не робить. */
.ui-quiz-pair[data-pairing] .ui-quiz-variant.static { cursor: pointer; }
@media (hover: hover) {
    .ui-quiz-pair[data-pairing] .ui-quiz-variant.static:hover { background: var(--ui-surface-sunken-hover); }
}
.ui-quiz-variant.pair-picked { border-color: var(--ui-border-accent); background: var(--ui-tint-accent); }
.ui-quiz-variant.pair-picked > .ui-quiz-variant-letter { background: var(--ui-fill-accent); color: var(--ui-text-on-accent); }
.ui-quiz-pair.picking > .ui-quiz-variants:last-child .ui-quiz-variant {
    animation: ui-pair-blink 1.1s ease-in-out infinite; }
@keyframes ui-pair-blink { 50% { border-color: var(--ui-border-accent); } }
/* Бейдж пари: цифра-відповідник на кружку літери правої картки */
.ui-pair-badge { position: absolute; right: -4px; bottom: -4px; width: 14px; height: 14px;
    display: flex; align-items: center; justify-content: center; padding: 0;
    border-radius: var(--ui-radius-pill); background: var(--ui-fill-accent);
    color: var(--ui-text-on-accent); font-size: 10px; font-weight: 700; font-style: normal;
    line-height: 1; }
@media (prefers-reduced-motion: reduce) {
    .ui-quiz-pair.picking > .ui-quiz-variants:last-child .ui-quiz-variant {
        animation: none; border-color: var(--ui-border-accent); }
}
.ui-quiz-variant-letter { position: relative; display: flex; align-items: center; justify-content: center; flex: none;
    width: 32px; height: 32px; border-radius: var(--ui-radius-pill); background: var(--ui-surface);
    color: var(--ui-text-primary); font-size: 14px; font-weight: 700; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
.ui-quiz-variant.active > .ui-quiz-variant-letter { background: var(--ui-fill-accent); color: var(--ui-text-on-accent); }
.ui-quiz-variant-text { color: var(--ui-text-primary); font-size: 15px; font-weight: 400;
    line-height: 22px; min-width: 0; padding-top: 4px; }
.ui-quiz-variant-text img { max-width: 100%; height: auto; }

/* Дві колонки juxt (цифри → букви) */
.ui-quiz-pair { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media screen and (max-width: 720px) { .ui-quiz-pair { grid-template-columns: 1fr; } }

/* Бланк відповідей — як на папері НМТ */
.ui-quiz-blank { display: flex; flex-direction: column; gap: 10px; }
.ui-quiz-blank > p { color: var(--ui-text-secondary); font-size: 12px; font-weight: 700;
    line-height: 16px; letter-spacing: 0.4px; text-transform: uppercase; }
.ui-blank-row { display: flex; gap: 8px; }
/* Підказка 50/50 стоїть останньою в рядку варіантів: .ui-btn.s — рівно
   32px, тобто в один зріст із клітинками відповіді.
   Вимкнена вона мусить лишатись наведомою: у title написано ЧОМУ
   (підказки закінчились, ліміт на сьогодні, уже використана), а базове
   pointer-events: none кнопки кита сховало б цю єдину відповідь. */
.ui-quiz-hint-btn { gap: 4px; }
.ui-quiz-hint-btn:disabled { pointer-events: auto; cursor: not-allowed; }
.ui-blank-label { display: flex; align-items: center; justify-content: center; width: 32px;
    height: 32px; flex: none; color: var(--ui-text-muted); font-size: 13px; font-weight: 700; }
.ui-blank-cell { display: flex; flex: none; width: 32px; height: 32px; border-radius: 6px;
    border: 1.5px solid var(--ui-border-strong); background: var(--ui-blank-surface); cursor: pointer;
    padding: 0; position: relative; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); opacity: 0.5; }
/* Ховер через прозорість, а не через колір межі: синім тут позначено
   ВІДПОВІДЬ, тож перефарбування наведення плутало б два різні стани.
   Порожня сітка стоїть приглушеною і проявляється під курсором — так
   видно, куди саме стане позначка. Токен межі лишається
   --ui-border-strong (3.17 на білому), але при 0.5 контур бачно слабше
   за норму 3:1 — свідомий компроміс на користь тихої сітки. */
@media (hover: hover) { .ui-blank-cell:hover { opacity: 1; } }
/* Привид хрестика: показує, що саме тут стане позначка. Живе на ::before,
   бо ::after зайнятий справжньою позначкою .active. Пульсацією відрізняється
   від поставленої відповіді — та стоїть рівно. */
.ui-blank-cell::before { content: ""; position: absolute; inset: 4px; opacity: 0;
    background: var(--ui-text-muted); transition: opacity 0.15s;
    mask: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 3L17 17M17 3L3 17' stroke='black' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 3L17 17M17 3L3 17' stroke='black' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain; }
@media (hover: hover) {
    .ui-blank-cell:hover::before { opacity: 1; animation: ui-blank-ghost 1.4s ease-in-out infinite; }
}
/* Уже позначена клітинка привида не показує — там і так стоїть хрестик */
.ui-blank-cell.active::before { content: none; }
/* Пульсує РОЗМІР: прозорість уже зайнята появою привида, і два різні сенси
   на одній властивості змазували б обидва. transform — композитний, тож
   анімація не змушує браузер перераховувати розкладку. */
@keyframes ui-blank-ghost { 50% { transform: scale(0.72); } }
@media (prefers-reduced-motion: reduce) {
    .ui-blank-cell:hover::before { animation: none; }
}
/* Звʼязок «варіант ↔ клітинка бланка». Наведення на один підсвічує другий
   РІВНО тим самим станом, що й власний ховер елемента — тож видно, куди
   стане хрестик, і навпаки. Пару зводить драйвер за data-quiz-peer
   (спільна буква варіанта); реагує і на фокус із клавіатури. */
/* .ui-quiz-variant.peer — вище, у правилі ховера картки (див. коментар там) */
.ui-blank-cell.peer { opacity: 1; }
.ui-blank-cell.peer::before { opacity: 1; animation: ui-blank-ghost 1.4s ease-in-out infinite; }
.ui-blank-label.peer { color: var(--ui-text-primary); }
/* Позначена клітинка на повну: 0.5 — стан порожньої сітки, а відповідь
   мусить читатися без наведення */
.ui-blank-cell.active { border-color: var(--ui-border-accent); opacity: 1; }
.ui-blank-cell.active::after { content: ""; position: absolute; inset: 4px;
    background: var(--ui-border-accent);
    mask: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 3L17 17M17 3L3 17' stroke='black' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 3L17 17M17 3L3 17' stroke='black' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain; }
/* Сітка juxt/ordr: колонки задає Vue інлайном (repeat(N, 32px)) */
.ui-blank-matrix { display: flex; gap: 8px; max-width: 100%; overflow-x: auto;
    -webkit-overflow-scrolling: touch; padding-bottom: 4px; }
.ui-blank-matrix-rows { display: flex; flex-direction: column; gap: 8px; padding-top: 40px; }
.ui-blank-matrix-main { display: flex; flex-direction: column; gap: 8px; }
.ui-blank-matrix-head { display: grid; gap: 8px; }
.ui-blank-matrix-head > .ui-blank-label { height: 32px; width: 100%; }
.ui-blank-matrix-cells { display: grid; gap: 8px; }
.ui-blank-matrix-cells > .ui-blank-cell { width: 100%; height: auto; aspect-ratio: 1; }

/* Дії */
.ui-quiz-actions { display: flex; align-items: center; gap: 12px; }
.ui-quiz-actions .spacer { flex: 1; }
/* Панель дій квіза (.bar): на всю ширину мейна, зафіксована знизу 0;
   вміст тримає внутрішня обгортка-колонка тієї ж ширини, що й .ui-quiz--focus —
   кнопки мають стояти рівно під краями картки. Без .bar — простий
   рядок (сторінка результатів). Місце під панель віддає padding колонки */
.ui-quiz-actions.bar { position: fixed; left: var(--ui-sidebar-width); right: 0; bottom: 0; z-index: 50;
    padding: 12px 16px;
    background: var(--ui-surface); border-top: 1px solid var(--ui-border-subtle); }
.ui-quiz-actions-inner { display: flex; align-items: center; gap: 12px;
    width: 100%; max-width: var(--ui-quiz-width, var(--ui-content-width)); margin-inline: auto; min-width: 0; }
@media (max-width: 1023px) { .ui-quiz-actions.bar { left: 0; } }
.ui-quiz:has(> .ui-quiz-actions.bar) { padding-bottom: 64px; }
/* «Завершити» для мобільного живе всередині картки; на десктопі — в панелі дій */
.ui-quiz-finish-mob { display: none; }
@media screen and (max-width: 640px) {
    /* Не переносимо: перенос кидав таймер окремим рядком під «Вийти з тесту»,
       і шапка з'їдала 40 px висоти ні за що. Замість цього стискається сам
       вихід (текст ховається під «…»), а бейдж збереження лишає саму галочку —
       він і так зникає через секунду. Таймер не стискається ніколи. */
    .ui-quiz-top { flex-wrap: nowrap; align-items: center; }
    .ui-quiz-top > .ui-btn.ghost { min-width: 0; }
    .ui-quiz-top > .ui-btn.ghost > p { min-width: 0; overflow: hidden;
        text-overflow: ellipsis; white-space: nowrap; }
    .ui-quiz-top > .ui-save-badge > p { display: none; }
    .ui-quiz-finish-mob { display: inline-flex; margin-top: 8px; }
    .ui-quiz-finish-desk { display: none; }
    .ui-quiz-back-label { display: none; } /* «Назад» у футері — лише стрілка */
    /* Липкий футер: зона великого пальця, «Далі» — головна */
    .ui-quiz-actions.bar { padding: 10px 16px calc(10px + env(safe-area-inset-bottom, 0px)); }
    .ui-quiz-actions.bar .ui-quiz-actions-inner { gap: 10px; }
    .ui-quiz-actions.bar .ui-quiz-actions-inner > .ui-btn:last-child { flex: 1; }
}

/* Лоадер завантаження тесту: у світлій темі був голий текст без стилів */
.ui-quiz .loader { display: flex; flex-direction: column; align-items: center; gap: 12px;
    padding: 64px 24px; }
.ui-quiz .loader__text { color: var(--ui-text-secondary); font-size: 14px; line-height: 20px; }

/* ---- Сторінка результатів (results.js, Vue) ----
   Класи станів шле JS і вони НЕ перейменовуються: палітра — true (усі бали) /
   half (частково) / false (нуль) / порожньо (без відповіді) + active (поточне);
   літери й клітинки відповіді — true («тут правильно») / active («учень обрав»). */

/* Сітка стат-плиток над розбором */
.ui-result-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; }

/* Палітра результатів */
.ui-quiz-palette > .item.true { background: var(--ui-tint-success); }
.ui-quiz-palette > .item.true > p { color: var(--ui-text-success); }
.ui-quiz-palette > .item.half { background: var(--ui-tint-warning); }
.ui-quiz-palette > .item.half > p { color: var(--ui-text-warning); }
.ui-quiz-palette > .item.false { background: var(--ui-tint-danger); }
.ui-quiz-palette > .item.false > p { color: var(--ui-text-danger); }
/* поточне питання — кільце поверх кольору стану */
.ui-quiz-palette > .item.true.active, .ui-quiz-palette > .item.half.active,
.ui-quiz-palette > .item.false.active {
    box-shadow: inset 0 0 0 2px var(--ui-border-accent); background-clip: padding-box; }
@media (hover: hover) {
    .ui-quiz-palette > .item.true:hover, .ui-quiz-palette > .item.half:hover,
    .ui-quiz-palette > .item.false:hover { filter: brightness(0.94); }
}

/* Легенда кольорів */
.ui-result-legend { display: flex; flex-wrap: wrap; gap: 6px 16px; }
.ui-result-legend > span { display: flex; align-items: center; gap: 6px;
    color: var(--ui-text-secondary); font-size: 13px; line-height: 18px; }
.ui-result-legend i { width: 10px; height: 10px; border-radius: 3px; flex: none; }
.ui-result-legend .ok { background: var(--ui-text-success); }
.ui-result-legend .mid { background: var(--ui-text-warning); }
.ui-result-legend .bad { background: var(--ui-text-danger); }
.ui-result-legend .none { background: var(--ui-border-strong); }

/* Варіанти в розборі: getOptionClassname фарбує обрані/правильні */
.ui-quiz-variant.true { border-color: var(--ui-text-success); background: var(--ui-tint-success); }
.ui-quiz-variant.true > .ui-quiz-variant-letter { background: var(--ui-text-success); color: var(--ui-surface); }
.ui-quiz-variant.false { border-color: var(--ui-text-danger); background: var(--ui-tint-danger); }
.ui-quiz-variant.false > .ui-quiz-variant-letter { background: var(--ui-text-danger); color: var(--ui-surface); }

/* Літерна стрічка «Правильна відповідь» (sngl/mltp) */
.ui-result-answer { display: flex; flex-wrap: wrap; gap: 8px; }
.ui-result-answer > .item { display: flex; align-items: center; justify-content: center;
    width: 32px; height: 32px; flex: none; padding: 0; cursor: default;
    border-radius: 6px; border: 1.5px solid var(--ui-border-strong);
    background: var(--ui-blank-surface); font-family: inherit; }
.ui-result-answer > .item > p { color: var(--ui-text-secondary); font-size: 13px; font-weight: 700; }
.ui-result-answer > .item.true { border-color: var(--ui-text-success); background: var(--ui-tint-success); }
.ui-result-answer > .item.true > p { color: var(--ui-text-success); }
.ui-result-answer > .item.true.active { background: var(--ui-text-success); }
.ui-result-answer > .item.true.active > p { color: var(--ui-surface); }
.ui-result-answer > .item.false.active { border-color: var(--ui-text-danger); background: var(--ui-text-danger); }
.ui-result-answer > .item.false.active > p { color: var(--ui-surface); }

/* Матриця результатів (ordr/juxt): геометрія бланка + стани */
.ui-result-matrix { display: flex; gap: 8px; max-width: 100%; overflow-x: auto;
    -webkit-overflow-scrolling: touch; padding-bottom: 4px; }
.ui-result-matrix .ui-rm-rows { display: flex; flex-direction: column; gap: 8px; }
.ui-result-matrix .ui-rm-rows > .item { display: flex; align-items: center; justify-content: center;
    width: 32px; height: 32px; flex: none;
    color: var(--ui-text-secondary); font-size: 13px; font-weight: 700; }
.ui-result-matrix .ui-rm-main { display: flex; flex-direction: column; gap: 8px; }
.ui-result-matrix .ui-rm-head { display: grid; gap: 8px; }
.ui-result-matrix .ui-rm-head > .item { display: flex; align-items: center; justify-content: center;
    height: 32px; color: var(--ui-text-secondary); font-size: 13px; font-weight: 700; }
.ui-result-matrix .ui-rm-cells { display: grid; gap: 8px; }
.ui-result-matrix .ui-rm-cells > .item { position: relative; width: 100%; aspect-ratio: 1;
    border-radius: 6px; border: 1.5px solid var(--ui-border-strong);
    background: var(--ui-blank-surface); }
.ui-result-matrix .ui-rm-cells > .item.true {
    border-color: var(--ui-text-success); background: var(--ui-tint-success); }
.ui-result-matrix .ui-rm-cells > .item.true::after,
.ui-result-matrix .ui-rm-cells > .item.false.active::after { content: ""; position: absolute; inset: 5px;
    background: var(--ui-text-success);
    mask: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 3L17 17M17 3L3 17' stroke='black' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain;
    -webkit-mask: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 3L17 17M17 3L3 17' stroke='black' stroke-width='1.8' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain; }
.ui-result-matrix .ui-rm-cells > .item.false.active {
    border-color: var(--ui-text-danger); background: var(--ui-tint-danger); }
.ui-result-matrix .ui-rm-cells > .item.false.active::after { background: var(--ui-text-danger); }

/* Текстові відповіді: правильна проти учнівської */
.ui-result-text { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; width: 100%; }
@media screen and (max-width: 720px) { .ui-result-text { grid-template-columns: 1fr; } }
.ui-result-text > div { padding: 14px 16px; border-radius: var(--ui-radius-m);
    background: var(--ui-surface-sunken); min-width: 0; }
.ui-result-text > div > p:first-child { font-size: 12px; font-weight: 700; line-height: 16px;
    letter-spacing: 0.3px; text-transform: uppercase; color: var(--ui-text-secondary); margin-bottom: 6px; }
.ui-result-text .ui-result-text-body { color: var(--ui-text-primary);
    font-size: 15px; line-height: 22px; overflow-wrap: break-word; }
.ui-result-text > .is-correct { background: var(--ui-tint-success); }
.ui-result-text > .is-correct > p:first-child { color: var(--ui-text-success); }

/* Заголовок блока відповіді */
.ui-result-key > p { color: var(--ui-text-primary); font-size: 14px; font-weight: 700;
    line-height: 20px; margin-bottom: 10px; }
.ui-result-key { width: 100%; }

/* Стани true/false тримають тінт і під ховером static-варіанта */
@media (hover: hover) {
    .ui-quiz-variant.static.true:hover { background: var(--ui-tint-success); }
    .ui-quiz-variant.static.false:hover { background: var(--ui-tint-danger); }
}

/* Модалки пояснень: відео-фрейм 16:9 і довільний текст від редактора */
.ui-media-frame { position: relative; width: 100%; aspect-ratio: 16 / 9;
    border-radius: var(--ui-radius-m); overflow: hidden; background: var(--ui-surface-inverse); }
.ui-media-frame > iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.ui-richtext { color: var(--ui-text-primary); font-size: 15px; line-height: 23px; }
.ui-richtext p { color: inherit; font-size: inherit; line-height: inherit; margin: 0 0 10px; }
.ui-richtext p:last-child { margin-bottom: 0; }
.ui-richtext img { max-width: 100%; height: auto; border-radius: var(--ui-radius-m); }

/* Права дія в мета-рядку питання (кнопка підказки, тег результату): той самий
   auto-маргін, що в шапці розділу й титульному рядку. Три сторінки тримали
   це інлайном. */
.ui-quiz-meta > .ui-btn, .ui-quiz-meta > .ui-tag:last-child { margin-left: auto; flex: none; }
/* І сам мета-блок, коли він стоїть праворуч у верхньому рядку питання */
.ui-quiz-top > .ui-quiz-meta { margin-left: auto; flex: none; }
/* znohub-ui · AI-помічник: кнопка-трансформер.
   Одна fixed-коробка в правому нижньому куті: згорнута — пігулка «Помічник»,
   розгорнута — вікно чату. Стан тримає клас .is-open, і більше ніде.
   Над шелом (сайдбар/таббар 40) і над дропзоною планера (90), під модалками
   кіта (100) — звідси 95: openPremiumModal кладе модалку поверх чату.

   Чому зміна розміру, а не transform: scale — між станами 136×40 і 400×620,
   тобто ×3 по ширині й ×15 по висоті. Такий неоднорідний scale розтягує
   текст і робить із радіуса 24px еліпс. Якір right/bottom робить роботу
   transform-origin безкоштовно: коробка й так росте вгору-вліво.

   Ціну такого підходу — переверстку щокадру — знімає .ui-chat-shell: вміст
   заморожений у розмірі ВІДКРИТОГО стану, оболонка його лише підрізає. Тому
   під час анімації не переносяться рядки в бульбашках і не смикається
   внутрішній скрол: його геометрія взагалі не змінюється.

   Анімаційного стану в JS немає: видимість шарів перемикає ідіома
   visibility 0s <delay>, як у .ui-modal. Жодного transitionend — під
   prefers-reduced-motion (transition: none) подія не прилетіла б ніколи,
   і віджет залип би назавжди. */

.ui-chat {
    /* Розміри відкритого стану — змінними: їх читає і коробка, і заморожена
       оболонка, і вони мусять збігатися до пікселя. */
    --ui-chat-w: min(400px, calc(100vw - 32px));
    --ui-chat-h: min(620px, calc(100vh - 48px));
    /* Ширина пігулки — константа: transition до width: auto не буває.
       136 = падинги 32 + іскра 20 + падинги підпису 8 + «Помічник» ~76. */
    --ui-chat-fab-w: 136px;
    --ui-chat-fab-h: 40px;

    position: fixed; right: 24px; bottom: 24px; z-index: 95;
    width: var(--ui-chat-fab-w); height: var(--ui-chat-fab-h);
    border-radius: var(--ui-radius-pill);
    background: var(--ui-fill-accent);
    /* Контур — inset-тінню, а не border: у платформи box-sizing: border-box,
       і border забрав би піксель з padding-box, через що заморожена оболонка
       вилазила б під кліп. Обидва шари є в ОБОХ станах: тінь із різною
       кількістю шарів не інтерполюється, а --ui-shadow-card-hover у темній
       темі взагалі none — звідси й спільне акцентне світіння замість двох
       різних тіней. */
    box-shadow: var(--ui-shadow-accent), inset 0 0 0 1px transparent;
    overflow: hidden;
    /* ЗАКРИТТЯ ~200 мс. Першою сідає висота, ширина наздоганяє: шлях по
       вертикалі вдвічі довший, і без зсуву рух читався б як вертикальний
       постріл. Крива — швидкий старт із гальмуванням: коробка не йде з
       екрана, вона приїжджає в інший розмір спокою, тож прискорення в кінці
       било б у стіну. */
    transition:
        height 200ms cubic-bezier(0.3, 0, 0.2, 1),
        bottom 200ms cubic-bezier(0.3, 0, 0.2, 1),
        width 180ms cubic-bezier(0.3, 0, 0.2, 1) 30ms,
        border-radius 160ms ease-in,
        background-color 140ms ease-in,
        transform 0.15s;
}
.ui-chat.is-open {
    width: var(--ui-chat-w); height: var(--ui-chat-h);
    border-radius: var(--ui-radius-xl);
    background: var(--ui-surface);
    box-shadow: var(--ui-shadow-accent), inset 0 0 0 1px var(--ui-border-card);
    /* ВІДКРИТТЯ ~330 мс, тобто довше за закриття у 1,6 раза. На відкритті рух
       несе інформацію — звідки з'явилось і в що перетворилось; на закритті
       рішення вже ухвалене, і затримка читається як гальмо. Але задирати
       відношення не можна: коробка не зникає, а повертається у видиму кнопку,
       і надто швидке закриття прочиталось би як «панель щезла», а не
       «згорнулась». Крива easeOutQuint: сильний старт продає відгук, довгий
       доїзд — вагу вікна. Пружину кіта сюди не беремо: перельот на мить
       показав би порожню поверхню повз прибитий у куті вміст. */
    transition:
        width 240ms cubic-bezier(0.22, 1, 0.36, 1),
        height 300ms cubic-bezier(0.22, 1, 0.36, 1) 30ms,
        bottom 300ms cubic-bezier(0.22, 1, 0.36, 1) 30ms,
        border-radius 200ms ease-out,
        background-color 120ms ease-out;
}

@media (hover: hover) {
    .ui-chat:not(.is-open):hover { transform: translateY(-2px);
        box-shadow: var(--ui-shadow-accent-hover), inset 0 0 0 1px transparent; }
}
.ui-chat:not(.is-open):active { transform: translateY(1px); }
/* Кільце фокуса — на оболонці: обличчя лежить під overflow: hidden, і власний
   outline йому зрізало б. Свій outline елемент не кліпає. */
.ui-chat:has(.ui-chat-face:focus-visible) {
    outline: 2px solid var(--ui-focus-ring); outline-offset: 2px; }

/* ---- Обличчя: те, що видно згорнутим ----
   Прозоре: заливку тримає сама коробка, тут лише іскра з підписом. Через це
   на закритті фон устигає стати акцентним раніше, ніж проявиться підпис, —
   і жоден піксель тексту не приземляється на білу поверхню. */
.ui-chat-face { position: absolute; inset: 0; z-index: 1;
    display: flex; align-items: flex-end; justify-content: flex-end;
    padding: 0; border: none; background: none; cursor: pointer;
    border-radius: inherit; font-family: inherit;
    color: var(--ui-text-on-accent);
    opacity: 1; visibility: visible;
    transition: opacity 140ms ease 120ms, visibility 0s; }
/* visibility: hidden прибирає обличчя і з таб-порядку, і з дерева
   доступності — саме тому тут не потрібен ні inert, ні атрибут hidden. */
.ui-chat.is-open .ui-chat-face { opacity: 0; visibility: hidden;
    pointer-events: none;
    transition: opacity 100ms ease, visibility 0s 100ms; }
/* Прибите в куті: підпис стоїть на місці, а не їде разом із коробкою */
.ui-chat-face-in { display: flex; align-items: center; justify-content: center;
    flex: none; width: var(--ui-chat-fab-w); height: var(--ui-chat-fab-h); }
.ui-chat-face-in > p { color: inherit; font-size: 14px; font-weight: 500;
    line-height: 20px; padding: 0 4px; white-space: nowrap; }
.ui-chat-fab-icon { display: flex; width: 20px; height: 20px; flex: none; }
.ui-chat-fab-icon > svg { width: 100%; height: 100%; fill: currentColor;
    animation: ui-chat-spark 5s ease-in-out infinite; }
/* Іскра підморгує раз на 5 секунд: стискається на пів-оберті й повертається
   на повному. Рух займає останню п'яту частину циклу — решту часу кнопка
   стоїть спокійно, інакше вона б смикалась в кутку весь час. */
@keyframes ui-chat-spark {
    0%, 80% { transform: rotate(0) scale(1); }
    90%     { transform: rotate(180deg) scale(0.7); }
    100%    { transform: rotate(360deg) scale(1); }
}
/* У відкритому стані іскра не крутиться: обличчя сховане, а зайва анімація
   на композиторі б'ється з ростом коробки. */
.ui-chat.is-open .ui-chat-fab-icon > svg { animation: none; }

/* ---- Оболонка: вміст панелі, заморожений у розмірі відкритого стану ---- */
.ui-chat-shell { position: absolute; right: 0; bottom: 0; z-index: 0;
    width: var(--ui-chat-w); height: var(--ui-chat-h);
    display: flex; flex-direction: column;
    opacity: 0; visibility: hidden;
    transition: opacity 90ms ease, visibility 0s 90ms; }
/* Затримка 140 мс: коробка спершу забирає простір і лише потім він
   заповнюється. Без затримки видно підрізане місиво в пігулці. */
.ui-chat.is-open .ui-chat-shell { opacity: 1; visibility: visible;
    transition: opacity 200ms ease 140ms, visibility 0s; }

/* Друга хвиля: рама (шапка, поле, примітка) з'являється разом з оболонкою, а
   стрічка підіймається на 8px трохи пізніше. Дві впевнені хвилі читаються
   дорожче за три обережні; порядок «згори вниз» тут навмисно НЕ береться —
   коробка росте знизу вгору, і зустрічний стагер видає склейку з двох
   різних анімацій. */
.ui-chat-body { transform: translateY(8px); }
.ui-chat.is-open .ui-chat-body { transform: none;
    transition: transform 220ms cubic-bezier(0.22, 1, 0.36, 1) 160ms; }

.ui-chat-head { display: flex; align-items: center; justify-content: space-between;
    gap: 12px; flex: none; padding: 16px 18px;
    border-bottom: 1px solid var(--ui-border-subtle); }
.ui-chat-title { display: flex; align-items: center; gap: 10px; min-width: 0; }
.ui-chat-title > div { min-width: 0; }
.ui-chat-title b { display: block; color: var(--ui-text-primary);
    font-size: 15px; font-weight: 700; line-height: 20px; }
.ui-chat-title small { display: block; color: var(--ui-text-secondary);
    font-size: 11.5px; line-height: 16px; }
/* Аватар — фірмова іскра SPARKS AI (узгоджений виняток із правила Iconly) */
.ui-chat-avatar { display: flex; align-items: center; justify-content: center;
    width: 36px; height: 36px; flex: none; border-radius: 50%;
    background: var(--ui-tint-accent); }
.ui-chat-avatar > svg { width: 20px; height: 20px; fill: var(--ui-text-accent); }
/* Хрестик — той самий привид, що в модалці, лише без абсолютного позиціювання */
.ui-chat-head > .ui-modal-close { position: static; flex: none; }

/* ---- Стрічка повідомлень ---- */
.ui-chat-body { flex: 1; min-height: 0; overflow-y: auto;
    display: flex; flex-direction: column; gap: 10px; padding: 16px; }

.ui-chat-msg { max-width: 86%; padding: 12px 14px; border-radius: var(--ui-radius-l);
    font-size: 14px; line-height: 20px; overflow-wrap: anywhere; }
.ui-chat-msg > p + p { margin-top: 8px; }
.ui-chat-msg > p > strong { font-weight: 700; }
/* Помічник — утоплена поверхня зліва, кут біля аватара зрізаний */
.ui-chat-msg.bot { align-self: flex-start; background: var(--ui-surface-sunken);
    color: var(--ui-text-primary); border-bottom-left-radius: var(--ui-radius-s); }
/* Учень — акцентна заливка справа */
.ui-chat-msg.me { align-self: flex-end; background: var(--ui-fill-accent);
    color: var(--ui-text-on-accent); border-bottom-right-radius: var(--ui-radius-s); }
/* Рядок контексту під привітанням: тихий, без власної коробки */
.ui-chat-ctx { margin-top: 8px; color: var(--ui-text-secondary);
    font-size: 12px; line-height: 16px; }

/* Помилка генерації: текст небезпеки на тихому тінті, щоб бульбашка
   лишалась бульбашкою, а не перетворювалась на алерт */
.ui-chat-msg.failed { background: var(--ui-tint-danger); color: var(--ui-text-danger); }

/* «Друкує»: три крапки в ритмі, у тій самій бульбашці помічника */
.ui-chat-msg.typing { display: flex; align-items: center; gap: 4px; padding: 14px 16px; }
.ui-chat-msg.typing > span { width: 6px; height: 6px; border-radius: 50%;
    background: var(--ui-text-muted); animation: ui-chat-dot 1s ease-in-out infinite; }
.ui-chat-msg.typing > span:nth-child(2) { animation-delay: 0.15s; }
.ui-chat-msg.typing > span:nth-child(3) { animation-delay: 0.3s; }
/* Підпис для скрінрідера не крапка: ні розміру, ні ритму */
.ui-chat-msg.typing > .ui-sr-only { width: auto; height: auto;
    background: none; animation: none; }
@keyframes ui-chat-dot {
    0%, 60%, 100% { opacity: 0.35; transform: translateY(0); }
    30%           { opacity: 1;    transform: translateY(-3px); }
}

/* ---- Підказки (порожній стан) ----
   Колонка чипів на всю ширину: це не фільтр, а варіанти першого питання,
   тож вирівняні ліворуч і читаються як список. */
.ui-chat-prompts { display: flex; flex-direction: column; align-items: stretch;
    gap: 6px; margin-top: 4px; }
.ui-chat-prompts > .ui-chip { justify-content: flex-start; height: auto;
    padding: 9px 14px; text-align: left; }
.ui-chat-prompts > .ui-chip > .ui-icon { flex: none; }
.ui-chat-prompts > .ui-chip > .ui-icon::before { background: var(--ui-text-accent); }

/* ---- Поле вводу ---- */
.ui-chat-form { display: flex; align-items: center; gap: 8px; flex: none;
    padding: 12px 16px; border-top: 1px solid var(--ui-border-subtle); }
.ui-chat-form > input { flex: 1; min-width: 0; height: 40px; padding: 0 14px;
    border: 1px solid var(--ui-border-field); border-radius: var(--ui-radius-pill);
    background: var(--ui-surface); color: var(--ui-text-primary);
    font-family: inherit; font-size: 14px; line-height: 20px; transition-property: var(--ui-transition-props); transition-duration: var(--ui-duration-fast); transition-timing-function: var(--ui-ease); }
.ui-chat-form > input::placeholder { color: var(--ui-text-muted); }
.ui-chat-form > input:focus { outline: none; border-color: var(--ui-border-accent); }

/* ---- Примітка під полем ---- */
.ui-chat-note { flex: none; padding: 0 16px 12px; color: var(--ui-text-muted);
    font-size: 11px; line-height: 15px; }
/* .locked — питання лише на преміумі; .limit — денний ліміт вичерпано */
.ui-chat-note.locked, .ui-chat-note.limit { color: var(--ui-text-accent); }
/* .error — POST не пройшов; текст лишився в полі, і рядок каже чому */
.ui-chat-note.error { color: var(--ui-text-danger); }

@media screen and (max-width: 640px) {
    /* На вузькому підпис зайвий: пігулка стає круглою іконкою */
    .ui-chat { --ui-chat-w: calc(100vw - 16px); --ui-chat-h: min(78vh, 560px);
        --ui-chat-fab-w: 52px;
        right: 8px; bottom: calc(8px + env(safe-area-inset-bottom, 0px)); }
    .ui-chat-face-in > p { display: none; }
    /* Згорнута пігулка стоїть НАД таббаром, відкрита панель його накриває:
       поки триває розмова, навігація зайва. Тому bottom анімується разом із
       розміром — без цього кнопка й панель мали б різні якорі (76px по
       вертикалі), і «морф із кутка» був би неправдою. У фокус-режимі
       таббара немає, тож і зсуву. */
    body:not(.ui-focus) .ui-chat:not(.is-open) {
        bottom: calc(84px + env(safe-area-inset-bottom, 0px)); }
}

@media (prefers-reduced-motion: reduce) {
    /* Розмір перемикається миттєво, перехресний фейд лишається — та сама
       модель, що в .ui-modal. Reduced motion — претензія до вестибулярного
       ефекту від великого переміщення, а не до прозорості: миттєвий cut
       розірвав би зв'язок «я натиснув — з'явилось вікно». */
    .ui-chat, .ui-chat.is-open { transition: none; }
    .ui-chat-body, .ui-chat.is-open .ui-chat-body { transform: none; transition: none; }
    .ui-chat-shell { transition: opacity 120ms ease, visibility 0s 120ms; }
    .ui-chat.is-open .ui-chat-shell { transition: opacity 120ms ease, visibility 0s; }
    .ui-chat-face { transition: opacity 120ms ease, visibility 0s; }
    .ui-chat.is-open .ui-chat-face { transition: opacity 120ms ease, visibility 0s 120ms; }
    .ui-chat-msg.typing > span, .ui-chat-fab-icon > svg { animation: none; }
}
/* znohub-ui · базові правила документа.
   Збирається ОСТАННІМ: тут лежить те, що має перемагати будь-який компонент
   за порядком каскаду (специфічність у кіта скрізь однакова — один клас). */

/* Атрибут hidden мусить ховати навіть те, чому компонент задав display.
   Без цього рядка `<div class="ui-alert" hidden>` лишається видимим:
   `.ui-alert { display: flex }` і `[hidden] { display: none }` браузера
   мають однакову вагу, і виграє те, що пізніше в каскаді. */
[hidden] { display: none; }

/* Смуга прокрутки документа. Легасі малює повзунок власним синім (#0583F2 —
   акцент лендингу минулого покоління) у style.css і dark-style.css; беремо
   акцент бібліотеки, щоб смуга не була єдиним місцем зі старим кольором і
   темувалася разом з рештою. Без префікса ui- і не компонент — це хром
   документа, як і [hidden] вище, тому й лежить у базі.
   Міняємо ЛИШЕ колір: ширину, радіус і трек лишає легасі, тож правило не
   стає прихованим редизайном смуги. */
::-webkit-scrollbar-thumb,
::-webkit-scrollbar-corner,
::-webkit-resizer { background: var(--ui-fill-accent); }
