/* snapshot-overrides.css
 *
 * Targeted fixes for Webflow elements that don't behave correctly outside
 * Webflow's own hosting — typically because their visual state is driven by
 * ix2 scroll/hover interactions that occasionally desync in the snapshot.
 *
 * Loaded after cyreen.webflow.css so these rules win.
 */

/* ---------------------------------------------------------------------------
 * Case study detail pages
 * --------------------------------------------------------------------------- */

/* Case study detail sections (.section_advertising / .section_discount /
 * .section_ton-relevanz / etc.) are `display: flex` by default in
 * cyreen.webflow.css. That makes their child .div-block-575 a flex item that
 * shrinks to content width instead of filling — the visible "everything
 * cluttered on the left" symptom. Force vertical stack layout.
 *
 * Excludes `.press-release` because /de/pressemitteilung relies on
 * `.section_advertising.padding-global` being `display: flex` for its
 * two press-list columns to sit side-by-side. */
section[class*='section_'][class*='advertising']:not(.press-release),
section[class*='section_'][class*='discount']:not(.press-release),
section[class*='section_'][class*='ton-relevanz']:not(.press-release),
section[class*='section_'][class*='kontakte']:not(.press-release),
section[class*='section_'][class*='wetter']:not(.press-release),
section[class*='section_'][class*='zeit']:not(.press-release),
section[class*='section_'][class*='langzeit']:not(.press-release),
section[class*='section_'][class*='a-b']:not(.press-release),
section.section_advertising:not(.press-release),
section.section_discount:not(.press-release) {
  display: block !important;
}

/* `.div-block-575` is the centered max-1200px wrapper; force full width so
 * it actually centers visibly. */
.div-block-575 {
  width: 100% !important;
  max-width: 1200px !important;
  margin-left: auto !important;
  margin-right: auto !important;
}

/* `.div-block-573` is the main content area inside .div-block-575. */
.div-block-573 {
  width: 100%;
  max-width: 1200px;
  margin-left: auto;
  margin-right: auto;
}

/* `.text-block-134` is the sticky "⭠ ZURÜCK" button.
 *
 * The real bug: cyreen.webflow.css sets
 *     .text-block-134:hover { margin-left: 75px; }
 * combined with `transition: all .2s` — so on hover the element slides 75px
 * to the right. The cursor, parked at the left edge, then sits OUTSIDE the
 * element → hover ends → it slides back → cursor now over it → hover starts
 * → infinite flicker.
 *
 * Kill both the hover slide and the base transition. Also force a stable
 * visible state in case ix2 (Webflow's interaction engine) initialises it
 * at opacity:0 and never fires the fade-in. */
.text-block-134 {
  opacity: 1 !important;
  visibility: visible !important;
  transform: none !important;
  transition: none !important;
}
.text-block-134:hover {
  margin-left: 0 !important; /* cancel the 75px slide that causes the flicker */
  transform: none !important;
}

/* Toolbar thread YLEqm0uHhuSJ: the "⭠ ZURÜCK" link (.link-23) renders as a
 * filled maroon pill (background + border-radius:999px + padding) — a "box"
 * that should not be there. Restore the plain text link. */
.link-23,
.link-23:hover {
  background-color: transparent !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  border-radius: 0 !important;
}

/* Toolbar thread u2UV13uHdERN: add breathing room below the back link so it
 * does not collide with the Zusammenfassung block on the case-study pages. */
.text-block-134 {
  margin-bottom: 1.5rem !important;
}

/* ---------------------------------------------------------------------------
 * In-store retail media — partner logo row
 * --------------------------------------------------------------------------- */

/* Toolbar thread lFArRq7I9fbc: the four logos sat in a Webflow grid with
 * per-logo grid-area placement plus 3 empty cells, so the visible spacing
 * came out lopsided. On desktop, lay them out in four equal columns with each
 * logo centred in its slot (kept to >=992px so the Webflow mobile/tablet
 * stacking is untouched). NOTE: a small residual offset remains on logos whose
 * source PNG carries asymmetric transparent padding — that needs an asset
 * re-export, not CSS. */
@media screen and (min-width: 992px) {
  .section_case-studies .div-block-554 {
    display: grid !important;
    grid-template-columns: repeat(4, 1fr) !important;
    justify-items: center !important;
    align-items: center !important;
    gap: 24px;
  }
  .section_case-studies .div-block-554 > *:not(.link-block-29) {
    display: none !important;
  }
  .section_case-studies .div-block-554 > .link-block-29 {
    grid-column: auto !important;
    grid-row: auto !important;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
  }
}

/* ---------------------------------------------------------------------------
 * C.A.P. data-cycle (.scroll-track) — make the bullet texts visible
 * --------------------------------------------------------------------------- */

/* Toolbar thread CrSiQd1eXuHf: the four data-cycle bullets (Datenerfassung,
 * Datenanalyse, Datenmuster, Datentargeting) start at opacity:0 + translateY
 * (the intended reveal), but Webflow's IX2 holds them at opacity:0 forever and
 * never animates them in, so the text is invisible. A small script on the
 * c-a-p page adds `.cyr-reveal` to each bullet in turn once the section scrolls
 * into view; the `!important` here beats IX2's inline opacity, and the base
 * transition makes it a fade + slide-up. */
.cap-optimization_text-1,
.cap-optimization_text-2,
.cap-optimization_text-3,
.cap-optimization_text-4 {
  transition:
    opacity 0.6s ease,
    transform 0.6s ease;
}
.cap-optimization_text-1.cyr-reveal,
.cap-optimization_text-2.cyr-reveal,
.cap-optimization_text-3.cyr-reveal,
.cap-optimization_text-4.cyr-reveal {
  opacity: 1 !important;
  transform: none !important;
}
.cap-optimization_redline {
  height: 100% !important;
}

/* Reduced-motion: show everything at once, no animation. */
@media (prefers-reduced-motion: reduce) {
  .cap-optimization_text-1,
  .cap-optimization_text-2,
  .cap-optimization_text-3,
  .cap-optimization_text-4 {
    opacity: 1 !important;
    transform: none !important;
  }
  .cap-optimization_redline {
    height: 100% !important;
  }
}

/* ---------------------------------------------------------------------------
 * Case-studies-2 — "für FMCG Marken" / "für Wissenschaftler" boxes
 * --------------------------------------------------------------------------- */

/* Toolbar threads 5LPmTjfKtuBv / O-9UBUDvHBod: the two boxes were clustered in
 * the centre. Spread them so each sits more centrally in its half of the page,
 * and centre the heading + the call-to-action button in each box. */
.div-block-595 {
  width: 100% !important;
  max-width: 1040px;
  margin-left: auto;
  margin-right: auto;
  justify-content: space-around !important;
}
.div-block-264,
.div-block-269 {
  text-align: center !important;
  align-items: center !important;
}

/* ---------------------------------------------------------------------------
 * Case-studies-2 slider — align title + logo with the paragraph
 * --------------------------------------------------------------------------- */

/* Toolbar threads fYjcpM8Yo_PT / PvTn3-vcJkwc / pOfH567fcNnh: in the case-study
 * slider each slide's title + logo sat in a full-width floated column with
 * centred content, so they did not line up with the paragraph below and
 * landed differently per slide. Force every slide column (title AND
 * paragraph) to the same centred 707 px block so the whole slide stacks
 * vertically the same way on DE and EN.
 *
 * DE case-studies-2 columns: .columns-213 (title) + .column-234 (paragraph).
 * EN case-studies columns:   .columns-204 (title) + .column-134 (paragraph).
 *
 * All four get the same treatment. Without applying to both columns of a
 * row the second col floats next to the first and the slide reads as a
 * two-column layout instead of a stack. */
.cs-slide .columns-213,
.cs-slide .column-234,
.cs-slide .columns-204,
.cs-slide .column-134 {
  float: none !important;
  width: 707px !important;
  max-width: 100%;
  margin-left: auto !important;
  margin-right: auto !important;
  padding-left: 0 !important;
  justify-content: flex-start !important;
}

/* ---------------------------------------------------------------------------
 * Two-column section grids — align the right description with the heading
 * --------------------------------------------------------------------------- */

/* Toolbar threads SwEkBPoMOcn_ / a-umN8FuHHiI / TppFGWxnOOie (Davide's
 * reference image): in the topline + heading / description sections the
 * right-hand description should line up with the <h2> heading, NOT with the
 * small red topline above it. The grid top-aligns both columns at the topline,
 * so push the description down by the topline's footprint (24px height + 4px
 * gap) to sit level with the heading. Desktop only — on mobile the columns
 * stack. :has(.topline) leaves topline-less grids untouched. */
@media screen and (min-width: 992px) {
  .basic-grid:has(.topline) > .content-wrap:nth-child(2) {
    margin-top: 28px;
  }
}

/* ---------------------------------------------------------------------------
 * CAP Explorer — section toplines
 * --------------------------------------------------------------------------- */

/* Toolbar thread MeyDfmdREq0u: the section toplines (the small eyebrow over
 * each heading, e.g. "KAMPAGNEN-MANAGEMENT") render dark grey under the
 * active-grey-black section theme, but they should be brand red like the rest
 * of the site. Restore the red. */
.section_campaigns .topline,
.section_infrastructure .topline,
.section_retail .topline {
  color: var(--brand_colors--red_active) !important;
}

/* ---------------------------------------------------------------------------
 * C.A.P. CTA section background (de/c-a-p, en/c-a-p, en/home)
 * --------------------------------------------------------------------------- */

/* Toolbar thread CDYN6EJvwHm4: swap the old "Gemüse" stock photo for the new
 * C.A.P. Screen image, and self-host it (it used to hot-link the Webflow CDN).
 * Show the required image credit subtly in the corner. */
.section_cta-cap {
  background-image: url('/cap-screen-kaese.jpg') !important;
  position: relative;
}
.cap-image-credit {
  position: absolute;
  right: 0.75rem;
  bottom: 0.5rem;
  z-index: 2;
  font-size: 0.6rem;
  line-height: 1.2;
  letter-spacing: 0.02em;
  color: rgba(255, 255, 255, 0.75);
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.55);
  pointer-events: none;
}

/* ---------------------------------------------------------------------------
 * Footer (every page)
 * --------------------------------------------------------------------------- */

/* Toolbar thread gSleTT18WEvq: the Kontakt + Social links sit in <li> items
 * that pick up 1.25rem (20px), but the address <p class="footer_address">
 * is 1rem (16px) — so the address looks smaller than the other two columns.
 * Webflow already drops BOTH to .9rem at max-width:479px, so they only
 * diverge above that. Bump the address to 1.25rem above 479px to match;
 * below it Webflow's own .9rem rule keeps them equal. */
@media screen and (min-width: 480px) {
  .footer_address {
    font-size: 1.25rem;
    line-height: 1.5;
  }
}

/* ---------------------------------------------------------------------------
 * General — neutralise ix2 initial-state hides on elements that have a
 * `data-w-id` but never actually animate visible. Keeps content readable on
 * the rare page where Webflow's interactions JS doesn't run as expected.
 * --------------------------------------------------------------------------- */
[data-w-id]:not(.lottie-animation-2):not(.lottie-animation-4):not(.lottie-animation-5):not(
    .lottie-animation-6
  ):not(.lottie-animation-7):not(.lottie-animation-9):not(.lottie-animation-10):not(
    .lottie-animation-14
  ) {
  /* Don't force here — let Webflow's ix2 win normally. But ensure
   * nothing is permanently hidden if the interaction JS fails to fire. */
}

/* ---------------------------------------------------------------------------
 * Homepage team grid — black & white portraits per Davide's feedback.
 * No hover colour restore — Davide explicitly wants them to stay b&w.
 *
 * Plus one targeted fix for Werner's portrait: his source photo has more
 * whitespace above the head than the others, so the Webflow default
 * object-fit: fill renders the whitespace as a visible white edge.
 * Switch to object-fit: cover (anchored to the head area) so all four
 * portraits crop the same way. The card variant (.div-block-583-special)
 * already provides the light-grey card background + correct role text
 * styling for the dark section context — no other overrides needed.
 * --------------------------------------------------------------------------- */
.section_home-team .image-84 {
  filter: grayscale(1) contrast(1.02);
  object-fit: cover;
  object-position: center top;
}
/* Founder cards: the portrait was a fixed 250px in normal flow, so when the
 * grid stretched a row taller (e.g. a 2-line role in one language made the
 * tallest card, EN especially) a shorter card like Benedict's left a grey gap
 * BELOW the photo. Make the card a flex column and let the portrait grow to the
 * card bottom, so the photo always fills the card regardless of role length or
 * language. object-fit: cover keeps the framing. */
.section_home-team .div-block-583-special {
  display: flex;
  flex-direction: column;
}
.section_home-team .image-84 {
  flex: 1 0 250px;
  min-height: 250px;
}
/* Hotspot-aware crops are now delivered by the Sanity CDN at the right
   size + face-centred via imageUrl(... { width, height }) — see
   src/lib/sanity.ts and the components in src/components/sanity/.
   That removes the need for per-portrait CSS scale tricks, because the
   image already arrives correctly framed. Marketing can fine-tune each
   face by adjusting the hotspot in Studio. */

/* ---------------------------------------------------------------------------
 * Case study detail pages — 'Zurück' button positioning.
 * It was previously pinned (sticky) to the top, but toolbar thread
 * k1_tBmLCgD3Q asks for the opposite: the back arrow should scroll along with
 * the content, not stay stuck at the top. Make it static. (The pill/box on
 * .link-23 is intentionally gone too — thread YLEqm0uHhuSJ wants a plain text
 * link, handled above.)
 * --------------------------------------------------------------------------- */
.text-block-134 {
  position: static !important;
  margin-top: 1.5rem !important;
  width: max-content;
}

/* ---------------------------------------------------------------------------
 * Legal pages (/agb-media, /datenschutz, /imprint) — H2 word spacing.
 * Davide noted the headings on /agb-media render with words too tightly
 * packed. Open it up for readability across all .w-richtext legal blocks.
 * --------------------------------------------------------------------------- */
.rich-text-datenschutz h2,
.rich-text-datenschutz h3 {
  word-spacing: 0.12em;
  letter-spacing: 0.005em;
}
.rich-text-datenschutz h2 {
  margin-top: 2.25rem;
  margin-bottom: 0.75rem;
  line-height: 1.3;
}

/* ---------------------------------------------------------------------------
 * Generic IX2 fallback: any [data-w-id] that Webflow's runtime left at
 * opacity:0 should still fade in when the user scrolls past it. Pure CSS
 * fallback via the .cyr-revealed class added by Navbar.astro's catch-all
 * IntersectionObserver below.
 * --------------------------------------------------------------------------- */
[data-w-id].cyr-revealed {
  opacity: 1 !important;
  transform: none !important;
  transition:
    opacity 0.6s ease,
    transform 0.6s ease;
}

/* ---------------------------------------------------------------------------
 * Big-data 'Conversion Rates' graph on the homepage — turn the two static
 * 2.25rem-tall labels into actual bars whose heights show the 375 % delta
 * (Ohne C.A.P. 0.20% vs Mit C.A.P. 0.75%). Webflow IX2 was supposed to
 * animate this; we re-implement with CSS that fires when JS adds the
 * .cyr-graph-animated class on the .graph parent (Navbar.astro IO below).
 * --------------------------------------------------------------------------- */
.graph .graph-1,
.graph .graph-2 {
  transition:
    height 1.2s cubic-bezier(0.45, 0.05, 0.55, 0.95),
    background-color 0.4s ease;
}
.graph.cyr-graph-animated .graph-1 {
  height: 5rem !important; /* 0.20% baseline */
}
.graph.cyr-graph-animated .graph-2 {
  height: 16rem !important; /* 0.75% — visually ~3.2× taller; works within the 25rem .graph container */
}

/* ---------------------------------------------------------------------------
 * Homepage testimonials — Xiaotong feedback: round logo and blockquote
 * sit too close together. Add breathing room.
 * --------------------------------------------------------------------------- */
.section_home-testimonials .div-block-226-1 blockquote {
  margin-top: 1.25rem;
}
.section_home-testimonials .div-block-226-1 {
  gap: 1rem;
}

/* ---------------------------------------------------------------------------
 * Homepage references — ensure the marquee CSS animation runs even when
 * Webflow IX2 doesn't trigger it. The .references_logos-moving-right and
 * .references_logos-moving-left elements are pre-set up as marquees but
 * sometimes start paused on static export.
 * --------------------------------------------------------------------------- */
.references_logos-moving-right,
.references_logos-moving-left {
  animation-play-state: running !important;
}
@keyframes references-marquee-right {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(-50%);
  }
}
@keyframes references-marquee-left {
  from {
    transform: translateX(-50%);
  }
  to {
    transform: translateX(0);
  }
}
.references_logos-moving-right {
  animation: references-marquee-right 60s linear infinite;
}
.references_logos-moving-left {
  animation: references-marquee-left 60s linear infinite;
}

/* ---------------------------------------------------------------------------
 * Homepage testimonials slider — working prev/next navigation.
 *
 * Webflow's native w-slider for .section_home-testimonials does not initialise
 * correctly in the snapshot: all five quote slides end up stacked at
 * translateX(0) with a single nav dot, and neither arrow advances. A small
 * script on en/home (see en/home.astro) takes the slider over once the page has
 * loaded: it strips Webflow's dead handlers, rebuilds one dot per slide, and
 * wires both arrows to step prev/next with wrap-around. These rules drive the
 * visible state only after that script adds `.cyr-carousel-ready`, so the DE
 * home (no script yet) and any other snapshot are left untouched.
 * --------------------------------------------------------------------------- */
/* These rules are keyed on `.cyr-carousel-ready` (added by
 * public/testimonials-carousel.js to each taken-over slider section), so they
 * cover ALL sliders the script drives: the home testimonials (DE + EN), the
 * /de/c-a-p .section_cap-testimonials, and the retail .section_benefits. Pages
 * without the script keep Webflow's untouched markup. */
/* Fixed-height carousel: stack every slide absolutely inside the mask and
 * cross-fade between them, so the mask keeps ONE constant height across all
 * slides. The script sets that height (= tallest slide) via inline style, and
 * re-measures on resize. This stops the arrows from jumping and the section (and
 * everything below it) from reflowing when the slide changes. */
.cyr-carousel-ready .w-slider-mask {
  display: grid !important;
}
.cyr-carousel-ready .w-slide {
  grid-area: 1 / 1 / 2 / 2; /* stack every slide in one grid cell so the mask auto-sizes to the TALLEST slide -> constant height, no reflow */
  display: flex;
  flex-direction: column;
  justify-content: center; /* centre each slide's content in the (tallest-slide) cell so the prev/next arrows line up with the logo, not the empty space below it (thread bW1eadPGfEE9) */
  width: 100%;
  opacity: 0 !important;
  visibility: hidden !important;
  transition: opacity 0.35s ease;
}
.cyr-carousel-ready .w-slide.cyr-slide-active {
  opacity: 1 !important;
  visibility: visible !important;
}
@media (prefers-reduced-motion: reduce) {
  .cyr-carousel-ready .w-slide {
    transition: none;
  }
}
/* Centre the logo in its full-height column so the prev/next arrows (which sit
 * at the slide's vertical centre) line up with the logo on every slide,
 * regardless of logo height. Home testimonials only (thread bW1eadPGfEE9). */
.cyr-carousel-ready .slider_slide-logo-wrapper {
  align-self: center; /* centre the (shorter) logo column within the grid row, which is sized by the taller quote column */
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Hide Webflow's font-icon glyph and draw a clean chevron on each arrow, so the
 * left arrow is exactly as visible as the right and both stay symmetric. */
.cyr-carousel-ready .w-icon-slider-left,
.cyr-carousel-ready .w-icon-slider-right {
  display: none !important;
}
.cyr-carousel-ready .w-slider-arrow-left,
.cyr-carousel-ready .w-slider-arrow-right {
  display: flex !important; /* beat Webflow's data-hide-arrows + the mobile breakpoint that hid both arrows */
  align-items: center; /* vertically centre the chevron — was pinned to the top and cut off */
  justify-content: center;
  overflow: visible; /* cancel webflow.css overflow:hidden that clipped the rotated chevron's corner */
  cursor: pointer;
  z-index: 2;
}
.cyr-carousel-ready .w-slider-arrow-left::after,
.cyr-carousel-ready .w-slider-arrow-right::after {
  content: '';
  width: 16px;
  height: 16px;
  border: solid var(--brand_colors--red_active, #f04b55);
  border-width: 0;
}
.cyr-carousel-ready .w-slider-arrow-left::after {
  border-bottom-width: 3px;
  border-left-width: 3px;
  transform: rotate(45deg); /* chevron pointing left */
}
.cyr-carousel-ready .w-slider-arrow-right::after {
  border-top-width: 3px;
  border-right-width: 3px;
  transform: rotate(45deg); /* chevron pointing right */
}
/* Home testimonials: drop the dot row lower so it clears the quote text
 * (matches the C.A.P. subpage dot spacing Davide approved). */
.section_home-testimonials.cyr-carousel-ready .w-slider-nav {
  bottom: -20%;
}
/* Retail (.section_benefits) dots are display:none in the base Webflow CSS —
 * reveal them and place the row at the bottom like the other carousels. */
.section_benefits.cyr-carousel-ready .w-slider-nav {
  display: block !important;
  bottom: -12%;
}

/* ---------------------------------------------------------------------------
 * /de/c-a-p — Coca-Cola bottle drop (toolbar thread kiz4_VbjjBM2).
 * The `.bottle` img in .section_contact-quality should drop DOWN through the
 * funnel and out the bottom spout on scroll (the original Webflow IX2 effect,
 * which never fires here). Earlier threads (HnDiwEldlIij + PPKW1v_myEvb) asked
 * to remove the bottle only because it sat statically at the TOP; a real
 * scroll-triggered drop satisfies both — it is no longer a static stray.
 *
 * This is only the REST state (above the funnel mouth, hidden). The drop itself
 * is run by the Web Animations API from the script on c-a-p.astro: a leftover
 * Webflow IX2 transition on this element overrode CSS classes AND inline
 * !important, so a WAAPI animation (which composites independently of the
 * cascade, fill:forwards) is the reliable way to move it. Reduced-motion rests
 * it at the spout with no motion.
 * --------------------------------------------------------------------------- */
.section_contact-quality .bottle {
  display: block;
  opacity: 0;
  transform: translateY(-110px); /* rest: above the funnel mouth — tuned live */
  will-change: transform, opacity;
}
@media (prefers-reduced-motion: reduce) {
  .section_contact-quality .bottle {
    opacity: 1;
    transform: translateY(240px); /* rest at the spout, no motion */
  }
}

/* ---------------------------------------------------------------------------
 * /de/handel/in-store-retail-media — "Conversion Rates" chart percentages
 * (toolbar thread MmwKq_-7pUBU: "here there is no percentage"). The bar labels
 * (197%, +13%, +17%, +20%) are IX2 elements that start at opacity:0 and rely on
 * a scroll animation that does not fire reliably in the snapshot, so the numbers
 * stay invisible. Force them visible (same approach as the homepage graph fix).
 * --------------------------------------------------------------------------- */
.case-studies_chart-wrapper .mid-precent-2,
.case-studies_chart-wrapper .handel {
  opacity: 1 !important;
  transform: none !important;
}

/* ---------------------------------------------------------------------------
 * /de/c-a-p — optimization icon grid hover (toolbar thread HxtR8Hshxut9).
 * Lift + slight scale the six icons on hover; reduced-motion stays static.
 * Same selectors exist on en/c-a-p, so one block covers both.
 * --------------------------------------------------------------------------- */
.optimization_grid-icon {
  transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1);
  will-change: transform;
}
.optimization_grid-item:hover .optimization_grid-icon {
  transform: translateY(-6px) scale(1.08);
}
@media (prefers-reduced-motion: reduce) {
  .optimization_grid-icon {
    transition: none;
  }
  .optimization_grid-item:hover .optimization_grid-icon {
    transform: none;
  }
}

/* ---------------------------------------------------------------------------
 * Home big-data graph (toolbar thread UGk4E4CbAX2N).
 * Reuse the SAME arrow as the /c-a-p "Optimierung" chart for consistency:
 * .counting-arrow is a square box with a red top+left border and
 * border-top-left-radius:100% (a clean quarter-circle arc), plus the
 * .optimization_chart-arrowhead chevron at its top-right. The prior override
 * squashed it into a tall rectangle, distorting the arc; keep it SQUARE here.
 * The "x375%" number sits above the arc at the chart-number size (1.5rem).
 * --------------------------------------------------------------------------- */
.section_big-data .graph .counting {
  top: auto;
  bottom: 60%;
  left: 14%;
  font-size: 1.5rem;
}
.section_big-data .graph .counting-arrow {
  border-top-left-radius: 100%;
  width: 3.5rem;
  height: 3.5rem;
  top: auto;
  bottom: 38%;
  left: 15%;
}
.section_big-data .graph .graph-1 .graph-text-bottom {
  top: 0.8rem;
}

/* ---------------------------------------------------------------------------
 * Case-study pages — metadata line spacing (toolbar thread FZlujjbbNqr6).
 * The 4-line <br> metadata blocks use line-height 14px on 14px text (ratio 1),
 * so the lines touch. Open the leading (unitless, so it also scales at the
 * 10px mobile size). These four classes appear only on case-study pages, DE+EN.
 * --------------------------------------------------------------------------- */
.paragraph-27,
.paragraph-28,
.paragraph-29,
.paragraph-30 {
  line-height: 1.7;
}

/* ---------------------------------------------------------------------------
 * .section_cta-cap background crop (toolbar thread VGCTNGC_28PA).
 * The fixed screen-photo was centre-cropped (background-position 50% +
 * attachment fixed), so the C.A.P. screen (upper-left of the photo) was cut off
 * and shifted while scrolling. Anchor the crop to the element and raise it so
 * the screen stays in view. Applies to the CTA on en/home, the newly ported DE
 * home CTA, and /de/c-a-p + /en/c-a-p (same section, kept consistent).
 * --------------------------------------------------------------------------- */
.section_cta-cap {
  /* Parallax scroll (fixed attachment) per Davide's request. The band is tall so
   * the C.A.P. screen (upper-right in the new photos) stays in frame across the
   * scroll. Threads VGCTNGC_28PA, svmoE2b4CRNi, 9zUdjK30UmQs. */
  background-attachment: fixed !important;
  background-size: cover !important;
  background-position: 50% 16% !important;
  padding-top: 6.5rem !important;
  padding-bottom: 6.5rem !important;
}
/* Per-page CTA photo (threads Veiv05eG_Kei home / mVjRaj_6kg9- c-a-p). Each CTA
 * shows its own C.A.P.-screen store photo instead of the shared one. In both new
 * photos the screen sits in the upper-right, so the crop is shifted right. */
.section_cta-cap.cta-photo-putzmittel {
  background-image: url('/cap-screen-putzmittel.jpg') !important;
  background-position: 72% 22% !important;
}
.section_cta-cap.cta-photo-sommergetraenk {
  background-image: url('/cap-screen-sommergetraenk.jpg') !important;
  background-position: 76% 14% !important;
}
/* Home CTA card: more transparent so the store photo shows through, matching the
 * /de/c-a-p card look, but kept centred (thread Veiv05eG_Kei). */
.cta-photo-putzmittel .cta_contact-card {
  background-color: rgba(255, 255, 255, 0.72) !important;
}

/* ---------------------------------------------------------------------------
 * Team office map — desaturate the OpenStreetMap tiles to a monochrome look that
 * matches Cyreen's black/white CI (toolbar thread iNAjTGb1pnAo). Filter the
 * whole tile pane rather than each tile so there are no seams between tiles.
 * Applies on /de/team and /en/team (both use the same Leaflet container).
 * --------------------------------------------------------------------------- */
.leaflet-tile-pane {
  filter: grayscale(1) contrast(1.05) brightness(1.03);
}
/* Leaflet's default container background is a mid grey (#ddd) that shows as a
 * visible strip wherever tiles have not yet reached. Use a near-white tone that
 * matches the desaturated map so any uncovered sliver blends in; the JS also
 * calls invalidateSize() so tiles fill the container in the first place. */
.leaflet-container {
  background: #f0f0f0;
}
/* The default Leaflet marker is blue, which fights the monochrome map. Shift it
 * to Cyreen red so the pin reads as brand colour against the grey tiles. */
.leaflet-marker-pane img {
  filter: hue-rotate(140deg) saturate(1.4) brightness(0.95);
}

/* ---------------------------------------------------------------------------
 * Rounded corners (Cyreen CI). The CTA contact card and the home big-data card
 * already use 24px; bring every other content card and the form fields up to the
 * same radius so the whole site is consistent (Davide). Full-bleed sections, the
 * map, pill buttons, the round testimonial logo and chart bars stay square.
 * --------------------------------------------------------------------------- */
/* Team + advisory cards. overflow:hidden clips the edge-to-edge portrait
 * (.image-84 / .image-advisor) to the rounded corner so no square corner shows. */
.div-block-583-special,
.card-front {
  border-radius: 24px;
  overflow: hidden;
}
/* The advisory flip card's outer container (.card-advisor) has a dark background
 * with square corners that show behind the rounded front. Round it too (thread
 * KYSJ9FNryq4m). No overflow:hidden here, that would clip the 3D flip. */
.card-advisor {
  border-radius: 24px;
}
/* Case-study cards: maroon summary + info bands and the grey chart panel (the
 * panel class differs per case study, hence several). */
.div-block-315,
.div-block-311,
.div-block-316,
.div-block-108,
/* Case-studies overview tiles + grey box */
.div-block-64,
.div-block-651,
/* /de/c-a-p optimization description box */
.optimization_chart-decription {
  border-radius: 24px;
}
/* Case-study visual images: round the two top corners so each visual reads with
 * a soft top edge like the rest of the CI, bottom kept square (thread
 * joYrjgKycWGE). The image sits edge-to-edge at the top of its panel, so 24px
 * lines up with the panel corner. */
.div-block-108 .w-embed img,
.div-block-314 .w-embed img {
  border-top-left-radius: 24px;
  border-top-right-radius: 24px;
}
/* div-block-108 is already a rounded card; div-block-314 was square, so round
 * its top to match the image and avoid a square nub behind the rounded corner. */
.div-block-314 {
  border-top-left-radius: 24px;
  border-top-right-radius: 24px;
}
/* Contact-form fields: a lighter radius so a short field does not read as a pill. */
.w-input {
  border-radius: 12px;
}
/* Conversion-rate bars: round the two top corners to match the card radius, so
 * the bars read as part of the rounded CI (thread Ta7xcRlyTr_r). Bars grow from
 * the baseline, so only the top is rounded. */
/* Home big-data card bars keep the full 24px (Davide liked that card). */
.big-data_card-right .graph-1,
.big-data_card-right .graph-2 {
  border-top-left-radius: 24px;
  border-top-right-radius: 24px;
}
/* Case-study CR chart bars: dialed back ~20% (24px -> 19px) so the rounding reads
 * softer. Top corners only, the rest of each bar is unchanged. Covers every
 * case-study CR chart bar (thread 00CeCJKSB4Ru). */
.div-block-163,
.div-block-167,
.div-block-169,
.div-block-318,
.div-block-319 {
  border-top-left-radius: 19px;
  border-top-right-radius: 19px;
}
/* Case-study chart tooltips (thread 00CeCJKSB4Ru). Each bar group becomes
 * focusable + hoverable; a small dark card explains the two bars and the uplift.
 * Behaviour is wired up by /case-study-tooltips.js, which reads the values and
 * range label already in the DOM. */
.cap-chart-group {
  cursor: help;
  outline: none;
}
.cap-chart-group:focus-visible {
  outline: 2px solid #f04b55;
  outline-offset: 3px;
  border-radius: 6px;
}
.cap-chart-tooltip {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 9999;
  box-sizing: border-box;
  width: max-content;
  max-width: 260px;
  padding: 12px 14px;
  border-radius: 12px;
  background: #1c1c1c;
  color: #fff;
  font-family: 'Graphik 400', sans-serif;
  font-size: 13px;
  line-height: 1.45;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.28);
  pointer-events: none;
  opacity: 0;
  transform: translateY(4px);
  transition:
    opacity 0.14s ease,
    transform 0.14s ease;
}
.cap-chart-tooltip.is-visible {
  opacity: 1;
  transform: translateY(0);
}
.cap-chart-tooltip strong {
  display: block;
  margin-bottom: 4px;
  color: #f04b55;
  font-size: 14px;
  font-weight: 600;
}
.cap-chart-tooltip span {
  display: block;
}
@media (prefers-reduced-motion: reduce) {
  .cap-chart-tooltip {
    transition: none;
    transform: none;
  }
}
/* Tiles that carry a C.A.P. pattern or icon must clip it to the rounded corner:
 * the case-studies-2 tiles (.div-block-64, thread EDzZf4bf7XWR) and the "weitere
 * Cases" navigation tiles on the case-study pages (.div-block-444, thread
 * CeZGUX7tr4Nh). The latter were still square. */
.div-block-64,
.div-block-444 {
  border-radius: 24px;
  overflow: hidden;
}
/* Case-study "weitere Cases" slider (.slider-5) tweaks. */
/* Arrows: the button spans the full slider height, so the icon centres on empty
 * space below the tiles. Lift it so it sits level with the tile block (thread
 * GMgmYjPmzPbP). Applies on every case-study page. */
.slider-5 .w-slider-arrow-left,
.slider-5 .w-slider-arrow-right {
  bottom: 98px;
}
/* Gap between the icon tile and its text: the tile sits left-aligned in a
 * half-width column, leaving a wide gap. Make the entry a flex row so the tile
 * column shrinks to the tile and the text takes the rest (thread ebOB0XoRO_V5). */
.slider-5 .columns-80 {
  display: flex;
  align-items: center;
}
.slider-5 .columns-80 > .w-col:first-child {
  flex: 0 0 auto;
  width: auto;
}
.slider-5 .columns-80 > .w-col:last-child {
  flex: 1;
  min-width: 0;
}

/* Team and advisory cards lift slightly on hover for a bit of interactivity
 * (Davide, thread UDwwBg0LBAVq). The lift shadow sits outside the box so
 * overflow:hidden does not clip it. */
.div-block-583-special,
.card-advisor {
  transition:
    transform 0.25s ease,
    box-shadow 0.25s ease;
}
.div-block-583-special:hover,
.card-advisor:hover {
  transform: translateY(-6px);
  box-shadow: 0 14px 30px rgba(0, 0, 0, 0.3);
}
@media (prefers-reduced-motion: reduce) {
  .div-block-583-special,
  .card-advisor {
    transition: none;
  }
  .div-block-583-special:hover,
  .card-advisor:hover {
    transform: none;
  }
}

/* Home big-data card body text. Justifying it (thread dXl2CQ8Mundm) stretched
 * the words into wide rivers of whitespace on this narrow column, so it is back
 * to left-aligned for even word spacing (thread swWLfbVM3NGn, "zu viel abstand").
 * text-wrap:balance stays so the line breaks are even and "C.A.P." does not
 * stack at a line end. */
/* Blocksatz for both paragraphs (thread TU2M3786jjHE, follow-up). `text-wrap`
 * left at its default so justify has room to stretch words evenly across the
 * full column width. */
.big-data_card-left p {
  text-align: justify;
}

/* /de/c-a-p contact card heading + text centred (thread 6KVF4lnNnBMf "Zentrieren"). */
.section_cta-cap .contact-card_cap {
  text-align: center;
}

/* ---------------------------------------------------------------------------
 * Weather case study — conversion-rate chart bar thickness (Davide). The first
 * temperature bucket (15-19°C) rendered with narrower bars than the other three
 * because its column did not stretch to fill its grid cell and its white bar
 * carried a fixed 37px width. Make every bar-pair column fill its grid cell and
 * give the white 15-19 bar the same proportional width as the rest, so all four
 * buckets have identical bar thickness. Applies on /de + /en (section_weather).
 * --------------------------------------------------------------------------- */
.section_weather .div-block-320 > .div-block-160 {
  width: 100%;
}
.section_weather .div-block-163 {
  width: 45%;
}

/* ---------------------------------------------------------------------------
 * Footer legal row (toolbar threads 2_yCpN6fY11e, KQyophrhi6JT, m6YbVWoXHhSl).
 * Shared Footer component -> applies on every page.
 * - Address text matches the phone-number size (was 20px vs the phone's 16px).
 * - "(c) {year}" centred in its (equal-width) grid column.
 * - "BY CYREEN" right-aligned in its column.
 * --------------------------------------------------------------------------- */
.section_footer .footer_address {
  font-size: 16px;
}
/* ...and the rest of the contact block matches it (thread QB3-0WHfA1-h): the
 * column titles, the phone/fax/email/social links and the list items were still
 * 14.4px while the address was 16px. Keep the whole block one size. */
.section_footer .footer_contact-grid .footer_col-title,
.section_footer .footer_contact-grid .footer_contact-link,
.section_footer .footer_contact-grid .footer_list-item {
  font-size: 16px;
}
.section_footer .footer_legal-grid-col:nth-child(2) {
  justify-self: center;
  text-align: center;
}
.section_footer .footer_legal-grid-col:last-child {
  justify-self: end;
  text-align: right;
}

/* ---------------------------------------------------------------------------
 * /de/case-studies-2 — VU Amsterdam logo (thread 3C6BlN9R8VMY). Its source PNG
 * is opaque white while the other three logos are transparent grey, so a white
 * box shows on the grey section. CSS stopgap: multiply blends the white into the
 * section background and grayscale desaturates the logo. Also broaden the
 * 4-equal-column logo-row layout to this page so the logo is evenly spaced.
 * --------------------------------------------------------------------------- */
.section_cases .div-block-554 .image-154 {
  filter: grayscale(1);
  mix-blend-mode: multiply;
}
@media screen and (min-width: 992px) {
  .section_cases .div-block-554 {
    display: grid !important;
    grid-template-columns: repeat(4, 1fr) !important;
    justify-items: center !important;
    align-items: center !important;
    gap: 24px;
  }
  .section_cases .div-block-554 > .link-block-29 {
    grid-column: auto !important;
    grid-row: auto !important;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
  }
}

/* ---------------------------------------------------------------------------
 * /de/team + /en/team portraits (threads wc_r77n6ZhVx, 3ZTFIsrhzmT-,
 * poFmTAyfbGLH, plus the six "picture not aligned with box" threads on en/team).
 * The base .image-84 pins width:250px + object-fit:fill + a stray left:-26px and
 * margins, so on any card that is not exactly 250px the portrait sits offset and
 * distorted. Reset those, let it fill the flex card, and crop from the top so the
 * face stays framed. Grayscale so every portrait (founders included) reads as one
 * consistent black-and-white set, like the homepage founder cutouts.
 * --------------------------------------------------------------------------- */
#cyreen-team .div-block-583-special {
  display: flex;
  flex-direction: column;
}
#cyreen-team .image-84 {
  flex: 1 0 auto;
  min-height: 250px;
  width: 100%;
  margin: 0;
  left: 0;
  object-fit: cover;
  object-position: center top;
  filter: grayscale(1) contrast(1.02);
}

/* ---------------------------------------------------------------------------
 * /de/pressemitteilung (.section_hero-v2-3) + /en/press-release
 * (.section_hero-v2-4) hero (threads smBH2hZQ9W21, pEhhYX3eOw_D)
 * Two fixes to make these page-unique heroes match every other page's header:
 * 1) Vertical: top-align the content (align-items: flex-start) so the heading
 *    sits ~160px from the top, not mid-section.
 * 2) Horizontal: the hero column uses justify-content: flex-end, so the content
 *    box is pushed to the right. On every other page a wide subtitle fills the
 *    box (632px max-width) and the heading lands flush-left; this page has no
 *    subtitle, so its short box got shoved right and the heading sat indented.
 *    Force the box to fill its max-width so the H1 lands at the same top-left
 *    spot as every other page header.
 * The EN press hero (.section_hero-v2-4) is structurally identical to the DE
 * one but never received these rules, so its title sat higher and indented.
 * Applying the same rules to both makes EN match DE (thread pEhhYX3eOw_D). */
.section_hero-v2-3 .hero-v2_grid-col,
.section_hero-v2-4 .hero-v2_grid-col {
  align-items: flex-start;
}
.section_hero-v2-3 .hero-v2_content-wrap,
.section_hero-v2-4 .hero-v2_content-wrap {
  width: 100%;
  /* Match the vertical push applied to .section_hero-v2 (thread hkccvdjNniz6)
   * so the H1 sits at the same height as every other page header
   * (threads jhdXJ6CleARJ, pEhhYX3eOw_D). */
  padding-top: 12rem;
}
@media (max-width: 767px) {
  .section_hero-v2-3 .hero-v2_content-wrap,
  .section_hero-v2-4 .hero-v2_content-wrap {
    padding-top: 4rem;
  }
}

/* ---------------------------------------------------------------------------
 * .section_hero-v2 hero position (thread hkccvdjNniz6)
 * On the live Webflow original the H1 sits ~5rem lower than in our Astro
 * rehost. Webflow's IX2 scroll-in animation ends at that lower position; the
 * rehost never runs the IX2, so the H1 sits at its markup-default (higher).
 * Compensate by pushing the content wrapper down. Not applied to the
 * -v2-3 variant (that has its own top-left alignment above).
 * --------------------------------------------------------------------------- */
.section_hero-v2 .hero-v2_content-wrap {
  padding-top: 12rem;
}
@media (max-width: 767px) {
  .section_hero-v2 .hero-v2_content-wrap {
    padding-top: 4rem;
  }
}

/* ---------------------------------------------------------------------------
 * /de/pressemitteilung press links (thread i2ad94UImGr2)
 * Show each publication's own logo (favicon) before the link so readers see
 * where it leads (Davide's preference over a generic glyph). The favicons are
 * DOWNLOADED into public/press-logos/ and served locally — never hotlinked
 * (CLAUDE.md). One rule per domain, matched on the link href. Refresh a logo by
 * re-downloading its file; add a domain by adding a file + a rule below.
 * --------------------------------------------------------------------------- */
.press-list .text-block-188 {
  display: inline-flex;
  /* Centre the logo on the whole title so multi-line links do not leave it stuck
   * at the top (thread MnsYQfTS4EP8). */
  align-items: center;
  gap: 0.5em;
}
.press-list .text-block-188::before {
  content: '';
  flex: 0 0 auto;
  width: 1.05em;
  height: 1.05em;
  background: center / contain no-repeat;
  border-radius: 2px;
}
.press-list a[href*='gfm-nachrichten.de'] .text-block-188::before {
  background-image: url('/press-logos/gfm-nachrichten.de.png');
}
.press-list a[href*='invidis.de'] .text-block-188::before {
  background-image: url('/press-logos/invidis.de.png');
}
.press-list a[href*='invidis.com'] .text-block-188::before {
  background-image: url('/press-logos/invidis.com.png');
}
.press-list a[href*='rtgroup.de'] .text-block-188::before {
  background-image: url('/press-logos/rtgroup.de.png');
}
.press-list a[href*='gs1-germany.de'] .text-block-188::before {
  background-image: url('/press-logos/gs1-germany.de.png');
}
.press-list a[href*='startupvalley.news'] .text-block-188::before {
  background-image: url('/press-logos/startupvalley.news.png');
}
.press-list a[href*='maresmedia.se'] .text-block-188::before {
  background-image: url('/press-logos/maresmedia.se.png');
}
.press-list a[href*='hessian.ai'] .text-block-188::before {
  background-image: url('/press-logos/hessian.ai.png');
}
.press-list a[href*='idooh.media'] .text-block-188::before {
  background-image: url('/press-logos/idooh.media.png');
}
.press-list a[href*='lebensmittelzeitung.net'] .text-block-188::before {
  background-image: url('/press-logos/lebensmittelzeitung.net.png');
}
.press-list a[href*='hamburg040.com'] .text-block-188::before {
  background-image: url('/press-logos/hamburg040.com.png');
}
.press-list a[href*='openpr.de'] .text-block-188::before {
  background-image: url('/press-logos/openpr.de.png');
}
.press-list a[href*='einzelhandel.de'] .text-block-188::before {
  background-image: url('/press-logos/einzelhandel.de.png');
}
.press-list a[href*='meedia.de'] .text-block-188::before {
  background-image: url('/press-logos/meedia.de.png');
}
.press-list a[href*='horizont.net'] .text-block-188::before {
  background-image: url('/press-logos/horizont.net.png');
}
.press-list a[href*='station-frankfurt.de'] .text-block-188::before {
  background-image: url('/press-logos/station-frankfurt.de.png');
}

/* ---------------------------------------------------------------------------
 * /en/case-studies — St. Gallen logo (thread 8fVKTUbETkfm)
 * Davide asked for the ENG logo asset, cropped, in black-and-white. Until
 * a swapped asset is available, apply grayscale + light contrast so the logo
 * reads as monochrome. Scoped to the EN page via html[lang="en"] so the DE
 * case-studies-2 (which shares the same class) stays in original colour.
 * TODO: replace /images/st.gallen.png with the ENG-language, tighter-cropped
 * asset when supplied. */
html[lang^='en'] #case-studies .div-block-554 .image-156 {
  filter: grayscale(1) contrast(1.02);
}

/* ---------------------------------------------------------------------------
 * /en/case-studies — Barilla / Journal-of-Marketing slider wrapper rounded
 * (thread pOfH567fcNnh). DE case-studies-2 uses .div-block-651.cs-slider-main
 * as the outer wrapper (already rounded via the .div-block-651 rule above);
 * EN case-studies uses .div-block-276.cs-slider-main for the same visual
 * element. Target the shared modifier .cs-slider-main so both branches round
 * identically without a page-specific selector. */
.cs-slider-main {
  border-radius: 24px;
  overflow: hidden;
}

/* ---------------------------------------------------------------------------
 * /en/team + /de/team — philosophy statements aligned with the hero H1
 * (threads WrWD5PbS98Vm, 7VdZFkxo2_2P)
 *
 * EN and DE use different markup for the philosophy blocks, so each needs its
 * own treatment. The shared target is the hero H1 ("We are Cyreen." /
 * "Wir sind Cyreen."), which sits in a 632px content box that the 2-col hero
 * grid pushes to the right edge of its 846px column: left = (50% - 632px) + 2rem.
 *
 * EN (#philosophy / #page1inspiration / #page1shopper): a .div-block-270 that
 * is absolutely positioned with a 7vh left margin, so its text sat ~150px left
 * of the hero H1. Give it the same 2rem inline padding, drop the 7vh margin,
 * and pin its left to the content-box edge. The hero only pushes the box right
 * once the column exceeds 632px (roughly > 1264px); below that the box fills
 * the column and the H1 sits flush-left, so max(0px, …) matches both regimes. */
.hero.head._1234 .div-block-270 {
  padding-left: 2rem;
  padding-right: 2rem;
  box-sizing: border-box;
}
@media screen and (min-width: 992px) {
  .hero.head._1234 .div-block-270 {
    margin-left: 0;
    left: max(0px, calc(50% - 632px));
    right: auto;
  }
}
/* Mobile (<=767px): .padding-global drops to 1.25rem, so the hero H1 and the DE
 * philosophy blocks sit at 20px while the fixed 2rem above left the EN blocks at
 * 32px — 12px too far right. Match the mobile padding-global value so EN lines
 * up with the hero and DE on phones too (thread 7VdZFkxo2_2P, mobile residual). */
@media screen and (max-width: 767px) {
  .hero.head._1234 .div-block-270 {
    padding-left: 1.25rem;
    padding-right: 1.25rem;
  }
}
/* DE (#philosophy-1/-2/-3): a .team-mission_content-wrap that already mirrors
 * the hero exactly — same 2-col grid, same 632px box pushed to the column's
 * right edge, and it already contains an inner .padding-global (2rem). So it
 * lines up with the hero H1 on its own and needs no extra padding. A previous
 * fix added a second 2rem here, which double-indented the text by 32px; that
 * rule is intentionally removed (thread 7VdZFkxo2_2P). */
