@charset "UTF-8";
/* ============================================================================
   ИнфраГео / InfraGeo — dossier.css  ·  ТОЛКОВА, колкото досието добавя
   Built: 2026-07-25 (rebuild-2026-07, фаза 2)

   Зарежда се САМО от /obekti/royal-garden-3/ и САМО след site.css. Нищо тук не
   пренаписва site.css: файлът добавя запазеното пространство от имена, което
   BUILD-NOTES §4 отдели за тази фаза — `.strip*` `.ledger*` `.gap*` `.lightbox*`
   плюс две нови имена, които се добавят към инвентара: `.frame` и `.frame__link`
   (една фигура в разгънатата галерия) и `.dossier-head` (само семантична кука
   върху първата секция, без собствено правило).

   BUILD-NOTES §4 казва „напиши го в site.css, в нов § 16". Написано е ТУК,
   защото друг агент чете site.css в същия момент и два едновременни записа в
   един файл се губят. Слепването на двата файла е механично, когато потрябва:
   този файл не съдържа нито едно правило, което зависи от реда си спрямо site.css
   освен каскадата вътре в самия него.

   ЧЕТИ ПРЕДИ ДА РЕДАКТИРАШ
   1. `brand/tokens.css` е контрактът. Всичко цветно, разстояние или моушън тук
      идва през var(). Нов литерален hex НЯМА и не се добавя.
   2. Никакво `transition: all`. Анимират се само transform и opacity (плюс
      background-color и border-color, които са в речника на site.css).
   3. Никакво `hyphens: auto`, `overflow-wrap: anywhere` или `word-break`.
   4. Пренасянето е глобално, зададено ВЕДНЪЖ в site.css § 2. Не се повтаря тук.
   5. КОНТЕЙНЕРЪТ Е ЕДИНСТВЕНАТА МЯРКА. Никъде тук няма `ch` мярка върху
      обвивка. Капанът от пакет §3.10 — `max-width: 62ch` върху текстовата
      клетка на леджър реда — е избегнат конструктивно: леджър редът НЯМА
      текстова обвивка и НЯМА `<h3>` вътре. Тракът на решетката е мярката.
   6. Всеки `:hover` стои зад `(hover: hover) and (pointer: fine)`. На тъч няма
      hover, а залепналият hover рисува затворен ред точно като отворен.
      `:focus-visible`, `:focus-within` и `[open]` остават ОТВЪН — те са
      състояния, не жест. Натисканията (`:active`) с transform стоят зад
      `prefers-reduced-motion: no-preference`; цветните — не.

   ПРЕГЛЕД 2026-07-25 (REVIEW-FINDINGS): тук слязоха M12 (мишената на щрих),
   S3 (hover зад заявка), S4 (натискания), S6 (изходът на панела се вижда),
   част от S8 (стрелката: цвят и въртене на един часовник) и N12 (улеят за
   лентата за скролиране). S8 в частта „анимирана височина на разгъването" е
   ОТКАЗАН — виж мотива при `.ledger__chev` по-долу.
   ========================================================================== */

/* ==========================================================================
   § A  БИЛД НИВО — двата придружаващи токена, които тази страница добавя
   Не са бранд токени и не влизат в tokens.css. И двата са РЕСПОНСИВНИ
   СПЪТНИЦИ на съществуващ токен, не негова замяна.
   ========================================================================== */

.ledger,
.strip {
  /* Под 30rem 112px миниатюра плюс индекс плюс дата плюс брой не се събират в
     350px използваема ширина. Миниатюрата пада на 88px САМО там. Токенът
     --ledger-thumb: 112px остава непокътнат за всичко от 30rem нагоре. */
  --ledger-thumb-sm: 88px;
  /* Ширината на рейла минус индекса минус разстоянието: така колоната с датите
     на леджъра свършва ТОЧНО там, където свършва колоната с етикети на
     spec-sheet (--spec-col-min). Това е „споделеният рейл" от пакет §3.5.5. */
  --ledger-rail-date: max(var(--ledger-date-w),
                          calc(var(--spec-col-min) - var(--ledger-index-w) - var(--space-4)));
}

/* ==========================================================================
   § B  RECORD-DENSITY-STRIP · ИСТИНСКАТА ВРЕМЕВА ОС
   Само разметка. Нула изображения, нула JS за самото рисуване.
   Позицията е истината: всеки щрих стои на (дата − 25.07.2024) / 468 дни.
   Ширината е ПОСТОЯННА (--strip-tick-w). Височината е пропорционална на броя
   кадри, с под 12px и таван 56px. Припокриване е РАЗРЕШЕНО и е вярното
   изписване. Отместване НЯМА, защото отместването е лъжата.
   ========================================================================== */

.strip { display: block; }

.strip__bed {
  position: relative;
  height: var(--strip-h);          /* фиксирана — лентата не може да мести лейаута */
  background: var(--strip-bed);
  border: var(--border-hairline) solid var(--color-line);
  border-radius: var(--radius-sm);
  padding-inline: var(--space-4);
}

/* Полето за нанасяне е отместено навътре с половин щрих, за да стои щрихът при
   0% и при 100% ЦЯЛ вътре в леглото, без да му се пипа позицията. */
.strip__plot {
  position: relative;
  height: 100%;
  margin-inline: calc(var(--strip-tick-w) / 2);
  /* Полето е и КОНТЕЙНЕР ЗА ЗАПИТВАНЕ, само за да съществува единицата `cqi`.
     Тя е нужна на мишените по-долу: те трябва да се мерят в същата единица, в
     която живеят позициите — процент от полето — а `%` вътре в псевдоелемента се
     разрешава спрямо щриха от 3px, не спрямо полето. Тук няма нито едно
     запитване; `container-type` носи layout/style/inline-size ограничение, не
     paint, тоест нищо не се изрязва и абсолютно позиционираните щрихи не мърдат. */
  container-type: inline-size;
}

/* базовата линия */
.strip__plot::after {
  content: "";
  position: absolute;
  inset-inline: calc(var(--strip-tick-w) / -2);
  bottom: 0;
  border-bottom: var(--strip-axis);
}

.strip__tick {
  position: absolute;
  bottom: 0;
  left: var(--x);
  width: var(--strip-tick-w);
  height: var(--h);
  transform: translateX(-50%);
  background: var(--strip-tick-idle);
  border-radius: 1px 1px 0 0;
  transition: background-color var(--duration-fast) var(--ease);
}

/* Невидима мишена около щрих от 3px, СВИТА ДО СВОЯ ДЯЛ ОТ ОСТА.
   Плоските 44px бяха невярна мишена: дванайсет абсолютно позиционирани съседа
   без z-index означава, че по-късният в документа взима всяко припокриване, а при
   44px щрих 01 стоеше ЦЯЛ под мишената на щрих 02 — тоест най-левият знак на
   лентата отваряше чуждо посещение. Мишената вече е на щрих и генераторът я
   изписва inline редом с --x и --h:
       --hit: clamp(8px, <разстоянието до по-близкия съсед>cqi, 44px)
   ЕДИНСТВЕНИЯТ ИЗТОЧНИК НА ИСТИНАТА Е ГЕНЕРАТОРЪТ. Тук не се преповтаря нито
   едно от дванайсетте разстояния: две места с едни и същи числа са две места, на
   които числата могат да се разминат. `cqi` идва от `container-type` върху
   .strip__plot по-горе — БЕЗ него единицата пада обратно към вюпорта и
   свиването изчезва наум, без нищо да гръмне. Външният clamp тук държи плика
   8-44px каквото и да пристигне отвън.
   ОСТАТЪК, измерен: при 1360px и трите счупени двойки (01/02, 04/05, 06/07)
   отварят своето посещение. При 768px — най-тясното, на което лентата изобщо е
   интерактивна — 01 и 02 са на 2.9px един от друг, тоест под пода от 8px, и
   кликът върху 01 пада върху 02. Две посещения през два дни на ос от 468 дни са
   един знак; точно затова над тях вече стои броячът „2". Точният път е
   гръбнакът и таблицата, не мишената. */
.strip__tick::before {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 0;
  width: var(--strip-tick-hit);   /* резерва за среда без var()/cqi: старото поведение */
  width: clamp(8px, var(--hit, var(--strip-tick-hit)), var(--strip-tick-hit));
  height: var(--strip-h);
  transform: translateX(-50%);
}

@media (hover: hover) and (pointer: fine) {
  .strip__tick:hover { background: var(--strip-tick); }
}

/* Щрихът на ОТВОРЕНОТО посещение свети. Това е връзката между лентата и
   гръбнака и струва нула JS. Дванайсет правила, защото CSS няма как да
   параметризира селектор — числото е фиксирано на 12 по конструкция. */
main:has(#v-2024-07-25[open]) .strip__tick--01,
main:has(#v-2024-07-27[open]) .strip__tick--02,
main:has(#v-2024-09-07[open]) .strip__tick--03,
main:has(#v-2024-09-22[open]) .strip__tick--04,
main:has(#v-2024-09-28[open]) .strip__tick--05,
main:has(#v-2024-10-28[open]) .strip__tick--06,
main:has(#v-2024-11-03[open]) .strip__tick--07,
main:has(#v-2025-01-10[open]) .strip__tick--08,
main:has(#v-2025-05-21[open]) .strip__tick--09,
main:has(#v-2025-09-17[open]) .strip__tick--10,
main:has(#v-2025-10-15[open]) .strip__tick--11,
main:has(#v-2025-11-05[open]) .strip__tick--12 { background: var(--strip-tick); }

/* Годишната граница: къса кехлибарена линийка плюс моноширинен етикет.
   Кехлибареното НИКОГА не е текст — етикетът е в --strip-label-ink. */
.strip__year {
  position: absolute;
  inset-block: 0;
  left: var(--x);
  transform: translateX(-50%);
  pointer-events: none;
}
.strip__year i {
  position: absolute;
  bottom: 0;
  left: 50%;
  width: var(--border-hairline);
  height: 26px;
  background: var(--strip-year-rule);
}
.strip__year b {
  position: absolute;
  bottom: 30px;
  left: 50%;
  transform: translateX(-50%);
  font-size: var(--strip-label-fs);
  font-weight: var(--font-weight-body);
  color: var(--strip-label-ink);
  white-space: nowrap;
}

/* Броячът до сгъстеното петно (§3.5.7: под --strip-tick-gap щрихите се четат
   като един знак и до тях застава брояч). Посещения 01 и 02 са на 0.427% от
   оста, тоест на около 2.6px при 1360px — под прага от 3px. Позициите им
   остават непокътнати. */
.strip__cluster {
  position: absolute;
  bottom: 36px;
  left: var(--x);
  font-size: var(--strip-label-fs);
  color: var(--strip-label-ink);
  pointer-events: none;
}
.strip__cluster::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: -8px;
  width: var(--border-hairline);
  height: 6px;
  background: var(--color-line-strong);
}

.strip__ends {
  display: flex;
  justify-content: space-between;
  margin-top: var(--space-3);
  font-size: var(--strip-label-fs);
  color: var(--strip-label-ink);
}

/* Под 768px лентата е НЕИНТЕРАКТИВНА. Разчитането живее в абзаца под нея. */
@media (max-width: 47.9375rem) {
  .strip__tick { pointer-events: none; }
  .strip__bed { padding-inline: var(--space-3); }
}

/* ==========================================================================
   § C  RECORD-LEDGER · ГРЪБНАКЪТ
   ИНВАРИАНТЪТ (пакет §3.5.6, стайл гайд §8.5): свитите редове са структурно
   ЕДНАКВИ независимо от броя кадри. Една височина, ЕДНА квадратна миниатюра,
   едни и същи колони. Броят кадри е САМО число в колона с фиксирана ширина.
   Никакви мини фотоленти, никакви пропорционални запълвания.
   Посещение с 1 кадър и посещение с 20 кадъра са един и същ КЛАС СЪБИТИЕ.
   ========================================================================== */

.ledger {
  border-top: var(--ledger-rule);
  border-bottom: var(--ledger-rule);
}

/* Хедърът на колоните и всеки свит ред ползват ЕДНА И СЪЩА решетка.
   Тук се вижда, че тя не зависи от съдържанието на реда. */
.ledger__head,
.ledger__summary {
  display: grid;
  grid-template-columns:
    var(--ledger-index-w)          /* 01 до 12 */
    var(--ledger-rail-date)        /* датата — краят на споделения рейл */
    minmax(0, 1fr)                 /* интервал от предходното посещение */
    var(--ledger-count-w)          /* броят кадри, дясно подравнен */
    var(--ledger-thumb)            /* ЕДНА квадратна миниатюра */
    1.25rem;                       /* стрелка */
  column-gap: var(--space-4);
  align-items: center;
  min-height: var(--ledger-row-min-h);
  padding-inline: var(--space-4);
  /* И ДВАТА контейнера носят един и същ шрифтов размер, иначе `7ch` и `11ch`
     се разрешават срещу различен шрифт и колоните на хедъра се разминават с
     колоните на редовете. */
  font-size: var(--fs-small);
}

/* Хедърът НОСИ размера на реда, а не своя собствен: `--ledger-count-w: 7ch` и
   `--ledger-date-w: 11ch` се разрешават спрямо шрифта на РЕШЕТЪЧНИЯ КОНТЕЙНЕР.
   Ако хедърът е 12px, а редът 15px, същият токен дава 45px срещу 68px и
   колоните се разминават. Дребният размер живее върху децата. */
.ledger__head {
  padding-block: var(--space-3);
  border-bottom: var(--ledger-rule);
  /* редовете носят 2px лява линия (mark-on-hover); хедърът носи същата,
     прозрачна, за да тръгнат колоните от един и същ x */
  border-inline-start: var(--border-rule) solid transparent;
  font-size: var(--fs-small);
  color: var(--ledger-meta-ink);
}
.ledger__head > span {              /* 0,1,1 — бие .ledger__index по-надолу */
  font-size: var(--fs-micro);
  text-transform: uppercase;
  letter-spacing: var(--tracking-caps);
  color: var(--ledger-meta-ink);
}

.ledger__row {
  background: var(--ledger-bg);
  border-inline-start: var(--border-rule) solid transparent;
  transition:
    background-color var(--duration-fast) var(--ease),
    border-inline-start-color var(--duration-fast) var(--ease);
}
.ledger__row + .ledger__row,
.gap-row + .ledger__row { border-top: var(--ledger-rule); }

/* mark-on-hover — заместителят на hover-lift за система без сенки:
   фонът се сменя и отляво се появява 2px линия. Знак, който се появява.
   Hover-ът стои зад (hover: hover), защото на тъч устройство залепналият hover
   рисува ЗАТВОРЕН ред точно като ОТВОРЕН, а страницата твърди, че записът е
   еднозначен. `:focus-within` и `[open]` остават отвън: те са състояния, не жест. */
.ledger__row:focus-within,
.ledger__row[open] {
  background: var(--ledger-bg-hover);
  border-inline-start-color: var(--color-primary);
}
@media (hover: hover) and (pointer: fine) {
  .ledger__row:hover {
    background: var(--ledger-bg-hover);
    border-inline-start-color: var(--color-primary);
  }
}

.ledger__summary {
  padding-block: var(--space-2);
  cursor: pointer;
  list-style: none;
}
/* press-state: на тъч няма hover, тоест натискането е ЕДИНСТВЕНИЯТ канал, който
   казва „чух те". Редът е около 1300px широк, затова слягането е едва доловимо:
   0.995, монотонно, по бранд кривата, без отскок. */
@media (prefers-reduced-motion: no-preference) {
  .ledger__summary {
    transition: transform var(--duration-fast) var(--ease);
  }
  .ledger__summary:active { transform: scale(0.995); }
}
.ledger__summary::-webkit-details-marker { display: none; }
.ledger__summary::marker { content: ""; }

.ledger__index,
.ledger__date,
.ledger__interval,
.ledger__count { min-width: 0; font-size: var(--fs-small); }

.ledger__index { color: var(--ledger-meta-ink); }
.ledger__date  { color: var(--ledger-phase-ink); font-weight: var(--font-weight-medium); white-space: nowrap; }
.ledger__interval { color: var(--ledger-meta-ink); }
.ledger__count { text-align: end; color: var(--ledger-phase-ink); }
.ledger__head .ledger__count { text-align: end; }

/* ЕДНА миниатюра. Квадрат по --ledger-thumb-ratio, защото оригиналите са
   вертикални телефонни кадри със смесена ориентация: пейзажен изрез изхвърля
   по-голямата част от всеки кадър, а квадратът изравнява височините на
   редовете и прави „беден срещу богат ред" структурно невъзможно. */
.ledger__thumb {
  display: block;
  width: var(--ledger-thumb);
  aspect-ratio: var(--ledger-thumb-ratio);
  overflow: hidden;
  background: var(--color-surface-sunken);
  border: var(--border-hairline) solid var(--color-line);
  border-radius: var(--radius-sm);
}
.ledger__thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Клетката на хедъра ДЪРЖИ трака, но не носи квадрат: без `aspect-ratio: auto`
   празният span си остава 112px висок и вдига цялата заглавна лента. */
.ledger__head .ledger__thumb {
  border: 0;
  background: none;
  aspect-ratio: auto;
  height: 0;
}
.ledger__head .ledger__chev { visibility: hidden; }

.ledger__chev {
  justify-self: end;
  width: 0.5rem;
  height: 0.5rem;
  border-inline-end: var(--border-rule) solid var(--color-line-strong);
  border-block-end: var(--border-rule) solid var(--color-line-strong);
  transform: rotate(-45deg);
  /* цветът язди СЪЩИЯ часовник като въртенето — иначе стрелката се завърта за
     160ms, а се оцветява мигновено, тоест един жест с две скорости */
  transition:
    transform var(--duration-base) var(--ease),
    border-color var(--duration-base) var(--ease);
}
.ledger__row[open] .ledger__chev { transform: rotate(45deg); }
.ledger__row[open] .ledger__chev { border-color: var(--color-primary); }
@media (hover: hover) and (pointer: fine) {
  .ledger__row:hover .ledger__chev { border-color: var(--color-primary); }
}

/* РАЗГЪВАНЕТО ОСТАВА БЕЗ СОБСТВЕНО ДВИЖЕНИЕ — нарочно, не по недоглеждане.
   Прегледът предлага `::details-content` с block-size 0 -> auto. Отказано на две
   основания. Първо, правилото на този билд е „анимират се transform и opacity",
   а block-size не е нито едното. Второ, и по-важното: единственият кадър, който
   този сайт продава, е доказателството в панела, а всяка височинна анимация има
   състояние, в което панелът е отворен и ПРАЗЕН. Стрелката носи обратната връзка,
   и то вече с цвят и въртене на един часовник. Ако Руси иска движение тук, то се
   прави като видимо решение, не като страничен ефект от полиране. */

/* --- разгънатият панел --------------------------------------------------- */

.ledger__panel {
  padding: var(--space-2) var(--space-4) var(--space-8);
  border-top: var(--border-hairline) dashed var(--color-line);
}
.ledger__panel-head {
  margin-bottom: var(--space-5);
  font-size: var(--fs-micro);
  color: var(--ledger-meta-ink);
}
.ledger__panel-head b { color: var(--color-ink); font-weight: var(--font-weight-medium); }

/* Мрежата отговаря на БРОЯ ПО ПРАВИЛО, за да не се налага нито едно посещение
   да бъде скрито, за да изглежда мрежата подредена (пакет §3.5.6). */
.ledger__gallery { display: grid; gap: var(--space-3); align-items: start; }
.ledger__gallery--one   { grid-template-columns: 1fr; }
.ledger__gallery--two   { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* Един кадър заема ЦЕЛИЯ трак (не е сираче в трипистова мрежа) и е НАРОЧНО
   ЦЕНТРИРАН, а не залепен вляво: при 1286px колона вертикален кадър 3456x4608
   излиза 1715px висок и посещението с ЕДИН кадър започва да доминира над
   посещението с двайсет. Инвариантът важи в двете посоки. */
.ledger__gallery--one .frame__link { max-width: 40rem; margin-inline: auto; }
.ledger__gallery--mid   { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
.ledger__gallery--dense { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
.ledger__gallery > * { min-width: 0; }

/* Кадърът НЕ се изрязва. Миниатюрата в реда е квадратна, за да не се раздрусат
   височините на редовете, но тук се гледа самото доказателство и изрязването на
   доказателство е точно нещото, което този сайт отказва да прави. */
.frame { margin: 0; }
.frame__link {
  display: block;
  border: var(--border-hairline) solid var(--color-line);
  border-radius: var(--radius-sm);
  background: var(--color-surface-sunken);
  overflow: hidden;
  transition:
    border-color var(--duration-fast) var(--ease),
    transform var(--duration-fast) var(--ease);
}
.frame__link:focus-visible,
.frame__link:active { border-color: var(--color-primary); }
@media (hover: hover) and (pointer: fine) {
  .frame__link:hover { border-color: var(--color-primary); }
}
@media (prefers-reduced-motion: no-preference) {
  .frame__link:active { transform: scale(0.98); }
}
.frame__link img { width: 100%; }

/* --- под 64rem: същите колони, пренаредени на два реда ------------------- */
@media (max-width: 63.9375rem) {
  .ledger__head,
  .ledger__summary {
    grid-template-columns:
      var(--ledger-index-w)
      minmax(0, 1fr)
      var(--ledger-count-w)
      var(--ledger-thumb);
    grid-template-areas:
      "idx  date     count thumb"
      "chev interval count thumb";
    row-gap: var(--space-1);
    align-items: center;
  }
  .ledger__index    { grid-area: idx; }
  .ledger__date     { grid-area: date; }
  .ledger__interval { grid-area: interval; }
  .ledger__count    { grid-area: count; align-self: center; }
  .ledger__thumb    { grid-area: thumb; align-self: center; }
  .ledger__chev     { grid-area: chev; justify-self: start; }
  .ledger__head .ledger__interval,
  .ledger__head .ledger__chev { visibility: hidden; }
  .ledger__panel { padding-inline: var(--space-3); }
}

/* Под 30rem колоната за дата и колоната за брой не се събират една до друга:
   „25.07.2024" иска около 90px, а остават 73px. Броят слиза при интервала на
   втория ред, залепен за десния ръб на същия трак, тоест пак стои в една
   вертикала през всичките дванайсет реда и пак е моноширинен и табулярен.
   Структурата остава ЕДНАКВА за всеки ред — това е инвариантът, не броят
   колони. Алтернативата беше 12px дата, тоест по-малък текст на устройството,
   на което читателят е навън. */
@media (max-width: 29.9375rem) {
  .ledger__head,
  .ledger__summary {
    grid-template-columns:
      var(--ledger-index-w)
      minmax(0, 1fr)
      var(--ledger-thumb-sm);
    grid-template-areas:
      "idx  date thumb"
      "chev meta thumb";
    column-gap: var(--space-3);
    padding-inline: var(--space-3);
  }
  .ledger__interval { grid-area: meta; justify-self: start; }
  .ledger__count    { grid-area: meta; justify-self: end; }
  .ledger__thumb    { width: var(--ledger-thumb-sm); }
}

/* ==========================================================================
   § D  DISCLOSED-GAP · ОТСЪСТВИЕТО, ИЗПИСАНО КАТО ЗАПИС
   Всеки друг патерн рисува това, което СЪЩЕСТВУВА. Този рисува това, което
   ЛИПСВА. Сив и пунктирен, НИКОГА червен, никога икона за грешка,
   неинтерактивен и нефокусируем, отместен навътре, за да остане колоната с
   посещенията неразкъсана.
   ========================================================================== */

.gap-row {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  padding: var(--gap-pad-y) var(--space-4) var(--gap-pad-y) var(--space-16);
  border-top: var(--ledger-rule);
  background: var(--color-bg);
}
.gap-row::after {
  content: "";
  flex: 1 1 auto;
  height: 0;
  border-top: var(--border-hairline) dashed var(--gap-rule);
}
.gap-row__label {
  flex: 0 0 auto;
  font-size: var(--gap-fs);
  color: var(--gap-ink);
}
@media (max-width: 47.9375rem) {
  .gap-row { padding-left: var(--space-8); }
}

/* ==========================================================================
   § E  LIGHTBOX · пълната резолюция, ПО ЕДИН АСЕТ
   Прогресивно подобрение. Без JavaScript всеки кадър е обикновена връзка към
   своя 1600w AVIF файл. Скриптът тегли по едно изображение и изчиства `src`
   при затваряне, за да не се трупат 81 асета в паметта.
   Няма контрол „Разгъни всички" никъде на тази страница.
   ========================================================================== */

.lightbox {
  position: fixed;
  inset: 0;
  z-index: var(--z-modal);
  display: grid;
  grid-template-rows: 1fr auto;
  gap: var(--space-4);
  padding: clamp(var(--space-4), 4vw, var(--space-10));
  background: rgba(14, 23, 32, 0.94);
  opacity: 0;
  transition: opacity var(--duration-base) var(--ease);
  /* докато избледнява, панелът вече не е повърхност: инак цял екран прихваща
     кликове 160ms след като читателят го е затворил */
  pointer-events: none;
}
.lightbox[hidden] { display: none; }
.lightbox.is-open { opacity: 1; pointer-events: auto; }

.lightbox__stage {
  display: grid;
  place-items: center;
  min-height: 0;
}
.lightbox__img {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  border: var(--border-hairline) solid var(--color-line-invert);
  border-radius: var(--radius-sm);
}
.lightbox__bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
}
.lightbox__cap {
  font-family: var(--font-mono);
  font-size: var(--plate-cap-fs);
  letter-spacing: var(--tracking-mono);
  font-variant-numeric: tabular-nums;
  color: var(--plate-cap-ink);
}
.lightbox__close {
  min-height: var(--control-h);
  padding-inline: var(--control-pad-x);
  background: transparent;
  color: var(--color-surface-invert-ink);
  border: var(--border-hairline) solid var(--color-line-invert);
  border-radius: var(--control-radius);
  font-size: var(--fs-small);
  cursor: pointer;
  transition:
    background-color var(--duration-fast) var(--ease),
    transform var(--duration-fast) var(--ease);
}
.lightbox__close:active { background: rgba(255, 255, 255, 0.14); }
@media (hover: hover) and (pointer: fine) {
  .lightbox__close:hover { background: rgba(255, 255, 255, 0.08); }
}
@media (prefers-reduced-motion: no-preference) {
  .lightbox__close:active { transform: scale(0.98); }
}

/* `overflow: hidden` върху <html> маха лентата за скролиране и при класически
   ленти цялата страница подскача с около 15px точно докато панелът избледнява
   отгоре. Улеят се запазва САМО докато е заключено, тоест другаде няма разлика. */
.lightbox-lock {
  overflow: hidden;
  scrollbar-gutter: stable;
}

/* ==========================================================================
   § F  ПЕЧАТ
   Читателят разпечатва тази страница в доклад. Всичките ДВАНАЙСЕТ посещения
   излизат на хартия, защото свитият ред сам носи датата, броя и миниатюрата —
   тоест записът е пълен и без да се отваря нищо. Панелите остават затворени
   нарочно: отварянето им прави 81 фотографии печатна задача. Ако читателят е
   отворил редове преди печат, техните панели си излизат сами.
   Единствените литерални #fff и #000 във файла са ТУК. Хартията не е бранд
   повърхност и site.css § 15 вече печата по същия начин.
   ========================================================================== */

@media print {
  .strip__bed { background: #fff !important; border: 1px solid #000 !important; }
  .strip__tick { background: #000 !important; }
  .strip__year i { background: #000 !important; }
  .ledger__row,
  .ledger__head { background: #fff !important; break-inside: avoid; }
  .ledger__chev { display: none; }
  .gap-row { background: #fff !important; break-inside: avoid; }
  .lightbox { display: none !important; }
  .frame__link { border-color: #000 !important; }
  a[href^="/img/"]::after { content: ""; }
}
