  /* Дашборд G-Sites в шелле семейства: топбар + левый сайдбар + внутренний скролл
     контента (канон fullwidth-and-internal-scroll). Все цвета — токены suite-theme. */
  * { box-sizing:border-box; }
  html, body { height:100%; }
  body { margin:0; display:flex; flex-direction:column; min-height:100vh; overflow:hidden;
    background:var(--ge-color-bg,#faf9f8); color:var(--ge-color-text,#201f1e);
    font:14px/1.5 system-ui,-apple-system,'Segoe UI',sans-serif; -webkit-font-smoothing:antialiased; }
  a { color:var(--ge-color-brand,#4f46e5); text-decoration:none; }
  button { font:inherit; cursor:pointer; }
  i[data-suite-ic] { width:17px; height:17px; display:inline-flex; flex:none; }

  /* Шапка страницы — общий хром Ядра (<suite-header>), своих правил её вида здесь нет.
     Остаётся подпись роли в текущем сервисе: это факт страницы, а не органа шапки. */
  .who { display:block; font-size:12.5px; color:var(--ge-color-text-mute,#605e5c); margin:0 0 10px; }

  /* ── шелл: сайдбар + контент ── */
  .gs-shell { flex:1; display:flex; min-height:0; }
  .gs-nav { width:232px; flex:0 0 auto; display:flex; flex-direction:column; gap:2px; padding:14px 10px;
    background:var(--ge-color-surface,#fff); border-right:1px solid var(--ge-color-border,#edebe9); overflow-y:auto; }
  .gs-nav .sect { margin:12px 10px 6px; font-size:10.5px; font-weight:700; letter-spacing:.08em;
    text-transform:uppercase; color:var(--ge-color-text-faint,#726f6d); }
  .gs-ni { display:flex; align-items:center; gap:10px; padding:9px 12px; border-radius:9px; border:none; background:none;
    color:var(--ge-color-text-mute,#605e5c); font-weight:500; font-size:13.5px; text-align:left; width:100%;
    transition:background .15s,color .15s; }
  .gs-ni:hover { background:var(--ge-color-hover,rgba(79,70,229,.06)); color:var(--ge-color-text,#201f1e); }
  .gs-ni.on { background:var(--ge-color-brand-soft,#eef2ff); color:var(--ge-color-brand,#4f46e5); font-weight:600; }
  .gs-ni .cnt { margin-left:auto; min-width:19px; text-align:center; background:#d97706; color:#fff;
    border-radius:999px; font-size:11px; padding:1px 6px; }
  .gs-nav .spacer { flex:1; }
  /* Рабочее поле продукта (data-suite-layer-host): в него садится слой общего каркаса.
     Само поле НЕ прокручивается — прокрутка принадлежит внутреннему полотну. Иначе слой,
     положенный в прокручиваемый ящик, отсчитывается от начала содержимого, и при
     прокрученной странице уезжает вверх за край видимого. Своей ширины поле не знает:
     его левая граница — это правый край рельса, а рельс раздвигает .gs-shell сам. */
  .gs-main { flex:1; min-width:0; position:relative; overflow:hidden; display:flex; flex-direction:column; }
  .gs-scroll { flex:1; min-height:0; overflow-y:auto; padding:20px 24px 48px; }
  .gs-page { max-width:1240px; }

  /* ── UI-кит на токенах (эталон модулей семейства) ── */
  .gs-card { background:var(--ge-color-surface,#fff); border:1px solid var(--ge-color-border,#edebe9);
    border-radius:var(--ge-radius-md, 4px); padding:16px 18px; }
  .gs-card h2 { font-size:14px; margin:0 0 12px; }
  /* Шапка карточки и её подстрочник (карта 10002163). Заведены записями темы взамен величин,
     набранных прямо в разметке: пока отступ и выравнивание писались строкой в каждом месте,
     одинаковые на вид шапки расходились на пиксель и правились поимённо. Свою тень шапка не
     объявляет — тень принадлежит только плавающему слою. */
  .gs-card-head { display:flex; align-items:center; justify-content:space-between;
    gap:var(--ge-space-2); margin-bottom:var(--ge-space-3); }
  .gs-card-head h2 { margin:0; }
  /* Подстрочник шапки: чем сайт отдаётся сейчас, сколько вариантов и орган смены. Орган
     объявляет свою ширину сам (100 %), поэтому его гнездо — блочное и с объявленной ступенью
     ширины: в строке иначе схлопывается до нуля. */
  .gs-card-sub { display:flex; align-items:center; flex-wrap:wrap;
    gap:var(--ge-space-2); margin-bottom:var(--ge-space-3); }
  /* Ширина гнезда — величина ЗДЕСЬ и честно литеральная: ступени ширины органа тема семьи не
     объявляет вовсе, а обращение к незаявленному имени выдавало бы литерал за ступень и молча
     падало на запасное значение. */
  .gs-card-sub .gs-var-switch { display:block; width:240px; }
  /* Карта сайта (карта 10002231): полоса родов и сетка плиток стоят одна под другой, и зазор
     между ними — ступень темы, а не глазомер. Своих поверхностей, границ и теней гнёзда не
     объявляют: полоса и сетка рисуют себя сами, здесь назван только их разрыв. */
  .gs-sitemap-tiles { margin-top:var(--ge-space-3); }
  /* Вложенный блок карточки (карта 10005384): страницы принадлежат ВЫБРАННОМУ варианту и лежат
     внутри карточки вариантов, а не соседней карточкой того же уровня. Своей поверхности и своей
     тени блок не объявляет: карточка внутри карточки есть вложенность видом, запрещённая
     регистром, а тень принадлежит только плавающему слою. Все величины — записи темы.

     ЛИНИЯ СЛЕВА, А НЕ СВЕРХУ. Волосяная линия СВЕРХУ идёт во всю ширину карточки и означает
     «следующая секция», а не «внутри»: она неотличима от рядового разделителя, и рядом с
     невидимой ступенью отступа экран снова читался «одна секция под другой» — ровно та
     претензия, ради снятия которой раздел и вложен. Линия СЛЕВА идёт вдоль всего блока и есть
     общепринятый знак подчинения; ступень отступа она заодно делает видимой. Признака по-прежнему
     два, но оба говорят об одном — о подчинении, а не о соседстве.

     ЛИНИЯ ПЛОТНЕЕ РЯДОВОГО РАЗДЕЛИТЕЛЯ. Взятая записью --ge-color-border, она совпадала цветом
     и толщиной с рамкой карточки и с разделителями строк перечня, стоящего тут же: знак
     подчинения был неотличим от знака соседства. Ступень плотнее объявлена темой семьи
     (--ge-color-border-strong) — своей величины здесь не заводится.

     ЗАЗОР СВЕРХУ ТЕСНЕЕ МЕЖКАРТОЧНОГО. Пока он равнялся --ge-space-4, тот же зазор разводил
     СОСЕДНИЕ карточки (.gs-card-gap), и вертикальный ритм «внутри» совпадал с ритмом «одна под
     другой» знак в знак. Тесная ступень говорит о принадлежности, широкая — о соседстве.

     СТУПЕНЬ КЕГЛЯ ДАЁТСЯ ВЕСОМ, А НЕ РАЗМЕРОМ. Своя ступень кегля у заголовка была ошибкой:
     --ge-font-size-md есть 13,5px, то есть МЕНЬШЕ тела экрана (14px), — заголовок раздела
     оказывался мельче текста под собой, и иерархия переворачивалась ровно там, ради чего раздел
     и вложен. Кегль наследуется от тела, отличает заголовок насыщенность, а ступень вниз даёт
     подстрочник записью ниже. Регистр требует не более двух-трёх кеглей на поверхность, и
     шестой здесь не заводится. */
  .gs-nested { border-left:1px solid var(--ge-color-border-strong);
    margin-top:var(--ge-space-3); padding-left:var(--ge-space-4); }
  .gs-nested h3 { margin:0; font:inherit; font-weight:var(--ge-weight-semibold); }
  /* Заголовок вложенного блока и его действия стоят РЯДОМ, а не по краям: разведённые
     space-between, они разъезжались на треть ширины колонки и читались как несвязанные. */
  .gs-nested .gs-card-head { justify-content:flex-start; gap:var(--ge-space-3); }
  .muted { color:var(--ge-color-text-mute,#605e5c); font-size:13px; }
  /* СВОЕЙ СТУПЕНИ У ПОДСТРОЧНИКА ВЛОЖЕННОГО БЛОКА НЕТ (карта 10005384). Она заводилась, пока
     заголовок набирал свой кегль 13,5px и подстрочник стоял с ним вровень. Заголовок вернулся
     к телу экрана, и ступень вниз даёт общий подстрочник сам. Частная ступень при этом дорого
     стоила: подстрочник несёт единственное предупреждение о том, видит ли правку посетитель
     («Вариант не действующий»), и она набирала его мельче любой строки перечня рядом. */
  .btn { padding:8px 14px; border-radius:8px; border:1px solid var(--ge-color-border,#edebe9);
    background:var(--ge-color-surface,#fff); color:inherit; font-size:13px;
    transition:border-color .15s,color .15s,background .15s; display:inline-flex; align-items:center; gap:7px; }
  .btn:hover { border-color:var(--ge-color-brand,#4f46e5); color:var(--ge-color-brand,#4f46e5); }
  .btn-primary { background:var(--ge-color-brand,#4f46e5); border-color:var(--ge-color-brand,#4f46e5); color:#fff; font-weight:600; }
  .btn-primary:hover { background:var(--ge-color-brand-hover,#4338ca); color:#fff; }
  .btn-danger { color:#dc2626; }
  .btn-danger:hover { border-color:#dc2626; color:#dc2626; }
  .btn-sm { padding:5px 10px; font-size:12px; border-radius:7px; }
  .fld { margin-bottom:12px; }
  /* Подпись поля формы — ОДНА запись на панель (карта 10003534). Прежде их было две: своя у
     карточек (.fld label) и своя у правой колонки редактора (.gse-f label, набиралась в
     editor.js), и на одном экране соседние формы расходились по высоте строки. Набор взят у
     общей формы семьи (G-Suite/server/public/shared/form-kit.js, .sui-fk-f label): кегль, вес и
     цвет — ступенями темы, без прописных и разрядки. Тема семьи (suite-theme.css) говорит о
     прописных прямо: это приём ОДНОЙ поверхности — шапки списка, — а не способ набирать каждую
     подпись; сорок капс-меток читаются медленнее плотной таблицы. */
  .fld label, .gse-f label { display:block; font-size:var(--ge-font-size-sm);
    font-weight:var(--ge-weight-medium); color:var(--ge-color-text-mute);
    margin-bottom:var(--ge-space-1); }
  .fld input, .fld select, .fld textarea, input.ctl, select.ctl {
    width:100%; border:1px solid var(--ge-color-border,#edebe9); border-radius:8px; padding:8px 10px;
    font:inherit; background:var(--ge-color-surface,#fff); color:inherit; }
  input.ctl, select.ctl { width:auto; }
  .fld input:focus, .fld textarea:focus, .fld select:focus, .ctl:focus { outline:none; border-color:var(--ge-color-brand,#4f46e5); }
  /* Признак обязательности и подсказка поля имени (карта 10003249): слова, а не звёздочка —
     звёздочку приходится расшифровывать, а подпись читается сразу. Оба берутся из описи
     полей имени и здесь только оформляются.
     Подпись с пометами — СТРОКА ГИБКОЙ РАСКЛАДКИ, а не отступы: в правой колонке редактора
     поле шириной 288 px, и «ПУБЛИЧНОЕ НАЗВАНИЕ + необязательно + видно посетителю» в одну
     строку не помещается. Отступом перенос не управляется, зазором — управляется. */
  .fld label.fld-lbl { display:flex; flex-wrap:wrap; align-items:baseline;
    gap:var(--ge-space-1, 4px); }
  /* Ступень пометы — СВОЯ, а не унаследованная от подписи: подпись поля крупнее, и помета
     её кеглем спорит с именем поля, ради которого подпись и написана. */
  .fld-mark { font-weight:500;
    font-size:var(--ge-font-size-xs, 11px); color:var(--ge-color-text-faint,#8a8886); }
  /* Признак публичности носит ОБЩАЯ пилюля панели (.pill) — своей формы здесь не заводится:
     радиус, поля и ступень шрифта у двух пилюль пришлось бы держать в согласии руками.
     Помета идёт ПОТОКОМ следом за обязательностью, а не прижимается вправо: прижатая, она в
     широкой карточке уезжала к краю строки и читалась заголовком колонки, а в узком
     инспекторе висела одна на перенесённой строке, оторванная от слов, к которым относится. */
  .fld-mark.pill { align-self:center; font-weight:500; }
  /* Ступень подсказки — та же, что у подсказок правой колонки редактора (.gse-f-hint):
     подсказка имени, набранная крупнее и темнее соседних, читается как замечание о поле. */
  .fld-hint { margin-top:var(--ge-space-1, 4px); font-size:var(--ge-font-size-xs, 11px);
    line-height:1.45; color:var(--ge-color-text-faint,#8a8886); }
  /* Отказ говорит тем же обликом, что прочие состояния правой колонки (.gse-insp-note):
     подложка отделяет сказанное о разделе от самих органов. */
  .fld-refusal { margin-bottom:var(--ge-space-3, 12px);
    padding:var(--ge-space-2, 8px) var(--ge-space-3, 12px);
    border-radius:var(--ge-radius-lg, 8px); font-size:var(--ge-font-size-sm, 12.5px);
    background:var(--ge-color-bg,#faf9f8);
    border:1px solid var(--ge-color-border,#edebe9); color:var(--ge-color-text-mute,#605e5c); }
  /* Недоступное правке поле обязано выглядеть недоступным: правимое на вид и неправимое на
     деле читается как поломка. */
  .fld input[readonly] { background:var(--ge-color-bg,#faf9f8); color:var(--ge-color-text-mute,#605e5c); }
  .row { display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
  .err { color:#dc2626; font-size:13px; min-height:18px; }
  .pill { display:inline-block; border-radius:999px; padding:1px 9px; font-size:11px; font-weight:600;
    border:1px solid var(--ge-color-border,#edebe9); color:var(--ge-color-text-mute,#605e5c); }
  .pill.ok { color:#047857; border-color:#6ee7b7; background:rgba(110,231,183,.12); }
  .pill.warn { color:#b45309; border-color:#fcd34d; background:rgba(252,211,77,.12); }
  .pill.bad { color:#dc2626; border-color:#fca5a5; background:rgba(252,165,165,.1); }
  .pill.brand { color:var(--ge-color-brand,#4f46e5); border-color:var(--ge-color-brand,#4f46e5); background:var(--ge-color-brand-soft,#eef2ff); }
  .note { background:rgba(252,211,77,.12); border:1px solid #fcd34d; color:#92400e;
    border-radius:8px; padding:8px 12px; font-size:12.5px; margin:8px 0; }
  :root[data-theme="dark"] .note { color:#fcd34d; }
  .tempPass { background:var(--ge-color-brand-soft,#eef2ff); border:1px solid var(--ge-color-brand,#4f46e5);
    border-radius:8px; padding:10px 12px; font-size:13px; margin:8px 0; }
  .tempPass code { font-size:15px; font-weight:700; }
  .gs-grid { display:grid; grid-template-columns:340px 1fr; gap:18px; align-items:start; }
  @media (max-width:960px){ .gs-grid { grid-template-columns:1fr; } .gs-nav { width:64px; } .gs-ni span.lbl, .gs-nav .sect { display:none; } }
  .site { border:1px solid var(--ge-color-border,#edebe9); border-radius:10px; padding:11px 13px; margin-bottom:8px;
    cursor:pointer; transition:border-color .15s, background .15s; }
  .site:hover { background:var(--ge-color-hover,rgba(79,70,229,.05)); }
  .site.on { border-color:var(--ge-color-brand,#4f46e5); background:var(--ge-color-brand-soft,#eef2ff); }
  .site.archived { background:var(--ge-color-bg); }
  .site b { display:block; font-size:14px; }
  .site .meta { font-size:12px; color:var(--ge-color-text-mute,#605e5c); margin-top:2px; display:flex; gap:8px; flex-wrap:wrap; align-items:center; }
  /* Полоса органов действий у карточки сайта (карта 10001904). Своего фона и рамки нет —
     отделяет полоса действий волосяная линия сверху и пустота. Собственных величин цвета
     не заводит: btn-danger и btn-sm живут в общем ките. */
  .site .site-acts { display:flex; gap:6px; flex-wrap:wrap; margin-top:8px; padding-top:8px;
    border-top:1px solid var(--ge-color-border); }
  .site .site-acts .btn { padding:4px 9px; font-size:12px; }
  /* Раздел «Архив» — свёрнутый по умолчанию блок под перечнем; заголовок работает знаком
     раскрытия. Счётчик — из того же перечня, повторного запроса к узлу не делается. */
  .site-arch { margin-top:6px; border-top:1px solid var(--ge-color-border); padding-top:6px; }
  .site-arch-toggle { display:flex; align-items:center; gap:8px; width:100%; background:none;
    border:none; padding:8px 4px; font:inherit; color:var(--ge-color-text-mute); cursor:pointer; }
  .site-arch-toggle:hover { color:var(--ge-color-text); }
  .site-arch-toggle i[data-suite-ic] { width:14px; height:14px; transition:transform .15s; }
  .site-arch.open .site-arch-toggle i[data-suite-ic] { transform:rotate(90deg); }
  .site-arch-count { margin-left:auto; font-size:11px; font-weight:600; padding:1px 8px;
    border-radius:999px; border:1px solid var(--ge-color-border); color:var(--ge-color-text-mute); }
  .site-arch-body { display:none; padding-top:4px; }
  .site-arch.open .site-arch-body { display:block; }
  .dom { display:inline-flex; align-items:center; gap:6px; border:1px solid var(--ge-color-border,#edebe9);
    border-radius:999px; padding:3px 6px 3px 12px; font-size:12.5px; margin:0 6px 6px 0; background:var(--ge-color-surface,#fff); }
  .dom button { border:none; background:none; color:var(--ge-color-text-faint,#726f6d); font-size:14px; line-height:1; padding:2px 4px; }
  .dom button:hover { color:#dc2626; }
  table.pages { width:100%; border-collapse:collapse; margin-top:6px; }
  table.pages th, table.pages td { text-align:left; padding:8px 10px; border-bottom:1px solid var(--ge-color-border,#edebe9); font-size:13px; }
  table.pages th { font-size:11px; text-transform:uppercase; letter-spacing:.06em; color:var(--ge-color-text-mute,#605e5c); font-weight:600; }
  table.pages tr.pg, table.pages tr.rw { cursor:pointer; }
  table.pages tr.pg:hover, table.pages tr.rw:hover { background:var(--ge-color-hover,rgba(79,70,229,.05)); }
  .empty { color:var(--ge-color-text-faint,#726f6d); font-size:13px; padding:8px 0; }
  /* Слой (панель, подложка, шапка, полоса действий, Esc) — общий каркас Ядра SuiteUI.drawer.
     Своих правил слоя здесь нет: они были второй редакцией того же поведения. */
  /* блоки страницы */
  .blk { border:1px solid var(--ge-color-border,#edebe9); border-radius:10px; margin-bottom:10px; }
  .blk-h { display:flex; align-items:center; gap:8px; padding:8px 12px; border-bottom:1px solid var(--ge-color-border,#edebe9);
    background:var(--ge-color-bg,#faf9f8); border-radius:10px 10px 0 0; }
  .blk-h b { font-size:12px; text-transform:uppercase; letter-spacing:.06em; color:var(--ge-color-brand,#4f46e5); flex:1; }
  .blk-b { padding:10px 12px; }
  .blk .fld { margin-bottom:8px; }
  .item-row { display:flex; gap:6px; margin-bottom:6px; }
  .item-row input { flex:1; border:1px solid var(--ge-color-border,#edebe9); border-radius:8px; padding:8px 10px; font:inherit; background:var(--ge-color-surface,#fff); color:inherit; }
  .login-note { max-width:520px; margin:60px auto; text-align:center; }
  /* Подтверждение и короткий ввод — общие диалоги семейства (shared/dialog.js). */

  /* ── Полировка (HOTFIX-4) в каноне product-register (impeccable/product.md + PRODUCT.md):
     сдержанно, «заслуженная привычность» уровня Linear/Stripe. Плоские карточки на 1px-границе
     (без декор-теней), без page-load-хореографии и side-stripe — их product-register запрещает.
     Оставляем то, что реально помогает: обучающие empty-состояния и понятные состояния доступа. */
  .gs-card h2 { font-size:15px; font-weight:650; letter-spacing:-.012em; }

  /* премиум empty-state */
  .gs-empty { display:flex; flex-direction:column; align-items:center; text-align:center;
    gap:5px; padding:30px 18px 26px; }
  .gs-empty .ic { width:46px; height:46px; display:grid; place-items:center; border-radius:13px;
    background:var(--ge-color-brand-soft,#eef2ff); color:var(--ge-color-brand,#4f46e5); margin-bottom:6px; }
  .gs-empty .ic i[data-suite-ic] { width:22px; height:22px; }
  .gs-empty h3 { margin:0; font-size:14.5px; font-weight:600; color:var(--ge-color-text,#201f1e); }
  .gs-empty p { margin:0; font-size:13px; line-height:1.55; max-width:340px; color:var(--ge-color-text-mute,#605e5c); }
  .gs-empty.sm { padding:22px 16px; }
  .gs-empty.sm .ic { width:38px; height:38px; border-radius:11px; }
  .gs-empty.sm .ic i[data-suite-ic] { width:18px; height:18px; }

  /* премиум-состояние доступа (403 / вход) */
  .access-card { max-width:560px; margin:52px auto; text-align:center; padding:38px 34px; }
  .access-card .ic { width:54px; height:54px; margin:0 auto 16px; display:grid; place-items:center;
    border-radius:15px; background:var(--ge-color-brand-soft,#eef2ff); color:var(--ge-color-brand,#4f46e5); }
  .access-card .ic i[data-suite-ic] { width:26px; height:26px; }
  .access-card h2 { font-size:19px; font-weight:650; margin:0 0 8px; letter-spacing:-.015em; }
  .access-card p { color:var(--ge-color-text-mute,#605e5c); font-size:14px; line-height:1.6; margin:0 auto 20px; max-width:430px; }
  .access-card .row { justify-content:center; }
  .access-card .sub { font-size:12.5px; color:var(--ge-color-text-mute,#605e5c); margin-top:14px; }

  /* ── управление доменами (Drawer, карта 99334) ── */
  .dlist { display:flex; flex-direction:column; gap:10px; margin-bottom:16px; }
  .dcard { border:1px solid var(--ge-color-border,#edebe9); border-radius:10px; padding:11px 13px;
    background:var(--ge-color-surface,#fff); }
  .dcard .drow { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
  .dcard .drow b { font-family:var(--ge-font-mono,ui-monospace,'Cascadia Code',Menlo,monospace); font-size:13.5px; }
  .dcard .drow.act { margin-top:9px; }
  .dcard .derr { display:flex; align-items:center; gap:6px; margin-top:7px; font-size:12.5px;
    color:#b45309; }
  .dcard .derr i[data-suite-ic] { width:15px; height:15px; flex:none; }
  .dinstr:empty { display:none; }
  .dns-box { margin-top:9px; border:1px dashed var(--ge-color-border, #edebe9); border-radius:9px;
    padding:10px 12px; background:var(--ge-color-bg,#faf9f8); font-size:12.5px; }
  .dns-box .dns-row { display:flex; gap:10px; align-items:baseline; margin-top:5px; }
  .dns-box .dns-row span { width:64px; color:var(--ge-color-text-mute,#605e5c); flex:none; }
  .dns-box code { font-family:var(--ge-font-mono,ui-monospace,'Cascadia Code',Menlo,monospace);
    background:var(--ge-color-surface,#fff); border:1px solid var(--ge-color-border,#edebe9);
    border-radius:5px; padding:1px 6px; font-size:12px; user-select:all; }
  .dm-add { margin-top:4px; }
  .dm-add .hint { font-size:12px; margin-top:6px; }
  .dm-add .hint code { font-family:var(--ge-font-mono,ui-monospace,monospace); font-size:11.5px; }

  /* ── ЧЕМ ОТДАЁТСЯ: показ движка записи и его закрепления (карта 10000922) ── НАЧАЛО ──
     Регистр безрамочного реестра семьи: содержимое лежит на светлой поверхности раздела,
     своего фона у блока нет, рамки нет, тени нет. Отделяет блок ВОЛОСЯНАЯ ЛИНИЯ и пустота.
     Рамка остаётся у ОРГАНОВ управления — их рисует общий кит (.ctl/.btn), и своих правил
     вида органов раздел не заводит. Собственных величин цвета, кегля и отступа здесь нет:
     всё берётся токенами регистра семьи. */
  .дв-блок { margin-top:var(--ge-space-4); padding-top:var(--ge-space-3);
    border-top:1px solid var(--ge-color-border); }
  .дв-шапка { display:flex; align-items:center; gap:var(--ge-space-2); flex-wrap:wrap; }
  .дв-подпись { font-size:var(--ge-font-size-xs); font-weight:var(--ge-weight-semibold);
    letter-spacing:var(--ge-tracking-label); text-transform:uppercase; color:var(--ge-color-text-mute); }
  .дв-знак { font-size:var(--ge-font-size-md); font-weight:var(--ge-weight-medium); color:var(--ge-color-text); }
  .дв-знак-закрепление { color:var(--ge-color-warn); }
  .дв-сведение, .дв-пусто, .дв-причина { font-size:var(--ge-font-size-sm); color:var(--ge-color-text-mute);
    margin:var(--ge-space-2) 0 0; }
  .дв-причина { color:var(--ge-color-warn); }
  .дв-отказ { font-size:var(--ge-font-size-sm); color:var(--ge-color-err); margin:var(--ge-space-2) 0 0; }
  .дв-органы { display:flex; align-items:center; gap:var(--ge-space-2); flex-wrap:wrap;
    margin-top:var(--ge-space-2); }
  .дв-сведения { display:grid; grid-template-columns:auto 1fr; gap:var(--ge-space-1) var(--ge-space-3);
    margin:var(--ge-space-2) 0 0; font-size:var(--ge-font-size-sm); }
  .дв-сведения dt { color:var(--ge-color-text-mute); }
  .дв-сведения dd { margin:0; color:var(--ge-color-text); }
  .дв-строка-перечня { display:inline-flex; align-items:center; gap:var(--ge-space-2); }
  /* ── ЧЕМ ОТДАЁТСЯ ── КОНЕЦ ── */

  /* ── ПРАВКА РАБОЧЕГО ФАЙЛА САЙТА (карта 10002634) ── НАЧАЛО ──
     Здесь ТОЛЬКО место для органов: сами органы рисует общий набор (SuiteUI.sourceEditor,
     SuiteUI.form, SuiteUI.grid), и своих правил их вида раздел не заводит. Оттенков,
     гарнитур, кеглей и радиусов здесь нет ни одного — только раскладка и отступы токенами.
     Тени нет: слой правки плавающий, и тень принадлежит ЕМУ, а не содержимому внутри него. */
  /* Высота поля правки объявлена ЗАПИСЬЮ раздела: записи высоты рабочего поля у темы семьи
     нет ни одной (обход suite-theme.css — только --ge-control-h и --ge-header-h), а поле
     правки без высоты схлопывается в две строки. Величина ОТНОСИТЕЛЬНАЯ — доля высоты
     показа, — поэтому на любой ступени поле занимает ту же долю.
     ЗАПИСЬ ОДНА НА ОБА МЕСТА ПРАВКИ: исходник и изображение — СОСЕДИ, а не вложены друг в
     друга, и объявленное у одного второму не достаётся. Прежде так и было: у показа
     изображения работало запасное число, то есть у одной высоты оказывалось два писателя. */
  .sf-src, .sf-pic { --sf-src-h:52vh; }
  .sf-src { display:flex; min-height:var(--sf-src-h); }
  .sf-pic { display:flex; flex-direction:column; align-items:flex-start;
    gap:var(--ge-space-3); }
  /* Показ нынешнего изображения: доля поля, а не точки — крупное изображение не выламывает
     слой, мелкое не растягивается до мыла. Волосяная линия отделяет его от поверхности.
     Высота наследуется от .sf-pic — своего числа здесь нет. */
  .sf-pic-view { max-width:100%; max-height:var(--sf-src-h); object-fit:contain;
    border:1px solid var(--ge-color-border); border-radius:var(--ge-radius-md);
    background:var(--ge-color-surface-sunken); }
  .sf-pic-pick { font:inherit; font-size:var(--ge-font-size-sm); color:var(--ge-color-text); }
  /* ── ПРАВКА РАБОЧЕГО ФАЙЛА ── КОНЕЦ ── */

  /* ── ПЕРЕКЛЮЧАТЕЛЬ САЙТОВ В ШАПКЕ (карта 10002237) ── НАЧАЛО ──
     Здесь ТОЛЬКО раскладка двух частей тела плавающего слоя: поле поиска сверху и перечень
     под ним со своей прокруткой. Полоса действий и строка величин раскладки не получают —
     их рисует и размещает САМ каркас слоя (shared/dual-mode.js, actions и footNote); своей
     полосы подвала раздел не заводит, иначе у неё оказалось бы два писателя.
     Сами органы рисует общий набор (SuiteUI.form, SuiteUI.cardList), и своих правил их вида
     раздел не назначает — ни цвета, ни кегля, ни радиуса здесь нет ни одного. Тени нет тоже:
     слой плавающий, и тень принадлежит ЕМУ, а не содержимому внутри него.
     Тело палитры объявлено гибкой колонкой без отступа — отступ несут её части, каждая своим
     краем, иначе прокручиваемый перечень уезжал бы под поле поиска вместе с полями. */
  .gs-sw-head { flex:0 0 auto; padding:var(--ge-space-3) var(--ge-space-4);
    border-bottom:1px solid var(--ge-color-border); }
  /* Перечень занимает ВСЮ оставшуюся высоту слоя и прокручивается сам: высота слоя объявлена
     каркасом палитры, и своей величины раздел не назначает. Ширину он занимает целиком —
     мёртвой полосы сбоку не остаётся ни на одной ступени показа. */
  .gs-sw-list { flex:1 1 auto; min-height:0; overflow-y:auto;
    padding:var(--ge-space-2) var(--ge-space-4); }
  /* ── ПЕРЕКЛЮЧАТЕЛЬ САЙТОВ ── КОНЕЦ ── */
