/* ============================================================
   frames.css — ЕДИНСТВЕННЫЙ источник стилей фреймов.
   Модель: .mf-frame-* (управляется frame-render.js через data-*).
   Плюс overlay-бейдж stage (bridge из server-sync).
   Все стили фреймов — только здесь. Дизайн-стили — в design.css.
   ============================================================ */

.mf-my-grid,
.mf-pub-grid,
.mf-del-grid,
[data-personal-gallery],
[data-public-gallery],
[data-deleted-gallery]{
  /* Единый отступ между карточками (по горизонтали и вертикали одинаковый).
     Раскладка — «ряды со стопками» (gallery-layout.js, data-layout="rows");
     сетка ниже — только до первого расчёта и для пустой ленты. */
  --mf-gallery-gap:16px;
  display:grid;
  grid-template-columns:var(--grid-4);
  align-items:start;
  gap:var(--mf-gallery-gap);
  width:100%;
  margin:0;
  padding:var(--space-2) 0 var(--space-3);
  list-style:none;
  container-type:inline-size;
  container-name:gallery-grid;
}.mf-my-grid>*,.mf-pub-grid>*,.mf-del-grid>*,
[data-personal-gallery]>*,[data-public-gallery]>*,[data-deleted-gallery]>*{
  display:block;
  width:100%;
  min-width:0;
  margin:0;
}.mf-my-grid>.mf-frame,.mf-pub-grid>.mf-frame,.mf-del-grid>.mf-frame,
[data-personal-gallery]>.mf-frame,[data-public-gallery]>.mf-frame,[data-deleted-gallery]>.mf-frame{
  aspect-ratio:var(--mf-ratio-w,16)/var(--mf-ratio-h,9);
  /* ВЁРСТКА И ОТРИСОВКА — ТОЛЬКО ДЛЯ ВИДИМОГО.
     content-visibility:auto разрешает браузеру пропускать вёрстку и отрисовку
     карточек за пределами экрана и делать их при появлении. Решение принимает
     он сам по положению элемента — своего кода отслеживания видимости не
     нужно, он дублировал бы встроенное.
     contain-intrinsic-size задаёт запасной размер для пропущенных карточек:
     без него полоса прокрутки прыгала бы при их появлении. Ширина берётся
     от сетки, высота — по aspect-ratio выше. */
  content-visibility:auto;
  contain-intrinsic-size:auto 320px;
}.mf-my-grid>.mf-frame .mf-frame-img,.mf-pub-grid>.mf-frame .mf-frame-img,.mf-del-grid>.mf-frame .mf-frame-img,
[data-personal-gallery]>.mf-frame .mf-frame-img,[data-public-gallery]>.mf-frame .mf-frame-img,[data-deleted-gallery]>.mf-frame .mf-frame-img{
  width:100%;
  height:100%;
  object-fit:cover;
  object-position:center;
}/* ═══ РЯДЫ СО СТОПКАМИ (30.09, TASK_SITE_GALLERY_STACKED_ROWS_RU) ═══
   Размеры и места карточек пишет gallery-layout.js инлайном из посчитанных
   чисел; здесь только режим: лента — блок с отсчётом, карточки — на своих
   местах, без своих пропорций и минимальной высоты. Картинка заполняет
   ячейку ровно её формы — object-fit не задаётся: обрезки нет по условию. */
[data-layout="rows"]{display:block;position:relative}
[data-layout="rows"]>.mf-frame{position:absolute;aspect-ratio:auto;min-height:0;margin:0;contain-intrinsic-size:none}
[data-layout="rows"]>[data-layout-skip]{display:none}
[data-layout="rows"]>.mf-frame .mf-frame-img{object-fit:fill}
.mf-empty,[data-personal-gallery]>.mf-empty,[data-public-gallery]>.mf-empty,[data-deleted-gallery]>.mf-empty{
  grid-column:1/-1;
  grid-row-end:auto;
  text-align:center;
  padding:48px var(--space-4);
  color:var(--muted);
}.mf-empty--error,.mf-empty--error .mf-empty-title{color:var(--danger-text)}.mf-empty-icon{display:flex;align-items:center;justify-content:center;width:56px;height:56px;margin:0 auto var(--space-3);opacity:.72}.mf-empty-icon svg{width:40px;height:40px;display:block}.mf-empty-title{font-size:var(--fs-lg);font-weight:var(--fw-title);color:var(--ink-soft)}.mf-empty-sub{margin:var(--space-2) 0 0;font-size:var(--body)}@media(max-width:1100px){.mf-my-grid,.mf-pub-grid,.mf-del-grid,[data-personal-gallery],[data-public-gallery],[data-deleted-gallery]{grid-template-columns:repeat(3,minmax(0,1fr));--mf-gallery-gap:16px}}@media(max-width:820px){.mf-my-grid,.mf-pub-grid,.mf-del-grid,[data-personal-gallery],[data-public-gallery],[data-deleted-gallery]{grid-template-columns:var(--grid-2);--mf-gallery-gap:16px}}@media(max-width:640px){.mf-my-grid,.mf-pub-grid,.mf-del-grid,[data-personal-gallery],[data-public-gallery],[data-deleted-gallery]{grid-template-columns:1fr}}.mf-frame{
  --mf-radius:11px;
  --mf-bg:#0a090d;
  --mf-veil:rgba(0,0,0,.02);
  --mf-line:rgba(255,255,255,.12);
  --mf-line-hot:rgba(255,255,255,.22);
  --mf-ink:rgba(239,233,220,.92);
  --mf-muted:rgba(239,233,220,.76);
  --mf-soft:rgba(239,233,220,.66);
  
  --mf-accent-rgb:143,208,196;
  
  --mf-danger-rgb:255,139,134;
  
  --mf-warn-rgb:255,209,111;
  /* Рамка своей опубликованной работы — цвет мира (Открытый задаёт оранжевый в своей теме, 21.10). */
  --mf-own-pub-rgb:43,211,137;
  --mf-frame-inset:clamp(6px,2.1cqi,9px);
  --mf-frame-caption-fs:clamp(11px,3.8cqi,14px);
  --mf-frame-inset-x:var(--mf-frame-inset);
  --mf-frame-inset-top:var(--mf-frame-inset);
  --mf-frame-inset-bottom:var(--mf-frame-inset);
  --mf-ctl-size:clamp(24px,9.2cqi,38px);
  --mf-ctl-radius:clamp(7px,2.7cqi,10px);
  --mf-ctl-icon:clamp(12px,4.8cqi,17px);
  --mf-ctl-gap:clamp(5px,2cqi,8px);
  position:relative;
  display:flex;
  flex-direction:column;
  justify-content:space-between;
  width:100%;
  min-height:0;
  aspect-ratio:var(--mf-ratio-w,16)/var(--mf-ratio-h,9);
  overflow:hidden;
  isolation:isolate;
  /* Контейнер по обеим сторонам (20.10): подпись решает по высоте карточки, сколько сказать (уровни ниже). */
  container-type:size;
  color:var(--mf-ink);
  border:1px solid var(--mf-line);
  border-radius:var(--mf-radius);
  background:var(--mf-bg);
  box-shadow:var(--shadow-card);
  transition:border-color var(--dur-4) ease,box-shadow var(--dur-4) ease,transform var(--dur-4) ease;
}
/* НИЖНЯЯ ГРАНИЦА ВЫСОТЫ КАРТОЧКИ — ОДНО ИМЯ. На узком экране она задавалась
 * числом дважды (обычная карточка и карточки работы/отказа, оба 218px);
 * поперечник теперь меняет ЗНАЧЕНИЕ имени, а не объявляет размер заново
 * (правило `craft:one-size`). Пусто по умолчанию: на широком экране высоту
 * держит пропорция, а не число. */
.mf-frame{--mf-frame-min-h:0px;min-height:var(--mf-frame-min-h)}
.mf-frame:hover,.mf-frame:focus-within{border-color:var(--mf-line-hot);box-shadow:var(--shadow-modal)}.mf-frame:focus-visible{outline:2px solid rgba(var(--mf-accent-rgb),.82);outline-offset:3px}.mf-frame[data-kind="process"],.mf-frame[data-kind="failed"]{background:#091013}.mf-frame-media{position:absolute;inset:0;z-index:0;overflow:hidden;background:var(--mf-bg)}.mf-frame-img{display:block;width:100%;height:100%;object-fit:cover;object-position:center;border-radius:calc(var(--mf-radius) - 1px);transform:none;transition:transform var(--dur-6) ease,filter var(--dur-6) ease}.mf-frame[data-kind="process"] .mf-frame-img,.mf-frame[data-kind="failed"] .mf-frame-img,.mf-frame[data-kind="ready"] .mf-frame-fallback,.mf-frame[data-kind="public"] .mf-frame-fallback,.mf-frame[data-kind="deleted"] .mf-frame-fallback,.mf-ctl[hidden],.mf-frame-cta[hidden],.mf-frame-author:empty,.mf-frame-meta:empty,.mf-frame[data-kind="process"] .mf-frame-metrics,.mf-frame[data-kind="failed"] .mf-frame-metrics,.mf-frame:not([data-kind="process"]):not([data-phase="content-moderating"]):not([data-phase="publication-moderating"]) .mf-wave,.mf-frame[data-quality] .mf-wave{display:none}.mf-frame[data-removed-by-moderator="1"] .mf-frame-img{filter:grayscale(1) brightness(.38) blur(1px)}.mf-frame[data-removed-by-moderator="1"] .mf-frame-media::after{
  content:"";position:absolute;inset:0;z-index:3;border-radius:inherit;
  background:linear-gradient(180deg,rgba(12,16,14,.55),rgba(12,16,14,.82));pointer-events:none
}.mf-frame[data-removed-by-moderator="1"]::before{
  content:attr(data-tombstone-title);
  position:absolute;left:0;right:0;top:0;bottom:52%;z-index:5;
  display:flex;align-items:flex-end;justify-content:center;
  padding:0 var(--space-5) var(--space-2);text-align:center;font-size:var(--small);font-weight:var(--fw-title);line-height:1.3;
  color:var(--on-dark);letter-spacing:var(--track-1);pointer-events:none
}.mf-frame[data-removed-by-moderator="1"]::after{
  content:attr(data-tombstone-note);
  position:absolute;left:0;right:0;top:48%;bottom:0;z-index:5;
  display:flex;align-items:flex-start;justify-content:center;
  padding:var(--space-2) var(--space-5) 0;text-align:center;font-size:var(--small);font-weight:var(--fw-title);line-height:1.5;
  color:rgba(255,255,255,.86);letter-spacing:var(--track-1);pointer-events:none
}.mf-frame[data-publish-locked="1"] .mf-frame-img{filter:grayscale(.5) brightness(.72)}.mf-frame[data-publish-locked="1"]::after{
  content:attr(data-lock-note); /* надпись ставит frame-render.js на языке страницы (2248) */
  position:absolute;left:0;right:0;bottom:0;z-index:4;padding:var(--space-2) var(--space-3);text-align:center;
  font-size:var(--small);font-weight:var(--fw-title);color:var(--on-dark);background:linear-gradient(180deg,rgba(12,16,14,0),rgba(12,16,14,.72));
  pointer-events:none
}.mf-frame[data-removed-by-moderator="1"]{cursor:default}.mf-frame[data-kind="ready"]:hover .mf-frame-img,.mf-frame[data-kind="public"]:hover .mf-frame-img,.mf-frame[data-kind="deleted"]:hover .mf-frame-img,.mf-frame[data-kind="ready"]:focus-within .mf-frame-img,.mf-frame[data-kind="public"]:focus-within .mf-frame-img,.mf-frame[data-kind="deleted"]:focus-within .mf-frame-img{transform:scale(1.012);filter:contrast(1.02) saturate(1.02)}.mf-frame-fallback{position:absolute;inset:0;background:radial-gradient(1.2px 1.2px at 12% 18%,rgba(232,244,255,.92),transparent 60%),radial-gradient(1px 1px at 27% 62%,rgba(214,232,255,.72),transparent 60%),radial-gradient(1.4px 1.4px at 41% 27%,rgba(255,252,240,.86),transparent 60%),radial-gradient(1px 1px at 58% 74%,rgba(206,226,255,.66),transparent 60%),radial-gradient(1.1px 1.1px at 69% 34%,rgba(240,248,255,.8),transparent 60%),radial-gradient(1px 1px at 83% 58%,rgba(198,220,255,.62),transparent 60%),radial-gradient(1.3px 1.3px at 91% 21%,rgba(255,248,236,.78),transparent 60%),radial-gradient(1px 1px at 35% 88%,rgba(210,228,255,.6),transparent 60%),radial-gradient(1px 1px at 76% 91%,rgba(226,240,255,.58),transparent 60%),radial-gradient(1px 1px at 19% 44%,rgba(220,236,255,.5),transparent 60%),radial-gradient(1px 1px at 50% 12%,rgba(236,246,255,.54),transparent 60%),radial-gradient(1px 1px at 63% 49%,rgba(214,234,255,.46),transparent 60%),radial-gradient(120% 90% at 74% 22%,rgba(86,120,190,.14),transparent 62%),radial-gradient(90% 70% at 22% 78%,rgba(120,86,170,.12),transparent 66%),linear-gradient(160deg,#05070c 0%,#080b13 52%,#04050a 100%)}.mf-frame[data-kind="process"] .mf-frame-fallback,.mf-frame[data-kind="failed"] .mf-frame-fallback{display:block}.mf-frame[data-phase="queued"]{--mf-accent-rgb:129,231,213}.mf-frame[data-phase="running"],.mf-frame[data-phase="submitting"]{--mf-accent-rgb:189,124,255}.mf-frame[data-phase="content-moderating"],.mf-frame[data-phase="publication-moderating"]{--mf-accent-rgb:255,154,61}.mf-frame[data-quality],.mf-frame[data-kind="failed"]{--mf-accent-rgb:var(--mf-danger-rgb)}.mf-frame[data-quality="queue-busy"],.mf-frame[data-quality="user-limit"]{--mf-accent-rgb:var(--mf-warn-rgb)}.mf-frame::before{content:'';position:absolute;inset:0;z-index:1;pointer-events:none;background:linear-gradient(180deg,var(--mf-veil) 0%,rgba(0,0,0,.04) 44%,rgba(0,0,0,.30) 100%)}.mf-frame[data-kind="process"]::before,.mf-frame[data-kind="failed"]::before{background:linear-gradient(180deg,rgba(0,0,0,.18) 0%,var(--mf-veil) 44%,rgba(0,0,0,.56) 100%)}.mf-frame[data-phase="content-moderating"]::before,.mf-frame[data-phase="publication-moderating"]::before{background:radial-gradient(70% 58% at 72% 56%,rgba(var(--mf-accent-rgb),.13),transparent 56%),linear-gradient(180deg,rgba(0,0,0,.18) 0%,var(--mf-veil) 44%,rgba(0,0,0,.58) 100%)}.mf-frame[data-kind="deleted"]{filter:grayscale(.58) brightness(.76)}.mf-frame[data-kind="deleted"] .mf-frame-img{opacity:.74}.mf-frame-top{position:relative;z-index:3;display:flex;align-items:flex-start;justify-content:space-between;gap:var(--mf-ctl-gap);min-height:calc(var(--mf-ctl-size) + var(--mf-frame-inset-top));padding:var(--mf-frame-inset-top) var(--mf-frame-inset-x) 0}.mf-frame-status,.mf-ctl{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:var(--mf-ctl-size);height:var(--mf-ctl-size);padding:0;border-radius:var(--mf-ctl-radius);border:1px solid rgba(255,255,255,.12);box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;text-decoration:none;line-height:0}.mf-frame-status{opacity:1;transition:background var(--dur-1) ease,border-color var(--dur-1) ease;color:var(--on-dark);border-color:rgba(220,244,236,.30);pointer-events:none;cursor:default;background:rgba(16,19,18,.58)}.mf-frame:hover .mf-frame-status,.mf-frame:focus-within .mf-frame-status,.mf-frame:focus-visible .mf-frame-status{background:rgba(12,15,14,.78);border-color:rgba(220,244,236,.50)}.mf-frame-status:empty{visibility:hidden}.mf-frame-status .mf-ctl-ic{width:var(--mf-ctl-icon);height:var(--mf-ctl-icon)}.mf-frame-controls{position:relative;display:inline-flex;align-items:center;justify-content:flex-end;gap:var(--mf-ctl-gap);flex:0 1 auto;margin-left:auto;max-width:calc(100% - var(--mf-ctl-size) - 12px);opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dur-1) ease,visibility var(--dur-1) ease}.mf-frame:hover .mf-frame-controls,.mf-frame:focus-within .mf-frame-controls,.mf-frame:focus-visible .mf-frame-controls,.mf-frame[data-kind="process"] .mf-frame-controls,.mf-frame[data-kind="failed"] .mf-frame-controls{opacity:1;visibility:visible;pointer-events:auto}.mf-ctl{--mf-ctl-rgb:220,244,236;color:var(--on-dark);cursor:pointer;opacity:1;transition:background var(--dur-1) ease,border-color var(--dur-1) ease,color var(--dur-1) ease;position:relative;background:rgba(16,19,18,.62);border-color:rgba(var(--mf-ctl-rgb,220,244,236),.34)}.mf-ctl:hover,.mf-ctl:focus-visible{color:var(--on-dark);outline:0}.mf-ctl[data-act="open"]{--mf-ctl-rgb:124,213,238}.mf-ctl[data-act="download"]{--mf-ctl-rgb:142,201,232}.mf-ctl[data-act="reuse"],.mf-ctl[data-act="retry"]{--mf-ctl-rgb:168,143,232}.mf-ctl[data-act="publish"],.mf-ctl[data-act="restore"],.mf-ctl[data-act="submit-queue"],.mf-ctl[data-act="purchase"]{--mf-ctl-rgb:112,215,183}.mf-ctl[data-act="unpublish"],.mf-ctl[data-act="report"]{--mf-ctl-rgb:231,178,103}.mf-ctl--danger{--mf-ctl-rgb:238,110,112;color:rgba(255,224,222,.9)}.mf-ctl-ic{display:block;width:var(--mf-ctl-icon);height:var(--mf-ctl-icon);filter:none}.mf-ctl-ic path,.mf-ctl-ic circle,.mf-ctl-ic rect{vector-effect:non-scaling-stroke}button.mf-frame-status{appearance:none;-webkit-appearance:none;font:inherit}.mf-frame-status--action,
.mf-frame-status[data-publish-server],.mf-frame-status[data-unpublish-server],.mf-frame-status[data-restore-server],.mf-frame-status[data-publish-refused],.mf-frame-status[data-status-say]{pointer-events:auto;cursor:pointer}.mf-frame-status--action:hover,.mf-frame-status--action:focus-visible{background:rgba(12,15,14,.82);border-color:rgba(220,244,236,.6);outline:0}.mf-frame-status--action:focus-visible{box-shadow:0 0 0 2px rgba(220,244,236,.45)}.mf-frame-bottom{position:relative;z-index:3;display:flex;flex-direction:column;justify-content:flex-end;padding:0 var(--mf-frame-inset-x) var(--mf-frame-inset-bottom);min-height:30%}.mf-frame-caption{position:relative;max-width:min(92%,30em);margin:0 0 clamp(1px,.8cqi,3px)}.mf-frame-title{margin:0;color:var(--mf-muted);font-family:var(--font-ui);font-size:clamp(12px,4.3cqi,16px);font-weight:var(--fw-title);line-height:1.05;letter-spacing:var(--track-1);text-transform:none;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;opacity:.82;text-shadow:0 1px 7px rgba(0,0,0,.24);transition:var(--trans-fade)}.mf-frame:hover .mf-frame-title,.mf-frame:focus-within .mf-frame-title,.mf-frame:focus-visible .mf-frame-title{color:rgba(244,255,251,.94);opacity:1}.mf-frame-sub{margin:clamp(2px,1.3cqi,5px) 0 0;color:var(--mf-soft);font-size:clamp(11px,3.55cqi,12px);line-height:1.2;max-width:30em;opacity:.74}.mf-frame:hover .mf-frame-sub,.mf-frame:focus-within .mf-frame-sub{opacity:1;color:rgba(232,247,241,.86)}.mf-frame[data-kind="ready"],.mf-frame[data-kind="public"],.mf-frame[data-kind="deleted"]{--mf-image-caption-visibility:0;--mf-image-caption-pointer:none}.mf-frame[data-kind="ready"][data-moderation-status="publish_pending"],.mf-frame[data-kind="ready"][data-moderation-status="rejected"],.mf-frame[data-kind="ready"][data-moderation-status="hidden"]{--mf-image-caption-visibility:1;--mf-image-caption-pointer:auto}.mf-frame[data-kind="ready"]:hover,.mf-frame[data-kind="ready"]:focus-within,.mf-frame[data-kind="public"]:hover,.mf-frame[data-kind="public"]:focus-within,.mf-frame[data-kind="deleted"]:hover,.mf-frame[data-kind="deleted"]:focus-within{--mf-image-caption-visibility:1;--mf-image-caption-pointer:auto}.mf-frame[data-kind="ready"] .mf-frame-caption,.mf-frame[data-kind="public"] .mf-frame-caption,.mf-frame[data-kind="deleted"] .mf-frame-caption{opacity:var(--mf-image-caption-visibility,1);pointer-events:var(--mf-image-caption-pointer,auto);transition:opacity var(--dur-1) ease}.mf-frame[data-kind="ready"] .mf-frame-title,.mf-frame[data-kind="public"] .mf-frame-title,.mf-frame[data-kind="deleted"] .mf-frame-title{font-size:clamp(11px,3.9cqi,14px);line-height:1.2}.mf-frame[data-kind="ready"] .mf-frame-sub,.mf-frame[data-kind="public"] .mf-frame-sub,.mf-frame[data-kind="deleted"] .mf-frame-sub{font-size:clamp(10px,3.1cqi,11px);line-height:1.2}.mf-frame[data-kind="ready"] .mf-frame-meta,.mf-frame[data-kind="public"] .mf-frame-meta,.mf-frame[data-kind="deleted"] .mf-frame-meta{font-size:clamp(9px,2.8cqi,11px);display:none}.mf-frame-cta{display:inline-flex;align-items:center;gap:var(--space-2);margin:var(--space-3) 0 0;color:rgba(221,255,243,.94);font-size:var(--small);font-weight:var(--fw-title);line-height:1.2;text-decoration:none;border-bottom:1px solid rgba(112,215,183,.42);width:fit-content}.mf-frame-cta-ic{width:12px;height:12px;color:rgba(221,255,243,.94)}.mf-frame-cta-icon{display:inline-flex;align-items:center;opacity:.86}.mf-frame-cta:hover,.mf-frame-cta:focus-visible{color:var(--on-dark);border-color:rgba(112,215,183,.72)}.mf-frame-foot{position:relative;display:flex;align-items:center;width:100%;gap:clamp(6px,2.6cqi,10px);min-height:clamp(18px,6.5cqi,24px);color:var(--mf-soft)}.mf-frame[data-kind="process"] .mf-frame-foot,.mf-frame[data-kind="failed"] .mf-frame-foot{align-items:center;min-height:clamp(22px,8.5cqi,34px)}.mf-frame[data-kind="process"] .mf-frame-caption,.mf-frame[data-kind="failed"] .mf-frame-caption{margin-bottom:clamp(3px,1.2cqi,6px);max-width:min(92%,30em)}/* ОДИН ШРИФТ У ВСЕХ ИДУЩИХ КАРТОЧЕК (владелец 06.10 15:19: «почему-то разные шрифты»). Размер шёл от ширины карточки (cqi): узкая «В очереди» читалась мельче широкой «Проверяем описание». У идущих и сбойных — от экрана, одинаково в ряду; узкий экран меняет значения имён. */.mf-frame[data-kind="process"],.mf-frame[data-kind="failed"]{--mf-proc-title-fs:16px;--mf-proc-sub-fs:12px;--mf-proc-meta-fs:14px}.mf-frame[data-kind="process"] .mf-frame-title,.mf-frame[data-kind="failed"] .mf-frame-title{font-size:var(--mf-proc-title-fs)}.mf-frame[data-kind="process"] .mf-frame-sub,.mf-frame[data-kind="failed"] .mf-frame-sub{font-size:var(--mf-proc-sub-fs)}.mf-frame[data-kind="process"] .mf-frame-meta,.mf-frame[data-kind="failed"] .mf-frame-meta{font-size:var(--mf-proc-meta-fs)}@media(max-width:640px){.mf-frame[data-kind="process"],.mf-frame[data-kind="failed"]{--mf-proc-title-fs:14px;--mf-proc-sub-fs:11px;--mf-proc-meta-fs:12px}}.mf-frame[data-kind="process"] .mf-frame-meta,.mf-frame[data-kind="failed"] .mf-frame-meta{flex:0 0 auto;display:inline-flex;align-items:center;white-space:nowrap;min-width:max-content;font-variant-numeric:tabular-nums;line-height:1}.mf-frame[data-phase="content-moderating"] .mf-frame-status,.mf-frame[data-phase="publication-moderating"] .mf-frame-status{color:#ffd0a3;background:rgba(var(--mf-accent-rgb),.15);border-color:rgba(var(--mf-accent-rgb),.24)}.mf-frame[data-published="true"] .mf-frame-media::before{
  content:"";position:absolute;left:0;right:0;bottom:0;height:3px;z-index:4;pointer-events:none;
  transition:opacity var(--dur-4) ease, background var(--dur-4) ease;
}.mf-frame[data-published="true"][data-own-frame="true"] .mf-frame-media::before{
  background:linear-gradient(90deg,rgba(var(--mf-own-pub-rgb),0),rgba(var(--mf-own-pub-rgb),.9) 50%,rgba(var(--mf-own-pub-rgb),0));
}.mf-frame[data-published="true"][data-own-frame="false"] .mf-frame-media::before{
  background:linear-gradient(90deg,rgba(124,178,232,0),rgba(124,178,232,.85) 50%,rgba(124,178,232,0));
}.mf-frame[data-published="true"][data-own-frame="true"]{box-shadow:var(--shadow-card),inset 0 0 0 1px rgba(var(--mf-own-pub-rgb),.42)}.mf-frame[data-published="true"][data-own-frame="false"]{box-shadow:var(--shadow-card),inset 0 0 0 1px rgba(124,178,232,.34)}.mf-frame[data-published="true"][data-own-frame="true"]:hover,.mf-frame[data-published="true"][data-own-frame="true"]:focus-within{box-shadow:var(--shadow-modal),inset 0 0 0 1.5px rgba(var(--mf-own-pub-rgb),.7)}.mf-frame[data-published="true"][data-own-frame="false"]:hover,.mf-frame[data-published="true"][data-own-frame="false"]:focus-within{box-shadow:var(--shadow-modal),inset 0 0 0 1.5px rgba(124,178,232,.6)}.mf-frame[data-phase="content-moderating"] .mf-frame-title,.mf-frame[data-phase="publication-moderating"] .mf-frame-title{color:rgba(255,240,226,.94);opacity:.95}.mf-frame-metrics{display:inline-flex;align-items:center;gap:var(--space-2);min-width:0;white-space:nowrap;opacity:.76;transition:opacity var(--dur-1) ease}.mf-frame:hover .mf-frame-metrics,.mf-frame:focus-within .mf-frame-metrics,.mf-frame:hover .mf-frame-like,.mf-frame:hover .mf-frame-author,.mf-frame:hover .mf-frame-meta,.mf-frame:focus-within .mf-frame-like,.mf-frame:focus-within .mf-frame-author,.mf-frame:focus-within .mf-frame-meta{opacity:1}.mf-frame-author,.mf-frame-meta{color:var(--mf-soft);font-size:var(--mf-frame-caption-fs);line-height:1;opacity:.76;white-space:nowrap;transition:var(--trans-fade)}.mf-frame-like{font-size:var(--mf-frame-caption-fs);line-height:1;opacity:.76;white-space:nowrap;transition:var(--trans-fade);display:inline-flex;align-items:center;gap:var(--space-2);pointer-events:auto;cursor:pointer;color:rgba(227,250,242,.78);font-weight:var(--fw-title);background:transparent;border:0;padding:0;box-shadow:none;text-decoration:none;text-underline-offset:3px}.mf-frame-like-ic{width:15px;height:15px}.mf-frame-like-icon{display:inline-flex;align-items:center}.mf-frame[data-own-frame="true"] .mf-frame-like{color:var(--like-own);opacity:1}.mf-frame[data-own-frame="true"] .mf-frame-author,.mf-frame[data-own-frame="false"] .mf-frame-author{color:#bdeee0;opacity:.9}.mf-frame[data-own-frame="false"] .mf-frame-like{color:var(--like);opacity:1}.mf-frame-like:hover,.mf-frame-like:focus-visible,.mf-frame-author:hover,.mf-frame-author:focus-visible{text-decoration:underline;opacity:1;outline:none}.mf-frame-like[disabled]{pointer-events:none;cursor:default;display:none}.mf-frame-author-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.mf-frame-author{display:inline-flex;align-items:center;min-width:0;pointer-events:auto;cursor:pointer;overflow:hidden;text-overflow:ellipsis;background:transparent;border:0;padding:0;font-weight:var(--fw-title);text-decoration:none;text-underline-offset:3px}.mf-frame[data-kind="ready"][data-moderation-status="publish_pending"] .mf-frame-meta,.mf-frame[data-kind="ready"][data-moderation-status="rejected"] .mf-frame-meta,.mf-frame[data-kind="ready"][data-moderation-status="hidden"] .mf-frame-meta{display:inline-flex;align-items:center;white-space:nowrap;min-width:max-content}.mf-wave{--mf-wave-min-w:clamp(82px,30cqi,150px);--mf-wave-h:clamp(24px,10cqi,42px);position:relative;display:inline-flex;flex:1 1 auto;align-self:center;min-width:var(--mf-wave-min-w);max-width:100%;width:auto;height:var(--mf-wave-h);overflow:hidden;border-radius:0;background:transparent;opacity:1;pointer-events:none;mix-blend-mode:screen}.mf-wave::before{content:'';position:absolute;left:0;right:0;top:50%;height:1px;background:linear-gradient(90deg,transparent,rgba(var(--mf-accent-rgb),.18) 6%,rgba(var(--mf-accent-rgb),.34) 50%,rgba(var(--mf-accent-rgb),.18) 94%,transparent);transform:translateY(-50%);filter:blur(1.6px);opacity:.82}.mf-wave::after{content:'';position:absolute;left:0;right:0;top:50%;height:1px;background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.18) 50%,rgba(255,255,255,0));transform:translateY(-50%);opacity:.62}.mf-wave-canvas{position:absolute;inset:0;width:100%;height:100%;display:block}@media(max-width:640px){.mf-frame{--mf-radius:9px;--mf-frame-inset-x:8px;--mf-frame-inset-top:6px;--mf-frame-inset-bottom:6px;--mf-frame-min-h:218px}.mf-frame-top{padding:var(--mf-frame-inset-top) var(--mf-frame-inset-x) 0}.mf-frame-bottom{padding:0 var(--mf-frame-inset-x) var(--mf-frame-inset-bottom)}.mf-frame-caption{max-width:100%}.mf-wave{--mf-wave-min-w:112px;--mf-wave-h:34px}}/* ═══ УСТРОЙСТВО БЕЗ НАВЕДЕНИЯ (21.09) ══════════════════════════════════════
 * Управление карточки — открыть, повторить, скачать, опубликовать, снять,
 * пожаловаться, восстановить, удалить — стоит `opacity:0; visibility:hidden;
 * pointer-events:none` и открывается НАВЕДЕНИЕМ. На телефоне наведения не
 * бывает: `:hover` не наступает никогда, а `:focus-within` недостижим —
 * сфокусировать спрятанную кнопку нечем. Значит на готовой работе с телефона
 * нельзя было НИЧЕГО: ни скачать, ни опубликовать, ни удалить. Нажатие по
 * самой картинке открывало просмотр — и это был весь доступный человеку набор.
 *
 * `hover:none` — не вторая ветка: те же узлы, то же управление, снят лишь
 * замок, которого устройству нечем открыть. Подписи и счётчики, гаснущие без
 * наведения, тем же правилом остаются видимыми: тускнеть навсегда — то же
 * самое, что исчезнуть. */
@media(hover:none){
  .mf-frame-controls{opacity:1;visibility:visible;pointer-events:auto}
  /* Кнопка карточки — 9,2% её ширины, на телефоне это 33 точки: меньше
     пальца. Без наведения по ней ЦЕЛЯТСЯ, а не подводят курсор, и размер
     берётся общий — тот же `--tap`, что у навигации и подвала. */
  .mf-frame{--mf-ctl-size:var(--tap);--mf-ctl-icon:20px}
  /* Лайк — цель пальца целиком (20.10): с числом без «\\повторы» кнопка стала уже пальца. */
  .mf-frame-like{min-width:var(--tap)}
  .mf-frame-title,.mf-frame-sub,.mf-frame-metrics,.mf-frame-like,.mf-frame-author,.mf-frame-meta{opacity:1}
  /* Подпись и её строка гасятся не только прозрачностью, но и цветом:
     светлыми их делает то же наведение. Цвета взяты у него же — один вид на
     обоих устройствах, разными их делал бы только недосмотр. */
  .mf-frame-title{color:rgba(244,255,251,.94)}
  .mf-frame-sub{color:rgba(232,247,241,.86)}
  /* ЦЕЛИ СТРОКИ КАРТОЧКИ — ПАЛЬЦА, А НЕ КУРСОРА (телефон, 28.09). Сердце,
     автор и «Пополнить баланс» были 15–17 точек в высоту: живой замер с
     работами на ленте, которого у прибора до сих пор не было — на пустом
     стенде карточек нет. Сердце и автор растут вверх и вниз отрицательным
     полем: цель в палец, строка карточки прежней высоты. Призыв к действию
     на экране пальца — кнопка, а не подчёркнутая строка. */
  .mf-frame-like,.mf-frame-author{min-height:var(--tap);margin-block:calc((var(--tap) - 1.2em) / -2)}
  .mf-frame-cta{min-height:var(--tap);padding:0 var(--space-4);border:1px solid rgba(112,215,183,.42);border-radius:var(--mf-ctl-radius)}
}
@media(prefers-reduced-motion:reduce){.mf-frame,.mf-ctl,.mf-frame-status,.mf-frame-title,.mf-frame-metrics{transition:none}}.mf-icon, .mf-ctl-ic { color: var(--icon-muted); stroke-width: 1.8; }.mf-icon[data-tone="accent"], .mf-ctl-ic[data-tone="accent"] { color: var(--icon-accent); }.mf-icon[data-tone="warn"],   .mf-ctl-ic[data-tone="warn"]   { color: var(--icon-warn); }.mf-icon[data-tone="public"]{color:var(--icon-public)}.mf-icon[data-tone="danger"], .mf-ctl-ic[data-tone="danger"] { color: var(--icon-danger); }.mf-icon[data-tone="muted"],  .mf-ctl-ic[data-tone="muted"]  { color: var(--icon-muted); }.mf-ctl-ic[data-tone="view"]     { color: var(--icon-view); }.mf-ctl-ic[data-tone="download"] { color: var(--icon-download); }.mf-ctl-ic[data-tone="reuse"]    { color: var(--icon-reuse); }.mf-ctl-ic[data-tone="publish"]  { color: var(--icon-accent); }.mf-ctl-ic[data-tone="report"]   { color: var(--icon-warn); }.mf-ctl-ic .mf-ic-lock, .mf-icon .mf-ic-lock { color: var(--icon-danger); }.mf-ctl-ic .mf-ic-knock, .mf-icon .mf-ic-knock { color: var(--icon-knock); }.mf-ctl .mf-ctl-ic:not([data-tone]) { color:var(--on-dark); }.mf-frame-like-ic, .mf-frame-metric-ic { color: var(--like); }.mf-frame[data-own-frame="false"] .mf-frame-like-ic { color: var(--like); }.mf-frame[data-own-frame="true"]  .mf-frame-like-ic { color: var(--like-own); }.mf-ctl:hover, .mf-ctl:focus-visible { background: rgba(12,15,14,.74); border-color: rgba(var(--mf-ctl-rgb,220,244,236),.55); }.mf-ctl .mf-ctl-ic { position: relative; z-index: 1; }.mf-icon[data-icon="gen-processing"], .mf-ctl-ic[data-icon="gen-processing"],
.mf-icon[data-icon="gen-spinner"], .mf-ctl-ic[data-icon="gen-spinner"] {
  transform-box: fill-box; transform-origin: center; animation: mf-icon-spin 2.4s linear infinite;
}.mf-icon[data-icon="gen-spinner"], .mf-ctl-ic[data-icon="gen-spinner"] { animation-duration: 1.6s; }@media (prefers-reduced-motion: reduce) {
  .mf-icon[data-icon="gen-processing"], .mf-ctl-ic[data-icon="gen-processing"],
  .mf-icon[data-icon="gen-spinner"], .mf-ctl-ic[data-icon="gen-spinner"] { animation: none; }
}

/* Overlay-бейдж stage поверх карточки (bridge, server-sync). */
.mf-frame__stage-badge{position:absolute;top:8px;left:8px;font-size:var(--micro);padding:2px 8px;border-radius:var(--ui-pill);background:#f1efe8;color:#5f5e5a;z-index:2}
.mf-frame__stage-badge[data-badge-tone="locked"]{background:#fcebeb;color:var(--danger-text)}
.mf-frame__stage-badge[data-badge-tone="warn"]{background:#faeeda;color:var(--warn-text)}
.mf-frame__stage-badge[data-badge-tone="info"]{background:#e6f1fb;color:#185fa5}


/* ── перенесено из design.css (frame-стили) ── */
#my-gallery[data-local-workspace-section="my-gallery"] .mf-empty,
#my-gallery[data-local-workspace-section="my-gallery"] [data-local-empty-state]{
  pointer-events: none;
}

.mf-failed-message{white-space:pre-wrap}

/* ЛЕНТА СОБЫТИЙ РАБОТЫ (Ctrl+Alt+клик по карточке).
   Поверх всего, тёмная, моноширинная: это инструмент разбора, а не часть
   интерфейса — она не должна выглядеть как обычное окно сайта. */
#mf-journal-panel{position:fixed;inset:0;z-index:var(--layer-debug);background:rgba(0,0,0,.72);display:flex;align-items:center;justify-content:center;padding:var(--space-5)}
#mf-journal-panel .mf-jp-box{width:min(960px,96vw);max-height:88vh;display:flex;flex-direction:column;background:#12140f;border:1px solid #2c3327;border-radius:10px;overflow:hidden;font:12px/1.55 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:#d7dbd2}
#mf-journal-panel .mf-jp-head{display:flex;align-items:center;gap:10px;padding:10px 14px;background:#1a1e15;border-bottom:1px solid #2c3327;font-weight:600}
#mf-journal-panel .mf-jp-head code{color:#8fae72;font-size:11px}
#mf-journal-panel .mf-jp-x{margin-left:auto;background:none;border:0;color:#8b917f;font-size:20px;line-height:1;cursor:pointer;padding:0 4px}
#mf-journal-panel .mf-jp-x:hover{color:#e6eadf}
/* Снимок работы в истории кадра: ссылка на уже существующую миниатюру, а не
   копия. Показывается в 128 пикселей — столько просил владелец, и столько
   хватает, чтобы узнать кадр. */
#mf-journal-panel .mf-jp-shot{padding:10px 14px 0}
#mf-journal-panel .mf-jp-shot img{width:128px;height:auto;display:block;border-radius:4px;border:1px solid #2c3327}
#mf-journal-panel .mf-jp-body{padding:var(--space-2) 14px 14px}
/* ОДНА ОБЛАСТЬ ПРОКРУТКИ под шапкой. Полоса широкая и в цветах окна: светлая
   системная полоса на тёмном окне читалась как чужой элемент, а узкая — не
   ловилась мышью. Бегунок светлеет под курсором. */
#mf-journal-panel .mf-jp-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:auto;scrollbar-color:#5d6d4a #151910}
#mf-journal-panel .mf-jp-scroll::-webkit-scrollbar{width:14px}
#mf-journal-panel .mf-jp-scroll::-webkit-scrollbar-track{background:#151910;border-left:1px solid #2c3327}
#mf-journal-panel .mf-jp-scroll::-webkit-scrollbar-thumb{background:#4b5a3b;border-radius:7px;border:3px solid #151910;min-height:48px}
#mf-journal-panel .mf-jp-scroll::-webkit-scrollbar-thumb:hover{background:#6f8456}
#mf-journal-panel .mf-jp-lane-h{position:sticky;top:0;z-index:1;padding:6px 14px;background:#1a1e15;border-top:1px solid #2c3327;border-bottom:1px solid #2c3327;color:#cfe0bb;font-weight:600}
#mf-journal-panel .mf-jr{display:grid;grid-template-columns:74px 210px 1fr;gap:var(--space-2);padding:3px 0;border-bottom:1px solid #1e2318}
#mf-journal-panel .mf-jr-t{color:#7d8472}
#mf-journal-panel .mf-jr-e{color:#cfe0bb}
#mf-journal-panel .mf-jr-unknown{color:#c9a227}
#mf-journal-panel .mf-jr-d{color:#9aa28c;word-break:break-word}
#mf-journal-panel .mf-jr-why{padding:var(--space-2) 14px;background:#2a2113;color:#e2c98b;border-bottom:1px solid #2c3327}
#mf-journal-panel .mf-jr-empty{padding:14px 0;color:#8b917f}
#mf-journal-panel .mf-jp-act{margin-left:8px;background:#232a1c;border:1px solid #37402e;color:#cfe0bb;font:inherit;font-size:11px;padding:3px 9px;border-radius:5px;cursor:pointer}
#mf-journal-panel .mf-jp-act:hover{background:#2d3625;color:#e6eadf}
#mf-journal-panel .mf-jp-head .mf-jp-x{margin-left:6px}
#mf-journal-panel .mf-jr-x{color:#7f8a6e}
#mf-journal-panel .mf-jr-env{color:#6f7a60;font-size:11px}
#mf-journal-panel .mf-jr-sum{padding:var(--space-2) 14px;background:#171c12;border-bottom:1px solid #2c3327;color:#b8c8a4;line-height:1.7}
#mf-journal-panel .mf-jr-dt{color:#5f6a52;font-size:10px}
/* ОГРАНИЧЕНИЯ МИРА под полем описания: тихая строка-подсказка, не тревога. */
.mf-world-limits{margin:var(--space-2) 0 0;color:var(--muted);font-size:var(--small);line-height:1.45}
/* ЧЕМ НАРИСОВАНО — паспорт генерации над лентой: ключ слева, значение справа,
   длинный промпт переносится, а не режется. */
#mf-journal-panel .mf-jp-pass{padding:var(--space-2) 14px;background:#12170f;border-bottom:1px solid #2c3327}
#mf-journal-panel .mf-jp-pass-h{color:#cfe0bb;font-weight:600;margin-bottom:4px}
#mf-journal-panel .mf-jp-pr{display:grid;grid-template-columns:128px 1fr;gap:10px;padding:2px 0}
#mf-journal-panel .mf-jp-pk{color:#7f8a6e}
#mf-journal-panel .mf-jp-pv{color:#dfe8d2;word-break:break-word;white-space:pre-wrap;user-select:text}
@media(max-width:640px){#mf-journal-panel .mf-jp-pr{grid-template-columns:1fr;gap:0}}

/* НЕ ВСТАЛО В ОЧЕРЕДЬ — ТЁМНО-СЕРАЯ КАРТОЧКА.
   Работа не начиналась и не начнётся сама: ни цвета фазы, ни тревожного
   оранжевого она не заслуживает. Оранжевый (--mf-warn) читается как «идёт, но
   плохо» и стоит в одном ряду с модерацией; здесь нужен другой разряд —
   отложено. Карточка гасится целиком, как надгробие удалённой (тот же приём,
   data-kind="deleted"), но мягче: её можно повторить, а не восстановить.
   Ловятся оба пути: фаза queue-not-submitted (не поставлено) и причина отказа
   очереди (queue-busy, user-limit). */
.mf-frame[data-phase="queue-not-submitted"],
.mf-frame[data-quality="queue-busy"],
.mf-frame[data-quality="user-limit"]{
  
  --mf-accent-rgb:141,153,149;
  background:#0a0d0c;
  filter:grayscale(.9) brightness(.7);
}
/* Управление и подпись не тонут вместе с фоном: повторить постановку человек
   должен уметь, не наводя мышь вслепую. */
.mf-frame[data-phase="queue-not-submitted"]:hover,
.mf-frame[data-quality="queue-busy"]:hover,
.mf-frame[data-quality="user-limit"]:hover,
.mf-frame[data-phase="queue-not-submitted"]:focus-within,
.mf-frame[data-quality="queue-busy"]:focus-within,
.mf-frame[data-quality="user-limit"]:focus-within{
  filter:grayscale(.72) brightness(.86);
}
.mf-frame[data-phase="queue-not-submitted"]::before,
.mf-frame[data-quality="queue-busy"]::before,
.mf-frame[data-quality="user-limit"]::before{
  background:linear-gradient(180deg,rgba(0,0,0,.34) 0%,rgba(0,0,0,.42) 44%,rgba(0,0,0,.66) 100%);
}

/* СНЯТЫ ДВА ПРАВИЛА ПОКАЗА БЕЗ СОСТОЯНИЯ (21.08).
   data-phase="settling" — такой фазы модель не выставляет: слово живёт в
   подписях и в настройках волны, а фазой карточки не становится.
   data-quality="no-tokens" — код нехватки токенов модель переводит в
   "user-limit", и это значение уже покрашено выше.
   Оба правила были написаны под состояния, которые с тех пор переименованы;
   краснеть им было нечем, и они молча ждали, пока кто-то будет искать по ним
   ошибку показа. Теперь несоответствие видов и состояний судит craft:client-page. */

/* УЗКАЯ КАРТОЧКА (08.10, ревизия страницы генерации: на телефоне 9:16 рядом с 16:9 — 89 px, значки налезали
 * друг на друга, подпись «by y…»). Карточка — контейнер; что не помещается, уходит в открытую работе (касание
 * картинки её открывает). Пальцу кнопка — 44 px, мыши — 28 px: пороги свои. Правило одно на все ленты. */
@container (max-width:160px){.mf-frame-author{display:none}}
@container (max-width:150px){.mf-frame-controls>.mf-ctl:is([data-act="reuse"],[data-act="download"],[data-act="copy-seed"]){display:none}}
@media (pointer:coarse){
  @container (max-width:290px){.mf-frame-controls>.mf-ctl:is([data-act="reuse"],[data-act="download"],[data-act="copy-seed"]){display:none}}
  @container (max-width:190px){.mf-frame-controls>.mf-ctl[data-act="open"]{display:none}}
  /* Уже 150 px значок состояния уступает «Повторить» и «Удалить»: состояние сказано текстом карточки. */
  @container (max-width:150px){.mf-frame-top>.mf-frame-status{display:none}}
}
/* ЗНАЧОК СОСТОЯНИЯ — ЦВЕТНАЯ ПЛАШКА (владелец 09.10: «играй цветом; не понять разницы опубликованной и
   модерируемой»; «подпись пусть выезжает, если подвести»). Цвет — вся плашка, а не тонкая линия: нейтральная —
   своё и только для вас, янтарь — проверка (дышит), синий — опубликовано, красный — решение модератора.
   Цвета различаются и яркостью. Слово выезжает при наведении и фокусе. */
[data-pub-state="private"],[data-pub-state="face"]{--pub-bg:rgba(16,19,18,.74);--pub-fg:#7fe0b5}
[data-pub-state="review"]{--pub-bg:#f5a623;--pub-fg:#1b1406}
[data-pub-state="public"]{--pub-bg:#2f80ff;--pub-fg:#ffffff}
[data-pub-state="refused"],[data-pub-state="removed"]{--pub-bg:#e5484d;--pub-fg:#ffffff}
.mf-frame .mf-frame-status[data-pub-state]{width:auto;min-width:var(--mf-ctl-size);padding:0 calc((var(--mf-ctl-size) - var(--mf-ctl-icon)) / 2 - 1px);border:0;background:var(--pub-bg);color:var(--pub-fg);box-shadow:var(--shadow-pub);transition:filter var(--dur-4),box-shadow var(--dur-4)}
/* Плашка — не больше соседних кнопок карточки (владелец 09.10 14:55): тот же размер и радиус, что у .mf-ctl. */
.mf-frame .mf-frame-status[data-pub-state]{height:var(--mf-ctl-size);min-width:var(--mf-ctl-size);padding:0 calc((var(--mf-ctl-size) - var(--mf-ctl-icon)) / 2);border-radius:var(--mf-ctl-radius)}
.mf-frame .mf-frame-status[data-pub-state] .mf-icon{color:var(--pub-fg);width:var(--mf-ctl-icon);height:var(--mf-ctl-icon)}
.mf-frame .mf-frame-status[data-pub-state] .mf-ic-knock{color:var(--pub-bg)}
.mf-frame .mf-frame-status[data-pub-state="private"] .mf-ic-knock,.mf-frame .mf-frame-status[data-pub-state="face"] .mf-ic-knock{color:#1a1e1d}
.mf-frame .mf-frame-status[data-pub-state]:hover,.mf-frame .mf-frame-status[data-pub-state]:focus-visible{background:var(--pub-bg);filter:brightness(1.08)}
.mf-status-word{display:inline-block;max-width:0;opacity:0;overflow:hidden;white-space:nowrap;font-size:12px;font-weight:600;line-height:1;transition:max-width var(--dur-4) ease,opacity var(--dur-4) ease,margin var(--dur-4) ease}
.mf-frame-status[data-pub-state]:hover .mf-status-word,.mf-frame-status[data-pub-state]:focus-visible .mf-status-word{max-width:140px;opacity:1;margin-left:6px;margin-right:2px}
@keyframes mf-review-breath{0%,100%{box-shadow:var(--shadow-pub),0 0 0 0 rgba(245,166,35,.55)}50%{box-shadow:var(--shadow-pub),0 0 0 6px rgba(245,166,35,0)}}
.mf-frame .mf-frame-status[data-pub-state="review"]{animation:mf-review-breath 2.4s ease-in-out infinite}
@media(prefers-reduced-motion:reduce){.mf-frame .mf-frame-status[data-pub-state="review"]{animation:none}.mf-status-word{transition:none}}

/* ПОДПИСЬ ПО ВЫСОТЕ КАРТОЧКИ (20.10, владелец: «сокращения и показ не всего… сейчас прям неаккуратности»; невысокая
   карточка «Ждёт токенов» выдавливала текст вверх, на значки). Четыре уровня — у всех состояний, решает стиль, не код:
     ≥ 260 — заголовок в строку, пояснение не длиннее двух строк, действие, место;
     170–259 — пояснение уходит в подсказку подписи (title), остаются заголовок, действие, место;
     110–169 — у работы в пути и сбойной значок состояния уступает место (состояние сказано подписью); у готовой
               картинки подписи под значком нет — Private / Public виден всегда (владелец 21.10 11:28);
     < 110 — только место в очереди; всё остальное — по касанию карточки.
   Подпись никогда не выше места под значками: её высота ограничена, лишнее срезается целыми строками. */
.mf-frame .mf-frame-title{-webkit-line-clamp:1}
.mf-frame .mf-frame-sub{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.mf-frame .mf-frame-caption{max-height:calc(100cqh - var(--mf-ctl-size) - var(--space-6));overflow:hidden}
@container (max-height:259px){.mf-frame .mf-frame-sub{display:none}}
@container (max-height:169px){.mf-frame:is([data-kind="process"],[data-kind="failed"]) .mf-frame-top>.mf-frame-status{display:none}}
@container (max-height:109px){.mf-frame .mf-frame-caption>.mf-frame-title,.mf-frame .mf-frame-cta{display:none}}
/* МЕСТО К ГЕНЕРАТОРУ КРУПНО (макет mock-queue, 21.10): цифра акцентом, рядом «из N / ≈ мин»; подсказка — по наведению. */
.mf-frame-meta.is-place{gap:var(--space-2);pointer-events:auto;cursor:help;opacity:1}
.mf-frame-place{color:rgba(var(--mf-accent-rgb),1);font-size:calc(var(--mf-proc-meta-fs) * 2.2);font-weight:800;line-height:.9}
.mf-frame-place-of{color:var(--mf-soft);font-size:var(--micro);line-height:1.15;white-space:nowrap}
