/* ============================================================================
   localquest.de — oeffentlicher Bereich.
   Bootstrap 5.3.3 liegt darunter; hier steht nur, was die Marke ausmacht.
   Der Anbieter-Bereich (anbieter.css) und der Spiel-Bereich (play.css) haben
   bewusst eigene Erscheinungsbilder — drei sehr verschiedene Zielgruppen.
   ============================================================================ */

:root {
    /* Plattformpalette: Nordsee. Nicht zu verwechseln mit den Rally-Farben, die
       pro Rally als --rally-* auf dem body des Spiel-Layouts landen. */
    --lq-tief: #12314a;
    --lq-tief-hell: #1d4a6b;
    --lq-see: #2e7d6b;
    --lq-see-hell: #3f9c86;
    --lq-sand: #f7f3e9;
    --lq-sand-tief: #ece2cd;
    --lq-weiss: #ffffff;
    --lq-text: #1b2733;
    --lq-text-leise: #5b6b7a;
    --lq-rand: #dfd7c6;
    --lq-warnung: #b45309;

    /* Die Akzentfarbe der Erlebniswelt: Kompassnadel, Wegpunkte, Kartennadeln,
       Marken ueber den Ueberschriften. Warm gegen das kuehle Nordsee-Blau —
       das ist der Unterschied zwischen "Behoerde am Meer" und "Expedition".

       --lq-kompass hat auf Weiss 3,7:1 und ist damit fuer FLAECHEN, LINIEN und
       grosse Ziffern richtig, fuer Fliesstext nicht. Wo die Farbe Text traegt,
       steht --lq-kompass-tief (5,6:1, AA fuer normalen Text). Die zwei
       auseinanderzuhalten ist der ganze Grund, aus dem es zwei gibt. */
    --lq-kompass: #c2703d;
    --lq-kompass-tief: #9b5528;

    /* Die Linienfarbe der Karte: Hoehenlinien, gestrichelte Wege. Sie steht auch
       fest in img/hoehenlinien.svg und img/wegstrich.svg — eine SVG-Datei, die
       als background-image geladen wird, kann keine CSS-Variable lesen. Wer sie
       hier aendert, aendert sie dort mit. */
    --lq-linie: #c8b998;

    --lq-schrift: 'Inter', 'Segoe UI', system-ui, sans-serif;
    --lq-schrift-titel: 'Fredoka', 'Segoe UI', system-ui, sans-serif;

    /* Fuer Koordinaten und Marken. Systemschrift und keine achte Webfont-Datei:
       gebraucht wird sie fuer ein paar Dutzend Zeichen pro Seite, und ob dort
       Menlo oder Consolas steht, sieht ausser uns niemand. */
    --lq-schrift-fest: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas,
                       'Liberation Mono', monospace;

    --lq-radius: 12px;
    --lq-schatten: 0 1px 2px rgba(18, 49, 74, .06), 0 8px 24px rgba(18, 49, 74, .08);
}

html {
    font-size: 16px;
    scroll-behavior: smooth;
}

body {
    font-family: var(--lq-schrift);
    color: var(--lq-text);
    background: var(--lq-weiss);
    line-height: 1.6;
}

/* --- Rand zum Bildschirm auf dem Handy --------------------------------------
   Bootstraps .container gibt unterhalb von 576 px genau 12 px nach links und
   rechts (--bs-gutter-x: 1.5rem, halbiert). Fuer das Spiel ist das richtig:
   dort zaehlt jeder Millimeter Breite fuer die Aufgabe, und play.css setzt
   deshalb bewusst enge 16 px. Auf den werblichen Seiten ist es falsch — dort
   stehen Kacheln mit Rahmen und Schatten, und die kleben bei 12 px am
   Bildschirmrand, als waere die Seite abgeschnitten.

   Der Griff sitzt an .container und nicht an einer eigenen Klasse, weil
   site.css AUSSCHLIESSLICH von Pages/Shared/_Layout.cshtml geladen wird — der
   Anbieter-Bereich hat anbieter.css, das Spiel play.css, und play.css laedt
   nicht einmal Bootstrap. Die Regel kann also gar nicht in die anderen zwei
   Bereiche lecken.

   Nur unterhalb von 576 px: ab dort deckelt Bootstrap den Container auf 540 px
   und die automatischen Aussenabstaende sorgen schon fuer Luft.

   .row bleibt unberuehrt — Bootstrap deklariert --bs-gutter-x dort noch einmal
   selbst, ein Griff an die Variable des Containers wuerde sonst die Abstaende
   zwischen den Kacheln mitverstellen. Deshalb padding-inline direkt.
   ---------------------------------------------------------------------------- */

@media (max-width: 575.98px) {
    .container, .container-fluid { padding-inline: 1.25rem; }
}

h1, h2, h3, .lq-wortmarke {
    font-family: var(--lq-schrift-titel);
    letter-spacing: -.01em;
    color: var(--lq-tief);
}

h1 { font-size: clamp(2rem, 1.4rem + 2.4vw, 3.1rem); line-height: 1.15; }
h2 { font-size: clamp(1.5rem, 1.2rem + 1.2vw, 2.1rem); line-height: 1.2; }

a { color: var(--lq-see); text-decoration-thickness: 1px; text-underline-offset: 2px; }
a:hover { color: var(--lq-tief); }

/* --- Kopfzeile ---------------------------------------------------------- */

.lq-kopf {
    background: var(--lq-weiss);
    border-bottom: 1px solid var(--lq-rand);
    position: sticky;
    top: 0;
    z-index: 900;
}

/* Steht die Betreiber-Leiste (32 px, fixiert) im Weg, rutscht die Kopfzeile
   darunter. Die Klasse setzt _AdminBar auf dem body. */
body.lq-mit-adminbar .lq-kopf { top: 32px; }

/* inline-flex nur, um die Bildmarke senkrecht auf die Schrift auszurichten.

   KEIN `gap` — der stand hier einmal und setzte einen Abstand zwischen "localquest"
   und ".de": in einem Flex-Behaelter ist der freie Textlauf ein eigenes Element,
   und `gap` steht zwischen JEDEN zwei Elementen, nicht nur zwischen Bild und Text.
   Der Abstand der Bildmarke steht deshalb als margin an ihr selbst. */
.lq-wortmarke {
    font-size: 1.35rem;
    font-weight: 600;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
}

.lq-wortmarke:hover { color: var(--lq-see); }
.lq-wortmarke .lq-punkt { color: var(--lq-see); }

/* Die Bildmarke vor dem Wort. Sie ist ein <img> und kein Inline-SVG: dieselbe
   Datei steht an fuenf Stellen (Kopfzeile, Fusszeile, Anbieter-Seitenleiste,
   gross auf dem Heldenbild und als Favicon), und als Datei wird sie einmal
   geladen statt auf jeder Seite im Markup mitgeschickt.

   Breite und Hoehe stehen im Markup (26x26), hier steht nur, was das Bild vom
   Text nicht erbt. flex: 0 0 auto, weil .lq-wortmarke ein Flex-Behaelter ist —
   ohne das schrumpft die Rose in der Fusszeile, wenn die Spalte eng wird, und
   wird zur Ellipse. */
.lq-wortmarke .lq-bildmarke {
    flex: 0 0 auto;
    margin-right: .45rem;
    /* Optisch sitzt der Kreis einen Hauch zu hoch, weil die Wortmarke keine
       Oberlaengen ueber dem l hat, an denen sich das Auge ausrichtet. */
    margin-top: -.05em;
}

.lq-kopf .nav-link {
    color: var(--lq-text);
    font-weight: 500;
    padding-inline: .85rem;
}

.lq-kopf .nav-link:hover,
.lq-kopf .nav-link.active { color: var(--lq-see); }

/* --- Knoepfe ------------------------------------------------------------ */

.btn-pj {
    background: var(--lq-see);
    border: 1px solid var(--lq-see);
    color: #fff;
    font-weight: 600;
    border-radius: var(--lq-radius);
    padding: .6rem 1.25rem;
}

.btn-pj:hover, .btn-pj:focus-visible {
    background: var(--lq-see-hell);
    border-color: var(--lq-see-hell);
    color: #fff;
}

.btn-lq-umriss {
    background: transparent;
    border: 1px solid var(--lq-tief);
    color: var(--lq-tief);
    font-weight: 600;
    border-radius: var(--lq-radius);
    padding: .6rem 1.25rem;
}

.btn-lq-umriss:hover, .btn-lq-umriss:focus-visible {
    background: var(--lq-tief);
    color: #fff;
}

/* Der Knopf auf dunklem Grund — im Anbieterstreifen am Seitenende. Ein gruener
   btn-pj stuende dort neben dem gruenen Kaufknopf der Quests und saehe aus
   wie derselbe Vorgang; er ist aber der Weg in die andere Zielgruppe. */
.btn-lq-hell {
    background: var(--lq-weiss);
    border: 1px solid var(--lq-weiss);
    color: var(--lq-tief);
    font-weight: 600;
    border-radius: var(--lq-radius);
    padding: .6rem 1.25rem;
}

.btn-lq-hell:hover, .btn-lq-hell:focus-visible {
    background: var(--lq-sand);
    border-color: var(--lq-sand);
    color: var(--lq-tief);
}

.btn-lq-gross { padding: .85rem 1.75rem; font-size: 1.05rem; }

/* --- Landing ------------------------------------------------------------ */

.lq-held {
    background: linear-gradient(180deg, var(--lq-sand) 0%, var(--lq-weiss) 100%);
    padding: clamp(2.5rem, 1rem + 6vw, 5.5rem) 0 clamp(2rem, 1rem + 4vw, 4rem);
}

.lq-held p.lead {
    font-size: clamp(1.05rem, 1rem + .4vw, 1.3rem);
    color: var(--lq-text-leise);
    max-width: 46ch;
}

.lq-schritte { counter-reset: lq-schritt; }

.lq-schritt {
    background: var(--lq-weiss);
    border: 1px solid var(--lq-rand);
    border-radius: var(--lq-radius);
    padding: 1.5rem;
    height: 100%;
}

.lq-schritt::before {
    counter-increment: lq-schritt;
    content: counter(lq-schritt);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 50%;
    background: var(--lq-sand-tief);
    color: var(--lq-tief);
    font-family: var(--lq-schrift-titel);
    font-weight: 600;
    margin-bottom: .85rem;
}

.lq-schritt h3 { font-size: 1.15rem; margin-bottom: .4rem; }
.lq-schritt p { color: var(--lq-text-leise); margin-bottom: 0; }

/* --- Karte -------------------------------------------------------------- */

.lq-karte {
    height: 520px;
    border: 1px solid var(--lq-rand);
    border-radius: var(--lq-radius);
    overflow: hidden;
    background: var(--lq-sand);
}

@media (max-width: 767.98px) {
    .lq-karte { height: 380px; }
}

/* Leaflet setzt seine eigenen Schriftgroessen; das Popup soll aber zur Seite passen. */
.lq-karte .leaflet-popup-content { font-family: var(--lq-schrift); margin: .85rem 1rem; }
.lq-karte .leaflet-popup-content h4 { font-family: var(--lq-schrift-titel); font-size: 1.05rem; margin: 0 0 .25rem; }
.lq-karte .leaflet-popup-content p { margin: 0 0 .6rem; color: var(--lq-text-leise); font-size: .9rem; }

.lq-karte-leer {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    color: var(--lq-text-leise);
    text-align: center;
    padding: 2rem;
}

/* --- Rally-Landing ------------------------------------------------------ */

.lq-rally-kopf {
    /* Die Rally-Farben kommen als Inline-Style vom Server (ThemeCss.BodyStyle),
       damit die Vorschau zeigt, wie das Spiel selbst aussehen wird. */
    background: var(--rally-bg, var(--lq-sand));
    color: var(--rally-text, var(--lq-text));
    border-radius: var(--lq-radius);
    padding: clamp(1.5rem, 1rem + 3vw, 3rem);
}

.lq-rally-kopf h1 { color: inherit; font-family: var(--rally-heading-font, var(--lq-schrift-titel)); }
.lq-rally-kopf .lq-untertitel { font-size: 1.15rem; opacity: .85; }

.lq-themevorschau {
    display: inline-flex;
    gap: .35rem;
    align-items: center;
    background: rgba(255, 255, 255, .55);
    border-radius: 999px;
    padding: .3rem .6rem;
}

.lq-themevorschau span {
    width: 1.1rem;
    height: 1.1rem;
    border-radius: 50%;
    border: 1px solid rgba(0, 0, 0, .12);
    display: inline-block;
}

.lq-faktenliste {
    list-style: none;
    padding: 0;
    margin: 0;
    display: grid;
    gap: .75rem;
}

.lq-faktenliste li {
    display: flex;
    justify-content: space-between;
    gap: 1rem;
    padding-bottom: .75rem;
    border-bottom: 1px solid var(--lq-rand);
}

.lq-faktenliste li:last-child { border-bottom: 0; padding-bottom: 0; }
.lq-faktenliste dt, .lq-faktenliste .lq-schluessel { color: var(--lq-text-leise); }
.lq-faktenliste .lq-wert { font-weight: 600; text-align: right; }

.lq-preis {
    font-family: var(--lq-schrift-titel);
    font-size: 2.25rem;
    color: var(--lq-tief);
    line-height: 1;
}

.lq-kaufkarte {
    border: 1px solid var(--lq-rand);
    border-radius: var(--lq-radius);
    padding: 1.5rem;
    box-shadow: var(--lq-schatten);
    position: sticky;
    top: 6rem;
}

@media (max-width: 991.98px) {
    .lq-kaufkarte { position: static; }
}

/* --- Fliesstext / rechtliche Seiten ------------------------------------- */

.lq-text { max-width: 68ch; }
.lq-text h2 { margin-top: 2.25rem; }
.lq-text h3 { margin-top: 1.5rem; font-size: 1.15rem; }

/* --- Statusmeldung (TempData["Status"]) --------------------------------- */

.lq-status {
    border-left: 4px solid var(--lq-see);
    background: #eef7f4;
    border-radius: 0 var(--lq-radius) var(--lq-radius) 0;
    padding: .85rem 1rem;
}

/* Dieselbe Form, andere Farbe. Gebraucht fuer die abgelehnte Zahlung im Checkout: der Kauf
   ist wiederholbar, es ist also keine Fehlerseite — aber gruen waere gelogen. */
.lq-status-warnung {
    border-left-color: var(--lq-warnung);
    background: #fdf3e7;
}

/* --- Fusszeile ---------------------------------------------------------- */

.lq-fuss {
    background: var(--lq-tief);
    color: #cddbe6;
    margin-top: 4rem;
    padding: 2.5rem 0 2rem;
}

.lq-fuss a { color: #fff; text-decoration: none; }
.lq-fuss a:hover { text-decoration: underline; }
.lq-fuss .lq-wortmarke { color: #fff; }
.lq-fuss .lq-wortmarke .lq-punkt { color: var(--lq-see-hell); }
.lq-fuss-klein { color: #8ba6ba; font-size: .875rem; }

/* --- Formulare ---------------------------------------------------------- */

.lq-formkarte {
    max-width: 30rem;
    margin-inline: auto;
    border: 1px solid var(--lq-rand);
    border-radius: var(--lq-radius);
    padding: clamp(1.25rem, 1rem + 2vw, 2rem);
    box-shadow: var(--lq-schatten);
}

.lq-formkarte-breit { max-width: 42rem; }

.form-control:focus, .form-check-input:focus, .form-select:focus {
    border-color: var(--lq-see-hell);
    box-shadow: 0 0 0 .2rem rgba(46, 125, 107, .18);
}

.form-check-input:checked { background-color: var(--lq-see); border-color: var(--lq-see); }

/* Das Anbieter-Haekchen in der Registrierung ist die wichtigste Conversion der
   Seite und bekommt deshalb einen eigenen Rahmen statt einer Zeile im Fliesstext. */
.lq-anbieter-haken {
    background: var(--lq-sand);
    border: 1px solid var(--lq-sand-tief);
    border-radius: var(--lq-radius);
    padding: 1rem;
}

/* ============================================================================
   Bausteine der Spieler-Landing.

   Die Startseite war bis zur Landing-Umstellung eine Weiche mit zwei Tueren
   ("Ich will spielen" / "Ich habe einen Platz"). Der Block dafuer stand hier und
   ist entfallen: die Wurzel gehoert jetzt den Spielern, der Anbieter kommt ueber
   die Kopfzeile und den Streifen am Seitenende.
   ============================================================================ */

/* Anker unter der klebenden Kopfzeile: ohne scroll-margin verschwindet die
   Ueberschrift des Sprungziels hinter der Leiste. */
section[id] { scroll-margin-top: 5.5rem; }

/* Der Kasten ohne Nummer. .lq-schritt sieht genauso aus, zaehlt aber einen
   Counter hoch — ausserhalb eines .lq-schritte-Rasters steht dann eine Zahl da,
   die nichts bedeutet. */
.lq-kasten {
    background: var(--lq-weiss);
    border: 1px solid var(--lq-rand);
    border-radius: var(--lq-radius);
    padding: clamp(1.25rem, 1rem + 1.5vw, 2rem);
}

.lq-kasten > :last-child { margin-bottom: 0; }
.lq-kasten p { color: var(--lq-text-leise); }

/* Die Zusagenliste: die zwei bis drei Einwaende, die einen Kauf kosten, direkt
   am Knopf. Haken statt Punkten, weil sie gelesen werden, ohne gelesen zu
   werden. */
.lq-zusagen {
    list-style: none;
    margin: 0;
    padding: 0;
    font-size: .925rem;
    color: var(--lq-text-leise);
}

.lq-zusagen li {
    padding-left: 1.5rem;
    position: relative;
}

.lq-zusagen li + li { margin-top: .35rem; }

.lq-zusagen li::before {
    content: "✓";
    position: absolute;
    left: 0;
    color: var(--lq-see);
    font-weight: 700;
}

/* ---- Die Rally-Kachel -------------------------------------------------------
   Die ganze Kachel ist der Link, nicht ein Knopf darin: auf dem Handy ist das
   der Unterschied zwischen einem Ziel von 44 px und einem von 300.
   ---------------------------------------------------------------------------- */

.lq-kachel {
    display: flex;
    flex-direction: column;
    height: 100%;
    overflow: hidden;
    border: 1px solid var(--lq-rand);
    border-radius: 16px;
    background: var(--lq-weiss);
    color: inherit;
    text-decoration: none;
    box-shadow: 0 2px 4px rgba(0, 0, 0, .04), 0 12px 32px rgba(0, 0, 0, .06);
    transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}

.lq-kachel:hover,
.lq-kachel:focus-visible {
    transform: translateY(-3px);
    box-shadow: 0 4px 8px rgba(0, 0, 0, .06), 0 20px 44px rgba(0, 0, 0, .10);
    border-color: var(--lq-see);
    color: inherit;
}

/* Der Rueckfall fuer jede Kachel ohne Titelbild — und das sind am Anfang die
   meisten. Der Streifen deutet das Theme des Spiels an, damit die Kachel nicht
   als leerer Kasten anfaengt. Hat die Rally ein Bild, steht dort stattdessen
   ein <img class="lq-bild lq-bild-3-2">; die Kachel klippt es ueber ihr eigenes
   overflow: hidden auf die runde Ecke. */
.lq-kachel-farben {
    display: block;
    height: .6rem;
    position: relative;
}

.lq-kachel-farben span {
    position: absolute;
    inset: 0 auto 0 0;
    width: 45%;
    display: block;
}

.lq-kachel-inhalt {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    padding: clamp(1.25rem, 1rem + 1vw, 1.75rem);
}

.lq-kachel-ort {
    font-size: .8125rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--lq-text-leise);
    margin-bottom: .4rem;
}

.lq-kachel-titel {
    font-size: 1.3rem;
    margin: 0 0 .35rem;
}

.lq-kachel-unter {
    font-weight: 600;
    margin-bottom: .5rem;
}

.lq-kachel-teaser {
    color: var(--lq-text-leise);
    margin-bottom: 1rem;
}

/* mt-auto von Hand: Wegdaten, Preis und Aufforderung sitzen unten buendig, damit
   die Kacheln einer Reihe gleich hoch wirken, auch bei verschieden langen
   Teasern. */
.lq-kachel-weg {
    margin-top: auto;
    padding-top: .75rem;
    font-family: var(--lq-schrift-fest);
    font-size: .8125rem;
    letter-spacing: -.01em;
    color: var(--lq-text-leise);
}

/* Preis links, Aufforderung rechts, dazwischen die gestrichelte Linie einer
   Karte. Der Preis steht damit auf einer eigenen Zeile und nicht mehr in einer
   Aufzaehlung mit der Streckenlaenge — er ist die Zahl, die entscheidet. */
.lq-kachel-fuss {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1rem;
    margin-top: .75rem;
    padding-top: .85rem;
    border-top: 1px dashed var(--lq-linie);
}

.lq-kachel-preis strong {
    display: block;
    font-family: var(--lq-schrift-titel);
    font-size: 1.45rem;
    line-height: 1.1;
    color: var(--lq-tief);
}

.lq-kachel-preis span {
    display: block;
    font-size: .8125rem;
    color: var(--lq-text-leise);
}

.lq-kachel-mehr {
    font-weight: 600;
    color: var(--lq-see);
    white-space: nowrap;
}

.lq-kachel-mehr::after { content: " →"; }

/* ---- Der Streifen ----------------------------------------------------------
   Fuer den Uebergang zur anderen Zielgruppe am Seitenende und fuer Abschnitte,
   die sich vom weissen Fliesstext abheben sollen, ohne eine Kachel zu sein.
   ---------------------------------------------------------------------------- */

.lq-band {
    background: var(--lq-sand);
    border: 1px solid var(--lq-sand-tief);
    border-radius: var(--lq-radius);
    padding: clamp(1.5rem, 1rem + 2vw, 2.5rem);
}

.lq-band > :last-child { margin-bottom: 0; }

/* ---- Klebende Kaufleiste ---------------------------------------------------
   Nur auf dem Handy und nur auf der Rally-Landing. Sie ist bewusst immer da und
   erscheint nicht erst nach einem Scroll-Event: eine Leiste, die von JavaScript
   eingeblendet wird, flackert auf langsamen Geraeten und fehlt genau dann, wenn
   das Skript noch nicht geladen ist.
   ---------------------------------------------------------------------------- */

.lq-kauf-leiste {
    position: fixed;
    inset: auto 0 0 0;
    z-index: 1030;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: .75rem 1rem calc(.75rem + env(safe-area-inset-bottom));
    background: var(--lq-weiss);
    border-top: 1px solid var(--lq-rand);
    box-shadow: 0 -4px 16px rgba(18, 49, 74, .10);
}

/* Denselben Rand wie der Container, sonst steht der Preis in der Leiste weiter
   aussen als alles darueber. Die Regel steht HIER und nicht oben beim
   Container-Rand: dort stuende sie vor der padding-Kurzschreibweise der Leiste,
   und die ueberschriebe sie wieder — gleiche Spezifitaet, spaeter im Dokument
   gewinnt. */
@media (max-width: 575.98px) {
    .lq-kauf-leiste { padding-inline: 1.25rem; }
}

.lq-kauf-leiste-preis { line-height: 1.2; }
.lq-kauf-leiste-preis strong { font-family: var(--lq-schrift-titel); font-size: 1.25rem; }
.lq-kauf-leiste-preis span { display: block; font-size: .8125rem; color: var(--lq-text-leise); }
.lq-kauf-leiste .btn { white-space: nowrap; }

/* Platz fuer die Leiste, damit sie den letzten Absatz nicht verdeckt. Ab lg ist
   sie ausgeblendet (d-lg-none), also braucht es dort keinen Platz. */
@media (max-width: 991.98px) {
    .lq-mit-kaufleiste { padding-bottom: 6rem !important; }
}

/* ---- Abschnittskopf --------------------------------------------------------
   Ueberschrift plus ein Satz, der sie einordnet. Die Breitenbegrenzung ist
   nicht Kosmetik: ueber 60 Zeichen pro Zeile findet das Auge den Zeilenanfang
   nicht mehr zuverlaessig.
   ---------------------------------------------------------------------------- */

.lq-abschnittkopf { margin-bottom: 2rem; }
.lq-abschnittkopf h2 { margin-bottom: .5rem; }
.lq-abschnittkopf p { color: var(--lq-text-leise); max-width: 62ch; margin-bottom: 0; }

/* ---- Bilder ----------------------------------------------------------------
   Feste Seitenverhaeltnisse plus width/height im Markup: sonst springt das
   Layout beim Laden, und genau das bestraft jede Messung der Ladequalitaet.
   object-fit deckt den Rahmen ab, egal welchen Ausschnitt ein spaeter getauschtes
   Foto hat.
   ---------------------------------------------------------------------------- */

.lq-bild {
    display: block;
    width: 100%;
    height: auto;
    object-fit: cover;
    background: var(--lq-sand);
}

.lq-bild-4-3 { aspect-ratio: 4 / 3; }
.lq-bild-3-2 { aspect-ratio: 3 / 2; }

/* Das Titelbild einer Rally, oben auf /rally/{slug}. Breiter als die anderen
   Rahmen, weil es ueber die ganze Spalte laeuft und ein 4:3 dort einen halben
   Bildschirm hoch waere — der Preis stuende dann unter der Falz. */
.lq-bild-16-9 { aspect-ratio: 16 / 9; }

/* Freistehend, also mit eigener Ecke und eigenem Schatten. In einer Bildkarte
   sitzt das Bild dagegen bündig unter dem Kartenrand. */
.lq-bild-gerahmt {
    border-radius: 16px;
    box-shadow: 0 2px 4px rgba(18, 49, 74, .05), 0 18px 40px rgba(18, 49, 74, .10);
}

/* ---- Bildkarte -------------------------------------------------------------
   Bild oben, Text darunter. Anders als .lq-kachel ist sie kein Link: sie
   erzaehlt etwas und fuehrt nicht weiter, deshalb auch kein Hover-Anheben —
   eine Flaeche, die sich beim Darueberfahren bewegt, verspricht einen Klick.
   ---------------------------------------------------------------------------- */

.lq-bildkarte {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    background: var(--lq-weiss);
    border: 1px solid var(--lq-rand);
    border-radius: 16px;
    box-shadow: 0 1px 2px rgba(18, 49, 74, .04), 0 10px 26px rgba(18, 49, 74, .06);
}

.lq-bildkarte-inhalt {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    padding: clamp(1.1rem, 1rem + .8vw, 1.5rem);
}

.lq-bildkarte-inhalt h3 { font-size: 1.2rem; margin-bottom: .35rem; }
.lq-bildkarte-inhalt p { color: var(--lq-text-leise); }
.lq-bildkarte-inhalt > :last-child { margin-bottom: 0; }

.lq-bildkarte-inhalt .lq-bildkarte-unter {
    font-weight: 600;
    color: var(--lq-text);
    margin-bottom: .6rem;
}

/* ---- Ablaufstreifen --------------------------------------------------------
   Der Ablauf war einmal vier grosse Kacheln weit oben. Er ist jetzt ein
   Streifen weit unten: "aussuchen, E-Mail, losspielen" ist kein Grund zu
   kaufen, sondern die Antwort auf den letzten Einwand.
   ---------------------------------------------------------------------------- */

.lq-ablauf {
    list-style: none;
    margin: 1.25rem 0 0;
    padding: 0;
    display: grid;
    gap: 1.25rem;
    color: var(--lq-text-leise);
}

@media (min-width: 768px) {
    .lq-ablauf { grid-template-columns: repeat(2, 1fr); }
}

@media (min-width: 1200px) {
    .lq-ablauf { grid-template-columns: repeat(4, 1fr); gap: 1.75rem; }
}

.lq-ablauf li { font-size: .9375rem; }
.lq-ablauf strong { color: var(--lq-text); }

.lq-ablauf-nr {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 1.75rem;
    height: 1.75rem;
    margin-bottom: .5rem;
    border-radius: 50%;
    background: var(--lq-weiss);
    border: 1px solid var(--lq-rand);
    color: var(--lq-tief);
    font-family: var(--lq-schrift-titel);
    font-weight: 600;
    font-size: .9rem;
}

/* ============================================================================
   Die Erlebniswelt: alte Expeditionskarte trifft Outdoor-App.

   Die Seite hatte Fotos, Kaesten und Knoepfe — und sah damit aus wie jede
   andere Seite mit Fotos, Kaesten und Knoepfen. Was fehlte, war ein eigener
   Look, den man nach einiger Zeit auch ohne Logo erkennt.

   Die Mittel sind absichtlich billig und alle vier hier versammelt:
   Hoehenlinien im Hintergrund, ein gestrichelter Weg zwischen den Abschnitten,
   Koordinaten in Festbreitenschrift, und eine warme Akzentfarbe gegen das
   Nordsee-Blau. Kein einziges Foto und keine Schriftdatei kommen dazu.

   Und bewusst NICHT kindlich: keine Comic-Schrift, keine Piratenfahne, keine
   Buntheit. Die Eltern kaufen das Produkt, die Kinder spielen es — und ein
   Nachmittag fuer 12,90 Euro muss aussehen wie etwas, das man verschenken kann.
   ============================================================================ */

/* ---- Kartengrund -----------------------------------------------------------
   Hoehenlinien als Hintergrundmotiv. Rein dekorativ, deshalb als CSS-Bild und
   nicht als <img>: es hat keine Bedeutung, die jemandem fehlen wuerde.

   Der Grund liegt in einem eigenen ::before hinter dem Inhalt, damit die Klasse
   den vorhandenen Hintergrund ihres Abschnitts nicht ueberschreibt. Die
   Deckkraft ist so niedrig, dass jeder Text darueber seinen Kontrast behaelt —
   ein Muster, das man liest, ist kein Hintergrund mehr.
   ---------------------------------------------------------------------------- */

.lq-kartengrund {
    position: relative;
    isolation: isolate;
}

.lq-kartengrund::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background: url("/img/hoehenlinien.svg") no-repeat right -8% top -20%;
    background-size: min(150%, 1400px) auto;
    opacity: .42;
    pointer-events: none;
    /* Der Kasten, den .lq-band und .lq-nacht runden — sonst stehen die Linien
       ueber die Ecke hinaus. inherit greift auch, wo kein Radius gesetzt ist. */
    border-radius: inherit;
}

/* Im dunklen Band gehen die sandfarbenen Linien unter. mix-blend-mode hebt sie
   heraus, ohne dass es eine zweite SVG-Datei in einer zweiten Farbe braucht. */
.lq-nacht.lq-kartengrund::before {
    opacity: .22;
    mix-blend-mode: screen;
}

/* ---- Die Marke ueber der Ueberschrift --------------------------------------
   Der kleine gesperrte Vorspann ("Was ihr eigentlich kauft"). Er ordnet den
   Abschnitt ein, bevor die Ueberschrift ihn benennt, und er ist neben dem
   Kartengrund das zweite wiedererkennbare Element der Seite.

   Ein <div> und keine Ueberschrift: es steht in der Gliederung nichts, es ist
   ein Etikett. Farbe ist --lq-kompass-tief, nicht --lq-kompass — hier traegt
   die Akzentfarbe Text.
   ---------------------------------------------------------------------------- */

.lq-marke {
    font-family: var(--lq-schrift-fest);
    font-size: .75rem;
    text-transform: uppercase;
    letter-spacing: .12em;
    color: var(--lq-kompass-tief);
    margin-bottom: .6rem;
    display: flex;
    align-items: center;
    gap: .6rem;
}

/* Der Strich hinter der Marke laeuft aus wie eine Wegmarkierung. */
.lq-marke::after {
    content: "";
    flex: 0 1 3.5rem;
    height: 0;
    border-top: 1px dashed currentColor;
    opacity: .55;
}

/* Auf dunklem Grund: das Terrakotta hat dort keinen Kontrast mehr. */
.lq-marke-hell { color: #e8c3a8; }

/* ---- Der gestrichelte Weg zwischen zwei Abschnitten ------------------------
   Er macht aus einer Folge von Kaesten eine Route. Ein leeres <div> mit
   aria-hidden, weil es nichts ist, was jemand vorgelesen bekommen will.

   background-size "auto 100%" haelt das Seitenverhaeltnis der SVG fest, die
   Hoehe des Elements bestimmt also die Breite. Auf schmalen Schirmen ragt der
   Weg damit ueber den Rand hinaus und wird beschnitten — das ist gewollt: ein
   Weg, der am Bildrand weitergeht, sieht richtiger aus als einer, der auf 200
   Pixel gestaucht wurde.
   ---------------------------------------------------------------------------- */

.lq-wegstrich {
    height: 4.5rem;
    background: url("/img/wegstrich.svg") no-repeat center center;
    background-size: auto 100%;
}

@media (max-width: 575.98px) {
    .lq-wegstrich { height: 3rem; }
}

/* ---- Die Kartennadel -------------------------------------------------------
   Vor jedem Ortsnamen — in der Kachel und in der Ortsliste. Aus einem
   Randradius gebaut statt aus einer Grafik: eine Nadel ist ein Kreis mit einer
   Spitze, und dafuer laedt niemand eine Datei.
   ---------------------------------------------------------------------------- */

.lq-nadel {
    display: inline-block;
    width: .55rem;
    height: .55rem;
    margin-right: .45rem;
    background: var(--lq-kompass);
    border-radius: 50% 50% 50% 0;
    transform: rotate(-45deg);
    flex: 0 0 auto;
}

/* baseline und nicht center: ein langer Ortsname bricht auf zwei Zeilen um, und
   eine mittig ausgerichtete Nadel saesse dann zwischen den Zeilen statt vor dem
   Namen. */
.lq-kachel-ort { display: flex; align-items: baseline; }

/* ---- Held ------------------------------------------------------------------ */

/* Die Kompassrose sitzt ueber der unteren linken Ecke des Heldenbildes und
   ragt bewusst darueber hinaus. Auf dem Handy ist sie weg: dort ist das Bild
   halb so gross, und ein Siegel, das ein Viertel davon verdeckt, ist kein
   Siegel mehr, sondern ein Fleck.

   Es ist img/logo.svg, dieselbe Datei wie die Marke in der Kopfzeile — nur
   gross. Der Schatten liegt deshalb als filter am Bild und nicht im SVG: eine
   Rose mit eingebautem Schatten koennte in der Kopfzeile nicht stehen. */
.lq-heldbild { position: relative; }

.lq-kompassrose {
    position: absolute;
    left: -1.25rem;
    bottom: -1.25rem;
    filter: drop-shadow(0 6px 16px rgba(18, 49, 74, .18));
}

@media (max-width: 575.98px) {
    .lq-kompassrose { display: none; }
}

/* Die drei Zusagen unter dem Knopf: eine Zeile, drei Worte, durch Wegpunkte
   getrennt. Sie beantworten die Einwaende, die zwischen dem Knopf und dem
   Klick stehen — laenger als drei Worte waeren sie eine Aufzaehlung, die man
   liest statt ueberfliegt. */
.lq-versprechen {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .35rem .9rem;
    font-family: var(--lq-schrift-fest);
    font-size: .8125rem;
    letter-spacing: .02em;
    color: var(--lq-text-leise);
}

.lq-versprechen li { display: flex; align-items: center; gap: .9rem; }

.lq-versprechen li + li::before {
    content: "";
    width: .3rem;
    height: .3rem;
    border-radius: 50%;
    background: var(--lq-kompass);
}

/* Die Ortszeile im Held: "Schon spielbar in: Walsrode, Lueneburg, ...".
   Getrennt wird ueber den Abstand und nicht ueber ein Zeichen im Markup — ein
   Trennpunkt im Text ist Text, den ein Screenreader mitspricht. */
.lq-orte-kurz {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: .3rem .75rem;
    font-size: .9375rem;
    color: var(--lq-text-leise);
}

.lq-orte-kurz > span { font-weight: 600; }
.lq-orte-kurz a { text-decoration: none; border-bottom: 1px dashed var(--lq-linie); }
.lq-orte-kurz a:hover { border-bottom-color: var(--lq-see); }

/* ---- Das dunkle Band -------------------------------------------------------
   "Jeder Ort hat eine Geschichte." Der einzige Abschnitt der Seite auf dunklem
   Grund, und das ist seine Aufgabe: er teilt die Seite in ein Oben (der Held)
   und ein Unten (das Angebot) und markiert dazwischen, was hier eigentlich
   verkauft wird.
   ---------------------------------------------------------------------------- */

.lq-nacht {
    background: var(--lq-tief);
    color: #dce7ef;
}

.lq-nacht h2, .lq-nacht h3 { color: #fff; }
.lq-nacht p { color: #b9cddb; }

.lq-nacht-kopf { max-width: 46ch; }
.lq-nacht-kopf h2 { font-size: clamp(1.75rem, 1.3rem + 1.8vw, 2.6rem); }
.lq-nacht-kopf p { font-size: 1.05rem; margin-bottom: 0; }

/* Die drei Sorten Geschichte. Kein Rahmen und kein Hintergrund: sie sind
   Aussagen und keine Knoepfe — es gibt keine Kategorie an einer Rally, nach
   der man hier filtern koennte, und eine Kachel, die aussieht wie ein Link,
   verspricht genau das. */
.lq-sorte { padding-top: 1.25rem; border-top: 1px solid rgba(255, 255, 255, .18); }
.lq-sorte h3 { font-size: 1.25rem; margin: .85rem 0 .4rem; }
.lq-sorte p { margin-bottom: 0; font-size: .9375rem; }
.lq-sorte .lq-zeichen { color: #e0a06d; }

/* ---- Die Zeichen ----------------------------------------------------------- */

.lq-zeichen {
    display: block;
    width: 1.75rem;
    height: 1.75rem;
    color: var(--lq-kompass-tief);
}

/* ---- Die Ortsliste ---------------------------------------------------------
   Die Karte in Textform. Jeder Eintrag ist ein echter Link — das ist der
   zweite Grund fuer diese Liste: sie ist neben den Kacheln der einzige Weg,
   auf dem ein Crawler zu einer Rally-Seite kommt.
   ---------------------------------------------------------------------------- */

.lq-ortliste {
    list-style: none;
    margin: 0 0 1.25rem;
    padding: 0;
    display: grid;
    gap: .25rem;
    grid-template-columns: 1fr;
}

@media (min-width: 576px) {
    .lq-ortliste { grid-template-columns: repeat(2, 1fr); column-gap: 1.5rem; }
}

.lq-ortliste a {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .5rem .25rem;
    color: var(--lq-text);
    text-decoration: none;
    border-bottom: 1px dashed var(--lq-linie);
}

.lq-ortliste a:hover, .lq-ortliste a:focus-visible {
    color: var(--lq-see);
    border-bottom-style: solid;
    border-bottom-color: var(--lq-see);
}

.lq-ortliste-name { font-weight: 600; }

/* Die Koordinate wandert ganz nach rechts und wird als Erstes weggelassen,
   wenn der Platz eng wird: sie ist Zierde mit Wahrheitsgehalt, nicht Inhalt. */
.lq-ortliste-koord {
    margin-left: auto;
    font-family: var(--lq-schrift-fest);
    font-size: .75rem;
    color: var(--lq-text-leise);
    white-space: nowrap;
}

.lq-ortliste-zahl {
    font-size: .75rem;
    color: var(--lq-text-leise);
}

@media (max-width: 399.98px) {
    .lq-ortliste-koord { display: none; }
}

.lq-ortliste-fuss { font-size: .9375rem; color: var(--lq-text-leise); }

/* ---- Fuer wen -------------------------------------------------------------- */

.lq-zielgruppe { border-top: 2px solid var(--lq-kompass); padding-top: 1rem; }
.lq-zielgruppe h3 { font-size: 1.1rem; margin: .75rem 0 .35rem; }
.lq-zielgruppe p { color: var(--lq-text-leise); font-size: .9375rem; margin-bottom: 0; }

/* ---- Der Anbieterstreifen --------------------------------------------------
   Dunkel und ohne gruenen Knopf. Er ist die Tuer in die andere Zielgruppe, und
   die soll man als solche erkennen, bevor man sie oeffnet: wer hier einen
   Ausflug sucht, soll nicht versehentlich in einer Geschaeftsanbahnung landen.
   ---------------------------------------------------------------------------- */

.lq-anbieterband {
    background: var(--lq-tief);
    color: #cddbe6;
    border-radius: var(--lq-radius);
    padding: clamp(1.5rem, 1rem + 2vw, 2.5rem);
}

.lq-anbieterband h2 { color: #fff; }
.lq-anbieterband > :last-child { margin-bottom: 0; }
