/* ============================================================
   Bride to be party — Наталя, 29.08
   Макет відтворює оригінальний сторіc 810×1440: сцена має
   фіксовану пропорцію, а всі розміри рахуються від її ширини
   (--w), тож композиція ідентична на будь-якому екрані й
   елементи ніколи не наїжджають один на одного.
   ============================================================ */

:root{
    color-scheme: light only;
    /* Ширина сцени = ширина екрана, але не більше 560px.
       Усі відступи й кеглі — це частка від неї.               */
    --w: min(100vw, 560px);
    --cal-line:  calc(var(--w) * 0.0043);  /* товщина ліній календаря */
    --pink:      #f45690;   /* акцентний рожевий (написи, 29)  */
    --pink-deep: #eb6896;   /* серце-кнопка                    */
    --ink:       #111111;
}

*{ box-sizing: border-box; }

html{ -webkit-text-size-adjust: 100%; }

body{
    margin: 0;
    background: #fbe9f0;
    color: var(--ink);
    font-family: 'Montserrat', system-ui, -apple-system, sans-serif;
    overflow-x: hidden;
}

img{ display: block; max-width: 100%; }

.deck{
    width: var(--w);
    margin: 0 auto;
}

/* ---------- сцена ---------- */
.stage{
    position: relative;
    width: 100%;
    aspect-ratio: 810 / 1440;
    isolation: isolate;
}
/* Увесь контент сцени живе тут і обрізається по краях сторіс,
   а паперові фони лежать поза цим шаром — тому вони на всю ширину екрана. */
.stage__inner{
    position: absolute;
    inset: 0;
    overflow: hidden;
}

/* ---------- паперові фони ----------
   Ширина = вся ширина екрана, центр збігається з центром колонки,
   тому обрізка на 50% дає межу рівно посередині екрана — і на телефоні,
   і на десктопі, незалежно від смуги прокрутки.                        */
.paper{
    position: absolute;
    top: 0;  bottom: 0;  left: 50%;
    width: 100vw;
    transform: translateX(-50%);
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    z-index: 0;
}
.paper--pink{ background-image: url('../images/paper-pink.webp?v=1'); clip-path: inset(0 50% 0 0); }
.paper--grid{ background-image: url('../images/paper-grid.webp?v=1'); clip-path: inset(0 0 0 50%); }
/* друга сцена — дзеркально, теж рівно по центру */
.paper--left { clip-path: inset(0 50% 0 0); }
/* рожевий папір другого екрана перевернутий по вертикалі,
   щоб текстура не повторювала перший екран                */
.paper--right{
    clip-path: inset(0 0 0 50%);
    transform: translateX(-50%) scaleY(-1);
}

/* ---------- декор ---------- */
.deco{ position: absolute; pointer-events: none; user-select: none; }

.deco.star{ z-index: 1; }

.disco{
    left: -0.3%;  top: -6.2%;  width: 33.33%;
    z-index: 2;
    transform-origin: 50% 0;
    animation: sway 5s ease-in-out infinite;
}
@keyframes sway{
    0%, 100% { transform: rotate(-3.6deg); }
    50%      { transform: rotate( 3.6deg); }
}

/* Зірочки першої сцени — центр, розмір і кут як в оригіналі */
.star{
    position: absolute;
    transform: translate(-50%, -50%) rotate(var(--rot, 0deg)) scaleY(var(--flip, 1));
}
.star--top-right{ left: 80.69%; top: 20.65%; width: 14.54%; --rot:  150.29deg; }
.star--l3       { left:  8.46%; top: 39.64%; width:  7.59%; --rot:  -97.66deg; }
.star--l1       { left:  9.55%; top: 44.34%; width:  7.59%; --rot: -143.63deg; }
.star--l2       { left: 18.00%; top: 44.43%; width:  7.59%; --rot: -172.29deg; }
.star--right    { left: 93.98%; top: 61.39%; width: 14.54%; --rot:  -31.88deg; }

/* Зірочки другої сцени */
.star--s2a  { left: 35.39%; top: 21.49%; width: 17.87%; --rot: -29.71deg; --flip: -1; }
.star--s2big{ left: 18.88%; top: 68.03%; width: 44.81%; --rot: -31.88deg; }
.star--s2r  { left: 93.15%; top: 47.74%; width: 14.54%; --rot: -31.88deg; }
.star--s2bl { left:  5.72%; top: 96.48%; width: 14.54%; --rot: -52.43deg; }

/* ---------- рукописні заголовки (вектор з оригіналу) ---------- */
.title-art{
    position: absolute;
    margin: 0;
    z-index: 5;
}
.title-art img{ width: 100%; height: auto; }

.stage--one .title-art{ left: 29.14%; top: 9.10%; width: 50.99%; }

.title-art--dress{ left: 24.69%; top:  6.63%; width: 48.89%; }
.title-art--loc  { left: 31.54%; top: 48.13%; width: 37.96%; }
.title-art--wait { left: 14.14%; top: 86.32%; width: 72.10%; }
.title-art--girls{ left: 35.25%; top: 95.21%; width: 25.06%; }

/* ---------- календар ----------
   Лінії винесені в псевдоелементи (а не border), щоб їх можна було
   прокреслювати. Компенсаційні padding зберігають ту саму верстку.  */
/* Межі лишаються справжніми (щоб розкладка не зрушила ні на піксель),
   але прозорими — видиму лінію малює псевдоелемент поверх них.        */
.cal{
    position: absolute;
    /* блок симетричний відносно центру екрана (13.27 + 73.46/2 = 50%),
       тож середній роздільник збігається з межею рожевого паперу */
    left: 13.27%;  top: 25.76%;  width: 73.46%;
    z-index: 5;
    border-top: var(--cal-line) solid transparent;
}
.cal::before, .cal__month::after, .cal__row::after{
    content: '';
    position: absolute;
    left: 0;  width: 100%;
    height: var(--cal-line);
    background: var(--ink);
    transform-origin: left center;
}
.cal::before{ top: calc(-1 * var(--cal-line)); }
.cal__month{
    position: relative;
    font-size: calc(var(--w) * 0.0333);
    font-weight: 800;
    font-style: italic;
    letter-spacing: 0.02em;
    display: flex;
    align-items: center;
    justify-content: center;
    height: calc(var(--w) * 0.0710);
    border-bottom: var(--cal-line) solid transparent;
}
.cal__month::after{ bottom: calc(-1 * var(--cal-line)); }
.cal__row{
    position: relative;
    display: grid;
    /* нерівні колонки — точно як в оригінальному макеті */
    grid-template-columns: 1fr 1fr 1fr 1fr;
    border-bottom: var(--cal-line) solid transparent;
}
.cal__row::after{ bottom: calc(-1 * var(--cal-line)); }
.cal__day{
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: 'Montserrat', system-ui, -apple-system, sans-serif;
    font-weight: 500;
    font-size: calc(var(--w) * 0.1300);
    letter-spacing: -0.03em;
    line-height: 1;
    height: calc(var(--w) * 0.2068);
    /* оптичне центрування цифр у рядку */
    padding-top: calc(var(--w) * 0.0065);
}
/* вертикальні роздільники */
.cal__day + .cal__day{ border-left: var(--cal-line) solid transparent; }
.cal__day + .cal__day::before{
    content: '';
    position: absolute;
    left: calc(-1 * var(--cal-line));  top: 0;  bottom: 0;
    width: var(--cal-line);
    background: var(--ink);
    transform-origin: center top;
}
.cal__day--on{ color: var(--pink); font-weight: 700; }
.cal__num{ display: block; }
/* мальоване рожеве коло навколо 29 — елемент з оригінального макета */
.cal__ring{
    position: absolute;
    left: 50%;  top: 50%;
    width:  calc(var(--w) * 0.1970);
    height: calc(var(--w) * 0.2012);
    transform: translate(-50%, -50%);
    background: url('../images/circle.webp?v=3') center / 100% 100% no-repeat;
    pointer-events: none;
}

/* ---------- анімація календаря ----------
   Сценарій: прокреслюються лінії -> проявляється «СЕРПЕНЬ» ->
   опускаються роздільники -> по черзі вискакують цифри ->
   наприкінці навколо 29 «малюється» рожеве коло.                  */
.cal::before,
.cal__month::after,
.cal__row::after            { transform: scaleX(0); }
.cal__day + .cal__day::before{ transform: scaleY(0); }
.cal__month-t{
    display: inline-block;
    opacity: 0;
    transform: translateY(calc(var(--w) * 0.014));
}
.cal__num{
    opacity: 0;
    transform: translateY(calc(var(--w) * 0.028)) scale(0.82);
}
.cal__ring{ opacity: 0; transform: translate(-50%, -50%) scale(0.3) rotate(-150deg); }

@keyframes cal-x  { to{ transform: scaleX(1); } }
@keyframes cal-y  { to{ transform: scaleY(1); } }
@keyframes cal-in { to{ opacity: 1; transform: none; } }
@keyframes cal-ring{
    0%  { opacity: 0; transform: translate(-50%, -50%) scale(0.30) rotate(-150deg); }
    60% { opacity: 1; transform: translate(-50%, -50%) scale(1.10) rotate(8deg); }
    100%{ opacity: 1; transform: translate(-50%, -50%) scale(1)    rotate(0deg); }
}

.cal.is-in::before            { animation: cal-x 0.55s cubic-bezier(0.22,0.9,0.3,1) 0.05s forwards; }
.cal.is-in .cal__month::after { animation: cal-x 0.55s cubic-bezier(0.22,0.9,0.3,1) 0.52s forwards; }
.cal.is-in .cal__row::after   { animation: cal-x 0.55s cubic-bezier(0.22,0.9,0.3,1) 0.75s forwards; }
.cal.is-in .cal__month-t      { animation: cal-in 0.45s ease-out 0.38s forwards; }

.cal.is-in .cal__day:nth-child(2)::before{ animation: cal-y 0.42s ease-out 0.85s forwards; }
.cal.is-in .cal__day:nth-child(3)::before{ animation: cal-y 0.42s ease-out 0.92s forwards; }
.cal.is-in .cal__day:nth-child(4)::before{ animation: cal-y 0.42s ease-out 0.99s forwards; }

.cal.is-in .cal__day:nth-child(1) .cal__num{ animation: cal-in 0.5s cubic-bezier(0.2,0.9,0.3,1.25) 1.05s forwards; }
.cal.is-in .cal__day:nth-child(2) .cal__num{ animation: cal-in 0.5s cubic-bezier(0.2,0.9,0.3,1.25) 1.18s forwards; }
.cal.is-in .cal__day:nth-child(3) .cal__num{ animation: cal-in 0.5s cubic-bezier(0.2,0.9,0.3,1.25) 1.31s forwards; }
.cal.is-in .cal__day:nth-child(4) .cal__num{ animation: cal-in 0.5s cubic-bezier(0.2,0.9,0.3,1.25) 1.44s forwards; }

.cal.is-in .cal__ring{ animation: cal-ring 0.75s cubic-bezier(0.25,0.85,0.35,1) 1.95s forwards; }

/* Після завершення клас is-in знімається — анімацій більше немає взагалі,
   тож календар малюється рівно так само, як без анімації.               */
.cal.is-done::before,
.cal.is-done .cal__month::after,
.cal.is-done .cal__row::after            { transform: scaleX(1); }
.cal.is-done .cal__day + .cal__day::before{ transform: scaleY(1); }
.cal.is-done .cal__month-t,
.cal.is-done .cal__num                   { opacity: 1; transform: none; }
.cal.is-done .cal__ring                  { opacity: 1; transform: translate(-50%, -50%); }

/* ---------- I said YES ---------- */
.yes{
    position: absolute;
    left: 50.45%;  top: 42.78%;  width: 43.80%;
    z-index: 4;
}
/* Балон «вискакує» з хвостика — так, ніби це репліка нареченої */
.yes__bubble{
    width: 100%; height: auto;
    transform-origin: 22% 92%;
    opacity: 0;
    transform: scale(0.28) rotate(-9deg);
}
.yes.is-in .yes__bubble{
    animation: bubble-pop 0.7s cubic-bezier(0.18, 0.9, 0.28, 1.35) forwards;
}
@keyframes bubble-pop{
    0%  { opacity: 0; transform: scale(0.28) rotate(-9deg); }
    55% { opacity: 1; transform: scale(1.06) rotate(2.5deg); }
    100%{ opacity: 1; transform: scale(1)    rotate(0deg); }
}
/* Напис з'являється вже всередині балона */
.yes__text{
    position: absolute;
    left: 21.23%;  top: 17.75%;  width: 46.10%;
    height: auto;
    transform-origin: 50% 60%;
    opacity: 0;
    transform: scale(0.55) rotate(-7deg);
}
.yes.is-in .yes__text{
    animation: yes-pop 0.5s cubic-bezier(0.2, 0.9, 0.3, 1.5) 0.32s forwards;
}
@keyframes yes-pop{
    to{ opacity: 1; transform: scale(1) rotate(0deg); }
}
/* Каблучка «прилітає» останньою, далі раз на кілька секунд ловить світло */
.ring{
    left: 80.83%;  top: 48.44%;  width: 9.91%;
    z-index: 5;
    filter: drop-shadow(0 calc(var(--w) * 0.004) calc(var(--w) * 0.008) rgba(120, 60, 90, 0.18));
    opacity: 0;
    transform: translateY(-22%) rotate(-45deg) scale(0.5);
}
.yes.is-in ~ .ring{
    animation: ring-drop 0.6s cubic-bezier(0.2, 0.85, 0.3, 1.3) 0.58s forwards,
               ring-glint 5.5s ease-in-out 2.6s infinite;
}
@keyframes ring-drop{
    to{ opacity: 1; transform: translateY(0) rotate(0deg) scale(1); }
}
@keyframes ring-glint{
    0%, 86%, 100% { transform: none; }
    90%  { transform: rotate(-9deg) scale(1.07); }
    95%  { transform: rotate( 5deg) scale(1.03); }
}

/* ---------- наречена ---------- */
/* Наречена: піднімається знизу з кількома згасаючими похитуваннями,
   мов келих, що ставлять на стіл, — і завмирає.                     */
.bride{
    position: absolute;
    left: 0.02%;  top: 51.17%;  width: 50.09%;
    z-index: 3;
    transform-origin: 42% 100%;
    opacity: 0;
}
.bride.is-in{ animation: bride-in 1.7s cubic-bezier(0.22, 0.8, 0.3, 1) forwards; }
@keyframes bride-in{
    0%  { opacity: 0; transform: translateY(10%) scale(0.94) rotate(-3.4deg); }
    30% { opacity: 1; transform: translateY(0)   scale(1.035) rotate(2.4deg); }
    48% {             transform: scale(0.988)    rotate(-1.5deg); }
    65% {             transform: scale(1.014)    rotate(0.9deg); }
    80% {             transform: scale(0.996)    rotate(-0.45deg); }
    92% {             transform: scale(1.004)    rotate(0.18deg); }
    100%{ opacity: 1; transform: none; }
}

/* ---------- текст запрошення ---------- */
.invite{
    position: absolute;
    left: 52%;  top: 70.8%;  width: 45%;
    z-index: 5;
    text-align: center;
}
.invite p{ margin: 0; }
.invite__name{
    font-size: calc(var(--w) * 0.0444);
    font-weight: 800;
    font-style: italic;
    letter-spacing: 0.01em;
    line-height: 1.2;
    margin-bottom: calc(var(--w) * 0.030);
}
.invite__text{
    font-size: calc(var(--w) * 0.0370);
    font-weight: 700;
    font-style: italic;
    line-height: 1.48;
}
.invite__when{
    color: var(--pink);
    font-size: calc(var(--w) * 0.0333);
    font-weight: 800;
    font-style: italic;
    line-height: 1.47;
    margin-top: calc(var(--w) * 0.028);
}

/* ============================ СЦЕНА 2 ============================ */

/* Келих «підіймають для тосту»: виїжджає знизу з нахилом і сідає на місце,
   далі ледь помітно похитується — як келих у руці.                       */
.girls{
    position: absolute;
    left: 58.84%;  top: 12.06%;  width: 40.83%;
    z-index: 3;
    transform-origin: 50% 92%;
    opacity: 0;
    transform: translateY(14%) rotate(-7deg) scale(0.92);
}
.girls.is-in{
    animation: girls-toast 0.9s cubic-bezier(0.2, 0.88, 0.3, 1.25) forwards,
               girls-sway 4.6s ease-in-out 1.0s infinite;
}
@keyframes girls-toast{
    to{ opacity: 1; transform: translateY(0) rotate(0deg) scale(1); }
}
@keyframes girls-sway{
    0%, 100% { transform: rotate(-1.9deg); }
    50%      { transform: rotate( 1.9deg); }
}

.dress{
    position: absolute;
    left: 4.42%;  top: 26.7%;  width: 43%;
    z-index: 5;
    margin: 0;
    text-align: left;          /* тексти-переліки завжди по лівому краю */
    font-size: calc(var(--w) * 0.0444);
    font-weight: 700;
    font-style: italic;
    line-height: 1.54;
}

.place{
    position: absolute;
    left: 51%;  top: 58.9%;  width: 48%;
    z-index: 5;
    text-align: center;
}
.place p{ margin: 0; }
.place__name{
    font-size: calc(var(--w) * 0.0443);
    font-weight: 800;
    font-style: italic;
    letter-spacing: 0.005em;
    line-height: 1.3;
}
.place__city{
    font-size: calc(var(--w) * 0.0443);
    font-weight: 800;
    font-style: italic;
    line-height: 1.3;
    margin-top: calc(var(--w) * 0.010);
}

/* ---------- серце-кнопка «Локація на карті» ---------- */
.mapbtn{
    position: absolute;
    left: 60.37%;  top: 67.59%;  width: 31.76%;
    z-index: 5;
    display: block;
    text-decoration: none;
    -webkit-tap-highlight-color: transparent;
}
/* Обгортка, що пульсує: серце й напис дихають разом */
.mapbtn__pulse{
    display: block;
    position: relative;
    animation: heart-pulse 2.8s ease-in-out infinite;
}
@keyframes heart-pulse{
    0%, 100% { transform: scale(1); }
    50%      { transform: scale(var(--pulse, 1.11)); }
}
.mapbtn__heart{ width: 100%; height: auto; }
.mapbtn__label{
    position: absolute;
    left: 50%;  top: 44%;
    transform: translate(-50%, -50%);
    width: 86%;
    text-align: center;
    color: #fff;
    font-size: calc(var(--w) * 0.0395);
    font-weight: 800;
    font-style: italic;
    line-height: 1.45;
}
.mapbtn:hover .mapbtn__pulse,
.mapbtn:focus-visible .mapbtn__pulse{ --pulse: 1.16; animation-duration: 1.5s; }
.mapbtn:active .mapbtn__pulse{ --pulse: 1.00; animation-duration: 0.4s; }

/* ---------- заставка з кнопкою Play ----------
   Поки заставка відкрита, макет розмитий. Натискання — це жест
   користувача, тому музика стартує гарантовано, на всіх пристроях. */
.intro{
    position: fixed;
    inset: 0;
    z-index: 60;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(251, 224, 235, 0.55);
    -webkit-backdrop-filter: blur(3px);
    backdrop-filter: blur(3px);
    cursor: pointer;
    /* заставка перехоплює жести — під нею не можна прокрутити запрошення */
    touch-action: none;
    overscroll-behavior: contain;
    transition: opacity 0.55s ease, visibility 0.55s;
}
body:not(.is-intro) .intro{
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
}
body.is-intro{ overflow: hidden; overscroll-behavior: none; }
body.is-intro .music-btn{ opacity: 0; pointer-events: none; }

/* розмиття самого запрошення під заставкою */
.deck{ transition: filter 0.65s ease, transform 0.65s ease; }
body.is-intro  .deck{ filter: blur(17px); transform: scale(1.03); }
body.is-opening .deck{ filter: blur(0px);  transform: scale(1); }

.intro__card{ text-align: center; padding: 24px; }

.intro__play{
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 96px;  height: 96px;
    margin: 0 auto;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: var(--pink);
    color: #fff;
    cursor: pointer;
    box-shadow: 0 10px 30px rgba(244, 86, 144, 0.42);
    -webkit-tap-highlight-color: transparent;
    transition: transform 0.22s ease;
}
.intro__play svg{ width: 42px; height: 42px; margin-left: 5px; }
.intro__play:hover{ transform: scale(1.06); }
.intro__play:active{ transform: scale(0.95); }

/* розбіжні кола — «звукові хвилі» */
.intro__wave{
    position: absolute;
    inset: 0;
    border-radius: 50%;
    border: 2px solid var(--pink);
    opacity: 0;
    animation: intro-wave 2.6s ease-out infinite;
    pointer-events: none;
}
.intro__wave--2{ animation-delay: 1.3s; }
@keyframes intro-wave{
    0%  { transform: scale(1);    opacity: 0.55; }
    100%{ transform: scale(1.85); opacity: 0; }
}

.intro__title{
    margin: 22px 0 0;
    font-size: 19px;
    font-weight: 800;
    font-style: italic;
    letter-spacing: 0.01em;
    color: var(--ink);
}

/* ---------- футер ---------- */
.ftr{
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 7px;
    padding: 22px 16px calc(22px + env(safe-area-inset-bottom));
    background: #fbe9f0;
    font-size: 12px;
    font-weight: 600;
    font-style: italic;
    letter-spacing: 0.07em;
    color: #a8848f;
}
.ftr svg{ width: 13px; height: 13px; fill: var(--pink); flex-shrink: 0; }
.ftr a{ color: var(--pink); text-decoration: none; font-weight: 700; }
.ftr a:hover{ text-decoration: underline; }

/* ---------- кнопка музики ---------- */
.music-btn{
    position: fixed;
    top: max(14px, env(safe-area-inset-top));
    /* тримається біля правого краю колонки, а не екрана */
    left: 50%;
    margin-left: calc(var(--w) / 2 - 56px);
    z-index: 20;
    width: 44px;  height: 44px;
    display: flex; align-items: center; justify-content: center;
    padding: 0;
    border: 1px solid rgba(244, 86, 144, 0.35);
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.82);
    -webkit-backdrop-filter: blur(6px);
    backdrop-filter: blur(6px);
    color: var(--pink);
    cursor: pointer;
    box-shadow: 0 3px 12px rgba(196, 106, 145, 0.22);
    -webkit-tap-highlight-color: transparent;
    transition: transform 0.2s ease, background 0.2s ease;
}
.music-btn svg{ width: 21px; height: 21px; }
.music-btn:hover{ transform: scale(1.07); background: #fff; }
.music-btn:active{ transform: scale(0.94); }
/* коли музика вимкнена — показуємо перекреслену ноту */
.music-btn__slash{ opacity: 0; transition: opacity 0.2s ease; }
.music-btn.is-off .music-btn__slash{ opacity: 0.75; }
.music-btn.is-off{ color: #b9a7ae; }

/* ---------- рукописні написи: виїзд зліва на своє місце ----------
   Анімуємо саме <img>, а не сам блок: блок лишається на місці,
   тому IntersectionObserver коректно ловить момент прокрутки,
   а напис у цей час їде з-за лівого краю сторіс.                    */
.slide-in img{
    opacity: 0;
    transform: translateX(calc(var(--w) * -0.92)) rotate(-3.5deg);
    transition: opacity 0.5s ease-out,
                transform 1.05s cubic-bezier(0.16, 0.84, 0.30, 1);
    will-change: transform, opacity;
}
.slide-in.is-in img{
    opacity: 1;
    transform: translateX(0) rotate(0deg);
}
/* «Your girls» під «Waiting for you» — з невеликою затримкою, каскадом */
.title-art--girls.slide-in img{ transition-delay: 0.22s, 0.22s; }

/* ---------- друкування тексту ----------
   Символи вже стоять у потоці й лише прозорі, тому переноси рядків
   і висота блоку однакові до, під час і після анімації.            */
.t-ch{ opacity: 0; }
.t-ch.on{ opacity: 1; }
/* курсор друку — блимає на щойно набраному символі */
.t-ch.t-cur{ position: relative; }
.t-ch.t-cur::after{
    content: '';
    position: absolute;
    left: 100%;  top: 0.1em;
    width: 0.07em;  height: 0.92em;
    background: currentColor;
    opacity: 0.75;
    animation: t-caret 0.75s steps(1, end) infinite;
}
@keyframes t-caret{ 50%{ opacity: 0; } }

/* ---------- поява при скролі ---------- */
.reveal{
    opacity: 0;
    transform: translateY(calc(var(--w) * 0.026));
    transition: opacity 0.7s ease, transform 0.7s ease;
}
.reveal.is-in{ opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce){
    .reveal{ opacity: 1; transform: none; transition: none; }
    .slide-in img{ opacity: 1; transform: none; transition: none; }
    .t-ch{ opacity: 1; }
    .cal::before, .cal__month::after, .cal__row::after{ transform: scaleX(1); }
    .cal__day + .cal__day::before{ transform: scaleY(1); }
    .cal__month-t, .cal__num{ opacity: 1; transform: none; }
    .cal__ring{ opacity: 1; transform: translate(-50%, -50%); }
    .cal.is-in *, .cal.is-in::before{ animation: none !important; }
    .t-ch.t-cur::after{ display: none; }
    .disco{ animation: none; }
    .yes__bubble, .yes__text, .ring{ opacity: 1; transform: none; animation: none; }
    .girls{ opacity: 1; transform: none; animation: none; }
    .bride{ opacity: 1; transform: none; animation: none; }
    .mapbtn__pulse{ animation: none; }
    .music-btn{ transition: none; }
    .intro__wave{ animation: none; }
    .intro__play{ transition: none; }
}
