/*
Theme Name: JMS Yellow
Theme URI: https://jugendmusikschulen.de/
Author: Jugendmusikschule St. Georgen-Furtwangen
Description: Warmes, barrierearmes WordPress-Theme für die Jugendmusikschule.
Version: 0.36.0
Text Domain: jms-yellow
Tags: accessibility-ready
*/

/* Schriften, Farben und Schriftgroessen stehen in theme.json.
   Sie sind dadurch unter "Design > Editor > Stile" einstellbar. Wuerden sie
   hier zusaetzlich stehen, gewaenne bei gleicher Spezifitaet die spaeter
   geladene Regel -- und die Einstellung in der Oberflaeche bliebe folgenlos. */

:root {
  --jms-yellow: var(--wp--preset--color--jms-yellow, #ffcd13);
  --jms-yellow-dark: var(--wp--preset--color--jms-yellow-dark, #b58d00);
  --jms-yellow-soft: var(--wp--preset--color--jms-yellow-soft, #f7f3e8);
  --jms-ink: var(--wp--preset--color--jms-ink, #13263a);
  --jms-blue: var(--wp--preset--color--jms-blue, #173f62);
  --jms-cream: var(--wp--preset--color--jms-cream, #faf8f1);
  --jms-white: var(--wp--preset--color--jms-white, #ffffff);
  --jms-green: var(--wp--preset--color--jms-green, #244a3d);
  --jms-footer: var(--wp--preset--color--jms-footer, #102f49);
  --jms-red: var(--wp--preset--color--jms-red, #a62f37);
  --jms-border: var(--wp--preset--color--jms-border, #ddd3b8);
  --jms-shadow: 0 12px 34px rgba(19, 38, 58, 0.08);
  --jms-radius: 6px;
  --jms-content: 1220px;
  /* Hoehe des klebenden Kopfbereichs plus Platz fuer den Fokusrahmen.
     Gemessen: 97px bei 1440px Breite. Darunter stehen alle Abstaende, die
     verhindern, dass etwas hinter dem Kopf landet. */
  --jms-kopf-hoehe: 104px;
}

* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
  margin: 0;
}
img { max-width: 100%; height: auto; }
a { text-underline-offset: 0.17em; }
a:hover { color: var(--jms-ink); }
a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible {
  /* Zweifarbig, weil ein einfarbiger Ring ueber einem Foto nicht zu retten
     ist: Jede Farbe trifft irgendwo auf eine gleich helle Bildstelle. Blau
     lag in der Fusszeile bei 1,26:1 und auf den Hero-Knoepfen zwischen 1,00
     und 4,04, je nach Bildausschnitt. Gelb und Tinte stehen mit 10,24:1
     zueinander -- unabhaengig davon, was darunter liegt. */
  outline: 3px solid var(--jms-yellow);
  outline-offset: 2px;
  box-shadow: 0 0 0 6px var(--jms-ink);
}
h1, h2, h3, h4 {
  text-wrap: balance;
}
h1 { letter-spacing: -0.03em; }
h2 { letter-spacing: -0.02em; }
h3 { letter-spacing: -0.01em; }
p { max-width: 72ch; }
.screen-reader-text {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.screen-reader-text:focus {
  top: 10px;
  left: 10px;
  z-index: 9999;
  width: auto;
  height: auto;
  padding: 12px 18px;
  clip: auto;
  background: var(--jms-white);
}
.jms-container { width: min(calc(100% - 36px), var(--jms-content)); margin-inline: auto; }
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  background: rgba(255, 255, 255, 0.97);
  border-bottom: 1px solid var(--jms-border);
  backdrop-filter: blur(14px);
}
.jms-header-inner {
  min-height: 96px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 28px;
}
.jms-brand { display: inline-flex; align-items: center; gap: 14px; color: var(--jms-ink); text-decoration: none; font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-weight: 700; line-height: 1.15; }
.jms-brand-mark {
  width: 212px;
  /* Seitenverhaeltnis der Wortmarke; object-fit haelt ein abweichendes
     Custom-Logo unverzerrt in derselben Flaeche. */
  aspect-ratio: 2400 / 724;
  display: grid;
  place-items: center;
  flex: 0 0 auto;
}
.jms-brand-mark img { display: block; width: 100%; height: 100%; object-fit: contain; }
.jms-main-nav ul, .jms-language-nav { display: flex; align-items: center; gap: 22px; list-style: none; padding: 0; margin: 0; }
/* 12px statt 22px in der obersten Ebene: Die Zeile war ueberfuellt, und was
   ueberfuellt ist, wird von Flexbox gestaucht -- siehe die Regel darunter. */
.jms-main-nav > ul { gap: 12px; }
.jms-main-nav li { position: relative; }
/* Der Punkt und sein Pfeilchen stehen **nebeneinander**, und der Punkt wird
   nicht gestaucht.

   Gemessen am 9. September 2026: Die Menuezeile wollte 770px und bekam 701.
   Flexbox verteilte den Mangel auf die Punkte -- die drei mit Pfeil verloren
   genau die 23px des Pfeils, der daraufhin in eine zweite Zeile rutschte. Weil
   die Zeile ihre Punkte mittig ausrichtet, sassen "Unterricht",
   "Musikschule" und "Service" dadurch 19px hoeher als ihre Nachbarn: der
   Zickzack, den der Nutzer gemeldet hat.

   `flex: 0 0 auto` verbietet das Stauchen, `display: flex` haelt Pfeil und
   Beschriftung in einer Zeile. Damit die Zeile trotzdem passt, beginnt das
   Klappmenue frueher -- siehe die Mediengrenze weiter unten. */
.jms-main-nav > ul > li { display: flex; align-items: center; flex: 0 0 auto; }
.jms-main-nav a { color: var(--jms-ink); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.82rem; font-weight: 600; text-decoration: none; }
/* Kein Umbruch mitten in einem Menuepunkt der obersten Ebene: Ein
   zweizeiliger Punkt ist hoeher als seine Nachbarn, und weil die Zeile ihre
   Punkte mittig ausrichtet, verrutschen dadurch alle. Gemessen am
   9. September 2026: "Chöre, Ensembles & Orchester" war 56px hoch, die
   Nachbarn 28px. Die Unterpunkte im Klappmenue duerfen weiter umbrechen --
   dort steht jeder Punkt in eigener Zeile. */
.jms-main-nav > ul > li > a { white-space: nowrap; }
.jms-main-nav a:hover { text-decoration: underline; text-decoration-thickness: 3px; text-decoration-color: var(--jms-yellow-dark); }
.jms-main-nav .jms-menu-cta a { display: inline-flex; min-height: 40px; padding: 8px 14px; align-items: center; border: 1px solid var(--jms-ink); background: var(--jms-yellow); text-decoration: none; }
.jms-main-nav .jms-menu-cta a:hover { background: var(--jms-ink); color: var(--jms-white); }
.jms-submenu-toggle { display: inline-flex; margin-left: 2px; padding: 4px 2px; border: 0; background: transparent; color: var(--jms-ink); font: inherit; line-height: 1; cursor: pointer; }
/* WCAG 2.5.8 verlangt 24 x 24 Pixel. Gemessen war der Pfeil 13,64 x 24 px.
   Der sichtbare Pfeil bleibt, wie er ist -- nur die Trefferflaeche waechst
   nach rechts in den 12 px breiten Abstand zum naechsten Menuepunkt hinein.
   Nach links waechst sie bewusst nicht: dort liegt der Elternlink, der
   anklickbar bleiben muss. Nachgemessen: Trefferflaeche 24,64 x 24 px, die
   sichtbare Breite unveraendert 13,64 px. */
.jms-submenu-toggle { position: relative; }
.jms-submenu-toggle::before { content: ""; position: absolute; inset: 0 -10.36px 0 0; }
.jms-main-nav .sub-menu { position: absolute; z-index: 120; top: calc(100% + 18px); left: -18px; display: none; min-width: 280px; padding: 10px; border: 1px solid var(--jms-border); background: var(--jms-white); box-shadow: var(--jms-shadow); }
.jms-main-nav .sub-menu::before { content: ""; position: absolute; inset: -19px 0 auto; height: 19px; }
.jms-main-nav .sub-menu li { width: 100%; }
.jms-main-nav .sub-menu a { display: block; padding: 11px 12px; line-height: 1.35; }
.jms-main-nav .menu-item-has-children:hover > .sub-menu, .jms-main-nav .menu-item-has-children:focus-within > .sub-menu, .jms-main-nav .menu-item-has-children.is-submenu-open > .sub-menu { display: block; }
.jms-language-nav { gap: 6px; }
.jms-language-nav a {
  display: inline-flex;
  min-width: 38px;
  min-height: 38px;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--jms-border);
  border-radius: 3px;
  color: var(--jms-ink);
  font-size: 0.75rem;
  font-weight: 800;
  text-decoration: none;
  background: var(--jms-white);
}
.jms-language-nav a:hover { background: var(--jms-yellow); border-color: var(--jms-yellow-dark); }
/* Polylang liefert die Sprachkürzel klein; die Gestaltung sieht Versalien vor. */
.jms-language-nav a:not(.jms-easy-switch) { text-transform: uppercase; }
/* Ausgeschriebener Wechsel in die Leichte Sprache: breiter als die
   quadratischen Sprachkürzel und ohne Grossbuchstaben-Sperrung. */
.jms-language-nav a.jms-easy-switch { min-width: 0; padding-inline: 12px; font-size: 0.78rem; font-weight: 700; white-space: nowrap; }
.jms-menu-toggle { display: none; border: 1px solid var(--jms-ink); border-radius: 3px; padding: 10px 14px; background: var(--jms-yellow); color: var(--jms-ink); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-weight: 700; }
.jms-hero { position: relative; overflow: hidden; padding: clamp(58px, 7vw, 92px) 0 clamp(65px, 8vw, 105px); background: linear-gradient(90deg, var(--jms-yellow) 0 9px, var(--jms-cream) 9px 100%); border-bottom: 1px solid var(--jms-border); }
.jms-hero::before, .jms-hero::after { display: none; }
.jms-hero-grid { display: grid; grid-template-columns: minmax(300px, 0.8fr) minmax(480px, 1.2fr); align-items: center; gap: clamp(42px, 6vw, 86px); }
.jms-eyebrow, .jms-card-kicker { margin: 0 0 11px; color: var(--jms-blue); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.68rem; font-weight: 700; letter-spacing: 0.11em; text-transform: uppercase; }
.jms-hero h1 { max-width: 700px; margin: 0 0 23px; font-size: clamp(2.05rem, 3.1vw, 2.8rem); }
.jms-highlight { position: relative; white-space: nowrap; }
.jms-highlight::after { content: ""; position: absolute; left: 0; right: 0; bottom: -0.06em; height: 0.12em; background: var(--jms-yellow); z-index: -1; }
.jms-hero-copy { font-size: clamp(1rem, 1.5vw, 1.17rem); }
.jms-actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 30px; }
.wp-element-button, .jms-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 50px;
  padding: 12px 21px;
  border: 1px solid var(--jms-ink);
  border-radius: 3px;
  background: var(--jms-yellow);
  color: var(--jms-ink);
  font-family: "Montserrat JMS", Montserrat, Arial, sans-serif;
  font-weight: 700;
  text-decoration: none;
  cursor: pointer;
  box-shadow: none;
  transition: background-color 160ms ease, color 160ms ease;
}
.wp-element-button:hover, .jms-button:hover { background: var(--jms-ink); color: var(--jms-white); }
/* Die helle Zweitvariante braucht einen eigenen Hover.
   Ohne ihn gewann .jms-button.secondary (gleiche Spezifitaet, spaeter notiert)
   beim Hover den weissen Hintergrund, waehrend die Schrift aus der
   :hover-Regel weiss blieb -- der Knopf wurde beim Ueberfahren unsichtbar.
   Deshalb hier beide Eigenschaften gemeinsam setzen und die Schrift dunkel
   halten: #13263a auf #ffcd13 ergibt 10,4:1. */
.jms-button.secondary { background: var(--jms-white); color: var(--jms-ink); }
.wp-element-button.secondary:hover, .jms-button.secondary:hover { background: var(--jms-yellow); color: var(--jms-ink); }
.jms-hero-slider { position: relative; min-width: 0; }
.jms-hero-slides { position: relative; }
.jms-hero-media { position: absolute; inset: 0; margin: 0; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 550ms ease; }
.jms-hero-media.is-active { position: relative; opacity: 1; visibility: visible; pointer-events: auto; }
.jms-hero-media::before { content: ""; position: absolute; z-index: 1; inset: -10px auto 18px -10px; width: 10px; background: var(--jms-yellow); }
.jms-hero-media img { display: block; width: 100%; min-height: 390px; max-height: 510px; object-fit: cover; border-radius: var(--jms-radius); box-shadow: var(--jms-shadow); }
.jms-hero-media figcaption { position: absolute; z-index: 2; bottom: 12px; left: 12px; max-width: 55%; padding: 6px 9px; background: rgba(36, 74, 61, 0.88); color: var(--jms-white); font-size: 0.65rem; line-height: 1.4; }
.jms-hero-building img { object-position: center 72%; filter: brightness(1.08) saturate(0.9) contrast(0.96); }
/* Hero ueber die volle Fensterbreite.
   Der Text liegt als Overlay auf dem Bild. Damit er lesbar bleibt, liegt ein
   Verlauf darunter, dessen Staerke im Block einstellbar ist: helle Fotos
   brauchen mehr, dunkle weniger. Ohne diesen Verlauf ist Text auf Fotos je
   nach Bildstelle mal lesbar und mal nicht -- und damit nicht barrierefrei. */
.jms-hero-wide { position: relative; overflow: hidden; background: var(--jms-ink); }
.jms-hero-wide .jms-hero-slider { position: relative; }
.jms-hero-wide .jms-hero-slides { position: relative; height: 100%; }
.jms-hero-wide .jms-hero-media { position: absolute; inset: 0; margin: 0; }
.jms-hero-wide .jms-hero-media::before { display: none; }
.jms-hero-wide .jms-hero-media img { width: 100%; height: 100%; min-height: 0; max-height: none; object-fit: cover; border-radius: 0; box-shadow: none; }
.jms-hero-wide .jms-hero-media figcaption { position: absolute; z-index: 3; right: 12px; bottom: 12px; left: auto; max-width: 42%; }
.jms-hero-wide--klein .jms-hero-slider { height: clamp(260px, 34vh, 360px); }
.jms-hero-wide--mittel .jms-hero-slider { height: clamp(340px, 48vh, 500px); }
.jms-hero-wide--gross .jms-hero-slider { height: clamp(420px, 64vh, 660px); }
/* Der Verlauf beginnt bei mindestens 0,7 und haelt den Wert bis 44 % der
   Breite, statt sofort abzufallen. Vorher stand die gelbe Vorzeile im
   schlechtesten Fall bei Median 4,30:1 mit 84 % der Glyphenflaeche unter der
   Schwelle. Nicht die Form des Verlaufs war das Problem, sondern die Staerke:
   ein gleichmaessiger Verlauf bei 0,55 laesst immer noch 43 % darunter.
   Nachher ist der kleinste Wert 4,84:1 ueber alle Breiten und alle Bilder. */
.jms-hero-wide .jms-hero-media::after { content: ""; position: absolute; z-index: 2; inset: 0; background: linear-gradient(90deg, rgba(21, 32, 28, max(var(--jms-hero-scrim, 0.55), 0.75)) 0%, rgba(21, 32, 28, max(var(--jms-hero-scrim, 0.55), 0.75)) 44%, rgba(21, 32, 28, calc(max(var(--jms-hero-scrim, 0.55), 0.75) * 0.55)) 76%, rgba(21, 32, 28, calc(max(var(--jms-hero-scrim, 0.55), 0.75) * 0.2)) 100%); }
.jms-hero-wide-overlay--right .jms-hero-media::after, .jms-hero-wide--right .jms-hero-media::after { background: linear-gradient(270deg, rgba(21, 32, 28, var(--jms-hero-scrim, 0.55)) 0%, rgba(21, 32, 28, calc(var(--jms-hero-scrim, 0.55) * 0.2)) 100%); }
.jms-hero-wide-overlay { position: absolute; z-index: 4; inset: 0; display: flex; align-items: center; pointer-events: none; }
.jms-hero-wide-overlay .jms-container { width: min(calc(100% - 36px), var(--jms-content)); }
.jms-hero-wide-copy { max-width: 620px; color: var(--jms-white); pointer-events: auto; }
.jms-hero-wide-overlay--center .jms-hero-wide-copy { margin-inline: auto; text-align: center; }
.jms-hero-wide-overlay--right .jms-hero-wide-copy { margin-left: auto; }
.jms-hero-wide-copy h1, .jms-hero-wide-copy h2 { margin: 0 0 18px; color: var(--jms-white); }
.jms-hero-wide-copy .jms-eyebrow { color: var(--jms-yellow); }
.jms-hero-wide-copy .jms-hero-copy { color: var(--jms-white); }
/* Zweitknopf in der Vollbreiten-Hero.
   Hier stand zuvor nur eine Umfaerbung der Schrift auf Weiss -- der weisse
   Hintergrund aus der Grundregel blieb stehen, also weisse Schrift auf weissem
   Grund. Der Knopf war unlesbar, bis man mit der Maus darueberfuhr.
   Jetzt vollstaendig eigen definiert: dunkle, weitgehend deckende Flaeche mit
   weissem Rand. Das Foto scheint nur schwach durch, damit der Kontrast nicht
   vom jeweiligen Bildausschnitt abhaengt -- Weiss auf #15201c ergibt 15,7:1,
   selbst mit 22 Prozent durchscheinendem Foto bleibt es weit ueber der
   Anforderung. */
.jms-hero-wide-copy .jms-button.secondary { border-color: var(--jms-white); background: rgba(21, 32, 28, 0.78); color: var(--jms-white); }
.jms-hero-wide-copy .jms-button.secondary:hover,
.jms-hero-wide-copy .jms-button.secondary:focus-visible { background: var(--jms-yellow); color: var(--jms-ink); border-color: var(--jms-ink); }
.jms-hero-wide .jms-hero-slider-controls { z-index: 5; }

/* Die Handlungsaufforderung ist eine Station wie ein Bild und liegt deshalb
   im selben Durchlauf. Ohne Bild steht sie auf gelbem Grund. */
.jms-hero-cta { display: flex; align-items: center; justify-content: center; background: var(--jms-yellow); }
.jms-hero-cta-body { position: relative; z-index: 4; display: flex; flex-direction: column; align-items: center; gap: 14px; max-width: 520px; padding: 24px; text-align: center; }
.jms-hero-cta-text { margin: 0; font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: clamp(1.05rem, 1.9vw, 1.5rem); font-weight: 700; line-height: 1.3; }
.jms-hero-cta img + .jms-hero-cta-body { color: var(--jms-white); }
.jms-hero-cta img ~ .jms-hero-cta-body::before { content: ""; position: absolute; z-index: -1; inset: -18px -24px; background: rgba(21, 32, 28, 0.62); }

/* `opacity` auf der Gruppe bleichte die Glyphen mit, nicht nur den
   Untergrund: gemessen Median 3,93-3,98:1 bei 86-90 % der Flaeche unter 4,5.
   Eine dichtere Flaeche allein tut das nicht und laesst das Foto weiter
   durchscheinen. Nachher 11,50-12,09:1. Das hebt zugleich den Rand der
   Laufpunkte von 3,52 auf rund 10,5:1 -- ihre weisse Fuellung allein traegt
   nur 1,75:1. */
.jms-hero-slider-controls { position: absolute; z-index: 3; right: 12px; bottom: 12px; display: flex; min-height: 0; padding: 3px; align-items: center; gap: 3px; border: 0; background: rgba(250, 248, 241, 0.86); backdrop-filter: blur(8px); opacity: 1; transition: background-color 160ms ease; }
.jms-hero-slider-controls:hover, .jms-hero-slider-controls:focus-within { opacity: 1; }
.jms-hero-slider-controls > button { min-width: 27px; height: 27px; padding: 0 5px; border: 0; border-radius: 1px; background: transparent; color: var(--jms-ink); font: 700 0.7rem/1 "Montserrat JMS", Montserrat, Arial, sans-serif; cursor: pointer; }
.jms-hero-slider-controls > button:hover { background: var(--jms-cream); opacity: 1; }
.jms-hero-slider-controls .jms-hero-pause { width: 28px; margin-left: 2px; }
.jms-hero-pause span { font-size: 0; }
.jms-hero-pause::before { content: "Ⅱ"; font-size: 0.7rem; }
.jms-hero-pause[aria-pressed="true"]::before { content: "▶"; }
/* Der einzige Punkt von B3, bei dem sich das Aussehen aendern muss: Zwei
   8-px-Ziele mit 13 px Mittenabstand koennen 2.5.8 nicht erfuellen, egal wie
   man die Trefferflaeche legt -- die 24-px-Kreise benachbarter Punkte
   schneiden sich zwangslaeufig. Der Knopf wird deshalb 24 x 24 px; der
   sichtbare Punkt bleibt 8 px und wird als ::before gezeichnet. */
.jms-hero-dots { display: inline-flex; gap: 0; padding-inline: 2px; }
.jms-hero-dots button { display: inline-flex; width: 24px; height: 24px; padding: 0; align-items: center; justify-content: center; border: 0; border-radius: 0; background: transparent; cursor: pointer; }
.jms-hero-dots button::before { content: ""; width: 8px; height: 8px; border: 1px solid var(--jms-ink); border-radius: 50%; background: var(--jms-white); }
.jms-hero-dots button.is-active::before { background: var(--jms-ink); }
.jms-quick-section { padding: 46px 0 52px; border-bottom: 1px solid var(--jms-border); background: var(--jms-white); }
.jms-quick-section h2 { margin: 0 0 25px; font-size: clamp(1.45rem, 2.2vw, 2rem); }
/* Der Schnelleinstieg zaehlt seine Kacheln nicht. `repeat(4, ...)` stimmte
   solange es vier waren; mit der fuenften (Preise & Bedingungen) haette die
   letzte allein in einer zweiten Zeile gestanden. `auto-fit` mit Mindestbreite
   verteilt, was da ist -- fuenf oder sechs in einer Zeile. Bei sieben Kacheln
   waere wieder eine allein; dann gehoert die Mindestbreite gesenkt.

   Die Mindestbreite ist 170px und nicht 196px, weil 196px bei 1220px Breite
   genau fuenf Spuren ergibt: Eine sechste Kachel stuende sofort allein. */
.jms-quick-nav { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 14px; }
/* Auf der Blockseite steckt der Abschnitt in einem `is-layout-constrained`,
   das seine Kinder bei 840px (contentSize) abschneidet -- die Kacheln waren
   dort nur 200px breit und die fuenfte stand allein darunter. Die
   Rueckfallvorlage setzt denselben Abschnitt in `.jms-container` und damit auf
   1220px. Dieselbe Sektion war je nach Vorlage verschieden breit; hier wird
   die Blockseite der Vorlage nachgezogen. Aufgezaehlt statt `> *`: Ein Absatz,
   den das Buero dazuschreibt, soll seine lesbare Zeilenlaenge behalten. */
.jms-quick-section > .jms-eyebrow,
.jms-quick-section > h2,
.jms-quick-section > .jms-quick-nav { max-width: var(--jms-content); }
/* Nur die Rueckfallvorlage: Dort ist die Kachel selbst der Verweis (<nav> mit
   <a> darin). Auf der Blockseite steckt der Verweis *in* der Kachel -- ohne das
   `nav` davor traf diese Regel ihn mit und zeichnete eine zweite Kachel in die
   erste. Genau das war der doppelte Rahmen. */
nav.jms-quick-nav a { display: flex; min-height: 86px; padding: 16px 18px; flex-direction: column; justify-content: center; border: 1px solid var(--jms-border); border-top: 2px solid var(--jms-yellow-dark); background: var(--jms-white); color: var(--jms-ink); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; text-decoration: none; }
/* Der Schnelleinstieg als Kernbloecke.
   Jede Kachel ist eine Gruppe mit zwei Absaetzen und damit im Editor normal
   bearbeitbar. Die Regeln unten geben ihr dasselbe Aussehen wie der frueher
   fest eingebauten Verweisliste. */
/* Als Blockseite ist die Kachel ein Absatz und kein Verweis mehr -- anklickbar
   waere nur der Text. Die Flaeche des Verweises wird deshalb ueber die ganze
   Kachel gezogen, wie in der Fassung davor. */
.jms-quick-nav > .jms-quick-title { position: relative; display: flex; min-height: 86px; max-width: none; margin: 0; padding: 16px 18px; flex-direction: column; justify-content: center; border: 1px solid var(--jms-border); border-top: 2px solid var(--jms-yellow-dark); background: var(--jms-white); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 1rem; font-weight: 700; }
.jms-quick-nav > .jms-quick-title:hover { border-color: var(--jms-ink); }
.jms-quick-nav .jms-quick-title a { color: var(--jms-ink); text-decoration: none; }
.jms-quick-nav .jms-quick-title a::after { content: ""; position: absolute; inset: 0; }
.jms-quick-nav .jms-quick-title a:hover { text-decoration: underline; text-decoration-color: var(--jms-yellow-dark); }
/* Auch ohne die Klasse "jms-button" soll ein Verweis im Abschnittskopf wie der
   gewohnte Textlink aussehen. Beim Bearbeiten geht eine Klasse leicht
   verloren; das Aussehen darf davon nicht abhaengen. */
.jms-section-header p > a { padding: 5px 0; border-bottom: 1px solid currentColor; color: inherit; font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.78rem; font-weight: 700; text-decoration: none; }
.jms-section-header p > a:hover { color: var(--jms-blue); }
.jms-section-header > .wp-block-group { margin: 0; }
.jms-section.dark .jms-section-header p > a { color: var(--jms-white); }

nav.jms-quick-nav a:hover { border-color: var(--jms-ink); background: var(--jms-white); }
nav.jms-quick-nav strong { font-size: 1rem; }
.jms-section { padding: clamp(72px, 8vw, 108px) 0; }
.jms-section.yellow { background: var(--jms-yellow-soft); border-block: 1px solid var(--jms-border); }
.jms-section.dark { background: var(--jms-footer); color: var(--jms-white); }
.jms-section.dark h2, .jms-section.dark h3, .jms-section.dark a { color: var(--jms-white); }
/* Die Vorzeile stand nicht in der Zeile darueber: Blau auf Dunkelblau ergab
   1,26:1 -- der schlechteste Textwert der ganzen Website, praktisch
   unsichtbar. Gelb und nicht Weiss, weil die Vorzeile im Hero ueber dem Foto
   ebenfalls gelb ist; derselbe Akzent an derselben Stelle. Gemessen 8,89:1.
   Der Selektor ist bewusst eng: Die Terminkarten im selben Abschnitt stehen
   auf WEISSEM Grund (Zeile unten faerbt sie eigens zurueck), und Gelb auf
   Weiss waere 1,7:1 -- schlechter als der Fehler, den wir beheben. */
.jms-section.dark > .jms-eyebrow,
.jms-section.dark .jms-section-header .jms-eyebrow { color: var(--jms-yellow); }
/* Ausnahme: Die Terminkarten stehen auf weissem Grund, auch wenn der Abschnitt
   dunkel ist. Ohne diese Regel faerbt die Zeile darueber ihre Ueberschriften
   weiss -- weisse Schrift auf weisser Karte, der Titel war schlicht unsichtbar.
   Aufgefallen ist das erst, als der Kalender die ersten Termine bekam. */
.jms-section.dark .jms-event, .jms-section.dark .jms-event h3,
.jms-section.dark .jms-event h3 a, .jms-section.dark .jms-event time { color: var(--jms-ink); }
.jms-section.dark .jms-event h3 a { text-decoration-color: var(--jms-yellow-dark); }
.jms-section.dark .jms-event h3 a:hover { color: var(--jms-blue); }
.jms-section-header { display: flex; justify-content: space-between; align-items: end; gap: 30px; margin-bottom: 34px; }
.jms-section-header h2 { margin: 0; max-width: 760px; }
.jms-section-header .jms-button { min-height: 0; padding: 5px 0; border: 0; border-bottom: 1px solid currentColor; background: transparent; font-size: 0.78rem; }
.jms-section-header .jms-button:hover { background: transparent; color: var(--jms-blue); }
/* Wechselnde Faecherauswahl.
   Ausgeblendete Karten sind vollstaendig aus dem Fluss genommen -- sonst
   hinterliesse jede eine Luecke im Raster. */
.jms-subject-rotator .jms-card.is-hidden, .jms-subject-rotator .jms-card[hidden] { display: none; }
.jms-subject-rotator-controls { margin: 18px 0 0; text-align: right; }
.jms-subject-rotator-controls[hidden] { display: none; }
.jms-subject-pause { padding: 5px 0; border: 0; border-bottom: 1px solid currentColor; background: transparent; color: var(--jms-blue); font: 700 0.74rem/1.4 "Montserrat JMS", Montserrat, Arial, sans-serif; cursor: pointer; }
.jms-subject-pause:hover { color: var(--jms-ink); }

.jms-card-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 22px; }
/* Die Wege zur Musik. Sechs Karten gehen im Dreier-Raster glatt auf, deshalb
   braucht das Raster hier keine eigene Spaltenzahl -- nur einen Namen, damit
   der Aufbau die Seite wiedererkennt. Die Klasse `--vier` von gestern ist
   entfallen: Vier Karten waren ein Zwischenstand. */
.jms-card-grid.jms-wege { align-items: start; }
/* Die drei Kacheln oben auf der Unterrichtsseite springen zu einem Abschnitt
   derselben Seite und nicht auf eine andere. Der Pfeil sagt das, bevor jemand
   klickt -- ein Verweis, der die Seite nicht wechselt, ist sonst nicht von
   einem zu unterscheiden, der es tut. */
/* Der Titel einer Sprungkachel ist ein Absatz und keine Ueberschrift (der
   Grund steht in build_lessons_page()), sieht aber aus wie einer. Und die
   ganze Kachel ist anklickbar -- dieselbe Loesung wie im Schnelleinstieg der
   Startseite: eine Flaeche ueber die Kachel, gezogen vom Verweis selbst. */
.jms-wege--sprung .jms-card { position: relative; }
.jms-wege--sprung .jms-card-title { margin: 0 0 14px; font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 1.3rem; font-weight: 700; line-height: 1.25; }
.jms-wege--sprung .jms-card-title a { color: var(--jms-ink); text-decoration: none; }
.jms-wege--sprung .jms-card-title a::after { content: ""; position: absolute; inset: 0; }
.jms-wege--sprung .jms-card:hover { border-color: var(--jms-ink); }
.jms-wege--sprung .jms-card:hover .jms-card-title a { text-decoration: underline; text-decoration-color: var(--jms-yellow-dark); }
/* Der Pfeil sagt vor dem Klick, dass die Seite nicht wechselt. */
.jms-wege--sprung .jms-card-title a::before { content: "↓ "; color: var(--jms-yellow-dark); font-weight: 400; }
.jms-wege .jms-card h3 { font-size: 1.2rem; }
/* Der Kopf der Website klebt oben (position: sticky). Ohne diesen Abstand
   springt der Anker die Ueberschrift genau unter den Kopf, und der Leser
   landet mitten im Text eines Abschnitts, dessen Titel er nie gesehen hat. */
.jms-content h2[id], .jms-content h3[id] { scroll-margin-top: var(--jms-kopf-hoehe); }
/* Derselbe Abstand fuer alles Fokussierbare. Bis zum 19. Oktober 2026 galt er
   nur fuer Sprungmarken auf Ueberschriften. Gemessen beim Rueckwaerts-Tabben
   (Umschalt+Tab, 40 Schritte): 6 Bedienelemente landeten bei 1440px
   vollstaendig hinter dem Kopfbereich, 8 bei 390px. Das ist WCAG 2.4.11,
   neu in 2.2. */
a, button, input, select, textarea, summary,
[tabindex]:not([tabindex="-1"]) { scroll-margin-top: var(--jms-kopf-hoehe); }
.jms-card {
  position: relative;
  min-height: 178px;
  padding: 24px;
  border: 1px solid var(--jms-border);
  border-radius: var(--jms-radius);
  background: var(--jms-white);
  box-shadow: none;
}
.jms-card h3 { margin: 0 0 14px; }
.jms-card h2 { margin: 0 0 14px; font-size: 1.3rem; }
.jms-card h3 a { color: var(--jms-ink); text-decoration-color: var(--jms-yellow-dark); }
.jms-card p:last-child { margin-bottom: 0; }
.jms-subject-card.has-image { min-height: 0; padding: 0; overflow: hidden; }
.jms-subject-image { display: block; overflow: hidden; }
.jms-subject-image img { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; object-position: center top; transition: transform 300ms ease; }
.jms-subject-card:hover .jms-subject-image img { transform: scale(1.025); }

/* Angebote der fruehen Bildung. Sie teilen sich das Kachelbild mit den
   Faechern -- gleiche Aufgabe, gleiche Form. Eigene Klassen bekommen sie
   trotzdem: Die Fachkachel zeigt eine Zahl ("3 Lehrkräfte"), die Angebotskachel
   eine Aufzaehlung, und die beiden sollen sich getrennt aendern lassen. */
.jms-offer-card.has-image { min-height: 0; padding: 0; overflow: hidden; }
.jms-offer-image { display: block; overflow: hidden; }
.jms-offer-image img { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; object-position: center top; transition: transform 300ms ease; }
.jms-offer-card:hover .jms-offer-image img { transform: scale(1.025); }
.jms-offer-copy { padding: 22px 24px 24px; }
.jms-offer-facts { margin: 0 0 12px; padding: 0; list-style: none; }
.jms-offer-facts li { position: relative; margin-bottom: 5px; padding-left: 20px; font-size: 0.88rem; }
.jms-offer-facts li::before { content: ""; position: absolute; top: 0.5em; left: 0; width: 8px; height: 8px; border-radius: 50%; background: var(--jms-yellow-dark); }
.jms-offer-facts--single { margin: 0 0 30px; }
.jms-offer-facts--single li { font-size: 1rem; }
.jms-offer-places { margin: 0; color: var(--jms-blue); font-size: 0.82rem; }

/* Der Stundenplan. Eine Tabelle je Standort -- verbundene Zellen liessen sich
   auf einem schmalen Bildschirm nicht mehr zuordnen. Unter 700px klappt jede
   Zeile zu einem Block auf; die Spaltennamen stehen dann als data-label davor,
   sonst wuesste niemand mehr, was "Freitag Vormittag" beschreibt. */
/* Die Gesamtuebersicht aller Proben auf der Seite "Chöre, Ensembles &
   Orchester". Je Ensemble ein Block; der Abstand trennt sie, nicht eine
   Linie -- bei sechs Bloecken untereinander waeren sechs Linien mehr Raster
   als Inhalt. */
.jms-ensemble-schedule { margin: 0 0 40px; }
.jms-ensemble-schedule-block { margin: 0 0 28px; }
.jms-ensemble-schedule-block > :is(h2, h3, h4) { margin: 0 0 8px; }
.jms-ensemble-schedule-block .jms-ensemble-rehearsals { margin-bottom: 8px; }
.jms-ensemble-date { margin: 0 0 6px; font-size: 0.92rem; }
.jms-ensemble-rehearsals { margin: 0 0 34px; padding: 0; list-style: none; }
.jms-ensemble-rehearsals li { position: relative; margin-bottom: 8px; padding-left: 20px; }
.jms-ensemble-rehearsals li::before { content: ""; position: absolute; top: 0.55em; left: 0; width: 8px; height: 8px; border-radius: 50%; background: #6b3fa0; }
.jms-ensemble-place { color: var(--jms-blue); font-size: 0.9rem; }
.jms-ensemble-dates { width: 100%; margin: 0 0 40px; border-collapse: collapse; border-top: 1px solid var(--jms-border); }
.jms-ensemble-dates th, .jms-ensemble-dates td { padding: 12px 20px 12px 0; border-bottom: 1px solid var(--jms-border); font-size: 0.94rem; text-align: left; vertical-align: top; }
.jms-ensemble-dates thead th { font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.74rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; }
.jms-ensemble-dates tbody th { font-weight: 700; }
.jms-ensemble-dates td:last-child, .jms-ensemble-dates th:last-child { padding-right: 0; }

.jms-offer-schedule-view { margin: 26px 0 46px; }
/* Hier stand bis zum 21. September 2026 `.jms-offer-schedule-lead`: ein Satz
   ueber jeder Tabelle, der deren Angaben Wort fuer Wort wiederholte. Gedacht
   war er als zitierbare Fassung fuer Sprachmodelle; beim Lesen war er
   schlicht derselbe Inhalt zweimal. Der Satz steht jetzt nur noch in den
   strukturierten Daten der Seite (JSON-LD, `CourseInstance.description`). */
.jms-offer-schedule-table { width: 100%; margin: 0 0 34px; border-collapse: collapse; border-top: 1px solid var(--jms-border); }
.jms-offer-schedule-table caption { padding: 0 0 10px; color: var(--jms-blue); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.78rem; font-weight: 700; letter-spacing: 0.08em; text-align: left; text-transform: uppercase; }
.jms-offer-schedule-table th, .jms-offer-schedule-table td { padding: 12px 20px 12px 0; border-bottom: 1px solid var(--jms-border); font-size: 0.9rem; text-align: left; vertical-align: top; }
.jms-offer-schedule-table thead th { font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.74rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; }
.jms-offer-schedule-table tbody th { font-weight: 700; }
.jms-offer-schedule-table td:last-child, .jms-offer-schedule-table th:last-child { padding-right: 0; }

/* Die Entgelttabelle. Vier Abschnitte, alle aus data/entgelte.json. Die
   Hauptfaechertabelle hat fuenf Spalten und ist damit die breiteste Tabelle
   der Website -- ihre Betraege duerfen nicht umbrechen, sonst liest man
   "34,00" in einer und "€" in der naechsten Zeile. Unter 700px klappen beide
   Tabellen wie der Stundenplan zu Bloecken auf. */
.jms-fees { margin: 24px 0 8px; }
.jms-fee-note { max-width: 66ch; margin: 0 0 6px; color: var(--jms-blue); font-size: 0.92rem; }
.jms-fee-heading { margin: 36px 0 12px; font-size: 1.06rem; }
.jms-fee-table { width: 100%; margin: 0 0 16px; border-collapse: collapse; border-top: 1px solid var(--jms-border); }
.jms-fee-table th, .jms-fee-table td { padding: 11px 22px 11px 0; border-bottom: 1px solid var(--jms-border); font-size: 0.94rem; text-align: left; vertical-align: top; }
.jms-fee-table thead th { font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.74rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; }
.jms-fee-table tbody th { font-weight: 700; }
.jms-fee-table td:last-child, .jms-fee-table th:last-child { padding-right: 0; }
.jms-fee-table--breit td { white-space: nowrap; }
/* Die vier zweispaltigen Tabellen stehen untereinander. Ohne feste Breite
   bemisst jede ihre Namensspalte selbst -- die Betraege saessen dann in jeder
   Tabelle an einer anderen Stelle und das Auge findet keine Spalte mehr. */
.jms-fee-table:not(.jms-fee-table--breit) th:first-child { width: 62%; }
.jms-fee-table:not(.jms-fee-table--breit) td { white-space: nowrap; }
/* Der Gedankenstrich fuer "gibt es nicht" ist Zierde und steht deshalb im
   Stylesheet: In der Zelle selbst waere er Text, den eine Sprachausgabe
   vorliest und eine Maschine als Angabe missversteht. */
.jms-fee-leer::before { content: "–"; color: var(--jms-border); }
.jms-fee-hint { color: var(--jms-blue); font-size: 0.86rem; font-weight: 400; }
.jms-fee-star { color: var(--jms-blue); }
.jms-fee-footnote { max-width: 66ch; margin: 0 0 6px; color: var(--jms-blue); font-size: 0.86rem; }
/* Die Kurzfassung auf /unterricht/: dieselben Zahlen in Saetzen, damit sie
   zitierbar sind. Sie tritt optisch zurueck, die Tabelle bleibt die
   Uebersicht. */
.jms-fee-summary { max-width: 68ch; }
.jms-fee-more { margin: 6px 0 0; font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.9rem; font-weight: 700; }

.jms-subject-copy { padding: 22px 24px 24px; }
.jms-subject-copy h3 { margin-bottom: 10px; }
.jms-subject-copy p { margin-top: 0; }
/* Bilder vergroessern.
   Die Schaltflaeche ist bewusst ein button und kein Link: sie fuehrt nirgendwohin,
   sondern oeffnet eine Ansicht auf derselben Seite. cursor: zoom-in sagt dasselbe
   noch einmal mit der Maus. */
.jms-zoom { display: block; position: relative; width: 100%; padding: 0; border: 0; background: none; cursor: zoom-in; }
.jms-zoom img { display: block; width: 100%; }
.jms-zoom-hint { position: absolute; right: 8px; bottom: 26px; display: grid; width: 30px; height: 30px; place-items: center; border-radius: 50%; background: var(--jms-yellow); color: var(--jms-ink); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 1.1rem; font-weight: 700; line-height: 1; opacity: 0; transition: opacity 140ms ease; }
.jms-zoom:hover .jms-zoom-hint, .jms-zoom:focus-visible .jms-zoom-hint { opacity: 1; }
.jms-content .jms-zoom { width: min(100%, 900px); margin: 0 0 42px; }
.jms-content .jms-zoom .jms-feature-image { margin: 0; }
.jms-lightbox { position: fixed; inset: 0; z-index: 1000; display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(19, 38, 58, 0.93); }
.jms-lightbox img { max-width: min(100%, 1100px); max-height: 86vh; width: auto; height: auto; border-radius: var(--jms-radius); }
.jms-lightbox-close { position: absolute; top: 18px; right: 18px; min-height: 44px; min-width: 44px; padding: 0 16px; border: 1px solid var(--jms-white); border-radius: 3px; background: transparent; color: var(--jms-white); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.78rem; font-weight: 700; cursor: pointer; }
.jms-lightbox-close:hover { background: var(--jms-white); color: var(--jms-ink); }
.jms-avatar { width: 78px; height: 78px; display: grid; place-items: center; margin-bottom: 22px; border-radius: 3px; background: var(--jms-yellow); color: var(--jms-ink); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 2rem; font-weight: 700; }
.jms-teacher-card img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: 3px; margin-bottom: 18px; }
/* Kalender.
   Die Monatsansicht ist bewusst eine Tabelle: Ein Monatskalender *ist* ein
   Raster aus Wochentagen und Wochen. Screenreader koennen darin navigieren und
   zu jeder Zelle den Wochentag ansagen -- mit verschachtelten Divs ginge das
   nicht. */
/* Eine Quelle fuer die Farben: Die Legende und die Eintraege im Raster lesen
   dieselben Werte. Anders liefen Erklaerung und Erklaertes auseinander, sobald
   jemand eine Farbe aendert. */
.jms-calendar { --jms-art-veranstaltung: var(--jms-blue); --jms-art-ferien: #b32d2e; --jms-art-probe: #6b3fa0; margin: 0 0 42px; }
.jms-calendar-bar { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 14px; margin-bottom: 20px; }
.jms-calendar-title { margin: 0; font-size: clamp(1.2rem, 1.8vw, 1.5rem); }
.jms-calendar-views, .jms-calendar-nav { display: flex; gap: 4px; margin: 0; }
.jms-calendar-legend { margin: 0 0 20px; }
.jms-calendar-legend fieldset { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 22px; margin: 0; padding: 14px 18px; border: 1px solid var(--jms-border); background: var(--jms-cream); }
.jms-calendar-legend legend { padding: 0 6px; color: var(--jms-blue); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.72rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; }
.jms-calendar-legend-items { display: flex; flex-wrap: wrap; gap: 10px 22px; }
.jms-calendar-legend-item { display: flex; align-items: center; gap: 8px; }
.jms-calendar-legend-item input { width: 18px; height: 18px; margin: 0; accent-color: var(--jms-ink); flex: none; }
.jms-calendar-legend-item label { display: flex; align-items: center; gap: 8px; font-size: 0.86rem; cursor: pointer; }
/* Die Farbmarke traegt keine eigene Bedeutung, sie wiederholt die des Textes
   daneben -- deshalb aria-hidden und deshalb genuegt hier Farbe allein. */
.jms-calendar-legend-swatch { display: block; width: 15px; height: 15px; border-radius: 3px; background: var(--jms-blue); flex: none; }
.jms-calendar-legend-item--veranstaltung .jms-calendar-legend-swatch { background: var(--jms-art-veranstaltung); }
.jms-calendar-legend-item--ferien .jms-calendar-legend-swatch { background: var(--jms-art-ferien); }
.jms-calendar-legend-item--probe .jms-calendar-legend-swatch { background: var(--jms-art-probe); }
/* Wie die Schaltflaechen der Ansichtswahl daneben -- und mit eigener Klasse,
   weil `.jms-content .jms-button` jede Schaltflaeche im Seiteninhalt zu einem
   Textlink macht. Fuer ein Absendefeld ist das zu wenig. */
.jms-calendar-legend-place { display: flex; align-items: center; gap: 8px; margin: 0; font-size: 0.86rem; }
.jms-calendar-legend-place select { max-width: 220px; padding: 6px 8px; border: 1px solid var(--jms-border); border-radius: 3px; background: var(--jms-white); font: inherit; }
.jms-calendar-legend-submit { margin-left: auto; padding: 8px 14px; border: 1px solid var(--jms-ink); border-radius: 3px; background: var(--jms-yellow); color: var(--jms-ink); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.78rem; font-weight: 700; cursor: pointer; }
.jms-calendar-legend-submit:hover { background: var(--jms-ink); color: var(--jms-white); }
.jms-calendar-views a, .jms-calendar-nav a { padding: 6px 12px; border: 1px solid var(--jms-border); background: var(--jms-white); color: var(--jms-ink); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.78rem; font-weight: 700; text-decoration: none; }
.jms-calendar-views a:hover, .jms-calendar-nav a:hover { border-color: var(--jms-ink); }
.jms-calendar-views a.is-active { border-color: var(--jms-ink); background: var(--jms-yellow); }
.jms-calendar-month { width: 100%; border-collapse: collapse; table-layout: fixed; }
.jms-calendar-month th { padding: 8px 6px; border: 1px solid var(--jms-border); background: var(--jms-cream); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.06em; }
.jms-calendar-month td { height: 104px; padding: 6px; border: 1px solid var(--jms-border); vertical-align: top; }
.jms-calendar-month td.is-empty { background: var(--jms-cream); }
.jms-calendar-month td.is-today { outline: 2px solid var(--jms-yellow-dark); outline-offset: -2px; }
.jms-calendar-daynumber { display: block; margin-bottom: 4px; font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.78rem; font-weight: 700; }
.jms-calendar-entries { margin: 0; padding: 0; list-style: none; }
.jms-calendar-entry { margin-bottom: 4px; padding-left: 8px; border-left: 3px solid var(--jms-art-veranstaltung); font-size: 0.76rem; line-height: 1.35; }
.jms-calendar-entry a { color: var(--jms-ink); text-decoration-color: var(--jms-yellow-dark); }
.jms-calendar-entry--ferien { border-left-color: var(--jms-art-ferien); }
.jms-calendar-entry--probe { border-left-color: var(--jms-art-probe); }
.jms-calendar-time { display: block; color: var(--jms-blue); }
.jms-calendar-week { margin: 0; padding: 0; list-style: none; }
.jms-calendar-day { padding: 14px 0; border-top: 1px solid var(--jms-border); }
.jms-calendar-day.is-today { border-top-color: var(--jms-yellow-dark); border-top-width: 2px; }
.jms-calendar-day h3 { margin: 0 0 8px; font-size: 1rem; }
.jms-calendar-day .jms-calendar-entry { font-size: 0.9rem; }
.jms-calendar-empty { margin: 0; color: var(--jms-blue); font-size: 0.86rem; }

@media (max-width: 720px) {
  /* Auf schmalen Bildschirmen ist ein Sieben-Spalten-Raster nicht lesbar.
     Die Monatstabelle wird deshalb zur Liste -- die Wochentagsspalte entfaellt,
     jede Zelle steht fuer sich. */
  .jms-calendar-month, .jms-calendar-month tbody, .jms-calendar-month tr, .jms-calendar-month td { display: block; width: auto; }
  .jms-calendar-month thead { display: none; }
  .jms-calendar-month td { height: auto; border: 0; border-top: 1px solid var(--jms-border); }
  .jms-calendar-month td.is-empty { display: none; }
}

/* Datum und Zeitraum auf der Einzelseite eines Kalendereintrags. */
.jms-page-hero-meta { margin: 10px 0 0; font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: clamp(1rem, 1.5vw, 1.15rem); font-weight: 700; }
.jms-page-hero-meta .jms-event-kind { display: block; margin-bottom: 2px; color: var(--jms-blue); font-size: 0.72rem; font-weight: 700; letter-spacing: 0.11em; text-transform: uppercase; }

.jms-event-list { display: grid; gap: 12px; }
.jms-event { display: grid; grid-template-columns: minmax(125px, 0.25fr) 1fr; align-items: center; gap: 25px; padding: 20px 24px; border-radius: 16px; background: var(--jms-white); color: var(--jms-ink); }
.jms-event time { font-weight: 800; }
.jms-event h3 { margin: 0; font-family: inherit; font-size: 1.08rem; }
.jms-page-hero { padding: 40px 0 29px; background: linear-gradient(90deg, var(--jms-yellow) 0 5px, var(--jms-cream) 5px 100%); border-bottom: 1px solid var(--jms-border); }
.jms-page-hero h1 { margin: 0; font-size: clamp(1.65rem, 2.45vw, 2.1rem); }
.jms-page-hero .jms-eyebrow { margin-bottom: 7px; font-size: 0.62rem; }
/* Die Startseite als Blockseite. Anders als ein Artikel hat sie keinen
   eingerueckten Textkoerper: jeder Abschnitt ist eine eigene Flaeche ueber die
   volle Breite und bringt seine Innenabstaende selbst mit. */
.jms-front > * { margin-block: 0; }
.jms-front .wp-block-group.jms-section > *, .jms-front .wp-block-group.jms-hero-block > * { margin-inline: auto; }

.jms-content { padding: 58px 0 112px; }
.jms-content > * { max-width: 840px; }
.jms-content > .jms-card-grid, .jms-content > .jms-subject-rotator, .jms-content > .jms-offer-schedule-view, .jms-content > .jms-ensemble-dates, .jms-content > .jms-event-list, .jms-content > .jms-news-grid, .jms-content > .jms-news-stream, .jms-content > .alignwide { max-width: var(--jms-content); }
/* Vollbreite. align-wide war unterstuetzt, .alignfull aber nirgends gestaltet --
   eine Vollbreiten-Gruppe brach an der Inhaltsbreite. Voraussetzung fuer die
   Hero-Sektion ueber die ganze Fensterbreite. */
.jms-content > .alignfull, .entry-content > .alignfull { max-width: none; width: 100vw; margin-left: calc(50% - 50vw); margin-right: calc(50% - 50vw); }
.jms-content > h2 { margin-top: 58px; padding-top: 32px; border-top: 1px solid var(--jms-border); font-size: clamp(1.28rem, 1.7vw, 1.6rem); }
.jms-content > h2:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
.jms-content > .jms-card-grid, .jms-content > .jms-subject-rotator, .jms-content > .jms-staff-grid, .jms-content > .jms-news-grid, .jms-content > .jms-news-stream, .jms-content > .jms-event-list { margin-top: 26px; margin-bottom: 54px; }
.jms-content .jms-card { min-height: 0; }
.jms-content .jms-button { min-height: 0; padding: 4px 0; border: 0; border-bottom: 1px solid currentColor; background: transparent; font-size: 0.82rem; }
.jms-content .jms-button:hover { background: transparent; color: var(--jms-blue); }
.jms-content figure { max-width: 100%; margin: 34px 0; }
.jms-content figure img, .jms-content > p > img, .jms-content .gallery img { display: block; width: auto; max-width: 100%; max-height: 760px; object-fit: contain; border-radius: var(--jms-radius); }
.jms-content .alignright { float: right; width: min(38%, 360px); margin: 4px 0 28px 32px; }
.jms-content .alignleft { float: left; width: min(38%, 360px); margin: 4px 32px 28px 0; }
.jms-content figure.alignright img, .jms-content figure.alignleft img, .jms-content img.alignright, .jms-content img.alignleft { width: 100%; }
/* **Eine Bildfigur bekommt nie eine feste Breite, nur eine Hoechstbreite.**
   Das ist die ganze Regel hinter zentrierten Bildunterschriften -- siehe den
   Block weiter unten. `width: auto` heisst hier "so breit wie das Bild": Die
   Figur ist eine Tabelle und bestimmt ihre Breite aus dem Inhalt. */
.jms-content figure.alignright, .jms-content figure.alignleft { width: auto; max-width: min(38%, 360px); }
.jms-content .aligncenter { margin-inline: auto; }
.jms-content h2, .jms-content h3 { clear: both; }
.jms-content::after { display: table; clear: both; content: ""; }
/* Bildunterschriften: eine Regel, keine Ausnahmen.
   ------------------------------------------------
   Eine Unterschrift gehoert unter das Bild, nicht unter die Textspalte. Eine
   <figure> ist aber ein Blockkasten und so breit wie ihr Platz -- das Bild nur
   so breit wie es ist. `text-align: center` zentriert dann im Kasten und nicht
   unter dem Bild.
   `display: table` bindet die Figur an ihr Bild: Eine Tabelle bestimmt ihre
   Breite aus dem Inhalt, und eine `table-caption` waechst sie nicht auf --
   nachgemessen mit einer absichtlich ueberlangen Unterschrift.
   WordPress macht das fuer *ausgerichtete* Blockbilder selbst (siehe die
   Kernregel `.wp-block-image.alignleft{display:table}`). Nicht erfasst sind
   dort: Bilder ohne Ausrichtung, die klassische Auszeichnung `figure.wp-caption`
   und `alignwide`/`alignfull`. Fuer die galt die Regel hier bis zum
   7. September 2026 mit vier `:not()`-Ausnahmen -- also drei Loecher, durch die
   eine Unterschrift jederzeit wieder danebenrutschen konnte. Jetzt ohne
   Ausnahmen.
   Nur Bildfiguren: Ein eingebettetes Video steckt in `figure.wp-block-embed`
   mit Seitenverhaeltnis-Huelle und wuerde in einer schrumpfenden Tabelle
   zusammenfallen. */
.jms-content figure.wp-block-image,
.jms-content figure.wp-caption { display: table; }
.jms-content figure.wp-block-image > figcaption,
.jms-content figure.wp-caption > figcaption { display: table-caption; caption-side: bottom; }
.jms-content .gallery figure { display: block; }
.jms-content .gallery figure > figcaption { display: block; }
.jms-content figcaption { margin-top: 8px; color: var(--jms-blue); font-size: 0.78rem; line-height: 1.5; text-align: center; }
.jms-content .gallery { display: grid; max-width: var(--jms-content); grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 18px; margin: 34px 0; }
.jms-content .gallery figure { margin: 0; }
.jms-content blockquote { margin: 34px 0; padding: 6px 0 6px 24px; border-left: 4px solid var(--jms-yellow-dark); color: var(--jms-blue); }
.jms-content details { margin: 28px 0; border-block: 1px solid var(--jms-border); }
.jms-content summary { padding: 15px 0; font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-weight: 700; cursor: pointer; }
.jms-download-list { display: grid; gap: 8px; padding-left: 1.25rem; }
.jms-pagination { margin-top: 42px; }
.jms-pagination ul { display: flex; flex-wrap: wrap; gap: 8px; padding: 0; list-style: none; }
.jms-pagination a, .jms-pagination .current { display: inline-flex; min-width: 38px; min-height: 38px; padding: 7px 11px; align-items: center; justify-content: center; border: 1px solid var(--jms-border); text-decoration: none; }
.jms-pagination .current { border-color: var(--jms-ink); background: var(--jms-ink); color: var(--jms-white); }
.jms-feature-image { display: block; width: min(100%, 900px); max-height: 620px; margin: 0 0 42px; object-fit: cover; border-radius: var(--jms-radius); }
.jms-term-meta { display: flex; flex-wrap: wrap; gap: 10px; margin: 20px 0 0; }
.jms-pill { padding: 7px 13px; border-radius: 999px; background: var(--jms-white); border: 1px solid var(--jms-border); font-size: 0.86rem; font-weight: 750; }
.jms-interest-form, .jms-enrolment { display: grid; gap: 28px; width: min(100%, 960px); max-width: 960px; padding: clamp(22px, 5vw, 42px); border: 1px solid var(--jms-border); border-top: 7px solid var(--jms-yellow); border-radius: 0; background: var(--jms-white); box-shadow: var(--jms-shadow); }
.jms-interest-form fieldset, .jms-enrolment fieldset { display: grid; gap: 18px; min-width: 0; margin: 0; padding: 0 0 30px; border: 0; border-bottom: 1px solid var(--jms-border); }
.jms-interest-form legend, .jms-enrolment legend { width: 100%; margin-bottom: 18px; padding: 0; color: var(--jms-ink); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 1.18rem; font-weight: 700; }
.jms-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 19px 22px; }
.jms-field-wide { grid-column: 1 / -1; }
.jms-required-note { margin: 0; font-size: 0.82rem; }
.jms-interest-form label, .jms-enrolment label { display: grid; gap: 7px; font-weight: 750; }
.jms-interest-form input, .jms-interest-form textarea, .jms-interest-form select,
.jms-enrolment input, .jms-enrolment textarea, .jms-enrolment select { width: 100%; border: 1px solid var(--jms-ink); border-radius: 2px; background: var(--jms-white); color: var(--jms-ink); padding: 12px 13px; font: inherit; }
.jms-interest-form .jms-checkbox, .jms-enrolment .jms-checkbox { grid-template-columns: 24px 1fr; align-items: start; font-weight: 500; }
.jms-interest-form .jms-checkbox input, .jms-enrolment .jms-checkbox input { width: 22px; height: 22px; margin-top: 4px; }
.jms-honeypot { position: absolute; left: -10000px; }
.jms-form-note { margin: 0; font-size: 0.84rem; }
.jms-form-message { max-width: 720px; margin-bottom: 20px; padding: 16px 20px; border-left: 6px solid var(--jms-green); background: var(--jms-white); }
.jms-form-message.error { border-color: var(--jms-red); }

/* Das zusammengefuehrte Anmeldeformular. Sieben Abschnitte, die sich
   nacheinander oeffnen -- eingeklappt wird mit dem hidden-Attribut, damit die
   Pflichtfeld-Logik des Skripts an einer einzigen Eigenschaft haengt und nicht
   an einer Klasse, die man an zwei Stellen pflegen muesste. */
.jms-enrolment { width: min(100%, 1040px); max-width: 1040px; }
.jms-enrol-nr { display: inline-flex; width: 30px; height: 30px; margin-right: 10px; align-items: center; justify-content: center; border-radius: 999px; background: var(--jms-yellow); color: var(--jms-ink); font-size: 0.94rem; font-weight: 700; }
.jms-enrolment legend { display: flex; align-items: center; }
.jms-enrol-switch { align-items: center; padding: 13px 15px; border: 1px solid var(--jms-border); background: var(--jms-sand, #faf7f0); font-weight: 750 !important; }

/* Die Einordnung des Wohnorts. Sie nimmt die ganze Zeile ein, weil sie zu
   Postleitzahl und Ort gehoert und nicht daneben steht; an ihr haengen der
   Zuschlag fuer Auswaertige und die Pflichtmitgliedschaft.
   Der farbige Rand links statt eines Symbols: Ein Haken oder ein Ausrufezeichen
   traegt die Aussage allein in der Farbe beziehungsweise im Zeichen -- der
   Text sagt sie hier vollstaendig, die Farbe wiederholt sie nur. */
/* Die Kacheln der Kooperationsangebote. Dasselbe Raster wie bei den
   Instrumenten; die Kostenzeile tritt zurueck, weil sie die Antwort auf eine
   zweite Frage ist und nicht auf die erste. */
.jms-coop-card img { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; }
.jms-coop-kosten { margin: auto 0 0; padding-top: 10px; color: var(--jms-blue); font-size: 0.88rem; font-weight: 700; }
/* Ein Angebot, dessen Anmeldung woanders laeuft: erklaert statt angeboten. */
.jms-enrol-item--hinweis { padding: 0; border: 0; }

.jms-gemeinde { grid-column: 1 / -1; margin: 0; }
.jms-gemeinde-ergebnis { margin: 0; padding: 10px 14px; border-left: 4px solid var(--jms-border); background: var(--jms-sand, #faf7f0); font-size: 0.88rem; }
.jms-gemeinde-ergebnis.ist-mitglied { border-left-color: #2f7a46; }
.jms-gemeinde-ergebnis.ist-auswaerts { border-left-color: var(--jms-yellow-dark, #b58d00); }
.jms-gemeinde-ergebnis.ist-offen { color: var(--jms-blue); background: none; border-left-color: var(--jms-border); }
.jms-gemeinde-ergebnis:empty { display: none; }
.jms-gemeinde-korrektur { margin: 6px 0 0; }
.jms-gemeinde-feld { margin-top: 10px; }
.jms-gemeinde-feld[hidden] { display: none; }
/* Ein Knopf, der aussieht wie ein Verweis: Er klappt etwas auf dieser Seite
   auf, deshalb ist er ein <button> und kein <a> -- mit der Tastatur und einer
   Sprachausgabe ist der Unterschied nicht kosmetisch. */
.jms-linkknopf { padding: 0; border: 0; background: none; color: var(--jms-blue); font: inherit; font-size: 0.84rem; text-decoration: underline; cursor: pointer; }
.jms-linkknopf:hover, .jms-linkknopf:focus-visible { color: var(--jms-yellow-dark, #b58d00); }
.jms-enrol-panel { display: grid; gap: 20px; padding-left: clamp(0px, 2vw, 18px); border-left: 4px solid var(--jms-yellow); }
.jms-enrol-head { margin: 6px 0 0; font-size: 1.04rem; }
.jms-enrol-list { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); margin: 0; padding: 0; list-style: none; }
.jms-enrol-item { padding: 12px 14px; border: 1px solid var(--jms-border); background: var(--jms-white); }
/* Ein Eintrag mit offenem Feld nimmt die ganze Zeile: Sonst stehen sechs
   Auswahlfelder in einer 250px-Spalte. Ohne JavaScript ist jedes Feld offen,
   und die Liste wird einspaltig -- das ist der richtige Rueckfall. */
.jms-enrol-item:has(.jms-enrol-sub:not([hidden])) { grid-column: 1 / -1; }
.jms-enrol-desc { margin: 6px 0 0; font-size: 0.86rem; }
.jms-enrol-price { margin: 4px 0 0; font-size: 0.86rem; font-weight: 750; }
.jms-enrol-sub { display: grid; gap: 14px; margin-top: 13px; padding-top: 13px; border-top: 1px dashed var(--jms-border); }
.jms-enrol-note { padding: 15px 17px; border: 1px solid var(--jms-border); border-left: 5px solid var(--jms-blue); background: var(--jms-white); }
.jms-enrol-note h4 { margin: 0 0 8px; font-size: 1rem; }
.jms-enrol-note p { margin: 0 0 10px; font-size: 0.9rem; }
.jms-enrol-note--orchester { border-left-color: var(--jms-yellow); }
.jms-enrol-choice { display: grid; gap: 8px; margin: 12px 0; }
.jms-enrol-mandate { font-size: 0.84rem; }
.jms-enrol-legal { padding: 12px 15px; border: 1px solid var(--jms-border); background: var(--jms-white); }
.jms-enrol-legal summary { font-weight: 750; cursor: pointer; }
.jms-enrol-legal p { font-size: 0.82rem; }
.jms-enrol-legal h4 { margin: 14px 0 4px; font-size: 0.94rem; }
.jms-enrol-summary { padding: 16px 18px; border: 1px solid var(--jms-ink); background: var(--jms-sand, #faf7f0); }
.jms-enrol-summary-title { margin: 0 0 10px; font-weight: 750; }
.jms-enrol-summary-list { display: grid; gap: 7px; margin: 0 0 14px; padding: 0; list-style: none; }
.jms-enrol-summary-list li { display: flex; gap: 14px; justify-content: space-between; padding-bottom: 6px; border-bottom: 1px dotted var(--jms-border); font-size: 0.9rem; }
.jms-enrol-summary-list li span:last-child { flex: 0 0 auto; font-weight: 750; }
.jms-enrol-total { margin: 0; font-size: 1.1rem; font-weight: 750; }
.jms-label-text { display: block; }
.jms-field-note { font-size: 0.8rem; font-weight: 400; }
.jms-enrol-submit { justify-self: start; }
.jms-enrolment [hidden] { display: none !important; }
.jms-video-embed { position: relative; width: min(100%, 900px); aspect-ratio: 16 / 9; overflow: hidden; margin: 24px 0 46px; background: linear-gradient(135deg, var(--jms-ink), var(--jms-blue)); }
.jms-video-load { display: flex; width: 100%; height: 100%; padding: clamp(24px, 6vw, 60px); flex-direction: column; align-items: center; justify-content: center; gap: 10px; border: 0; background: transparent; color: var(--jms-white); text-align: center; cursor: pointer; }
.jms-video-load:hover { background: rgba(255,255,255,.06); }
.jms-video-load strong { font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: clamp(1rem, 2.2vw, 1.35rem); }
.jms-video-load small { max-width: 540px; font-size: 0.78rem; line-height: 1.55; }
.jms-video-play { display: grid; width: 58px; height: 58px; place-items: center; padding-left: 4px; border-radius: 50%; background: var(--jms-yellow); color: var(--jms-ink); font-size: 1.2rem; }
.jms-video-embed iframe { display: block; width: 100%; height: 100%; border: 0; }
.jms-staff-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.jms-staff-card { min-height: 0; padding: 0; overflow: hidden; }
.jms-staff-card img { display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-bottom: 1px solid var(--jms-border); }
.jms-staff-copy { padding: 22px 24px 25px; }
.jms-staff-copy h3, .jms-staff-copy p { margin-top: 0; }
.jms-carousel { position: relative; max-width: var(--jms-content); margin: 24px 0 50px; }
.jms-carousel-controls { display: flex; justify-content: flex-end; gap: 8px; margin-bottom: 12px; }
.jms-carousel-controls button { width: 44px; height: 44px; border: 1px solid var(--jms-ink); border-radius: 2px; background: var(--jms-white); color: var(--jms-ink); font: 700 1.2rem/1 "Montserrat JMS", Montserrat, Arial, sans-serif; cursor: pointer; }
.jms-carousel-controls .jms-carousel-pause { width: auto; min-width: 94px; padding: 0 14px; font-size: 0.72rem; }
.jms-carousel-controls button:hover { background: var(--jms-yellow); }
.jms-carousel-track { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(230px, 28%); gap: 16px; overflow-x: auto; padding: 3px 3px 16px; scroll-snap-type: x mandatory; scrollbar-color: var(--jms-yellow-dark) var(--jms-cream); }
.jms-partner-card { position: relative; display: flex; min-height: 190px; padding: 22px; align-items: center; justify-content: center; scroll-snap-align: start; border: 1px solid var(--jms-border); border-top: 5px solid var(--jms-yellow); background: var(--jms-white); text-align: center; }
.jms-partner-card > a { display: flex; width: 100%; height: 100%; flex-direction: column; align-items: center; justify-content: center; color: var(--jms-ink); text-decoration: none; }
/* Das Logo steht allein in der Karte, der Name liegt im alt-Attribut.
   Deshalb kein unterer Abstand mehr fuer eine Bildunterschrift und mehr
   Hoehe fuer das Logo selbst. Die frueher hier notierte Regel
   .jms-partner-name ist mit der Umstellung entfallen. */
.jms-partner-card img { display: block; width: 100%; height: 120px; margin: 0; object-fit: contain; }
.jms-partner-wordmark { display: flex; min-height: 96px; align-items: center; justify-content: center; color: var(--jms-ink); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 1rem; font-weight: 700; line-height: 1.35; }
.jms-news-section { background: var(--jms-cream); border-block: 1px solid var(--jms-border); }
.jms-news-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 22px; }
.jms-news-card { min-width: 0; overflow: hidden; border: 1px solid var(--jms-border); background: var(--jms-white); }
.jms-news-image { display: block; }
.jms-news-image img { display: block; width: 100%; aspect-ratio: 16 / 9; object-fit: cover; }
.jms-news-copy { padding: 25px 25px 27px; }
.jms-news-copy h3 { margin: 0 0 13px; }
.jms-news-copy h3 a { color: var(--jms-ink); text-decoration-color: var(--jms-yellow-dark); }
.jms-news-copy p { margin-top: 0; }
.jms-news-stream { border-top: 1px solid var(--jms-border); }
.jms-news-stream-item { display: grid; grid-template-columns: minmax(105px, .25fr) minmax(190px, .75fr) minmax(0, 2fr); gap: clamp(18px, 3vw, 38px); align-items: start; padding: 30px 0; border-bottom: 1px solid var(--jms-border); }
.jms-news-stream-item:not(:has(.jms-news-image)) { grid-template-columns: minmax(105px, .25fr) minmax(0, 2.75fr); }
.jms-news-stream-date { padding-top: 3px; color: var(--jms-blue); font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: .75rem; font-weight: 700; line-height: 1.45; }
.jms-news-stream .jms-news-image img { aspect-ratio: 4 / 3; }
/* Lange deutsche Komposita sind fuer den Browser unteilbar und sprengen bei
   320 px jede Spalte. Gemessen: "Jugendwertungsspiel/Kammermusikwettbewerb"
   misst 375 px in 16px/28px Merriweather; /aktuelles/ rollte dadurch um
   74 px waagerecht, die Kategorieseite um 123 px und der Einzelbeitrag um
   74 px. `break-word` bricht solche Woerter als letztes Mittel um.

   Wichtig: `break-word` aendert die min-content-Breite NICHT. Die
   Gitterspuren muessen deshalb zusaetzlich auf `minmax(0, 1fr)` stehen --
   einzeln ist beides wirkungslos, nachgemessen. */
.jms-content, .jms-card, .jms-news-copy, .jms-page-hero h1 { overflow-wrap: break-word; }
.jms-news-stream .jms-news-copy { padding: 0; }
.jms-news-stream .jms-news-copy h3 { font-size: clamp(1.15rem, 1.8vw, 1.45rem); }
.jms-text-link { font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.82rem; font-weight: 700; }
.site-footer { padding: 60px 0 30px; background: var(--jms-footer); color: var(--jms-white); }
.jms-footer-grid { display: grid; grid-template-columns: 1.2fr 1fr 1fr; gap: 45px; }
.site-footer h2, .site-footer h3, .site-footer a { color: var(--jms-white); }
.site-footer h2 { font-size: 1.8rem; }
.site-footer ul { list-style: none; padding: 0; }
/* Mitgliedszeichen im Fussbereich. Das VdM-Logo traegt dunkelblaue Schrift;
   auf dem dunklen Grund des Fussbereichs waere sie unlesbar. Die helle Flaeche
   ist deshalb kein Schmuck, sondern Voraussetzung fuer die Lesbarkeit. */
.jms-footer-vdm { display: inline-block; margin: 22px 0 0; padding: 12px 16px; border-radius: 4px; background: var(--jms-white); }
.jms-footer-vdm img { display: block; width: 156px; height: auto; }
.jms-social-links { display: flex; flex-wrap: wrap; gap: 14px; }
.jms-consent { position: fixed; z-index: 9999; right: 22px; bottom: 22px; width: min(440px, calc(100% - 44px)); padding: 22px; border: 2px solid var(--jms-ink); border-radius: 18px; background: var(--jms-white); color: var(--jms-ink); box-shadow: 8px 8px 0 var(--jms-yellow); }
.jms-consent p { margin: 0 0 12px; }
.jms-consent-actions { display: flex; flex-wrap: wrap; gap: 10px; }
.jms-consent button { min-height: 44px; padding: 9px 14px; border: 2px solid var(--jms-ink); border-radius: 999px; background: var(--jms-white); color: var(--jms-ink); font: inherit; font-weight: 750; cursor: pointer; }
.jms-consent button:last-child { background: var(--jms-yellow); }
.site-footer .jms-footer-bottom { margin-top: 45px; padding-top: 20px; border-top: 1px solid rgba(255,255,255,.22); font-size: 0.85rem; }
.jms-opening-hours { display: grid; width: min(100%, 620px); margin: 24px 0; border-top: 1px solid var(--jms-border); }
.jms-opening-hours > div { display: grid; grid-template-columns: minmax(190px, .9fr) 1.1fr; gap: 24px; padding: 13px 0; border-bottom: 1px solid var(--jms-border); }
.jms-opening-hours dt { font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-weight: 700; }
.jms-opening-hours dd { margin: 0; }
.jms-holiday-table { width: min(100%, 620px); margin: 24px 0; border-collapse: collapse; border-top: 1px solid var(--jms-border); }
.jms-holiday-table th, .jms-holiday-table td { padding: 13px 24px 13px 0; border-bottom: 1px solid var(--jms-border); text-align: left; vertical-align: top; }
.jms-holiday-table th { width: 40%; font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-weight: 700; }
.jms-holiday-table td:last-child { padding-right: 0; }
.jms-easy-language { font-size: 18px; line-height: 1.8; }
.jms-easy-language .jms-content { max-width: 920px; }
.jms-easy-language .jms-content p, .jms-easy-language .jms-content li { max-width: 60ch; }
.jms-easy-note { padding: 18px 20px; border-left: 5px solid var(--jms-yellow-dark); background: var(--jms-cream); }
.jms-easy-links { display: grid; gap: 10px; padding-left: 1.3em; }
.jms-easy-links a { font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-weight: 700; }

/* Das Klappmenü beginnt bei 1259px und nicht erst bei 980px.
   Gemessen am 9. September 2026: Die Kopfzeile braucht 1224px für Wortmarke
   (212), Menü (701) und Sprachwahl (255) samt Abständen -- also 1260px
   Fensterbreite. Darunter lief sie über: bei 1200px um 42px, bei 981px um
   261px, und die ganze Seite ließ sich seitlich schieben.

   Vorher fiel das nicht auf, weil ein zu langer Menüpunkt umbrach und das
   Menü dadurch schmaler wurde -- der Umbruch war die Notbremse. Ohne ihn
   braucht es diese Grenze. Zwischen 981 und 1259px steht jetzt derselbe
   Klappknopf wie auf dem Telefon; die Sprachkürzel bleiben sichtbar. */
@media (max-width: 1259px) {
  .jms-menu-toggle { display: inline-flex; }
  /* 100% statt fester 96px: das Aufklappmenü folgt der tatsächlichen
     Kopfhöhe, auch wenn die Kopfzeile auf schmalen Bildschirmen umbricht. */
  .jms-main-nav { display: none; position: absolute; inset: 100% 0 auto; padding: 20px; background: var(--jms-white); border-bottom: 1px solid var(--jms-border); box-shadow: var(--jms-shadow); }
  .jms-main-nav.is-open { display: block; }
  .jms-main-nav ul { width: min(100%, var(--jms-content)); margin-inline: auto; flex-direction: column; align-items: flex-start; }
  .jms-main-nav li { width: 100%; }
  .jms-main-nav li > a { display: inline-block; padding: 9px 0; }
  .jms-main-nav .sub-menu { position: static; display: none; width: 100%; min-width: 0; padding: 4px 0 4px 20px; border: 0; border-left: 4px solid var(--jms-yellow); box-shadow: none; }
  .jms-main-nav .menu-item-has-children:hover > .sub-menu, .jms-main-nav .menu-item-has-children:focus-within > .sub-menu { display: none; }
  .jms-main-nav .menu-item-has-children.is-submenu-open > .sub-menu { display: flex; }
  /* Im Klappmenü darf ein Punkt umbrechen: Dort steht jeder in eigener
     Zeile und hat die ganze Breite. */
  .jms-main-nav > ul > li > a { white-space: normal; }
}

@media (max-width: 980px) {
  .jms-hero-grid { grid-template-columns: 1fr; }
  /* Drei und nicht zwei: Fuenf Kacheln stehen als 3+2 ohne Einzelgaenger,
     als 2+2+1 mit. */
  .jms-quick-nav { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .jms-card-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .jms-news-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .jms-carousel-track { grid-auto-columns: minmax(235px, 46%); }
  .jms-footer-grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 640px) {
  body { font-size: 16px; }
  /* Der Kopfbereich bricht hier um und misst 120,72px statt 97px. */
  :root { --jms-kopf-hoehe: 128px; }
  /* Unter 640 px laeuft der Hero-Text ueber die volle Breite (weiter unten
     wird max-width aufgehoben). Ein waagerechter Verlauf passt dann nicht
     mehr zum Textblock -- hier deckt gleichmaessig ab. */
  .jms-hero-wide .jms-hero-media::after { background: rgba(21, 32, 28, max(var(--jms-hero-scrim, 0.55), 0.75)); }
  .jms-brand-mark { width: 158px; }
  /* Die Kürzelleiste weicht auf kleinen Bildschirmen dem Menü, der Wechsel in
     die Leichte Sprache bleibt aber sichtbar. Sonst führte nur der Fussbereich
     dorthin – zu weit weg für die Zielgruppe. Der ausgeschriebene Knopf passt
     nicht mehr in eine Zeile, deshalb darf die Kopfzeile hier umbrechen. */
  /* Die Kopfzeile darf hier umbrechen: reicht der Platz nicht, rutscht der
     Wechsel in die Leichte Sprache in eine zweite Zeile, statt Logo und Menü
     zu verdrängen. */
  .jms-header-inner { flex-wrap: wrap; gap: 10px 14px; min-height: 0; padding-block: 12px; }
  /* Bis zum 7. September 2026 stand hier `display: none` fuer die
     Sprachkuerzel -- gedacht als Platzersparnis, tatsaechlich der Verlust der
     Mehrsprachigkeit auf dem Telefon: Englisch und Franzoesisch waren dort
     ueberhaupt nicht mehr erreichbar, auch nicht ueber den Fussbereich, der
     nur die Leichte Sprache fuehrt. Die Kopfzeile bricht ohnehin um; drei
     Kuerzel zu je 38 px passen in die zweite Zeile. */
  .jms-language-nav { flex-wrap: wrap; gap: 6px; }
  .jms-language-nav a.jms-easy-switch { padding-inline: 12px; font-size: 0.74rem; }
  /* `minmax(0, 1fr)` statt `1fr`: Das automatische Minimum von `1fr` ist die
     min-content-Breite, und ein einziges langes Wort zieht die Spur damit
     ueber die Fensterbreite hinaus. */
  .jms-card-grid, .jms-news-grid, .jms-footer-grid { grid-template-columns: minmax(0, 1fr); }
  .jms-hero-media img { min-height: 260px; }
  /* Bis zum 20. Oktober 2026 stand hier eine feste Hoehe:
       height: clamp(300px, 52vh, 420px);
     Auf einem 320x568-Telefon war der Hero damit 300 px hoch, der Textblock
     brauchte aber 433 px (englisch 498). Weil .jms-hero-wide overflow:hidden
     fuehrt und das Overlay mittig sitzt, wurden oben 66 px UND unten 66 px
     weggeschnitten: Die Vorzeile fehlte, und der Knopf "Zum Unterricht
     anmelden" war auf dem Telefon ueberhaupt nicht vorhanden. Am Schreibtisch
     faellt das nicht auf -- der Fehler verschwindet erst ab etwa 900 px
     Fensterhoehe.
     Jetzt ist die Hoehe nur noch ein Mindestmass; der Hero waechst mit dem
     Text. */
  /* Der Text gibt die Hoehe vor, nicht mehr umgekehrt: Die Textebene ist ein
     Geschwister des Bilderlaufs, steht jetzt im Fluss und traegt damit die
     Hoehe des Abschnitts. Der Bilderlauf legt sich dahinter und fuellt ihn
     aus. Die bisherige Hoehe bleibt als Mindestmass erhalten. */
  .jms-hero-wide--gross, .jms-hero-wide--mittel { min-height: clamp(300px, 52vh, 420px); display: flex; }
  .jms-hero-wide--gross .jms-hero-slider, .jms-hero-wide--mittel .jms-hero-slider { position: absolute; inset: 0; height: auto; }
  .jms-hero-wide--gross .jms-hero-wide-overlay, .jms-hero-wide--mittel .jms-hero-wide-overlay { position: relative; width: 100%; padding-block: 28px; }
  .jms-hero-wide-copy { max-width: none; }
  .jms-quick-nav { grid-template-columns: 1fr; }
  .jms-carousel-track { grid-auto-columns: 82%; }
  .jms-section-header { display: block; }
  .jms-section-header .jms-button { margin-top: 15px; }
  .jms-event { grid-template-columns: 1fr; gap: 5px; }
  .jms-form-grid { grid-template-columns: 1fr; }
  .jms-enrol-list { grid-template-columns: 1fr; }
  .jms-enrol-summary-list li { flex-direction: column; gap: 2px; }
  .jms-field-wide { grid-column: auto; }
  .jms-news-stream-item, .jms-news-stream-item:not(:has(.jms-news-image)) { grid-template-columns: minmax(0, 1fr); gap: 14px; }
  .jms-news-stream .jms-news-image img { aspect-ratio: 16 / 9; }
  .jms-content .alignright, .jms-content .alignleft { float: none; width: min(100%, 520px); margin: 28px 0; }
  .jms-content figure.alignright, .jms-content figure.alignleft { width: auto; max-width: min(100%, 520px); }
  .jms-opening-hours > div { grid-template-columns: 1fr; gap: 2px; }
  .jms-holiday-table th { width: 45%; padding-right: 16px; }
  /* Der Stundenplan klappt auf: Jede Zeile wird ein Block, jede Zelle
     bekommt ihren Spaltennamen davor. Ohne das stuende auf dem Telefon
     "Freitag Vormittag" ohne Angabe, was daran der Termin ist und was der
     Raum. Die Kopfzeile entfaellt -- ihre Namen stehen jetzt in den Zellen. */
  .jms-ensemble-dates thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .jms-ensemble-dates tr { display: block; padding: 12px 0; border-bottom: 1px solid var(--jms-border); }
  .jms-ensemble-dates th, .jms-ensemble-dates td { display: block; padding: 2px 0; border: 0; }
  .jms-ensemble-dates td[data-label]::before { content: attr(data-label) ": "; color: var(--jms-blue); font-size: 0.8rem; }
  .jms-ensemble-dates td:empty { display: none; }
  .jms-offer-schedule-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .jms-offer-schedule-table tr { display: block; padding: 12px 0; border-bottom: 1px solid var(--jms-border); }
  .jms-offer-schedule-table th, .jms-offer-schedule-table td { display: block; padding: 2px 0; border: 0; }
  .jms-offer-schedule-table td[data-label]::before { content: attr(data-label) ": "; color: var(--jms-blue); font-size: 0.8rem; }
  .jms-offer-schedule-table td:empty { display: none; }
  .jms-fee-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .jms-fee-table tr { display: block; padding: 12px 0; border-bottom: 1px solid var(--jms-border); }
  .jms-fee-table th, .jms-fee-table td { display: block; padding: 2px 0; border: 0; }
  .jms-fee-table td[data-label]::before { content: attr(data-label) ": "; color: var(--jms-blue); font-size: 0.8rem; }
  /* Die Gruppenspalten, die es fuer 15 und 22,5 Minuten nicht gibt, fallen
     hier ganz weg: Drei einzelne Gedankenstriche unter "15,0 min." sind auf
     dem Telefon drei Zeilen Rauschen. Der Elementname muss mit in die
     Auswahl -- ohne ihn verliert die Regel gegen `.jms-fee-table td` eine
     Zeile darueber, die `display: block` setzt. Genau so stand es hier zuerst
     und war am gerenderten Bild zu sehen. */
  .jms-fee-table td.jms-fee-leer { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; }
}
@media (prefers-contrast: more) {
  :root { --jms-border: #5a4f33; }
  a { text-decoration-thickness: 2px; }
}
@media (forced-colors: active) {
  .jms-card, .jms-interest-form, .jms-enrolment, .jms-partner-card, .jms-news-card { border: 1px solid CanvasText; }
  a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible { outline: 3px solid Highlight; }
}

/* Fussleiste: Urheberrecht links, Pflicht- und Zugaenglichkeitsseiten rechts.
   Sie stehen bewusst nicht unter „Schnell erreichbar", muessen aber jederzeit
   erreichbar bleiben. */
.jms-footer-bottom { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px 24px; }
.jms-footer-bottom p { margin: 0; }
.jms-footer-legal { display: flex; flex-wrap: wrap; gap: 8px 18px; list-style: none; margin: 0; padding: 0; }
.jms-footer-legal a { text-decoration: underline; text-underline-offset: 0.2em; }

/* Suchfeld und 404-Seite.
   Bis zum 19. Oktober 2026 gab es beides nicht: Das Theme hatte weder eine
   404- noch eine Suchvorlage, und weil `templates/index.html` existiert,
   hielt WordPress jms-yellow fuer ein Block-Theme und lieferte dort jene
   fast leere Blockvorlage aus -- ohne Kopfbereich, Navigation und Fusszeile.
   Die Schaltflaeche misst mindestens 44 Pixel, damit sie auch am Handy
   sicher zu treffen ist (WCAG 2.5.8 verlangt 24). */
.jms-searchform { max-width: 640px; margin: 0 0 32px; }
.jms-searchform label { display: block; margin-bottom: 7px; font-weight: 750; }
.jms-searchform-row { display: flex; flex-wrap: wrap; gap: 10px; }
.jms-searchform input[type="search"] {
  flex: 1 1 220px; min-width: 0; padding: 12px 13px;
  border: 1px solid var(--jms-ink); border-radius: 2px;
  background: var(--jms-white); color: var(--jms-ink); font: inherit;
}
.jms-searchform button {
  min-height: 46px; padding: 0 22px;
  border: 1px solid var(--jms-ink); border-radius: 2px;
  background: var(--jms-ink); color: var(--jms-white);
  font: 700 0.86rem/1 "Montserrat JMS", Montserrat, Arial, sans-serif;
  cursor: pointer;
}
.jms-searchform button:hover { background: var(--jms-blue); }
.jms-404-links { display: flex; flex-wrap: wrap; gap: 10px 26px; list-style: none; margin: 0; padding: 0; }
.jms-404-links a { font-weight: 700; text-decoration: underline; text-underline-offset: 0.2em; }

/* Leerer Verweis im Einwilligungsfenster.
   Complianz stellt im Fenster einen Verweis auf die Cookie-Erklaerung
   bereit und fuellt seinen Text aus der Konfiguration. Diese Website hat
   keine eigene Cookie-Erklaerung -- das Thema steht in der
   Datenschutzerklaerung --, also bleibt der Verweis ohne Text und zeigt auf
   die gerade geoeffnete Seite. Gemessen war er der einzige Verweis ohne
   zugaenglichen Namen, der nach dem 19. Oktober 2026 noch uebrig war, und
   zwar auf jeder Seite.
   `:empty` statt einer festen Ausblendung: Wird spaeter doch eine
   Cookie-Erklaerung eingerichtet, erscheint der Verweis von selbst wieder. */
a.cmplz-link:empty { display: none; }

/* WCAG 2.5.8: Das Schliesskreuz des Einwilligungsfensters kommt von
   Complianz und misst 20 x 20 px -- auf dem quer gehaltenen Telefon
   (Fensterhoehe unter 400 px) wegen einer eigenen zoom-Regel sogar nur
   7,19 x 7,19 px. Der Kasten waechst auf 24 x 24 px, das Kreuz selbst bleibt
   bei 20 px und bleibt durch flex-end genau an seinem Platz; die Flaeche
   waechst nur nach links und nach oben und unten.

   Die Kennung muss im Selektor stehen: uploads/complianz/css/banner-1-optin.css
   wird NACH dieser Datei geladen und gewaenne sonst. Die erzeugte Datei
   selbst nicht bearbeiten -- Complianz schreibt sie neu. */
#cmplz-cookiebanner-container .cmplz-cookiebanner .cmplz-close {
  display: flex; width: 24px; height: 24px; line-height: 24px;
  align-items: center; justify-content: flex-end;
}
/* Auf dem quer gehaltenen Telefon (Fensterhoehe bis 400 px) verkleinert
   Complianz das GANZE Fenster mit `zoom: 0.6` -- nicht nur das Kreuz.
   Gemessen lag es dort bei 14,39 px, also 24 x 0,6. Ein Zuruecksetzen des
   Zooms waere falsch: Er ist der Grund, warum das Fenster dort ueberhaupt
   hineinpasst. Stattdessen waechst der Kasten auf 40 px, damit nach der
   Verkleinerung wieder 24 px uebrig bleiben. */
@media (max-height: 400px) {
  /* Complianz verkleinert hier ZWEIMAL: einmal das ganze Fenster mit
     `zoom: 0.6` und dann noch einmal Kreuz (0,6) und Schaltflaechen (0,5)
     jeweils mit `!important`. Gemessen blieben davon 14,4 px und 17,5 px
     uebrig -- beides unter den geforderten 24.
     Der Zoom des Fensters bleibt: Er ist der Grund, warum es auf ein quer
     gehaltenes Telefon ueberhaupt passt. Aufgehoben wird nur die zweite
     Verkleinerung; die Kaesten messen dann 40 px und kommen mit 24 px an. */
  #cmplz-cookiebanner-container .cmplz-cookiebanner .cmplz-close {
    zoom: 1 !important;
    width: 40px; height: 40px; line-height: 40px;
  }
  #cmplz-cookiebanner-container .cmplz-cookiebanner .cmplz-btn {
    zoom: 1 !important;
    height: auto !important;
    min-height: 40px !important;
    line-height: 20px !important;
    display: inline-flex; align-items: center; justify-content: center;
  }
}

/* Fach und Unterrichtsort auf der Lehrkraftseite. Bis zum 20. Oktober 2026
   nannte keine der 104 Einzelseiten beides, obwohl die Uebersicht es zeigt. */
.jms-teacher-facts { display: grid; grid-template-columns: auto 1fr; gap: 6px 18px; margin: 0 0 26px; padding: 0 0 20px; border-bottom: 1px solid var(--jms-border); }
.jms-teacher-facts dt { font-family: "Montserrat JMS", Montserrat, Arial, sans-serif; font-size: 0.74rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--jms-blue); }
.jms-teacher-facts dd { margin: 0; }
@media (max-width: 480px) {
  .jms-teacher-facts { grid-template-columns: 1fr; gap: 2px 0; }
  .jms-teacher-facts dd { margin-bottom: 10px; }
}
