/* Добавить своё на карту (map.md 29, владелец 21.09.2026). Цвета — только
   роли из tokens.css (frontend.md 1); формы берут поля и кнопки барахолки
   (.m-field, .m-inp, .m-cp, .m-btn) — второго набора полей не заводим. */

/* ---- «Что добавляем?» ---- */
.add-sheet{position:fixed;inset:0;z-index:var(--z-modal)}
.add-sheet .as-back{position:absolute;inset:0;background:rgba(0,0,0,.35)}
.add-sheet .as-panel{position:absolute;left:0;right:0;bottom:0;background:var(--surface);
  border-radius:16px 16px 0 0;padding:14px var(--gut) calc(14px + env(safe-area-inset-bottom));
  display:flex;flex-direction:column;gap:4px;box-shadow:0 -8px 24px rgba(0,0,0,.18)}
.add-sheet .as-h{font-size:15px;font-weight:700;color:var(--ink);margin:2px 0 8px}
.add-sheet .as-row{display:flex;align-items:center;gap:12px;min-height:52px;padding:0 12px;
  border:0;border-radius:var(--radius-sm);background:var(--surface-2);color:var(--ink);
  font:inherit;font-size:15px;font-weight:600;text-align:left;cursor:pointer}
.add-sheet .as-row .e{font-size:22px;width:28px;text-align:center}

/* ---- форма места: экран приложения поверх карты ---- */
.place-form{position:fixed;inset:0;z-index:var(--z-mode);background:var(--surface);
  display:flex;flex-direction:column}
.place-form[hidden]{display:none}
.pf-top{flex:0 0 auto;display:flex;align-items:center;gap:10px;padding:12px var(--gut) 10px;
  border-bottom:1px solid var(--line)}
.pf-title{font-size:16px;font-weight:700;color:var(--ink)}
.pf-body{flex:1 1 auto;overflow-y:auto;padding:4px var(--gut) 16px;display:flex;flex-direction:column}
.pf-body > *{flex:0 0 auto}                   /* frontend.md 20б */
.pf-foot{flex:0 0 auto;padding:10px var(--gut) calc(12px + env(safe-area-inset-bottom));
  border-top:1px solid var(--line)}
.pf-point{display:block}
.pf-point.set{border-color:var(--ok);color:var(--ink)}
.pf-ok{color:var(--ink-2)}
.pf-link{margin-top:10px}
.m-cp.kid{font-size:13px;padding:6px 10px}

/* ---- экран «поставьте точку» ----
   Форма уходит, чат прячется, карта во весь экран; перекрестие — ровно по
   центру карты, её двигают под ним. Всё, что на карте нажимается, кроме
   зума и «где я», уходит: точку ставят, а не выбирают места. */
.pick-cross,.pick-bar{display:none}
body.pick-mode .chat{display:none}
body.pick-mode .place-form{display:none}
/* Форму открывают и из «Моих мест» / «Моих событий» — эти экраны тоже
   уходят, иначе они накрывали бы карту и маркер (все на --z-mode). */
body.pick-mode .my-places{display:none}
body.pick-mode .market-fab,
body.pick-mode .layers,
body.pick-mode #card-slot{display:none}
/* Метки при этом ВИДНЫ — по ним находят свою площадку, — но не нажимаются
   (проверка этапа 3 афиши, 22.09.2026; AF-74, PA-28). Тап по баннеру события
   или значку места открывал карточку, которую этот экран прячет
   (`#card-slot` выше, `.ev-page` в afisha.css): «‹ Назад» уходил в невидимый
   слой, а после «Готово» вместо формы во весь экран вставала карточка.
   Касание метки теперь уходит карте, как касание пустого места. Узел метки у
   движков свой: у MapLibre — сам маркер, у Leaflet — его обёртка. */
body.pick-mode .maplibregl-marker,
body.pick-mode .leaflet-marker-icon{pointer-events:none}
body.pick-mode .pick-cross{display:block;position:absolute;left:50%;top:50%;z-index:calc(var(--z-map) + 2);
  width:0;height:0;pointer-events:none}
/* Маркер рисуется стилями, а не эмодзи: у эмодзи 📍 остриё в каждом шрифте
   своё, и в WebKit оно промахивалось мимо центра на 20 px — прицел врал.
   Кружок на ножке, конец ножки — ровно центр карты (точка ::after). */
body.pick-mode .pick-cross i{position:absolute;left:-13px;top:-44px;width:26px;height:26px;
  border-radius:50%;background:var(--accent);box-shadow:0 0 0 3px var(--surface),0 4px 8px rgba(0,0,0,.3)}
body.pick-mode .pick-cross i::after{content:"";position:absolute;left:12px;top:26px;width:2px;height:18px;
  background:var(--ink)}
body.pick-mode .pick-cross::after{content:"";position:absolute;left:-4px;top:-4px;width:8px;height:8px;
  border-radius:50%;background:var(--ink);box-shadow:0 0 0 2px var(--surface)}
body.pick-mode .pick-bar{display:flex;flex-direction:column;gap:10px;position:absolute;left:0;right:0;bottom:0;
  z-index:calc(var(--z-map) + 3);background:var(--surface);border-radius:16px 16px 0 0;
  padding:12px var(--gut) calc(12px + env(safe-area-inset-bottom));box-shadow:0 -8px 24px rgba(0,0,0,.18)}
.pick-hint{font-size:14px;color:var(--ink-2);text-align:center}
.pick-acts{display:flex;gap:8px}
.pick-acts .m-btn{flex:1 1 0}

/* Точка места в очереди модерации — ссылкой-ярлыком (открывает Google Maps). */
.m-taglink{border:0;font:inherit;font-size:12px;cursor:pointer;color:var(--accent-ink);font-weight:700}

/* ---- «Мои места» — экран приложения, как «Мои объявления» ---- */
.my-places{position:fixed;inset:0;z-index:var(--z-mode);background:var(--paper);
  display:flex;flex-direction:column}
.my-places[hidden]{display:none}
.my-places .pf-top{background:var(--paper);border-bottom:0}
.mp-body{flex:1 1 auto;overflow-y:auto;padding-bottom:12px}
.mp-empty{flex:1 1 auto;padding:24px var(--gut);color:var(--ink-2);font-size:14px;text-align:center}
.my-places .pf-foot{background:var(--paper);border-top:0}
.m-sech .dot.off{background:var(--ink-3)}

/* ---- меню «Моё»: общая кнопка «＋ Добавить» внизу (вариант C) ---- */
.mcta{display:block;width:100%;height:46px;margin-top:6px;border:0;border-radius:var(--radius-sm);
  background:var(--accent);color:var(--on-accent);font:inherit;font-size:15px;font-weight:700;cursor:pointer}
.pf-openlink{margin-top:8px;align-self:flex-start;padding:6px 10px;border-radius:999px;background:var(--sunk)}
.pf-openlink[hidden]{display:none}


/* ВИДИМАЯ ОБЛАСТЬ СНИМКА (владелец 26.09.2026). Лист поверх формы правки: тот
   же кадр, что в карточке, и снимок в нём двигают пальцем. Ступень выше
   формы — иначе форма накрыла бы его собой (frontend.md 11). */
.pf-crop{position:fixed;inset:0;z-index:calc(var(--z-modal) + 2);
  background:var(--scrim);display:flex;align-items:flex-end}
.pf-crop[hidden]{display:none}
.pf-crop .cr-box{width:100%;background:var(--surface);
  border-radius:16px 16px 0 0;padding:14px var(--gut) calc(14px + env(safe-area-inset-bottom));
  display:flex;flex-direction:column;gap:10px}
.pf-crop .cr-head{font-size:16px;font-weight:700;color:var(--ink)}
/* Кадр — ровно та рамка, что будет в карточке. Высота ОТСТУПОМ в процентах, а
   не числом от JS: лист открывается скрытым, и замер ширины в этот момент даёт
   ноль — рамка получалась нулевой высоты (поймано на стенде 26.09.2026).
   Долю ставит JS одной переменной, считая её из общей `map.GAL_SHARE`. */
.pf-crop .cr-frame{position:relative;width:100%;padding-bottom:var(--cr-ratio,88%);
  overflow:hidden;border-radius:12px;background:var(--sunk)}
.pf-crop .cr-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  display:block;touch-action:none;cursor:grab;user-select:none;-webkit-user-drag:none}
.pf-crop .cr-hint{font-size:12.5px;color:var(--ink-3)}
.pf-crop .cr-acts{display:flex;gap:8px}
.pf-crop .cr-ok{flex:1 1 auto;min-height:44px;border:0;border-radius:999px;
  background:var(--accent);color:var(--on-accent);font-size:15px;font-weight:700}
.pf-crop .cr-no{flex:0 0 auto;min-height:44px;border:0;background:none;
  color:var(--ink-3);font-size:14px;font-weight:600;padding:0 14px}


/* ---- «⭐ Сохранённые места»: плитки (владелец 26.09.2026, вариант В) ----
   Сетка, а не строки: у места есть снимок, и список без него читается как
   реестр. Две колонки и рамка 4:5 — та же форма, что у афиши и у сетки
   барахолки (market.md 35), чтобы «моё» во всех разделах выглядело одинаково. */
.sv-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;
  padding:10px var(--gut) 0}
.sv-tile{display:flex;flex-direction:column;gap:5px;text-align:left;min-width:0}
.sv-fr{position:relative;display:block;width:100%;padding-bottom:125%;
  border-radius:var(--radius);overflow:hidden;background:var(--poster-mat)}
.sv-fr img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
/* Нет снимка — эмодзи рубрики на её тоне: ноль байт сети (market.md 5). */
/* Тон МЯГКИЙ (`--l-<корень>-soft`), а не сам цвет слоя: полная насыщенность
   на весь кадр 4:5 — это пятно, а не подложка. Те же роли, что у миниатюр
   «Моего» и у товара без фото. */
.sv-em{position:absolute;inset:0;display:grid;place-items:center;font-size:34px;
  background:var(--c)}
.sv-t{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  font-size:13.5px;font-weight:700;line-height:1.25;color:var(--ink)}
.sv-b{display:flex;align-items:center;gap:6px;min-width:0}
.sv-rate{flex:0 0 auto;display:inline-flex;align-items:center;gap:2px;
  font-size:12px;font-weight:800;color:var(--ink)}
.sv-rate i{font-style:normal;color:var(--rate-star)}
.sv-d{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:12px;color:var(--ink-3)}
.mp-wait{padding:18px var(--gut);color:var(--ink-3);font-size:14px}
/* «На карте» в шапке — вторая дверь в режим «⭐», та же, что чип на полосе. */
#my-saved .pf-top .m-btn.ghost{margin-left:auto;flex:0 0 auto;height:34px;padding:0 12px;
  border-radius:999px;background:var(--surface-2);color:var(--accent-ink);
  font-size:13px;font-weight:700}


/* Два поля в строку — чек и часы (27.09.2026). Короткие значения, и каждому
   своя строка стоила бы формы вдвое длиннее. На узком экране переносятся. */
.m-row2{display:flex;gap:10px;flex-wrap:wrap}
.m-row2 .m-half{flex:1 1 140px;min-width:0}


/* ---- плитка «снимок едет» (владелец 27.09.2026) ----
   Человек нажал «Фото», выбрал кадры в галерее — и до этого дня форма не
   менялась ничем: замер прода, 0,52–0,63 с на кадр, четыре кадра — две с
   половиной секунды тишины. Теперь на каждый выбранный файл сразу встаёт
   плитка с САМИМ кадром (`objectURL`), затемнённая и с бегущей полосой;
   доехавшая гаснет. Видно и что идёт, и сколько осталось (frontend.md 5). */
.m-pt.waiting{position:relative;overflow:hidden}
.m-pt.waiting::after{content:"";position:absolute;inset:0;background:rgba(16,36,48,.55)}
.m-pt.waiting .pt-wait{position:absolute;left:0;right:0;bottom:0;height:3px;z-index:1;
  background:var(--line);overflow:hidden}
.m-pt.waiting .pt-wait::before{content:"";position:absolute;top:0;bottom:0;width:40%;
  background:var(--accent);animation:pt-run 1.1s linear infinite}
@keyframes pt-run{from{left:-40%}to{left:100%}}
/* Доехала — затемнение уходит, полоса тоже: плитка становится обычным
   снимком ещё до того, как список перерисуется ответом сервера. */
.m-pt.waiting.ready::after{background:rgba(16,36,48,.12)}
.m-pt.waiting.ready .pt-wait{display:none}
@media (prefers-reduced-motion:reduce){
  .m-pt.waiting .pt-wait::before{animation:none;width:100%;opacity:.6}
}

/* Не доехал — плитка краснеет и остаётся до уборки списка: человек должен
   видеть, КОТОРЫЙ из выбранных снимков не взяли (прод 27.09.2026). */
.m-pt.waiting.failed::after{background:rgba(194,68,94,.55)}
.m-pt.waiting.failed .pt-wait{display:none}
/* И остаётся ПОСЛЕ уборки — плиткой «↻ Повторить» во всю площадь (29.09.2026:
   неудавшаяся загрузка исчезала вместе с ждущими плитками и читалась как
   «картинка пропала»). Кнопка — вся плитка: 74 px, палец не ищет угол. */
.m-pt .pt-retry{position:absolute;inset:0;z-index:1;border:0;background:transparent;
  color:#fff;font:inherit;font-size:12px;font-weight:700;line-height:1.2;padding:4px;
  cursor:pointer;-webkit-tap-highlight-color:transparent;text-shadow:0 1px 2px rgba(0,0,0,.6)}
