/* Night theme for the baked /v/ and /m/ pages — SINGLE SOURCE OF TRUTH.
 *
 * Linked by the templates (so newly baked pages paint dark immediately) and
 * injected by seo-night.js (so pages baked before this change get it too).
 * It previously existed twice — once inline in each template, once as an
 * escaped JS string — and the two copies drifted, which is how contrast bugs
 * survived a fix. Edit here only.
 */
/* ==================================================================
   NIGHT THEME — baked, not injected.
   Matches the homepage: near-black ground, one quiet purple wash,
   warm off-white ink, gold reserved for the single CTA, cyan for map
   geometry. Baked into the template so a page renders dark on first
   paint; the JS-injected copy in seo-night.js only exists to cover
   pages baked before this change.
   Colour only — no layout, no content, nothing an SEO crawler reads.
   ================================================================== */
:root {
    --vn-bg: #0B0D14;
    --vn-2: #141826;
    --vn-3: #1E2334;
    --vn-ink: #F4F1EA;
    --vn-ink2: #B8B2C4;
    --vn-ink3: #857F94;
    --vn-rule: rgba(244, 241, 234, 0.12);
    --vn-purple: #8B5BF5;
    --vn-cyan: #76E7E3;
    --vn-gold: #E5CB56;
}

/* Tailwind's CDN build injects its stylesheet at runtime, i.e. after
   this block, so `bg-canvas` on <body> would otherwise win. */
html, body {
    background: var(--vn-bg) !important;
    color: var(--vn-ink) !important;
}
body.bg-canvas, body.brand-mosaic-page {
    background-image: none !important;
    background-color: var(--vn-bg) !important;
}
header {
    background: rgba(20, 24, 38, .86) !important;
    border-color: var(--vn-rule) !important;
}
header a, header span { color: var(--vn-ink) !important; }

/* Every surface the old light layout painted white or cream. Listed
   explicitly rather than with a blanket selector so nothing that is
   meant to stay coloured (pin swatches, brand chips) gets flattened. */
.seo-content .seo-fact,
.seo-content .seo-list li,
.seo-content .seo-mini-preview,
.seo-content .ct-pill,
.seo-content a.secondary,
#map-shell, #loading, #error, #map-expand,
#spot-preview .spot-row, #spot-preview .food-chip {
    background: linear-gradient(180deg, rgba(244,241,234,.055), rgba(244,241,234,.02)) !important;
    border-color: var(--vn-rule) !important;
    color: var(--vn-ink2) !important;
}
.seo-content .seo-fact strong,
.seo-content .seo-list li strong,
#spot-preview .spot-row strong { color: var(--vn-ink) !important; }
.seo-content .seo-fact-label { color: var(--vn-ink3) !important; }

/* ---- Contrast repair -------------------------------------------
   Measured with a WCAG pass over a live page, not by eye. The light
   theme's inks survived into the dark one and failed badly:
     strong / #111 ink ......... ratio 1.03  (needs 4.5)
     .ct-cta label ............. ratio 1.18
     #6011F2 brand purple ...... ratio 2.64
   Brand purple is kept as an identity colour but lifted to #8B5BF5,
   which is the same hue at a luminance this ground can carry.
   ---------------------------------------------------------------- */
.seo-content strong,
.seo-content b,
#spot-preview strong,
#trip-facts strong { color: var(--vn-ink) !important; }

.seo-content [style*="#111"],
.seo-content [style*="rgb(17"],
#map-shell [style*="#111"] { color: var(--vn-ink2) !important; }

/* Small brand-purple text: same hue, luminance this ground can carry. */
.seo-content .seo-eyebrow,
#map-eyebrow,
.text-accent-purple,
{ /* removed: matched background declarations too */ }

/* Any CTA that inherited dark-on-dark becomes the one gold action. */
.seo-content .ct-cta,
.seo-content .seo-actions a,
#sticky-cta a, #sticky-cta button {
    background: var(--vn-gold) !important;
    color: #14110A !important;
    border-color: transparent !important;
}
.seo-content .ct-cta *, .seo-content .seo-actions a * { color: #14110A !important; }

/* Muted body copy that used ink-at-55% now reads against the dark. */
.seo-content p, .seo-content li, .seo-content dd,
#spot-preview .spot-row span { color: var(--vn-ink2) !important; }
.seo-content a:not([class*="cta"]):not(.secondary):not(.inline-block) { color: var(--vn-cyan) !important; }

/* ---- Contrast repair, round 2 ------------------------------------
   The first pass over-reached. Two specific mistakes, both measured:

   1. `[style*="#6011F2"]` matches an inline style ANYWHERE in the
      attribute, so it recoloured the text of elements whose
      BACKGROUND is brand purple — purple on purple, 1.72:1.
   2. The blanket cyan link colour hit call-to-action links that sit
      on the gold button — cyan on gold, 1.1:1.

   Text on a brand surface must contrast with that surface, not with
   the page, so those cases are stated explicitly here.
   ------------------------------------------------------------------ */
.seo-content .ct-cta,
.seo-content .ct-cta *,
.seo-content .seo-actions a,
.seo-content .seo-actions a *,
.seo-content a.secondary,
.seo-content a.inline-block,
.bg-ink, .bg-ink *,
#sticky-cta a, #sticky-cta a *, #sticky-cta span {
    color: #14110A !important;
}
.bg-accent-purple, .bg-accent-purple *,
a.text-white, a.text-white * { color: #FFFFFF !important; }

/* Faded light-theme inks that survived as inline rgba(). */
#independence-note, #independence-note *,
#vrd-proof-cluster div, #vrd-proof-cluster span { color: var(--vn-ink3) !important; }



body {
    background-image: radial-gradient(70rem 46rem at 82% -14%, rgba(139, 91, 245, .15), transparent 64%);
    background-repeat: no-repeat;
    background-attachment: fixed;
}

h1, h2, h3, #map-title {
    color: var(--vn-ink);
    letter-spacing: -.02em;
    text-wrap: balance;
}
p, li, #map-subtitle { color: var(--vn-ink2); }
a { color: var(--vn-cyan); }

/* Surfaces: every light card in the baked body, re-grounded. */
.seo-content .seo-card,
.seo-content .seo-list li,
.seo-content .seo-link-list li,
.seo-content .seo-chip-list li:nth-child(3n+3),
#spot-preview .spot-row,
#spot-preview .food-chip,
#trip-facts,
#tourism-link {
    background: linear-gradient(180deg, rgba(244, 241, 234, .055), rgba(244, 241, 234, .02));
    border-color: var(--vn-rule);
    color: var(--vn-ink2);
    box-shadow: none;
}
.seo-content .seo-card { border-top-color: var(--vn-purple); }
.seo-content h2, .seo-content h3 { color: var(--vn-ink); }
.seo-content details { border-color: var(--vn-rule); background: rgba(244, 241, 234, .03); }
.seo-content summary { color: var(--vn-ink); }

/* The one gold thing on the page is the thing we want tapped. */
.seo-content .seo-actions a,
#sticky-cta a, #sticky-cta button {
    background: var(--vn-gold);
    color: #14110A;
    box-shadow: 0 10px 30px -12px rgba(229, 203, 86, .55);
}
#sticky-cta {
    background: rgba(20, 24, 38, .92);
    border-top: 1px solid var(--vn-rule);
    backdrop-filter: blur(10px);
    color: var(--vn-ink);
}

/* Reading measure. The prose was full-bleed app chrome; give it a
   column so the page reads as an article. */
.seo-content .seo-inner { max-width: 748px; }

/* ---- Contrast repair, round 3 ---------------------------------------------
   Measured on a live page with a WCAG pass. Three cases the earlier rounds
   missed or caused:

   1. Tailwind's opacity utilities (`text-ink/70`, `text-ink/55`) generate
      rgba(17,17,17,.7) on pages baked BEFORE the tailwind token flip. They
      need catching by class, since the colour is baked into the utility.
   2. The star rating inherited the sticky-CTA's dark-on-gold ink while
      sitting on the dark bar — dark on dark.
   3. Footer links inside the gold CTA block were still taking the page's
      cyan link colour instead of the button's ink.
   --------------------------------------------------------------------------- */
[class*="text-ink/"] { color: var(--vn-ink2) !important; }
.text-ink { color: var(--vn-ink) !important; }

/* Stars are decorative gold on a dark bar, not button ink. */
#vrd-proof-cluster span[aria-hidden="true"],
#sticky-cta .stars, #sticky-cta span[aria-hidden="true"] { color: var(--vn-gold) !important; }

/* Anything sitting on the gold action surface takes the button's ink. */
.seo-content .seo-actions a,
.seo-content .seo-actions a *,
.seo-content .ct-cta, .seo-content .ct-cta *,
.seo-guide-cta a, .seo-guide-cta a * { color: #14110A !important; }

/* ---- Specificity floor -----------------------------------------------------
   This sheet has to beat two things it does not control: the baked page's own
   inline <style> (light theme, already in the document) and Tailwind's CDN
   build (injected at runtime). Bare element selectors lose to both, which is
   how the H1 ended up dark-on-dark after this file was split out of the
   template. Headings and body copy therefore state their ground explicitly.
   --------------------------------------------------------------------------- */
#seo-content h1, #seo-content h2, #seo-content h3, #seo-content h4,
.seo-content h1, .seo-content h2, .seo-content h3, .seo-content h4,
#map-title, #drawer-panel h2, #drawer-panel h3 {
    color: var(--vn-ink) !important;
}
#seo-content p, #seo-content li, #seo-content dd, #seo-content dt,
.seo-content p, .seo-content li, #drawer-panel p, #drawer-panel li {
    color: var(--vn-ink2) !important;
}
#seo-content .seo-lede, .seo-content .seo-lede { color: var(--vn-ink2) !important; }

/* Header chrome on the baked pages. */
header a, header span, header .text-ink { color: var(--vn-ink) !important; }
header a[style*="background"], header .bg-accent-purple { color: #FFFFFF !important; }

/* Proof cluster + sticky bar: readable on their own dark surfaces. */
#vrd-proof-cluster, #vrd-proof-cluster * { color: var(--vn-ink3) !important; }
#vrd-proof-cluster strong, #vrd-proof-cluster b { color: var(--vn-ink) !important; }
#sticky-cta > div > div, #sticky-cta p { color: var(--vn-ink3) !important; }

/* Drawer panel ground (it painted white at 88%). */
#drawer-panel, .drawer-panel { background: var(--vn-2) !important; }

/* ---- Conversion block ------------------------------------------------------
   Rendered by site-discovery.js at the foot of every /v/ and /m/ page. It used
   to be three cards with three buttons on a beige ground; it is now one card,
   one button, and a single quiet text link. Styled here so the whole block
   sits on the night ground and the primary action is the only gold thing.
   --------------------------------------------------------------------------- */
.vrd-cohort, .vrd-cohort-inner { background: transparent !important; }
.vrd-cohort-title { color: var(--vn-ink) !important; }
.vrd-cohort-sub, .vrd-cohort-trust, .vrd-cohort-trust span { color: var(--vn-ink3) !important; }
.vrd-cohort-eyebrow, .vrd-cohort-eyebrow span { color: var(--vn-purple) !important; }

/* One card, centred, not a three-across grid. */
.vrd-cohorts {
    grid-template-columns: minmax(0, 460px) !important;
    justify-content: center !important;
    display: grid !important;
}
.vrd-cohort-card, .vrd-cohorts > a, .vrd-cohorts > div {
    background: linear-gradient(180deg, rgba(244,241,234,.06), rgba(244,241,234,.02)) !important;
    border: 1px solid var(--vn-rule) !important;
    box-shadow: none !important;
}
.vrd-cohort-card h3, .vrd-cohorts h3 { color: var(--vn-ink) !important; }
.vrd-cohort-card p, .vrd-cohorts p { color: var(--vn-ink2) !important; }
.vrd-cohort-card .vrd-cohort-mini, .vrd-cohorts .vrd-cohort-mini { color: var(--vn-ink3) !important; }

/* The single revenue action. */
.vrd-cohort-card .vrd-cohort-cta, .vrd-cohorts a[class*="cta"] {
    background: var(--vn-gold) !important;
    color: #14110A !important;
    border: 0 !important;
}

.vrd-cohort-secondary {
    text-align: center;
    margin: 18px auto 0;
    font-size: .9rem;
    color: var(--vn-ink3) !important;
}
.vrd-cohort-secondary a {
    color: var(--vn-cyan) !important;
    text-underline-offset: 3px;
}

/* Related-map cards and the Load More control. */
.vrd-rel-card, .vrd-rel-card * { background: transparent !important; color: var(--vn-ink2) !important; }
.vrd-rel-card { background: linear-gradient(180deg, rgba(244,241,234,.055), rgba(244,241,234,.02)) !important;
                border: 1px solid var(--vn-rule) !important; }
.vrd-rel-card strong, .vrd-rel-card h3 { color: var(--vn-ink) !important; }
#vrd-load-more, .vrd-load-more {
    background: transparent !important;
    border: 1px solid var(--vn-rule) !important;
    color: var(--vn-ink2) !important;
}

/* ---- Editorial layout ------------------------------------------------------
   A newspaper feature, not a card stack: one measured text column with the map
   held alongside it as a sticky figure. The map stays in view while the reader
   moves through the piece, which is the whole reason a paper puts the graphic
   in the margin rather than mid-column.

   Single column below 1100px — a 360px sidebar plus a readable measure does
   not fit, and stacking is the honest fallback rather than a squeezed pair.
   --------------------------------------------------------------------------- */
.seo-content .seo-inner { max-width: 1180px !important; }

@media (min-width: 1100px) {
    .seo-content .seo-guide {
        display: grid;
        grid-template-columns: minmax(0, 1fr) 360px;
        column-gap: 56px;
        align-items: start;
    }
    .seo-content .seo-guide > * { grid-column: 1; min-width: 0; }
    .seo-content .seo-guide > #vrd-map-slot {
        grid-column: 2;
        grid-row: 2 / span 200;   /* beside the body, starting under the header */
        position: sticky;
        top: 88px;
        margin: 0;
    }
    .seo-content .seo-guide > .seo-guide-header { grid-column: 1 / -1; }
    #vrd-map-slot .vrd-holo, #vrd-map-slot #map-shell { max-width: 100% !important; margin: 0 !important; }
    #vrd-map-slot #map-shell { height: 300px !important; }
}

/* Newspaper measure and rhythm. */
.seo-content .seo-guide-header h1 {
    font-size: clamp(2.1rem, 4.2vw, 3.15rem) !important;
    line-height: 1.06 !important;
    letter-spacing: -.022em !important;
    max-width: 20ch;
}
.seo-content .seo-lede {
    font-size: 1.16rem !important;
    line-height: 1.62 !important;
    max-width: 62ch;
}
.seo-content .seo-section p, .seo-content .seo-section li { max-width: 68ch; }
.seo-content h2 { margin-top: 2.6em !important; }

/* The plate's hover readout: one fixed home for the spot name, so scanning
   the constellation never shifts the layout. */
.vrd-holo-readout { transition: color .15s ease; }
.vrd-holo-readout.is-named { color: var(--vn-cyan) !important; font-weight: 700; }
.vrd-holo svg circle.vrd-dot { cursor: pointer; transition: r .12s ease; }
.vrd-holo svg circle.vrd-dot:hover, .vrd-holo svg circle.vrd-dot:focus {
    r: 7;
    outline: none;
}

/* ---- Simplify --------------------------------------------------------------
   The constellation plate is retired (see seo-night.js). What remains is the
   live map as a single inline figure, and the page reads top to bottom:
   headline, one line of context, the spots, the CTA. Everything below that is
   supporting material.
   --------------------------------------------------------------------------- */
.vrd-holo { display: none !important; }

/* Single column again — the sticky sidebar existed to hold the plate. */
@media (min-width: 1100px) {
    .seo-content .seo-guide { display: block; }
    .seo-content .seo-guide > #vrd-map-slot { position: static; margin: 26px 0 30px; }
}
.seo-content .seo-inner { max-width: 760px !important; }
#vrd-map-slot #map-shell { height: 320px !important; max-width: 100% !important; margin: 26px 0 30px !important; }

/* Quick-fact cards: metadata, not the story. Quiet them right down. */
.seo-content .seo-facts { gap: 8px !important; margin-top: 18px !important; }
.seo-content .seo-fact {
    border-top-width: 1px !important;
    padding: 10px 12px !important;
    font-size: .82rem !important;
}
.seo-content .seo-fact strong { font-size: .92rem !important; }

/* The spots list is the point of the page. */
.seo-content .seo-spots-primary { margin-top: 26px !important; }
.seo-content .seo-spots-primary h2 { margin-top: 0 !important; }
.seo-content .seo-guide-scope p { color: var(--vn-ink3) !important; font-size: .92rem !important; }

/* ---- Length ----------------------------------------------------------------
   Everything below the CTA is supporting material: scope, use-case, creator
   note, media, trip context, tourism link, hub links, related maps, FAQ. All
   of it earns its place for search, none of it should stand between a visitor
   and the spots.

   So it stays in the HTML — crawlers read the full document — but collapses
   behind one control. The page becomes headline, one line, the list, the CTA;
   anyone who wants the rest opens it. This is the difference between a page
   that is long and a page that FEELS long.
   --------------------------------------------------------------------------- */
.seo-more {
    max-height: 0;
    overflow: hidden;
    transition: max-height .45s cubic-bezier(.22,.8,.3,1);
}
.seo-more.is-open { max-height: 24000px; }

.seo-more-toggle {
    display: block;
    width: 100%;
    margin: 26px 0 0;
    padding: 13px 18px;
    background: transparent;
    border: 1px solid var(--vn-rule);
    border-radius: 12px;
    color: var(--vn-ink2);
    font: inherit;
    font-size: .88rem;
    font-weight: 600;
    letter-spacing: .02em;
    cursor: pointer;
}
.seo-more-toggle:hover { border-color: var(--vn-purple); color: var(--vn-ink); }

/* Media: the YouTube embed and the 1280px map screenshot were the two tallest
   things on the page. Bound them. */
.seo-content .seo-media-grid { margin: 22px 0 !important; }
.seo-content .seo-map-preview,
.seo-content .seo-video-embed { max-height: 340px !important; }
.seo-content .seo-map-preview { object-fit: cover; width: 100%; border-radius: 12px; }

/* ---- Guide entries ---------------------------------------------------------
   Styled after the two ranking pages this was modelled on (Visit Stockholm's
   Sodermalm guide, Anders Husa's Stockholm city guide): every venue is its
   own block with a heading, a line of meta, a real description, the address,
   and a directions link out to Google Maps. Neither of them numbers entries,
   so neither do we — the ranking is editorial, not a countdown.
   --------------------------------------------------------------------------- */
.seo-content .seo-place-list { list-style: none; margin: 0; padding: 0; }

.seo-content li.seo-place {
    background: none !important;
    border: 0 !important;
    border-top: 1px solid var(--vn-rule) !important;
    border-radius: 0 !important;
    padding: 26px 0 !important;
    margin: 0 !important;
}
.seo-content li.seo-place:first-child { border-top: 0 !important; padding-top: 8px !important; }

.seo-content .seo-place-name {
    font-family: "Playfair Display", Georgia, serif !important;
    font-size: 1.42rem !important;
    line-height: 1.2 !important;
    margin: 0 0 6px !important;
    color: var(--vn-ink) !important;
}
.seo-content .seo-place-meta {
    font-size: .78rem !important;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--vn-ink3) !important;
    margin: 0 0 10px !important;
}
.seo-content .seo-place-desc {
    font-size: 1rem !important;
    line-height: 1.66 !important;
    color: var(--vn-ink2) !important;
    margin: 0 0 10px !important;
    max-width: 66ch;
}
.seo-content .seo-place-addr {
    font-size: .88rem !important;
    color: var(--vn-ink3) !important;
    margin: 0 0 10px !important;
}
.seo-content .seo-place-directions {
    display: inline-block;
    font-size: .8rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--vn-cyan) !important;
    text-decoration: none;
    border-bottom: 1px solid currentColor;
    padding-bottom: 1px;
}
.seo-content .seo-place-more .seo-place-name { color: var(--vn-ink3) !important; font-size: 1.1rem !important; }
