/*
 * love.vgagarkin.ru — переиспользуемые компоненты.
 *
 * Опционально: страница сама решает, подключать этот файл или нет.
 *   <link rel="stylesheet" href="/design-system/tokens.css">
 *   <link rel="stylesheet" href="/design-system/components.css">   ← требует tokens.css выше
 *
 * Классы — обобщённая версия того, что уже работает в html/index.html и
 * html/be-mine/index.html (там классы называются иначе и CSS инлайнится —
 * это сознательно, см. README/AGENTS.md). Здесь — то же поведение под
 * именами, которые имеет смысл переиспользовать на новых страницах.
 *
 * У каждого анимированного компонента есть парная строка в общем
 * @media (prefers-reduced-motion: reduce) в конце файла — если добавляешь
 * новый анимированный компонент, добавь и туда.
 */

*{box-sizing:border-box}
/* атрибут [hidden] на flex/grid-элементе браузер по умолчанию игнорирует —
   без этой строки .card-glass[hidden] и т.п. останутся видимыми. */
[hidden]{display:none!important}

body{
  margin:0;
  min-height:100svh;
  font-family:var(--sans);
  color:var(--ink);
  background:var(--bg-wash), var(--bg);
  overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
  -webkit-tap-highlight-color:transparent;
}

/* ---------- дрейфующий фон ----------
   Разметка:
   <div class="aurora" aria-hidden="true">
     <div class="blob b1"></div><div class="blob b2"></div><div class="blob b3"></div>
   </div>
*/
.aurora{position:fixed;inset:-20%;z-index:0;pointer-events:none;opacity:.6;contain:strict}
.blob{position:absolute;border-radius:50%;will-change:transform}
.b1{width:52vmax;height:52vmax;left:-14vmax;top:-12vmax;background:radial-gradient(circle,#ffc2d6 0%,rgba(255,194,214,0) 70%);animation:ds-drift1 26s ease-in-out infinite}
.b2{width:44vmax;height:44vmax;right:-12vmax;top:6vmax;background:radial-gradient(circle,#e3c9ff 0%,rgba(227,201,255,0) 70%);animation:ds-drift2 32s ease-in-out infinite}
.b3{width:56vmax;height:56vmax;left:18vmax;bottom:-24vmax;background:radial-gradient(circle,#ffd6c2 0%,rgba(255,214,194,0) 70%);animation:ds-drift3 38s ease-in-out infinite}
@keyframes ds-drift1{0%,100%{transform:translate(0,0) scale(1)}50%{transform:translate(6vmax,4vmax) scale(1.12)}}
@keyframes ds-drift2{0%,100%{transform:translate(0,0) scale(1.05)}50%{transform:translate(-5vmax,6vmax) scale(.94)}}
@keyframes ds-drift3{0%,100%{transform:translate(0,0) scale(1)}50%{transform:translate(-7vmax,-5vmax) scale(1.1)}}

/* ---------- поднимающиеся сердечки ----------
   Разметка: <div class="petals" id="petals" aria-hidden="true"></div>
   Заполняется через patterns.js → spawnHearts(document.getElementById('petals')) */
.petals{position:fixed;inset:0;z-index:1;pointer-events:none;overflow:hidden}
.petal{position:absolute;bottom:-8vh;color:var(--rose);opacity:0;will-change:transform,opacity;animation:ds-rise linear infinite}
.petal svg{display:block;width:100%;height:100%}
@keyframes ds-rise{
  0%{transform:translate3d(0,0,0) rotate(-8deg) scale(.9);opacity:0}
  12%{opacity:var(--peak)}
  50%{transform:translate3d(var(--sway),-55vh,0) rotate(12deg) scale(1)}
  88%{opacity:var(--peak)}
  100%{transform:translate3d(calc(var(--sway) * -.6),-112vh,0) rotate(-10deg) scale(.95);opacity:0}
}

/* ---------- iOS-стиль тост-уведомление ----------
   Разметка (см. .notif в html/index.html для полного примера с иконкой):
   <div class="notif" role="status" aria-live="polite">
     <div class="n-icon">…svg…</div>
     <div class="n-body">
       <div class="n-head"><span class="n-app">…</span><span class="n-time">сейчас</span></div>
       <div class="n-title">…</div>
       <div class="n-text">…</div>
     </div>
   </div>
   Показ/скрытие — классы .in / .out, дёргать из JS по таймеру. */
.notif{
  position:fixed;z-index:20;
  left:max(10px, env(safe-area-inset-left));
  right:max(10px, env(safe-area-inset-right));
  top:calc(10px + env(safe-area-inset-top));
  margin-inline:auto;max-width:430px;
  display:flex;gap:12px;align-items:flex-start;
  padding:13px 14px;
  border-radius:22px;
  background:rgba(255,255,255,.74);
  -webkit-backdrop-filter:blur(24px) saturate(180%);
  backdrop-filter:blur(24px) saturate(180%);
  border:1px solid rgba(255,255,255,.85);
  box-shadow:0 12px 40px -8px rgba(140,60,90,.28), 0 2px 8px rgba(140,60,90,.10);
  transform:translateY(calc(-100% - 40px));
  opacity:0;
  cursor:pointer;
  -webkit-tap-highlight-color:transparent;
}
.notif.in{animation:ds-drop .78s cubic-bezier(.16,1.02,.3,1) forwards}
.notif.out{animation:ds-lift .42s cubic-bezier(.5,0,.75,0) forwards}
@keyframes ds-drop{to{transform:translateY(0);opacity:1}}
@keyframes ds-lift{from{transform:translateY(0);opacity:1}to{transform:translateY(calc(-100% - 40px));opacity:0}}
.n-icon{
  flex:0 0 auto;width:40px;height:40px;border-radius:11px;
  background:var(--gradient-cta);
  display:grid;place-items:center;
  box-shadow:0 4px 12px -2px rgba(200,70,130,.45), inset 0 1px 0 rgba(255,255,255,.5);
}
.n-icon svg{width:21px;height:21px;fill:#fff;filter:drop-shadow(0 1px 1px rgba(0,0,0,.15))}
.n-body{min-width:0;flex:1}
.n-head{display:flex;align-items:baseline;gap:8px;margin-bottom:2px}
.n-app{font-size:11.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:#a07688}
.n-time{margin-left:auto;font-size:11.5px;color:#b39aa4;white-space:nowrap}
.n-title{font-size:15px;font-weight:650;letter-spacing:-.01em;color:#2f1a24;line-height:1.25}
.n-text{font-size:14.5px;line-height:1.35;color:#5c414c;margin-top:1px}

/* ---------- пилюля-бейдж с пульсирующей точкой ----------
   <div class="eyebrow"><span class="dot"></span>текст</div> */
.eyebrow{
  display:inline-flex;align-items:center;gap:8px;
  font-size:11px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;
  color:var(--rose-deep);
  padding:7px 14px 7px 11px;border-radius:999px;
  background:rgba(255,255,255,.55);
  border:1px solid var(--line);
  box-shadow:0 4px 16px -6px rgba(180,70,110,.22);
}
.dot{width:7px;height:7px;border-radius:50%;background:var(--rose);box-shadow:0 0 0 0 rgba(229,122,153,.6);animation:ds-pulse 2.4s ease-out infinite}
@keyframes ds-pulse{0%{box-shadow:0 0 0 0 rgba(229,122,153,.55)}70%{box-shadow:0 0 0 9px rgba(229,122,153,0)}100%{box-shadow:0 0 0 0 rgba(229,122,153,0)}}

/* обычная (без пульса) пилюля — .cal / .cal-done в index.html; для ссылок и статических статусов */
.pill{
  display:inline-flex;align-items:center;gap:9px;
  font-size:13px;letter-spacing:.03em;text-decoration:none;
  color:var(--rose-deep);
  padding:11px 20px;border-radius:999px;
  background:rgba(255,255,255,.6);
  border:1px solid var(--line);
  box-shadow:0 6px 20px -10px rgba(180,70,110,.45);
  transition:transform .18s ease, box-shadow .3s ease, background .3s ease;
  -webkit-tap-highlight-color:transparent;
}
.pill:hover{background:rgba(255,255,255,.85);box-shadow:0 10px 26px -10px rgba(180,70,110,.5)}
.pill:active{transform:scale(.97)}
.pill svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.pill-static{background:rgba(255,255,255,.5);box-shadow:none}

/* ---------- разделитель «линия — сердечко — линия» ----------
   <div class="rule" aria-hidden="true"><i></i>…svg сердечка…<i></i></div> */
.rule{display:flex;align-items:center;justify-content:center;gap:14px;margin:30px auto 0;max-width:280px}
.rule i{flex:1;height:1px;background:linear-gradient(90deg,transparent,var(--line),transparent)}
.rule svg{width:15px;height:15px;fill:var(--rose);opacity:.85}

/* ---------- градиентный акцентный текст ----------
   <span class="em">…</span> внутри заголовка */
.em{
  font-style:italic;
  font-weight:500;
  background:var(--gradient-accent);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
  padding-bottom:.08em;
}

/* ---------- кнопки ---------- */
.btn-primary{
  -webkit-appearance:none;appearance:none;border:0;cursor:pointer;text-decoration:none;
  display:inline-block;
  font:inherit;font-size:17px;font-weight:600;letter-spacing:.02em;
  color:#fff;
  padding:19px 30px;width:100%;max-width:400px;
  border-radius:999px;
  background:var(--gradient-cta);
  box-shadow:0 16px 34px -12px rgba(200,70,130,.62), inset 0 1px 0 rgba(255,255,255,.4);
  transition:transform .18s ease, box-shadow .3s ease;
  text-align:center;
}
.btn-primary:hover{box-shadow:0 20px 40px -12px rgba(200,70,130,.7)}
.btn-primary:active{transform:scale(.97)}
/* .btn-primary.pulse — только на самой важной кнопке экрана (как .yes в be-mine), не на каждой */
.btn-primary.pulse{animation:ds-pulse-btn 3.6s ease-in-out 1.2s infinite}
@keyframes ds-pulse-btn{0%,100%{box-shadow:0 16px 34px -12px rgba(200,70,130,.62), inset 0 1px 0 rgba(255,255,255,.4), 0 0 0 0 rgba(224,96,154,.34)}55%{box-shadow:0 16px 34px -12px rgba(200,70,130,.62), inset 0 1px 0 rgba(255,255,255,.4), 0 0 0 16px rgba(224,96,154,0)}}

.btn-ghost{
  -webkit-appearance:none;appearance:none;background:none;border:0;cursor:pointer;
  font:inherit;font-size:14px;color:rgba(143,102,116,.85);
  padding:8px 12px;border-bottom:1px solid var(--line);
  transition:color .25s ease, opacity .25s ease;
}
.btn-ghost:hover{color:var(--rose-deep)}
.btn-ghost[disabled]{cursor:default;opacity:.55;border-bottom-color:transparent}

/* ---------- «стеклянная» карточка ----------
   backdrop-filter не анимируется этим классом — сама карточка появляется
   через .reveal на дочерних элементах, см. ниже */
.card-glass{
  background:rgba(255,255,255,.76);
  -webkit-backdrop-filter:blur(22px) saturate(180%);
  backdrop-filter:blur(22px) saturate(180%);
  border:1px solid rgba(255,255,255,.9);
  border-radius:26px;
  box-shadow:0 26px 60px -18px rgba(150,65,100,.28), 0 3px 10px rgba(150,65,100,.08);
  padding:clamp(26px,6vw,44px) clamp(22px,5.5vw,44px) clamp(28px,6vw,40px);
}

/* ---------- карточка выбора ----------
   Универсальный паттерн для планов и других сценариев «оставить нужное».
   Весь label кликабелен; настоящий checkbox остаётся доступен с клавиатуры.
   Конкретные поля .choice-card-meta задаёт сама страница. */
.choice-card{
  position:relative;display:block;cursor:pointer;
  border:1px solid var(--line);border-radius:22px;
  background:rgba(255,255,255,.76);
  -webkit-backdrop-filter:blur(18px) saturate(165%);
  backdrop-filter:blur(18px) saturate(165%);
  box-shadow:0 18px 42px -30px rgba(150,65,100,.58);
  -webkit-tap-highlight-color:transparent;
  transition:opacity .22s ease, transform .18s ease, border-color .22s ease, box-shadow .22s ease;
}
.choice-card:hover{border-color:rgba(201,82,122,.28);box-shadow:0 22px 48px -30px rgba(150,65,100,.68)}
.choice-card:active{transform:scale(.99)}
.choice-card input{
  position:absolute;inline-size:1px;block-size:1px;opacity:0;
  pointer-events:none;
}
.choice-card-body{
  display:grid;grid-template-columns:minmax(0,1fr) 30px;gap:14px;
  align-items:start;padding:18px 18px 17px;
}
.choice-card-time{display:block;font-size:10px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--rose-deep);margin:0 0 5px}
.choice-card-title{display:block;font-family:var(--serif);font-size:clamp(24px,6vw,31px);font-weight:400;line-height:1.03;letter-spacing:-.01em;color:var(--ink)}
.choice-card-copy{display:block;max-width:40ch;margin:7px 0 13px;font-size:14px;line-height:1.48;color:#5d4450}
.choice-card-meta{display:flex;flex-wrap:wrap;gap:6px 12px;font-size:12px;line-height:1.35;color:var(--ink-soft)}
.choice-card-meta span{display:inline-flex;align-items:baseline;gap:5px}
.choice-card-meta b{font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--rose-deep)}
.choice-card-toggle{
  position:relative;display:block;inline-size:28px;block-size:28px;border:1.5px solid var(--rose-deep);border-radius:50%;
  background:var(--rose-deep);box-shadow:inset 0 1px 0 rgba(255,255,255,.35);
  transition:background .18s ease,border-color .18s ease,transform .18s ease;
}
.choice-card-toggle::after{
  content:"";position:absolute;left:9px;top:5px;inline-size:7px;block-size:12px;
  border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg);
}
.choice-card.is-off{opacity:.54;background:rgba(255,255,255,.48);box-shadow:none}
.choice-card.is-off .choice-card-toggle{background:rgba(255,255,255,.7);border-color:rgba(143,102,116,.45)}
.choice-card.is-off .choice-card-toggle::after{transform:rotate(45deg) scale(0)}
.choice-card:has(input:focus-visible){outline:3px solid rgba(201,82,122,.32);outline-offset:3px}

/* ---------- проявление текста ----------
   На каждом элементе: class="reveal" style="animation-delay:.25s"
   (шаг между элементами — обычно .2s), родитель получает класс .go,
   когда пора начинать (например, при переключении .screen). */
.reveal{opacity:0;transform:translateY(12px)}
.go .reveal{animation:ds-soft-in .95s cubic-bezier(.2,.8,.25,1) both}
@keyframes ds-soft-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}

/* ---------- переключатель «сцен» ----------
   Несколько .screen внутри общего <main style="display:grid"> (grid-area:1/1
   кладёт их друг на друга), переключение классов — через patterns.js
   switchScreen(). Использовано в be-mine для конверт → письмо → «да». */
.screen{
  grid-area:1/1;
  display:none;flex-direction:column;align-items:center;justify-content:center;
  padding:clamp(28px,7vh,64px) 22px calc(clamp(28px,7vh,64px) + env(safe-area-inset-bottom));
  opacity:0;pointer-events:none;
  transition:opacity .6s ease;
}
.screen.pre,.screen.leaving{display:flex}
.screen.on{display:flex;opacity:1;pointer-events:auto}
.screen.leaving{transition:opacity .45s ease}

/* ---------- footer с доменом ---------- */
.domain-footer{
  position:fixed;z-index:5;
  left:0;right:0;bottom:0;
  text-align:center;pointer-events:none;
  padding:0 20px calc(20px + env(safe-area-inset-bottom));
  font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:rgba(143,102,116,.5);
  transition:opacity .4s ease;
}

@media (prefers-reduced-motion: reduce){
  .aurora,.petals{animation:none}
  .blob{animation:none!important}
  .petal{display:none}
  .notif.in{animation:none;transform:none;opacity:1}
  .dot{animation:none}
  .btn-primary.pulse{animation:none}
  .go .reveal{animation:none!important;opacity:1!important;transform:none!important}
}
