:root {
  --black: #000000;
  --bg: #f2f2f0;
  --white: #ffffff;
  --grey: #6b6b6b;
  --line: rgba(0, 0, 0, 0.12);
  --font-display: "Zalando Sans Expanded", sans-serif;
  --font-body: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  --max-width: 1240px;
}

* { box-sizing: border-box; margin: 0; padding: 0; }

/* Nur Desktop mit Maus/Trackpad geglättet scrollen (siehe auch das JS-Wheel-
   Easing weiter unten, das dieselbe hover:hover+pointer:fine-Bedingung
   nutzt) -> auf dem Handy natives, direktes Scrollen statt animiert/träge. */
@media (hover: hover) and (pointer: fine) {
  html { scroll-behavior: smooth; }
}

body {
  background: var(--bg);
  color: var(--black);
  font-family: var(--font-body);
  line-height: 1.6;
  overflow-x: hidden;
}

img, video { max-width: 100%; display: block; }

/* Seiten-Übergang: neue Seite gleitet von unten rein (reines Slide, kein Blur/Fade).
   Auf <main> statt <body>, damit der fixed Header stabil stehen bleibt.
   Nur über die Klasse .page-enter (per JS gesetzt, siehe script.js) statt
   bedingungslos auf <main> -> sonst spielt die Animation auch bei einem
   simplen Reload, was kurz einen leeren Streifen unter dem fixen Header
   sichtbar macht (main startet 22px tiefer als seine finale Position). Beim
   Reload wird die Klasse bewusst nicht gesetzt, bei echter Navigation schon. */
main.page-enter {
  animation: page-enter 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
}
@keyframes page-enter {
  from { transform: translateY(22px); }
  to   { transform: translateY(0); }
}
main.page-exit {
  animation: page-exit 0.32s cubic-bezier(0.4, 0, 1, 1) both;
}
@keyframes page-exit {
  from { transform: translateY(0); }
  to   { transform: translateY(-14px); }
}
@media (prefers-reduced-motion: reduce) {
  main.page-enter, main.page-exit { animation: none; }
}

.container {
  max-width: var(--max-width);
  margin: 0 auto;
  padding: 0 32px;
}

a { color: inherit; text-decoration: none; }

/* ---------- Custom Cursor ---------- */
@media (hover: hover) and (pointer: fine) {
  * { cursor: none !important; }
  /* video::-webkit-* sitzt im geschlossenen UA-Shadow-DOM der nativen
     <video controls>-Bedienleiste -> die generelle "*"-Regel oben erreicht
     sie nicht, deshalb zeigte der Browser dort (z.B. im Video-Modal) trotzdem
     seinen eigenen System-Cursor statt des Rings. Diese speziellen
     WebKit-Pseudo-Elemente sind die einzige Möglichkeit, von aussen in genau
     diesen Shadow-DOM-Teil hineinzustylen. */
  video,
  video::-webkit-media-controls,
  video::-webkit-media-controls-enclosure,
  video::-webkit-media-controls-panel,
  video::-webkit-media-controls-play-button,
  video::-webkit-media-controls-mute-button,
  video::-webkit-media-controls-timeline,
  video::-webkit-media-controls-current-time-display,
  video::-webkit-media-controls-time-remaining-display,
  video::-webkit-media-controls-volume-slider,
  video::-webkit-media-controls-fullscreen-button {
    cursor: none !important;
  }
}
.custom-cursor {
  position: fixed;
  top: 0;
  left: 0;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  border: 1.5px solid var(--white);
  background: transparent;
  mix-blend-mode: difference;
  pointer-events: none;
  z-index: 9999;
  opacity: 0;
  transform: translate(-50%, -50%) scale(1);
  transition: opacity 0.2s ease, transform 0.35s cubic-bezier(0.22, 1, 0.36, 1);
}
.custom-cursor.is-visible { opacity: 1; }
/* Vergrössert sich über allem Klickbaren (siehe HOVER_TARGET_SELECTOR in
   script.js) -> transform statt width/height, damit die Skalierung GPU-
   beschleunigt und die Ring-Kontur beim Wachsen gleichmässig bleibt. */
.custom-cursor.is-hovering { transform: translate(-50%, -50%) scale(1.7); }
@media (pointer: coarse) {
  .custom-cursor { display: none; }
}

/* ---------- Back to Top ---------- */
.back-to-top {
  position: fixed;
  right: 32px;
  bottom: 32px;
  width: 44px;
  height: 44px;
  border: none;
  border-radius: 50%;
  background: var(--black);
  color: var(--white);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 200;
  opacity: 0;
  visibility: hidden;
  transform: translateY(8px);
  transition: opacity 0.25s ease, transform 0.25s ease, visibility 0.25s;
}
.back-to-top.is-visible {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.back-to-top:hover { opacity: 0.8; }
.back-to-top svg { width: 18px; height: 18px; }

/* ---------- Buttons ---------- */
.btn {
  display: inline-block;
  padding: 15px 34px;
  border-radius: 999px;
  font-weight: 600;
  font-size: 0.9rem;
  letter-spacing: 0.02em;
  transition: transform 0.2s ease, background 0.2s ease, color 0.2s ease;
  border: 1px solid var(--black);
  cursor: pointer;
}
.btn-primary { background: var(--black); color: var(--white); display: inline-flex; align-items: center; justify-content: center; gap: 5px; }
.btn-primary:hover { transform: translateY(-2px); background: var(--white); color: var(--black); }
.btn-text { font-weight: 400; line-height: 1; }
.btn-logo { height: 13px; width: auto; display: block; position: relative; top: -1px; }
.btn-logo-hover { display: none; }
.btn-primary:hover .btn-logo-default { display: none; }
.btn-primary:hover .btn-logo-hover { display: block; }

/* ---------- Header ---------- */
/* Weiss, clean, kein Blur, kein mix-blend-mode -> auf den meisten Seiten
   dauerhaft so. Auf Seiten mit Vollbild-Hero direkt unter dem Header
   (index.html, about.html) macht die zusätzliche Klasse .site-header-
   transparent den Header stattdessen durchsichtig mit weisser Schrift, bis
   .is-scrolled (per JS in script.js beim Scrollen gesetzt) ihn wieder exakt
   in diesen Default-Zustand zurückschaltet. */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  padding: 18px 0;
  background: var(--bg);
  transition: background 0.3s ease;
}
.header-inner {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 24px;
}
.logo {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1.2rem;
  letter-spacing: 0.02em;
  color: var(--black);
  display: inline-flex;
  align-items: center;
}
.logo-img {
  height: 22px;
  width: auto;
}
/* Header-Logo: mittig über der Nav, unabhängig von deren Flex-Fluss (absolut
   positioniert) -> Home/Video landen links, Foto/About rechts, Logo bleibt
   exakt zentriert, egal wie breit die beiden Nav-Gruppen sind. */
.header-logo {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  display: inline-flex;
}
.header-logo-img {
  height: 26px;
  width: auto;
}
/* Zwei gestapelte Logo-Bilder (Schwarz/Weiss) statt eines einzelnen mit
   Farb-Trick -> gleiches Muster wie .btn-logo-default/.btn-logo-hover
   anderswo im CSS. Default: schwarzes Logo sichtbar. */
.header-logo-light { display: none; }
.nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}
.nav-group {
  display: flex;
  align-items: center;
  gap: 36px;
}
.nav a {
  font-family: var(--font-display);
  font-size: 0.88rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--black);
  position: relative;
  transition: color 0.3s ease;
}
.nav a::after {
  content: "";
  position: absolute;
  left: 0;
  right: 100%;
  bottom: -4px;
  height: 1px;
  background: var(--black);
  transition: right 0.25s ease, background 0.3s ease;
}
.nav a:hover::after { right: 0; }

.nav-toggle {
  display: none;
  flex-direction: column;
  gap: 5px;
  background: none;
  border: none;
  cursor: pointer;
  padding: 11px; /* + 22px Icon = 44px Touch-Target */
  position: relative;
  z-index: 101; /* über .nav (position:fixed, z-index:99) -> bleibt klickbar/sichtbar, auch wenn das Menü offen ist */
}
.nav-toggle span {
  width: 22px;
  height: 2px;
  background: var(--black);
  transition: transform 0.2s ease, opacity 0.2s ease, background 0.3s ease;
}

/* Transparenter Start-Zustand für Header über einem Vollbild-Hero (nur
   index.html/about.html, siehe .site-header-transparent im Markup dort). */
.site-header-transparent {
  background: transparent;
}
.site-header-transparent .nav a { color: var(--white); }
.site-header-transparent .nav a::after { background: var(--white); }
.site-header-transparent .nav-toggle span { background: var(--white); }
.site-header-transparent .header-logo-dark { display: none; }
.site-header-transparent .header-logo-light { display: block; }

/* Sobald gescrollt wird: exakt der normale weisse Header-Zustand. */
.site-header-transparent.is-scrolled {
  background: var(--bg);
}
.site-header-transparent.is-scrolled .nav a { color: var(--black); }
.site-header-transparent.is-scrolled .nav a::after { background: var(--black); }
.site-header-transparent.is-scrolled .nav-toggle span { background: var(--black); }
.site-header-transparent.is-scrolled .header-logo-dark { display: block; }
.site-header-transparent.is-scrolled .header-logo-light { display: none; }

/* ---------- Hero-Video ---------- */
.hero-video {
  position: relative;
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  background: linear-gradient(150deg, #101010, #3a3a3a); /* Fallback solange kein echtes Video liegt */
}
.hero-video-el {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Kein Dark-Tint über dem ganzen Video -> zeigt weiterhin die Originalfarben.
   Nur unten ein kurzer Fade als Scrim, exakt hinter dem "Über mich"-Statement
   (siehe .hero-about-cta), damit es unabhängig vom Video-Inhalt darunter
   lesbar bleibt, ohne den Rest des Videos abzudunkeln. */
.hero-video-overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.6) 0%, transparent 32%);
  pointer-events: none;
}
.hero-video-content {
  position: relative;
  z-index: 2;
  width: 100%;
  text-align: center;
  padding: 0 24px;
}
.hero-video-content h1 {
  font-family: var(--font-display);
  font-weight: 500;
  color: var(--white);
  font-size: clamp(2.6rem, 8vw, 5.5rem);
  letter-spacing: -0.03em;
}
/* "Über mich"-Statement unten links im Opener (Konzept 10 aus
   home-hero-vorschau.html, von Timo ausgewählt) -- riesig, schlicht weiss
   über dem Video (kein mix-blend-mode mehr -> Timo wollte durchgehend
   lesbares Weiss statt der invertierenden Difference-Optik). Die Leistungen
   waren vorher hier (siehe Git-Historie), sind jetzt eine eigene Sektion
   nach dem BTS-Laufband (.services-section) -- zusammen wirkte es überladen. */
.hero-about-cta {
  position: absolute;
  left: clamp(24px, 6vw, 56px);
  bottom: clamp(24px, 6vh, 48px);
  z-index: 2;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(2.6rem, 9vw, 5.5rem);
  line-height: 0.88;
  color: var(--white);
  transition: letter-spacing 0.3s ease;
}
.hero-about-cta:hover { letter-spacing: 0.02em; }
.hero-about-cta-arrow { font-size: 0.4em; vertical-align: super; }

/* ---------- Sections ---------- */
.section { padding: 120px 0; }
.section-alt { background: var(--bg); }
.section-eyebrow {
  text-align: center;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  font-size: 0.75rem;
  color: var(--grey);
  margin-bottom: 14px;
}
.section-title {
  text-align: center;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(2rem, 5vw, 3rem);
  margin-bottom: 40px;
}

/* ---------- Dienstleistungen (Konzept 4 aus dienstleistungen-vorschau.html)
   ---------- Akkordeon: Klick statt Hover (funktioniert auch auf Mobile/
   Touch), .service-desc per max-height animiert statt display:none, damit
   die Höhenänderung weich transitioniert statt hart umzuspringen. */
/* .section bringt 120px oben+unten mit -> zusammen mit dem Showreel direkt
   darunter (auch .section, also nochmal 120px oben) wirkte die Lücke
   dazwischen unnötig riesig. Oben bleibt der normale Abstand zum
   BTS-Laufband, nur unten wird reduziert. */
/* Sticky-Stack (siehe index.html-Kommentar): Dienstleistungen bleibt beim
   Scrollen stehen, Showreel schiebt sich darüber. .stack-wrap gibt den
   Scroll-Spielraum (200vh), .services-section selbst bleibt sticky+min-height
   100vh stehen und wird zentriert, damit sie die ganze Fläche ausfüllt.
   z-index + eigener Hintergrund auf beiden Seiten nötig, sonst würde
   Showreel (durch das sticky Positionieren von Dienstleistungen) TROTZ
   späterer DOM-Reihenfolge dahinter statt davor landen. */
.stack-wrap { position: relative; height: 200vh; }
.services-section {
  position: sticky;
  top: 0;
  z-index: 1;
  min-height: 100vh;
  display: flex;
  align-items: center;
  background: var(--bg);
  padding-bottom: 50px;
}
/* margin-top zieht Showreel exakt um den Sticky-Spielraum (100vh, siehe
   .stack-wrap) nach oben -- sonst kommt Showreel erst NACH Ende der
   Stehenbleib-Phase an (toter Stillstand statt "schiebt sich drüber"). */
.showreel-section { position: relative; z-index: 2; background: var(--bg); margin-top: -100vh; }
.services-section .container { width: 100%; }
.services-accordion { max-width: 720px; margin: 0 auto; }
.service-row { border-top: 1px solid var(--line); }
.service-row:last-child { border-bottom: 1px solid var(--line); }
.service-head {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 20px 4px;
  background: none;
  border: none;
  cursor: pointer;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1.05rem;
  color: var(--black);
  text-align: left;
}
.service-plus { font-size: 1.2rem; color: var(--grey); transition: transform 0.3s ease; flex-shrink: 0; }
.service-row.is-open .service-plus { transform: rotate(45deg); }
.service-desc {
  max-height: 0;
  overflow: hidden;
  color: var(--black);
  font-size: 0.88rem;
  line-height: 1.6;
  padding: 0 4px;
  transition: max-height 0.35s ease, padding 0.35s ease;
}
.service-row.is-open .service-desc { max-height: 80px; padding: 0 4px 20px; }

/* ---------- Scroll reveal ---------- */
.reveal {
  filter: blur(10px);
  transform: scale(0.95);
  opacity: 0;
  transition: filter 0.8s ease, transform 0.8s ease, opacity 0.8s ease;
}
.reveal.is-visible {
  filter: blur(0);
  transform: scale(1);
  opacity: 1;
}

/* ---------- Marquees ---------- */
.marquee-section { padding: 32px 0; overflow: hidden; }
.marquee { width: 100%; overflow: hidden; margin-top: 32px; }
/* Kunden-Logos (.section-alt): kein Eyebrow-Titel mehr -> läuft direkt im
   Anschluss an den Opener statt wie eine eigene betitelte Section zu wirken.
   Kein oberer Extra-Abstand, der sonst für den (entfernten) Titel reserviert
   war. */
.marquee-section.section-alt { padding-top: 18px; }
.marquee-section.section-alt .marquee { margin-top: 0; }
/* Logo-Slider: läuft randlos volle Breite -> ohne Fade wirken die Logos, als
   würden sie hart am linken/rechten Rand abgeschnitten. Mask-Gradient blendet
   sie stattdessen weich aus, bevor sie den Rand erreichen. */
.marquee-section.section-alt .marquee {
  -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 120px, #000 calc(100% - 120px), transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0, #000 120px, #000 calc(100% - 120px), transparent 100%);
}
.marquee-track {
  display: flex;
  gap: 24px;
  width: max-content;
}
/* Logo-Slider (Kundenlogos): enger als der Standard-Abstand der übrigen
   Marquees (BTS-Laufband etc.), die weiterhin die generische .marquee-track
   gap nutzen. */
.marquee-section.section-alt .marquee-track { gap: 12px; }
.marquee-ltr .marquee-track { animation: marquee-ltr 40s linear infinite; }
.marquee-rtl .marquee-track { animation: marquee-rtl 28s linear infinite; }
.marquee-slow .marquee-track { animation-duration: 50s; } /* langsamer als die Standard-Geschwindigkeit, z.B. für die Kundenlogos */

/* Draggable-Erweiterung fürs Behind-the-Scenes-Karussell (per JS aktiviert,
   sobald der Ziehen-Mechanismus initialisiert ist) — CSS-Keyframe-Animation
   aus, JS übernimmt Bewegung + Ziehen manuell über denselben transform. */
.marquee-draggable .marquee-track { animation: none; cursor: grab; user-select: none; }
.marquee-draggable.is-dragging .marquee-track { cursor: grabbing; }
/* Vertikaler Puffer für das Drag-"Spiel" (siehe script.js, VERTICAL_GIVE_MAX):
   ohne diesen Rand würde der overflow:hidden-Container die Bilder am Rand
   abschneiden, sobald der Track per translateY verschoben wird. */
.marquee-draggable { padding: 16px 0; margin-top: 16px; } /* 32px Basisabstand - 16px Padding = gleicher optischer Abstand wie zuvor */

@keyframes marquee-ltr {
  from { transform: translateX(-50%); }
  to { transform: translateX(0%); }
}
@keyframes marquee-rtl {
  from { transform: translateX(0%); }
  to { transform: translateX(-50%); }
}

.marquee-item {
  flex: 0 0 auto;
  width: 280px;
  aspect-ratio: 16 / 10;
  border-radius: 4px;
  overflow: hidden;
}
.marquee-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  cursor: pointer;
}
/* Bildausschnitt pro Foto (statt immer mittig zu croppen): die BTS-Kachel ist
   breiter als hoch, Hochformat-Quellfotos werden also oben/unten
   beschnitten. Ohne Anpassung würde ein Gesicht im oberen Bilddrittel
   abgeschnitten. Per src-Selektor (nicht nth-child), damit das unabhängig
   von Reihenfolge/Duplizierung im Marquee-Loop robust bleibt. */
.marquee-item img[src*="bts-2.jpg"]  { object-position: 50% 25%; }
.marquee-item img[src*="bts-4.jpg"]  { object-position: 50% 28%; }
.marquee-item img[src*="bts-8.jpg"]  { object-position: 50% 12%; }
.marquee-item img[src*="bts-9.jpg"]  { object-position: 50% 30%; }
.marquee-item img[src*="bts-21.jpg"] { object-position: 50% 25%; }
.brand-item {
  position: relative;
  flex: 0 0 auto;
  width: 280px;
  aspect-ratio: 16 / 10;
  display: flex;
  align-items: center;
  justify-content: center;
}
/* Logos direkt in vollem Schwarz, ohne Hover-Wechsel. */
.brand-item img {
  max-width: 75%;
  max-height: 55%;
  object-fit: contain;
  filter: brightness(0) saturate(100%);
  -webkit-user-drag: none;
  user-select: none;
}
/* Incil-Logo hat kaum internen Freiraum in der Bilddatei -> wirkt in der
   gleichen 75%/55%-Box optisch deutlich grösser als die übrigen Logos. */
.brand-item img[alt="Incil Festival"] { max-width: 46%; max-height: 34%; }
.brand-item img[alt="Nyffenegger Storen AG"] { max-width: 60%; max-height: 44%; }
/* Kleine Zusatzangabe unter einzelnen Logos (z.B. "im Auftrag von ...") --
   absolut positioniert, damit sie die zentrierte Logo-Ausrichtung der
   übrigen Items in der Reihe nicht beeinflusst. */
.brand-item-caption {
  position: absolute;
  bottom: 32px;
  left: 0;
  right: 0;
  text-align: center;
  font-size: 0.62rem;
  color: var(--grey);
  letter-spacing: 0.01em;
  pointer-events: none;
}

/* greyscale placeholders */
.grad-1 { background: linear-gradient(150deg, #1a1a1a, #4a4a4a 140%); }
.grad-2 { background: linear-gradient(150deg, #0a0a0a, #3a3a3a 140%); }
.grad-3 { background: linear-gradient(150deg, #222, #555 140%); }
.grad-4 { background: linear-gradient(150deg, #111, #444 140%); }
.grad-5 { background: linear-gradient(150deg, #1c1c1c, #4d4d4d 140%); }
.grad-6 { background: linear-gradient(150deg, #0d0d0d, #3d3d3d 140%); }

/* ---------- Showreel (Konzept 11 aus showreel-vorschau.html) ----------
   Full-Bleed, alternierend, grosse blasse Kapitel-Nummer hinter dem Titel. */
.showreel-rows { display: flex; flex-direction: column; gap: 64px; max-width: 1400px; margin: 0 auto; }
.showreel-row { display: grid; grid-template-columns: 1fr 1fr; align-items: center; gap: 44px; }
.showreel-row.rev .showreel-frame { order: 2; }
.showreel-row.rev .showreel-text { order: 1; }
.showreel-text { position: relative; padding-top: 26px; }
.showreel-num {
  position: absolute;
  top: -18px;
  left: 0;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 5rem;
  line-height: 1;
  color: var(--line);
  pointer-events: none;
  z-index: 0;
}
.showreel-title {
  position: relative;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(1.3rem, 2.6vw, 1.7rem);
  margin-bottom: 10px;
}
.showreel-desc { position: relative; font-size: 0.9rem; color: var(--black); max-width: 36ch; line-height: 1.65; }
.showreel-frame {
  position: relative;
  background: #101010;
  border-radius: 4px;
  overflow: hidden;
  aspect-ratio: 16 / 9;
}
.showreel-video { width: 100%; height: 100%; object-fit: cover; }
/* Corporate-Reel: Vorschau per Hover statt Klick+Ton (siehe .work-video für
   dasselbe Grau/Farbig-Hover-Muster im Work-Grid). Eigene, schlankere
   Hover-Logik in script.js statt der vollen .work-item-Bedienleiste, da hier
   kein Fullscreen/Progress/Learn-Link gebraucht wird. */
.showreel-hover-video { filter: grayscale(1); transition: filter 0.4s ease; cursor: pointer; }
.showreel-frame-hover:hover .showreel-hover-video { filter: grayscale(0); }
@media (hover: none) {
  .showreel-hover-video { filter: grayscale(0); }
}
/* Ganz einfache Zeitleiste unten im Frame -- kein Player/Controls, nur ein
   dünner Balken, der synchron zur Wiedergabe mitwächst (siehe timeupdate-
   Listener in script.js). Nur sichtbar, während das Video via Hover läuft. */
.showreel-scrub { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: rgba(255, 255, 255, 0.25); z-index: 2; }
.showreel-scrub-fill { height: 100%; width: 0%; background: var(--white); }
/* Öffnet das Video gross im selben Modal wie das Video-Grid (openVideoModal
   in script.js, <video controls> dort bringt die Zeitleiste automatisch
   mit). Nur beim Hover sichtbar wie der Rest der Bedienelemente, unten
   rechts im Frame. */
.showreel-expand {
  position: absolute;
  right: 16px;
  bottom: 16px;
  z-index: 3;
  background: none;
  border: none;
  padding: 0;
  color: var(--white);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  transition: opacity 0.2s ease;
  filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.7));
}
.showreel-frame:hover .showreel-expand { opacity: 1; }
.showreel-expand svg { width: 18px; height: 18px; display: block; }
@media (hover: none) {
  .showreel-expand { opacity: 1; }
}
@media (max-width: 900px) {
  .showreel-row, .showreel-row.rev { grid-template-columns: 1fr; }
  .showreel-row.rev .showreel-frame, .showreel-row.rev .showreel-text { order: 0; }
  .showreel-text { padding-top: 40px; }
  .showreel-num { top: 0; font-size: 3.4rem; }
}

/* ---------- About: Split-Hero (Foto links, Begrüssung rechts) ----------
   Konzept "Sticky Split Duotone": kein Overlay/Blur-Trick mehr, Foto und
   Text stehen klar getrennt nebeneinander -> sofort verständlich, dass man
   hier Timo kennenlernt. */
.about-split-hero {
  display: grid;
  grid-template-columns: 1fr 1fr;
  height: 100vh;
  box-sizing: border-box;
  padding-top: 60px; /* = Höhe des fixen Headers, siehe gleiche Konvention bei .project-detail-section etc. -> in der Höhe inbegriffen (box-sizing: border-box), damit die Sektion insgesamt genau 1 Viewport hoch bleibt. */
}
.about-split-photo { overflow: hidden; cursor: default; }
.about-split-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: grayscale(1);
  transition: filter 0.4s ease;
}
.about-split-photo:hover img { filter: grayscale(0); }
@media (hover: none) { .about-split-photo img { filter: grayscale(0); } }
.about-split-text {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 18px;
  padding: 40px 64px;
}
.about-split-kicker {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  font-size: 0.75rem;
  font-weight: 700;
  color: var(--black);
}
.about-split-hd {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(2.4rem, 4.5vw, 3.4rem);
  line-height: 1.05;
}
.about-split-intro {
  font-size: 1rem;
  color: var(--black);
  max-width: 38ch;
  line-height: 1.6;
}
.about-split-more {
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--black);
}
.about-split-actions { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
/* Kleinere Ausprägung des generischen .btn-secondary -- der Standard
   (15px/34px Padding) wirkt neben dem schmalen "Mehr erfahren"-Textlink zu
   schwer für den sonst sehr zurückhaltenden Hero. */
.about-hero-contact-btn { padding: 9px 22px; font-size: 0.78rem; }

/* ---------- About: Bio-Text (eigene Sektion unter dem Split-Hero) ----------
   Links linksbündiger Fliesstext (erster Satz tippt sich ein, siehe
   initAboutTextReveal in script.js), rechts 4 überlappende, schräg gelegte
   BTS-Polaroids, die per .reveal (bestehender revealObserver) gestaffelt
   beim Scrollen reinkommen -- Stagger kommt aus transition-delay je Polaroid,
   nicht aus dem Observer selbst (der feuert für alle ~gleichzeitig). */
.about-text-section { padding: 100px 24px; }
.about-text-layout {
  /* "Mehr erfahren"-Link springt hierher (#aboutText) -> ohne das würde der
     Text bis unter den fixen Header hochspringen, direkt an den Split-Hero
     gequetscht. scroll-margin-top lässt beim Anspringen etwas Luft (Header +
     spürbarer Abstand zum Foto darüber) statt eines zu knappen Übergangs. */
  scroll-margin-top: 120px;
  display: grid;
  /* Text bleibt links am Containerrand (kein justify-content:center mehr --
     das hat den ganzen Block inkl. Polaroids von den Rändern weg zur Mitte
     gezogen, wollte Timo nicht). Text-Spalte bleibt 1fr (linksbündig), die
     Polaroid-Spalte fest 400px -> sitzt dadurch automatisch am rechten
     Containerrand. Die Lücke wird stattdessen über eine grössere max-width
     bei .about-text-copy kleiner: der Text darf weiter nach rechts/in die
     Mitte laufen, bricht dadurch auch weniger früh um. */
  grid-template-columns: 1fr 400px;
  align-items: center;
  gap: 48px;
}
.about-text-copy { max-width: 600px; color: var(--black); font-size: 0.95rem; line-height: 1.8; }
/* Kein Typewriter mehr -- Überschrift blendet stattdessen simpel per
   Opacity/Transform ein, gleichzeitig mit .about-text-rest/Polaroids
   (siehe IIFE weiter unten in script.js, gleicher Scroll-Trigger). */
.about-text-typed {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(1.5rem, 3vw, 2.1rem);
  line-height: 1.25;
  margin-bottom: 18px;
  opacity: 0;
  transform: translateY(16px);
  transition: opacity 0.7s ease, transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
}
.about-text-typed.is-visible { opacity: 1; transform: translateY(0); }
@keyframes about-cursor-blink { 50% { opacity: 0; } }
.about-text-rest {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity 0.7s ease, transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
}
.about-text-rest.is-visible { opacity: 1; transform: translateY(0); }
.about-text-rest p + p { margin-top: 20px; }

.about-text-polaroids {
  position: relative;
  height: 520px;
}
.about-polaroid {
  position: absolute;
  width: 190px;
  aspect-ratio: 4/5;
  background: var(--white);
  padding: 10px 10px 10px;
  box-shadow: 0 18px 34px rgba(0, 0, 0, 0.22);
  overflow: hidden;
  /* .reveal (Basiszustand: blur+scale+opacity 0) kommt aus dem globalen
     revealObserver-Muster -- hier zusätzlich der Ziel-Winkel je Polaroid, den
     die Transition mit-animiert, plus ein individueller Stagger-Delay.
     transition-duration eigens verkürzt (statt der globalen 0.8s von
     .reveal) -- nur für die About-Polaroids, der Rest der Seite bleibt beim
     normalen Tempo. Stagger-Abstände ebenfalls halbiert. */
  transform: rotate(var(--rot, 0deg));
  transition-duration: 0.45s;
  transition-delay: var(--stagger, 0s);
}
.about-polaroid img { width: 100%; height: 100%; object-fit: cover; }
.about-polaroid-1 { left: 0; top: 0; width: 200px; --rot: -5deg; --stagger: 0s; z-index: 4; }
.about-polaroid-2 { left: 190px; top: 70px; width: 180px; --rot: 4deg; --stagger: 0.08s; z-index: 3; }
.about-polaroid-3 { left: 30px; top: 270px; width: 180px; --rot: 6deg; --stagger: 0.16s; z-index: 2; }
.about-polaroid-4 { left: 210px; top: 320px; width: 190px; --rot: -4deg; --stagger: 0.24s; z-index: 1; }
/* .reveal.is-visible überschreibt transform/opacity/filter global auf den
   Ruhezustand -- Rotation hier erneut setzen, sonst ginge sie beim Einblenden
   verloren (die globale Regel kennt --rot nicht). */
.about-polaroid.reveal.is-visible { transform: rotate(var(--rot, 0deg)); }
/* Eigenes helles Band unter dem Foto (nicht mehr auf dem Hintergrundfoto
   überlagert) -> zentriert, siehe about.html. */
.about-contact-section { background: var(--bg); padding: 90px 24px; }
.about-contact {
  max-width: 640px;
  margin: 0 auto;
  text-align: center;
}
.about-contact-links {
  margin-top: 10px;
  color: var(--black);
  font-size: 0.95rem;
}
.about-contact-links a { text-decoration: underline; text-underline-offset: 3px; }
.about-contact-cta {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.05rem, 2.4vw, 1.4rem);
  color: var(--black);
  max-width: 30ch;
  margin: 0 auto 6px;
}
.about-contact-whatsapp-btn { display: inline-flex; margin-top: 22px; margin-bottom: 22px; }
.about-contact-or { color: var(--grey); font-size: 0.85rem; margin: 12px 0 24px; }
.about-contact-form {
  display: flex;
  flex-direction: column;
  gap: 20px;
  text-align: left;
  max-width: 420px;
  margin: 0 auto 32px;
}
.about-contact-field input,
.about-contact-field textarea {
  width: 100%;
  border: none;
  border-bottom: 1px solid var(--line);
  padding: 10px 2px;
  font-family: var(--font-body);
  font-size: 0.95rem;
  color: var(--black);
  background: transparent;
  transition: border-color 0.2s ease;
}
.about-contact-field input::placeholder,
.about-contact-field textarea::placeholder { color: var(--grey); }
.about-contact-field input:focus,
.about-contact-field textarea:focus { outline: none; border-color: var(--black); }
.about-contact-field textarea { resize: vertical; min-height: 90px; line-height: 1.5; }
.about-contact-submit { align-self: center; margin-top: 6px; }

/* ---------- Meine Werte (About) -- nummerierte Statement-Zeilen ---------- */
.about-values-section { background: var(--bg); padding: 90px 24px; }
.about-values { max-width: 760px; margin: 0 auto; }
.about-values-eyebrow {
  text-align: center;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  font-size: 0.75rem;
  font-weight: 700;
  color: var(--grey);
  margin-bottom: 10px;
}
.about-values-heading {
  text-align: center;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(1.6rem, 3.2vw, 2.2rem);
  color: var(--black);
  margin-bottom: 40px;
}
.about-values-row { display: grid; grid-template-columns: 90px 1fr; gap: 22px; padding: 26px 0; border-top: 1px solid var(--line); }
.about-values-row:last-child { border-bottom: 1px solid var(--line); }
/* Fade-in beim Scrollen (wireAboutValuesReveal in script.js) -- jede Zeile
   etwas später als die vorherige, dezentes Hochgleiten statt der stärkeren
   Blur/Scale-Variante von .reveal (passt besser zu den schlichten
   Text-Zeilen hier). */
.about-values-row {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 0.6s ease, transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
  transition-delay: var(--values-delay, 0s);
}
.about-values-row.is-visible { opacity: 1; transform: translateY(0); }
.about-values-row:nth-child(1) { --values-delay: 0s; }
.about-values-row:nth-child(2) { --values-delay: 0.1s; }
.about-values-row:nth-child(3) { --values-delay: 0.2s; }
.about-values-row:nth-child(4) { --values-delay: 0.3s; }
.about-values-row:nth-child(5) { --values-delay: 0.4s; }
.about-values-num { font-family: var(--font-display); font-weight: 800; font-size: 2.2rem; color: var(--line); line-height: 1; }
.about-values-title { font-family: var(--font-display); font-weight: 800; font-size: 1.2rem; color: var(--black); margin-bottom: 6px; }
.about-values-desc { font-size: 0.9rem; color: var(--black); line-height: 1.7; max-width: 52ch; }

/* ---------- Creative Network (About) ---------- */
.creative-network-section { background: var(--bg); padding: 100px 0; }
.creative-network-eyebrow {
  text-transform: uppercase;
  letter-spacing: 0.2em;
  font-size: 0.75rem;
  color: var(--black);
  margin-bottom: 14px;
}
.creative-network-intro {
  color: var(--black);
  max-width: 46ch;
  margin-bottom: 40px;
}
.creative-network-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 32px 24px;
}
/* Stapel-Shuffle (Konzept 10, creative-network-vorschau.html): jede Karte
   startet Richtung Zeilenanfang "gestapelt" (per Spalten-Offset + leichte
   Rotation) und fächert sich beim Scrollen (.is-in, siehe wireCreativeNetworkStackReveal
   in script.js) an ihre echte Grid-Position auf. Nutzt %-Offsets relativ zur
   eigenen Kartenbreite + dem festen Grid-Gap (24px) -> funktioniert unabhängig
   von der Personenzahl, die sich admin-seitig jederzeit ändern kann. Muster
   wiederholt sich pro Zeile über :nth-child(4n+X), da CSS keine Grid-Zeile
   direkt adressieren kann. */
.creative-network-item {
  opacity: 0;
  transform: translateX(var(--stack-x, 0px)) rotate(var(--stack-r, 0deg)) scale(0.92);
  transition: transform 0.8s cubic-bezier(0.2, 0.8, 0.2, 1), opacity 0.5s ease;
  transition-delay: var(--stack-delay, 0s);
}
.creative-network-item.is-in {
  opacity: 1;
  transform: translateX(0) rotate(0deg) scale(1);
}
.creative-network-item:nth-child(4n+1) { --stack-x: 0px; --stack-r: -4deg; --stack-delay: 0s; }
.creative-network-item:nth-child(4n+2) { --stack-x: calc(-100% - 24px); --stack-r: 3deg; --stack-delay: 0.08s; }
.creative-network-item:nth-child(4n+3) { --stack-x: calc(-200% - 48px); --stack-r: -3deg; --stack-delay: 0.16s; }
.creative-network-item:nth-child(4n+4) { --stack-x: calc(-300% - 72px); --stack-r: 4deg; --stack-delay: 0.24s; }
.creative-network-photo {
  aspect-ratio: 3 / 4;
  border-radius: 4px;
  margin-bottom: 16px;
  /* Enger/dunkler als der erste Versuch -> bei grossem Blur-Radius + wenig
     Gap zwischen den Kacheln verschmolzen die Schatten der Nachbarkarten zu
     einem einzigen Blob statt als eigener Schatten pro Karte erkennbar zu
     sein. */
  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.22);
}
.creative-network-name {
  color: var(--black);
  font-weight: 500;
  font-size: 1.05rem;
}
.creative-network-role {
  color: var(--black);
  font-size: 0.85rem;
  margin-top: 2px;
}

/* ---------- Video-Modal (Overlay statt echtem Vollbild) ---------- */
/* Scroll komplett sperren, solange das Video-/Foto-Overlay offen ist */
html.scroll-locked, html.scroll-locked body { overflow: hidden; }

.video-modal {
  position: fixed;
  inset: 0;
  z-index: 500;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.9);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.25s ease;
}
.video-modal.is-open {
  opacity: 1;
  visibility: visible;
}
.video-modal-inner {
  display: flex;
  align-items: center;
  justify-content: center;
  max-width: 80vw;
  max-height: 80vh;
}
.video-modal-inner video,
.video-modal-inner img {
  max-width: 80vw;
  max-height: 80vh;
  width: auto;
  height: auto;
  display: block;
  background: #000;
}
.video-modal-close {
  position: absolute;
  top: 32px;
  right: 32px;
  width: 44px;
  height: 44px;
  border: none;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.1);
  color: var(--white);
  font-size: 1.6rem;
  line-height: 1;
  display: flex;
  align-items: center;
  justify-content: center;
}
.video-modal-close:hover { background: rgba(255, 255, 255, 0.2); }

.video-modal-learn-link {
  position: absolute;
  left: 32px;
  bottom: 32px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 12px 20px;
  border-radius: 30px;
  background: rgba(255, 255, 255, 0.12);
  backdrop-filter: blur(6px);
  color: var(--white);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 0.9rem;
  letter-spacing: 0.01em;
  transition: background 0.2s ease, transform 0.2s ease;
}
.video-modal-learn-link::after { content: "→"; transition: transform 0.2s ease; }
.video-modal-learn-link:hover { background: rgba(255, 255, 255, 0.22); transform: translateY(-1px); }
.video-modal-learn-link:hover::after { transform: translateX(3px); }

.video-modal-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 48px;
  height: 48px;
  border: none;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.1);
  color: var(--white);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.2s ease;
}
.video-modal-nav:hover { background: rgba(255, 255, 255, 0.2); }
.video-modal-nav svg { width: 22px; height: 22px; }
.video-modal-prev { left: 32px; }
.video-modal-next { right: 32px; }

/* ---------- Work-Grid ---------- */
/* padding-top = Höhe des fixen Headers (gleiche Konvention wie
   .category-detail-section/.project-detail-section) -- früher 0, aus einer
   Zeit, in der der Header hier transparent mit mix-blend-mode:difference
   direkt über dem Video lag. Der Header ist inzwischen überall solides Weiss
   (siehe .site-header), dadurch deckte er ohne dieses Padding den oberen
   Rand der ersten Kachelreihe zu. */
.work-grid-section {
  padding-top: 60px;
}
.work-media-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 46px 32px 24px;
}
.work-media-title {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(1.6rem, 4vw, 2.2rem);
}
/* ---------- Kategorie-Zeilen (foto.html): 2-spaltiges Karten-Grid, je 1 Foto
   pro Kategorie, Beschriftung sauber darunter statt als Overlay -> Text ist
   nie mehr "einfach auf dem ersten Bild", jede Karte ist eindeutig 1:1
   ihrer Kategorie zugeordnet. ---------- */
.category-rows {
  padding: 60px 0 0; /* = Höhe des fixen Headers -> Grid startet direkt darunter */
  /* Bewusst KEIN width:100vw/margin-left-Breakout mehr (siehe Git-Historie)
     -- diese vw-Rechnung erzeugte bei Timo auf einem grossen/skalierten
     Display einen seitlichen Rand, obwohl sie lokal hier immer korrekt
     getestet wurde. .work-grid-section auf der Video-Seite hat genau
     dasselbe Problem nie, weil es GAR KEINEN Breakout braucht (body/main
     haben ohnehin kein max-width/padding) -- hier exakt gleich gehalten:
     einfaches Blockelement, natürliche 100%-Breite statt vw-Rechnung. */
}
.category-row-list {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0;
}
/* Gleiches Seitenverhältnis wie .work-item auf der Video-Seite (16:9) --
   Kacheln sind dadurch nicht mehr auf 100vh gezwängt, sondern wachsen über
   die volle Breite mit natürlicher Höhe, wie beim Video-Grid. */
.category-row {
  display: block;
  cursor: pointer;
  aspect-ratio: 16 / 9;
}
.category-row-photo {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  background: #111;
}
/* Gleiches Hover-Design wie die Video-Kacheln (.work-video): Graustufen im
   Ruhezustand, volle Farbe beim Hover -- auf Wunsch von Timo, damit Video-
   und Foto-Grid identisch wirken. */
.category-row-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  filter: grayscale(1);
  transition: filter 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}
.category-row:hover .category-row-photo img {
  filter: grayscale(0);
}
@media (hover: none) {
  .category-row-photo img { filter: grayscale(0); }
}
.category-row-num {
  position: absolute;
  top: 20px;
  left: 20px;
  z-index: 2;
  color: var(--white);
  font-family: var(--font-display);
  font-size: 0.8rem;
  letter-spacing: 0.05em;
  opacity: 0.7;
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.5);
}
/* Magnetischer "Kategorie ansehen"-Button -- exakt dasselbe Element/
   Verhalten wie .work-learn-link auf der Video-Seite (Konzept 2 aus
   cursor-vorschau.html: Outline-Pill mit Weichzeichner-Hintergrund),
   inklusive JS-Magnet-Follow via wireMagneticLink() in script.js. */
.category-row-learn-link {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 9px 17px;
  border-radius: 24px;
  background: rgba(0, 0, 0, 0.25);
  backdrop-filter: blur(14px) saturate(140%);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  border: 1.5px solid rgba(255, 255, 255, 0.85);
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--white);
  white-space: nowrap;
  opacity: 0;
  /* Schnelles, einfaches Ein-/Ausblenden (kein Einschwingen/Lag auf
     left/top -- das wollte Timo explizit nicht) -- kurze Dauer, damit beim
     Wechsel zwischen Kacheln kein langes Überblenden zweier Buttons
     gleichzeitig sichtbar ist ("sticky"-Gefühl). */
  transition: opacity 0.15s ease;
}
.category-row:hover .category-row-learn-link { opacity: 1; }
.category-row-learn-link::after { content: "→"; transition: transform 0.2s ease; }
.category-row-learn-link:hover::after { transform: translateX(2px); }

/* ---------- Kategorie-Detailseite (foto-kategorie.html): Grid MIT Gap,
   Gegenteil vom gapless Video-/Kategorie-Zeilen-Look ---------- */
.category-detail-section { padding-top: 60px; } /* = Höhe des fixen Headers, Konvention wie .work-grid-section/.photo-section */
.category-detail-head { padding: 46px 32px 32px; }
.category-detail-title {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(1.8rem, 5vw, 3rem);
  text-align: center;
}
/* Justified-Row-Layout (siehe renderJustifiedGrid in script.js): Zeilenhöhe
   und Bildbreiten werden per JS berechnet und als inline style gesetzt, damit
   Quer- und Hochformat in derselben Zeile konsistent hoch bleiben (kein
   Höhen-Flickern/Lücken wie beim vorherigen starren Spalten-Raster). */
.category-detail-grid { padding: 0 32px 80px; }
/* Gruppierte Kategorie-Detailseite (z.B. Corporate = mehrere Shootings,
   Sport = mehrere Sportarten) — pro Gruppe ein eigener Justified-Grid-Block,
   bewusst ohne Beschriftung, nur per grösserem Abstand voneinander abgesetzt. */
.category-group + .category-group { margin-top: 96px; }
.justified-row {
  display: flex;
  gap: 12px;
}
.justified-item {
  position: relative;
  height: 100%;
  overflow: hidden;
  cursor: pointer;
  background: #ccc;
  flex-shrink: 0;
}
.justified-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.4s ease;
}
.justified-item:hover img { transform: scale(1.04); }
.category-detail-error {
  display: none;
  padding: 46px 32px 120px;
  font-family: var(--font-body);
}
.category-detail-error a { text-decoration: underline; }

.category-detail-cta {
  text-align: center;
  padding: 60px 32px 100px;
}
.category-detail-cta-text {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.3rem, 3vw, 1.8rem);
  max-width: 26ch;
  margin: 0 auto 28px;
}
.category-detail-cta-buttons {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
}
.btn-secondary { background: transparent; color: var(--black); }
.btn-secondary:hover { background: var(--black); color: var(--white); }

/* ---------- Projekt-Detailseite (projekt.html): generische Vorlage pro
   Video, analog zur Kategorie-Detailseite ---------- */
.project-detail-section { padding-top: 60px; } /* = Höhe des fixen Headers, Konvention wie .work-grid-section/.photo-section/.category-detail-section */
.project-hero { padding: 46px 32px 32px; max-width: 760px; }
/* Story-Layout (Konzept F): back-Link + Titel wandern per JS zusammen in
   .project-story-col, Hero wird komplett ausgeblendet -> keine eigene
   Hero-Höhe mehr vor der Story-Sektion, back+Titel+Text zentrieren sich als
   ein Block mittig im ersten Viewport. */
.project-hero.project-hero-story { display: none; }
/* back-Link sitzt direkt über dem Titel (gleiche Einheit, "auf Höhe des
   Titels") statt isoliert oben im Viewport -- back+Titel+Text zentrieren
   sich zusammen mittig, mit sauberem Abstand zwischen back-Link und Titel. */
.project-story-back { margin-bottom: 28px; }
.project-back-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: none;
  border: none;
  padding: 0;
  margin-bottom: 20px;
  font-family: inherit;
  font-size: 0.85rem;
  color: var(--grey);
  cursor: pointer;
  transition: color 0.2s ease;
}
.project-back-link svg { width: 16px; height: 16px; }
.project-back-link:hover { color: var(--black); }
.project-title {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(1.8rem, 5vw, 3rem);
  margin-bottom: 28px;
  text-align: left;
  /* Ein echter \n im Titel (siehe content.json, z.B. "FC Thun\nMatchday
     content") erzwingt einen Zeilenumbruch an genau der gewünschten Stelle
     statt vom Browser abhängig von der Containerbreite umbrechen zu lassen
     -- Rest des Titels wickelt bei Bedarf trotzdem normal um. */
  white-space: pre-line;
}
/* Titel-Typewriter im Story-Layout (siehe renderProjectDetailPage() in
   script.js) -- gleicher blinkender Cursor wie beim About-Bio-Text
   (about-cursor-blink, siehe .about-text-typed.is-typing weiter oben). */
.project-title.is-typing::after {
  content: "";
  display: inline-block;
  width: 3px;
  height: 0.85em;
  margin-left: 4px;
  vertical-align: -0.05em;
  background: var(--black);
  animation: about-cursor-blink 0.9s steps(1) infinite;
}
.project-description { color: var(--black); font-size: 1.05rem; }

.project-block { padding: 0 32px 60px; }
.project-block-label {
  text-transform: uppercase;
  letter-spacing: 0.1em;
  font-size: 0.78rem;
  color: var(--grey);
  margin-bottom: 20px;
}

/* Hauptvideo der Projektseite: gleiches Hover-Verhalten (Graustufen -> Farbe)
   wie die Grid-Kacheln auf video.html, Klick öffnet das Video-Modal. */
.project-main-video-wrap {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: 4px;
  overflow: hidden;
  background: linear-gradient(150deg, #1a1a1a, #4a4a4a 140%);
  cursor: pointer;
}
.project-main-video-el {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: grayscale(1);
  transition: filter 0.4s ease;
}
.project-main-video-wrap:hover .project-main-video-el { filter: grayscale(0); }
@media (hover: none) {
  .project-main-video-el { filter: grayscale(0); }
}
/* YouTube-Embed (volle Qualität) statt eigenem Video: kein Hover-/Klick-
   Verhalten mehr nötig, der YouTube-Player bringt eigene Bedienelemente. */
.project-main-video-wrap.has-youtube { cursor: default; }
.project-main-video-iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
}

/* Fotos-Block: nur im DOM sichtbar, wenn das Projekt Fotos hat (siehe
   script.js) -> gleiche Spaltenbreite wie BTS/Weitere-Clips. */
.project-photos-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
.project-photos-grid > div { aspect-ratio: 4 / 5; border-radius: 4px; overflow: hidden; cursor: pointer; }
.project-photos-grid img { width: 100%; height: 100%; object-fit: cover; display: block; }

.project-bts-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
.project-bts-item { aspect-ratio: 3 / 4; border-radius: 4px; overflow: hidden; }
.project-bts-item video { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Story-Text-Sektion (Konzept F, aktuell nur Fc Thun Doku — siehe
   renderProjectDetailPage() in script.js): füllt mindestens den ersten
   Viewport (100vh minus fixer Header-Höhe von 60px, siehe
   .project-detail-section weiter oben), Text mittig vor einer riesigen,
   sehr blassen Hintergrundziffer. "Zeitplan"/"Fragen" stehen fett+unter-
   strichen direkt im Fliesstext (.dw), Klick öffnet das Fancy-Popup weiter
   unten. Ersetzt bei Projekten mit Dokument-Gruppen die normale
   .project-description, ändert an anderen Projekten nichts. Ist der Text
   länger als 1 Viewport, wächst die Sektion einfach mit -- kein internes
   Scroll-Fenster, man sieht alles durch normales Runterscrollen der Seite. */
.project-story-viewport {
  min-height: calc(100vh - 60px);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 48px 32px;
}
.project-story-col {
  max-width: 620px;
  position: relative;
  z-index: 2;
}
/* Ghost-Ziffer zentriert sich exakt auf den Fliesstext (nicht auf back-Link
   oder Titel darüber) -- eigener position:relative-Wrapper nur um den Text,
   damit die Ziffer beim Titel-Typewriter (siehe renderProjectDetailPage())
   nie mitverschoben wird, egal wie viele Zeilen der Titel braucht. */
.project-story-text-wrap {
  position: relative;
}
.project-story-ghost {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-family: var(--font-display);
  font-weight: 800;
  font-size: min(48vw, 620px);
  color: var(--black);
  opacity: 0.018;
  line-height: 1;
  z-index: 1;
  pointer-events: none;
  user-select: none;
}
.project-story-text { position: relative; z-index: 2; }
.project-story-text p {
  color: var(--black); font-size: 1.05rem; margin-bottom: 18px;
  opacity: 0; transform: translateY(14px); transition: opacity 0.6s ease, transform 0.6s ease;
}
.project-story-text p:last-child { margin-bottom: 0; }
.project-story-text p.is-in { opacity: 1; transform: translateY(0); }
/* "Zeitplan"/"Fragen" im Fliesstext: bewusst schwarz statt Akzentfarbe, nur
   fett+unterstrichen als Hinweis, dass sie klickbar sind. */
.project-story-text .dw {
  font-weight: 700; text-decoration: underline; text-decoration-thickness: 1.5px;
  text-underline-offset: 3px; color: var(--black); cursor: pointer; transition: opacity 0.2s ease;
}
.project-story-text .dw:hover { opacity: 0.55; }

/* Fancy-Popup: wächst mit leichtem Overshoot aus der Klickposition des
   Wortes heraus (transform-origin wird per JS auf die Klickkoordinaten
   gesetzt, siehe openDocFancy()) statt einfach mittig reinzufaden. */
.doc-popup-backdrop {
  position: fixed; inset: 0; z-index: 400; display: flex; align-items: center; justify-content: center;
  background: rgba(0,0,0,0); backdrop-filter: blur(0px); opacity: 0; pointer-events: none;
  transition: opacity 0.4s ease, background 0.4s ease, backdrop-filter 0.4s ease;
}
.doc-popup-backdrop.is-open { opacity: 1; pointer-events: all; background: rgba(0,0,0,0.78); backdrop-filter: blur(8px); }
.doc-popup-card {
  position: relative; background: var(--white); border-radius: 12px; overflow: hidden;
  width: min(520px, 88vw); box-shadow: 0 40px 90px rgba(0,0,0,0.55);
  transform: scale(0.25); opacity: 0;
  transition: transform 0.6s cubic-bezier(.22, 1.18, .3, 1), opacity 0.32s ease;
}
.doc-popup-backdrop.is-open .doc-popup-card { transform: scale(1); opacity: 1; }
.doc-popup-imgwrap { aspect-ratio: 3/4; background: #ececec; }
.doc-popup-imgwrap img { width: 100%; height: 100%; object-fit: contain; background: var(--white); display: block; }
.doc-popup-nav {
  display: flex; align-items: center; justify-content: space-between; padding: 12px 16px;
  border-top: 1px solid var(--line); font-size: 0.78rem; color: var(--grey);
}
.doc-popup-nav button { background: none; border: none; cursor: pointer; font-size: 1rem; color: var(--black); width: 28px; height: 28px; }
.doc-popup-close {
  position: absolute; top: 12px; right: 12px; z-index: 2; width: 32px; height: 32px; border-radius: 50%;
  background: rgba(255,255,255,0.9); border: none; font-size: 1.2rem; cursor: pointer;
}

/* Gleichmässiges Hochformat-Grid statt horizontaler Scroll-Leiste: 4 Spalten,
   Platz für bis zu 8 Bilder (2 Reihen) -- weniger Bilder füllen einfach
   weniger Reihen, bleiben aber im gleichen sauberen Raster. */
.project-story-bts-strip {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px;
}
.project-story-bts-strip img,
.project-story-bts-strip video {
  width: 100%; aspect-ratio: 3 / 4; border-radius: 3px;
  object-fit: cover; display: block; background: #000;
}
.project-story-bts-strip img { cursor: pointer; }
/* Admin-Flag "Querformat" (siehe project-edit.ejs/wireWorkItem-Pendant oben):
   einzelnes BTS-Video bewusst breiter als die sonst einheitlichen 3:4-
   Hochformat-Kacheln -- spannt dafür 2 Spalten. Bewusst OHNE eigenes
   aspect-ratio: die Zeile hat dadurch exakt dieselbe Höhe wie die
   Hochformat-Kacheln daneben (Grid-Items strecken sich standardmässig auf
   die Zeilenhöhe), Unterkante bleibt also in einer Linie. object-fit:cover
   (siehe oben) schneidet das Querformat-Video dafür minimal rechts/links an,
   gleiche Logik wie überall sonst in dieser Leiste.
   WICHTIG: aspect-ratio:3/4 von der allgemeinen Regel oben muss hier explizit
   aufgehoben werden (nicht nur weggelassen) -- sonst gewinnt weiterhin die
   allgemeine Regel (gleiche Spezifität, aber früher deklariert), und die
   Kachel wird bei 2 Spalten Breite nur proportional GRÖSSER statt an die
   Zeilenhöhe angeglichen. height:100% macht beide Dimensionen definit, damit
   aspect-ratio (von der Regel oder vom Video selbst) gar nicht erst greift. */
.project-story-bts-strip video.is-landscape {
  grid-column: span 2;
  aspect-ratio: auto;
  height: 100%;
}
/* Platzhalter-Kacheln (Template für Projekte ohne finale BTS-Fotos) --
   gleiche Graustufen-Optik wie die übrigen Platzhalter-Blöcke der Seite. */
.project-story-bts-strip .bts-placeholder { width: 100%; aspect-ratio: 3 / 4; border-radius: 3px; }

/* "Weitere Clips": Hochformat-Video-Grid vor dem BTS-Bereich (nur sichtbar,
   wenn ein Projekt PROJECTS[id].moreVideos hat, siehe script.js) — gleiche
   Spaltenbreite wie .project-bts-grid, damit beide Bereiche optisch gleich
   breit wirken. */
.project-videos-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
.project-videos-grid video,
.project-videos-grid .project-more-video-iframe {
  width: 100%;
  aspect-ratio: 9 / 16;
  background: #000;
  border-radius: 4px;
  display: block;
}
.project-videos-grid .project-more-video-iframe { border: 0; }
/* Querformat-YouTube-Clips (siehe isYoutubeShortsUrl in script.js) über die
   volle Breite spannen statt in einer schmalen 1-von-3-Spalte zu wirken --
   bei nur einem Querformat-Clip bleibt damit die ursprüngliche grosse
   Grösse wie vor der Hochformat/Querformat-Unterscheidung erhalten. */
.project-videos-grid .project-more-video-wide { grid-column: 1 / -1; }
.project-video-placeholder {
  width: 100%;
  aspect-ratio: 9 / 16;
  border-radius: 4px;
}

.project-error {
  display: none;
  padding: 46px 32px 120px;
  font-family: var(--font-body);
}
.project-error a { text-decoration: underline; }

.work-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 0;
}
/* Reiner JS-Zielcontainer (siehe video.html/script.js) für die 6 16:9-
   Kacheln -> display:contents nimmt den Wrapper aus dem Grid-Layout raus,
   seine Kinder zählen weiterhin als direkte Grid-Items von .work-grid. */
.work-grid-tiles { display: contents; }
.work-item {
  position: relative;
  aspect-ratio: 16 / 9; /* entspricht dem Seitenverhältnis der Quellclips -> kein unnötiges Cropping */
  overflow: hidden;
  background: linear-gradient(150deg, #1a1a1a, #4a4a4a 140%);
}
.work-video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: grayscale(1);
  transition: filter 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}
.work-item:hover .work-video {
  filter: grayscale(0);
}
.work-item:hover .work-controls {
  opacity: 1;
}
@media (hover: none) {
  .work-video {
    filter: grayscale(0);
  }
}
/* Nummerierung oben links -- gleiches Element/Styling wie .category-row-num
   auf der Foto-Seite, damit Video- und Foto-Grid einheitlich wirken. Immer
   sichtbar (nicht nur beim Hover), wie die Nummern auf der Foto-Seite. */
.work-num {
  position: absolute;
  top: 20px;
  left: 20px;
  z-index: 2;
  color: var(--white);
  font-family: var(--font-display);
  font-size: 0.8rem;
  letter-spacing: 0.05em;
  opacity: 0.7;
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.5);
}

.work-controls {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
  display: flex;
  flex-direction: row;
  align-items: flex-end;
  /* Kein Projektname mehr (siehe .work-project-name-Entfernung) -> nur noch
     die Controls-Row (Fortschrittsleiste + Fullscreen-Icon) als einziges
     Kind, rechtsbündig. */
  justify-content: flex-end;
  gap: 8px;
  padding: 20px;
  color: var(--white);
  opacity: 0;
  transition: opacity 0.2s ease;
}
.work-item { cursor: pointer; }
/* Bei ungerader Anzahl 16:9-Kacheln bliebe sonst eine Spalte leer -> letzte
   Kachel spannt dann beide Spalten. Als explizite Klasse statt :nth-child()+
   :has()-Geschwister-Selektor, da das Grid jetzt dynamisch aus dem Admin-
   Backend erzeugt wird (script.js setzt die Klasse direkt auf die letzte
   Kachel, unabhängig von DOM-Wrappern/-Nachbarn). */
.work-item.work-item-span-full { grid-column: 1 / -1; }
/* Touch-Geräte kennen kein zuverlässiges :hover -> Learn-Link permanent
   zeigen statt nur bei Hover (sonst auf dem Handy unsichtbar/unerreichbar,
   ausser man tippt das Tile blind an). */
@media (hover: none) {
  .work-controls { opacity: 1; }
  .work-learn-link { opacity: 1; }
}

.work-controls-row {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 10px;
}
/* "See the full video": magnetischer Button (Konzept 17 aus
   video-vorschau.html, von Timo ausgewählt) -- folgt per JS (wireWorkItem in
   script.js) der Mausposition innerhalb der Kachel, statt starr in der Mitte
   zu kleben. left/top werden dafür per JS gesetzt, transform bleibt hier fix
   (zentriert den Button exakt auf dem per left/top gesetzten Punkt). Ohne
   mousemove (Touch, siehe @media hover:none unten) bleibt einfach diese
   CSS-Default-Position (Kachelmitte) stehen. */
.work-learn-link {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 9px 17px;
  border-radius: 24px;
  /* Konzept 2 aus cursor-vorschau.html (Outline-Pill), statt komplett
     transparenter Mitte mit Weichzeichner hinterlegt -> Glass-Look, Video
     bleibt erkennbar aber nicht scharf lesbar durch den Button hindurch. */
  background: rgba(0, 0, 0, 0.25);
  backdrop-filter: blur(14px) saturate(140%);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  border: 1.5px solid rgba(255, 255, 255, 0.85);
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--white);
  white-space: nowrap;
  opacity: 0;
  /* Schnelles, einfaches Ein-/Ausblenden (kein Einschwingen/Lag auf
     left/top -- das wollte Timo explizit nicht) -- kurze Dauer, damit beim
     Wechsel zwischen Kacheln kein langes Überblenden zweier Buttons
     gleichzeitig sichtbar ist ("sticky"-Gefühl). */
  transition: opacity 0.15s ease;
}
.work-item:hover .work-learn-link { opacity: 1; }
.work-learn-link::after { content: "→"; transition: transform 0.2s ease; }
.work-learn-link:hover::after { transform: translateX(2px); }

.work-progress {
  display: none; /* nur im Grid-Hover ausgeblendet; im Video-Modal nutzt die
  native <video controls>-Zeitleiste, die hiervon unberührt bleibt */
  flex: 1;
  height: 3px;
  background: rgba(255,255,255,0.3);
  border-radius: 2px;
  cursor: pointer;
}
.work-progress-fill {
  height: 100%;
  width: 0%;
  background: var(--white);
  border-radius: 2px;
}
/* Hochformat-Vorschau-Zeile (siehe video.html) — spannt beide Grid-Spalten,
   3 Clips nebeneinander in echtem 9:16 statt ins 16:9-Raster gecroppt, füllen
   zusammen die volle Seitenbreite. */
.work-portrait-row {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 0;
}
.work-item-portrait {
  aspect-ratio: 9 / 16;
  width: 100%;
}

.work-text-section { padding: 100px 0; }
.work-text {
  max-width: 640px;
  margin: 0 auto;
  text-align: center;
}
.work-text p:not(.section-eyebrow) { color: var(--black); }

@media (max-width: 640px) {
  /* Kunden-Section (Logo-Marquee): auf Mobile deutlich zu viel Leerraum
     oben/unten -> kompakter, gleiche Logik wie die anderen Section-Paddings
     in diesem Breakpoint. Nur .section-alt (= Kunden), nicht die BTS-
     Marquee direkt darüber, die dieselbe .marquee-section-Klasse teilt. */
  .marquee-section.section-alt { padding: 16px 0 24px; }
  .marquee-section.section-alt .marquee {
    margin-top: 0;
    -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 48px, #000 calc(100% - 48px), transparent 100%);
    mask-image: linear-gradient(90deg, transparent 0, #000 48px, #000 calc(100% - 48px), transparent 100%);
  }
  .work-grid { grid-template-columns: 1fr; }
  .work-media-head { padding: 32px 20px 16px; flex-wrap: wrap; gap: 14px; }
  .work-portrait-row { grid-template-columns: 1fr; }
  .work-item-portrait { max-height: 70vh; }
  .project-videos-grid { grid-template-columns: 1fr; }
  .category-row-list { grid-template-columns: 1fr; }
  .category-detail-head { padding: 32px 20px 24px; }
  .category-detail-grid { padding: 0 20px 60px; }
  .project-hero { padding: 32px 20px 24px; }
  .project-block { padding: 0 20px 48px; }
  .project-bts-grid { grid-template-columns: 1fr; }
  .project-photos-grid { grid-template-columns: repeat(2, 1fr); }
  .video-modal-close { top: 16px; right: 16px; }
  .video-modal-nav { width: 40px; height: 40px; }
  .video-modal-prev { left: 12px; }
  .video-modal-next { right: 12px; }
  .video-modal-learn-link { left: 16px; bottom: 16px; padding: 10px 16px; font-size: 0.82rem; }
}

/* ---------- Footer ---------- */
.site-footer { padding: 72px 0 28px; border-top: 1px solid var(--line); }
.footer-inner {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 40px;
  padding-bottom: 48px;
  border-bottom: 1px solid var(--line);
}
.footer-brand p { color: var(--grey); margin-top: 12px; font-size: 0.9rem; }
.footer-links {
  text-align: right;
}
.footer-links h4 {
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--grey);
  margin-bottom: 16px;
}
.footer-links a {
  display: block;
  color: var(--black);
  font-size: 0.9rem;
  margin-bottom: 10px;
  opacity: 0.85;
}
.footer-links a:hover { opacity: 1; }
.footer-bottom {
  padding-top: 24px;
  font-size: 0.8rem;
  color: var(--grey);
  display: flex;
  flex-wrap: wrap;
  gap: 8px 20px;
  justify-content: space-between;
}
.footer-legal-links a { color: var(--grey); text-decoration: underline; text-underline-offset: 2px; }
.footer-legal-links a:hover { color: var(--black); }

/* ---------- Simple Legal Pages (Impressum, AGB) ---------- */
.legal-page {
  padding: 160px 0 120px;
}
.legal-content {
  max-width: 720px;
  margin: 0 auto;
}
.legal-content h1 {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(2rem, 5vw, 2.8rem);
  margin-bottom: 40px;
}
.legal-content h2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.15rem;
  margin: 36px 0 12px;
}
.legal-content p, .legal-content li {
  color: var(--black);
  margin-bottom: 14px;
}
.legal-content ul { padding-left: 20px; }

/* ---------- Responsive ---------- */
@media (max-width: 900px) {
  .creative-network-grid { grid-template-columns: repeat(2, 1fr); }
  /* Stapel-Shuffle bei 2 Spalten: Muster wechselt von 4er- auf 2er-Rhythmus,
     sonst würde Spalte 3 fälschlich wieder auf 0 "zurückstapeln". */
  .creative-network-item:nth-child(odd) { --stack-x: 0px; --stack-r: -4deg; --stack-delay: 0s; }
  .creative-network-item:nth-child(even) { --stack-x: calc(-100% - 24px); --stack-r: 3deg; --stack-delay: 0.1s; }
  .footer-inner { flex-direction: column; gap: 32px; }
  .footer-links { text-align: left; }
  /* .back-to-top ist fixed (32px + 44px = 76px vom unteren Rand) -> ohne
     Reserve überlappt er hier die letzte Footer-Zeile (Impressum/AGB).
     Zeilenumbruch erzwingen statt vom zufälligen flex-wrap abhängig zu sein,
     plus genug Platz am Ende reservieren. */
  .footer-bottom { flex-direction: column; align-items: flex-start; padding-bottom: 90px; }
  .project-story-viewport { padding: 32px 20px; }
  .project-story-bts-strip { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 640px) {
  .section { padding: 80px 0; }
  .about-values-section { padding: 60px 24px; }
  .about-values-row { grid-template-columns: 50px 1fr; gap: 14px; }
  .about-values-num { font-size: 1.6rem; }
  .creative-network-section { padding: 60px 0; }
  .creative-network-grid { grid-template-columns: 1fr; gap: 28px; }
  /* Bei 1 Spalte ergibt "Richtung Vorgänger stapeln" keinen Sinn mehr (jede
     Karte ist bereits allein in ihrer Zeile) -> nur noch simples Einschweben. */
  .creative-network-item { transform: translateY(28px) scale(0.94); }
  .creative-network-item.is-in { transform: translateY(0) scale(1); }
  .about-split-hero { grid-template-columns: 1fr; height: auto; }
  .about-split-photo img { min-height: 340px; height: auto; aspect-ratio: 4/5; }
  .about-split-text { padding: 32px 24px 40px; }
  .about-text-section { padding: 60px 24px; }
  .about-text-layout { grid-template-columns: 1fr; gap: 50px; }
  .about-text-copy { max-width: none; }
  .about-text-polaroids { height: 340px; max-width: 320px; margin: 0 auto; }
  .about-polaroid-1 { width: 150px; left: 0; top: 0; }
  .about-polaroid-2 { left: 140px; top: 50px; width: 130px; }
  .about-polaroid-3 { left: 20px; top: 175px; width: 130px; }
  .about-polaroid-4 { left: 150px; top: 210px; width: 130px; }
  .nav {
    position: fixed;
    top: 0;
    right: 0;
    height: 100vh;
    width: 72%;
    max-width: 300px;
    background: var(--bg);
    border-left: 1px solid var(--line);
    flex-direction: column;
    justify-content: center;
    align-items: flex-start;
    gap: 28px;
    padding: 40px;
    transform: translateX(100%);
    transition: transform 0.3s ease;
    z-index: 99;
  }
  /* Desktop gruppiert Home/Video und Foto/About getrennt (fürs Logo in der
     Mitte) -> im Mobilmenü sollen weiterhin alle 4 Links als eine flache,
     gleichmässig gestapelte Liste erscheinen. display:contents nimmt die
     Gruppen-Wrapper aus dem Layout raus, ihre <a> werden direkte Flex-Kinder
     von .nav (und folgen damit dessen flex-direction:column/gap). */
  .nav-group { display: contents; }
  .nav.open { transform: translateX(0); }
  /* Aufgeklapptes Mobil-Menü hat immer weissen Hintergrund (s.o.) -> Text/
     Icon deshalb immer schwarz, auch wenn der Header selbst gerade im
     transparenten Zustand ist (z.B. index.html/about.html ganz oben). */
  .nav.open a { color: var(--black); }
  .nav.open a::after { background: var(--black); }
  .nav-toggle.open span { background: var(--black); }
  .nav-toggle { display: flex; }
  .nav-toggle.open span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
  .nav-toggle.open span:nth-child(2) { opacity: 0; }
  .nav-toggle.open span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
}

/* ---------- Shop ---------- */
/* Vollbild-Video-Hero + Produkt-Karten (Referenzen vfxmedia.ch/shop und
   luahell.com/shop nur für Struktur/Layout -- Timo will explizit weiss/
   schwarz, kein dunkles Overlay). Hero UND Grid sind je exakt eine
   Bildschirmhöhe (min-height:100vh, wie .hero-video auf der Startseite),
   nicht nur inhaltsgetrieben hoch. Normaler (nicht transparenter) Header,
   da der Hero jetzt hell ist -- weisse Nav-Schrift wäre hier unlesbar. */
.shop-hero-section {
  position: relative;
  min-height: 100vh;
  display: flex;
  align-items: flex-end;
  overflow: hidden;
  background: var(--bg); /* Fallback, falls das Video (noch) nicht lädt */
}
.shop-hero-bg { position: absolute; inset: 0; }
.shop-hero-video { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Bewusst KEIN Gradient/Tint über dem Video -- explizite Vorgabe von Timo,
   das Video bleibt unverändert sichtbar. */
.shop-hero-content {
  position: relative;
  z-index: 2;
  /* Kein eigenes max-width/margin:auto mehr auf dem .container selbst --
     sonst zentriert sich die Box (via .container's margin:0 auto) innerhalb
     der flex-Section statt linksbündig auf derselben 1240px-Spalte wie der
     Header zu sitzen. Die Textbreite wird stattdessen von .shop-hero-text
     innen begrenzt. */
  width: 100%;
  /* Wenig Top-Padding: der Block hängt per align-items:flex-end ohnehin
     unten -- ein grosses padding-top würde die Section über die Ziel-
     Bildschirmhöhe (min-height:100vh) hinaus wachsen lassen. */
  padding-top: 24px;
  padding-bottom: 40px;
}
/* Kein Panel mehr (frühere "Liquid Glass"-Version aus Design-Runde verworfen,
   siehe shop-hero-video-vorschau-2.html Konzept 11/Deploy-Kandidat) -- Text
   liegt direkt auf dem Video, nur Text-Schatten für Lesbarkeit, damit mehr
   vom Video sichtbar bleibt. Wieder exakt linksbündig mit "HOME" im Navbar
   (kein Rechts-Versatz mehr, auf expliziten Wunsch zurückgesetzt). */
.shop-hero-text {
  max-width: 620px;
}
.shop-hero-text > * { text-shadow: 0 2px 16px rgba(0, 0, 0, 0.65), 0 1px 3px rgba(0, 0, 0, 0.7); }
.shop-hero-text .shop-hero-cta,
.shop-hero-text .shop-hero-info-btn { text-shadow: none; }
@media (max-width: 560px) {
  .shop-hero-text { margin-left: 0; }
}
.shop-hero-name {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(2.4rem, 6vw, 4rem);
  line-height: 1.02;
  color: var(--white);
  margin-bottom: 14px;
}
/* Wort-für-Wort-Reveal für Name + Beschreibung (siehe animateShopHeroReveal()
   in script.js) -- jedes Wort ein eigenes Inline-Element, das per JS
   nacheinander eingeblendet wird. */
.shop-hero-word { display: inline-block; opacity: 0; transform: translateY(10px); transition: opacity 0.3s ease, transform 0.3s ease; }
.shop-hero-word.is-in { opacity: 1; transform: translateY(0); }
/* Info-Icon direkt neben dem Namen -- öffnet einen kurzen Zusatz-Hinweis
   zum Produkt (z.B. wofür Timo den Look selbst einsetzt). */
.shop-hero-info-btn {
  flex-shrink: 0;
  width: 20px;
  height: 20px;
  margin-left: 10px;
  vertical-align: middle;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.16);
  border: 1px solid rgba(255, 255, 255, 0.45);
  color: var(--white);
  font-size: 0.65rem;
  font-weight: 700;
  font-family: var(--font-body);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.shop-hero-tooltip {
  position: absolute;
  z-index: 5;
  max-width: 280px;
  background: rgba(20, 20, 20, 0.92);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  color: var(--white);
  padding: 14px 16px;
  border-radius: 10px;
  font-size: 0.82rem;
  line-height: 1.5;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
  opacity: 0;
  transform: translateY(6px);
  pointer-events: none;
  transition: opacity 0.2s ease, transform 0.2s ease;
}
.shop-hero-tooltip.is-open { opacity: 1; transform: translateY(0); pointer-events: auto; }
.shop-hero-desc { color: rgba(255, 255, 255, 0.85); font-size: 1.02rem; line-height: 1.6; margin-bottom: 14px; max-width: 46ch; }
.shop-hero-price { font-family: var(--font-display); font-weight: 700; font-size: 1.7rem; color: var(--white); margin-bottom: 14px; }
/* Warenkorb-Button (primär, gefüllt) + "Learn about the look" (sekundär,
   Outline) nebeneinander -- gleiches Primär/Sekundär-Muster wie
   .shop-grid-actions im Produkt-Grid weiter unten. */
.shop-hero-actions { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 14px; }
.shop-hero-actions .shop-hero-cta { margin-bottom: 0; }
.shop-hero-cta {
  display: inline-block;
  padding: 16px 34px;
  border-radius: 999px;
  background: var(--white);
  color: var(--black);
  font-weight: 700;
  font-size: 0.95rem;
  margin-bottom: 14px;
  transition: opacity 0.2s ease, background 0.2s ease;
  border: 1.5px solid transparent;
  cursor: pointer;
}
.shop-hero-cta:hover { opacity: 0.85; }
.shop-hero-cta-secondary {
  background: transparent;
  color: var(--white);
  border-color: rgba(255, 255, 255, 0.7);
}
.shop-hero-cta-secondary:hover { opacity: 1; background: rgba(255, 255, 255, 0.14); }
.shop-hero-trust { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; color: var(--white); font-size: 0.74rem; margin-bottom: 14px; }
.shop-hero-trust-item { display: inline-flex; align-items: center; gap: 6px; }
.shop-hero-trust-item svg { width: 14px; height: 14px; stroke: currentColor; flex-shrink: 0; }
.shop-hero-trust-sep { opacity: 0.55; }
.shop-hero-legal { color: var(--white); font-size: 0.76rem; }
.shop-hero-legal a { color: var(--white); text-decoration: underline; }
/* Zeile-für-Zeile-Reveal (Preis/CTA/Trust/AGB) nach dem Wort-Reveal von
   Name+Beschreibung -- gleicher 70ms-Takt wie die Wort-Animation davor,
   siehe animateShopHeroReveal() in script.js. */
.shop-hero-price,
.shop-hero-cta,
.shop-hero-trust,
.shop-hero-legal {
  opacity: 0;
  transform: translateY(6px);
  transition: opacity 0.3s ease, transform 0.3s ease;
}
.shop-hero-section.is-revealed .shop-hero-price { opacity: 1; transform: translateY(0); transition-delay: 0ms; }
.shop-hero-section.is-revealed .shop-hero-cta { opacity: 1; transform: translateY(0); transition-delay: 70ms; }
.shop-hero-section.is-revealed .shop-hero-trust { opacity: 1; transform: translateY(0); transition-delay: 140ms; }
.shop-hero-section.is-revealed .shop-hero-legal { opacity: 1; transform: translateY(0); transition-delay: 210ms; }
.shop-status { margin-top: 14px; font-size: 0.85rem; color: var(--grey); min-height: 1.2em; }

/* Fest auf 1 Bildschirmhöhe begrenzt (height statt min-height) -- kein
   Weiterscrollen der Gesamtseite nötig, um alle Produkte zu sehen. Falls der
   Katalog irgendwann so gross wird, dass er bei schmaler Fensterbreite (2-
   bzw. 1-spaltig) nicht mehr reinpasst, scrollt NUR die Karten-Fläche selbst
   intern (overflow-y: auto) -- besser als Produkte unsichtbar abzuschneiden. */
.shop-grid-section {
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  overflow-y: auto;
  padding-top: 56px;
  padding-bottom: 56px;
  /* Bei kurzem Katalog (Inhalt kleiner als 100vh, z.B. nur 1 Kartenreihe)
     rutscht der Footer sonst fast direkt an die Karten -- garantiert
     Mindestabstand zum Footer, unabhängig von der Viewport-Höhe. */
  margin-bottom: 48px;
  background: var(--bg);
}
.shop-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; margin-top: 28px; }
.shop-grid-card { display: flex; flex-direction: column; background: var(--white); border: 1px solid var(--line); border-radius: 10px; overflow: hidden; }
/* Kompakteres Seitenverhältnis (statt 4/5) -- damit eine Zeile Karten
   inklusive Überschrift in eine Bildschirmhöhe passt, siehe
   .shop-grid-section. */
.shop-grid-photo { aspect-ratio: 4/3; background: var(--grey); }
.shop-grid-photo img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.6s cubic-bezier(.2,.7,.2,1); }
.shop-grid-card:hover .shop-grid-photo img { transform: scale(1.05); }
.shop-grid-info { padding: 20px 22px 24px; display: flex; flex-direction: column; flex: 1; }
.shop-grid-desc { color: var(--grey); font-size: 0.86rem; line-height: 1.55; margin-bottom: 12px; }
.shop-grid-compat { display: flex; align-items: center; gap: 6px; color: var(--grey); font-size: 0.78rem; margin-bottom: 12px; }
.shop-grid-compat svg { width: 14px; height: 14px; flex-shrink: 0; }
.shop-grid-price { font-family: var(--font-display); font-weight: 700; color: var(--black); margin-bottom: 16px; margin-top: auto; }
.shop-grid-card .btn.btn-primary { align-self: flex-start; padding: 11px 24px; font-size: 0.82rem; }
.shop-grid-actions { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; }
.shop-grid-learn-link {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--black);
  border-bottom: 1px solid var(--line);
  padding-bottom: 2px;
}
.shop-grid-learn-link:hover { border-color: var(--black); }
.shop-grid-learn-link::after { content: "→"; transition: transform 0.2s ease; }
.shop-grid-learn-link:hover::after { transform: translateX(3px); }

.shop-empty { text-align: center; padding-top: 100px; }
.shop-empty .section-title { margin-bottom: 12px; }
.shop-empty p:last-child { color: var(--grey); }

@media (max-width: 860px) {
  .shop-grid { grid-template-columns: repeat(2, 1fr); gap: 24px; }
}
@media (max-width: 560px) {
  .shop-hero-content { padding: 32px 20px 56px; }
  .shop-grid { grid-template-columns: 1fr; }
}

.shop-success-section { padding-top: 160px; padding-bottom: 140px; }
.shop-success { max-width: 560px; text-align: center; }
.shop-success-icon {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: var(--black);
  color: var(--white);
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto 28px;
}
.shop-success-icon svg { width: 26px; height: 26px; }
.shop-success-title {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(1.8rem, 4vw, 2.4rem);
  margin-bottom: 16px;
}
.shop-success-desc { color: var(--grey); font-size: 0.95rem; line-height: 1.65; margin-bottom: 32px; }

/* ---------- Shop: Download-Link-Fehlerseiten (Limit erreicht etc.) ---------- */
.dl-limit-page {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  padding: 40px 24px;
}
.dl-limit-logo { display: inline-block; width: 100px; margin-bottom: auto; }
.dl-limit-logo img { display: block; width: 100%; height: auto; }
.dl-limit-content {
  max-width: 480px;
  margin: auto;
  padding: 60px 0;
  text-align: center;
}
.dl-limit-icon {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: var(--black);
  color: var(--white);
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto 28px;
}
.dl-limit-icon svg { width: 26px; height: 26px; }
.dl-limit-eyebrow {
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--grey);
  margin-bottom: 14px;
}
.dl-limit-title {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(1.6rem, 4vw, 2.2rem);
  margin-bottom: 16px;
}
.dl-limit-desc { color: var(--grey); font-size: 0.95rem; line-height: 1.65; margin-bottom: 32px; }
.dl-limit-contact { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; gap: 10px; }
.dl-limit-contact a {
  display: inline-flex;
  align-items: center;
  color: var(--black);
  font-weight: 600;
  font-size: 0.85rem;
  padding: 9px 16px;
  border: 1px solid var(--line);
  border-radius: 20px;
}
.dl-limit-contact a:hover { background: var(--black); color: var(--white); border-color: var(--black); }

/* ---------- Shop: "Learn about the look" (/shop/look) ---------- */
/* Sticky-Video-Hero (Design aus shop-look-vorschau.html Konzept 21): Video
   bleibt beim Scrollen hinter dem Content fixiert, das weisse Panel darunter
   schiebt sich darüber. Kein padding-top nötig -- Video reicht bis y:0,
   fixer Header schwebt transparent darüber (.site-header-transparent),
   exakt wie beim .hero-video-Muster auf index.html/about.html. */
.shop-look-hero-section { position: relative; }
.shop-look-hero-video-wrap {
  position: sticky;
  top: 0;
  height: 62vh;
  min-height: 420px;
  overflow: hidden;
  z-index: 0;
}
.shop-look-hero-video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.shop-look-back {
  position: absolute;
  top: 96px;
  left: 32px;
  z-index: 2;
  color: var(--white);
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.5);
  font-size: 0.85rem;
}
.shop-look-back:hover { opacity: 0.8; }
.shop-look-hero-overlay {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding-bottom: 40px;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.55), rgba(0, 0, 0, 0) 55%);
}
.shop-look-eyebrow { color: rgba(255, 255, 255, 0.75); margin-bottom: 10px; }
.shop-look-title {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(2.2rem, 5.5vw, 3.6rem);
  color: var(--white);
  text-shadow: 0 2px 16px rgba(0, 0, 0, 0.5);
}
/* Wort-für-Wort-Reveal für den Titel, siehe animateLookHeroReveal() in
   script.js -- gleiche Technik wie beim Shop-Hero (.shop-hero-word). */
.shop-look-word { display: inline-block; opacity: 0; transform: translateY(10px); transition: opacity 0.3s ease, transform 0.3s ease; }
.shop-look-word.is-in { opacity: 1; transform: translateY(0); }
.shop-look-lead-wrap {
  position: relative;
  z-index: 2;
  background: var(--bg);
  border-radius: 16px 16px 0 0;
  margin-top: -16px;
  padding-top: 32px;
}
.shop-look-lead { color: var(--grey); font-size: 1.05rem; max-width: 56ch; line-height: 1.6; }

/* Vorher/Nachher: 2 unabhängige Drag-Slider (Standbilder mit clip-path,
   siehe initShopLookBeforeAfterSliders() in script.js). */
.shop-look-beforeafter-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.shop-look-slider { position: relative; aspect-ratio: 16/9; overflow: hidden; border-radius: 8px; cursor: ew-resize; background: var(--grey); user-select: none; -webkit-user-select: none; }
.shop-look-slider-after, .shop-look-slider-before { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.shop-look-slider-before { clip-path: inset(0 50% 0 0); }
.shop-look-slider-handle {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 3px;
  background: var(--white);
  transform: translateX(-50%);
}
.shop-look-slider-handle span {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 38px;
  height: 38px;
  border-radius: 50%;
  background: var(--white);
  color: var(--black);
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.3);
}
.shop-look-tag {
  position: absolute;
  bottom: 12px;
  font-size: 0.68rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  background: rgba(0, 0, 0, 0.6);
  color: var(--white);
  padding: 5px 10px;
  border-radius: 999px;
  pointer-events: none;
}
.shop-look-tag-before { left: 12px; }
.shop-look-tag-after { right: 12px; }
.shop-look-slider-hint { color: var(--grey); font-size: 0.82rem; margin-top: 14px; }
.shop-look-beforeafter-cta { color: var(--grey); font-size: 0.86rem; margin-top: 6px; }
.shop-look-beforeafter-cta a { color: var(--black); text-decoration: underline; }

/* Durchgehendes weisses Panel nach dem Hero -- keine Section-Umbrüche,
   Farbwechsel oder zusätzliche H2-Titel zwischen den Blöcken (Konzept 21). */
/* position:relative + z-index + kleiner Minus-Margin: Sicherheitsüberlapp
   GENAU an der Stelle, wo Sticky-Video-Ende/Lead-Wrap-Ende/Panel-Anfang
   exakt zusammenfallen (Sticky-Release-Grenze) -- dort blitzte je nach
   Lead-Text-Länge (z.B. bei Powergrade, nicht bei Bundle mit leerem Text)
   beim Scrollen ein 1-2px-Haarriss vom dunklen Video-Verlaufsfarbverlauf
   durch (Subpixel-Rundung genau am Sticky-Übergang). Panel deckt diese
   Nahtstelle jetzt unabhängig von der Textlänge zuverlässig ab. */
.shop-look-panel { position: relative; z-index: 3; background: var(--bg); margin-top: -4px; }
/* Abstand zwischen den Blöcken (Was du bekommst/Vorher-Nachher/Kompatibilität/
   Wie mein Look entstand/Ehrlich gesagt/FAQ) -- vorher 64px, wirkte auf
   Timos Feedback hin "zusammengequetscht" -- auf 96px erhöht, gilt einheitlich
   für alle Blöcke dieser Seite. */
.shop-look-panel-block { padding: 0 0 96px; }
.shop-look-panel-block-first { padding-top: 12px; }
/* "Was du bekommst" sitzt in der Mitte der Lücke zwischen Video und Karte,
   statt am unteren Rand zu kleben -- Lücke oben (Lead-Wrap-Padding + dieses
   padding-top) und Lücke unten (margin-bottom hier) sind bewusst gleich
   gross gehalten. */
.shop-look-panel-block.shop-look-panel-block-first .section-eyebrow { margin-bottom: 44px; }
/* Nur wenn ein Cross-Sell-Teaser angezeigt wird, ist der Inhalt darunter als
   Gruppe zentriert (Karte + Teaser) -- die Eyebrow entsprechend mittig, statt
   wie sonst auf dieser Seite links-bündig. Ohne Cross-Sell (2 Varianten oder
   einzelne Karte ohne Teaser) bleibt alles links, siehe .has-crosssell. */
.shop-look-panel-block-first:has(.shop-look-variants-row.has-crosssell) .section-eyebrow { text-align: center; }
.shop-look-panel-block-last { padding-bottom: 96px; }
/* Eyebrow-Labels auf dieser Seite: links-bündig, fett, enger als das
   generische zentrierte .section-eyebrow anderswo auf der Website --
   exakt .pf-eyebrow aus Konzept 21. */
.shop-look-hero-overlay .section-eyebrow,
.shop-look-panel-block .section-eyebrow {
  text-align: left;
  font-weight: 700;
  letter-spacing: 0.1em;
  font-size: 0.72rem;
  margin-bottom: 14px;
}

/* Kompatibilität: Kameras + Software nebeneinander. max-width sitzt bewusst
   auf dem GRID, nicht auf dem äusseren .container-Element -- sonst zentriert
   sich der ganze Block per .container's eigenem margin:auto innerhalb der
   vollen Panel-Breite statt links-bündig an derselben Kante wie die übrigen
   Panel-Blöcke (Was du bekommst, FAQ, ...) zu stehen. */
.shop-look-compat-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 40px; max-width: 960px; }
.shop-look-compat-block h3 { font-family: var(--font-display); font-weight: 700; font-size: 1rem; margin-bottom: 12px; }
.shop-look-compat-intro { color: var(--grey); font-size: 0.88rem; line-height: 1.5; margin-bottom: 12px; }
/* Häkchen-Liste statt Pills/Fliesstext -- gleiches Checkmark-Icon wie
   .shop-look-variant-features, damit Kompatibilität sich konsistent zu den
   "Was du bekommst"-Karten anfühlt statt wie ein eigenes Muster. */
.shop-look-compat-checklist { list-style: none; display: flex; flex-direction: column; gap: 8px; padding: 0; margin: 0; }
.shop-look-compat-checklist li { display: flex; align-items: flex-start; gap: 8px; color: var(--grey); font-size: 0.88rem; line-height: 1.5; }
.shop-look-compat-checklist li svg { width: 15px; height: 15px; flex-shrink: 0; margin-top: 2px; color: #151738; }

/* Ehrlicher Hinweis -- max-width auf dem Text selbst, gleicher Grund wie bei
   .shop-look-compat-grid oben (sonst zentriert sich der Block innerhalb der
   vollen Panel-Breite statt links-bündig zu stehen). */
/* white-space:pre-line -- Leerzeilen/Zeilenumbrüche, die Timo im Admin-
   Textfeld tippt, sollen 1:1 auch auf der Website als Absatz-Abstand
   erscheinen (sonst collapst HTML jeden \n standardmässig zu einem
   einzelnen Leerzeichen, siehe honestEl.textContent in script.js). Gleiche
   Konvention wie bei .project-title für \n in Projekttiteln. */
.shop-look-honest-text { font-size: 1.05rem; line-height: 1.75; max-width: 780px; white-space: pre-line; }
.shop-look-honest-text strong { font-weight: 700; }
.shop-look-origin-text { font-size: 1.05rem; line-height: 1.75; max-width: 780px; color: var(--grey); }
/* "Wie mein Look entstand" soll nicht wie eine hervorgehobene Überschrift
   wirken, sondern optisch wie der Fliesstext direkt darunter -- Override
   NUR in diesem Block (.shop-look-origin), die generische .section-eyebrow-
   Optik (fett, Kapitälchen, Buchstabenabstand) bleibt für alle anderen
   Eyebrows auf der Seite unverändert. */
.shop-look-origin .section-eyebrow {
  text-transform: none;
  letter-spacing: normal;
  font-weight: 400;
  font-size: 1.05rem;
  color: var(--grey);
}

/* Bilder bei "Wie mein Look entstand": auf Desktop neben dem Text (2
   gestapelte, hochformatige Bilder rechts), auf Mobile darunter (2
   nebeneinander, volle Breite) -- siehe origin_image_1/2 in ordersStore.js,
   admin-gepflegt wie das Produktbild. Ohne Bilder bleibt .shop-look-origin-
   images per inline style:none versteckt (siehe initShopLookPage in
   script.js), der Text nimmt dann wie bisher die volle Breite ein. */
.shop-look-origin-row { display: flex; gap: 44px; align-items: flex-start; flex-wrap: wrap; }
.shop-look-origin-row .shop-look-origin-text { flex: 1 1 360px; max-width: 780px; margin: 0; }
.shop-look-origin-images { flex: 0 0 240px; display: flex; flex-direction: column; gap: 16px; }
.shop-look-origin-img { width: 100%; aspect-ratio: 4/3; object-fit: cover; border-radius: 14px; display: block; }
@media (max-width: 760px) {
  .shop-look-origin-images { flex-direction: row; flex-basis: 100%; gap: 12px; }
  .shop-look-origin-img { aspect-ratio: 1/1; }
}

/* Kontakt-Hinweis am Ende der FAQ */
.shop-look-contact { margin-top: 56px; }
.shop-look-contact-lead { font-weight: 600; margin-bottom: 12px; }
.shop-look-contact-links { display: flex; gap: 14px; }
.shop-look-contact-link {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: 0.85rem;
  font-weight: 600;
  padding: 9px 16px;
  border: 1px solid var(--line);
  border-radius: 999px;
  color: var(--black);
}
.shop-look-contact-link:hover { border-color: var(--black); }

/* /shop/free-test: "Kostenloser Test"-Seite, von /shop/look aus verlinkt
   (Vorher/Nachher-CTA) -- Design "Vertikale Timeline" (Konzept 1 aus
   shop-free-test-vorschau.html), von Timo ausgewählt. Titel + die 4 Schritte
   sind admin-editierbar (siehe applyShopContent in script.js, Admin ->
   Shop -> Kostenloser Test); ohne Admin-Werte bleibt dieser statische
   Text stehen (progressive enhancement, gleiches Muster wie überall). */
.free-test-section { padding: 100px 0 80px; }
.free-test-head { max-width: 640px; margin: 0 auto; text-align: center; }
.free-test-title { font-family: var(--font-display); font-weight: 800; font-size: clamp(1.6rem, 3.4vw, 2.3rem); line-height: 1.2; margin-top: 12px; }
.free-test-steps { max-width: 620px; margin: 56px auto 0; position: relative; }
.free-test-steps::before { content: ""; position: absolute; left: 23px; top: 20px; bottom: 20px; width: 1px; background: var(--line); }
.free-test-step { display: grid; grid-template-columns: 46px 1fr; gap: 22px; padding-bottom: 38px; position: relative; }
.free-test-step:last-child { padding-bottom: 0; }
.free-test-step-num {
  width: 46px; height: 46px; border-radius: 50%; background: var(--black); color: var(--white);
  display: flex; align-items: center; justify-content: center;
  font-family: var(--font-display); font-weight: 800; font-size: 1rem; z-index: 1;
}
.free-test-step-title { font-family: var(--font-display); font-weight: 700; font-size: 1.05rem; margin-bottom: 6px; }
.free-test-step-desc { font-size: 0.9rem; color: var(--grey); line-height: 1.65; max-width: 46ch; }
.free-test-contact { max-width: 620px; margin: 64px auto 0; text-align: center; }
.free-test-unverb { display: inline-flex; align-items: center; gap: 7px; font-size: 0.82rem; font-weight: 600; color: #16794a; margin-top: 22px; }
.free-test-unverb svg { width: 15px; height: 15px; }
@media (max-width: 640px) {
  .free-test-section { padding: 70px 0 60px; }
  .free-test-steps::before { left: 19px; }
  .free-test-step { grid-template-columns: 38px 1fr; gap: 16px; }
  .free-test-step-num { width: 38px; height: 38px; font-size: 0.88rem; }
}

.shop-look-variants-row { display: block; }
/* Nur gesetzt, wenn nur 1 Variante angezeigt wird UND andere aktive Produkte
   existieren -- Karte + Cross-Sell-Teaser nebeneinander, siehe
   renderCrosssellTeaser() in script.js. */
.shop-look-variants-row.has-crosssell { display: grid; grid-template-columns: 420px auto; gap: 56px; align-items: start; justify-content: center; }
.shop-look-variants { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; align-items: stretch; }
.shop-look-variants-single { grid-template-columns: 1fr; max-width: 420px; }

/* Cross-Sell-Teaser ("Lieber einzeln?") -- Bild-Swatch + Schlagschatten-Karte
   (Konzept 6 + Schatten aus Konzept 9, shop-look-crosssell-vorschau.html). */
.shop-look-crosssell-label { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.1em; font-weight: 700; color: var(--grey); margin-bottom: 14px; }
.shop-look-crosssell-list { display: flex; flex-direction: column; gap: 12px; max-width: 340px; }
.shop-look-crosssell-item {
  display: flex;
  align-items: center;
  gap: 14px;
  border: 1px solid var(--line);
  border-radius: 12px;
  padding: 10px;
  background: var(--white);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
  transition: box-shadow 0.2s ease;
}
.shop-look-crosssell-item:hover { box-shadow: 0 10px 28px rgba(0, 0, 0, 0.12); }
.shop-look-crosssell-swatch {
  width: 52px;
  height: 52px;
  border-radius: 8px;
  flex-shrink: 0;
  background: linear-gradient(135deg, #3a3a42, #111) center / cover;
}
.shop-look-crosssell-info { flex: 1; min-width: 0; }
.shop-look-crosssell-name { font-weight: 700; font-size: 0.9rem; }
.shop-look-crosssell-price { color: var(--grey); font-size: 0.8rem; }
.shop-look-crosssell-arrow { color: #bbb; flex-shrink: 0; }
.shop-look-variant-card {
  border: 1px solid var(--line);
  border-radius: 12px;
  padding: 24px;
  display: flex;
  flex-direction: column;
  position: relative;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}
.shop-look-variant-card.is-recommended { border-color: #151738; box-shadow: 0 0 0 1px #151738, 0 8px 24px rgba(0, 0, 0, 0.08); }
.shop-look-variant-badge {
  position: absolute;
  top: -11px;
  right: 20px;
  background: #151738;
  color: var(--white);
  font-size: 0.65rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  padding: 4px 10px;
  border-radius: 999px;
}
.shop-look-variant-kicker { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--grey); margin-bottom: 6px; }
.shop-look-variant-name { font-family: var(--font-display); font-weight: 800; font-size: 1.3rem; margin-bottom: 12px; }
.shop-look-variant-desc { color: var(--grey); font-size: 0.9rem; line-height: 1.6; margin-bottom: 20px; }
.shop-look-variant-features { list-style: none; margin: 0 0 24px; padding: 0; display: flex; flex-direction: column; gap: 8px; flex: 1; }
.shop-look-variant-features li { display: flex; align-items: flex-start; gap: 8px; font-size: 0.86rem; }
.shop-look-variant-features li svg { width: 15px; height: 15px; flex-shrink: 0; margin-top: 2px; color: #151738; }
.shop-look-variant-price { font-family: var(--font-display); font-weight: 700; font-size: 1.5rem; margin-bottom: 18px; }
.shop-look-variant-card .btn { width: 100%; }
.shop-look-variant-status { margin-top: 12px; font-size: 0.82rem; color: var(--grey); min-height: 1.2em; text-align: center; }

.shop-look-faq-wrap { max-width: 760px; }
.shop-look-faq-item { border-top: 1px solid var(--line); }
.shop-look-faq-item:last-child { border-bottom: 1px solid var(--line); }
.shop-look-faq-head {
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 20px;
  padding: 20px 2px;
  text-align: left;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 1rem;
  background: none;
  border: none;
  cursor: pointer;
  color: var(--black);
}
.shop-look-faq-plus { flex-shrink: 0; font-size: 1.2rem; color: var(--grey); transition: transform 0.25s ease; }
.shop-look-faq-item.is-open .shop-look-faq-plus { transform: rotate(45deg); }
.shop-look-faq-body { max-height: 0; overflow: hidden; transition: max-height 0.3s ease; }
.shop-look-faq-item.is-open .shop-look-faq-body { max-height: 240px; }
.shop-look-faq-body p { color: var(--grey); font-size: 0.9rem; line-height: 1.65; padding: 0 2px 20px; }
/* FAQ-Antworten können Links enthalten (renderFaqItem() setzt answer per
   innerHTML) -- ohne diese Regel wäre so ein Link unsichtbar, da <a> sitewide
   standardmässig Farbe/Unterstreichung von aussen erbt (siehe a {} weiter
   oben). */
.shop-look-faq-body a { color: var(--black); text-decoration: underline; }

@media (max-width: 860px) {
  .shop-look-variants { grid-template-columns: 1fr; }
  .shop-look-variants-row.has-crosssell { grid-template-columns: 1fr; gap: 32px; }
  .shop-look-crosssell-list { max-width: none; }
  .shop-look-beforeafter-grid { grid-template-columns: 1fr; }
  .shop-look-compat-grid { grid-template-columns: 1fr; gap: 24px; }
  .shop-look-hero-video-wrap { height: 46vh; min-height: 320px; }
  .shop-look-back { top: 84px; left: 20px; }
}

/* ---------- Warenkorb (shop.html, shop-look.html) ---------- */
/* Rechts unten statt links, oberhalb von .back-to-top gestapelt (beide
   rechtsbündig, 48px Button + 44px Button + 14px Lücke = 106px Abstand) --
   so öffnet der Warenkorb (Panel rutscht von rechts rein) direkt neben dem
   Button, der ihn auslöst, statt visuell getrennt auf der anderen Seite. */
.cart-button {
  position: fixed;
  right: 32px;
  bottom: 106px;
  width: 48px;
  height: 48px;
  border: none;
  border-radius: 50%;
  background: var(--black);
  color: var(--white);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 210;
  transition: transform 0.2s ease;
}
.cart-button:hover { transform: scale(1.06); }
.cart-button svg { width: 20px; height: 20px; }
.cart-badge {
  position: absolute;
  top: -4px;
  right: -4px;
  min-width: 18px;
  height: 18px;
  padding: 0 4px;
  border-radius: 999px;
  background: var(--white);
  color: var(--black);
  font-size: 0.68rem;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
}
/* Kurzer Puls, wenn ein Produkt ankommt (siehe flyToCart in script.js). */
.cart-badge.is-pulsing { transform: scale(1.5); }
.cart-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.45);
  backdrop-filter: blur(2px);
  z-index: 300;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.25s ease, visibility 0.25s;
}
.cart-overlay.is-open { opacity: 1; visibility: visible; }
.cart-panel {
  position: fixed;
  top: 0;
  right: 0;
  height: 100%;
  width: 400px;
  max-width: 90vw;
  background: var(--bg);
  z-index: 301;
  display: flex;
  flex-direction: column;
  padding: 28px 28px 24px;
  transform: translateX(100%);
  transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1);
  box-shadow: -8px 0 32px rgba(0, 0, 0, 0.12);
}
.cart-panel.is-open { transform: translateX(0); }
.cart-panel-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 28px; padding-bottom: 18px; border-bottom: 1px solid var(--line); }
.cart-panel-head h2 { font-family: var(--font-display); font-weight: 800; font-size: 1.3rem; }
.cart-close {
  width: 32px; height: 32px;
  border: none; border-radius: 50%;
  background: #f3f3f3;
  font-size: 1.3rem; line-height: 1; color: var(--black); padding: 0;
  display: flex; align-items: center; justify-content: center;
  transition: background 0.2s ease;
}
.cart-close:hover { background: #e8e8e8; }
.cart-items { flex: 1; overflow-y: auto; display: flex; flex-direction: column; gap: 22px; margin: 0 -4px; padding: 0 4px; }
.cart-item {
  display: grid;
  grid-template-columns: 64px 1fr auto;
  grid-template-rows: auto auto;
  column-gap: 14px;
  row-gap: 8px;
  align-items: center;
}
.cart-item-img { grid-row: 1 / 3; grid-column: 1; width: 64px; height: 64px; border-radius: 8px; object-fit: cover; background: var(--grey); display: block; }
.cart-item-img-empty { background: var(--grey); }
.cart-item-info { grid-row: 1; grid-column: 2; }
.cart-item-name { font-weight: 600; font-size: 0.9rem; margin-bottom: 2px; }
.cart-item-price { color: var(--grey); font-size: 0.8rem; }
.cart-item-qty { grid-row: 1; grid-column: 3; display: flex; align-items: center; gap: 10px; font-size: 0.85rem; }
.cart-qty-btn {
  width: 24px;
  height: 24px;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: none;
  font-size: 0.85rem;
  line-height: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}
.cart-qty-btn:hover { background: var(--black); color: var(--white); border-color: var(--black); }
.cart-item-remove {
  grid-row: 2;
  grid-column: 2 / 4;
  justify-self: start;
  border: none;
  background: none;
  color: var(--grey);
  font-size: 0.76rem;
  padding: 0;
  transition: color 0.2s ease;
}
.cart-item-remove:hover { color: var(--black); }
.cart-empty { color: var(--grey); font-size: 0.9rem; margin-top: 40px; text-align: center; }

/* Rabattcode: Eingabe + Live-Vorschau (siehe applyDiscountCode in script.js).
   Serverseitig bei /shop/validate-discount nochmal geprüft, beim echten
   Checkout erneut durchgesetzt -- hier nur die Anzeige. */
.cart-discount { margin-top: 4px; }
.cart-discount-row { display: flex; gap: 8px; }
.cart-discount-input {
  flex: 1;
  border: 1px solid var(--line);
  border-radius: 24px;
  padding: 9px 16px;
  font-size: 0.82rem;
  font-family: var(--font-body);
  text-transform: uppercase;
  letter-spacing: 0.03em;
}
.cart-discount-input:focus { outline: none; border-color: var(--black); }
.cart-discount-apply {
  border: 1px solid var(--black);
  background: var(--white);
  color: var(--black);
  border-radius: 24px;
  padding: 9px 18px;
  font-size: 0.8rem;
  font-weight: 600;
  transition: background 0.2s ease, color 0.2s ease;
}
.cart-discount-apply:hover { background: var(--black); color: var(--white); }
.cart-discount-msg { font-size: 0.76rem; margin-top: 8px; min-height: 1.2em; }
.cart-discount-msg.is-error { color: #c0392b; }
.cart-discount-msg.is-success { color: #16794a; }
.cart-discount-applied {
  display: none;
  align-items: center;
  justify-content: space-between;
  background: #f3f3f3;
  border-radius: 24px;
  padding: 8px 8px 8px 16px;
  font-size: 0.8rem;
  font-weight: 600;
}
.cart-discount-applied.is-visible { display: flex; }
.cart-discount-remove { border: none; background: none; color: var(--grey); font-size: 1.1rem; line-height: 1; padding: 4px 8px; }
.cart-discount-remove:hover { color: var(--black); }

.cart-footer { border-top: 1px solid var(--line); padding-top: 20px; margin-top: 18px; }
.cart-subtotal-row, .cart-discount-total-row { display: flex; justify-content: space-between; font-size: 0.85rem; color: var(--grey); margin-bottom: 8px; }
.cart-discount-total-row { color: #16794a; }
.cart-total-row { display: flex; justify-content: space-between; font-weight: 700; font-size: 1.05rem; margin: 14px 0 16px; }
.cart-checkout-btn { width: 100%; }
.cart-checkout-status { font-size: 0.8rem; color: var(--grey); margin-top: 10px; text-align: center; min-height: 1.2em; }
@media (max-width: 640px) {
  .cart-button { right: 20px; bottom: 90px; }
}

/* "In den Warenkorb" fliegt zum Warenkorb-Icon statt einfach zu verschwinden
   -- eigenes, kurzlebiges <img>-Element (siehe flyToCart in script.js), das
   per transform von der Klickposition zum Warenkorb-Button animiert und sich
   dabei verkleinert/dreht, dann selbst wieder entfernt wird. */
.cart-fly-item {
  position: fixed;
  z-index: 500;
  border-radius: 8px;
  object-fit: cover;
  pointer-events: none;
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.25);
  transition: transform 0.65s cubic-bezier(0.47, 0, 0.75, 0.72), opacity 0.65s ease;
}

/* ==========================================================================
   ABOUT — Konzept "Fotostapel" (aus about-stapel-vorschau.html übernommen).
   Alles auf body.page-about begrenzt, damit projekt.html (teilt einzelne
   about-/creative-network-Klassen) unverändert bleibt.
   ========================================================================== */
.page-about { --ab-paper: var(--bg); --ab-muted: #55555e; --ab-faint: #c9c9c4; --ab-line: rgba(13,13,16,.16); --ab-ease: cubic-bezier(.2,.7,.2,1); background: var(--ab-paper); }
.page-about .site-header { background: var(--ab-paper); }
/* Feines Filmkorn über der Papierfläche */
.page-about::before {
  content: ''; position: fixed; inset: 0; z-index: 90; pointer-events: none; opacity: .07; mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
.page-about .site-footer { background: var(--ab-paper); }

.ab-btn {
  display: inline-flex; align-items: center; padding: 12px 22px; border: 1px solid var(--black); border-radius: 999px;
  font-family: var(--font-body); font-weight: 500; font-size: .9rem; background: transparent; color: var(--black); cursor: pointer;
  transition: background .2s ease, color .2s ease;
}
.ab-btn:hover { background: var(--black); color: var(--ab-paper); }
.ab-btn-solid { background: var(--black); color: var(--ab-paper); }
.ab-btn-solid:hover { background: transparent; color: var(--black); }
.ab-text-link { font-weight: 500; font-size: .9rem; color: var(--black); border-bottom: 1px solid var(--black); padding-bottom: 3px; }

/* ---------- Erster Bildschirm ---------- */
.ab-stage { position: relative; height: 100vh; min-height: 640px; overflow: hidden; }
.ab-giant { position: absolute; left: -1.5vw; bottom: -5vw; width: 103vw; z-index: 1; pointer-events: none; user-select: none; }
.ab-giant img { width: 100%; height: auto; display: block; }
.ab-copy { position: absolute; left: 48px; top: 24vh; width: min(38vw, 520px); z-index: 3; }
.ab-hd { font-family: var(--font-display); font-weight: 600; font-size: clamp(2rem, 3.2vw, 3.2rem); line-height: 1.02; letter-spacing: -.025em; color: var(--black); }
.ab-intro { margin-top: 22px; font-size: 1.1rem; line-height: 1.55; color: var(--ab-muted); max-width: 32ch; }
.ab-actions { margin-top: 30px; display: flex; gap: 22px; align-items: center; flex-wrap: wrap; }

.ab-deck { position: absolute; right: 13vw; bottom: calc(18vw - 120px); width: min(25vw, 360px); aspect-ratio: 2 / 3; z-index: 2; cursor: pointer; }
.ab-card {
  position: absolute; inset: 0; overflow: hidden; background: #cfcfcc;
  box-shadow: 0 1px 2px rgba(13,13,16,.12), 0 14px 28px -10px rgba(13,13,16,.28), 0 50px 90px -30px rgba(13,13,16,.4);
  transition: transform .5s var(--ab-ease), opacity .35s ease, filter .4s ease;
  transform-origin: 50% 100%;
}
.ab-card img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ab-counter {
  position: absolute; right: calc(13vw - 90px); bottom: calc(18vw - 120px + min(25vw, 360px) * 1.5 - 90px); z-index: 3;
  writing-mode: vertical-rl; font-family: var(--font-display); font-weight: 600; font-size: .8rem; letter-spacing: .04em; font-variant-numeric: tabular-nums;
}

/* Einstieg: ein einziger ruhiger Auftritt beim Laden -- Text, dann Stapel,
   Logo gleitet leicht hoch. */
.ab-in { opacity: 0; transform: translateY(18px); animation: ab-in .9s var(--ab-ease) forwards; }
.ab-hd.ab-in { animation-delay: .1s; }
.ab-intro.ab-in { animation-delay: .2s; }
.ab-actions.ab-in { animation-delay: .3s; }
.ab-deck.ab-in { animation-delay: .35s; }
.ab-counter.ab-in { animation-delay: .6s; }
.ab-giant { animation: ab-giant 1.2s var(--ab-ease) both; }
@keyframes ab-in { to { opacity: 1; transform: none; } }
@keyframes ab-giant { from { opacity: 0; transform: translateY(6vw); } to { opacity: 1; transform: none; } }

/* ---------- Abschnitte darunter: eine ruhige, zentrierte Spalte ---------- */
.ab-section { padding: 120px 48px; }
.ab-section + .ab-section { padding-top: 40px; }
.ab-col { max-width: 920px; margin: 0 auto; }
.ab-head { text-align: center; margin-bottom: 56px; }
.ab-eyebrow { font-family: var(--font-display); font-weight: 600; font-size: .72rem; letter-spacing: .2em; text-transform: uppercase; color: var(--ab-muted); }
.page-about .ab-title {
  margin: 16px 0 0; font-family: var(--font-display); font-weight: 800; font-size: clamp(1.8rem, 3.2vw, 2.8rem);
  line-height: 1.05; letter-spacing: -.025em; text-wrap: balance; color: var(--black);
}
/* Die Reveal-Animation läuft weiterhin über #aboutText (script.js), hier
   nur ein dezenteres Hochgleiten statt Blur. */
.page-about .reveal { filter: none; transform: translateY(20px); transition: opacity .8s ease, transform .9s var(--ab-ease); }
.page-about .reveal.is-visible { transform: none; }

.ab-bio { border-top: 1px solid var(--ab-line); padding-top: 40px; }
.ab-bio p { max-width: 62ch; margin: 0 auto; font-size: 1.08rem; line-height: 1.75; color: var(--black); }
.page-about .ab-bio p + p { margin-top: 1.3em; }

/* Werte: gleicher Stil wie bisher, nur kompakter */
.page-about .about-values-list { border-top: 1px solid var(--ab-line); }
.page-about .about-values-row { grid-template-columns: 96px minmax(0,1fr); gap: 24px; padding: 28px 0; border-top: 0; border-bottom: 1px solid var(--ab-line); }
.page-about .about-values-num { font-size: 2.2rem; color: var(--ab-faint); letter-spacing: -.02em; }
.page-about .about-values-title { font-size: 1.15rem; text-transform: uppercase; letter-spacing: -.005em; margin-bottom: 0; }
.page-about .about-values-desc { margin-top: 10px; font-size: .98rem; line-height: 1.65; max-width: 56ch; }

/* Creative Network: ruhiges Hochgleiten statt Stapel-Shuffle */
.page-about .creative-network-grid { grid-template-columns: repeat(4, minmax(0,1fr)); gap: 32px 20px; border-top: 1px solid var(--ab-line); padding-top: 40px; }
.page-about .creative-network-item { opacity: 0; transform: translateY(20px); transition: opacity .7s ease, transform .8s var(--ab-ease); transition-delay: var(--cn-delay, 0s); }
.page-about .creative-network-item.is-in { opacity: 1; transform: none; }
.page-about .creative-network-item:nth-child(4n+2) { --cn-delay: .08s; }
.page-about .creative-network-item:nth-child(4n+3) { --cn-delay: .16s; }
.page-about .creative-network-item:nth-child(4n+4) { --cn-delay: .24s; }
.page-about .creative-network-photo { border-radius: 0; margin-bottom: 10px; box-shadow: none; }
.page-about .creative-network-name { font-family: var(--font-display); font-weight: 600; font-size: .88rem; }
.page-about .creative-network-role { font-size: .82rem; color: var(--ab-muted); margin-top: 3px; }

/* Kontakt */
.ab-contact { border-top: 1px solid var(--ab-line); padding-top: 40px; display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1.2fr); gap: 48px; }
.ab-contact-links { margin-top: 28px; display: flex; gap: 20px; font-size: .92rem; }
.ab-contact-links a { color: var(--black); border-bottom: 1px solid var(--ab-line); padding-bottom: 2px; }
.ab-contact-links a:hover { border-color: var(--black); }
.ab-form { display: flex; flex-direction: column; gap: 6px; }
.ab-form-intro { font-size: 1rem; color: var(--ab-muted); margin-bottom: 18px; }
.ab-form label { font-size: .82rem; color: var(--ab-muted); margin-top: 14px; }
.ab-form-intro + label { margin-top: 0; }
.ab-form input, .ab-form textarea {
  width: 100%; font: inherit; font-size: 1rem; padding: 10px 0; border: 0; border-bottom: 1px solid var(--ab-line);
  background: transparent; color: var(--black); outline: none; transition: border-color .2s ease;
}
.ab-form input:focus, .ab-form textarea:focus { border-color: var(--black); }
.ab-form textarea { min-height: 110px; resize: vertical; }
.ab-form .ab-btn { align-self: flex-start; margin-top: 24px; }

@media (max-width: 860px) {
  .ab-stage { height: auto; min-height: 100svh; padding: 96px 20px calc(24vw + 40px); display: flex; flex-direction: column; gap: 36px; }
  .ab-deck { position: relative; right: auto; bottom: auto; width: 52vw; margin: 0 auto; }
  .ab-counter { display: none; }
  .ab-copy { position: static; width: auto; }
  .ab-hd { font-size: 1.7rem; }
  .ab-giant { width: 110vw; left: -5vw; bottom: -6vw; }
  .ab-section { padding: 72px 20px; }
  .ab-contact { grid-template-columns: 1fr; }
  .page-about .about-values-row { grid-template-columns: 56px minmax(0,1fr); gap: 14px; }
  .page-about .about-values-num { font-size: 1.6rem; }
  .page-about .creative-network-grid { grid-template-columns: repeat(2, minmax(0,1fr)); }
}
@media (prefers-reduced-motion: reduce) {
  .ab-in, .ab-giant { animation: none; opacity: 1; transform: none; }
  .ab-card, .page-about .creative-network-item, .page-about .reveal { transition: none; }
}

/* ===================================================================
   VIDEO- + FOTO-SEITE: Bühne (Konzept "Bühne", siehe initStage() in script.js)
   Aktiver Film gross in der Mitte, Nachbarn klein und blass daneben,
   Projektwort riesig dahinter, weiches Licht vom aktiven Poster.
   Aufbau/Steuerung: renderVideoStage() in script.js.
   =================================================================== */
:is(.page-video, .page-foto) .vs-stage { --vs-ink: #0d0d10; --vs-muted: #5c5c66; --vs-ease: cubic-bezier(.2,.7,.2,1); position: relative; height: 100vh; min-height: 640px; overflow: hidden; background: var(--bg); }
:is(.page-video, .page-foto) .vs-stage.no-anim * { transition: none !important; }
:is(.page-video, .page-foto) .vs-ghost {
  position: absolute; left: 0; right: 0; top: calc(46% - var(--h-large, 300px) * .3); transform: translateY(-50%);
  text-align: center; white-space: nowrap; pointer-events: none; margin: 0;
  font-family: var(--font-display); font-weight: 800; text-transform: uppercase;
  font-size: var(--ghost-size, 15vw); line-height: .86; letter-spacing: -.035em;
  color: rgba(13,13,16,.06); transition: opacity .45s ease;
}
:is(.page-video, .page-foto) .vs-ghost.is-out { opacity: 0; }
:is(.page-video, .page-foto) .vs-ambient {
  position: absolute; left: 50%; top: 46%; width: 62vw; aspect-ratio: 16/9;
  transform: translate(-50%,-50%) scale(1.15);
  filter: blur(100px) saturate(1.3) brightness(1.4); opacity: .24; pointer-events: none;
}
:is(.page-video, .page-foto) .vs-ambient img { width: 100%; height: 100%; object-fit: cover; }
:is(.page-video, .page-foto) .vs-strip {
  position: absolute; left: 0; top: 46%; display: flex; align-items: center; gap: 20px;
  transform: translate(var(--x, 0px), -50%); transition: transform .9s var(--vs-ease); will-change: transform;
}
:is(.page-video, .page-foto) .vs-card {
  position: relative; flex: 0 0 auto; height: var(--h-small, 160px); aspect-ratio: 16/9;
  border-radius: 3px; overflow: hidden; background: #e4e4e1; cursor: pointer;
  box-shadow: 0 1px 2px rgba(13,13,16,.08), 0 10px 22px -8px rgba(13,13,16,.18), 0 36px 72px -24px rgba(13,13,16,.3);
  transition: height .9s var(--vs-ease), filter .6s ease, opacity .6s ease;
  filter: saturate(.6); opacity: .55;
}
:is(.page-video, .page-foto) .vs-card.is-active { height: var(--h-large, 300px); filter: none; opacity: 1; cursor: default; box-shadow: 0 1px 2px rgba(13,13,16,.1), 0 14px 28px -10px rgba(13,13,16,.22), 0 56px 110px -30px rgba(13,13,16,.4); }
:is(.page-video, .page-foto) .vs-card:not(.is-active):hover { opacity: .85; }
:is(.page-video, .page-foto) .vs-card img, :is(.page-video, .page-foto) .vs-card video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; max-width: none; }
:is(.page-video, .page-foto) .vs-card video { opacity: 0; transition: opacity .6s ease; }
:is(.page-video, .page-foto) .vs-card.is-playing video { opacity: 1; }
:is(.page-video, .page-foto) .vs-info {
  position: absolute; left: 50%; top: calc(46% + var(--h-large, 300px) / 2 + 28px);
  width: calc(var(--h-large, 300px) * var(--vs-ratio, 1.7778)); transform: translateX(-50%);
  display: grid; grid-template-columns: 1fr auto; column-gap: 40px; align-items: start;
}
:is(.page-video, .page-foto) .vs-title { font-family: var(--font-display); font-weight: 700; font-size: 1.5rem; line-height: 1.1; letter-spacing: -.01em; color: var(--vs-ink); }
:is(.page-video, .page-foto) .vs-hook { grid-column: 1; margin-top: 10px; font-size: .95rem; line-height: 1.55; color: var(--vs-muted); max-width: 46ch; }
:is(.page-video, .page-foto) .vs-hook:empty { display: none; }
:is(.page-video, .page-foto) .vs-link { grid-column: 2; grid-row: 1 / span 2; align-self: start; font-weight: 500; font-size: .9rem; white-space: nowrap; color: var(--vs-ink); text-decoration: none; border-bottom: 1px solid rgba(13,13,16,.4); padding-bottom: 3px; transition: border-color .2s ease; }
:is(.page-video, .page-foto) .vs-link:hover { border-color: var(--vs-ink); }
:is(.page-video, .page-foto) .vs-info > * { transition: opacity .4s ease; }
:is(.page-video, .page-foto) .vs-info.is-out > * { opacity: 0; }
:is(.page-video, .page-foto) .vs-bar { position: absolute; left: 48px; right: 48px; bottom: 36px; display: flex; justify-content: space-between; align-items: center; font-size: .85rem; color: var(--vs-muted); }
:is(.page-video, .page-foto) .vs-pager { display: flex; align-items: center; gap: 18px; font-variant-numeric: tabular-nums; }
:is(.page-video, .page-foto) .vs-pager button { width: 40px; height: 40px; border-radius: 50%; border: 1px solid rgba(13,13,16,.2); background: none; color: inherit; cursor: pointer; display: grid; place-items: center; transition: border-color .2s ease; }
:is(.page-video, .page-foto) .vs-pager button:hover { border-color: var(--vs-ink); }
:is(.page-video, .page-foto) .vs-pager svg { width: 16px; height: 16px; }
@media (max-width: 760px) {
  :is(.page-video, .page-foto) .vs-ghost { top: calc(40% - var(--h-large, 200px) * .3); }
  :is(.page-video, .page-foto) .vs-strip, :is(.page-video, .page-foto) .vs-ambient { top: 40%; }
  :is(.page-video, .page-foto) .vs-info { top: calc(40% + var(--h-large, 200px) / 2 + 20px); grid-template-columns: 1fr; }
  :is(.page-video, .page-foto) .vs-link { grid-column: 1; grid-row: auto; margin-top: 16px; justify-self: start; }
  :is(.page-video, .page-foto) .vs-bar { left: 20px; right: 20px; bottom: 24px; }
}
@media (prefers-reduced-motion: reduce) {
  :is(.page-video, .page-foto) .vs-strip, :is(.page-video, .page-foto) .vs-card, :is(.page-video, .page-foto) .vs-ghost, :is(.page-video, .page-foto) .vs-info > * { transition: none; }
}

:is(.page-video, .page-foto) .vs-card img.vs-slide { transition: opacity .7s ease; }
:is(.page-video, .page-foto) .vs-card img.vs-slide.is-back { opacity: 0; }

/* ===================================================================
   NAVBAR: Rauchglas (gewählt aus navbar-blur-vorschau.html)
   Keine Farbfläche: die Seite läuft unter dem Header durch und wird dort
   weichgezeichnet + leicht dunkel getönt, Schrift/Logo weiss. Der Blur
   sitzt bewusst auf ::before statt auf .site-header selbst --
   backdrop-filter am Header würde sonst zum Containing Block für das
   position:fixed-Mobilmenü (.nav) werden und es auf Header-Höhe einsperren.
   =================================================================== */
.site-header,
.page-about .site-header,
.site-header-transparent.is-scrolled { background: transparent; }
.site-header::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background: rgba(13, 13, 16, 0.5);
  -webkit-backdrop-filter: blur(24px) saturate(1.2);
  backdrop-filter: blur(24px) saturate(1.2);
  transition: opacity 0.3s ease;
}
/* Oben auf jeder Seite noch kein Rauchglas -- erst beim Scrollen. */
.site-header:not(.is-scrolled)::before { opacity: 0; }

.site-header .nav a,
.site-header-transparent.is-scrolled .nav a { color: var(--white); }
.site-header .nav a::after,
.site-header-transparent.is-scrolled .nav a::after { background: var(--white); }
.site-header .nav-toggle span,
.site-header-transparent.is-scrolled .nav-toggle span { background: var(--white); }
.site-header .header-logo-dark,
.site-header-transparent.is-scrolled .header-logo-dark { display: none; }
.site-header .header-logo-light,
.site-header-transparent.is-scrolled .header-logo-light { display: block; }

/* Oben auf hellen Seiten (ohne Vollbild-Hero): durchsichtig mit schwarzer
   Schrift + schwarzem Logo, damit sie auf #F2F2F0 lesbar bleibt. */
.site-header:not(.site-header-transparent):not(.is-scrolled) .nav a { color: var(--black); }
.site-header:not(.site-header-transparent):not(.is-scrolled) .nav a::after { background: var(--black); }
.site-header:not(.site-header-transparent):not(.is-scrolled) .nav-toggle span { background: var(--black); }
.site-header:not(.site-header-transparent):not(.is-scrolled) .header-logo-dark { display: block; }
.site-header:not(.site-header-transparent):not(.is-scrolled) .header-logo-light { display: none; }

/* Aufgeklapptes Mobilmenü bleibt hell -> dort weiterhin schwarze Schrift. */
@media (max-width: 640px) {
  .site-header .nav.open a { color: var(--black); }
  .site-header .nav.open a::after { background: var(--black); }
  .site-header .nav-toggle.open span { background: var(--black); }
}

/* ===================================================================
   HOME-HERO: zentriert, ruhig (Variante aus home-hero-v3-vorschau.html)
   Titel + Satz + zwei Buttons mittig über dem Video, leichte radiale
   Abdunkelung statt des alten Scrims unten links.
   =================================================================== */
.hero-video .hero-video-overlay { background: radial-gradient(ellipse at center, rgba(0,0,0,.5) 0%, rgba(0,0,0,.2) 70%); }
.hero-center { position: relative; z-index: 2; display: flex; flex-direction: column; align-items: center; text-align: center; padding: 0 24px; color: var(--white); }
.hero-center-title { font-family: var(--font-display); font-weight: 800; font-size: clamp(2.2rem, 4.6vw, 4.6rem); line-height: .98; letter-spacing: -.03em; max-width: 16ch; text-wrap: balance; }
.hero-center-text { margin-top: 20px; font-size: 1.05rem; line-height: 1.55; opacity: .85; max-width: 50ch; text-wrap: pretty; }
.hero-center-btns { margin-top: 22px; display: flex; gap: 12px; flex-wrap: wrap; justify-content: center; }
.hero-btn { font-size: .92rem; font-weight: 500; padding: 13px 22px; border-radius: 999px; border: 1px solid rgba(255,255,255,.6); color: var(--white); text-decoration: none; transition: background .2s ease, color .2s ease; }
.hero-btn:hover { background: rgba(255,255,255,.12); }
.hero-btn-solid { background: var(--white); color: #0d0d10; border-color: var(--white); }
.hero-btn-solid:hover { background: rgba(255,255,255,.88); }
.hero-in { opacity: 0; transform: translateY(16px); animation: hero-in 1s cubic-bezier(.2,.7,.2,1) forwards; }
.hero-center-title.hero-in { animation-delay: .15s; }
.hero-center-text.hero-in { animation-delay: .3s; }
.hero-center-btns.hero-in { animation-delay: .45s; }
@keyframes hero-in { to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .hero-in { animation: none; opacity: 1; transform: none; } }

/* Startseite ohne Dienstleistungen-Sticky-Stack (Sektion entfernt): Showreel
   folgt normal statt sich -100vh über die Sektion zu schieben. */
.showreel-section { margin-top: 0; }

/* Startseite: Kundenlogos + BTS-Laufband kleiner und enger zusammen
   (Okt. 2026, Timo: "etwas kleiner und mehr zusammenschieben"). */
.marquee-section { padding: 14px 0; }
.marquee-section.section-alt { padding-top: 28px; padding-bottom: 0; }
.brand-item { width: 180px; }
.brand-item-caption { bottom: 20px; font-size: 0.54rem; }
.marquee-item { width: 250px; }
.marquee-draggable { margin-top: 0; }
@media (max-width: 640px) {
  .marquee-section.section-alt { padding: 16px 0 0; }
  .brand-item { width: 150px; }
  .marquee-item { width: 190px; }
}

/* ===================================================================
   SHOP: Konzept "Regal" (aus shop-v2-regal-vorschau.html, Okt. 2026)
   Papierfläche mit Filmkorn wie About, Hero mit gerahmtem Video + grossem
   Wort, Produkte als hüpfende CSS-3D-Boxen. Logik: renderShopGrid/
   renderShopHero in script.js, Texte: Admin > Shop > Shop-Inhalt.
   =================================================================== */
.page-shop { --sr-ink: #0d0d10; --sr-muted: #55555e; --sr-ease: cubic-bezier(.2,.7,.2,1); background: var(--bg); }
.page-shop::before {
  content: ''; position: fixed; inset: 0; z-index: 90; pointer-events: none; opacity: .07; mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
.page-shop .site-footer { background: var(--bg); }

.sr-btn { display: inline-flex; align-items: center; padding: 12px 22px; border: 1px solid var(--sr-ink); border-radius: 999px; font-family: var(--font-body); font-weight: 500; font-size: .92rem; background: transparent; color: var(--sr-ink); cursor: pointer; text-decoration: none; transition: background .2s ease, color .2s ease; }
.sr-btn:hover, .sr-btn-solid { background: var(--sr-ink); color: #fff; }
.sr-btn-solid:hover { background: #2a2a33; }
.sr-link { font-weight: 500; font-size: .92rem; color: var(--sr-ink); text-decoration: none; border-bottom: 1px solid rgba(13,13,16,.4); padding-bottom: 3px; transition: border-color .2s ease; }
.sr-link:hover { border-color: var(--sr-ink); }

/* Hero */
.sr-hero { position: relative; height: 100vh; min-height: 680px; overflow: hidden; padding: 0; }
.sr-copy { position: absolute; left: 7.5vw; top: 22vh; width: min(36vw, 500px); z-index: 3; }
.sr-title { font-family: var(--font-display); font-weight: 600; font-size: clamp(2rem, 3.2vw, 3.2rem); line-height: 1.02; letter-spacing: -.025em; color: var(--sr-ink); }
.sr-text { margin-top: 20px; font-size: 1.08rem; line-height: 1.55; color: var(--sr-muted); max-width: 34ch; }
.sr-actions { display: flex; gap: 20px; align-items: center; margin-top: 28px; flex-wrap: wrap; }
.sr-trust { display: flex; gap: 6px 18px; flex-wrap: wrap; font-size: .8rem; line-height: 1.4; color: var(--sr-muted); margin-top: 24px; }
.sr-trust { align-items: center; gap: 6px 12px; }
.sr-trust-item { display: inline-flex; align-items: center; gap: 7px; }
.sr-trust-item svg { width: 15px; height: 15px; flex: 0 0 auto; }
.sr-trust-sep { opacity: .6; }
.sr-legal { margin-top: 8px; font-size: .74rem; color: var(--sr-muted); }
.sr-legal a { color: inherit; text-decoration: underline; }
.sr-legal.sr-in { animation-delay: .5s; }
.sr-film { position: absolute; right: 7.5vw; top: 18vh; width: min(46vw, 680px); aspect-ratio: 16 / 10; z-index: 2; margin: 0; transform: rotate(1.2deg);
  box-shadow: 0 1px 2px rgba(13,13,16,.14), 0 18px 34px -12px rgba(13,13,16,.32), 0 70px 120px -40px rgba(13,13,16,.45); }
.sr-film video { width: 100%; height: 100%; object-fit: cover; }
.sr-film figcaption { position: absolute; right: 0; top: calc(100% + 14px); font-size: .8rem; color: var(--sr-muted); transform: rotate(-1.2deg); }
.sr-giant { position: absolute; left: 0; right: 0; bottom: -0.2em; display: block; width: max-content; margin: 0 auto; z-index: 1; font-family: var(--font-display); font-weight: 800; font-size: 23vw; line-height: .8; letter-spacing: -.06em; color: var(--sr-ink); text-align: center; white-space: nowrap; user-select: none; pointer-events: none; animation: sr-giant 1.2s var(--sr-ease) both; }
.sr-in { opacity: 0; transform: translateY(16px); animation: sr-in .9s var(--sr-ease) forwards; }
.sr-title.sr-in { animation-delay: .1s; } .sr-text.sr-in { animation-delay: .2s; } .sr-actions.sr-in { animation-delay: .3s; } .sr-trust.sr-in { animation-delay: .45s; }
.sr-film.sr-in { animation-name: sr-in-film; animation-delay: .2s; }
@keyframes sr-in { to { opacity: 1; transform: none; } }
@keyframes sr-in-film { from { opacity: 0; transform: translateY(16px) rotate(1.2deg); } to { opacity: 1; transform: rotate(1.2deg); } }
@keyframes sr-giant { from { opacity: 0; transform: translateY(5vw); } to { opacity: 1; transform: none; } }

/* Regal */
.sr-shelf { padding: 120px 7.5vw 140px; }
.sr-shelf-head { display: flex; justify-content: space-between; align-items: baseline; gap: 24px; margin-bottom: 70px; }
.sr-shelf-head h2 { font-family: var(--font-display); font-weight: 600; font-size: clamp(1.5rem, 2.2vw, 2.2rem); letter-spacing: -.02em; color: var(--sr-ink); }
.sr-shelf-head p { color: var(--sr-muted); font-size: .95rem; }
.sr-boxes { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 70px 3vw; align-items: start; }
.sr-item { display: flex; flex-direction: column; align-items: center; text-align: center; }
.sr-item h3 { margin-top: 34px; font-family: var(--font-display); font-weight: 600; font-size: 1.05rem; letter-spacing: -.01em; color: var(--sr-ink); }
.sr-desc { margin-top: 6px; color: var(--sr-muted); font-size: .88rem; line-height: 1.5; max-width: 28ch; }
.sr-compat { margin-top: 6px; color: var(--sr-muted); font-size: .76rem; }
.sr-buy { display: flex; gap: 16px; align-items: center; margin-top: 16px; }
.sr-price { font-family: var(--font-display); font-weight: 600; font-size: 1rem; color: var(--sr-ink); }
.sr-buy .sr-btn { padding: 9px 16px; font-size: .85rem; }
.sr-learn { margin-top: 14px; font-size: .82rem; }

/* 3D-Box: echte Quader-Flächen in CSS-3D */
.sr-stage { position: relative; width: 100%; height: 260px; perspective: 1100px; display: flex; align-items: flex-end; justify-content: center; text-decoration: none; }
.sr-floater { animation: sr-hop 2.8s cubic-bezier(.45,0,.55,1) infinite; animation-delay: var(--dl, 0s); }
.sr-box { --w: 270px; --h: 135px; --d: 56px; position: relative; width: var(--w); height: var(--h); transform-style: preserve-3d; transform: rotateX(-16deg) rotateY(var(--ry, -26deg)); transition: transform .8s var(--sr-ease); }

.sr-face { position: absolute; backface-visibility: hidden; }
/* Produktbilder (Okt. 2026): reines Motiv ohne Mockup, ca. 2:1 -> Front hat
   dasselbe Format, Bild füllt sie komplett (cover). */
.sr-front { width: var(--w); height: var(--h); transform: translateZ(calc(var(--d) / 2)); background-color: #141418; background-repeat: no-repeat;
  background-size: cover; background-position: center; }
.sr-front::after { content: ''; position: absolute; inset: 0; background: linear-gradient(115deg, rgba(255,255,255,.18) 0%, rgba(255,255,255,0) 38%, rgba(0,0,0,.18) 100%); }
.sr-back { width: var(--w); height: var(--h); background: #111; transform: rotateY(180deg) translateZ(calc(var(--d) / 2)); }
.sr-right { width: var(--d); height: var(--h); left: calc((var(--w) - var(--d)) / 2); background: linear-gradient(90deg, #26262e, #141418); transform: rotateY(90deg) translateZ(calc(var(--w) / 2)); display: flex; align-items: center; justify-content: center; overflow: hidden; }
/* Schmale Seite: weisses TIMO-Logo, längs wie auf einem Buchrücken */
.sr-right img { width: calc(var(--h) * .3); max-width: none; height: auto; transform: rotate(-90deg); opacity: .85; flex: 0 0 auto; }
.sr-left { width: var(--d); height: var(--h); left: calc((var(--w) - var(--d)) / 2); background: #0c0c10; transform: rotateY(-90deg) translateZ(calc(var(--w) / 2)); }
.sr-top { width: var(--w); height: var(--d); top: calc((var(--h) - var(--d)) / 2); background: linear-gradient(180deg, #3a3a44, #24242b); transform: rotateX(90deg) translateZ(calc(var(--h) / 2)); }
/* Lange Oberkante: Produktname */
.sr-top { display: flex; align-items: center; padding: 0 14px; }
.sr-top span { font-family: var(--font-display); font-weight: 700; font-size: .62rem; letter-spacing: .06em; text-transform: uppercase; color: rgba(255,255,255,.78); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sr-bottom { width: var(--w); height: var(--d); top: calc((var(--h) - var(--d)) / 2); background: #08080a; transform: rotateX(-90deg) translateZ(calc(var(--h) / 2)); }
.sr-ground { position: absolute; left: 50%; bottom: -6px; width: 300px; height: 34px; transform: translateX(-50%); border-radius: 50%;
  background: radial-gradient(ellipse at center, rgba(13,13,16,.42) 0%, rgba(13,13,16,.18) 45%, rgba(13,13,16,0) 72%); filter: blur(3px);
  animation: sr-shade 2.8s cubic-bezier(.45,0,.55,1) infinite; animation-delay: var(--dl, 0s); }
@keyframes sr-hop { 0%, 100% { transform: translateY(-14px); } 50% { transform: translateY(-40px); } }
@keyframes sr-shade { 0%, 100% { transform: translateX(-50%) scale(1); opacity: 1; } 50% { transform: translateX(-50%) scale(.72); opacity: .55; } }

@media (max-width: 860px) {
  .sr-hero { height: auto; min-height: 0; padding: 100px 20px 24vw; display: flex; flex-direction: column; gap: 34px; }
  .sr-copy, .sr-film { position: relative; left: auto; right: auto; top: auto; width: 100%; }
  .sr-film, .sr-film.sr-in { transform: none; animation-name: sr-in; }
  .sr-film figcaption { transform: none; }
  .sr-shelf { padding: 80px 20px 100px; }
  .sr-shelf-head { flex-direction: column; gap: 6px; margin-bottom: 30px; }
  .sr-box { --w: 240px; --h: 120px; --d: 50px; }
}
@media (prefers-reduced-motion: reduce) {
  .sr-floater, .sr-ground, .sr-giant { animation: none; }
  .sr-in { animation: none; opacity: 1; transform: none; }
  .sr-film.sr-in { transform: rotate(1.2deg); }
}

/* Shop: Sprungziel "Produkte ansehen" etwas über dem Regal, damit die
   fixe Navbar die Überschrift nicht verdeckt. */
.sr-shelf { scroll-margin-top: 40px; }
.sr-anchor { display: block; position: relative; top: -40px; }

/* Hover: Box dreht sich herum und zeigt die Rückseite mit Produktinfos
   (Konzept 2 aus shop-hover-vorschau.html). */
.sr-box { transition: transform 1.4s cubic-bezier(.45,.05,.3,1); }
.sr-item:hover .sr-box { transform: rotateX(-16deg) rotateY(154deg); }
.sr-back { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; padding: 10px 16px; background: #141418; text-align: center; }
.sr-back b { font-family: var(--font-display); font-weight: 700; font-size: .7rem; color: #fff; letter-spacing: .01em; }
.sr-back span { font-size: .6rem; line-height: 1.45; color: rgba(255,255,255,.72); max-width: 92%; }
@media (prefers-reduced-motion: reduce) { .sr-box { transition: none; } }

/* ===================================================================
   VIDEO + FOTO: Übersicht als Raster (Konzept "C", Okt. 2026)
   Ersetzt die Bühne. Logik: renderWorkGrid() in script.js.
   =================================================================== */
.wg { --wg-ink: #0d0d10; --wg-muted: #5c5c66; --wg-ease: cubic-bezier(.2,.7,.2,1); position: relative; isolation: isolate; overflow: hidden; padding: 150px 7.5vw 130px; background-color: var(--bg); transition: background-color .9s ease; }
.wg-ambient { position: absolute; z-index: -1; width: 60vw; aspect-ratio: 16 / 9; filter: blur(110px) saturate(1.3) brightness(1.3); opacity: 0; transition: opacity .8s ease, left .6s var(--wg-ease), top .6s var(--wg-ease); pointer-events: none; }
.wg-ambient.on { opacity: .12; }
.wg-ambient img { width: 100%; height: 100%; object-fit: cover; }
.wg-head { display: flex; justify-content: space-between; align-items: baseline; gap: 24px; margin-bottom: 46px; }
.wg-head h1 { font-family: var(--font-display); font-weight: 600; font-size: clamp(1.6rem, 2.4vw, 2.4rem); letter-spacing: -.02em; color: var(--wg-ink); }
.wg-head p { color: var(--wg-muted); font-size: .92rem; }
.wg-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px 2.4vw; }
.wg-card { display: block; color: var(--wg-ink); text-decoration: none; }
.wg-media { position: relative; aspect-ratio: 16 / 9; overflow: hidden; background: #ddd;
  box-shadow: 0 1px 2px rgba(13,13,16,.12), 0 14px 28px -10px rgba(13,13,16,.28), 0 50px 90px -30px rgba(13,13,16,.38);
  transition: transform .6s var(--wg-ease), opacity .5s ease; }
.wg-media img, .wg-media video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; max-width: none; }
.wg-media video { opacity: 0; transition: opacity .5s ease; }
.wg-card.is-playing .wg-media video { opacity: 1; }
.wg-prog { position: absolute; left: 0; bottom: 0; height: 2px; width: 0; background: #fff; z-index: 3; }
.wg-grid:hover .wg-card:not(:hover) .wg-media { opacity: .45; }
.wg-card:hover .wg-media { transform: translateY(-6px); }
.wg-info { display: grid; grid-template-columns: 1fr auto; gap: 6px 20px; margin-top: 16px; }
.wg-title { font-family: var(--font-display); font-weight: 700; font-size: 1rem; letter-spacing: -.015em; }
.wg-cta { grid-column: 2; grid-row: 1; font-weight: 500; font-size: .88rem; white-space: nowrap; border-bottom: 1px solid rgba(13,13,16,.4); padding-bottom: 3px; align-self: start; }
.wg-hook { grid-column: 1; font-size: .88rem; line-height: 1.55; color: var(--wg-muted); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.wg-pill { position: fixed; left: 0; top: 0; z-index: 120; pointer-events: none; padding: 10px 16px; border-radius: 999px; background: var(--wg-ink, #0d0d10); color: #fff; font-family: var(--font-body); font-size: .8rem; font-weight: 500; white-space: nowrap; transform: translate(-50%, -50%) scale(.6); opacity: 0; transition: opacity .25s ease, transform .3s cubic-bezier(.2,.7,.2,1); }
.wg-pill.on { opacity: 1; transform: translate(-50%, -50%) scale(1); }
.wg-pill { display: none; }
@media (max-width: 860px) {
  .wg { padding: 110px 20px 90px; }
  .wg-grid { grid-template-columns: 1fr; gap: 40px; }
  .wg-head { margin-bottom: 30px; }
}
@media (prefers-reduced-motion: reduce) { .wg, .wg-media, .wg-ambient, .wg-pill { transition: none; } }

/* ===================================================================
   ABOUT: Meine Werte (Okt. 2026) -- Werte untereinander gross, aktiver
   schwarz, Text + Foto darunter, Wort riesig im Hintergrund.
   =================================================================== */
.page-about .ab-values { position: relative; overflow: hidden; padding-bottom: 22vw; }
.ab-values-col { position: relative; z-index: 2; max-width: 1100px; }
.ab-values-words { margin-top: 32px; display: flex; flex-direction: column; align-items: flex-start; }
.ab-values-word { all: unset; cursor: pointer; text-transform: none; font-family: var(--font-display); font-weight: 800; font-size: clamp(2.2rem, 4.6vw, 4.8rem); line-height: 1.06; letter-spacing: -.035em; color: rgba(13,13,16,.2); transition: color .3s ease; }
.ab-values-word.is-on, .ab-values-word:hover { color: var(--black); }
.ab-values-word:focus-visible { outline: 2px solid var(--black); outline-offset: 4px; }
.ab-values-detail { margin-top: 44px; display: grid; grid-template-columns: auto 1fr; gap: 30px; align-items: start; max-width: 760px; }
.ab-values-photo { width: 160px; aspect-ratio: 4 / 5; object-fit: cover; transform: rotate(-2deg);
  box-shadow: 0 1px 2px rgba(13,13,16,.12), 0 14px 28px -10px rgba(13,13,16,.28), 0 50px 90px -30px rgba(13,13,16,.4); }
.ab-values-text { color: var(--ab-muted, #55555e); font-size: 1.1rem; line-height: 1.6; max-width: 42ch; transition: opacity .3s ease; }
.ab-values-giant { position: absolute; left: 0; right: 0; width: max-content; margin: 0 auto; bottom: -2.4vw; z-index: 1; font-family: var(--font-display); font-weight: 800; font-size: 22.7vw; line-height: .8; letter-spacing: -.06em; text-transform: uppercase; color: #000; pointer-events: none; white-space: nowrap; }
@media (max-width: 860px) {
  .page-about .ab-values { padding-bottom: 30vw; }
  .ab-values-detail { grid-template-columns: 1fr; gap: 20px; }
  .ab-values-photo { width: 140px; }
}
@media (prefers-reduced-motion: reduce) { .ab-values-word, .ab-values-text { transition: none; } }

/* Mehr Luft zwischen Werte-Bereich und Kontakt */
.page-about .ab-values { margin-bottom: 140px; }
@media (max-width: 860px) { .page-about .ab-values { margin-bottom: 80px; } }

/* Projektseite: WhatsApp-Button + kleiner Text-Link zum Kontaktformular */
.project-contact-actions { display: flex; align-items: center; justify-content: center; gap: 26px; flex-wrap: wrap; margin: 22px 0; }
.project-contact-actions .about-contact-whatsapp-btn { margin: 0; }
.project-contact-link { font-family: var(--font-body); font-weight: 500; font-size: .92rem; color: var(--black); border-bottom: 1px solid rgba(13,13,16,.4); padding-bottom: 2px; transition: border-color .2s ease; }
.project-contact-link:hover { border-color: var(--black); }

/* Impressum/AGB: Zurück-Link über dem Titel */
.legal-back { display: inline-flex; align-items: center; gap: 6px; margin-bottom: 28px; font-family: var(--font-body); font-weight: 500; font-size: .92rem; color: var(--black); opacity: .7; transition: opacity .2s ease, gap .2s ease; }
.legal-back:hover { opacity: 1; gap: 10px; }
.legal-back svg { width: 18px; height: 18px; }

/* ===================================================================
   FILM-OVERLAYS (Okt. 2026, Intensität wie haldelain.ch): feines Korn über
   der ganzen Seite + leichter Weichzeichner am unteren Bildschirmrand.
   Nur Portfolio-Seiten (body.film-fx), Shop-Seiten bewusst nicht.
   =================================================================== */
.film-fx::after {
  content: ''; position: fixed; inset: 0; z-index: 2147483647; pointer-events: none;
  background-image: url('/images/grain.png'); background-size: 200px 200px;
  opacity: .03; filter: contrast(200%);
}
.film-fx .film-blur, .film-fx-blur {
  position: fixed; left: 0; right: 0; bottom: 0; height: 25vh; z-index: 99; pointer-events: none;
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
  -webkit-mask-image: linear-gradient(to bottom, transparent 25%, #000 100%); mask-image: linear-gradient(to bottom, transparent 25%, #000 100%);
}
@media (max-width: 860px), (hover: none) { .film-fx-blur { display: none; } }
/* About hatte bisher ein eigenes, stärkeres Korn -> jetzt das globale */
.page-about.film-fx::before { display: none; }

/* Shop: eigenes Korn aus -> nur noch das globale Film-Overlay */
.page-shop.film-fx::before { display: none; }

/* Warenkorb: Zustimmung "kein Widerrufsrecht" vor dem Checkout */
.cart-waiver { margin: 14px 0 12px; font-size: .74rem; line-height: 1.45; color: #6b6b74; text-align: left; }
.cart-waiver input { flex: 0 0 auto; width: 16px; height: 16px; margin-top: 1px; accent-color: #0d0d10; cursor: pointer; }
.cart-waiver strong { color: #0d0d10; font-weight: 600; }
.cart-waiver a { color: inherit; text-decoration: underline; }
.cart-checkout-btn:disabled { opacity: .4; cursor: not-allowed; }

/* Korn bewegt sich leicht (wie das animierte Korn bei haldelain.ch):
   Muster springt in kleinen, zufälligen Schritten -> flimmert wie Film. */
.film-fx::after { animation: film-grain 1.2s steps(1) infinite; }
@keyframes film-grain {
  0%   { background-position: 0 0; }
  10%  { background-position: -9px 5px; }
  20%  { background-position: 14px -11px; }
  30%  { background-position: -18px -3px; }
  40%  { background-position: 4px 16px; }
  50%  { background-position: -12px 9px; }
  60%  { background-position: 19px 2px; }
  70%  { background-position: -3px -19px; }
  80%  { background-position: 10px 13px; }
  90%  { background-position: -15px -7px; }
  100% { background-position: 0 0; }
}
@media (prefers-reduced-motion: reduce) { .film-fx::after { animation: none; } }

/* Cursor über der Rauchglas-Navbar: weiss statt Farbumkehr (sonst grau auf grau) */
.custom-cursor.on-dark { mix-blend-mode: normal; border-color: #fff; }

/* ===================================================================
   HOME: Showreels nebeneinander (Vorschlag 2, Okt. 2026)
   =================================================================== */
.showreel-section.sr2 { margin-top: 0; padding: 120px 0 130px; }
.sr2-eyebrow { font-size: .92rem; color: #5c5c66; }
.sr2-title { margin-top: 8px; font-family: var(--font-display); font-weight: 600; font-size: clamp(1.5rem, 2.2vw, 2.2rem); letter-spacing: -.02em; color: var(--black); }
.sr2-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 3vw; margin-top: 40px; }
.sr2-frame { position: relative; aspect-ratio: 16 / 9; overflow: hidden; background: #111; border-radius: 0;
  box-shadow: 0 1px 2px rgba(13,13,16,.12), 0 14px 28px -10px rgba(13,13,16,.28), 0 50px 90px -30px rgba(13,13,16,.38); }
.sr2-frame video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.sr2-play { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 2; display: inline-flex; align-items: center; gap: 10px; padding: 11px 18px; border-radius: 999px; background: rgba(13,13,16,.45); -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); color: #fff; font-size: .88rem; font-weight: 500; pointer-events: none; transition: opacity .3s ease; }
.sr2-play svg { width: 13px; height: 13px; }
.sr2-frame:hover .sr2-play { opacity: 0; }
.sr2-name { margin-top: 18px; font-family: var(--font-display); font-weight: 700; font-size: 1.05rem; letter-spacing: -.01em; color: var(--black); }
.sr2-desc { margin-top: 6px; color: #5c5c66; font-size: .92rem; line-height: 1.55; }
@media (max-width: 860px) { .showreel-section.sr2 { padding: 80px 0 90px; } .sr2-grid { grid-template-columns: 1fr; gap: 48px; } }

/* Showreels von Anfang an farbig (statt schwarzweiss bis zum Hover) */
.sr2 .showreel-hover-video { filter: none; }

/* Impressum: Zeilenumbrüche aus dem Admin (Adresse) bleiben sichtbar */
.legal-content .legal-lines { white-space: pre-line; }

/* Projektseite: "Weitere Projekte" (2 Karten) + ruhigere Kontakt-CTA */
.wg.wg-next { padding: 110px max(32px, calc((100% - var(--max-width)) / 2 + 32px)) 40px; }
.wg-next .wg-head { margin-bottom: 30px; }
.wg-next .wg-head h2 { font-family: var(--font-display); font-weight: 600; font-size: clamp(1.2rem, 1.7vw, 1.6rem); letter-spacing: -.02em; color: var(--wg-ink); }
.wg-all { font-size: .88rem; font-weight: 500; color: var(--wg-ink); border-bottom: 1px solid rgba(13,13,16,.4); padding-bottom: 2px; transition: border-color .2s ease; }
.wg-all:hover { border-color: var(--wg-ink); }
.wg-next .wg-grid { grid-template-columns: repeat(2, 1fr); gap: 28px 2.4vw; }
.project-cta { padding: 90px 24px 110px; }
.project-cta .about-contact-cta { font-weight: 500; font-size: clamp(.98rem, 1.5vw, 1.15rem); letter-spacing: -.01em; max-width: 34ch; }
.project-cta .project-contact-actions { gap: 22px; margin: 20px 0 0; }
.project-cta .about-contact-whatsapp-btn { padding: 11px 24px; font-size: .82rem; }
.project-cta .project-contact-link { font-size: .84rem; }
@media (max-width: 760px) {
  .wg.wg-next { padding: 80px 20px 20px; }
  .wg-next .wg-grid { grid-template-columns: 1fr; }
  .project-cta { padding: 70px 20px 90px; }
  .project-cta .project-contact-actions { gap: 18px 22px; }
  .project-cta .project-contact-actions .about-contact-whatsapp-btn { flex-basis: 100%; max-width: 280px; margin: 0 calc(50% - 140px); }
}

/* Foto-Kategorie: Kontakt-CTA im gleichen Stil wie auf den Video-Projektseiten (.project-cta) */
.category-detail-cta.project-cta { padding: 80px 32px 110px; }
.category-detail-cta .category-detail-cta-text { margin: 0 auto 6px; }

/* ===== Responsive & Touch (Okt. 2026) ===== */
/* Shop-Regal: die alte .shop-grid-section-Regel (100vh + eigener Scrollbereich,
   vertikal zentriert) schnitt auf Handy/Tablet Überschrift und erstes Produkt
   ab. Dort normal mit der Seite scrollen lassen. */
@media (max-width: 1024px), (max-height: 760px) {
  .shop-grid-section.sr-shelf { height: auto; overflow: visible; display: block; margin-bottom: 0; }
}
/* Lange Wörter in Rechtsseiten-Titeln ("Geschäftsbedingungen") trennen statt
   die Seite seitlich zu verbreitern. */
.legal-content h1, .legal-content h2 { hyphens: auto; -webkit-hyphens: auto; overflow-wrap: break-word; }
@media (max-width: 640px) { .legal-content h1 { font-size: 1.7rem; } }
/* Look-Seite: zwei Herkunftsbilder nebeneinander statt 2x 100% Breite. */
@media (max-width: 760px) {
  .shop-look-origin-images .shop-look-origin-img { width: auto; flex: 1 1 0; min-width: 0; }
}
/* Touch: Box dreht sich automatisch (siehe renderShopGrid), gleiche Pose wie beim Hover. */
.sr-item.is-turned .sr-box { transform: rotateX(-16deg) rotateY(154deg); }
/* Hover-Effekte, die auf Touch nach einem Tipp "kleben" bleiben würden, nur mit Maus. */
@media (hover: none) {
  .wg-grid:hover .wg-card:not(:hover) .wg-media { opacity: 1; }
  .wg-card:hover .wg-media { transform: none; }
  .sr-item:hover:not(.is-turned) .sr-box { transform: rotateX(-16deg) rotateY(var(--ry, -26deg)); }
}
/* Tablet: Video-/Foto-Raster zweispaltig statt riesiger Einzelkarten bzw.
   gequetschter Dreierreihe. */
@media (min-width: 600px) and (max-width: 1180px) {
  .wg-grid { grid-template-columns: repeat(2, 1fr); gap: 44px 28px; }
}
/* Look-Seite: Inhaltsblöcke hatten seitlich 0 Abstand und klebten auf
   Tablet/Handy am Bildschirmrand. */
@media (max-width: 1304px) { .shop-look-panel-block { padding-left: 32px; padding-right: 32px; } }
@media (max-width: 640px) { .shop-look-panel-block { padding-left: 20px; padding-right: 20px; } }
[data-look-slider] { touch-action: pan-y; }
/* Touch: kleine Text-Links bekommen eine unsichtbar grössere Tippfläche
   (ca. 44px hoch), ohne dass sich Optik oder Abstände ändern. */
@media (pointer: coarse) {
  .project-contact-link, .wg-all, .wg-cta, .legal-back, .footer-legal-links a, .sr-link, .about-contact-links a, .footer-links a { position: relative; }
  .project-contact-link::before, .wg-all::before, .legal-back::before, .footer-legal-links a::before, .sr-link::before, .about-contact-links a::before, .footer-links a::before {
    content: ""; position: absolute; left: -6px; right: -6px; top: -12px; bottom: -12px;
  }
}

/* "Wie mein Look entstand" — persönliche Notiz (Entwurf A) */
.lo-grid { display: grid; grid-template-columns: 7fr 5fr; gap: 80px; align-items: center; }
.lo-grid.lo-no-photo { grid-template-columns: 1fr; }
.lo-a .section-eyebrow { margin-bottom: 22px; }
.lo-lead { font-family: var(--font-display); font-weight: 600; font-size: clamp(1.35rem, 2.3vw, 2rem); line-height: 1.25; letter-spacing: -.02em; color: var(--black); max-width: 24ch; }
.lo-body { margin-top: 22px; color: var(--grey); line-height: 1.75; font-size: 1rem; max-width: 52ch; }
.lo-body:empty { display: none; }
.lo-sign { margin-top: 30px; display: flex; align-items: center; gap: 14px; }
.lo-avatar { width: 44px; height: 44px; border-radius: 50%; object-fit: cover; flex: 0 0 auto; }
.lo-sign p { font-size: .88rem; line-height: 1.4; color: var(--black); }
.lo-sign p span { display: block; color: var(--grey); }
.lo-photo { width: 100%; max-width: 440px; justify-self: end; aspect-ratio: 4 / 5; object-fit: cover; border-radius: 4px;
  box-shadow: 0 1px 2px rgba(13,13,16,.12), 0 14px 28px -10px rgba(13,13,16,.28), 0 50px 90px -30px rgba(13,13,16,.38); }
@media (max-width: 860px) {
  .lo-grid { grid-template-columns: 1fr; gap: 36px; }
  .lo-photo { aspect-ratio: 4 / 3; max-width: none; }
}
.hero-center-text { max-width: 62ch; }
.hero-center-text .ht-s { display: inline-block; }

/* Startseiten-Hero: Highlight-Clips der Projekte (initHeroClips) */
.hero-clip-layer { opacity: 0; transition: opacity .9s ease; }
.hero-clip-layer.is-front { opacity: 1; }
.hero-clip-caption { position: absolute; left: max(32px, calc((100% - var(--max-width)) / 2 + 32px)); bottom: 28px; z-index: 100; font-size: .78rem; color: rgba(255,255,255,.78); text-decoration: none; opacity: 0; transition: opacity .3s ease; }
.hero-clip-caption.is-on { opacity: 1; }
.hero-clip-link { border-bottom: 1px solid rgba(255,255,255,.45); padding-bottom: 1px; transition: border-color .2s ease; }
.hero-clip-caption:hover .hero-clip-link { border-color: #fff; }
@media (max-width: 640px) { .hero-clip-caption { left: 20px; bottom: 22px; } }
@media (pointer: coarse) { .hero-clip-caption::before { content: ""; position: absolute; inset: -14px -8px; } }
.hero-caption-visible .film-fx-blur { visibility: hidden !important; }
.hero-clip-caption { text-shadow: 0 1px 8px rgba(0,0,0,.35); }

/* About-Kontakt ohne Formular: drei gut sichtbare Buttons, zentriert */
.ab-contact.ab-contact-simple { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 14px; grid-template-columns: none; padding-top: 8px; border-top: 0; }
.ab-contact-btn { display: inline-flex; align-items: center; gap: 10px; padding: 16px 28px; font-size: .95rem; }
.ab-contact-btn svg { width: 18px; height: 18px; flex: 0 0 auto; }
@media (max-width: 640px) {
  .ab-contact.ab-contact-simple { flex-direction: column; align-items: stretch; }
  .ab-contact-btn { justify-content: center; }
}
/* Kontakt-Buttons: alle gleich (Rahmen). Damit klar ist, dass man klicken
   soll: beim Erscheinen poppen sie nacheinander auf, danach heben sie sich
   alle paar Sekunden nacheinander kurz an (Welle mit Schatten). Mit Maus:
   beim Darüberfahren deutlich grösser + schwarz gefüllt. */
.ab-contact-btn { position: relative; transition: background .2s ease, color .2s ease, scale .3s cubic-bezier(.2,.7,.2,1), box-shadow .3s ease; }
.ab-contact-simple.is-visible .ab-contact-btn {
  animation: ab-pop .6s cubic-bezier(.2,.9,.3,1.25) both, ab-lift 4s ease-in-out 1.4s infinite;
}
.ab-contact-simple.is-visible .ab-contact-btn:nth-child(2) { animation-delay: .12s, 1.6s; }
.ab-contact-simple.is-visible .ab-contact-btn:nth-child(3) { animation-delay: .24s, 1.8s; }
@keyframes ab-pop { 0% { opacity: 0; transform: scale(.85); } 100% { opacity: 1; transform: scale(1); } }
@keyframes ab-lift {
  0%, 22%, 100% { translate: 0 0; box-shadow: 0 0 0 rgba(13,13,16,0); }
  9% { translate: 0 -6px; box-shadow: 0 12px 22px -12px rgba(13,13,16,.45); }
}
@media (hover: hover) and (pointer: fine) {
  .ab-contact-btn:hover { scale: 1.08; background: var(--black); color: var(--ab-paper); box-shadow: 0 16px 30px -14px rgba(13,13,16,.5); }
  .ab-contact-simple .ab-contact-btn:hover { animation-play-state: running, paused; }
}
@media (prefers-reduced-motion: reduce) {
  .ab-contact-simple.is-visible .ab-contact-btn { animation: none; }
}
/* iPhone (Safari 26): Über der Navbar, im Bereich der Statusleiste, lief die
   Seite sichtbar durch. Das Rauchglas reicht jetzt nach oben über den
   Bildschirmrand hinaus und deckt diesen Bereich mit ab (am Desktop nicht
   sichtbar, liegt ausserhalb des Fensters). */
.site-header::before { top: -200px; }
/* Filmkorn auf Handy/Tablet schwächer -- auf kleinen, hochauflösenden
   Displays wirkt es sonst deutlich gröber als am Desktop. */
@media (max-width: 860px), (pointer: coarse) {
  .film-fx::after { opacity: .015; }
}

/* iPhone: Seite reicht bis unter die Statusleiste (viewport-fit=cover). Die
   Navbar wächst dort um den Sicherheitsabstand nach oben, damit ihr Rauchglas
   die Statusleiste mit abdeckt und nichts von der Seite darüber durchläuft.
   Der erste Abschnitt rutscht um denselben Abstand nach unten (ausser dem
   Vollbild-Hero auf der Startseite, der soll bis ganz oben gehen). */
.site-header { padding-top: calc(18px + env(safe-area-inset-top, 0px)); }
main > :first-child:not(.hero-video):not(#shopLookContent) { margin-top: env(safe-area-inset-top, 0px); }
@media (max-width: 860px), (pointer: coarse) {
  .film-fx::after { opacity: .022; }
}

/* iPhone Safari 26 färbt den Bereich der Statusleiste nach der
   background-color einer fixierten Navbar am oberen Rand. Unser Rauchglas lag
   bisher nur im ::before (Navbar selbst transparent) -> Safari zeigte dort die
   Seite. Auf Touch-Geräten trägt deshalb die Navbar selbst die Farbe:
   gescrollt die Rauchglas-Tönung, oben auf hellen Seiten die Seitenfarbe. */
@media (max-width: 860px), (pointer: coarse) {
  /* Safari 26 liest nur die eigene background-color der fixierten Navbar
     (nicht ::before, nicht halbtransparent mit backdrop-filter) -> auf dem
     Handy gescrollt eine deckende Farbe (Anthrazit aus der CI), damit die
     Statusleiste exakt gleich eingefärbt wird und nichts durchscheint. */
  .site-header.is-scrolled, .page-about .site-header.is-scrolled, .site-header-transparent.is-scrolled { background-color: #26262e; }
  .site-header.is-scrolled::before { display: none; }
  .site-header:not(.site-header-transparent):not(.is-scrolled) { background-color: var(--bg); }
}

html { background-color: var(--bg); }

/* Handy/Tablet: Navbar IMMER deckend Anthrazit, schon beim Laden. Safari 26
   übernimmt die Farbe der Statusleiste beim Laden von der fixierten Navbar --
   war sie da noch transparent, lief die Seite hinter Uhrzeit/Akku durch.
   So bilden Statusleiste und Navbar einen dunklen Block am oberen Rand. */
@media (max-width: 860px), (pointer: coarse) {
  .site-header, .page-about .site-header, .site-header-transparent, .site-header.is-scrolled, .site-header-transparent.is-scrolled,
  .site-header:not(.site-header-transparent):not(.is-scrolled) { background-color: #26262e !important; }
  .site-header::before { display: none !important; }
  .site-header .header-logo-dark { display: none !important; }
  .site-header .header-logo-light { display: block !important; }
  .site-header .nav-toggle:not(.open) span { background: #fff !important; }
}

/* Shop Handy: erster Viewport aufgeräumt. Kein grosses VIBRANCE, Video direkt
   unter dem Text, Buttons darunter, Trust + AGB als eine ruhige Fusszeile. */
@media (max-width: 860px) {
  .sr-giant { display: none; }
  .sr-hero { padding: 104px 20px 56px; gap: 0; align-items: stretch; }
  .sr-text, .sr-actions, .sr-trust, .sr-legal { align-self: flex-start; }
  .sr-copy { display: contents; }
  .sr-title { order: 1; font-size: 2rem; line-height: 1.06; }
  .sr-text { order: 2; margin-top: 14px; font-size: .98rem; line-height: 1.55; }
  .sr-film { order: 3; margin-top: 28px; box-shadow: 0 1px 2px rgba(13,13,16,.14), 0 16px 30px -14px rgba(13,13,16,.35); }
  .sr-film figcaption { display: none; }
  .sr-actions { order: 4; margin-top: 28px; gap: 18px; }
  .sr-trust { order: 5; margin-top: 22px; font-size: .74rem; gap: 4px 10px; }
  .sr-trust-item svg { width: 13px; height: 13px; }
  .sr-legal { order: 6; margin-top: 6px; font-size: .7rem; }
}

/* ===== iPhone Safari 26: Statusleiste + Overlays (Okt. 2026) =====
   Safari färbt den Bereich hinter Uhrzeit/Akku nach fixierten Vollbreite-
   Elementen am oberen Rand -- auch wenn sie unsichtbar sind (opacity 0 /
   visibility hidden). Geschlossene Overlays (Warenkorb-Hintergrund,
   Warenkorb, Video-/Foto-Popup) waren halbtransparent und haben die Navbar
   "überstimmt". Auf Handy/Tablet sind sie jetzt komplett weg (display:none),
   solange sie zu sind. Der Warenkorb ist dort ein deckendes Vollbild. */
@media (max-width: 860px), (pointer: coarse) {
  html { background-color: #26262e; }
  .cart-overlay:not(.is-open), .video-modal:not(.is-open), .doc-popup-backdrop:not(.is-open) { display: none !important; }
  .cart-overlay { display: none !important; }
  .cart-panel {
    width: 100%; max-width: none; height: 100%; box-shadow: none;
    padding: calc(22px + env(safe-area-inset-top, 0px)) 22px calc(22px + env(safe-area-inset-bottom, 0px));
    transition: transform .35s cubic-bezier(0.22, 1, 0.36, 1), display .35s allow-discrete;
  }
  .cart-panel:not(.is-open) { display: none; }
  .cart-panel.is-open { display: flex; }
  @starting-style { .cart-panel.is-open { transform: translateX(100%); } }
  .video-modal.is-open { display: flex; }
  @starting-style { .video-modal.is-open { opacity: 0; } }
}
/* iPhone Safari 26: Die fixe, bildschirmfüllende Filmkorn-Ebene (.film-fx::after)
   wurde von Safari als oberste Leiste erkannt -> Statusleiste zeigte die Seite
   statt der Navbar-Farbe (im iOS-Simulator nachgewiesen). Auf Touch-Geräten
   liegt das Korn deshalb nicht fixiert, sondern über die ganze Seitenhöhe. */
@media (max-width: 860px), (pointer: coarse) {
  body.film-fx { position: relative; }
  .film-fx::after { position: absolute; inset: 0; }
}
/* Handy: Rauchglas zurück (im iOS-Simulator getestet). Farbe als leicht
   transparente background-color direkt auf der Navbar -> Safari färbt die
   Statusleiste damit dunkel ein; der Weichzeichner liegt separat im ::before
   (Weichzeichner direkt auf der Navbar würde Safari die Färbung abschalten). */
@media (max-width: 860px), (pointer: coarse) {
  .site-header, .page-about .site-header, .site-header-transparent, .site-header.is-scrolled, .site-header-transparent.is-scrolled,
  .site-header:not(.site-header-transparent):not(.is-scrolled) { background-color: rgba(38, 38, 46, 0.78) !important; }
  .site-header::before { display: block !important; background: transparent !important; opacity: 1 !important;
    -webkit-backdrop-filter: blur(24px) saturate(1.2); backdrop-filter: blur(24px) saturate(1.2); }
}

/* =====================================================================
   Sprachwahl im Shop (shop-i18n.js): DE/EN/FR/IT. Am Desktop als letzter
   Punkt der Navigation, am Handy links im Header (gegenüber dem Menü).
   ===================================================================== */
.lang-switch { position: relative; }
.lang-switch-btn {
  font-family: var(--font-display); font-size: 0.88rem; font-weight: 500; letter-spacing: 0.06em;
  color: var(--black); background: none; border: 0; padding: 6px 2px; cursor: pointer; line-height: 1;
}
/* Farbe wie die Navigationslinks: weiss im Rauchglas, schwarz oben auf hellen Seiten. */
.lang-switch-btn { transition: color 0.3s ease; }
.site-header .lang-switch-btn { color: var(--white); }
.site-header:not(.site-header-transparent):not(.is-scrolled) .lang-switch-btn { color: var(--black); }
.lang-switch-btn:focus-visible { outline: 2px solid currentColor; outline-offset: 3px; border-radius: 4px; }
.lang-switch-menu {
  position: absolute; top: calc(100% + 12px); right: -14px; min-width: 156px;
  list-style: none; margin: 0; padding: 6px; background: #fff; border-radius: 12px;
  box-shadow: 0 18px 40px -18px rgba(0,0,0,.35), 0 0 0 1px rgba(0,0,0,.06);
  opacity: 0; visibility: hidden; transform: translateY(-4px);
  transition: opacity .18s ease, transform .18s ease, visibility .18s ease; z-index: 1200;
}
.lang-switch.is-open .lang-switch-menu { opacity: 1; visibility: visible; transform: none; }
.lang-switch-menu button {
  display: block; width: 100%; text-align: left; font-family: var(--font-body); font-size: 0.9rem;
  color: #111; background: none; border: 0; border-radius: 8px; padding: 10px 12px; cursor: pointer;
}
.lang-switch-menu button:hover, .lang-switch-menu button:focus-visible { background: #f2f2f0; outline: none; }
.lang-switch-menu button[aria-checked="true"] { font-weight: 600; }
.lang-switch-mobile { display: none; }
.lang-switch-floating { position: fixed; top: calc(16px + env(safe-area-inset-top, 0px)); right: 16px; z-index: 50; }
@media (max-width: 900px) {
  .lang-switch-desktop { display: none; }
  .lang-switch-mobile { display: block; position: absolute; left: 14px; top: 50%; transform: translateY(-50%); }
  .site-header .lang-switch-mobile .lang-switch-btn { color: #fff !important; padding: 12px 6px; }
  .lang-switch-mobile .lang-switch-menu { left: 0; right: auto; }
}

/* Showreels haben noch keinen Ton: im Video-Modal kein Lautstärke-Regler
   (Chrome/Edge/Safari; siehe openVideoModal(..., { noAudio: true })). */
.video-modal.no-audio video::-webkit-media-controls-mute-button,
.video-modal.no-audio video::-webkit-media-controls-volume-slider,
.video-modal.no-audio video::-webkit-media-controls-volume-control-container,
.video-modal.no-audio video::-webkit-media-controls-volume-slider-container { display: none !important; }

/* "Wie mein Look entstand": Foto + optionales zweites Bild (Node-Baum)
   darunter. Mit zweitem Bild wird die Spalte etwas schmaler, damit die
   Sektion nicht zu hoch wird. */
.lo-media { justify-self: end; width: 100%; max-width: 440px; display: flex; flex-direction: column; gap: 18px; }
.lo-media .lo-photo { max-width: none; justify-self: auto; }
.lo-media.has-second { max-width: 400px; }
.lo-photo-2 { display: block; width: 100%; height: auto; border-radius: 4px;
  box-shadow: 0 1px 2px rgba(13,13,16,.12), 0 14px 28px -10px rgba(13,13,16,.28), 0 40px 70px -30px rgba(13,13,16,.34); }
@media (max-width: 860px) {
  .lo-media, .lo-media.has-second { justify-self: stretch; max-width: none; gap: 14px; }
}
