/* ============================================================
   УСТАНОВКА НА ДОМАШНИЙ ЭКРАН: плашка в лобби и шторка (src/pwa/index.js).

   Плашка — В ПОТОКЕ лобби, под главной кнопкой, и в стиле соседей по колонке
   (`.csCard`, `.qsStrip`): поля 18px, радиус 18px. Плавающим элементом она быть
   не может — приглашение, которое перекрывает лобби, читается как реклама, а
   не как подсказка.

   Тона были намеренно спокойнее, чем у соседей, — и это оказалось ошибкой.
   Проверено на живом телефоне: плашка была НА ЭКРАНЕ (629–691 px при высоте
   915), не за сгибом и не под навигацией, и всё равно прошла мимо. Тихая
   стеклянная строка среди тихих стеклянных карточек не читается как
   предложение — её принимают за ещё один блок лобби.

   Поэтому золото и пульс: тот же язык, что у кнопки пари (`#propsBtn.hot`) и
   строки задач (`.qsStrip.alert`), где золото означает «это к тебе, и сейчас».
   Свечение ДЫШИТ, а не мигает, и бесконечно — по той же причине, по которой
   бесконечен пульс у пари: взгляд доходит до плашки не в первую секунду, а
   пульс, кончившийся до этого, не помог бы никому. Останавливает его сам
   человек — крестиком или тапом.

   В тихом режиме (prefers-reduced-motion) пульс снимается, а ЗОЛОТО ОСТАЁТСЯ:
   правило то же, что у часов стола в base.css — сообщение не имеет права
   зависеть от того, терпит человек анимацию или нет.

   Шторка — та же геометрия, что у панели задач (styles/quests.css): выезжает
   снизу, лежит выше нижней навигации (z 50) и ниже тоста (z 100). Второй
   раскладки у неё нет: приглашение живёт только на телефоне.

   Цвета и радиусы — только из токенов (/shared/styles/tokens.css).
   ============================================================ */

/* ---- плашка (#pwaStrip) --------------------------------------------------- */
/* Место в потоке занимает только показанная плашка: пока приглашения нет,
   контейнер не существует для раскладки вовсе (как `.clubStrip:empty`). */
.pwaStrip{display:none;align-items:center;gap:11px;margin:11px 18px 0;padding:12px 13px;
  border-radius:18px;cursor:pointer;
  border:1px solid rgba(255,194,75,.34);
  background:linear-gradient(120deg,rgba(255,194,75,.08),rgba(255,255,255,.02) 72%);
  transition:background .2s ease}
.pwaStrip.on{display:flex;animation:pwaBreathe 1.8s ease-in-out infinite}
.pwaStrip:active{background:rgba(255,194,75,.14)}

/* Дышит рамка и её свечение — не прозрачность: мигание «включено-выключено»
   заставляет перечитывать строку заново на каждом цикле. Такт тот же, что у
   `propPulse` в lobby.css (1.8s), а вот АМПЛИТУДА вдвое меньше: у пари пульс
   зовёт успеть до конца улицы, здесь — всего лишь предложение, и на полной
   яркости оно читалось как реклама. Верхняя точка выставлена по
   `.qsStrip.alert` (rgba(255,194,75,.4)) — это уже согласованный в проекте
   уровень «обрати внимание» для строки В ПОТОКЕ лобби. */
@keyframes pwaBreathe{
  0%,100%{box-shadow:0 0 0 rgba(255,194,75,0);border-color:rgba(255,194,75,.28)}
  50%{box-shadow:0 0 11px rgba(255,194,75,.2);border-color:rgba(255,194,75,.5)}
}

@media (prefers-reduced-motion:reduce){
  /* Пульс снимается, золото остаётся — см. баннер файла. */
  .pwaStrip.on{animation:none;box-shadow:0 0 9px rgba(255,194,75,.16)}
}

.pwsIc{flex:none;width:34px;height:34px;border-radius:11px;
  display:flex;align-items:center;justify-content:center;
  font-size:18px;color:var(--gold);
  background:rgba(255,194,75,.1);border:1px solid rgba(255,194,75,.2)}

.pwsTx{flex:1;min-width:0}
.pwsTx b{display:block;font-size:13.5px;font-weight:700;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pwsTx small{display:block;font-size:11px;color:var(--muted);margin-top:2px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.pwsAr{flex:none;font-size:16px;color:rgba(255,194,75,.7)}

/* Крестик — отдельная цель внутри тапабельной строки, поэтому он ощутимо
   больше своей иконки: попасть в него надо с первого раза, иначе отказ
   превращается в открытие шторки. */
.pwsX{flex:none;width:30px;height:30px;margin:-4px -3px -4px 0;border:0;border-radius:10px;
  display:flex;align-items:center;justify-content:center;
  background:transparent;color:var(--dim);cursor:pointer}
.pwsX i{font-size:16px}
.pwsX:active{background:rgba(255,255,255,.07)}

/* ---- шторка (#pwaSheet) -------------------------------------------------- */
.pwaScrim{position:absolute;inset:0;z-index:65;opacity:0;pointer-events:none;
  background:rgba(6,4,14,.5);backdrop-filter:blur(1.5px);transition:opacity .22s ease}
.pwaScrim.on{opacity:1;pointer-events:auto}

.pwaSheet{position:absolute;z-index:70;left:0;right:0;bottom:0;
  display:flex;flex-direction:column;max-height:86dvh;
  border-radius:20px 20px 0 0;
  background:linear-gradient(180deg,#120e26,#0b0818);
  border:1px solid var(--lg-brd);box-shadow:0 -18px 48px rgba(0,0,0,.5);
  visibility:hidden;transform:translateY(101%);
  transition:transform .26s var(--ease-glass),visibility .26s}
.pwaSheet.on{visibility:visible;transform:none}
/* Ручка: край шторки без неё читается как обрезанная страница (то же правило,
   что у панели задач). */
.pwaSheet::before{content:"";position:absolute;top:7px;left:50%;transform:translateX(-50%);
  width:38px;height:4px;border-radius:999px;background:rgba(255,255,255,.18)}

.pwHead{flex:none;display:flex;align-items:center;gap:10px;padding:18px 16px 8px}
.pwHead>b{flex:1;display:flex;align-items:center;gap:8px;
  font-family:'Unbounded','Rajdhani',var(--font);font-weight:800;font-size:18px}
.pwHead>b i{font-size:19px;color:var(--p1)}
.pwClose{flex:none;width:32px;height:32px;border-radius:11px;
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  border:1px solid var(--bord);background:var(--glass);color:var(--muted)}
.pwClose i{font-size:18px}
.pwClose:active{transform:scale(.94)}

.pwBody{flex:1;min-height:0;overflow-y:auto;padding:0 16px}
.pwLead{margin:0 0 14px;font-size:13.5px;line-height:1.55;color:var(--muted)}

.pwList{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
.pwRow{display:flex;align-items:center;gap:11px;padding:11px 12px;
  border-radius:14px;border:1px solid var(--bord);background:var(--card)}
.pwRowIc{flex:none;width:30px;height:30px;border-radius:10px;
  display:flex;align-items:center;justify-content:center;
  font-size:16px;color:var(--p1);background:rgba(139,123,255,.13)}
.pwRowTx{flex:1;min-width:0;font-size:12.5px;line-height:1.45;color:var(--text)}

/* Шаги для iPhone нумерованы: это последовательность в ЧУЖОМ интерфейсе, и
   порядок в ней важнее, чем в списке выгод выше. */
.pwList.steps .pwRowNum{flex:none;font-weight:700;font-size:13px;color:var(--gold)}
.pwList.steps .pwRowIc{color:var(--gold);background:rgba(255,194,75,.13)}

/* Отладочный разбор (`?dev=1&install=state`): признаки браузера парами
   «что — какое». Вид намеренно техничный, цифрами: это не экран для игрока. */
.pwFacts{list-style:none;margin:14px 0 0;padding:0;border-top:1px dashed rgba(255,255,255,.12)}
.pwFacts li{display:flex;align-items:baseline;gap:8px;padding:6px 2px;
  font:600 11.5px/1.35 var(--font);color:var(--dim)}
.pwFacts li>span{flex:1;min-width:0}
.pwFacts li>b{flex:none;font-family:var(--num);font-weight:700;font-size:12.5px;color:var(--teal)}
.pwList .pwRow .ti-alert-triangle{color:var(--gold)}
.pwList .pwRowIc:has(.ti-alert-triangle){background:rgba(255,194,75,.13)}

.pwFoot{flex:none;display:flex;flex-direction:column;align-items:stretch;gap:4px;
  padding:14px 16px calc(14px + env(safe-area-inset-bottom))}
.pwGo{display:flex;align-items:center;justify-content:center;gap:8px;
  border:0;border-radius:15px;padding:14px;cursor:pointer;color:#fff;
  font:700 15px/1 'Manrope',var(--font);
  background:linear-gradient(100deg,#7C5CFF,#B14BFF);box-shadow:0 12px 28px rgba(124,92,255,.36)}
.pwGo i{font-size:18px}
.pwGo:active{transform:scale(.985)}
/* «Больше не предлагать» — тихая строка, а не вторая кнопка: это не
   равноправный выбор, а выход для тех, кому предложение не нужно совсем. */
.pwOff{border:0;background:transparent;cursor:pointer;padding:12px;
  font:600 12.5px/1 var(--font);color:var(--dim)}
.pwOff:active{color:var(--muted)}

/* На широком экране шторка не растягивается во всю ширину: приглашение
   мобильное, и десктоп сюда попадает только со стенда (`?install=`). */
@media (min-width:1024px){
  .pwaSheet{left:50%;right:auto;transform:translate(-50%,101%);width:min(420px,100%);
    border-radius:20px 20px 0 0}
  .pwaSheet.on{transform:translate(-50%,0)}
}
