
  * { box-sizing: border-box; }
  html { scroll-behavior: smooth; overflow-x: clip; }
  body { margin: 0; overflow-x: clip; }
  #dc-root, .sc-host { overflow-x: clip; max-width: 100vw; }
  a { color: #ffffff; text-decoration: none; }
  a:hover { color: #2B8CFF; }
  section[id] { scroll-margin-top: 96px; }
  /* Sichtbarer Fokusring für Tastaturnavigation */
  a:focus-visible, button:focus-visible, [tabindex]:focus-visible { outline: 2px solid #2B8CFF; outline-offset: 3px; border-radius: 4px; }
  @keyframes kenburns { from { transform: scale(1); } to { transform: scale(1.08); } }
  @keyframes circlePulse {
    0%   { transform: scale(2);   opacity: 0; }
    50%  { transform: scale(1);   opacity: 1; }
    100% { transform: scale(0.1); opacity: 0; }
  }
  #pp-burger { display: none; }
  #pp-cards { height: 320px; }
  @media (max-width: 640px) {
    #pp-cta { flex-wrap: wrap; }
    #pp-cta h2 { white-space: normal !important; }
    #pp-hero-text { max-width: 100% !important; }
    #pp-headline span:nth-child(1) { font-size: clamp(38px, 20vw, 72px) !important; }
    #pp-headline span:nth-child(2) { font-size: clamp(26px, 13.3vw, 48px) !important; }
    #pp-headline span:nth-child(3) { font-size: clamp(12px, 6.05vw, 22px) !important; }
  }
  @media (max-width: 1280px) {
    #pp-lower { flex-direction: column; }
    #pp-cta { max-width: none !important; width: 100% !important; }
  }
  @media (max-width: 1024px) {
    #pp-nav-left, #pp-nav-right, #pp-nav-cta { display: none !important; }
    #pp-burger { display: flex !important; }
    #pp-pill-bg { -webkit-mask-image: none !important; mask-image: none !important; }
    #pp-pill-outline { display: none !important; }
    #pp-logo-wrap { left: 0 !important; transform: translateY(-50%) !important; width: 52px !important; height: 52px !important; }
    #pp-upper { flex-direction: column !important; align-items: flex-start !important; gap: 36px !important; }
    #pp-partners { align-items: flex-start !important; }
    #pp-dots { display: none !important; }
  }
  @media (max-width:1023px){
    #pp-dots{ display:flex !important; flex-direction:row !important; align-items:center !important; justify-content:center !important; top:calc(42vh + 50px) !important; bottom:auto !important; left:0 !important; right:0 !important; transform:none !important; }
  }
  @media (max-width: 768px) {
    #pp-cards { flex-direction: column !important; height: auto !important; }
    #pp-content { padding: 0 20px !important; }
  }
  @media (max-width: 640px) {
    #pp-upper { gap: 28px !important; }
    #pp-stats { gap: 14px !important; flex-wrap: nowrap !important; }
    #pp-stats > div { flex: 1 1 0; min-width: 0; }
    #pp-partners-marks { gap: 20px !important; font-size: 15px !important; }
  }
  @media (prefers-reduced-motion: reduce) {
    #pp-root * { animation: none !important; }
  }

  /* Border-Beam Glow für die CTA-Karte (Portierung von border-beam, MIT) */
  #pp-cta > *:not([data-beam-bloom]), .ksc-beam > *:not([data-beam-bloom]) { position: relative; z-index: 4; }
  #pp-cta::after, .ksc-beam::after {
    content: ""; position: absolute; inset: 0; border-radius: 11px; padding: 1px;
    clip-path: inset(0 round 12px);
    background:
      conic-gradient(from var(--beam-angle,0deg),
        transparent 0%, transparent 54%,
        rgba(255,255,255,.1) 57%, rgba(255,255,255,.3) 60%, rgba(255,255,255,.6) 63%, rgba(255,255,255,.75) 66%,
        rgba(255,255,255,.6) 69%, rgba(255,255,255,.3) 72%, rgba(255,255,255,.1) 75%,
        transparent 78%, transparent 100%),
      radial-gradient(ellipse 70px 40px at 33% -7.4%, rgb(45,75,181), transparent),
      radial-gradient(ellipse 60px 35px at 12% -5%, rgb(56,113,189), transparent),
      radial-gradient(ellipse 40px 70px at 2.1% 68.3%, rgb(66,152,198), transparent),
      radial-gradient(ellipse 20px 35px at 2.1% 68.3%, rgb(61,133,194), transparent),
      radial-gradient(ellipse 180px 32px at 74.4% 100%, rgb(77,190,206), transparent),
      radial-gradient(ellipse 85px 26px at 55% 100%, rgb(52,101,187), transparent),
      radial-gradient(ellipse 74px 32px at 93.9% 0%, rgb(71,171,202), transparent),
      radial-gradient(ellipse 26px 42px at 100% 27.1%, rgb(80,203,209), transparent),
      radial-gradient(ellipse 52px 48px at 100% 27.1%, rgb(64,145,196), transparent);
    -webkit-mask:
      conic-gradient(from var(--beam-angle,0deg),
        transparent 0%, transparent 30%,
        rgba(255,255,255,.1) 36%, rgba(255,255,255,.35) 44%, white 52%, white 80%,
        rgba(255,255,255,.35) 86%, rgba(255,255,255,.1) 92%, transparent 95%, transparent 100%),
      linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
    -webkit-mask-composite: source-in, xor;
    mask:
      conic-gradient(from var(--beam-angle,0deg),
        transparent 0%, transparent 30%,
        rgba(255,255,255,.1) 36%, rgba(255,255,255,.35) 44%, white 52%, white 80%,
        rgba(255,255,255,.35) 86%, rgba(255,255,255,.1) 92%, transparent 95%, transparent 100%),
      linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
    mask-composite: intersect, exclude;
    pointer-events: none; z-index: 2; opacity: .35;
    animation: beam-hue-shift 12s ease-in-out infinite;
  }
  #pp-cta::before, .ksc-beam::before {
    content: ""; position: absolute; inset: 0; border-radius: 12px; clip-path: inset(0 round 12px);
    background:
      radial-gradient(ellipse 63px 36px at 33% -7.4%, rgba(45,75,181,.45), transparent),
      radial-gradient(ellipse 54px 32px at 12% -5%, rgba(56,113,189,.45), transparent),
      radial-gradient(ellipse 36px 63px at 2.1% 68.3%, rgba(66,152,198,.45), transparent),
      radial-gradient(ellipse 18px 32px at 2.1% 68.3%, rgba(61,133,194,.45), transparent),
      radial-gradient(ellipse 162px 29px at 74.4% 100%, rgba(77,190,206,.45), transparent),
      radial-gradient(ellipse 77px 23px at 55% 100%, rgba(52,101,187,.45), transparent),
      radial-gradient(ellipse 67px 29px at 93.9% 0%, rgba(71,171,202,.45), transparent),
      radial-gradient(ellipse 23px 38px at 100% 27.1%, rgba(80,203,209,.45), transparent),
      radial-gradient(ellipse 47px 43px at 100% 27.1%, rgba(64,145,196,.45), transparent);
    box-shadow: inset 0 0 9px 1px rgba(255,255,255,.27);
    -webkit-mask-image:
      conic-gradient(from var(--beam-angle,0deg),
        transparent 0%, transparent 30%,
        rgba(255,255,255,.1) 36%, rgba(255,255,255,.35) 44%, white 52%, white 80%,
        rgba(255,255,255,.35) 86%, rgba(255,255,255,.1) 92%, transparent 95%, transparent 100%),
      linear-gradient(white, transparent 28px, transparent calc(100% - 28px), white),
      linear-gradient(to right, white, transparent 28px, transparent calc(100% - 28px), white);
    -webkit-mask-composite: source-in, source-over;
    mask-image:
      conic-gradient(from var(--beam-angle,0deg),
        transparent 0%, transparent 30%,
        rgba(255,255,255,.1) 36%, rgba(255,255,255,.35) 44%, white 52%, white 80%,
        rgba(255,255,255,.35) 86%, rgba(255,255,255,.1) 92%, transparent 95%, transparent 100%),
      linear-gradient(white, transparent 28px, transparent calc(100% - 28px), white),
      linear-gradient(to right, white, transparent 28px, transparent calc(100% - 28px), white);
    mask-composite: intersect, add;
    pointer-events: none; z-index: 1; opacity: .5;
    animation: beam-hue-shift 12s ease-in-out infinite;
  }
  #pp-cta [data-beam-bloom], .ksc-beam [data-beam-bloom] {
    position: absolute; inset: 0; border-radius: 11px; clip-path: inset(0 round 12px); padding: 1px;
    background: conic-gradient(from var(--beam-angle,0deg),
      transparent 0%, transparent 58%,
      rgba(255,255,255,.03) 62%, rgba(255,255,255,.08) 65%, rgba(255,255,255,.2) 67%, rgba(255,255,255,.45) 69%,
      rgba(255,255,255,.85) 70%, rgba(255,255,255,.85) 70.5%,
      rgba(255,255,255,.45) 71.5%, rgba(255,255,255,.2) 73%, rgba(255,255,255,.08) 75%, rgba(255,255,255,.03) 78%,
      transparent 82%);
    -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
    -webkit-mask-composite: xor;
    mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
    mask-composite: exclude;
    filter: blur(8px) brightness(1.6) saturate(2.5);
    pointer-events: none; z-index: 3; opacity: .35;
  }
  @keyframes beam-hue-shift {
    0%   { filter: hue-rotate(-30deg) brightness(1.6) saturate(2.5); }
    50%  { filter: hue-rotate(30deg) brightness(1.6) saturate(2.5); }
    100% { filter: hue-rotate(-30deg) brightness(1.6) saturate(2.5); }
  }

  /* ===== Editorial-Sektionen: globale Farb-Token ===== */
  :root {
    --bg-deep:#101A2E; --bg-dark:#1B2942; --bg-mid:#2C3E5E; --bg-light:#F4F7FA; --bg-light-alt:#E4EAF2; --bg-page:#080E1A;
    --accent:#1E7BFF; --accent-bright:#2B8CFF;
    --text-on-dark:#FFFFFF; --muted-on-dark:#9BA3AF; --text-on-light:#0F1520; --muted-on-light:#5A6473;
    /* Kicker-Farben je nach Sektionshintergrund (zweite Sicherheitsebene für Lesbarkeit) */
    --accent-kicker-dark:#7FB2FF; --accent-kicker-light:#0B5BCB;
    /* Höhe der Verlaufszone am Sektionsanfang; Sektionskopf setzt darauf auf */
    --grad-h:clamp(80px, 8.4vw, 130px); --sec-pad:clamp(4rem, 6.5vw, 6.5rem);
  }
  /* Reveal-System (Basiszustand hier, sichtbar via .inview durch den Observer) */
  [data-reveal]{ transition:opacity .7s cubic-bezier(.16,1,.3,1), transform .7s cubic-bezier(.16,1,.3,1); }
  .js-anim [data-reveal]{ opacity:0; will-change:opacity,transform; }
  .js-anim [data-reveal="slide-up"]{ transform:translateY(40px); }
  .js-anim [data-reveal="slide-left"]{ transform:translateX(40px); }
  .js-anim [data-reveal="slide-right"]{ transform:translateX(-40px); }
  .js-anim [data-reveal="scale"]{ transform:scale(.9); }
  .js-anim [data-reveal="fade"]{ transform:none; }
  [data-reveal].inview{ opacity:1 !important; transform:none !important; }
  /* Hero-Inhalt auf Desktop etwas größer */
  @media (min-width:1280px){
    #pp-hero-text{ max-width:820px !important; }
    #pp-headline > span:nth-child(1){ font-size:150px !important; }
    #pp-headline > span:nth-child(2){ font-size:101px !important; }
    #pp-headline > span:nth-child(3){ font-size:45px !important; }
    #pp-hero-text > p{ font-size:17px !important; max-width:600px !important; }
    #pp-stats [data-count-to]{ font-size:60px !important; }
    #pp-cta{ max-width:620px !important; margin-top:48px !important; }
    #pp-cta h2{ font-size:31px !important; }
  }
  /* Feste Sektionshöhen nur auf Desktop – darunter richtet sich die Höhe nach dem Inhalt */
  @media (max-width:1279px){
    #events, #erfolge, #historie, #mannschaften, #spielort, #mitmachen{ height:auto !important; }
  }
  /* ===== Gestapeltes Hero-Layout unterhalb von lg (1024px) ===== */
  @media (max-width:1023px){
    #pp-root{ background-color:var(--bg-deep) !important; min-height:0 !important; }
    /* Bildbereich: feste Höhe oben, Slideshow läuft unverändert weiter */
    #pp-bg{ inset:auto !important; top:76px !important; left:0; right:0; height:42vh !important; }
    #pp-bg::after{ content:""; position:absolute; left:0; right:0; bottom:0; height:80px; pointer-events:none; background:linear-gradient(to bottom, rgba(16,26,46,0) 0%, var(--bg-deep) 100%); z-index:2; }
    /* Overlays und Lichtstreifen entfallen — Text steht auf einfarbigem Grund */
    #pp-ov-1, #pp-ov-2, #pp-ov-3, #pp-ov-4, #pp-stripes, #pp-hero-fade{ display:none !important; }
    #pp-content{ min-height:0 !important; padding-bottom:0 !important; padding-top:calc(42vh + 76px) !important; }
    #pp-content > nav{ position:absolute !important; top:0; left:0 !important; right:0 !important; width:auto !important; max-width:none !important; box-sizing:border-box; padding-left:clamp(20px,4vw,52px) !important; padding-right:clamp(20px,4vw,52px) !important; }
    #pp-pill, #pp-pill-bg{ width:auto !important; max-width:100% !important; }
    #pp-content > div[style*="min-height"]{ display:none !important; }
    #pp-upper{ margin-top:0 !important; padding-top:40px !important; }
    #pp-hero-text *{ text-shadow:none !important; }
    #pp-lower{ padding-bottom:24px !important; }
    /* Navigationspille liegt über dem Bild – etwas kräftiger hinterlegt */
    #pp-pill-bg{ background:rgba(16,26,46,.7) !important; }
    /* Social-Karten wandern ans Ende des Textbereichs */
    #pp-social{ position:static !important; padding-top:0 !important; background:none !important; }
    #pp-social .scroll-hint{ display:none !important; }
    #pp-social-row{ background:none !important; border-top:none !important; padding-bottom:40px !important; }
  }
  @media (max-width:639px){
    #pp-stats{ display:grid !important; grid-template-columns:repeat(2,1fr) !important; }
    #pp-bg{ height:36vh !important; }
    #pp-content{ padding-top:calc(36vh + 76px) !important; }
    #pp-dots{ top:calc(36vh + 50px) !important; }
  }
  /* Hero-Slideshow: Bildausschnitt je Displaygröße nachführen */
  @media (max-width:1023px){ .hero-slide-img{ background-position:50% 38% !important; } }
  @media (max-width:767px){ .hero-slide-img{ background-position:50% 32% !important; } }
  @media (max-width:479px){ .hero-slide-img{ background-position:50% 28% !important; } }
  @media (orientation:portrait) and (max-width:767px){ .hero-slide-img{ background-size:cover !important; } }
  /* Lazy-Image: Platzhalter pulsiert, Bild blendet weich ein */
  .lazy-ph{ animation:lazyPulse 1.6s ease-in-out infinite; }
  .lazy-img{ opacity:0; transition:opacity .5s ease; }
  .lazy-img.loaded{ opacity:1; }
  @keyframes lazyPulse{ 0%,100%{opacity:.5;} 50%{opacity:.25;} }
  /* Event-Karten Hover (Descendant-Hover ist inline nicht abbildbar) */
  [data-ev-card]{ transition:transform .4s cubic-bezier(.16,1,.3,1), border-color .4s, box-shadow .4s; }
  [data-ev-card]:hover{ transform:translateY(-6px); border-color:rgba(255,255,255,.2); box-shadow:0 16px 44px rgba(0,0,0,.55); }
  [data-ev-img]{ transition:transform .4s cubic-bezier(.16,1,.3,1); }
  [data-ev-card]:hover [data-ev-img]{ transform:scale(1.04); }
  [data-ev-arrow]{ transition:transform .3s cubic-bezier(.16,1,.3,1); }
  [data-ev-card]:hover [data-ev-arrow]{ transform:translateX(4px); }
  /* Mannschaften: dunkle Karten auf hellem Grund */
  .team-card{ position:relative; overflow:hidden; border-radius:16px; padding:24px; background:linear-gradient(150deg,#1A2740,#0D1119); box-shadow:0 8px 32px rgba(15,21,32,.12); border:1px solid transparent; transition:transform .35s cubic-bezier(.16,1,.3,1), box-shadow .35s ease, border-color .35s ease; }
  .team-card:hover{ transform:translateY(-6px); box-shadow:0 18px 48px rgba(15,21,32,.22); border-color:var(--liga,#1E7BFF); }
  .team-bignum{ position:absolute; right:12px; bottom:-20px; z-index:1; font-family:'Anton',sans-serif; font-size:clamp(90px,12vw,150px); line-height:1; color:rgba(255,255,255,.06); pointer-events:none; }
  .team-btn-p{ transition:background-color .25s ease; }
  .team-btn-p:hover{ background:var(--accent-bright) !important; }
  .team-btn-s{ transition:background-color .25s ease, border-color .25s ease; }
  .team-btn-s:hover{ background:rgba(255,255,255,.08) !important; border-color:rgba(255,255,255,.4) !important; }
  .team-btn-p:focus-visible, .team-btn-s:focus-visible{ outline:2px solid #fff; outline-offset:2px; }
  .team-arrow{ transition:transform .3s cubic-bezier(.16,1,.3,1); }
  .team-btn-p:hover .team-arrow{ transform:translateX(3px); }
  .team-grid > *:nth-child(1) .team-card, .team-grid .team-card{ transition-delay:0ms; }
  .team-grid > *:nth-child(2) .team-card{ transition-delay:110ms; }
  .team-grid > *:nth-child(3) .team-card{ transition-delay:220ms; }
  .team-grid > *:nth-child(4) .team-card{ transition-delay:330ms; }
  .team-grid > .team-card:nth-child(2){ transition-delay:110ms; }
  .team-grid > .team-card:nth-child(3){ transition-delay:220ms; }
  .team-grid > .team-card:nth-child(4){ transition-delay:330ms; }
  @media (min-width:768px){ .team-card{ padding:28px; } }
  @media (min-width:1024px){ .team-grid{ grid-template-columns:repeat(2,1fr) !important; } }
  @media (max-width:479px){ .team-btns{ flex-direction:column !important; } }
  @media (prefers-reduced-motion:reduce){
    .team-card, .team-card:hover{ transform:none !important; transition:none !important; }
    .team-bignum{ transform:none !important; opacity:1 !important; }
  }
  /* Ordnungszahl: skaliert beim Reveal, Deckkraft bleibt bei 25% */
  [data-reveal="num"]{ opacity:1; transform:scale(.9); }
  [data-reveal="num"].inview{ opacity:1 !important; transform:none !important; }
  /* Ligatabelle-Link Hover-Pfeil */
  .lig-link:hover .team-arrow{ transform:translateX(4px); }
  /* Timeline-Verbindungslinie (Mitglied werden): zeichnet sich von links nach rechts */
  [data-reveal="line"]{ opacity:1; transform:scaleX(0); transform-origin:left; transition:transform .9s cubic-bezier(.16,1,.3,1); }
  [data-reveal="line"].inview{ opacity:1 !important; transform:scaleX(1) !important; }
  /* Footer: Link-Hover mit 4px-Verschiebung */
  .foot-link{ transition:color .25s ease, transform .25s ease; }
  .foot-link:hover{ color:#fff !important; transform:translateX(4px); }
  .foot-arrow{ transition:transform .3s cubic-bezier(.16,1,.3,1); }
  .foot-link:hover .foot-arrow{ transform:translate(3px,-3px); }
  /* Pill-Button "Zur Gesamtchronik" im Zitatkasten */
  .chron-pill{ transition:background-color .25s ease, transform .25s cubic-bezier(.16,1,.3,1), box-shadow .25s ease; }
  .chron-pill:hover{ background:var(--accent-bright) !important; transform:translateY(-2px); box-shadow:0 12px 28px rgba(30,123,255,.34) !important; }
  .chron-pill:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; }
  .chron-arrow{ transition:transform .3s cubic-bezier(.16,1,.3,1); }
  .chron-pill:hover .chron-arrow{ transform:translateX(3px); }
  /* Mobil: Button über die volle Kartenbreite, unter der Quellenangabe */
  @media (max-width:559px){ .chron-pill{ width:100%; } }
  @media (prefers-reduced-motion:reduce){ .chron-pill, .chron-pill:hover{ transform:none !important; } }
  /* Footer: Social-Kreise */
  .social-btn{ transition:background-color .3s ease, color .3s ease, border-color .3s ease; }
  .social-btn:hover{ background:var(--accent) !important; color:#fff !important; border-color:var(--accent) !important; }
  .legal-link{ transition:color .25s ease; }
  .legal-link:hover{ color:#fff !important; }
  /* Footer: Partnerlogos */
  .partner-logo{ opacity:.6; transition:opacity .3s ease; }
  .foot-partners .partner-logo{ min-width:0; }
  .foot-partners image-slot{ display:block; width:100%; max-width:100%; height:100%; }
  @media (min-width:768px) and (max-width:1023px){
    .foot-partners{ gap:24px !important; }
    .foot-partners .partner-logo{ height:110px !important; }
  }
  @media (max-width:767px){
    .foot-partners{ gap:20px !important; }
    .foot-partners .partner-logo{ min-width:0; height:100px !important; }
    .foot-partners image-slot{ display:block; width:100%; max-width:100%; height:100%; }
  }
  .partner-logo:hover{ opacity:1; }
  /* Skip-to-content nur bei Tastaturfokus sichtbar */
  .skip-link{ position:fixed; top:12px; left:12px; z-index:200; background:var(--accent); color:#fff; padding:12px 20px; border-radius:8px; font-size:14px; font-weight:600; transform:translateY(-160%); transition:transform .2s ease; }
  .skip-link:focus{ transform:translateY(0); color:#fff; }
  /* Nach-oben-Button */
  #pp-to-top{ opacity:0; transform:translateY(16px); pointer-events:none; transition:opacity .3s ease, transform .3s ease; }
  #pp-to-top.show{ opacity:1; transform:translateY(0); pointer-events:auto; }
  /* ===== Hero-Einblend-Choreografie: reine CSS-Keyframes, starten beim Laden ===== */
  @keyframes heroFadeUp{ from{ opacity:0; transform:translateY(24px); } to{ opacity:1; transform:translateY(0); } }
  @keyframes heroFadeDown{ from{ opacity:0; transform:translateY(-14px); } to{ opacity:1; transform:translateY(0); } }
  @keyframes heroFade{ from{ opacity:0; } to{ opacity:1; } }
  @keyframes heroScaleIn{ from{ opacity:0; transform:scale(.85); } to{ opacity:1; transform:scale(1); } }
  /* fill-mode:backwards → "from"-Frame (opacity:0) gilt schon während des Delays, aber nach dem Ende bleibt nichts stehen. Mit both blieb transform:translateY(0) zurück; Chrome legt für transformierte Elemente eine eigene Zeichenebene an und der backdrop-filter der Glass-Pille verlor damit seinen Hintergrund. */
  .hero-anim{ animation-duration:800ms; animation-timing-function:cubic-bezier(.16,1,.3,1); animation-fill-mode:backwards; }
  /* Glass-Pille: Animation auf die Hülle, damit backdrop-filter des Kindes sofort greift */
  #pp-pill-bg{ will-change:backdrop-filter; }
  .hero-up{ animation-name:heroFadeUp; }
  .hero-down{ animation-name:heroFadeDown; }
  .hero-in{ animation-name:heroFade; }
  .hero-scale{ animation-name:heroScaleIn; }
  /* ===== Social-Leiste am Hero-Fuß ===== */
  @keyframes chevBounce{ 0%,100%{ transform:translateY(0); } 50%{ transform:translateY(6px); } }
  .chev-bounce{ animation:chevBounce 2000ms ease-in-out infinite; }
  /* Scroll-Hinweis: Maus mit wanderndem Punkt (ab md) */
  @keyframes scrollDot{ 0%{ transform:translate(-50%,0); opacity:0; } 20%{ transform:translate(-50%,0); opacity:1; } 75%{ transform:translate(-50%,14px); opacity:1; } 100%{ transform:translate(-50%,18px); opacity:0; } }
  @keyframes scrollChevron{ 0%,100%{ transform:translateY(0); opacity:.5; } 50%{ transform:translateY(6px); opacity:1; } }
  .scroll-mouse{ display:none; }
  .scroll-chev{ display:none; }
  @media (min-width:768px){ .scroll-mouse{ display:flex; } }
  .scroll-dot{ animation:scrollDot 1900ms cubic-bezier(.4,0,.2,1) infinite; }
  .scroll-chevron{ animation:scrollChevron 2000ms ease-in-out infinite; }
  /* Sticky-Navbar: f\u00e4hrt von oben ein, sobald die Haupt-Nav aus dem Blick scrollt */
  #pp-sticky{ position:fixed; top:0; left:0; right:0; z-index:100; transform:translateY(-100%); transition:transform .4s cubic-bezier(.16,1,.3,1); pointer-events:none; }
  #pp-sticky.show{ transform:translateY(0); }
  #pp-sticky.show .pp-sticky-inner{ pointer-events:auto; }
  [data-mega]{ max-width:calc(100vw - 32px); }
  [data-mega] > *{ max-width:100%; }
  .pp-sticky-link{ font-family:Anton; font-size:17px; letter-spacing:.1em; color:rgba(255,255,255,.8); transition:color .15s; }
  .pp-sticky-link:hover{ color:#2B8CFF; }
  @media (max-width:935px){ #pp-sticky-links{ display:none !important; } #pp-sticky-burger{ display:flex !important; } }
  /* Unter 1025px keine schwebende Pillen-Nav — die Sticky-Nav ist von Anfang an sichtbar */
  @media (max-width:1024px){
    #pp-content > nav{ display:none !important; }
    #pp-sticky{ transform:none !important; pointer-events:auto !important; }
    #pp-sticky .pp-sticky-inner{ pointer-events:auto !important; }
  }
  @media (min-width:1025px){ #pp-sticky:not(.show) [data-mega]{ opacity:0 !important; visibility:hidden !important; pointer-events:none !important; } }
  /* Haupt-Nav-Mega-Men\u00fcs ausblenden, sobald die Sticky-Bar aktiv ist (geteilter Hover-State) */
  #pp-root.sticky-active #pp-nav-right [data-mega]{ opacity:0 !important; visibility:hidden !important; pointer-events:none !important; }
  /* Logo-Bild weich einblenden (verhindert harten Cut beim späten Laden) */
  #pp-logo, #pp-logo * { animation:heroFade 900ms ease both; animation-delay:200ms; }
  @media (prefers-reduced-motion: reduce){ #pp-logo, #pp-logo * { animation:none !important; } }
  .scroll-hint:hover .scroll-mouse-outline{ border-color:rgba(255,255,255,.85) !important; }
  .scroll-hint:hover #pp-social-scroll-text{ color:#fff !important; }
  .soc-link{ position:relative; display:flex; align-items:center; justify-content:center; padding:13px; color:rgba(255,255,255,.55); transition:color .25s ease, transform .25s ease; }
  .soc-link:hover{ color:#fff; transform:translateY(-2px); }
  .soc-label{ position:absolute; bottom:100%; left:50%; transform:translateX(-50%) translateY(6px); opacity:0; pointer-events:none; white-space:nowrap; font-size:11px; color:#fff; background:rgba(16,26,46,.85); border-radius:999px; padding:4px 12px; transition:opacity .25s ease, transform .25s ease; }
  .soc-link:hover .soc-label{ opacity:1; transform:translateX(-50%) translateY(0); }
  /* Kanal-Karten am Hero-Fuß */
  .soc-card{ transition:background-color .25s ease, border-color .25s ease, transform .25s ease; }
  .soc-card:hover{ transform:translateY(-3px); }
  .soc-card-ic{ transition:color .25s ease; flex:none; }
  .soc-card:focus-visible{ outline:2px solid #2B8CFF; outline-offset:3px; }
  .soc-ig .soc-card-ic{ color:rgba(225,48,108,.75); }
  .soc-ig:hover{ background:rgba(225,48,108,.15) !important; border-color:#E1306C !important; }
  .soc-ig:hover .soc-card-ic{ color:#E1306C; }
  .soc-fb .soc-card-ic{ color:rgba(24,119,242,.75); }
  .soc-fb:hover{ background:rgba(24,119,242,.15) !important; border-color:#1877F2 !important; }
  .soc-fb:hover .soc-card-ic{ color:#1877F2; }
  .soc-yt .soc-card-ic{ color:rgba(255,0,0,.75); }
  .soc-yt:hover{ background:rgba(255,0,0,.15) !important; border-color:#FF0000 !important; }
  .soc-yt:hover .soc-card-ic{ color:#FF0000; }
  .soc-tw .soc-card-ic{ color:rgba(145,70,255,.75); }
  .soc-tw:hover{ background:rgba(145,70,255,.15) !important; border-color:#9146FF !important; }
  .soc-tw:hover .soc-card-ic{ color:#9146FF; }
  .soc-wa .soc-card-ic{ color:rgba(37,211,102,.75); }
  .soc-wa:hover{ background:rgba(37,211,102,.15) !important; border-color:#25D366 !important; }
  .soc-wa:hover .soc-card-ic{ color:#25D366; }
  @media (max-width:1279px){
    #pp-social-row{ flex-direction:column !important; align-items:stretch !important; gap:14px !important; }
  }
  @media (min-width:1024px) and (max-width:1279px){
    #pp-content{ padding-bottom:300px !important; }
  }
  @media (max-width:1023px){
    #pp-social-cards{ display:grid !important; grid-template-columns:repeat(3,1fr) !important; }
  }
  @media (max-width:767px){
    #pp-social-cards{ grid-template-columns:repeat(2,1fr) !important; }
    #pp-content{ padding-bottom:0 !important; }
  }
  @media (max-width:479px){
    #pp-social-cards{ grid-template-columns:repeat(3,1fr) !important; }
  }
  @media (max-width:479px){
    #pp-content{ padding-bottom:0 !important; }
    .soc-card{ justify-content:center !important; }
    .soc-card-txt{ display:none !important; }
  }
  @media (min-width:1024px) and (max-height:700px){ #pp-social-prompt{ display:none !important; } }
  /* Flache Bildschirme, etwa ein Tablet im Querformat (gemessen
     1097x511). Vorher stand hier display:none; das nahm zugleich
     autoScrollToContent sein Ziel.

     position:relative statt static ist zwingend. Die Leiste liegt
     direkt im Hero, neben den absolut gesetzten Bildebenen, und
     die spannen ueber die volle Hoehe. Ein Element ohne
     Positionierung wird vor allen positionierten Geschwistern
     gezeichnet, also darunter - der z-index:15 bliebe wirkungslos,
     denn er greift nur bei positionierten Elementen. Mit static
     war die Leiste vorhanden und gemessen 1097x67 gross, aber
     nirgends zu sehen.

     Die beiden Regeln zur Hero-Geometrie gehoeren dazu: ohne sie
     bleibt der Hero auf min-height:100vh plus 200px Innenabstand
     stehen, und die Leiste rutscht auf Dokumentposition 865 - bei
     511px Fensterhoehe fast zwei Bildschirme tief.

     Der Abstandhalter zwischen Pille und Hero-Text bleibt
     ausdruecklich stehen. Unterhalb von 1024px wird er
     ausgeblendet, dort ersetzt ihn aber ein padding-top am
     Inhaltsbereich. Wird er hier ohne Ersatz entfernt, rutscht
     der Kicker unter die Navigationspille. Sein flex-grow
     stoert nicht mehr, weil min-height:0 keinen Ueberschuss
     mehr zu verteilen laesst - er bleibt auf 46px. */
  @media (min-width:1024px) and (max-height:560px){
    #pp-root{ min-height:0 !important; }
    #pp-content{ min-height:0 !important; padding-bottom:0 !important; }
    #pp-social{ position:relative !important; z-index:15; padding-top:0 !important; background:none !important; }
    #pp-social .scroll-hint{ display:none !important; }
    #pp-social-row{ border-top:none !important; padding-bottom:24px !important; }
  }
  #pp-root.menu-open #pp-content{ z-index:70 !important; }
  /* Social-Leiste dockt unter der Sticky-Nav an */
  #pp-social.pinned{ position:fixed !important; top:var(--pin-top,64px) !important; bottom:auto !important; left:0; right:0; z-index:95; padding-top:0 !important; background:none !important; transition:top .3s cubic-bezier(.16,1,.3,1); }
  #pp-social.pinned .scroll-hint{ display:none !important; }
  /* angedockt: wie die Sticky-Nav auf die Containerbreite begrenzen, damit die Außenränder unberührt bleiben */
  #pp-social.pinned > div:last-child{ max-width:1600px; margin:0 auto; }
  #pp-social.pinned #pp-social-row{ border-top:none !important; border-bottom:none !important; box-shadow:none !important; }
  #pp-root.menu-open #pp-social.pinned{ display:none !important; }
  @media (prefers-reduced-motion: reduce){ .chev-bounce{ animation:none !important; } .scroll-dot{ animation:none !important; opacity:1 !important; transform:translate(-50%,7px) !important; } .scroll-chevron{ animation:none !important; opacity:1 !important; } }
  @media (prefers-reduced-motion: reduce){
    .hero-anim{ animation:none !important; opacity:1 !important; transform:none !important; }
  }
  /* Einmalige Einblendung des ersten Hintergrundbildes (legt sich vor Ken-Burns/Crossfade) */
  @keyframes heroBgFade{ from{ opacity:0; } to{ opacity:1; } }
  @keyframes heroBgScale{ from{ transform:scale(1.06); } to{ transform:scale(1); } }
  /* Nur weiches Einblenden, kein Heranzoomen beim Seitenaufruf */
  .hero-bg-intro{ animation:heroBgFade 1200ms ease both; }
  /* Historie-Scrollytelling: aktive Epoche voll deckend */
  .era{ opacity:.35; transition:opacity .5s ease; }
  .era.active{ opacity:1; }
  @keyframes histIn{ from{opacity:0; transform:translateY(20px);} to{opacity:1; transform:none;} }
  /* Responsives Raster (nur Standard-Breakpoints) */
  @media (min-width:640px){ .stat-grid{ grid-template-columns:repeat(2,1fr) !important; } }
  @media (min-width:640px){ .venue-feat-grid{ grid-template-columns:repeat(2,1fr) !important; } }
  @media (min-width:768px){ .ev-grid{ grid-template-columns:repeat(3,1fr) !important; } .sec-head{ grid-template-columns:1.1fr .9fr !important; } }
  @media (min-width:768px){ .join-steps{ grid-template-columns:repeat(3,1fr) !important; } .join-line{ display:block !important; } .join-cta{ grid-template-columns:3fr 2fr !important; align-items:center !important; } .foot-main{ grid-template-columns:repeat(2,1fr) !important; } .foot-partners{ grid-template-columns:repeat(4,1fr) !important; } .foot-bottom{ flex-direction:row !important; align-items:center !important; justify-content:space-between !important; } }
  @media (min-width:1024px){
    .foot-main{ grid-template-columns:2fr 1fr 1fr 1fr !important; }
    .venue-grid{ grid-template-columns:1fr 1fr !important; }
    .venue-feat-grid{ grid-template-columns:repeat(4,1fr) !important; }
  }
  @media (min-width:1024px){
    .stat-grid{ grid-template-columns:repeat(4,1fr) !important; }
    .hist-grid{ grid-template-columns:40% 60% !important; }
    .era-year-inline{ display:none !important; }
  }
  @media (max-width:1023px){
    .hist-sticky{ display:none !important; }
    .era{ opacity:1 !important; }
  }
  @media (prefers-reduced-motion: reduce){
    [data-reveal]{ opacity:1 !important; transform:none !important; }
    .lazy-img{ opacity:1 !important; }
    [data-ev-card], [data-ev-img], [data-ev-arrow]{ transition:none !important; }
  }

  /* ===== Unterseite Chronik: Erfolgskurve ===== */
  /* Der Scroller clippt in beiden Achsen (overflow-x:auto erzwingt overflow-y:auto),
     daher oben/seitlich Platz für die Hover-Labels reservieren. */
  .vg-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch; padding:74px 0 6px; }
  .vg-axis-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch; }
  .vg-chart{ position:relative; aspect-ratio:1000/320; min-width:1040px; }
  @media (min-width:1024px){ .vg-chart{ min-width:0; } .vg-hint{ display:none !important; } }
  /* Zeichenanimation als Wisch von links nach rechts: rein geometrisch, ohne
     Längenberechnung — dadurch auf jeder Bildschirmbreite exakt vollständig. */
  @keyframes vgDraw{ from{ clip-path:inset(-20% 100% -20% -2%); } to{ clip-path:inset(-20% -2% -20% -2%); } }
  .vg-line{ clip-path:inset(-20% 100% -20% -2%); }
  .vg-line.inview{ animation:vgDraw 1800ms cubic-bezier(.32,.72,.3,1) forwards; }
  .vg-pt{ position:absolute; width:30px; height:30px; margin:-15px 0 0 -15px; padding:0; border:none; background:none; cursor:pointer; opacity:0; transition:opacity .45s ease; }
  .vg-pt.inview{ opacity:1; }
  .vg-dot{ position:absolute; left:50%; top:50%; width:15px; height:15px; margin:-7.5px 0 0 -7.5px; border-radius:999px; border:3px solid #101A2E; transition:transform .2s ease; }
  .vg-pt:hover .vg-dot, .vg-pt:focus-visible .vg-dot{ transform:scale(1.35); }
  .vg-tip{ position:absolute; left:50%; bottom:calc(100% + 10px); transform:translate(-50%,6px); opacity:0; pointer-events:none; white-space:nowrap; text-align:left; background:#1B2942; border:1px solid rgba(255,255,255,.14); border-radius:10px; padding:8px 12px; box-shadow:0 10px 30px rgba(0,0,0,.45); transition:opacity .2s ease, transform .2s ease; z-index:5; }
  .vg-pt:hover .vg-tip, .vg-pt:focus-visible .vg-tip{ opacity:1; transform:translate(-50%,0); }
  /* Randnahe Punkte: Label statt zentriert an der Kante ausrichten bzw. nach unten kippen */
  .vg-tip.at-left{ left:0; transform:translate(-6px,6px); }
  .vg-pt:hover .vg-tip.at-left, .vg-pt:focus-visible .vg-tip.at-left{ transform:translate(-6px,0); }
  .vg-tip.at-right{ left:auto; right:0; transform:translate(6px,6px); }
  .vg-pt:hover .vg-tip.at-right, .vg-pt:focus-visible .vg-tip.at-right{ transform:translate(6px,0); }
  .vg-tip.below{ bottom:auto; top:calc(100% + 10px); }
  .vg-tip-y{ font-family:'Anton',sans-serif; font-size:15px; color:#fff; letter-spacing:.02em; }
  .vg-tip-t{ font-size:12px; color:var(--muted-on-dark); margin-top:2px; }
  .vg-axis{ position:relative; height:22px; margin-top:10px; min-width:1040px; }
  @media (min-width:1024px){ .vg-axis{ min-width:0; } }
  .vg-axis span{ position:absolute; transform:translateX(-50%); font-size:13px; color:var(--muted-on-dark); font-variant-numeric:tabular-nums; }
  /* ===== Unterseite Chronik: Timeline ===== */
  .vg-grid{ display:grid; grid-template-columns:1fr; gap:40px; }
  .vg-sticky{ position:sticky; top:104px; }
  .vg-era{ opacity:.4; transition:opacity .5s ease; }
  .vg-era.active{ opacity:1; }
  @keyframes vgYearIn{ from{ opacity:0; transform:translateY(16px); } to{ opacity:1; transform:none; } }
  .vg-year-in{ animation:vgYearIn .4s cubic-bezier(.16,1,.3,1) both; }
  .vg-year-inline{ display:block; }
  @media (min-width:1024px){
    .vg-grid{ grid-template-columns:38% 1fr; gap:clamp(3rem,6vw,5rem); }
    .vg-year-inline{ display:none; }
  }
  @media (max-width:1023px){ .vg-side{ display:none !important; } .vg-era{ opacity:1 !important; } }
  @media (prefers-reduced-motion: reduce){
    .vg-line{ clip-path:none !important; animation:none !important; }
    .vg-pt{ opacity:1 !important; }
    .vg-era{ opacity:1 !important; }
    .vg-year-in{ animation:none !important; }
  }

  /* ===== Unterseite Tischfußball ===== */
  .tf-topics{ display:grid; grid-template-columns:1fr; gap:20px; }
  @media (min-width:768px){ .tf-topics{ grid-template-columns:repeat(3,1fr); } }
  .tf-topic svg{ opacity:.85; transition:opacity .3s ease; }
  .tf-topic:hover svg{ opacity:1; }
  .tf-grid-6{ display:grid; grid-template-columns:repeat(2,1fr); gap:clamp(1.5rem,3vw,2.5rem) clamp(1rem,3vw,2rem); }
  @media (min-width:768px){ .tf-grid-6{ grid-template-columns:repeat(3,1fr); } }
  @media (min-width:1280px){ .tf-grid-6{ grid-template-columns:repeat(6,1fr); } }
  .tf-tl{ display:grid; grid-template-columns:1fr; gap:20px; }
  @media (min-width:1024px){
    .tf-tl{ grid-template-columns:repeat(6,1fr); gap:0; position:relative; }
    .tf-tl::before{ content:""; position:absolute; left:0; right:0; top:9px; height:2px; background:rgba(255,255,255,.14); }
  }
  .tf-cards{ display:grid; grid-template-columns:1fr; gap:20px; }
  @media (min-width:640px){ .tf-cards{ grid-template-columns:repeat(2,1fr); } }
  @media (min-width:1024px){ .tf-cards{ grid-template-columns:repeat(3,1fr); } }
  .tf-card{ transition:transform .3s cubic-bezier(.16,1,.3,1), box-shadow .3s ease, border-color .3s ease; }
  .tf-card:hover{ transform:translateY(-4px); box-shadow:0 18px 46px rgba(15,21,32,.16); }
  .tf-card-img{ transition:transform .5s cubic-bezier(.16,1,.3,1); }
  .tf-card:hover .tf-card-img{ transform:scale(1.04); }
  .tf-ext{ transition:color .2s ease; }
  .tf-ext:hover{ color:var(--accent-bright) !important; }
  .tf-tier{ transition:transform .3s cubic-bezier(.16,1,.3,1); }
  /* Logoplatte: mobil kompakt, ab sm größer — Stufen bleiben auch schmal lesbar */
  .tf-tier-logo{ width:52px; height:52px; }
  @media (min-width:640px){ .tf-tier-logo{ width:64px; height:64px; } }
  @media (min-width:1024px){ .tf-tier-logo{ width:76px; height:76px; } }
  /* Auf schmalen Bildschirmen alle Stufen volle Breite, sonst wird der Text gequetscht */
  @media (max-width:767px){ .tf-tier{ width:100% !important; } }
  .tf-tier:hover{ transform:translateX(4px); }
  @media (prefers-reduced-motion: reduce){
    .tf-card:hover{ transform:none; } .tf-card:hover .tf-card-img{ transform:none; } .tf-tier:hover{ transform:none; }
  }

  /* ===== Unterseite Höhepunkte ===== */
  .hp-stats{ display:grid; grid-template-columns:repeat(2,1fr); gap:clamp(2rem,4vw,3rem) clamp(1rem,3vw,2rem); }
  @media (min-width:1024px){ .hp-stats{ grid-template-columns:repeat(4,1fr); } }
  .hp-hof{ display:grid; grid-template-columns:1fr; gap:20px; }
  @media (min-width:640px){ .hp-hof{ grid-template-columns:repeat(2,1fr); } }
  @media (min-width:1024px){ .hp-hof{ grid-template-columns:repeat(3,1fr); } }
  .hp-card{ transition:transform .3s cubic-bezier(.16,1,.3,1), box-shadow .3s ease, border-color .3s ease; }
  .hp-card:hover{ transform:translateY(-4px); box-shadow:0 18px 46px rgba(15,21,32,.16); border-color:rgba(30,123,255,.45); }
  .hp-av{ transition:box-shadow .3s ease, transform .3s ease; }
  .hp-card:hover .hp-av{ box-shadow:0 0 0 6px rgba(30,123,255,.14), 0 10px 26px rgba(30,123,255,.3); }
  .hp-pill{ transition:background-color .25s ease, border-color .25s ease, color .25s ease; }
  .hp-pill:hover{ border-color:rgba(255,255,255,.5); }
  .hp-cat{ transition:border-color .3s ease, background-color .3s ease; }
  .hp-cat:hover{ border-color:rgba(255,255,255,.28); }
  .hp-cat-head{ transition:background-color .25s ease; }
  .hp-cat-head:hover{ background:rgba(255,255,255,.05); }
  .hp-chev{ transition:transform .3s cubic-bezier(.16,1,.3,1); }
  /* Lange Kategorienamen dürfen umbrechen, nie unter die Pillen laufen */
  .hp-cat-title{ overflow-wrap:anywhere; hyphens:auto; }
  /* Mobil: Titel in eigene Zeile, Pillen darunter, Chevron oben rechts */
  @media (max-width:639px){
    .hp-cat-head{ flex-wrap:wrap; row-gap:10px; column-gap:8px; position:relative; padding-right:46px !important; }
    .hp-cat-title{ flex:1 1 100% !important; }
    .hp-chev{ position:absolute; right:16px; top:20px; }
  }
  /* Aufklappen: Höhe über grid-template-rows animieren (0fr → 1fr) */
  .hp-panel{ display:grid; transition:grid-template-rows .3s cubic-bezier(.16,1,.3,1), opacity .3s ease; }
  .hp-panel > div{ overflow:hidden; min-height:0; }
  .hp-rows{ display:grid; grid-template-columns:1fr; gap:8px; }
  @media (min-width:1024px){ .hp-rows{ grid-template-columns:repeat(2,1fr); } }
  @media (prefers-reduced-motion: reduce){
    .hp-card:hover{ transform:none; }
    .hp-panel{ transition:none !important; }
    .hp-chev{ transition:none !important; }
  }

  /* ===== Unterseite "Unser Spielort" ===== */
  /* Galerien: gleichmäßige Raster, Bilder im Verhältnis 16:9.
     Mobil 1 Spalte, ab 640 px 2, ab 1024 px 3 (Tische) bzw. 4 (Location). */
  .sp-galx{ display:grid; grid-template-columns:1fr; gap:16px; }
  .sp-gal-item{ position:relative; overflow:hidden; border-radius:16px; padding:0; border:1px solid rgba(255,255,255,.12); background:rgba(255,255,255,.04); cursor:zoom-in; text-align:left; display:flex; flex-direction:column; transition:transform .35s cubic-bezier(.16,1,.3,1), border-color .3s ease; }
  .sp-gal-item:hover{ transform:translateY(-3px); border-color:rgba(255,255,255,.28); }
  .sp-gal-item:focus-visible{ outline:2px solid var(--accent-bright); outline-offset:3px; }
  .sp-gal-bild{ display:block; width:100%; aspect-ratio:16/9; background:rgba(255,255,255,.04); flex:none; }
  .sp-gal-bild img{ display:block; width:100%; height:100%; object-fit:cover; }
  .sp-gal-text{ display:block; padding:14px clamp(14px,1.6vw,18px) clamp(16px,1.8vw,20px); color:var(--muted-on-dark); font-size:15px; line-height:1.65; text-wrap:pretty; }
  /* Abschlusstext und Preiskasten nebeneinander */
  .sp-abschluss{ display:grid; grid-template-columns:1fr; gap:clamp(20px,3vw,36px); align-items:start; }
  @media (min-width:1024px){ .sp-abschluss{ grid-template-columns:1.5fr 1fr; } }
  .sp-preis-zeile{ display:flex; align-items:baseline; justify-content:space-between; gap:18px; padding:12px 0; border-bottom:1px dashed rgba(255,255,255,.2); }
  .sp-preis-zeile:last-child{ border-bottom:0; padding-bottom:2px; }
  @media (min-width:640px){ .sp-galx{ grid-template-columns:repeat(2,1fr); } }
  @media (min-width:1024px){
    .sp-gal-3{ grid-template-columns:repeat(3,1fr); }
    .sp-gal-4{ grid-template-columns:repeat(4,1fr); }
  }
  /* Lightbox */
  .sp-lb-btn{ display:flex; align-items:center; justify-content:center; width:48px; height:48px; border-radius:9999px; border:1px solid rgba(255,255,255,.28); background:rgba(255,255,255,.08); color:#fff; cursor:pointer; transition:background-color .2s ease, border-color .2s ease; }
  .sp-lb-btn:hover{ background:rgba(255,255,255,.18); border-color:rgba(255,255,255,.5); }
  .sp-lb-btn:focus-visible{ outline:2px solid #fff; outline-offset:2px; }
  /* Karte */
  .sp-map{ position:relative; overflow:hidden; border-radius:16px; box-shadow:0 18px 48px rgba(15,21,32,.16); aspect-ratio:4/3; background:var(--bg-light-alt); }
  .sp-map iframe{ position:absolute; inset:0; width:100%; height:100%; border:0; display:block; }
  @media (min-width:768px){ .sp-map{ aspect-ratio:16/9; } }
  @media (min-width:1024px){ .sp-map{ aspect-ratio:21/9; } }
  /* Outline-Button auf hellem Grund */
  .sp-btn-o{ transition:background-color .25s ease, border-color .25s ease; }
  .sp-btn-o:hover{ background:rgba(30,123,255,.08) !important; border-color:var(--accent) !important; }
  .sp-btn-o:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; }
  /* Zwei Spalten (Bewirtung / Ausstattung) */
  .sp-two{ display:grid; grid-template-columns:1fr; gap:clamp(20px,3vw,36px); align-items:start; }
  @media (min-width:1024px){ .sp-two{ grid-template-columns:1fr 1fr; } }
  /* Ausstattungs-Grid */
  .sp-feat{ display:grid; grid-template-columns:1fr; gap:14px; }
  @media (min-width:480px){ .sp-feat{ grid-template-columns:repeat(2,1fr); } }
  .sp-feat-card{ transition:transform .3s cubic-bezier(.16,1,.3,1), border-color .3s ease; }
  .sp-feat-card:hover{ transform:translateY(-3px); border-color:rgba(255,255,255,.28); }
  .sp-textlink{ transition:color .2s ease; }
  .sp-textlink:hover{ color:var(--accent-bright) !important; }
  .sp-textlink:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; }
  .sp-textlink .sp-arrow{ transition:transform .3s cubic-bezier(.16,1,.3,1); }
  .sp-textlink:hover .sp-arrow{ transform:translateX(4px); }
  @media (prefers-reduced-motion:reduce){
    .sp-gal-item, .sp-gal-item:hover, .sp-feat-card, .sp-feat-card:hover{ transform:none !important; transition:none !important; }
  }



@keyframes megaRow{ from{ opacity:0; transform:translateY(-6px); } to{ opacity:1; transform:translateY(0); } }
.mega-action:hover{ background:linear-gradient(110deg, rgba(30,123,255,.34), rgba(30,123,255,.12)) !important; border-color:rgba(43,140,255,.5) !important; }
.mega-action:hover .mega-arrow{ transform:translateX(4px); }
.mega-arrow{ transition:transform .3s cubic-bezier(.16,1,.3,1); }
.mega-row:focus-visible{ outline:2px solid #2B8CFF; outline-offset:2px; }
/* Hervorhebung des Eintrags rein per Hover/Fokus — kein State nötig */
.mega-row:hover, .mega-row:focus-visible{ background:rgba(255,255,255,.07) !important; }
.mega-row:hover .mega-bar, .mega-row:focus-visible .mega-bar{ opacity:1 !important; }
.mega-row:hover .mega-title, .mega-row:focus-visible .mega-title{ color:#fff; }
.mega-ic svg{ stroke:rgba(255,255,255,.5); transition:stroke .25s ease; }
.mega-row:hover .mega-ic svg, .mega-row:focus-visible .mega-ic svg{ stroke:#2B8CFF; }
@media (prefers-reduced-motion: reduce){ .mega-row{ animation:none !important; } }

/* -------------------------------------------------------------
   Hover- und Aktiv-Zustaende

   In der HTML-Vorlage standen diese Zustaende als Attribut
   style-hover bzw. style-active am Element; die Laufzeit erzeugte
   daraus Klassen und schrieb die Regeln direkt ins Stylesheet-
   Objekt. Hier stehen sie als normales CSS.

   Die Klassennamen tragen den Namen der Herkunftsseite, weil die
   urspruengliche Nummerierung pro Seite lief und sich sonst
   widersprechen wuerde.
   ------------------------------------------------------------- */

/* Pixel Paragon Hero.dc.html */
.kscp-home-0:hover { background: linear-gradient(90deg, rgb(30, 123, 255), rgb(43, 140, 255)) !important; }
.kscp-home-1:active { transform: scale(0.97) !important; }
.kscp-home-2:hover { background: rgba(255, 255, 255, 0.06) !important; border-color: rgba(255, 255, 255, 0.45) !important; }
.kscp-home-3:hover { background: var(--accent-bright) !important; color: rgb(255, 255, 255) !important; }
.kscp-home-4:hover { background: rgb(30, 123, 255) !important; color: rgb(255, 255, 255) !important; }
.kscp-home-5:hover { color: rgb(43, 140, 255) !important; }
.kscp-home-6:hover { background: rgb(30, 123, 255) !important; }
.kscp-home-7:active { transform: scale(0.96) !important; }
.kscp-home-8:hover { background: rgb(43, 140, 255) !important; }
.kscp-home-9:active { transform: scale(0.94) !important; }

/* Vereinsgeschichte.dc.html */
.kscp-vereinsgeschichte-0:hover { background: rgb(30, 123, 255) !important; color: rgb(255, 255, 255) !important; }
.kscp-vereinsgeschichte-1:hover { color: rgb(43, 140, 255) !important; }
.kscp-vereinsgeschichte-2:hover { background: rgb(30, 123, 255) !important; }
.kscp-vereinsgeschichte-3:active { transform: scale(0.96) !important; }
.kscp-vereinsgeschichte-4:hover { background: rgb(43, 140, 255) !important; }
.kscp-vereinsgeschichte-5:active { transform: scale(0.94) !important; }

/* Tischfussball.dc.html */
.kscp-tischfussball-0:hover { transform: translateY(-4px) !important; border-color: rgba(255, 255, 255, 0.18) !important; background: rgba(255, 255, 255, 0.07) !important; }
.kscp-tischfussball-1:hover { background: rgb(30, 123, 255) !important; color: rgb(255, 255, 255) !important; }
.kscp-tischfussball-2:hover { color: rgb(43, 140, 255) !important; }
.kscp-tischfussball-3:hover { background: rgb(30, 123, 255) !important; }
.kscp-tischfussball-4:active { transform: scale(0.96) !important; }
.kscp-tischfussball-5:hover { background: rgb(43, 140, 255) !important; }
.kscp-tischfussball-6:active { transform: scale(0.94) !important; }

/* Hoehepunkte.dc.html */
.kscp-hoehepunkte-0:hover { background: rgb(30, 123, 255) !important; color: rgb(255, 255, 255) !important; }
.kscp-hoehepunkte-1:hover { color: rgb(43, 140, 255) !important; }
.kscp-hoehepunkte-2:hover { background: rgb(30, 123, 255) !important; }
.kscp-hoehepunkte-3:active { transform: scale(0.96) !important; }
.kscp-hoehepunkte-4:hover { background: rgb(43, 140, 255) !important; }
.kscp-hoehepunkte-5:active { transform: scale(0.94) !important; }

/* Spielort.dc.html */
.kscp-spielort-0:hover { background: rgb(30, 123, 255) !important; color: rgb(255, 255, 255) !important; }
.kscp-spielort-1:hover { color: rgb(43, 140, 255) !important; }
.kscp-spielort-2:hover { background: rgb(30, 123, 255) !important; }
.kscp-spielort-3:active { transform: scale(0.96) !important; }
.kscp-spielort-4:hover { background: rgb(43, 140, 255) !important; }
.kscp-spielort-5:active { transform: scale(0.94) !important; }



/* ---------------------------------------------------------------
   Ergaenzungen fuer die Joomla-Ausgabe
   --------------------------------------------------------------- */

/* Sprungmarke fuer Tastaturnutzung */
.ksc-skip {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 200;
  padding: 12px 18px;
  background: #2B8CFF;
  color: #fff;
  border-radius: 0 0 8px 0;
}
.ksc-skip:focus { left: 0; }

/* Joomla-Systemmeldungen im Seitendesign.
   Bewusst auf den Meldungsbehaelter begrenzt: frueher galt die Regel
   fuer jedes .alert unter #ksc-content und faerbte damit auch die
   Meldungskaesten in Beitraegen weiss auf hellem Grund. */
#system-message-container .alert,
#ksc-content > joomla-alert .alert {
  max-width: 1280px;
  margin: 0 auto;
  padding: 14px 18px;
  border-radius: 12px;
  background: rgba(255, 255, 255, .08);
  border: 1px solid rgba(255, 255, 255, .14);
  color: #fff;
}

/* ---------------------------------------------------------------
   Hero-Hoehe auf flachen Desktop-Bildschirmen
   ---------------------------------------------------------------
   Der Hero steht auf min-height:100vh. Alle Schriftgroessen darin
   haengen an der Breite, nie an der Hoehe - der Textblock ist auf
   einem 1080p- und einem 1440p-Bildschirm also gleich hoch in
   Pixeln. Auf dem flacheren Schirm passt er nicht mehr in die
   Sichthoehe, der Hero waechst darueber hinaus und die Social-
   Leiste am unteren Rand rutscht unter die Sichtkante.

   Gemessen bei 947 px Sichthoehe (1080p mit Browserleiste):

     Navigation                       91 px
     dehnbarer Zwischenraum oben      85 px
     Textblock (#pp-upper)           662 px
     dehnbarer Zwischenraum unten     57 px
     leere Zeile (#pp-lower)          44 px
     Reserve fuer die Leiste         150 px
                                  = 1089 px, also 142 px zu viel

   Gegenmittel: die senkrechten Abstaende an die Viewport-Hoehe
   koppeln. Schriftgroessen bleiben unangetastet. Jede Rampe ist so
   gelegt, dass sie bei 947 px ihre Untergrenze und ab 1330 px den
   urspruenglichen Wert erreicht - auf hohen Bildschirmen aendert
   sich damit nichts. Die Werte ueberschreiben Angaben im
   style-Attribut und brauchen deshalb !important. */
@media (min-width: 1024px) {

  /* --- Abstaende oberhalb des Textblocks --- */
  #pp-content > nav { padding-top: clamp(22px, calc(4.18vh - 17.6px), 38px) !important; }
  #pp-content > div[style*="1.15 1 auto"] {
    min-height: clamp(40px, calc(20.8vh - 157px), 130px) !important;
  }

  /* --- Abstaende innerhalb des Textblocks --- */
  #pp-hero-text > div:first-child { margin-bottom: clamp(14px, 1.8vh, 24px) !important; }
  #pp-hero-text > p { margin-top: clamp(18px, 2.25vh, 30px) !important; }
  #pp-stats {
    margin-top: clamp(24px, 3vh, 40px) !important;
    margin-bottom: clamp(12px, 1.5vh, 20px) !important;
  }
  #pp-cta { margin-top: clamp(14px, 1.8vh, 24px) !important; }

  /* --- Abstaende unterhalb des Textblocks --- */
  #pp-content > div[style*="6vh"] {
    min-height: clamp(32px, calc(12.5vh - 86px), 80px) !important;
  }
  #pp-lower { padding-bottom: clamp(0px, calc(11.5vh - 109px), 44px) !important; }
  #pp-content { padding-bottom: clamp(120px, calc(20.9vh - 78px), 200px) !important; }

  /* --- Die Social-Leiste selbst ---
     Sie ist 268 px hoch, davon oben 78 px durchsichtiger Verlauf.
     Sichtbar sind rund 190 px, die unter dem WhatsApp-Kasten Platz
     brauchen. Unter der Leiste stehen nach obiger Rechnung nur noch
     152 px zur Verfuegung, deshalb ruecken auch ihre eigenen
     Abstaende zusammen - Schriftgroessen bleiben auch hier gleich. */
  #pp-social { gap: clamp(8px, calc(4.7vh - 36.5px), 26px) !important; }
  #pp-social .scroll-hint { gap: clamp(6px, calc(1.05vh - 3.9px), 10px) !important; }
  #pp-social-row {
    padding-top: clamp(10px, calc(3.13vh - 19.7px), 22px) !important;
    padding-bottom: clamp(10px, calc(3.13vh - 19.7px), 22px) !important;
  }
}

/* ---------------------------------------------------------------
   Leuchtspur auf der Rueckseite der Termin-Karten

   Die Spur laeuft mit offset-path entlang des Rahmens. Sichtbar ist
   sie nur im 1px breiten Rahmen - das innere Feld der Rueckseite
   liegt darueber und verdeckt den Rest. Dass sie auf der
   Vorderseite nicht erscheint, ergibt sich aus dem
   backface-visibility: hidden der Rueckseite.

   offset-path gibt es seit 2022 breit, die Schreibweise mit
   border-box ist juenger. Ohne Unterstuetzung bleibt die Spur
   ausgeblendet; die Karte sieht dann aus wie zuvor.
   --------------------------------------------------------------- */
.ksc-trail { display: none; }

@supports (offset-path: border-box) {
  .ksc-trail {
    display: block;
    position: absolute;
    width: 25%;
    aspect-ratio: 2 / 1;
    background: radial-gradient(100% 100% at right, #2ea3db, transparent 50%);
    offset-path: border-box;
    offset-anchor: 100% 50%;
    animation: ksc-trail-journey 6s infinite linear;
    pointer-events: none;
  }
}

@keyframes ksc-trail-journey {
  to { offset-distance: 100%; }
}

@media (prefers-reduced-motion: reduce) {
  .ksc-trail { display: none; }
}

/* ---------------------------------------------------------------
   Beitragsansicht (com_content, Ansicht "Beitrag")
   Heller Bereich zwischen Kopf- und Fussbereich. Oben und unten
   je ein Verlauf, damit keine harte Kante entsteht - dasselbe
   Muster wie am Kopf der News-Sektion auf der Startseite.
   --------------------------------------------------------------- */

.ksc-artikel {
  --ksc-chevrons: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5 4l8 8-8 8M13 4l8 8-8 8' fill='none' stroke='%23000' stroke-width='2.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  position: relative;
  display: flow-root;
  background: var(--bg-light);
  color: var(--text-on-light);
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  padding: clamp(6rem, 10vw, 10rem) 0 calc(clamp(1.5rem, 2.5vw, 2.5rem) + 200px);
}

.ksc-artikel-verlauf-oben,
.ksc-artikel-verlauf-unten {
  position: absolute;
  left: 0;
  right: 0;
  pointer-events: none;
}

.ksc-artikel-verlauf-oben {
  top: 0;
  height: 180px;
  background: linear-gradient(to bottom,
    var(--bg-dark) 0%,
    color-mix(in srgb, var(--bg-dark) 60%, var(--bg-light)) 40%,
    color-mix(in srgb, var(--bg-dark) 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

/* Der Fussbereich traegt an seinem oberen Rand einen eigenen Schleier
   (rgba(244,247,250,.165) ueber --bg-deep). Seine oberste Zeile ist
   dadurch nicht --bg-deep, sondern #363F50. Endet der Verlauf auf
   --bg-deep, entsteht genau an der Naht eine sichtbare Kante. */
.ksc-artikel-verlauf-unten {
  bottom: 0;
  height: 200px;
  background: linear-gradient(to top,
    #363F50 0%,
    color-mix(in srgb, #363F50 60%, var(--bg-light)) 40%,
    color-mix(in srgb, #363F50 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

/* Gleiche Breite und gleicher Seitenabstand wie die Sektionen der Startseite */
.ksc-artikel-huelle {
  position: relative;
  z-index: 1;
  max-width: 1280px;
  margin: 0 auto;
  padding: 0 clamp(1.5rem, 4vw, 2.5rem);
}

.ksc-artikel-kicker {
  margin: 0 0 0.75rem;
  font-family: Oswald, sans-serif;
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--accent-kicker-light);
}

.ksc-artikel-titel {
  margin: 0;
  font-family: Anton, sans-serif;
  font-size: clamp(2.25rem, 4.5vw, 4rem);
  font-weight: 400;
  line-height: 0.95;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  color: var(--text-on-light);
}

/* Kopfzeile: Autor, Lesezeit, Datum, Zugriffe */
.ksc-artikel-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 28px;
  margin-top: 1.4rem;
  padding-bottom: 1.5rem;
  border-bottom: 1px solid rgba(15, 21, 32, 0.12);
  font-family: Oswald, sans-serif;
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--muted-on-light);
}

.ksc-artikel-meta > span {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  white-space: nowrap;
}

.ksc-artikel-meta svg {
  width: 17px;
  height: 17px;
  flex: 0 0 auto;
  fill: none;
  stroke: var(--accent-kicker-light);
  stroke-width: 1.7;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.ksc-artikel-bild {
  margin-top: clamp(2rem, 3.5vw, 2.75rem);
}

.ksc-artikel-bild img {
  width: 100%;
  height: auto;
  border-radius: 16px;
  box-shadow: 0 18px 44px rgba(15, 21, 32, 0.16);
}

/* --- Beitragstext ------------------------------------------------ */

.ksc-artikel-text {
  margin-top: clamp(2rem, 3.5vw, 2.75rem);
  font-size: clamp(1rem, 1.1vw, 1.125rem);
  line-height: 1.75;
  color: var(--text-on-light);
}

.ksc-artikel-text > :first-child { margin-top: 0; }
.ksc-artikel-text > :last-child { margin-bottom: 0; }

.ksc-artikel-text p { margin: 0 0 1.25em; }

.ksc-artikel-text h2,
.ksc-artikel-text h3,
.ksc-artikel-text h4,
.ksc-artikel-text h5 {
  color: var(--text-on-light);
  text-transform: uppercase;
}

.ksc-artikel-text h2 {
  margin: 2em 0 0.6em;
  font-family: Anton, sans-serif;
  font-weight: 400;
  font-size: clamp(1.75rem, 2.6vw, 2.5rem);
  line-height: 1.05;
  letter-spacing: 0.01em;
}

.ksc-artikel-text h3 {
  margin: 1.9em 0 0.55em;
  font-family: Oswald, sans-serif;
  font-weight: 600;
  font-size: clamp(1.3rem, 1.9vw, 1.6rem);
  line-height: 1.2;
  letter-spacing: 0.04em;
}

.ksc-artikel-text h4,
.ksc-artikel-text h5 {
  margin: 1.7em 0 0.5em;
  font-family: Oswald, sans-serif;
  font-weight: 500;
  font-size: clamp(1.1rem, 1.5vw, 1.25rem);
  line-height: 1.25;
  letter-spacing: 0.08em;
}

.ksc-artikel-text a {
  color: var(--accent-kicker-light);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
  transition: color 0.2s ease;
}

.ksc-artikel-text a:hover { color: var(--accent); }

.ksc-artikel-text strong,
.ksc-artikel-text b { font-weight: 700; color: var(--text-on-light); }

.ksc-artikel-text ul,
.ksc-artikel-text ol { margin: 0 0 1.25em; padding-left: 1.35em; }
.ksc-artikel-text li { margin: 0.4em 0; }
.ksc-artikel-text li::marker { color: var(--accent-kicker-light); }

.ksc-artikel-text img {
  max-width: 100%;
  height: auto;
  border-radius: 14px;
  box-shadow: 0 16px 38px rgba(15, 21, 32, 0.14);
}

.ksc-artikel-text figure { margin: 2em 0; }

.ksc-artikel-text figcaption {
  margin-top: 0.6em;
  font-size: 0.85rem;
  color: var(--muted-on-light);
}

.ksc-artikel-text hr {
  border: 0;
  border-top: 1px solid rgba(15, 21, 32, 0.12);
  margin: 2.5em 0;
}

.ksc-artikel-text table {
  width: 100%;
  border-collapse: collapse;
  margin: 0 0 1.75em;
  font-size: 0.95em;
}

.ksc-artikel-text th,
.ksc-artikel-text td {
  padding: 0.7em 0.9em;
  text-align: left;
  border-bottom: 1px solid rgba(15, 21, 32, 0.12);
}

.ksc-artikel-text th {
  font-family: Oswald, sans-serif;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

/* --- Zitat -------------------------------------------------------
   Im Editor entweder <blockquote> setzen oder einem Block die Klasse
   "ksc-zitat" geben. Die Namenszeile darunter bekommt "ksc-zitat-autor";
   ohne Klasse wird ersatzweise der letzte Absatz so dargestellt.
   ----------------------------------------------------------------- */

.ksc-artikel-text blockquote,
.ksc-artikel-text .ksc-zitat {
  margin: 2.5em 0;
  padding: 0.2em 0 0.2em clamp(1.25rem, 3vw, 2rem);
  border-left: 4px solid var(--accent);
  font-family: Oswald, sans-serif;
  font-weight: 500;
  font-size: clamp(1.25rem, 2vw, 1.6rem);
  font-style: normal;
  line-height: 1.4;
  color: var(--text-on-light);
}

.ksc-artikel-text blockquote p,
.ksc-artikel-text .ksc-zitat p { margin: 0 0 0.4em; }

.ksc-artikel-text blockquote cite,
.ksc-artikel-text blockquote footer,
.ksc-artikel-text .ksc-zitat cite,
.ksc-artikel-text .ksc-zitat footer,
.ksc-artikel-text .ksc-zitat-autor,
.ksc-artikel-text blockquote > p:last-child:not(:only-child),
.ksc-artikel-text .ksc-zitat > p:last-child:not(:only-child) {
  display: block;
  margin: 0.85em 0 0;
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  font-size: 0.8rem;
  font-weight: 600;
  font-style: normal;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  line-height: 1.4;
  color: var(--accent-kicker-light);
}

/* Bestandsmarkup aus dem alten Astroid-Template:
   <figure><blockquote class="blockquote">…</blockquote>
   <figcaption class="blockquote-footer">Name</figcaption></figure>
   Der Balken laeuft ueber beide Teile durch, damit die Namenszeile
   trotz ihrer Lage ausserhalb des Zitats buendig steht. */

.ksc-artikel-text figure > blockquote { margin: 0; }

.ksc-artikel-text figure > blockquote + figcaption,
.ksc-artikel-text figcaption.blockquote-footer,
.ksc-artikel-text .blockquote-footer {
  margin: 0;
  padding: 0.75em 0 0.2em clamp(1.25rem, 3vw, 2rem);
  border-left: 4px solid var(--accent);
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  font-size: 0.8rem;
  font-weight: 600;
  font-style: normal;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  line-height: 1.4;
  color: var(--accent-kicker-light);
}

/* Das Sinnbild stammt aus Font Awesome, das hier nicht geladen wird.
   Statt der Schrift wird die Form als Maske eingesetzt - dadurch bleibt
   das Bestandsmarkup unveraendert nutzbar und die Farbe steuerbar. */

.ksc-artikel-text blockquote i[class*="fa-"],
.ksc-artikel-text .ksc-zitat i[class*="fa-"] {
  display: inline-block;
  width: 0.8em;
  height: 0.8em;
  margin-right: 0.15em;
  background-color: var(--accent);
  -webkit-mask: var(--ksc-chevrons) center / contain no-repeat;
  mask: var(--ksc-chevrons) center / contain no-repeat;
}

/* Meldungskaesten aus dem Bestandsmarkup (Bootstrap-Klassen des alten
   Templates). Ohne Bootstrap sind sie sonst unsichtbar.
   Der Aufhaenger ist bewusst #ksc-content und nicht der Beitragstext,
   damit die Kaesten auch ausserhalb der Beitragsansicht greifen. */

#ksc-content .alert {
  --ksc-ton: var(--accent);
  margin: 1.75em 0;
  padding: 0.95em 1.2em;
  border: 1px solid color-mix(in srgb, var(--ksc-ton) 32%, transparent);
  border-left: 4px solid var(--ksc-ton);
  border-radius: 12px;
  background: color-mix(in srgb, var(--ksc-ton) 9%, var(--bg-light));
  color: var(--text-on-light);
  font-size: 0.98em;
  line-height: 1.55;
}

#ksc-content .alert > :first-child { margin-top: 0; }
#ksc-content .alert > :last-child { margin-bottom: 0; }
#ksc-content .alert strong,
#ksc-content .alert b { color: var(--text-on-light); }
#ksc-content .alert em,
#ksc-content .alert i { color: var(--text-on-light); font-style: italic; }

#ksc-content .alert-success { --ksc-ton: #16A34A; }
#ksc-content .alert-info    { --ksc-ton: var(--accent); }
#ksc-content .alert-warning { --ksc-ton: #D97706; }
#ksc-content .alert-danger  { --ksc-ton: #DC2626; }
#ksc-content .alert-secondary,
#ksc-content .alert-light,
#ksc-content .alert-dark     { --ksc-ton: var(--muted-on-light); }

/* Naht zwischen der letzten Sektion einer Unterseite und dem
   Fussbereich. Die Sektion endet auf --bg-deep, der Fussbereich
   beginnt wegen seines eigenen Schleiers auf #363F50 - dazwischen
   liegt sonst eine sichtbare Kante. Der Verlauf laeuft ueber
   dieselben 120 px wie der Schleier des Fussbereichs.
   background-image liegt ueber der Farbe, aber unter dem Inhalt;
   !important ist noetig, weil die Sektion ihre Farbe im
   style-Attribut als Kurzschreibweise setzt. */
.ksc-unterseite > section:last-child {
  background-image: linear-gradient(to bottom,
    rgba(16, 26, 46, 0) calc(100% - 120px),
    #363F50 100%) !important;
}

/* Kurve der Vereinsgeschichte auf Mobilgeraeten: dort gibt es keinen
   Hover-Zustand, deshalb traegt der Punkt in der Mitte des sichtbaren
   Ausschnitts seine Sprechblase dauerhaft. Die Werte entsprechen
   genau den Hover-Regeln der Vorlage. */
@media (max-width: 1023px) {
  .vg-pt.aktiv .vg-tip { opacity: 1; transform: translate(-50%, 0); }
  .vg-pt.aktiv .vg-tip.at-left { transform: translate(-6px, 0); }
  .vg-pt.aktiv .vg-tip.at-right { transform: translate(6px, 0); }
  .vg-pt.aktiv .vg-dot { transform: scale(1.35); }
}

/* Karten "Vier Reihen, elf Figuren" auf der Seite Tischfussball. Mit der
   vierten Karte (Einzel) geht das urspruengliche Dreierraster nicht mehr
   auf: Ab 768 px stehen deshalb zwei nebeneinander, ab 1024 px alle vier.
   Ohne diese Stufe bliebe auf Tabletbreite eine Karte allein in der
   zweiten Zeile. */
@media (min-width: 768px) {
  .tf-topics { grid-template-columns: repeat(2, 1fr); }
}

@media (min-width: 1024px) {
  .tf-topics { grid-template-columns: repeat(4, 1fr); }
}

/* Auf schmalen Schirmen umfliessen Bilder den Text nicht mehr */
@media (max-width: 700px) {
  .ksc-artikel-text img[style*="float"],
  .ksc-artikel-text img[align] {
    float: none !important;
    display: block;
    width: 100% !important;
    margin: 0 0 1.5em !important;
  }
}

/* ---------------------------------------------------------------
   Mannschaftsseiten (com_content, alternatives Layout "mannschaft")
   Aufbau wie die Beitragsansicht: Verlauf vom Hero auf den hellen
   Grund, Inhalt auf hell, Verlauf auf die oberste Zeile des
   Fussbereichs. Das Modul MX Team (Stil 20) ist fuer hellen Grund
   gebaut und bringt seine Gestaltung vollstaendig selbst mit -
   deshalb steht hier bewusst KEINE Textformatierung wie in
   .ksc-artikel-text.
   --------------------------------------------------------------- */

.ksc-mannschaft {
  position: relative;
  display: flow-root;
  background: var(--bg-light);
  color: var(--text-on-light);
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  padding: clamp(6rem, 10vw, 10rem) 0 calc(clamp(1.5rem, 2.5vw, 2.5rem) + 200px);
}

.ksc-mannschaft-verlauf-oben,
.ksc-mannschaft-verlauf-unten {
  position: absolute;
  left: 0;
  right: 0;
  pointer-events: none;
}

/* Auf Desktop blendet #pp-hero-fade den Hero ueber 320 px auf
   rgb(27,41,66) aus - das ist --bg-dark. Dort setzt der Verlauf an. */
.ksc-mannschaft-verlauf-oben {
  top: 0;
  height: 180px;
  background: linear-gradient(to bottom,
    var(--bg-dark) 0%,
    color-mix(in srgb, var(--bg-dark) 60%, var(--bg-light)) 40%,
    color-mix(in srgb, var(--bg-dark) 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

/* Unter 1024 px ist #pp-hero-fade ausgeblendet und #pp-root traegt
   --bg-deep. Der Hero endet dort also dunkler; ohne diese Stufe
   entstuende genau an der Naht eine sichtbare Kante. */
@media (max-width: 1023px) {
  .ksc-mannschaft-verlauf-oben {
    background: linear-gradient(to bottom,
      var(--bg-deep) 0%,
      color-mix(in srgb, var(--bg-deep) 60%, var(--bg-light)) 40%,
      color-mix(in srgb, var(--bg-deep) 25%, var(--bg-light)) 70%,
      var(--bg-light) 96%,
      var(--bg-light) 100%);
  }
}

/* Der Fussbereich beginnt wegen seines eigenen Schleiers auf #363F50,
   nicht auf --bg-deep. Siehe Beitragsansicht. */
.ksc-mannschaft-verlauf-unten {
  bottom: 0;
  height: 200px;
  background: linear-gradient(to top,
    #363F50 0%,
    color-mix(in srgb, #363F50 60%, var(--bg-light)) 40%,
    color-mix(in srgb, #363F50 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

/* Gleiche Breite und gleicher Seitenabstand wie alle Sektionen */
.ksc-mannschaft-huelle {
  position: relative;
  z-index: 1;
  max-width: 1280px;
  margin: 0 auto;
  padding: 0 clamp(1.5rem, 4vw, 2.5rem);
}

.ksc-mannschaft-titel {
  margin: 0;
  font-family: Anton, sans-serif;
  font-weight: 400;
  font-size: clamp(2.25rem, 4.5vw, 4rem);
  line-height: 1.02;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  color: var(--text-on-light);
}

/* Ab hier bestimmt allein das Modul-CSS das Aussehen. Die einzige
   Absicherung betrifft Verweise: die Grundregel des Entwurfs setzt
   a { color:#ffffff }, das waere auf hellem Grund unsichtbar.
   :where() haelt die Gewichtung so niedrig, dass jede Regel des
   Moduls Vorrang behaelt. */
.ksc-mannschaft-modul {
  margin-top: clamp(2rem, 3.5vw, 3rem);
}

.ksc-mannschaft-modul :where(a) {
  color: var(--accent-kicker-light);
}

/* MX Team setzt zwei Grundregeln voraus, die aus Bootstrap stammen. Das
   Template bringt kein Bootstrap mit, deshalb stehen sie hier - eng auf
   den Modulbereich begrenzt.

   1. Die Fotos tragen die Klasse .img-responsive (Bootstrap 3:
      display:block; max-width:100%; height:auto). Ohne diese Regel
      erscheinen sie in Originalgroesse (410 x 450 px) und laufen weit
      ueber den 200 px breiten runden Rahmen hinaus.

   2. Die Karten stehen als inline-block nebeneinander. Ohne Angabe
      richten sie sich an der Schriftlinie ihrer letzten Textzeile aus -
      bei unterschiedlich langen Spielerangaben rutscht dadurch jede
      Karte gegenueber der vorigen nach unten. */
.ksc-mannschaft-modul img {
  max-width: 100%;
  height: auto;
}

.ksc-mannschaft-modul .img-responsive {
  display: block;
}

.ksc-mannschaft-modul .la-member {
  vertical-align: top;
}

/* Hover-Verhalten der Karten.

   Das Modul blendet beim Ueberfahren des Bereichs alle Karten auf
   opacity .4 ab und nimmt die ueberfahrene Karte per Klasse "current"
   wieder auf 1 zurueck. Diese Klasse setzt "effect_over.js" - ein
   jQuery-Skript, das im Template nicht laufen kann: das Modul laedt
   direkt danach "jquery-noconflict.js", damit ist $ nicht mehr belegt,
   und das Skript bricht schon in seiner ersten Zeile ab. Ohne ein
   weiteres Framework, das $ besetzt, gibt es die Klasse "current" also
   nie - auch die ueberfahrene Karte blieb abgeblendet.

   Ersatz ohne JavaScript: die ueberfahrene Karte ist genau die, auf der
   :hover liegt. Gewichtung 0,3,0 gegen 0,2,0 der Modulregel, deshalb
   greift sie trotz beidseitigem !important. */
.ksc-mannschaft-modul .la-member .effect:hover {
  opacity: 1 !important;
}

/* Schriftgroesse der Spielerkarten. Das Modul macht dazu keine Angabe,
   deshalb galt bisher die Grundgroesse von 16 px. Alle drei Textteile -
   Name (h4), Rolle (p) und Angabenblock (.mos-img) - verwenden relative
   Groessen und folgen dieser einen Angabe.

   Zum Nachstellen genuegt der Wert in der naechsten Zeile:
   0.9rem = 14.4 px, 0.85rem = 13.6 px (Vorgabe),
   0.8rem = 12.8 px, 0.75rem = 12 px. */
.ksc-mannschaft-modul {
  --ksc-team-schrift: 0.85rem;
}

.ksc-mannschaft-modul .mx-team20 {
  font-size: var(--ksc-team-schrift);
  line-height: 1.55;
}

/* Kontur der Karten.

   Das Modul setzt nur einen sehr flachen Schatten und keinen Rahmen -
   auf dem hellen Grund (--bg-light) ist die weisse Karte dadurch kaum
   abgegrenzt. Ergaenzt wird eine feine Linie und eine leichte Rundung;
   der Schatten des Moduls bleibt unveraendert.

   Der Kreis mit dem Foto ueberlappt die Oberkante der Karte. Die Linie
   laeuft dort hinter ihm durch und ist unterbrochen - das ist gewollt,
   setzt aber voraus, dass der 7-px-Ring des Kreises dieselbe Farbe hat
   wie die Karte. Das Modul faerbt ihn #f5f5f5, was auf weisser Karte
   als Grauschleier sichtbar wuerde; deshalb hier auf Weiss.

   ACHTUNG: --ksc-team-hover muss mit der Moduloption
   "Hintergrundfarbe" uebereinstimmen. Sie faerbt dort den Hover-Grund
   der Karte und die Trennlinie unter dem Namen. Wird sie im Backend
   geaendert, gehoert dieser Wert nachgezogen - sonst behalten Rahmen
   und Ring beim Ueberfahren die alte Farbe. */
.ksc-mannschaft-modul {
  --ksc-team-hover: rgb(81, 123, 168);
}

.ksc-mannschaft-modul .mx-team20 {
  border: 1px solid rgba(15, 21, 32, 0.22);
  border-radius: 14px;
}

/* Gleich breite und gleich hohe Kacheln.

   Aufbau, aus dem Seitenquelltext und in der Konsole nachgemessen:

     .ksc-mannschaft-modul          Container des Templates
       div[style="text-align:center"]
         .mainteam296               Raster, 8 Spieler als direkte Kinder
           .la-member               Huelle je Spieler
             .mxteam
               .team-item.effect
                 .mx-team20         die Karte

   Die Zahl in "mainteam296" ist die Modul-ID aus {loadmoduleid 296};
   jede Mannschaft hat ihr eigenes Modul, deshalb die Auswahl per
   Teilzeichenkette.

   DER ENTSCHEIDENDE PUNKT: Das Modul schreibt eigenes CSS direkt in
   die Seite:

       .mainteam296 .la-member { display: inline-block; width: 33.333%; }

   Gewichtung 0-2-0 - genauso hoch wie .ksc-mannschaft-modul .la-member.
   Bei Gleichstand gewinnt die spaetere Regel, und ein <style> im HTML
   steht immer nach der eingebundenen Datei. Deshalb blieb .la-member
   bei inline-block und 33,333 %: von der Rasterzelle mit 381 px
   gerechnet ergab das die gemessenen 127 px, an denen drei Anlaeufe
   gescheitert sind. .mxteam und .team-item kamen durch, weil das Modul
   zu ihnen nichts sagt - daher der irrefuehrende Befund, dass zwei von
   drei Selektoren derselben Regel griffen.

   Der Kindselektor hebt die Gewichtung auf 0-3-0 und entscheidet die
   Sache unabhaengig von der Reihenfolge. Wer hier je auf
   ".ksc-mannschaft-modul .la-member" zurueckbaut, holt den Fehler
   zurueck. */
.ksc-mannschaft-modul [class*="mainteam"] {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(16px, 2vw, 28px);
  align-items: stretch;
  justify-items: stretch;
  /* Abstaende zuruecksetzen. Das Modul schreibt eigenes CSS in die
     Seite (siehe unten) und legt dort Zwischenraeume ueber Aussen- und
     Innenabstaende an. Am Bildschirm gemessen schob das die Karte um
     32 px nach rechts, wo sie dann ueber den rechten Rand hinauslief.
     Der Zwischenraum kommt hier aus gap, nicht aus Abstaenden. */
  margin: 0;
  padding: 0;
  width: auto;
  max-width: 100%;
}

@media (min-width: 560px) {
  .ksc-mannschaft-modul [class*="mainteam"] {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* Drei Spalten erst ab 1200 px. Ein iPad 10 misst 820 x 1180 px und
   bekam bei 900 px als Umschaltpunkt im Querformat drei Spalten - zu
   schmal, jede zweite Angabenzeile brach um. */
@media (min-width: 1200px) {
  .ksc-mannschaft-modul [class*="mainteam"] {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

/* minmax(0, 1fr) statt 1fr: Ohne die Null nimmt eine Spalte die
   Mindestbreite ihres Inhalts als Untergrenze - eine lange Zeile ohne
   Trennmoeglichkeit macht die Spalte dann doch wieder breiter als die
   uebrigen. */

/* Kindselektor gegen das Inline-CSS des Moduls, siehe oben. */
.ksc-mannschaft-modul [class*="mainteam"] > .la-member {
  display: flex;
  flex-direction: column;
  width: 100%;
  max-width: none;
  min-width: 0;
  margin: 0;
}

/* Ebenfalls mit dem Rastercontainer davor, aus demselben Grund wie
   oben: Das Modul setzt

       .mainteam298 .team-item { position: relative; margin: 30px; }

   Der Aussenabstand von 30 px schob die Karte nach rechts und liess
   sie auf schmalen Bildschirmen ueber den Rand laufen - gemessen
   32 px Versatz bei sonst richtiger Breite. Gewichtung 0-2-0, also
   Gleichstand mit einer schlichten Nennung; erst der Container davor
   entscheidet es.

   Der Zwischenraum kommt aus gap am Raster. Er ist mit 16 bis 28 px
   knapper als die 30 px des Moduls, dafuer nur zwischen den Kacheln
   und nicht auch am Rand. */
.ksc-mannschaft-modul [class*="mainteam"] .mxteam,
.ksc-mannschaft-modul [class*="mainteam"] .team-item {
  display: flex;
  flex-direction: column;
  width: 100%;
  min-width: 0;
  margin: 0;
}

/* float aufheben - sonst faellt die Karte aus dem Fluss und streckt
   sich nicht auf die Zellenhoehe. */
.ksc-mannschaft-modul [class*="mainteam"] .mx-team20 {
  float: none;
  width: 100%;
  flex: 1 1 auto;
  margin-bottom: 0;
}

/* Weisse Schrift erst, wenn wirklich die Karte ueberfahren wird.

   style20.css setzt:
       .team-item:hover .mx-team20 .mos-img,
       .team-item:hover .mx-team20 p,
       .team-item:hover .mx-team20 h4 { color: #ffffff; }

   Der blaue Kartengrund kommt dagegen von .mx-team20:hover. Beides
   fiel zusammen, solange die Karte gefloatet war und .team-item nicht
   mehr umschloss als sie selbst.

   Mit dem Raster umfasst .team-item die ganze Zelle - auch den
   Streifen links und rechts neben dem Kreis, der ueber der Karte
   liegt. Stand der Zeiger dort, wurde die Schrift weiss, der Grund
   aber blieb weiss: Der ganze Karteninhalt verschwand, nur der blaue
   Akzentbalken blieb stehen, weil er eine Hintergrundfarbe hat und
   keine Schriftfarbe.

   Deshalb zuerst zuruecksetzen, dann an .mx-team20:hover neu binden.
   Die Gewichtungen sind mit Bedacht gleich hoch (0-6-0); den Ausschlag
   gibt die Reihenfolge, das Einfaerben steht hinter dem Zuruecksetzen. */
.ksc-mannschaft-modul [class*="mainteam"] .team-item:hover .mx-team20 h4,
.ksc-mannschaft-modul [class*="mainteam"] .team-item:hover .mx-team20 p,
.ksc-mannschaft-modul [class*="mainteam"] .team-item:hover .mx-team20 .title,
.ksc-mannschaft-modul [class*="mainteam"] .team-item:hover .mx-team20 .mos-img {
  color: var(--text-on-light);
}

.ksc-mannschaft-modul [class*="mainteam"] .team-item .mx-team20:hover h4,
.ksc-mannschaft-modul [class*="mainteam"] .team-item .mx-team20:hover p,
.ksc-mannschaft-modul [class*="mainteam"] .team-item .mx-team20:hover .title,
.ksc-mannschaft-modul [class*="mainteam"] .team-item .mx-team20:hover .mos-img {
  color: #ffffff;
}

/* Dasselbe fuer die Verweise im Angabenblock. */
.ksc-mannschaft-modul [class*="mainteam"] .team-item:hover .mx-team20 a {
  color: var(--accent-kicker-light);
}

.ksc-mannschaft-modul [class*="mainteam"] .team-item .mx-team20:hover a {
  color: #ffffff;
}

/* Ring um den Kreis - ausschliesslich auf .imgbox-mx.round.

   Aus style20.css des Moduls:
       .mx-team20 .imgbox-mx { border: 7px solid #f5f5f5; }
       .imgbox-mx.round, .imgbox-mx.round img { border-radius: 100%; }
       .imgbox-mx.round { width: 200px; margin-top: -120px; }

   Die Rundung haengt an der zusaetzlichen Klasse "round", nicht an
   .imgbox-mx. Ein box-shadow auf .imgbox-mx allein zeichnete deshalb
   ein Rechteck von 214 px Breite um den Kreis herum - genau so
   ausgeliefert und am Bildschirm nachgemessen. Sichtbar war es nur
   dort, wo die Linie ueber den Seitengrund lief; auf der weissen
   Karte ging sie unter. Daher der Eindruck, es betreffe nur manche
   Karten.

   Mit .round im Selektor kann das nicht wieder passieren: Traegt eine
   Modulinstanz die Klasse nicht, entfaellt der Ring, statt als Kasten
   zu erscheinen.

   Der Ring sitzt an der Aussenkante des 7-px-Randes. Dieser bleibt
   weiss statt der Modulvorgabe #f5f5f5 - auf weisser Karte waere der
   Grauton ein sichtbarer Schleier. */
.ksc-mannschaft-modul .mx-team20 .imgbox-mx {
  border-color: #ffffff;
  transition: border-color 0.3s ease-out;
}

.ksc-mannschaft-modul .mx-team20 .imgbox-mx.round {
  box-shadow: 0 0 0 1px rgba(15, 21, 32, 0.22);
}

/* Aus dem Ei einen Kreis machen.

   Das Modul gibt dem Rahmen nur eine Breite:
       .imgbox-mx.round { width: 200px; }
   Die Hoehe richtet sich nach dem Bild. Die Fotos liegen als
   410 x 450 px vor, der Rahmen wird dadurch 200 x 220 px - und
   border-radius: 100% ergibt darauf keine Kreis-, sondern eine
   Ellipsenform. Am Bildschirm sieht das aus wie ein Ei.

   aspect-ratio zwingt den Rahmen ins Quadrat, object-fit schneidet das
   Foto passend zu. Der Zuschnitt sitzt oben, nicht mittig: Bei
   Portraits waeren sonst oben Haare und unten Schultern gleichermassen
   betroffen - so faellt nur unten etwas weg, wo ohnehin nichts
   Wichtiges ist. Es sind rund 9 Prozent der Hoehe. */
.ksc-mannschaft-modul .mx-team20 .imgbox-mx.round {
  aspect-ratio: 1;
}

.ksc-mannschaft-modul .mx-team20 .imgbox-mx.round img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center top;
}

.ksc-mannschaft-modul .mx-team20:hover {
  border-color: var(--ksc-team-hover);
}

/* Beim Ueberfahren faerbt das Modul den Kartengrund blau. Der weisse
   Rand des Kreises bleibt weiss - liefe er mit ins Blau, verschwaende
   die Abgrenzung genau in dem Moment, in dem die Karte im
   Vordergrund steht.

   Ausdrueckliche Regel statt gar keiner: Ohne sie wuerde eine spaeter
   ergaenzte Hover-Regel des Moduls durchschlagen. */
.ksc-mannschaft-modul .mx-team20:hover .imgbox-mx {
  border-color: #ffffff;
}

/* ---------------------------------------------------------------
   Kontaktseite (com_content, alternatives Layout "kontakt")

   Aufbau exakt wie die Mannschaftsseiten: Verlauf vom Hero auf den
   hellen Grund, Inhalt auf hell, Verlauf auf die oberste Zeile des
   Fussbereichs. Der Beitrag enthaelt allein den Kurzcode
   {convertforms …}; das Formular ist fuer hellen Grund gebaut und
   bringt seine Gestaltung vollstaendig selbst mit.

   Deshalb steht hier - wie bei MX Team - bewusst KEINE
   Textformatierung. Regeln fuer p, label, input, select, textarea
   oder button wuerden die Felder und die Absenden-Schaltflaeche von
   Convert Forms ueberschreiben.
   --------------------------------------------------------------- */

.ksc-kontakt {
  position: relative;
  display: flow-root;
  background: var(--bg-light);
  color: var(--text-on-light);
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  padding: clamp(6rem, 10vw, 10rem) 0 calc(clamp(1.5rem, 2.5vw, 2.5rem) + 200px);
}

.ksc-kontakt-verlauf-oben,
.ksc-kontakt-verlauf-unten {
  position: absolute;
  left: 0;
  right: 0;
  pointer-events: none;
}

/* Auf Desktop blendet #pp-hero-fade den Hero ueber 320 px auf
   rgb(27,41,66) aus - das ist --bg-dark. Dort setzt der Verlauf an. */
.ksc-kontakt-verlauf-oben {
  top: 0;
  height: 180px;
  background: linear-gradient(to bottom,
    var(--bg-dark) 0%,
    color-mix(in srgb, var(--bg-dark) 60%, var(--bg-light)) 40%,
    color-mix(in srgb, var(--bg-dark) 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

/* Unter 1024 px ist #pp-hero-fade ausgeblendet und #pp-root traegt
   --bg-deep. Der Hero endet dort also dunkler; ohne diese Stufe
   entstuende genau an der Naht eine sichtbare Kante. */
@media (max-width: 1023px) {
  .ksc-kontakt-verlauf-oben {
    background: linear-gradient(to bottom,
      var(--bg-deep) 0%,
      color-mix(in srgb, var(--bg-deep) 60%, var(--bg-light)) 40%,
      color-mix(in srgb, var(--bg-deep) 25%, var(--bg-light)) 70%,
      var(--bg-light) 96%,
      var(--bg-light) 100%);
  }
}

/* Der Fussbereich beginnt wegen seines eigenen Schleiers auf #363F50,
   nicht auf --bg-deep. Siehe Beitragsansicht. */
.ksc-kontakt-verlauf-unten {
  bottom: 0;
  height: 200px;
  background: linear-gradient(to top,
    #363F50 0%,
    color-mix(in srgb, #363F50 60%, var(--bg-light)) 40%,
    color-mix(in srgb, #363F50 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

/* Gleiche Breite und gleicher Seitenabstand wie alle Sektionen */
.ksc-kontakt-huelle {
  position: relative;
  z-index: 1;
  max-width: 1280px;
  margin: 0 auto;
  padding: 0 clamp(1.5rem, 4vw, 2.5rem);
}

.ksc-kontakt-titel {
  margin: 0;
  font-family: Anton, sans-serif;
  font-weight: 400;
  font-size: clamp(2.25rem, 4.5vw, 4rem);
  line-height: 1.02;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  color: var(--text-on-light);
}

/* Ab hier bestimmt allein das CSS von Convert Forms das Aussehen.
   Einzige Absicherung: die Grundregel des Entwurfs setzt
   a { color:#ffffff }, das waere auf hellem Grund unsichtbar.
   :where() haelt die Gewichtung bei 0,1,0, damit jede Regel des
   Formulars (mindestens 0,1,1) Vorrang behaelt. */
.ksc-kontakt-formular {
  margin-top: clamp(2rem, 3.5vw, 3rem);
}

.ksc-kontakt-formular :where(a) {
  color: var(--accent);
}


/* ---------------------------------------------------------------
   Bausteine fuer redaktionelle Inhalte

   Zwei Bloecke, die je einen kompletten Reiter von Tabs & Accordions
   fuellen. Erzeugt werden sie vom Plugin "Inhalt - KSC Bausteine" aus
   Kurzbefehlen; im Editor steht nur Text.

   Vorgaenger waren drei lose Bausteine (Kacheln, Karte, Duo-Raster).
   Sie sind entfallen, weil fuenf gleich grosse Kacheln neben einer
   Karte ueber die volle Breite in drei Ebenen ohne Zusammenhalt
   zerfielen. Jetzt ist es ein Rahmen mit inneren Trennlinien.

   Verwendbar ueberall unter #ksc-content, also auch ausserhalb der
   Reiter.
   --------------------------------------------------------------- */

#ksc-content .ksc-steckbrief,
#ksc-content .ksc-punkte {
  margin: 1.75em 0;
  border: 1px solid rgba(15, 21, 32, .10);
  border-radius: 16px;
  background: #ffffff;
  box-shadow: 0 2px 10px rgba(15, 21, 32, .05);
  overflow: hidden;
}

/* Adresse und Daten nebeneinander. Unter 720 px untereinander - zwei
   Spalten waeren dort schmaler als "95326 Kulmbach". */
#ksc-content .ksc-steckbrief-kopf {
  display: grid;
  grid-template-columns: 1fr;
}

@media (min-width: 720px) {
  #ksc-content .ksc-steckbrief-kopf {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
  }
}

#ksc-content .ksc-steckbrief-ort {
  padding: 20px 22px;
  border-bottom: 1px solid rgba(15, 21, 32, .10);
}

@media (min-width: 720px) {
  #ksc-content .ksc-steckbrief-ort {
    border-bottom: 0;
    border-right: 1px solid rgba(15, 21, 32, .10);
  }
}

/* 14 statt 12 px. Beschriftung und Wert sind beide von der
   Versalhoehe bestimmt (Versalien bzw. Ziffern), deshalb wirken sie
   bei annaehernd gleicher Pixelgroesse auch gleich gross. Vorher
   standen 12 px gegen 17 px - der Groessenunterschied stach ins Auge. */
#ksc-content .ksc-steckbrief-titel {
  display: block;
  margin: 0 0 10px;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 14px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: #376493;
}

/* Die Ortsnadel sitzt vor der Ueberschrift, nicht darueber - das
   spart die Zeile, die den Block vorher auseinanderzog. */
#ksc-content .ksc-steckbrief-titel::before {
  content: "";
  display: inline-block;
  width: 17px;
  height: 17px;
  margin-right: 7px;
  vertical-align: -3px;
  background-color: currentColor;
  -webkit-mask: var(--ksc-nadel) center / contain no-repeat;
  mask: var(--ksc-nadel) center / contain no-repeat;
}

#ksc-content .ksc-steckbrief {
  --ksc-nadel: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z'/%3E%3Ccircle cx='12' cy='10' r='3'/%3E%3C/svg%3E");
  --ksc-haken: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12 5 5L20 7'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-adresse {
  margin: 0;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 500;
  font-size: 17px;
  line-height: 1.45;
  color: var(--text-on-light);
}

#ksc-content .ksc-steckbrief-route {
  display: inline-block;
  margin-top: 12px;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 13px;
  letter-spacing: .04em;
  text-transform: uppercase;
  text-decoration: none;
  color: #376493;
}

#ksc-content .ksc-steckbrief-route::after {
  content: "";
  display: inline-block;
  width: 0;
  height: 0;
  margin-left: 7px;
  vertical-align: 1px;
  border-top: 4px solid transparent;
  border-bottom: 4px solid transparent;
  border-left: 6px solid currentColor;
  transition: transform .3s cubic-bezier(.16, 1, .3, 1);
}

#ksc-content .ksc-steckbrief-route:hover { color: var(--accent); }
#ksc-content .ksc-steckbrief-route:hover::after { transform: translateX(3px); }

#ksc-content .ksc-steckbrief-daten { padding: 8px 22px; }

#ksc-content .ksc-steckbrief-zeile {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  padding: 9px 0;
  border-bottom: 1px solid rgba(15, 21, 32, .08);
}

#ksc-content .ksc-steckbrief-zeile:last-child { border-bottom: 0; }

#ksc-content .ksc-steckbrief-name {
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 500;
  font-size: 15px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--muted-on-light);
}

/* Sinnbild vor der Beschriftung. Welches, entscheidet data-ic an der
   Zeile; ohne Angabe bleibt die Flaeche leer statt ein falsches
   Zeichen zu zeigen. */
#ksc-content .ksc-steckbrief-zeile[data-ic] .ksc-steckbrief-name::before {
  content: "";
  flex: 0 0 auto;
  width: 17px;
  height: 17px;
  background-color: #376493;
  opacity: .85;
  -webkit-mask: var(--ksc-ic) center / contain no-repeat;
  mask: var(--ksc-ic) center / contain no-repeat;
}

#ksc-content .ksc-steckbrief-wert {
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 16px;
  line-height: 1.3;
  text-align: right;
  color: var(--text-on-light);
}

/* Hinweisstreifen am Fuss des Rahmens. Kein eigener Kasten mit
   Aussenabstand - er gehoert sichtbar zum Steckbrief. */
/* Fussstreifen am Fuss des Rahmens. Kein eigener Kasten mit
   Aussenabstand - er gehoert sichtbar zum Steckbrief.

   Der Farbton kommt aus data-farbe; ohne Angabe gilt das Vereinsblau,
   damit die Kurzbefehl-Fassung aus plg_content_kscbausteine (die kein
   data-farbe setzt) unveraendert aussieht wie bisher.

   Der farbige Balken links entsteht als Innenschatten, nicht als
   border-left: Ein Rahmen wuerde den Innenabstand verschieben und die
   Kante gegen den Rahmen des Steckbriefs versetzen. */
#ksc-content .ksc-steckbrief-info {
  --ksc-ton: #376493;
  margin: 0;
  padding: 13px 22px;
  border-top: 1px solid rgba(15, 21, 32, .10);
  box-shadow: inset 4px 0 0 var(--ksc-ton);
  background: color-mix(in srgb, var(--ksc-ton) 9%, var(--bg-light));
  font-size: 0.95em;
  line-height: 1.55;
  color: var(--text-on-light);
}

#ksc-content .ksc-steckbrief-info strong { color: var(--ksc-ton); }

#ksc-content .ksc-steckbrief-info[data-farbe="blau"]    { --ksc-ton: #1E7BFF; }
#ksc-content .ksc-steckbrief-info[data-farbe="gruen"]   { --ksc-ton: #2E9E5B; }
#ksc-content .ksc-steckbrief-info[data-farbe="gelb"]    { --ksc-ton: #B8860B; }
#ksc-content .ksc-steckbrief-info[data-farbe="rot"]     { --ksc-ton: #C2413B; }
#ksc-content .ksc-steckbrief-info[data-farbe="neutral"] { --ksc-ton: #5A6473; }

/* Hinweiskaesten innerhalb des Rahmens, zwischen Angaben und
   Fussstreifen. */
#ksc-content .ksc-steckbrief-innen {
  padding: 4px 22px 16px;
  border-top: 1px solid rgba(15, 21, 32, .10);
}

#ksc-content .ksc-steckbrief-innen .ksc-hinweis { margin: 12px 0 0; }

/* Freistehender Hinweiskasten. Wird innen im Rahmen und ausserhalb
   gleichermassen verwendet. */
#ksc-content .ksc-hinweis {
  --ksc-ton: #376493;
  margin: 1.4em 0;
  padding: 14px 18px 14px 20px;
  border-left: 4px solid var(--ksc-ton);
  border-radius: 10px;
  background: color-mix(in srgb, var(--ksc-ton) 9%, #ffffff);
  font-size: 0.97em;
  line-height: 1.6;
  color: var(--text-on-light);
}

#ksc-content .ksc-hinweis > :first-child { margin-top: 0; }
#ksc-content .ksc-hinweis > :last-child  { margin-bottom: 0; }

#ksc-content .ksc-hinweis[data-farbe="blau"]    { --ksc-ton: #1E7BFF; }
#ksc-content .ksc-hinweis[data-farbe="gruen"]   { --ksc-ton: #2E9E5B; }
#ksc-content .ksc-hinweis[data-farbe="gelb"]    { --ksc-ton: #B8860B; }
#ksc-content .ksc-hinweis[data-farbe="rot"]     { --ksc-ton: #C2413B; }
#ksc-content .ksc-hinweis[data-farbe="neutral"] { --ksc-ton: #5A6473; }

#ksc-content .ksc-hinweis-marke {
  display: block;
  margin: 0 0 4px;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--ksc-ton);
}

/* Nur eine Spalte, wenn die andere Haelfte gar nicht befuellt ist. */
#ksc-content .ksc-steckbrief-kopf.ist-einspaltig { grid-template-columns: 1fr; }

/* Punkteliste. Ersetzt die Aufzaehlungen in Spielmodus,
   Ranglistenpunkte und Preisen. */
#ksc-content .ksc-punkte { padding: 6px 22px; }

#ksc-content .ksc-punkt {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  margin: 0;
  padding: 11px 0;
  border-bottom: 1px solid rgba(15, 21, 32, .08);
  line-height: 1.55;
  color: var(--text-on-light);
}

#ksc-content .ksc-punkt:last-child { border-bottom: 0; }

/* Der Haken ist die Vorgabe. Traegt die Zeile ein data-ic, gilt
   stattdessen dessen Maske - so bekommt jeder Punkt ein passendes
   Zeichen, ohne dass die Kurzbefehl-Fassung etwas davon merkt. */
#ksc-content .ksc-punkt::before {
  content: "";
  flex: 0 0 auto;
  width: 19px;
  height: 19px;
  margin-top: .15em;
  background-color: #376493;
  -webkit-mask: var(--ksc-ic, var(--ksc-haken)) center / contain no-repeat;
  mask: var(--ksc-ic, var(--ksc-haken)) center / contain no-repeat;
}

#ksc-content .ksc-punkte {
  --ksc-haken: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12 5 5L20 7'/%3E%3C/svg%3E");
}

#ksc-content .ksc-punkt strong {
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  letter-spacing: .01em;
  color: var(--text-on-light);
}



/* ---------------------------------------------------------------
   Sinnbilder fuer Angabenzeilen und Punktelisten

   Als CSS-Masken, nicht als Schriftart: Font Awesome wird im Template
   nirgends geladen, und eine zweite Schrift nur fuer 15 Zeichen waere
   ein teurer Zusatz beim Erstaufruf.

   Die Schluessel muessen Zeichen fuer Zeichen zu
   KscReiter::SINNBILDER im Feld-Plugin passen. Kommt dort eines dazu,
   gehoert die Maske hierher - sonst bleibt an seiner Stelle eine
   leere Flaeche.
   --------------------------------------------------------------- */

#ksc-content .ksc-steckbrief-zeile[data-ic="kalender"],
#ksc-content .ksc-punkt[data-ic="kalender"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M8 3v4M16 3v4M3 11h18'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="uhr"],
#ksc-content .ksc-punkt[data-ic="uhr"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="tuer"],
#ksc-content .ksc-punkt[data-ic="tuer"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 3H6a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h9'/%3E%3Cpath d='M11 12h9m0 0-3-3m3 3-3 3'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="euro"],
#ksc-content .ksc-punkt[data-ic="euro"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M17 5.5A7 7 0 0 0 7.6 9m0 6a7 7 0 0 0 9.4 3.5'/%3E%3Cpath d='M4 10h9M4 14h9'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="flagge"],
#ksc-content .ksc-punkt[data-ic="flagge"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 21V4m0 0h13l-2.5 4L18 12H5'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="turnier"],
#ksc-content .ksc-punkt[data-ic="turnier"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 5h5v6h5V5h5M8 11v8h5'/%3E%3Cpath d='M18 8V2m0 20v-6M21 5h-6M21 19h-6'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="pokal"],
#ksc-content .ksc-punkt[data-ic="pokal"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 4h10v5a5 5 0 0 1-10 0Z'/%3E%3Cpath d='M7 6H4v1a3 3 0 0 0 3 3M17 6h3v1a3 3 0 0 1-3 3M10 20h4M12 14v6'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="medaille"],
#ksc-content .ksc-punkt[data-ic="medaille"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='15' r='6'/%3E%3Cpath d='M8.5 9.5 6 2h12l-2.5 7.5'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="geschenk"],
#ksc-content .ksc-punkt[data-ic="geschenk"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='9' width='18' height='12' rx='2'/%3E%3Cpath d='M3 13h18M12 9v12M12 9C9 9 7 8 7 6.5S9 4 12 9Zm0 0c3 0 5-1 5-2.5S15 4 12 9Z'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="stern"],
#ksc-content .ksc-punkt[data-ic="stern"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m12 3 2.7 5.6 6.1.9-4.4 4.3 1 6.1-5.4-2.9-5.4 2.9 1-6.1L3.2 9.5l6.1-.9Z'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="personen"],
#ksc-content .ksc-punkt[data-ic="personen"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='3.2'/%3E%3Cpath d='M3 20a6 6 0 0 1 12 0'/%3E%3Cpath d='M17 8.2a3 3 0 0 1 0 5.6M18 20a6 6 0 0 0-2-4.5'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="ort"],
#ksc-content .ksc-punkt[data-ic="ort"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z'/%3E%3Ccircle cx='12' cy='10' r='3'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="telefon"],
#ksc-content .ksc-punkt[data-ic="telefon"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6.5 3h3l1.5 4-2 1.5a12 12 0 0 0 6.5 6.5L17 13l4 1.5v3a2 2 0 0 1-2.2 2A16.5 16.5 0 0 1 4 5.2 2 2 0 0 1 6.5 3Z'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="brief"],
#ksc-content .ksc-punkt[data-ic="brief"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='2'/%3E%3Cpath d='m3.5 6.5 8.5 6 8.5-6'/%3E%3C/svg%3E");
}

#ksc-content .ksc-steckbrief-zeile[data-ic="pfeil"],
#ksc-content .ksc-punkt[data-ic="pfeil"] {
  --ksc-ic: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12h15m0 0-5-5m5 5-5 5'/%3E%3C/svg%3E");
}

#ksc-content .ksc-punkt[data-ic="haken"] {
  --ksc-ic: var(--ksc-haken);
}

/* Fussstreifen an der Punkteliste.
   Gibt es in einem Reiter keinen Steckbrief, klebt der Streifen
   stattdessen unter der Punkteliste. Der Innenabstand von 22 px muss
   dafuer unten weg, und der Streifen zieht sich mit negativem
   Aussenabstand bis an beide Kanten. Ohne das stuende er als
   eingerueckter Balken mitten im Kasten. */
#ksc-content .ksc-punkte.ist-mit-fuss { padding-bottom: 0; }

#ksc-content .ksc-punkte.ist-mit-fuss .ksc-steckbrief-info {
  margin: 6px -22px 0;
}

@media (prefers-reduced-motion: reduce) {
  #ksc-content .ksc-steckbrief-route::after { transition: none !important; }
}

/* ---------------------------------------------------------------
   Huelle der Joomla-Zusatzfelder

   Joomla fasst jedes Zusatzfeld in
   <ul class="fields-container"><li class="field-entry">…</li></ul>
   (components/com_fields/layouts/fields/render.php). Ohne eigene
   Regel zeigt der Browser dafuer seinen Aufzaehlungspunkt und rueckt
   den Inhalt ein - beim Reiter-Feld sah man einen Punkt, hinter dem
   nichts steht.

   Die Liste bleibt im Markup, sie ist Joomlas Bauform. Sie verliert
   hier nur ihr Aussehen.

   Der Wert steckt zusaetzlich in <span class="field-value">. Ein span
   ist von Haus aus inline; die Kaesten darin wuerden sonst nicht die
   volle Breite bekommen.
   --------------------------------------------------------------- */
#ksc-content .fields-container {
  list-style: none;
  margin: 0;
  padding: 0;
}

#ksc-content .fields-container > .field-entry {
  list-style: none;
  margin: 0;
}

#ksc-content .fields-container > .field-entry::marker { content: none; }

#ksc-content .field-value { display: block; }

/* ---------------------------------------------------------------
   Reiter der Termin-Beitraege

   Erzeugt vom Feld-Plugin "Felder - KSC Reiter". Ein Markup, zwei
   Darstellungen: ab 780 px Karteikarten mit genau einem sichtbaren
   Panel, darunter Aufklapper.

   Alle Regeln, die etwas ausblenden, haengen an .js-anim. Ohne
   JavaScript stehen saemtliche Reiter offen untereinander - lesbar
   statt leer.
   --------------------------------------------------------------- */
#ksc-content .ksc-reiter { margin: 2rem 0; }

/* Die Leiste ist die Ausnahme: Sie ist ohne JavaScript nutzlos, weil
   nichts umgeschaltet wuerde. Deshalb grundsaetzlich aus. */
#ksc-content .ksc-reiter-leiste { display: none; }

@media (min-width: 780px) {
  /* Umbrechen statt seitlich scrollen.
     Vorher stand hier overflow-x: auto. Auf einem Tablet passten die
     fuenf Laschen nicht nebeneinander, und die letzte wurde ohne
     jeden Hinweis abgeschnitten - sie sah aus wie ein Fehler, nicht
     wie etwas Verschiebbares. Bei sechs Reitern mit langen Titeln
     waere dasselbe auch auf einem schmalen Laptop passiert.

     row-gap ist kleiner als column-gap: Laschen untereinander duerfen
     dichter stehen als nebeneinander, sonst zerfaellt die Reihe
     optisch in einzelne Knoepfe. */
  .js-anim #ksc-content .ksc-reiter-leiste {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 6px;
    margin: 0;
    padding: 0;
  }
}

#ksc-content .ksc-reiter-knopf {
  position: relative;
  flex: 0 0 auto;
  appearance: none;
  border: 1px solid rgba(15, 21, 32, .14);
  border-bottom: 0;
  border-radius: 10px 10px 0 0;
  background: var(--bg-light-alt);
  padding: 13px 22px;
  margin: 0;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 13px;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--muted-on-light);
  white-space: nowrap;
  cursor: pointer;
  transition: background .25s cubic-bezier(.16, 1, .3, 1),
              color .25s cubic-bezier(.16, 1, .3, 1),
              transform .25s cubic-bezier(.16, 1, .3, 1);
}

#ksc-content .ksc-reiter-knopf:hover {
  background: #ffffff;
  color: #376493;
  transform: translateY(-1px);
}

#ksc-content .ksc-reiter-knopf[aria-selected="true"] {
  background: #376493;
  border-color: #376493;
  color: #ffffff;
  transform: none;
}

/* Die Trennlinie sitzt am Panel, nicht unter der Leiste.
   Solange die Leiste einzeilig war, konnte die aktive Lasche die
   Linie mit einem Streifen ueberdecken und wirkte dadurch
   angewachsen. Sobald die Leiste umbricht, laege dieser Streifen bei
   einer Lasche der oberen Reihe frei in der Luft. Die Linie gehoert
   deshalb an die Oberkante des Panels - dort stimmt sie in jeder
   Anordnung. */

#ksc-content .ksc-reiter-knopf:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* Zwischen Umschaltpunkt und Laptopbreite etwas schmaler, damit die
   Leiste seltener umbrechen muss. Unter 780 px greift ohnehin der
   Aufklapper. */
@media (min-width: 780px) and (max-width: 1100px) {
  #ksc-content .ksc-reiter-knopf {
    padding: 11px 15px;
    font-size: 12px;
    letter-spacing: .06em;
  }
}

#ksc-content .ksc-reiter-panel {
  border: 1px solid rgba(15, 21, 32, .14);
  border-radius: 12px;
  background: #ffffff;
  box-shadow: 0 2px 14px rgba(15, 21, 32, .05);
  margin: 0 0 8px;
  overflow: hidden;
}

@media (min-width: 780px) {
  .js-anim #ksc-content .ksc-reiter-panel {
    border-top: 2px solid #376493;
    border-radius: 0 0 16px 16px;
    margin: 0;
  }

  .js-anim #ksc-content .ksc-reiter-panel:not(.ist-aktiv) { display: none; }
}

/* Der Abstand zwischen den Aufklappern sitzt an den Panels. Beim
   letzten muss er weg, sonst haengt unter dem Block eine Luecke, die
   auf Desktop niemand sieht und auf Mobil stoert. */
#ksc-content .ksc-reiter-koerper > .ksc-reiter-panel:last-child {
  margin-bottom: 0;
}

#ksc-content .ksc-reiter-inhalt {
  padding: clamp(20px, 3vw, 34px) clamp(18px, 3vw, 30px);
  line-height: 1.65;
  color: var(--text-on-light);
}

#ksc-content .ksc-reiter-inhalt > :first-child { margin-top: 0; }
#ksc-content .ksc-reiter-inhalt > :last-child  { margin-bottom: 0; }

/* Der Aufklapper-Knopf traegt auf Mobil die Ueberschrift. Auf Desktop
   steht sie in der Leiste, hier waere sie doppelt. */
#ksc-content .ksc-reiter-klapp { display: none; }

@media (max-width: 779px) {
  .js-anim #ksc-content .ksc-reiter-klapp {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    width: 100%;
    appearance: none;
    border: 0;
    background: var(--bg-light-alt);
    padding: 14px 16px;
    text-align: left;
    font-family: Oswald, system-ui, sans-serif;
    font-weight: 600;
    font-size: 13px;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--muted-on-light);
    cursor: pointer;
  }

  .js-anim #ksc-content .ksc-reiter-klapp[aria-expanded="true"] {
    background: #376493;
    color: #ffffff;
  }

  .js-anim #ksc-content .ksc-reiter-inhalt { padding: 16px; }
}

/* Plus, das beim Oeffnen zum Minus wird. Zwei Striche statt eines
   Pfeils: Der Pfeil braeuchte eine Drehung um die eigene Mitte und
   damit eine feste Groesse, das Kreuz nicht. */
#ksc-content .ksc-reiter-zeichen {
  position: relative;
  flex: 0 0 auto;
  width: 12px;
  height: 12px;
}

#ksc-content .ksc-reiter-zeichen::before,
#ksc-content .ksc-reiter-zeichen::after {
  content: "";
  position: absolute;
  background: currentColor;
  border-radius: 2px;
  transition: transform .3s cubic-bezier(.16, 1, .3, 1);
}

#ksc-content .ksc-reiter-zeichen::before { left: 0; top: 5px; width: 12px; height: 2px; }
#ksc-content .ksc-reiter-zeichen::after  { left: 5px; top: 0; width: 2px; height: 12px; }

#ksc-content .ksc-reiter-klapp[aria-expanded="true"] .ksc-reiter-zeichen::after {
  transform: scaleY(0);
}

/* Der Steckbrief liegt im Reiter bereits auf weissem Grund. Sein
   eigener Schatten wuerde dort schweben, deshalb nur die Linie. */
#ksc-content .ksc-reiter-inhalt .ksc-steckbrief,
#ksc-content .ksc-reiter-inhalt .ksc-punkte {
  box-shadow: none;
}

/* Verweise in den Reitern.
   Die Grundregel des Entwurfs setzt a { color: #ffffff } - auf den
   hellen Kaesten waere das unsichtbar. In den farbigen Kaesten nimmt
   der Verweis deren Ton an, sonst gilt das Vereinsblau. */
#ksc-content .ksc-reiter-inhalt a,
#ksc-content .ksc-hinweis a,
#ksc-content .ksc-steckbrief-info a,
#ksc-content .ksc-punkt a {
  color: var(--ksc-ton, #376493);
  text-underline-offset: 2px;
  transition: color .25s cubic-bezier(.16, 1, .3, 1);
}

#ksc-content .ksc-reiter-inhalt a:hover,
#ksc-content .ksc-hinweis a:hover,
#ksc-content .ksc-steckbrief-info a:hover,
#ksc-content .ksc-punkt a:hover {
  color: var(--accent);
}

#ksc-content .ksc-reiter-abschluss { margin-top: 1.5em; }

#ksc-content .ksc-reiter-abschluss > :first-child { margin-top: 0; }
#ksc-content .ksc-reiter-abschluss > :last-child  { margin-bottom: 0; }

@media (prefers-reduced-motion: reduce) {
  #ksc-content .ksc-reiter-knopf,
  #ksc-content .ksc-reiter-zeichen::before,
  #ksc-content .ksc-reiter-zeichen::after { transition: none !important; }
}



/* ---------------------------------------------------------------
   Terminkarten: feste Breite auf jedem Geraet

   Vorher teilten sich die Karten den Platz vollstaendig auf
   (flex: 1 1 0) - eine Karte wurde 1280 px breit, drei Karten in einem
   schmalen Fenster je 230 px. Unterhalb von 769 px zwang eine weitere
   Regel sie auf volle Breite.

   Jetzt: min(380px, 100%). Auf jedem Geraet exakt 380 px, ausser das
   Fenster ist selbst schmaler - dann randbuendig. Das ist die einzige
   Ausnahme und unvermeidbar.

   Damit bleibt auch der Bildausschnitt konstant: 380 x 190 px, also
   2:1. Bilder in diesem Verhaeltnis werden nirgends beschnitten.
   --------------------------------------------------------------- */
#pp-cards {
  height: auto !important;
  flex-direction: row !important;
  flex-wrap: wrap;
  justify-content: center;
  row-gap: 24px;
}

.ksc-termin-karte {
  position: relative;
  flex: 0 0 auto !important;
  width: min(380px, 100%) !important;
  max-width: none !important;
  height: auto !important;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  padding: 1px;
  border: 0;
  border-radius: 16px;
  background: rgba(255, 255, 255, .10);
  transition: transform .4s cubic-bezier(.16, 1, .3, 1),
              background-color .4s ease, box-shadow .4s ease;
}

.ksc-termin-karte:hover {
  transform: translateY(-6px);
  background: rgba(255, 255, 255, .2);
  box-shadow: 0 16px 44px rgba(0, 0, 0, .55);
}

/* Der Rand ist keine border mehr, sondern der 1 px breite Streifen
   zwischen Karte und Innenschicht. Nur dort ist das umlaufende
   Lichtstueck sichtbar - .ksc-termin-innen verdeckt den Rest. */
.ksc-termin-innen {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  overflow: hidden;
  border-radius: 15px;
  background: linear-gradient(160deg, rgb(24, 24, 27), rgb(0, 0, 0));
}

/* Das Lichtstueck laeuft schon im Projekt (.ksc-trail, offset-path).
   Auf der alten Rueckseite lief es dauerhaft; hier startet es erst
   beim Ueberfahren, sonst rechnete jede Karte staendig mit. */
.ksc-termin-karte .ksc-trail {
  opacity: 0;
  animation-duration: 2.4s;
  animation-play-state: paused;
  transition: opacity .25s ease;
}

.ksc-termin-karte:hover .ksc-trail {
  opacity: 1;
  animation-play-state: running;
}

.ksc-termin-bild {
  position: relative;
  aspect-ratio: 2 / 1;
  background-position: center center;
  background-size: cover;
  background-repeat: no-repeat;
}

/* Datum als eigener Streifen unter dem Bild. Vorher lag es als Marke
   im Bild und verdeckte dort Teile des Motivs - bei Plakatmotiven mit
   Schrift besonders stoerend. */
.ksc-termin-datum {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 9px 20px;
  /* Vom Nutzer vorgegeben. Balken und Knopf tragen denselben Ton; beim
     Ueberfahren faehrt im Knopf --accent (#1E7BFF) ein, wodurch sich
     beide dann voneinander absetzen. */
  background: #376493;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 12px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: #ffffff;
}

.ksc-termin-datum svg {
  flex: 0 0 auto;
}

.ksc-termin-inhalt {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  padding: 18px 20px 20px;
}

.ksc-termin-titel {
  margin: 0;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 17px;
  line-height: 1.25;
  color: #ffffff;
}

.ksc-termin-merkmale {
  margin: 14px 0 0;
  padding: 0;
  list-style: none;
  font-size: 13px;
  line-height: 1.5;
  color: rgb(161, 161, 170);
}

.ksc-termin-merkmale li {
  display: flex;
  align-items: flex-start;
  gap: 9px;
  margin-bottom: 8px;
}

.ksc-termin-merkmale li:last-child { margin-bottom: 0; }

.ksc-termin-merkmale svg {
  flex: 0 0 auto;
  margin-top: 3px;
}

/* margin-top: auto haelt den Knopf unten, auch wenn eine Karte
   weniger Merkmale hat als ihre Nachbarn. */
.ksc-termin-fuss {
  margin-top: auto;
  padding-top: 16px;
}

.ksc-termin-knopf {
  position: relative;
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: 100%;
  min-height: 44px;
  padding: 11px;
  border: none;
  border-radius: 8px;
  cursor: pointer;
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .04em;
  color: #ffffff;
  background: #376493;
  transition: transform .12s ease;
}

/* Farbflaeche faehrt von links ein - wie bei den Abschlussknöpfen der
   Unterseiten (.ksc-btn-split). Dort liegt die Flaeche mit z-index: -1
   hinter dem Text; das geht hier nicht, weil der Knopf einen deckenden
   Hintergrund hat und die Flaeche darunter unsichtbar bliebe. Deshalb
   liegt sie hier ueber dem Hintergrund und Text und Pfeil darüber. */
.ksc-termin-knopf::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background: var(--accent);
  transform: translateX(-100%);
  transition: transform .35s ease;
}

.ksc-termin-knopf:hover::before { transform: translateX(0); }

.ksc-termin-knopf > span,
.ksc-termin-knopf > svg {
  position: relative;
  z-index: 1;
}

.ksc-termin-knopf:active { transform: scale(.97); }

.ksc-termin-knopf:focus-visible {
  outline: 2px solid #ffffff;
  outline-offset: 2px;
}

.ksc-termin-knopf svg {
  transition: transform .3s cubic-bezier(.16, 1, .3, 1);
}

.ksc-termin-knopf:hover svg { transform: translateX(3px); }

/* ---------------------------------------------------------------
   Shimmer-Sweep ueber die ganze Karte

   Ein schraeger, sehr heller Streifen laeuft beim Ueberfahren einmal
   von links nach rechts. Laeuft zusammen mit dem umlaufenden
   Lichtstueck (.ksc-trail) - beides ist ausdruecklich gewuenscht.

   Zwei Entscheidungen, die nicht offensichtlich sind:

   1. Die Schicht liegt UEBER dem Inhalt (z-index: 3). Bildstreifen und
      Datumsbalken sind deckend; darunter waere vom Streifen auf zwei
      Dritteln der Karte nichts zu sehen. pointer-events: none haelt
      den Knopf anklickbar.

   2. Bewegt wird per transition, nicht per animation - und die
      Transition steht nur im Hover-Zustand. Dadurch laeuft der
      Streifen beim Betreten genau einmal und springt beim Verlassen
      ohne Ruecklauf zurueck. Mit einer Transition im Ruhezustand
      liefe er rueckwaerts wieder durch die Karte.

   Rechnung zu den Wegmarken: Der Streifen ist 60 % der Kartenbreite.
   Bei -120 % steht seine rechte Kante bei -12 % (knapp ausserhalb),
   bei +180 % seine linke Kante bei +108 %. Wird die Breite geaendert,
   gehoeren beide Werte nachgerechnet.
   --------------------------------------------------------------- */
.ksc-termin-sweep {
  position: absolute;
  inset: 0;
  z-index: 3;
  overflow: hidden;
  border-radius: 15px;
  pointer-events: none;
}

.ksc-termin-sweep::before {
  content: "";
  position: absolute;
  /* Der Schraegstellung wegen oben und unten ueberstehen, sonst bleiben
     an den Kanten dreieckige Ecken ohne Licht. */
  top: -25%;
  bottom: -25%;
  left: 0;
  width: 60%;
  background: linear-gradient(100deg,
              rgba(255, 255, 255, 0) 0%,
              rgba(255, 255, 255, .12) 50%,
              rgba(255, 255, 255, 0) 100%);
  transform: translateX(-120%) skewX(-18deg);
}

.ksc-termin-karte:hover .ksc-termin-sweep::before {
  transform: translateX(180%) skewX(-18deg);
  transition: transform .8s cubic-bezier(.4, 0, .2, 1);
}

@media (prefers-reduced-motion: reduce) {
  .ksc-termin-karte,
  .ksc-termin-knopf::before,
  .ksc-termin-knopf svg { transition: none !important; }
  .ksc-termin-karte:hover { transform: none; }
  .ksc-termin-knopf:active { transform: none; }
  /* Ein durchlaufender Lichtstreifen ist genau das, was hier
     abbestellt wurde - er entfaellt ganz, statt nur schneller zu
     laufen. */
  .ksc-termin-sweep { display: none; }
}

/* ---------------------------------------------------------------
   Satz anstelle der Karten, wenn kein Termin veroeffentlicht ist.

   #pp-cards ist ein Flex-Container mit 24 px Abstand. Ein einzelnes
   Kind darin schrumpfte ohne flex-basis auf seine Textbreite und
   klebte links - deshalb volle Breite und mittige Ausrichtung.
   --------------------------------------------------------------- */
.ksc-termine-leer {
  flex: 1 1 100%;
  margin: 0;
  padding: clamp(2rem, 5vw, 3.5rem) 1.5rem;
  text-align: center;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 500;
  font-size: clamp(17px, 2.2vw, 21px);
  letter-spacing: .02em;
  color: rgba(255, 255, 255, .72);
}

/* ---------------------------------------------------------------
   Mannschaftskarten: Ordnungszahl im Hintergrund

   Vorher eine feste Groesse (clamp 90-150 px), unten rechts angeschnitten
   und mit 6 % Deckkraft kaum zu erkennen. Gewuenscht: rund 85 % der
   Kartenhoehe und deutlicher sichtbar.

   Die Karte ist unterschiedlich hoch - je nach Liganame und Umbruch der
   Schaltflaechen. Eine feste Pixelgroesse traefe die 85 % also nur bei
   einer Breite. Deshalb bindet sich die Ziffer an die Kartenhoehe:
   Das Element liegt mit inset: 0 ueber die volle Karte und wird selbst
   zum Groessenbezug (container-type: size). Die Ziffer im Inneren rechnet
   dann in cqh, also in Prozent der Kartenhoehe.

   Die Ziffer sitzt an der Unterkante und ragt ein Stueck darueber
   hinaus, wird also angeschnitten - so war es im Entwurf gedacht.

   99cqh sind nicht willkuerlich: Die Ziffern der Anton sind 0,86 em hoch
   (nachgemessen in der Schriftdatei). 0,85 / 0,86 = 0,99 - die sichtbare
   Ziffer nimmt damit die gewuenschten 85 % ein, nicht das Schriftkegelmass.

   Rueckfall: Aeltere Browser ohne cqh ignorieren die Zeile; dann gilt
   weiter die clamp-Groesse aus dem Stylesheet des Entwurfs.
   --------------------------------------------------------------- */
.team-bignum {
  inset: 0 !important;
  right: 0 !important;
  bottom: 0 !important;
  display: flex;
  align-items: flex-end;
  justify-content: flex-end;
  padding-right: 12px;
  container-type: size;
  color: rgba(255, 255, 255, .12) !important;
}

/* Der negative Rand schiebt die Ziffer ueber die Unterkante hinaus.
   Beschnitten wird sie von der Karte selbst - die traegt overflow:
   hidden und einen Eckenradius, der Schnitt folgt also der Rundung.

   In cqh, damit der Anschnitt bei jeder Kartenhoehe gleich stark
   ausfaellt - er betraegt rund ein Achtel der Kartenhoehe. */
.team-bignum > span {
  font-size: 99cqh;
  line-height: .86;
  margin-bottom: -13cqh;
}

/* ---------------------------------------------------------------
   Fehlerseite (error.php)

   Anders als die Unterseiten steht sie auf dunklem Grund - eine
   Fehlermeldung soll nicht wie ein Inhaltsabschnitt wirken. Die
   Nahtstellen sind deshalb andere: oben von der Hero-Unterkante auf
   --bg-deep, unten von --bg-deep auf die Anfangsfarbe des
   Fussbereichs (#363F50).
   --------------------------------------------------------------- */

.ksc-fehler {
  position: relative;
  display: flow-root;
  background: var(--bg-deep);
  color: var(--text-on-dark);
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  padding: clamp(6rem, 10vw, 10rem) 0 calc(clamp(1.5rem, 2.5vw, 2.5rem) + 200px);
}

.ksc-fehler-verlauf-oben,
.ksc-fehler-verlauf-unten {
  position: absolute;
  left: 0;
  right: 0;
  pointer-events: none;
}

.ksc-fehler-verlauf-oben {
  top: 0;
  height: 180px;
  background: linear-gradient(to bottom,
    var(--bg-dark) 0%,
    color-mix(in srgb, var(--bg-dark) 60%, var(--bg-deep)) 40%,
    color-mix(in srgb, var(--bg-dark) 25%, var(--bg-deep)) 70%,
    var(--bg-deep) 96%,
    var(--bg-deep) 100%);
}

/* Unterhalb von 1024 px endet der Hero bereits in --bg-deep; dort
   waere ein Verlauf sinnlos. */
@media (max-width: 1023px) {
  .ksc-fehler-verlauf-oben { background: var(--bg-deep); }
}

.ksc-fehler-verlauf-unten {
  bottom: 0;
  height: 200px;
  background: linear-gradient(to top,
    #363F50 0%,
    color-mix(in srgb, #363F50 60%, var(--bg-deep)) 40%,
    color-mix(in srgb, #363F50 25%, var(--bg-deep)) 70%,
    var(--bg-deep) 96%,
    var(--bg-deep) 100%);
}

.ksc-fehler-huelle {
  position: relative;
  z-index: 1;
  max-width: 1280px;
  margin: 0 auto;
  padding: 0 clamp(1.5rem, 4vw, 2.5rem);
  text-align: center;
}

.ksc-fehler-titel {
  margin: .6rem 0 0;
  font-family: Anton, sans-serif;
  font-weight: 400;
  font-size: clamp(2.5rem, 6vw, 5rem);
  line-height: .94;
  letter-spacing: .01em;
  text-transform: uppercase;
  color: var(--text-on-dark);
}

/* Die Zeilenbegrenzung bleibt, der Block wird aber mittig gestellt -
   sonst stuende der Text linksbuendig in einer 1280 px breiten Spalte. */
.ksc-fehler-text {
  margin: 1.25rem auto 0;
  max-width: 60ch;
  font-size: clamp(1rem, 1.5vw, 1.15rem);
  line-height: 1.7;
  color: var(--muted-on-dark);
}

/* Wege zurueck als Pillen - dieselbe Bauart wie die Sprungmarken auf
   der Datenschutzseite, nur auf dunklem Grund. */
.ksc-fehler-wege {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .6rem;
  margin-top: clamp(1.75rem, 3vw, 2.5rem);
}

.ksc-fehler-wege a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 20px;
  border: 1px solid rgba(255, 255, 255, .22);
  border-radius: 9999px;
  background: rgba(255, 255, 255, .05);
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: .9rem;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--text-on-dark);
  text-decoration: none;
  transition: background-color .2s ease, border-color .2s ease;
}

.ksc-fehler-wege a:hover {
  background: var(--accent);
  border-color: var(--accent);
  color: #ffffff;
}

.ksc-fehler-wege a:focus-visible {
  outline: 2px solid #ffffff;
  outline-offset: 2px;
}

/* Der erste Weg fuehrt zur Startseite und ist der wahrscheinlichste. */
.ksc-fehler-wege a:first-child {
  background: var(--accent);
  border-color: var(--accent);
}

.ksc-fehler-wege a:first-child:hover {
  background: var(--accent-bright);
  border-color: var(--accent-bright);
}

/* ---------------------------------------------------------------
   Unterseite Tischfussball: Abschnitt "Die wichtigsten Regeln"

   Dunkler Grund (--bg-deep) zwischen herkunft (--bg-mid) und
   tischtypen (--bg-light). Kennfarben: Rot fuer Verbote, Blau fuer
   Ablaeufe - dieselben Werte wie in der Zeitleiste der
   Vereinsgeschichte.
   --------------------------------------------------------------- */

.ksc-regel-zeiten {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(1rem, 2vw, 1.5rem);
  margin-top: clamp(1.5rem, 3vw, 2rem);
}

@media (min-width: 768px) {
  .ksc-regel-zeiten { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.ksc-regel-zeit {
  height: 100%;
  padding: clamp(1.25rem, 2.5vw, 1.75rem);
  border: 1px solid rgba(255, 255, 255, .12);
  border-radius: 16px;
  background: rgba(255, 255, 255, .04);
}

.ksc-regel-zeit-text {
  margin-top: 8px;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: .95rem;
  letter-spacing: .03em;
  text-transform: uppercase;
  color: var(--text-on-dark);
}

.ksc-regel-karten {
  display: grid;
  grid-template-columns: 1fr;
  align-items: start;
  gap: clamp(1.25rem, 2vw, 1.75rem);
  margin-top: clamp(2.5rem, 5vw, 4rem);
}

@media (min-width: 1024px) {
  .ksc-regel-karten { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* position: relative traegt den Kennfarbenbalken an der Oberkante. */
.ksc-regel-karte {
  position: relative;
  height: 100%;
  overflow: hidden;
  padding: clamp(1.5rem, 3vw, 2rem);
  border: 1px solid rgba(255, 255, 255, .12);
  border-radius: 16px;
  background: rgba(255, 255, 255, .04);
}

.ksc-regel-balken {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
}

.ksc-regel-titel {
  margin: 0;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: clamp(1.05rem, 1.5vw, 1.3rem);
  line-height: 1.25;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--text-on-dark);
}

.ksc-regel-liste {
  margin: clamp(1rem, 2vw, 1.25rem) 0 0;
  padding: 0;
  list-style: none;
  font-size: 15px;
  line-height: 1.7;
  color: var(--muted-on-dark);
}

.ksc-regel-liste li:last-child { margin-bottom: 0 !important; }

/* Die Stichworte sollen sich vom erlaeuternden Text abheben. */
.ksc-regel-liste b {
  font-weight: 600;
  color: var(--text-on-dark);
}

.ksc-regel-hinweis {
  margin: clamp(2rem, 4vw, 3rem) 0 0;
  max-width: 70ch;
  font-size: 14px;
  line-height: 1.7;
  color: var(--muted-on-dark);
}

.ksc-regel-hinweis a {
  color: var(--accent-bright);
  text-decoration: none;
}

.ksc-regel-hinweis a:hover { text-decoration: underline; }

/* ---------------------------------------------------------------
   Leuchtrahmen fuer weitere Karten (.ksc-beam)

   Die Verlaeufe, Masken und die Farbwanderung stehen unveraendert bei
   #pp-cta im Stylesheet des Entwurfs; dort ist der Selektor um
   .ksc-beam erweitert. Hier stehen nur die Abweichungen.

   Die CTA-Karte im Hero hat 12 px Ecken, die Trainingszeiten-Karte
   16 px. Ohne Korrektur schnitte der Rahmen die Ecken an.
   --------------------------------------------------------------- */
.ksc-beam {
  position: relative;
}

.ksc-beam::after,
.ksc-beam [data-beam-bloom] {
  border-radius: 15px;
  clip-path: inset(0 round 16px);
}

.ksc-beam::before {
  border-radius: 16px;
  clip-path: inset(0 round 16px);
}

/* ---------------------------------------------------------------
   Impressumseite (com_content, alternatives Layout "impressum")

   Rahmen und Nahtstellen sind zeichengleich mit .ksc-kontakt und
   .ksc-mannschaft. Aendert sich etwas an den Verlaeufen, muessen
   alle drei nachgezogen werden - der Bau prueft das und bricht bei
   Abweichung ab.

   Unterschied zu den beiden anderen: Hier bestimmt das Template die
   Textgestaltung vollstaendig, weil der Inhalt aus dem Editor kommt
   und keine fremde Erweiterung eigenes CSS mitbringt.
   --------------------------------------------------------------- */

.ksc-impressum {
  position: relative;
  display: flow-root;
  background: var(--bg-light);
  color: var(--text-on-light);
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  padding: clamp(6rem, 10vw, 10rem) 0 calc(clamp(1.5rem, 2.5vw, 2.5rem) + 200px);
}

.ksc-impressum-verlauf-oben,
.ksc-impressum-verlauf-unten {
  position: absolute;
  left: 0;
  right: 0;
  pointer-events: none;
}

.ksc-impressum-verlauf-oben {
  top: 0;
  height: 180px;
  background: linear-gradient(to bottom,
    var(--bg-dark) 0%,
    color-mix(in srgb, var(--bg-dark) 60%, var(--bg-light)) 40%,
    color-mix(in srgb, var(--bg-dark) 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

@media (max-width: 1023px) {
  .ksc-impressum-verlauf-oben {
    background: linear-gradient(to bottom,
      var(--bg-deep) 0%,
      color-mix(in srgb, var(--bg-deep) 60%, var(--bg-light)) 40%,
      color-mix(in srgb, var(--bg-deep) 25%, var(--bg-light)) 70%,
      var(--bg-light) 96%,
      var(--bg-light) 100%);
  }
}

.ksc-impressum-verlauf-unten {
  bottom: 0;
  height: 200px;
  background: linear-gradient(to top,
    #363F50 0%,
    color-mix(in srgb, #363F50 60%, var(--bg-light)) 40%,
    color-mix(in srgb, #363F50 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

.ksc-impressum-huelle {
  position: relative;
  z-index: 1;
  max-width: 1280px;
  margin: 0 auto;
  padding: 0 clamp(1.5rem, 4vw, 2.5rem);
}

.ksc-impressum-titel {
  margin: 0;
  font-family: Anton, sans-serif;
  font-weight: 400;
  font-size: clamp(2.25rem, 4.5vw, 4rem);
  line-height: 1.02;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  color: var(--text-on-light);
}

/* Zwei Spalten erst ab 1024 px. align-items: start laesst die Karten
   ihre natuerliche Hoehe behalten, statt sie zeilenweise auf die
   hoechste zu ziehen. */
.ksc-impressum-raster {
  margin-top: clamp(2rem, 3.5vw, 3rem);
  display: grid;
  grid-template-columns: 1fr;
  align-items: start;
  gap: clamp(1.25rem, 2vw, 1.75rem);
}

@media (min-width: 1024px) {
  .ksc-impressum-raster {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* Kartenbild wie die Termin- und Partnerkarten: weiss, 16 px Ecken,
   feine Linie, sehr flacher Schatten. */
.ksc-impressum-karte {
  background: #ffffff;
  border: 1px solid rgba(15, 21, 32, .10);
  border-radius: 16px;
  padding: clamp(1.5rem, 3vw, 2.25rem);
  box-shadow: 0 10px 30px rgba(15, 21, 32, .06);
}

.ksc-impressum-kopf {
  margin: 0 0 1rem;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: clamp(1.05rem, 1.5vw, 1.3rem);
  line-height: 1.25;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--text-on-light);
}

.ksc-impressum-kopf::before {
  content: "";
  display: block;
  width: 34px;
  height: 3px;
  margin-bottom: .85rem;
  border-radius: 2px;
  background: var(--accent);
}

/* Ohne Ueberschrift - der Teil vor der ersten Zwischenueberschrift. */
.ksc-impressum-karte--vorspann {
  border-top: 3px solid var(--accent);
}

.ksc-impressum-text {
  max-width: 68ch;
  font-size: 1rem;
  line-height: 1.75;
  color: var(--text-on-light);
}

.ksc-impressum-text > :first-child { margin-top: 0; }
.ksc-impressum-text > :last-child { margin-bottom: 0; }

.ksc-impressum-text p {
  margin: 0 0 .9rem;
}

/* Anschriften stehen im Editor als Absaetze mit <br>. Der engere
   Zeilenabstand gilt deshalb fuer Absaetze, die Zeilenumbrueche
   enthalten - sonst stuenden Strasse und Ort weit auseinander. */
.ksc-impressum-text p:has(br) {
  line-height: 1.55;
}

.ksc-impressum-text h3,
.ksc-impressum-text h4 {
  margin: 1.6rem 0 .6rem;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 1rem;
  letter-spacing: .03em;
  text-transform: uppercase;
  color: var(--text-on-light);
}

.ksc-impressum-text strong,
.ksc-impressum-text b {
  font-weight: 600;
}

.ksc-impressum-text ul,
.ksc-impressum-text ol {
  margin: 0 0 .9rem;
  padding-left: 1.2rem;
}

.ksc-impressum-text li {
  margin: .3rem 0;
}

/* Die Grundregel des Entwurfs setzt a { color:#ffffff } - auf weissem
   Grund unsichtbar. */
.ksc-impressum-text a {
  color: var(--accent);
  text-decoration: none;
  overflow-wrap: anywhere;
}

.ksc-impressum-text a:hover {
  text-decoration: underline;
}

.ksc-impressum-text a:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* Bleibt eine H1 im Beitragstext stehen, faellt sie hier auf, statt
   den Seitentitel zu wiederholen - Hinweis in der Anleitung. */
.ksc-impressum-text h1 {
  margin: 0 0 .9rem;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 1.15rem;
  letter-spacing: .03em;
  text-transform: uppercase;
}

/* ---------------------------------------------------------------
   Datenschutzseite (com_content, alternatives Layout "datenschutz")

   Anders als beim Impressum keine Karten: Der Text ist zu lang und
   zu ungleich lang fuer ein Raster. Stattdessen eine Lesespalte mit
   Sprungmarken darueber.

   Rahmen und Nahtstellen sind zeichengleich mit .ksc-mannschaft,
   .ksc-kontakt und .ksc-impressum - der Bau prueft das.
   --------------------------------------------------------------- */

.ksc-datenschutz {
  position: relative;
  display: flow-root;
  background: var(--bg-light);
  color: var(--text-on-light);
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  padding: clamp(6rem, 10vw, 10rem) 0 calc(clamp(1.5rem, 2.5vw, 2.5rem) + 200px);
}

.ksc-datenschutz-verlauf-oben,
.ksc-datenschutz-verlauf-unten {
  position: absolute;
  left: 0;
  right: 0;
  pointer-events: none;
}

.ksc-datenschutz-verlauf-oben {
  top: 0;
  height: 180px;
  background: linear-gradient(to bottom,
    var(--bg-dark) 0%,
    color-mix(in srgb, var(--bg-dark) 60%, var(--bg-light)) 40%,
    color-mix(in srgb, var(--bg-dark) 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

@media (max-width: 1023px) {
  .ksc-datenschutz-verlauf-oben {
    background: linear-gradient(to bottom,
      var(--bg-deep) 0%,
      color-mix(in srgb, var(--bg-deep) 60%, var(--bg-light)) 40%,
      color-mix(in srgb, var(--bg-deep) 25%, var(--bg-light)) 70%,
      var(--bg-light) 96%,
      var(--bg-light) 100%);
  }
}

.ksc-datenschutz-verlauf-unten {
  bottom: 0;
  height: 200px;
  background: linear-gradient(to top,
    #363F50 0%,
    color-mix(in srgb, #363F50 60%, var(--bg-light)) 40%,
    color-mix(in srgb, #363F50 25%, var(--bg-light)) 70%,
    var(--bg-light) 96%,
    var(--bg-light) 100%);
}

.ksc-datenschutz-huelle {
  position: relative;
  z-index: 1;
  max-width: 1280px;
  margin: 0 auto;
  padding: 0 clamp(1.5rem, 4vw, 2.5rem);
}

.ksc-datenschutz-titel {
  margin: 0;
  font-family: Anton, sans-serif;
  font-weight: 400;
  font-size: clamp(2.25rem, 4.5vw, 4rem);
  line-height: 1.02;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  color: var(--text-on-light);
}

/* Sprungmarken als Pillen - dieselbe Bauart wie die Jahreszahlen
   der Zeitleiste auf der Vereinsgeschichte. */
.ksc-datenschutz-verzeichnis {
  margin: clamp(1.75rem, 3vw, 2.5rem) 0 0;
}

.ksc-datenschutz-verzeichnis-kopf {
  margin: 0 0 .9rem;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: .8rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted-on-light);
}

.ksc-datenschutz-verzeichnis ul {
  display: flex;
  flex-wrap: wrap;
  gap: .5rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.ksc-datenschutz-verzeichnis a {
  display: inline-flex;
  align-items: center;
  min-height: 36px;
  padding: 0 14px;
  border: 1px solid rgba(15, 21, 32, .14);
  border-radius: 9999px;
  background: #ffffff;
  font-size: .85rem;
  font-weight: 500;
  line-height: 1.25;
  color: var(--text-on-light);
  text-decoration: none;
  transition: background-color .2s ease, border-color .2s ease, color .2s ease;
}

.ksc-datenschutz-verzeichnis a:hover {
  background: var(--accent);
  border-color: var(--accent);
  color: #ffffff;
}

.ksc-datenschutz-verzeichnis a:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* Lesespalte. 72 Zeichen, damit die Zeilen auf grossen Bildschirmen
   nicht ueber die vollen 1280 px laufen. */
.ksc-datenschutz-text {
  max-width: 72ch;
  margin-top: clamp(2rem, 3.5vw, 3rem);
  font-size: 1rem;
  line-height: 1.8;
  color: var(--text-on-light);
}

.ksc-datenschutz-text > :first-child { margin-top: 0; }
.ksc-datenschutz-text > :last-child { margin-bottom: 0; }

.ksc-datenschutz-text p {
  margin: 0 0 1rem;
}

.ksc-datenschutz-text p:has(br) {
  line-height: 1.6;
}

/* Die Sticky-Leiste ist 76 px hoch. Ohne scroll-margin-top verschwaende
   die angesprungene Ueberschrift darunter. */
.ksc-datenschutz-text h2 {
  margin: clamp(2.5rem, 4vw, 3.5rem) 0 1rem;
  padding-top: 1.5rem;
  border-top: 1px solid rgba(15, 21, 32, .12);
  scroll-margin-top: 104px;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: clamp(1.15rem, 1.8vw, 1.5rem);
  line-height: 1.25;
  letter-spacing: .03em;
  text-transform: uppercase;
  color: var(--text-on-light);
}

.ksc-datenschutz-text h2:first-child {
  margin-top: 0;
  padding-top: 0;
  border-top: 0;
}

.ksc-datenschutz-text h3 {
  margin: 1.9rem 0 .6rem;
  scroll-margin-top: 104px;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 1.02rem;
  letter-spacing: .03em;
  color: var(--text-on-light);
}

.ksc-datenschutz-text h4 {
  margin: 1.5rem 0 .5rem;
  font-family: Inter, 'Inter Ersatz', system-ui, sans-serif;
  font-weight: 600;
  font-size: 1rem;
  color: var(--text-on-light);
}

.ksc-datenschutz-text strong,
.ksc-datenschutz-text b {
  font-weight: 600;
}

.ksc-datenschutz-text ul,
.ksc-datenschutz-text ol {
  margin: 0 0 1rem;
  padding-left: 1.25rem;
}

.ksc-datenschutz-text li {
  margin: .35rem 0;
}

.ksc-datenschutz-text a {
  color: var(--accent);
  text-decoration: none;
  overflow-wrap: anywhere;
}

.ksc-datenschutz-text a:hover {
  text-decoration: underline;
}

.ksc-datenschutz-text a:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* Generatoren setzen gelegentlich Tabellen ein - die duerfen auf
   schmalen Bildschirmen nicht das Layout sprengen. */
.ksc-datenschutz-text table {
  display: block;
  overflow-x: auto;
  width: 100%;
  margin: 0 0 1rem;
  border-collapse: collapse;
  font-size: .92rem;
}

.ksc-datenschutz-text th,
.ksc-datenschutz-text td {
  padding: .5rem .75rem;
  border: 1px solid rgba(15, 21, 32, .12);
  text-align: left;
  vertical-align: top;
}

.ksc-datenschutz-text h1 {
  margin: 0 0 1rem;
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 1.2rem;
  letter-spacing: .03em;
  text-transform: uppercase;
}

/* ---------------------------------------------------------------
   Partner und Verbaende: Karten statt freistehender Logos

   Alle vier Logos tragen dunkle Schrift und brauchen einen hellen
   Untergrund - auf dem dunklen Abschnitt waren ITSF und DTFB kaum zu
   erkennen. Deshalb ein weisses Feld nur fuer das Logo, waehrend die
   Karte selbst dunkel bleibt und die Stimmung des Abschnitts haelt.
   --------------------------------------------------------------- */

.partner-karten {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(16px, 1.8vw, 26px);
  align-items: stretch;
  margin: 0 auto;
}

/* Ab hier passen vier Karten nicht mehr nebeneinander, ohne dass die
   Erklaerungen zu schmal umbrechen. */
@media (max-width: 1023px) {
  .partner-karten { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 560px) {
  .partner-karten { grid-template-columns: 1fr; }
}

.partner-karte {
  display: flex;
  flex-direction: column;
  gap: clamp(14px, 1.4vw, 20px);
  padding: clamp(14px, 1.4vw, 20px);
  border: 1px solid rgba(255, 255, 255, 0.10);
  border-radius: 18px;
  background: linear-gradient(160deg,
    rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.025));
  box-shadow: 0 12px 32px rgba(6, 12, 24, 0.22);
  transition: transform 0.3s cubic-bezier(.16, 1, .3, 1),
              border-color 0.3s ease-out,
              box-shadow 0.3s ease-out;
}

.partner-karte:hover {
  transform: translateY(-5px);
  border-color: rgba(43, 140, 255, 0.45);
  box-shadow: 0 20px 44px rgba(6, 12, 24, 0.34);
}

/* Das helle Feld. Kein fester Wert fuer die Hoehe, sondern ein festes
   Seitenverhaeltnis: dadurch waechst das Feld mit der Kartenbreite mit,
   und die Logos werden auf Tablet und Mobil groesser statt in einer
   leeren weissen Flaeche zu schwimmen. Alle vier bleiben untereinander
   gleich gross, obwohl ihre Seitenverhaeltnisse stark abweichen -
   DTFB ist breit und flach, BTFV quadratisch. */
.partner-karte-logo {
  display: flex;
  align-items: center;
  justify-content: center;
  aspect-ratio: 5 / 3;
  /* Das Feld ist selbst ein Flex-Element der Karte. Ohne min-height:0
     gilt dort min-height:auto, also die Hoehe des Inhalts - und das
     Seitenverhaeltnis bliebe wirkungslos. */
  min-height: 0;
  padding: 14px 18px;
  border-radius: 12px;
  background: #ffffff;
}

.partner-karte-logo img {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  /* Ohne diese beiden Zeilen darf das Bild als Flex-Element nicht unter
     seine natuerliche Groesse schrumpfen (min-height:auto ist Vorgabe).
     Das Seitenverhaeltnis des Feldes waere dann wirkungslos und die
     Karte wuerde auf die Bildhoehe aufgeblasen. */
  min-width: 0;
  min-height: 0;
  object-fit: contain;
  display: block;
}

.partner-karte-text {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.partner-karte-name {
  font-family: Oswald, system-ui, sans-serif;
  font-weight: 600;
  font-size: 15px;
  line-height: 1.25;
  letter-spacing: 0.02em;
  color: var(--text-on-dark);
}

.partner-karte-info {
  margin: 0;
  font-size: 13.5px;
  line-height: 1.6;
  color: var(--muted-on-dark);
}

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

/* Navigationspille: linke Ecken hinter dem Logo halten.
   Das Logo ist auf Desktop ein Kreis mit 104 px (Radius 52, Mittelpunkt
   x = 52), senkrecht mittig zur 64 px hohen Pille. Die frueheren Kapsel-
   Enden (Radius 32) beruehrten den Logorand genau und waren dadurch
   vollstaendig verdeckt. Mit 16 px Radius liegen die Ecken 55,4 px vom
   Logomittelpunkt entfernt - 3,4 px zu weit - und schauen heraus.
   10 px Einrueckung bringen sie mit rund 6 px Reserve wieder darunter.
   Unter 1025 px ist das Logo nur 52 px gross und hat den Pillenabschluss
   noch nie verdeckt; dort bleibt alles wie im Entwurf. */
@media (min-width: 1025px) {
  #pp-pill-bg { left: 10px !important; }
}

/* Abschlussknöpfe der Unterseiten: Farbflaeche faehrt von links ein.
   Nur die Knöpfe am Seitenende tragen zusaetzlich .ksc-btn-split; die
   vier "Zum Team"-Knöpfe der Startseite behalten den bisherigen Hover.

   Zur Schichtung: Der Knopftext ist ein reiner Textknoten ohne eigenes
   Element, laesst sich also nicht anheben. Die Flaeche liegt deshalb mit
   z-index: -1 darunter. Damit sie nicht hinter den Hintergrund des
   Abschnitts rutscht, erzeugt isolation: isolate am Knopf selbst einen
   eigenen Stapelzusammenhang. */
.ksc-btn-split {
  position: relative;
  overflow: hidden;
  isolation: isolate;
  transition: border-color .25s ease, transform .12s ease;
}
.ksc-btn-split::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: var(--accent);
  transform: translateX(-100%);
  transition: transform .35s ease;
}
.ksc-btn-split:hover::before { transform: translateX(0); }

/* Der bisherige helle Schleier wuerde neben der Flaeche stehenbleiben. */
.ksc-btn-split:hover {
  background: transparent !important;
  border-color: var(--accent) !important;
}
.ksc-btn-split:active { transform: scale(.95); }

@media (prefers-reduced-motion: reduce) {
  .ksc-btn-split::before { transition: none; }
  .ksc-btn-split:active { transform: none; }
}

  /* reCAPTCHA auf schmalen Bildschirmen */
  @media (max-width:400px){
    .ksc-kontakt .g-recaptcha{ transform:scale(.92); transform-origin:left top; margin-bottom:-6px; }
  }

  /* Mitmachen: Leuchtstreifen auf der Verbindungslinie */
  .join-line{ clip-path:inset(-8px 0px); }
  .join-line::after{
    content:""; position:absolute; top:-3px; left:0; width:100%; height:7px;
    background-image:radial-gradient(closest-side ellipse at center,
      rgba(43,140,255,.55) 0%, rgba(30,123,255,.22) 45%, rgba(30,123,255,0) 100%);
    background-size:230px 100%; background-position:right center;
    background-repeat:no-repeat; filter:blur(2px);
    pointer-events:none;
    animation:ksc-join-schimmer 5.2s linear infinite;
  }
  @keyframes ksc-join-schimmer{
    0%   { transform:translateX(calc(-100% - 125px)); }
    61%  { transform:translateX(125px); }
    100% { transform:translateX(125px); }
  }
  @media (prefers-reduced-motion: reduce){
    .join-line::after{ animation:none; opacity:0; }
  }

  /* Fuenf weitere Animationen: Kurve, Lesen, Galerie, Marken */
  /* A) Leuchtpunkt auf der Zeitstrahl-Kurve.
     stroke-dasharray 20/2000 bei pathLength 1000: der Zwischenraum
     ist laenger als die Kurve, damit immer nur ein Punkt zu sehen
     ist. dashoffset 2020 setzt ihn an den Anfang, 940 schiebt ihn
     vollstaendig ueber das Ende hinaus - dort steht er still, bis
     der Umlauf neu beginnt. Der Vorlauf von 1,9 s laesst der
     bestehenden Zeichenanimation (1,8 s) den Vortritt.
     Der Ruhewert ist deshalb 940 und nicht 2020: Waehrend des
     Vorlaufs gilt der Ruhewert, und mit 2020 stand der Punkt in
     dieser Zeit sichtbar am Anfang der Kurve. */
  .vg-glow{ stroke-dasharray:20 2000; stroke-dashoffset:940;
    opacity:0; pointer-events:none;
    filter:drop-shadow(0 0 5px rgba(43,140,255,.85)); }
  .vg-glow.inview{ opacity:1;
    animation:vgLauf 6s linear 1.9s infinite; }
  @keyframes vgLauf{
    0%   { stroke-dashoffset:2020; }
    78%  { stroke-dashoffset:940; }
    100% { stroke-dashoffset:940; }
  }
  @media (prefers-reduced-motion: reduce){
    .vg-glow{ display:none !important; }
  }
  /* D) Galerie: Bild waechst im festen Rahmen, der Rahmen selbst
     bleibt unveraendert (.sp-gal-item traegt overflow:hidden). */
  .sp-gal-bild img{ transition:transform .5s cubic-bezier(.16,1,.3,1); }
  .sp-gal-item:hover .sp-gal-bild img,
  .sp-gal-item:focus-visible .sp-gal-bild img{ transform:scale(1.06); }
  /* D) Leuchtkasten blendet ein statt hart zu erscheinen. Geschaltet
     wird ueber .sp-lb-offen aus ksc-ui.js. */
  #sp-lb{ opacity:0; transition:opacity .18s ease; }
  #sp-lb [data-lb-stage]{ transform:scale(.97);
    transition:transform .18s cubic-bezier(.16,1,.3,1); }
  #sp-lb.sp-lb-offen{ opacity:1; }
  #sp-lb.sp-lb-offen [data-lb-stage]{ transform:none; }
  @media (prefers-reduced-motion: reduce){
    .sp-gal-bild img{ transition:none !important; }
    .sp-gal-item:hover .sp-gal-bild img{ transform:none !important; }
    #sp-lb{ opacity:1 !important; transition:none !important; }
    #sp-lb [data-lb-stage]{ transform:none !important;
      transition:none !important; }
  }
  /* E) Datenschutz: Marke des gerade gelesenen Abschnitts */
  .ksc-datenschutz-verzeichnis a.aktiv{ background:var(--accent);
    border-color:var(--accent); color:#ffffff; }
  /* Die Leiste bleibt beim Lesen unter der 76 px hohen
     Sticky-Navigation stehen - sonst wandert die mitlaufende
     Marke unbemerkt aus dem Bild. Eigener Hintergrund, sonst
     scheint der Text darunter durch.
     Erst ab 768 px: darunter braucht die Leiste zwei bis drei
     Zeilen und belegte dauerhaft rund ein Drittel der
     Bildschirmhoehe. */
  .ksc-datenschutz-verzeichnis-kopf{ display:none; }
  @media (min-width:768px){
    .ksc-datenschutz-verzeichnis{ position:sticky; top:76px;
      z-index:20; background:var(--bg-light);
      padding:14px 0 12px;
      box-shadow:0 10px 20px -14px rgba(15,21,32,.45); }
    /* Sprungziel tiefer setzen: sonst landet die angesprungene
       Ueberschrift hinter der angehefteten Leiste. */
    .ksc-datenschutz-text h2{ scroll-margin-top:168px; }
  }
