body {
    font-family: var(--font-body);
    background-color: var(--bs-body-bg);
    color: var(--bs-body-color);
}

h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
    font-family: var(--font-heading);
    font-weight: 600;
}

a {
    text-decoration: none;
}

.text-brand {
    color: var(--bs-primary);
}

.bg-decor {
    position: fixed;
    inset: 0;
    z-index: -1;
    overflow: hidden;
    pointer-events: none;
}

.bg-decor__item {
    position: absolute;
    color: var(--bs-primary);
    opacity: 0.22;
    line-height: 1;
    animation: bg-decor-float 24s ease-in-out infinite;
}

.bg-decor__item--1  { top: 6%;  left: 4%;  font-size: 2.4rem; animation-delay: -2s; }
.bg-decor__item--2  { top: 16%; left: 86%; font-size: 3rem;   animation-delay: -9s; }
.bg-decor__item--3  { top: 56%; left: 2%;  font-size: 2.1rem; animation-delay: -14s; }
.bg-decor__item--4  { top: 82%; left: 90%; font-size: 2.7rem; animation-delay: -6s; }
.bg-decor__item--5  { top: 10%; left: 46%; font-size: 1.5rem; animation-delay: -4s; }
.bg-decor__item--6  { top: 40%; left: 76%; font-size: 1.3rem; animation-delay: -11s; }
.bg-decor__item--7  { top: 62%; left: 48%; font-size: 1.2rem; animation-delay: -18s; }
.bg-decor__item--8  { top: 4%;  left: 66%; font-size: 2.1rem; animation-delay: -8s; }
.bg-decor__item--9  { top: 72%; left: 10%; font-size: 2.4rem; animation-delay: -12s; }
.bg-decor__item--10 { top: 90%; left: 56%; font-size: 2.2rem; animation-delay: -16s; }
.bg-decor__item--11 { top: 46%; left: 92%; font-size: 1.9rem; opacity: 0.26; animation-delay: -3s; }
.bg-decor__item--12 { top: 94%; left: 22%; font-size: 1.7rem; opacity: 0.26; animation-delay: -20s; }

@keyframes bg-decor-float {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(-14px); }
}

@media (prefers-reduced-motion: reduce) {
    .bg-decor__item {
        animation: none;
    }
}

/* Fallback do AOS — o conteúdo nunca pode depender do JS para ser visível.
   O aos.css esconde tudo que tem [data-aos] (opacity: 0) e conta com o aos.js
   para revelar ao rolar. Se o CSS carregar e o JS não — bloqueador de anúncios,
   proxy corporativo, script que falha —, a lista inteira de presentes fica
   invisível e o convidado vê uma página vazia. Verificado em navegador real.

   O animations.js só marca <html> quando o AOS existe de fato; enquanto não
   marcar, esta regra mantém tudo visível. Ver static/js/animations.js. */
html:not(.aos-ready) [data-aos] {
    opacity: 1 !important;
    transform: none !important;
    visibility: visible !important;
}
