@import url('https://fonts.googleapis.com/css2?family=Anton&family=Cinzel:wght@500;700&family=Playfair+Display:ital,wght@0,700;0,900;1,700&display=swap');

/* ============================================================
   GIRLFRIEND OF THE YEAR — 2026
   Vintage frames, meme captions.
   ============================================================ */

:root {
    --bg:      #17110c;
    --bg-lit:  #241a12;
    --card:    #f2e8d0;
    --card-sh: #ddcfae;
    --ink:     #241a12;
    --ink-mid: #5c4630;
    --gold:    #c9a227;
    --gold-lit:#e8cd72;
    --ox:      #8e2420;
}

*, *::before, *::after { box-sizing: border-box; }
img, svg { max-width: 100%; display: block; }

body {
    margin: 0;
    background: var(--bg);
    color: var(--card);
    font-family: 'Playfair Display', Georgia, serif;
    line-height: 1.5;
    -webkit-font-smoothing: antialiased;
    overflow-x: hidden;
}

body.locked { overflow: hidden; }

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: .001ms !important;
        transition-duration: .001ms !important;
    }
}

/* ---------- shared bits ---------- */

.wrap {
    max-width: 30rem;
    margin: 0 auto;
    padding: 0 1.1rem;
}

.gold-rule {
    height: 1px;
    background: linear-gradient(90deg, transparent, var(--gold), transparent);
    margin: 1.4rem 0;
    opacity: .6;
}

/* ---------- the seal ---------- */

.seal-btn {
    border: 0;
    background: none;
    padding: 0;
    cursor: pointer;
    width: 118px;
    filter: drop-shadow(0 8px 14px rgba(0,0,0,.6));
    transition: transform .4s cubic-bezier(.16,1,.3,1);
}

.seal-btn:hover, .seal-btn:focus-visible { transform: scale(1.06) rotate(-4deg); }
.seal-btn:focus-visible { outline: 2px solid var(--gold-lit); outline-offset: 10px; }

/* ---------- intro ---------- */

#intro {
    position: fixed;
    inset: 0;
    z-index: 50;
    display: grid;
    place-content: center;
    justify-items: center;
    gap: 1.4rem;
    text-align: center;
    padding: 1.5rem;
    background: radial-gradient(ellipse at 50% 40%, var(--bg-lit), var(--bg) 70%);
    transition: opacity .9s ease, visibility .9s;
}

#intro.gone { opacity: 0; visibility: hidden; }

.intro-kicker {
    font-family: 'Cinzel', serif;
    font-size: .68rem;
    letter-spacing: .28em;
    text-transform: uppercase;
    color: var(--gold);
    margin: 0;
}

.intro-title {
    font-family: 'Anton', Impact, sans-serif;
    font-size: clamp(2.6rem, 15vw, 4rem);
    line-height: .92;
    letter-spacing: .01em;
    text-transform: uppercase;
    margin: 0;
    color: var(--card);
}

.intro-year {
    font-family: 'Cinzel', serif;
    font-weight: 700;
    color: var(--gold);
    letter-spacing: .3em;
    font-size: 1rem;
    margin: 0;
}

.tap {
    font-family: 'Cinzel', serif;
    font-size: .62rem;
    letter-spacing: .22em;
    text-transform: uppercase;
    color: rgba(242,232,208,.5);
    margin: 0;
    animation: pulse 3s ease-in-out infinite;
}

@keyframes pulse { 50% { opacity: .4; } }

/* ---------- award card ---------- */

.award {
    position: relative;
    background: var(--card);
    color: var(--ink);
    margin: 0 0 2.6rem;
    padding: .55rem;
    box-shadow: 0 18px 40px -14px rgba(0,0,0,.75);
}

/* the vintage frame */
.award::before {
    content: '';
    position: absolute;
    inset: .55rem;
    border: 2px solid var(--ox);
    outline: 1px solid var(--ox);
    outline-offset: 3px;
    pointer-events: none;
    z-index: 2;
    opacity: .55;
}

.award__inner { padding: 1.5rem 1.15rem 1.3rem; }

.award__no {
    font-family: 'Cinzel', serif;
    font-weight: 700;
    font-size: .62rem;
    letter-spacing: .26em;
    text-transform: uppercase;
    text-align: center;
    color: var(--ox);
    margin: 0 0 .9rem;
}

/* the meme plate */
.meme {
    position: relative;
    margin: 0 0 1.1rem;
    background: #000;
    overflow: hidden;
}

/* meme plates are cropped to a consistent landscape box — portrait source
   images would otherwise make one card three times the height of another */
.meme img {
    width: 100%;
    height: clamp(190px, 55vw, 250px);
    object-fit: cover;
    object-position: center;
    filter: sepia(.45) contrast(1.08) brightness(.92);
}

.meme--top img { object-position: center top; }

.meme figcaption {
    position: absolute;
    left: .4rem;
    right: .4rem;
    bottom: .45rem;
    font-family: 'Anton', Impact, sans-serif;
    font-size: clamp(1.05rem, 5.6vw, 1.5rem);
    line-height: 1.02;
    text-transform: uppercase;
    text-align: center;
    color: #fff;
    -webkit-text-stroke: 2px #000;
    paint-order: stroke fill;
    text-shadow: 0 2px 5px rgba(0,0,0,.6);
}

.meme figcaption.top { top: .45rem; bottom: auto; }

.award__title {
    font-family: 'Playfair Display', serif;
    font-weight: 900;
    font-size: clamp(1.7rem, 8vw, 2.3rem);
    line-height: 1.05;
    text-align: center;
    margin: 0 0 .5rem;
}

.award__line {
    text-align: center;
    font-family: 'Playfair Display', serif;
    font-style: italic;
    font-size: 1rem;
    color: var(--ink-mid);
    margin: 0 0 1.1rem;
}

.beat {
    display: flex;
    align-items: baseline;
    gap: .5rem;
    font-family: 'Cinzel', serif;
    font-size: .62rem;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--ink-mid);
    border-top: 1px solid rgba(142,36,32,.28);
    padding-top: .7rem;
}

.beat b { color: var(--ox); font-weight: 700; }
.beat span { margin-left: auto; }

/* ---------- certificate ---------- */
/* Light like the award cards, but brighter stock and a gold keyline, with
   the medal hanging over the top edge so the finale still reads as special. */

.cert {
    position: relative;
    background:
        radial-gradient(ellipse 80% 55% at 50% 4%, #fffaec 0%, transparent 70%),
        linear-gradient(168deg, #fbf4e2 0%, #f2e8d0 55%, #e5d8b8 100%);
    color: var(--ink);
    text-align: center;
    padding: .5rem;
    margin: 3.4rem 0 2.4rem;
    box-shadow:
        0 1px 0 rgba(255,255,255,.75) inset,
        0 22px 48px -14px rgba(0,0,0,.8);
}

/* gold keyline with a fine oxblood hairline outside it */
.cert::before {
    content: '';
    position: absolute;
    inset: .5rem;
    border: 2px solid var(--gold);
    outline: 1px solid rgba(142,36,32,.45);
    outline-offset: 4px;
    pointer-events: none;
    opacity: .85;
}

/* the medal hangs over the top edge */
.cert__rosette {
    position: absolute;
    left: 50%;
    top: -2.5rem;
    transform: translateX(-50%);
    width: 74px;
    filter: drop-shadow(0 8px 14px rgba(0,0,0,.45));
    z-index: 2;
}

.cert__body { padding: 4.1rem 1.3rem 1.9rem; }

.cert__kicker {
    font-family: 'Cinzel', serif;
    font-weight: 700;
    font-size: .6rem;
    letter-spacing: .3em;
    text-transform: uppercase;
    color: var(--ox);
    margin: 0 0 .7rem;
}

.cert__pre {
    font-family: 'Playfair Display', serif;
    font-style: italic;
    font-size: .92rem;
    color: var(--ink-mid);
    margin: 0 0 .2rem;
}

.cert__name {
    font-family: 'Playfair Display', serif;
    font-weight: 900;
    font-size: clamp(3rem, 17vw, 4.2rem);
    line-height: .98;
    color: var(--ink);
    margin: 0 0 .45rem;
}

.cert__cite {
    font-family: 'Playfair Display', serif;
    font-style: italic;
    font-size: .92rem;
    line-height: 1.6;
    color: var(--ink-mid);
    max-width: 18rem;
    margin: .5rem auto .8rem;
}

.cert__sub {
    font-family: 'Anton', Impact, sans-serif;
    text-transform: uppercase;
    font-size: clamp(1.05rem, 5.4vw, 1.4rem);
    letter-spacing: .05em;
    color: var(--ox);
    margin: 0;
}

.cert__rule {
    height: 1px;
    max-width: 9rem;
    margin: 1.5rem auto;
    background: linear-gradient(90deg, transparent, var(--gold), transparent);
}

/* the specification table — played completely straight */
.cert__spec {
    margin: 0 auto;
    text-align: left;
    max-width: 18rem;
    font-family: 'Cinzel', serif;
    font-size: .6rem;
    letter-spacing: .1em;
    text-transform: uppercase;
}

.cert__spec > div {
    display: flex;
    align-items: baseline;
    gap: .6rem;
    padding: .42rem 0;
    border-bottom: 1px dotted rgba(142,36,32,.28);
}

.cert__spec > div:last-child { border-bottom: 0; }

.cert__spec dt {
    color: var(--ink-mid);
    white-space: nowrap;
}

.cert__spec dd {
    margin: 0 0 0 auto;
    color: var(--ox);
    font-weight: 700;
    text-align: right;
}

/* the warm line lives outside the certificate, so the certificate
   itself can stay completely deadpan */
.signoff {
    text-align: center;
    font-family: 'Playfair Display', serif;
    font-weight: 700;
    font-size: 1.15rem;
    color: var(--card);
    margin: 0 0 2rem;
}

/* ---------- appeal ---------- */
/* Deliberately understated, like a form control — the joke should not be
   telegraphed before it is tapped. */

.appeal {
    text-align: center;
    padding: 0 0 3.4rem;
}

/* fixed-height arena, so the fleeing button never reflows the page */
.appeal__arena {
    position: relative;
    height: 150px;
    margin-bottom: .2rem;
}

.appeal__btn {
    position: absolute;
    left: 50%;
    top: 50%;
    --dx: 0px;
    --dy: 0px;
    transform: translate(calc(-50% + var(--dx)), calc(-50% + var(--dy)));
    transition: transform .3s cubic-bezier(.16, 1, .3, 1),
                color .25s, border-color .25s, background .25s;
    white-space: nowrap;
    font-family: 'Cinzel', serif;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .18em;
    font-size: .62rem;
    color: rgba(242,232,208,.62);
    background: none;
    border: 1px solid rgba(201,162,39,.4);
    padding: .85rem 1.8rem;
    cursor: pointer;
}

.appeal__btn:hover,
.appeal__btn:focus-visible {
    color: var(--card);
    border-color: var(--gold);
    background: rgba(201,162,39,.08);
}

/* once it gives up, it settles back to the middle */
.appeal__btn.caught { --dx: 0px; --dy: 0px; }

.appeal__btn:focus-visible { outline: 2px solid var(--gold-lit); outline-offset: 3px; }

.appeal__btn[disabled] {
    cursor: default;
    opacity: .35;
    border-color: rgba(201,162,39,.2);
}

.appeal__reply {
    font-family: 'Cinzel', serif;
    font-size: .6rem;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--gold);
    min-height: 1.4em;
    margin: 1.1rem 0 0;
    opacity: 0;
    transition: opacity .3s ease;
}

.appeal__reply.show { opacity: 1; }

/* the last line drops the official register */
.appeal__reply.final {
    font-family: 'Playfair Display', serif;
    font-style: italic;
    text-transform: none;
    letter-spacing: 0;
    font-size: 1rem;
    color: var(--card);
}

/* ---------- header ---------- */

.head {
    text-align: center;
    padding: 3rem 0 2.2rem;
}

.head__title {
    font-family: 'Anton', Impact, sans-serif;
    text-transform: uppercase;
    font-size: clamp(2rem, 11vw, 2.8rem);
    line-height: .95;
    margin: 0;
}

.head__year {
    font-family: 'Cinzel', serif;
    font-weight: 700;
    letter-spacing: .3em;
    color: var(--gold);
    font-size: .85rem;
    margin: .6rem 0 0;
}

/* ---------- reveal ---------- */

.rv {
    opacity: 0;
    transform: translateY(16px);
    transition: opacity .8s cubic-bezier(.16,1,.3,1), transform .8s cubic-bezier(.16,1,.3,1);
}

.rv.on { opacity: 1; transform: none; }

.confetti {
    position: fixed;
    top: -30px;
    z-index: 40;
    pointer-events: none;
}
