/* Erzeugt von rfb/scripts/build-rfb-css.js — NICHT von Hand aendern.
   Quellen: custom-css.txt, welten-css.txt + Karten-SVGs + Floating-CTA.
   Neu bauen: node rfb/scripts/build-rfb-css.js
   Ausliefern: bash rfb/scripts/deploy-rfb-mu-plugins.sh */
/* === Atelier Redesign — Raum für Berührung === */
@import url('https://fonts.googleapis.com/css2?family=Caveat:wght@400;500;600;700&display=swap');
/* Fraunces (variable, opsz/SOFT/wght — WONK ungenutzt, 2026-08-10 entfernt) — & ist im <style>-Raw-Text sicher
   (nur <script> wird von wpautop encodet, siehe Caveat-Import oben, live verifiziert). */
@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,SOFT,wght@0,9..144,0..100,300..700;1,9..144,0..100,300..700&display=swap');

.rfb-caveat { font-family: 'Caveat', cursive !important; }

/* === Editorial-Display-Serif (2026-07-25): Headlines in Fraunces ===
   Caveat bleibt der Akzent (Randnotizen, Zitate, Karten-Titel, Namenszeilen),
   aber Überschriften tragen jetzt eine weiche, sinnliche Serif.
   Spezifität h1-h3.rfb-caveat (0,1,1) schlägt .rfb-caveat (0,1,0). */
h1.rfb-caveat, h2.rfb-caveat, h3.rfb-caveat {
  font-family: 'Fraunces', Georgia, 'Times New Roman', serif !important;
  font-optical-sizing: auto;
  font-variation-settings: 'SOFT' 70, 'WONK' 0;
  font-weight: 400;
  letter-spacing: -0.01em;
  line-height: 1.12;
}

.rfb-polaroid {
  background: #fff;
  padding: 12px 12px 32px;
  box-shadow: 2px 3px 12px rgba(43,31,20,0.10);
  transition: transform var(--rfb-dur-normal) var(--rfb-ease-move), box-shadow var(--rfb-dur-normal) var(--rfb-ease-move);
}
.rfb-polaroid:hover {
  transform: rotate(0deg) scale(1.03) !important;
  box-shadow: 4px 6px 20px rgba(43,31,20,0.16);
}
.rfb-polaroid img { width: 100%; height: auto; display: block; }
.rfb-rotate-left { transform: rotate(-2deg); }
.rfb-rotate-right { transform: rotate(2deg); }
.rfb-rotate-slight-left { transform: rotate(-1.5deg); }
.rfb-rotate-slight-right { transform: rotate(1.5deg); }

.rfb-paper {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
}

.rfb-fade-in {
  transition: opacity var(--rfb-dur-slow) var(--rfb-ease-enter), transform var(--rfb-dur-slow) var(--rfb-ease-enter);
}
/* Versteckt NUR wenn JS aktiv ist (html.rfb-js setzt ein Inline-Script ganz oben
   im Composer) — No-JS, Pre-Hydration und Reader bleiben sichtbar. */
html.rfb-js .rfb-fade-in {
  opacity: 0;
  transform: translateY(24px);
}
html.rfb-js .rfb-fade-in.rfb-visible {
  opacity: 1;
  transform: translateY(0);
}

.rfb-polaroid-land {
  opacity: 0;
  transform: translateY(20px) rotate(-3deg);
  transition: opacity var(--rfb-dur-slow) var(--rfb-ease-enter), transform var(--rfb-dur-slow) var(--rfb-ease-enter);
}
.rfb-polaroid-land.rfb-visible { opacity: 1; }
.rfb-polaroid-land.rfb-visible.rfb-rotate-left { transform: rotate(-2deg); }
.rfb-polaroid-land.rfb-visible.rfb-rotate-right { transform: rotate(2deg); }

.rfb-offer-card {
  transition: transform var(--rfb-dur-normal) var(--rfb-ease-move), box-shadow var(--rfb-dur-normal) var(--rfb-ease-move);
}
.rfb-offer-card:hover {
  transform: translateY(-4px) rotate(0deg) !important;
  box-shadow: 4px 8px 24px rgba(43,31,20,0.12);
}

/* Tag-Modus (Impeccable-Audit 2026-08-10): weißer Kleintext auf Clay #B8754A
   = 3.4:1 (unter WCAG AA) — Buttons mit var(--rfb-accent)-Hintergrund bekommen
   im Tag-Modus das dunklere Text-Clay (--rfb-accent-text, 5.7:1). */
html:not(.rfb-abend) .wp-block-button__link[style*="background-color:var(--rfb-accent)"] {
  background-color: var(--rfb-accent-text, #96562F) !important;
}
html:not(.rfb-abend) .wp-block-button__link[style*="background-color:var(--rfb-accent)"]:hover {
  background-color: #7E4A28 !important;
  transition: background-color var(--rfb-dur-normal) var(--rfb-ease-move);
}

.rfb-link-draw {
  text-decoration: none !important;
  border-bottom: none !important;
  background-image: linear-gradient(currentColor, currentColor);
  background-size: 0% 1px;
  background-position: left bottom;
  background-repeat: no-repeat;
  transition: background-size var(--rfb-dur-normal) var(--rfb-ease-move);
}
.rfb-link-draw:hover { background-size: 100% 1px; }

.rfb-wave-divider svg { width: 100%; height: 24px; display: block; }

.rfb-blob-mask-alt { border-radius: 60% 40% 50% 50% / 50% 60% 40% 50%; }

/* ============================================================
   TAG & ABEND Design-System (2026-07-25)
   Zwei Licht-Stimmungen: Tag (Creme/Clay/Olive) + Abend (.rfb-dusk:
   Espresso/Amber/Creme). Composer setzen Layout per Inline-Style,
   dieses Sheet liefert Verhalten + Stimmung.
   ============================================================ */

/* --- Abend-Scope --- */
.rfb-dusk { background-color: #1E140D; color: #EDE4D3; }
.rfb-dusk-card {
  background: var(--rfb-card, #2B1F14);
  border: 1px solid var(--rfb-card-border, rgba(201, 148, 109, 0.22));
  border-radius: var(--rfb-radius-sm);
}
.rfb-dusk .rfb-eyebrow { color: #C9946D; }
.rfb-dusk a { color: #D4A574; }
.rfb-dusk a:hover { color: #E8BE8F; }

/* --- Eyebrow / Kicker --- */
.rfb-eyebrow {
  font-size: var(--rfb-fs-eyebrow);
  letter-spacing: 0.32em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--rfb-accent-text, #96562F);
}

/* --- Atem-Animation für Hero-Visuals (6s, wie ein ruhiger Atemzug) --- */
@keyframes rfb-breath {
  from { transform: scale(1); }
  to   { transform: scale(1.025); }
}
.rfb-breath img { animation: rfb-breath var(--rfb-dur-breath) ease-in-out infinite alternate; }

/* --- Duotone: Bestandsfotos in die Stimmung ziehen --- */
.rfb-duotone img {
  filter: var(--rfb-photo-filter, sepia(0.35) saturate(0.85) hue-rotate(-8deg) brightness(0.98) contrast(1.04));
}
.rfb-duotone-dusk { position: relative; overflow: hidden; }
.rfb-duotone-dusk img {
  display: block;
  filter: sepia(0.5) saturate(0.72) hue-rotate(-10deg) brightness(0.72) contrast(1.08);
}
.rfb-duotone-dusk::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(30, 20, 13, 0.12), rgba(30, 20, 13, 0.5));
  pointer-events: none;
}

/* --- Grain-Overlay (Papier-/Filmkorn, Muster aus .rfb-paper) --- */
.rfb-grain { position: relative; }
.rfb-grain::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.05'/%3E%3C/svg%3E");
  pointer-events: none;
  z-index: 1;
}
.rfb-grain > * { position: relative; z-index: 2; }

/* ============================================================
   ATEM-FELD (2026-08-31, Startseiten-Hero) — WebGL-Fluid

   Warme Rauch-/Staubwolken, die der Mausbewegung folgen — die
   Tantra-Antwort auf stevensolbach.com. Die Engine (MIT, Pavel
   Dobryakov) liegt adaptiert in `wp-mu-plugins/rfb-welten/fluid.js`
   (MU-Plugin, laedt site-weit, no-op ohne .rfb-atem-feld auf der
   Seite): Hero-Canvas statt Vollbild, Palette aus --rfb-accent/
   --rfb-accent-text + Amber/Terracotta/Olive (jede Welt bringt ihren
   Ton mit), Bewegung wirbelt ohne Klick (window-Listener, das Canvas
   ist pointer-events:none), Idle-Splatter alle ~5 s, Reduced-Motion
   baut das Feld gar nicht erst auf, Loop pausiert ausserhalb des
   Viewports. `.rfb-atem-feld` ist nur Mount-Punkt — ohne JS fehlt
   nichts Wesentliches.

   Vorlaeufer am selben Tag (atmender CSS-Wash, dann 2D-Partikel +
   Cursor-Glow + CSS-„Berührungs-Spur") wurden verworfen — die
   pointer-events-Kaskade der Spur ist mit ihr entfallen, der Inhalt
   ist wieder normal klickbar (das Fluid hoert am window).
   ============================================================ */
.rfb-atem-feld { position: relative; overflow: hidden; }
/* width/height 100% sind Pflicht: Canvas ist ein Replaced Element, inset:0
   allein streckt es nicht — ohne die beiden bliebe es bei 300x150 stehen.
   max-width/margin ebenfalls: WPs is-layout-constrained begrenzt direkte
   Kinder auf die contentSize (1100 px) — auch absolut positionierte. */
.rfb-atem-canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  max-width: none !important;
  margin: 0 !important;
  z-index: 1;
  pointer-events: none;
}

/* --- Caveat-Randnotiz (handschriftlicher Akzent) --- */
.rfb-margin-note {
  font-family: 'Caveat', cursive;
  color: var(--rfb-accent-text, #96562F);
  transform: rotate(-2deg);
  line-height: 1.2;
}
.rfb-dusk .rfb-margin-note { color: #C9946D; }

/* --- Editorial-Pfadkarten (Drei Pfade / Werte) --- */
.rfb-path-card {
  border-top: 1px solid var(--rfb-card-border, rgba(63, 77, 51, 0.2));
  padding: 36px 28px 32px;
  transition: transform var(--rfb-dur-normal) var(--rfb-ease-move), border-color var(--rfb-dur-normal) var(--rfb-ease-move);
}
.rfb-path-card:hover { transform: translateY(-6px); border-top-color: var(--rfb-accent, #B8754A); }
.rfb-path-num {
  font-family: 'Fraunces', Georgia, serif;
  font-style: italic;
  font-weight: 300;
  color: var(--rfb-accent, #B8754A);
  font-size: 2.2rem;
  line-height: 1;
}

/* --- Ritual-Timeline (Abend-Seiten, „Deine Reise") --- */
.rfb-ritual { list-style: none; margin: 0; padding: 0; counter-reset: rfb-ritual; }
.rfb-ritual li {
  counter-increment: rfb-ritual;
  position: relative;
  padding: 26px 0 26px 76px;
  border-top: 1px solid var(--rfb-card-border, rgba(201, 148, 109, 0.18));
}
.rfb-ritual li::before {
  content: counter(rfb-ritual, decimal-leading-zero);
  position: absolute;
  left: 0;
  top: 22px;
  font-family: 'Fraunces', Georgia, serif;
  font-style: italic;
  font-weight: 300;
  font-size: 1.7rem;
  color: var(--rfb-accent, #C9946D);
}

/* --- Hairlines --- */
.rfb-hairline { border: none; border-top: 1px solid rgba(168, 181, 156, 0.3); }
.rfb-dusk .rfb-hairline, .rfb-hairline-dusk { border: none; border-top: 1px solid rgba(201, 148, 109, 0.22); }
.rfb-hairline-themed { border: none; border-top: 1px solid var(--rfb-card-border, rgba(63, 77, 51, 0.2)); }

@media (prefers-reduced-motion: reduce) {
  .rfb-breath img { animation: none !important; }
  .rfb-path-card, .rfb-path-card:hover { transition: none; transform: none; }
}

.rfb-icon-container { width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; }
.rfb-icon-container svg { width: 48px; height: 48px; }

.rfb-testimonial-scroll {
  display: flex;
  gap: 32px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  padding-bottom: 16px;
}
.rfb-testimonial-scroll::-webkit-scrollbar { height: 6px; }
.rfb-testimonial-scroll::-webkit-scrollbar-thumb { background: #B8754A; border-radius: 3px; }
.rfb-testimonial-card { flex: 0 0 320px; scroll-snap-align: start; }

.rfb-gallery-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 32px;
  align-items: start;
}
.rfb-gallery-grid .rfb-polaroid:nth-child(2) { margin-top: 40px; }

.rfb-quote-deco {
  position: absolute;
  top: -20px;
  left: 24px;
  opacity: 0.15;
  width: 100px;
}
.rfb-quote-deco svg { width: 100%; height: auto; }

@media (prefers-reduced-motion: reduce) {
  .rfb-fade-in, .rfb-polaroid-land {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
  .rfb-polaroid:hover, .rfb-offer-card:hover { transform: none !important; }
}

@media (max-width: 768px) {
  .rfb-testimonial-card { flex: 0 0 280px; }
  .rfb-gallery-grid { grid-template-columns: 1fr; gap: 24px; }
  .rfb-gallery-grid .rfb-polaroid:nth-child(2) { margin-top: 0; }
  .rfb-polaroid { padding: 8px 8px 24px; }
}

/* === Workshop / Festival Single-Pages === */
/* Twenty-Twenty-Five rendert auf Singles automatisch einen Featured-Image-
   Block oben — wenn wir das Bild als Polaroid bewusst im Content platzieren,
   verstecken wir den Theme-Default um Doppelung zu vermeiden. Das Featured
   Image bleibt aktiv für Social-Sharing, Schema und Archive. */
body.single-workshop .wp-block-post-featured-image,
body.single-festival .wp-block-post-featured-image {
  display: none !important;
}

/* === Workshop- und Festival-Archive-Polaroid-Grid === */
/* Default Twenty-Twenty-Five rendert post-template als vertikale Liste —
   wir formatieren um zu Polaroid-Karten in 3-Spalten-Grid. */

body.post-type-archive-workshop .wp-block-post-template,
body.post-type-archive-festival .wp-block-post-template {
  display: grid !important;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 40px 32px !important;
  list-style: none !important;
  padding: 0 !important;
  margin: 64px 24px !important;
  max-width: 1100px;
  margin-left: auto !important;
  margin-right: auto !important;
}

body.post-type-archive-workshop .wp-block-post.workshop,
body.post-type-archive-festival .wp-block-post.festival {
  background: #fff;
  padding: 20px 22px 32px !important;
  box-shadow: 2px 4px 18px rgba(43, 31, 20, 0.10);
  transition: transform var(--rfb-dur-normal) var(--rfb-ease-move), box-shadow var(--rfb-dur-normal) var(--rfb-ease-move);
  list-style: none !important;
  border-radius: 2px;
  display: flex;
  flex-direction: column;
}

/* Alternierende Polaroid-Rotation (subtil) */
body.post-type-archive-workshop .wp-block-post.workshop:nth-child(3n+1) {
  transform: rotate(-1.4deg);
}
body.post-type-archive-workshop .wp-block-post.workshop:nth-child(3n+2) {
  transform: rotate(0.6deg);
}
body.post-type-archive-workshop .wp-block-post.workshop:nth-child(3n) {
  transform: rotate(-0.5deg);
}
body.post-type-archive-festival .wp-block-post.festival:nth-child(odd) {
  transform: rotate(-1.2deg);
}
body.post-type-archive-festival .wp-block-post.festival:nth-child(even) {
  transform: rotate(1.2deg);
}

/* Hover: aufrichten + sanftes Hochziehen */
body.post-type-archive-workshop .wp-block-post.workshop:hover,
body.post-type-archive-festival .wp-block-post.festival:hover {
  transform: rotate(0deg) translateY(-4px) scale(1.015) !important;
  box-shadow: 4px 8px 28px rgba(43, 31, 20, 0.15);
  z-index: 2;
}

/* Titel im Caveat-Stil */
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-title,
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-title a,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-title,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-title a {
  font-family: 'Caveat', cursive !important;
  font-size: 1.85rem !important;
  font-weight: 500 !important;
  color: #3F4D33 !important;
  text-decoration: none !important;
  line-height: 1.15 !important;
  margin: 8px 0 12px !important;
}
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-title a:hover,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-title a:hover {
  color: #B8754A !important;
}

/* Datum auf Archive-Karten ausblenden — ist hier nicht relevant */
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-date,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-date {
  display: none !important;
}

/* Content auf 4 Zeilen begrenzen + Fade-Out */
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-content,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-content {
  display: -webkit-box;
  -webkit-line-clamp: 5;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: 0.95rem !important;
  line-height: 1.65 !important;
  color: #2B2B2B !important;
  margin: 0 0 16px !important;
  flex-grow: 1;
}
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-content p,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-content p {
  margin: 0 0 0.5em !important;
  font-size: inherit !important;
}

/* Listen + Headings im Content der Karte sind redundant — verstecken */
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-content ul,
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-content ol,
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-content h2,
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-content h3,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-content ul,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-content h2,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-content h3 {
  display: none !important;
}

/* "Mehr lesen →" als visueller Hinweis am Karten-Ende */
body.post-type-archive-workshop .wp-block-post.workshop::after,
body.post-type-archive-festival .wp-block-post.festival::after {
  content: "Mehr lesen →";
  display: block;
  font-size: 0.78rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--rfb-accent-text, #96562F);
  font-weight: 600;
  margin-top: 8px;
  padding-top: 12px;
  border-top: 1px solid rgba(168, 181, 156, 0.35);
  pointer-events: none; /* Klicks sollen durch zur Card-Link gehen */
}

/* Ganze Karte klickbar via Stretched-Link-Technik */
body.post-type-archive-workshop .wp-block-post.workshop,
body.post-type-archive-festival .wp-block-post.festival {
  position: relative;
  cursor: pointer;
}
body.post-type-archive-workshop .wp-block-post.workshop .wp-block-post-title a::after,
body.post-type-archive-festival .wp-block-post.festival .wp-block-post-title a::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
}
/* Damit innere Links (z.B. im Content) klickbar bleiben würden, sie höher legen */
body.post-type-archive-workshop .wp-block-post.workshop > *:not(.wp-block-post-title),
body.post-type-archive-festival .wp-block-post.festival > *:not(.wp-block-post-title) {
  position: relative;
}

/* Mobile: 1-Spalte, keine Rotation */
@media (max-width: 600px) {
  body.post-type-archive-workshop .wp-block-post-template,
  body.post-type-archive-festival .wp-block-post-template {
    grid-template-columns: 1fr !important;
    gap: 28px !important;
  }
  body.post-type-archive-workshop .wp-block-post.workshop,
  body.post-type-archive-festival .wp-block-post.festival {
    transform: none !important;
  }
}

/* === Lightbox-Theme (Atelier-Stil) === */
/* Klickbare Polaroid-Bilder als interaktiv markieren */
.rfb-polaroid figure.wp-block-image button.lightbox-trigger,
.rfb-polaroid img.wp-image-70,
.rfb-polaroid img.wp-image-71,
.rfb-polaroid img.wp-image-72,
.rfb-polaroid img.wp-image-73,
.rfb-polaroid img.wp-image-74,
.rfb-polaroid img.wp-image-75,
.rfb-polaroid img.wp-image-76,
.rfb-mini-wheel img,
img.wp-image-586 {
  cursor: zoom-in;
}

/* Hero-Polaroid auf Startseite (Florian + Eliana) */
.rfb-hero-photo {
  max-width: 640px;
  margin-left: auto;
  margin-right: auto;
}
.rfb-hero-photo img {
  display: block;
  width: 100%;
  height: auto;
}
@media (max-width: 768px) {
  .rfb-hero-photo {
    max-width: 460px;
    margin-top: 32px;
  }
}

/* Wheel of Consent — sanfter Hover-Hint (auf Startseite + Konsens-Page) */
.rfb-mini-wheel {
  max-width: 480px;
  margin-left: auto;
  margin-right: auto;
}
.rfb-mini-wheel img,
img.wp-image-586 {
  display: block;
  width: 100%;
  height: auto;
  transition: transform var(--rfb-dur-fast) var(--rfb-ease-move);
}
.rfb-mini-wheel img:hover,
img.wp-image-586:hover {
  transform: scale(1.02);
}
@media (max-width: 768px) {
  .rfb-mini-wheel {
    max-width: 380px;
    margin-bottom: 24px;
  }
}

/* WP 6.4+ Lightbox-Overlay auf warmes Atelier-Dunkelbraun statt Schwarz */
.wp-lightbox-overlay,
.wp-lightbox-overlay .scrim {
  background: rgba(43, 31, 20, 0.94) !important;
  backdrop-filter: blur(4px);
}

/* Lightbox Schließen-Button auf Creme/Akzent-Orange */
.wp-lightbox-overlay button.close-button,
.wp-lightbox-overlay .close-button {
  color: #FAF6EA !important;
  background: rgba(184, 117, 74, 0.2) !important;
  border-radius: var(--rfb-radius-pill);
  width: 44px;
  height: 44px;
  transition: background var(--rfb-dur-fast) var(--rfb-ease-move), color var(--rfb-dur-fast) var(--rfb-ease-move);
}
.wp-lightbox-overlay button.close-button:hover,
.wp-lightbox-overlay .close-button:hover {
  background: rgba(184, 117, 74, 0.5) !important;
  color: #FAF6EA !important;
}

/* Lightbox-Bild leicht vom Atelier-Polaroid-Schatten umrahmt */
.wp-lightbox-overlay .lightbox-image-container img {
  box-shadow: 0 12px 48px rgba(0, 0, 0, 0.4);
  border-radius: var(--rfb-radius-sm);
}

/* WP-Default-Lightbox skaliert große Bilder (z.B. 2048×2048 Wheel) in
   Original-Pixelgröße — wir zwingen sie proportional in den Viewport. */
.wp-lightbox-overlay .lightbox-image-container,
.wp-lightbox-overlay .wp-block-image,
.wp-lightbox-overlay .wp-block-image img {
  max-width: min(92vw, 1400px) !important;
  max-height: 90vh !important;
  min-width: 0 !important;
  min-height: 0 !important;
  width: auto !important;
  height: auto !important;
  object-fit: contain !important;
}
.wp-lightbox-overlay .lightbox-image-container {
  position: absolute !important;
  top: 50% !important;
  left: 50% !important;
  transform: translate(-50%, -50%) !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
}

/* ============================================================
   THEME-SYSTEM „Tag ⇄ Abend" (2026-07-25)
   Umschalter auf Startseite (7) + Tantra-Massage (128).
   Theme = Klasse auf <html> (html.rfb-abend), Default = Tag (:root).
   Composer referenzieren die Variablen in Inline-Styles (var(--rfb-*)).
   Init-Script (im Composer, ganz oben): localStorage['rfb-theme'] schlägt
   Tageszeit (>=18 oder <6 Uhr → Abend). Copy-Swap rein per CSS.
   ============================================================ */

:root {
  --rfb-bg: #FAF6EA;
  --rfb-bg-alt: #F5EFE0;
  --rfb-text: #2B2B2B;
  --rfb-heading: #3F4D33;
  --rfb-accent: #B8754A;
  --rfb-accent-ink: #FAF6EA;
  --rfb-accent-link: #96562F;
  --rfb-accent-text: #96562F;
  --rfb-muted: #5F5748;
  --rfb-card: #FFFFFF;
  --rfb-card-border: rgba(63, 77, 51, 0.2);
  --rfb-photo-filter: sepia(0.35) saturate(0.85) hue-rotate(-8deg) brightness(0.98) contrast(1.04);
}
/* Abend-Variante „Kerzenlicht" (2026-07-25, nach Vergleich A/B/C/D): warmes,
   helleres Braun statt Espresso-Schwarz, Fotos weniger abgedunkelt. */
html.rfb-abend {
  --rfb-bg: #33291C;
  --rfb-bg-alt: #413425;
  --rfb-text: #E9DFCE;
  --rfb-heading: #F2E9DA;
  --rfb-accent: #CD9B6E;
  --rfb-accent-ink: #2A2116;
  --rfb-accent-link: #D9B18A;
  --rfb-accent-text: #D9B18A;
  --rfb-muted: #C0B29C;
  --rfb-card: #413425;
  --rfb-card-border: rgba(205, 155, 110, 0.20);
  --rfb-photo-filter: sepia(0.45) saturate(0.78) hue-rotate(-8deg) brightness(0.85) contrast(1.02);
}
/* Keine Creme-Ränder ober-/unterhalb der Content-Gruppen im Abend-Modus */
html.rfb-abend body { background-color: var(--rfb-bg); color: var(--rfb-text); }

/* ============================================================
   SKALEN (2026-08-30) — Typografie, Bewegung, Alpha-Rampen

   Anlass: Messung gegen stevensolbach.com. Die Startseite trug
   13 verschiedene Fließtextgrößen und verstreute Übergangszeiten
   von 0,2 bis 0,7 s. Ab hier gibt es feste Stufen.

   ⚠ Diese Tokens gelten themeunabhängig — AUSSER den Alpha-Rampen.
   Die hängen an der Textfarbe und existieren deshalb zweimal:
   einmal hier für die hellen Welten, einmal unter html.rfb-abend.
   Eine neue DUNKLE Welt braucht einen eigenen Rampen-Block,
   sonst rechnet sie mit hellem Ink auf hellem Grund.
   ============================================================ */

:root {
  /* Fließtext — fünf Stufen statt dreizehn.
     Die Stufe „meta" gibt es, weil zwischen 0,9 und 1,05 rem eine echte
     Lücke im Bestand klafft; ohne sie müsste Text um mehr als einen
     Pixel wandern, nur damit die Tabelle hübsch aussieht. */
  --rfb-fs-lead:   1.375rem;   /* 22,0 px — Vorspann, Hero-Absatz */
  --rfb-fs-body:   1.0625rem;  /* 17,0 px — Standard */
  --rfb-fs-meta:   0.95rem;    /* 15,2 px — Meta-Zeilen, kleine Buttons */
  --rfb-fs-small:  0.85rem;    /* 13,6 px — Bildunterschrift, Hinweis */
  --rfb-fs-micro:  0.72rem;    /* 11,5 px — Footer-Credit, Randnotiz */
  --rfb-fs-eyebrow: 0.78rem;   /* 12,5 px — mit .rfb-eyebrow-Sperrsatz */

  /* Überschriften — fluid, damit Mobil nicht bricht */
  --rfb-fs-h1: clamp(3.1rem, 6.4vw, 5.5rem);
  --rfb-fs-h2: clamp(2.1rem, 3.6vw, 3rem);
  --rfb-fs-h3: clamp(1.35rem, 2vw, 1.75rem);

  /* Strichstärke der Serif. Große Headlines vertragen dünner. */
  --rfb-weight-display: 300;
  --rfb-tracking-display: -0.02em;

  /* Bewegung. Vorher: 0.2 / 0.25 / 0.3 / 0.35 / 0.4 / 0.6 / 0.7 s
     querbeet. Jetzt vier Stufen plus der Atem. */
  --rfb-dur-instant: 100ms;
  --rfb-dur-fast:    200ms;
  --rfb-dur-normal:  350ms;
  --rfb-dur-slow:    600ms;
  --rfb-dur-breath:  6s;
  --rfb-ease-enter: cubic-bezier(0.22, 1, 0.36, 1);
  --rfb-ease-exit:  cubic-bezier(0.55, 0, 1, 0.45);
  --rfb-ease-move:  cubic-bezier(0.45, 0, 0.55, 1);

  /* Radien — aus dem Bestand abgeleitet, nicht erfunden.
     Gezählt am 30.08.: 999/9999px 35x · 8px 9x · 50% 9x · 6px 5x ·
     10px 5x · 14px 3x · 12px 3x · 4px 2x · 2px 2x · 18px 2x · 28px 2x */
  --rfb-radius-sm:     4px;    /* fasst 2, 4, 6 */
  --rfb-radius-md:     8px;    /* fasst 8, 10 */
  --rfb-radius-lg:    14px;    /* fasst 12, 14, 18 */
  --rfb-radius-pill: 999px;
  --rfb-radius-circle: 50%;

  /* Abstände. Die Sektionsstufen sind die beiden Rhythmen, die es
     wirklich gibt (100px 9x, 120px 6x, 140px 3x, 80px 3x). */
  --rfb-space-2xs:  8px;
  --rfb-space-xs:  16px;
  --rfb-space-sm:  24px;
  --rfb-space-md:  32px;
  --rfb-space-lg:  48px;
  --rfb-space-xl:  64px;
  --rfb-section-sm:  80px;
  --rfb-section:    100px;
  --rfb-section-lg: 140px;

  /* Alpha-Rampen (helle Welten): Ink = --rfb-text #2B2B2B */
  --rfb-ink-06: rgba(43, 43, 43, 0.06);
  --rfb-ink-10: rgba(43, 43, 43, 0.10);
  --rfb-ink-15: rgba(43, 43, 43, 0.15);
  --rfb-ink-25: rgba(43, 43, 43, 0.25);
  --rfb-ink-40: rgba(43, 43, 43, 0.40);
  --rfb-ink-60: rgba(43, 43, 43, 0.60);
  /* Akzent-Rampe: Clay #B8754A */
  --rfb-accent-10: rgba(184, 117, 74, 0.10);
  --rfb-accent-20: rgba(184, 117, 74, 0.20);
  --rfb-accent-35: rgba(184, 117, 74, 0.35);
}

/* Dunkle Welt: Ink = --rfb-text #E9DFCE, Akzent = #CD9B6E */
html.rfb-abend {
  --rfb-ink-06: rgba(233, 223, 206, 0.06);
  --rfb-ink-10: rgba(233, 223, 206, 0.10);
  --rfb-ink-15: rgba(233, 223, 206, 0.15);
  --rfb-ink-25: rgba(233, 223, 206, 0.25);
  --rfb-ink-40: rgba(233, 223, 206, 0.40);
  --rfb-ink-60: rgba(233, 223, 206, 0.60);
  --rfb-accent-10: rgba(205, 155, 110, 0.10);
  --rfb-accent-20: rgba(205, 155, 110, 0.20);
  --rfb-accent-35: rgba(205, 155, 110, 0.35);
}

/* ============================================================
   TAP-ZIELE (2026-08-30)
   Gemessen auf 390 px: 49 von 101 Bedienelementen unter 40 px.
   Die Masse hing an zwei Ursachen, nicht an fünfzig Einzelfällen.

   Trick: senkrechtes Padding an einem INLINE-Element vergrößert die
   Trefferfläche, verschiebt aber keine Zeilenhöhe — es überlappt nur.
   Deshalb braucht es hier kein negatives margin und kein inline-block,
   das das Umbruchverhalten mehrzeiliger Links ändern würde.
   ============================================================ */

/* Die „Mehr →"-Links standen auf 24 px Höhe bei Padding 0.
   ⚠ background-origin: content-box ist Pflicht — .rfb-link-draw zeichnet
   seinen Unterstrich per background-position:left bottom. Ohne diese
   Zeile rutscht der Strich mit dem Padding vom Text weg. */
.rfb-link-draw {
  padding-block: 10px;
  background-origin: content-box;
}

/* Der Hamburger von Twenty Twenty-Five kommt als 24x24 ohne Padding —
   das kleinste Ziel der Seite war ausgerechnet die wichtigste Bedienung
   auf dem Handy. 10 px Padding ergeben 44x44; das negative margin hält
   den Header an Ort und Stelle. */
.wp-block-navigation__responsive-container-open,
.wp-block-navigation__responsive-container-close {
  padding: 10px !important;
  margin: -10px !important;
}

/* Der Link im Aktuell-Band (eigener Namensraum, eigener Style-Block) */
.rfb-ref-notiz a.more { padding-block: 10px; }

/* Die Lightbox-Lupe von WordPress steht auf 25x25 und ist absolut
   positioniert — deshalb Mindestmaß statt Padding, sonst verschiebt
   sie sich in der Ecke des Bildes. */
figure button.lightbox-trigger {
  min-width: 44px;
  min-height: 44px;
}

/* Footer-Navigation: ein klassenloses <nav> aus update-footer.js.
   Der :not([class])-Filter trennt sie sauber von der Hauptnavigation,
   die als nav.wp-block-navigation kommt. */
nav:not([class]) a { padding-block: 12px; }

/* Wissensgarten-Teaser: lag mit 39 px genau einen Pixel daneben */
.rfb-krl-teaser-links a { padding-block: 10px; }

/* Welten-Umschalter (MU-Plugin) stand auf 38 px */
.rfb-welten-knopf { min-height: 44px; }

/* Newsletter-Formular (fl-subscribe): Felder auf 35 px, Knopf auf 33 px */
form input[type="email"],
form input[type="text"],
form button[type="submit"] { min-height: 44px; }

/* Kästchen bleiben bei 24 px — das ist das Mindestmaß aus WCAG 2.5.8.
   44 px wären hier optisch ein Klotz neben einer Zeile Text. */
form input[type="checkbox"] { min-width: 24px; min-height: 24px; }

/* Formularelemente erben die Schrift nicht — der Browser setzt Arial.
   Genau daher kam die vierte Schriftfamilie auf jeder Seite: ein
   einziger „ANMELDEN"-Knopf im Newsletter-Formular, ohne eigene
   font-family. Nicht das Plugin war schuld, sondern der UA-Standard. */
button, input, select, textarea { font-family: inherit; }

/* Der eine Schalter für Bewegung. Wer im Betriebssystem weniger
   Animation eingestellt hat, bekommt die Skala auf ~0 gesetzt —
   damit greift es auch dort, wo eine Regel die Dauer aus dem Token
   zieht, ohne dass jede Stelle einzeln ausgenommen werden muss. */
@media (prefers-reduced-motion: reduce) {
  :root {
    --rfb-dur-instant: 1ms;
    --rfb-dur-fast:    1ms;
    --rfb-dur-normal:  1ms;
    --rfb-dur-slow:    1ms;
    --rfb-dur-breath:  1ms;
  }
}

/* --- Copy-Swap (ohne JS; Default/no-JS = Tag-Variante) --- */
.rfb-copy-abend { display: none; }
html.rfb-abend .rfb-copy-tag { display: none; }
html.rfb-abend .rfb-copy-abend { display: inline; }

/* --- Theme-Toggle (fixed bottom-LEFT; bottom-right = „Termin anfragen") --- */
.rfb-theme-toggle { position: fixed; left: 20px; bottom: 20px; z-index: 90; }
.rfb-theme-toggle button {
  display: flex; align-items: center;
  border: 1px solid var(--rfb-card-border);
  background: var(--rfb-card); color: var(--rfb-text);
  border-radius: var(--rfb-radius-pill); padding: 5px; cursor: pointer;
  box-shadow: 0 4px 18px rgba(0, 0, 0, 0.18);
  font-size: 0.78rem; letter-spacing: 0.08em; font-weight: 600;
}
.rfb-theme-toggle span {
  padding: 6px 14px; border-radius: var(--rfb-radius-pill);
  transition: background var(--rfb-dur-normal) var(--rfb-ease-move), color var(--rfb-dur-normal) var(--rfb-ease-move);
}
.rfb-theme-toggle .rfb-tt-tag { background: var(--rfb-accent-text, #96562F); color: #FAF6EA; }
html.rfb-abend .rfb-theme-toggle .rfb-tt-tag { background: transparent; color: var(--rfb-text); }
html.rfb-abend .rfb-theme-toggle .rfb-tt-abend { background: var(--rfb-accent); color: var(--rfb-accent-ink); }
.rfb-theme-toggle button:focus-visible { outline: 3px solid var(--rfb-accent); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { .rfb-theme-toggle span { transition: none; } }
@media (max-width: 600px) { .rfb-theme-toggle { left: 12px; bottom: 12px; } }

/* ============================================================
   GLUT & EMBER (2026-07-25) — heißerer Abend NUR für die Tantra-Seite.
   Scope: .rfb-heat sitzt auf dem Outer-Wrapper der Tantra-Massage-Seite;
   greift ausschließlich unter html.rfb-abend. Startseite + Lexika
   bleiben „Kerzenlicht", Tag-Modus unberührt.
   ============================================================ */
html.rfb-abend .rfb-heat {
  --rfb-bg: #2A1710;
  --rfb-bg-alt: #3A2115;
  --rfb-text: #F0E2D2;
  --rfb-heading: #F6E9D8;
  --rfb-accent: #D97B4A;
  --rfb-accent-ink: #2A1409;
  --rfb-accent-link: #E8956A;
  --rfb-accent-text: #E8956A;
  --rfb-muted: #CBB39E;
  --rfb-card: #3A2115;
  --rfb-card-border: rgba(217, 123, 74, 0.28);
  --rfb-photo-filter: sepia(0.55) saturate(1.05) hue-rotate(-15deg) brightness(0.82) contrast(1.05);
}
/* Kerzen-Schimmer von oben (Glut über der Seite) */
html.rfb-abend .rfb-heat.rfb-grain {
  background: radial-gradient(1100px 480px at 68% 0%, rgba(217, 123, 74, 0.12), transparent 62%),
              var(--rfb-bg) !important;
}
/* Kerzen-Glow: Hero-Bild + Buttons */
html.rfb-abend .rfb-heat .rfb-breath { box-shadow: 0 18px 70px rgba(217, 123, 74, 0.35) !important; }
html.rfb-abend .rfb-heat .wp-block-button__link { transition: box-shadow var(--rfb-dur-normal) var(--rfb-ease-move), background-color var(--rfb-dur-normal) var(--rfb-ease-move); }
html.rfb-abend .rfb-heat .wp-block-button__link:hover { box-shadow: 0 0 26px rgba(217, 123, 74, 0.5); }

/* ============================================================
   KONTRAST-NACHZUG (2026-08-13, gemessen)
   Zwei CTAs standen mit weißer Schrift auf Clay #B8754A = 3,70:1 —
   AA-Fail, und zwar in JEDER Stimmung inklusive Tag. Die Regeln kommen
   aus den Addon-Skripten (add-rfb-referenz-notiz.js Z.45,
   add-rfb-kraeuterlexikon-teaser.js Z.42) und werden hier zentral
   überschrieben; dieses Sheet lädt später und gewinnt bei gleicher
   Spezifität. --rfb-accent-text ist die AA-taugliche Stufe und wechselt
   automatisch mit der Welt (Tag #96562F = 5,2:1 gegen Weiß).
   ⚠ Bei Gelegenheit in den beiden Addons an der Quelle korrigieren.
   ============================================================ */
.rfb-ref-notiz a.cta,
.rfb-krl-teaser-cta {
  background: var(--rfb-accent-text, #96562F) !important;
  /* Schrift MUSS mitwandern: im Abend ist --rfb-accent-text hell (#D9B18A),
     weiße Schrift darauf ergab 1,98:1. --rfb-accent-ink ist die passende
     Gegenfarbe in jeder Welt (Tag hell auf dunkel, Abend dunkel auf hell). */
  color: var(--rfb-accent-ink, #FAF6EA) !important;
  box-shadow: 0 5px 14px rgba(150, 86, 47, 0.26);
}

/* ============================================================
   AKTUELL-BANNER: Textfarben auf Tokens (2026-08-13, gemessen)
   `.rfb-ref-notiz` (aus add-rfb-referenz-notiz.js) trug seine Textfarben
   hart kodiert für hellen Grund: Titel #2B1F14, Text #5C4A38, Link
   #3F4D33. Der Container ist transparent, erbt also den Weltton — im
   ABEND-Modus stand damit dunkler Text auf dunklem Braun: gemessen
   1,13:1 bei 34px, praktisch unlesbar. Der Fehler ist so alt wie der
   Banner und fiel nie auf, weil tagsüber getestet wird.
   Mit Tokens trägt er in jeder Stimmung.
   ⚠ Bei Gelegenheit an der Quelle (Addon-Skript) korrigieren.
   ============================================================ */
.rfb-ref-notiz .eyebrow { color: var(--rfb-accent-text, #96562F) !important; }
.rfb-ref-notiz .title { color: var(--rfb-heading, #3F4D33) !important; }
.rfb-ref-notiz p:not(.title) { color: var(--rfb-text, #2B2B2B) !important; }
.rfb-ref-notiz a.more { color: var(--rfb-accent-link, #96562F) !important; }

/* ============================================================
   WISSENSGARTEN-TEASER + Theme-Buttons im Abend (2026-08-13, gemessen)
   Derselbe Fehler wie beim Aktuell-Banner, nur im zweiten Addon
   (add-rfb-kraeuterlexikon-teaser.js): Eyebrow #96562F, Überschrift
   #2B1F14 und Lead #5C4A38 sind hart für hellen Grund gesetzt und standen
   im Abend mit 1,13–2,49:1 auf dunklem Braun. Dazu ein Theme-Button ohne
   eigene Fläche, dessen Default-Schwarz (#111) im Abend 1,33:1 erreicht.
   ============================================================ */
.rfb-krl-teaser-inner .eyebrow,
.rfb-krl-teaser .eyebrow { color: var(--rfb-accent-text, #96562F) !important; }
.rfb-krl-teaser-inner h2,
.rfb-krl-teaser h2 { color: var(--rfb-heading, #3F4D33) !important; }
.rfb-krl-teaser-inner .lead,
.rfb-krl-teaser .lead { color: var(--rfb-text, #2B2B2B) !important; }

/* Buttons ohne eigene Fläche erben im Abend die helle Schriftfarbe */
html.rfb-abend .wp-block-button__link:not([style*="background-color"]):not(.has-background) {
  color: var(--rfb-text) !important;
}

/* ============================================================
   EVENTS-SEITE (page-id-10) im Abend (2026-08-13, gemessen)
   Die Seite trägt ihre Hero-Texte und Kalender-Beschriftungen hart für
   hellen Grund: Überschriften #2B1F14 (1,13:1 auf Abend-Braun), Lead
   #5C4A38 (1,69:1), die SVG-Monatslabels sogar im Theme-Schwarz #111
   (1,33:1). Im Abend-Modus war die Seite damit praktisch unlesbar —
   seit es sie gibt. Tokens statt fester Werte heilen alle Welten auf
   einmal.
   ============================================================ */
/* Nur h1/h2: h3/h4 trafen auch den immer dunklen Footer und die dunklen
   Event-Karten und rissen dort 16 neue Kontrastfehler auf (2026-08-13). */
body.page-id-10 h1,
body.page-id-10 h2 { color: var(--rfb-heading, #3F4D33) !important; }
/* Ausnahme: der Event-Feed-Wrapper bleibt in jeder Welt eine helle Flaeche.
   Dort muss die Ueberschrift dunkel bleiben — die Token-Regel oben machte sie
   im Abend hell und damit hell-auf-hell (1,14:1, gemessen 2026-08-13). */
body.page-id-10 .rfb-ev-feed-wrapper h1,
body.page-id-10 .rfb-ev-feed-wrapper h2,
body.page-id-10 .rfb-ev-feed h1,
body.page-id-10 .rfb-ev-feed h2,
body.page-id-10 .rfb-ev-section h1,
body.page-id-10 .rfb-ev-section h2 { color: #2B1F14 !important; }
body.page-id-10 .rfb-ev-hero-eyebrow { color: var(--rfb-accent-text, #96562F) !important; }
body.page-id-10 h1 + p,
body.page-id-10 h2 + p { color: var(--rfb-text, #2B2B2B) !important; }

/* Kalender: Monats- und Jahresbeschriftung erben sonst Theme-Schwarz */
.rfb-cal-mlabel,
.rfb-cal-year-label,
.rfb-cal-year-sub {
  fill: var(--rfb-text, #2B2B2B) !important;
  color: var(--rfb-text, #2B2B2B) !important;
}
/* Jahres-Chip: gleiche Behandlung wie die übrigen CTAs */
.rfb-cal-chip.is-active {
  background: var(--rfb-accent-text, #96562F) !important;
  color: var(--rfb-accent-ink, #FAF6EA) !important;
}

/* Kalender-Panel: Typ und Link trugen die Event-Akzentfarbe als TEXT auf
   weißem Panel (Gold #E0B86E = 1,87:1). Die Farbcodierung bleibt im Rad
   erhalten, im Fließtext hat Lesbarkeit Vorrang — so löst es die Site an
   anderer Stelle bereits („Event-Akzente: Text = color-mix(…45%, #2B1F14)").
   ⚠ Sauber wäre die Ableitung je Typ im Composer create-rfb-events.js. */
.rfb-cal-panel-type { color: #4A3A28 !important; }
.rfb-cal-panel-link { color: #7E4A28 !important; }

/* ---------------------------------------------------------------
   Kartenraster (2026-08-16)
   Loest die wp:columns-Verschachtelung auf /angebote/, /community/ und
   /community/konsens/ ab. Dort blieben pro Karte 182px Textbreite, weil
   drei Spalten in einem 645px-Container standen; Woerter brachen mitten
   entzwei ("Begegnun gsabende", "Workshop s"). Twenty Twenty-Five setzt
   --wp--style--global--content-size auf 645px und schlaegt damit die
   contentSize-Angaben der Composer (920/900/800px). Das Raster laeuft
   deshalb als alignwide (1340px) und begrenzt sich hier selbst.
   --------------------------------------------------------------- */
.rfb-cardgrid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 32px;
  align-items: start;
  /* Ausbruch aus dem 645px-Container: alignwide allein reicht nicht, weil das
     Kind nie breiter wird als sein Elternteil. Gleiches Muster wie bei
     .rfb-ev-root > .alignfull auf der Events-Seite; !important, weil die
     WP-Layout-Regel fuer .alignwide sonst mit gleicher Spezifitaet gewinnt. */
  width: min(1150px, calc(100vw - 3rem));
  max-width: none !important;
  /* WP setzt fuer .alignwide in constrained layouts margin-left:auto !important —
     ohne eigenes !important bleibt das Grid links haengen (gemessen left:-177). */
  margin-left: 50% !important;
  margin-right: 0 !important;
  transform: translateX(-50%);
}
.rfb-cardgrid > * { margin-block: 0 !important; }
@media (max-width: 600px) { .rfb-cardgrid { gap: 24px; } }

/* Netz gegen ueberlange Woerter. Kein hyphens:auto — bei 300px+ Karten trennt
   das nur unnoetig ("Festi-val-Crew") und macht den Satz unruhig. */
.rfb-polaroid h3, .rfb-polaroid h2, .rfb-polaroid p { overflow-wrap: break-word; }

/* ============================================================
   WELTEN (2026-08-13) — Licht- und Materialstimmungen
   ============================================================
   Neben Tag (:root) und Abend (html.rfb-abend) gibt es weitere Welten,
   die der Besucher selbst wählt. Jede Welt ist ein Token-Satz plus eine
   Material-Ebene auf den vorhandenen .rfb-*-Komponenten.

   Regeln für neue Welten:
   - ALLE 12 Tokens überschreiben (sonst mischt sich der Tag-Default rein).
   - `html.<welt> body { background-color: var(--rfb-bg); }` nicht vergessen,
     sonst bleibt der Theme-Default-Body hell.
   - Kontrast rechnen, bevor es live geht: --rfb-accent-text ist die
     Kleintext-Stufe (Links, Eyebrows, Pills), --rfb-accent nur für Deko,
     Fills und Headlines ≥24px. Clay auf Creme war 3,4:1 — die Falle.
   - Copy-Swap bleibt Tag/Abend vorbehalten: die neuen Welten sind
     Stimmungen, keine Sprachregister, und zeigen die Tag-Copy.
   - `.rfb-dusk` bleibt in JEDER Welt dunkel (Kontrast-Anker), `.rfb-heat`
     bleibt an html.rfb-abend gebunden.
   ============================================================ */

/* ─────────────────────────────────────────────────────────────
   WELT „ATEM" — Zeitstruktur statt Dekor
   Die Praxis beginnt beim Atem, also baut diese Welt darauf: alles
   weitet und sammelt sich, nichts ruckt. Farbe radikal reduziert
   (warmes Weiß, ein tiefer Salbei-Ton), Hairlines statt Karten,
   viel Luft. Kein Korn, keine Schatten, keine Rotation.
   ───────────────────────────────────────────────────────────── */

html.rfb-atem {
  --rfb-bg: #FCFAF6;
  --rfb-bg-alt: #F5F1E9;
  --rfb-text: #33302B;
  --rfb-heading: #1F1D19;
  --rfb-accent: #5A6B57;
  --rfb-accent-ink: #FCFAF6;
  --rfb-accent-link: #46553F;
  --rfb-accent-text: #46553F;
  --rfb-muted: #6B655C;
  --rfb-card: #FFFFFF;
  --rfb-card-border: rgba(90, 107, 87, 0.20);
  --rfb-photo-filter: grayscale(0.18) saturate(0.9) brightness(1.02) contrast(0.97);
}
html.rfb-atem body { background-color: var(--rfb-bg); color: var(--rfb-text); }

/* Der Atem wird langsamer und tiefer — 10s statt 6s, größere Amplitude */
html.rfb-atem .rfb-breath img { animation-duration: 10s; }
@keyframes rfb-atem-breath {
  from { transform: scale(1); }
  to   { transform: scale(1.045); }
}
html.rfb-atem .rfb-breath img { animation-name: rfb-atem-breath; }

/* Karten treten zurück: keine Schatten, keine Rotation, nur eine feine Linie */
html.rfb-atem .rfb-polaroid,
html.rfb-atem .rfb-testimonial-card,
html.rfb-atem .rfb-offer-card,
html.rfb-atem body.post-type-archive-workshop .wp-block-post.workshop,
html.rfb-atem body.post-type-archive-festival .wp-block-post.festival {
  box-shadow: none !important;
  transform: none !important;
  border: 1px solid var(--rfb-card-border);
  border-radius: 0;
}
html.rfb-atem .rfb-dusk-card { border-radius: 0; box-shadow: none; }

/* Mehr Luft, ruhigerer Satz */
html.rfb-atem .rfb-path-card { padding: 52px 32px 48px; }
html.rfb-atem .rfb-path-card:hover { transform: none; border-top-color: var(--rfb-accent); }
html.rfb-atem .rfb-ritual li { padding-top: 34px; padding-bottom: 34px; }
html.rfb-atem .rfb-eyebrow { letter-spacing: 0.4em; }
html.rfb-atem p { line-height: 1.9; }

/* Kein Korn — diese Welt ist klar */
html.rfb-atem .rfb-grain::before { display: none; }

/* Übergänge im Atemtakt: einatmen kurz, ausatmen lang */
html.rfb-atem .rfb-path-card,
html.rfb-atem .rfb-polaroid,
html.rfb-atem .rfb-offer-card,
html.rfb-atem a { transition-duration: 1.6s; transition-timing-function: cubic-bezier(0.33, 0, 0.2, 1); }

/* Die Hairline atmet mit (sehr zurückhaltend) */
@keyframes rfb-atem-linie {
  0%, 100% { opacity: 0.5; }
  50%      { opacity: 1; }
}
html.rfb-atem .rfb-hairline,
html.rfb-atem .rfb-hairline-themed { animation: rfb-atem-linie 10s ease-in-out infinite; }

html.rfb-atem .rfb-testimonial-scroll::-webkit-scrollbar-thumb { background: var(--rfb-accent); }

@media (prefers-reduced-motion: reduce) {
  html.rfb-atem .rfb-hairline,
  html.rfb-atem .rfb-hairline-themed { animation: none; }
  html.rfb-atem .rfb-path-card,
  html.rfb-atem .rfb-polaroid,
  html.rfb-atem .rfb-offer-card,
  html.rfb-atem a { transition-duration: 0s; }
}

/* ─────────────────────────────────────────────────────────────
   WELT „LEINEN" — Material der Liege
   Ungebleichtes Leinen mit Krapprot und Indigo. Sichtbare Webstruktur,
   weiche Faltenschatten, Kanten wie Stoffbruch. Sinnlichkeit über
   Material, nicht über Andeutung.
   ───────────────────────────────────────────────────────────── */

html.rfb-leinen {
  --rfb-bg: #EFE9DC;
  --rfb-bg-alt: #E5DDCC;
  --rfb-text: #2F2B25;
  --rfb-heading: #26221C;
  --rfb-accent: #9E4430;
  --rfb-accent-ink: #F3EFE5;
  --rfb-accent-link: #8A3A28;
  --rfb-accent-text: #8A3A28;
  --rfb-muted: #625B4F;
  --rfb-card: #F6F2E8;
  --rfb-card-border: rgba(47, 43, 37, 0.20);
  --rfb-photo-filter: sepia(0.22) saturate(0.92) brightness(0.99) contrast(1.03);
  --rfb-leinen-indigo: #3E5A6E;
}
html.rfb-leinen body { background-color: var(--rfb-bg); color: var(--rfb-text); }

/* Webstruktur: das vorhandene Korn-Overlay wird zum Gewebe.
   Zwei feine Linienraster über Kreuz — das ist eine Leinwandbindung. */
html.rfb-leinen .rfb-grain::before {
  background-image:
    repeating-linear-gradient(90deg, rgba(47, 43, 37, 0.055) 0 1px, transparent 1px 3px),
    repeating-linear-gradient(0deg, rgba(47, 43, 37, 0.045) 0 1px, transparent 1px 3px);
  opacity: 1;
}

/* Karten sind aufgelegte Tücher: weicher Faltenschatten, oben ein Lichtsaum */
html.rfb-leinen .rfb-polaroid,
html.rfb-leinen .rfb-testimonial-card,
html.rfb-leinen .rfb-offer-card,
html.rfb-leinen body.post-type-archive-workshop .wp-block-post.workshop,
html.rfb-leinen body.post-type-archive-festival .wp-block-post.festival {
  background: var(--rfb-card);
  border-radius: 0;
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.55),
    0 2px 3px rgba(47, 43, 37, 0.07),
    0 14px 28px rgba(47, 43, 37, 0.09);
}
html.rfb-leinen .rfb-dusk-card { border-radius: 0; }

/* Nähte statt Linien */
html.rfb-leinen .rfb-hairline,
html.rfb-leinen .rfb-hairline-themed {
  border-top: 1px dashed rgba(47, 43, 37, 0.32);
}
html.rfb-leinen .rfb-path-card {
  border-top: 1px dashed rgba(47, 43, 37, 0.32);
}
html.rfb-leinen .rfb-path-card:hover { border-top-color: var(--rfb-accent); }

/* Indigo als zweiter Faden — Ziffern und Zählungen */
html.rfb-leinen .rfb-path-num,
html.rfb-leinen .rfb-ritual li::before { color: var(--rfb-leinen-indigo); }

/* Der Saum: die Wortmarke und Randnotizen bleiben Krapprot */
html.rfb-leinen .rfb-margin-note { color: var(--rfb-accent-text); }
html.rfb-leinen .rfb-testimonial-scroll::-webkit-scrollbar-thumb { background: var(--rfb-accent); }

/* Fotos wirken wie auf Stoff gelegt */
html.rfb-leinen .rfb-duotone img { filter: var(--rfb-photo-filter); }

/* ─────────────────────────────────────────────────────────────
   Hart kodierte Tag-Farben einfangen
   Nicht jede Fläche der Composer nutzt Tokens: Header-Band, Aktuell-Banner
   und der Termin-Pill tragen die Tag-Werte direkt im Inline-Style. In den
   neuen Welten würden sie als Fremdkörper stehen bleiben. Wir fangen sie
   über Attribut-Selektoren ab — dieselbe Technik nutzt die Site bereits für
   die Button-Umfärbung im Tag-Modus.

   Bewusst NICHT eingefangen: das Oliv `#3F4D33` (Zitat-/Versprechen-Bänder),
   das Abend-Gateway und die weißen Polaroid-Panels — die sind laut DESIGN.md
   in jeder Stimmung fest.
   ───────────────────────────────────────────────────────────── */

html.rfb-atem [style*="background-color:#F5EFE0"],
html.rfb-atem [style*="background-color:#f5efe0"],
html.rfb-leinen [style*="background-color:#F5EFE0"],
html.rfb-leinen [style*="background-color:#f5efe0"] {
  background-color: var(--rfb-bg-alt) !important;
}
html.rfb-atem [style*="background-color:#FAF6EA"],
html.rfb-atem [style*="background-color:#faf6ea"],
html.rfb-leinen [style*="background-color:#FAF6EA"],
html.rfb-leinen [style*="background-color:#faf6ea"] {
  background-color: var(--rfb-bg) !important;
}

/* Der schwebende „Termin anfragen"-Pill trägt den Tag-Clay fest im CSS */
html.rfb-atem .rfb-floating-cta,
html.rfb-leinen .rfb-floating-cta {
  background: var(--rfb-accent-text) !important;
  color: var(--rfb-accent-ink) !important;
}

/* ─────────────────────────────────────────────────────────────
   WELT „DAS RAD" — der Kreis als Ordnung
   Konsens ist bei uns ein Rad (Wheel of Consent), das Jahr auch
   (Jahresrad-Kalender). Diese Welt macht den Kreis zum Ordnungssystem:
   Ziffern in Kreisen, radiale Felder, runde Ecken an den Karten.
   Bewusst KEIN Farbkreis — zwei Töne plus Neutral, sonst landet die
   Welt beim Chakra-Regenbogen, den PRODUCT.md ausschließt.
   ───────────────────────────────────────────────────────────── */

html.rfb-rad {
  --rfb-bg: #F7F2E9;
  --rfb-bg-alt: #EDE5D6;
  --rfb-text: #2E2A24;
  --rfb-heading: #23201B;
  --rfb-accent: #B4633F;
  --rfb-accent-ink: #FFFDF8;
  --rfb-accent-link: #8F4A2B;
  --rfb-accent-text: #8F4A2B;
  --rfb-muted: #5F584C;
  --rfb-card: #FFFDF8;
  --rfb-card-border: rgba(180, 99, 63, 0.26);
  --rfb-photo-filter: sepia(0.28) saturate(0.95) brightness(1.0) contrast(1.02);
  --rfb-rad-zweit: #4A5A3C;
}
html.rfb-rad body { background-color: var(--rfb-bg); color: var(--rfb-text); }

/* Fills laufen über die Textstufe: --rfb-accent trägt hier nur 4,3:1,
   die Site färbt Buttons im Tag-Zweig ohnehin auf --rfb-accent-text um. */
html.rfb-rad .rfb-floating-cta { background: var(--rfb-accent-text) !important; color: var(--rfb-accent-ink) !important; }

/* Ziffern sitzen in Kreisen */
html.rfb-rad .rfb-path-num,
html.rfb-rad .rfb-ritual li::before {
  display: inline-flex; align-items: center; justify-content: center;
  width: 3rem; height: 3rem; border-radius: 50%;
  border: 1px solid var(--rfb-card-border);
  font-size: 1.35rem; color: var(--rfb-accent-text);
}
html.rfb-rad .rfb-ritual li::before { top: 18px; }
html.rfb-rad .rfb-ritual li { padding-left: 88px; }

/* Karten öffnen sich zum Kreis hin: eine Ecke wird zum Bogen */
html.rfb-rad .rfb-polaroid,
html.rfb-rad .rfb-testimonial-card,
html.rfb-rad .rfb-offer-card,
html.rfb-rad .rfb-dusk-card {
  border-radius: 0 0 0 96px;
}
html.rfb-rad .rfb-path-card { border-top: 1px solid var(--rfb-card-border); border-radius: 0 0 0 72px; }

/* Sektionsflächen bekommen ein radiales Feld statt Korn */
html.rfb-rad .rfb-grain::before {
  background-image: radial-gradient(circle at 50% 0%, rgba(180, 99, 63, 0.10), transparent 62%);
  opacity: 1;
}

/* Die Hairline trägt einen Punkt in der Mitte — Nabe statt Strich */
html.rfb-rad .rfb-hairline,
html.rfb-rad .rfb-hairline-themed { position: relative; border-top-color: var(--rfb-card-border); }
html.rfb-rad .rfb-hairline::after,
html.rfb-rad .rfb-hairline-themed::after {
  content: ""; position: absolute; left: 50%; top: -4px;
  width: 7px; height: 7px; border-radius: 50%; background: var(--rfb-accent);
  transform: translateX(-50%);
}

html.rfb-rad .rfb-margin-note { color: var(--rfb-rad-zweit); }
html.rfb-rad .rfb-testimonial-scroll::-webkit-scrollbar-thumb { background: var(--rfb-accent); }

/* ─────────────────────────────────────────────────────────────
   WELT „ZWEI STIMMEN" — das Paar als Bauprinzip
   Sitzungen sind immer zu zweit und immer für zwei. Diese Welt baut
   darauf: eine warme und eine kühle Farbfamilie, die sich begegnen.
   Elemente treten paarweise auf, die Mitte ist die Begegnungszone.
   ───────────────────────────────────────────────────────────── */

html.rfb-stimmen {
  --rfb-bg: #F6F3EE;
  --rfb-bg-alt: #EAE6DF;
  --rfb-text: #2C2A28;
  --rfb-heading: #242220;
  --rfb-accent: #A65A3A;
  --rfb-accent-ink: #FBF9F6;
  --rfb-accent-link: #8C4A2E;
  --rfb-accent-text: #8C4A2E;
  --rfb-muted: #5E5A54;
  --rfb-card: #FFFFFF;
  --rfb-card-border: rgba(44, 42, 40, 0.18);
  --rfb-photo-filter: sepia(0.18) saturate(0.95) brightness(1.0) contrast(1.02);
  --rfb-stimmen-kuehl: #3F5763;
}
html.rfb-stimmen body { background-color: var(--rfb-bg); color: var(--rfb-text); }

/* Karten treten paarweise auf: eine warme Stimme, eine kühle */
html.rfb-stimmen .rfb-path-card,
html.rfb-stimmen .rfb-polaroid,
html.rfb-stimmen .rfb-offer-card,
html.rfb-stimmen .rfb-testimonial-card { border-radius: 0; }
html.rfb-stimmen .rfb-path-card:nth-child(odd) { border-top: 2px solid var(--rfb-accent); }
html.rfb-stimmen .rfb-path-card:nth-child(even) { border-top: 2px solid var(--rfb-stimmen-kuehl); }
html.rfb-stimmen .wp-block-column:nth-child(even) .rfb-polaroid,
html.rfb-stimmen .wp-block-column:nth-child(even) .rfb-offer-card { border-left: 2px solid var(--rfb-stimmen-kuehl); }
html.rfb-stimmen .wp-block-column:nth-child(odd) .rfb-polaroid,
html.rfb-stimmen .wp-block-column:nth-child(odd) .rfb-offer-card { border-left: 2px solid var(--rfb-accent); }

/* Zählungen wechseln die Stimme */
html.rfb-stimmen .rfb-ritual li:nth-child(odd)::before { color: var(--rfb-accent-text); }
html.rfb-stimmen .rfb-ritual li:nth-child(even)::before { color: var(--rfb-stimmen-kuehl); }
html.rfb-stimmen .wp-block-column:nth-child(even) .rfb-path-num { color: var(--rfb-stimmen-kuehl); }

/* Die Mitte ist die Begegnung: zwei Linien, die sich treffen */
html.rfb-stimmen .rfb-hairline,
html.rfb-stimmen .rfb-hairline-themed {
  border: none; height: 2px; position: relative;
  background: linear-gradient(90deg, var(--rfb-accent) 0%, var(--rfb-accent) 46%, transparent 46%, transparent 54%, var(--rfb-stimmen-kuehl) 54%, var(--rfb-stimmen-kuehl) 100%);
  opacity: 0.55;
}

/* Sektionsfläche: warm links, kühl rechts, in der Mitte offen */
html.rfb-stimmen .rfb-grain::before {
  background-image: linear-gradient(90deg, rgba(166, 90, 58, 0.07) 0%, transparent 42%, transparent 58%, rgba(63, 87, 99, 0.07) 100%);
  opacity: 1;
}

html.rfb-stimmen .rfb-margin-note { color: var(--rfb-stimmen-kuehl); }
html.rfb-stimmen .rfb-testimonial-scroll::-webkit-scrollbar-thumb { background: var(--rfb-accent); }

/* Einfang-Schicht auch für die beiden neuen Welten */
html.rfb-rad [style*="background-color:#F5EFE0"],
html.rfb-rad [style*="background-color:#f5efe0"],
html.rfb-stimmen [style*="background-color:#F5EFE0"],
html.rfb-stimmen [style*="background-color:#f5efe0"] {
  background-color: var(--rfb-bg-alt) !important;
}
html.rfb-rad [style*="background-color:#FAF6EA"],
html.rfb-rad [style*="background-color:#faf6ea"],
html.rfb-stimmen [style*="background-color:#FAF6EA"],
html.rfb-stimmen [style*="background-color:#faf6ea"] {
  background-color: var(--rfb-bg) !important;
}
html.rfb-stimmen .rfb-floating-cta {
  background: var(--rfb-accent-text) !important; color: var(--rfb-accent-ink) !important;
}

/* ─────────────────────────────────────────────────────────────
   „ZWEI STIMMEN" als Standard-Welt (2026-08-13)
   Weil diese Welt seit dem Standard-Wechsel der erste Eindruck ist, muss
   das Paar-Prinzip schon oben lesbar sein — vorher zeigte es sich erst in
   den Karten-Sektionen weiter unten. Drei Eingriffe, alle CSS-only:
   das Feld unter dem Hero, die Aktionen und der Eyebrow.
   ───────────────────────────────────────────────────────────── */

/* 1) Das Feld: warm links, kühl rechts, offene Mitte — deutlicher als zuvor */
html.rfb-stimmen .rfb-grain::before {
  background-image: linear-gradient(90deg,
    rgba(166, 90, 58, 0.16) 0%,
    rgba(166, 90, 58, 0.05) 34%,
    transparent 46%,
    transparent 54%,
    rgba(63, 87, 99, 0.05) 66%,
    rgba(63, 87, 99, 0.16) 100%);
  opacity: 1;
}
/* Die Begegnung in der Mitte bekommt eine feine Achse */
html.rfb-stimmen .rfb-grain::after {
  content: ""; position: absolute; top: 12%; bottom: 12%; left: 50%;
  width: 1px; transform: translateX(-50%); pointer-events: none; z-index: 1;
  background: linear-gradient(180deg, transparent, rgba(44, 42, 40, 0.22) 22%, rgba(44, 42, 40, 0.22) 78%, transparent);
}
@media (max-width: 900px) { html.rfb-stimmen .rfb-grain::after { display: none; } }

/* 2) Zwei Aktionen, zwei Stimmen: die erste warm, die zweite kühl.
   Greift auf die Button-Paare in Hero, Bannern und Abschlüssen. */
html.rfb-stimmen .wp-block-buttons > .wp-block-button:nth-child(2) .wp-block-button__link {
  background-color: var(--rfb-stimmen-kuehl) !important;
  border-color: var(--rfb-stimmen-kuehl) !important;
  color: #FBF9F6 !important;
}
html.rfb-stimmen .wp-block-buttons > .wp-block-button:nth-child(2) .wp-block-button__link:hover {
  background-color: #33474F !important;
  border-color: #33474F !important;
}

/* 3) Der Eyebrow trägt beide Stimmen: Marke warm, Zeile kühl */
html.rfb-stimmen .rfb-eyebrow { color: var(--rfb-stimmen-kuehl); }
html.rfb-stimmen .rfb-eyebrow::first-letter { color: var(--rfb-accent-text); }

/* 4) Das Hero-Foto hält die kühle Seite, der Text die warme */
html.rfb-stimmen .rfb-duotone img {
  filter: sepia(0.12) saturate(0.92) hue-rotate(-6deg) brightness(0.99) contrast(1.03);
}

/* ─────────────────────────────────────────────────────────────
   „DAS RAD" im ersten Viewport (2026-08-13)
   Das Kreis-Prinzip zeigte sich bisher erst in den Karten-Sektionen —
   oben las sich die Welt wie Tag. Dieselbe Behandlung wie bei „Zwei
   Stimmen": ein Motiv, das ohne Scrollen trägt.
   ───────────────────────────────────────────────────────────── */

/* Das radiale Feld wird deutlicher und bekommt eine zweite Schale */
html.rfb-rad .rfb-grain::before {
  background-image:
    radial-gradient(circle at 50% -6%, rgba(180, 99, 63, 0.17), transparent 46%),
    radial-gradient(circle at 50% -6%, rgba(74, 90, 60, 0.10), transparent 68%);
  opacity: 1;
}
/* Ein großer, sehr ruhiger Kreisumriss hinter dem Hero — die Nabe der Seite */
html.rfb-rad .rfb-grain::after {
  content: ""; position: absolute; top: 4%; left: 50%;
  width: min(72vw, 900px); aspect-ratio: 1; transform: translateX(-50%);
  border: 1px solid rgba(180, 99, 63, 0.22); border-radius: 50%;
  pointer-events: none; z-index: 0;
}
@media (max-width: 900px) { html.rfb-rad .rfb-grain::after { display: none; } }

/* Die Aktionen werden zum Paar aus Scheibe und Ring */
html.rfb-rad .wp-block-buttons > .wp-block-button:nth-child(2) .wp-block-button__link {
  background-color: transparent !important;
  color: var(--rfb-accent-text) !important;
  border: 1px solid var(--rfb-accent-text) !important;
}
html.rfb-rad .wp-block-buttons > .wp-block-button:nth-child(2) .wp-block-button__link:hover {
  background-color: var(--rfb-accent-text) !important;
  color: var(--rfb-accent-ink) !important;
}

/* ─────────────────────────────────────────────────────────────
   JAHRESRAD auf farbigem Grund
   #rfb-cal trägt semantische Typ-Farben (Gold, Clay, Flieder …) auf
   halbtransparent weißen Flächen. Die Farben BLEIBEN — sie unterscheiden
   Event-Arten. Was fehlte, war ein definierter Untergrund: auf Leinen
   oder Rad schien der Weltton durch und alles wurde blass.
   ───────────────────────────────────────────────────────────── */

html.rfb-atem #rfb-cal,
html.rfb-leinen #rfb-cal,
html.rfb-rad #rfb-cal,
html.rfb-stimmen #rfb-cal {
  background: var(--rfb-card);
  border: 1px solid var(--rfb-card-border);
  border-radius: 4px;
  padding: 12px;
}

/* ─────────────────────────────────────────────────────────────
   DUSK-SCHUTZ — verbindlich für jede Welt
   `.rfb-dusk` (Abend-Gateway, Espresso #1E140D) ist laut DESIGN.md in
   JEDER Stimmung ein fester Kontrast-Anker. Welt-Regeln dürfen dort nicht
   hineinfärben: In „Zwei Stimmen" stand der Eyebrow „Der Abend" mit
   2,37:1 (gemessen 2026-08-13), weil die kühle Stimme die Dusk-Regel
   überschrieben hat. Dieser Block stellt die Dusk-Werte für alle neuen
   Welten wieder her und steht bewusst GANZ AM ENDE der Datei.

   ⚠ Neue Welten hier eintragen, sonst wiederholt sich der Fehler.
   ───────────────────────────────────────────────────────────── */

html.rfb-atem .rfb-dusk .rfb-eyebrow,
html.rfb-leinen .rfb-dusk .rfb-eyebrow,
html.rfb-rad .rfb-dusk .rfb-eyebrow,
html.rfb-stimmen .rfb-dusk .rfb-eyebrow { color: #C9946D; }

html.rfb-atem .rfb-dusk a,
html.rfb-leinen .rfb-dusk a,
html.rfb-rad .rfb-dusk a,
html.rfb-stimmen .rfb-dusk a { color: #D4A574; }
html.rfb-atem .rfb-dusk a:hover,
html.rfb-leinen .rfb-dusk a:hover,
html.rfb-rad .rfb-dusk a:hover,
html.rfb-stimmen .rfb-dusk a:hover { color: #E8BE8F; }

html.rfb-atem .rfb-dusk .rfb-margin-note,
html.rfb-leinen .rfb-dusk .rfb-margin-note,
html.rfb-rad .rfb-dusk .rfb-margin-note,
html.rfb-stimmen .rfb-dusk .rfb-margin-note { color: #C9946D; }

html.rfb-atem .rfb-dusk .rfb-hairline,
html.rfb-leinen .rfb-dusk .rfb-hairline,
html.rfb-rad .rfb-dusk .rfb-hairline,
html.rfb-stimmen .rfb-dusk .rfb-hairline,
html.rfb-atem .rfb-dusk .rfb-hairline-themed,
html.rfb-leinen .rfb-dusk .rfb-hairline-themed,
html.rfb-rad .rfb-dusk .rfb-hairline-themed,
html.rfb-stimmen .rfb-dusk .rfb-hairline-themed {
  border: none; border-top: 1px solid rgba(201, 148, 109, 0.22);
  background: none; height: auto; opacity: 1;
}
html.rfb-stimmen .rfb-dusk .rfb-hairline::after,
html.rfb-rad .rfb-dusk .rfb-hairline::after,
html.rfb-stimmen .rfb-dusk .rfb-hairline-themed::after,
html.rfb-rad .rfb-dusk .rfb-hairline-themed::after { display: none; }

html.rfb-atem .rfb-dusk .rfb-dusk-card,
html.rfb-leinen .rfb-dusk .rfb-dusk-card,
html.rfb-rad .rfb-dusk .rfb-dusk-card,
html.rfb-stimmen .rfb-dusk .rfb-dusk-card {
  background: #2B1F14; border: 1px solid rgba(201, 148, 109, 0.22);
  box-shadow: none;
}

/* ===============================================================
   Polaroid-Schutz (2026-08-16) — verbindlich wie der Dusk-Schutz
   ---------------------------------------------------------------
   .rfb-polaroid ist in JEDER Stimmung weiss ("angestrahlte Fotos",
   siehe DESIGN.md). Die Welt-Tokens faerben den Text darin aber mit:
   in "Abend" standen die Outline-Buttons der Karten mit 1,32:1 hell
   auf Weiss — auf /angebote/, /community/, /ueber-uns/ und
   /community/freunde/ praktisch unlesbar. Weisse Flaeche heisst also:
   Text zurueck auf die Tag-Werte, in allen Welten.
   =============================================================== */
html.rfb-abend .rfb-polaroid p,
html.rfb-abend .rfb-polaroid li,
html.rfb-atem .rfb-polaroid p,
html.rfb-atem .rfb-polaroid li,
html.rfb-leinen .rfb-polaroid p,
html.rfb-leinen .rfb-polaroid li,
html.rfb-rad .rfb-polaroid p,
html.rfb-rad .rfb-polaroid li,
html.rfb-stimmen .rfb-polaroid p,
html.rfb-stimmen .rfb-polaroid li { color: #5C4A38; }

html.rfb-abend .rfb-polaroid h2,
html.rfb-abend .rfb-polaroid h3,
html.rfb-atem .rfb-polaroid h2,
html.rfb-atem .rfb-polaroid h3,
html.rfb-leinen .rfb-polaroid h2,
html.rfb-leinen .rfb-polaroid h3,
html.rfb-rad .rfb-polaroid h2,
html.rfb-rad .rfb-polaroid h3,
html.rfb-stimmen .rfb-polaroid h2,
html.rfb-stimmen .rfb-polaroid h3 { color: #2B1F14; }

/* Outline-Buttons und Textlinks auf der weissen Karte */
html.rfb-abend .rfb-polaroid a,
html.rfb-atem .rfb-polaroid a,
html.rfb-leinen .rfb-polaroid a,
html.rfb-rad .rfb-polaroid a,
html.rfb-stimmen .rfb-polaroid a { color: #96562F; }

/* Nur Outline-Buttons: der gefuellte Standard-Button bringt seine eigene
   dunkle Flaeche mit (#111) und braucht die helle Schrift. Die Abend-Regel in
   custom-css.txt ("Buttons ohne eigene Flaeche erben die helle Schriftfarbe")
   traegt !important, deshalb hier ebenfalls. */
html.rfb-abend .rfb-polaroid .is-style-outline .wp-block-button__link,
html.rfb-atem .rfb-polaroid .is-style-outline .wp-block-button__link,
html.rfb-leinen .rfb-polaroid .is-style-outline .wp-block-button__link,
html.rfb-rad .rfb-polaroid .is-style-outline .wp-block-button__link,
html.rfb-stimmen .rfb-polaroid .is-style-outline .wp-block-button__link {
  color: #96562F !important; border-color: #96562F;
}

/* Der gefuellte Button auf der weissen Karte bringt seine eigene schwarze
   Flaeche mit (#111), erbt in den hellen Welten aber den Clay-Text — 3,30:1.
   Auf dunkler Flaeche gehoert heller Text, wie es "Abend" schon macht. */
html.rfb-stimmen .rfb-polaroid .wp-block-button:not(.is-style-outline) .wp-block-button__link,
html.rfb-atem .rfb-polaroid .wp-block-button:not(.is-style-outline) .wp-block-button__link,
html.rfb-leinen .rfb-polaroid .wp-block-button:not(.is-style-outline) .wp-block-button__link,
html.rfb-rad .rfb-polaroid .wp-block-button:not(.is-style-outline) .wp-block-button__link {
  color: #F6F3EE !important;
}


/* ===============================================================
   Textfarben-Schutz auf immer hellen Flaechen (2026-08-30)
   ---------------------------------------------------------------
   Bis heute setzten die Welten nur den Grund, nicht die Schrift. Wo
   ein Composer keine Farbe mitgab, erbte der Text den Theme-Wert #111
   — auf dem dunklen Abend-Grund gemessene 1,33:1. Betroffen war JEDE
   Seite; auf /angebote/ waren Ueberschrift, Eyebrow und Zwischentitel
   praktisch unsichtbar. Das alte tools/kontrast-audit.py hat das nie
   gemeldet. Behoben, indem `body` jetzt `color: var(--rfb-text)` traegt.

   Kehrseite: Flaechen, die in JEDER Welt hell bleiben, bekaemen im
   Abend hellen Text auf Hell. Die Liste unten ist gemessen, nicht
   geraten (sieben Seiten, Flaechen mit Leuchtdichte > 0,6).
   Die Farbe steht am Container — die Vererbung traegt sie nach innen,
   deshalb braucht es hier keine Nachkommen-Selektoren.

   ⚠ Eine neue immer-helle Flaeche gehoert in diese Liste, sonst ist
     ihr Text im Abend unlesbar.
   =============================================================== */
html.rfb-abend [style*="background-color:#F5EFE0"],
html.rfb-abend [style*="background-color:#FAF6EA"],
html.rfb-abend [style*="background-color:#FAF6F1"],
html.rfb-abend [style*="background-color:#FBF8F4"],
html.rfb-abend [style*="background-color:#fff"],
html.rfb-abend [style*="background-color:#FFF"],
html.rfb-abend .rfb-wheel-panel,
html.rfb-abend .rfb-cal-panel,
html.rfb-abend .rfb-cal-chip,
html.rfb-abend .rfb-ev-card,
html.rfb-abend .rfb-ev-count,
/* Zebra-Tabellen: WordPress gibt jeder zweiten Zeile einen hellen Grund
   (#f0f0f0). Nur DIESE Zeilen, nicht `table tr` — deren Grund ist meist
   transparent, dann scheint der dunkle Body durch und dunkler Text wird
   unlesbar. Am 30.08. genau so ausprobiert und zurueckgenommen. */
html.rfb-abend .wp-block-table.is-style-stripes tbody tr:nth-child(odd) {
  color: #2B2B2B;
}


/* Atelier-Visuals oben in jeder Workshop/Festival-Archive-Karte —
   nur wenn KEIN Featured Image gesetzt ist (sonst rendert das Theme
   das echte Foto, das wir unten Atelier-konform stylen). */
body.post-type-archive-workshop .wp-block-post.workshop:not(.has-post-thumbnail)::before,
body.post-type-archive-festival .wp-block-post.festival:not(.has-post-thumbnail)::before {
  content: '';
  display: block;
  height: 96px;
  width: 96px;
  margin: 8px auto 20px;
  background-size: contain;
  background-repeat: no-repeat;
  background-position: center;
  opacity: 0.55;
  transition: opacity 0.3s ease, transform 0.3s ease;
}
body.post-type-archive-workshop .wp-block-post.workshop:not(.has-post-thumbnail):hover::before,
body.post-type-archive-festival .wp-block-post.festival:not(.has-post-thumbnail):hover::before {
  opacity: 0.85;
  transform: scale(1.05);
}

/* Featured Image in Archive-Karten — kompakt, Atelier-konform */
body.post-type-archive-workshop .wp-block-post .wp-block-post-featured-image,
body.post-type-archive-festival .wp-block-post .wp-block-post-featured-image {
  margin: -4px -4px 16px !important;
  border-radius: 2px;
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(43, 31, 20, 0.08);
  aspect-ratio: 3 / 2 !important;
}
body.post-type-archive-workshop .wp-block-post .wp-block-post-featured-image img,
body.post-type-archive-festival .wp-block-post .wp-block-post-featured-image img {
  display: block !important;
  width: 100% !important;
  height: 100% !important;
  object-fit: cover !important;
  transition: transform 0.4s ease;
}
body.post-type-archive-workshop .wp-block-post.workshop:hover .wp-block-post-featured-image img,
body.post-type-archive-festival .wp-block-post.festival:hover .wp-block-post-featured-image img {
  transform: scale(1.04);
}
/* Container in Archive-Karten ohne padding (das Group-Block-Default) */
body.post-type-archive-workshop .wp-block-post .wp-block-group,
body.post-type-archive-festival .wp-block-post .wp-block-group {
  padding: 0 !important;
}

/* Workshop-Visuals nach Post-ID */
body.post-type-archive-workshop .wp-block-post.post-144::before {
  background-image: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2060%2060%22%20fill%3D%22none%22%20stroke%3D%22%23B8754A%22%20stroke-width%3D%221.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%0A%20%20%3Cpath%20d%3D%22M30%2048c0-10-5-18-14-24%206%201%2011%205%2014%2012%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M30%2048c0-10%205-18%2014-24-6%201-11%205-14%2012%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M30%2048c-2-12-10-20-20-22%207-1%2014%202%2020%2010%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M30%2048c2-12%2010-20%2020-22-7-1-14%202-20%2010%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M30%2048c0-8-3-15-8-20%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M30%2048c0-8%203-15%208-20%22%2F%3E%0A%3C%2Fsvg%3E");
}
body.post-type-archive-workshop .wp-block-post.post-145::before {
  background-image: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2060%2060%22%20fill%3D%22none%22%20stroke%3D%22%23B8754A%22%20stroke-width%3D%221.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%0A%20%20%3Cpath%20d%3D%22M15%2040c-2-3-4-8-3-14%201-5%204-9%207-11m0%200c2%204%203%209%202%2014%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M45%2040c2-3%204-8%203-14-1-5-4-9-7-11m0%200c-2%204-3%209-2%2014%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M19%2015c3-2%207-3%2011-3s8%201%2011%203%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M12%2042c4%205%2010%209%2018%209s14-4%2018-9%22%2F%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%2234%22%20r%3D%222%22%20fill%3D%22%23B8754A%22%20stroke%3D%22none%22%2F%3E%0A%3C%2Fsvg%3E");
}
body.post-type-archive-workshop .wp-block-post.post-146::before {
  background-image: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2060%2060%22%20fill%3D%22none%22%20stroke%3D%22%23B8754A%22%20stroke-width%3D%221.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%0A%20%20%3Cpath%20d%3D%22M18%2012c-4%202-7%207-7%2013%200%204%201%207%203%2010%202%204%205%206%208%207%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M18%2012c1-1%203-2%205-2%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M14%2030c1-1%203-1%204%200%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M42%2012c4%202%207%207%207%2013%200%204-1%207-3%2010-2%204-5%206-8%207%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M42%2012c-1-1-3-2-5-2%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M46%2030c-1-1-3-1-4%200%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M26%2050c3%202%205%202%208%200%22%2F%3E%0A%3C%2Fsvg%3E");
}
body.post-type-archive-workshop .wp-block-post.post-175::before {
  background-image: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2040%2060%22%20fill%3D%22none%22%20stroke%3D%22%23B8754A%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%0A%20%20%3Cpath%20d%3D%22M20%2055c0-20%200-35%200-50%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M20%2015c-6-4-12-3-15%200%205%200%2010%202%2015%206%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M20%2025c6-4%2012-3%2015%200-5%200-10%202-15%206%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M20%2035c-6-4-10-3-12%200%204%200%208%202%2012%205%22%2F%3E%0A%20%20%3Cpath%20d%3D%22M20%2043c4-3%208-3%2010%200-3%200-7%202-10%204%22%2F%3E%0A%3C%2Fsvg%3E");
}

/* Festival-Visuals: Wave-Divider als Reise-Symbol */
body.post-type-archive-festival .wp-block-post.festival::before {
  background-image: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20800%2024%22%20fill%3D%22none%22%20stroke%3D%22%23B8754A%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%3E%0A%20%20%3Cpath%20d%3D%22M0%2012c50-8%20100%208%20150%200s100%208%20150%200%20100%208%20150%200%20100%208%20150%200%20100%208%20150%200%22%2F%3E%0A%3C%2Fsvg%3E");
}


/* Floating-CTA (Bottom-Right auf jeder Seite) */
.rfb-floating-cta{position:fixed;bottom:24px;right:24px;z-index:999;background:#96562F;color:#FAF6EA;padding:14px 24px;border-radius:999px;font-weight:600;font-size:0.85rem;letter-spacing:0.12em;text-transform:uppercase;text-decoration:none;box-shadow:0 4px 16px rgba(43,31,20,0.18);transition:background 0.2s,transform 0.2s}
.rfb-floating-cta:hover{background:#7E4A28;transform:translateY(-2px);color:#FAF6EA}
@media (max-width:600px){.rfb-floating-cta{bottom:16px;right:16px;padding:12px 18px;font-size:0.78rem;letter-spacing:0.08em}}
@media (prefers-reduced-motion:reduce){.rfb-floating-cta{transition:none}.rfb-floating-cta:hover{transform:none}}
