/* style-05-builder.css — часть бывшего style.css (распил 22.10.2026): конструктор листа: темы-рамки, кнопки конструктора, объявления, долги.
   Файлы style-NN-*.css — ОДИН каскад: index.html подключает их подряд и по номерам, порядок значим
   (правило ниже по каскаду перебивает равное выше). Стережёт tools/check.js. */
  /* ПОСТАНОВКА: тема = рамка. Рамка — общая (см. .tframe,.oframe,.theme выше), тут только
     свой padding/margin. */
  .theme{padding:4px 14px 14px;margin:0 0 18px}
  .theme .tin{background:transparent;border-radius:0;padding:0}
  .theme .thead{display:flex;align-items:center;gap:8px;margin-bottom:10px}
  .theme .tname{flex:1;min-width:0;width:100%;-webkit-appearance:none;appearance:none;
    text-align:center;border:none;border-bottom:1px dashed var(--line);
    font-weight:800;font-size:var(--fs-input);padding:4px 0 7px;background:transparent;color:var(--ink)}
  .theme .tname:focus{outline:none;border-bottom-color:var(--accent-deep)}
  /* 24px — минимум WCAG 2.2 target-size и порог G5. Было 23×22: крестик, удаляющий тему
     целиком, промахивался под пальцем. Размер добираем min-*, а не паддингом, чтобы глиф
     остался по центру и панель не поехала (выросло на 2px). */
  .theme .tdel{background:none;border:none;color:var(--red);cursor:pointer;font-size:var(--ic-md);
    line-height:1;padding:2px 4px;min-width:24px;min-height:24px;
    display:inline-flex;align-items:center;justify-content:center}
  /* привязка темы к учебнику: кнопка «Учебник» / название + карусель юнитов */
  .theme .tbook{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:-2px 0 12px;
    justify-content:center;position:relative}
  .tb-add{background:var(--accent-tint);border:1px solid var(--accent-line);color:var(--accent-dark);font-weight:700;
    border-radius:var(--r-sm);padding:5px 11px;cursor:pointer;font-size:var(--fs-sm)}
  @media (hover:hover){.tb-add:hover{background:var(--accent-fill)}}
  .tb-name{font-weight:800;font-size:var(--fs-sm);color:var(--accent-dark);background:var(--accent-tint);
    border-radius:var(--r-sm);padding:5px 10px}
  /* юниты (в книге их 10–15): системный <select> вместо карусели ◀ ▶ (blox50 #33). 16px — ниже
     iOS Safari зумит страницу на фокусе поля (правило 3 lingo-ui); min-height 32px — под палец
     (G5: прежние стрелки 23×18 были ниже порога, найдено обходчиком 03.09.2026). */
  .tb-usel{background:var(--card);border:1px solid var(--accent-line);border-radius:var(--r-sm);
    padding:5px 8px;font-weight:800;font-size:var(--fs-input);color:var(--ink);cursor:pointer;
    min-height:32px;max-width:190px}
  .tb-usel:disabled{color:var(--faint);cursor:default}
  /* «отвязать» — подчёркнутое ДЕЙСТВИЕ, его читают, а --faint (2.98:1 на --surface-2) заведён
     для декора и disabled. Тот же разбор, что у .stu-em и .sb-note в #20. */
  .tb-unbind{background:none;border:none;color:var(--muted);cursor:pointer;font-size:var(--fs-xs);
    text-decoration:underline;padding:4px}
  @media (hover:hover){.tb-unbind:hover{color:var(--red)}}
  .tb-menu{position:absolute;top:100%;left:50%;transform:translateX(-50%);z-index:30;background:var(--card);
    border:1px solid var(--accent-line);border-radius:var(--r-sm);box-shadow:var(--sheet-3);padding:6px;
    display:flex;flex-direction:column;gap:4px;min-width:190px;margin-top:4px;
    overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
  /* места под кнопкой меньше, чем над ней — меню раскрывается вверх (высоту режет builder.js) */
  .tb-menu.up{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}
  .tb-menu button,.tb-menu-h{flex-shrink:0}
  .tb-menu button{background:none;border:none;text-align:left;padding:8px 10px;border-radius:var(--r-xs);
    cursor:pointer;font-weight:700;font-size:var(--fs-sm);color:var(--ink)}
  @media (hover:hover){.tb-menu button:hover{background:var(--accent-tint)}}
  /* blox73 #10 — подзаголовок «Книги» под учебниками: книга задаётся таском, а не привязкой темы */
  .tb-menu-h{font-size:var(--fs-xs);font-weight:700;color:var(--muted);padding:6px 10px 2px;border-top:1px solid var(--line-soft);margin-top:2px}
  /* пустой шаблон сущности (три точки) — всегда внизу рамки и внизу области вне тем */
  /* Зелёный он с 23.08.2026 (владелец): роль «сюда можно добавить» — приглашение, а не ещё один
     нейтральный блок. Тогда это был зелёный ПУНКТИР на бледной подложке --ok-tint; ниже — почему
     он стал залитой кнопкой. Цвет по-прежнему берётся токенами роли --ok-* (не сырой лестницей). */
  /* ОБЪЁМНЫЙ, А НЕ ПУНКТИРНЫЙ (владелец, 16.09.2026) — и с 17.09 он ЗЕЛЁНАЯ ПЛАШКА, а не
     кнопка-полоса (blox59 #17, выбран из шести видов на живом листе). Промахов было два, оба
     владелец назвал сам: бледный пунктир читался «блёклым месивом», а залитая полоса во всю
     ширину (копия .btn-pub) легла на экран тяжело — слот стоит внизу КАЖДОЙ темы плюс один вне
     тем, и на листе из трёх тем это четыре громких прямоугольника. Поэтому:
       · РАЗМЕР кнопки, а не полосы: width:fit-content по центру — площадь втрое меньше;
       · МАТЕРИАЛ плашки таска: тот же лист (--sheet-1: обрезной край + тиснение + тень) и
         тот же ВДАВЛЕННЫЙ РЕЛЬС сбоку (--emb-rail/--emb-groove, рецепт .rect/.bitem/.oent/
         .srcard выше), только --rail БЕЛЫЙ: у настоящих плашек цвет рельса говорит про вид
         задания, у пустого слота говорить нечего — рельс бесцветный;
       · СКРУГЛЕНИЕ --r-md, а не --r-lg: на коробке в 53px радиус 18px съедал по половине
         высоты с каждого угла, и прямоугольник читался пилюлей;
       · ЗАЛИВКА РАЗБАВЛЕНА НА 15% — прозрачна именно она, а не весь предмет: opacity погасил
         бы и подпись, и рельс, да ещё поставил бы вид кнопки в зависимость от подложки (тот же
         урок, что у гашения .lcar-arr:disabled выше). Белые чернила и рельс остаются в силу.
     ЦВЕТ — АКЦЕНТ СВОЕЙ СХЕМЫ (владелец, 17.09.2026, вторая правка того же дня): слот носит тот же
     --grad-primary, что кнопка-решение .btn-pub, а зелёное ушло туда, где ему и место по закону
     цвета, — на «✓ Готово» (см. .btn-pub.btn-done ниже). Заодно снялось исключение .eslot из
     реестра GREEN_OK: сплошного зелёного у слота больше нет, спорить со словом «принято» нечем.
     ЗАЛИВКА РАЗБАВЛЕНА НА 20% (владелец, 17.09.2026) — и прозрачна именно она, а не весь предмет:
     opacity погасил бы подпись с рельсом и поставил бы вид кнопки в зависимость от подложки.
     Собрана НЕ из --grad-primary (тот объявлен сырыми hex в каждой схеме, разбавить его на месте
     нечем), а из --anchor — якоря схемы, который и есть нижний стоп этого градиента во всех
     четырёх палитрах; верхний стоп получается тем же подмесом белого, что у --grad-accept. */
  /* ВЫСОТА У ОБЕИХ КНОПОК КОНСТРУКТОРА ОДНА (владелец, 17.09.2026): слот и «+ theme» стоят на
     листе друг под другом, и разница в 5px читалась как небрежность. Число живёт ОДИН раз, в
     --slot-h у общего селектора ниже, и обе кнопки берут его min-height'ом — иначе высоты
     разъехались бы при первой же правке отступов у одной из них. */
  .eslot{display:flex;align-items:center;justify-content:flex-start;gap:10px;
    /* по ЛЕВОМУ краю (владелец, 17.09.2026): слот встаёт на ту же вертикаль, что плашки тасков
       над ним, и его белый рельс оказывается на одной линии с их цветными — ряд читается колонкой,
       а не тремя предметами вразнобой. margin-right:auto держит ширину по содержимому. */
    width:fit-content;margin:0 auto 0 0;min-height:var(--slot-h);
    border:1px solid transparent;border-radius:var(--r-md);padding:16px 22px 16px 28px;
    /* РЕГИСТР ПОДПИСИ ЖИВЁТ В СТРОКЕ, А НЕ В CSS (владелец, 17.09.2026): нужно «+ Theme task» —
       с большой только первое слово, — а это не выражается ни `uppercase`, ни `capitalize`
       (он поднимает КАЖДОЕ слово). Поэтому подписи написаны как надо в builder.js, а
       text-transform тут больше нет. До этого за полчаса перепробованы капс и capitalize. */
    color:var(--on-dark);font-weight:700;font-size:var(--fs-sm);cursor:pointer;
    background:linear-gradient(180deg,
      color-mix(in srgb, color-mix(in srgb, var(--anchor) 88%, var(--on-dark)) 80%, transparent),
      color-mix(in srgb, var(--anchor) 80%, transparent));
    box-shadow:var(--sheet-1);
    transition:box-shadow var(--dur-state) var(--ease-standard),transform var(--dur-release) var(--ease-spring);
    /* рельс — тот же псевдоэлемент и те же ручки, что у четырёх тиснёных плашек */
    --rail:var(--on-dark);--rail-eff:var(--rail);--rail-x:6px;--rail-y:7px;--rail-w:7px;
    --emb-rail:linear-gradient(180deg,
      color-mix(in srgb, var(--rail-eff) 86%, var(--emb-deep)) 0%,
      var(--rail-eff) 44%,
      color-mix(in srgb, var(--rail-eff) 90%, var(--emb-lift)) 100%);
    /* слот вошёл в SURFACES (public/ripple.js): position:relative — якорь коробки волны,
       а --ripple-blend:normal потому, что на залитой роли волна белая (см. .btn--accept) */
    position:relative;-webkit-tap-highlight-color:transparent;--ripple-blend:normal}
  .eslot::before{content:"";position:absolute;left:var(--rail-x);
    top:var(--rail-y);bottom:var(--rail-y);width:var(--rail-w);
    border-radius:calc(var(--rail-w) / 2);
    background:var(--emb-rail);box-shadow:var(--emb-groove)}
  @media (hover:hover){.eslot:hover{box-shadow:var(--sheet-2)}}
  /* ОТКЛИК НА НАЖАТИЕ (ночной редизайн 27.10, грамматика журнала redesign): слот — плашка-кнопка,
     сухо вдавливается и пружиной встаёт обратно; «+ Theme» ниже — так же. transform только на время
     нажатия, в покое его нет. Под «уменьшить движение» — без вдавливания, цвет и тень остаются. */
  .eslot:active{transform:scale(var(--press-scale));
    transition-duration:var(--dur-press-in);transition-timing-function:var(--ease-standard)}
  @media (prefers-reduced-motion:reduce){.eslot:active{transform:none}}
  .eslot .dots{font-size:var(--ic-lg);letter-spacing:3px;line-height:1}
  /* blox45 #13 — «+ тема» рисуется как ПУСТАЯ тема: та же скобка-рамка и та же ширина, что
     появится после нажатия, только ПУНКТИРНАЯ. Рамка — тот же псевдоэлемент, что у .theme
     (см. .tframe,.oframe,.theme выше) — значит и ориентация у неё та же.
     До blox45 это была узкая белая кнопка на левой линии «+ таск вне темы» (blox13 #4). */
  /* УЖАТА ДО ПОДПИСИ И ПРИЖАТА ВПРАВО (владелец, 17.09.2026 — blox59 #17). Пустая тема во всю
     ширину занимала на листе столько же места, сколько настоящая, и спорила с ним: лист ДЗ читался
     как «тема, тема, ещё одна тема». Теперь это узкая скобка по ширине подписи у ПРАВОГО края —
     там же, где закрытый край рамки темы, так что кнопка стоит на её линии и читается её началом.
     Штрих вдвое толще (3px): на коробке в 50px прежний волосок 1.5px рядом с зелёной плашкой
     пропадал. Это исключение в BW_OK (tools/check.js) — скобка тут не граница содержимого,
     а САМ ПРЕДМЕТ, нарисованная пустая тема.
     --fpad/--frail обнулены В ПИКСЕЛЯХ, и это не придирка: у полосы во всю ширину они подтягивали
     усы внутрь, к краю карточек, а у узкой кнопки из-за них подпись оказывалась СНАРУЖИ скобки.
     Написать `0` без единицы нельзя — `calc(0 + 0)` невалиден, правило отбрасывается целиком, и
     рамка молча исчезает (проверено). */
  /* --slot-h — одна высота на слот и на «+ theme» (см. комментарий у .eslot выше) */
  .eslot,.newtheme{--slot-h:56px}
  /* УСЫ ДОТЯНУТЫ ДО СЕРЕДИНЫ ЛИСТА (владелец, 17.09.2026): ширина кнопки — ровно 50% листа ДЗ,
     подпись прижата к её правому краю. Тянуть сам псевдоэлемент влево было бы нечестно — его
     проценты считаются от КНОПКИ, а не от листа, и «половина» уехала бы при любой правке подписи;
     ширину же 50% лист задаёт сам. Скобка при этом по-прежнему рисует ровно коробку кнопки. */
  .newtheme{position:relative;display:flex;align-items:center;justify-content:flex-end;
    width:50%;min-height:var(--slot-h);box-sizing:border-box;
    --fpad:0px;--frail:0px;background:transparent;border:none;
    padding:0 22px;margin:0 0 18px auto;cursor:pointer;text-align:center;
    font-family:inherit;font-size:var(--fs-input);font-weight:800;color:var(--accent-dark)}
  /* скругление --r-md, а не --r-xl: на коробке в 56px радиус 24px закруглял правый край почти
     в полукруг, и скобка читалась пилюлей — та же правка, что у слота (blox59 #17) */
  .newtheme::before{content:"";position:absolute;top:0;bottom:0;
    left:calc(var(--fpad) + var(--frail));right:0;
    border:3px dashed var(--frame-line);border-left:none;
    border-radius:0 var(--r-md) var(--r-md) 0;pointer-events:none}
  .newtheme{transition:color var(--dur-state) var(--ease-standard),transform var(--dur-release) var(--ease-spring)}
  .newtheme::before{transition:border-color var(--dur-state) var(--ease-standard)}
  @media (hover:hover){.newtheme:hover{color:var(--accent)}
    .newtheme:hover::before{border-color:var(--accent-deep)}}
  .newtheme:active{transform:scale(var(--press-scale));transform-origin:right center;
    transition-duration:var(--dur-press-in);transition-timing-function:var(--ease-standard)}
  @media (prefers-reduced-motion:reduce){.newtheme:active{transform:none}}
  /* «вне темы» стоит по той же вертикали, что таски внутри рамки (граница 1.25px + падинг 14px);
     сама скобка рамки закрыта справа, слева она открыта — тасков это не касается */
  .standarea{margin:0 14px 0 15px}
  /* окно заполнения сущности — модальное поверх экрана */
  /* вуаль — токен --scrim, не сырое число (blox52 #16 п.3): зашитый серо-лиловый
     rgba(37,26,46,.48) был холодным поверх тёплой бумаги базовой схемы и не темнел ночью.
     --scrim собран из --sh-rgb — тёплый в базовой, свой в каждой схеме. */
  /* overscroll-behavior:contain — жест ОСТАЁТСЯ в окне (айфон-PWA). Без него, когда содержимое
     окна прокручено до края (а чаще — когда прокручивать в нём нечего), палец продолжает тащить
     страницу ПОД окном: владелец видит, как за открытым «Новым таском» уезжает монитор. Тот же
     приём уже стоит на длинных телах внутри окна и в проводнике. */
  /* Верхний отступ считается от БЕЗОПАСНОЙ ЗОНЫ. В установленном приложении на айфоне строка
     состояния прозрачная и лежит ПОВЕРХ страницы: с жёсткими 36px окно (а с ним и крестик в его
     углу) оказывалось под часами. max(...) страхует обратную сторону — в браузере env равен
     нулю, и отступ остаётся ровно прежним, 36px. */
  .emodal{position:fixed;inset:0;background:var(--scrim);display:flex;align-items:flex-start;
    justify-content:center;z-index:60;overflow:auto;overscroll-behavior:contain;
    padding:max(36px, calc(env(safe-area-inset-top, 0px) + 14px)) 14px 36px}
  /* СТРАНИЦА ПОД ОТКРЫТЫМ ОКНОМ НЕ ЕДЕТ (core.js: lockPageScroll). Рецепт держится на
     position:fixed у самого body: только он на iOS убирает страницу из потока насмерть —
     одного overflow:hidden телефону мало, а overscroll-behavior выше работает лишь там, где
     внутри окна есть что прокручивать. Отметку (top:-Npx) ставит и снимает JS, он же
     возвращает прокрутку на место при закрытии. */
  body.scroll-locked{position:fixed;left:0;right:0;width:100%;overflow:hidden}
  /* position:relative — иначе крестик .eclose (position:absolute) цеплялся за .emodal (весь экран)
     и висел над тёмной шапкой на top:10px, а не в углу окна — почти невидимый (blox17 #4). */
  .emodal .panel{max-width:540px;width:100%;margin:0;position:relative}
  .emodal .eclose{position:absolute;top:10px;right:12px;background:none;border:none;font-size:var(--ic-lg);
    color:var(--muted);cursor:pointer;line-height:1;z-index:1}
  .pool-note{background:var(--accent-tint);border:1px solid var(--accent-line);border-radius:var(--r-md);padding:12px 14px;
    font-size:var(--fs-sm);color:var(--accent-dark);margin-bottom:8px;font-weight:600}
  /* student: the standing text note ("объявление") — a half-screen scrollable block */
  /* объявление — a standing note. Lavender, so it never reads as a "state" (alert/draft/done). */
  .annc{background:var(--note-bg);border:1px solid var(--note-line);border-radius:var(--r-lg);
    margin:8px 0 14px;overflow:hidden;display:flex;flex-direction:column;box-shadow:var(--sheet-1)}
  .annc .ah{font-size:var(--fs-2xs);font-weight:800;letter-spacing:var(--tracking-caps);
    text-transform:uppercase;color:var(--note-ink);padding:12px 16px 6px}
  /* ТЕЛО ОБЪЯВЛЕНИЯ И ТЕЛО ЗОЛОТОГО ОТЗЫВА — читаемый текст (blox52 #6): книжный вес и
     pretty. Переносов нет: пишет учитель, чаще по-английски (см. .rtitle-body). Правило и у
     .fbnote .fbbody ниже — это близнецы одной формы, и правка одного без другого разъехалась
     бы молча (правило близнецов, CLAUDE.md). */
  .annc .abody{max-height:50vh;overflow-y:auto;-webkit-overflow-scrolling:touch;
    padding:0 16px 16px;font-size:var(--fs-sm);line-height:1.55;color:var(--ink);white-space:pre-wrap;
    word-break:break-word;overscroll-behavior:contain;font-weight:var(--fw-read);text-wrap:pretty}
  .annc .abody a{color:var(--accent-ink);text-decoration:underline;font-weight:600}
  /* blox80 #8 — КАРТИНКИ ОБЪЯВЛЕНИЯ: над текстом, внутри той же прокрутки .abody. Высота картинки
     ограничена (min(34vh,300px)), чтобы под ней было видно начало текста. Несколько картинок —
     одна строка, листается вбок; .many сужает каждую до 85%, следующая выглядывает с края — видно,
     что дальше есть ещё. white-space:normal — .abody держит pre-wrap ради переносов строк учителя. */
  .annc-imgs{display:flex;gap:8px;overflow-x:auto;scroll-snap-type:x mandatory;margin:2px 0 12px;
    white-space:normal;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch}
  .annc-img{flex:0 0 auto;max-width:100%;padding:0;border:0;background:none;cursor:zoom-in;
    scroll-snap-align:start;border-radius:var(--r-md);overflow:hidden}
  .annc-imgs.many .annc-img{max-width:85%}
  .annc-img img{display:block;height:min(34vh,300px);width:auto;max-width:100%;object-fit:contain}
  /* правка у учителя: миниатюры 84px с ✕ в углу и плитка «＋ Картинка» того же размера */
  .annc-ed{display:flex;flex-wrap:wrap;gap:8px}
  .annc-th{position:relative;width:84px;height:84px;border-radius:var(--r-md);overflow:hidden;
    border:1px solid var(--line);background:var(--card)}
  .annc-th img{width:100%;height:100%;object-fit:cover;display:block}
  .annc-th-x{position:absolute;top:4px;right:4px;width:30px;height:30px;border-radius:50%;border:0;
    background:rgba(0,0,0,.62);color:#fff;font-size:var(--fs-sm);cursor:pointer;line-height:1}
  .annc-add{position:relative;width:84px;height:84px;border:2px dashed var(--accent);border-radius:var(--r-md);
    display:flex;align-items:center;justify-content:center;text-align:center;padding:4px;cursor:pointer;
    font-size:var(--fs-sm);font-weight:700;color:var(--accent-ink)}
  .annc-add.is-off{opacity:.5;cursor:default}
  .annc-add input{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:inherit}
  /* blox27 #3 — учительский feedback за урок: ЗОЛОТОЙ блок в бывшем слоте объявления (само
     объявление переехало НАД карусель дней). Форма как у .annc, тема золотая. */
  .fbnote{background:var(--gold-tint);border:1px solid var(--gold-line);border-radius:var(--r-lg);
    margin:8px 0 14px;overflow:hidden;display:flex;flex-direction:column;box-shadow:var(--sheet-1)}
  .fbnote .fbh{font-size:var(--fs-2xs);font-weight:800;letter-spacing:var(--tracking-caps);
    text-transform:uppercase;color:var(--gold-ink);padding:12px 16px 6px;display:flex;align-items:center;gap:6px}
  .fbnote .fbh .ic{color:var(--gold)}
  .fbnote .fbbody{max-height:50vh;overflow-y:auto;-webkit-overflow-scrolling:touch;
    padding:0 16px 16px;font-size:var(--fs-sm);line-height:1.55;color:var(--ink);white-space:pre-wrap;
    word-break:break-word;overscroll-behavior:contain;font-weight:var(--fw-read);text-wrap:pretty}
  .fbnote .fbbody a{color:var(--accent-ink);text-decoration:underline;font-weight:600}
  .toolbar{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}
  /* кнопки конструктора («Выдать ученикам» / «Подтянуть…») по той же левой линии, что «+ Новая
     тема» и «+ таск» (margin-left:15px) — blox16 #8 */
  .toolbar.bbar{margin-left:15px}
  /* blox52 #14 — строка подтверждения публикации ПУСТОГО листа: живёт ПОД кнопками конструктора
     (вставляется after .bbar), поэтому ничего над кнопками не сдвигает. Не modal и не alert —
     обычная строка панели, та же левая линия, что у .bbar. */
  .pubconfirm{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 14px 15px}
  .pubconfirm .pubq{font-size:var(--fs-sm);color:var(--ink)}
  /* пара «Выдать / Вернуться» ходит ВМЕСТЕ: перенос не имеет права разлучить кнопки решения
     (lingo-ui §3 — логически связанные контролы в одной неразрывной обёртке) */
  .pubconfirm .pubbtns{display:flex;align-items:center;gap:8px;flex-wrap:nowrap}
  /* .btn-ghost → folded onto the engine's --ghost role (the base look). Modifiers below. */
  /* blox24 #7 — «Очистить» весь лист ДЗ: разрушительное действие, поэтому тревожный акцент */
  /* --alert (gf-500) текстом на белом даёт 3.56:1. Разрушающее действие уже имеет свой ярлык —
     --danger-ink (7.1:1); в #20 его получили .btn--danger и .mgr-btn.warn, а .bdanger живёт
     отдельным правилом и тогда остался в стороне. */
  .btn-ghost.bdanger{color:var(--danger-ink)}
  @media (hover:hover){.btn-ghost.bdanger:hover{border-color:var(--alert);background:var(--alert-tint)}}
  /* счётчик долгов ученика (blox19 #2) — тревожный акцент, чтобы бросался в глаза */
  /* «Долги: N» (blox52 #11) — нейтральный чип с красной точкой-маркером. Красная заливка была
     ПЕРВЫМ, что видел ребёнок на своём экране, — удар до того, как он что-то сделал. Серьёзность
     остаётся: точка — настоящая тревога (просроченные сдачи), но говорит она маркером, не плоскостью. */
  .btn-ghost.sdebt{color:var(--ink);border-color:var(--line);background:var(--fill-soft);font-weight:800}
  .sdebt-dot{width:8px;height:8px;border-radius:50%;background:var(--alert);flex:0 0 auto}
  /* РЯД ЧИПОВ УЧЕНИКА НА ТЕЛЕФОНЕ (blox52 #13). На 375px три чипа («Чат группы» ·
     «Для родителя» · «Долги: N») не влезали в строку, и третий повисал один слева —
     рваный ряд прямо над заголовком. Лечим сжатием: узкие отступы (--btn-px — ручка
     движка кнопок) ставят все три в одну строку без обрезания текста; если чипов-текста
     всё же больше строки (длинный счётчик), flex:1 растягивает то, что перенеслось, во
     всю ширину — перенос перестаёт быть рваным. Текст внутри чипа не ломаем (nowrap:
     чип в полторы строки — хуже переноса). Ширины экрана ≥431px правило не трогает. */
  @media (max-width:430px){
    .toolbar.stbar{gap:6px}
    .toolbar.stbar .btn-ghost{--btn-px:11px;flex:1 1 auto;white-space:nowrap;min-width:0}
  }
  /* .btn-pub → --primary, .btn-fb → бумажная ghost (blox52 #10) — both in the BUTTON ENGINE
     block. Kept here: the «sent» (green ✓) state — «отправлено» = «сделано», зелёный ему по праву. */
  .btn-fb.sent{--btn-line:var(--ok-line);--btn-face:var(--ok-tint);--btn-ink:var(--ok-ink)}
  .btn-fb.sent .ic{color:var(--ok-solid)}


  /* ═══════════════════════════════════════════════════════════════════════
     ПЕРЕРИСОВКА B — КОНСТРУКТОР ДЗ (агент 3, язык эскиза MonB). Поднос — --tray (theme.css), на нём
     белые плашки без тени со скруглением плитки; «+ Task» — серая вторичная плитка (а не залитая
     якорем: добавление таска — частое, но не главное действие листа; главное — «Выдать»); заголовки
     окон конструктора — витринным шрифтом. Рельс типа на плашке остаётся (смысл «нужна сдача»).
     Классы, id и обвязка прежние. */
  .bitem{background:var(--card);border:0;border-radius:var(--r-tile);box-shadow:none}
  .eslot{background:var(--btn-2-bg);color:var(--btn-2-ink);box-shadow:none;border:0;border-radius:var(--r-tile);
    --rail:var(--card)}   /* волна: прежний normal, чернила (currentColor) — тёмная полупрозрачная по серому */
  @media (hover:hover){.eslot:hover{background:var(--btn-2-bg-hover);box-shadow:none}}
  .emodal .panel{border-radius:var(--r-sheet)}
  .emodal .panel h3{font-family:var(--font-display);font-weight:var(--fw-display);font-size:var(--fs-lg);
    line-height:var(--lh-display);letter-spacing:0;padding-right:40px}
  .obuild-top{color:var(--muted)}
