/* ==========================================================================
   Hotel Schloss Lehen — ein Stylesheet für die ganze Website.
   ==========================================================================

   Diese Datei wird in Duda einmal site-weit eingebunden (Site-wide HTML).
   Deshalb gelten zwei Regeln ohne Ausnahme:

   1. Jeder Selektor hängt an .hsl-root. Es gibt keine Regel für body, html,
      a, img oder *. Was außerhalb unseres Wrappers steht, gehört dem
      Baukasten des Auftraggebers und wird nicht angefasst.
   2. Kein Schriftname steht in einer Regel — nur var(--font-display) und
      var(--font-text). Die Namen stehen ausschließlich in den @font-face-
      Blöcken und in den beiden Tokens ganz unten in diesem Abschnitt.

   Farben laufen über die semantischen Aliase (--surface-*, --text-*,
   --accent, --line). Radius 0, keine Schatten.
   ========================================================================== */

/* --- Schriften, lokal ---------------------------------------------------
   Kein Google-Fonts-CDN mehr: Die Dateien liegen auf unserem Host. Damit sie
   von der Duda-Domain aus laden, braucht der Host für /assets/fonts/ den
   Header Access-Control-Allow-Origin: * — siehe .htaccess im Projekt.

   Fraunces: Anzeigeschrift für die großen Grade. Variabel, mit den Achsen
   opsz 9–144 und wght 100–900. SOFT und WONK sind beim Bauen auf 0
   festgesetzt — wir verwenden sie nirgends, und ohne diese Festlegung
   käme die Datei mit ihren Vorgaben WONK 1 und wght 900 daher, also mit
   den schrägen Alternativformen in Schwarz.

   Glyphendeckung geprüft: ä ö ü Ä Ö Ü, ß, „ “ ‚ ‘, – —, alle Ziffern, €,
   die französischen Akzente und — anders als bei der Vorgängerschrift —
   auch der Mittelpunkt U+00B7.

   Lizenz: SIL Open Font License 1.1 (font/Fraunces/OFL.txt). Die
   Einbindung als Webfont ist damit ausdrücklich gedeckt; die offene Frage
   zur Webfont-Lizenz der Vorgängerschrift entfällt.

   Zeichenvorrat auf latin und latin-ext beschnitten: 349 kB TTF werden so
   zu 94 kB woff2, mit beiden Achsen unverändert stufenlos.

   Inter: variabel, Achse wght 100–900. Zwei Schnitte (latin, latin-ext)
   statt sieben Subsets — mehr braucht ein deutschsprachiges Haus nicht. */

@font-face{
  font-family:"Fraunces";
  src:url("../fonts/Fraunces.woff2") format("woff2-variations"),
      url("../fonts/Fraunces.woff2") format("woff2");
  font-weight:100 900;
  font-style:normal;
  font-display:swap;
}

/* Kursiv ist bei Fraunces eine eigene Datei, keine Neigung des geraden
   Schnitts. Ohne sie fiele der Browser auf synthetischen Schrägstellung
   zurück — dieselbe Zeichnung, nur geschert. Das ist unten mit
   font-synthesis:none abgeschaltet, deshalb muss die Datei hier stehen.

   Gebraucht wird sie an genau einer Stelle: dem hervorgehobenen Wort in
   der Überschrift des Hero. Sie lädt trotzdem nur, wenn diese Stelle
   vorkommt — der Browser holt eine Schriftdatei erst, wenn ein Zeichen
   sie anfordert. */
@font-face{
  font-family:"Fraunces";
  src:url("../fonts/Fraunces-Italic.woff2") format("woff2-variations"),
      url("../fonts/Fraunces-Italic.woff2") format("woff2");
  font-weight:100 900;
  font-style:italic;
  font-display:swap;
}

@font-face{
  font-family:"Inter";
  src:url("../fonts/Inter-latin.woff2") format("woff2");
  font-weight:100 900;
  font-style:normal;
  font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,
    U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,
    U+2212,U+2215,U+FEFF,U+FFFD;
}

@font-face{
  font-family:"Inter";
  src:url("../fonts/Inter-latin-ext.woff2") format("woff2");
  font-weight:100 900;
  font-style:normal;
  font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,
    U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,
    U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}

.hsl-root{
  --font-display:"Fraunces",Georgia,"Times New Roman",serif;
  --font-text:"Inter","Helvetica Neue",Arial,sans-serif;

  /* Keine gerechneten Schnitte. Fehlt eine Datei, soll das auffallen und
     nicht still durch eine Scherung oder eine Verfettung überdeckt werden —
     beides sieht bei einer Serifenschrift sofort falsch aus. */
  font-synthesis:none;
  -webkit-font-synthesis:none;
}

.hsl-root{/* base palette */
--nachtblau:#0E1E33;
--tiefblau:#081524;
--elfenbein:#FFFDF8;
--sand:#F7F1E4;
--daemmerung:#A9B4C4;
--bronze:#B3893C;
--bronze-hell:#C9A25A;
--bronze-deep:#8E6C2F;
--bronze-dunkel:#8A692E;
--sandpanel:#E4DCCE;

/* semantic aliases */
--surface-base:var(--nachtblau);
--surface-deep:var(--tiefblau);
--surface-panel:var(--sandpanel);
--text-body:var(--elfenbein);
--text-secondary:var(--daemmerung);
--text-on-panel:var(--nachtblau);
--text-on-panel-secondary:#3A4A60;
--accent:var(--bronze);
--accent-light:var(--bronze-hell);
--line:rgba(179,137,60,.32);
--line-strong:var(--bronze);
--on-accent:#FFFFFF;          /* Schrift auf Horn — siehe Abschnitt F */
/* Zustände in Formularen. Beide sind auf Nachtblau und auf Elfenbein
   lesbar; getragen wird die Aussage aber vom Text, nicht von der Farbe. */
--fehler:#D98A6A;
--erfolg:#8FB08A;
--line-on-panel:rgba(14,30,51,.25);
--image-scrim:linear-gradient(180deg,rgba(8,21,36,0) 0%,rgba(8,21,36,.35) 55%,rgba(8,21,36,.75) 100%); /* @kind other */
--image-placeholder:#152A45;}
.hsl-root{--type-display-size:clamp(48px,7vw,96px);
--type-display-lh:1.02;
--type-display-ls:-0.02em;
--type-h1-size:clamp(36px,5vw,64px);
--type-h1-lh:1.06;
--type-h2-size:clamp(28px,3.6vw,44px);
--type-h2-lh:1.1;
--type-h3-size:clamp(22px,2vw,26px);
--type-h3-lh:1.2;
--type-eyebrow-size:12px;
--type-eyebrow-ls:0.22em;
--type-body-size:17px;
--type-body-lh:1.7;
--type-small-size:14px;
--type-small-lh:1.6;
--type-button-size:13px;
--type-button-ls:0.12em;
--weight-regular:400;
--weight-medium:500;
/* Schrift auf Horn: fest, siehe Abschnitt F. */
--type-akzent-size:16px;
--weight-akzent:600;
--type-akzent-ls:0.02em;}
.hsl-root .sl-display,.hsl-root .sl-h1,.hsl-root .sl-h2,.hsl-root .sl-h3{font-family:var(--font-display);font-weight:400;color:var(--text-body);margin:0}
/* Keine automatische Silbentrennung in großen Graden — lange Wörter per <br> umbrechen
   oder eine Stufe kleiner setzen. */
.hsl-root .sl-display,.hsl-root .sl-h1{hyphens:none}
/* Überschriften und Augenbrauen nie automatisch trennen (12.10.2026,
   „Her-zen“ auf dem Telefon). Nur wo ein &shy; steht. Fließtext darf. */
.hsl-root :is(h1,h2,h3,.sl-display,.sl-h1,.sl-h2,.sl-h3,.sl-eyebrow){hyphens:manual}
.hsl-root .sl-display{font-size:var(--type-display-size);line-height:var(--type-display-lh);letter-spacing:var(--type-display-ls)}
.hsl-root .sl-h1{font-size:var(--type-h1-size);line-height:var(--type-h1-lh);letter-spacing:-0.015em}
.hsl-root .sl-h2{font-size:var(--type-h2-size);line-height:var(--type-h2-lh);letter-spacing:-0.01em}
.hsl-root .sl-h3{font-size:var(--type-h3-size);line-height:var(--type-h3-lh)}
.hsl-root .sl-eyebrow{font-family:var(--font-text);font-weight:500;font-size:var(--type-eyebrow-size);letter-spacing:var(--type-eyebrow-ls);text-transform:uppercase;color:var(--accent);margin:0}
.hsl-root .sl-body{font-family:var(--font-text);font-weight:400;font-size:var(--type-body-size);line-height:var(--type-body-lh);color:var(--text-body);margin:0;text-wrap:pretty}
.hsl-root .sl-small{font-family:var(--font-text);font-weight:400;font-size:var(--type-small-size);line-height:var(--type-small-lh);color:var(--text-secondary);margin:0}
/* --- Abstandsskala -------------------------------------------------------
   Eine Grundeinheit, acht Stufen. Jede Stufe ist ein Vielfaches von 8 px;
   andere Werte gibt es für Abstände nicht. Die Stufen stehen als Rechnung
   da, damit die Herkunft sichtbar bleibt.

     2xs   8   ×1        l    48   ×6
     xs   16   ×2        xl   64   ×8
     s    24   ×3        2xl  96   ×12
     m    32   ×4        3xl 128   ×16

   Senkrecht greifen nur drei Regeln auf diese Skala zu — siehe den Block
   „Vertikaler Rhythmus" am Ende der Datei. Die Regeln lesen nicht die
   Stufen direkt, sondern die drei Abstands-Tokens darunter; auf schmalen
   Schirmen wird nur das Token umgestellt, nie die Regel. */
.hsl-root{
--space-unit:8px;
--space-2xs:calc(var(--space-unit) * 1);
--space-xs:calc(var(--space-unit) * 2);
--space-s:calc(var(--space-unit) * 3);
--space-m:calc(var(--space-unit) * 4);
--space-l:calc(var(--space-unit) * 6);
--space-xl:calc(var(--space-unit) * 8);
--space-2xl:calc(var(--space-unit) * 12);
--space-3xl:calc(var(--space-unit) * 16);

/* Die drei senkrechten Regeln. */
--abstand-sektion:var(--space-3xl); /* 1 — zwischen Sektionen               */
--abstand-kopf:var(--space-xl);     /* 2 — Sektionskopf → Inhalt, Block → Block */
--abstand-unter:var(--space-m);     /* 3 — Unterüberschrift → Inhalt          */
/* Satz innerhalb eines Textblocks — gehört zur Typografie, nicht zum Layout. */
--abstand-marke:var(--space-xs);    /* Augenbraue → Überschrift */
--abstand-absatz:var(--space-s);    /* Absatz → Absatz          */

--container:1240px;--gutter:32px;--gutter-mobile:20px;
--radius:0px;--border-hairline:1px;
/* Vier Verhältnisse, jedes mit eigenem Wert. Kein Alias: Der Versuch, über
   --ratio-portrait pauschal aufs Querformat umzustellen, hat sämtliche
   Hochformate der Website mit beschnitten. Querformat steht nur dort, wo es
   ausdrücklich bestellt ist — die Klasse am Kader entscheidet, nicht das
   Token. */
--ratio-portrait:2/3;  /* @kind other */
--ratio-landscape:16/9; /* @kind other */
--ratio-card:3/2;      /* @kind other — Kacheln */
--ratio-wide:16/9;     /* @kind other — Vollbreitblöcke */
/* AUSNAHME, bewusst: nur „Unser Haus" auf der Startseite. Links steht dort
   viel Text; ein Querformat reichte nicht an dessen Höhe heran. */
--ratio-square:1/1;    /* @kind other — nur index.html #hsl-haus */}

/* Sprungziele: Der Kopf klebt oben. Ohne diesen Rand läge ein Anker
   (zimmer.html#neubau, kontakt.html#hsl-formular …) unter dem Kopf. */
.hsl-root [id]{scroll-margin-top:calc(var(--header-h,132px) + var(--space-s))}

/* Global element defaults. Dark ground, ivory text, bronze links. */
.hsl-root{background:var(--surface-base)}
.hsl-root{margin:0;background:var(--surface-base);color:var(--text-body);font-family:var(--font-text);font-weight:400;font-size:var(--type-body-size);line-height:var(--type-body-lh);-webkit-font-smoothing:antialiased}

/* --- Die Fläche um den Wrapper -------------------------------------------
   Sichtbar war ein heller Rahmen rings um die Seite. Er kam nicht von einer
   Linie: <body> bringt vom Browser 8px Rand mit, und seit der Reset nur noch
   innerhalb von .hsl-root gilt, wird der nicht mehr genullt. Der Wrapper
   trägt seine eigene Fläche, der 8px-Streifen daneben blieb in der
   Standardfarbe des Browsers stehen — in der dunklen Ansicht ein weißer
   Rahmen.

   Behoben mit :has(), und zwar genau so eng wie nötig: Die Regel greift nur,
   wenn unser Wrapper UNMITTELBARES Kind von <body> ist — also wenn unsere
   Seite das ganze Dokument ist. In Duda steckt das Widget mehrere Ebenen
   tief in den Containern des Baukastens; dort trifft der Selektor nicht zu
   und wir fassen fremdes <body> nicht an.

   Die Klasse .hsl-root selbst und die Bindung aller Selektoren an sie
   bleiben unverändert — sie ist die Voraussetzung für den Einbau und hat
   mit dem Rahmen nichts zu tun. */
body:has(> .hsl-root){margin:0;padding:0}

/* Beim Überziehen am oberen oder unteren Rand (Gummiband unter macOS und
   iOS) schaut sonst dieselbe Standardfläche hervor. Der feste Untergrund
   liegt hinter allem und nimmt die Farbe aus demselben Token wie der
   Wrapper — keine zweite Stelle, an der eine Farbe gepflegt werden muss. */
.hsl-root::before{
  content:"";position:fixed;inset:0;z-index:-1;
  background:var(--surface-base);
  pointer-events:none;
}
.hsl-root,.hsl-root *,.hsl-root *::before,.hsl-root *::after{box-sizing:border-box}
.hsl-root a:where(:not(.ibe__einbau *)){color:var(--accent-light);text-decoration:none;border-bottom:1px solid var(--line);transition:border-color .3s ease,color .3s ease}
.hsl-root a:where(:not(.ibe__einbau *)):hover{color:var(--elfenbein);border-color:var(--accent-light)}
.hsl-root img:where(:not(.ibe__einbau *)){display:block;max-width:100%}
.hsl-root ::selection{background:var(--bronze);color:#FFFFFF}

/* ==========================================================================
   Hotel Schloss Lehen — Startseite, Layout und Themes.
   Farben ausschließlich über die semantischen Aliase (--surface-*, --text-*,
   --accent, --line). Die Palette aus tokens/colors.css bleibt unangetastet;
   die helle Theme belegt dieselben Aliase nur neu.
   Kein Schriftname in dieser Datei — nur var(--font-display)/var(--font-text).
   Radius 0, keine Schatten.
   ========================================================================== */

/* --- Themes ------------------------------------------------------------ */

/* Dunkel ist der Auslieferungszustand aus tokens/colors.css. Hier nur das,
   was dort nicht vorgesehen ist. */
.hsl-root{/* Der Header ist in beiden Themes dunkelblau. Er bekommt deshalb einen
     eigenen, festen Satz — wie der Text über Bildern. Alles im Header greift
     auf diese Werte zu, nicht auf die allgemeinen Aliase.
     Die Fläche ist deckend statt der 92 %, die das Designsystem vorsieht:
     Bei Transparenz schlägt durch, was gerade darunter liegt — in der hellen
     Theme Elfenbein, in der dunklen Nachtblau — und der Header wechselte
     sichtbar die Farbe. Deckend bleibt er in beiden Themes und über jeder
     Sektionsfläche exakt gleich. */
  --header-surface:var(--nachtblau);
  --header-text:var(--elfenbein);
  --header-text-secondary:var(--daemmerung);
  --header-accent:var(--bronze);
  --header-accent-light:var(--bronze-hell);
  --header-line:rgba(179,137,60,.32);
  --scrim-text:var(--elfenbein);
  --scrim-text-secondary:var(--daemmerung);
  --scrim-accent:var(--bronze);
  --scrim-accent-light:var(--bronze-hell);
  --scrim-line:rgba(179,137,60,.32);
  /* Fläche der Buchungsleiste über dem Bild — folgt dem Scrim, nicht der Theme. */
  --scrim-surface:rgba(8,21,36,.55);
  /* Der Heroinhalt steht jetzt mittig und füllt fast die volle Höhe. Ein nach
     oben auslaufender Verlauf träfe seinen oberen Rand nicht mehr, darum deckt
     das Scrim des Hero durchgehend — nirgends unter 0.66, dem gemessenen Bedarf
     des Motivs (0.615). --image-scrim bleibt unverändert und gilt weiter für
     die übrigen Bildblöcke. */
  --scrim-hero:linear-gradient(to top,
    rgba(8,21,36,.90) 0,
    rgba(8,21,36,.76) 50%,
    rgba(8,21,36,.66) 100%);}

/* Helle Theme — spiegelbildliche Belegung aus derselben Palette.
   Bronze wird abgedunkelt: #hsl-B3893C erreicht auf Elfenbein nur 3.15:1 und auf
   Sand 2.84:1 und ist für 12px-Eyebrows damit unbrauchbar. #8A692E ist
   derselbe Farbton (H 38.8°, S 0.50), nur dunkler (L 0.47 → 0.36), und
   erreicht 4.99:1 bzw. 4.51:1. */
.hsl-root[data-theme="light"]{--surface-base:var(--elfenbein);
  --surface-deep:var(--sand);
  --surface-panel:var(--nachtblau);

  --text-body:var(--nachtblau);
  --text-secondary:#3A4A60;          /* = --text-on-panel-secondary aus colors.css */
  --text-on-panel:var(--elfenbein);
  --text-on-panel-secondary:var(--daemmerung);

  --accent:var(--bronze-dunkel);
  --accent-light:#6E5531;
  --line:rgba(138,105,46,.42);
  --line-strong:var(--bronze-dunkel);
  --line-on-panel:rgba(255,253,248,.25);
  --on-accent:#FFFFFF;
  --fehler:#9E3B14;
  --erfolg:#3F6B39;}

/* Das Sandpanel ist die einzige Fläche, die der Grundfläche entgegenläuft.
   Die Bronze dreht dort mit: auf hellem Panel die abgedunkelte, auf dunklem
   Panel die originale. */
.hsl-root .panel{--accent:var(--bronze-dunkel);
  --accent-light:#6E5531;
  --line:rgba(138,105,46,.42);}
.hsl-root[data-theme="light"] .panel{--accent:var(--bronze);
  --accent-light:var(--bronze-hell);
  --line:rgba(179,137,60,.32);}

/* Über Bildern bleibt das Scrim in beiden Themes dunkel — Text und Linien
   darauf folgen deshalb bewusst der dunklen Zuordnung. */
.hsl-root .frame__box,.hsl-root .hero,.hsl-root .viewport-block,.hsl-root .stimmen__bg{--text-body:var(--scrim-text);
  --text-secondary:var(--scrim-text-secondary);
  --accent:var(--scrim-accent);
  --accent-light:var(--scrim-accent-light);
  --line:var(--scrim-line);}

/* --- Grundgerüst ------------------------------------------------------- */
.hsl-root{background:var(--surface-base);color:var(--text-body)}
.hsl-root .container{max-width:var(--container);margin:0 auto;padding:0 var(--gutter)}

/* Sektionen als Farbbänder: Grundfläche und „leise" Fläche im Wechsel.
   Die Abstände zwischen Sektionen regelt der Block „Vertikaler Rhythmus"
   am Ende der Datei. */
.hsl-root .section{background:var(--surface-base)}
.hsl-root .section--quiet{background:var(--surface-deep)}
.hsl-root .measure{max-width:58ch}

/* Ungleiche Spalten — kein 3-up-Gleichmaß (Ausnahmen dokumentiert). */
.hsl-root .split{display:grid;gap:var(--space-2xl);align-items:start}
.hsl-root .split--wide-left{grid-template-columns:1.15fr 1fr}
.hsl-root .split--wide-right{grid-template-columns:1fr 1.15fr}
.hsl-root .split--even{grid-template-columns:1fr 1fr}
.hsl-root .split--center{align-items:center}
.hsl-root .section-head--mitte{text-align:center;max-width:52ch;margin-inline:auto}

/* tokens/elements.css setzt für a:hover fest Elfenbein — in der hellen Theme
   verschwindet die Linkfarbe damit auf hellem Grund. Hier auf den Alias
   umgestellt: dunkle Theme heller, helle Theme dunkler. */
.hsl-root a:where(:not(.ibe__einbau *)):hover{color:var(--text-body)}

/* --- Hairline ---------------------------------------------------------- */
.hsl-root .rule{height:1px;width:100%;background:var(--line);border:0;margin:0}
.hsl-root .rule--vertical{width:1px;height:auto;align-self:stretch}
.hsl-root .rule--panel{background:var(--line-on-panel)}

/* --- Buttons ----------------------------------------------------------- */
.hsl-root .btn{display:inline-flex;align-items:center;justify-content:center;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-button-size);letter-spacing:var(--type-button-ls);
  text-transform:uppercase;line-height:1;
  padding:16px 32px;border:var(--border-hairline) solid var(--accent);
  border-radius:var(--radius);background:transparent;color:var(--text-body);
  cursor:pointer;text-decoration:none;white-space:nowrap;
  transition:background .3s ease,border-color .3s ease,color .3s ease;}
.hsl-root .btn:hover{background:color-mix(in srgb,var(--accent) 12%,transparent);
  border-color:var(--accent-light);color:var(--text-body)}
.hsl-root .btn--compact{padding:14px 26px}
.hsl-root .btn--dark{color:var(--text-on-panel)}
/* .btn:hover setzt sonst --text-body — auf dem Panel wäre das die Panelfarbe
   selbst, die Schrift verschwände beim Überfahren. */
.hsl-root .btn--dark:hover{color:var(--text-on-panel)}

/* --- Pfeil-Link -------------------------------------------------------- */
.hsl-root .arrow-link{display:inline-flex;align-items:baseline;gap:10px;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-small-size);color:var(--text-body);
  text-decoration:none;border-bottom:var(--border-hairline) solid var(--line);
  padding-bottom:4px;transition:border-color .3s ease,color .3s ease;}
.hsl-root .arrow-link:hover{border-color:var(--accent-light)}
.hsl-root .arrow-link span{color:var(--accent-light)}

/* --- Bildplatzhalter --------------------------------------------------- */
.hsl-root .frame{margin:0}
.hsl-root .frame__box{position:relative;background:var(--image-placeholder);overflow:hidden;
  border:var(--border-hairline) solid var(--line);}
.hsl-root .frame--portrait .frame__box{aspect-ratio:var(--ratio-portrait)}
/* Bildhinweis (Durchgang 6, f2): kleine Beschriftung auf einem Bild, etwa
   „KI-generiert". Noch nirgends eingesetzt. Gebrauch — als letztes Kind
   eines Behälters mit position:relative (.frame__box, .hero,
   .viewport-block, .stimmen__bg):

     <div class="frame__box">
       <picture>…</picture>
       <p class="hsl-bildhinweis">KI-generiert</p>
     </div>

   Ecke wählbar: --oben (rechts oben statt rechts unten), --links.
   Der Text ist Teil des Inhalts und wird vorgelesen; deshalb kein
   aria-hidden. Kontrast Elfenbein auf Nachtblau 88 %: über 12 : 1. */
.hsl-root .hsl-bildhinweis{
  position:absolute;right:var(--space-2xs);bottom:var(--space-2xs);z-index:2;
  margin:0;padding:3px 8px;max-width:calc(100% - 2 * var(--space-2xs));
  background:rgba(14,30,51,.88);color:var(--elfenbein);
  font-family:var(--font-text);font-size:11px;font-weight:var(--weight-medium);
  line-height:1.4;letter-spacing:.06em;
  pointer-events:none;
}
.hsl-root .hsl-bildhinweis--oben{bottom:auto;top:var(--space-2xs)}
.hsl-root .hsl-bildhinweis--links{right:auto;left:var(--space-2xs)}
.hsl-root .frame--landscape .frame__box{aspect-ratio:var(--ratio-landscape)}
.hsl-root .frame--card .frame__box{aspect-ratio:var(--ratio-card)}
.hsl-root .frame--wide .frame__box{aspect-ratio:var(--ratio-wide)}
.hsl-root .frame--3-2 .frame__box{aspect-ratio:var(--ratio-card)}
.hsl-root .frame--square .frame__box{aspect-ratio:var(--ratio-square)}
.hsl-root .frame__label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  text-align:center;padding:var(--space-s);margin:0;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-eyebrow-size);letter-spacing:var(--type-eyebrow-ls);
  text-transform:uppercase;color:var(--accent);}
.hsl-root .frame__scrim{position:absolute;inset:0;background:var(--image-scrim)}

/* Fotos füllen ihren Rahmen vollständig; das Seitenverhältnis steckt im
   Container, deshalb entsteht beim Laden kein Springen. */
.hsl-root .frame__img,.hsl-root .media-img{position:absolute;inset:0;width:100%;height:100%;max-width:none;
  object-fit:cover;display:block;}


/* --- Chips und Datenreihen --------------------------------------------- */
.hsl-root .chips{display:flex;flex-wrap:wrap;gap:var(--space-2xs);list-style:none;margin:0;padding:0}
/* Tags tragen überall dieselbe Gegenfläche — auf dunklem Grund hell, auf
   hellem Grund elfenbein. Ohne Füllung verschwammen sie mit dem Fließtext. */
.hsl-root .chips li{border:var(--border-hairline) solid var(--line);padding:6px 14px;
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);
  background:var(--surface-panel);color:var(--text-on-panel);}
.hsl-root[data-theme="light"] .chips li{background:var(--surface-base);color:var(--text-body)}
/* Anlässe als Beschriftung, nicht als Knopf (Familien- und Firmenfeiern,
   Durchgang 5, f1): kein Rahmen, keine Fläche, kein Überfahrzustand,
   Pfeilzeiger. Getrennt nur durch Abstand — ein Trennzeichen stünde nach
   dem Umbruch am Zeilenanfang. */
.hsl-root .chips.chips--text{gap:var(--space-2xs) var(--space-m)}
.hsl-root .chips.chips--text li,
.hsl-root[data-theme="light"] .chips.chips--text li{
  border:0;background:none;padding:0;cursor:default;
  color:var(--text-secondary);font-size:var(--type-small-size);
  letter-spacing:.04em}
.hsl-root .datalist{list-style:none;margin:0;padding:0;
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .datalist li{padding:var(--space-xs) 0;
  border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .figure-num{font-family:var(--font-display);font-weight:var(--weight-regular);
  font-size:40px;line-height:1.1;color:var(--text-body)}

/* ==========================================================================
   1 — Header, zweistufig, sticky
   ========================================================================== */
.hsl-root .site-header{/* Feste dunkle Zuordnung — der Header dreht nicht mit der Theme. */
  --text-body:var(--header-text);
  --text-secondary:var(--header-text-secondary);
  --accent:var(--header-accent);
  --accent-light:var(--header-accent-light);
  --line:var(--header-line);
  position:sticky;top:0;z-index:20;
  background:var(--header-surface);
  border-bottom:var(--border-hairline) solid var(--line);}
.hsl-root .header-meta{border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .header-meta__inner{display:flex;align-items:center;gap:var(--space-s);
  min-height:44px;flex-wrap:wrap;
  font-family:var(--font-text);font-size:var(--type-small-size);
  color:var(--text-secondary);}
.hsl-root .header-meta__inner a{border-bottom:0;color:var(--text-secondary)}
.hsl-root .header-meta__inner a:hover{color:var(--text-body)}
.hsl-root .header-service{margin-left:auto;display:flex;align-items:center;gap:var(--space-s)}
.hsl-root .header-service a{border-bottom:var(--border-hairline) solid transparent;padding-bottom:2px;
  color:var(--text-secondary);transition:color .3s ease,border-color .3s ease;}
.hsl-root .header-service a:hover{color:var(--text-body);border-bottom-color:var(--accent)}

/* Themenschalter — seit 12.10.2026 nur im Fuß (.site-foot__theme). */
.hsl-root .theme-toggle{display:inline-flex;align-items:center;justify-content:center;
  width:34px;height:28px;padding:0;cursor:pointer;
  background:transparent;border:var(--border-hairline) solid var(--line);
  border-radius:var(--radius);color:var(--text-secondary);
  transition:color .3s ease,border-color .3s ease,background .3s ease;}
.hsl-root .theme-toggle:hover{color:var(--text-body);border-color:var(--accent-light);
  background:color-mix(in srgb,var(--accent) 12%,transparent)}
.hsl-root .theme-toggle svg{width:15px;height:15px;display:block}
.hsl-root .theme-toggle .icon-sun{display:none}
.hsl-root[data-theme="light"] .theme-toggle .icon-sun{display:block}
.hsl-root[data-theme="light"] .theme-toggle .icon-moon{display:none}

/* Hauptzeile — Logo, Menü und Button teilen eine Mittellinie. Dafür sind die
   Innenabstände der Menüpunkte oben und unten symmetrisch. */
.hsl-root .header-main__inner{display:flex;align-items:center;gap:var(--space-s);min-height:96px;}
.hsl-root .brand{border-bottom:0;display:inline-flex;align-items:center;gap:14px;flex:0 0 auto}
.hsl-root .brand__mark{height:52px;width:auto}
.hsl-root .brand__wortmarke{height:13px;width:auto}
.hsl-root .nav{display:flex;align-items:center;gap:var(--space-m);margin-left:auto}
.hsl-root .nav a:not(.btn){font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-button-size);letter-spacing:var(--type-button-ls);
  text-transform:uppercase;color:var(--text-secondary);text-decoration:none;
  border-top:var(--border-hairline) solid transparent;
  border-bottom:var(--border-hairline) solid transparent;
  padding-block:4px;
  transition:color .3s ease,border-color .3s ease;}
.hsl-root .nav a:not(.btn):hover{color:var(--text-body);border-bottom-color:var(--accent)}
.hsl-root .nav a:not(.btn)[aria-current]{color:var(--text-body);border-bottom-color:var(--accent)}
.hsl-root .nav__service,.hsl-root .nav__start{display:none}
.hsl-root .header-cta{flex:0 0 auto}
.hsl-root .burger{display:none;margin-left:auto;background:transparent;
  border:var(--border-hairline) solid var(--accent);border-radius:var(--radius);
  width:48px;height:44px;cursor:pointer;padding:0;
  transition:border-color .3s ease,background .3s ease;}
.hsl-root .burger:hover{border-color:var(--accent-light);
  background:color-mix(in srgb,var(--accent) 12%,transparent)}
.hsl-root .burger span{display:block;width:20px;height:1px;background:var(--text-body);margin:4px auto}

/* ==========================================================================
   2 — Hero: genau eine Bildschirmhöhe, zwei gleichwertige Wege
   ========================================================================== */
.hsl-root .hero{position:relative;width:100%;overflow:hidden;
  background:var(--image-placeholder);
  height:calc(100vh - var(--header-h,132px));
  height:calc(100svh - var(--header-h,132px));
  min-height:560px;
  display:flex;flex-direction:column;justify-content:center;}
.hsl-root .hero__label{position:absolute;inset:0 0 auto;display:flex;justify-content:center;
  padding:var(--space-l) var(--space-s);margin:0;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-eyebrow-size);letter-spacing:var(--type-eyebrow-ls);
  text-transform:uppercase;color:var(--accent);text-align:center;}
.hsl-root .hero__scrim{position:absolute;inset:0;background:var(--scrim-hero)}
.hsl-root .hero__inner{position:relative;z-index:2;width:100%;padding-block:var(--space-xl)}
/* Kompakter Hero (Events, 12.10.2026): etwa 45 % der Bildschirmhöhe, damit
   der Rechner darunter ohne langes Scrollen ins Bild kommt. */
.hsl-root .hero--kompakt{height:calc((100vh - var(--header-h,132px)) * .45);
  height:calc((100svh - var(--header-h,132px)) * .45);min-height:300px;justify-content:flex-end}
.hsl-root .hero--kompakt .hero__inner{padding-block:var(--space-l)}
/* Das hervorgehobene Wort in der Heroüberschrift: echter Kursivschnitt und
   Akzentfarbe, so wie im Entwurf des Auftraggebers.

   Die Achsen erbt es von .sl-display — font-variation-settings vererbt sich,
   das Wort läuft also mit opsz 144 und wght 400 wie die Zeile darum. Ohne
   die geerbte Angabe käme die Kursivdatei mit ihrer Vorgabe wght 900 und
   das Wort stünde fett in der Zeile.

   Die Regel hängt am Hero und nicht an .sl-display: Kursiv in Überschriften
   ist hier ein einzelner Akzent, kein Satzmittel der Website. In den
   Überschriften der übrigen Seiten bleibt <em> unverändert.

   Die Farbe ist die volle Akzentfarbe. Über dem Hero gilt die feste dunkle
   Zuordnung, --scrim-accent ist dort dieselbe Bronze. */
.hsl-root .hero__betont{
  font-style:italic;
  color:var(--accent);
}

/* AUSNAHME, bewusst und befristet: Der Eyebrow steht hier in Elfenbein statt
   in Bronze. Grund ist allein das aktuelle Motiv hero-ensemble.jpg — der
   Himmel hinter der Zeile ist so hell, dass Bronze dort nicht sicher trägt.
   Gilt ausschließlich für den Hero; alle anderen Eyebrows, auch die über
   Bildern, bleiben bronzefarben. Bei einem Bildwechsel neu bewerten. */
.hsl-root .hero__eyebrow{color:var(--scrim-text)}
.hsl-root .hero__content{display:flex;flex-direction:column;align-items:center;text-align:center}
.hsl-root .hero__content .sl-display{max-width:24ch}

/* Zwei gleichwertige Wege, durch einen Längsteiler getrennt. Beide Zellen
   gleich hoch, dadurch stehen die Buttons auf einer Höhe. */
.hsl-root .hero-wege{display:grid;grid-template-columns:1fr 1px 1fr;gap:var(--space-xl);
  align-items:stretch;width:100%;max-width:860px}
.hsl-root .hero-weg{display:flex;flex-direction:column;align-items:center;gap:var(--space-s)}
.hsl-root .hero-weg .sl-body{max-width:34ch}
.hsl-root .hero-weg .btn{margin-top:auto}

/* ==========================================================================
   3 — Unser Haus
   ========================================================================== */
.hsl-root .kennzahlen{list-style:none;margin:0;padding:0}
.hsl-root .kennzahlen li{display:flex;justify-content:space-between;align-items:baseline;
  gap:var(--space-s);padding-bottom:var(--space-s);
  border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .kennzahlen li+li{margin-top:var(--space-m)}
.hsl-root .kennzahlen__label{font-family:var(--font-text);font-size:var(--type-small-size);
  color:var(--text-body)}

/* ==========================================================================
   4 — Zimmer
   ========================================================================== */
.hsl-root .room+.room{margin-top:var(--space-l);padding-top:var(--space-l);
  border-top:var(--border-hairline) solid var(--line)}

/* ==========================================================================
   5 — Gastronomie: vollflächiger Block auf Bildschirmhöhe, wie der Hero
   ========================================================================== */
.hsl-root .viewport-block{position:relative;width:100%;overflow:hidden;
  background:var(--image-placeholder);
  height:calc(100vh - var(--header-h,132px));
  height:calc(100svh - var(--header-h,132px));
  min-height:480px;
  display:flex;align-items:flex-end;}
.hsl-root .viewport-block__label{position:absolute;inset:0 0 auto;display:flex;justify-content:center;
  padding:var(--space-l) var(--space-s);margin:0;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-eyebrow-size);letter-spacing:var(--type-eyebrow-ls);
  text-transform:uppercase;color:var(--accent);text-align:center;}
.hsl-root .viewport-block__scrim{position:absolute;inset:0;background:var(--image-scrim)}
.hsl-root .viewport-block__inner{position:relative;z-index:2;width:100%;
  padding-bottom:var(--space-xl)}

/* ==========================================================================
   6 — Veranstaltungen, Wechselsatz
   ========================================================================== */

/* Bild und Textfläche stoßen ohne Zwischenraum aneinander und sind gleich hoch.
   Die Textfläche bekommt die zur Sektion gegenläufige Fläche, damit die Hälfte
   als geschlossener Block liest. Die Bildseite wechselt von Block zu Block. */
/* Gleich breite Hälften, Bild und Text ohne Zwischenraum — waagerecht bündig.
   Auch senkrecht stoßen die Blöcke ohne Lücke aneinander — erst dadurch
   liest sich der Wechsel als durchgehendes Schachbrett.
   Bewusst gleiche Spalten: hier weicht die Seite vom „ungleiche Spalten"-
   Grundsatz des Systems ab, damit der Schachbrettsatz aufgeht. */
.hsl-root .wechsel{display:grid;grid-template-columns:1fr 1fr;gap:0;align-items:stretch}
.hsl-root .wechsel+.wechsel{margin-top:0}
.hsl-root .wechsel--right{grid-template-columns:1fr 1fr}
.hsl-root .wechsel--right .wechsel__media{grid-column:2;grid-row:1}
.hsl-root .wechsel--right .wechsel__body{grid-column:1;grid-row:1}
/* Querformat 3:2. Die Reihenhöhe kommt aus der Texthälfte; das Bild füllt seine
   Hälfte über cover, damit kein leeres Feld entsteht. Breite und Höhe sind
   beide gesetzt — sonst leitete aspect-ratio die Breite aus der Höhe ab und
   der Block liefe seitlich aus dem Raster. Die Mindesthöhe hält das Bild
   davon ab, bei kurzem Text zu einem Streifen zu werden. */
.hsl-root .wechsel__media{margin:0;min-height:320px}
.hsl-root .wechsel__media .frame__box{width:100%;height:100%;aspect-ratio:auto}
.hsl-root .wechsel__body{background:var(--surface-deep);padding:var(--space-xl);
  display:flex;flex-direction:column;justify-content:center}
.hsl-root .section--quiet .wechsel__body{background:var(--surface-base)}

/* Wechselsatz mit hochformatigem Kader (Gastronomie).
   Sonst füllt der Kasten die Höhe der Textseite und nimmt jedes Verhältnis
   an — ein Querformat verlor dort bis zur Hälfte seiner Breite. Hier hält
   der Kader 2:3 und gibt die Zeilenhöhe vor; die Textseite füllt mit ihrer
   Sandfläche auf, beide Hälften bleiben gleich hoch.
   Das trägt, solange der 2:3-Kasten höher ist als der Text — gemessen ab
   1180px. Darunter stünde der Text über, deshalb bricht der Satz dort
   einspaltig um. */
.hsl-root .wechsel--hoch .wechsel__media{min-height:0}
.hsl-root .wechsel--hoch .wechsel__media .frame__box{width:100%;height:auto;
  aspect-ratio:var(--ratio-portrait)}

/* ==========================================================================
   7 — Räume: drei gleiche Querformate 3:2 nebeneinander
   (bewusstes, freigegebenes Abweichen von „keine gleichförmige Kartenreihe").
   Alle drei Kader stehen im selben Format wie der Platzhalter der Alten
   Kelter — die Reihe ist einheitlich, keine Zelle wird gestreckt.
   ========================================================================== */
.hsl-root .raeume{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0 var(--space-m)}
.hsl-root .raum{display:flex;flex-direction:column}

/* Die vier Ebenen — Bild, Fakten, Bestuhlung, Button — teilen sich über alle
   Spalten hinweg dieselben Zeilen. Damit fluchten Fakten und Buttons auch
   dann, wenn eine Fakten-Zeile umbricht oder eine Spalte weniger
   Bestuhlungen hat. Ohne Subgrid greift der Flex-Fallback darunter. */
@supports (grid-template-rows: subgrid){
.hsl-root .raeume{grid-template-rows:auto auto auto auto}
.hsl-root .raum{display:grid;grid-row:span 4;grid-template-rows:subgrid;row-gap:0}
/* Ohne die Bestuhlungszeile — so steht der Block auf der Startseite, seit
   die Kapazitäten nur noch im Rechner stehen. Drei Spuren statt vier, sonst
   bliebe unter jeder Karte eine leere Zeile. */
.hsl-root .raeume--ohne-bestuhlung{grid-template-rows:auto auto auto}
.hsl-root .raeume--ohne-bestuhlung .raum{grid-row:span 3}
}
/* Der Überhang der Plakette braucht Platz, sonst stößt sie an die Faktenzeile.
   Der Abstand steht als Rand, nicht als Innenabstand — sonst verschöbe er den
   Bezugsrahmen der absolut gesetzten Plakette mit. */
.hsl-root .raum__media{position:relative}
/* Überhang der Plakette (24) plus Luft (16) — oben am Folgeelement. */
/* Überhang der Plakette (24) plus Abstand der Augenbraue (16), oben am
   Folgeelement. Spezifischer als .raum__fakten{margin:0} — sonst lag die
   Faktenzeile unter dem Namensschild. */
.hsl-root .raum > .raum__media + *{margin-top:calc(var(--space-s) + var(--abstand-marke))}
/* Die Plakette liegt außerhalb von .frame__box, damit sie der Theme folgt und
   nicht der dunklen Zuordnung über dem Bild. Sie ist nach unten und links über
   die Bildkante hinausgeschoben und deshalb deckend: Sie liegt zur Hälfte auf
   dem Foto, zur Hälfte auf der Sektionsfläche. */
.hsl-root .raum__plate{position:absolute;left:0;bottom:calc(-1 * var(--space-s));
  background:var(--surface-deep);
  border:var(--border-hairline) solid var(--accent);
  padding:12px 18px;margin:0;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-small-size);line-height:1.35;color:var(--text-body);}
.hsl-root .section--quiet .raum__plate{background:var(--surface-base)}
/* Ebene 1 — drei Fakten, in allen Spalten dieselben, daher von selbst bündig. */
.hsl-root .raum__fakten{list-style:none;margin:0;padding:var(--space-xs) var(--space-xs) var(--space-xs) 0;align-content:start;
  display:flex;flex-wrap:wrap;gap:6px 12px;
  border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .raum__fakten li{display:inline-flex;align-items:center;gap:6px;
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}

/* Ebene 2 — nur die tatsächlich vorhandenen Bestuhlungen, keine Platzhalter.
   Der Wrapper schneidet die führende Trennlinie jeder Zeile ab. */
.hsl-root .sitze-wrap{overflow:hidden;padding-top:var(--space-xs)}
.hsl-root .sitze{list-style:none;margin:0 0 0 -1px;padding:0;
  display:flex;flex-wrap:wrap;row-gap:var(--space-xs)}
.hsl-root .sitze li{display:inline-flex;align-items:center;gap:8px;
  padding:2px 14px;border-left:var(--border-hairline) solid var(--line)}
.hsl-root .sitz__name{font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}
.hsl-root .sitz__zahl{font-family:var(--font-text);font-size:var(--type-body-size);
  line-height:1.2;color:var(--text-body)}

/* Ebene 3 — Button unten, dadurch in allen Spalten auf einer Höhe. Er läuft
   über die volle Spaltenbreite und steht deutlich von der Bestuhlung ab,
   damit er als Handlung liest — ohne Füllung. */
.hsl-root .raum .btn{align-self:stretch;justify-self:stretch;width:100%;
  padding-block:18px;margin-top:var(--space-m)}
/* Waagerecht ein Zwischenraum von 32px: Ohne ihn wuchsen die drei Kader zu
   einem Band zusammen. Die Plakette hängt nur nach unten über die Bildkante
   (bottom:-24px, left:0) und ragt nicht seitlich heraus — der Zwischenraum
   bleibt frei. */
.hsl-root .raum{padding-right:0}

/* Icons: Strich in Hairline-Stärke. stroke-width erbt in den <use>-Schatten-
   baum, deshalb je Größe so gewählt, dass 1px auf dem Schirm ankommt. */
.hsl-root .sprite{position:absolute;width:0;height:0;overflow:hidden}
.hsl-root .icon{display:block;flex:none;fill:none;stroke:currentColor;
  stroke-linecap:round;stroke-linejoin:round}
.hsl-root .icon--fakt{width:18px;height:18px;stroke-width:1.34;color:var(--text-secondary)}
.hsl-root .icon--seat{width:22px;height:22px;stroke-width:1.09;color:var(--accent)}
.hsl-root .icon--leistung{width:18px;height:18px;stroke-width:1.34;color:var(--accent)}

/* ==========================================================================
   8 — Arrangements: zwei gleich breite, gleich hohe Hälften
   ========================================================================== */
.hsl-root .arrangements{list-style:none;margin:0;padding:0}
.hsl-root .arrangement{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-xl);
  align-items:stretch}
/* Wie bei den Veranstaltungen: Die Texthälfte gibt die Höhe vor, das Bild
   füllt seine Hälfte. So bleibt der Block kompakt. */
/* Das Bild behält 2:3 und richtet sich nach der Höhe der Texthälfte: Die
   Breite folgt dem Verhältnis, nicht umgekehrt — deshalb wird nichts
   beschnitten. max-width verhindert, dass es die Hälfte sprengt. */
.hsl-root .arrangement__media{margin:0;min-height:360px;display:flex;justify-content:flex-end}
.hsl-root .arrangement__media .frame__box{aspect-ratio:var(--ratio-portrait);
  height:100%;width:auto;max-width:100%}
/* Vier Eckdaten nebeneinander brauchen eine ganze Containerbreite. In der
   halben Spalte eines Arrangements stehen sie zu zweit in zwei Zeilen —
   sonst bricht „Samstag, 17. Oktober 2026" auf vier Zeilen um. */
.hsl-root .arrangement__main .eckdaten{grid-template-columns:1fr 1fr;
  justify-content:start;gap:var(--space-s) var(--space-l)}
.hsl-root .arrangement+.arrangement{margin-top:var(--space-xl);padding-top:var(--space-xl);
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .arrangement__main{display:flex;flex-direction:column}
/* Gleich hohe Zeilen im Leistungsverzeichnis. */
.hsl-root .leistungen{list-style:none;margin:0;padding:0;
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .leistungen li{display:flex;align-items:center;gap:10px;min-height:34px;
  padding:2px var(--space-2xs);border-bottom:var(--border-hairline) solid var(--line);
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-body);}
/* Programm mit Uhrzeit und Beschreibung (White Party): zweizeilig, das
   Zeichen steht an der ersten Zeile. */
.hsl-root .leistungen--ablauf li{align-items:flex-start;padding-block:10px}
.hsl-root .leistungen--ablauf .icon{margin-top:2px}
.hsl-root .leistungen--ablauf strong{font-weight:600;color:var(--text-body)}
/* Eckdaten der Veranstaltung als eigene Tafel innerhalb der Texthälfte. */
.hsl-root .eckdaten{margin:0;padding:var(--space-s);
  border:var(--border-hairline) solid var(--line);
  display:grid;grid-template-columns:repeat(4,auto);gap:var(--space-xs) var(--space-m);
  justify-content:space-between}
.hsl-root .eckdaten dt{font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-eyebrow-size);letter-spacing:var(--type-eyebrow-ls);
  text-transform:uppercase;color:var(--accent);margin:0 0 2px}
.hsl-root .eckdaten dd{margin:0;font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:1.35;color:var(--text-body)}
.hsl-root .arrangement__main .btn{align-self:flex-start}
/* White Party, kompakt (11.10.2026): Mit dem langen Programmtext wurde das
   Hochformat so hoch wie die Textspalte und der Block höher als der
   Bildschirm. Jetzt: Foto ganz (2:3, nicht beschnitten), aber in der Höhe
   begrenzt — höchstens Bildschirmhöhe minus Kopf und Abstände, die Breite
   folgt dem Verhältnis. Links der Text kompakter: Programm in zwei Spalten,
   Eckdaten in einer Zeile, Schlusssatz neben dem Knopf. */
.hsl-root .arrangement--kompakt{grid-template-columns:minmax(0,1fr) auto;align-items:start;
  --abstand-unter:var(--space-xs);--abstand-marke:var(--space-2xs)}
.hsl-root .arrangement--kompakt .arrangement__media{min-height:0;display:block}
.hsl-root .arrangement--kompakt .arrangement__seite{display:flex;flex-direction:column;gap:var(--space-s);width:min-content}
/* Fotohöhe: Bildschirmhöhe minus Kopf, Abstände der Sektion und Eckdaten
   darunter (~175 px) — zwischen 320 und 560 px. */
.hsl-root .arrangement--kompakt .arrangement__media .frame__box{aspect-ratio:2/3;width:auto;max-width:none;
  height:clamp(320px, calc(100vh - var(--header-h,132px) - 2 * var(--space-xl) - 175px), 560px);
  height:clamp(320px, calc(100svh - var(--header-h,132px) - 2 * var(--space-xl) - 175px), 560px)}
.hsl-root .arrangement--kompakt .arrangement__seite .eckdaten{grid-template-columns:auto auto;min-width:300px}
.hsl-root .arrangement--kompakt .leistungen--ablauf li{padding-block:5px}
.hsl-root .arrangement--kompakt .eckdaten{gap:var(--space-2xs) var(--space-s);padding:var(--space-xs) var(--space-s)}
.hsl-root .arrangement__schluss{justify-content:space-between}
.hsl-root .arrangement__schluss p{margin:0}
@media (min-width:1080px){
  .hsl-root .arrangement--kompakt .leistungen--ablauf{display:grid;grid-template-columns:1fr 1fr;column-gap:var(--space-m)}
}
/* Weihnachten (12.10.2026): wie die White Party, aber mit Foto im
   Querformat 3:2 — rechts in voller Spaltenbreite, die Eckdaten darunter.
   Unterhalb 1080px untereinander (Regel weiter unten), Foto in voller
   Breite. */
.hsl-root .arrangement--quer{grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start;
  --abstand-unter:var(--space-s);--abstand-marke:var(--space-2xs)}
.hsl-root .arrangement--quer .arrangement__seite{display:flex;flex-direction:column;gap:var(--space-s);min-width:0}
.hsl-root .arrangement--quer .arrangement__media{min-height:0;display:block}
.hsl-root .arrangement--quer .arrangement__media .frame__box{aspect-ratio:var(--ratio-card);
  height:auto;width:100%;max-width:none}
.hsl-root .arrangement--quer .eckdaten{grid-template-columns:auto auto;justify-content:start;
  gap:var(--space-2xs) var(--space-l);padding:var(--space-xs) var(--space-s)}
.hsl-root .arrangement--quer .leistungen--ablauf li{padding-block:8px}
/* Telefon und Tablet: untereinander, das Foto ganz, aber nicht höher als
   etwa ein halber Bildschirm. */
@media (max-width:1079px){
  .hsl-root .arrangement--quer{grid-template-columns:minmax(0,1fr)}
  .hsl-root .arrangement--kompakt{grid-template-columns:1fr}
  .hsl-root .arrangement--kompakt .arrangement__seite{width:auto}
  .hsl-root .arrangement--kompakt .arrangement__media .frame__box{height:min(55svh, 440px)}
}

/* ==========================================================================
   9 — Stimmen unserer Gäste
   ========================================================================== */
.hsl-root .stimmen{position:relative}
.hsl-root .stimmen__bg{position:relative;width:100%;overflow:hidden;
  background:var(--image-placeholder);aspect-ratio:var(--ratio-landscape);
  min-height:420px}
.hsl-root .stimmen__bg-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  margin:0;padding:var(--space-s);text-align:center;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-eyebrow-size);letter-spacing:var(--type-eyebrow-ls);
  text-transform:uppercase;color:var(--accent);}
.hsl-root .stimmen__scrim{position:absolute;inset:0;background:var(--image-scrim)}
/* Titel unten links im Bild — dort ist das Scrim am dichtesten. */
.hsl-root .stimmen__titel{position:absolute;left:0;right:0;bottom:0;
  padding-bottom:var(--space-xl);max-width:var(--container);margin:0 auto}
.hsl-root .stimmen__titel .sl-h2{max-width:16ch}
.hsl-root .stimmen__inner{position:absolute;inset:0;display:flex;padding-bottom:var(--space-xl);
  align-items:flex-end;justify-content:flex-end}
.hsl-root .stimmen__panel{justify-self:end;align-self:end;max-width:420px;width:100%;
  background:var(--surface-base);border:var(--border-hairline) solid var(--accent);
  padding:var(--space-l);}
.hsl-root .stimme+.stimme{margin-top:var(--space-m);padding-top:var(--space-m);
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .stimme__wert{font-family:var(--font-display);font-weight:var(--weight-regular);
  font-size:var(--type-h1-size);line-height:1.06;color:var(--text-body);margin:0}

/* ==========================================================================
   10 — Bad Friedrichshall: Ausflugskarten
   ========================================================================== */
.hsl-root .ausflug-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-m)}
.hsl-root .ausflug h3{margin-top:var(--space-s)}
.hsl-root .ausflug p{margin-top:var(--space-xs)}

/* ==========================================================================
   Fokus — die vorhandene 1px-Linie wird hell gesetzt, kein blauer Systemring
   ========================================================================== */
.hsl-root :focus-visible{outline:var(--border-hairline) solid var(--accent-light);outline-offset:3px}
.hsl-root .btn:focus-visible,.hsl-root .burger:focus-visible,.hsl-root .theme-toggle:focus-visible{border-color:var(--accent-light);outline-offset:2px}
.hsl-root .skip-link{position:absolute;left:-9999px;top:0;z-index:100;
  background:var(--surface-deep);color:var(--text-body);padding:16px 24px;border-bottom:0}
/* Nur bei Tastaturbedienung sichtbar (:focus-visible), nicht nach einem
   Mausklick oder einem Fokus durch ein Skript. */
.hsl-root .skip-link:focus-visible{left:var(--gutter);top:var(--space-2xs)}

/* ==========================================================================
   Responsiv — bis 360px
   ========================================================================== */
/* Unterhalb 1280px: Burger statt Navigation. Das Menü selbst steht im
   Abschnitt „M — Mobiles Menü" weiter unten. */
@media (max-width:1279px){
.hsl-root .header-cta{display:none}
.hsl-root .burger{display:block}
.hsl-root .header-service{display:none}
}

/* „Veranstaltung anfragen" misst 288px und wird nie umbrochen. Zwei Zellen
   nebeneinander brauchen deshalb mindestens 2x288 + Teiler + Abstände, also
   rund 780px Fensterbreite. Darunter stehen sie untereinander. */
@media (max-width:900px){
.hsl-root .hero-wege{grid-template-columns:1fr;gap:var(--space-m)}
.hsl-root .hero-wege .rule--vertical{width:100%;height:1px}
}

/* Das White-Party-Bild behält 2:3 und richtet sich nach der Höhe der
   Texthälfte. Beides zusammen passt nur, solange Höhe x 2/3 noch in die halbe
   Spalte passt — unterhalb 1080px ist die Spalte dafür zu schmal, deshalb
   stehen die Hälften dort untereinander. */
@media (max-width:1079px){
.hsl-root .arrangement{grid-template-columns:1fr}
.hsl-root .eckdaten{grid-template-columns:1fr 1fr;justify-content:start}
.hsl-root .arrangement__media{justify-content:flex-start}
.hsl-root .arrangement__media .frame__box{height:auto;width:100%;max-width:420px}
}
@media (max-width:980px){
.hsl-root .split{gap:var(--space-xl)}
.hsl-root .split--wide-left,.hsl-root .split--wide-right,.hsl-root .split--even{grid-template-columns:1fr}
.hsl-root .wechsel--right .wechsel__media,.hsl-root .wechsel--right .wechsel__body{grid-column:1;grid-row:auto}
  /* minmax(0,...) statt 1fr: Sonst zieht die Mindestbreite eines Inhalts —
     etwa ein Knopf, dessen Beschriftung nicht umbricht — die Spalte über
     den Container hinaus. */
.hsl-root .wechsel,.hsl-root .wechsel--right{grid-template-columns:minmax(0,1fr)}
  /* Auf schmalen Schirmen läuft der Knopf über die Spalte und darf
     umbrechen. */
.hsl-root .wechsel__body .btn{display:flex;width:100%;white-space:normal;
    text-align:center}
.hsl-root .wechsel--right .wechsel__media,.hsl-root .wechsel--right .wechsel__body{grid-column:1;grid-row:auto}
.hsl-root .wechsel__body{padding:var(--space-l)}
.hsl-root .raeume{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--space-xl) var(--space-m)}
.hsl-root .ausflug-grid{grid-template-columns:1fr 1fr}
.hsl-root .stimmen__inner{position:static;display:block;padding-top:var(--space-m)}
.hsl-root .stimmen__panel{max-width:none;margin:var(--space-m) 0 0}
}
@media (max-width:640px){
.hsl-root{--gutter:var(--gutter-mobile)}
  /* Button-Labels werden nie umbrochen; „Veranstaltung anfragen" misst mit
     16/32 aber 288px und passt nicht in 320px Innenbreite. */
.hsl-root .btn{padding:16px 20px}
.hsl-root .btn--compact{padding:14px 20px}
.hsl-root .brand__mark{height:42px}
.hsl-root .brand__wortmarke{height:11px}
  /* Unterhalb 640px trägt der Hero mehr Zeilen, als eine Bildschirmhöhe
     fasst (Inhalt ~690–711px gegenüber 606px bei 360x780). Die Bindung an
     die Bildschirmhöhe entfällt deshalb hier: Der Hero wächst mit dem
     Inhalt, nichts wird beschnitten. Ab 641px bleibt es bei „genau ein
     Bildschirm". */
.hsl-root .hero{height:auto;min-height:520px;padding-top:var(--space-xl)}
.hsl-root .hero--kompakt{min-height:240px}
  /* Der Textblock reicht auf dieser Breite fast über die volle Herohöhe.
     Ein von unten auslaufender Verlauf träfe seinen oberen Rand nicht mehr,
     darum deckt das Scrim hier durchgehend. */
.hsl-root .hero__scrim{background:linear-gradient(to top,
    rgba(8,21,36,.92) 0,
    rgba(8,21,36,.82) 45%,
    rgba(8,21,36,.70) 100%)}
  /* Der Überhang der Plakette bliebe sonst im 20px-Seitenrand hängen. */
.hsl-root .raum__plate{left:0}
.hsl-root .eckdaten{grid-template-columns:1fr}
.hsl-root .raeume{grid-template-columns:1fr;gap:var(--space-xl) 0}
.hsl-root .ausflug-grid{grid-template-columns:1fr}
.hsl-root .ausflug .frame__box{max-width:280px}
.hsl-root .eckdaten{padding:var(--space-s)}
.hsl-root .stimmen__panel{padding:var(--space-m)}
}

/* Bewegung nur, wo sie gewollt ist. */
@media (prefers-reduced-motion:reduce){
.hsl-root,.hsl-root *,.hsl-root *::before,.hsl-root *::after{transition-duration:.01ms !important;animation-duration:.01ms !important}
}


/* ==========================================================================
   zimmer.html
   ========================================================================== */

/* --- Buchungsleiste: entfallen im Durchgang 7. An ihrer Stelle steht die
   Maske des Hauses bzw. deren Ersatz (Abschnitt „Buchungsmaske"). */

/* --- 93 Zimmer, zwei Welten -------------------------------------------
   Unten sollen Text und Bild auf einer Linie enden. Das Bild behält sein
   Verhältnis 2:3 und wird nicht beschnitten; stattdessen füllt die
   Textspalte die Zeilenhöhe und schiebt die Kennzahlen mit einem
   automatischen Rand nach unten. Das trägt nur, solange die Spalte
   schmaler als das Bild hoch ist — darunter steht der Block einspaltig,
   und die Frage stellt sich nicht. */
.hsl-root #hsl-haus .split{align-items:stretch}
.hsl-root #hsl-haus .frame{align-self:start}
.hsl-root .welten__text{display:flex;flex-direction:column}
/* Automatischer Rand statt fester Abstand: Der Rest der Zeilenhöhe fällt
   an die Lücke über den Kennzahlen, die Unterkante trifft das Bild genau.
   Der Innenabstand ist nur die Untergrenze dieser Lücke. */
.hsl-root .fluss > .welten__zahlen{margin-top:auto;padding-top:var(--space-s)}
.hsl-root .welten__zahlen li+li{margin-top:var(--space-s)}
@media (max-width:1279px){
.hsl-root #hsl-haus .split{grid-template-columns:1fr;align-items:start}
.hsl-root .fluss > .welten__zahlen{margin-top:var(--abstand-unter);padding-top:0}
.hsl-root #hsl-haus .frame{max-width:420px}
}

/* Der hochformatige Wechselsatz bricht früher um als der übrige — siehe
   die Begründung oben. Einspaltig wird der Kader in der Breite begrenzt,
   sonst geriete er bei 2:3 über anderthalb Bildschirmhöhen hoch. */
@media (max-width:1179px){
.hsl-root .wechsel--hoch,.hsl-root .wechsel--hoch.wechsel--right{grid-template-columns:minmax(0,1fr)}
.hsl-root .wechsel--hoch .wechsel__media,.hsl-root .wechsel--hoch .wechsel__body{grid-column:1;grid-row:auto}
.hsl-root .wechsel--hoch .wechsel__media{max-width:420px}
}

/* --- Zimmerkategorien: 3x3 ---------------------------------------------
   Freigegebenes Abweichen von „keine gleichförmige Kartenreihe". Über
   Subgrid teilen sich alle Karten dieselben Zeilen, damit Plaketten,
   Überschriften, Preiszeile und Buttons reihenweise fluchten. */
/* Waagerecht Abstand, senkrecht keiner: Der Zeilenabstand des Rasters würde
   sich sonst über Subgrid auch zwischen die inneren Zeilen der Karte legen
   und dort tote Fläche erzeugen. Der Abstand zwischen den Kartenreihen
   entsteht deshalb unten am Button. */
.hsl-root .zkarten{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--abstand-kopf) var(--space-m)}
.hsl-root .zkarte{display:flex;flex-direction:column}
/* Kategorien nach Ort: Schlossgebäude, Neubau, Apartment. Jede Gruppe ist
   ein Sprungziel der Startseite. Zwischen den Gruppen gilt Regel 2
   (.stapel), Titel → Karten Regel 3 (.fluss). */
.hsl-root .zgruppe__titel{padding-bottom:var(--space-xs);
  border-bottom:var(--border-hairline) solid var(--line)}
@supports (grid-template-rows: subgrid){
.hsl-root .zkarten{grid-template-rows:auto auto auto auto auto}
.hsl-root .zkarte{display:grid;grid-row:span 5;grid-template-rows:subgrid;row-gap:0}
}
/* Die Plakette ragt nach unten und links über die Bildkante — deckend,
   damit sie auf Foto wie auf Sektionsfläche trägt. Der Rand darunter hält
   den Überhang von der Überschrift fern. */
.hsl-root .zkarte__media{position:relative}
.hsl-root .zkarte__media + *{margin-top:calc(var(--space-s) + var(--space-xs))}
.hsl-root .zkarte__plakette{position:absolute;left:-24px;bottom:-24px;
  background:var(--surface-base);
  border:var(--border-hairline) solid var(--accent);
  padding:10px 16px;margin:0;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-small-size);line-height:1.35;color:var(--text-body);}
.hsl-root .zkarte__titel{padding-bottom:var(--space-xs)}
/* Dicht an die Preiszeile heran: Die reservierte, vorerst leere Zeile
   soll keinen Krater zwischen Text und Button aufreißen. */
.hsl-root .zkarte__text{padding-bottom:0}
/* Reservierte Zeile für den Preis: Die Höhe steht schon ohne Inhalt, damit
   „ab X € pro Nacht" später nichts verschiebt. */
/* Kein Zimmerpreis: Die Raten sind tagesabhängig und stehen nur im
   Buchungssystem. Die Zeile verweist dorthin. */
.hsl-root .zkarte__preis{margin:0;min-height:calc(var(--type-small-size) * var(--type-small-lh));
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-body);}
.hsl-root .zkarte .btn{align-self:stretch;justify-self:stretch;width:100%;
  padding-block:16px;margin-top:var(--space-xs)}
/* „Jetzt Verfügbarkeit prüfen“ (seit 10.10.2026) ist für eine schmale Karte
   zu lang: Auf dem Telefon darf der Text umbrechen, statt die Karte über
   den Bildschirmrand zu schieben. */
.hsl-root .zkarte .btn{min-width:0;max-width:100%;white-space:normal;text-align:center;line-height:1.25}

/* --- Ausstattung: zwei Spalten, fünf Zeilen ---------------------------
   Zehn Punkte gehen restlos in zwei Spalten auf. Spaltenweiser Fluss:
   1–5 links, 6–10 rechts. Die fünf Zeilenspuren sind für beide Spalten
   dieselben, deshalb liegen die Haarstriche links und rechts exakt auf
   einer Höhe — ohne Subgrid, weil die Zeile selbst schon das Rasterfeld
   ist. Sprache wie die Bestuhlung im Block Räume auf der Startseite. */
.hsl-root .ausst-raster{list-style:none;margin:0;padding:0;display:grid;
  grid-template-columns:1fr 1fr;grid-template-rows:repeat(5,auto);
  grid-auto-flow:column}
.hsl-root .ausst{display:flex;align-items:center;gap:12px;padding:11px 0;
  border-bottom:var(--border-hairline) solid var(--line)}
/* Senkrechte Trennung: Der Strich hängt an der rechten Spalte, die Luft
   verteilt sich auf beide Seiten. */
.hsl-root .ausst:nth-child(n+6){border-left:var(--border-hairline) solid var(--line);
  padding-left:var(--space-m)}
.hsl-root .ausst:nth-child(-n+5){padding-right:var(--space-m)}
/* Unter der letzten Zeile jeder Spalte kein Strich. */
.hsl-root .ausst:nth-child(5),.hsl-root .ausst:nth-child(10){border-bottom:0}
.hsl-root .ausst__titel{min-width:0;font-family:var(--font-text);
  font-size:var(--type-body-size);line-height:1.35;color:var(--text-body)}
/* Der Zusatz ist keine Zierde: Im Altbau gibt es zum Beispiel keine
   Klimaanlage. Rechtsbündig, damit die Spalte als Tabelle liest. Punkte
   ohne Zusatz behalten die leere Hälfte — Zeile und Strich bleiben. */
.hsl-root .ausst__hinweis{margin:0 0 0 auto;padding-left:var(--space-s);
  text-align:right;color:var(--text-secondary)}
.hsl-root .icon--ausst{flex:0 0 auto;width:32px;height:32px;stroke-width:0.75;
  color:var(--accent)}

/* ======================================================================
   VERANSTALTUNGEN UND HOCHZEITEN
   ====================================================================== */

/* --- Rechner ---------------------------------------------------------- */
/* minmax(0,...) überall dort, wo Zeilen mit fester rechter Hälfte stehen:
   Ohne die Null als Untergrenze zieht deren Mindestbreite die Spalte über
   den Container hinaus. */
.hsl-root .rechner{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);
  gap:var(--space-2xl);align-items:start}
.hsl-root .rechner__eingabe{min-width:0}
.hsl-root .feld{border:0;margin:0;padding:0;min-width:0}
.hsl-root .feld + .feld{margin-top:var(--abstand-kopf)}
.hsl-root .feld > legend{padding:0 0 var(--space-s);color:var(--accent)}
.hsl-root .feld__hinweis{margin:var(--space-xs) 0 0;color:var(--accent)}

/* Auswahl und Haken teilen eine Zeilenform: Marke links, Beschriftung
   daneben, Zusatz darunter in Dämmerung. Radios und Kästchen bleiben die
   des Systems — sichtbarer Fokus ohne eigenes Zutun. */
.hsl-root .wahl,.hsl-root .haken{display:grid;gap:0}
.hsl-root .wahl label,.hsl-root .haken label{display:flex;align-items:flex-start;gap:12px;
  padding:11px 0;cursor:pointer;
  border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .wahl label:last-child,.hsl-root .haken label:last-child{border-bottom:0}
.hsl-root .wahl input,.hsl-root .haken input{margin:3px 0 0;accent-color:var(--accent);flex:0 0 auto}
.hsl-root .wahl label > span,.hsl-root .haken label > span{display:block;min-width:0;
  font-family:var(--font-text);font-size:var(--type-body-size);
  line-height:1.35;color:var(--text-body)}
.hsl-root .wahl__zusatz{display:block;margin-top:2px;
  font-size:var(--type-small-size);line-height:var(--type-small-lh);
  color:var(--text-secondary)}

/* Schieberegler: Bahn als Haarstrich, Griff als Quadrat ohne Radius. */
.hsl-root .regler{display:flex;align-items:center;gap:var(--space-m)}
.hsl-root .regler input[type="range"]{flex:1 1 auto;min-width:0;height:24px;
  -webkit-appearance:none;appearance:none;background:transparent}
.hsl-root .regler input[type="range"]::-webkit-slider-runnable-track{height:1px;background:var(--line)}
.hsl-root .regler input[type="range"]::-moz-range-track{height:1px;background:var(--line)}
.hsl-root .regler input[type="range"]::-webkit-slider-thumb{-webkit-appearance:none;
  width:14px;height:14px;margin-top:-6.5px;border-radius:0;
  background:var(--accent);cursor:pointer}
.hsl-root .regler input[type="range"]::-moz-range-thumb{width:14px;height:14px;
  border:0;border-radius:0;background:var(--accent);cursor:pointer}
.hsl-root .regler__wert{flex:0 0 auto;min-width:3ch;text-align:right;
  font-family:var(--font-display);font-size:var(--type-h3-size);
  line-height:1;color:var(--text-body)}

/* Zähler: Beschriftung links, Minus/Wert/Plus rechts. */
.hsl-root .zaehler-gruppe{margin-top:var(--space-m)}
.hsl-root .zaehler{display:flex;align-items:center;gap:12px;padding:11px 0;
  border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .zaehler:last-child{border-bottom:0}
.hsl-root .zaehler__name{flex:1 1 auto;min-width:0;font-family:var(--font-text);
  font-size:var(--type-body-size);line-height:1.35;color:var(--text-body)}
.hsl-root .zaehler__zusatz{display:block;margin-top:2px;font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}
.hsl-root .zaehler__steuer{flex:0 0 auto;display:flex;align-items:center;gap:2px}
.hsl-root .zaehler__btn{width:34px;height:34px;padding:0;
  border:var(--border-hairline) solid var(--line);background:transparent;
  font-family:var(--font-text);font-size:var(--type-body-size);
  line-height:1;color:var(--text-body);cursor:pointer;
  transition:color 300ms ease,border-color 300ms ease}
.hsl-root .zaehler__btn:hover{color:var(--accent);border-color:var(--accent)}
.hsl-root .zaehler__wert{min-width:3ch;text-align:center;font-family:var(--font-text);
  font-size:var(--type-body-size);color:var(--text-body)}

/* Was ein Pauschalpaket schon enthält. */
.hsl-root .enthalten{list-style:none;margin:var(--space-s) 0 0;padding:var(--space-s) 0 0;
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .enthalten li{position:relative;padding-left:18px;
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}
.hsl-root .enthalten li::before{content:"";position:absolute;left:0;top:.7em;
  width:8px;height:1px;background:var(--accent)}

/* --- Schritte ------------------------------------------------------------
   Sechs Schritte als Reiterleiste. Der aktuelle trägt aria-current="step"
   und die Linie in der Akzentfarbe. Darunter Stand und laufende Summe —
   auf dem Telefon, wo die Zusammenstellung unter dem Formular steht, sieht
   man die Summe so trotzdem bei jedem Schritt. */
.hsl-root .schritte{border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .schritte__liste{list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(6,minmax(0,1fr))}
.hsl-root .schritte__knopf{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2xs);
  width:100%;padding:var(--space-xs) var(--space-2xs) var(--space-xs) 0;
  background:transparent;border:0;border-bottom:2px solid transparent;cursor:pointer;
  font-family:var(--font-text);font-size:var(--type-small-size);line-height:1.3;
  color:var(--text-secondary);text-align:left;transition:color .3s ease,border-color .3s ease}
.hsl-root .schritte__knopf:hover{color:var(--text-body)}
.hsl-root .schritte__knopf[aria-current="step"]{color:var(--text-body);border-bottom-color:var(--accent)}
.hsl-root .schritte__nr{font-family:var(--font-display);font-size:var(--type-h3-size);line-height:1;
  font-variation-settings:"opsz" 48,"wght" 400,"SOFT" 0,"WONK" 0;color:var(--accent)}
.hsl-root .schritte__stand{display:flex;justify-content:space-between;gap:var(--space-s);flex-wrap:wrap;
  margin:0;padding:var(--space-xs) 0;font-family:var(--font-text);font-size:var(--type-small-size);
  color:var(--text-secondary)}
.hsl-root #hsl-schritt-summe{color:var(--text-body);font-weight:var(--weight-medium)}
.hsl-root .schritt[hidden]{display:none}
.hsl-root .schritt{margin-top:var(--abstand-unter)}
.hsl-root .schritt__titel:focus{outline:none}
.hsl-root .schritt__nav{display:flex;flex-wrap:wrap;gap:var(--space-xs) var(--space-s);
  padding-top:var(--space-m);border-top:var(--border-hairline) solid var(--line)}
.hsl-root .schritt__weiter,.hsl-root #hsl-r-senden{margin-left:auto}
.hsl-root .stapel--eng{--abstand-kopf:var(--space-l)}
.hsl-root .feld__text{margin:0 0 var(--space-xs);color:var(--text-secondary)}
.hsl-root .formular--rechner{margin:0}
.hsl-root .wahl--reihe{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:var(--space-m)}
.hsl-root .wahl--reihe label{border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .wahl label[hidden]{display:none}
/* Eine Option je Zeile. Der Haarstrich sitzt an der Zeile, nicht am
   <label> — bei Paketen steht der Aufklapper „Was im Paket enthalten ist"
   mit in der Zeile, außerhalb des <label>. Welche Zeilen ein Anlass zeigt,
   steht in daten/preise.json („anlaesse"). */
.hsl-root .wahl__option{border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .wahl__option:last-child{border-bottom:0}
.hsl-root .wahl .wahl__option > label,.hsl-root .haken .wahl__option > label{border-bottom:0}
.hsl-root .wahl__option[hidden],.hsl-root .zaehler[hidden],
.hsl-root .feld__text[hidden]{display:none}
.hsl-root .wahl__option--paket > label{padding-bottom:var(--space-2xs)}
.hsl-root .paketinhalt{margin:0 0 11px 26px}
.hsl-root .paketinhalt > summary{display:inline-flex;align-items:center;gap:var(--space-2xs);
  cursor:pointer;list-style:none;
  font-family:var(--font-text);font-size:var(--type-small-size);line-height:var(--type-small-lh);
  color:var(--accent-light);border-bottom:var(--border-hairline) solid transparent}
.hsl-root .paketinhalt > summary::-webkit-details-marker{display:none}
/* Kreis mit „i" bzw. „–": zeigt an, dass sich hier etwas aufklappen lässt. */
.hsl-root .paketinhalt > summary::before{content:"i";display:inline-flex;align-items:center;justify-content:center;
  width:18px;height:18px;border:var(--border-hairline) solid currentColor;border-radius:50%;
  font-size:11px;font-weight:600;line-height:1;font-style:normal}
.hsl-root .paketinhalt[open] > summary::before{content:"–"}
.hsl-root .paketinhalt > summary:hover{border-bottom-color:currentColor}
.hsl-root .paketinhalt > summary:focus-visible{outline:var(--border-hairline) solid var(--accent-light);outline-offset:3px}
.hsl-root .paketinhalt__liste{padding-top:var(--space-2xs)}
.hsl-root .paketinhalt__titel{margin:var(--space-xs) 0 0;font-family:var(--font-text);
  font-size:var(--type-small-size);font-weight:var(--weight-medium);color:var(--text-body)}
.hsl-root .paketinhalt__unter{margin:var(--space-2xs) 0 0;font-family:var(--font-text);
  font-size:var(--type-small-size);color:var(--text-secondary)}
.hsl-root .paketinhalt .enthalten{margin-top:4px;padding-top:0;border-top:0}
.hsl-root .sr-only{position:absolute;width:1px;height:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap}
.hsl-root .wahl--gesperrt{cursor:not-allowed;opacity:.62}
.hsl-root .wahl__warnung{display:block;margin-top:2px;font-size:var(--type-small-size);color:var(--fehler)}
/* Bestuhlung: sechs Kacheln mit Schemazeichnung. */
.hsl-root .bestuhlung{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-xs)}
.hsl-root .bestuhlung__form{position:relative;display:flex;flex-direction:column;align-items:center;
  gap:var(--space-2xs);padding:var(--space-s) var(--space-xs);cursor:pointer;
  border:var(--border-hairline) solid var(--line);text-align:center;
  font-family:var(--font-text);font-size:var(--type-small-size);color:var(--text-body);
  transition:border-color .3s ease,background .3s ease}
.hsl-root .bestuhlung__form input{position:absolute;opacity:0;width:1px;height:1px}
.hsl-root .bestuhlung__form:hover{border-color:var(--accent)}
.hsl-root .bestuhlung__form:has(input:checked){border-color:var(--accent);
  background:color-mix(in srgb,var(--accent) 10%,transparent)}
.hsl-root .bestuhlung__form:has(input:focus-visible){outline:var(--border-hairline) solid var(--accent-light);outline-offset:3px}
.hsl-root .bestuhlung__bild{width:72px;height:60px;fill:none;stroke:var(--accent);stroke-width:1.4}
.hsl-root .bestuhlung__bild .punkte{fill:var(--text-body);stroke:none}
@media (max-width:640px){
  .hsl-root .schritte__liste{grid-template-columns:repeat(3,minmax(0,1fr))}
  .hsl-root .bestuhlung{grid-template-columns:repeat(2,minmax(0,1fr))}
  .hsl-root .wahl--reihe{grid-template-columns:minmax(0,1fr)}
}

/* --- Ergebnis: Tabelle wie die Ausstattung auf zimmer.html ------------- */
/* Kleben und Rahmen: gemeinsam für „Ihre Zusammenstellung" und den
   Anfrageblock daneben. Eine Stelle, damit beide gleich bleiben. Geklebt
   wird nur, solange die Spalte neben dem Formular steht. */
.hsl-root .kasten{border:var(--border-hairline) solid var(--line);padding:var(--space-l)}
@media (min-width:1080px){
  .hsl-root .klebt{position:sticky;top:calc(var(--header-h,0px) + var(--space-xl))}
}
.hsl-root .posten{list-style:none;margin:0;padding:0}
.hsl-root .posten__zeile{display:flex;align-items:baseline;gap:var(--space-s);
  padding:11px 0;border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .posten__name{flex:1 1 auto;min-width:0;font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:1.4;color:var(--text-body)}
.hsl-root .posten__wert{flex:0 0 auto;text-align:right;font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:1.4;color:var(--text-body)}
.hsl-root .posten__wert--anfrage{color:var(--text-secondary)}
.hsl-root .posten__menge{display:block;color:var(--text-secondary)}
.hsl-root .posten--kopf{margin-top:var(--abstand-marke);border-bottom:var(--border-hairline) solid var(--line-strong)}
.hsl-root .posten--kopf .posten__wert{color:var(--text-secondary)}
.hsl-root .summe--pp{margin-top:var(--space-2xs)}
.hsl-root .summe__pp{font-family:var(--font-text);font-size:var(--type-body-size);color:var(--text-body)}
.hsl-root .summe{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--space-s);margin:var(--space-m) 0 0}
.hsl-root .summe__name{font-family:var(--font-text);font-size:var(--type-small-size);
  letter-spacing:.12em;text-transform:uppercase;color:var(--accent)}
.hsl-root .summe__wert{font-family:var(--font-display);font-size:var(--type-h2-size);
  line-height:1;color:var(--text-body)}
.hsl-root .ergebnis__fussnote + .btn{margin-top:var(--space-l)}
.hsl-root .ergebnis__fussnote{margin:var(--space-s) 0 0;
  color:var(--text-secondary)}
/* Anlass, für den noch keine Sätze vorliegen. Statt einer Null steht hier
   ein Satz — abgesetzt durch einen Strich in der Akzentfarbe, wie die
   Hinweiszeile im Fließtext. */
.hsl-root .ergebnis__offen{
  margin:var(--space-m) 0 0;padding:var(--space-s) 0 var(--space-s) var(--space-s);
  border-left:var(--border-hairline) solid var(--accent);
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-body);
}
.hsl-root .ergebnis__offen[hidden]{display:none}
.hsl-root .ergebnis .btn{width:100%;padding-block:16px}

/* --- Anfrageformular -------------------------------------------------- */
.hsl-root .anfrage{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:var(--space-m)}
.hsl-root .anfrage__feld{display:flex;flex-direction:column;gap:8px;min-width:0}
.hsl-root .anfrage__feld--breit{grid-column:1 / -1}
.hsl-root .anfrage label{font-family:var(--font-text);font-size:var(--type-small-size);
  letter-spacing:.12em;text-transform:uppercase;color:var(--accent)}
.hsl-root .anfrage input,.hsl-root .anfrage select,.hsl-root .anfrage textarea{width:100%;padding:12px 14px;border:var(--border-hairline) solid var(--line);
  background:transparent;font-family:var(--font-text);
  font-size:var(--type-body-size);line-height:1.4;color:var(--text-body);
  transition:border-color 300ms ease}
.hsl-root .anfrage textarea{resize:vertical}
.hsl-root .anfrage input:hover,.hsl-root .anfrage select:hover,.hsl-root .anfrage textarea:hover{border-color:var(--accent)}
.hsl-root .anfrage .btn{grid-column:1 / -1;justify-self:start}
.hsl-root .anfrage__notiz{grid-column:1 / -1;margin:0;color:var(--text-secondary)}

/* --- Vorteile: neun Punkte, zwei Spalten ------------------------------
   Fünf links, vier rechts. Wie die Ausstattung auf zimmer.html: Strich
   unter jeder Zeile, senkrechter Strich zwischen den Spalten, unter der
   letzten Zeile jeder Spalte keiner. */
.hsl-root .vorteile{list-style:none;margin:0;padding:0;display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-rows:repeat(5,auto);
  grid-auto-flow:column;gap:0 var(--space-m)}
.hsl-root .vorteil{display:flex;align-items:center;gap:12px;padding:13px 0;
  border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .vorteil:nth-child(n+6){border-left:var(--border-hairline) solid var(--line);
  padding-left:var(--space-m)}
.hsl-root .vorteil:nth-child(-n+5){padding-right:var(--space-m)}
.hsl-root .vorteil:nth-child(5),.hsl-root .vorteil:nth-child(9){border-bottom:0}
.hsl-root .vorteil__titel{min-width:0;font-family:var(--font-text);
  font-size:var(--type-body-size);line-height:1.35;color:var(--text-body)}
.hsl-root .icon--vorteil{flex:0 0 auto;width:32px;height:32px;stroke-width:0.75;
  color:var(--accent)}

/* --- Leistungen: bewusst ungleiche Spalten ---------------------------- */
.hsl-root .leistung-liste{display:grid;grid-template-columns:1fr 1fr;
  gap:var(--space-xl) var(--space-2xl)}
.hsl-root .leistung{padding-top:var(--space-m);
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .leistung__titel{margin:0;color:var(--accent)}
.hsl-root .leistung__text{margin:var(--space-xs) 0 0;max-width:52ch}

/* Beträge nie in Versalien (12.10.2026): In Überschriften mit
   text-transform:uppercase (Augenbraue) wurde aus „p. P.“ sonst „P. P.“.
   Gilt für jede Preisstelle, die hsl-preise.js füllt. */
.hsl-root [data-preis],.hsl-root [data-preis-kinder]{text-transform:none}
.hsl-root .sl-eyebrow :is([data-preis],[data-preis-kinder]){letter-spacing:.02em}

/* --- Strichliste: Aufzählung ohne Punkte ------------------------------ */
.hsl-root .strichliste{list-style:none;margin:var(--space-xs) 0 0;padding:0}
.hsl-root .strichliste li{position:relative;padding:6px 0 6px 18px;
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-body)}
.hsl-root .strichliste li::before{content:"";position:absolute;left:0;top:1.05em;
  width:8px;height:1px;background:var(--accent)}
/* Hochzeitslisten (12.10.2026): statt des Strichs zwei ineinander
   greifende Ringe, feine Linie in der Akzentfarbe. Als Maske aus einer
   data:-Adresse — die lädt ohne CORS (file://, Duda); die Farbe kommt aus
   background und folgt damit dem Theme. */
.hsl-root .strichliste--ringe li{padding-left:26px}
/* Mitte der ersten Zeile: Innenabstand 6px + halbe Zeilenhöhe (1.6em/2) − halbe Ikone. */
.hsl-root .strichliste--ringe li::before{top:calc(6px + .8em - 6px);width:17px;height:12px;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 22'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.6'%3E%3Ccircle cx='10.5' cy='12' r='7.5'/%3E%3Ccircle cx='19.5' cy='12' r='7.5'/%3E%3Cpath d='M19.5 4.5l-1.6-2h3.2z' stroke-linejoin='round'/%3E%3C/g%3E%3C/svg%3E") center/contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 22'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.6'%3E%3Ccircle cx='10.5' cy='12' r='7.5'/%3E%3Ccircle cx='19.5' cy='12' r='7.5'/%3E%3Cpath d='M19.5 4.5l-1.6-2h3.2z' stroke-linejoin='round'/%3E%3C/g%3E%3C/svg%3E") center/contain no-repeat}
.hsl-root .strichliste--paare li{display:flex;justify-content:space-between;
  gap:var(--space-s);padding-left:0;
  border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .strichliste--paare li:last-child{border-bottom:0}
.hsl-root .strichliste--paare li::before{display:none}
.hsl-root .strichliste--paare li > span:last-child{flex:0 0 auto;text-align:right;
  color:var(--text-secondary)}

/* --- Preisblock und Pakete -------------------------------------------- */
.hsl-root .preisblock,.hsl-root .zusatz{display:grid;grid-template-columns:repeat(3,1fr);
  gap:var(--space-m) var(--space-2xl)}
.hsl-root .preisblock--zwei{grid-template-columns:repeat(2,minmax(0,1fr))}
.hsl-root .preispos,.hsl-root .zusatz__spalte{padding-top:var(--space-m);
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .preispos__titel{margin:0}
.hsl-root .preispos__preis + *{margin-top:var(--space-s)}
.hsl-root .preispos__titel + .strichliste{margin-top:var(--space-s)}
.hsl-root .preispos__preis{margin:var(--space-2xs) 0 0;
  font-family:var(--font-text);font-size:var(--type-body-size);
  color:var(--accent);min-height:calc(var(--type-body-size) * 1.4)}
.hsl-root .zusatz__titel{margin:0;color:var(--accent)}
.hsl-root .zusatz__titel + *{margin-top:var(--space-s)}
.hsl-root .zusatz__lead{margin:var(--space-s) 0 0}
.hsl-root .zusatz__fussnote{margin:var(--space-s) 0 0;color:var(--text-secondary)}

/* Drei Pakete auf gemeinsamen Zeilen: Titel, Preis, fünf Bestandteile,
   Button — acht Spuren, die sich alle drei Spalten teilen. Über Subgrid
   beginnen Überschrift und Inhalt eines Bestandteils in jeder Spalte auf
   derselben Höhe, und die Haarstriche liegen auf einer Linie.
   Waagerecht kein Rasterabstand: Nur so stoßen die Striche aneinander und
   ergeben eine durchgehende Linie über den ganzen Block. Die Luft zwischen
   den Spalten steckt im rechten Innenabstand der Zellen. */
/* Seit 16.10.2026 zwei Pakete (Hochzeitspaket, Hochzeitspaket Premium). */
.hsl-root .pakete{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0}
.hsl-root .paket{display:flex;flex-direction:column}
@supports (grid-template-rows: subgrid){
.hsl-root .pakete{grid-template-rows:repeat(8,auto)}
.hsl-root .paket{display:grid;grid-row:span 8;grid-template-rows:subgrid;row-gap:0}
}
.hsl-root .paket__titel{margin:0;padding-right:var(--space-l)}
.hsl-root .paket__preis + .paket__zelle{margin-top:var(--space-m)}
.hsl-root .paket__preis{margin:var(--space-2xs) 0 0;padding-right:var(--space-l);
  font-family:var(--font-text);font-size:var(--type-body-size);
  color:var(--accent);min-height:calc(var(--type-body-size) * 1.4)}
/* Die Zelle trägt den Strich. Die letzte Zeile vor dem Button behält ihn
   auch dann, wenn sie leer ist — sonst risse die Linie ab. */
.hsl-root .paket__zelle{padding:var(--space-s) var(--space-l) var(--space-m) 0;
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .paket:last-child .paket__zelle{padding-right:0}
.hsl-root .paket__pos{margin:0;color:var(--accent)}
/* Engere Zeilen als im Fließtext: Das sind Aufzählungen, keine Absätze. */
.hsl-root .paket .strichliste{margin:0}
.hsl-root .paket .paket__pos + *{margin-top:var(--space-xs)}
.hsl-root .paket .strichliste li{padding:3px 0 3px 18px}
.hsl-root .paket .strichliste li::before{top:.85em}
.hsl-root .paket .strichliste--ringe li{padding-left:26px}
.hsl-root .paket .strichliste--ringe li::before{top:calc(3px + .8em - 6px)}
.hsl-root .paket .btn{align-self:stretch;justify-self:stretch;width:100%;
  padding-block:16px;margin-top:var(--space-l);margin-right:var(--space-l)}
.hsl-root .paket:last-child .btn{margin-right:0}
.hsl-root .kinderpreise{margin:0;padding-top:var(--space-s);
  border-top:var(--border-hairline) solid var(--line);color:var(--text-secondary)}
@media (max-width:1079px){
.hsl-root .rechner{grid-template-columns:minmax(0,1fr);gap:var(--space-xl)}
.hsl-root .preisblock,.hsl-root .zusatz{grid-template-columns:1fr 1fr;
    gap:var(--space-xl) var(--space-l)}
  /* Untereinander statt nebeneinander: Zu dritt bliebe je Spalte zu wenig
     Breite für die Aufzählungen, und die gemeinsamen Zeilen bringen keinen
     Vergleich mehr, sobald man scrollen muss. */
.hsl-root .pakete{grid-template-columns:minmax(0,1fr);gap:var(--space-2xl) 0}
.hsl-root .paket__titel,.hsl-root .paket__preis,.hsl-root .paket__zelle{padding-right:0}
.hsl-root .paket .btn{margin-right:0}
@supports (grid-template-rows: subgrid){
.hsl-root .pakete{grid-template-rows:none}
.hsl-root .paket{grid-row:auto;grid-template-rows:none;display:flex;flex-direction:column}
  }
}
@media (max-width:899px){
.hsl-root .vorteile{grid-template-columns:minmax(0,1fr);grid-template-rows:none;
    grid-auto-flow:row}
.hsl-root .vorteil:nth-child(n+6){border-left:0;padding-left:0}
.hsl-root .vorteil:nth-child(-n+5){padding-right:0}
.hsl-root .vorteil:nth-child(5){border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .vorteil:nth-child(9){border-bottom:0}
.hsl-root .leistung-liste{grid-template-columns:1fr;gap:var(--space-l)}
}
@media (max-width:640px){
.hsl-root .preisblock,.hsl-root .zusatz{grid-template-columns:1fr}
.hsl-root .anfrage{grid-template-columns:minmax(0,1fr)}
}

/* ======================================================================
   GASTRONOMIE, ANREISE, FREIZEIT, KONTAKT, PORTFOLIO
   ====================================================================== */

/* --- Faktenliste: derselbe Griff wie die Ausstattung auf zimmer.html ---
   Bezeichnung links, Angabe rechtsbündig, Haarstrich unter jeder Zeile,
   unter der letzten keiner. Trägt überall dort, wo ein Satz Angaben
   steht — Öffnungszeiten, Wege, Kontaktdaten, Technik. */
.hsl-root .fakten{list-style:none;margin:var(--space-m) 0 0;padding:0}
.hsl-root .fakten li{display:flex;align-items:baseline;gap:var(--space-s);
  padding:11px 0;border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .fakten li:last-child{border-bottom:0}
/* Der Name schrumpft nie unter sein längstes Wort — sonst lief
   „Direktverbindungen" in die Angabe daneben. Umbrechen muss die Angabe. */
.hsl-root .fakten__name{flex:1 1 auto;min-width:min-content;font-family:var(--font-text);
  font-size:var(--type-body-size);line-height:1.35;color:var(--text-body)}
.hsl-root .fakten__wert{flex:0 1 auto;text-align:right;font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:var(--type-small-lh);
  color:var(--text-secondary)}

/* --- Anreise: drei Wege nebeneinander, aber nicht als Kartenreihe ------
   Die Spalten tragen nur einen Haarstrich oben und laufen unterschiedlich
   lang aus — ihre Höhe richtet sich nach dem Inhalt, nicht nach dem
   Nachbarn. */
/* Vier Blöcke — Auto, Bahn, Flugzeug, Barrierefrei — zwei mal zwei. Drei
   nebeneinander ließen den vierten allein in einer zweiten Reihe stehen. */
.hsl-root .wege{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--abstand-kopf) var(--space-2xl);align-items:start}
.hsl-root .weg{padding-top:var(--space-m);
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .weg__titel{margin:0}

/* --- Ausflugstipps: Aufsatz auf .leistung-liste ------------------------ */
.hsl-root .tipp__name{margin:var(--space-xs) 0 0}
.hsl-root .tipp .leistung__text{margin-top:var(--space-xs)}
.hsl-root .tipp .arrow-link{margin-top:var(--space-s)}

/* --- Hinweiszeile ------------------------------------------------------
   Ein einzelner wichtiger Satz. Kein Kasten, keine Fläche: ein Strich
   links in Bronze reicht, um ihn vom Fließtext abzuheben. */
.hsl-root .hinweis{max-width:78ch;margin:0;padding:var(--space-s) 0 var(--space-s) var(--space-m);
  border-left:var(--border-hairline) solid var(--accent);
  font-family:var(--font-text);font-size:var(--type-body-size);
  line-height:var(--type-body-lh);color:var(--text-body)}
/* Fehler, den der Gast sehen muss: Strich in der Fehlerfarbe statt Bronze. */
.hsl-root .hinweis--fehler{border-left-color:var(--fehler)}
.hsl-root .hinweis[hidden]{display:none}

/* --- Portfolio: Galerie im Zwölferraster -------------------------------
   Absichtlich ungleich: Die Kader belegen 4, 5, 7, 8 oder 12 Spalten und
   wechseln zwischen 2:3 und 3:2. Keine Reihe gleicher Kacheln.
   Die Unterschriftzeile bleibt vorerst leer — sie hält nur den Platz. */
.hsl-root .galerie{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));
  gap:var(--space-xl) var(--space-m)}
.hsl-root .galerie__stueck{margin:0;min-width:0}
.hsl-root .galerie__stueck--4{grid-column:span 4}
.hsl-root .galerie__stueck--5{grid-column:span 5}
.hsl-root .galerie__stueck--7{grid-column:span 7}
.hsl-root .galerie__stueck--8{grid-column:span 8}
.hsl-root .galerie__stueck--12{grid-column:span 12}
.hsl-root .galerie__bu{margin-top:var(--space-xs);padding-top:10px;
  border-top:var(--border-hairline) solid var(--line);
  min-height:calc(var(--type-small-size) * var(--type-small-lh) + 10px);
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}

/* --- Rechtstexte: Gerüst ohne Inhalt ---------------------------------- */
/* „Datenschutzerklärung" und „Allgemeine Geschäftsbedingungen" passen
   im Anzeigegrad nicht in eine Spalte von 305px. Die Seite ist als
   lang="de" ausgezeichnet, also trennt der Browser korrekt. */
.hsl-root .rechtstext{max-width:78ch}
.hsl-root .rechtstext h1,.hsl-root .rechtstext h2{overflow-wrap:break-word}
.hsl-root .rechtstext__leer{padding:var(--space-xl) 0;
  border-top:var(--border-hairline) solid var(--line);
  border-bottom:var(--border-hairline) solid var(--line);
  color:var(--text-secondary)}
/* Kapitelmarken im Rechtstext: „§ 1 …" oder „4. …". Der Text ist ein
   .fluss; die Marken bekommen oben den Abstand eines neuen Blocks (Regel 2)
   und stehen enger am folgenden Absatz als am vorangehenden, damit die
   Gliederung beim Überfliegen trägt. */
.hsl-root .rechtstext__kapitel{padding-top:var(--space-s);
  border-top:var(--border-hairline) solid var(--line);color:var(--accent)}
.hsl-root .rechtstext.fluss > .rechtstext__kapitel{margin-top:var(--abstand-kopf)}
.hsl-root .rechtstext.fluss > .rechtstext__unter{margin-top:var(--abstand-unter)}
.hsl-root .rechtstext.fluss > :is(.rechtstext__kapitel,.rechtstext__unter) + *{margin-top:var(--abstand-marke)}
.hsl-root .rechtstext.fluss > :is(.sl-body,.strichliste,.rechtstext__liste) + :is(.sl-body,.strichliste,.rechtstext__liste){margin-top:var(--abstand-absatz)}
.hsl-root .rechtstext__unter{margin:0;font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-body-size);line-height:1.4;color:var(--text-body)}
.hsl-root .rechtstext__liste{margin:0;padding-left:var(--space-s);
  font-family:var(--font-text);font-size:var(--type-body-size);line-height:var(--type-body-lh)}
.hsl-root .rechtstext .strichliste li{font-size:var(--type-body-size);line-height:var(--type-body-lh)}
@media (max-width:1079px){
.hsl-root .wege{gap:var(--abstand-kopf) var(--space-l)}
}
@media (max-width:899px){
  /* Sechs statt zwölf Spalten: Die Kader behalten ihr Verhältnis
     zueinander, nur halbiert. */
.hsl-root .galerie{grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--space-l) var(--space-m)}
.hsl-root .galerie__stueck--4,.hsl-root .galerie__stueck--5{grid-column:span 3}
.hsl-root .galerie__stueck--7,.hsl-root .galerie__stueck--8{grid-column:span 6}
.hsl-root .galerie__stueck--12{grid-column:span 6}
}
@media (max-width:640px){
.hsl-root .wege{grid-template-columns:minmax(0,1fr)}
.hsl-root .galerie{grid-template-columns:minmax(0,1fr)}
.hsl-root .galerie__stueck--4,.hsl-root .galerie__stueck--5,.hsl-root .galerie__stueck--7,.hsl-root .galerie__stueck--8,.hsl-root .galerie__stueck--12{grid-column:span 1}
.hsl-root .fakten li{flex-direction:column;gap:2px}
.hsl-root .fakten__wert{text-align:left}
.hsl-root .hinweis{padding-left:var(--space-s)}
}

/* --- Navigationskarte (sitemap.html) ----------------------------------
   Dienstseite für die Abnahme, nicht Teil der Website. Aufbau wie die
   Ausstattung auf zimmer.html: eine Zeile je Seite, Haarstrich darunter,
   unter der letzten einer Gruppe keiner. Links Name und Dateiname,
   rechts Beschreibung, Bildzahlen und offene Punkte. */
.hsl-root .smap{list-style:none;margin:var(--space-m) 0 0;padding:0}
.hsl-root .smap__zeile{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,2.15fr);
  gap:var(--space-s) var(--space-l);padding:var(--space-m) 0;
  border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .smap__zeile:last-child{border-bottom:0}
.hsl-root .smap__name{margin:0;font-family:var(--font-display);
  font-size:var(--type-h3-size);line-height:1.15;color:var(--text-body)}
.hsl-root .smap__datei{display:block;margin-top:6px;font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:var(--type-small-lh);
  color:var(--text-secondary)}
.hsl-root .smap__text{margin:0;font-family:var(--font-text);
  font-size:var(--type-body-size);line-height:var(--type-body-lh);
  color:var(--text-body)}
/* Bildzahlen: drei Angaben in einer Zeile, durch Haarstriche getrennt. */
.hsl-root .smap__bilder{list-style:none;display:flex;flex-wrap:wrap;
  margin:var(--space-s) 0 0 -1px;padding:0}
.hsl-root .smap__bilder li{padding:2px 14px;
  border-left:var(--border-hairline) solid var(--line);
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}
.hsl-root .smap__bilder b{font-weight:var(--weight-medium);color:var(--text-body)}
.hsl-root .smap__offen{margin-top:var(--space-s)}
.hsl-root .smap__leer{margin:var(--space-s) 0 0;font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:var(--type-small-lh);
  color:var(--text-secondary)}
/* Projektsumme: dieselbe Zeilenform, nur Zahl statt Beschreibung. */
.hsl-root .summenliste{list-style:none;margin:var(--space-m) 0 0;padding:0}
.hsl-root .summenliste li{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--space-s);padding:11px 0;
  border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .summenliste li:last-child{border-bottom:0}
.hsl-root .summenliste__name{font-family:var(--font-text);font-size:var(--type-body-size);
  line-height:1.35;color:var(--text-body)}
.hsl-root .summenliste__wert{font-family:var(--font-display);font-size:var(--type-h3-size);
  line-height:1;color:var(--text-body)}
@media (max-width:899px){
.hsl-root .smap__zeile{grid-template-columns:minmax(0,1fr)}
}

/* --- Kontaktbogen (bilder/kontaktbogen.html) --------------------------
   Arbeitsmittel für die Bildabnahme, nicht Teil der Website. Die Kader
   liegen im Zielverhältnis nebeneinander, darunter die Kennzahlen als
   dichte Liste mit Haarstrichen. */
.hsl-root .kb{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:var(--space-xl) var(--space-m);list-style:none;margin:var(--space-l) 0 0;padding:0}
.hsl-root .kb__stueck{min-width:0}
.hsl-root .kb__bild{margin:0;background:var(--image-placeholder);overflow:hidden}
.hsl-root .kb__bild img{display:block;width:100%;height:100%;object-fit:cover}
.hsl-root .kb__bild--169{aspect-ratio:var(--ratio-landscape)}
.hsl-root .kb__bild--23{aspect-ratio:var(--ratio-portrait)}
.hsl-root .kb__bild--32{aspect-ratio:var(--ratio-card)}
.hsl-root .kb__name{margin:var(--space-s) 0 0;font-family:var(--font-text);
  font-weight:var(--weight-medium);font-size:var(--type-body-size);
  line-height:1.3;color:var(--text-body);word-break:break-all}
.hsl-root .kb__daten{list-style:none;margin:var(--space-xs) 0 0;padding:0}
.hsl-root .kb__daten li{display:flex;align-items:baseline;justify-content:space-between;
  gap:12px;padding:6px 0;border-bottom:var(--border-hairline) solid var(--line);
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}
.hsl-root .kb__daten li:last-child{border-bottom:0}
.hsl-root .kb__daten b{font-weight:var(--weight-medium);color:var(--text-body);
  text-align:right;word-break:break-all}
.hsl-root .kb__warnung b{color:var(--accent)}
/* Nicht belegte Steckplätze: leere Fläche mit Begründung darunter. */
.hsl-root .kb__leer{display:flex;align-items:center;justify-content:center;
  border:var(--border-hairline) dashed var(--line);
  font-family:var(--font-text);font-size:var(--type-small-size);
  color:var(--text-secondary);text-align:center;padding:var(--space-s)}
@media (max-width:1079px){
.hsl-root .kb{grid-template-columns:repeat(3,minmax(0,1fr))} }
@media (max-width:768px){
.hsl-root .kb{grid-template-columns:repeat(2,minmax(0,1fr))} }
@media (max-width:479px){
.hsl-root .kb{grid-template-columns:minmax(0,1fr)} }

/* --- Gutscheine -------------------------------------------------------- */
.hsl-root .gutschein{display:flex;flex-direction:column;align-items:center;
  text-align:center;gap:var(--space-l)}
.hsl-root .gutschein .sl-h2{max-width:26ch}
@media (max-width:1079px){
.hsl-root .zkarten{grid-template-columns:repeat(2,1fr)}
}
/* Eine Spalte, zehn Zeilen hintereinander — gleiche Zeilenform, nur ohne
   senkrechten Strich. Dann trägt der Strich unter Zeile 5 wieder. */
@media (max-width:899px){
.hsl-root .ausst-raster{grid-template-columns:1fr;grid-template-rows:none;
    grid-auto-flow:row}
.hsl-root .ausst:nth-child(n+6){border-left:0;padding-left:0}
.hsl-root .ausst:nth-child(-n+5){padding-right:0}
.hsl-root .ausst:nth-child(5){border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .ausst:nth-child(10){border-bottom:0}
}
@media (max-width:640px){
.hsl-root .zkarten{grid-template-columns:1fr}
  /* Der Überhang bliebe sonst im 20px-Seitenrand hängen. */
.hsl-root .zkarte__plakette{left:0}

}


/* ==========================================================================
   NEU AB KW38 — Umbau nach den Anmerkungen des Auftraggebers
   ========================================================================== */

/* --------------------------------------------------------------------------
   T — Typografie: Fraunces in den großen Graden
   --------------------------------------------------------------------------
   Neu gemessen an der gelieferten Datei, nicht aus den Werten der
   Vorgängerschrift fortgeschrieben. Alle Angaben in em.

   Fraunces ist eine optische Schrift: Die Achse opsz verändert nicht die
   Größe, sondern die Zeichnung. Bei 144 sind die Strichstärken
   kontrastreicher, die Serifen feiner und die Laufweite enger — so soll
   sie groß gesetzt werden. Bei 9 ist sie robust für Kleingedrucktes.
   Ohne gesetzte Achse käme die Datei mit ihrer Vorgabe opsz 9 daher und
   wirkte in 96px grob und breit.

                          opsz 144   opsz 72   opsz 48   (vorher)
     x-Höhe                 0.434     0.454     0.465      0.518
     Versalhöhe             0.700     0.700     0.700      0.725
     Ä-Spitze               0.842     0.851     0.864      0.932
     Ink-Höhe mit Ä Ö Ü     1.088     1.096     1.109      1.160
     Breite „H"             0.729     0.783     0.821      0.687
     Mittlere Kleinbuchst.  0.431     0.488     0.526      0.515

   Drei Konsequenzen, jede aus der Tabelle:

   1. KEGEL — die Erhöhung um 4 % fällt weg.
      Die Versalhöhe liegt mit 0.700 nur 3.4 % unter der der
      Vorgängerschrift, und deutsche Überschriften leben von Versalien.
      Die Zeile wird dabei kürzer, nicht länger: Bei opsz 144 läuft
      Fraunces mit 0.431 mittlerer Kleinbuchstabenbreite rund 16 %
      SCHMALER als die Vorgängerschrift — der Grund für die Erhöhung
      bestand also erst recht. Trotzdem bleibt sie weg, denn die kleinere
      x-Höhe ist bei einer optischen Schrift Absicht und kein Mangel: Wer
      sie durch Kegel ausgleicht, macht die Versalien zu groß. Geprüft am
      Hero: Die Zeilen tragen.

   2. ZEILENABSTAND — zurück, aber nicht ganz auf die alten Werte.
      Die Vorgängerschrift zwang wegen ihrer Versal-Umlaute bei 0.932 auf
      1.08 bis 1.18. Fraunces kommt mit 0.842 aus. Die Ink-Höhe beträgt
      aber immer noch 1.088 em — bei Zeilenabstand 1.02, wie ihn das
      ursprüngliche Designsystem vorsah, überlappten sich die Zeilen um
      0.07 em. Die Werte unten lassen in jedem Grad Luft, auch wenn eine
      Unterlänge direkt über einem „Ü" steht.

   3. LAUFWEITE — neu bestimmt, nicht übernommen.
      Die Vorgängerschrift brauchte -0.005 em, weil sie schon eng lief.
      Fraunces bringt die Verengung bei opsz 144 selbst mit; ein weiteres
      Minus ließe die Versalien zusammenlaufen. Deshalb -0.01 em im
      größten Grad, danach abnehmend bis 0 — je kleiner der Grad, desto
      weiter die Zeichnung ohnehin.

   Fraunces steht nur in den großen Graden: sl-display, sl-h1, sl-h2 und
   den großen Kennzahlen. Alles, was gelesen und nicht betrachtet wird —
   sl-h3, Karten-Unterzeilen, Navigation, Knöpfe, Tabellen, Preise —
   bleibt bei Inter. */

.hsl-root{
  --type-display-size:clamp(48px,7vw,96px);
  --type-display-lh:1.10;
  --type-display-ls:-0.01em;
  --type-h1-size:clamp(36px,5vw,64px);
  --type-h1-lh:1.12;
  --type-h2-size:clamp(28px,3.6vw,44px);
  --type-h2-lh:1.16;
  --type-h3-size:clamp(20px,1.7vw,23px);
  --type-h3-lh:1.35;
}

/* Achsen je Grad. font-variation-settings setzt sich über font-weight
   hinweg, deshalb steht das Gewicht hier mit in der Klammer — sonst
   griffe die Vorgabe der Datei (900). */
.hsl-root .sl-display,
.hsl-root .sl-h1{
  font-variation-settings:"opsz" 144,"wght" 400,"SOFT" 0,"WONK" 0;
  font-weight:400;
}
.hsl-root .sl-h1{letter-spacing:-0.008em}

.hsl-root .sl-h2{
  font-variation-settings:"opsz" 72,"wght" 400,"SOFT" 0,"WONK" 0;
  font-weight:400;
  letter-spacing:-0.004em;
}

/* Die großen Kennzahlen: etwas kräftiger, damit eine einzelne „1" neben
   der Beschriftung nicht verloren wirkt. */
.hsl-root .figure-num,
.hsl-root .kennzahl__wert,
.hsl-root .stimme__wert,
.hsl-root .summe__wert{
  font-variation-settings:"opsz" 48,"wght" 500,"SOFT" 0,"WONK" 0;
  font-weight:500;
}


/* Das Designsystem verbietet automatische Silbentrennung in den großen
   Graden — lange Wörter sollen von Hand umbrochen werden. Auf dem Telefon
   trägt das nicht mehr: „Besuchersalzbergwerk" misst bei 38px rund 420px
   und sprengt jede Spalte von 320px. Auf den Ausflugsseiten stehen solche
   Ortsnamen zwangsläufig, und ein <br> von Hand säße bei jeder Breite
   falsch.

   Deshalb unterhalb 640px: Trennung erlaubt. Die Seiten sind lang="de"
   ausgezeichnet, der Browser trennt also nach deutschen Regeln.
   break-word ist die Notbremse für den Fall, dass kein Trennmuster
   vorliegt — lieber eine harte Trennung als ein waagerechter Balken. */
@media (max-width:640px){
  /* Seit 12.10.2026 ohne automatische Trennung (hyphens:manual, oben);
     break-word bleibt als Notbremse gegen waagerechten Überlauf. */
  .hsl-root .sl-display,
  .hsl-root .sl-h1,
  .hsl-root .sl-h2{overflow-wrap:break-word}
}

/* sl-h3 ist ab jetzt eine Textschrift-Zwischenüberschrift: Karten, Spalten,
   Raumnamen. Medium statt Regular, damit sie ohne Serifen trotzdem trägt. */
.hsl-root .sl-h3{
  font-family:var(--font-text);font-weight:var(--weight-medium);
  letter-spacing:-0.005em;
}

/* Die großen Zahlen bleiben Zierde und damit Anzeigeschrift. Die kleinen —
   Regler, Summenliste, Navigationskarte — wandern zu Inter, dort werden
   sie gelesen. */
.hsl-root .regler__wert,
.hsl-root .smap__name,
.hsl-root .summenliste__wert{font-family:var(--font-text);font-weight:var(--weight-medium)}

/* --------------------------------------------------------------------------
   F — Akzentflächen: weiße Schrift auf Horn
   --------------------------------------------------------------------------
   Jede Hornfläche der Website ist #B3893C (--bronze) — in beiden Themes,
   im Kopf, im Fuß, über Bildern. Keine hellere oder dunklere Fassung, auch
   nicht beim Überfahren.

   Die Schrift darauf ist Weiß (--on-accent). Entscheidung des
   Auftraggebers, bewusst: Weiß erreicht auf #B3893C nur 3,2 : 1 — für
   großen Text nach WCAG ausreichend, für kleinen nicht. Deshalb gilt auf
   Horn eine feste Satzregel, die den Text in die Klasse „groß" hebt und
   dicht setzt:

     mindestens 16 px, Gewicht 600, Laufweite eng (0,02 em).

   Keine dünne, kleine oder weit gesperrte Schrift auf Horn. Die Regel
   gilt für .btn--fill und damit für alle Hornknöpfe; andere Hornflächen
   mit Text gibt es nicht. */

.hsl-root .btn--fill{
  background:var(--bronze);
  border-color:var(--bronze);
  color:var(--on-accent);
  font-size:var(--type-akzent-size);
  font-weight:var(--weight-akzent);
  letter-spacing:var(--type-akzent-ls);
  /* Gleiche Höhe wie die Umrissknöpfe daneben trotz größerer Schrift. */
  padding-block:calc(var(--space-xs) - 2px);
}
.hsl-root .btn--fill.btn--compact{padding-block:calc(var(--space-xs) - 4px)}
/* Überfahren: Die Fläche bleibt, eine feine weiße Innenlinie zeigt den
   Zustand. Eine hellere Fläche senkte den Kontrast unter 3 : 1. */
.hsl-root .btn--fill:hover{
  background:var(--bronze);
  border-color:var(--bronze);
  color:var(--on-accent);
  outline:var(--border-hairline) solid rgba(255,255,255,.8);
  outline-offset:-5px;
}
.hsl-root .btn--fill:focus-visible{outline:var(--border-hairline) solid var(--accent-light);outline-offset:3px}
/* Abgeschaltet (Platzhalterleiste auf zimmer.html): kein Ausgrauen über
   Deckkraft — das machte die weiße Schrift blass. */
.hsl-root .btn--fill[disabled]{cursor:default;opacity:1}

/* --------------------------------------------------------------------------
   H — Kopfzeile: Aufklappmenü unter „Events"
   --------------------------------------------------------------------------
   Öffnet auf Zeigegeräten beim Überfahren, auf allen Geräten per Klick und
   bei Tastaturfokus. „Events" selbst bleibt ein Link auf die Übersicht; das
   Aufklappen hängt an einem eigenen Schalter daneben, damit der Link nicht
   zwei Aufgaben auf einmal trägt. */

.hsl-root .nav__gruppe{position:relative;display:flex;align-items:center;gap:2px}

.hsl-root .nav__schalter{
  display:inline-flex;align-items:center;justify-content:center;
  width:22px;height:22px;padding:0;margin:0;
  background:transparent;border:0;border-radius:var(--radius);
  color:var(--text-secondary);cursor:pointer;
  transition:color .3s ease,transform .3s ease;
}
.hsl-root .nav__schalter svg{width:12px;height:12px;display:block;
  fill:none;stroke:currentColor;stroke-width:1.75;
  stroke-linecap:round;stroke-linejoin:round}
.hsl-root .nav__gruppe:hover .nav__schalter,
.hsl-root .nav__schalter[aria-expanded="true"]{color:var(--text-body)}
.hsl-root .nav__schalter[aria-expanded="true"]{transform:rotate(180deg)}

.hsl-root .nav__menu{
  position:absolute;top:100%;left:0;z-index:30;
  min-width:232px;margin:0;padding:var(--space-xs) 0;
  list-style:none;
  background:var(--header-surface);
  border:var(--border-hairline) solid var(--line);
  /* Der Kopf hat unten schon eine Haarlinie — die des Menüs säße direkt
     darauf und ergäbe einen doppelten Strich. */
  border-top:0;
  opacity:0;visibility:hidden;
  transition:opacity .3s ease,visibility .3s ease;
}
.hsl-root .nav__gruppe:hover > .nav__menu,
.hsl-root .nav__gruppe:focus-within > .nav__menu,
.hsl-root .nav__gruppe[data-open="true"] > .nav__menu{opacity:1;visibility:visible}

.hsl-root .nav__menu a{
  display:block;padding:10px var(--space-s);border:0;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-button-size);letter-spacing:var(--type-button-ls);
  text-transform:uppercase;color:var(--text-secondary);
  transition:color .3s ease,background .3s ease;
}
.hsl-root .nav__menu a:hover,
.hsl-root .nav__menu a:focus-visible{
  color:var(--text-body);
  background:color-mix(in srgb,var(--accent) 14%,transparent);
}
.hsl-root .nav__menu a[aria-current="page"]{color:var(--text-body)}

/* Die Lücke zwischen Kopfzeilenunterkante und Menü wäre sonst eine
   Mausfalle: Der Zeiger verlässt die Gruppe, das Menü klappt zu. Ein
   unsichtbarer Streifen über dem Menü hält den Überfahr-Zustand. */
.hsl-root .nav__menu::before{
  content:"";position:absolute;left:0;right:0;top:-12px;height:12px;
}

/* --------------------------------------------------------------------------
   K — Kachelsatz
   --------------------------------------------------------------------------
   Ersetzt die beiden großen Zweispaltenkarten und den Schachbrettsatz. Der
   Auftraggeber liest Kacheln schneller als Wechselsätze. Jede Kachel ist
   vollständig anklickbar; das Bild steht im Querformat 3:2.
   Über Subgrid teilen sich alle Kacheln einer Reihe dieselben Zeilen, damit
   Überschriften und Pfeile fluchten. */

.hsl-root .kacheln{
  display:grid;grid-template-columns:repeat(var(--kachel-spalten,3),minmax(0,1fr));
  gap:var(--space-xl) var(--space-m);list-style:none;margin:0;padding:0;
}
.hsl-root .kacheln--2{--kachel-spalten:2}
.hsl-root .kacheln--3{--kachel-spalten:3}
.hsl-root .kacheln--4{--kachel-spalten:4}

.hsl-root .kachel{display:flex;flex-direction:column;min-width:0}
@supports (grid-template-rows: subgrid){
  .hsl-root .kacheln{grid-template-rows:auto auto auto auto}
  /* Auch das <li> muss Subgrid sein: Ist es Flex, ist der Link darin kein
     Rasterelement der Reihe, sein „subgrid" verfällt, und Titel benachbarter
     Kacheln lagen je nach Textlänge bis zu 6 px versetzt (gefunden im
     Durchgang 5 an „1 Apartment"). */
  .hsl-root .kachel{grid-row:span 4;display:grid;grid-template-rows:subgrid;row-gap:0}
  .hsl-root .kachel > .kachel__link{display:grid;grid-row:span 4;
    grid-template-rows:subgrid;row-gap:0}
}

.hsl-root .kachel__link{
  display:flex;flex-direction:column;border:0;color:inherit;
  text-decoration:none;height:100%;
}
.hsl-root .kachel__media{margin:0}

/* --------------------------------------------------------------------------
   Platzhalter statt Foto (.platzhalter-bild) — seit 10.10.2026 für die
   Burgenstraße und den Salzwanderweg, deren Bilder nicht die echten Orte
   zeigten. Steht in einer .frame__box an der Stelle von <picture>: Das
   Seitenverhältnis kommt weiter vom Rahmen (frame--card, --wide,
   --portrait), nichts springt. Dunkelblau in beiden Themes wie der Kopf,
   dezentes Linienmuster, in der Mitte eine Linien-Ikone (Lucide) und der
   Ortsname.

   Echtes Foto einsetzen: im <img class="platzhalter-bild__foto"> nur src
   (und alt) eintragen. Ohne src ist das Bild ausgeblendet; mit src deckt
   es die Fläche ab (object-fit: cover wie alle .frame__img). Ikone und
   Name bleiben darunter und sind dann verdeckt.
   -------------------------------------------------------------------------- */
.hsl-root .platzhalter-bild{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:var(--space-s);padding:var(--space-m);
  text-align:center;color:#d9b56b;
  background:
    repeating-linear-gradient(135deg, rgba(255,253,248,.045) 0 1px, transparent 1px 14px),
    radial-gradient(120% 90% at 50% 38%, #1c3657 0%, #0e1e33 72%);}
.hsl-root .platzhalter-bild__ikone{width:clamp(40px,14%,72px);height:auto;flex:none;
  fill:none;stroke:currentColor;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round}
.hsl-root .platzhalter-bild__name{font-family:var(--font-display);font-weight:400;
  font-size:clamp(18px,2.2vw,28px);line-height:1.2;color:#fffdf8;max-width:18ch}
.hsl-root .platzhalter-bild__foto:not([src]),
.hsl-root .platzhalter-bild__foto[src=""]{display:none}
/* Der ganze Kader bekommt beim Überfahren die helle Linie — sonst müsste
   der Nutzer raten, was an einer Kachel der Link ist. */
.hsl-root .kachel__link:hover .frame__box,
.hsl-root .kachel__link:focus-visible .frame__box{border-color:var(--accent-light)}

.hsl-root .kachel__titel{
  margin:var(--space-s) 0 0;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-h3-size);line-height:var(--type-h3-lh);
  letter-spacing:-0.005em;color:var(--text-body);
}
.hsl-root .kachel__text{
  margin:var(--space-xs) 0 0;
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary);
}
/* Die Pfeilzeile steht unten und damit in allen Kacheln der Reihe auf einer
   Höhe — auch wenn ein Text zwei Zeilen länger läuft. */
.hsl-root .kachel__pfeil{
  display:inline-flex;align-items:baseline;gap:10px;align-self:start;
  margin-top:auto;padding-top:var(--space-s);
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-small-size);color:var(--accent-light);
}
.hsl-root .kachel__link:hover .kachel__pfeil{color:var(--text-body)}
/* Anlass-Kacheln (12.10.2026): Bild, Titel und Text führen auf die Seite
   des Anlasses, die Pfeilzeile „… anfragen“ ist ein eigener Link in den
   Veranstaltungsrechner mit Vorauswahl (?anlass=…). Zwei Links statt
   eines, weil „anfragen“ sonst auf der Infoseite landete. */
.hsl-root a.kachel__pfeil{border-bottom:0;text-decoration:none}
.hsl-root .kachel--zwei-ziele > .kachel__link{height:auto;flex:1 1 auto}
.hsl-root a.kachel__pfeil:hover,.hsl-root a.kachel__pfeil:focus-visible{color:var(--text-body)}
.hsl-root .kachel--zwei-ziele .kachel__link:hover ~ .kachel__pfeil{color:var(--text-body)}
@supports (grid-template-rows: subgrid){
  .hsl-root .kachel--zwei-ziele > .kachel__link{grid-row:span 3}
}

/* Platzhalter, solange kein Foto vorliegt: Fläche im Zielverhältnis mit
   gestrichelter Kante, damit im Entwurf niemand ein fehlendes Bild für
   gesetzt hält. */
.hsl-root .frame__box--platzhalter{
  border-style:dashed;
  display:flex;align-items:center;justify-content:center;
}

/* Reservierter Platz in einer Reihe mit anderem Verhältnis.
   Nur noch an einer Stelle: In der Ausflugsreihe der Startseite stehen drei
   Hochformate neben dem Platzhalter „Radtouren" im Querformat. Die Kader
   teilen sich über Subgrid dieselben Zeilen — eine kürzere Zelle verschöbe
   Überschrift, Text und Pfeil der ganzen Spalte nach oben. (Die Räume
   brauchen das nicht mehr: dort stehen jetzt alle drei in 3:2.)
   Die Zelle nimmt hier die Höhe ihrer Nachbarn an, das gestrichelte Feld
   darin behält sein eigenes Verhältnis und steht mittig. Sobald das Foto da
   ist, fällt der Modifikator weg. */
.hsl-root .medien--reserviert{
  aspect-ratio:var(--ratio-portrait);
  display:flex;flex-direction:column;justify-content:center;
}
.hsl-root .medien--reserviert .frame__box{width:100%}

/* Hero ohne Foto: dieselbe Fläche, dieselbe Höhe, nur gestrichelt. Damit
   verschiebt sich beim Einsetzen des Bildes nichts. */
.hsl-root .hero__ersatz{
  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  background:var(--image-placeholder);
  border-bottom:var(--border-hairline) dashed var(--scrim-line);
}
.hsl-root .hero__ersatz .frame__label{
  position:static;color:var(--scrim-accent);text-align:center;
  padding:var(--space-s);margin:0;
  font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-eyebrow-size);letter-spacing:var(--type-eyebrow-ls);
  text-transform:uppercase;
}

/* --------------------------------------------------------------------------
   Z — Kennzahlenreihe
   --------------------------------------------------------------------------
   Fünf Zahlen. Desktop in einer Zeile, Tablet 3+2, Telefon 2+2+1. Das Raster
   läuft deshalb über sechs Spuren: 6/5 geht nicht auf, 6/3 und 6/2 schon. */

.hsl-root .kennzahlreihe{
  display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
  gap:0;list-style:none;margin:0;padding:0;
  border-top:var(--border-hairline) solid var(--line);
}
.hsl-root .kennzahl{
  display:flex;flex-direction:column;gap:var(--space-2xs);
  padding:var(--space-m) var(--space-m) var(--space-m) 0;
  border-left:var(--border-hairline) solid var(--line);
  padding-left:var(--space-m);
}
.hsl-root .kennzahl:first-child{border-left:0;padding-left:0}
.hsl-root .kennzahl__wert{
  /* Gewicht und Achsen stehen im Typografieblock weiter oben — hier nur
     Größe und Farbe, sonst überschriebe diese Regel die Achseneinstellung. */
  font-family:var(--font-display);
  font-size:clamp(44px,4.6vw,64px);line-height:1;color:var(--text-body);
}
.hsl-root .kennzahl__name{
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary);
}

@media (max-width:1079px){
  .hsl-root .kennzahlreihe{grid-template-columns:repeat(6,minmax(0,1fr))}
  .hsl-root .kennzahl{grid-column:span 2}
  .hsl-root .kennzahl:nth-child(4),
  .hsl-root .kennzahl:nth-child(5){grid-column:span 3}
  /* Zeilenanfänge tragen keinen senkrechten Strich, dafür die zweite Zeile
     einen waagerechten. */
  .hsl-root .kennzahl:nth-child(4){border-left:0;padding-left:0}
  .hsl-root .kennzahl:nth-child(4),
  .hsl-root .kennzahl:nth-child(5){border-top:var(--border-hairline) solid var(--line)}
}
@media (max-width:640px){
  .hsl-root .kennzahlreihe{grid-template-columns:repeat(2,minmax(0,1fr))}
  .hsl-root .kennzahl,
  .hsl-root .kennzahl:nth-child(4),
  .hsl-root .kennzahl:nth-child(5){grid-column:span 1}
  .hsl-root .kennzahl:nth-child(odd){border-left:0;padding-left:0}
  .hsl-root .kennzahl:nth-child(n+3){border-top:var(--border-hairline) solid var(--line)}
  .hsl-root .kennzahl:nth-child(5){grid-column:span 2}
  .hsl-root .kennzahl__wert{font-size:clamp(38px,11vw,52px)}
}

/* --------------------------------------------------------------------------
   IBE — Platz für den Buchungsmotor
   --------------------------------------------------------------------------
   Die Höhe steht fest, bevor myIBE geladen ist. Sonst schöbe das Widget beim
   Erscheinen den halben Hero nach unten. Gemessen an der Buchungsleiste
   darunter, die denselben Platz einnimmt. */

.hsl-root .ibe{
  width:100%;max-width:900px;margin:var(--space-xl) auto 0;
  min-height:92px;
  display:flex;flex-direction:column;align-items:center;
}

/* --- Buchungsmaske: Einbaustelle #hsl-ibe (uphotel/myIBE) ----------------
   Durchgang 7: Der Code des Hauses ist eingesetzt. Die Maske bringt ihr
   eigenes Stilblatt (Angular Material) mit; die Website greift NICHT mehr
   in ihre Felder und Knöpfe ein — eine Schrift für alle Nachfahren hätte
   etwa die Symbolschrift der Maske zerstört. Umgekehrt sind die
   allgemeinen Regeln der Website für Links und Bilder (siehe oben,
   :where(:not(.ibe__einbau *))) von der Maske ausgenommen.

   Zustände in data-ibe an #hsl-ibe, gesetzt von zimmer.html:
     (keiner)  ohne Javascript — der Ersatz steht
     laedt     Maske kommt noch — Platz gehalten, kein Ersatz
     bereit    Maske steht — Ersatz aus
     ersatz    Skript fehlt oder Maske startet nicht — nur der Ersatz */
.hsl-root .ibe__einbau{width:100%;text-align:left;color:var(--text-body)}
.hsl-root .ibe__einbau:not([data-ibe]) ibe-up,
.hsl-root .ibe__einbau[data-ibe="ersatz"] ibe-up{display:none}
.hsl-root .ibe__einbau[data-ibe="laedt"],
.hsl-root .ibe__einbau[data-ibe="bereit"]{min-height:92px}
.hsl-root .ibe__einbau[data-ibe="laedt"] .ibe__ersatz,
.hsl-root .ibe__einbau[data-ibe="bereit"] .ibe__ersatz{display:none}
.hsl-root .ibe__ersatz{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:var(--space-s) var(--space-m);
  padding:var(--space-m);border:var(--border-hairline) solid var(--line);
  background:var(--scrim-surface,rgba(8,21,36,.72));
}
.hsl-root .ibe__ersatz-text{flex:1 1 320px;margin:0}
/* „Verfügbarkeit per E-Mail anfragen“ ist auf dem Telefon breiter als der
   Bildschirm: umbrechen statt die Seite seitlich zu verbreitern. */
.hsl-root .ibe__ersatz .btn{max-width:100%;white-space:normal;text-align:center;line-height:1.25}
/* Lesbarkeit in allen Schritten (Frau Schumacher, Durchgang 8): Die Maske
   schreibt dunkelblau (#0f2a4d) — auf dem dunklen Titelbild waren die
   Schrittleiste „1 2 3 Wunschtermin auswählen“, die Zimmerliste, Preise und
   „Hinzufügen“ kaum zu lesen. Deshalb steht die ganze Maske auf einer
   hellen Fläche, unabhängig vom Theme; Schriftfarbe ausdrücklich gesetzt.
   Die Fläche wächst mit: Ergebnisse und weitere Schritte verlängern den
   Titelbereich, statt unten abgeschnitten zu werden (siehe .hero unten). */
.hsl-root .ibe__einbau[data-ibe] ibe-up{
  display:block;background:#fffdf8;color:#0f2a4d;
  padding:var(--space-m) var(--space-m) var(--space-s);
  border:var(--border-hairline) solid rgba(15,42,77,.12);
}
.hsl-root .ibe__einbau[data-ibe="ersatz"] ibe-up{display:none}
/* Kalender und leere Fläche (Durchgang 8, Nachtrag): Der Datumskalender
   der Maske (ibe-date-range-picker) liegt IN ibe-up, absolut unter der
   Suchzeile (z-index 10) — kein Overlay am body. Der Titelbereich schnitt
   ihn mit overflow:hidden ab. Auf der Zimmerseite schneidet deshalb nicht
   mehr der Titelbereich, sondern nur noch die Bildebene (picture) das Foto
   zu; der Titelbereich selbst lässt den Kalender über die nächste Sektion
   ragen (z-index 5: über den Sektionen, unter dem Kopf mit 20).
   Die leere Fläche unter der Suchzeile war margin-bottom:100px der Maske
   (.up-ibe) — die helle Fläche ist jetzt so hoch wie ihr Inhalt. */
.hsl-root .hero:has(.ibe__einbau){overflow:visible;z-index:5}
.hsl-root .hero:has(.ibe__einbau) > picture{position:absolute;inset:0;overflow:hidden}
.hsl-root .ibe__einbau .up-ibe{margin-bottom:0}
/* „Jetzt buchen“ lief über den Knopf hinaus (Knopf 93 px, Text 132 px). */
.hsl-root .ibe__einbau .ibe-submit-search-btn{
  width:auto;min-width:max-content;white-space:nowrap;
}
/* Dafür geben „Zimmer“ und „Personen“ etwas Breite ab (Vorgabe der Maske:
   je 200 px), sonst schrumpfte das Feld „Code“ auf 28 px. */
.hsl-root .ibe__einbau .ibe-property-id{min-width:180px;width:auto}
.hsl-root .ibe__einbau .ibe-persons-qty{min-width:140px;width:auto}
.hsl-root .ibe__einbau .ibe-promo-code{min-width:96px}
@media (max-width:640px){
  .hsl-root .ibe__einbau[data-ibe] ibe-up{padding:var(--space-s) var(--space-xs)}
  .hsl-root .ibe__einbau .ibe-property-id,
  .hsl-root .ibe__einbau .ibe-persons-qty,
  .hsl-root .ibe__einbau .ibe-promo-code{min-width:0;width:100%}
  .hsl-root .ibe__einbau .ibe-submit-search-btn{width:100%;min-width:0}
}
/* Titelbereich der Zimmerseite: mindestens bildschirmhoch wie bisher, aber
   nicht mehr fest — die Ergebnisse der Maske haben Platz. */
@media (min-width:641px){
  .hsl-root .hero:has(.ibe__einbau){
    height:auto;
    min-height:max(560px, calc(100vh - var(--header-h,132px)));
    min-height:max(560px, calc(100svh - var(--header-h,132px)));
  }
}
/* Das Stilblatt der Maske nimmt allen Knöpfen der Seite den Fokusrahmen
   (button:focus{outline:0}). Hier kommt er für die Knöpfe der Website
   zurück; Knöpfe mit eigenem Fokusbild (.btn …) bleiben unberührt. */
.hsl-root button:focus-visible{outline:revert}
@media (max-width:640px){
  .hsl-root .ibe{min-height:0}
}

/* --------------------------------------------------------------------------
   Ausstattung als Vergleichstabelle
   --------------------------------------------------------------------------
   Eine echte Tabelle mit <th scope>, damit ein Screenreader „Klimaanlage,
   Schlossgebäude, Nein" vorliest und nicht drei zusammenhanglose Zellen.
   Die Zeilenform ist die der übrigen Datenlisten: Haarstrich unter jeder
   Zeile, unter der letzten keiner. */

.hsl-root .ausst-tabelle{
  width:100%;border-collapse:collapse;margin-top:var(--space-xs);
  font-family:var(--font-text);
}
.hsl-root .ausst-tabelle caption{
  text-align:left;padding-bottom:var(--space-s);color:var(--text-secondary);
}
.hsl-root .ausst-tabelle thead th{
  text-align:left;padding:0 var(--space-s) var(--space-s);
  font-weight:var(--weight-medium);font-size:var(--type-eyebrow-size);
  letter-spacing:var(--type-eyebrow-ls);text-transform:uppercase;
  color:var(--accent);
  border-bottom:var(--border-hairline) solid var(--line-strong);
  width:22%;
}
.hsl-root .ausst-tabelle thead td{border-bottom:var(--border-hairline) solid var(--line-strong)}
.hsl-root .ausst-tabelle tbody th{
  display:table-cell;vertical-align:middle;
  text-align:left;font-weight:var(--weight-regular);
  padding:var(--space-s) var(--space-s) var(--space-s) 0;
  border-bottom:var(--border-hairline) solid var(--line);
}
.hsl-root .ausst-tabelle tbody th .ausst-th-wrap{
  display:inline-flex;align-items:center;gap:12px;
}
.hsl-root .ausst-tabelle tbody th span{
  font-size:var(--type-body-size);line-height:1.35;color:var(--text-body);
}
.hsl-root .ausst-tabelle tbody td{
  display:table-cell;
  padding:var(--space-s);vertical-align:middle;
  font-size:var(--type-body-size);line-height:1.35;color:var(--text-secondary);
  border-bottom:var(--border-hairline) solid var(--line);
}
.hsl-root .ausst-tabelle tbody tr:last-child th,
.hsl-root .ausst-tabelle tbody tr:last-child td{border-bottom:0}
/* „Nein" ist eine Aussage, keine Fehlermeldung — dieselbe Farbe wie „Ja",
   nur die Zeile selbst trägt die Information. */
.hsl-root .ausst-karten{display:none}

@media (max-width:768px){
  /* Zwei Wertespalten neben einer Bezeichnung passen auf dem Telefon nicht.
     Dort steht je Haus eine Karte — dieselben Angaben, nur untereinander. */
  .hsl-root .ausst-tabelle{display:none}
  .hsl-root .ausst-karten{display:grid;gap:var(--space-xl)}
  .hsl-root .ausst-karte__titel{
    margin:0;padding-bottom:var(--space-xs);
    border-bottom:var(--border-hairline) solid var(--line-strong);
    font-family:var(--font-text);font-weight:var(--weight-medium);
    font-size:var(--type-eyebrow-size);letter-spacing:var(--type-eyebrow-ls);
    text-transform:uppercase;color:var(--accent);
  }
  .hsl-root .ausst-karte__liste{list-style:none;margin:0;padding:0}
  .hsl-root .ausst-karte__titel + *{margin-top:var(--space-xs)}
  .hsl-root .ausst-karte__zeile{
    display:flex;align-items:center;gap:12px;padding:11px 0;
    border-bottom:var(--border-hairline) solid var(--line);
  }
  .hsl-root .ausst-karte__zeile:last-child{border-bottom:0}
  .hsl-root .ausst-karte__name{
    flex:1 1 auto;min-width:0;font-family:var(--font-text);
    font-size:var(--type-body-size);line-height:1.35;color:var(--text-body);
  }
  .hsl-root .ausst-karte__wert{
    flex:0 1 auto;text-align:right;font-family:var(--font-text);
    font-size:var(--type-small-size);line-height:var(--type-small-lh);
    color:var(--text-secondary);
  }
}

/* --------------------------------------------------------------------------
   Gutscheine — Tizer mit Zierlinie
   --------------------------------------------------------------------------
   Kein Foto: Das Haus hat keine Gutscheinaufnahme, und ein gekauftes Bild
   wäre an dieser Stelle Staffage. Stattdessen eine gezeichnete Schleife in
   der Akzentfarbe, weit heruntergeregelt, damit sie Grund bleibt und nicht
   Gegenstand wird. */

.hsl-root .gutschein{position:relative;isolation:isolate;
  padding-block:var(--space-xl)}
.hsl-root .gutschein__zier{
  position:absolute;inset:0;margin:auto;z-index:-1;
  width:min(680px,92%);height:auto;
  color:var(--accent);opacity:.16;
  pointer-events:none;
}
.hsl-root .gutschein__inhalt{
  display:flex;flex-direction:column;align-items:center;text-align:center;
}
.hsl-root .gutschein__inhalt .sl-h2{max-width:26ch}
@media (max-width:640px){
  .hsl-root .gutschein__zier{width:104%;opacity:.12}
}

/* --------------------------------------------------------------------------
   Karte, zweiklickig
   --------------------------------------------------------------------------
   Die Vorschau ist eine eigene Zeichnung und lädt nichts nach. Sie hält
   exakt die Fläche, die der Kartenrahmen später einnimmt — deshalb springt
   beim Laden nichts. */

.hsl-root .karte{
  position:relative;width:100%;aspect-ratio:var(--ratio-wide);
  min-height:320px;overflow:hidden;
  border:var(--border-hairline) solid var(--line);
  background:var(--image-placeholder);
}
.hsl-root .karte__vorschau{position:absolute;inset:0}
.hsl-root .karte__vorschau[hidden]{display:none}
.hsl-root .karte__skizze{
  position:absolute;inset:0;width:100%;height:100%;
  color:var(--bronze-hell);
}
.hsl-root .karte__marke{
  fill:var(--elfenbein);font-family:var(--font-text);font-weight:500;
  font-size:34px;letter-spacing:.04em;
}
.hsl-root .karte__marke--klein{fill:var(--daemmerung);font-size:24px;font-weight:400}
/* Knopf und Satz liegen über der Skizze, auf einer abdunkelnden Fläche —
   sonst stünde heller Text auf hellen Linien. */
.hsl-root .karte__aktion{
  position:absolute;inset:auto 0 0;padding:var(--space-l) var(--space-m);
  display:flex;flex-direction:column;align-items:center;gap:var(--space-xs);
  background:linear-gradient(to top,rgba(8,21,36,.94) 0,rgba(8,21,36,.78) 60%,rgba(8,21,36,0) 100%);
}
.hsl-root .karte__datenschutz{
  margin:0;max-width:62ch;text-align:center;
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--daemmerung);
}
.hsl-root .karte__rahmen{position:absolute;inset:0;width:100%;height:100%;border:0}

/* MapTiler: Farben der hellen Grundlage, abgeleitet aus der Palette. Das
   Skript liest diese Werte nach dem Laden und stellt die Karte damit um —
   die Karte bleibt in beiden Themes hell. */
.hsl-root{
  --karte-flaeche:#EFE7D8;          /* Sand, eine Stufe dunkler: Wohngebiet, Wald */
  --karte-gebaeude:var(--sandpanel);
  --karte-wasser:#C9D2DD;           /* Dämmerung, aufgehellt */
  --karte-schrift-leise:#3A4A60;    /* = --text-on-panel-secondary */
}
.hsl-root .karte[data-geladen="true"]{background:var(--sand)}
/* Marke des Hauses: Bronze, mit elfenbeinfarbenem Kern. */
.hsl-root .karte__haus{width:32px;height:44px;cursor:default}
.hsl-root .karte__haus svg{display:block;width:100%;height:100%;overflow:visible}
.hsl-root .karte__haus path{fill:var(--bronze);stroke:var(--nachtblau);stroke-width:1.2}
.hsl-root .karte__haus circle{fill:var(--elfenbein)}
/* Nennung und Bedienelemente von MapLibre in der Hausschrift. Die Nennung
   von MapTiler und OpenStreetMap bleibt immer sichtbar — Nutzungsbedingung. */
.hsl-root .karte .maplibregl-ctrl-attrib{font-family:var(--font-text);font-size:11px;
  background:rgba(255,253,248,.88);color:var(--nachtblau)}
.hsl-root .karte .maplibregl-ctrl-attrib a{color:var(--nachtblau);border-bottom:0}
.hsl-root .karte .maplibregl-ctrl-group{border-radius:0;box-shadow:none;
  border:var(--border-hairline) solid var(--nachtblau)}
.hsl-root .karte__fehler{position:absolute;left:var(--space-s);right:var(--space-s);bottom:var(--space-s);
  margin:0;padding:var(--space-xs) var(--space-s);background:var(--elfenbein);color:var(--nachtblau);
  font-family:var(--font-text);font-size:var(--type-small-size);border-left:var(--border-hairline) solid var(--fehler)}
.hsl-root .karte__fehler[hidden]{display:none}

/* --- Anreise: Vorschau als Kartenbild, Routenplanung daneben ----------
   (Durchgang 5, h1). Die Vorschau zeichnet die Farben der geladenen Karte
   nach — Sand, Wasser in aufgehellter Dämmerung, Straßen in Elfenbein —
   und die Marke des Hauses. „Karte laden" steht in der Mitte. Der Satz
   zum Datenschutz steht unter der Karte, nicht auf ihr. */
.hsl-root .karte-reihe{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr);
  gap:var(--space-xl);align-items:start}
.hsl-root .karte-reihe__karte{min-width:0}
.hsl-root .karte--plan{background:var(--sand)}
.hsl-root .karte__plan{position:absolute;inset:0;width:100%;height:100%;display:block}
.hsl-root .karte__plan .kp-grund{fill:var(--sand)}
.hsl-root .karte__plan .kp-flaeche{fill:var(--karte-flaeche)}
.hsl-root .karte__plan .kp-wasser-flaeche{fill:var(--karte-wasser)}
.hsl-root .karte__plan .kp-wasser{fill:none;stroke:var(--karte-wasser);stroke-width:34;stroke-linecap:round;stroke-linejoin:round}
.hsl-root .karte__plan .kp-strasse-rand{fill:none;stroke:var(--sandpanel);stroke-width:26;stroke-linecap:round}
.hsl-root .karte__plan .kp-strasse{fill:none;stroke:var(--elfenbein);stroke-width:18;stroke-linecap:round}
.hsl-root .karte__plan .kp-haus{fill:var(--sandpanel)}
.hsl-root .karte__plan .kp-hotel{fill:#D6C8AE}
.hsl-root .karte__plan .kp-marke path{fill:var(--bronze);stroke:var(--nachtblau);stroke-width:1.2}
.hsl-root .karte__plan .kp-marke circle{fill:var(--elfenbein)}
.hsl-root .karte__plan text{font-family:var(--font-text);paint-order:stroke;
  stroke:var(--elfenbein);stroke-width:8px;stroke-linejoin:round}
.hsl-root .karte__plan .kp-name{fill:var(--nachtblau);font-size:40px;font-weight:600}
.hsl-root .karte__plan .kp-adresse{fill:var(--karte-schrift-leise);font-size:28px}
.hsl-root .karte__plan .kp-wassername{fill:#5B6E86;font-size:30px;font-style:italic;letter-spacing:.06em}
.hsl-root .karte__plan .kp-strassenname{fill:var(--karte-schrift-leise);font-size:22px;letter-spacing:.04em;stroke-width:6px}
.hsl-root .karte--plan .karte__aktion{inset:0;padding:var(--space-m);
  justify-content:center;background:none}
.hsl-root .karte__datenschutz--unter{margin:var(--space-xs) 0 0;max-width:none;text-align:left}

.hsl-root .routenplan{border-top:var(--border-hairline) solid var(--accent);padding-top:var(--space-m)}
.hsl-root .routenplan__wege{display:flex;flex-direction:column;gap:var(--space-xs)}
.hsl-root .routenplan__knopf{width:100%;justify-content:space-between;padding-block:18px;
  font-size:var(--type-akzent-size);letter-spacing:.04em}
.hsl-root .routenplan .sl-small a{color:var(--accent-light)}
@media (max-width:980px){
  .hsl-root .karte-reihe{grid-template-columns:minmax(0,1fr)}
}

.hsl-root .karte__wege{
  list-style:none;margin:var(--space-m) 0 0;padding:0;
  display:flex;flex-wrap:wrap;gap:var(--space-xs) var(--space-l);
}
.hsl-root .karte__wege a{
  font-family:var(--font-text);font-size:var(--type-small-size);
  color:var(--text-body);
}

@media (max-width:640px){
  .hsl-root .karte{aspect-ratio:4/3}
  .hsl-root .karte__marke{font-size:46px}
  .hsl-root .karte__marke--klein{font-size:32px}
  .hsl-root .karte__wege{flex-direction:column;gap:var(--space-xs)}
}

/* --------------------------------------------------------------------------
   Formulare
   --------------------------------------------------------------------------
   Drei Formulare, eine Sprache: Beschriftung über dem Feld, Haarlinie als
   Rahmen, Fehlermeldung unter dem Feld und nicht als Blase des Browsers.
   Die Zustände „läuft", „erfolg", „probe" und „fehler" tragen keine Farbe
   allein — jeder steht als Satz da, damit er auch ohne Farbwahrnehmung
   ankommt. */

.hsl-root .formular{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:var(--space-m)}
.hsl-root .formular__feld{display:flex;flex-direction:column;gap:8px;min-width:0}
.hsl-root .formular__feld--breit{grid-column:1 / -1}
.hsl-root .formular label{
  font-family:var(--font-text);font-size:var(--type-small-size);
  letter-spacing:.12em;text-transform:uppercase;color:var(--accent);
}
.hsl-root .formular label .formular__optional{
  text-transform:none;letter-spacing:0;color:var(--text-secondary);
}
.hsl-root .formular input,
.hsl-root .formular select,
.hsl-root .formular textarea{
  width:100%;padding:12px 14px;border-radius:var(--radius);
  border:var(--border-hairline) solid var(--line);
  background:transparent;font-family:var(--font-text);
  font-size:var(--type-body-size);line-height:1.4;color:var(--text-body);
  transition:border-color 300ms ease;
}
.hsl-root .formular textarea{resize:vertical;min-height:150px}
.hsl-root .formular input:hover,
.hsl-root .formular select:hover,
.hsl-root .formular textarea:hover{border-color:var(--accent)}
.hsl-root .formular [aria-invalid="true"]{border-color:var(--fehler)}
.hsl-root .formular__fehler{
  margin:0;font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--fehler);
}
.hsl-root .formular__fehler[hidden]{display:none}

/* Einwilligung: Kästchen links, Text daneben — nie vorbelegt. */
.hsl-root .formular__einwilligung{
  grid-column:1 / -1;display:flex;align-items:flex-start;gap:12px;
  padding-top:var(--space-xs);
}
.hsl-root .formular__einwilligung input{
  width:auto;flex:0 0 auto;margin:3px 0 0;padding:0;accent-color:var(--accent);
}
.hsl-root .formular__einwilligung label{
  text-transform:none;letter-spacing:0;color:var(--text-secondary);
  font-size:var(--type-small-size);line-height:var(--type-small-lh);
}
.hsl-root .formular__einwilligung a{color:var(--accent-light)}
/* Newsletter-Häkchen (vorbereitet, 19.10.2026): bis zum Einschalten verborgen. */
.hsl-root .formular__newsletter[hidden]{display:none}

/* Honigtopf. Nicht display:none — manche Bots füllen gezielt nur sichtbare
   Felder nicht aus. So steht es im Baum, ist aber weder zu sehen noch zu
   erreichen noch vorzulesen. */
.hsl-root .formular__falle{
  position:absolute;width:1px;height:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;
}

.hsl-root .formular button[type="submit"]{grid-column:1 / -1;justify-self:start}
.hsl-root .formular__meldung{
  grid-column:1 / -1;margin:0;padding:var(--space-s) var(--space-s) var(--space-s) var(--space-m);
  border-left:var(--border-hairline) solid var(--accent);
  font-family:var(--font-text);font-size:var(--type-body-size);
  line-height:var(--type-body-lh);color:var(--text-body);
}
.hsl-root .formular__meldung[hidden]{display:none}
/* Probebetrieb: die E-Mail, die verschickt würde. */
.hsl-root .formular__vorschau{grid-column:1 / -1;margin:0;padding:var(--space-s);
  max-height:28rem;overflow:auto;white-space:pre-wrap;
  border:var(--border-hairline) dashed var(--line);background:var(--surface-deep);
  font-family:monospace;font-size:13px;line-height:1.5;color:var(--text-body)}
.hsl-root .formular__meldung[data-art="fehler"]{border-left-color:var(--fehler)}
.hsl-root .formular__meldung[data-art="erfolg"]{border-left-color:var(--erfolg)}
/* „Ihre Anfrage: Weihnachtsfeier“ — nur mit ?thema=… sichtbar (hsl-forms.js). */
.hsl-root .formular__thema{margin:0;font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}
.hsl-root .formular__thema strong{font-weight:600;color:var(--accent)}
.hsl-root .formular__notiz{
  grid-column:1 / -1;margin:0;font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:var(--type-small-lh);
  color:var(--text-secondary);
}

/* Kontaktformular: über die volle Breite, zwei Spalten (Durchgang 7).

   Zusatzbereiche für Tischreservierung und Terminanfrage (Durchgang 7.2).
   Offen ist höchstens einer: der des gewählten Anliegens, bei „Allgemeine
   Anfrage“ keiner. Ein geschlossener Bereich trägt hidden — er ist nicht
   zu sehen, nicht zu erreichen, nimmt keinen Platz ein — und seine Felder
   sind abgeschaltet (fieldset disabled): weder Pflicht noch verschickt.
   Beides steht schon im Markup und wird von hsl-forms.js umgeschaltet, das
   Stylesheet entscheidet darüber nicht. Auf der Demo lief am 05.10.2026 ein
   zwei Tage altes Stylesheet aus dem CDN (siehe tools/versionen.py): Mit der
   alten Regel standen dort beide Bereiche offen.

   Aufklappen: Rasterhöhe 0fr → 1fr und Deckkraft, 250 ms. data-zu ist der
   Ausgangszustand für einen Bildaufbau, data-bewegung schaltet den Übergang
   ein. Der negative Rand gleicht den Rasterabstand aus, solange der Bereich
   noch zu ist. Bei prefers-reduced-motion keine Bewegung.

   Kein Kasten, keine Augenbraue: eine Haarlinie und eine Unterzeile in
   normaler Schrift. Die Felder stehen im selben Raster wie die übrigen —
   sechs Spalten: drei Felder je zwei, zwei Felder je drei (dann genau unter
   den beiden Spalten von Vorname und Name). */
.hsl-root .formular--breit{width:100%;align-items:start}
.hsl-root .formular__ausklapp{grid-column:1 / -1;display:grid;grid-template-rows:1fr}
.hsl-root .formular__ausklapp[hidden]{display:none}
.hsl-root .formular__ausklapp[data-zu]{grid-template-rows:0fr;opacity:0;
  margin-bottom:calc(-1 * var(--space-m))}
.hsl-root .formular__ausklapp[data-bewegung]{
  transition:grid-template-rows .25s ease,opacity .25s ease,margin-bottom .25s ease}
.hsl-root .formular__gruppe{min-height:0;overflow:hidden;
  display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--space-m);
  border:0;margin:0 -2px;padding:0 2px;min-width:0}
.hsl-root .formular__gruppe > .formular__feld{grid-column:span 2}
.hsl-root .formular__gruppe > .formular__feld--halb{grid-column:span 3}
.hsl-root .formular__gruppe-titel{grid-column:1 / -1;margin:0;
  padding-top:var(--space-m);border-top:var(--border-hairline) solid var(--line);
  font-family:var(--font-text);font-size:var(--type-body-size);
  line-height:var(--type-body-lh);font-weight:500;color:var(--text-body)}
.hsl-root .formular__hinweis{grid-column:1 / -1;margin:calc(-1 * var(--space-xs)) 0 0;
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}
.hsl-root .formular__nur-zusatz{display:none}
.hsl-root .formular:is([data-wahl="tischreservierung"],[data-wahl="terminanfrage"]) .formular__nur-zusatz{display:inline}
@media (prefers-reduced-motion:reduce){
  .hsl-root .formular__ausklapp[data-bewegung]{transition:none}
}

@media (max-width:640px){
  .hsl-root .formular{grid-template-columns:minmax(0,1fr)}
  .hsl-root .formular__gruppe{grid-template-columns:minmax(0,1fr)}
  .hsl-root .formular__gruppe > .formular__feld{grid-column:1 / -1}
}

/* --------------------------------------------------------------------------
   Gutscheine (arrangements.html)
   --------------------------------------------------------------------------
   Kachelsatz ohne Bild: Zu den elf Positionen gibt es keine Fotos, und
   elf gleiche Platzhalter wären schlimmer als keiner. Die Kachel trägt
   stattdessen Titel, Zusatz, Preis und Knopf — über Subgrid teilen sich
   alle Kacheln dieselben vier Zeilen, damit Preise und Knöpfe fluchten. */

.hsl-root .gutscheine{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--abstand-kopf) var(--space-m);list-style:none;margin:0;padding:0;
}
.hsl-root .gutscheinkarte{display:flex;flex-direction:column;min-width:0;
  padding-top:var(--space-m);border-top:var(--border-hairline) solid var(--line-strong)}
@supports (grid-template-rows: subgrid){
  .hsl-root .gutscheine{grid-template-rows:auto auto auto auto}
  .hsl-root .gutscheinkarte{display:grid;grid-row:span 4;grid-template-rows:subgrid;row-gap:0}
}
.hsl-root .gutscheinkarte__titel{
  margin:0;font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-h3-size);line-height:1.25;color:var(--text-body);
}
.hsl-root .gutscheinkarte__zusatz{
  margin:var(--space-xs) 0 0;font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:var(--type-small-lh);
  color:var(--text-secondary);
}
.hsl-root .gutscheinkarte__preis{
  margin:var(--space-s) 0 0;align-self:start;
  font-family:var(--font-display);font-size:var(--type-h3-size);
  line-height:1.1;color:var(--accent-light);
}
.hsl-root .gutscheinkarte__knopf{
  width:100%;margin:var(--space-s) 0 0;align-self:end;
}

.hsl-root .gutschein-frei{
  max-width:52ch;padding-top:var(--space-m);
  border-top:var(--border-hairline) solid var(--line-strong);
}
.hsl-root .gutschein-frei .btn{margin-top:var(--space-m)}

@media (max-width:1079px){
  .hsl-root .gutscheine{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:640px){
  .hsl-root .gutscheine{grid-template-columns:minmax(0,1fr)}
  @supports (grid-template-rows: subgrid){
    .hsl-root .gutscheine{grid-template-rows:none}
    .hsl-root .gutscheinkarte{grid-row:auto;grid-template-rows:none;
      display:flex;flex-direction:column}
  }
}

/* --------------------------------------------------------------------------
   Gastronomie: zwei mal zwei
   --------------------------------------------------------------------------
   Größere Kachel als der übrige Kachelsatz — hier steht nicht ein Anreißer,
   sondern der vollständige Text des Hauses samt Öffnungszeiten. Deshalb
   zwei Spalten statt vier und kein Subgrid: Die vier Angebote sind
   unterschiedlich lang, und sie zwanghaft auf eine Linie zu zwingen
   erzeugte nur Löcher. Ausnahme seit 12.10.2026: Augenbraue, Überschrift
   und Bild fluchten per Subgrid (siehe unten), der Text darunter läuft frei. */

.hsl-root .gastrokacheln{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
  gap:var(--space-3xl) var(--space-2xl);
  list-style:none;margin:0;padding:0;
}
.hsl-root .gastrokachel{min-width:0;display:flex;flex-direction:column}
.hsl-root .gastrokachel__media{margin:0}
.hsl-root .gastrokachel .sl-h2{max-width:20ch}
.hsl-root .gastrokachel__text .btn{align-self:flex-start}
/* Seit 12.10.2026 steht das Bild unter der Überschrift. Damit die Bilder
   eines Paares trotzdem auf einer Höhe beginnen und gleich groß sind,
   teilen sich die beiden Kacheln einer Reihe vier Zeilen: Augenbraue,
   Überschrift, Bild, Text (Subgrid wie bei .kachel). Die Abstände
   zwischen den Teilen kommen weiter aus .fluss (margin-top). Ohne
   Subgrid-Unterstützung bleibt der normale Fluss. */
@supports (grid-template-rows: subgrid){
  @media (min-width:901px){
    /* Eigene Spuren statt Rasterabstand: Der Zeilenabstand des Rasters
       (128px) läge sonst auch zwischen Augenbraue, Überschrift und Bild —
       Subgrid erbt ihn. Darum Abstand 0 und eine Leerspur zwischen den
       Paaren; innerhalb der Kachel gelten die Abstände aus .fluss. */
    .hsl-root .gastrokacheln{row-gap:0;grid-template-rows:repeat(4,auto) var(--space-3xl) repeat(4,auto)}
    .hsl-root .gastrokachel{display:grid;grid-template-rows:subgrid;row-gap:0;align-content:start}
    .hsl-root .gastrokachel:nth-child(-n+2){grid-row:1 / span 4}
    .hsl-root .gastrokachel:nth-child(n+3){grid-row:6 / span 4}
  }
}

@media (max-width:900px){
  .hsl-root .gastrokacheln{grid-template-columns:minmax(0,1fr);gap:var(--space-2xl)}
}
/* Überschrift über den Öffnungszeiten des Restaurants (12.10.2026). */
.hsl-root .fakten__titel{font-size:var(--type-eyebrow-size)}
.hsl-root .fakten__titel + .fakten{margin-top:var(--space-2xs)}

/* --------------------------------------------------------------------------
   Speisekarte (Gastronomie, seit 12.10.2026)
   --------------------------------------------------------------------------
   Markup erzeugt tools/speisekarte.py aus daten/speisekarte.json. Je
   Kategorie ein <details>: ohne Javascript aufklappbar, die erste offen.
   Zeile: Name (Versalien wie auf der Karte) und Beschreibung links, Preis
   rechts in Tabellenziffern. „Wahlweise …“ steht eingerückt unter dem
   Gericht, zu dem es gehört. */
.hsl-root .speisekarte{border-top:var(--border-hairline) solid var(--line);max-width:900px}
.hsl-root .speisekarte__kategorie{border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .speisekarte__kopf{display:grid;grid-template-columns:minmax(0,1fr) auto;
  column-gap:var(--space-s);align-items:center;padding:var(--space-s) 0;cursor:pointer;list-style:none}
.hsl-root .speisekarte__kopf::-webkit-details-marker{display:none}
.hsl-root .speisekarte__kopf::marker{content:""}
.hsl-root .speisekarte__name{grid-column:1;font-family:var(--font-display);font-weight:400;
  font-size:var(--type-h3-size);line-height:var(--type-h3-lh);color:var(--text-body)}
.hsl-root .speisekarte__unter{grid-column:1;margin-top:4px;font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:var(--type-small-lh);color:var(--text-secondary)}
.hsl-root .speisekarte__pfeil{grid-column:2;grid-row:1 / span 2;width:22px;height:22px;
  fill:none;stroke:var(--accent);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;
  transition:transform .3s ease}
.hsl-root .speisekarte__kategorie[open] .speisekarte__pfeil{transform:rotate(180deg)}
.hsl-root .speisekarte__kopf:hover .speisekarte__name{color:var(--accent-light)}
.hsl-root .speisekarte__kopf:focus-visible{outline:var(--border-hairline) solid var(--accent-light);outline-offset:3px}
.hsl-root .speisekarte__hinweis{margin:0 0 var(--space-xs);font-family:var(--font-text);
  font-size:var(--type-small-size);line-height:var(--type-small-lh);color:var(--text-secondary)}
.hsl-root .speisekarte__hinweis strong{font-weight:600;color:var(--accent)}
.hsl-root .speisekarte__liste{list-style:none;margin:0 0 var(--space-s);padding:0;
  border-top:var(--border-hairline) solid var(--line)}
.hsl-root .gericht{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-s);
  padding:10px 0;border-bottom:var(--border-hairline) solid var(--line);
  font-family:var(--font-text);font-size:var(--type-small-size);line-height:var(--type-small-lh);
  color:var(--text-secondary)}
.hsl-root .gericht:last-child{border-bottom:0}
.hsl-root .gericht__text{flex:1 1 auto;min-width:0}
.hsl-root .gericht__name{font-weight:600;letter-spacing:.04em;color:var(--text-body)}
.hsl-root .gericht__preis{flex:none;white-space:nowrap;font-variant-numeric:tabular-nums;
  color:var(--text-body)}
.hsl-root .gericht--variante{padding-left:var(--space-s)}
.hsl-root .gericht--variante .gericht__preis{color:var(--text-secondary)}

/* --------------------------------------------------------------------------
   Radrouten
   -------------------------------------------------------------------------- */

.hsl-root .routen{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--space-xl) var(--space-2xl);list-style:none;margin:0;padding:0;
}
.hsl-root .route{
  min-width:0;padding-top:var(--space-m);
  border-top:var(--border-hairline) solid var(--line-strong);
}
.hsl-root .route__titel{
  margin:0;font-family:var(--font-text);font-weight:var(--weight-medium);
  font-size:var(--type-h3-size);line-height:1.25;color:var(--text-body);
}
.hsl-root .route__dauer{
  margin:6px 0 0;font-family:var(--font-text);
  font-size:var(--type-small-size);letter-spacing:.12em;text-transform:uppercase;
  color:var(--accent);
}
.hsl-root .route__text{
  margin:var(--space-s) 0 0;font-family:var(--font-text);
  font-size:var(--type-body-size);line-height:var(--type-body-lh);
  color:var(--text-body);
}
/* Was noch aussteht, steht als Satz da und nicht als leere Zeile. */
.hsl-root .route__offen{
  margin:var(--space-s) 0 0;padding-left:var(--space-s);
  border-left:var(--border-hairline) solid var(--accent);
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary);
}
/* Zwei Radfernwege (Durchgang 6): zwei Spalten, Bild über dem Titel. */
.hsl-root .routen--zwei{grid-template-columns:repeat(2,minmax(0,1fr))}
.hsl-root .route__bild{margin:0 0 var(--space-s)}
.hsl-root .route .fakten{margin-top:var(--space-s)}
.hsl-root .route__link{margin:var(--space-s) 0 0;font-family:var(--font-text);font-size:var(--type-small-size)}
.hsl-root .route__link a{color:var(--accent-light)}
@media (max-width:899px){
  .hsl-root .routen{grid-template-columns:minmax(0,1fr);gap:var(--space-l)}
}

/* --------------------------------------------------------------------------
   Broschürennavigation
   -------------------------------------------------------------------------- */

.hsl-root .bro-nav{
  padding-top:var(--space-m);
  border-top:var(--border-hairline) solid var(--line-strong);
}
.hsl-root .bro-nav__liste{
  list-style:none;counter-reset:kapitel;margin:0;padding:0;
}
.hsl-root .bro-nav__liste li{
  counter-increment:kapitel;
  border-bottom:var(--border-hairline) solid var(--line);
}
.hsl-root .bro-nav__liste li:last-child{border-bottom:0}
.hsl-root .bro-nav__liste a{
  display:flex;gap:var(--space-s);align-items:baseline;
  padding:12px 0;border-bottom:0;
  font-family:var(--font-text);font-size:var(--type-body-size);
  line-height:1.35;color:var(--text-body);
}
.hsl-root .bro-nav__liste a::before{
  content:counter(kapitel,decimal-leading-zero);
  flex:0 0 auto;font-size:var(--type-small-size);color:var(--accent);
}
.hsl-root .bro-nav__liste a:hover{color:var(--accent-light)}

/* --------------------------------------------------------------------------
   Broschüre (hochzeiten/broschuere.html)
   --------------------------------------------------------------------------
   Vorteile als Raster mit Piktogrammen, drei mal drei. Die Pakete stehen
   untereinander: Kopf mit Titel und Preis, darunter die Bestandteile als
   Raster, das sich nach der Breite richtet. */
.hsl-root .vorteile.vorteile--raster{grid-template-columns:repeat(3,minmax(0,1fr));
  grid-template-rows:none;grid-auto-flow:row;gap:0 var(--space-m)}
.hsl-root .vorteile.vorteile--raster > .vorteil{align-items:flex-start;
  padding:var(--space-s) 0;border:0;border-top:var(--border-hairline) solid var(--line)}
@media (max-width:980px){
  .hsl-root .vorteile.vorteile--raster{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:640px){
  .hsl-root .vorteile.vorteile--raster{grid-template-columns:minmax(0,1fr)}
}
.hsl-root .bro-paket{padding-top:var(--space-m);
  border-top:var(--border-hairline) solid var(--line-strong)}
.hsl-root .bro-paket__kopf{display:flex;flex-wrap:wrap;align-items:baseline;
  justify-content:space-between;gap:var(--space-2xs) var(--space-m)}
.hsl-root .bro-paket__kopf > *{margin:0}
.hsl-root .bro-paket__preis{font-family:var(--font-text);font-size:var(--type-body-size);
  line-height:1.4;color:var(--accent)}
.hsl-root .bro-paket__teile{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));
  gap:var(--abstand-unter) var(--space-l);margin-top:var(--abstand-unter)}
.hsl-root .bro-teil__unter{margin:0;font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary)}
/* Unterzeile „Vorspeise:" gehört zu ihrer Liste — Abstand der Augenbraue
   darüber, eng darunter. */
.hsl-root .fluss > * + .bro-teil__unter{margin-top:var(--abstand-marke)}
.hsl-root .fluss > .bro-teil__unter + *{margin-top:var(--space-2xs)}
.hsl-root .fluss > .sl-eyebrow + .bro-teil__unter{margin-top:var(--abstand-marke)}

/* --------------------------------------------------------------------------
   FUSS — der einzige Fuß der Website
   --------------------------------------------------------------------------
   Der sandfarbene Fuß ist ersatzlos entfallen. Was dort stand — Navigation,
   soziale Netzwerke, Copyright, Rechtstexte — steht jetzt hier.

   Der Fuß ist in beiden Themes dunkelblau und bekommt deshalb, wie die
   Kopfzeile, einen eigenen festen Farbsatz statt der allgemeinen Aliase.
   Ein Logo trägt er nicht. */

.hsl-root .site-foot{
  --surface-base:var(--nachtblau);
  --surface-deep:var(--tiefblau);
  --text-body:var(--elfenbein);
  /* Schrift des Fußes in Gold (Durchgang 5, d2): Bronze #B3893C auf
     Nachtblau #0E1E33 = 5,24 : 1, erfüllt WCAG AA auch für die 14-px-
     Schrift. Beim Überfahren wird ein Link Elfenbein. */
  --text-secondary:var(--bronze);
  --accent:var(--bronze);
  --accent-light:var(--bronze-hell);
  --line:rgba(179,137,60,.32);
  --on-accent:#FFFFFF;
  background:var(--nachtblau);
  color:var(--bronze);
}

.hsl-root .site-foot__grid{
  display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:var(--space-l);
  padding:var(--space-xl) 0;
  /* Haarstrich oben: Im dunklen Theme ist die letzte Sektion so nachtblau
     wie der Fuß — ohne Linie liefen beide ineinander. */
  border-top:var(--border-hairline) solid var(--line);
}
.hsl-root .site-foot__spalte{min-width:0}
/* Spaltentitel im Fuß: normale Schreibung, Inter halbfett, Farbe wie
   bisher — keine Versalien, keine Sperrung (Frau Schumacher, Durchgang 8). */
.hsl-root .site-foot__titel,
.hsl-root .site-foot__spalte .site-foot__titel{
  margin:0;
  font-family:var(--font-text);font-weight:600;
  font-size:var(--type-body-size);line-height:var(--type-body-lh);
  letter-spacing:0;text-transform:none;color:var(--accent);
}
.hsl-root .site-foot__spalte ul{
  list-style:none;padding:0;
  display:flex;flex-direction:column;gap:10px;
}
.hsl-root .site-foot__spalte p{
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary);
}
.hsl-root .site-foot__spalte a{
  border-bottom:0;color:var(--text-secondary);
  font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);
}
.hsl-root .site-foot__spalte a:hover{color:var(--text-body)}

.hsl-root .social{display:flex;gap:var(--space-xs);list-style:none;margin:0;padding:0}
.hsl-root .site-foot__spalte ul.social{flex-direction:row}
/* Ohne Rahmen: Der Rahmen war reine Zierde und blieb allein stehen, als
   die Zeichen fehlten. Die Trefferfläche bleibt 40 × 40. */
.hsl-root .social a{
  display:inline-flex;align-items:center;justify-content:center;
  width:40px;height:40px;border:0;
  color:var(--text-secondary);
  transition:color .3s ease;
}
.hsl-root .social a:hover{color:var(--text-body)}

.hsl-root .site-foot__unten{
  display:flex;justify-content:space-between;align-items:baseline;
  gap:var(--space-s);flex-wrap:wrap;
  padding:var(--space-s) 0 var(--space-xl);
  border-top:var(--border-hairline) solid var(--line);
}
.hsl-root .site-foot__unten p{
  margin:0;font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-secondary);
}
.hsl-root .site-foot__recht{
  display:flex;flex-wrap:wrap;gap:var(--space-xs);list-style:none;margin:0;padding:0}
.hsl-root .site-foot__recht a{
  font-family:var(--font-text);font-size:var(--type-small-size);
  color:var(--text-secondary);border-bottom:var(--border-hairline) solid transparent}
.hsl-root .site-foot__recht a:hover{color:var(--text-body);border-bottom-color:var(--accent-light)}
.hsl-root .site-foot__recht li + li::before{content:"·";color:var(--accent);margin-right:var(--space-xs)}
/* Themenschalter, seit 12.10.2026 nur im Fuß: Zeichen und Beschriftung. */
.hsl-root .site-foot__theme{width:auto;height:auto;gap:var(--space-2xs);padding:6px 12px;
  font-family:var(--font-text);font-size:var(--type-small-size);line-height:1.2}

@media (max-width:980px){
  .hsl-root .site-foot__grid{grid-template-columns:1fr 1fr;gap:var(--space-l) var(--space-m)}
}
@media (max-width:640px){
  .hsl-root .site-foot__grid{grid-template-columns:minmax(0,1fr)}
  .hsl-root .site-foot__unten{flex-direction:column;align-items:flex-start}
}

/* --------------------------------------------------------------------------
   Kopfzeile auf dem Telefon
   --------------------------------------------------------------------------
   Vier Angaben in der Dienstzeile brachen dort auf drei Zeilen um, der Kopf
   wurde 340px hoch — und weil der Hero seine Höhe vom gemessenen Kopf
   abzieht, blieb vom ersten Bildschirm kaum etwas übrig. Telefon, E-Mail und
   der Themenschalter stehen deshalb in einer Zeile; die Telefonzeiten
   entfallen dort, sie stehen im Fuß und auf der Kontaktseite. */
/* Seit 12.10.2026 (nach Durchgang 9): Unter 768px entfällt die obere
   Zeile ganz. Der Kopf besteht nur aus Logo und Burger; Telefon, E-Mail,
   Check-in-Zeiten und Themenschalter stehen unten im geöffneten Menü
   (.nav__kontakt). Tablet und Desktop unverändert. Die Kopfhöhe misst
   hsl.js (--header-h) — Hero, Anker und klebende Teile folgen von selbst. */
.hsl-root .nav__kontakt{display:none}
/* 19.10.2026 (Frau Schumacher): Telefon und E-Mail stehen auch mobil oben
   — eine schmale Zeile nur mit diesen beiden, ohne Check-in-Zeiten (die
   stehen im Menü und im Fuß). Die Kopfhöhe misst hsl.js weiter selbst. */
@media (max-width:767px){
  .hsl-root .header-meta__inner{min-height:36px;flex-wrap:nowrap;gap:var(--space-s);
    font-size:13px;line-height:1.2;white-space:nowrap}
  .hsl-root .header-meta__inner > span{display:none}
  .hsl-root .header-meta__inner a{padding:8px 0}
  .hsl-root .nav__kontakt{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2xs);
    margin-top:var(--space-l);padding-top:var(--space-m);
    border-top:var(--border-hairline) solid var(--line)}
  .hsl-root .site-header .nav__kontakt a{padding:4px 0;border:0;
    font-family:var(--font-text);font-weight:400;font-size:var(--type-body-size);line-height:1.4;
    letter-spacing:0;text-transform:none;color:var(--header-text)}
  .hsl-root .site-header .nav__kontakt a:hover{color:var(--header-accent-light)}
  .hsl-root .nav__kontakt p{margin:var(--space-2xs) 0 0;font-family:var(--font-text);
    font-size:var(--type-small-size);line-height:var(--type-small-lh);color:var(--header-text-secondary)}
}
@media (max-width:640px){
  .hsl-root .header-main__inner{min-height:76px}
}

/* --------------------------------------------------------------------------
   R — Responsiv für Kacheln und Aufklappmenü
   -------------------------------------------------------------------------- */

@media (max-width:1079px){
  .hsl-root .kacheln--4{--kachel-spalten:2}
}
@media (max-width:899px){
  .hsl-root .kacheln--3{--kachel-spalten:2}
}
@media (max-width:640px){
  .hsl-root .kacheln{--kachel-spalten:1;gap:var(--space-l)}
  @supports (grid-template-rows: subgrid){
    .hsl-root .kacheln{grid-template-rows:none}
    .hsl-root .kachel{grid-row:auto;display:flex}
    .hsl-root .kachel > .kachel__link{grid-row:auto;display:flex;
      flex-direction:column}
  }
}

/* --------------------------------------------------------------------------
   M — Mobiles Menü: Fläche über der Seite
   --------------------------------------------------------------------------
   Vorher klappte das Menü im Kopf auf: Der Kopf wuchs, schob die Seite nach
   unten und rutschte beim Rollen gegen die Dienstzeile. Jetzt liegt das
   Menü als eigene Fläche über dem Inhalt, direkt unter dem Kopf. Der Kopf
   bleibt stehen, die Dienstzeile mit Telefon und E-Mail bleibt sichtbar,
   die Seite darunter bewegt sich nicht (Sperre in hsl.js).

   Satz wie im Hero: Fraunces mit opsz 72, Nachtblau als Fläche, Elfenbein
   als Schrift. Unten der Sicherheitsabstand des Telefons, damit der letzte
   Punkt nicht unter der Gestenleiste liegt. */

.hsl-root .nav__cta{display:none}

@media (max-width:1279px){
  .hsl-root .nav{
    position:fixed;left:0;right:0;bottom:0;
    top:var(--menue-oben,var(--header-h,132px));
    z-index:1;margin:0;
    display:flex;flex-direction:column;align-items:stretch;gap:0;
    padding-top:var(--space-s);
    padding-bottom:calc(var(--space-xl) + env(safe-area-inset-bottom,0px));
    padding-left:max(var(--gutter),env(safe-area-inset-left,0px));
    padding-right:max(var(--gutter),env(safe-area-inset-right,0px));
    background:var(--header-surface);color:var(--header-text);
    overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;
    visibility:hidden;opacity:0;
    transition:opacity .3s ease,visibility 0s linear .3s;
  }
  .hsl-root .site-header[data-open="true"] .nav{
    visibility:visible;opacity:1;transition:opacity .3s ease,visibility 0s;
  }

  /* Die Punkte: groß, in der Anzeigeschrift, mit Haarlinie darunter. */
  .hsl-root .site-header .nav > a:not(.btn),
  .hsl-root .site-header .nav__gruppe > a{
    display:block;flex:1 1 auto;
    padding-block:var(--space-xs);
    border:0;border-bottom:var(--border-hairline) solid var(--line);
    font-family:var(--font-display);font-weight:400;
    font-variation-settings:"opsz" 72,"wght" 400,"SOFT" 0,"WONK" 0;
    font-size:clamp(28px,7.4vw,40px);line-height:1.15;
    letter-spacing:-0.004em;text-transform:none;
    color:var(--header-text);
  }
  .hsl-root .site-header .nav > a:not(.btn):hover,
  .hsl-root .site-header .nav__gruppe > a:hover{color:var(--header-accent-light);border-bottom-color:var(--line)}
  .hsl-root .site-header .nav a:not(.btn)[aria-current]{color:var(--header-accent-light)}
  .hsl-root .nav__service,.hsl-root .nav__start{display:block}

  /* Events: Link und Schalter in einer Zeile, die Unterpunkte klappen
     darunter innerhalb der Fläche auf. */
  .hsl-root .nav__gruppe{display:flex;flex-wrap:wrap;align-items:stretch;width:100%;gap:0;
    border-bottom:var(--border-hairline) solid var(--line)}
  .hsl-root .site-header .nav__gruppe > a{border-bottom:0}
  .hsl-root .nav__schalter{width:48px;height:auto;min-height:48px;flex:0 0 auto;
    color:var(--header-text)}
  .hsl-root .nav__schalter svg{width:20px;height:20px}
  .hsl-root .nav__menu{
    position:static;flex:1 0 100%;min-width:0;
    margin:0;padding:0 0 var(--space-xs) var(--space-s);
    border:0;background:transparent;
    opacity:1;visibility:visible;display:none;
  }
  .hsl-root .nav__menu::before{display:none}
  /* Auf Tastgeräten öffnet allein der Schalter — :hover und :focus-within
     dürfen die Liste hier nicht aufziehen, sonst springt das Menü. */
  .hsl-root .nav__gruppe:hover > .nav__menu,
  .hsl-root .nav__gruppe:focus-within > .nav__menu{display:none}
  .hsl-root .nav__gruppe[data-open="true"] > .nav__menu{display:block}
  .hsl-root .site-header .nav__menu a:not(.btn){
    padding:var(--space-2xs) 0;background:transparent;border:0;
    font-family:var(--font-display);font-weight:400;
    font-variation-settings:"opsz" 72,"wght" 400,"SOFT" 0,"WONK" 0;
    font-size:clamp(22px,5.6vw,28px);line-height:1.25;
    letter-spacing:-0.004em;text-transform:none;color:var(--header-text-secondary);
  }
  .hsl-root .site-header .nav__menu a:not(.btn):hover,
  .hsl-root .site-header .nav__menu a:not(.btn):focus-visible{background:transparent;color:var(--header-text)}

  .hsl-root .nav__cta{display:inline-flex;align-self:flex-start;
    margin-top:var(--abstand-unter)}

  /* Burger wird zum Kreuz, solange die Fläche offen ist. */
  .hsl-root .burger span{transition:transform .3s ease,opacity .2s ease}
  .hsl-root .site-header[data-open="true"] .burger span:nth-child(1){transform:translateY(5px) rotate(45deg)}
  .hsl-root .site-header[data-open="true"] .burger span:nth-child(2){opacity:0}
  .hsl-root .site-header[data-open="true"] .burger span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}
}

/* Oben am Telefon: Der Kopf rückt unter die Statusleiste, falls die Seite
   bis an den Rand gezeichnet wird (viewport-fit=cover). Ohne diese
   Einstellung ist der Wert 0 und ändert nichts. */
.hsl-root .site-header{padding-top:env(safe-area-inset-top,0px)}

/* --------------------------------------------------------------------------
   Soziale Netzwerke
   --------------------------------------------------------------------------
   Inline-SVG mit fill="currentColor", geschrieben von tools/kopf-fuss.py aus
   assets/img/social/. Die Farbe kommt aus dem Text des Fußes. */
.hsl-root .social__icon{display:block;width:18px;height:18px}

/* --------------------------------------------------------------------------
   Nach oben
   --------------------------------------------------------------------------
   Zurückhaltend: Umriss wie der Themenschalter, keine Hornfläche — er soll
   nicht mit den Hauptknöpfen konkurrieren. Rechts unten, über der
   Gestenleiste des Telefons. Erzeugt von hsl.js. */
.hsl-root .nach-oben{
  position:fixed;z-index:15;
  right:max(var(--space-s),env(safe-area-inset-right,0px));
  bottom:calc(var(--space-s) + env(safe-area-inset-bottom,0px));
  width:44px;height:44px;padding:0;
  display:flex;align-items:center;justify-content:center;
  background:var(--surface-base);color:var(--text-secondary);
  border:var(--border-hairline) solid var(--line);border-radius:var(--radius);
  cursor:pointer;
  opacity:0;visibility:hidden;transform:translateY(var(--space-2xs));
  transition:opacity .3s ease,transform .3s ease,visibility 0s linear .3s,color .3s ease,border-color .3s ease;
}
.hsl-root .nach-oben--da{opacity:1;visibility:visible;transform:none;
  transition:opacity .3s ease,transform .3s ease,visibility 0s,color .3s ease,border-color .3s ease}
.hsl-root .nach-oben--verdeckt{opacity:0;visibility:hidden;
  transition:opacity .3s ease,visibility 0s linear .3s}
.hsl-root .nach-oben:hover{color:var(--text-body);border-color:var(--accent-light)}
.hsl-root .nach-oben svg{width:20px;height:20px;fill:none;stroke:currentColor;
  stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
/* Bei offenem Menü verborgen. */
.hsl-root .site-header[data-open="true"] ~ .nach-oben{display:none}

/* --------------------------------------------------------------------------
   Infozeile
   --------------------------------------------------------------------------
   Kurzer Hinweis unten am Fenster, Farben wie der Kopf (in beiden Themen
   dunkel), Bronzelinie oben. Gezeigt, entfernt und gemerkt von hsl.js
   (infozeile); solange sie steht, trägt .hsl-root die Klasse
   hsl-root--infozeile und --infozeile-h = ihre Höhe. */
.hsl-root .infozeile{
  position:fixed;left:0;right:0;bottom:0;z-index:16;
  background:var(--header-surface);color:var(--header-text);
  border-top:var(--border-hairline) solid var(--accent-light);
  padding-bottom:env(safe-area-inset-bottom,0px);
}
.hsl-root .infozeile[hidden]{display:none}
.hsl-root .infozeile__innen{
  max-width:var(--container);margin:0 auto;
  display:flex;align-items:center;gap:var(--space-s);
  padding:var(--space-xs) max(var(--gutter),env(safe-area-inset-right,0px)) var(--space-xs) max(var(--gutter),env(safe-area-inset-left,0px));
}
.hsl-root .infozeile__text{margin:0;flex:1 1 auto;min-width:0;
  font-size:var(--type-small-size,15px);line-height:1.45}
.hsl-root .infozeile__text strong{font-weight:var(--weight-medium,500)}
.hsl-root .infozeile__ok{flex:0 0 auto;min-width:64px;min-height:44px;padding:0 var(--space-s);
  font-family:var(--font-text);font-weight:var(--weight-medium,500);
  font-size:var(--type-button-size);letter-spacing:var(--type-button-ls);text-transform:uppercase;line-height:1;
  background:transparent;color:var(--header-text);
  border:var(--border-hairline) solid var(--accent-light);border-radius:var(--radius);cursor:pointer}
.hsl-root .infozeile__ok:hover{background:var(--accent-light);color:var(--header-surface)}
.hsl-root .infozeile__ok:focus-visible{outline:2px solid var(--accent-light);outline-offset:2px}
/* Platz für die Zeile: Fuß und „Nach oben“ nicht darunter. */
.hsl-root.hsl-root--infozeile{padding-bottom:var(--infozeile-h,0px)}
.hsl-root.hsl-root--infozeile .nach-oben{bottom:calc(var(--infozeile-h,0px) + var(--space-s) + env(safe-area-inset-bottom,0px))}
/* Bei offenem Menü verborgen (das Menü reicht bis unten). */
.hsl-root .site-header[data-open="true"] ~ .infozeile{display:none}

/* --------------------------------------------------------------------------
   Was vorher als style-Angabe im Markup stand
   --------------------------------------------------------------------------
   Jede dieser Angaben stand an einer oder mehreren Stellen direkt am
   Element. Sie sind hierher gewandert, damit das Markup keine Werte mehr
   trägt. */
.hsl-root .text-leise{color:var(--text-secondary)}
.hsl-root .measure--kurz{max-width:20ch}
/* Ein Satz, der ab 1024 px in einer Zeile stehen soll (Startseite, unter
   „Zimmer, Suiten & Apartment"): Die Satzbreite gibt die Zeile frei, der
   Text bleibt umbrechbar — passt er nicht, bricht er, statt überzulaufen. */
@media (min-width:1024px){
  .hsl-root .measure--zeile{max-width:none}
}
.hsl-root .figure-num--klein{font-size:var(--type-h3-size)}
/* Küchenzeit unter der Uhrzeit (Startseite, 19.10.2026): klein, Textschrift. */
.hsl-root .zeiten__kueche{display:block;font-family:var(--font-text);font-size:var(--type-small-size);
  font-weight:400;letter-spacing:0;line-height:1.4;color:var(--text-secondary);margin-top:2px}
.hsl-root .datalist .sl-small{display:block;margin-top:var(--space-2xs)}
.hsl-root .stimme__wert .sl-body{color:var(--text-secondary)}
.hsl-root .stimme__wert + .sl-small{margin-top:var(--space-2xs)}
/* Nur Liste zurücksetzen, keinen oberen Rand: den setzt Regel 2. */
.hsl-root ul.leistung-liste{list-style:none;padding:0;margin-bottom:0}
.hsl-root .gutschein__inhalt .sl-body{max-width:52ch}
.hsl-root .gutschein__inhalt .chips{justify-content:center}
/* Untertitel direkt unter einer Überschrift gehört zu deren Kopf und steht
   deshalb im Augenbrauen-Abstand, nicht im Abstand zum Inhalt. */
.hsl-root .fluss > .untertitel{margin-top:var(--abstand-marke);color:var(--text-secondary)}

/* ==========================================================================
   VERTIKALER RHYTHMUS — die drei Regeln
   ==========================================================================

   Vorher standen Abstände an Ort und Stelle: im Markup als style-Angabe, an
   einzelnen Blöcken als margin-top, dazu der Modifikator section--tight-top,
   der den oberen Innenabstand einer Sektion strich. Der war für zwei gleich
   gefärbte Sektionen gedacht, landete aber auch hinter Farbwechseln — dort
   klebte der Inhalt am Rand des Farbbands (Betreuung, „Das ganze Haus",
   Übernachten, Arrangements, Broschüre …).

   Jetzt gibt es genau drei Regeln. Alle lesen ihre Werte aus den Tokens
   --abstand-* oben; auf schmalen Schirmen ändert sich nur das Token.

     1  Zwischen Sektionen       --abstand-sektion
     2  Sektionskopf → Inhalt    --abstand-kopf
        (gilt auch Block → Block innerhalb einer Sektion)
     3  Unterüberschrift → Inhalt --abstand-unter
        (Überschrift → Text, Text → Knopf, Liste, Raster)

   Innerhalb eines Textblocks kommen zwei typografische Werte dazu:
   Augenbraue → Überschrift und Absatz → Absatz.

   Ein Abstand wird IMMER oben gesetzt, nie unten. Unten gesetzte Ränder
   stießen sonst mit oberen zusammen und fielen in sich zusammen (Margin-
   Collapsing) — genau daher kam die Lücke von null im Fuß. Das erste Kind
   eines Blocks trägt keinen Abstand.
   ========================================================================== */

/* --- Regel 1: zwischen Sektionen ---------------------------------------
   Jede Sektion hat oben und unten denselben Innenabstand. Folgt eine
   Sektion auf eine GLEICH gefärbte, entfällt ihr oberer Teil: Die Fläche
   läuft durch, und der untere Abstand der vorigen reicht. Nach einem
   Farbwechsel (oder nach dem Hero) bleibt er stehen — dort muss der Inhalt
   Luft zum Rand des neuen Farbbands haben. Das entscheidet allein die
   Flächenklasse, kein Modifikator im Markup. */
.hsl-root .section{padding-block:var(--abstand-sektion)}
.hsl-root .section:not(.section--quiet) + .section:not(.section--quiet),
.hsl-root .section--quiet + .section--quiet{padding-top:0}

/* Vollflächige Blöcke (.vollflaeche: Bild über die ganze Breite mit
   eigener Fläche — Restaurant und Gästestimmen auf der Startseite). Davor
   steht kein Abstand zwischen Sektionen (Entscheidung Serhii, Durchgang
   7.2): Die Sektion VOR dem Block endet mit dem Abstand Block → Block
   (--abstand-kopf, 64 px; ab 980 px abwärts 48 px) statt mit ihrem
   Sektionsabstand — der Knopf stößt nicht an das Bild, und es bleibt kein
   leeres Feld. Steht der Block am Anfang seiner Sektion, entfällt deren
   oberer Innenabstand. Steht er am Ende, entfällt der untere; die folgende
   Sektion beginnt IMMER mit ihrem oberen Innenabstand, auch bei gleicher
   Fläche (sonst stünde ihr Text an der Bildkante, behoben am 05.10.2026).
   Gilt auf jeder Seite, sobald ein Block die Klasse trägt. */
.hsl-root .section:has(+ .section > .vollflaeche:first-child){padding-bottom:var(--abstand-kopf)}
.hsl-root .section:has(> .vollflaeche:first-child){padding-top:0}
.hsl-root .section:has(> .vollflaeche:last-child){padding-bottom:0}
.hsl-root .section:has(> .vollflaeche:last-child) + .section{padding-top:var(--abstand-sektion)}

/* „Aktuelles im Schloss" (White Party) soll auf dem Desktop mitsamt
   Überschrift in eine Bildschirmhöhe passen. Die Regel bleibt dieselbe,
   nur das Token ist eine Stufe kleiner. */
.hsl-root .section--compact{--abstand-sektion:var(--space-xl)}

/* --- Regel 3: Unterüberschrift → Inhalt --------------------------------
   .fluss ist ein Textblock: Augenbraue, Überschrift, Absätze, Liste,
   Knöpfe. Zwischen seinen Teilen steht --abstand-unter, mit zwei
   typografischen Ausnahmen. */
.hsl-root .fluss > * + *{margin-top:var(--abstand-unter)}
.hsl-root .fluss > .sl-eyebrow + *{margin-top:var(--abstand-marke)}
.hsl-root .fluss > :is(.sl-body,.sl-small) + :is(.sl-body,.sl-small){margin-top:var(--abstand-absatz)}

/* --- Regel 2: Sektionskopf → Inhalt, Block → Block ---------------------
   Steht hinter Regel 3, damit sie gewinnt, wo beide zutreffen (der Kopf
   im Hero ist zugleich Teil eines Textblocks).
   .stapel ist der Container einer Sektion, der Blöcke untereinander
   stapelt: Kopf, Raster, Knopfzeile, zweiter Teil. Dieselbe Regel gilt,
   wenn eine Sektion mehrere Container hat. */
.hsl-root .stapel > * + *,
.hsl-root .section > * + *,
.hsl-root .section-head + *{margin-top:var(--abstand-kopf)}

/* Nur oben, nie unten: Browservorgaben (1em unter jedem Absatz, jeder
   Liste) fallen in den Behältern weg. Das erste Kind trägt keinen
   Abstand — auch dann nicht, wenn die Komponente selbst einen oberen
   Rand mitbringt (.fakten, .leistungen …). */
.hsl-root :is(.fluss,.stapel,.section-head) > *{margin-bottom:0}
.hsl-root :is(.fluss,.stapel,.section-head) > :first-child{margin-top:0}

/* Knopfzeile: mehrere Knöpfe nebeneinander, beim Umbruch mit dem
   Abstand der Skala untereinander. */
.hsl-root .knopfzeile{display:flex;flex-wrap:wrap;gap:var(--space-xs) var(--space-s);align-items:center}
/* Ein langer Knopf in der Knopfzeile bricht auf dem Telefon um, statt
   über den Rand zu laufen („Angebote für Radfahrer anfragen", 360 px). */
.hsl-root .knopfzeile .btn{max-width:100%;white-space:normal;text-align:center;line-height:1.25}
.hsl-root .section-head--mitte + .knopfzeile,
.hsl-root .section-head--mitte ~ .knopfzeile{justify-content:center}

/* --- Tokens auf schmalen Schirmen --------------------------------------
   Nur die Werte werden umgestellt, die Regeln bleiben. */
@media (max-width:980px){
  .hsl-root{--abstand-sektion:var(--space-2xl);--abstand-kopf:var(--space-l)}
  .hsl-root .section--compact{--abstand-sektion:var(--space-l)}
}
@media (max-width:640px){
  .hsl-root{--abstand-sektion:var(--space-xl);--abstand-kopf:var(--space-l);
    --abstand-unter:var(--space-s)}
  .hsl-root .section--compact{--abstand-sektion:var(--space-xl)}
}

/* ==========================================================================
   Signatur-Generator (signatur/index.html, intern, 12.10.2026)
   Eigener schmaler Kopf (Logo), Formular links, Vorschau rechts auf Weiß —
   so, wie die Signatur im E-Mail-Programm steht. Die Signatur selbst trägt
   nur Inline-Stile; hier wird nur die Seite drumherum gesetzt.
   ========================================================================== */
.hsl-root .sig-kopf{background:var(--nachtblau);border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .sig-kopf__innen{display:flex;align-items:center;gap:var(--space-s);min-height:76px}
.hsl-root .sig-kopf__marke{width:44px;height:auto}
.hsl-root .sig-kopf__wort{width:220px;height:auto}
.hsl-root .sig-raster{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:var(--space-xl);align-items:start}
.hsl-root .sig-formular{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
.hsl-root .sig-vorschau{background:#fff;color:#0E1E33;padding:var(--space-m);border:var(--border-hairline) solid var(--line);
  overflow-x:auto}
.hsl-root .sig-vorschau a{border-bottom:0}
.hsl-root .sig-vorschau img{max-width:none}
.hsl-root .sig-anleitung > * + *{margin-top:var(--abstand-unter)}
/* Mehrere Banner-Varianten als Karten (16.10.2026). */
.hsl-root .sig-varianten{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-xl)}
.hsl-root .sig-karte{min-width:0;padding-top:var(--space-m);border-top:var(--border-hairline) solid var(--line)}
/* Banner zuerst (12.10.2026): Vorschau nur so breit wie der Banner. */
.hsl-root .sig-vorschau--banner{display:inline-block;max-width:100%;padding:var(--space-s)}
/* „Komplette Signatur erstellen“ — aufklappbar, ohne Javascript. */
.hsl-root .sig-komplett{border-top:var(--border-hairline) solid var(--line);border-bottom:var(--border-hairline) solid var(--line)}
.hsl-root .sig-komplett__kopf{display:flex;flex-direction:column;gap:4px;padding:var(--space-s) 0;cursor:pointer;list-style:none}
.hsl-root .sig-komplett__kopf::-webkit-details-marker{display:none}
.hsl-root .sig-komplett__kopf::marker{content:""}
.hsl-root .sig-komplett__kopf .sl-h3::after{content:" +";color:var(--accent)}
.hsl-root .sig-komplett[open] .sig-komplett__kopf .sl-h3::after{content:" –"}
.hsl-root .sig-komplett .sig-raster{padding:var(--space-m) 0 var(--space-l)}
.hsl-root .sig-anleitungen{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-l) var(--space-xl);
  margin-top:var(--space-l)}
.hsl-root .sig-schritt{padding-top:var(--space-s);border-top:var(--border-hairline) solid var(--line)}
.hsl-root .sig-liste{margin:0;padding-left:1.2em;font-family:var(--font-text);font-size:var(--type-small-size);
  line-height:var(--type-small-lh);color:var(--text-body)}
.hsl-root .sig-liste li + li{margin-top:4px}
@media (max-width:980px){
  .hsl-root .sig-raster{grid-template-columns:minmax(0,1fr)}
}
@media (max-width:640px){
  .hsl-root .sig-anleitungen{grid-template-columns:minmax(0,1fr)}
  .hsl-root .sig-formular{grid-template-columns:minmax(0,1fr)}
  .hsl-root .sig-vorschau{padding:var(--space-s)}
}
