/* ==========================================================================
   search-card.css — Trefferkarten der Suche (/search-hotels)
   ==========================================================================

   Deckt BEIDE Ansichten ab:
     Teil I  (Abschnitt 1-5) — Ergebnisliste, Karte `div.search-i--container`
     Teil II (Abschnitt 6-10) — Kartenansicht, Karte `div.offers-i--container_map`

   WICHTIG: Diese Datei stylt FREMD-MARKUP.

   Die Karten (`div.search-i--container`) rendern wir nicht selbst. Sie werden
   in `SearchHotels::searchHotelApiNew()` per XPath aus der Ergebnisseite von
   halalbooking.com herausgeschnitten und von `public/frontend/js/search-hotel.js`
   in `#hotel_list .listing-item-container` eingehaengt.

   `public/frontend/css/hotel.css` ist ein alter Abzug des halalbooking-CSS. Das
   heutige Markup benutzt Klassen, die es dort nicht (mehr) gibt — u. a. `.flex`,
   `.search-i-content--container`, `.aggregate-score-container`, `.slider*`.
   Deshalb liegen unsere Korrekturen hier in einer eigenen Datei statt in der
   Fremdkopie: so bleibt trennbar, was von halalbooking stammt und was von uns.

   Diese Datei wird in `resources/views/layouts/app.blade.php` NACH `hotel.css`
   eingebunden und gewinnt dadurch bei gleicher Spezifitaet.

   Erwartete Markup-Struktur (verifiziert am 2026-08-05 gegen die Live-Seite):

     div.search-i--container
       div.search-i.search-i_link.card_link
         div.save-property                    <- Merkzettel-Herz
         a.flex
           div.search-i-img--container
             div.slider > div.slider--track > n x div.slider--item > img.search-i-img
             div.slider--arrow_prev / _next, div.slider--dots
             div.aggregate-score-container
               div.aggregate-score            <- Label ("Gut") + Anzahl Bewertungen
               div.property-score             <- Note ("7,4")
           div.search-i-content--container    <- Titel, Ort, Halal-Merkmale, Preis

   Benennt halalbooking diese Klassen um, bricht die Karte erneut — dann ist die
   Struktur oben der Vergleichspunkt. Siehe tasks/04-design-fix/spec.md.
   ========================================================================== */


/* --------------------------------------------------------------------------
   1. Karte als zweispaltige Flex-Zeile
   -------------------------------------------------------------------------- */

.search-i {
    overflow: hidden;
    border-radius: 10px;
}

/* Der Link umschliesst Bild- und Textspalte. `a.flex` kommt aus dem Fremd-Markup
   ohne passende Regel und ist sonst `display:inline`. */
.search-i > a.flex {
    display: flex;
    align-items: stretch;
    width: 100%;
    color: inherit;
    text-decoration: none;
}

/* Merkzettel-Herz darf die Flex-Zeile nicht als eigene Spalte aufbrechen. */
.search-i > .save-property {
    position: absolute;
    z-index: 4;
    top: 10px;
    right: 10px;
}


/* --------------------------------------------------------------------------
   2. Bildspalte — volle Kartenhoehe statt kollabierter Slider-Hoehe
   -------------------------------------------------------------------------- */

/* Hebt die alte Regel aus hotel.css auf (position:absolute; width:240px). */
.search-i .search-i-img--container {
    position: relative;
    z-index: 1;
    top: auto;
    left: auto;
    flex: 0 0 280px;
    align-self: stretch;
    width: 280px;
    min-height: 260px;
    height: auto;
    overflow: hidden;
    background-color: #eee;
}

.search-i .search-i-img--container .slider,
.search-i .search-i-img--container .slider--track,
.search-i .search-i-img--container .slider--item {
    position: static;
    height: auto;
}

/* Ohne halalbookings Slider-JS ist nur die erste Slide sinnvoll. Die uebrigen
   `<img>` haben kein `data-src` und wuerden je nach Browser als kaputtes Bild
   samt Alt-Text ueber dem Foto liegen (siehe search-hotel.js). */
.search-i .search-i-img--container .slider--item:not(:first-child),
.search-i .search-i-img--container .slider--arrow,
.search-i .search-i-img--container .slider--dots {
    display: none;
}

.search-i img.search-i-img {
    position: absolute;
    z-index: 1;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: 0;
}

/* Weicher Verlauf am oberen Bildrand, damit das Bewertungs-Badge auch auf
   hellen Fotos (Himmel, Strand) lesbar bleibt. */
.search-i .search-i-img--container:before {
    content: "";
    position: absolute;
    z-index: 2;
    left: 0;
    top: 0;
    width: 100%;
    height: 90px;
    background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0));
    pointer-events: none;
}


/* --------------------------------------------------------------------------
   3. Textspalte
   -------------------------------------------------------------------------- */

.search-i .search-i-content--container {
    flex: 1 1 auto;
    min-width: 0;
    padding: 15px;
    text-align: left;
}

/* Alte Regel aus hotel.css: margin-left:240px fuer die inzwischen weggefallene
   Aufteilung. Innerhalb der Flex-Zeile ist der Einzug falsch. */
.search-i .search-i-content {
    margin-left: 0;
    padding: 0;
}


/* --------------------------------------------------------------------------
   4. Bewertungs-Badge (ersetzt den orangen Balken)
   -------------------------------------------------------------------------- */

/* GEMEINSAM MIT DER KARTENANSICHT (Teil II).
   Jede Regel hier nennt beide Kontexte — `.search-i` (Ergebnisliste) und
   `.offers-i_map` (Kartenansicht) —, damit das Badge in beiden Ansichten aus
   denselben Deklarationen entsteht und nicht auseinanderlaufen kann. Neue
   Badge-Eigenschaften bitte immer in diesen Block und immer mit beiden
   Selektoren. Nur die Positionierung des Badges unterscheidet sich, weil das
   Fremd-Markup den Container unterschiedlich einhaengt (siehe Abschnitt 9). */

.search-i .aggregate-score-container,
.offers-i_map .aggregate-score-container {
    position: absolute;
    z-index: 3;
    left: 10px;
    top: 10px;
    display: flex;
    /* `.property-score` (die Note) steht im Markup NACH dem Label — mit
       row-reverse steht die Zahl links, Label und Anzahl rechts daneben. */
    flex-direction: row-reverse;
    align-items: center;
    gap: 8px;
    max-width: calc(100% - 20px);
    border-radius: 10px;
    padding: 6px 10px;
    background-color: rgba(17, 17, 17, 0.8);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
    color: #fff;
    text-align: left;
}

@supports ((-webkit-backdrop-filter: blur(6px)) or (backdrop-filter: blur(6px))) {
    .search-i .aggregate-score-container,
    .offers-i_map .aggregate-score-container {
        background-color: rgba(17, 17, 17, 0.62);
        -webkit-backdrop-filter: blur(6px);
        backdrop-filter: blur(6px);
    }
}

/* Hotels ohne Bewertung duerfen kein leeres Badge zeigen. */
.search-i .aggregate-score-container:empty,
.offers-i_map .aggregate-score-container:empty {
    display: none;
}

.search-i .aggregate-score-container:not(:has(.property-score)),
.offers-i_map .aggregate-score-container:not(:has(.property-score)) {
    display: none;
}

/* Die Note: oranger Balken raus, grosse Zahl rein. */
.search-i .aggregate-score-container .property-score,
.offers-i_map .aggregate-score-container .property-score {
    flex-shrink: 0;
    border-radius: 0;
    padding: 0;
    background-color: transparent;
    color: #fff;
    font-size: 20px;
    font-weight: 700;
    line-height: 1.1;
}

/* Label ("Gut" / "Sehr gut") und Anzahl der Bewertungen. */
.search-i .aggregate-score-container .aggregate-score,
.offers-i_map .aggregate-score-container .aggregate-score {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    float: none;
    min-width: 0;
    color: #fff;
    line-height: 1.25;
    font-size: 13px;
    text-align: left;
    text-decoration: none;
}

.search-i .aggregate-score-container .aggregate-score > *,
.offers-i_map .aggregate-score-container .aggregate-score > * {
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Zweite Zeile (Anzahl der Bewertungen) leicht zurueckgenommen. */
.search-i .aggregate-score-container .aggregate-score > * + *,
.offers-i_map .aggregate-score-container .aggregate-score > * + * {
    color: rgba(255, 255, 255, 0.78);
    font-size: 12px;
}

.search-i .aggregate-score-container .aggregate-score--all,
.search-i .aggregate-score-container .aggregate-score--label,
.offers-i_map .aggregate-score-container .aggregate-score--all,
.offers-i_map .aggregate-score-container .aggregate-score--label {
    max-width: 100%;
    color: inherit;
    text-decoration: none;
}


/* --------------------------------------------------------------------------
   5. Schmale Viewports — Karte stapelt, Bild oben in voller Breite
   -------------------------------------------------------------------------- */

@media (max-width: 1024px) {
    .search-i > a.flex {
        display: block;
    }

    .search-i .search-i-img--container {
        flex: none;
        width: 100%;
        height: 220px;
        min-height: 0;
    }

    .search-i .search-i-content--container {
        padding: 12px 15px 15px;
    }
}


/* ==========================================================================
   TEIL II — Kartenansicht (Liste neben der Google-Map)
   ==========================================================================

   Auch hier Fremd-Markup: `SearchHotels::getMapPlaces()` schneidet die Karten
   (`div.offers-i--container_map`) aus dem Turbo-Frame `offers_map_search_results`
   von halalbooking.com heraus, `getPlacesMap()` in `search-hotel.js` haengt sie
   in `.googleMapList` (Desktop) bzw. `.hotelMobileMap` (mobiles Modal) ein.

   Es ist ein ANDERER Klassensatz als in der Ergebnisliste (`.offers-i`, `.card*`
   statt `.search-i*`) — er fehlt in `hotel.css` genauso. Ziel ist trotzdem
   dieselbe Optik: das Badge kommt aus Abschnitt 4, hier stehen nur Layout und
   die groessenbedingten Abweichungen (schmalere Spalte).

   Erwartete Markup-Struktur (verifiziert am 2026-08-06 gegen die Live-Seite):

     div.offers-i--container.offers-i--container_map     <- data-id via JS
       a.offers-i.offers-i_map.card.card_outer
         div.card--image--container
           div.slider > div.slider--track > div.slider--item > img.card--image
         div.card--header
           div…flex > span.font-large-body   <- Hotelname
                    > div.stars              <- Sterne
           div.location                      <- "Afyon, Tuerkei" + svg
         div > div.card--footer              <- Preis, Konditionen, Zimmer
         div.aggregate-score-container       <- Label + Anzahl + Note
           (im Markup DIREKTES Kind des Links, nicht im Bildcontainer!)

   Siehe tasks/05-kartenansicht-design/spec.md.
   ========================================================================== */


/* --------------------------------------------------------------------------
   6. Karte — gestapelt, linksbuendig
   -------------------------------------------------------------------------- */

.offers-i--container_map {
    overflow: hidden;
    border-radius: 10px;
    background-color: #fff;
}

/* Der Link umschliesst die gesamte Karte und traegt das absolut positionierte
   Badge (Abschnitt 9). Die Zentrierung kommt geerbt von aussen. */
.offers-i--container_map > a.offers-i_map {
    position: relative;
    display: block;
    overflow: hidden;
    border-radius: 10px;
    color: inherit;
    text-align: left;
    text-decoration: none;
}


/* --------------------------------------------------------------------------
   7. Bildspalte — volle Breite, feste Hoehe (wie die gestapelte Liste)
   -------------------------------------------------------------------------- */

/* 200px statt der 220px aus Abschnitt 5: die Spalte ist mit 290px deutlich
   schmaler, so bleiben mehr Treffer gleichzeitig sichtbar. */
.offers-i_map .card--image--container {
    position: relative;
    width: 100%;
    height: 200px;
    overflow: hidden;
    background-color: #eee;
}

.offers-i_map .card--image--container .slider,
.offers-i_map .card--image--container .slider--track,
.offers-i_map .card--image--container .slider--item {
    position: static;
    width: 100%;
    height: 100%;
}

/* `getMapPlaces()` reduziert serverseitig bereits auf die erste Slide und
   entfernt Pfeile/Dots — defensiv trotzdem, falls sich das Fremd-HTML aendert. */
.offers-i_map .card--image--container .slider--item:not(:first-child),
.offers-i_map .card--image--container .slider--arrow,
.offers-i_map .card--image--container .slider--dots {
    display: none;
}

.offers-i_map img.card--image {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: 0;
}

/* Verlauf am oberen Bildrand — identisch zur Ergebnisliste, damit das Badge
   auch auf hellen Fotos lesbar bleibt. */
.offers-i_map .card--image--container:after {
    content: "";
    position: absolute;
    z-index: 2;
    left: 0;
    top: 0;
    width: 100%;
    height: 90px;
    background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0));
    pointer-events: none;
}


/* --------------------------------------------------------------------------
   8. Inline-SVGs neutralisieren
   -------------------------------------------------------------------------- */

/* Die Icons referenzieren per `<use>` das Sprite `/sprite/desktop` VON
   halalbooking — auf unserem Server existiert es nicht, sie sind also ohnehin
   leer. Ohne width/height rendert der Browser sie mit der SVG-Default-Groesse
   300x150px; das war der groesste Teil des Leerraums (Karte 672px statt ~340px).
   In der Ergebnisliste sind dieselben SVGs bereits ausgeblendet — hier also
   das gleiche Verhalten. */
.offers-i--container_map svg {
    display: none;
}


/* --------------------------------------------------------------------------
   9. Bewertungs-Badge — Positionierung
   -------------------------------------------------------------------------- */

/* Aussehen kommt vollstaendig aus Abschnitt 4. Anders als in der Ergebnisliste
   haengt `.aggregate-score-container` hier NICHT im Bildcontainer, sondern als
   letztes Kind am Link — deshalb wird es per CSS auf das Foto geholt. Das
   Fremd-Markup selbst bleibt unangetastet. */
.offers-i_map > .aggregate-score-container {
    position: absolute;
    z-index: 3;
    left: 10px;
    top: 10px;
    max-width: calc(100% - 20px);
}


/* --------------------------------------------------------------------------
   10. Textblock — Hierarchie, Abstaende
   -------------------------------------------------------------------------- */

.offers-i_map .card--header {
    padding: 12px 14px 0;
}

.offers-i_map .card--footer {
    padding: 0 14px 12px;
}

/* Hotelname */
.offers-i_map .card--header .font-large-body {
    display: block;
    overflow: hidden;
    font-size: 15px;
    font-weight: 600;
    line-height: 1.3;
    text-overflow: ellipsis;
}

/* Sterne duerfen den Namen nicht auf eine eigene Zeile druecken. */
.offers-i_map .card--header .stars {
    display: inline-block;
    vertical-align: middle;
    margin-left: 6px;
}

/* Ort */
.offers-i_map .location {
    display: block;
    margin: 4px 0 0;
    color: #7d7d7d;
    font-size: 13px;
    line-height: 1.35;
}

/* Preis */
.offers-i_map .card--footer .font-headline {
    font-size: 17px;
    font-weight: 600;
    line-height: 1.3;
}

/* Konditionen ("1 Nacht, Steuern und Gebuehren inbegriffen") und Zimmername */
.offers-i_map .card--footer .comma-separated,
.offers-i_map .card--footer .plus-separated {
    color: #7d7d7d;
    font-size: 12px;
    line-height: 1.35;
}

/* halalbooking setzt die Trennzeichen dieser Listen per CSS — die Regel fehlt in
   unserer `hotel.css`-Kopie. Ohne sie kleben die Teile aneinander:
   "1 Nachtsteuern und gebuehren inbegriffen" / "1 gecevergi ve ucretler dahildir".

   GEMEINSAM MIT DER ERGEBNISLISTE: dort tritt derselbe Fehler auf
   ("1 Nacht2 Gaestesteuern und gebuehren inbegriffen"). */
.offers-i_map .comma-separated + .comma-separated:before,
.search-i .comma-separated + .comma-separated:before {
    content: ", ";
}

.offers-i_map .plus-separated + .plus-separated:before,
.search-i .plus-separated + .plus-separated:before {
    content: " + ";
}

/* Container, die nach dem Ausblenden der SVGs leer zurueckbleiben, sollen
   keinen Abstand mehr erzeugen. */
.offers-i_map .card--footer .flex_justify-center:empty,
.offers-i_map .card--footer .flex_empty-hidden:empty {
    display: none;
}

.offers-i_map .card--footer > * + * {
    margin-top: 4px;
}


/* --------------------------------------------------------------------------
   11. Hover — Karte und zugehoeriger Marker gehoeren sichtbar zusammen
   -------------------------------------------------------------------------- */

/* `.visibleItem` setzt `search-hotel.js` beim Hovern; parallel dazu laeuft die
   Bounce-Animation des Markers (unveraendert). Der alte rote Streuschatten
   (-1px 0 17px 3px #cb38386b) passt nicht mehr zur neuen Karte.

   BEWUSST OHNE `transform`: die Karte bekommt beim Klick auf einen Marker
   zusaetzlich `.bounce-animation`, deren Keyframes `transform` animieren — ein
   eigener `translateY` hier wuerde damit kollidieren. Hervorhebung daher nur
   ueber Schatten und Rahmen. */
.offers-i--container_map {
    transition: box-shadow 0.2s ease, outline-color 0.2s ease;
}

.offers-i--container_map.visibleItem {
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.22);
    outline: 2px solid #4db85e;
    outline-offset: -2px;
}


/* --------------------------------------------------------------------------
   12. Mobiles Karten-Modal — dieselben Karten als horizontaler Streifen
   -------------------------------------------------------------------------- */

/* `.hotelMobileMap` ist im Blade als Flex-Zeile unter der Map angelegt: die
   Treffer liegen dort nebeneinander und werden horizontal gescrollt. Optik der
   Karte bleibt identisch, nur Breite und Bildhoehe sind kompakter. */
.hotelMobileMap {
    gap: 10px;
    padding: 10px;
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
}

.hotelMobileMap .offers-i--container_map {
    flex: 0 0 240px;
    width: 240px;
    margin-bottom: 0;
}

.hotelMobileMap .offers-i_map .card--image--container {
    height: 130px;
}

.hotelMobileMap .offers-i_map .card--header {
    padding: 10px 12px 0;
}

.hotelMobileMap .offers-i_map .card--footer {
    padding: 0 12px 10px;
}


/* ==========================================================================
   TEIL III — Textblock der Trefferkarten (Liste UND Kartenansicht)
   ==========================================================================

   Task 06. Teil I/II haben Bild und Bewertungs-Badge in Ordnung gebracht, den
   Textblock aber bewusst unberuehrt gelassen. Hier kommt er dran:

     a) halalbooking-Werbung entfernen          (Abschnitt 13)
     b) Liste: zweispaltig, Preis als Anker     (Abschnitt 14)
     c) Halal-Merkmale als Chips                (Abschnitt 15)
     d) Kartenansicht auf dieselbe Typografie   (Abschnitt 16)

   ACHTUNG — die Kindstruktur von `.search-i-content` ist NICHT einheitlich.
   Gemessen am 2026-08-07 ueber 20 Karten: 4, 8 oder 9 Kinder. Karten mit
   "Nicht verfuegbar" haben nur NAME|ORT|MERKMALE|SONST, eine Karte hatte gar
   keine Sterne. Die Spaltenzuordnung erfolgt deshalb AUSSCHLIESSLICH ueber
   inhaltliche Klassen bzw. `:first-child` und NIEMALS ueber `:nth-child`-
   Positionen. Wer hier etwas aendert: vorher die Kindmuster nachmessen.

   Erwartete Struktur (verifiziert am 2026-08-07):

     div.search-i-content--container
       div.search-i-content
         div.vsec-xxs...      > span.font-title3-suisse + div.stars   <- Name
         div.location
         div.halal-features--container
           div.halal-features > n x div.halal-features--i
                                     > svg + div.halal-features--i-description > b
           div.halal-features-extra                                   <- "+3 weitere"
         div...               > div.offer-discount_default            <- Rabatt
                              > div.offer-discount_subscription       <- GOLD-ABO
                              > b.text--red-700                       <- "Preis steigt"
                              > div.semibold.font-headline            <- Preis
         div...               > span.comma-separated                  <- Konditionen
         div...               > span.plus-separated                   <- Zimmer
         div.vsec-xs                                                  <- Verpflegung
         div.vsec-xs                                                  <- Storno
   ========================================================================== */


/* --------------------------------------------------------------------------
   13. halalbooking-Werbung ausblenden
   -------------------------------------------------------------------------- */

/* GOLDENES PROGRAMM-ICON (G / D / P je nach Stufe) samt Registrierungs-Aufruf
   "Jetzt registrieren um X EUR mehr zu sparen". Das ist halalbookings Abo-
   Programm — auf halal-reisen.de fuehrt der Aufruf ins Leere. Icon und Text
   liegen im selben Block, deshalb faellt der Block als Ganzes weg.
   Kam auf 10 von 20 Karten vor. */
.search-i .offer-discount_subscription,
.offers-i_map .offer-discount_subscription {
    display: none;
}

/* Rabattblock: "-26 %", durchgestrichener Vergleichspreis, rotes Icon. */
.search-i .offer-discount_default,
.offers-i_map .offer-discount_default {
    display: none;
}

/* "Preis steigt in wenigen Stunden" — Verkaufsdruck von halalbooking. Bewusst
   auf den Preisbereich eingegrenzt, damit `.text--red-700` an anderer Stelle
   nicht mitgetroffen wird. */
.search-i .pricing-view-mode-guest .text--red-700,
.offers-i_map .pricing-view-mode-guest .text--red-700 {
    display: none;
}

/* "+3 weitere halal-freundliche Eigenschaften in dieser Unterkunft" — verweist
   auf eine Aufklapp-Funktion, die ohne halalbookings JS nicht funktioniert. */
.search-i .halal-features-extra,
.offers-i_map .halal-features-extra {
    display: none;
}


/* --------------------------------------------------------------------------
   14. Listenansicht — zweispaltig, Preis als Anker
   -------------------------------------------------------------------------- */

.search-i .search-i-content {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 150px;
    /* `dense` ist hier wesentlich: die Kinder der rechten Spalte stehen im
       Markup NACH denen der linken. Ohne dense wuerde die Auto-Platzierung sie
       erst unterhalb der letzten belegten Zeile einsortieren; mit dense fuellen
       sie die freien Zellen der rechten Spalte ab Zeile 1 auf. */
    grid-auto-flow: row dense;
    align-content: start;
    column-gap: 18px;
    row-gap: 2px;
}

/* Standard: rechte Spalte — Preis und alles, was zur Buchung gehoert. */
.search-i .search-i-content > * {
    grid-column: 2;
    text-align: right;
}

/* Linke Spalte: Kopf, Ort, Merkmale — ueber Klassen statt Position. */
.search-i .search-i-content > :first-child,
.search-i .search-i-content > .location,
.search-i .search-i-content > .halal-features--container {
    grid-column: 1;
    text-align: left;
}

/* Hotelname */
.search-i .search-i-content .font-title3-suisse {
    font-size: 17px;
    font-weight: 600;
    line-height: 1.3;
}

.search-i .search-i-content .stars {
    display: inline-block;
    vertical-align: middle;
    margin-left: 6px;
}

/* Ort */
.search-i .search-i-content > .location {
    margin-top: 2px;
    color: #7d7d7d;
    font-size: 13px;
}

/* Konditionen, Zimmer, Verpflegung, Storno — eine gedimmte Stufe. */
.search-i .search-i-content > * + * {
    color: #7d7d7d;
    font-size: 12px;
    line-height: 1.4;
}

/* Ort und Merkmale duerfen davon nicht eingefaerbt werden. */
.search-i .search-i-content > .halal-features--container {
    color: inherit;
    font-size: inherit;
}

/* Preis — groesstes Element des Textblocks. Steht nach der Regel oben, damit
   die gedimmte Stufe ihn nicht ueberschreibt. */
.search-i .search-i-content .font-headline {
    color: #222;
    font-size: 24px;
    font-weight: 700;
    line-height: 1.15;
    white-space: nowrap;
}

/* Der Preis sitzt in verschachtelten Flex-Zeilen, die ihn linksbuendig halten. */
.search-i .search-i-content .pricing-view-mode-guest,
.search-i .search-i-content .flex_align-baseline {
    display: block;
    text-align: right;
}

/* Storno-Hinweis neutral statt alarmierend. */
.search-i .search-i-content .regular {
    color: inherit;
}


/* --------------------------------------------------------------------------
   15. Halal-Merkmale als Chips
   -------------------------------------------------------------------------- */

.search-i .halal-features {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-top: 8px;
}

.search-i .halal-features--i {
    align-items: center;
    border-radius: 999px;
    padding: 4px 10px;
    background-color: #f1f5f2;
    color: #2f6b3a;
}

/* Ab dem 5. Merkmal ausblenden — haelt die Kartenhoehe stabil. */
.search-i .halal-features--i:nth-child(n+5) {
    display: none;
}

/* Nur der fette Hauptbegriff bleibt stehen. Die Detail-Aufzaehlung
   ("• Gemischt • Bescheidene Badebekleidung") ist ein loser Textknoten neben
   dem <b> und laesst sich nicht direkt adressieren — deshalb `font-size:0` am
   Container und die Schriftgroesse am <b> wiederherstellen. */
.search-i .halal-features--i-description {
    font-size: 0;
}

.search-i .halal-features--i-description b {
    font-size: 12px;
    font-weight: 600;
    white-space: nowrap;
}


/* --------------------------------------------------------------------------
   16. Kartenansicht — gleiche Typografie wie die Liste
   -------------------------------------------------------------------------- */

/* Die Map-Karte ist mit 290 px zu schmal fuer zwei Spalten und bleibt
   gestapelt (Teil II). Angeglichen wird die Preiszeile, damit Liste und Karte
   dieselbe Hierarchie zeigen. */
.offers-i_map .card--footer .font-headline {
    font-size: 20px;
    font-weight: 700;
    line-height: 1.15;
}

/* ==========================================================================
   Karten-Marker (Task 08, ueberarbeitet in Task 11)
   Der Marker ist jetzt Googles Standard-PinElement (rendert als SVG im DOM).
   Groesse, Form und Schatten bringt es selbst mit — hier stehen nur noch die
   Interaktionen. Der frueher hier gesetzte Eigenbau-Pin (40x48, eigener Schatten)
   ist entfallen.
   ========================================================================== */
.hotel-marker {
    cursor: pointer;
    transform-origin: 50% 100%;
    transition: transform .15s ease-out;
}

.hotel-marker:hover {
    transform: scale(1.12);
}

/* Ersatz fuer google.maps.Animation.BOUNCE — AdvancedMarkerElement hat keine
   Animations-API mehr. Wird von animateMarker()/stopAnimateMarker() gesetzt. */
.hotel-marker--bounce {
    animation: hotel-marker-bounce .6s ease-in-out infinite;
}

@keyframes hotel-marker-bounce {
    0%, 100% { transform: translateY(0)     scale(1.12); }
    50%      { transform: translateY(-9px)  scale(1.12); }
}

@media (prefers-reduced-motion: reduce) {
    .hotel-marker,
    .hotel-marker--bounce {
        transition: none;
        animation: none;
    }
    .hotel-marker--bounce { transform: scale(1.12); }
}

/* --------------------------------------------------------------------------
   Cluster-Blasen (Task 10)
   Der Default-Renderer der Clusterer-Bibliothek zeichnet blaue Standard-Blasen
   und erzeugt dafuer intern `google.maps.Marker` (deprecated). Wir rendern
   stattdessen selbst — im Stil des gruenen Pins aus Task 08.
   -------------------------------------------------------------------------- */
.hotel-cluster {
    display: flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    border-radius: 50%;
    background: #4CAF50;
    border: 3px solid #ffffff;
    color: #ffffff;
    font-family: inherit;
    font-weight: 700;
    line-height: 1;
    cursor: pointer;
    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .35));
    transition: transform .15s ease-out;
}

.hotel-cluster:hover {
    transform: scale(1.08);
}

@media (prefers-reduced-motion: reduce) {
    .hotel-cluster { transition: none; }
    .hotel-cluster:hover { transform: none; }
}
