/* Фотогалерея: страница после сканирования и она же превью в конструкторе.
   Файл один на обоих — сервер вкладывает его в страницу целиком
   (redirect/gallery-page.ts: политика страниц разрешает только встроенные
   стили), сайт подключает как есть.

   Строй тот же, что у бизнес-карточки и страницы соцсетей (.vc-* и .sp-* в
   style.css): цветная шапка с общим бликом, поверх неё скруглённым краем
   наезжает белый лист, на листе — фотографии, внизу — ссылка на сайт. Краски
   шапки и кнопки приходят в разметку номером заготовки VC_THEMES, в этом
   файле их нет намеренно.

   Числа без приставки — превью внутри нарисованного телефона (268 px).
   Настоящая страница (.gl-public) берёт те же числа × 1.45 — ровно как у
   соседей, где превью и страница — две копии одного дизайна. Блик — единственное
   исключение: у градиента углы и проценты от масштаба не зависят, и он
   скопирован из .vc-head::before числом в число. */
.gl-page{min-height:100%;display:flex;flex-direction:column;background:#fff;color:#16202B;font-size:12.5px;line-height:1.5;overflow-wrap:anywhere}
.gl-page *{box-sizing:border-box}
.gl-page a{color:inherit}
/* Сверху чуть больше, чем у карточки (42px): там под часами стоит кружок
   фотографии, а здесь сразу заголовок, и вплотную к островку он читался бы
   подписью к нему. */
.gl-head{position:relative;padding:50px 18px 34px;text-align:center}
.gl-head::before{content:'';position:absolute;inset:0;pointer-events:none;background:linear-gradient(128deg,rgba(255,255,255,.30) 0%,rgba(255,255,255,.09) 15%,rgba(255,255,255,0) 33%)}
.gl-head>*{position:relative}
/* Цвет и шрифт — от шапки, с двойной точностью: превью живёт внутри сайта,
   а у сайта есть общее правило для h1 (тёмная краска, свой шрифт), и без
   этого заголовок на тёмной шапке выходил тёмным. */
.gl-page .gl-title{color:inherit;font-family:inherit;font-size:22px;font-weight:700;letter-spacing:-.01em;line-height:1.2;margin:0;text-wrap:balance}
/* Серый заголовок-заглушка бывает только в превью, пока название не написано. */
.gl-page .gl-ghost{opacity:.55;font-weight:600}
.gl-page .gl-desc{color:inherit;font-size:12.5px;line-height:1.5;margin:9px 0 0;opacity:.9;white-space:pre-line}
/* Кнопка живёт в шапке, под описанием: это призыв «забронировать», а не
   ещё одна фотография, и на листе среди снимков она терялась бы. */
.gl-btn{display:inline-flex;align-items:center;justify-content:center;min-width:150px;max-width:100%;height:40px;padding:0 20px;margin-top:18px;border-radius:13px;font-size:12.5px;font-weight:700;text-decoration:none;cursor:pointer}
.gl-btn:active{opacity:.85}
/* Лист «наезжает» на шапку скруглённым краем — position обязателен: шапка
   позиционирована под блик, и без своего position лист ушёл бы под неё. */
.gl-body{position:relative;flex:1;background:#fff;border-radius:22px 22px 0 0;margin-top:-20px;padding:20px 12px 34px}
.gl-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.gl-photo{margin:0;min-width:0}
.gl-wide{grid-column:1/-1}
/* Клетка пары — вертикальная 4:5; горизонтальный снимок во всю ширину — 3:2;
   вертикальный во всю ширину (gl-tall) остаётся в своей высоте 4:5. */
.gl-image{position:relative;display:block;overflow:hidden;border-radius:12px;background:#EDF1F5;aspect-ratio:4/5;text-decoration:none}
.gl-wide .gl-image{aspect-ratio:3/2}
.gl-tall .gl-image{aspect-ratio:4/5}
.gl-image img{display:block;width:100%;height:100%;object-fit:cover}
/* Нажатие видно сразу: на телефоне у снимка нет наведения. */
.gl-image:active img{opacity:.85}
.gl-unavailable{display:none}
/* Надпись «снимок недоступен» и ссылка сайта внизу — краской листа, а не серым (решение владельца
   14.09.2026 «подписи темнее», проверка роботом). На странице после скана так было и раньше: клетка
   снимка и ссылка — <a>, и `.gl-page a{color:inherit}` перебивал серый #93A6B9 (2,5:1 к белому). В
   превью ссылка сайта — <span>, серый доставался только ей, и превью показывало не то, что увидит
   гость. */
.gl-failed{display:grid;place-items:center;padding:12px;text-align:center;color:inherit;font-size:11px}
.gl-failed img{display:none}
.gl-failed .gl-unavailable{display:block}
/* Снимок ждёт повтора после сетевой ошибки (Р-24, проверка роботом, 14.09.2026): клетка серая,
   как при загрузке, — ни значка битой картинки, ни слов, пока попытки не кончились. */
.gl-retry img{visibility:hidden}
/* Снимок в очереди (Р-25): адрес в data-src ставит скрипт, когда загрузится первая строка. Пустая
   картинка не видна и без скрипта не заслоняет запасную из <noscript>. */
.gl-image img[data-src]:not([src]){display:none}
/* Подсказка на пустом листе — только в превью: она обращена к тому, кто
   страницу собирает, а на настоящей странице фотографии есть всегда. */
.gl-empty{font-size:12px;line-height:1.5;color:#93A6B9;text-align:center;padding:24px 12px}
.gl-site{margin-top:20px;text-align:center}
.gl-site-link{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:inherit;text-decoration:none}
.gl-site-link svg{width:14px;height:14px;flex-shrink:0}
.gl-page a:focus-visible,.gl-page button:focus-visible{outline:3px solid #2F6FED;outline-offset:3px}

/* Просмотр снимка: тёмный экран поверх всего, счётчик, стрелки по краям
   фотографии, крестик. Подписи здесь нет — их нет и на странице.
   Горизонтальный жест здесь — только листание снимков (Р-36, проверка роботом,
   14.09.2026): Chrome с сенсором уводил свайп вправо под «назад по истории».
   Держит это touch-action — браузеру остаются вертикаль и увеличение двумя
   пальцами, а горизонталь достаётся листанию (без него Chrome уводит назад, что
   бы ни стояло в overscroll-behavior). overscroll-behavior не пускает перехлёст
   прокрутки к странице; у самой страницы на время просмотра запрет ставит
   скрипт (attach в gallery-view.js) — для жеста трекпада. */
.gl-viewer{position:fixed;inset:0;margin:0;width:100%;height:100dvh;max-width:none;max-height:none;border:0;padding:16px clamp(12px,3vw,40px);background:#121614fa;color:#fff;overflow:hidden;overscroll-behavior:contain;touch-action:pan-y pinch-zoom;font:14px/1.5 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif}
.gl-viewer::backdrop{background:#121614}
.gl-viewer[open]{display:flex;flex-direction:column}
.gl-viewer-bar{display:flex;align-items:center;justify-content:space-between;flex:none;gap:20px}
.gl-counter{font-size:13px;color:#d2d9d3;font-variant-numeric:tabular-nums}
.gl-viewer button{display:grid;place-items:center;flex-shrink:0;border:1px solid #ffffff40;border-radius:50%;background:#ffffff0b;color:#fff;width:44px;height:44px;cursor:pointer;padding:0}
.gl-viewer button svg{width:20px;height:20px}
.gl-viewer button:focus-visible{outline-color:#fff}
.gl-viewer button:disabled{opacity:.25;cursor:default}
.gl-viewer-stage{position:relative;flex:1;min-height:0;display:flex;align-items:center;padding:14px 0}
.gl-viewer-stage>button{position:absolute;top:50%;transform:translateY(-50%);z-index:1;background:#121614b3}
.gl-viewer-stage>[data-gl-prev]{left:0}
.gl-viewer-stage>[data-gl-prev] svg{transform:rotate(180deg)}
.gl-viewer-stage>[data-gl-next]{right:0}
.gl-full{display:block;width:100%;height:100%;object-fit:contain}
@media(max-width:540px){
  .gl-viewer{padding-top:max(12px,env(safe-area-inset-top));padding-bottom:max(12px,env(safe-area-inset-bottom))}
  /* 44px и на телефоне: стрелки и крестик у самого края снимка, и в 38px в них
     не попадали пальцем (проверка 13.09.2026). */
  .gl-viewer button{width:44px;height:44px}
}

/* ============ НАСТОЯЩАЯ СТРАНИЦА ============
   На телефоне занимает экран целиком, на настольном встаёт колонкой посередине
   со скруглёнными углами и тенью, как карточка и соцсети. Колонка шире их
   430 px: фотографиям нужно место, в узкой колонке они стали бы мелкими. */
.gl-public{margin:0;min-height:100vh;min-height:100dvh;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;background:#EEF1F5;color:#16202B;display:flex;justify-content:center;-webkit-text-size-adjust:100%}
.gl-public>.gl-page{width:100%;max-width:600px;min-height:100vh;min-height:100dvh;font-size:18px}
@media(min-width:520px){
  .gl-public{padding:28px 20px}
  .gl-public>.gl-page{min-height:0;border-radius:26px;overflow:hidden;box-shadow:0 18px 50px rgba(15,30,46,.16)}
}
.gl-public .gl-head{padding:72px 26px 49px}
.gl-public .gl-title{font-size:32px}
.gl-public .gl-desc{font-size:18px;margin-top:13px}
.gl-public .gl-btn{min-width:218px;height:58px;padding:0 29px;margin-top:26px;border-radius:19px;font-size:18px}
.gl-public .gl-body{border-radius:32px 32px 0 0;margin-top:-29px;padding:29px 17px 49px}
.gl-public .gl-grid{gap:12px}
.gl-public .gl-image{border-radius:17px}
.gl-public .gl-failed{font-size:15px;padding:17px}
.gl-public .gl-site{margin-top:29px}
/* Место под палец (Р-35, проверка роботом, 14.09.2026): строка ссылки — 22,5 точки при норме не
   меньше 24. Поля растят саму ссылку до 32,5, отрицательные поля отдают строке прежнюю высоту —
   подвал галереи и буквы стоят там же, где стояли. */
.gl-public .gl-site-link{font-size:15px;gap:8px;padding:5px 0;margin:-5px 0}
.gl-public .gl-site-link svg{width:20px;height:20px}

/* ─────────────────────────────────────────── подпись сервиса внизу листа
   «Made with QRPlace» — на бесплатном тарифе (решение владельца 30.09.2026;
   разметка приходит готовой строкой: server/src/redirect/made-with.ts на
   странице, `madeWithHtml` в site/app.js в превью). Файл один на превью и на
   страницу, поэтому здесь оба размера: сначала превью, потом страничные под
   `.gl-public` — как у всего остального в этом файле. Цвет тот же, что у
   соседних страниц: 5,5:1 к белому листу. */
.gl-body .qp-made{
  display:flex;align-items:center;justify-content:center;gap:4px;
  padding:15px 0 0;font-size:9px;line-height:1;color:#5B6B7C;text-decoration:none;
}
.gl-body .qp-made svg{width:10px;height:10px;flex:none}
.gl-page.qp-signed .gl-body{padding-bottom:12px}
.gl-public .gl-body .qp-made{gap:6px;padding:22px 0 0;font-size:13px}
.gl-public .gl-body .qp-made svg{width:15px;height:15px}
.gl-public .gl-page.qp-signed .gl-body{padding-bottom:18px}
.gl-public .gl-body .qp-made:active{opacity:.6}
