/* 12.09.2026: вариант 04 установлен на рабочие страницы.
   Лёгкие анимации только transform/opacity. Не анимируем шапку/логотип:
   новый stacking context нарушил бы прозрачный фон логотипа (screen). */
/* 12.09.2026: мобильное переполнение при масштабировании.
   Повернутая рамка орбиты увеличивала scrollWidth, даже когда видимая
   окружность помещалась. Обособляем только декор в обрезаемый слой.
   Корень также защищён от бокового overflow (hidden — старые браузеры,
   clip — современные). Pinch-zoom не отключаем и scrollLeft не сбрасываем
   обработчиками touch/resize: увеличенную страницу можно рассматривать. */
/* 12.09.2026: при уменьшении масштаба контент короче окна. У html раньше
   оставался фон другого макета #161612, и ниже body появлялась полоса.
   Фон корня совпадает с «Аурой», body занимает как минимум весь viewport.
   dvh учитывает изменяемую панель мобильного браузера; vh — fallback. */
.aura-document{--bg:#101020;background:#101020;min-height:100%;width:100%;max-width:100%;min-width:0;overflow-x:hidden}
.aura{min-height:100vh;min-height:100dvh;width:100%;max-width:100%;min-width:0;overflow-x:hidden}
/* 13.09.2026: viewport-fit=cover в шаблоне даёт фону заполнить экран iPhone.
   Контент учитывает вырез, скруглённые углы и нижний индикатор. Обычные
   отступы сохраняются, масштабирование жестом остаётся доступным.
   https://webkit.org/blog/7929/designing-websites-for-iphone-x/ */
.aura{padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}
@supports(overflow:clip){.aura-document,.aura{overflow-x:clip}}
.aura .page-shell{--aura-gutter:48px;width:100%;min-width:0}
.aura-art{position:absolute;inset:0 calc(-1 * var(--aura-gutter));overflow:hidden;z-index:-1;pointer-events:none}
.aura .song-list{grid-template-columns:repeat(2,minmax(0,1fr))}
.aura .song{container-type:inline-size;container-name:aura-song}
.aura .song-heading,.aura .track-title,.aura .help>div,.aura .section-label>span{min-width:0}
.aura .track-title,.aura .help-description,.aura .help h2,.aura h1{overflow-wrap:anywhere}
.aura .format{flex-shrink:0}
.aura .wave-wrap{container-type:inline-size}
.aura .wave{gap:clamp(1px,.65vw,4px);gap:clamp(1px,1cqi,4px)}
.aura .wave i{min-width:0}
.aura .song-bottom{flex-wrap:wrap;row-gap:6px}
.aura .help{grid-template-columns:44px minmax(0,1fr) 36px}
.aura .download{min-width:0;gap:12px;overflow-wrap:anywhere}
@media(max-width:1000px){.aura .page-shell{--aura-gutter:32px}}
@media(max-width:700px){
 .aura .page-shell{--aura-gutter:clamp(12px,5.6vw,22px);padding-inline:var(--aura-gutter)}
 .aura .site-header{grid-template-columns:minmax(0,1fr) minmax(0,140px) minmax(0,1fr)}
 .aura .brand-logo{max-width:100%;height:auto;aspect-ratio:1}
 .aura .status{max-width:100%;white-space:normal;text-align:center;justify-content:center}
 .aura .song-list{grid-template-columns:minmax(0,1fr)}
 .aura .song{padding:clamp(14px,5vw,23px)}
 .aura .song-heading{gap:clamp(8px,3vw,15px)}
 .aura .help{display:flex;flex-wrap:wrap;gap:14px;padding:clamp(14px,4.6vw,23px)}
 .aura .help-symbol{flex:0 0 33px}
 .aura .help>div:nth-child(2){flex:1 1 180px;container-type:inline-size}
 .aura .help h2{font-size:24px;font-size:clamp(19px,12cqi,24px)}
 .aura .aura-hero{container-type:inline-size}
 .aura h1{font-size:clamp(24px,9.9vw,53px);font-size:clamp(24px,11.5cqi,53px)}
}
@media(max-width:300px){.aura .help{grid-template-columns:minmax(0,1fr)}.aura .help h2{font-size:22px}}
@supports(padding:max(0px)){
 .aura .page-shell{
  padding-left:max(var(--aura-gutter),env(safe-area-inset-left,0px));
  padding-right:max(var(--aura-gutter),env(safe-area-inset-right,0px));
 }
}
/* Проверка 200% выявила: отсутствие overflow недостаточно, если flex
   оставляет названию одну букву в строке. Размер КАРТОЧКИ, а не viewport,
   переносит название на отдельный ряд — работает и при увеличении. */
@container aura-song (max-width:220px){
 .song-heading{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px}
 .track-index{grid-column:1;grid-row:1}
 .format{grid-column:2;grid-row:1;justify-self:end}
 .track-title{grid-column:1/-1;grid-row:2}
 .track-title h2{font-size:22px;line-height:1.25}
 .aura-live .playback{gap:12px}
 .aura .download{padding:12px 10px;gap:8px}
}
.aura-live .native-player{width:100%;display:block;margin:22px 0 18px;min-height:44px}
.aura-live .native-player[hidden],.aura-live [hidden]{display:none!important}
.aura-live .custom-player .play{min-width:48px;min-height:48px}
.aura-live .play>span{display:grid;place-items:center}
.aura-live .play .pause-icon .icon{margin-left:0}
.aura-live .play:disabled{opacity:.45;cursor:default;transform:none}
.aura-live .play[aria-busy=true]{opacity:.65}
.aura-live .seek-area{position:relative;min-height:44px;display:flex;align-items:center;border-radius:4px}
.aura-live .seek-area .wave{width:100%;pointer-events:none}
.aura-live .wave i,.aura-live .wave i:nth-child(-n+5){background:#ba9be5;opacity:.32;transition:opacity .2s}
.aura-live .wave i.played{background:#d9c4ff;opacity:1}
.aura-live .seek{appearance:none;-webkit-appearance:none;position:absolute;inset:0;margin:0;width:100%;height:100%;background:transparent;cursor:pointer;border:0;opacity:0}
.aura-live .seek::-webkit-slider-thumb{-webkit-appearance:none;width:18px;height:36px;background:#e3d2ff;border-radius:4px}
.aura-live .seek::-moz-range-thumb{width:18px;height:36px;background:#e3d2ff;border:0;border-radius:4px}
.aura-live .seek:disabled{cursor:default}
.aura-live .seek-area:focus-within{outline:2px solid #d5bcff;outline-offset:5px}
.aura-live .seek:focus-visible{opacity:.18;outline:none}
.aura-live .time{font-variant-numeric:tabular-nums;font-size:11px}
.aura-live .track-title p{font-size:11px;line-height:1.6}
.aura-live .song-bottom{font-size:10px;gap:10px;line-height:1.6}
.aura-live .download{text-decoration:none;min-height:48px;font-size:13px;transition:filter .2s,transform .2s}
.aura-live .download:hover{filter:brightness(1.07);transform:translateY(-1px)}
.aura-live .download:active{transform:translateY(0)}
.aura-live .preview-note{background:#c5a8ff0d;border:1px solid #c5a8ff22;color:#b8adc8;font-size:12px;line-height:1.7;padding:13px 17px;margin-top:20px;border-radius:12px}
.aura-live .player-error{font-size:12px;line-height:1.7;color:#edc2d3;padding:10px 0 15px}
.aura-live .empty-audio{font-size:12px;color:#b6a9c8;line-height:1.8;margin:0 0 20px}
.aura-live .help-description{font-size:14px;line-height:1.85}
.aura-live .hero-description{font-size:15px}
.aura-live .help{scroll-margin-top:24px}
/* Медленное «дыхание» сферы без параллакса мыши и постоянного JS-рендера. */
.aura .orb{animation:aura-float 16s ease-in-out infinite}
.aura .aurora{animation:aura-glow 22s ease-in-out infinite}
.aura .aura-hero>.kicker,.aura .aura-hero>h1,.aura .aura-hero>.hero-description,.aura .aura-link{animation:aura-arrive .85s ease-out both}
.aura .aura-hero>h1{animation-delay:.07s}.aura .aura-hero>.hero-description{animation-delay:.14s}.aura .aura-link{animation-delay:.21s}
.aura .song{animation:aura-arrive .8s ease-out both;animation-delay:.12s}
.aura .song:nth-child(2){animation-delay:.2s}
.motion-paused .orb,.motion-paused .aurora{animation-play-state:paused}
@keyframes aura-float{0%,100%{transform:translateY(0) scale(1)}50%{transform:translateY(-7px) scale(1.025)}}
@keyframes aura-glow{0%,100%{opacity:.76}50%{opacity:1}}
@keyframes aura-arrive{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
/* 12.09.2026: одинаковые циклы движения на компьютере И телефоне.
   Только параллакс курсора в aura.js остаётся функцией мыши/трекпада.
   ::before — свет внутри шара; ::after и span — одна наклонённая орбита;
   span::before — спутник, движущийся по её окружности до растяжения X.
   translate для курсора независим от transform в циклических keyframes.
   Все циклы CSS; aura.js записывает координаты только при движении мыши. */
@media all{
 .aura .orb{--orbit-radius:203px;--orbit-inset:18px;--orbit-wide:1.4;--orbit-narrow:1.32;opacity:.72;pointer-events:none;translate:var(--aura-pointer-x,0px) var(--aura-pointer-y,0px);transition:translate .7s cubic-bezier(.2,.7,.2,1);animation:aura-drift 10s ease-in-out infinite}
 .aura .orb::before{content:'';position:absolute;inset:0;border-radius:inherit;background:radial-gradient(circle at 27% 23%,#bab9ffad,transparent 48%),radial-gradient(circle at 77% 66%,#ffc7e178,transparent 43%);mix-blend-mode:screen;animation:aura-light-turn 20s linear infinite}
 .aura .orb::after{border-color:#c5a5ed45;animation:aura-orbit-sway 18s ease-in-out infinite}
 .aura .orb span{inset:calc(-1 * var(--orbit-inset));width:auto;height:auto;background:none;box-shadow:none;transform:rotate(-25deg) scaleX(var(--orbit-wide));animation:aura-orbit-sway 18s ease-in-out infinite}
 .aura .orb span::before{content:'';position:absolute;left:calc(50% - 3px);top:calc(50% - 3px);width:6px;height:6px;border-radius:50%;background:#f1d9ff;box-shadow:0 0 9px #f0caff,0 0 22px #b687ffb3;animation:aura-satellite 14s linear infinite}
}
/* Телефон: сфера 270px + поля орбиты по 12px → радиус 147px.
   Компьютер: 370px + поля по 18px → 203px. Спутник идёт по рамке,
   а её наклон и растяжение совпадают у ::after и контейнера span. */
@media(max-width:700px){.aura .orb{--orbit-radius:147px;--orbit-inset:12px;--orbit-wide:1.15;--orbit-narrow:1.09}}
@keyframes aura-drift{0%,100%{transform:translate(-5px,3px) scale(1)}50%{transform:translate(5px,-10px) scale(1.035)}}
@keyframes aura-light-turn{from{transform:rotate(0)}to{transform:rotate(360deg)}}
@keyframes aura-orbit-sway{0%,100%{transform:rotate(-25deg) scaleX(var(--orbit-wide))}50%{transform:rotate(-15deg) scaleX(var(--orbit-narrow))}}
@keyframes aura-satellite{from{transform:rotate(-38deg) translateX(var(--orbit-radius))}to{transform:rotate(322deg) translateX(var(--orbit-radius))}}
/* Не расходуем ресурсы, когда вкладка скрыта или объект ушёл за экран.
   После возврата CSS продолжает с того же кадра, а не начинает заново. */
.aura.motion-paused .orb,.aura.motion-paused .orb::before,.aura.motion-paused .orb::after,.aura.motion-paused .orb span,.aura.motion-paused .orb span::before,
.aura .aura-hero.motion-paused .orb,.aura .aura-hero.motion-paused .orb::before,.aura .aura-hero.motion-paused .orb::after,.aura .aura-hero.motion-paused .orb span,.aura .aura-hero.motion-paused .orb span::before{animation-play-state:paused}
@media(max-width:700px){.aura-live .hero-description{font-size:13px}.aura-live .track-title p{font-size:10px}.aura-live .song-bottom{font-size:9px}.aura-live .help-description{font-size:12px}.aura-live .preview-note{font-size:11px}.aura-live .seek-area{min-height:44px}.aura-live .playback{gap:16px}.aura-live .time{font-size:10px}}
/* 13.09.2026: по запросу владельца режим анимации теперь всегда автоматический. */


/* Очень узкий плеер (например, 200%): шкала получает отдельный ряд,
   отметки времени остаются целыми и не вытесняют кнопку воспроизведения. */
.aura-live .time{flex-wrap:wrap;row-gap:4px}
.aura-live .time>span{white-space:nowrap}
@container aura-song (max-width:150px){.playback{display:grid;grid-template-columns:minmax(0,1fr);gap:12px}.wave-wrap{width:100%}}

/* 13.09.2026: дополнительное движение для всего сайта. Свет рисуется внутри
   обрезанного фонового слоя: его transform не меняет ширину документа и
   не возвращает чёрную полосу/боковое переполнение при масштабировании.
   Слои не перехватывают касания, не используют видео и внешние библиотеки. */
.aura .aurora{overflow:hidden;min-height:100%;height:100vh;height:100dvh}
.aura .aurora::before,.aura .aurora::after{content:'';position:absolute;inset:-10%;pointer-events:none}
.aura .aurora::before{background:radial-gradient(ellipse at 24% 34%,#7c83d930,transparent 48%)}
.aura .aurora::after{background:radial-gradient(ellipse at 76% 62%,#ca8dcd25,transparent 46%)}
/* Карточки проявляются при попадании в экран, а не пока они ещё ниже него.
   Этот класс добавляет только рабочий JS с IntersectionObserver/WAAPI.
   По умолчанию контент виден; сбой JS никогда не оставляет пустую страницу. */
.aura.motion-enhanced .song{animation:none}
.aura .song,.aura .help{transition:border-color .3s,box-shadow .3s}
.aura .aura-link{transition:background-color .25s,border-color .25s,translate .25s,scale .2s}
.aura .aura-link span{display:inline-block}
.aura .download .icon{transition:translate .25s}
.aura .aura-link:active{scale:.97}
.aura-live .play:not(:disabled):active{transform:scale(.94)}
.aura .download:active{scale:.98}
@media(hover:hover) and (pointer:fine){
 .aura .song:hover,.aura .help:hover{border-color:#cfb7ff66;box-shadow:inset 0 1px 0 #ffffff12,0 10px 40px #09071624}
 .aura .aura-link:hover{background-color:#b598d829;border-color:#dac4ff85;translate:0 -2px}
 .aura .download:hover .icon{translate:0 2px}
}
@media all{
 .aura .aurora::before{animation:aura-ambient-blue 19s ease-in-out infinite alternate}
 .aura .aurora::after{animation:aura-ambient-rose 25s ease-in-out infinite alternate}
 .aura .aura-link span{animation:aura-invite 2.8s ease-in-out infinite}
 /* Декоративное движение полосок при звучании. Это не спектрограмма:
    позиция и окрашенный прогресс по-прежнему берутся из audio.currentTime. */
 .aura-live .is-sounding .wave i{animation:aura-wave-breathe 1.2s ease-in-out infinite;transform-origin:center}
 .aura-live .is-sounding .wave i:nth-child(3n){animation-delay:-.35s;animation-duration:1.45s}
 .aura-live .is-sounding .wave i:nth-child(3n+1){animation-delay:-.7s;animation-duration:.95s}
 .aura-live .is-sounding .wave i:nth-child(5n){animation-delay:-1.1s}
}
@keyframes aura-ambient-blue{from{transform:translate(-3%,-2%) scale(.96);opacity:.55}to{transform:translate(5%,7%) scale(1.13);opacity:1}}
@keyframes aura-ambient-rose{from{transform:translate(4%,4%) scale(1.06);opacity:.8}to{transform:translate(-7%,-3%) scale(.95);opacity:.5}}
@keyframes aura-invite{0%,65%,100%{transform:translateY(0)}32%{transform:translateY(4px)}}
@keyframes aura-wave-breathe{0%,100%{transform:scaleY(.55)}50%{transform:scaleY(1)}}
/* Фон/стрелка/волна застывают в скрытой вкладке, невидимая карточка также
   не тратит кадры. Сама музыка продолжает играть по желанию покупателя. */
.aura.motion-paused .aurora::before,.aura.motion-paused .aurora::after,
.aura.motion-paused .aura-link span,.aura.motion-paused .wave i,
.aura .aura-hero.motion-paused .aura-link span,
.aura .aura-offscreen .wave i{animation-play-state:paused}


/* 13.09.2026: удалены кнопка и CSS, отключавшие движение через
   motion-user-off / prefers-reduced-motion. Пауза скрытого документа выше
   остаётся: при возврате синхронизация aura.js автоматически её снимает. */
