/* Карта и выход из приключения (аудит 08.11, группа «Главный цикл»): заставка до первой карты, размытая заглушка
   острова, пока грузится картинка, «загружается» на коснувшейся карточке, уведомление карты не ловит касаний,
   кнопка «на карту» в углу приключения, щипок-масштаб — только в зоне для взрослых. Подключается после styles.css. */

/* размытая копия острова 36×24 (≈450 байт) — сразу, без запроса: пока грузится art/map-*.webp, ребёнок видит остров,
   а не бежевый прямоугольник. Тот же рисунок — фоном заставки */
:root { --island-blur: url("data:image/webp;base64,UklGRrgBAABXRUJQVlA4IKwBAADwCQCdASokABgAPtFWpEwoJKOiKqwBABoJbACdMsu6b6xnTbxvn/77NvNb5NMbLTEwJUD3ODwIOdNLKpZp2QXjkllvfSiWCM78L4I9WRicM70Geb+VDooAAP7tYA2ny2+55LLIxhBjI4sNg4Fsu/UK+LAG6lUmxcm/NHTA8diuKDem1KIz2Rg8aZMpcn546k161i0thjg58EIBhBwoRELwVADXS6KoXokChJy4OytuI0FPgjVrWJGRnIbMbvp3HihIkRv3JHJYtrVJ/gE3OcGJMVx9YAeiBEEg2Ko3wr8USRgfBWZLM5EC7sSNpUSYMGpDT8tYMqrFHIp/uB9cx60bTXiLIJIu+sUioDWGG0tdNF8YMgxkx6Px1StLLWV8drQyKYYCCrNLsEGti4ahNmlKhaYuB1wzdSB7ek6/3lm5ZYxFut8OgH6ZSRRgCV1Sx6HNOl7W1UIoIl142z9WEWS73lK3P5Mp8kBe7UFTFj4Hz1UM3yYMdZ/mylxE4hthG+OKMsNgk2h9Y6kGpyCiPmpwRfUtFsN/P1u6nmaVYa8u0/H0ZaXC6rdC2AAAAA=="); }
.island::before { content: ""; position: absolute; inset: -12px; background: var(--island-blur) center / cover no-repeat;
  filter: blur(10px); pointer-events: none; }

/* заставка в index.html (#app до первой карты): остров проступает из размытия, без надписей и цифр */
.boot { min-height: 100%; display: grid; place-items: center; padding: max(24px, env(safe-area-inset-top)) 24px 24px; }
.boot-island { position: relative; width: min(86vw, 720px); aspect-ratio: 3 / 2; overflow: hidden; border: 2px solid var(--c-ink, #22304a); }
.boot-island::before { content: ""; position: absolute; inset: -12px; background: var(--island-blur) center / cover no-repeat; filter: blur(10px);
  animation: boot-breathe 2.4s ease-in-out infinite alternate; }
@keyframes boot-breathe { from { opacity: .7; } to { opacity: 1; } }

/* карточка дня или плитка, которой коснулись, пока пак в пути: тихо «дышит» (без крутилки и процентов) */
.today.is-loading, .adv.is-loading { animation: tap-wait 1.1s ease-in-out infinite alternate; }
@keyframes tap-wait { from { filter: brightness(1); } to { filter: brightness(.86); } }

/* уведомление карты липнет к низу экрана поверх плиток (parent.css): касание проходит к плитке под ним, само оно
   уходит от касания карты и через несколько секунд после реплики (main.js hideNotice) */
.map-notice { pointer-events: none; }

/* ---------- «на карту» в приключении: домик в левом верхнем углу, удержание 0,8 с (main.js HOME_HOLD_MS) ---------- */
.play-home { position: fixed; z-index: 5; left: max(8px, env(safe-area-inset-left)); top: max(8px, env(safe-area-inset-top));
  width: 56px; height: 56px; padding: 0; display: grid; place-items: center; border: 2px solid var(--c-ink); border-radius: 50%;
  background: rgba(255, 250, 240, .92); color: var(--c-ink); box-shadow: 0 3px 0 rgba(34, 48, 74, .35);
  touch-action: none; -webkit-touch-callout: none; }
.play-home > svg { width: 30px; height: 30px; grid-area: 1 / 1; }
.play-home.is-holding { transform: translateY(2px); box-shadow: 0 1px 0 rgba(34, 48, 74, .35); }
/* кольцо удержания: stroke-dashoffset за 0,8 с (длина окружности r = 27 — 169,7). Правило сильнее общего «без
   переходов» при «Уменьшить движение» (styles.css): это не движение, а ход удержания — без него кольцо сразу полное */
.play-home > .play-home-ring { position: absolute; inset: -6px; width: calc(100% + 12px); height: calc(100% + 12px);
  transform: rotate(-90deg); pointer-events: none; overflow: visible; }
.play-home-ring circle { fill: none; stroke: var(--c-pyh); stroke-width: 5; stroke-linecap: round;
  stroke-dasharray: 169.7; stroke-dashoffset: 169.7; opacity: 0; }
.play-home.is-holding > .play-home-ring circle { stroke-dashoffset: 0; opacity: 1; transition: stroke-dashoffset .8s linear !important; }
/* облачко не уходит под домик: где по бокам облачка места мало (книжный экран, узкий альбом), сцена начинается ниже */
@media (max-width: 999px) and (min-height: 621px), (orientation: portrait) {
  .play.has-home > .stage { --pad-t: calc(max(16px, env(safe-area-inset-top)) + 64px); }
}
/* низкий альбом (телефон боком): облачко — в левой колонке сверху, домик — на его углу. Облачко не опускаем и не
   укорачиваем (длинная реплика не обрезается): текст обтекает домик — в облачке пустой «уголок» его размера (float),
   сдвинуты только имя героя и первая строка. Облачко — блок, а не сетка: иначе текст не обтекал бы уголок */
@media (orientation: landscape) and (max-height: 620px) {
  .play-home { width: 48px; height: 48px; left: max(6px, env(safe-area-inset-left)); top: max(6px, env(safe-area-inset-top)); }
  .play-home > svg { width: 26px; height: 26px; }
  .play.has-home > .stage.has-cast > .bubble { display: block; }
  .play.has-home > .stage.has-cast > .bubble > .bubble-who, .play.has-home > .stage.has-cast > .bubble > .bubble-text { display: block; }
  .play.has-home > .stage.has-cast > .bubble > .bubble-text { margin-top: 2px; }
  /* уголок: от края облачка (поля 2 + 14 px, сверху 2 + 10 px) до домика (48 px от max(6px, safe-area)) и ещё 6 px */
  .play.has-home > .stage.has-cast > .bubble > .bubble-who::before { content: ""; float: left;
    width: max(0px, calc(max(6px, env(safe-area-inset-left)) + 54px - var(--pad-l) - 16px));
    height: max(0px, calc(max(6px, env(safe-area-inset-top)) + 54px - var(--pad-t) - 12px)); }
}

/* зона «скоро» в списке под картой — кнопка (касание — Пых голосом говорит, что сюда пойдём позже) */
button.zone-soon { min-height: 44px; padding: 0 14px; border: 2px dashed var(--c-ink); background: none; }

/* щипок-масштаб: на детских экранах выключен (пальцы ребёнка, перетаскивание), в зоне для взрослых и в документах —
   работает (index.html больше не запрещает масштаб целиком) */
.map, .play, .album, .story { touch-action: pan-x pan-y; }

@media (prefers-reduced-motion: reduce) {
  .boot-island::before, .today.is-loading, .adv.is-loading { animation: none; }
}

/* трещинки яйца на карточке «Приключение дня» (main.js todayHero → .egg-pic): svg трещинок (grow.css: absolute,
   inset 0) встаёт по картинке яйца, а не по всей карточке — без своей опоры они растягивались на всю кнопку и
   залезали на название приключения (проверка 08.11, новичок с 1–2 чешуйками) */
.today-hero .egg-pic { position: relative; display: inline-block; line-height: 0; }

/* короткое касание домика: на карту — удержанием. Кольцо пробегает четверть круга и гаснет, домик покачивается —
   ребёнок видит, что домик «слышит» палец и его надо подержать (проверка 08.11: три коротких касания — ничего) */
.play-home.is-hint { animation: home-hint .5s ease-in-out 2; }
.play-home.is-hint > .play-home-ring circle { opacity: 1; stroke-dashoffset: 127; transition: stroke-dashoffset .35s ease-out !important; }
@keyframes home-hint { 0%, 100% { transform: rotate(0); } 30% { transform: rotate(-10deg); } 70% { transform: rotate(8deg); } }
@media (prefers-reduced-motion: reduce) { .play-home.is-hint { animation: none; } }
:root[data-motion="off"] .play-home.is-hint { animation: none; }

/* плитки, которые ждут открытия: цифра темнее и без прозрачности — взрослый, помогающий найти плитку, её различает
   (контраст был 2,97:1 при 30 px жирном, нужно 3); пунктир и прозрачный фон остаются знаком «ещё закрыто» */
.adv.is-waiting { opacity: 1; color: #59616f; border-color: #a3a9b4; }
