/* =========================================================
   Share WebApp — Mini App styles
   Design system: premium-ui-designer tokens
   Goal: mobile-first, dark premium, spring-feel interactions
   ========================================================= */

*,*::before,*::after{box-sizing:border-box;margin:0;padding:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}

:root{
  --bg-0:#07070A;
  --bg-1:#0D0D12;
  --bg-2:#14141B;
  --bg-3:#1C1C25;
  --bg-4:#26262F;
  --text-1:rgba(237,237,237,1);
  --text-2:rgba(237,237,237,0.70);
  --text-3:rgba(237,237,237,0.45);
  --text-4:rgba(237,237,237,0.25);
  --accent:#A78BFA;
  --accent-2:#F472B6;
  --accent-glow:rgba(167,139,250,0.3);
  --success:#22C55E;
  --border:rgba(255,255,255,0.06);
  --border-top:rgba(255,255,255,0.12);
  --border-strong:rgba(255,255,255,0.14);

  --safe-top: env(safe-area-inset-top, 0px);
  --safe-bot: env(safe-area-inset-bottom, 0px);

  --spring: cubic-bezier(0.34, 1.56, 0.64, 1);
  --ease: cubic-bezier(0.22, 0.61, 0.36, 1);
}

html,body{
  background:var(--bg-0);
  color:var(--text-1);
  font-family:'Inter',-apple-system,BlinkMacSystemFont,system-ui,sans-serif;
  min-height:100dvh;
  overflow-x:hidden;
  overscroll-behavior-y:none;
  /* TG dark theme by default */
}
body{
  background-image:
    radial-gradient(circle at 15% -5%, rgba(167,139,250,0.12) 0%, transparent 45%),
    radial-gradient(circle at 85% 100%, rgba(244,114,182,0.10) 0%, transparent 45%);
  min-height:100dvh;
}

button{
  background:transparent;
  border:0;
  color:inherit;
  font:inherit;
  cursor:pointer;
  -webkit-tap-highlight-color:transparent;
  user-select:none;
}

/* ---------- Screens ---------- */
.screen{display:none;flex-direction:column;min-height:100dvh}
.screen--active{display:flex}

/* =========================================================
   SCREEN 1: GRID
   ========================================================= */
.top{
  padding:calc(var(--safe-top) + 24px) 20px 18px;
}
.top-eyebrow{
  display:inline-block;
  padding:6px 12px;
  background:var(--bg-2);
  border:1px solid var(--border);
  border-top-color:var(--border-top);
  border-radius:100px;
  font-size:11px;
  font-weight:600;
  letter-spacing:.1em;
  color:var(--text-2);
  text-transform:uppercase;
  margin-bottom:14px;
}
.top-title{
  font-size:32px;
  font-weight:800;
  letter-spacing:-.03em;
  line-height:1;
  margin-bottom:6px;
  background:linear-gradient(180deg,#FFF 0%,rgba(255,255,255,.6) 100%);
  -webkit-background-clip:text;
  background-clip:text;
  color:transparent;
}
.top-sub{
  font-size:14px;
  color:var(--text-2);
  line-height:1.4;
}
.top-sub b{color:var(--text-1);font-weight:600}

.grid{
  display:grid;
  grid-template-columns:repeat(2, minmax(0,1fr));
  gap:14px;
  padding:8px 20px 24px;
}

.card{
  position:relative;
  aspect-ratio:9/16;
  background:var(--bg-2);
  border:1px solid var(--border);
  border-top-color:var(--border-top);
  border-radius:18px;
  overflow:hidden;
  cursor:pointer;
  transition:transform 220ms var(--spring), border-color 180ms, box-shadow 220ms;
  will-change:transform;
}
.card:active{
  transform:scale(0.96);
  transition:transform 80ms ease-out;
}
.card-thumb{
  position:absolute;inset:0;
  width:100%;height:100%;
  object-fit:cover;
  background:var(--bg-3);
  opacity:0;
  transition:opacity 350ms var(--ease);
}
.card-thumb.loaded{opacity:1}
/* F-SK5 (owner-smoke 2026-05-13): visual error state после двух провалов рендера. */
.card-thumb.img-failed{
  opacity:1;
  background:var(--bg-2);
  position:relative;
}
.card-thumb.img-failed::after{
  content:"⚠ не загрузилось";
  position:absolute;inset:0;
  display:flex;align-items:center;justify-content:center;
  color:#FF8A8A;font-size:11px;font-weight:600;
  text-align:center;padding:0 8px;
}
.card-skel{
  position:absolute;inset:0;
  background:linear-gradient(110deg, var(--bg-2) 0%, var(--bg-3) 35%, var(--bg-2) 70%);
  background-size:200% 100%;
  animation:shimmer 1.6s linear infinite;
}
@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}
.card-label{
  position:absolute;
  left:10px;right:10px;bottom:10px;
  display:flex;align-items:center;gap:8px;
  background:linear-gradient(180deg,rgba(20,20,27,0),rgba(20,20,27,0.85) 30%,rgba(20,20,27,0.95));
  padding:12px 10px 8px;
  border-radius:0 0 12px 12px;
  margin:0 -10px -10px;
}
.card-num{
  flex-shrink:0;
  font-size:10px;font-weight:700;letter-spacing:.05em;
  color:var(--text-3);
  background:rgba(255,255,255,0.06);
  border:1px solid var(--border);
  padding:3px 7px;border-radius:5px;
  font-feature-settings:"tnum";
}
.card-name{
  font-size:12px;font-weight:600;letter-spacing:-.005em;
  color:var(--text-1);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.card-badge{
  position:absolute;top:10px;right:10px;
  width:22px;height:22px;
  border-radius:50%;
  background:linear-gradient(135deg,#A78BFA,#F472B6);
  display:grid;place-items:center;
  font-size:10px;color:#0A0A0A;font-weight:800;
  box-shadow:0 0 0 1px rgba(167,139,250,.4), 0 0 14px 2px rgba(167,139,250,.35);
}

.grid-foot{
  padding:16px 20px calc(var(--safe-bot) + 28px);
  text-align:center;
  font-size:12px;
  color:var(--text-3);
  display:flex;
  align-items:center;
  justify-content:center;
  gap:10px;
  letter-spacing:.01em;
}
.foot-dot{
  width:6px;height:6px;border-radius:50%;
  background:var(--accent);
  box-shadow:0 0 0 1px rgba(167,139,250,.3),0 0 8px 2px rgba(167,139,250,.3);
  animation:pulseDot 2.4s ease-in-out infinite;
}
@keyframes pulseDot{0%,100%{opacity:.5}50%{opacity:1}}

/* =========================================================
   SCREEN 2: Fullscreen view
   ========================================================= */
#screen-view{background:var(--bg-0)}

.view-head{
  position:relative;
  display:flex;align-items:center;gap:14px;
  padding:calc(var(--safe-top) + 14px) 14px 10px;
  z-index:2;
}
.view-back{
  flex-shrink:0;
  width:42px;height:42px;
  border-radius:50%;
  background:var(--bg-2);
  border:1px solid var(--border);
  border-top-color:var(--border-top);
  display:grid;place-items:center;
  transition:transform 160ms var(--spring), background 160ms;
}
.view-back svg{width:18px;height:18px;color:var(--text-1)}
.view-back:active{transform:scale(0.9);background:var(--bg-3)}

.view-title{
  flex:1;min-width:0;
}
.view-num{
  font-size:10px;font-weight:700;letter-spacing:.15em;color:var(--text-3);
  text-transform:uppercase;
}
.view-name{
  font-size:16px;font-weight:700;letter-spacing:-.01em;color:var(--text-1);
  margin-top:2px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.view-dot-trail{
  display:flex;gap:4px;align-items:center;
}
.view-dot-trail span{
  width:5px;height:5px;border-radius:50%;
  background:var(--text-4);
  transition:width 220ms var(--spring),background 180ms;
}
.view-dot-trail span.on{
  width:14px;
  border-radius:3px;
  background:var(--accent);
  box-shadow:0 0 8px 1px rgba(167,139,250,.4);
}

/* =========================================================
   MODE TOGGLE (anon: Q only / A only / Q+A)
   ========================================================= */
.mode-toggle{
  display:flex;
  gap:6px;
  margin:4px 16px 8px;
  padding:4px;
  background:var(--bg-2);
  border:1px solid var(--border);
  border-top-color:var(--border-top);
  border-radius:14px;
}
.mode-toggle[hidden]{display:none}
.mt-btn{
  flex:1;
  display:flex;align-items:center;justify-content:center;gap:6px;
  height:38px;
  border-radius:10px;
  font-size:12px;font-weight:600;letter-spacing:-.005em;
  color:var(--text-3);
  transition:transform 80ms ease-out, background 180ms, color 180ms, box-shadow 220ms;
  white-space:nowrap;
}
.mt-btn .mt-emoji{font-size:14px;line-height:1}
.mt-btn:active{transform:scale(0.96)}
.mt-btn.is-on{
  background:linear-gradient(135deg,rgba(167,139,250,0.22),rgba(244,114,182,0.14));
  color:var(--text-1);
  box-shadow:
    inset 0 0 0 1px rgba(167,139,250,0.4),
    0 0 16px 0 rgba(167,139,250,0.18);
}

/* =========================================================
   FORMAT TABS (Sprint D.4 2026-05-03: Сторис ↔ Канал, anon-mode)
   Сегмент-контрол сверху grid'а — наследует визуал mode-toggle.
   ========================================================= */
.format-tabs{
  display:flex;
  gap:6px;
  margin:0 16px 12px;
  padding:4px;
  background:var(--bg-2);
  border:1px solid var(--border);
  border-top-color:var(--border-top);
  border-radius:14px;
}
.format-tabs[hidden]{display:none}
.ft-btn{
  flex:1;
  display:flex;align-items:center;justify-content:center;gap:6px;
  height:40px;
  border-radius:10px;
  font-size:13px;font-weight:600;letter-spacing:-.005em;
  color:var(--text-3);
  transition:transform 80ms ease-out, background 180ms, color 180ms, box-shadow 220ms;
  white-space:nowrap;
}
.ft-btn .ft-emoji{font-size:15px;line-height:1}
.ft-btn:active{transform:scale(0.96)}
.ft-btn.is-on{
  background:linear-gradient(135deg,rgba(167,139,250,0.22),rgba(244,114,182,0.14));
  color:var(--text-1);
  box-shadow:
    inset 0 0 0 1px rgba(167,139,250,0.4),
    0 0 16px 0 rgba(167,139,250,0.18);
}

.pager{
  flex:1;
  display:flex;
  overflow-x:auto;
  overflow-y:hidden;
  scroll-snap-type:x mandatory;
  scrollbar-width:none;
  -webkit-overflow-scrolling:touch;
  scroll-behavior:smooth;
}
.pager::-webkit-scrollbar{display:none}

.page{
  flex:0 0 100%;
  scroll-snap-align:center;
  scroll-snap-stop:always;
  display:grid;
  place-items:center;
  padding:8px 16px 16px;
  min-width:100%;
}

.page-frame{
  position:relative;
  width:100%;
  max-width:420px;
  aspect-ratio:9/16;
  border-radius:24px;
  overflow:hidden;
  background:var(--bg-2);
  border:1px solid var(--border-top);
  box-shadow:
    0 0 0 1px rgba(167,139,250,.18),
    0 10px 40px rgba(0,0,0,.5),
    0 0 60px 10px rgba(167,139,250,.10);
}
/* Sprint D.4 (2026-05-01, owner-feedback): channel-publish preview — меньший
   max-width + aspect 4:5 (реальный формат публикации 1080×1350), чтобы не
   выглядело как «огромная картинка». Stories preview не трогаем — там 9:16.
   Sprint F (2026-05-19, owner-feedback): атрибут data-publish теперь реально
   выставляется через applyPublishMode() в app.js. До этого CSS-правила висели
   мёртвыми. Также синхронизируем .card на Screen 1 — в post-режиме картинка
   тоже 4:5, иначе object-fit:cover делает «увеличенный» центр-кроп. */
body[data-publish="channel"] .page-frame{
  max-width:300px;
  aspect-ratio:4/5;
}
body[data-publish="channel"] .page{
  padding:4px 16px 8px;
}
body[data-publish="channel"] .card{
  aspect-ratio:4/5;
}
.page-frame img{
  position:absolute;inset:0;
  width:100%;height:100%;
  object-fit:cover;
  opacity:0;
  transition:opacity 350ms var(--ease);
}
.page-frame img.loaded{opacity:1}
.page-skel{
  position:absolute;inset:0;
  background:linear-gradient(110deg, var(--bg-2) 0%, var(--bg-3) 35%, var(--bg-2) 70%);
  background-size:200% 100%;
  animation:shimmer 1.6s linear infinite;
}

.view-actions{
  display:grid;
  grid-template-columns:repeat(3, minmax(0,1fr));
  gap:10px;
  padding:12px 16px calc(var(--safe-bot) + 14px);
  background:linear-gradient(180deg,rgba(7,7,10,0),rgba(7,7,10,0.85) 35%,var(--bg-0));
  position:relative;
  z-index:3;
}
.act{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  height:60px;
  border-radius:14px;
  background:var(--bg-2);
  border:1px solid var(--border);
  border-top-color:var(--border-top);
  color:var(--text-1);
  font-weight:600;
  font-size:12px;
  letter-spacing:-.005em;
  transition:transform 80ms ease-out, background 180ms, border-color 180ms, opacity 180ms;
}
.act:active{transform:scale(0.94);background:var(--bg-3)}
.act-ic{font-size:20px;line-height:1}
.act-lbl{font-size:11px;font-weight:600;color:var(--text-2);letter-spacing:.01em}
.act[disabled], .act.is-disabled{opacity:.45;pointer-events:none}
.act.is-loading .act-ic{animation:spin 900ms linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

/* Primary CTA used in confirm-overlay. */
.act--primary{
  height:54px;
  background:linear-gradient(135deg,#7C5CFF 0%,#5B8DEF 100%);
  border-color:transparent;
  color:#fff;
  flex-direction:row;gap:8px;
  font-size:15px;font-weight:700;
  box-shadow:0 6px 20px rgba(124,92,255,.35);
}
.act--primary .act-lbl{color:#fff;font-size:15px;font-weight:700}
.act--primary .act-ic{font-size:18px}
.act--primary:active{filter:brightness(.9)}

/* =========================================================
   TOAST
   ========================================================= */
.toast{
  position:fixed;
  left:50%;bottom:calc(var(--safe-bot) + 100px);
  transform:translateX(-50%) translateY(40px);
  background:var(--bg-3);
  border:1px solid var(--border-strong);
  color:var(--text-1);
  padding:12px 18px;
  border-radius:100px;
  font-size:13px;
  font-weight:600;
  opacity:0;
  pointer-events:none;
  transition:opacity 220ms var(--ease), transform 220ms var(--spring);
  z-index:100;
  box-shadow:0 10px 30px rgba(0,0,0,.5);
}
.toast.show{
  opacity:1;
  transform:translateX(-50%) translateY(0);
  pointer-events:auto;
}
.toast.success{border-color:rgba(34,197,94,.4);box-shadow:0 10px 30px rgba(0,0,0,.5),0 0 30px 2px rgba(34,197,94,.2)}

/* =========================================================
   PREMIUM LOCK on grid cards
   ========================================================= */
.card.is-locked{
  /* Чуть приглушённый — но превью видно (превью не премиум-блокается). */
}
.card.is-locked .card-thumb{
  filter:saturate(0.55) brightness(0.7);
}
.card.is-locked::after{
  content:"";
  position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(7,7,10,0) 40%,rgba(7,7,10,0.55));
  pointer-events:none;
}
.card-lock{
  position:absolute;top:10px;left:10px;
  width:28px;height:28px;
  border-radius:50%;
  background:rgba(7,7,10,0.85);
  border:1px solid rgba(167,139,250,0.45);
  display:grid;place-items:center;
  font-size:13px;
  box-shadow:0 0 14px 2px rgba(167,139,250,0.3);
  backdrop-filter:blur(6px);
  -webkit-backdrop-filter:blur(6px);
  z-index:2;
}

/* =========================================================
   CHANNEL CHOICE SHEET (bottom sheet)
   ========================================================= */
.sheet{
  position:fixed;inset:0;
  z-index:200;
  display:none;
}
.sheet.show{display:block}
.sheet-backdrop{
  position:absolute;inset:0;
  background:rgba(7,7,10,0.7);
  backdrop-filter:blur(8px);
  -webkit-backdrop-filter:blur(8px);
  animation:sheet-fade 220ms var(--ease);
}
.sheet-card{
  position:absolute;
  left:0;right:0;bottom:0;
  background:var(--bg-1);
  border:1px solid var(--border-top);
  border-bottom:0;
  border-radius:24px 24px 0 0;
  padding:14px 20px calc(var(--safe-bot) + 18px);
  animation:sheet-up 320ms var(--spring);
  box-shadow:0 -10px 40px rgba(0,0,0,0.6);
}
.sheet-handle{
  width:44px;height:4px;
  margin:0 auto 14px;
  border-radius:100px;
  background:var(--text-4);
}
.sheet-title{
  font-size:20px;font-weight:800;letter-spacing:-.02em;
  color:var(--text-1);margin-bottom:4px;
}
.sheet-sub{
  font-size:13px;color:var(--text-3);margin-bottom:16px;
}
.sheet-btn{
  display:flex;align-items:flex-start;gap:14px;
  width:100%;
  padding:14px 16px;
  margin-bottom:10px;
  background:var(--bg-2);
  border:1px solid var(--border);
  border-top-color:var(--border-top);
  border-radius:14px;
  text-align:left;
  transition:transform 80ms ease-out, background 180ms, border-color 180ms;
}
.sheet-btn:active{transform:scale(0.985);background:var(--bg-3)}
.sheet-btn--primary{
  background:linear-gradient(135deg,rgba(167,139,250,0.18),rgba(244,114,182,0.12));
  border-color:rgba(167,139,250,0.4);
  box-shadow:0 0 20px 0 rgba(167,139,250,0.18);
}
.sheet-btn--ghost{
  justify-content:center;
  background:transparent;
  border:0;
  color:var(--text-3);
  font-weight:600;
  font-size:14px;
  padding:12px;margin-top:4px;
}
.sheet-btn-ic{
  flex-shrink:0;font-size:22px;line-height:1;
}
.sheet-btn-text{
  flex:1;display:flex;flex-direction:column;gap:2px;
}
.sheet-btn-text b{
  font-size:15px;font-weight:700;color:var(--text-1);letter-spacing:-.01em;
}
.sheet-btn-text span{
  font-size:12px;color:var(--text-3);font-weight:500;line-height:1.35;
}

@keyframes sheet-fade{from{opacity:0}to{opacity:1}}
@keyframes sheet-up{from{transform:translateY(100%)}to{transform:translateY(0)}}

/* =========================================================
   MEDIA — мелкие телефоны
   ========================================================= */
@media (max-width:360px){
  .top-title{font-size:28px}
  .grid{gap:10px;padding:8px 14px 20px}
  .card-name{font-size:11px}
  .view-actions{gap:8px;padding:10px 12px calc(var(--safe-bot) + 12px)}
  .act{height:56px}
  .act-ic{font-size:18px}
  .act-lbl{font-size:10px}
  .card-lock{width:24px;height:24px;font-size:11px}
}

/* =========================================================
   MEDIA — Telegram light theme (если юзер такой выбрал)
   Bot использует в основном dark, но на всякий
   ========================================================= */
@media (prefers-color-scheme:light){
  /* оставляем dark — design спроектирован под dark */
}

/* =========================================================
   A11Y — keyboard focus (Sprint 8 F-8.5, WCAG 2.1 SC 2.4.7)
   Default `outline:none` from `button{...}` reset убивает фокус
   для tab-навигации. Возвращаем видимый focus только при
   keyboard navigation (`:focus-visible`), мышь не трогаем.
   ========================================================= */
:focus{outline:none}
:focus-visible{
  outline:2px solid var(--accent);
  outline-offset:2px;
  border-radius:6px;
}
.card:focus-visible,
.page-frame:focus-visible,
.sheet-btn:focus-visible{
  outline:2px solid var(--accent);
  outline-offset:3px;
  box-shadow:0 0 0 4px var(--accent-glow);
}
.act:focus-visible,
.mt-btn:focus-visible,
.ft-btn:focus-visible,
.view-back:focus-visible{
  outline:2px solid var(--accent);
  outline-offset:2px;
  box-shadow:inset 0 0 0 1px var(--accent), 0 0 0 4px var(--accent-glow);
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:0.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:0.01ms !important;
    scroll-behavior:auto !important;
  }
}
