/* visper fasnacht — kern: alles, was auf mehr als einer seite gilt.
 * seitenspezifisches steht in start.css, formular.css (anmeldung, merci) und
 * seiten.css (impressum, datenschutz, 404, weiterleitungen).
 *
 * bewegung: nur transform und opacity. still und sichtbar bei
 * prefers-reduced-motion, im edit-modus (html[data-modus="bearbeiten"]) und
 * ohne javascript (html.kein-js).
 */

/* ————— schriften ————— */

/* bitter 700 selbst gehostet (ofl, /assets/fonts/OFL-Bitter.txt), nur latin —
   umlaute sind drin. auf jeder seite per preload geholt. */
@font-face {
  font-family: "Bitter";
  src: url("/assets/fonts/bitter-700-latin.woff2") format("woff2");
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
/* rückfall mit den massen der echten schriften (in chrome gemessen), damit
   der wechsel nicht springt: georgia fett ≈ bitter 700, arial ≈ komet */
@font-face {
  font-family: "Bitter Fallback";
  src: local("Georgia Bold"), local("Georgia-Bold"), local("Georgia");
  font-weight: 700;
  size-adjust: 90.76%;
  ascent-override: 102.47%;
  descent-override: 28.65%;
  line-gap-override: 0%;
}
/* komet kommt über adobe fonts (kit vjl2xaw, css-link im <head>) */
@font-face {
  font-family: "komet Fallback";
  src: local("Arial"), local("ArialMT");
  font-weight: 400;
  size-adjust: 100.39%;
  ascent-override: 99.61%;
  descent-override: 24.9%;
  line-gap-override: 0%;
}
@font-face {
  font-family: "komet Fallback";
  src: local("Arial Bold"), local("Arial-BoldMT");
  font-weight: 700;
  size-adjust: 95.24%;
  ascent-override: 105%;
  descent-override: 26.25%;
  line-gap-override: 0%;
}

/* ————— tokens ————— */

:root {
  --rot: #fb2c31;        /* markenrot: flächen, rahmen, linien, grossschrift (≥ 24 px) */
  --rot-text: #e30e13;   /* knopf-flächen mit weissem text (4.8:1), kleiner roter text */
  --rot-tief: #b00809;   /* beizen-fläche, wortmarke (weiss darauf 7.3:1) */
  --weinrot: #7e0204;    /* fliesstext (11:1), hover, fokusring */
  --weiss: #fff;
  --rosa: #fdeceb;       /* heller himmel der illustration: ruhige flächen, hinweise */
  --rosa-kraeftig: #f8cfcc; /* linien und rahmen auf rosa */
  --rot-auf-rosa: #c90a0f;  /* kleiner roter text auf rosa (5.2:1; #e30e13 hätte dort nur 4.2:1) */
  --knopf: #e30e13;      /* knopf-fläche, überall gleich (auch auf rosa, wo --rot-text dunkler wird) */

  --schrift-titel: "Bitter", "Bitter Fallback", Georgia, serif;
  --schrift-text: "komet", "komet Fallback", Arial, sans-serif;

  --text: 1rem;
  --text-gross: clamp(1.0625rem, 1rem + .35vw, 1.25rem);
  --text-klein: .9375rem;
  --titel-seite: clamp(2.2rem, 1.35rem + 3.4vw, 3.9rem);
  --titel-abschnitt: clamp(1.9rem, 1.2rem + 2.6vw, 3.25rem);
  --titel-karte: clamp(1.35rem, 1rem + 1.2vw, 1.9rem);

  --rahmen: 1140px;
  --rand: clamp(16px, 4vw, 40px);
  /* rand für flächen über die ganze breite (kopf, held) */
  --rand-voll: clamp(16px, 5vw, 96px);
  --kopf-h: 64px;
  --abstand: clamp(56px, 4rem + 4vw, 120px);
  --radius: 6px;
  --radius-gross: 20px;

  --kurve: cubic-bezier(.2, .7, .2, 1);
  --kurve-raus: cubic-bezier(.22, 1, .36, 1);
  --schnell: 180ms;

  --z-kopf: 100;
  --z-oben: 200;
}
@media (min-width: 768px) {
  :root { --kopf-h: 72px; }
}

/* ————— grundlagen ————— */

*, *::before, *::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  /* anker landen unter dem festen kopf nicht versteckt */
  scroll-padding-top: calc(var(--kopf-h) + 16px);
  overflow-x: clip;
}
@media (prefers-reduced-motion: no-preference) {
  html { scroll-behavior: smooth; }
}

body {
  margin: 0;
  min-height: 100vh;
  background: var(--weiss);
  color: var(--weinrot);
  font: 400 var(--text)/1.55 var(--schrift-text);
  overflow-x: clip;
  -webkit-font-smoothing: antialiased;
}
@media (min-width: 1200px) {
  body { font-size: 1.0625rem; }
}

:where(h1, h2, h3, h4, h5, h6, p, ul, ol, figure, blockquote, dl, dd) { margin: 0; }
:where(h1, h2, h3, h4, h5, h6) { font-weight: 700; }
:where(ul, ol) { padding: 0; }

img, svg, video, picture { display: block; max-width: 100%; }
img { height: auto; }

:where(a) { color: inherit; }

/* ohne das rendern knöpfe und felder in arial 13.33px */
button, input, select, textarea { font: inherit; color: inherit; letter-spacing: inherit; }
button { cursor: pointer; }

::selection { background: var(--rot-text); color: var(--weiss); }

[hidden] { display: none !important; }

:focus-visible {
  outline: 3px solid var(--weinrot);
  outline-offset: 2px;
}
/* auf rosa ist --rot-text etwas dunkler, sonst reicht der kontrast für
   kleine schrift nicht (gilt für alles darin: text, links, knöpfe) */
:is(.abschnitt--rosa, .seitenkopf--rosa, .mitmachen, .leer, .fassade, .hinweis, .pdf, .beiz__motto) { --rot-text: var(--rot-auf-rosa); }

/* auf roten flächen weiss */
:is(.auf-rot, .abschnitt--rot, .karte--rot) :focus-visible { outline-color: var(--weiss); }

/* ————— hilfsmittel ————— */

.nur-fuer-screenreader {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.sprungmarke {
  position: fixed;
  top: 10px;
  left: 10px;
  z-index: calc(var(--z-oben) + 10);
  padding: 12px 18px;
  border-radius: 999px;
  background: var(--weinrot);
  color: var(--weiss);
  font-weight: 700;
  text-decoration: none;
  transform: translateY(-160%);
}
.sprungmarke:focus { transform: none; outline-color: var(--rot); }

/* dekorative bilder: im editor nicht tauschbar (bloxs überspringt .hero__bg)
   und sie fangen keine klicks ab */
.hero__bg { pointer-events: none; }

/* bloxs setzt die partials in diese platzhalter. der kopf ist fest oben —
   sein platzhalter hält die höhe frei, bevor cms.js ihn einsetzt (kein sprung) */
[data-include] { display: contents; }
[data-include="nav"] { display: block; min-height: var(--kopf-h); }

/* ————— satzspiegel ————— */

.rahmen {
  width: 100%;
  max-width: calc(var(--rahmen) + 2 * var(--rand));
  margin-inline: auto;
  padding-inline: var(--rand);
}
.rahmen--schmal { max-width: calc(760px + 2 * var(--rand)); }

.abschnitt { padding-block: var(--abstand); }
.abschnitt--rosa { background: var(--rosa); }
.abschnitt--rot { background: var(--rot-tief); color: var(--weiss); }

.abschnitt__kopf {
  display: grid;
  gap: .6rem;
  max-width: 46rem;
  margin-bottom: clamp(28px, 1.5rem + 1.5vw, 48px);
}
.abschnitt__kopf--mitte { margin-inline: auto; text-align: center; justify-items: center; }

/* kopf einer unterseite: <header class="seitenkopf"><div class="rahmen">
   kicker, h1.seitentitel, p.einleitung</div></header>. --rosa: ruhige fläche */
.seitenkopf { padding-block: clamp(36px, 1.5rem + 4vw, 88px) clamp(20px, 1rem + 2vw, 40px); }
.seitenkopf--rosa { background: var(--rosa); padding-bottom: clamp(36px, 1.5rem + 4vw, 72px); }
.seitenkopf .rahmen { display: grid; gap: .8rem; justify-items: start; }
.seitenkopf .einleitung { max-width: 42rem; }
.seitenkopf + .abschnitt { padding-top: clamp(24px, 1rem + 2vw, 48px); }

/* reihe von knöpfen */
.knopfreihe {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 12px;
}

/* ————— typo ————— */

.seitentitel,
.abschnitt__titel,
.kartentitel {
  font-family: var(--schrift-titel);
  font-weight: 700;
  line-height: 1.15;
  color: var(--rot);
  text-wrap: balance;
  overflow-wrap: break-word;
}
.seitentitel { font-size: var(--titel-seite); line-height: 1.08; letter-spacing: -.01em; }
.abschnitt__titel { font-size: var(--titel-abschnitt); letter-spacing: -.005em; }
.kartentitel { font-size: var(--titel-karte); }
.abschnitt--rot .abschnitt__titel { color: var(--weiss); }

.abschnitt__untertitel,
.einleitung {
  font-size: var(--text-gross);
  line-height: 1.5;
  color: var(--weinrot);
  text-wrap: pretty;
}
.abschnitt--rot .abschnitt__untertitel { color: rgb(255 255 255 / .88); }

/* kleiner vorspann über einem titel */
.kicker {
  font-size: .8125rem;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--rot-text);
}

/* fliesstext mit überschriften (impressum, datenschutz): lesbare zeilenlänge */
.fliesstext { max-width: 70ch; }
.fliesstext > * + * { margin-top: 1em; }
.fliesstext :is(h2, h3) {
  font-family: var(--schrift-titel);
  color: var(--rot-text);
  line-height: 1.2;
  text-wrap: balance;
}
.fliesstext h2 { margin-top: 2.2em; font-size: clamp(1.4rem, 1.1rem + 1vw, 1.9rem); }
.fliesstext h3 { margin-top: 1.6em; font-size: 1.2rem; }
.fliesstext :is(ul, ol) { padding-left: 1.25em; }
.fliesstext li + li { margin-top: .35em; }
.fliesstext :is(p, li) { text-wrap: pretty; }
.fliesstext a { color: var(--rot-text); text-decoration-thickness: 1px; text-underline-offset: .2em; }
.fliesstext a:hover { color: var(--weinrot); }
.fliesstext strong { font-weight: 700; }

/* von site.js aus data-format gebaut (zeilen → liste, **fett**, [text](url)).
   ein überlanges wort bricht um (anywhere: auch in flex-karten mit flex-start) */
.text-formatiert { overflow-wrap: anywhere; }
.text-formatiert > * + * { margin-top: .85em; }
.text-formatiert strong { font-weight: 700; }
.text-formatiert a {
  color: inherit;
  font-weight: 700;
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: .2em;
  overflow-wrap: anywhere;
}
.text-formatiert a:hover { text-decoration-thickness: 2px; }
.punkte { list-style: none; padding: 0; }
.punkte > li {
  position: relative;
  padding-left: 1.15em;
}
.punkte > li + li { margin-top: .4em; }
/* kleine raute statt punkt, in markenrot */
.punkte > li::before {
  content: "";
  position: absolute;
  left: .1em;
  top: .62em;
  width: .42em;
  height: .42em;
  background: var(--rot);
  transform: rotate(45deg);
}
/* eigener zähler; eine liste ab «3.» setzt site.js per counter-reset */
ol.punkte { counter-reset: punkt; }
ol.punkte > li { counter-increment: punkt; padding-left: 1.6em; }
ol.punkte--breit > li { padding-left: 2.2em; }
ol.punkte > li::before {
  content: counter(punkt) ".";
  top: 0;
  width: auto;
  height: auto;
  background: none;
  transform: none;
  color: var(--rot-text);
  font-weight: 700;
}
/* uhrzeit am anfang eines listenpunkts */
.zeit {
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--rot-text);
  white-space: nowrap;
}

/* leere felder verschwinden. ausserhalb von sammlungen nicht im editor — dort
   muss man sie füllen können. in sammlungen ist im editor nichts editierbar
   (gepflegt wird im backend), dort also immer wie live */
html:not([data-modus="bearbeiten"]) [data-format]:empty,
[data-render] :is([data-field], [data-format]):empty { display: none; }

/* ————— links ————— */

/* textlink mit linie (fuss, kontakt, hinweise) — und der knopf, der so
   aussieht (.textknopf: kalender, «nicht mehr anzeigen») */
.linie, .textknopf {
  color: var(--rot-text);
  font-weight: 700;
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: .22em;
  transition: color var(--schnell) ease, text-decoration-thickness var(--schnell) ease;
}
.linie:hover, .textknopf:hover { color: var(--weinrot); text-decoration-thickness: 2px; }
.linie { overflow-wrap: anywhere; }

/* ————— knöpfe ————— */

/* pille wie die marke. primär: rot mit weisser schrift, hover weinrot.
   --rahmen: rand statt fläche. --weiss: auf roten flächen. --klein: im kopf */
.knopf {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .55em;
  min-height: 48px;
  padding: .7em 1.35em;
  border: 2px solid var(--knopf);
  border-radius: 999px;
  background: var(--knopf);
  color: var(--weiss);
  font: 700 1rem/1.2 var(--schrift-text);
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  transition: background-color var(--schnell) ease, border-color var(--schnell) ease, color var(--schnell) ease, transform var(--schnell) ease;
  -webkit-tap-highlight-color: transparent;
}
.knopf:hover { background: var(--weinrot); border-color: var(--weinrot); }
.knopf:active { transform: translateY(1px); }

.knopf--rahmen {
  background: var(--weiss);
  color: var(--knopf);
}
.knopf--rahmen:hover { background: var(--knopf); border-color: var(--knopf); color: var(--weiss); }

.knopf--weiss {
  border-color: var(--weiss);
  background: var(--weiss);
  color: var(--weinrot);
}
.knopf--weiss:hover { background: var(--rosa); border-color: var(--rosa); color: var(--weinrot); }

.knopf--klein {
  min-height: 44px;
  padding: .55em 1.1em;
  font-size: .9375rem;
}
.knopf__icon { width: 1.25em; height: 1.25em; flex: none; }
.knopf[aria-disabled="true"], .knopf:disabled { opacity: .55; cursor: not-allowed; }

.textknopf {
  display: inline-flex;
  align-items: center;
  gap: .45em;
  min-height: 44px;
  padding: 0;
  border: 0;
  background: none;
}
.textknopf__icon { width: 1.3em; height: 1.3em; flex: none; }

/* ————— abzeichen («heute», «vorbei», motto) ————— */

.abzeichen {
  display: inline-flex;
  align-items: center;
  gap: .4em;
  padding: .2em .7em;
  border-radius: 999px;
  background: var(--rosa);
  color: var(--weinrot);
  font-size: .8125rem;
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: .02em;
  white-space: nowrap;
}
.abzeichen--rot { background: var(--rot-text); color: var(--weiss); }

/* ————— karten ————— */

/* weisse karte mit dem dicken roten rahmen der marke. --klein: 3 px (beizen),
   --rot: rote fläche mit weisser schrift (hervorhebung) */
.karte {
  position: relative;
  padding: clamp(20px, 1rem + 1.2vw, 32px);
  border: 5px solid var(--rot);
  border-radius: var(--radius);
  background: var(--weiss);
  color: var(--weinrot);
}
.karte--klein { border-width: 3px; padding: clamp(18px, .9rem + .6vw, 24px); }
.karte--rot { border-color: var(--rot-text); background: var(--rot-text); color: var(--weiss); }

/* ————— hinweise ————— */

/* ruhige box für hinweise und meldungen. --fehler: fehlermeldung,
   --erfolg: bestätigung. role/aria-live setzt die seite selbst. */
.hinweis {
  padding: 1rem 1.25rem;
  border-left: 4px solid var(--rot-text);
  border-radius: 0 var(--radius) var(--radius) 0;
  background: var(--rosa);
  color: var(--weinrot);
}
.hinweis > * + * { margin-top: .5em; }
.hinweis--fehler { border-left-color: var(--weinrot); background: #fbe3e2; font-weight: 700; }
.hinweis--erfolg { border-left-color: var(--rot); background: var(--weiss); box-shadow: inset 0 0 0 1px var(--rosa-kraeftig); }

/* ————— kopf (partials/nav.html) ————— */

.kopf {
  position: fixed;
  inset: 0 0 auto;
  z-index: var(--z-kopf);
  height: var(--kopf-h);
  background: rgb(255 255 255 / .97);
  transition: box-shadow 250ms ease;
}
html[data-gescrollt] .kopf {
  box-shadow: 0 1px 0 rgb(126 2 4 / .08), 0 10px 24px -14px rgb(126 2 4 / .35);
}
@supports (backdrop-filter: blur(1px)) {
  .kopf { background: rgb(255 255 255 / .9); backdrop-filter: saturate(1.4) blur(10px); }
}

.kopf__innen {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  height: 100%;
  padding-inline: var(--rand-voll);
}

.kopf__marke {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  flex: none;
  text-decoration: none;
}
.kopf__loewe { width: auto; height: 42px; }
.kopf__wortmarke { width: auto; height: 34px; }
@media (max-width: 559px) {
  .kopf__loewe { height: 38px; }
  .kopf__wortmarke { display: none; }
}
@media (min-width: 768px) {
  .kopf__loewe { height: 48px; }
  .kopf__wortmarke { height: 40px; }
}

.kopf__liste {
  display: flex;
  align-items: center;
  gap: clamp(2px, 1.4vw, 18px);
  margin: 0;
  list-style: none;
}
.kopf__link {
  position: relative;
  display: flex;
  align-items: center;
  min-height: 44px;
  padding-inline: clamp(6px, 1vw, 10px);
  color: var(--weinrot);
  font-size: .9375rem;
  font-weight: 700;
  text-decoration: none;
  transition: color var(--schnell) ease;
}
.kopf__link::after {
  content: "";
  position: absolute;
  left: clamp(6px, 1vw, 10px);
  right: clamp(6px, 1vw, 10px);
  bottom: 8px;
  height: 3px;
  border-radius: 2px;
  background: var(--rot);
  transform: scaleX(0);
  transform-origin: 0 50%;
  transition: transform 250ms var(--kurve);
}
.kopf__link:hover { color: var(--rot-text); }
.kopf__link:hover::after,
.kopf__link[aria-current]::after { transform: scaleX(1); }
.kopf__link[aria-current] { color: var(--rot-text); }
.kopf__knopf { margin-left: clamp(2px, 1vw, 10px); }
.kopf__knopf[aria-current="page"] { background: var(--weinrot); border-color: var(--weinrot); }
@media (min-width: 768px) {
  .kopf__link { font-size: 1rem; }
}
@media (max-width: 359px) {
  .kopf__liste { gap: 0; }
  .kopf__link { font-size: .875rem; padding-inline: 5px; }
  .kopf__knopf { padding-inline: .8em; font-size: .875rem; }
}

/* der menüpunkt «beizen» nur mit eingeschalteter sektion (site.js) */
[data-nav-ziel="beizen"] { display: none; }
html:is([data-beizen="an"], [data-modus="bearbeiten"]) [data-nav-ziel="beizen"] { display: block; }
html[data-modus="bearbeiten"]:not([data-beizen="an"]) [data-nav-ziel="beizen"] { opacity: .45; }

/* ————— ohne javascript oder ohne cms.js: notnavigation und notfuss ————— */

/* ohne javascript setzt bloxs keine partials ein: dann gelten die <noscript>
   in den platzhaltern (site.js setzt sie auch ein, wenn cms.js nicht kommt) */
.notnav {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px 18px;
  min-height: var(--kopf-h);
  padding: 8px var(--rand);
  border-bottom: 3px solid var(--rot);
}
.notnav a, .notfuss a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--rot-text);
  font-weight: 700;
}
.notnav a:first-child { margin-right: auto; font-family: var(--schrift-titel); font-size: 1.25rem; color: var(--rot); text-decoration: none; }
.notfuss {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 4px 24px;
  margin: 0;
  padding: 32px var(--rand) 48px;
  border-top: 3px solid var(--rot);
}

/* ————— fuss (partials/footer.html) ————— */

.fuss {
  border-top: 3px solid var(--rot);
  background: var(--weiss);
  color: var(--weinrot);
}
.fuss__innen {
  max-width: calc(var(--rahmen) + 2 * var(--rand));
  margin-inline: auto;
  padding: clamp(40px, 2rem + 3vw, 72px) var(--rand) 0;
}
.fuss__raster {
  display: grid;
  gap: 36px 32px;
  grid-template-columns: 1fr;
}
@media (min-width: 640px) {
  .fuss__raster { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 1000px) {
  .fuss__raster { grid-template-columns: 1.15fr 1.25fr 1fr .7fr; }
}

.fuss__marke {
  display: flex;
  align-items: center;
  gap: 12px;
  align-self: start;
  justify-self: start;
  text-decoration: none;
}
.fuss__loewe { width: auto; height: 76px; }
.fuss__wortmarke { width: auto; height: 62px; }

.fuss__titel { margin-bottom: .7rem; }
.fuss__text { line-height: 1.5; }
.fuss__text + .fuss__text { margin-top: .8rem; }
.fuss__text .linie { display: inline-block; padding-block: 4px; }

.fuss__partner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px 24px;
  margin: 0;
  list-style: none;
}
.partner {
  display: block;
  padding: 4px;
  border-radius: var(--radius);
  transition: transform var(--schnell) ease, opacity var(--schnell) ease;
}
.partner:hover { transform: translateY(-2px); }
.partner__logo { width: auto; height: 76px; }
.partner__logo--vespianer { height: 58px; }

.fuss__sozial {
  display: flex;
  gap: 10px;
  margin: 0;
  list-style: none;
}
.sozial {
  display: grid;
  place-items: center;
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: var(--rosa);
  color: var(--rot-text);
  transition: background-color var(--schnell) ease, color var(--schnell) ease, transform var(--schnell) ease;
}
.sozial svg { width: 24px; height: 24px; }
.sozial:hover { background: var(--rot-text); color: var(--weiss); transform: translateY(-2px); }

.fuss__unten {
  margin-top: clamp(32px, 1.5rem + 2vw, 56px);
  padding-block: 18px calc(24px + env(safe-area-inset-bottom));
  border-top: 1px solid var(--rosa-kraeftig);
}
.fuss__links {
  display: flex;
  flex-wrap: wrap;
  gap: 0 24px;
  margin: 0;
  list-style: none;
}
.fuss__links a { display: inline-flex; align-items: center; min-height: 44px; font-weight: 400; }

/* ————— links mit editierbarer adresse ohne adresse ————— */

/* bloxs lässt bei leerem wert das href aus dem markup stehen. darum steht
   bei social- und partner-links keins im markup: leeres feld → kein href →
   weg (samt listenpunkt). im editor bleiben sie, gedimmt, zum wieder füllen. */
html:not([data-modus="bearbeiten"]) a[data-href="url"]:not([href]),
html:not([data-modus="bearbeiten"]) li:has(> a[data-href="url"]:not([href])) { display: none; }
html[data-modus="bearbeiten"] a[data-href="url"]:not([href]) { opacity: .45; }

/* links aus sammlungsfeldern ohne adresse: kein link, kein leerer rahmen
   (auch im editor — in sammlungen ist dort nichts anklickbar) */
[data-render] a:is([data-field-attr*="href:"], [data-href]):not([href]) { display: none; }

/* ————— sammlungen: versteckte einträge ————— */

/* data-versteckt="true" (checkbox «versteckt» im backend) und data-weg
   (programm: länger als 7 tage vorbei) — live weg, im editor gedimmt mit
   hinweis, damit die kundin den eintrag findet */
html:not([data-modus="bearbeiten"]) [data-render] > :is([data-versteckt="true"], [data-weg]) { display: none; }
html[data-modus="bearbeiten"] [data-render] > :is([data-versteckt="true"], [data-weg]) {
  opacity: .5;
  outline: 2px dashed var(--weinrot);
  outline-offset: 3px;
}
html[data-modus="bearbeiten"] [data-render] > :is([data-versteckt="true"], [data-weg])::before {
  content: "Live ausgeblendet";
  position: absolute;
  top: -14px;
  right: 12px;
  z-index: 1;
  padding: 2px 10px;
  border-radius: 999px;
  background: var(--weinrot);
  color: var(--weiss);
  font: 700 .75rem/1.6 var(--schrift-text);
}
html[data-modus="bearbeiten"] [data-render] > [data-weg]::before { content: "Vorbei – live ausgeblendet"; }
html[data-modus="bearbeiten"] [data-render] > [data-versteckt="true"]::before { content: "Versteckt – live ausgeblendet"; }

/* datum nicht lesbar (site.js, data-datum-fehler am <time>): der eintrag steht
   live «kommend» am ende. im editor ein hinweis — am datum, nicht an der karte
   (dort sitzen die abzeichen oben) */
html[data-modus="bearbeiten"] [data-datum-fehler]::after {
  content: "Datum «" attr(data-datum-fehler) "» nicht erkannt – TT.MM.JJJJ";
  display: inline-block;
  margin-left: .5em;
  padding: 2px 10px;
  border-radius: 999px;
  background: var(--weinrot);
  color: var(--weiss);
  font: 700 .75rem/1.6 var(--schrift-text);
}
html[data-modus="bearbeiten"] [data-datum-fehler=""]::after { content: "Ohne Datum – steht am Ende (TT.MM.JJJJ)"; margin-left: 0; }

/* ————— anmeldung offen/zu ([data-wenn-anmeldung], site.js) ————— */

/* nach site.anmeldung.offen (quelle #schalter-anmeldung). ohne entscheid
   gilt «offen» (so steht es im seed). im editor beide, das inaktive gedimmt */
/* nur ausblenden — die sichtbare variante behält ihr eigenes display */
html:not([data-anmeldung="zu"], [data-modus="bearbeiten"]) [data-wenn-anmeldung="zu"],
html[data-anmeldung="zu"]:not([data-modus="bearbeiten"]) [data-wenn-anmeldung="offen"] { display: none; }
html[data-modus="bearbeiten"][data-anmeldung="zu"] [data-wenn-anmeldung="offen"],
html[data-modus="bearbeiten"]:not([data-anmeldung="zu"]) [data-wenn-anmeldung="zu"] {
  position: relative;
  padding: 26px 14px 14px;
  border: 2px dashed var(--weinrot);
  border-radius: var(--radius);
  opacity: .6;
}
html[data-modus="bearbeiten"][data-anmeldung="zu"] [data-wenn-anmeldung="offen"]::before,
html[data-modus="bearbeiten"]:not([data-anmeldung="zu"]) [data-wenn-anmeldung="zu"]::before {
  content: "Live ausgeblendet (Anmeldung offen/zu in «site»)";
  position: absolute;
  top: 4px;
  left: 12px;
  font-size: .75rem;
  font-weight: 700;
}

/* ————— löwe (inline-svg aus assets/img/marke/loewe-inline.html) ————— */

/* der «drunk lion» schwankt beim laden einmal sanft hin und her, der
   heiligenschein leicht versetzt — dann steht er (nichts bewegt sich länger
   als 5 s von selbst, wcag 2.2.2). farbe über color (das fill am svg schlägt
   css). .loewe--schwankt nur im held und auf der 404 — im kopf und im fuss
   steht er still (loewe.svg). */
.loewe { width: 100%; height: auto; overflow: visible; color: var(--rot); fill: currentColor; }
@keyframes schwanken {
  0%, 100% { transform: rotate(0); }
  25% { transform: rotate(-3deg); }
  75% { transform: rotate(3deg); }
}
@keyframes schein {
  0%, 100% { transform: none; }
  30% { transform: translate(-1.5px, .5px) rotate(-6deg); }
  70% { transform: translate(1.5px, -.5px) rotate(5deg); }
}
@media (prefers-reduced-motion: no-preference) {
  html:not(.kein-js, [data-modus="bearbeiten"]) .loewe--schwankt {
    transform-origin: 50% 95%;
    animation: schwanken 4.8s ease-in-out;
  }
  html:not(.kein-js, [data-modus="bearbeiten"]) .loewe--schwankt .loewe__schein {
    transform-box: fill-box;
    transform-origin: 50% 50%;
    animation: schein 4.4s ease-in-out .3s;
  }
}

/* ————— trompete (inline-svg aus assets/img/marke/trompete-inline.html) ————— */

/* nachbau der lottie-trompete: drei noten aus dem schallbecher (0 / 1.24 /
   2.67 s), einmal je eintritt — nur mit .blaest (site.js setzt es beim
   hereinscrollen und nimmt es beim hinausscrollen weg). nach knapp 5 s ist
   alles still. ohne .blaest steht das ruhebild aus dem svg: eine note über
   dem schallbecher. */
.trompete { width: 100%; height: auto; overflow: visible; color: var(--rot); fill: currentColor; }
/* weisse scheibe um die trompete (start, merci, 404); breite = rahmen */
.trompete-scheibe {
  display: grid;
  place-items: center;
  aspect-ratio: 1;
  border-radius: 50%;
  background: var(--weiss);
  box-shadow: 0 24px 50px -30px rgb(126 2 4 / .45);
}
.trompete-scheibe > .trompete { width: 70%; }
.trompete__note { transform-box: view-box; transform-origin: 0 0; }
@keyframes trompete-note {
  0% { transform: translate(45.06px, 32.06px) scale(.0123) translate(-171px, -279.5px); opacity: 1; }
  6.47% { transform: translate(45.29px, 31.74px) scale(.0133) translate(-171px, -279.5px); opacity: 1; }
  12.9% { transform: translate(45.94px, 30.84px) scale(.0158) translate(-171px, -279.5px); opacity: 1; }
  19.37% { transform: translate(46.98px, 29.47px) scale(.0196) translate(-171px, -279.5px); opacity: 1; }
  25.8% { transform: translate(48.36px, 27.73px) scale(.024) translate(-171px, -279.5px); opacity: 1; }
  32.27% { transform: translate(50.07px, 25.74px) scale(.0287) translate(-171px, -279.5px); opacity: 1; }
  40.34% { transform: translate(52.61px, 23.1px) scale(.0343) translate(-171px, -279.5px); opacity: 1; }
  48.41% { transform: translate(55.56px, 20.53px) scale(.0388) translate(-171px, -279.5px); opacity: 1; }
  59.81% { transform: translate(60.27px, 17.58px) scale(.0416) translate(-171px, -279.5px); opacity: 1; }
  67.73% { transform: translate(63.65px, 16.32px) scale(.0416) translate(-171px, -279.5px); opacity: .9; }
  75.8% { transform: translate(66.8px, 15.64px) scale(.0416) translate(-171px, -279.5px); opacity: .65; }
  83.86% { transform: translate(69.3px, 15.15px) scale(.0416) translate(-171px, -279.5px); opacity: .35; }
  91.93% { transform: translate(70.88px, 14.58px) scale(.0416) translate(-171px, -279.5px); opacity: .1; }
  100% { transform: translate(71.41px, 14.27px) scale(.0416) translate(-171px, -279.5px); opacity: 0; }
}
/* die trompete selbst ruckt beim ersten ton kurz an */
@keyframes trompete-stoss {
  0%, 100% { transform: rotate(0); }
  16.67% { transform: rotate(-5deg); }
  50% { transform: rotate(1.5deg); }
}
@media (prefers-reduced-motion: no-preference) {
  /* forwards: die noten sind weggeflogen, bis die trompete wieder hereinkommt */
  html:not(.kein-js, [data-modus="bearbeiten"]) .blaest .trompete__note { animation: trompete-note 2.07s linear forwards; }
  html:not(.kein-js, [data-modus="bearbeiten"]) .blaest .trompete__note.n2 { animation-delay: 1.24s; }
  html:not(.kein-js, [data-modus="bearbeiten"]) .blaest .trompete__note.n3 { animation-delay: 2.67s; }
  html:not(.kein-js, [data-modus="bearbeiten"]) .blaest .trompete {
    transform-origin: 30% 72%;
    animation: trompete-stoss 1.2s ease-in-out;
  }
}

/* ————— auftritte ([data-auftritt], [data-auftritt-liste] > *) ————— */

/* von unten, einmalig; nur mit site.js, ohne edit-modus und ohne reduzierte
   bewegung. listeneinträge erst, wenn site.js sie übernommen hat (.wartet) */
@media (prefers-reduced-motion: no-preference) {
  html:not(.kein-js, [data-modus="bearbeiten"]) [data-auftritt] {
    transition: opacity 600ms var(--kurve), transform 600ms var(--kurve);
  }
  html:not(.kein-js, [data-modus="bearbeiten"]) [data-auftritt]:not(.sichtbar) {
    opacity: 0;
    transform: translateY(24px);
  }
  html:not(.kein-js, [data-modus="bearbeiten"]) [data-auftritt-liste] > .wartet {
    transition: opacity 550ms var(--kurve) calc(var(--i, 0) * 70ms), transform 550ms var(--kurve) calc(var(--i, 0) * 70ms);
  }
  html:not(.kein-js, [data-modus="bearbeiten"]) [data-auftritt-liste] > .wartet:not(.da) {
    opacity: 0;
    transform: translateY(28px);
    /* ein sprung zur karte rechnet mit der verschobenen lage — sonst endet
       sie nach dem auftritt 28 px unter dem kopf */
    scroll-margin-top: 28px;
  }
}

/* ————— edit-modus (?edit / ?feedback): alles sichtbar, nichts bewegt sich ————— */

html[data-modus="bearbeiten"] [data-auftritt],
html[data-modus="bearbeiten"] [data-auftritt-liste] > * {
  opacity: 1 !important;
  transform: none !important;
  transition: none !important;
  animation: none !important;
}
/* mehrzeilige felder liest der editor mit innerText zurück — und innerText
   folgt text-transform. im editor darum die gespeicherte schreibweise zeigen */
html[data-modus="bearbeiten"] :is([data-multiline], [data-multiline] *):not([data-render] *) { text-transform: none !important; }
/* leer gemachte felder bleiben anklickbar */
html[data-modus="bearbeiten"] [contenteditable]:empty {
  display: inline-block;
  min-width: 3ch;
  min-height: 1em;
}
html[data-modus="bearbeiten"] [contenteditable]:empty::before {
  content: "…";
  opacity: .5;
}
/* die editor-leiste liegt unten fest: der fuss rückt darüber, sonst sind
   impressum und datenschutz nicht erreichbar. site.js misst sie (--leiste),
   hier der rückfall */
html[data-modus="bearbeiten"] { --leiste: 94px; }
@media (min-width: 1200px) {
  html[data-modus="bearbeiten"] { --leiste: 53px; }
}
@media (max-width: 767px) {
  html[data-modus="bearbeiten"] { --leiste: 135px; }
}
@media (max-width: 479px) {
  html[data-modus="bearbeiten"] { --leiste: 180px; }
}
html[data-modus="bearbeiten"] .fuss__unten { padding-bottom: calc(var(--leiste) + 24px); }

/* ————— bewegung abbestellt ————— */

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-delay: 0s !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    transition-delay: 0s !important;
  }
  html { scroll-behavior: auto; }
}
