/* =====================================================================
 * Mitochondriak DE - storefront stylesheet (W9A)
 * ---------------------------------------------------------------------
 * Mobile-first. Every breakpoint is min-width. No framework, no build
 * step, no source CSS copied from mitochondriak.com - only the brand
 * decisions (palette, Roboto, dark chrome, red conversion accent,
 * portrait product imagery) were carried across.
 *
 * Sections
 *   1  tokens + resets
 *   2  layout helpers
 *   3  announcement bar
 *   4  header + navigation
 *   5  mobile navigation overlay
 *   6  hero + homepage sections
 *   7  product cards / grids
 *   8  category archive
 *   9  product detail
 *  10  cart / checkout / account
 *  11  footer
 *  12  editorial (blog, pages)
 *  13  utilities + print
 *  14  category / PDP content blocks (W9A.1)
 *  15  W9B - PDP content bands, section nav, carousel, footer layer 2
 *  16  W9C - header fixes, language switcher, video hero, trust track,
 *       card second-image hover, footer v3
 *  17  W9N.1 - contact form and showroom sections
 *  18  W9N.1 - Versand und Zahlung
 *  19  W9N.1 - owner-set heading sizes, pinned
 *  20  W72-B - bank transfer instruction + GiroCode
 * ===================================================================== */

/* ---------------------------------------------------------------------
 * 1. tokens + resets
 * ------------------------------------------------------------------ */

:root {
	/*
	 * W9N.2 - THE WIDTH OF THIS SITE. ONE VALUE.
	 *
	 * Every page uses it: shop, category, product, home, blog archive, blog
	 * article, contact, and every legal page. Section 20 has the reasoning
	 * and the measurements of the four widths this replaced.
	 *
	 * To make the site narrower or wider, change THIS LINE. There is no
	 * second width to keep in sync and no page that decides its own.
	 */
	--mitode-shell: 1320px;

	/*
	 * Reading-measure tokens. NOTHING APPLIES THEM TODAY - they are kept
	 * because they are measured facts about this typeface and are what a
	 * narrow-column layout would use if the owner ever wants one back.
	 *
	 * Not expressed in `ch`: the theme's Roboto is a variable font whose "0"
	 * advance resolves to 7.54px at 17px here, so the 72ch the theme used
	 * until W9L actually produced 543px.
	 *
	 *   --mitode-measure       38rem = 608px, ~78 characters
	 *   --mitode-measure-long  42rem = 672px, ~86 characters
	 *   --mitode-content       960px, the editorial column W9N.1 set and
	 *                          W9N.2 replaced with the one site width
	 */
	--mitode-measure: 38rem;
	--mitode-measure-long: 42rem;
	--mitode-content: 960px;

	--mitode-gut: clamp(1rem, 4vw, 2.5rem);

	/*
	 * W48 - THE RATING COLOUR. ONE TOKEN, AND IT IS NOT THE BRAND RED.
	 *
	 * Until W48 a filled star was `--wp--preset--color--accent`, the
	 * Mitochondriak red, in five different stylesheets. Red on this shop
	 * means "act or pay attention": the call to action, the price, the
	 * sale badge and the brand mark itself. A five-star row painted in it
	 * competes with the buy button on every card in the grid, and a
	 * shopper scanning a category page reads a row of red as a row of
	 * alerts.
	 *
	 * A rating is not an alert. Gold is what a rating is in every shop a
	 * customer has ever used, including the source storefront, and it is
	 * the one colour on the page that carries no other meaning.
	 *
	 * #f5a623 measures 2.1:1 against the empty star (#dcdfe5) and 1.94:1
	 * against white. That is deliberate and it is not a text contrast
	 * failure: the star row is `aria-hidden` decoration, and the claim it
	 * illustrates is printed beside it as text AND given to assistive
	 * technology as the component's `aria-label` ("4,9 von 5 Sternen, 37
	 * Bewertungen aus Mitochondriak® Shops"). No information exists only
	 * in the colour.
	 *
	 * `--mitode-rating-empty` is here for the same reason: the two are a
	 * pair, and separating them is how a half star ends up drawn in one
	 * scheme against a track from another.
	 */
	--mitode-rating-color: #f5a623;
	--mitode-rating-color-strong: #e08c05;
	--mitode-rating-empty: var(--wp--preset--color--border, #dcdfe5);

	/* W9F - height of the sticky header, for anything that has to sit below
	   it (the sticky product gallery, anchor scroll-margins) */
	--mitode-header-h: 8rem;

	/*
	 * W9E - one radius family for the whole storefront, taken from the
	 * source shop: fields and image corners 8, every card and panel 20,
	 * every button and chip a full pill.
	 */
	--mitode-radius: 8px;
	--mitode-radius-lg: 20px;
	--mitode-radius-pill: 999px;

	/* W9E - three shadows, nothing floats (source caps blur at 12px) */
	--mitode-shadow-btn: 0 3px 6px rgba(15, 15, 15, .12);
	--mitode-shadow-card: 0 6px 12px rgba(15, 15, 15, .08);
	--mitode-shadow-pop: 0 10px 28px rgba(15, 15, 15, .12);

	/*
	 * W9E - the vertical rhythm. Three band sizes replace the fifteen
	 * one-off padding recipes of W9A-W9D; a band never carries a margin,
	 * so two bands always touch and no unpainted strip can appear.
	 */
	--mitode-band: clamp(3rem, 5.6vw, 4.5rem);
	--mitode-band-sm: clamp(2rem, 3.6vw, 3rem);
	--mitode-band-lg: clamp(3.75rem, 7vw, 6rem);

	/* W9E - one type scale for every section heading on the storefront */
	/*
	 * W9N.2 - THE HEADING SCALE, CORRECTED FROM MEASUREMENT.
	 *
	 * W9N.1 implemented the owner's 18/15/14 px literally, and H9N1 section
	 * 9.1 reported the consequence: body copy is the `medium` preset, which
	 * was fluid 15-17 px, so <h2> came out the same size as a paragraph and
	 * <h3> came out SMALLER than one. The owner confirmed that was not the
	 * intent.
	 *
	 * The replacement is not another guess. tools/w9n2/browser/typography.mjs
	 * read getComputedStyle on the rendered pages of every Mitochondriak shop
	 * (2026-08-31, 1440 px / 390 px):
	 *
	 *   shop                body   h1   h2   h3
	 *   mitochondriak.sk    16/14  24   20   22
	 *   mitochondriak.pl    16/14  24   20   20
	 *   mitochondriak.com   16/14  24   20   20
	 *   DE Lab (before)     17/15  18   15   14   <- the reported defect
	 *
	 * The sibling shops sit at 24/20 over a 16 px body; their H3 is authored
	 * per page and is not a scale at all (on .sk it is LARGER than H2). So DE
	 * takes their proportion and gives it the consistency they lack:
	 *
	 *   BODY 16 · H1 26 · H2 22 · H3 18 · H4 16 bold
	 *
	 * Fixed rem values on purpose. clamp() was what produced a 15 px H2 next
	 * to a 17 px paragraph at one viewport and a different relationship at
	 * the next, and no reader ever sees two viewports at once - what they see
	 * is a heading that is smaller than the text under it. One explicit step
	 * at 600 px keeps the phone from carrying a 26 px H1 across a 375 px line;
	 * it is a media query, so it is readable and predictable.
	 *
	 * The hard rule, enforced by tools/w9n2/browser/typography.mjs and not by
	 * eye: H1 > H2 > H3 > BODY, at every tested width.
	 *
	 * Component headlines that are typography in their own right - the hero
	 * slide title, the footer brand statement, the product card title, the
	 * page-head display heading - keep their own sizes. Marketing type is not
	 * editorial type and the owner's rule is about the editorial scale.
	 */
	--mitode-fs-h1: 1.625rem;
	--mitode-fs-h2: 1.375rem;
	--mitode-fs-h2-long: 1.375rem;
	--mitode-fs-h3: 1.125rem;
	--mitode-fs-lede: 1.0625rem;
	--mitode-fs-eyebrow: .75rem;

	--mitode-ease: cubic-bezier(.2, .7, .3, 1);
}

@media (min-width: 782px) {
	:root { --mitode-header-h: 72px; }
}

/*
 * W9N.2 - the single small-screen step of the editorial scale.
 *
 * Not a clamp: a clamp interpolates continuously and its value at any one
 * viewport is something nobody wrote down. Two states, both written down.
 */
@media (max-width: 600px) {
	:root {
		--mitode-fs-h1: 1.5rem;    /* 24 px */
		--mitode-fs-h2: 1.25rem;   /* 20 px */
		--mitode-fs-h2-long: 1.25rem;
		--mitode-fs-h3: 1.0625rem; /* 17 px, still above the 16 px body */
	}
}

/*
 * The element scale itself. theme.json carries the same numbers for the
 * editor; these make the front end agree with it even where a block adds
 * its own class, and they are the ones the media query above moves.
 */
/*
 * The element scale itself lives in section 19 at the end of this file,
 * where it is pinned with a selector that beats WordPress's global styles.
 * The media query above moves the tokens; section 19 reads them.
 */

html { scroll-behavior: smooth; }

@media (prefers-reduced-motion: reduce) {
	html { scroll-behavior: auto; }
	*, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

body {
	-webkit-font-smoothing: antialiased;
	text-rendering: optimizeLegibility;
	overflow-wrap: break-word;
}

img { max-width: 100%; height: auto; }

/*
 * WordPress sets box-sizing per block class, not globally. The theme's own
 * chrome is plain markup inside core/html blocks, so it needs the reset
 * explicitly - without it `max-width` plus `padding-inline` overflows the
 * viewport at widths just below the shell maximum.
 */
[class^="mitode-"],
[class*=" mitode-"],
[class^="mitode-"]::before,
[class^="mitode-"]::after { box-sizing: border-box; }

:where(a, button, input, select, textarea, summary):focus-visible {
	outline: 3px solid var(--wp--preset--color--info);
	outline-offset: 2px;
	border-radius: 2px;
}

.mitode-skip-link {
	position: absolute;
	left: -9999px;
	top: 0;
	z-index: 200;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--contrast);
	padding: .75rem 1.25rem;
	font-weight: 700;
}
.mitode-skip-link:focus { left: 0; }

/* ---------------------------------------------------------------------
 * 2. layout helpers
 * ------------------------------------------------------------------ */

/*
 * The shell is the storefront's own container. The second selector exists
 * only to outrank WordPress' global `.is-layout-constrained > *` rule,
 * which is printed after the theme stylesheet and would otherwise clamp
 * every section to theme.json's 760px content size.
 */
.mitode-shell,
:is(.is-layout-constrained, .is-layout-flow, .wp-block-group) > .mitode-shell {
	width: 100%;
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding-inline: var(--mitode-gut);
}

/*
 * W9E - the white strips.
 *
 * WordPress prints two global-styles rules for `blockGap`:
 *   :where(.wp-site-blocks) > *       { margin-block-start: 1.5rem }
 *   :root :where(.is-layout-flow) > * { margin-block-start: 1.5rem }
 * Every homepage section is a painted full-bleed band that already owns
 * its vertical padding, so that margin renders as a 24 px unpainted strip
 * between two painted bands - most visibly above and below the hero.
 * Bands are not flow items: the margin is reset at the three seams where
 * bands actually stack, and only there.
 *
 * W27.9 - THE RESET NOW WINS ON SPECIFICITY, NOT ON PRINT ORDER.
 *
 * It used to be `:where(.wp-site-blocks) > *` (0,0,0) and `.mitode-main > *`
 * (0,1,0) - a TIE with core's two rules, decided by whichever stylesheet
 * WordPress happened to print last. That held for as long as nothing
 * changed the queue, and then it did not: adding a second theme stylesheet
 * that depends on `mitode-main` moved `mitode-main` ahead of
 * `global-styles`, and the strips came back. Measured, front page:
 *
 *   /kontakt/      mitode-main 25, global-styles 18   -> reset wins
 *   /             mitode-main 15, global-styles 20   -> core wins, 24px gaps
 *
 * The owner reported it as "biely zbytočný priestor" above and below the
 * hero carousel, and it was exactly that - header, carousel and the
 * competitive-advantages strip each pushed 24 px apart.
 *
 * A `:root` prefix costs nothing, changes no cascade the theme relies on,
 * and takes the reset to (0,2,0) - above both core rules whatever the
 * print order is. This must not be reverted to a bare selector.
 */
:root .wp-site-blocks > *,
:root .mitode-main > *,
:root .mitode-main > .entry-content > * { margin-block-start: 0; }

/*
 * Blocks an editor adds to the homepage content are ordinary flow items
 * again - only the theme's own bands opt out. One class more specific than
 * the reset above it, for the same reason.
 */
:root .mitode-main > .entry-content > *:not([class*="mitode-"]) {
	margin-block-start: var(--wp--style--block-gap, 1.5rem);
}

/* A band owns the rhythm inside its own shell (every child sets its own). */
:is(.mitode-light, .mitode-about, .mitode-featured, .mitode-education) > .mitode-shell > * { margin-block-start: 0; }

/* Full-bleed bands must never inherit that clamp either. */
:is(.is-layout-constrained, .is-layout-flow, .wp-block-group) > :is(.mitode-hero, .mitode-trust, .mitode-rednir, .mitode-light, .mitode-about, .mitode-hotspots, .mitode-announce, .mitode-header, .mitode-footer, .mitode-archive-head, .mitode-page-head, .mitode-section, .mitode-longdesc, .mitode-band) {
	max-width: none;
}

.mitode-section { padding-block: var(--mitode-band); }
.mitode-section--tight { padding-block: var(--mitode-band-sm); }

/* W9E - the two homepage list bands: one section, one surface each */
.mitode-education { background: var(--wp--preset--color--surface); }
.mitode-featured .mitode-section__head,
.mitode-education .mitode-section__head { margin-block-end: clamp(1.75rem, 3.2vw, 2.5rem); }

.mitode-eyebrow {
	display: block;
	font-size: var(--mitode-fs-eyebrow);
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--wp--preset--color--accent);
	margin-block-end: .75rem;
}

/* W9E - one size for every section heading, on light and on dark bands */
.mitode-section__head h2,
.mitode-light .mitode-light__title,
.mitode-hotspots__title,
.mitode-faq__title {
	font-size: var(--mitode-fs-h2);
	line-height: 1.15;
	letter-spacing: -.015em;
}

.mitode-section__head {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: 1rem;
	margin-block-end: clamp(1.5rem, 3vw, 2.25rem);
}
.mitode-section__head > * { margin: 0; }

/*
 * W51 - the head of a section whose call to action now sits UNDER the
 * rail. `justify-content: space-between` with a single child is harmless,
 * but `align-items: flex-end` was there to seat a button on the heading's
 * baseline; with no button it just makes the block depend on a rule it no
 * longer uses. Stated, so the next person does not read the flex row and
 * look for the missing second child.
 */
.mitode-section__head--titleonly { align-items: flex-start; }

/*
 * The moved call to action. Centred under the rail rather than pinned to
 * a corner: at the bottom of a horizontally scrolling list there is no
 * corner a reader's eye is already at.
 */
.mitode-section__more {
	margin: clamp(1.5rem, 3vw, 2.25rem) 0 0;
	text-align: center;
}

/*
 * And the same rule again at (0,3,0), because a band zeroes the top
 * margin of every direct child of its shell 40 lines above this one
 * (`:is(.mitode-light, …, .mitode-featured, …) > .mitode-shell > *`, at
 * (0,2,0)). The first version of this button measured 0px below the rail
 * for exactly that reason. The reset is right - a band's children each
 * set their own rhythm - so this is a child setting its own, not an
 * exception to the reset.
 */
.mitode-featured > .mitode-shell > .mitode-section__more {
	margin-block-start: clamp(1.5rem, 3vw, 2.25rem);
}

/* ---------------------------------------------------------------------
 * 3. announcement bar
 * ------------------------------------------------------------------ */

.mitode-announce {
	background: var(--wp--preset--color--dark-deep);
	color: #e6e7ec;
	font-size: .8125rem;
	line-height: 1.4;
}

.mitode-announce__inner {
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding: .5rem var(--mitode-gut);
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: .35rem 1.5rem;
	text-align: center;
}

.mitode-announce a { color: inherit; text-decoration: none; }
.mitode-announce a:hover { color: #fff; text-decoration: underline; }
.mitode-announce strong { color: #fff; }

.mitode-announce__util { display: none; }

@media (min-width: 900px) {
	.mitode-announce__inner { justify-content: space-between; text-align: left; }
	.mitode-announce__util { display: flex; gap: 1.25rem; align-items: center; }
}

/* ---------------------------------------------------------------------
 * 4. header + navigation
 * ------------------------------------------------------------------ */
/*
 * Two rows, as on the source storefront: brand + product search + cart, then
 * the navigation as its own bar. On narrow viewports the two rows are
 * re-laid-out into burger | brand | actions with the search underneath, so
 * the search stays reachable without a second tap. Both row wrappers become
 * `display: contents` there, which lets children from either row sit in the
 * same grid.
 */
.mitode-header {
	position: sticky;
	top: 0;
	z-index: 90;
	background: var(--wp--preset--color--dark);
	color: #fff;
	border-bottom: 1px solid rgba(255, 255, 255, .09);
}

.mitode-header__shell {
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding-inline: var(--mitode-gut);
}

.mitode-header__row--top {
	display: flex;
	align-items: center;
	gap: clamp(.75rem, 2.5vw, 2.5rem);
	min-height: var(--mitode-header-h);
}

.mitode-header__row--nav {
	border-top: 1px solid rgba(255, 255, 255, .09);
}

.mitode-brand {
	display: inline-flex;
	align-items: center;
	gap: .6rem;
	text-decoration: none;
	flex: 0 0 auto;
	min-width: 0;
}
/*
 * W48 - SCOPED UNDER `.mitode-header`, AND THAT IS THE WHOLE POINT.
 *
 * `.mitode-brand img` is (0,1,1). So is WooCommerce's
 * `.woocommerce img, .woocommerce-page img { height: auto; max-width: 100% }`
 * in woocommerce-layout.css, and the product page carries the
 * `woocommerce` body class. A tie is decided by print order, so this rule
 * was winning only because main.css happened to be printed after
 * WooCommerce's - which stopped being true the moment a block render
 * callback pulled main.css forward (see inc/reviews-render.php). The
 * header then rendered with a 1000x188 wordmark.
 *
 * `.mitode-header .mitode-brand img` is (0,2,1) and wins whatever the
 * order. The print order is ALSO fixed, at the cause; this is the half
 * that survives the next plugin update.
 */
/*
 * W53 - the drawn height, not the box height.
 *
 * The image is now the tight crop (978x174, zero transparent margin), so
 * every pixel of `height` below is glyph. Before this stage a 26px box
 * drew 24.06px of wordmark and a 32px box drew 29.62px; the numbers here
 * are therefore an increase twice over - once because the box grew, once
 * because the box stopped containing air.
 *
 * `object-fit: contain` is the anti-deformation guarantee: if `max-width`
 * ever binds, the artwork letterboxes inside the box instead of being
 * squashed, so no rule below can produce a stretched wordmark.
 */
.mitode-header .mitode-brand img {
	display: block;
	height: 30px;
	width: auto;
	max-width: min(58vw, 300px);
	object-fit: contain;
}
@media (min-width: 782px) {
	/* Desktop grows 32 -> 34. The header bar keeps `min-height:
	   var(--mitode-header-h)` = 72px and 34 < 72, so the BAR HEIGHT DOES
	   NOT MOVE - which is the explicit constraint in the brief (1C). */
	.mitode-header .mitode-brand img { height: 34px; }
}
.mitode-brand__fallback {
	color: #fff;
	font-weight: 700;
	font-size: 1.05rem;
	letter-spacing: -.01em;
	white-space: nowrap;
}

/* product search - the dominant element of the first row */

.mitode-search {
	position: relative;
	display: flex;
	align-items: center;
	flex: 1 1 auto;
	min-width: 0;
	max-width: 34rem;
	background: #fff;
	border-radius: var(--mitode-radius);
	/*
	 * W9K: this was `overflow: hidden`, which existed only to round the
	 * corners of the input and the submit button - and which clipped the
	 * autocomplete panel out of existence. The rounding now sits on the
	 * children that actually have corners, so the panel can escape.
	 */
}
.mitode-search__icon {
	position: absolute;
	left: .8rem;
	width: 18px;
	height: 18px;
	fill: none;
	stroke: var(--wp--preset--color--contrast-3);
	stroke-width: 1.8;
	stroke-linecap: round;
	pointer-events: none;
}
.mitode-search__input {
	flex: 1 1 auto;
	min-width: 0;
	border: 0;
	background: transparent;
	padding: .7rem .75rem .7rem 2.4rem;
	font-size: .9375rem;
	color: var(--wp--preset--color--contrast);
}
.mitode-search__input::placeholder { color: var(--wp--preset--color--contrast-3); }
.mitode-search__input:focus { outline: 0; }
.mitode-search:focus-within { box-shadow: 0 0 0 2px var(--wp--preset--color--info); }
.mitode-search__submit {
	flex: 0 0 auto;
	border: 0;
	cursor: pointer;
	padding: .7rem 1.1rem;
	background: var(--wp--preset--color--accent);
	color: #fff;
	font-size: .9375rem;
	font-weight: 700;
	transition: background .16s var(--mitode-ease);
}
.mitode-search__submit {
	border-start-end-radius: var(--mitode-radius);
	border-end-end-radius: var(--mitode-radius);
}
.mitode-search__input {
	border-start-start-radius: var(--mitode-radius);
	border-end-start-radius: var(--mitode-radius);
}
.mitode-search__submit:hover { background: var(--wp--preset--color--accent-dark); }

/* desktop navigation - core/navigation block */

.mitode-header .wp-block-navigation {
	min-width: 0;
	font-size: .9375rem;
}
.mitode-header .wp-block-navigation .wp-block-navigation__container {
	gap: clamp(.7rem, 1.8vw, 1.9rem);
	align-items: center;
}
.mitode-header .wp-block-navigation .wp-block-navigation-item__content {
	color: rgba(255, 255, 255, .88);
	font-weight: 500;
	text-decoration: none;
	white-space: nowrap;
	padding-block: .85rem;
	border-bottom: 2px solid transparent;
	transition: color .18s var(--mitode-ease), border-color .18s var(--mitode-ease);
}
.mitode-header .wp-block-navigation .wp-block-navigation-item__content:hover,
.mitode-header .wp-block-navigation .wp-block-navigation-item__content:focus-visible,
.mitode-header .wp-block-navigation .current-menu-item > .wp-block-navigation-item__content,
/*
 * W27.6 - AN ANCESTOR IS ALSO "WHERE YOU ARE".
 *
 * `.current-menu-ancestor` was added to this list after measuring the first
 * version of the current-state work: on a PRODUCT page nothing at all was
 * marked, because a product is never itself a menu entry - only its section
 * is, and that section is an ancestor. Chrome reported the top-level entry
 * on /produkt/mitochondriak-maxi/ as rgba(255,255,255,.88) on rgb(26,26,26)
 * with `border-bottom: rgba(0,0,0,0) 2px` - pixel-identical to every other
 * entry. All 18 product pages, every blog article and every glossary term
 * showed no current state on desktop.
 */
.mitode-header .wp-block-navigation .current-menu-ancestor > .wp-block-navigation-item__content {
	color: #fff;
	border-bottom-color: var(--wp--preset--color--accent);
}
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-icon { margin-left: .25rem; }

.mitode-header .wp-block-navigation .has-child .wp-block-navigation__submenu-container {
	background: #fff;
	border: 0;
	border-radius: 0 0 var(--mitode-radius) var(--mitode-radius);
	box-shadow: var(--mitode-shadow-pop);
	padding-block: .5rem;
	min-width: 17rem;
	left: -1rem;
}
/* core re-applies min-width:200px in its :hover / :focus-within open states
   (five-class selectors); restate the width there so entries do not wrap */
.mitode-header .wp-block-navigation .has-child:not(.open-on-click):hover > .wp-block-navigation__submenu-container,
.mitode-header .wp-block-navigation .has-child:not(.open-on-click):not(.open-on-hover-click):focus-within > .wp-block-navigation__submenu-container {
	min-width: 17rem;
}
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
	padding: .55rem 1.25rem;
	color: var(--wp--preset--color--contrast);
	border-bottom: 0;
	white-space: normal;
}
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item__content:hover,
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item__content:focus,
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item__content:focus-visible,
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item__content:active {
	color: var(--wp--preset--color--accent);
	background: var(--wp--preset--color--surface);
}
/*
 * W27.6 - THE CURRENT DROPDOWN ROW IS NOT A HOVER.
 *
 * `.current-menu-item` used to sit in the hover/focus/active group above.
 * That was harmless while the class never arrived; now that it does, it
 * made a PERSISTENT state out of a colour pair that was only ever meant to
 * flash under a pointer. Measured with Chrome's own computed styles
 * (tools/w27-6/browser/nav-contrast.mjs): accent #f80120 on surface
 * #f5f6f8 is a contrast ratio of **3.87** - below the 4.5 that 15px bold
 * text needs, and a state a customer reads for as long as the page is open
 * rather than for as long as the mouse is on it.
 *
 * So the current row states itself the way a current row should: the
 * ordinary dark text (19:1), the weight of a heading, and an accent marker
 * down its leading edge. It also stops depending on colour ALONE, which is
 * what tells a colour-blind reader anything at all.
 */
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-container .current-menu-item > .wp-block-navigation-item__content,
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-container .current-menu-ancestor > .wp-block-navigation-item__content {
	color: var(--wp--preset--color--contrast);
	background: var(--wp--preset--color--surface);
	font-weight: 700;
	box-shadow: inset 3px 0 0 0 var(--wp--preset--color--accent);
}
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-container .wp-block-navigation-item__content:focus-visible {
	outline: 3px solid var(--wp--preset--color--info);
	outline-offset: -3px;
}
/*
 * W9C root cause of the black-on-black dropdown: core/navigation carried
 * overlayBackgroundColor/overlayTextColor presets, which core also stamps on
 * the desktop submenu container (`has-dark-background-color`, !important).
 * The attributes are gone from patterns/header.php; this rule is the
 * belt-and-braces guard so a preset can never repaint the dropdown again.
 */
.mitode-header .wp-block-navigation .wp-block-navigation__submenu-container.has-background {
	background-color: #fff !important;
	color: var(--wp--preset--color--contrast) !important;
}

/* header action icons */

.mitode-actions {
	display: flex;
	align-items: center;
	gap: .15rem;
	flex: 0 0 auto;
	margin-inline-start: auto;
}

.mitode-iconbtn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: .4rem;
	min-width: 42px;
	height: 42px;
	padding: 0 .5rem;
	border: 0;
	border-radius: var(--mitode-radius-pill);
	background: transparent;
	color: rgba(255, 255, 255, .9);
	text-decoration: none;
	cursor: pointer;
	transition: background .16s var(--mitode-ease), color .16s var(--mitode-ease);
}
.mitode-iconbtn:hover,
.mitode-iconbtn:focus-visible { background: rgba(255, 255, 255, .12); color: #fff; }
.mitode-iconbtn svg { width: 21px; height: 21px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
.mitode-iconbtn__label { display: none; font-size: .875rem; font-weight: 500; }

@media (min-width: 782px) {
	.mitode-iconbtn--cart { background: rgba(255, 255, 255, .1); padding-inline: .85rem; }
	.mitode-iconbtn--cart .mitode-iconbtn__label { display: inline; }
}

.mitode-burger { display: inline-flex; }
@media (min-width: 1080px) { .mitode-burger { display: none; } }

/* Woo mini-cart block sits inside .mitode-actions */
.mitode-actions .wp-block-woocommerce-mini-cart { display: flex; }
.mitode-actions .wc-block-mini-cart__button {
	color: rgba(255, 255, 255, .9);
	padding: 0 .6rem;
	height: 42px;
	border-radius: var(--mitode-radius-pill);
	background: rgba(255, 255, 255, .1);
}
.mitode-actions .wc-block-mini-cart__button:hover { background: rgba(255, 255, 255, .18); color: #fff; }
.mitode-actions .wc-block-mini-cart__badge {
	background: var(--wp--preset--color--accent);
	color: #fff;
	border-color: var(--wp--preset--color--accent);
	font-weight: 700;
}
.mitode-actions .wc-block-mini-cart__amount { font-weight: 700; }

/*
 * Narrow header. Below the navigation breakpoint the two rows are flattened
 * into one grid: wordmark on the left, the action cluster and the burger on
 * the right (W9C - the source storefront's mobile header order), with the
 * search on a full-width row of its own.
 */
@media (max-width: 1079px) {
	.mitode-header__shell {
		display: grid;
		grid-template-columns: minmax(0, 1fr) auto auto;
		grid-template-areas:
			"brand actions nav"
			"search search search";
		align-items: center;
		column-gap: .35rem;
		row-gap: .55rem;
		padding-block: .55rem;
	}
	.mitode-header__row--top,
	.mitode-header__row--nav { display: contents; }

	.mitode-brand { grid-area: brand; justify-self: start; min-width: 0; max-width: 100%; }
	/*
	 * W53 - THE WORDMARK IS SIZED FROM THE ROW'S REAL BUDGET.
	 *
	 * The previous rule was `height:auto; max-height:26px; max-width:100%`,
	 * and `max-width:100%` is what made the brief's complaint true: at
	 * 320px the measured wordmark was 97.88x18.39 - the LOGO absorbed the
	 * whole shortfall while four 38-42px icons kept their size. That is
	 * the degradation order in 1D exactly inverted.
	 *
	 * Measured budget (tools/w53/browser/header-budget.mjs, before state):
	 * everything that is not the wordmark - the flag, the account link,
	 * the mini-cart, the burger and two column gaps - costs a FIXED
	 * ~190px, so the space left for the wordmark is roughly `100vw - 190
	 * - 2 x gutter`. With the gutter at 16px on a phone that is
	 * `100vw - 222`; the 196 below is that figure with the icon
	 * tightening further down already paid in (measured after: the action
	 * cluster costs 114.78px and the burger 36px at 320), leaving ~7px of
	 * slack so a longer cart amount cannot start clipping.
	 *
	 * Dividing by the tight artwork's own aspect ratio (978/174 = 5.62)
	 * turns "space available" into "height it may be", continuously, so
	 * there is no breakpoint between 320 and 600 where the wordmark
	 * suddenly jumps or suddenly collides.
	 *
	 * 21px floor: below that the wordmark stops being legible, and at
	 * that point it is the ICONS' turn to give way (rules below).
	 * 30px ceiling: the row's icons are 38-42px, and a wordmark taller
	 * than that would drive the header's own height up - which 1A rules
	 * out.
	 */
	.mitode-header .mitode-brand img {
		width: auto;
		height: clamp(21px, calc((100vw - 196px) / 5.62), 30px);
		max-height: none;
		max-width: 100%;
	}
	.mitode-actions { grid-area: actions; margin-inline-start: 0; }
	.mitode-search { grid-area: search; max-width: none; }
	.mitode-header .wp-block-navigation { grid-area: nav; justify-self: end; }

	.mitode-header__row--nav { border-top: 0; }
}

@media (max-width: 480px) {
	.mitode-search__submit { padding-inline: .8rem; }
	/* phone: icon-only cart so the wordmark keeps its width */
	.mitode-actions .wc-block-mini-cart__amount { display: none; }
	.mitode-actions .wc-block-mini-cart__button { padding-inline: .45rem; }
}

/*
 * W53 - THE DEGRADATION LADDER, IN THE ORDER THE BRIEF SETS (1D).
 *
 *   1. the gaps between the controls close,
 *   2. the controls themselves get smaller, down to a 36px floor,
 *   3. and only what is left over limits the wordmark - which is the
 *      clamp() above, so this ladder is what FEEDS it.
 *
 * Nothing here is allowed to remove a control: wordmark, search, market
 * flag, account, cart and burger are all still in the row at 320, and the
 * search sits on its own full-width row underneath at every one of these
 * widths.
 *
 * 36px is the floor for a tap target here. It is under the 44px ideal and
 * that is a deliberate trade at 320px only: the alternative the previous
 * code chose was an 18px wordmark, and a brand nobody can read costs more
 * than 8px of thumb.
 */
@media (max-width: 480px) {
	/* step 1 - the gaps */
	.mitode-header__shell { column-gap: .3rem; }
	.mitode-actions { gap: .1rem; }

	/* step 2 - the controls */
	.mitode-actions > a.mitode-iconbtn {
		/* `.mitode-iconbtn` sets `height: 42px`, so a min-height here
		   would change nothing - the property that has to move is the
		   same one. (0,2,1) beats the base rule's (0,1,0) whatever the
		   print order.) */
		height: 40px;
		min-width: 40px;
		padding: 0 .35rem;
	}
	/*
	 * THREE classes, measured the hard way. The first draft of this block
	 * used `.mitode-header .wp-block-navigation__responsive-container-open`
	 * - (0,2,0), the same as the base rule ~60 lines BELOW it, which sets
	 * min-width/min-height 42px and padding .5rem. The tie went to the
	 * later rule and the burger measured 42px at 320 while every other
	 * control had already shrunk: the ladder was documented and not
	 * happening. Third time this family has bitten this theme.
	 */
	.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container-open {
		min-width: 40px;
		min-height: 40px;
		padding: .35rem;
	}
	.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container-open svg { width: 24px; height: 24px; }
}

@media (max-width: 400px) {
	.mitode-header__shell { column-gap: .25rem; }
	.mitode-actions > a.mitode-iconbtn {
		height: 38px;
		min-width: 38px;
		padding: 0 .3rem;
	}
	.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container-open {
		min-width: 38px;
		min-height: 38px;
		padding: .3rem;
	}
	.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container-open svg { width: 22px; height: 22px; }
	.mitode-actions .wc-block-mini-cart__button { padding-inline: .3rem; }
	/* The market selector is the widest control in the cluster (51.78px
	   measured at 390): the chevron goes, the flag stays, because the
	   brief keeps the country control and only the affordance is
	   negotiable. */
	.mitode-actions .mitode-lang__caret { display: none; }
}

@media (max-width: 360px) {
	.mitode-header__shell { column-gap: .2rem; }
	.mitode-actions > a.mitode-iconbtn {
		height: 36px;
		min-width: 36px;
		padding: 0 .25rem;
	}
	.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container-open {
		min-width: 36px;
		min-height: 36px;
		padding: .25rem;
	}
	/*
	 * THREE class selectors on purpose. `.mitode-lang--header
	 * .mitode-lang__toggle` (0,2,0) already sets `padding-inline: .35rem`
	 * ~3000 lines BELOW this block, so a (0,2,0) restatement here would
	 * tie and lose on print order - the exact failure W51 spent an hour
	 * on twice. See [[lab-blockgap-specificity-trap]].
	 */
	.mitode-actions .mitode-lang--header .mitode-lang__toggle { padding-inline: .25rem; }
}
/* ---------------------------------------------------------------------
 * 5. mobile navigation overlay (core/navigation, overlayMenu = mobile)
 * ------------------------------------------------------------------ */

/*
 * core/navigation switches to its overlay at 600px. The Mitochondriak menu
 * has six top-level entries, so the horizontal bar only fits from 1080px.
 * These two rules move core's own breakpoint up without forking its markup.
 */
@media (min-width: 600px) and (max-width: 1079px) {
	.mitode-header .wp-block-navigation__responsive-container:not(.is-menu-open) { display: none; }
	.mitode-header .wp-block-navigation__responsive-container-open:not(.always-shown) { display: flex; }
	.mitode-header .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-close { display: block; }
}
@media (min-width: 1080px) {
	.mitode-header .wp-block-navigation__responsive-container-open { display: none; }
}

.mitode-header .wp-block-navigation__responsive-container-open {
	color: rgba(255, 255, 255, .92);
	padding: .5rem;
	min-width: 42px;
	min-height: 42px;
	align-items: center;
	justify-content: center;
	border-radius: var(--mitode-radius-pill);
}
.mitode-header .wp-block-navigation__responsive-container-open:hover { background: rgba(255, 255, 255, .12); color: #fff; }
.mitode-header .wp-block-navigation__responsive-container-open svg { width: 26px; height: 26px; }

.wp-block-navigation__responsive-container.is-menu-open {
	padding: 1.25rem var(--mitode-gut) 3rem;
	background-color: var(--wp--preset--color--dark) !important;
	color: #fff !important;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-close {
	color: #fff;
	padding: .5rem;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
	padding-top: 1.5rem;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
	gap: 0;
	align-items: stretch;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
	border-bottom: 1px solid rgba(255, 255, 255, .1);
}
/*
 * W55: the accordion TOGGLE is listed here too, and that is the point.
 *
 * The toggle replaces a top-level link visually, so it has to be the same
 * type. It was not: eyes-on QA caught the two parent rows rendering at
 * 15px/400 (inherited from the <li>) next to childless rows at 17px/500 -
 * a difference the DOM assertions could not see, because every ARIA
 * attribute and every hit test was already correct. One declaration for
 * "a top-level row in the overlay" means the two cannot drift again.
 *
 * `display` and `padding` are deliberately re-set on .mitode-navacc below
 * (it is a flex row with its own 52px floor); only the TYPE is shared.
 */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content,
.wp-block-navigation__responsive-container.is-menu-open .mitode-navacc {
	display: block;
	width: 100%;
	padding: .9rem 0;
	font-size: 1.0625rem;
	font-weight: 500;
	color: #fff;
	text-decoration: none;
	border-bottom: 0;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:hover { color: var(--wp--preset--color--accent); }
/*
 * W27.6 - the mobile overlay needs its own "you are here".
 *
 * The desktop bar has styled `.current-menu-item` since W9C (a red underline
 * on the entry, an accent row in the dropdown) - the class simply never
 * arrived until inc/nav.php started emitting it. The overlay was never
 * styled for it at all, so the same fix would have produced a visible state
 * on desktop and nothing on a phone.
 *
 * A border on the LEFT rather than an underline: the overlay is a vertical
 * stack of full-width rows, where an underline is indistinguishable from the
 * hairline that already separates them.
 */
/*
 * WHITE, NOT ACCENT, AND THE BACKGROUND IS RESET ON PURPOSE.
 *
 * The overlay markup lives INSIDE `.mitode-header`, so the desktop dropdown
 * rule reaches it: a submenu row marked current arrived here carrying
 * `background: surface` - a near-white band inside a dark overlay.
 *
 * THE SELECTOR CARRIES `.mitode-header .wp-block-navigation` FOR ONE REASON
 * AND IT IS NOT TIDINESS. The first version of this rule was
 * `.wp-block-navigation__responsive-container.is-menu-open .current-menu-item
 * > ...` - four classes, (0,4,0) - against the dropdown rule's five,
 * (0,5,0). It LOST, so `background: none` never applied, and the comment
 * that used to stand here claimed the two were "equally specific" and that
 * the band was gone. It was not: the adversarial review read Chrome's own
 * matched-rule list out of docs/qa/w27-6/after/w276nav2-nav-contrast.json,
 * where BOTH rules are listed for the overlay node and the computed result
 * is `color: rgb(15,15,15)` on `rgb(245,246,248)` - the white band, still
 * there, inside a `rgb(26,26,26)` overlay.
 *
 * It was legible (17.7:1), but it was not what the code said, and it made
 * the overlay speak two languages: the current TOP-LEVEL row was white on
 * dark (that one the four-class rule did win, because the dropdown rule
 * needs `.wp-block-navigation__submenu-container`) while the current
 * SUBMENU row was dark on white. One state, two appearances, one nesting
 * level apart.
 *
 * Six classes settle it without `!important` and without depending on which
 * rule happens to come later in the file.
 */
.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .current-menu-item > .wp-block-navigation-item__content,
.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .current-menu-ancestor > .wp-block-navigation-item__content {
	color: #fff;
	background: none;
	font-weight: 700;
}
/*
 * Two strengths of the same marker, so the two states are told apart
 * without a second colour: a SOLID accent edge on the page you are reading,
 * a dimmed one on the section it belongs to. Weight alone was not enough -
 * the overlay's rows are already white at weight 500, and 500 -> 700 on a
 * 17px row is a difference you have to look for.
 */
.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .current-menu-item > .wp-block-navigation-item__content {
	box-shadow: inset 3px 0 0 0 var(--wp--preset--color--accent);
	padding-left: .7rem;
}
/* Same six-class scope as the pair above, for the same reason: the desktop
   dropdown rule sets the SOLID accent bar on ancestors too, and at four
   classes this dimmed one would lose to it for any ancestor that happens to
   sit inside a submenu container - so the two strengths would collapse into
   one for exactly the rows where telling them apart matters. */
.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .current-menu-ancestor > .wp-block-navigation-item__content {
	box-shadow: inset 3px 0 0 0 rgba(248, 1, 32, .45);
	padding-left: .7rem;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container {
	background: transparent !important;
	border: 0 !important;
	box-shadow: none;
	padding-left: .9rem;
	padding-bottom: .5rem;
	width: 100%;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container .wp-block-navigation-item { border-bottom: 0; }
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
	padding: .5rem 0;
	font-size: .9375rem;
	font-weight: 400;
	color: rgba(255, 255, 255, .78);
}

/* ---------------------------------------------------------------------
 * 5b. W53 - the overlay is an accordion
 * ------------------------------------------------------------------ */

/*
 * THE ONE RULE THAT CHANGES THE BEHAVIOUR.
 *
 * core prints, at (0,3,0), `.wp-block-navigation__responsive-container
 * .is-menu-open .wp-block-navigation__container { display: flex }` and
 * makes every submenu `position: static; visibility: visible`, so inside
 * the overlay all of them paint. Nothing in core's stylesheet sets
 * `display` on the submenu itself, which is why the branch could not be
 * closed by any of the attributes core was already toggling.
 *
 * Seven classes here, and not one of them decoration: this has to beat
 * core's (0,3,0) AND the theme's own six-class overlay rules above,
 * whatever order the sheets print in. Betting on print order is what cost
 * W48 119 elements and W51 two silent no-ops.
 *
 * `:not(.is-mitode-open)` is the whole state model - assets/js/nav-mobile.js
 * owns that class and the button's aria-expanded, and nothing else does.
 * With the script off, no element ever carries the class, so no submenu is
 * ever hidden and the menu is exactly what it is today.
 */
.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open li.wp-block-navigation-item.mitode-has-acc:not(.is-mitode-open) > ul.wp-block-navigation__submenu-container {
	display: none;
}

/*
 * THE ROWS ARE FULL WIDTH. Measured in the overlay before this stage: the
 * `ul.wp-block-navigation__container` computes to `align-items: flex-start`
 * and 192px inside a 358px dialog, so every row was only as wide as its own
 * label - which is why the hairline under "Innenbeleuchtung" stops halfway
 * across the screen in the owner's screenshot. A chevron pinned to the end
 * of a 169px row lands in the middle of the phone, and a 44px tap target in
 * the middle of a menu is worse than none.
 */
.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
	align-items: stretch;
	width: 100%;
}

/*
 * W55 - THE PARENT ROW IS THE TOGGLE, NOT A LINK.
 *
 * W53 laid a 44x52 chevron over the right end of the parent's own <a> and
 * left the rest of the row navigating. The owner found what that means on
 * a phone: tapping "Rotlichttherapie" leaves the menu, and the branch only
 * opens if the thumb lands on the chevron. The row is now the button and
 * the whole of it - label, empty space, chevron - opens and closes.
 *
 * The parent's <a> is hidden INSIDE THE OVERLAY ONLY. It is the same
 * element the desktop bar renders, so it is never removed and never
 * rewritten; assets/js/nav-mobile.js re-publishes its address as the first
 * row of the branch ("Übersicht: …"), which is where the landing page
 * lives now. Hidden rather than left in place because a second focusable
 * copy of the same destination is exactly the "double navigation" the
 * brief forbids.
 *
 * Seven classes and two elements (0,7,2): core prints `display: block` on
 * `.wp-block-navigation-item__content` from inside its own overlay rules
 * and this has to win regardless of which sheet prints last - the ladder
 * that cost W48 119 elements and W51 two silent no-ops.
 */
.mitode-header .wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open li.wp-block-navigation-item.mitode-has-acc > a.wp-block-navigation-item__content {
	display: none;
}

.mitode-header .wp-block-navigation__responsive-container.is-menu-open li.mitode-has-acc {
	position: relative;
}

/*
 * display:none by default is what keeps the DESKTOP information
 * architecture untouched: the same markup renders in the desktop bar, and
 * a chevron button there would be a second control next to a hover
 * dropdown that already works. The injected overview row is hidden for the
 * same reason - on the desktop the parent is still its own link.
 */
.mitode-navacc { display: none; }
.mitode-navover { display: none; }

.mitode-header .wp-block-navigation__responsive-container.is-menu-open .mitode-navover {
	display: block;
}

.mitode-header .wp-block-navigation__responsive-container.is-menu-open .mitode-navacc {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: .75rem;
	width: 100%;
	/*
	 * 52px, not 44: 44 is the floor the brief names and the rest of the
	 * overlay's rows already stand at 52, so a parent row shorter than its
	 * own children would be the odd one out. Measured hit area is the full
	 * row width, which on the narrowest supported phone (320) is 288px.
	 */
	min-height: 52px;
	padding: 0;
	border: 0;
	background: transparent;
	/* Size, weight and colour come from the shared top-level-row rule
	   above. FAMILY and LINE-HEIGHT have to be asked for explicitly: a
	   <button> does not inherit them, the UA sheet supplies its own, and
	   without these two the row rendered Arial/normal next to Roboto/27.2px
	   links - measured, after the first fix had already matched the size. */
	font-family: inherit;
	line-height: inherit;
	text-align: start;
	cursor: pointer;
	border-radius: var(--mitode-radius, 10px);
}

.mitode-header .wp-block-navigation__responsive-container.is-menu-open .mitode-navacc__label {
	flex: 1 1 auto;
	/* The label may wrap on a narrow phone; it must not push the chevron
	   out of the row, so the flex item is allowed to shrink below
	   min-content - the W53 `min-width: auto` family of defects. */
	min-width: 0;
}

.mitode-header .wp-block-navigation__responsive-container.is-menu-open .mitode-navacc:hover { color: #fff; }
.mitode-header .wp-block-navigation__responsive-container.is-menu-open .mitode-navacc:focus-visible { outline: 2px solid #fff; outline-offset: -2px; }

.mitode-header .wp-block-navigation__responsive-container.is-menu-open .mitode-navacc__chev {
	flex: 0 0 auto;
	/*
	 * The glyph is 20px but the CELL is 44px wide, so the chevron end of
	 * the row is a full-size target in its own right for a reader who aims
	 * at it out of habit - the whole row works, and so does the affordance.
	 */
	width: 44px;
	height: 24px;
	padding-inline: 12px;
	box-sizing: border-box;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	color: rgba(255, 255, 255, .8);
	transition: transform .18s var(--mitode-ease, ease);
}
.mitode-header .wp-block-navigation__responsive-container.is-menu-open .mitode-navacc[aria-expanded="true"] .mitode-navacc__chev { transform: rotate(180deg); }

@media (prefers-reduced-motion: reduce) {
	.mitode-header .wp-block-navigation__responsive-container.is-menu-open .mitode-navacc__chev { transition: none; }
}

/* ---------------------------------------------------------------------
 * 6. hero + homepage sections
 * ------------------------------------------------------------------ */

.mitode-hero {
	position: relative;
	background: var(--wp--preset--color--dark-deep);
	color: #fff;
	overflow: hidden;
	isolation: isolate;
}

.mitode-hero::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background:
		radial-gradient(120% 90% at 78% 12%, rgba(248, 1, 32, .38) 0%, rgba(248, 1, 32, 0) 58%),
		radial-gradient(90% 80% at 12% 92%, rgba(25, 151, 229, .22) 0%, rgba(25, 151, 229, 0) 60%),
		linear-gradient(160deg, #171717 0%, #0a0a0a 70%);
}

.mitode-hero__inner {
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding: clamp(3rem, 9vw, 6.5rem) var(--mitode-gut) clamp(3rem, 8vw, 5.5rem);
	display: grid;
	gap: clamp(2rem, 5vw, 3.5rem);
	align-items: center;
}

@media (min-width: 900px) {
	.mitode-hero__inner { grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr); }
}

.mitode-hero h1,
.mitode-hero .mitode-hero__title {
	color: #fff;
	margin: 0 0 1rem;
	font-size: clamp(2.15rem, 6vw, 4rem);
	line-height: 1.06;
	letter-spacing: -.02em;
}
.mitode-hero__title em { font-style: normal; color: var(--wp--preset--color--accent); }

.mitode-hero__lede {
	margin: 0 0 1.75rem;
	font-size: clamp(1.0625rem, 1.9vw, 1.25rem);
	line-height: 1.55;
	color: rgba(255, 255, 255, .82);
	max-width: 48ch;
}

.mitode-btnrow { display: flex; flex-wrap: wrap; gap: .75rem; }

.mitode-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: .5rem;
	padding: .95rem 1.9rem;
	border-radius: var(--mitode-radius-pill);
	font-weight: 700;
	font-size: 1rem;
	line-height: 1.2;
	text-decoration: none;
	border: 2px solid transparent;
	cursor: pointer;
	transition: background .18s var(--mitode-ease), color .18s var(--mitode-ease), border-color .18s var(--mitode-ease), transform .18s var(--mitode-ease);
}
.mitode-btn:hover { transform: translateY(-1px); }

.mitode-btn--primary { background: var(--wp--preset--color--accent); color: #fff; }
.mitode-btn--primary:hover { background: var(--wp--preset--color--accent-dark); color: #fff; }

.mitode-btn--ghost { background: transparent; color: #fff; border-color: rgba(255, 255, 255, .45); }
.mitode-btn--ghost:hover { border-color: #fff; background: rgba(255, 255, 255, .1); color: #fff; }

.mitode-btn--dark { background: var(--wp--preset--color--contrast); color: #fff; }
.mitode-btn--dark:hover { background: #000; color: #fff; }

.mitode-hero__aside {
	display: grid;
	gap: .75rem;
}
.mitode-hero__stat {
	background: rgba(255, 255, 255, .07);
	border: 1px solid rgba(255, 255, 255, .12);
	border-radius: var(--mitode-radius-lg);
	padding: 1.1rem 1.25rem;
	backdrop-filter: blur(3px);
}
.mitode-hero__stat b { display: block; font-size: 1.5rem; line-height: 1.1; color: #fff; }
.mitode-hero__stat span { display: block; margin-top: .25rem; font-size: .9375rem; color: rgba(255, 255, 255, .72); }

/* trust strip - W9C: one horizontal track on every viewport (section 16) */

/* item styling lives with the ticker further down (W9F) */

/* red/NIR explainer */

/* .mitode-rednir = W9A markup (kept for existing content); .mitode-light =
   W9D core-block pattern (section 17 adds the block-level rules) */
.mitode-rednir,
.mitode-light { background: var(--wp--preset--color--dark); color: #fff; }
.mitode-rednir .mitode-shell,
.mitode-light .mitode-shell { padding-block: var(--mitode-band); }
.mitode-rednir h2,
.mitode-light h2 { color: #fff; max-width: 22ch; }
.mitode-rednir p,
.mitode-light p { color: rgba(255, 255, 255, .78); }

/*
 * W9E - the four wavelength facts read as one editorial band divided by
 * hairlines, not as four bordered cards. The boxed version was the generic
 * "heading + four identical cards" shape, and its rgba(255,255,255,.04)
 * fill was invisible on the dark band anyway.
 */
.mitode-wave {
	display: grid;
	column-gap: clamp(1.5rem, 3vw, 2.75rem);
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
	margin-top: clamp(2rem, 4vw, 3rem);
	border-block-start: 1px solid rgba(255, 255, 255, .16);
}
.mitode-wave__card {
	border: 0;
	border-block-end: 1px solid rgba(255, 255, 255, .16);
	border-radius: 0;
	padding: clamp(1.25rem, 2.4vw, 1.75rem) 0;
	background: none;
}
.mitode-wave__card b { display: block; color: var(--wp--preset--color--accent); font-size: 1.25rem; }
.mitode-wave__card strong { display: block; margin: .35rem 0 .3rem; color: #fff; font-size: 1rem; }
.mitode-wave__card span { font-size: .875rem; color: rgba(255, 255, 255, .72); line-height: 1.45; }

/* =====================================================================
 * W70 - THE BRAND / TRUST BAND ("Warum Mitochondriak®?")
 *
 * Same dark ground and the same vertical rhythm as .mitode-light, which it
 * replaces on the home page - the band system is not forked for one
 * section. What is new is the split: a real customer quote on the left, the
 * four claims on the right.
 *
 * The 45/55 split is expressed on the CORE columns block, so the stack on a
 * phone is core's own (below 782px) and this file does not re-implement a
 * breakpoint core already owns. Everything below is colour and type.
 * ================================================================== */

.mitode-trust-brand {
	background: var(--wp--preset--color--dark);
	color: #fff;
}
.mitode-trust-brand .mitode-shell { padding-block: var(--mitode-band); }
.mitode-trust-brand .mitode-eyebrow { color: var(--wp--preset--color--accent); }
.mitode-trust-brand h2,
.mitode-trust-brand .mitode-trust-brand__title {
	color: #fff;
	margin: 0 0 clamp(1.25rem, 2.4vw, 1.75rem);
	/*
	 * 24ch, not the 18ch the sibling bands use. "Warum Mitochondriak®?" is
	 * 21 characters, so 18ch broke a four-word heading across two lines with
	 * a single word on the first - measured at 1440, where the column is
	 * ~650px and had room for all of it. A measure is for paragraphs; this
	 * heading is short enough to just fit.
	 */
	max-width: 24ch;
}

/*
 * W9E - the grid gap between the two halves. `.mitode-about__split` sets the
 * same value; both are the content gutter, not a section gap.
 */
.mitode-trust-brand__grid { gap: clamp(2rem, 5vw, 4rem); }

/* ---- left: the quote ------------------------------------------------ */

.mitode-trust-brand__review {
	margin: 0;
	padding: 0;
	/*
	 * A left hairline rather than a card. A bordered white box on a black
	 * band is the generic testimonial shape; this band already carries the
	 * brand's own editorial language (see .mitode-wave above, which dropped
	 * its boxes for exactly this reason).
	 */
	border-inline-start: 3px solid var(--wp--preset--color--accent);
	padding-inline-start: clamp(1.25rem, 2.5vw, 2rem);
}
.mitode-trust-brand__review .mitode-stars,
.mitode-trust-brand__review .mitode-review__stars { margin-bottom: .85rem; }

.mitode-trust-brand__quote { margin: 0; padding: 0; border: 0; font-style: normal; }
.mitode-trust-brand__quote p {
	margin: 0;
	color: #fff;
	/*
	 * W72-C - 20 % smaller than W71-B's 1.8vw / 1.5rem on the desktop
	 * widths, on the owner's instruction, and scaled at all three ends for
	 * the same reason as the hero headline above.
	 *
	 *   1440px  max 1.2rem   = 19.2px   (was 24.0px, -20 %)
	 *   1280px  1.45vw       = 18.6px   (was 23.0px, -19 %)
	 *    834px  floor        = 17.0px   (was 18.0px, -6 %)
	 *    390px  floor        = 17.0px   (was 18.0px, -6 %)
	 *
	 * The floor moves by six per cent and not by twenty on purpose: at
	 * 390px this paragraph is already at its smallest readable size, the
	 * owner's instruction names the desktop, and "mobile per the real
	 * measurement" is what the phone column measures at.
	 *
	 * `max-width: 34ch` is in characters, so the measure shrinks with the
	 * type: same number of lines, same block height in ems, no reflow of
	 * the attribution under it.
	 */
	font-size: clamp(1.0625rem, 1.45vw, 1.2rem);
	font-weight: 500;
	line-height: 1.45;
	/* No decorative quotation marks: the record stores prose, not a slogan. */
	max-width: 34ch;
}

/*
 * W71-B.1 - the attribution is the same shape as the category tile's, because
 * it quotes the same record: a round portrait beside a name-over-occupation
 * column. The circle size is the one difference, and it is deliberate - this
 * band is a half-width editorial column, not a 260px card.
 */
.mitode-trust-brand__author {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: .35rem .85rem;
	margin-top: 1.1rem;
	font-size: .9375rem;
}

.mitode-trust-brand__portrait {
	flex: 0 0 auto;
	display: block;
	width: 54px;
	height: 54px;
	border-radius: 999px;
	overflow: hidden;
	background: rgba(255, 255, 255, .1);
}

.mitode-trust-brand__who {
	display: flex;
	flex-direction: column;
	min-width: 0;
	gap: .1rem;
	line-height: 1.35;
}
.mitode-trust-brand__name { color: #fff; font-weight: 700; }
.mitode-trust-brand__role { color: rgba(255, 255, 255, .8); font-size: .8125rem; }
.mitode-trust-brand__note { color: rgba(255, 255, 255, .62); font-size: .8125rem; }
.mitode-trust-brand__all {
	color: rgba(255, 255, 255, .78);
	text-decoration: underline;
	text-underline-offset: 3px;
}
.mitode-trust-brand__all:hover,
.mitode-trust-brand__all:focus-visible { color: #fff; }

/* ---- W72-C: one space, several people -------------------------------
 *
 * THE STAGE IS A ONE-CELL GRID AND THAT IS THE WHOLE MECHANISM.
 *
 * Every testimonial is placed in row 1 / column 1, so the stage is as tall
 * as the TALLEST of them from the first paint and never changes height -
 * whichever one is showing, at any width. Nothing moves when the rotation
 * happens, so there is no layout shift to measure and the four brand claims
 * in the column beside it do not twitch.
 *
 * `position:absolute` would have been the other way to stack them and is the
 * wrong one here: an absolutely positioned slide is out of flow, the stage
 * would collapse to nothing, and the band's height would have to be guessed
 * in pixels - which is a number that is wrong at the first long review.
 *
 * The inactive slide keeps its box and loses its VISIBILITY. `display:none`
 * would remove its height and take the guarantee above with it.
 * `visibility:hidden` also makes its contents unfocusable, which is the
 * belt to assets/js/testimonial-rotate.js's `inert` braces.
 */
.mitode-trust-brand__stage { display: grid; }
.mitode-trust-brand__slide {
	grid-area: 1 / 1;
	visibility: hidden;
	opacity: 0;
	transition: opacity .5s var(--mitode-ease, ease), visibility 0s linear .5s;
}
.mitode-trust-brand__slide.is-active {
	visibility: visible;
	opacity: 1;
	transition: opacity .5s var(--mitode-ease, ease), visibility 0s linear 0s;
}

/*
 * The dots are printed by PHP and hidden until the script says it is driving
 * them - the same contract as the hero carousel. A control that does nothing
 * is worse than no control.
 */
.mitode-trust-brand__dots { display: none; }
.mitode-trust-brand__rotator.is-ready .mitode-trust-brand__dots {
	display: flex;
	gap: .5rem;
	align-items: center;
	margin-top: 1.1rem;
	/* Line the dots up with the quote, not with the accent hairline. */
	padding-inline-start: calc(3px + clamp(1.25rem, 2.5vw, 2rem));
}
.mitode-trust-brand__dot {
	appearance: none;
	background: none;
	border: 0;
	padding: 0;
	cursor: pointer;
	/* 40px of target around an 8px mark - the theme's standing minimum. */
	min-width: 40px;
	min-height: 40px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}
.mitode-trust-brand__dot::before {
	content: "";
	display: block;
	width: 8px;
	height: 8px;
	border-radius: 999px;
	background: rgba(255, 255, 255, .38);
	transition: width .2s var(--mitode-ease, ease), background .2s var(--mitode-ease, ease);
}
.mitode-trust-brand__dot:hover::before { background: rgba(255, 255, 255, .8); }
.mitode-trust-brand__dot.is-active::before { width: 22px; background: var(--wp--preset--color--accent); }
.mitode-trust-brand__dot:focus-visible { outline: 3px solid #fff; outline-offset: -8px; border-radius: 999px; }

/*
 * Reduced motion: the script never starts the timer, and the crossfade goes
 * too. The dots keep working, so the second testimonial is still reachable -
 * a motion preference must not cost a reader content.
 */
@media (prefers-reduced-motion: reduce) {
	.mitode-trust-brand__slide,
	.mitode-trust-brand__slide.is-active,
	.mitode-trust-brand__dot::before { transition: none; }
}

/* ---- right: the claims ---------------------------------------------- */

.mitode-trust-brand__claims {
	list-style: none;
	margin: 0;
	padding: 0;
	border-block-start: 1px solid rgba(255, 255, 255, .16);
}
.mitode-trust-brand__claim {
	position: relative;
	margin: 0;
	padding: clamp(.85rem, 1.6vw, 1.1rem) 0 clamp(.85rem, 1.6vw, 1.1rem) 2rem;
	border-block-end: 1px solid rgba(255, 255, 255, .16);
	color: rgba(255, 255, 255, .86);
	font-size: clamp(1rem, 1.2vw, 1.0625rem);
	line-height: 1.45;
}
/*
 * The tick is a masked SVG on the marker, the same technique and the same
 * geometry as .mitode-pdp__excerpt li::before - one check mark in this
 * theme, drawn one way, needing no icon font and no inline markup an editor
 * could break.
 */
.mitode-trust-brand__claim::before {
	content: "";
	position: absolute;
	left: 0;
	top: 50%;
	transform: translateY(-50%);
	width: 1.125rem;
	height: 1.125rem;
	background: var(--wp--preset--color--accent);
	-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round' d='M5 12.5 10 17.5 19 7'/%3E%3C/svg%3E") center / contain no-repeat;
	mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round' d='M5 12.5 10 17.5 19 7'/%3E%3C/svg%3E") center / contain no-repeat;
}

.mitode-trust-brand__actions { margin-top: clamp(1.5rem, 3vw, 2rem); }
.mitode-trust-brand__actions .wp-block-button__link { border-radius: var(--mitode-radius-pill, 999px); }
.mitode-trust-brand__actions .is-style-outline .wp-block-button__link {
	color: #fff;
	border-color: rgba(255, 255, 255, .55);
}
.mitode-trust-brand__actions .is-style-outline .wp-block-button__link:hover,
.mitode-trust-brand__actions .is-style-outline .wp-block-button__link:focus-visible {
	background: #fff;
	color: var(--wp--preset--color--dark);
	border-color: #fff;
}

/*
 * On a phone the quote leads and the claims follow; core stacks the columns
 * already, so the only thing left is to stop the quote's hairline from
 * hugging the screen edge and to let it use the full measure.
 */
@media (max-width: 781px) {
	.mitode-trust-brand__quote p { max-width: none; }
	.mitode-trust-brand__title { max-width: none; }
	.mitode-trust-brand__grid > .wp-block-column:first-child { margin-bottom: clamp(2rem, 6vw, 3rem); }
}

/* brand / education cards */

.mitode-cards {
	display: grid;
	gap: 1.25rem;
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr));
}
.mitode-card {
	display: flex;
	flex-direction: column;
	gap: .55rem;
	padding: 1.5rem;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	transition: box-shadow .2s var(--mitode-ease), transform .2s var(--mitode-ease), border-color .2s var(--mitode-ease);
}
.mitode-card:hover { box-shadow: var(--wp--preset--shadow--card); transform: translateY(-2px); border-color: #c9cdd6; }
.mitode-card h3 { margin: 0; font-size: 1.125rem; }
.mitode-card p { margin: 0; font-size: .9375rem; color: var(--wp--preset--color--contrast-2); line-height: 1.5; }
.mitode-card__link {
	margin-top: auto;
	padding-top: .5rem;
	font-weight: 700;
	font-size: .9375rem;
	color: var(--wp--preset--color--accent);
	text-decoration: none;
}
.mitode-card__link:hover { text-decoration: underline; }
.mitode-card--dark { background: var(--wp--preset--color--dark); border-color: transparent; }
.mitode-card--dark h3 { color: #fff; }
.mitode-card--dark p { color: rgba(255, 255, 255, .72); }

/* ---------------------------------------------------------------------
 * W27.6 - hub tiles (block mitochondriak/wissen-hub)
 *
 * WHY NOT JUST `.mitode-card`. Because there are two of those. The rule
 * block directly above is the original "brand / education card"
 * (padding 1.5rem, its own gap, `.mitode-card__link`) and it is DEAD: the
 * product/post card shell further down redefines `.mitode-card` with
 * `padding: 0` and `overflow: hidden`, so anything using the bare class
 * today gets the product geometry and no padding. Reusing it for the hub
 * would mean either resurrecting a shadowed rule set or adding a modifier
 * that fights the product card - both of which put a knowledge page one
 * careless product-card edit away from breaking.
 *
 * So: a small component of its own, built entirely from the tokens the rest
 * of the design system uses (surface, border, radius-lg, the card shadow,
 * the eyebrow scale) and reusing `.mitode-link-arrow` verbatim for the CTA.
 * Same language, no shared cascade.
 * ------------------------------------------------------------------ */

.mitode-hub {
	list-style: none;
	margin: clamp(2rem, 4vw, 3rem) 0 0;
	padding: 0;
	display: grid;
	gap: clamp(1rem, 2.2vw, 1.5rem);
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
	align-items: stretch;
}
.mitode-hub__card {
	display: flex;
	flex-direction: column;
	gap: .45rem;
	margin: 0;
	padding: clamp(1.25rem, 2.4vw, 1.75rem);
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	transition: box-shadow .2s var(--mitode-ease), transform .2s var(--mitode-ease), border-color .2s var(--mitode-ease);
}
.mitode-hub__card:hover {
	box-shadow: var(--wp--preset--shadow--card);
	transform: translateY(-2px);
	border-color: #c9cdd6;
}
/*
 * The count zone is ONE LINE TALL whether it has a count or not, so a card
 * without one (Produktratgeber has no collection to count) keeps its title
 * on the same line as its neighbours. Same reserved-zone reasoning as the
 * product and post cards, for the same reason.
 *
 * `line-height` and not `min-height`: the first version set
 * `min-height: 1.05rem` on both, and only the one with TEXT in it grew to
 * its line box - 19.2px against the empty pseudo-element's 16.8px, so the
 * zone reserved 2.4px too little and the countless card still sat higher.
 * A fixed line-height makes both boxes exactly one line, full or empty.
 */
.mitode-hub__meta,
.mitode-hub__card::before {
	display: block;
	font-size: var(--mitode-fs-eyebrow);
	line-height: 1.6;
	height: calc(var(--mitode-fs-eyebrow) * 1.6);
	font-weight: 700;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--wp--preset--color--contrast-3);
	overflow: hidden;
}
.mitode-hub__card:not(:has(.mitode-hub__meta))::before { content: ""; }
.mitode-hub__title { margin: 0; font-size: 1.1875rem; line-height: 1.3; }
.mitode-hub__title a { color: var(--wp--preset--color--contrast); text-decoration: none; }
.mitode-hub__title a:hover { text-decoration: underline; }
.mitode-hub__text {
	margin: 0;
	font-size: .9375rem;
	line-height: 1.55;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-hub__more { margin: auto 0 0; padding-top: .65rem; }

/* CTA band */

/*
 * W9E - its own light surface. On the homepage the closing CTA sits
 * between the dark brand band and the dark footer; on pure white the dark
 * CTA card read as a third dark block separated by two thin white strips.
 */
.mitode-cta-band { background: var(--wp--preset--color--surface); }

.mitode-cta {
	background: var(--wp--preset--color--contrast);
	color: #fff;
	border-radius: var(--mitode-radius-lg);
	padding: clamp(1.75rem, 5vw, 3rem);
	display: grid;
	gap: 1.25rem;
	align-items: center;
}
@media (min-width: 900px) { .mitode-cta { grid-template-columns: minmax(0, 1fr) auto; } }
.mitode-cta h2 { color: #fff; margin: 0 0 .5rem; font-size: clamp(1.5rem, 3.2vw, 2rem); }
.mitode-cta p { margin: 0; color: rgba(255, 255, 255, .78); max-width: 60ch; }

/* ---------------------------------------------------------------------
 * 7. product cards / grids
 * ------------------------------------------------------------------ */

/*
 * ONE card system, two markup sources.
 *
 *   .mitode-card        - rendered by mitode_render_cards() for every loop
 *                         the theme controls: homepage grid, related
 *                         products, upsells, cross-sells.
 *   li.wc-block-product - rendered by WooCommerce's Product Collection
 *                         block on archives, where pagination and sorting
 *                         have to keep working.
 *
 * Both emit the same zone sequence - media, title, availability, price,
 * button - so the rules below are written once against both selectors.
 * The zones have reserved heights rather than relying on `margin-top:auto`,
 * because auto margins only align the button, not the price or the stock
 * line above it. That was the "roztečené CTA" symptom in W9A: cards with a
 * two-line title pushed price and availability down while cards with a
 * one-line title left a ragged gap.
 *
 * Zone heights (W9A.1 audit section 4.1 - the source storefront reserves
 * the previous-price row the same way, with an empty
 * `.price-standard-wrapper` element):
 */
:root {
	--mitode-card-title-h: 2.7rem;   /* 2 lines at 1rem / 1.35   */
	--mitode-card-avail-h: 1.15rem;  /* 1 line at .8125rem / 1.4 */
	--mitode-card-price-h: 3.1rem;   /* struck-through row + final price */
	--mitode-card-pad: 1rem;
	--mitode-card-ratio: 3 / 4;
}

/* ---- grid ------------------------------------------------------------ */

.mitode-cards,
.wc-block-product-template,
.wc-block-product-template__responsive.columns-2,
.wc-block-product-template__responsive.columns-3,
.wc-block-product-template__responsive.columns-4,
.wc-block-product-template.is-flex-container {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: clamp(1rem, 2.2vw, 1.75rem);
	grid-template-columns: repeat(2, minmax(0, 1fr));
	align-items: stretch;
}

@media (min-width: 782px) {
	.mitode-cards--3,
	.mitode-cards--4,
	.wc-block-product-template,
	.wc-block-product-template__responsive.columns-3,
	.wc-block-product-template__responsive.columns-4,
	.wc-block-product-template.is-flex-container { grid-template-columns: repeat(3, minmax(0, 1fr)); }
	.wc-block-product-template__responsive.columns-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 1180px) {
	.mitode-cards--4,
	.wc-block-product-template,
	.wc-block-product-template__responsive.columns-4,
	.wc-block-product-template.is-flex-container { grid-template-columns: repeat(4, minmax(0, 1fr)); }
	.mitode-cards--3,
	.wc-block-product-template__responsive.columns-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/*
 * Woo's own Product Collection stylesheet is printed inline after this file
 * and sets `display:flex` + per-item percentage widths. Those widths fight
 * the grid, so the items are reset back to auto width here rather than the
 * grid being reimplemented as flex.
 */
.wc-block-product-template.is-flex-container > li.wc-block-product,
.wc-block-product-template__responsive > li.wc-block-product { width: auto; max-width: none; }

/*
 * `[related_products]` used to wrap its list in `<section class="related
 * products">`. Because the grid rule above also matched `.products`, the
 * *section* became a four-column grid: the <h2> took column 1 and the whole
 * list was squeezed into column 2, which is what produced the ultra-narrow
 * vertical strips on the PDP. The theme no longer renders that markup, but
 * WooCommerce core templates (cart cross-sells) still can, so the wrapper is
 * explicitly neutralised.
 */
section.related.products,
section.up-sells.products,
section.cross-sells.products,
.wc-block-cart__cross-sells,
div.woocommerce > .related.products {
	display: block;
	width: 100%;
	max-width: none;
	float: none;
}

/* ---- card shell ------------------------------------------------------ */

.mitode-card,
.wc-block-product-template > li.wc-block-product {
	position: relative;
	display: flex;
	flex-direction: column;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	overflow: hidden;
	margin: 0;
	padding: 0;
	height: 100%;
	min-width: 0;
	text-align: left;
	transition: box-shadow .2s var(--mitode-ease), transform .2s var(--mitode-ease), border-color .2s var(--mitode-ease);
}

.mitode-card:hover,
.wc-block-product-template > li.wc-block-product:hover {
	box-shadow: var(--wp--preset--shadow--card);
	transform: translateY(-2px);
	border-color: #c9cdd6;
}

/* ---- zone 1: media --------------------------------------------------- */

/*
 * W66-B - THE MEDIA BOX. The photograph is exactly this box, never larger.
 *
 * W66-A drew framed packshots at up to 177 % of the card width with
 * `max-width: none`, positioned by three custom properties, so that the
 * product would land at a constant 0.88 of one axis. Every probe in this
 * repository agreed it worked and the owner, after a hard reload, still saw
 * a magnified corner - or, where that corner was studio white, an empty
 * card. All of it is gone: no scale, no offset, no transform, no width over
 * 100 %, no `max-width: none`, and nothing left that reads a custom
 * property to decide how big an image is. See inc/card-media.php.
 */
.mitode-card__media,
.wc-block-components-product-image,
.wp-block-woocommerce-product-image {
	position: relative;
	display: block;
	/*
	 * A hard clip on the box. Nothing in this stylesheet can now draw an
	 * image past the media box, and after W66-A that guarantee is worth a
	 * declaration of its own: this rule is what makes "the shopper cannot
	 * be shown a magnified corner" a property of the CARD rather than a
	 * property of every rule that might ever touch the image.
	 */
	overflow: hidden;
	margin: 0 0 .85rem;
	background: var(--wp--preset--color--surface);
}

/*
 * THE FIVE DECLARATIONS THAT MAKE THE IMAGE THE BOX.
 *
 * `height: 100%` and `max-height: 100%` are belt to the `aspect-ratio`
 * braces. The media wrapper has no definite height of its own, so a
 * percentage height resolves to `auto` and the ratio is what actually sizes
 * the box today - exactly as it did before W66-A. But if any future rule,
 * or any grid track, ever does give an ancestor a definite height, these
 * two clamp the image to it instead of letting it grow. The pair costs
 * nothing and closes the failure mode by construction rather than by
 * measurement.
 *
 * `object-position: center center` is spelled in full because the lane
 * below only changes `object-fit`; where the picture sits inside the box is
 * the same answer for both lanes and is stated once, here.
 */
.mitode-card__img,
.wc-block-components-product-image img,
.wp-block-woocommerce-product-image img {
	display: block;
	width: 100%;
	height: 100%;
	max-width: 100%;
	max-height: 100%;
	aspect-ratio: var(--mitode-card-ratio);
	object-fit: cover;
	object-position: center center;
	margin: 0;
	border-radius: 0;
	background: var(--wp--preset--color--surface);
}

/*
 * ---- the packshot lane ------------------------------------------------
 *
 * `object-fit: contain` and nothing else. Contain can only ever make the
 * picture SMALLER than the box, which is the property that makes this lane
 * safe: there is no arithmetic that can go wrong, no property that can fail
 * to arrive, and no state in which the shopper sees part of a product.
 * inc/card-media.php decides the lane from the photograph's own border and
 * stores it in attachment meta; no product id appears here or there.
 *
 * WHY THE PADDING IS 6 % AND NOT 8 %.
 *
 * It is breathing room, not framing - the old 8 % existed to soften a
 * letterboxed landscape photo, and the shrink it caused is now paid by
 * fifteen cards instead of two. 6 % of a 287 px card is 17 px a side, which
 * is enough to keep a black stand off a white card edge and little enough
 * that a portrait packshot still fills 88 % of the box.
 *
 * `border-box` is load-bearing: with `content-box` the padding would be
 * ADDED to the `aspect-ratio` box and the packshot cards would stand 46 px
 * taller than their neighbours, which is the "roztečené" product row of
 * W9N.1. `!important` is the only way a stylesheet outranks the
 * `style="object-fit:cover"` WooCommerce prints on the img itself.
 */
.mitode-card__media--contain .mitode-card__img:not(.mitode-card__img--alt),
.wc-block-components-product-image.wc-block-components-product-image--contain img:not(.mitode-card__img--alt) {
	box-sizing: border-box;
	object-fit: contain !important;
	padding: 6%;
	background: #fff;
}

/*
 * THE DOUBLED CLASS IS LEVERAGE, NOT A TYPO.
 *
 * `.wc-block-components-product-image--contain img` would be (0,1,1) - and
 * so is `.wc-block-grid__product-image img` in section 8, which declares
 * `object-fit: cover` and is printed 1200 lines LATER. On a tie the later
 * declaration wins, so the lane would silently revert on exactly the pages
 * that use Woo's grid markup. Repeating the base class settles it at
 * (0,2,1). This trap is written up three times in this file already; the
 * `!important` above would have masked it here, which is worse than losing
 * to it - it would have hidden the same bug from the next rule.
 *
 * `:not(.mitode-card__img--alt)` keeps the hover image out. The hover image
 * is a different photograph and gets its own lane, from its own attachment
 * meta - see the W9C block in section 12.
 */

/* ---- zone 2-4: body -------------------------------------------------- */

.mitode-card__body {
	display: flex;
	flex-direction: column;
	padding-inline: var(--mitode-card-pad);
}

.wc-block-product-template > li.wc-block-product > *:not(.wc-block-components-product-image):not(.wp-block-woocommerce-product-image) {
	padding-inline: var(--mitode-card-pad);
	/*
	 * W9N.3 - the button zone measured 319 px inside a 289 px card: these
	 * zones default to content-box, so `width:100%` on the CTA wrapper ADDED
	 * the 2x16 px padding and the pill ran 15 px past the card's right edge,
	 * where the li's overflow:hidden clipped it - a button with a left
	 * margin and a cut right corner, at every width. That is the "In den
	 * Warenkorb" defect the owner kept seeing while the row probes, which
	 * compare only button-to-button offsets, kept reporting 0 px.
	 */
	box-sizing: border-box;
}
:where(.wc-block-product-template .wc-block-product) > :not(:last-child) { margin-bottom: 0; }

/*
 * title - exactly two lines tall on every card.
 *
 * `min-height` reserves the second line for short titles; the clamp caps
 * long ones. Both halves are needed: without the clamp a three-line title
 * pushes the stock line, price and button of that one card out of the row's
 * rhythm, which is the ragged look this stage set out to remove.
 *
 * `display` and `overflow` carry !important because WordPress prints the
 * block-library and theme.json rules for .wp-block-post-title after this
 * stylesheet.
 */
.mitode-card__title,
/*
 * W58 - `:is(h2, h3)` AND NOT `h3`, AND THE REASON IS SPECIFICITY.
 *
 * The card title used to be an H3 sitting directly under the page's H1, so
 * every category archive and /shop/ published an outline that skipped a
 * level - measured on 58 routes, flagged on five. The templates now emit
 * level 2 (templates/taxonomy-product_cat.html and two others).
 *
 * The tag in these selectors is NOT decoration: the second half of each
 * pair exists to beat block-library's own rule, and `h3.wp-block-post-title`
 * (0,1,1) is what won that fight. Changing the markup to H2 without
 * changing the selector would have left the card typography to whichever
 * stylesheet loaded last - the W53/W9E failure mode exactly. `:is(h2, h3)`
 * takes the specificity of its heaviest argument, an element, so the pair
 * still scores 0,1,1 and the rule keeps winning at either level.
 */
.wc-block-product-template .wp-block-post-title,
.wc-block-product-template :is(h2, h3).wp-block-post-title {
	display: -webkit-box !important;
	-webkit-line-clamp: 2;
	line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden !important;
	min-height: var(--mitode-card-title-h);
	max-height: var(--mitode-card-title-h);
	font-size: 1rem !important;
	font-weight: 500;
	line-height: 1.35 !important;
	margin: 0 0 .35rem !important;
	padding-top: 0;
	text-align: left !important;
	/*
	 * German product names are long compounds. Without hyphenation, `body`'s
	 * overflow-wrap:break-word splits them at an arbitrary character in a
	 * two-column mobile grid ("Laser/Taschenlam | pe"). The document is
	 * de-DE, so the browser can break them at real syllable boundaries.
	 */
	hyphens: auto;
}

/*
 * Two card columns on a phone leave roughly 20 characters per line, where a
 * two-line cap truncates most of these names. The zone grows to three lines
 * there - still a fixed height, so the cards stay aligned with each other.
 */
@media (max-width: 600px) {
	:root { --mitode-card-title-h: 4.05rem; }
	.mitode-card__title,
	.wc-block-product-template .wp-block-post-title,
	.wc-block-product-template :is(h2, h3).wp-block-post-title {
		-webkit-line-clamp: 3;
		line-clamp: 3;
	}
}
.mitode-card__title a,
.wc-block-product-template .wp-block-post-title a {
	color: var(--wp--preset--color--contrast);
	text-decoration: none;
}
.mitode-card__title a:hover,
.wc-block-product-template .wp-block-post-title a:hover { color: var(--wp--preset--color--accent); }

/* availability - always rendered, always the same height */
.mitode-card .mitode-avail,
.wc-block-product-template .mitode-avail,
.wc-block-components-product-stock-indicator {
	min-height: var(--mitode-card-avail-h);
	margin: 0 0 .35rem !important;
	font-size: .8125rem !important;
	font-weight: 500;
	line-height: 1.4;
	text-align: left !important;
}
.mitode-avail--in, .wc-block-components-product-stock-indicator--in-stock { color: var(--wp--preset--color--success); }
.mitode-avail--back { color: #b06a00; }
.mitode-avail--out, .wc-block-components-product-stock-indicator--out-of-stock { color: var(--wp--preset--color--contrast-3); }

/*
 * price - two explicit rows, the upper one reserved.
 *
 * `.mitode-card__price` is authored by mitode_card_price() and always has a
 * previous-price row, empty when the product is not discounted, so the
 * current price lands on the same baseline in every card of a row.
 *
 * The block Product Collection on archives renders its own price markup, so
 * there the same effect is produced by a fixed zone height with the content
 * bottom-aligned. Both end up on the same grid.
 */
.mitode-card__price {
	display: block;
	margin: 0 0 .9rem;
	padding-top: 0;
	text-align: left;
	line-height: 1.25;
}
.mitode-card__was {
	display: block;
	min-height: 1.15rem;
	font-size: .8125rem;
	font-weight: 400;
	line-height: 1.4;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-card__was del {
	text-decoration: line-through;
	color: inherit;
	opacity: 1;
}
.mitode-card__now {
	display: block;
	font-size: 1.25rem;
	font-weight: 700;
	line-height: 1.3;
	color: var(--wp--preset--color--contrast);
}
.mitode-card:has(.mitode-card__was del) .mitode-card__now { color: var(--wp--preset--color--accent); }

.wc-block-product-template .wp-block-woocommerce-product-price,
.wp-block-woocommerce-product-price {
	display: flex !important;
	flex-direction: column;
	align-items: flex-start;
	justify-content: flex-end;
	min-height: var(--mitode-card-price-h);
	gap: .1rem;
	margin: 0 0 .9rem !important;
	padding-top: 0;
	text-align: left !important;
	font-size: 1.25rem;
	font-weight: 700;
	line-height: 1.25;
	color: var(--wp--preset--color--contrast);
}
.wc-block-product-template .wc-block-components-product-price {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	justify-content: flex-end;
	width: 100%;
	gap: .1rem;
}

/*
 * Assistive-only text must never take a slot in these flex columns - Woo
 * emits two such spans inside a sale price. Core defines the class, but the
 * price zones restate it so that a missing core stylesheet cannot turn them
 * into visible rows.
 */
/*
 * W48 - `.screen-reader-text`, FOR THE WHOLE THEME.
 *
 * The rule below was scoped to price components, so every other use of
 * the class in this theme - the header search label, the press-strip link
 * label, the sticky search label - depended on a plugin stylesheet
 * happening to define it. When one of those definitions is
 * `position: absolute` with no offsets and the element sits inside a
 * horizontally scrolled rail, the box escapes the rail's clipping and
 * stretches the document; that is exactly what happened on the home page
 * this stage, and it cost 1276px of sideways scroll.
 *
 * `clip-path: inset(50%)` rather than the old `clip: rect(...)`: it is the
 * current technique, it keeps the text readable by assistive technology,
 * and `position: absolute` here is safe because the element is 1px and
 * `overflow: hidden` - it can extend nothing.
 */
.screen-reader-text {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	white-space: nowrap;
	clip-path: inset(50%);
	border: 0;
	word-wrap: normal !important;
}

.mitode-card__price .screen-reader-text,
.wc-block-components-product-price .screen-reader-text,
.wp-block-woocommerce-product-price .screen-reader-text {
	position: absolute !important;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	white-space: nowrap;
	clip-path: inset(50%);
	border: 0;
}

.wc-block-components-product-price del,
.wp-block-woocommerce-product-price del {
	order: 0;
	font-size: .8125rem;
	font-weight: 400;
	line-height: 1.3;
	color: var(--wp--preset--color--contrast-3);
	opacity: 1;
	text-decoration: line-through;
}
.wc-block-components-product-price ins,
.wp-block-woocommerce-product-price ins {
	order: 1;
	background: none;
	text-decoration: none;
	color: var(--wp--preset--color--accent);
	font-weight: 700;
}
.wc-block-components-product-price__value.is-discounted { color: var(--wp--preset--color--accent); }

/* ---- zone 5: CTA ----------------------------------------------------- */

.mitode-card__cta {
	margin-top: auto;
	padding: 0 var(--mitode-card-pad) var(--mitode-card-pad);
}

.mitode-card__cta .button,
.mitode-card__cta a,
.wc-block-product-template .wc-block-components-product-button .wp-block-button__link,
.wc-block-product-template .wp-block-button__link,
.wp-block-woocommerce-product-button .wp-block-button__link {
	display: block;
	width: 100%;
	margin: 0;
	padding: .8rem 1rem;
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--contrast);
	color: #fff;
	font-size: .9375rem;
	font-weight: 700;
	line-height: 1.3;
	text-align: center;
	text-decoration: none;
	border: 0;
	cursor: pointer;
	transition: background .18s var(--mitode-ease);
}
.mitode-card__cta .button:hover,
.wc-block-product-template .wp-block-button__link:hover,
.wp-block-woocommerce-product-button .wp-block-button__link:hover { background: var(--wp--preset--color--accent); color: #fff; }

.wp-block-woocommerce-product-button,
.wc-block-product-template .wc-block-components-product-button {
	margin-top: auto !important;
	width: 100%;
	display: block;
	padding-bottom: var(--mitode-card-pad);
}
.wc-block-product-template .wc-block-components-product-button.align-center { text-align: left; }

/*
 * W51 - the cart glyph inside the card button.
 *
 * The button rule above is `display: block` with `text-align: center`, so
 * the icon and the label are inline siblings and centre together without
 * turning the button into a flex container - which would have changed the
 * layout of every Woo Blocks button that shares that selector list.
 */
.mitode-card__button-icon {
	width: 1.15em;
	height: 1.15em;
	margin-right: .5em;
	vertical-align: -.22em;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.8;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.mitode-card__button-icon circle { fill: currentColor; stroke: none; }

/* Woo appends a "View cart" link after an AJAX add; it breaks the CTA zone. */
.mitode-card .added_to_cart,
.wc-block-product-template .added_to_cart { display: none; }

/* ---- W9N.3: structural row alignment (subgrid) ----------------------- */

/*
 * The zones above align cards by RESERVING heights (title clamp, avail
 * min-height, price min-height). That holds - it measured 0 px spread across
 * 88 width/page combinations - but it is still guessed geometry: every new
 * kind of content needs a new reserved height, and titles have to be
 * truncated to fit the reservation ("...pulse (Geschenk:" on the reference
 * category).
 *
 * Where the browser supports subgrid (every evergreen browser since 2023),
 * the alignment becomes structural instead: each card spans five shared
 * rows - image / title / stock / price / CTA - and every row track is sized
 * by the tallest card in that row. CTA top and bottom edges line up by
 * construction, a three-line title just makes the title track taller for
 * the whole row, and no text needs cutting. The reserved-height model above
 * stays as the fallback for anything older.
 */
@supports (grid-template-rows: subgrid) {
	.wc-block-product-template {
		row-gap: 0;
		column-gap: clamp(1rem, 2.2vw, 1.75rem);
	}

	/*
	 * W53 - SIX ROWS, AND EACH CHILD IS TOLD WHICH ONE.
	 *
	 * This said `span 5` and let the six children auto-place. W27.10 had
	 * added the rating row as a sixth child and nobody raised the span, so
	 * on every archive above 600px the last two children shared the last
	 * track: measured on /produkt-kategorie/rotlicht-nir-geraete/ at 1440,
	 * `.mitode-prating-row` occupied 542.02-597.8 and the add-to-cart
	 * button occupied 538.02-597.8 - the button was painted ON TOP of the
	 * stars. The owner reported it as "stars on the home page, no stars in
	 * the category", which is exactly what it looks like: the home rail is
	 * a flex card and was never affected.
	 *
	 * Explicit rows rather than a bigger span, because AUTO-PLACEMENT
	 * CANNOT ALIGN THESE CARDS. Five published products have no reviews,
	 * so their card has five children, not six - with auto-placement their
	 * button would land in row 5 while a rated card put it in row 6, and
	 * the row of buttons would be ragged. Naming the row makes the empty
	 * rating track collapse to nothing on those cards and leaves every
	 * button on one baseline.
	 */
	.wc-block-product-template > li.wc-block-product {
		display: grid;
		grid-template-rows: subgrid;
		grid-row: span 6;
		row-gap: 0;
		/* row rhythm: auto tracks size to the margin box, so this becomes
		   the space between card rows now that the outer row-gap is 0 */
		margin-bottom: clamp(1rem, 2.2vw, 1.75rem);
	}
	.wc-block-product-template > li.wc-block-product > .wc-block-components-product-image,
	.wc-block-product-template > li.wc-block-product > .wp-block-woocommerce-product-image { grid-row: 1; }
	.wc-block-product-template > li.wc-block-product > .wp-block-post-title { grid-row: 2; }
	.wc-block-product-template > li.wc-block-product > .mitode-avail,
	.wc-block-product-template > li.wc-block-product > .wc-block-components-product-stock-indicator { grid-row: 3; }
	.wc-block-product-template > li.wc-block-product > .wp-block-woocommerce-product-price { grid-row: 4; }
	.wc-block-product-template > li.wc-block-product > .mitode-prating-row { grid-row: 5; }
	.wc-block-product-template > li.wc-block-product > .wp-block-woocommerce-product-button { grid-row: 6; }

	/*
	 * The promo tile must be a subgrid TOO, not a plain spanning item. A
	 * subgrid item's bottom margin is absorbed into the edge track, while a
	 * plain item stretches over the full track area - measured 28 px of
	 * extra tile height at 1440 when the tile merely spanned. Identical
	 * layout model = identical geometry, by construction.
	 */
	.wc-block-product-template > li.product-category-page_product-banner {
		display: grid;
		grid-template-rows: subgrid;
		/* span 6, in step with the product card above - a promo tile that
		   spans a different number of rows is a promo tile of a different
		   height, which is the defect this rule exists to prevent. */
		grid-row: span 6;
		row-gap: 0;
		margin-bottom: clamp(1rem, 2.2vw, 1.75rem);
	}
	/* W53 - the testimonial tile is the same kind of item and needs the
	   same span, or it sizes one row while the cards beside it size six. */
	.wc-block-product-template > li.mitode-testimonial-card {
		display: grid;
		grid-template-rows: subgrid;
		grid-row: span 6;
		row-gap: 0;
		margin-bottom: clamp(1rem, 2.2vw, 1.75rem);
	}
	.wc-block-product-template > li.mitode-testimonial-card > .mitode-testimonial-card__inner {
		grid-row: 1 / -1;
		align-self: stretch;
	}
	.wc-block-product-template > li.product-category-page_product-banner > .product-category-page_product-banner_overlay {
		grid-row: 1 / -1;
		align-self: stretch;
	}

	/* full titles: the reservation is not needed when the track carries it */
	.wc-block-product-template .wp-block-post-title,
	.wc-block-product-template :is(h2, h3).wp-block-post-title {
		display: block !important;
		-webkit-line-clamp: none;
		line-clamp: none;
		min-height: 0;
		max-height: none;
		overflow: visible !important;
	}

	.wc-block-product-template .mitode-avail,
	.wc-block-product-template .wc-block-components-product-stock-indicator { min-height: 0; }
}

/* =====================================================================
   W53 - THE COMPACT MOBILE CARD (non-home listings)
   =====================================================================

   WHAT WAS MEASURED BEFORE THIS BLOCK, on /produkt-kategorie/
   rotlicht-nir-geraete/ at 390 / 360 / 320:

     title            3 lines at 390, 4 lines at 360 and 320, 16px
     "In den Warenkorb"  2 lines, in a 137px-wide pill
     price zone       49.6px tall AND 15px wider than the card it sits in,
                      on all five cards, cut off by the li's overflow:hidden
     at 320           every child 6.75px wider than its own card,
                      52 clipped elements, media boxes of unequal height

   THE ROOT CAUSE OF THE OVERFLOWS IS ONE THING, and it is not padding.
   The card is a SUBGRID (`grid-row: span 5`, the W9N.3 block above), so
   its children are grid items, and a grid item's `min-width` defaults to
   `auto` = its min-content. The price row is a flex row of <del> and
   <ins> that cannot shrink below the two amounts side by side, and the
   button cannot shrink below "Warenkorb" plus its padding - so at narrow
   widths those two pushed the card's single auto column past the width the
   grid had assigned, and `overflow: hidden` swallowed the evidence. That
   is why the row probes kept reporting 0.

   So the compact card is not a restyle of the old one: the li stops being
   a subgrid item and becomes its own five-row grid, and `min-width: 0` is
   stated on every child. The last row is the brief's action row -
   the cart control on the left, the price on the right.

   SCOPE. Archives, search, related, cross-sell, the empty-cart rail. The
   home page carousel is `.mitode-cards--carousel` and appears in none of
   these selectors, so it renders byte-identically to before.
   ================================================================== */

@media (max-width: 600px) {

	.mitode-cards--compact,
	.wc-block-product-template {
		/* the zone tokens the card is built from, restated for the compact
		   context only - the desktop values are untouched */
		/*
		 * W53, owner correction: .625rem measured 10px, so the title and
		 * the stock line sat 11px from the card edge (10 + the 1px
		 * border) against 17px before this stage. It is not zero - it was
		 * measured - but on a 136px card it reads as glued, and the owner
		 * asked for a real left/right gutter back. .875rem is 14px, so
		 * 15px of clear space, and the two rules further down give the
		 * price the room that costs it.
		 *
		 * TWO OWNER PASSES LANDED HERE AND THE SECOND ONE REVERSED THE
		 * FIRST, so the history is worth keeping: the "text glued to the
		 * edge" the owner was reporting was never this value. It was the
		 * PDP cross-sell rail, where the gutter really was 0 because of
		 * the display:contents selector bug fixed below. On the category
		 * archive the gutter measured 11px throughout and the owner
		 * confirmed that surface was fine, so the escalation to 14 and
		 * then 16px is reverted and the compact card keeps the value it
		 * was designed with.
		 */
		--mitode-card-pad: .625rem;
		--mitode-card-title-h: 2.45rem;  /* 2 lines at .875rem / 1.4 */
		--mitode-card-avail-h: 1rem;
		/*
		 * The rating row EXISTS ONLY WHEN A PRODUCT HAS REVIEWS, and five
		 * published products have none (the two Ständer, the filter film
		 * and the two drafts). Measured on the search results: those cards
		 * came out 25.59px shorter than their neighbours, which is the
		 * ragged row the reserved-zone model exists to prevent. The track
		 * is reserved whether the element is there or not - same device as
		 * the availability line above it.
		 */
		--mitode-card-rating-h: 1.6rem;
		gap: .625rem;
	}

	.mitode-cards--compact > li.mitode-card,
	.wc-block-product-template > li.wc-block-product {
		display: grid;
		/*
		 * Out of the parent's subgrid: this card owns its own rows now.
		 * Four of the five are FIXED, which is what makes every card in a
		 * row exactly as tall as every other regardless of what its
		 * product happens to have - a long title, no stock line, no
		 * rating. The media row is `auto` and equal by construction
		 * because the image carries `aspect-ratio: var(--mitode-card-ratio)`.
		 */
		grid-template-rows:
			auto
			var(--mitode-card-title-h)
			var(--mitode-card-avail-h)
			var(--mitode-card-rating-h)
			auto;
		grid-template-columns: auto minmax(0, 1fr);
		grid-row: auto;
		row-gap: 0;
		margin-bottom: 0;
		align-content: start;
		/*
		 * PADDING, NOT A ::after SPACER. The first version reserved the
		 * bottom gutter with `li::after { grid-column: 1/-1; height:
		 * var(--mitode-card-pad) }`, and that pseudo-element is an
		 * auto-placed grid item: on a card WITH a rating it landed in an
		 * implicit sixth row and made the card 10px taller, on a card
		 * WITHOUT one it dropped into the empty rating row and made it
		 * 10px shorter. Measured: 377.7 against 367.7 on the search
		 * results - a reserved-height model defeated by the thing meant
		 * to finish it. Padding is not a grid item and cannot be placed.
		 */
		padding: 0 0 var(--mitode-card-pad);
	}

	/*
	 * THE LINE THAT FIXES THE CLIPPING. Without it a grid item's automatic
	 * minimum size is its min-content, and one long price or one long word
	 * makes the whole card wider than the track it was given.
	 */
	.mitode-cards--compact > li.mitode-card > *,
	.mitode-cards--compact > li.mitode-card > .mitode-card__body > *,
	.wc-block-product-template > li.wc-block-product > * { min-width: 0; }

	/*
	 * THE PROMO TILES LEAVE THE SUBGRID TOO, and this is not optional.
	 * The W9N.3 block gives every tile in this list `grid-row: span 5`
	 * because the product cards were subgrid items with five shared rows.
	 * The compact card above is `grid-row: auto` - one row - so a tile
	 * still asking for five would stand five CARD ROWS tall.
	 */
	.wc-block-product-template > li.product-category-page_product-banner,
	.wc-block-product-template > li.mitode-testimonial-card {
		grid-row: auto;
		grid-template-rows: none;
		margin-bottom: 0;
	}

	/*
	 * THE TESTIMONIAL TAKES BOTH COLUMNS ON A PHONE.
	 *
	 * Measured in a single column: 608px tall at 390 and 889px at 320,
	 * because 280 characters of German in a 136px column is forty lines.
	 * Beside a 341px product card that is not a card, it is a wall. Across
	 * the full width it is roughly one card tall, and it reads as what it
	 * is - the sentence that closes the list, not an eighth product.
	 *
	 * The advisor tile stays in its column: it is a picture with four
	 * words on it and it is meant to sit IN the grid, between the third
	 * and the fourth product.
	 */
	.wc-block-product-template > li.mitode-testimonial-card { grid-column: 1 / -1; }
	.mitode-testimonial-card__inner { padding: 1rem; }
	.mitode-testimonial-card__mark { font-size: 2.25rem; }
	.mitode-testimonial-card__quote p { font-size: .875rem; line-height: 1.5; }

	/* the theme card keeps its body wrapper in the markup; `display:
	   contents` promotes title/rating/stock/price to grid items of the
	   card so that the price and the CTA - which are in different
	   wrappers - can share the action row. The padding the wrapper used to
	   carry moves onto the children below. */
	.mitode-cards--compact > li.mitode-card > .mitode-card__body { display: contents; }

	/* ---- row 1: media ---- */
	.mitode-cards--compact > li.mitode-card > .mitode-card__media,
	.wc-block-product-template > li.wc-block-product > .wc-block-components-product-image,
	.wc-block-product-template > li.wc-block-product > .wp-block-woocommerce-product-image {
		grid-row: 1;
		grid-column: 1 / -1;
		margin: 0 0 .5rem;
	}

	/* ---- row 2: title ---- */
	/*
	 * `!important` and (0,2,1): the subgrid block above sets
	 * `display: block !important; -webkit-line-clamp: none; max-height:
	 * none` on `.wc-block-product-template .wp-block-post-title` (0,2,0).
	 * A restatement at equal specificity would be a print-order bet.
	 */
	/*
	 * `.mitode-card__title` WITHOUT the child combinator, and that is the
	 * whole point of this comment.
	 *
	 * `display: contents` on `.mitode-card__body` above makes the title a
	 * grid item of the CARD - but it does not move the element in the
	 * DOM, and CSS combinators read the DOM. The first version of this
	 * rule said `> li.mitode-card > .mitode-card__title` and therefore
	 * matched nothing on the theme's own card: measured on the PDP
	 * cross-sell rail, the title had padding 0, font-size 16px and
	 * `grid-row: auto` while the identical card on the category archive
	 * had 10px, 14px and row 2. The owner saw it as "text glued to the
	 * edge" on the product page and could not reproduce it on the
	 * category page, which is exactly what this bug looks like from
	 * outside. Same component, two surfaces, one selector apart.
	 *
	 * Every rule below that targets something inside the body uses a
	 * descendant combinator for the same reason.
	 */
	.mitode-cards--compact > li.mitode-card .mitode-card__title,
	.wc-block-product-template > li.wc-block-product > .wp-block-post-title {
		grid-row: 2;
		grid-column: 1 / -1;
		display: -webkit-box !important;
		-webkit-line-clamp: 2;
		line-clamp: 2;
		-webkit-box-orient: vertical;
		overflow: hidden !important;
		/* The clamp is VISUAL ONLY - the full title stays in the DOM, in
		   the link, and in the accessible name. Nothing here truncates
		   text server-side. */
		min-height: var(--mitode-card-title-h);
		max-height: var(--mitode-card-title-h);
		font-size: .875rem !important;
		line-height: 1.4 !important;
		font-weight: 500;
		margin: 0 0 .2rem !important;
		padding-inline: var(--mitode-card-pad);
	}

	/* ---- row 3: availability ---- */
	.mitode-cards--compact > li.mitode-card .mitode-avail,
	.wc-block-product-template > li.wc-block-product > .mitode-avail {
		grid-row: 3;
		grid-column: 1 / -1;
		min-height: var(--mitode-card-avail-h);
		margin: 0 !important;
		font-size: .75rem !important;
		line-height: 1.35;
		padding-inline: var(--mitode-card-pad);
	}

	/* ---- row 4: rating ---- */
	.mitode-cards--compact > li.mitode-card .mitode-prating-row,
	.wc-block-product-template > li.wc-block-product > .mitode-prating-row {
		grid-row: 4;
		grid-column: 1 / -1;
		margin: 0;
		padding-inline: var(--mitode-card-pad);
	}

	/* ---- row 5: the action row ---- */

	/*
	 * PRICE ON THE RIGHT. `justify-self: end` places the box; `text-align:
	 * end` places the text inside it; `min-height: 0` removes the reserved
	 * two-row price zone, which the compact card does not need because the
	 * struck-through price now sits ABOVE the current one in the same
	 * cell rather than in its own reserved row.
	 */
	.mitode-cards--compact > li.mitode-card .mitode-card__price,
	.wc-block-product-template > li.wc-block-product > .wp-block-woocommerce-product-price {
		grid-row: 5;
		grid-column: 2;
		justify-self: end;
		align-self: center;
		min-height: 0 !important;
		margin: 0 !important;
		/*
		 * SYMETRICKY, a to je oprava po ownerovi.
		 *
		 * Prvá verzia mala `var(--mitode-card-pad) 0` - vpravo nula, aby
		 * cena dostala čo najviac miesta. Na archíve to nikdy neplatilo:
		 * základné pravidlo `> *:not(obrázok)` má vyššiu špecificitu a
		 * dalo bunke padding na oboch stranách. Na vlastnej karte témy
		 * žiadne také pravidlo nie je, takže tam nula naozaj platila a
		 * cena sa lepila na pravý okraj - tá istá karta, dva rôzne
		 * výsledky, presne ako pri názve o kus vyššie. Jedna hodnota,
		 * jeden vzhľad.
		 */
		padding-inline: var(--mitode-card-pad);
		text-align: end !important;
		align-items: flex-end !important;
		gap: 0;
		font-size: 1.0625rem;
		line-height: 1.2;
	}
	.wc-block-product-template > li.wc-block-product .wc-block-components-product-price {
		align-items: flex-end;
		text-align: end;
		width: auto;
		max-width: 100%;
		/*
		 * `inherit` IS THE FIX, and it took a measurement to find.
		 *
		 * Woo sets a font-size on this INNER element, so the size set on
		 * the outer price block never reached <ins>: with the outer at
		 * 15px the current price was still being drawn at 20px, which
		 * made "1.399,00 €" 96px wide inside an 86px column and pushed
		 * the Maxi card's price 1.03px out of its own card at 320. An
		 * explicit declaration on a child always beats inheritance from
		 * its parent, whatever the parent's specificity - so the child
		 * has to be told to inherit.
		 */
		font-size: inherit;
	}
	.mitode-cards--compact > li.mitode-card .mitode-card__was,
	.wc-block-product-template > li.wc-block-product .wc-block-components-product-price del {
		font-size: .75rem;
		line-height: 1.2;
	}
	.mitode-cards--compact > li.mitode-card .mitode-card__now {
		font-size: 1.0625rem;
		line-height: 1.2;
	}
	/* an empty "previous price" placeholder must not reserve a line in a
	   row that is now sized to its content */
	.mitode-cards--compact > li.mitode-card .mitode-card__was:empty,
	.mitode-cards--compact > li.mitode-card .mitode-card__was > span[aria-hidden="true"] { display: none; }

	/* the CTA cell */
	.mitode-cards--compact > li.mitode-card > .mitode-card__cta,
	.wc-block-product-template > li.wc-block-product > .wp-block-woocommerce-product-button {
		grid-row: 5;
		grid-column: 1;
		align-self: center;
		width: auto !important;
		margin: 0 !important;
		padding: 0 0 0 var(--mitode-card-pad) !important;
	}

	/*
	 * THE COMPACT CART CONTROL - only where the control really adds to the
	 * cart. `.mitode-card--cart` is written by mitode_render_cards() and
	 * `.product-type-simple` by WooCommerce; both mean "one tap puts this
	 * in the basket". Anything else keeps its words (below).
	 *
	 * `font-size: 0` collapses the label without removing it, so the
	 * button's accessible name is still "In den Warenkorb" - the text is
	 * in the DOM, readable by assistive technology and by a crawler. The
	 * glyph is therefore sized in PX here and not in `em`, because an em
	 * of nothing is nothing.
	 */
	.mitode-cards--compact > li.mitode-card--cart > .mitode-card__cta .button,
	.wc-block-product-template > li.wc-block-product.product-type-simple .wc-block-components-product-button .wp-block-button__link {
		display: inline-flex;
		align-items: center;
		justify-content: center;
		width: 40px;
		height: 40px;
		min-width: 40px;
		padding: 0;
		/*
		 * `!important`, and it is not decoration. The Product Collection
		 * button carries `has-small-font-size`, and core prints
		 * `.has-small-font-size { font-size: var(--...--small) !important }`
		 * - so the first version of this rule lost, the label kept its
		 * 110px of text inside a 40px flex container, and the glyph was
		 * the flex item that shrank: measured `width: 0px` on all seven
		 * icons, i.e. an empty circle on every archive card. Specificity
		 * decides between two !important declarations and (0,4,1) beats
		 * (0,1,0).
		 */
		font-size: 0 !important;
		line-height: 0;
		border-radius: 999px;
	}
	.mitode-cards--compact > li.mitode-card--cart > .mitode-card__cta .button .mitode-card__button-icon,
	.wc-block-product-template > li.wc-block-product.product-type-simple .wp-block-button__link .mitode-card__button-icon {
		/* px, not em: the button's font-size is 0 above, and 1.15em of
		   nothing is nothing. `flex: 0 0 auto` so the glyph is never the
		   item that gives way if anything else in the button has width. */
		flex: 0 0 auto;
		width: 20px;
		height: 20px;
		margin: 0;
		vertical-align: 0;
	}

	/*
	 * NOT A CART: the action keeps its label and takes a row of its own
	 * under the price. "Ausführung wählen" does not fit beside a price in
	 * a 136px card, and abbreviating it to an icon would be the misleading
	 * affordance the brief rules out.
	 */
	.mitode-cards--compact > li.mitode-card--options,
	.wc-block-product-template > li.wc-block-product:not(.product-type-simple) {
		grid-template-rows:
			auto
			var(--mitode-card-title-h)
			var(--mitode-card-avail-h)
			var(--mitode-card-rating-h)
			auto
			auto;
	}
	.mitode-cards--compact > li.mitode-card--options .mitode-card__price,
	.wc-block-product-template > li.wc-block-product:not(.product-type-simple) > .wp-block-woocommerce-product-price {
		grid-column: 1 / -1;
		justify-self: start;
		text-align: start !important;
		align-items: flex-start !important;
		padding-inline: var(--mitode-card-pad);
	}
	.mitode-cards--compact > li.mitode-card--options > .mitode-card__cta,
	.wc-block-product-template > li.wc-block-product:not(.product-type-simple) > .wp-block-woocommerce-product-button {
		grid-row: 6;
		grid-column: 1 / -1;
		width: auto !important;
		padding: .35rem var(--mitode-card-pad) 0 !important;
	}
	.mitode-cards--compact > li.mitode-card--options > .mitode-card__cta .button,
	.wc-block-product-template > li.wc-block-product:not(.product-type-simple) .wp-block-button__link {
		display: block;
		width: 100%;
		padding: .5rem .35rem;
		/* "Ausführung wählen" measured 3 lines in a 114px pill at 320.
		   12px fits it in two at 320 and one from 360 up. The label is
		   Woo's own translated string - shortening the WORDS to fit a box
		   would change what the control says.
		   `!important` for the same reason as the cart control above:
		   `has-small-font-size` is an !important declaration. */
		font-size: .75rem !important;
		line-height: 1.3;
	}

}

/*
 * 360 and below: the price cell runs out of room before anything else
 * does. Measured on the Maxi card at 320 - the widest price in the
 * catalogue, "1.469,00 €" struck through above "1.399,00 €" - the price box
 * came out 136.03px inside a 136px card and hung 1.03px past its left
 * edge, where the card's overflow:hidden took the first digit's edge with
 * it. The action column costs a fixed 50px (a 40px control plus its
 * gutter), so the price gets `card - 50`: 86px at 320. At .9375rem the
 * longest price in this catalogue measures inside that, with the cell's
 * own left padding given up because at this width the gap between the
 * control and the price is already the whole separation the eye needs.
 */
@media (max-width: 360px) {
	/*
	 * The action row's budget at 320: card 136 - (40px control + its
	 * 10px gutter) = 86 for the price cell, of which 10 is its own right
	 * gutter, leaving 76. The longest price in this catalogue -
	 * "1.469,00 €" struck through over "1.399,00 €" - measures ~72px at
	 * .9375rem and fits. (The 36px control and the .8125rem price that
	 * stood here briefly were paying for a 16px gutter that the owner
	 * then reverted; both are back to the designed values.)
	 */
	.mitode-cards--compact > li.mitode-card .mitode-card__price,
	.wc-block-product-template > li.wc-block-product > .wp-block-woocommerce-product-price {
		font-size: .9375rem;
	}
	.mitode-cards--compact > li.mitode-card .mitode-card__now { font-size: .9375rem; }
}

/* =====================================================================
   W53 - THE TESTIMONIAL TILE (mitode-testimonial-card)
   =====================================================================
   A theme-owned promotional list item, the advisor tile's sibling. It is
   NOT a product: no price, no SKU, no add-to-cart, not in the product
   count, never in Product structured data and never an ecommerce item.
   inc/category.php renders it; nothing in WooCommerce knows it exists.

   Charcoal into dark red, white text, one red quotation mark - the design
   the brief asks for, built from the palette this theme already has
   (dark-deep, dark, accent) rather than three new colours.
   ================================================================== */

.mitode-testimonial-card {
	position: relative;
	display: flex;
	box-sizing: border-box;
	margin: 0;
	padding: 0;
	overflow: hidden;
	list-style: none;
	border-radius: var(--mitode-radius-lg, 20px);
	background:
		radial-gradient(120% 85% at 88% 4%, rgba(248, 1, 32, .30) 0%, rgba(248, 1, 32, 0) 62%),
		linear-gradient(158deg, var(--wp--preset--color--dark, #1a1a1a) 0%, #2a0d12 62%, #3a0a12 100%);
	color: #fff;
	min-width: 0;
}

.mitode-testimonial-card__inner {
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: .9rem;
	width: 100%;
	min-width: 0;
	margin: 0;
	padding: clamp(1.1rem, 2.4vw, 1.9rem);
}

.mitode-testimonial-card__mark {
	display: block;
	font-size: 3rem;
	font-weight: 700;
	line-height: .55;
	color: var(--wp--preset--color--accent, #f80120);
}

.mitode-testimonial-card__quote {
	margin: 0;
	padding: 0;
	border: 0;
	min-width: 0;
}
.mitode-testimonial-card__quote p {
	margin: 0;
	font-size: clamp(.9375rem, 1.15vw, 1.0625rem);
	line-height: 1.55;
	color: #fff;
	/* German compounds in a 136px column: break at real syllables. */
	hyphens: auto;
	overflow-wrap: break-word;
}

.mitode-testimonial-card__by {
	display: flex;
	align-items: center;
	gap: .7rem;
	min-width: 0;
	margin-block-start: auto;
	padding-block-start: .25rem;
}

.mitode-testimonial-card__portrait {
	flex: 0 0 auto;
	display: block;
	width: 46px;
	height: 46px;
	border-radius: 999px;
	overflow: hidden;
	background: rgba(255, 255, 255, .1);
}
.mitode-testimonial-card__avatar,
.mitode-trust-brand__avatar {
	display: block;
	width: 100%;
	height: 100%;
	/*
	 * The source is a 404x530 portrait crop of the brand's own video
	 * poster; `cover` plus a high object-position keeps the FACE in the
	 * circle instead of centring on the chest, and never distorts it.
	 *
	 * W71-B.1 - the home page band draws the same portrait from the same
	 * record, so it is the same rule rather than a second copy of it. A
	 * duplicated crop value is how one surface starts framing the chin.
	 */
	object-fit: cover;
	object-position: center 22%;
}

.mitode-testimonial-card__who {
	display: flex;
	flex-direction: column;
	min-width: 0;
	font-size: .8125rem;
	line-height: 1.35;
	color: rgba(255, 255, 255, .8);
}
.mitode-testimonial-card__who strong { color: #fff; font-size: .875rem; font-weight: 700; }

/* ---- listing flags (W9N.3) ------------------------------------------ */

/*
 * "Gratis Versand" / "NEU" / "Aktion" - inc/badges.php. Sized and placed
 * like the discount badge, stacked in the image's top-LEFT corner; when a
 * discount badge is present the stack steps below it so the two never
 * overlap.
 */
.mitode-pbadges {
	position: absolute;
	top: .75rem;
	left: .75rem;
	z-index: 2;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: .3rem;
	pointer-events: none;
}
/*
 * W27.4: `.mitode-card__badge` joins this list.
 *
 * The theme's own card (home rails, "Weitere Mitochondriak®-Produkte" on
 * every PDP) prints its sale percentage as `.mitode-card__badge`, not as
 * `.onsale` - so when W27.4 put the free-shipping stack on that card too,
 * the two would have been drawn at the same top/left on every discounted
 * product. Same step-down as the block path, same measurements.
 */
.wc-block-components-product-image:has(.wc-block-components-product-sale-badge) .mitode-pbadges,
.mitode-card__media:has(.onsale) .mitode-pbadges,
.mitode-card__media:has(.mitode-card__badge) .mitode-pbadges {
	top: calc(.75rem + 1.75rem + .3rem);
}
/* .mitode-pbadge, NOT .mitode-flag: that name is the language switcher's
   country flag and boxes anything matching it to 21x14 px. */
.mitode-pbadge {
	display: inline-flex;
	align-items: center;
	gap: .3em;
	padding: .3rem .6rem;
	border-radius: var(--mitode-radius-pill);
	font-size: .75rem;
	font-weight: 700;
	letter-spacing: .02em;
	line-height: 1.2;
	white-space: nowrap;
}
.mitode-pbadge__icon { flex: 0 0 auto; }
/* light blue, the brand's info colour family */
.mitode-pbadge--versand { background: #ddeffc; color: #0b5e96; }
.mitode-pbadge--neu { background: var(--wp--preset--color--contrast, #0f0f0f); color: #fff; }
.mitode-pbadge--aktion { background: var(--wp--preset--color--accent, #f80120); color: #fff; }

/*
 * W9N.4 - the same badge stack on the product page, above the H1.
 *
 * The card version is absolutely positioned over the image; on the PDP the
 * stack is a normal inline row in the summary column, so the position and
 * the column direction are both reset. Same .mitode-pbadge chips - one
 * renderer, one appearance (inc/badges.php).
 */
.mitode-pdp-badges .mitode-pbadges {
	position: static;
	flex-direction: row;
	flex-wrap: wrap;
	gap: .4rem;
	pointer-events: auto;
}
.mitode-pdp-badges { margin-block-end: .65rem; }
.mitode-pdp-badges .mitode-pbadge { font-size: .8125rem; padding: .35rem .7rem; }

/* ---- sale badge ------------------------------------------------------ */

.mitode-card__badge,
.woocommerce span.onsale,
span.onsale,
.wc-block-components-product-sale-badge,
.wp-block-woocommerce-product-sale-badge {
	position: absolute;
	top: .75rem;
	left: .75rem;
	right: auto;
	z-index: 2;
	margin: 0;
	min-height: 0;
	min-width: 0;
	padding: .3rem .6rem;
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--accent);
	color: #fff;
	border: 0;
	font-size: .75rem;
	font-weight: 700;
	letter-spacing: .02em;
	line-height: 1.2;
	text-align: center;
	white-space: nowrap;
}

/*
 * Block Product Collection badge. Woo wraps the badge in an outer
 * .wp-block-woocommerce-product-sale-badge div; that wrapper is what gets
 * positioned, so the inner element can stay in normal flow.
 */
.wc-block-components-product-image .wp-block-woocommerce-product-sale-badge {
	position: absolute;
	top: .75rem;
	left: .75rem;
	z-index: 2;
	margin: 0;
	padding: 0;
	background: none;
	border: 0;
}
.wc-block-components-product-sale-badge,
.wc-block-components-product-sale-badge.alignleft,
.wc-block-components-product-sale-badge--align-left {
	position: static;
	float: none;
	display: inline-block;
	margin: 0;
	min-height: 0;
	min-width: 0;
	background: var(--wp--preset--color--accent) !important;
	color: #fff !important;
	border: 0;
	border-color: transparent !important;
	border-radius: var(--mitode-radius-pill);
	padding: .3rem .6rem;
	font-size: .75rem;
	font-weight: 700;
	line-height: 1.2;
	text-transform: none;
	white-space: nowrap;
	clip-path: none;
}
.wc-block-components-product-sale-badge::before,
.wc-block-components-product-sale-badge::after { display: none !important; }

/* Woo renders the badge twice inside the product image wrapper. */
.wc-block-components-product-image__inner-container { display: none; }

/* ---- narrow contexts -------------------------------------------------- */

/*
 * Related products, cross-sells and any other card list that sits inside a
 * column rather than the full content shell. Below this width a four-up
 * grid would produce the narrow strips this stage set out to remove, so the
 * column count is driven by the container, not the viewport.
 */
@supports (container-type: inline-size) {
	.mitode-cards-scope { container-type: inline-size; }

	@container (max-width: 700px) {
		.mitode-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	}
	/*
	 * W53 - THE COMPACT CARD OPTS OUT OF THE SINGLE-COLUMN FALLBACK.
	 *
	 * This rule dates from the tall card, where two columns under 380px
	 * of container really were unreadable. Measured with it still in
	 * place: the PDP cross-sell rail at 390 sat in a 358px container, fell
	 * to one column, and four related products came to 2617px of page -
	 * the opposite of the brief, which wants the reader to MEET those
	 * products rather than scroll through them. The compact card is
	 * proven two-up down to a 136px card on the archives, so it keeps two
	 * columns here too and only the old card falls back.
	 */
	@container (max-width: 380px) {
		.mitode-cards:not(.mitode-cards--compact) { grid-template-columns: minmax(0, 1fr); }
	}
}

/* A card never gets narrower than this, whatever the grid asks for. */
.mitode-card { min-width: 8.75rem; }
/*
 * ...except the compact one, whose whole point is that it works at 136px.
 * 8.75rem is 140px, so leaving it would make two columns overflow a 288px
 * container by a pixel each - the floor and the layout would disagree and
 * the card would win.
 */
@media (max-width: 600px) {
	.mitode-cards--compact > li.mitode-card { min-width: 0; }
}

/* ---- legacy wc-block-grid markup (empty-cart suggestions, widgets) ---- */

.wc-block-grid__products {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: clamp(1rem, 2.2vw, 1.75rem);
	grid-template-columns: repeat(2, minmax(0, 1fr));
}
@media (min-width: 782px) { .wc-block-grid__products { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 1180px) { .wc-block-grid__products { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/*
 * W9N.3: the li selector carries the element on purpose. Woo's own
 * `.wc-block-grid.has-4-columns .wc-block-grid__product { max-width: 25% }`
 * ties at (0,2,0) and its stylesheet prints after this one, which squashed
 * every empty-cart suggestion card to 72 px - a title of "Mito ch..." and a
 * CTA broken onto one letter per line. (0,2,1) ends the tie. The empty-cart
 * page itself no longer renders this markup (it uses the theme's own
 * product-grid block now), but widgets still can.
 */
.wc-block-grid__products > li.wc-block-grid__product,
.wc-block-grid__products .wc-block-grid__product {
	position: relative;
	display: flex;
	flex-direction: column;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	overflow: hidden;
	margin: 0;
	padding: 0 0 1rem;
	width: auto;
	max-width: none;
	text-align: left;
	transition: box-shadow .2s var(--mitode-ease), transform .2s var(--mitode-ease);
}
.wc-block-grid__products .wc-block-grid__product:hover { box-shadow: var(--wp--preset--shadow--card); transform: translateY(-2px); }

.wc-block-grid__product-link { text-decoration: none; color: inherit; display: block; }
.wc-block-grid__product-image { margin: 0 0 .85rem; }
.wc-block-grid__product-image img {
	display: block;
	width: 100%;
	aspect-ratio: var(--mitode-card-ratio);
	object-fit: cover;
	background: var(--wp--preset--color--surface);
}
.wc-block-grid__product-title {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	min-height: var(--mitode-card-title-h);
	padding-inline: var(--mitode-card-pad);
	font-size: 1rem;
	font-weight: 500;
	line-height: 1.35;
	margin-block-end: .35rem;
}
.wc-block-grid__product-price {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	justify-content: flex-end;
	min-height: var(--mitode-card-price-h);
	padding-inline: var(--mitode-card-pad);
	font-size: 1.25rem;
	font-weight: 700;
	line-height: 1.25;
}
.wc-block-grid__product-price del { order: 0; font-size: .8125rem; font-weight: 400; color: var(--wp--preset--color--contrast-3); opacity: 1; }
.wc-block-grid__product-price ins { order: 1; background: none; text-decoration: none; color: var(--wp--preset--color--accent); }

.wc-block-grid__product-onsale {
	position: absolute;
	top: .75rem;
	left: .75rem;
	right: auto;
	z-index: 2;
	margin: 0;
	min-width: 0;
	min-height: 0;
	padding: .3rem .6rem;
	border: 0;
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--accent);
	color: #fff;
	font-size: .75rem;
	font-weight: 700;
	line-height: 1.2;
	text-transform: none;
}

.wc-block-grid__product .wp-block-button__link,
.wc-block-grid__product .add_to_cart_button {
	margin: auto var(--mitode-card-pad) 0;
	padding: .75rem 1rem;
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--contrast);
	color: #fff;
	font-size: .9375rem;
	font-weight: 700;
	text-align: center;
	text-decoration: none;
}
.wc-block-grid__product .wp-block-button__link:hover { background: var(--wp--preset--color--accent); }
/* ---------------------------------------------------------------------
 * 8. category archive
 * ------------------------------------------------------------------ */

.mitode-breadcrumb {
	font-size: .8125rem;
	color: var(--wp--preset--color--contrast-3);
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: .4rem;
	margin-block: 0 1rem;
}
.mitode-breadcrumb a { color: inherit; text-decoration: none; }
.mitode-breadcrumb a:hover { color: var(--wp--preset--color--accent); text-decoration: underline; }
.mitode-breadcrumb__sep { color: var(--wp--preset--color--border); }

.mitode-archive-head {
	background: var(--wp--preset--color--surface);
	border-bottom: 1px solid var(--wp--preset--color--border);
	padding-block: clamp(1.5rem, 4vw, 2.75rem);
	margin-block-end: 0;
}
.mitode-store-archive > .mitode-section--tight { padding-block-start: clamp(1rem, 2vw, 1.5rem); }
.mitode-archive-head h1,
.mitode-archive-head .wp-block-query-title,
.mitode-archive-head .woocommerce-products-header__title {
	margin: 0 0 .75rem;
	font-size: clamp(1.75rem, 4.2vw, 2.75rem);
	letter-spacing: -.02em;
}
.mitode-archive-head .term-description,
.mitode-archive-head .wp-block-term-description,
.mitode-archive-head p {
	margin: 0;
	max-width: 78ch;
	color: var(--wp--preset--color--contrast-2);
	font-size: 1.0625rem;
	line-height: 1.6;
}

.mitode-toolbar {
	margin-block-start: 0;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: .75rem;
	padding-block: 1.25rem;
	font-size: .875rem;
	color: var(--wp--preset--color--contrast-2);
	border-bottom: 1px solid var(--wp--preset--color--border);
	margin-block-end: clamp(1.25rem, 3vw, 2rem);
}
.mitode-toolbar .woocommerce-result-count { margin: 0; }
.mitode-toolbar select,
.woocommerce-ordering select {
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
	padding: .5rem 2rem .5rem .75rem;
	background: var(--wp--preset--color--base);
	font: inherit;
	color: inherit;
}

.woocommerce-pagination ul,
.wp-block-query-pagination {
	display: flex;
	flex-wrap: wrap;
	gap: .4rem;
	justify-content: center;
	list-style: none;
	margin: clamp(2rem, 5vw, 3rem) 0 0;
	padding: 0;
	border: 0;
}
.woocommerce-pagination li { border: 0; }
.woocommerce-pagination a,
.woocommerce-pagination span,
.wp-block-query-pagination-numbers a,
.wp-block-query-pagination-numbers span {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 40px;
	height: 40px;
	padding: 0 .5rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-pill);
	text-decoration: none;
	color: var(--wp--preset--color--contrast);
}
.woocommerce-pagination .current,
.wp-block-query-pagination-numbers .current {
	background: var(--wp--preset--color--contrast);
	border-color: var(--wp--preset--color--contrast);
	color: #fff;
	font-weight: 700;
}

/* ---------------------------------------------------------------------
 * 9. product detail
 * ---------------------------------------------------------------------
 * The PDP is a block template (templates/single-product.html), so the
 * classic .summary / div.product wrappers do not exist here. Layout comes
 * from core/columns; these rules only style what Woo's product blocks emit.
 * ------------------------------------------------------------------ */

.mitode-pdp__crumbs { padding-block: 1.25rem 0; }

.mitode-pdp__top,
.mitode-pdp-tail { width: 100%; }

.mitode-pdp__cols { gap: clamp(1.5rem, 4vw, 3rem); margin-block: 1.5rem 0; }

@media (min-width: 782px) {
	.mitode-pdp__cols > .mitode-pdp__media { flex-basis: 52% !important; }
	.mitode-pdp__cols > .mitode-pdp__summary { flex-basis: 48% !important; }
	/*
	 * The source pins the gallery while the info column scrolls
	 * (.p-image-wrapper { position: sticky; top: 50px }). The offset here
	 * clears the sticky site header instead of the source's fixed 50 px.
	 */
	.mitode-pdp__cols > .mitode-pdp__media {
		position: sticky;
		top: calc(var(--mitode-header-h, 8rem) + 1rem);
		align-self: flex-start;
	}
}
@media (prefers-reduced-motion: reduce) {
	.mitode-pdp__cols > .mitode-pdp__media { position: static; }
}

/*
 * W9F - below 782 px the source names the product BEFORE showing it: the
 * title and the rating sit above the gallery, everything else below it. The
 * source achieves that by rendering a second, mobile-only header and hiding
 * one of the two; here the summary column is dissolved with
 * `display: contents` instead, so its children become siblings of the
 * gallery and can simply be ordered. One title in the document, one rating,
 * nothing duplicated for assistive technology.
 */
@media (max-width: 781px) {
	.mitode-pdp__cols {
		display: flex;
		flex-direction: column;
		gap: 0;
	}
	.mitode-pdp__cols > .mitode-pdp__summary { display: contents; }
	.mitode-pdp__cols > .mitode-pdp__media { order: 2; margin-block-end: 1.25rem; }
	.mitode-pdp__summary > * { order: 3; }
	.mitode-pdp__summary > .wp-block-post-title { order: 1; margin-block-end: .5rem; }
	.mitode-pdp__summary > .wp-block-woocommerce-product-rating,
	.mitode-pdp__summary > .wc-block-components-product-rating { order: 1; }
}

/* gallery ------------------------------------------------------------ */

.mitode-gallery { position: relative; }

/*
 * W27.2 - stage + thumbnail rail (replaces the W9A hero + 4-column grid).
 *
 * The stage box is 3:4 - the ratio of every product photograph in the
 * catalogue (1920x2560, 1024x1536, 1660x2213 ...) - and the image is
 * CONTAINED, not covered: when the shopper switches between 28 images
 * nothing is cropped away and the box never changes height, so there is no
 * layout shift on a swap. Landscape products (the torch) get a 4:3 box via
 * .mitode-gallery--wide, chosen from the featured image's dimensions.
 */
.mitode-gallery__hero { position: relative; margin: 0; }
.mitode-gallery__link {
	display: block;
	border-radius: var(--mitode-radius-lg);
	overflow: hidden;
	background: var(--wp--preset--color--surface);
}
.mitode-gallery__hero img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 3 / 4;
	object-fit: contain;
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--surface);
}
.mitode-gallery--wide .mitode-gallery__hero img { aspect-ratio: 4 / 3; }

/* stage arrows: pointer devices see them on hover / focus, touch swipes */
.mitode-gallery__nav {
	position: absolute;
	top: 50%;
	z-index: 2;
	width: 44px;
	height: 44px;
	padding: 0;
	border: 0;
	border-radius: var(--mitode-radius-pill);
	background: rgba(255, 255, 255, .94);
	color: var(--wp--preset--color--contrast);
	box-shadow: var(--mitode-shadow-btn);
	cursor: pointer;
	transform: translateY(-50%);
	opacity: 0;
	transition: opacity .2s var(--mitode-ease), background-color .2s var(--mitode-ease);
}
.mitode-gallery__nav:not([hidden]) { display: inline-flex; align-items: center; justify-content: center; }
.mitode-gallery__nav--prev { left: .75rem; }
.mitode-gallery__nav--next { right: .75rem; }
.mitode-gallery__nav svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.mitode-gallery__hero:hover .mitode-gallery__nav,
.mitode-gallery__hero:focus-within .mitode-gallery__nav,
.mitode-gallery__nav:focus-visible { opacity: 1; }
.mitode-gallery__nav:hover { background: var(--wp--preset--color--contrast); color: #fff; }
.mitode-gallery__nav:focus-visible { outline: 2px solid var(--wp--preset--color--contrast); outline-offset: 2px; }
@media (hover: none) {
	.mitode-gallery__nav { display: none !important; }
}

/* the strip: about five thumbnails on desktop, four on a tablet, four and a
   peek on a phone - the peek is what says "this scrolls" without arrows */
.mitode-gallery__thumbs {
	--mitode-gallery-gap: .5rem;
	--mitode-gallery-cols: 5;
	position: relative;
	margin-block-start: .6rem;
	/*
	 * W27.9 - THE RAIL MUST NOT SET THE WIDTH OF THE PAGE.
	 *
	 * Found by widening the QA matrix to 360 and 320 px, which no earlier
	 * phase measured. On the Grounding PDP - the one product with 27
	 * thumbnails - the document scrolled sideways by 4 px at 360 and 44 px
	 * at 320:
	 *
	 *   viewport 320   .wp-block-columns 288   .mitode-pdp__media 332
	 *
	 * The rail already scrolls (`overflow-x: auto` below), so it should
	 * contribute nothing to intrinsic width - but its items are
	 * `flex: 0 0 calc(<percentage>)`, i.e. they cannot shrink and their
	 * basis resolves against the container being sized. Chrome resolves
	 * that circularity by falling back to the items' content size, so the
	 * rail reported a min-content of 332 px. In the stacked layout
	 * `.mitode-pdp__cols` is a COLUMN flex container, where width is the
	 * cross axis: `min-width: 0` does not apply there, every child is
	 * stretched to the widest child's min-content, and the whole media
	 * column - hero image included - was 332 px inside a 288 px page.
	 *
	 * `contain: inline-size` says what is already true: this box's inline
	 * size does not depend on its contents. Measured, Grounding PDP:
	 *
	 *   width   320   360   390   430
	 *   before   44     4     0     0    px of horizontal overflow
	 *   after     0     0     0     0
	 *
	 * and the rail still scrolls at every width. The alternative
	 * (`max-width: 100%` on every stacked child) fixes the symptom one
	 * level up and would silently cover the next element that does this.
	 */
	contain: inline-size;
}
.mitode-gallery__rail {
	display: flex;
	gap: var(--mitode-gallery-gap);
	margin: 0;
	/*
	 * 2px inline for the focus ring, 4px block because `overflow-x: auto`
	 * makes the block axis clip too: with a symmetric 2px the thumbnail's
	 * 2px outline at 2px offset was cut off top and bottom and survived only
	 * as two short bars in the gaps. The inline value is load-bearing for
	 * the flex-basis calculation below (it subtracts 4px).
	 */
	padding: 4px 2px;
	list-style: none;
	overflow-x: auto;
	overscroll-behavior-x: contain;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
	-webkit-overflow-scrolling: touch;
}
.mitode-gallery__rail::-webkit-scrollbar { display: none; }
.mitode-gallery__thumb {
	flex: 0 0 calc((100% - 4px - (var(--mitode-gallery-cols) - 1) * var(--mitode-gallery-gap)) / var(--mitode-gallery-cols));
	margin: 0;
	scroll-snap-align: start;
}
.mitode-gallery__thumb-link {
	display: block;
	border: 2px solid transparent;
	border-radius: var(--mitode-radius);
	overflow: hidden;
	background: var(--wp--preset--color--surface);
	transition: border-color .2s var(--mitode-ease);
}
.mitode-gallery__thumb-link:hover { border-color: var(--wp--preset--color--contrast-2); }
.mitode-gallery__thumb.is-active .mitode-gallery__thumb-link { border-color: var(--wp--preset--color--accent); }
.mitode-gallery__thumb-link:focus-visible { outline: 2px solid var(--wp--preset--color--contrast); outline-offset: 2px; }
.mitode-gallery__thumb-img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 1;
	object-fit: cover;
}

/* rail arrows: only once the script runs and only when there is more strip than viewport */
.mitode-gallery__arrow {
	position: absolute;
	top: 50%;
	z-index: 2;
	width: 32px;
	height: 32px;
	padding: 0;
	border: 0;
	border-radius: var(--mitode-radius-pill);
	background: #fff;
	color: var(--wp--preset--color--contrast);
	box-shadow: var(--mitode-shadow-btn);
	cursor: pointer;
	transform: translateY(-50%);
}
.mitode-gallery__arrow:not([hidden]) { display: inline-flex; align-items: center; justify-content: center; }
.mitode-gallery__arrow--prev { left: -12px; }
.mitode-gallery__arrow--next { right: -12px; }
.mitode-gallery__arrow svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.mitode-gallery__arrow:hover:not(:disabled) { background: var(--wp--preset--color--contrast); color: #fff; }
.mitode-gallery__arrow:focus-visible { outline: 2px solid var(--wp--preset--color--contrast); outline-offset: 2px; }
.mitode-gallery__arrow:disabled { opacity: .35; cursor: default; }

@media (min-width: 782px) and (max-width: 1079px) {
	.mitode-gallery__thumbs { --mitode-gallery-cols: 4; }
}
@media (max-width: 781px) {
	.mitode-gallery__thumbs { --mitode-gallery-cols: 4.5; }
	.mitode-gallery__arrow { display: none !important; }
}
@media (prefers-reduced-motion: reduce) {
	.mitode-gallery__nav,
	.mitode-gallery__thumb-link { transition: none; }
	.mitode-gallery__rail { scroll-behavior: auto; }
}

/*
 * W9F - the discount badge on the product page is the source's seal: a
 * twelve-lobed red disc in the TOP-RIGHT corner of the gallery, not a pill
 * in the top-left. Measured on the source: 110 x 110 px, #f80120, white
 * bold text. The lobed edge is a clip-path rather than an image so it scales
 * and needs no asset. Loop/card badges keep the pill - the source shows the
 * seal there too, but at card size a pill stays readable, and the pill is
 * already the shared token for the category badges.
 */
.mitode-gallery .onsale,
.mitode-gallery span.onsale {
	position: absolute;
	top: .5rem;
	right: .5rem;
	left: auto;
	z-index: 3;
	display: flex;
	align-items: center;
	justify-content: center;
	width: clamp(66px, 7.2vw, 96px);
	height: clamp(66px, 7.2vw, 96px);
	padding: 0;
	border-radius: 0;
	background: var(--wp--preset--color--accent);
	color: #fff;
	font-size: clamp(1.0625rem, 1.7vw, 1.4375rem);
	font-weight: 700;
	letter-spacing: -.01em;
	line-height: 1;
	text-align: center;
	white-space: nowrap;
	clip-path: polygon(50.00% 0.00%, 53.15% 2.01%, 55.68% 6.87%, 57.59% 11.84%, 59.58% 14.26%, 62.51% 13.16%, 66.65% 9.81%, 71.27% 6.86%, 75.00% 6.70%, 76.72% 10.01%, 76.48% 15.49%, 75.65% 20.75%, 76.16% 23.84%, 79.25% 24.35%, 84.51% 23.52%, 89.99% 23.28%, 93.30% 25.00%, 93.14% 28.73%, 90.19% 33.35%, 86.84% 37.49%, 85.74% 40.42%, 88.16% 42.41%, 93.13% 44.32%, 97.99% 46.85%, 100.00% 50.00%, 97.99% 53.15%, 93.13% 55.68%, 88.16% 57.59%, 85.74% 59.58%, 86.84% 62.51%, 90.19% 66.65%, 93.14% 71.27%, 93.30% 75.00%, 89.99% 76.72%, 84.51% 76.48%, 79.25% 75.65%, 76.16% 76.16%, 75.65% 79.25%, 76.48% 84.51%, 76.72% 89.99%, 75.00% 93.30%, 71.27% 93.14%, 66.65% 90.19%, 62.51% 86.84%, 59.58% 85.74%, 57.59% 88.16%, 55.68% 93.13%, 53.15% 97.99%, 50.00% 100.00%, 46.85% 97.99%, 44.32% 93.13%, 42.41% 88.16%, 40.42% 85.74%, 37.49% 86.84%, 33.35% 90.19%, 28.73% 93.14%, 25.00% 93.30%, 23.28% 89.99%, 23.52% 84.51%, 24.35% 79.25%, 23.84% 76.16%, 20.75% 75.65%, 15.49% 76.48%, 10.01% 76.72%, 6.70% 75.00%, 6.86% 71.27%, 9.81% 66.65%, 13.16% 62.51%, 14.26% 59.58%, 11.84% 57.59%, 6.87% 55.68%, 2.01% 53.15%, 0.00% 50.00%, 2.01% 46.85%, 6.87% 44.32%, 11.84% 42.41%, 14.26% 40.42%, 13.16% 37.49%, 9.81% 33.35%, 6.86% 28.73%, 6.70% 25.00%, 10.01% 23.28%, 15.49% 23.52%, 20.75% 24.35%, 23.84% 23.84%, 24.35% 20.75%, 23.52% 15.49%, 23.28% 10.01%, 25.00% 6.70%, 28.73% 6.86%, 33.35% 9.81%, 37.49% 13.16%, 40.42% 14.26%, 42.41% 11.84%, 44.32% 6.87%, 46.85% 2.01%);
}

/* the product's primary category, as the source shows it above the image */
.mitode-gallery__cat {
	position: absolute;
	top: .625rem;
	left: .625rem;
	z-index: 3;
	padding: .3rem .7rem;
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--accent);
	color: #fff;
	font-size: .6875rem;
	font-weight: 500;
	letter-spacing: .04em;
	text-transform: uppercase;
	line-height: 1.3;
	text-decoration: none;
}
.mitode-gallery__cat:hover { background: var(--wp--preset--color--accent-dark); color: #fff; }

/* summary ------------------------------------------------------------ */

.mitode-pdp__summary > * { margin-block: 0 1rem; }

.mitode-pdp__summary .wp-block-post-title {
	font-size: clamp(1.6rem, 3.2vw, 2.25rem);
	line-height: 1.15;
	margin-block: 0 .75rem;
	letter-spacing: -.02em;
}

.mitode-pdp__summary .wp-block-woocommerce-product-price,
.mitode-pdp__summary .wc-block-components-product-price {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .6rem;
	font-size: clamp(1.6rem, 3.4vw, 2.1rem);
	font-weight: 700;
	color: var(--wp--preset--color--contrast);
	margin-block: 0 .4rem;
}
.mitode-pdp__summary .wc-block-components-product-price del,
.mitode-pdp__summary del {
	order: 2;
	font-size: 1.0625rem;
	font-weight: 400;
	color: var(--wp--preset--color--contrast-3);
	opacity: 1;
	text-decoration: line-through;
}
.mitode-pdp__summary .wc-block-components-product-price ins,
.mitode-pdp__summary ins {
	order: 1;
	background: none;
	text-decoration: none;
	color: var(--wp--preset--color--accent);
}
.mitode-pdp__summary .wc-block-components-product-price__value.is-discounted { color: var(--wp--preset--color--accent); margin-left: 0; }

.mitode-price-note,
.mitode-pdp__summary .woocommerce-price-suffix {
	flex: 1 0 100%;
	order: 3;
	font-size: .8125rem;
	font-weight: 400;
	color: var(--wp--preset--color--contrast-3);
}

.mitode-pdp__summary .wc-block-components-product-stock-indicator,
.mitode-pdp__summary .stock {
	font-size: .9375rem;
	font-weight: 500;
	margin-block: 0 1.25rem;
}
.mitode-pdp__summary .stock.in-stock,
.mitode-pdp__summary .wc-block-components-product-stock-indicator--in-stock { color: var(--wp--preset--color--success); }
.mitode-pdp__summary .stock.out-of-stock { color: var(--wp--preset--color--accent-dark); }

.mitode-pdp__summary .mitode-pdp__excerpt,
.mitode-pdp__summary .wp-block-post-excerpt,
.mitode-pdp__summary .wc-block-components-product-summary {
	font-size: 1rem;
	line-height: 1.6;
	color: var(--wp--preset--color--contrast-2);
	padding-block-start: 1.25rem;
	border-top: 1px solid var(--wp--preset--color--border);
}
.mitode-pdp__excerpt p { margin-block: 0 .75rem; }
.mitode-pdp__excerpt p:last-child { margin-block-end: 0; }
.mitode-pdp__excerpt ul,
.mitode-pdp__summary .wp-block-post-excerpt ul {
	list-style: none;
	padding-left: 0;
	margin-block: .85rem 0;
}
/*
 * The source marks every feature with a green check rather than a bullet.
 * Drawn as a masked SVG on the marker element so it inherits the text
 * colour scale and needs no emoji font.
 */
.mitode-pdp__excerpt li,
.mitode-pdp__summary .wp-block-post-excerpt li {
	position: relative;
	margin-block: .5rem;
	padding-left: 1.75rem;
}
.mitode-pdp__excerpt li::before,
.mitode-pdp__summary .wp-block-post-excerpt li::before {
	content: "";
	position: absolute;
	left: 0;
	top: .28em;
	width: 1.125rem;
	height: 1.125rem;
	border-radius: 4px;
	background: var(--wp--preset--color--success);
	-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round' d='M5 12.5 10 17.5 19 7'/%3E%3C/svg%3E") center / 78% no-repeat,
		linear-gradient(#000, #000);
	-webkit-mask-composite: xor;
	mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round' d='M5 12.5 10 17.5 19 7'/%3E%3C/svg%3E") center / 78% no-repeat,
		linear-gradient(#000, #000);
	mask-composite: exclude;
}
.mitode-pdp__excerpt strong,
.mitode-pdp__summary .wp-block-post-excerpt strong { color: var(--wp--preset--color--contrast); }
.mitode-pdp__summary .wp-block-post-excerpt__more-text { display: none; }

/*
 * W70 - AN IMAGE IN A SHORT DESCRIPTION HAS NO CONTRACT, AND THAT WAS THE BUG.
 *
 * The summary column is a text column: title, checklist, price, cart. Every
 * rule above styles prose. There was no `img` rule at all, so an image that
 * arrived inside the stored short description rendered at its NATURAL size,
 * bounded only by the global `img { max-width: 100% }`.
 *
 * Measured on the barefoot PDP before this rule existed: a 512x512 packshot
 * painted 512x512 at 1440 px and then simply filled the column at every
 * narrower width (426 at 1024, 396 at 430, 358 at 390). That is the "giant
 * icon" the owner photographed - not a broken image and not a wrong file,
 * but an unconstrained one.
 *
 * The fix is a contract rather than a patch for one product: an image here
 * is an inline illustration next to the copy, so it is centred, capped in
 * BOTH axes and never taller than the reader's thumb. `max-height` is the
 * half that was missing - `max-width: 100%` alone still lets a square image
 * claim a column-width square.
 *
 * Deliberately no product id, no `:nth-child`, no `[src*=]`: the next
 * import that puts a picture in a short description gets the same box.
 */
.mitode-pdp__excerpt img {
	display: block;
	margin: 1rem auto 0;
	max-width: min(100%, 15rem);
	max-height: 9rem;
	width: auto;
	height: auto;
	object-fit: contain;
	border-radius: var(--mitode-radius, 8px);
}
/* A figure/paragraph that exists only to carry that image must not add a band. */
.mitode-pdp__excerpt p:has(> img:only-child) { margin-block-end: 0; }

/*
 * W70 - THE CONTENT POPUP TRIGGER, WHICH THE THEME NEVER STYLED.
 *
 * `.popup-button_JL` is part of the imported Shoptet product-page vocabulary
 * (see inc/cart-popup.php for the sibling the theme DID implement). Product
 * content carries it - the barefoot size guide opens with one - but the
 * theme only ever styled the CART popup, so the button rendered as a raw
 * user-agent control: 117x26 px, `border-radius: 0`, `background:
 * rgb(239,239,239)`. Measured, not guessed.
 *
 * It is given the same pill as the black content button next to it, because
 * that is what it is: the second action in a `.button-row_center` pair.
 * assets/js/content-popup.js makes it do something.
 */
button.popup-button_JL,
.popup-button_JL {
	display: inline-block;
	padding: .75rem 2rem;
	font: inherit;
	font-size: 1rem;
	font-weight: 700;
	line-height: 1.2;
	border: 2px solid var(--wp--preset--color--contrast, #0f0f0f);
	border-radius: var(--mitode-radius-pill, 999px);
	background: transparent;
	color: var(--wp--preset--color--contrast, #0f0f0f);
	text-decoration: none;
	white-space: nowrap;
	cursor: pointer;
	transition: background .18s var(--mitode-ease, cubic-bezier(.2, .7, .3, 1)), color .18s var(--mitode-ease, cubic-bezier(.2, .7, .3, 1));
}
button.popup-button_JL:hover,
button.popup-button_JL:focus-visible {
	background: var(--wp--preset--color--contrast, #0f0f0f);
	color: #fff;
}
button.popup-button_JL:focus-visible {
	outline: 3px solid var(--wp--preset--color--accent, #f80120);
	outline-offset: 2px;
}
/*
 * The overlay is `display:none` in the base rule until it is opened.
 *
 * The theme's older cart popup opens itself by writing `style.display =
 * 'flex'` from JavaScript (assets/js/cart-popup.js). That works, but it
 * puts the layout value in the script, where the stylesheet cannot see it -
 * and this project has already been bitten once by a component whose real
 * state lived somewhere the CSS did not control (W9L: `aria-expanded` said
 * closed while the computed `display` said open).
 *
 * So the CONTENT popup opens with a class and the display value stays here.
 * The two do not share a switch, which is why this rule is scoped to the
 * class and cannot change how the cart popup behaves.
 */
.popup-overlay_JL.is-open { display: flex; }

/* purchase block - W9F ------------------------------------------------ */

/*
 * The source PDP does not open with a purchase panel. Title, short
 * description and the feature checklist come first; the buyer then meets a
 * two-column "Preis / Verfuegbarkeit" data block, and the quantity and cart
 * button sit under it. The boxed panel W9B put directly beneath the title is
 * gone - the composition itself, not a card, separates the purchase from the
 * copy above it. See inc/purchase.php.
 */
.mitode-buy {
	margin-block: 1.5rem 1.5rem;
	padding-block-start: 1.25rem;
	border-top: 1px solid var(--wp--preset--color--border);
}

.mitode-buy__data {
	display: grid;
	grid-template-columns: 1fr;
	gap: 1.25rem;
}
@media (min-width: 480px) {
	.mitode-buy__data { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 1.5rem; }
}

.mitode-buy__label {
	margin: 0 0 .55rem;
	font-size: 1.25rem;
	font-weight: 700;
	line-height: 1.2;
	color: var(--wp--preset--color--contrast);
}

.mitode-buy__price {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: .5rem;
	margin: 0 0 .4rem;
}
.mitode-buy__price del {
	/* the source prints the struck regular price to the LEFT of the active
	   one; the generic summary rules above order them the other way round for
	   Woo's own price block, so both are set explicitly here. Measured on the
	   source: both prices 28 px, the struck one at weight 400 in grey. */
	order: 0;
	/* sized so the struck and the active price stay on ONE line down to
	   1280, where 28 px overflowed the 261 px column and split the pair */
	font-size: clamp(1.125rem, 1.9vw, 1.75rem);
	font-weight: 400;
	color: var(--wp--preset--color--contrast-3);
	text-decoration-thickness: 2px;
}
.mitode-buy__price ins {
	order: 1;
	text-decoration: none;
	font-size: clamp(1.25rem, 2vw, 1.75rem);
	font-weight: 700;
	color: var(--wp--preset--color--contrast);
}
/* the global suffix filter must not ride along inside the price line */
.mitode-buy__price .woocommerce-price-suffix,
.mitode-buy__price .mitode-price-note { display: none; }

.mitode-buy__note {
	margin: 0 0 .2rem;
	font-size: .8125rem;
	color: var(--wp--preset--color--contrast-3);
}

.mitode-buy .mitode-avail {
	margin: 0 0 .5rem;
	font-size: 1rem;
	font-weight: 700;
}
.mitode-buy__qtyhint { font-weight: 400; color: var(--wp--preset--color--contrast-3); }
.mitode-buy__ship { margin: 0 0 .4rem; font-size: .8125rem; color: var(--wp--preset--color--contrast-2); }
.mitode-buy__link {
	font-size: .8125rem;
	font-weight: 700;
	letter-spacing: .02em;
	color: var(--wp--preset--color--accent);
}

/* the form itself: a plain row, no panel */
.mitode-buy__form { margin-block-start: 1.25rem; }
/* W27.1 - WooCommerce prints its own stock line ("949 vorrätig (kann
   nachbestellt werden)") right before the simple add-to-cart form; the
   availability column above already says it, so the second line goes. The
   variation form's own availability (.woocommerce-variation-availability)
   is inside the form and stays. */
.mitode-buy__form > p.stock { display: none; }

/*
 * W27.1 - variable products. WooCommerce renders its own variation form
 * (single-product/add-to-cart/variable.php): a <table class="variations">
 * of <select>s, the reset link, then .single_variation_wrap with the chosen
 * variation's price/stock and the quantity + button. The theme's form.cart
 * rule above lays the simple form out as ONE flex row; the variable form
 * needs its blocks stacked, so it is switched back to block flow here and
 * only the final quantity/button row keeps the row layout.
 */
.mitode-pdp__summary form.variations_form { display: block; }
.mitode-pdp__summary form.variations_form .variations {
	width: 100%;
	border-collapse: collapse;
	margin: 0 0 .75rem;
	border: 0;
}
.mitode-pdp__summary form.variations_form .variations th,
.mitode-pdp__summary form.variations_form .variations td {
	padding: .3rem 0;
	border: 0;
	text-align: left;
	vertical-align: middle;
	background: none;
}
.mitode-pdp__summary form.variations_form .variations th.label {
	width: 7.5rem;
	padding-inline-end: .75rem;
	font-size: .9375rem;
	font-weight: 700;
	color: var(--wp--preset--color--contrast);
	/* the last row's cell also carries the reset link under the select, so a
	   middle-aligned label sat visibly below its select; align to the select */
	vertical-align: top;
	padding-block-start: calc(.3rem + 14px);
}
.mitode-pdp__summary form.variations_form .variations select {
	width: 100%;
	max-width: 22rem;
	min-height: 48px;
	padding: .5rem 2.75rem .5rem .9rem;
	border: 1px solid var(--wp--preset--color--contrast-3);
	border-radius: var(--mitode-radius);
	background-color: var(--wp--preset--color--base);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230f0f0f' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right .9rem center;
	background-size: 18px 18px;
	font: inherit;
	color: var(--wp--preset--color--contrast);
	appearance: none;
	-webkit-appearance: none;
	cursor: pointer;
}
.mitode-pdp__summary form.variations_form .variations select:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 2px;
}
.mitode-pdp__summary form.variations_form .reset_variations {
	display: inline-block;
	margin-top: .35rem;
	font-size: .8125rem;
	color: var(--wp--preset--color--contrast-2);
	text-decoration: underline;
}
.mitode-pdp__summary form.variations_form .reset_variations_alert { font-size: .8125rem; }
.mitode-pdp__summary form.variations_form .single_variation_wrap { display: block; width: 100%; }
.mitode-pdp__summary form.variations_form .woocommerce-variation { margin: 0 0 .75rem; }
.mitode-pdp__summary form.variations_form .woocommerce-variation-price .price {
	display: block;
	font-size: 1.125rem;
	font-weight: 700;
	color: var(--wp--preset--color--contrast);
}
.mitode-pdp__summary form.variations_form .woocommerce-variation-price .mitode-price-note,
.mitode-pdp__summary form.variations_form .woocommerce-variation-price .woocommerce-price-suffix {
	display: block;
	font-size: .8125rem;
	font-weight: 400;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-pdp__summary form.variations_form .woocommerce-variation-availability .stock {
	margin: .35rem 0 0;
	font-size: .9375rem;
	font-weight: 700;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-pdp__summary form.variations_form .woocommerce-variation-availability .stock.in-stock { color: var(--wp--preset--color--success); }
.mitode-pdp__summary form.variations_form .woocommerce-variation-availability .stock.available-on-backorder { color: #b06a00; }
.mitode-pdp__summary form.variations_form .woocommerce-variation-add-to-cart {
	display: flex;
	flex-wrap: wrap;
	gap: .75rem;
	align-items: stretch;
}
.mitode-pdp__summary form.variations_form .woocommerce-variation-add-to-cart-disabled .single_add_to_cart_button {
	opacity: .5;
	cursor: not-allowed;
}

.mitode-pdp__summary form.cart {
	display: flex;
	flex-wrap: wrap;
	gap: .75rem;
	align-items: stretch;
	margin: 0;
	padding: 0;
	background: none;
	border: 0;
	border-radius: 0;
}
.mitode-pdp__summary form.cart::before,
.mitode-pdp__summary form.cart::after { display: none; }

/* quantity - native input, stepper buttons added by assets/js/pdp.js */
.mitode-pdp__summary form.cart .quantity {
	display: flex;
	align-items: stretch;
	float: none;
	margin: 0;
	border: 1px solid var(--wp--preset--color--contrast-3);
	border-radius: var(--mitode-radius);
	background: var(--wp--preset--color--base);
	overflow: hidden;
}
.mitode-pdp__summary form.cart .quantity input {
	width: 3.25rem;
	/* Woo ships this input as content-box, so a min-height alone made the row
	   79 px instead of the source's 60 px and the CTA stretched with it */
	box-sizing: border-box;
	min-height: 58px;
	padding: .6rem .25rem;
	text-align: center;
	font: inherit;
	font-weight: 700;
	border: 0;
	border-radius: 0;
	background: none;
	margin: 0;
	-moz-appearance: textfield;
}
.mitode-pdp__summary form.cart .quantity input::-webkit-outer-spin-button,
.mitode-pdp__summary form.cart .quantity input::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}
.mitode-qty__btn {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	padding: 0;
	border: 0;
	background: none;
	color: var(--wp--preset--color--accent);
	cursor: pointer;
	transition: background .18s var(--mitode-ease);
}
.mitode-qty__btn:hover { background: rgba(248, 1, 32, .08); }
.mitode-qty__btn:focus-visible { outline: 2px solid var(--wp--preset--color--accent); outline-offset: -3px; }
.mitode-qty__btn svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; }

.mitode-pdp__summary form.cart button.single_add_to_cart_button {
	flex: 1 1 12rem;
	min-height: 60px;
	padding: .9rem 2rem;
	border: 0;
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--accent);
	color: #fff;
	font-weight: 700;
	font-size: clamp(1rem, 1.5vw, 1.25rem);
	box-shadow: var(--mitode-shadow-btn);
	cursor: pointer;
	transition: background .18s var(--mitode-ease), transform .18s var(--mitode-ease);
}
.mitode-pdp__summary form.cart button.single_add_to_cart_button:hover {
	background: var(--wp--preset--color--accent-dark);
	transform: translateY(-1px);
}

/* sticky purchase bar - one document, one add-to-cart form */
.mitode-buybar {
	position: fixed;
	inset-inline: 0;
	bottom: 0;
	z-index: 40;
	background: var(--wp--preset--color--base);
	border-top: 1px solid var(--wp--preset--color--border);
	box-shadow: var(--mitode-shadow-pop);
	transform: translateY(100%);
	transition: transform .28s var(--mitode-ease);
}
.mitode-buybar[hidden] { display: none; }
.mitode-buybar.is-visible { transform: translateY(0); }
.mitode-buybar__inner {
	display: flex;
	align-items: center;
	gap: .85rem;
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding: .6rem var(--mitode-gut);
}
.mitode-buybar__id { display: flex; align-items: center; gap: .75rem; min-width: 0; flex: 1 1 auto; }
.mitode-buybar__img {
	flex: 0 0 auto;
	width: 40px;
	height: 40px;
	object-fit: cover;
	border-radius: var(--mitode-radius);
}
.mitode-buybar__name {
	font-weight: 700;
	font-size: .9375rem;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.mitode-buybar__price { flex: 0 0 auto; font-weight: 700; font-size: 1.0625rem; white-space: nowrap; }
.mitode-buybar__price .woocommerce-price-suffix,
.mitode-buybar__price .mitode-price-note { display: none; }
/* ---------------------------------------------------------------------
 * W61 - THE BUY PAIR: ADD TO CART (RED) + EXPRESS CHECKOUT (BLACK).
 *
 * Two buttons that are siblings, not cousins: same height, same radius, same
 * type, same icon size, equal width. Only the colour differs. They appear as
 * a pair twice - in the buy panel on the product page and in the sticky bar
 * that arrives on scroll - and the rules below are shared so the two can
 * never drift apart.
 *
 * THE LABELS MUST NEVER WRAP. That is the owner's requirement and it is the
 * thing this block spends most of its lines on. `white-space: nowrap` alone
 * is not enough: without `min-width: 0` a flex item refuses to shrink below
 * its content, so a nowrap label pushes the row wider than the screen instead
 * of shrinking, and the page scrolls sideways. Both are needed, plus type
 * that steps down at the two widths where the German labels stop fitting.
 * "In den Warenkorb" and "Express-Checkout" are 16 and 16 characters, so the
 * pair is measured at 320 px, not assumed.
 * ------------------------------------------------------------------ */

/*
 * THE QUANTITY GETS ITS OWN ROW, AT EVERY WIDTH.
 *
 * The buy panel is a column roughly half the page wide, and it holds three
 * things: the stepper, the red button and the black one. Measured with all
 * three on one row, the buttons came out 189 px at 1440, 116 at 1024 and
 * 76 px at 834 - and "Express-Checkout" was already being ellipsised from
 * 1280 down. A tablet is not a phone, but the COLUMN is narrow on both.
 *
 * So the stepper sits above the pair everywhere. The two buttons then share
 * the full width of the column and stay identical, which is what the brief
 * asks for, at every size rather than only on phones.
 */
.mitode-buy__form { display: block; }
.mitode-buy__form form.cart {
	display: flex;
	align-items: stretch;
	gap: .5rem;
	row-gap: .6rem;
	flex: 1 1 100%;
	min-width: 0;
	margin-bottom: 0;
	flex-wrap: wrap;
}
/*
 * THE BUTTON ROW IS A GRID, BECAUSE FLEX WOULD NOT MAKE THEM EQUAL.
 *
 * Both the red button and the wallet slot carried `flex: 1 1 0` and the same
 * order, and they still came out 296 px and 268 px - the wallet's iframe has
 * intrinsic sizing of its own that flex kept honouring. The brief allows no
 * compromise on the pair looking identical, so the row stops negotiating:
 * two equal columns, and the browser has nothing left to decide.
 *
 * Every OTHER child of the form - the stepper, WooCommerce's variation table,
 * a hidden input - spans the full width by default, so a variable product
 * cannot accidentally drop a table into one of the two button columns.
 */
.mitode-buy__form form.cart {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: .5rem;
	align-items: stretch;
	margin-bottom: 0;
	min-width: 0;
}
.mitode-buy__form form.cart > * { grid-column: 1 / -1; min-width: 0; }
.mitode-buy__form form.cart .quantity,
.mitode-buy__form form.cart .mitode-qty { grid-column: 1 / -1; justify-self: start; }
/*
 * These three must OUT-SPECIFY the `> *` rule above, or the browser puts every
 * child in the full-width column and the pair stops being a pair. Measured
 * once with `.mitode-buy__wallet { grid-column: 2 }` at (0,1,0) against
 * `.mitode-buy__form form.cart > *` at (0,2,1): the wallet dropped onto its
 * own row below the red button.
 */
.mitode-buy__form form.cart button.single_add_to_cart_button { grid-column: 1; }
.mitode-buy__form form.cart .mitode-buy__express { grid-column: 2; }

/* The shared shape of all four buttons. */
.mitode-buy__form form.cart button.single_add_to_cart_button,
.mitode-buy__express,
.mitode-buybar__cta,
.mitode-buybar__express {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: .45rem;
	flex: 1 1 0;
	min-width: 0;
	white-space: nowrap;
	border: 0;
	border-radius: 8px;           /* angular, per the brief - not a pill */
	min-height: 52px;
	padding-inline: .9rem;
	font-weight: 700;
	font-size: 1rem;
	line-height: 1.1;
	cursor: pointer;
	transition: background .18s var(--mitode-ease);
}
.mitode-buy__form form.cart button.single_add_to_cart_button svg,
.mitode-buy__express svg,
.mitode-buybar__cta svg,
.mitode-buybar__express svg {
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.8;
	stroke-linecap: round;
	stroke-linejoin: round;
}
/* The label is the part allowed to be clipped rather than to wrap. */
.mitode-buy__form form.cart button.single_add_to_cart_button span,
.mitode-buy__express span,
.mitode-buybar__cta span,
.mitode-buybar__express span { min-width: 0; overflow: hidden; text-overflow: ellipsis; }

/* Red: add to cart. */
.mitode-buy__form form.cart button.single_add_to_cart_button,
.mitode-buybar__cta {
	background: var(--wp--preset--color--accent);
	color: #fff;
	box-shadow: none;
	transform: none;
}
.mitode-buy__form form.cart button.single_add_to_cart_button:hover,
.mitode-buybar__cta:hover { background: var(--wp--preset--color--accent-dark); color: #fff; transform: none; }

/* Black: express checkout. */
.mitode-buy__express,
.mitode-buybar__express {
	background: var(--wp--preset--color--dark, #1a1a1a);
	color: #fff;
}
.mitode-buy__express:hover,
.mitode-buybar__express:hover { background: #000; color: #fff; }

/* The sticky bar holds the same pair. */
.mitode-buybar__actions { flex: 1 1 auto; display: flex; align-items: stretch; gap: .5rem; min-width: 0; flex-wrap: nowrap; }

/* ---------------------------------------------------------------------
 * W64 - THE WALLET IS NOT IN THE PAIR ANY MORE. IT IS IN THE LAYER.
 *
 * W61 put Stripe's express element next to the red button and hid this
 * theme's own black button whenever a wallet appeared. Two consequences, both
 * wrong: the shop showed a different pair of buttons depending on the
 * visitor's phone, and the black button - the one §2 calls the secondary
 * action - was the one that disappeared.
 *
 * Now the pair is always the same two buttons, and Stripe's element lives in
 * the express layer. The geometry rules that were learned the hard way -
 * `min-width: 0` against Stripe's 260px floor, and the 4px negative iframe
 * margin that clipped the wallet mark - are kept below, pointed at the
 * layer's slot instead of the pair's.
 * ------------------------------------------------------------------ */
.mitode-express__wallet #wc-stripe-express-checkout-element { margin-top: 0 !important; }
.mitode-express__wallet #wc-stripe-express-checkout-element,
.mitode-express__wallet .StripeElement,
.mitode-express__wallet .StripeElement > div,
.mitode-express__wallet iframe {
	min-width: 0 !important; width: 100% !important; max-width: 100% !important;
}
/*
 * STRIPE PULLS ITS IFRAME 4 px LEFT, AND A CLIPPED BOX SHOWS IT.
 *
 * Stripe Elements applies a small negative horizontal margin to the iframe to
 * cancel padding inside its own document. On Stripe's own full-width row that
 * is invisible; inside a box with `overflow: hidden` and rounded corners it is
 * not - measured at 1440 and 390, the iframe sat 4 px left of the slot on both
 * sides and the wallet mark drew off-centre. That is the "logo is in the
 * second half of the button" the owner reported in W61.
 */
.mitode-express__wallet iframe { margin: 0 !important; }

/* The two payment-scheme marks on the card row keep their own aspect ratio. */
.mitode-pay-mark {
	height: 20px; width: auto; max-width: 42px; object-fit: contain;
	vertical-align: middle; margin-right: .25rem;
}

@media (max-width: 899px) {
	.mitode-buy__form form.cart button.single_add_to_cart_button,
	.mitode-buy__express,
	.mitode-buybar__cta,
	.mitode-buybar__express { font-size: .9375rem; min-height: 50px; padding-inline: .7rem; }
}

/*
 * THE QUANTITY BOX IS WHAT OVERFLOWS, NOT THE BUTTONS.
 *
 * form.cart holds three things on one nowrap row: the quantity stepper, the
 * red button and the black one. The stepper has a fixed width, so at 430 px
 * and below the row could not shrink far enough and the page scrolled
 * sideways by up to 120 px - measured, on the product page only.
 *
 * The pair stays side by side, which is the requirement; the QUANTITY moves
 * to its own line above them, which nothing in the brief forbids and which is
 * what a phone has room for.
 */
@media (max-width: 599px) {
	.mitode-buybar__inner { flex-wrap: nowrap; gap: .5rem; }
	/* The product name and thumbnail give the pair the room it needs. */
	.mitode-buybar__id { display: none; }
	.mitode-buybar__actions { flex: 1 1 auto; }

	/*
	 * TWO THIRDS / ONE THIRD IN THE BAR, as asked - and buildable now that the
	 * express label is the short one. "Express" plus its icon fits a third of a
	 * 320 px screen; "Express-Checkout" never could, which is what forced the
	 * equal split in the first attempt.
	 *
	 * In the buy PANEL the two stay equal: that is a column with room for both
	 * full labels, not a bar competing with a price.
	 */
	.mitode-buybar__cta { flex: 2 1 0; }
	.mitode-buybar__express { flex: 1 1 0; }
	.mitode-buy__form form.cart button.single_add_to_cart_button,
	.mitode-buy__express { flex: 1 1 0; }

	.mitode-buy__form form.cart button.single_add_to_cart_button,
	.mitode-buy__express,
	.mitode-buybar__cta,
	.mitode-buybar__express { font-size: .875rem; min-height: 48px; padding-inline: .55rem; gap: .35rem; }
	.mitode-buy__form form.cart button.single_add_to_cart_button svg,
	.mitode-buy__express svg,
	.mitode-buybar__cta svg,
	.mitode-buybar__express svg { width: 16px; height: 16px; }
}

/*
 * Below 380 px the icons go before the words do. A label that has to be read
 * is worth more than a mark that only decorates it, and dropping them buys
 * roughly 21 px per button - which is what keeps both German labels whole at
 * 320.
 */
/*
 * THE PRICE LEAVES THE BAR BEFORE THE WORDS DO.
 *
 * Below 430 px the bar holds a price and two buttons, and something has to
 * give. Measured with the price present: both labels were ellipsised to
 * "In den Waren…" and "Express-Check…" at 390 and below, which is exactly the
 * "ugly" the brief rules out. The price is one tap away on the page the
 * shopper is already looking at; the buttons are the reason the bar exists.
 */
@media (max-width: 429px) {
	.mitode-buybar__price { display: none; }
}

/*
 * W61 - THE ICONS STAY. THE WORDS GET SHORTER.
 *
 * An earlier pass dropped the icons below 380 px to win room. The owner asked
 * for the opposite and they are right: the mark is what makes the two buttons
 * read as a pair at a glance, and "Express-Checkout" is the part that can be
 * said in fewer letters. Both labels ship in the HTML
 * (inc/purchase.php, mitode_button_label()) and CSS shows the one that fits -
 * so nothing is written by JavaScript and nothing flickers on resize.
 */
.mitode-btn__short { display: none; }

@media (max-width: 599px) {
	.mitode-btn__long { display: none; }
	.mitode-btn__short { display: inline; }
}

@media (max-width: 339px) {
	.mitode-buy__form form.cart button.single_add_to_cart_button,
	.mitode-buy__express,
	.mitode-buybar__cta,
	.mitode-buybar__express { font-size: .8125rem; padding-inline: .4rem; gap: .3rem; }
}

@media (max-width: 599px) {
	.mitode-buybar__id { flex: 1 1 auto; }
	/* one line clipped "Mitochondriak(R) ..." and lost the model name, which is
	   the only part that tells the products apart - wrap to two instead */
	.mitode-buybar__name {
		font-size: .8125rem;
		white-space: normal;
		line-height: 1.25;
		display: -webkit-box;
		-webkit-line-clamp: 2;
		-webkit-box-orient: vertical;
		overflow: hidden;
	}
	.mitode-buybar__img { display: none; }
	.mitode-buybar__price { font-size: .9375rem; }
	/*
	 * W61: the old `.mitode-buybar__cta { padding-inline: 1rem; font-size:
	 * .875rem; }` lived here and, because this block comes LAST in the file,
	 * it quietly beat the W61 pair rules at the same specificity. The visible
	 * result was the two twins ending up 150 px and 130 px wide at 320 - same
	 * flex, different padding and different type. Sizing for both buttons now
	 * lives in one place, with the pair.
	 */
}

@media (prefers-reduced-motion: reduce) {
	.mitode-buybar { transition: none; }
}

/* trust + meta ------------------------------------------------------- */

/*
 * W61 - the trust row got tighter, because it now has a neighbour.
 *
 * The three lines and the Produktratgeber banner sit together directly under
 * the buy panel. At the old spacing (1rem padding, .6rem gap, 1.5rem below)
 * the pair pushed the category meta well below the fold on a 390 px phone.
 * The type size is unchanged - only the air around it - and the bottom margin
 * moves to the banner, which is now the last element of the group.
 */
.mitode-pdp-trust {
	display: grid;
	gap: .4rem;
	margin-block: 0 .5rem;
	padding: .7rem 1rem;
	border: 1px dashed var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	font-size: .875rem;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-pdp-trust p { margin: 0; display: flex; gap: .55rem; align-items: flex-start; }
.mitode-pdp-trust svg { flex: 0 0 auto; width: 18px; height: 18px; margin-top: .15rem; stroke: var(--wp--preset--color--accent); fill: none; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }

/* ---------------------------------------------------------------------
 * W61 - the Produktratgeber banner.
 *
 * Replaces the full-width dark CTA band that used to sit before the home
 * page footer. Deliberately small: one row on desktop, two short lines of
 * text, and a CTA that never wraps.
 *
 * `min-width: 0` on the text column is what stops the long German sentence
 * from forcing the flex row wider than its parent - without it the grid
 * column's min-content width wins and the PDP summary column overflows on a
 * 320 px screen. `white-space: nowrap` on the CTA is only safe BECAUSE of
 * that: the text column is the one allowed to shrink.
 * ------------------------------------------------------------------ */
.mitode-pdp-guide {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: .75rem;
	margin-block-end: 1.5rem;
	padding: .7rem .9rem;
	border-radius: var(--mitode-radius-lg);
	background: linear-gradient(100deg, #1a1a1a 0%, #232323 55%, #3a1418 100%);
	color: #fff;
	text-decoration: none;
	line-height: 1.35;
}
.mitode-pdp-guide:hover,
.mitode-pdp-guide:focus-visible { background: linear-gradient(100deg, #202020 0%, #2a2a2a 55%, #4a181d 100%); }
.mitode-pdp-guide__text { display: grid; gap: .1rem; min-width: 0; }
.mitode-pdp-guide__text strong { font-size: .9375rem; font-weight: 600; }
.mitode-pdp-guide__text span { font-size: .8125rem; color: #c9c9c9; }
.mitode-pdp-guide__cta {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	gap: .3rem;
	white-space: nowrap;
	font-size: .875rem;
	font-weight: 600;
	color: var(--wp--preset--color--accent, #e2001a);
}
.mitode-pdp-guide__cta svg {
	width: 16px; height: 16px; fill: none; stroke: currentColor;
	stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
}

/*
 * Under 400 px the row becomes two rows rather than squeezing the CTA into a
 * second line of its own. The CTA keeps its own line and stays one line.
 */
@media (max-width: 400px) {
	.mitode-pdp-guide { flex-wrap: wrap; gap: .45rem; }
	.mitode-pdp-guide__text { flex: 1 1 100%; }
	.mitode-pdp-guide__cta { flex: 0 0 auto; }
}

.wp-block-woocommerce-product-meta .mitode-pdp__meta,
.mitode-pdp__meta {
	display: flex;
	flex-wrap: wrap;
	gap: .35rem 1.5rem;
	font-size: .875rem;
	color: var(--wp--preset--color--contrast-2);
	padding-block-start: 1.25rem;
	border-top: 1px solid var(--wp--preset--color--border);
}
.wp-block-woocommerce-product-meta .mitode-pdp__meta > * { margin: 0; text-align: left; flex: 0 1 auto; }
.mitode-pdp__meta a { color: inherit; }
.mitode-pdp__meta .wp-block-post-terms__prefix { color: var(--wp--preset--color--contrast-3); }
.mitode-pdp__meta .wp-block-woocommerce-product-sku { white-space: nowrap; }

/* specs table -------------------------------------------------------- */

/*
 * W9H - the spec table runs to 28 rows on a panel, which buried the rest of
 * the page. The first five rows stay open and the remainder is behind a
 * toggle, the way the source shows "Show all parameters".
 *
 * Collapsing is opt-in from assets/js/pdp.js: the extra rows are only hidden
 * once the script has added .is-collapsed and revealed the button, so without
 * JavaScript the full table is still there and nothing is unreachable.
 */
.mitode-specs { margin-block: 0; }
.mitode-specs__title { font-size: clamp(1.35rem, 3vw, 1.75rem); margin: 0 0 1rem; }
.mitode-specs.is-collapsed .mitode-specs__row--extra { display: none; }
.mitode-specs__toggle[hidden] { display: none; }
.mitode-specs__toggle {
	display: inline-flex;
	align-items: center;
	gap: .5rem;
	margin-top: 1rem;
	padding: .7rem 1.4rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--contrast);
	font: inherit;
	font-weight: 700;
	font-size: .9375rem;
	cursor: pointer;
	transition: background .18s var(--mitode-ease), border-color .18s var(--mitode-ease);
}
.mitode-specs__toggle:hover { background: var(--wp--preset--color--surface); border-color: var(--wp--preset--color--contrast-3); }
.mitode-specs__toggle:focus-visible { outline: 3px solid var(--wp--preset--color--accent); outline-offset: 2px; }
.mitode-specs__toggle svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; transition: transform .2s var(--mitode-ease); }
.mitode-specs__toggle[aria-expanded="true"] svg { transform: rotate(180deg); }
@media (prefers-reduced-motion: reduce) {
	.mitode-specs__toggle, .mitode-specs__toggle svg { transition: none; }
}
/*
 * W27.4 - THE TABLE HAS TO BE AN OBJECT ON THE BAND, NOT PART OF IT.
 *
 * The band is `--muted`, which is `surface` (#f5f6f8). The label cells were
 * ALSO `surface`. Two identical greys with a 1 px `border` that
 * `border-collapse: collapse` then merges into the row lines: the table had
 * no visible body at all, which is what "die Technische-Daten-Sektion passt
 * optisch nicht" describes. `base` for the table and `surface-2` for the
 * label column give it a card of its own and keep the two columns legible.
 *
 * `border-collapse: separate` with zero spacing, because `collapse` also
 * discards `border-radius` - the rounded corners were declared and never
 * drawn.
 */
.mitode-specs__table {
	width: 100%;
	border-collapse: separate;
	border-spacing: 0;
	font-size: .9375rem;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
	overflow: hidden;
	table-layout: fixed;
}
.mitode-specs__table th,
.mitode-specs__table td {
	padding: .7rem .9rem;
	text-align: left;
	border-bottom: 1px solid var(--wp--preset--color--border);
	vertical-align: top;
	overflow-wrap: anywhere;
}
.mitode-specs__table tr:last-child th,
.mitode-specs__table tr:last-child td { border-bottom: 0; }
/*
 * 42% of a 960 px band was 400 px of label column; on the canonical 1320 px
 * shell the same percentage would open a canyon between a two-word label
 * and its value. A fixed measure keeps the pair reading as a pair at every
 * width, and `min()` stops it eating the value column on a narrow tablet.
 */
.mitode-specs__table th {
	width: min(38%, 20rem);
	font-weight: 500;
	color: var(--wp--preset--color--contrast-2);
	background: var(--wp--preset--color--surface-2);
}
.mitode-specs__table td { font-weight: 500; }

/*
 * Phones: stack the pair. `table-layout: fixed` with a 20rem label column
 * on a 358 px viewport leaves ~90 px for the value, which turns every
 * multi-word value into a column of single words. Stacking is the readable
 * form and it keeps the semantics - display is changed, roles are restored
 * so the table is still a table to assistive technology.
 */
@media (max-width: 599px) {
	.mitode-specs__table,
	.mitode-specs__table tbody,
	.mitode-specs__table tr,
	.mitode-specs__table th,
	.mitode-specs__table td { display: block; width: auto; }
	.mitode-specs__table { table-layout: auto; }
	.mitode-specs__table tr { border-bottom: 1px solid var(--wp--preset--color--border); }
	.mitode-specs__table tr:last-child { border-bottom: 0; }
	.mitode-specs__table th {
		border-bottom: 0;
		padding-bottom: .15rem;
		font-size: .8125rem;
		background: transparent;
	}
	.mitode-specs__table td { border-bottom: 0; padding-top: 0; }
}

/* related ------------------------------------------------------------ */

.mitode-pdp .related.products,
.mitode-pdp .products { margin-block-start: 0; }

/* ---------------------------------------------------------------------
 * 10. cart / checkout / account
 * ------------------------------------------------------------------ */

.wc-block-cart__empty-cart__title {
	font-size: clamp(1.25rem, 3vw, 1.6rem) !important;
	margin-block: 1rem 0;
}
.wc-block-cart__empty-cart__title.with-empty-cart-icon::before { opacity: .35; }
.mitode-store-page .wp-block-separator.is-style-dots { margin-block: 1.5rem; }
.mitode-store-page .wp-block-heading.has-text-align-center { text-align: left; font-size: clamp(1.35rem, 3vw, 1.75rem); }

.mitode-store .woocommerce-message,
.mitode-store .woocommerce-info,
.mitode-store .woocommerce-error,
.wc-block-components-notice-banner {
	border-radius: var(--mitode-radius);
	border-top: 0;
	border-left: 4px solid var(--wp--preset--color--info);
	background: var(--wp--preset--color--surface);
	font-size: .9375rem;
}
.mitode-store .woocommerce-message { border-left-color: var(--wp--preset--color--success); }
.mitode-store .woocommerce-error { border-left-color: var(--wp--preset--color--accent); }

.mitode-store .shop_table,
.wc-block-cart-items {
	width: 100%;
	border-collapse: collapse;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	overflow: hidden;
	font-size: .9375rem;
}
.mitode-store .shop_table th,
.mitode-store .shop_table td { padding: .85rem .9rem; border-bottom: 1px solid var(--wp--preset--color--border); }
.mitode-store .shop_table th { background: var(--wp--preset--color--surface); font-weight: 700; text-align: left; }

.wc-block-cart__submit-button,
.wc-block-components-checkout-place-order-button,
.mitode-store .checkout-button,
.mitode-store .button.alt,
.mitode-store button[name="update_cart"] {
	background: var(--wp--preset--color--accent);
	color: #fff;
	border: 0;
	border-radius: var(--mitode-radius-pill);
	padding: .9rem 1.6rem;
	font-weight: 700;
	text-decoration: none;
}
.wc-block-cart__submit-button:hover,
.wc-block-components-checkout-place-order-button:hover,
.mitode-store .checkout-button:hover,
.mitode-store .button.alt:hover { background: var(--wp--preset--color--accent-dark); color: #fff; }

.mitode-store button[name="update_cart"] { background: var(--wp--preset--color--contrast); }
.mitode-store button[name="update_cart"]:hover { background: #000; }

.wc-block-components-sidebar-layout .wc-block-components-sidebar {
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	padding: 1.25rem;
	background: var(--wp--preset--color--surface);
}

.mitode-store .cart_totals,
.mitode-store .cross-sells { margin-top: 2rem; }

.mitode-store .woocommerce-MyAccount-navigation ul {
	list-style: none;
	margin: 0 0 1.5rem;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: .35rem;
	border-bottom: 1px solid var(--wp--preset--color--border);
}
.mitode-store .woocommerce-MyAccount-navigation a {
	display: block;
	padding: .6rem 1rem;
	text-decoration: none;
	font-weight: 500;
	color: var(--wp--preset--color--contrast-2);
	border-bottom: 3px solid transparent;
}
.mitode-store .woocommerce-MyAccount-navigation li.is-active a { color: var(--wp--preset--color--contrast); border-bottom-color: var(--wp--preset--color--accent); }

.mitode-store input[type="text"],
.mitode-store input[type="email"],
.mitode-store input[type="tel"],
.mitode-store input[type="password"],
.mitode-store input[type="number"],
.mitode-store textarea,
.mitode-store select {
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
	padding: .65rem .8rem;
	font: inherit;
	background: var(--wp--preset--color--base);
	color: inherit;
	max-width: 100%;
}

/* ---------------------------------------------------------------------
 * 11. footer
 * ------------------------------------------------------------------ */

.mitode-footer {
	background: #232323;
	color: #b9bcc7;
	margin-top: clamp(3rem, 8vw, 6rem);
}
.mitode-front .mitode-footer { margin-top: 0; }

.mitode-footer__main {
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding: clamp(2.5rem, 6vw, 4rem) var(--mitode-gut) clamp(2rem, 4vw, 3rem);
	display: grid;
	gap: 2rem;
	grid-template-columns: minmax(0, 1fr);
}

@media (min-width: 640px) {
	.mitode-footer__main { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* brand block plus the four link groups of the source footer (audit s7) */
@media (min-width: 1024px) {
	.mitode-footer__main { grid-template-columns: 1.5fr repeat(4, minmax(0, 1fr)); gap: 2.25rem; }
}

.mitode-footer h2,
.mitode-footer h3 {
	color: #fff;
	font-size: 1rem;
	font-weight: 700;
	letter-spacing: .08em;
	text-transform: uppercase;
	margin: 0 0 1.1rem;
}

.mitode-footer ul { list-style: none; margin: 0; padding: 0; display: grid; gap: .55rem; }
.mitode-footer a { color: #b9bcc7; text-decoration: none; font-size: .9375rem; }
.mitode-footer a:hover { color: #fff; text-decoration: underline; }

/* ---------------------------------------------------------------------
 * 12. editorial (blog, pages)
 * ------------------------------------------------------------------ */

.mitode-page-head {
	background: var(--wp--preset--color--surface);
	border-bottom: 1px solid var(--wp--preset--color--border);
	padding-block: clamp(1.75rem, 4vw, 3rem);
}
.mitode-page-head h1 { margin: 0; font-size: clamp(1.85rem, 4.4vw, 2.75rem); letter-spacing: -.02em; }

.mitode-postlist {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 1.25rem;
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr));
}
.mitode-postlist article,
.mitode-postlist .wp-block-post {
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	overflow: hidden;
	background: var(--wp--preset--color--base);
	display: flex;
	flex-direction: column;
	transition: box-shadow .2s var(--mitode-ease), transform .2s var(--mitode-ease);
}
.mitode-postlist .wp-block-post:hover { box-shadow: var(--wp--preset--shadow--card); transform: translateY(-2px); }
.mitode-postlist .wp-block-post > * { padding-inline: 1.25rem; }
.mitode-postlist .wp-block-post-featured-image { padding-inline: 0; margin: 0 0 1rem; }
.mitode-postlist .wp-block-post-featured-image img { aspect-ratio: 16 / 9; object-fit: cover; width: 100%; }
.mitode-postlist .wp-block-post-title { font-size: 1.15rem; margin: 0 0 .5rem; }
.mitode-postlist .wp-block-post-title a { text-decoration: none; }
.mitode-postlist .wp-block-post-excerpt { font-size: .9375rem; color: var(--wp--preset--color--contrast-2); }
.mitode-postlist .wp-block-post-date { font-size: .8125rem; color: var(--wp--preset--color--contrast-3); padding-bottom: 1.25rem; }

/* W9L: --mitode-measure, not 72ch - see the token definition in section 1. */
.mitode-page-body .wp-block-post-content,
.mitode-prose { max-width: var(--mitode-measure); }
.mitode-page-body > .wp-block-post-featured-image { max-width: 900px; margin-block-end: 2rem; }
.mitode-page-body > .wp-block-post-featured-image img { width: 100%; height: auto; }
.mitode-prose h2 { margin-block: 2.25rem .75rem; }
.mitode-prose h3 { margin-block: 1.75rem .5rem; }
.mitode-prose ul, .mitode-prose ol { padding-left: 1.25rem; }
.mitode-prose li { margin-block: .4rem; }

/* ---------------------------------------------------------------------
 * 13. utilities + print
 * ------------------------------------------------------------------ */

.mitode-visually-hidden {
	position: absolute !important;
	width: 1px; height: 1px;
	margin: -1px; padding: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
	border: 0;
}

.mitode-store .woocommerce-breadcrumb { display: none; }

@media print {
	.mitode-header, .mitode-announce, .mitode-drawer, .mitode-footer, .mitode-btnrow { display: none !important; }
	body { color: #000; background: #fff; }
}

/* ---------------------------------------------------------------------
 * 14. category / PDP content blocks (W9A.1)
 * ------------------------------------------------------------------ */

/*
 * Feature tiles and an FAQ accordion. Both appear on the source category
 * page and on the source PDP, in the same visual language, which is a large
 * part of why those pages read as landing pages rather than listings
 * (W9A.1 audit sections 5 and 6).
 */

.mitode-usp__title,
.mitode-faq__title {
	font-size: clamp(1.35rem, 2.6vw, 1.85rem);
	font-weight: 700;
	letter-spacing: -.01em;
	margin: 0 0 1.25rem;
	color: var(--wp--preset--color--contrast);
}
.mitode-faq__title { text-align: center; }

.mitode-usp__grid {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: clamp(.75rem, 1.6vw, 1.25rem);
	grid-template-columns: repeat(2, minmax(0, 1fr));
}
@media (min-width: 782px)  { .mitode-usp__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 1180px) { .mitode-usp__grid { grid-template-columns: repeat(6, minmax(0, 1fr)); } }

.mitode-usp__item {
	margin: 0;
	padding: 1.1rem 1rem;
	background: var(--wp--preset--color--surface);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
}
.mitode-usp__icon {
	display: block;
	width: 24px;
	height: 24px;
	margin-bottom: .6rem;
	fill: none;
	stroke: var(--wp--preset--color--accent);
	stroke-width: 1.6;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.mitode-usp__name {
	margin: 0 0 .3rem;
	font-size: .9375rem;
	font-weight: 700;
	line-height: 1.3;
	color: var(--wp--preset--color--contrast);
}
.mitode-usp__text {
	margin: 0;
	font-size: .8125rem;
	line-height: 1.5;
	color: var(--wp--preset--color--contrast-2);
}

/* FAQ - HTML-only accordion, no script */

/*
 * W9H - the FAQ is a centred block, as on the source page: heading and lede
 * centred, the accordion column centred under them. The question text itself
 * stays left-aligned inside its row - centring a clickable row label makes it
 * hard to scan.
 */
.mitode-faq { text-align: center; }
.mitode-faq__lede {
	max-width: 52rem;
	margin: -.5rem auto 1.75rem;
	font-size: var(--mitode-fs-lede, 1.0625rem);
	line-height: 1.6;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-faq__list {
	display: grid;
	gap: .6rem;
	max-width: 56rem;
	margin-inline: auto;
	text-align: left;
}
.mitode-faq__item {
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--base);
}
.mitode-faq__q {
	list-style: none;
	cursor: pointer;
	padding: 1rem 3rem 1rem 1.15rem;
	position: relative;
	font-size: 1.0625rem;
	font-weight: 600;
	line-height: 1.4;
	color: var(--wp--preset--color--contrast);
}
.mitode-faq__q::-webkit-details-marker { display: none; }
.mitode-faq__q::after {
	content: "";
	position: absolute;
	right: 1.25rem;
	top: 50%;
	width: 9px;
	height: 9px;
	margin-top: -6px;
	border-right: 2px solid var(--wp--preset--color--contrast-3);
	border-bottom: 2px solid var(--wp--preset--color--contrast-3);
	transform: rotate(45deg);
	transition: transform .18s var(--mitode-ease);
}
.mitode-faq__item[open] .mitode-faq__q::after { transform: rotate(-135deg); margin-top: -2px; }
.mitode-faq__item:hover { border-color: #c9cdd6; }
.mitode-faq__a {
	padding: 0 1.15rem 1.1rem;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-faq__a p { margin: 0; line-height: 1.65; }

/* ---------------------------------------------------------------------
 * 15. W9B - PDP content bands, section nav, carousel, footer layer 2
 * ------------------------------------------------------------------ */

/*
 * The long product content is a sequence of full-width bands with centered
 * inner containers, alternating white and light grey like the source PDP's
 * detail flow. The description HTML itself stays untouched in WooCommerce;
 * mitode_render_long_description() only lays it out.
 */

.mitode-band { padding-block: clamp(2.5rem, 6vw, 4.5rem); }
.mitode-band--muted { background: var(--wp--preset--color--surface); }

/*
 * W27.4 - THE BAND'S CONTENT BOX IS THE SHELL, NOT ITS BORDER BOX.
 *
 * `[class^="mitode-"]` is border-box, so `max-width: 1320px` WITH
 * `padding-inline: 40px` gave a 1240 px content box starting at x=100,
 * while `.overlay-content_product_page` - which puts its gutter on the
 * outer container instead - gave a 1320 px content box starting at x=53.
 * Two shells, 47 px apart, on the same product page. Adding the gutter back
 * into the max-width makes the CONTENT boxes identical at every width
 * (measured 1440/1280/834/390), which is what "one content shell" has to
 * mean if it is to be checkable.
 */
.mitode-band__inner {
	max-width: calc(var(--mitode-shell) + 2 * var(--mitode-gut));
	margin-inline: auto;
	padding-inline: var(--mitode-gut);
}
/* same correction: 60rem is the reading measure of the CONTENT, not of the
   box plus its gutters */
.mitode-band__inner--narrow { max-width: calc(60rem + 2 * var(--mitode-gut)); }

.mitode-band__title {
	font-size: clamp(1.45rem, 3vw, 2rem);
	letter-spacing: -.015em;
	margin-block: 0 clamp(1rem, 2.5vw, 1.75rem);
}
.mitode-band__inner--narrow .mitode-band__title { text-align: center; }

.mitode-prose--center { margin-inline: auto; }
.mitode-band__inner--narrow .mitode-prose { max-width: 70ch; margin-inline: auto; }
.mitode-band .mitode-prose p { font-size: 1.0625rem; line-height: 1.7; color: var(--wp--preset--color--contrast-2); }
.mitode-band .mitode-prose p:first-child { margin-block-start: 0; }

/* anchor targets scroll below the sticky two-row header */
#beschreibung, #technische-daten, #haeufige-fragen, #aehnliche-geraete {
	scroll-margin-top: 10.5rem;
}

/* split band: prose or checklist beside existing gallery photography */

.mitode-split {
	display: grid;
	gap: clamp(1.5rem, 4vw, 3.5rem);
	align-items: center;
}
@media (min-width: 900px) {
	.mitode-split { grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr); }
	.mitode-split--reverse .mitode-split__media { order: -1; }
}
.mitode-split__media { margin: 0; }
.mitode-split__img,
.mitode-split__media img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 4 / 3;
	object-fit: cover;
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--surface);
}
.mitode-split__body > .mitode-band__title { text-align: left; }

/* benefit checklist - the description's own <ul>, as feature cards */

.mitode-benefits {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: clamp(.75rem, 1.6vw, 1.25rem);
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 270px), 1fr));
}
.mitode-benefits__item {
	display: flex;
	gap: .7rem;
	align-items: flex-start;
	margin: 0;
	padding: 1.05rem 1.15rem;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	font-size: .9375rem;
	line-height: 1.55;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-band--muted .mitode-benefits__item { border-color: transparent; box-shadow: var(--wp--preset--shadow--card); }
.mitode-benefits__item svg {
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	margin-top: .1rem;
	fill: none;
	stroke: var(--wp--preset--color--accent);
	stroke-width: 2.2;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.mitode-benefits__item strong { color: var(--wp--preset--color--contrast); }

/* tables and media inside the description flow */

.mitode-longdesc__table { overflow-x: auto; }
.mitode-longdesc__table table { width: 100%; border-collapse: collapse; font-size: .9375rem; }
.mitode-longdesc__table th,
.mitode-longdesc__table td { padding: .7rem .9rem; text-align: left; border-bottom: 1px solid var(--wp--preset--color--border); }

.mitode-longdesc__figure { margin: 0; text-align: center; }
.mitode-longdesc__figure img { max-width: 100%; height: auto; border-radius: var(--mitode-radius-lg); }

/* PDP section navigation - scroll-to anchors, styled like the source tab bar */

.mitode-pdp__sections { margin-block-start: clamp(2rem, 5vw, 3.5rem); }

/*
 * W9F - the source presents the lower half of the PDP as a tab bar: 18/700
 * labels on tabs with 20px top corners, the active one white and joined to
 * the panel below it. It switches panes with JavaScript and hides the rest.
 *
 * Here the same bar addresses real sections that all stay in the document -
 * better for search, for printing and for anyone without the script - so it
 * is an anchor nav styled as that tab bar, made sticky and given a
 * scroll-spy active state in assets/js/pdp.js. Visually the source's
 * mechanism; structurally still one continuous page.
 */
.mitode-pdp-nav {
	border-bottom: 1px solid var(--wp--preset--color--border);
	background: var(--wp--preset--color--base);
}
.mitode-pdp-nav ul {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	gap: .25rem;
	overflow-x: auto;
	scrollbar-width: none;
	-webkit-overflow-scrolling: touch;
}
.mitode-pdp-nav ul::-webkit-scrollbar { display: none; }
.mitode-pdp-nav a {
	display: block;
	padding: .95rem clamp(.85rem, 1.8vw, 1.5rem) .85rem;
	font-size: clamp(.9375rem, 1.3vw, 1.125rem);
	font-weight: 700;
	color: var(--wp--preset--color--contrast-2);
	text-decoration: none;
	white-space: nowrap;
	border: 1px solid transparent;
	border-bottom: 0;
	border-radius: var(--mitode-radius-lg) var(--mitode-radius-lg) 0 0;
	transition: color .16s var(--mitode-ease), background .16s var(--mitode-ease);
}
.mitode-pdp-nav a:hover,
.mitode-pdp-nav a:focus-visible {
	color: var(--wp--preset--color--contrast);
	background: var(--wp--preset--color--surface);
}
.mitode-pdp-nav a[aria-current="true"] {
	color: var(--wp--preset--color--contrast);
	background: var(--wp--preset--color--base);
	border-color: var(--wp--preset--color--border);
	box-shadow: 0 1px 0 0 var(--wp--preset--color--base);
}

/* anchored sections must clear the sticky site header when jumped to */
.mitode-pdp [id="beschreibung"],
.mitode-pdp [id="technische-daten"],
.mitode-pdp [id="haeufige-fragen"],
.mitode-pdp [id="aehnliche-geraete"] { scroll-margin-top: 9rem; }

/* jump link in the summary - anchor stand-in for the source's inline
   related block; the actual card grid sits at the end of the content flow */

.mitode-pdp__jump { margin-block: 0 1.25rem; }
.mitode-pdp__jump a {
	display: inline-flex;
	align-items: center;
	gap: .4rem;
	font-size: .9375rem;
	font-weight: 600;
	color: var(--wp--preset--color--contrast);
	text-decoration: none;
	border-bottom: 1px solid var(--wp--preset--color--border);
	padding-bottom: .15rem;
}
.mitode-pdp__jump a:hover { color: var(--wp--preset--color--accent); border-bottom-color: currentColor; }
.mitode-pdp__jump svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

/* ---- product carousel ------------------------------------------------ */

/*
 * The track is plain CSS: overflow-x + scroll-snap, so swipe, wheel and
 * keyboard scrolling need no script. carousel.js only adds the arrow
 * paging; until it runs (or if it never runs) the arrows stay hidden.
 */

.mitode-carousel { position: relative; --mitode-carousel-gap: clamp(1rem, 2.2vw, 1.75rem); }

.mitode-cards--carousel {
	display: flex;
	grid-template-columns: none;
	gap: var(--mitode-carousel-gap);
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	overscroll-behavior-x: contain;
	padding-block-end: .75rem;
	scrollbar-width: thin;
	scrollbar-color: var(--wp--preset--color--border) transparent;
}

.mitode-cards--carousel > .mitode-card {
	/*
	 * W51 - NARROWER ON A PHONE, ON THE OWNER'S MEASUREMENT.
	 *
	 * It used to be 74vw, which at 390px is a 289px card and leaves about
	 * a tenth of the next one showing. A tenth does not read as "there is
	 * more"; it reads as a layout that ran out of room.
	 *
	 * 50vw is arithmetic, not a guess: the rail is 358px inside a 390px
	 * phone and the gap is 16px, so 1.75 cards fit in 342px and one card
	 * is 195px - which is 50vw exactly. Measured after: 0.75 of the second
	 * card at 390, 0.73 at 360, 0.70 at 320. (52vw was tried first and
	 * came out at 0.69.)
	 *
	 * The card gets its OWN scale below rather than being squeezed: the
	 * zone heights and the type sizes are custom properties, so shrinking
	 * the box without shrinking them would push a two-line title into
	 * three lines and stretch the card taller, not smaller.
	 */
	flex: 0 0 50vw;
	max-width: 232px;
	scroll-snap-align: start;
}

/*
 * The narrow card's own scale. Scoped to the carousel below 600px, so the
 * two-column phone GRID on the category archives is untouched - the same
 * card class is used in both places and only one of them got narrower.
 */
@media (max-width: 599px) {
	.mitode-cards--carousel > .mitode-card {
		--mitode-card-pad: .7rem;
		--mitode-card-title-h: 2.3rem;   /* 2 lines at .85rem / 1.35 */
		--mitode-card-avail-h: 1rem;
		--mitode-card-price-h: 2.6rem;
	}
	.mitode-cards--carousel > .mitode-card .mitode-card__title {
		font-size: .85rem !important;
	}
	.mitode-cards--carousel > .mitode-card .mitode-avail {
		font-size: .75rem !important;
	}
	.mitode-cards--carousel > .mitode-card .mitode-card__now { font-size: 1.05rem; }
	.mitode-cards--carousel > .mitode-card .mitode-card__was { font-size: .75rem; min-height: 1rem; }
	.mitode-cards--carousel > .mitode-card .mitode-card__price { margin-bottom: .6rem; }
	.mitode-cards--carousel > .mitode-card .mitode-card__cta .button,
	.mitode-cards--carousel > .mitode-card .mitode-card__cta a {
		padding: .6rem .5rem;
		font-size: .8125rem;
		/*
		 * German compounds do not break on their own, and "In den
		 * Warenkorb" is 15 characters in a 175px pill. Allowing a break
		 * inside a word is what keeps the label inside the button instead
		 * of pushing the card wider than its flex-basis.
		 */
		overflow-wrap: anywhere;
	}
	.mitode-cards--carousel > .mitode-card .mitode-card__button-icon {
		width: 1em;
		height: 1em;
		margin-right: .35em;
	}
	/*
	 * W53 - the ONLY change this stage makes to the home carousel, and it
	 * is the tweak the brief explicitly permits (3A: font/padding, when it
	 * improves legibility). At 320 the CTA measured 52.97px tall - "In den
	 * Warenkorb" on two lines in a 135px pill. At 12px it is one line from
	 * 320 up. Card geometry, card count and the 1.84-cards-per-view
	 * framing are untouched.
	 */
	@media (max-width: 340px) {
		.mitode-cards--carousel > .mitode-card .mitode-card__cta .button {
			font-size: .75rem;
			padding-inline: .5rem;
		}
	}
	/* The badge and the free-shipping flag ride on the media box. */
	.mitode-cards--carousel > .mitode-card .mitode-card__badge,
	.mitode-cards--carousel > .mitode-card .mitode-badge { font-size: .6875rem; }
}
@media (min-width: 600px) {
	.mitode-cards--carousel > .mitode-card {
		flex-basis: calc((100% - var(--mitode-carousel-gap)) / 2);
		max-width: none;
	}
}
@media (min-width: 782px) {
	.mitode-cards--carousel > .mitode-card {
		flex-basis: calc((100% - 2 * var(--mitode-carousel-gap)) / 3);
	}
}
@media (min-width: 1180px) {
	.mitode-cards--carousel > .mitode-card {
		flex-basis: calc((100% - 3 * var(--mitode-carousel-gap)) / 4);
	}
}

.mitode-carousel__btn {
	position: absolute;
	top: 32%;
	z-index: 3;
	display: none;
	align-items: center;
	justify-content: center;
	width: 46px;
	height: 46px;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 999px;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--contrast);
	cursor: pointer;
	box-shadow: var(--wp--preset--shadow--card);
	transition: background .16s var(--mitode-ease), color .16s var(--mitode-ease), opacity .16s var(--mitode-ease);
}
.mitode-carousel__btn svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.mitode-carousel__btn--prev { left: -12px; }
.mitode-carousel__btn--next { right: -12px; }
.mitode-carousel__btn:hover:not(:disabled) { background: var(--wp--preset--color--contrast); color: #fff; }
.mitode-carousel__btn:disabled { opacity: .35; cursor: default; }

/* arrows appear only once the script marked the carousel ready AND there
   is something to scroll; touch viewports keep swipe + scrollbar */
@media (min-width: 782px) {
	.mitode-carousel--ready.mitode-carousel--scrollable .mitode-carousel__btn { display: inline-flex; }
}

.mitode-footer__group h2 { position: relative; padding-bottom: .55rem; margin-bottom: 1.1rem; }
.mitode-footer__group h2::after {
	content: "";
	position: absolute;
	left: 0;
	bottom: 0;
	width: 28px;
	height: 2px;
	background: var(--wp--preset--color--accent);
}
.mitode-footer a { transition: color .14s var(--mitode-ease); }

/* ---------------------------------------------------------------------
 * 16. W9C - header fixes, language switcher, video hero, trust track,
 *     card second-image hover, footer v3
 * ------------------------------------------------------------------ */

/* ---- language switcher ---------------------------------------------- */

/*
 * Cross-domain market switcher in the header action cluster. The menu opens
 * on hover and on focus-within in plain CSS; ui.js adds the click toggle,
 * aria-expanded, Escape and arrow keys.
 */
.mitode-lang { position: relative; }
.mitode-lang__toggle { gap: .35rem; padding-inline: .45rem; }
.mitode-lang__code { font-size: .8125rem; font-weight: 700; letter-spacing: .04em; }
.mitode-lang__caret { width: 14px !important; height: 14px !important; opacity: .7; }
.mitode-flag {
	display: inline-block;
	width: 21px;
	height: 14px;
	border-radius: 2px;
	box-shadow: 0 0 0 1px rgba(0, 0, 0, .18);
	flex: 0 0 auto;
}

/*
 * W9L: every rule below is scoped under .mitode-lang, and that is not
 * cosmetic.
 *
 * The footer stylesheet carries `.mitode-footer ul { display: grid }` and
 * `.mitode-footer a { color: #b9bcc7 }`. Those are (0,1,1); the component's
 * own `.mitode-lang__menu` rules were (0,1,0). So the moment the switcher
 * was placed in the footer (W9L), the ancestor won: the dropdown was
 * PERMANENTLY OPEN, laid out as a grid, with grey links on its white panel.
 * A component that can be placed anywhere has to out-specify the containers
 * it may be placed in.
 */
.mitode-lang .mitode-lang__menu {
	display: none;
	position: absolute;
	top: calc(100% + 6px);
	right: 0;
	z-index: 95;
	min-width: 13rem;
	margin: 0;
	padding: .4rem;
	gap: 0;
	list-style: none;
	background: #fff;
	color: var(--wp--preset--color--contrast);
	border-radius: var(--mitode-radius);
	box-shadow: var(--mitode-shadow-pop);
}
/* open state is owned by ui.js (click / keyboard / hover); the :focus-within
   rule is the no-JS keyboard fallback */
.mitode-lang.is-open .mitode-lang__menu,
.mitode-lang:not(.is-ready):focus-within .mitode-lang__menu { display: block; }
/* W9C.1 root cause 1: the 6px gap between trigger and menu dropped :hover /
   fired mouseleave while the pointer crossed it. Invisible bridge. */
.mitode-lang .mitode-lang__menu::before {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	top: -8px;
	height: 8px;
}
.mitode-lang .mitode-lang__menu li { margin: 0; padding: 0; }
.mitode-lang .mitode-lang__menu a {
	display: flex;
	align-items: center;
	gap: .65rem;
	padding: .55rem .75rem;
	border-radius: 6px;
	color: var(--wp--preset--color--contrast);
	font-size: .9375rem;
	font-weight: 400;
	text-decoration: none;
	white-space: nowrap;
}
.mitode-lang .mitode-lang__menu a small { margin-inline-start: auto; font-size: .75rem; font-weight: 700; color: var(--wp--preset--color--contrast-3); letter-spacing: .04em; }
.mitode-lang .mitode-lang__menu a:hover,
.mitode-lang .mitode-lang__menu a:focus-visible { background: var(--wp--preset--color--surface); color: var(--wp--preset--color--accent); text-decoration: none; }
.mitode-lang .mitode-lang__menu a[aria-current="true"] { font-weight: 700; }
.mitode-lang .mitode-lang__menu a[aria-current="true"]::after {
	content: "";
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: var(--wp--preset--color--accent);
	flex: 0 0 auto;
}
@media (max-width: 400px) {
	/* W9L: scoped to the header. Space is tight in the action cluster, not
	   in the footer - and the footer trigger must keep reading "DE". */
	.mitode-lang--header .mitode-lang__code { display: none; }
	.mitode-lang--header .mitode-lang__toggle { padding-inline: .35rem; }
}

/* ---- footer variant of the same control ------------------------------ */

/*
 * W9L. Same component, same script, same keyboard rules as the header
 * (inc/nav.php -> mitode_market_selector). Two differences, both because
 * of where it sits: it is a pill on the dark band rather than a round icon
 * button, and it opens UPWARDS - there is nothing below the copyright row.
 */
/*
 * W9N sizing. The trigger is a real control in the footer's utility row:
 * it names the domain, and it is 48px tall so it clears the 44px touch
 * target on a phone.
 *
 * W9M had it fill its column up to 20rem, because it was then the only
 * thing in a band of its own. In the utility row it shares a line with the
 * certification marks, so it sizes to its content - a stretched pill next
 * to four small marks would have looked like an input field.
 */
/*
 * W9N.1 sizing. The owner asked for a smaller, more elegant control: at
 * 15px/500 in a 48px pill it was the heaviest thing in the utility row and
 * competed with the certification marks opposite it. 13px, a lighter
 * letter-spacing and a 36px pill make it read as a utility control rather
 * than as a form field.
 *
 * The 44px touch target is kept where it matters: on a pointer-coarse
 * viewport the pill goes back to 44px below. A 36px tap target on a phone
 * would be an accessibility regression, and this control is the one thing
 * in the footer that a visitor on the wrong market's shop has to be able
 * to hit.
 */
.mitode-lang--footer .mitode-lang__toggle {
	display: inline-flex;
	align-items: center;
	gap: .45rem;
	max-width: 100%;
	min-height: 36px;
	padding: .4rem .7rem;
	border: 1px solid rgba(255, 255, 255, .22);
	border-radius: var(--mitode-radius);
	background: rgba(255, 255, 255, .04);
	color: rgba(255, 255, 255, .82);
	font: inherit;
	font-size: .8125rem;
	font-weight: 400;
	letter-spacing: .01em;
	line-height: 1.2;
	text-align: start;
	cursor: pointer;
	transition: background .16s var(--mitode-ease), color .16s var(--mitode-ease), border-color .16s var(--mitode-ease);
}
/*
 * The 44px touch target is keyed on the POINTER, not on the viewport width.
 *
 * The first version of this used `max-width: 781px`, which is the wrong
 * question: a 1024px tablet is a coarse-pointer device at a desktop width
 * and would have got the 36px control. Caught by the responsive sweep,
 * which runs headless Chrome with coarse-pointer blink settings and
 * therefore reproduces exactly that case at 1440px.
 *
 * `any-pointer: coarse` rather than `pointer: coarse`, so a laptop with a
 * touchscreen and a trackpad gets the larger target too - it can be tapped.
 */
@media (any-pointer: coarse), (max-width: 781px) {
	.mitode-lang--footer .mitode-lang__toggle { min-height: 44px; padding-block: .6rem; }
}
.mitode-lang--footer .mitode-lang__domain { white-space: nowrap; }
/* the caret is pushed to the trailing edge, so the control reads as a menu */
.mitode-lang--footer .mitode-lang__caret { margin-inline-start: auto; }
.mitode-lang--footer .mitode-lang__toggle:hover,
.mitode-lang--footer.is-open .mitode-lang__toggle {
	background: rgba(255, 255, 255, .12);
	border-color: rgba(255, 255, 255, .38);
	color: #fff;
}
.mitode-lang--footer .mitode-lang__toggle:focus-visible {
	outline: 2px solid #fff;
	outline-offset: 2px;
}
.mitode-lang--footer .mitode-flag { width: 19px; height: 13px; border-radius: 2px; }
.mitode-lang--footer .mitode-lang__caret { width: 14px !important; height: 14px !important; opacity: .7; }
.mitode-lang--footer.is-open .mitode-lang__caret { transform: rotate(180deg); }

.mitode-lang.mitode-lang--footer .mitode-lang__menu {
	/* aligned with the trigger's leading edge, and never wider than the
	   viewport it has to fit into on a 375px phone */
	right: auto;
	left: 0;
	min-width: min(20rem, calc(100vw - 2 * var(--mitode-gut)));
	max-width: calc(100vw - 2 * var(--mitode-gut));
}

/*
 * W9N.1 - in the footer each entry is one domain on one line. The <small>
 * second line is no longer rendered (inc/nav.php), so the rules that
 * wrapped it are gone with it; five one-line entries are the whole menu.
 * The header entry is unchanged - country, then code, on one line.
 */
.mitode-lang--footer .mitode-lang__menu a {
	font-size: .8125rem;
	font-weight: 400;
	padding-block: .5rem;
}
.mitode-lang--footer .mitode-lang__menu a > span { flex: 1 1 auto; }

/*
 * W9M - the menu opens where there is room.
 *
 * W9L pinned the footer variant upwards, which was right while the control
 * sat in the copyright band at the very bottom of the document. In the
 * secondary row there can be several hundred pixels of footer below it, so a
 * fixed direction is now a guess. assets/js/ui.js measures the trigger
 * against the viewport when the menu opens and sets `is-up` only when the
 * menu would otherwise be cut off below. Without the script nothing sets the
 * class and the menu opens downwards - inside the footer, where there is
 * always room after the copyright and closing bands.
 */
.mitode-lang.is-up .mitode-lang__menu {
	top: auto;
	bottom: calc(100% + 6px);
}
/* the hover bridge belongs under the menu when the menu is above */
.mitode-lang.is-up .mitode-lang__menu::before {
	top: auto;
	bottom: -8px;
}

/*
 * ...and the same for the horizontal edge. ui.js sets `is-end` when the
 * menu would hang off the right of the viewport, which is what happens to
 * the footer control now that it sits at the trailing edge of its row.
 */
.mitode-lang.is-end .mitode-lang__menu {
	left: auto;
	right: 0;
}

/* ---- video hero carousel --------------------------------------------- */

/*
 * Full-bleed media carousel. Slides are stacked and crossfaded (no
 * horizontal scroll width for 8 MB videos); only the active one is
 * visible, so hidden videos are also paused and unloaded by hero.js. The
 * viewport keeps the aspect of the source pairs - wide 1920x700 on desktop,
 * square on phones - so the box never resizes when the video arrives (no
 * layout shift). Behind every video sits the brand gradient: a failed or
 * blocked video shows copy on that gradient, never an empty black band.
 */
.mitode-hero-carousel {
	position: relative;
	background: var(--wp--preset--color--dark-deep);
	color: #fff;
	isolation: isolate;
}

.mitode-hero-carousel__viewport {
	position: relative;
	width: 100%;
	aspect-ratio: 1 / 1;
	/* W9E - a 1:1 stage is right on a phone and 768 px tall on a tablet;
	   cap it so the hero never eats a whole tablet viewport */
	max-height: min(86vh, 560px);
	overflow: hidden;
	touch-action: pan-y;
}
@media (min-width: 782px) {
	.mitode-hero-carousel__viewport {
		aspect-ratio: 1920 / 700;
		min-height: 400px;
		max-height: min(720px, 82vh);
	}
}

.mitode-hero-carousel__track { position: absolute; inset: 0; }

.mitode-hero-slide {
	position: absolute;
	inset: 0;
	opacity: 0;
	visibility: hidden;
	transition: opacity .7s var(--mitode-ease), visibility 0s linear .7s;
}
.mitode-hero-slide.is-active {
	opacity: 1;
	visibility: visible;
	transition: opacity .7s var(--mitode-ease), visibility 0s;
	z-index: 1;
}

.mitode-hero-slide__media {
	position: absolute;
	inset: 0;
	background:
		radial-gradient(120% 90% at 78% 12%, rgba(248, 1, 32, .38) 0%, rgba(248, 1, 32, 0) 58%),
		radial-gradient(90% 80% at 12% 92%, rgba(25, 151, 229, .22) 0%, rgba(25, 151, 229, 0) 60%),
		linear-gradient(160deg, #171717 0%, #0a0a0a 70%);
}
.mitode-hero-slide__video,
.mitode-hero-slide__poster {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
	display: block;
}
.mitode-hero-slide.has-video-error .mitode-hero-slide__video { display: none; }

/* text over the video - a left-to-right veil on wide, a bottom veil on phones */
.mitode-hero-slide__overlay {
	position: absolute;
	inset: 0;
	z-index: 2;
	display: flex;
	align-items: flex-end;
	background: linear-gradient(180deg, rgba(10, 10, 10, 0) 30%, rgba(10, 10, 10, .55) 70%, rgba(10, 10, 10, .85) 100%);
}
@media (min-width: 782px) {
	.mitode-hero-slide__overlay {
		align-items: center;
		background: linear-gradient(90deg, rgba(10, 10, 10, .74) 0%, rgba(10, 10, 10, .42) 48%, rgba(10, 10, 10, .05) 78%, rgba(10, 10, 10, 0) 100%);
	}
}
.mitode-hero-slide__inner {
	width: 100%;
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding: 1.25rem var(--mitode-gut) 3.4rem;
}
@media (min-width: 782px) {
	.mitode-hero-slide__inner { padding-block: 2rem 3.5rem; }
}
.mitode-hero-slide__title {
	color: #fff;
	margin: 0 0 .75rem;
	/*
	 * W9N.3: was 15ch, which folds the longest live headline ("Entdecken
	 * Sie Ihr volles Potenzial") onto three lines at every size - the owner
	 * flagged it on desktop. 18ch carries it as two balanced lines and
	 * still keeps short titles from stretching across the video.
	 */
	max-width: 18ch;
	text-wrap: balance;
	/*
	 * W72-C - 25 % smaller than W9N.3's 4.6vw / 3.6rem, on the owner's
	 * instruction, and scaled at ALL THREE ends of the clamp rather than
	 * multiplied at one of them. A reduction applied only to the maximum
	 * disappears below the width where the maximum stops applying, which
	 * on this headline is about 1252px - the owner would have got a
	 * smaller headline at 1440 and the old one at 1280.
	 *
	 * `max-width: 18ch` is in CHARACTERS, so the measure shrinks with the
	 * type and the headline keeps the same number of lines. That is what
	 * makes this a type change and not a layout change: no reflow of the
	 * slide, no shift of the buttons under it, no CLS.
	 */
	font-size: clamp(1.3875rem, 3.45vw, 2.7rem);
	line-height: 1.06;
	letter-spacing: -.02em;
	text-shadow: 0 2px 18px rgba(0, 0, 0, .45);
}
.mitode-hero-slide__title em { font-style: normal; color: var(--wp--preset--color--accent); }
.mitode-hero-slide__text {
	margin: 0 0 1.25rem;
	max-width: 44ch;
	font-size: clamp(.9375rem, 1.6vw, 1.1875rem);
	line-height: 1.5;
	color: rgba(255, 255, 255, .86);
	text-shadow: 0 1px 10px rgba(0, 0, 0, .45);
}
@media (max-width: 781px) {
	.mitode-hero-slide__text {
		display: -webkit-box;
		-webkit-line-clamp: 3;
		line-clamp: 3;
		-webkit-box-orient: vertical;
		overflow: hidden;
	}
}
.mitode-hero-slide .mitode-btn { border-radius: 999px; padding: .85rem 1.5rem; }
.mitode-hero-slide .mitode-btn--ghost { background: rgba(255, 255, 255, .1); border-color: rgba(255, 255, 255, .6); backdrop-filter: blur(4px); }

/*
 * W51 - THE PHONE BANNER TYPE, ON THE OWNER'S NUMBERS: -25% on the slide
 * headline, -20% on the slide buttons, phones only.
 *
 * Both sizes are scaled at BOTH ends of the clamp, not just at the floor.
 * The headline's floor (1.85rem) is what actually applies at 390px, but
 * leaving 4.6vw in place would have made the reduction disappear again
 * somewhere around 640px and given the owner a headline that shrinks and
 * then grows back inside the same phone range.
 *
 * The button keeps its 44px touch target: only the type gets smaller, and
 * the padding is raised a little so the pill does not collapse around it.
 */
@media (max-width: 781px) {
	.mitode-hero-slide .mitode-btn {
		font-size: .8rem;
		padding: .9rem 1.4rem;
	}
}
/* The headline's phone size is NOT here - it has to be restated at
   (0,2,0) next to `:root .mitode-hero-slide__title`, further down this
   file. Written here so the next reader does not add it twice. */

/* controls - real buttons, shown once hero.js is ready */
.mitode-hero-carousel__arrow,
.mitode-hero-carousel__pause,
.mitode-hero-carousel__dots { display: none; }
.mitode-hero-carousel.is-ready .mitode-hero-carousel__dots { display: flex; }
/* arrows from tablet up; phones navigate by swipe and dots, so the arrows do
   not sit on top of the copy in the square viewport */
@media (min-width: 782px) {
	.mitode-hero-carousel.is-ready .mitode-hero-carousel__arrow { display: flex; }
}
.mitode-hero-carousel.is-ready:not(.is-static) .mitode-hero-carousel__pause { display: inline-flex; }

.mitode-hero-carousel__arrow {
	position: absolute;
	top: 50%;
	z-index: 4;
	transform: translateY(-50%);
	width: 44px;
	height: 44px;
	align-items: center;
	justify-content: center;
	border: 1px solid rgba(255, 255, 255, .35);
	border-radius: 999px;
	background: rgba(10, 10, 10, .45);
	color: #fff;
	cursor: pointer;
	backdrop-filter: blur(4px);
	transition: background .16s var(--mitode-ease), border-color .16s var(--mitode-ease);
}
.mitode-hero-carousel__arrow svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.mitode-hero-carousel__arrow--prev { left: .6rem; }
.mitode-hero-carousel__arrow--next { right: .6rem; }
.mitode-hero-carousel__arrow:hover { background: var(--wp--preset--color--accent); border-color: var(--wp--preset--color--accent); }
.mitode-hero-carousel__arrow:focus-visible { outline: 3px solid #fff; outline-offset: 2px; }
@media (min-width: 782px) {
	.mitode-hero-carousel__arrow { width: 52px; height: 52px; }
	.mitode-hero-carousel__arrow--prev { left: clamp(.75rem, 2vw, 1.75rem); }
	.mitode-hero-carousel__arrow--next { right: clamp(.75rem, 2vw, 1.75rem); }
}

.mitode-hero-carousel__dots {
	position: absolute;
	left: 0;
	right: 0;
	bottom: .9rem;
	z-index: 4;
	justify-content: center;
	gap: .5rem;
	pointer-events: none;
}
.mitode-hero-carousel__dot {
	pointer-events: auto;
	width: 30px;
	height: 30px;
	padding: 0;
	border: 0;
	background: transparent;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}
.mitode-hero-carousel__dot::before {
	content: "";
	width: 9px;
	height: 9px;
	border-radius: 999px;
	background: rgba(255, 255, 255, .55);
	box-shadow: 0 0 0 1px rgba(0, 0, 0, .25);
	transition: transform .18s var(--mitode-ease), background .18s var(--mitode-ease), width .18s var(--mitode-ease);
}
/* W9F - the visible dot stays 10 px; the button itself is padded out to a
   40 x 40 hit area (WCAG 2.5.8 asks 24, this clears the 40 px guideline) */
.mitode-hero-carousel__dot { min-width: 40px; min-height: 40px; }
.mitode-hero-carousel__dot:hover::before { background: #fff; }
.mitode-hero-carousel__dot.is-active::before { width: 26px; background: var(--wp--preset--color--accent); }
.mitode-hero-carousel__dot:focus-visible { outline: 3px solid #fff; outline-offset: -4px; border-radius: 999px; }

.mitode-hero-carousel__pause {
	position: absolute;
	right: .75rem;
	bottom: .75rem;
	z-index: 4;
	/* W9F - 40 px hit area; the disc itself still reads at 36 px */
	width: 40px;
	height: 40px;
	align-items: center;
	justify-content: center;
	border: 1px solid rgba(255, 255, 255, .3);
	border-radius: 999px;
	background: rgba(10, 10, 10, .45);
	color: #fff;
	cursor: pointer;
}
.mitode-hero-carousel__pause svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.mitode-hero-carousel__pause .mitode-hero-carousel__ico-play { display: none; fill: currentColor; stroke: none; }
.mitode-hero-carousel.is-paused .mitode-hero-carousel__ico-play { display: block; }
.mitode-hero-carousel.is-paused .mitode-hero-carousel__ico-pause { display: none; }
.mitode-hero-carousel__pause:focus-visible { outline: 3px solid #fff; outline-offset: 2px; }
@media (max-width: 781px) {
	.mitode-hero-carousel__pause { right: .5rem; bottom: .55rem; width: 40px; height: 40px; }
}

/* ---- benefit ticker -------------------------------------------------- */

/*
 * W9F (revised). A continuous, seamless loop rather than a stepped strip.
 *
 * The item set is rendered twice (see mitode_render_benefits) and the track
 * is translated by exactly -50%. Because each set carries a trailing
 * padding-right equal to the gap, the two sets are exactly the same width, so
 * -50% lands one full set along and the loop has no seam and no jump - and,
 * unlike the W9C marquee that drove scrollLeft, nothing is ever "resting"
 * half-scrolled, so no item is left permanently cut off at an edge.
 *
 * The animation duration is set from assets/js/ui.js so the speed stays
 * constant no matter how many benefits the editor adds; the value below is
 * the no-JS fallback.
 */
.mitode-trust {
	--mitode-ticker-gap: clamp(1.75rem, 3.5vw, 3rem);
	background: var(--wp--preset--color--surface);
	border-block-end: 1px solid var(--wp--preset--color--border);
}

.mitode-trust__viewport {
	overflow: hidden;
	padding-block: clamp(.9rem, 1.8vw, 1.35rem);
}

.mitode-trust__track {
	display: flex;
	width: max-content;
	animation: mitode-ticker var(--mitode-ticker-duration, 46s) linear infinite;
	will-change: transform;
}

.mitode-trust__set {
	display: flex;
	align-items: center;
	gap: var(--mitode-ticker-gap);
	/* keeps both sets identical in width, which is what makes -50% seamless */
	padding-inline-end: var(--mitode-ticker-gap);
}

@keyframes mitode-ticker {
	from { transform: translateX(0); }
	to   { transform: translateX(-50%); }
}

/* pointer over the band holds it, so a promise can actually be read */
.mitode-trust__viewport:hover .mitode-trust__track,
.mitode-trust__viewport:focus-within .mitode-trust__track { animation-play-state: paused; }

.mitode-trust__item {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	gap: .85rem;
	color: inherit;
	text-decoration: none;
}
a.mitode-trust__item:hover .mitode-trust__copy b { color: var(--wp--preset--color--accent); }
a.mitode-trust__item:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 4px;
	border-radius: var(--mitode-radius);
}

/*
 * The promises must never break across lines while they travel.
 * Scoped to __copy on purpose: the icon wrapper is a <span> inside the item
 * too, and `.mitode-trust__item span` (0-1-1) would out-rank
 * `.mitode-trust__icon` (0-1-0) and undo its centring.
 */
.mitode-trust__copy b,
.mitode-trust__copy span { white-space: nowrap; }

.mitode-trust__item .mitode-trust__icon {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border-radius: 999px;
	background: rgba(248, 1, 32, .08);
	overflow: hidden;
}
.mitode-trust__icon img { width: 100%; height: 100%; object-fit: cover; }
.mitode-trust__item svg {
	width: 24px;
	height: 24px;
	stroke: var(--wp--preset--color--accent);
	fill: none;
	stroke-width: 1.7;
	stroke-linecap: round;
	stroke-linejoin: round;
}

.mitode-trust__copy { display: block; min-width: 0; }
.mitode-trust__copy b { display: block; font-size: .9375rem; font-weight: 700; line-height: 1.3; }
.mitode-trust__copy span { display: block; margin-top: .1rem; font-size: .8125rem; color: var(--wp--preset--color--contrast-2); line-height: 1.35; }

/* phones: the same band, one notch smaller */
@media (max-width: 599px) {
	.mitode-trust { --mitode-ticker-gap: 1.5rem; }
	.mitode-trust__icon { width: 36px; height: 36px; }
	.mitode-trust__item svg { width: 20px; height: 20px; }
	.mitode-trust__item { gap: .65rem; }
	.mitode-trust__copy b { font-size: .8125rem; }
	.mitode-trust__copy span { font-size: .6875rem; }
}

/*
 * Reduced motion: no travel at all. The track stops being a loop and becomes
 * a normal swipeable row, and the duplicated set is removed from the flow so
 * the promises are not read twice.
 */
@media (prefers-reduced-motion: reduce) {
	.mitode-trust__viewport {
		overflow-x: auto;
		scroll-snap-type: x mandatory;
		scrollbar-width: none;
		-webkit-overflow-scrolling: touch;
	}
	.mitode-trust__viewport::-webkit-scrollbar { display: none; }
	.mitode-trust__track { animation: none; transform: none; }
	.mitode-trust__set[aria-hidden="true"] { display: none; }
	.mitode-trust__item { scroll-snap-align: start; }
}

/* ---- product card: second gallery image on hover / focus ------------- */

/*
 * The alt image is absolutely positioned over the primary one and simply
 * fades in; the primary image keeps its place in flow, so the card box is
 * exactly as tall as before (no CLS). Only pointer devices with hover get
 * the effect - on touch the primary image stays, no tap is stolen.
 */
.mitode-card__media--alt { position: relative; }
.mitode-card__media--alt .mitode-card__img--alt {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	aspect-ratio: auto;
	margin: 0;
	opacity: 0;
	transition: opacity .35s var(--mitode-ease);
	pointer-events: none;
}
@media (hover: hover) {
	.mitode-card:hover .mitode-card__media--alt .mitode-card__img--alt,
	.mitode-card:focus-within .mitode-card__media--alt .mitode-card__img--alt,
	.wc-block-product:hover .mitode-card__media--alt .mitode-card__img--alt,
	.wc-block-product:focus-within .mitode-card__media--alt .mitode-card__img--alt { opacity: 1; }
}

/*
 * W66-B - the hover image gets its own lane, from its own attachment.
 *
 * THIS RULE HAS TO LIVE HERE, not beside the other card-media rules in
 * section 7. `.mitode-card__media--alt .mitode-card__img--alt` above is
 * (0,2,0) and declares `object-fit` through the base rule it inherits the
 * box from; written 3900 lines earlier this selector's `!important` would
 * still have won, but `padding` and `box-sizing` would have been a
 * print-order bet. main.css has been bitten by exactly this before (see the
 * seam reset in section 3).
 *
 * The lane is the SECOND photograph's, never the first one's. They are
 * different pictures - a product's packshot is routinely paired with a
 * lifestyle gallery shot - so the class is decided per attachment in
 * mitode_card_alt_image() and the two images can and do disagree.
 */
.mitode-card__media--alt .mitode-card__img--alt.mitode-card__img--alt-contain {
	box-sizing: border-box;
	object-fit: contain !important;
	padding: 6%;
	background: #fff;
}

/* ---- footer v4 (W9C.1) ------------------------------------------------ */

/* newsletter band - rendered only when mitode_newsletter_enabled() */
/*
 * W61 - the newsletter moved INSIDE the footer grid.
 *
 * `.mitode-footer__signup` and its inner wrapper are gone from the markup:
 * they were a full-width dark band with 3.25rem of vertical padding sitting
 * above the footer proper, and it was the second-tallest block on the page.
 * The signup is now a small section inside `.mitode-footer__brand`.
 *
 * The headline drops from clamp(1.25rem, 2.4vw, 1.6rem) to a footer-column
 * heading, because it now sits next to "KUNDENSERVICE" and "LERNBEREICH" and
 * has to read as their sibling rather than as a second page title. The lead
 * paragraph was deleted outright.
 */
/*
 * `min-width: 0` all the way down. The signup now lives in a GRID column, and
 * a grid track sized `auto`/`1fr` is at least as wide as its content's
 * min-content - so anything inside that refuses to shrink widens the whole
 * footer. See the input rule below for the thing that refused.
 */
.mitode-newsletter { margin-block-start: 1.25rem; min-width: 0; }
.mitode-newsletter__form { min-width: 0; }
.mitode-newsletter__title {
	color: #fff;
	font-size: 1rem;
	text-transform: none;
	letter-spacing: -.01em;
	margin: 0 0 .6rem;
}

/*
 * W58 - the capture itself (inc/newsletter.php).
 *
 * One row, and it wraps rather than shrinks: at 320 px an input and a button
 * side by side leave the field about 120 px wide, which is narrower than the
 * address being typed into it. `flex-wrap` plus a `min-width` floor on the
 * input makes the button drop to its own line instead - measured at 320,
 * 360 and 390.
 *
 * The band is dark, so every colour here is stated against that ground and
 * not inherited: an input with no background of its own renders white-on-
 * white in a browser whose form defaults are light.
 */
.mitode-newsletter__form { max-width: 26rem; }

/*
 * INPUT AND BUTTON STAY ON ONE LINE, ALL THE WAY DOWN TO 320 px.
 *
 * The owner asked for this explicitly, and it is the one rule here that can
 * break. The old row was `flex-wrap: wrap` with the input at `flex: 1 1 14rem`
 * - a 224 px flex BASIS, which at 320 px cannot fit next to a button, so the
 * button wrapped onto its own line.
 *
 * Three things together make it hold instead of overflowing:
 *   nowrap        forbids the wrap the owner does not want,
 *   flex: 1 1 0   lets the input shrink from zero rather than from 14rem,
 *   min-width: 0  overrides the min-content floor an <input> gets by default,
 *                 which is what would otherwise push the row wider than the
 *                 footer and scroll the whole page sideways.
 *
 * The button keeps `flex: 0 0 auto` so it is never squeezed into an
 * unreadable sliver; the input is the element that gives way.
 */
.mitode-newsletter__row { display: flex; flex-wrap: nowrap; gap: .5rem; }
.mitode-newsletter__input {
	/*
	 * `width: 0` IS LOAD-BEARING, AND `min-width: 0` ALONE WAS NOT ENOUGH.
	 *
	 * An <input> without a `size` attribute has an intrinsic width of about
	 * twenty characters - measured here as 217 px. That intrinsic size is what
	 * the element contributes when an ancestor is sized by its content, and
	 * the footer's grid column is exactly that. Result at a 320 px viewport:
	 * the column's min-content came out at 217 + 8 + 95 = 320 inside a 288 px
	 * track, the footer became 336 wide, and every page on the site scrolled
	 * sideways - including pages with no newsletter on them, because the
	 * footer is on all of them.
	 *
	 * `min-width: 0` only removes the automatic MINIMUM size; it does not stop
	 * the intrinsic width being contributed. An explicit `width: 0` does, and
	 * `flex-grow` then hands the real width back at layout time.
	 */
	flex: 1 1 0;
	width: 0;
	min-width: 0;
	padding: .75rem .9rem;
	font: inherit;
	font-size: 1rem; /* 16px: anything smaller makes iOS zoom the page on focus */
	color: var(--wp--preset--color--contrast);
	background: var(--wp--preset--color--base);
	border: 1px solid rgba(255, 255, 255, .18);
	border-radius: var(--mitode-radius);
}
.mitode-newsletter__input::placeholder { color: var(--wp--preset--color--contrast-3); opacity: 1; }
.mitode-newsletter__input[aria-invalid="true"] { border-color: var(--wp--preset--color--accent); }
.mitode-newsletter__button {
	flex: 0 0 auto;
	padding: .75rem 1.5rem;
	font: inherit;
	font-weight: 700;
	color: #fff;
	background: var(--wp--preset--color--accent);
	border: 0;
	border-radius: var(--mitode-radius);
	cursor: pointer;
}
.mitode-newsletter__button:hover { background: var(--wp--preset--color--accent-dark); }

/*
 * Narrow phones: the button gives up horizontal padding, not its line. The
 * 16 px input font stays (anything smaller makes iOS zoom the page on focus),
 * so only the button is allowed to shrink.
 */
@media (max-width: 400px) {
	.mitode-newsletter__button { padding-inline: .85rem; font-size: .9375rem; }
	.mitode-newsletter__input { padding-inline: .65rem; }
}

.mitode-newsletter__consent { margin: .6rem 0 0; font-size: .75rem; line-height: 1.45; color: #9a9dab; max-width: 46ch; }
.mitode-newsletter__consent a { color: #d7d9e0; text-decoration: underline; }
.mitode-newsletter__consent a:hover { color: #fff; }
/*
 * The status line is empty until something has been submitted, and an empty
 * <p> with a margin would push the layout down on every page of the shop.
 * `:empty` collapses it; it is a live region, so the element itself has to
 * exist in the DOM from the start rather than being printed on demand.
 */
.mitode-newsletter__status { margin: .75rem 0 0; font-size: .875rem; line-height: 1.5; }
.mitode-newsletter__status:empty { display: none; }
.mitode-newsletter__status.is-ok { color: #8fe0a6; }
.mitode-newsletter__status.is-error { color: #ff9ba6; }
/* The honeypot: off-screen, not display:none - some bots skip what is not rendered. */
.mitode-newsletter__trap { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }


/*
 * One footer system, in the order of the source storefront:
 *   1. dark footer  - brand row, four link groups + contact column
 *   2. copyright row
 *   3. light closing section - brand statement, privacy, disclaimer, payment
 * No status copy of any kind is rendered here (auftrag W9C.1 section 0).
 */

.mitode-footer__brand {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 1rem 2rem;
	padding-block-end: clamp(1.5rem, 3vw, 2.25rem);
	margin-block-end: clamp(1.5rem, 3vw, 2.25rem);
	border-bottom: 1px solid rgba(255, 255, 255, .1);
}
.mitode-footer__brand img { height: 30px; width: auto; margin: 0; }
.mitode-footer__brand p { margin: 0; max-width: 60ch; font-size: .9375rem; line-height: 1.55; }

/*
 * W65-A - THE BRAND SENTENCE, AND WHERE IT STOPS BEING WORTH ITS ROOM.
 *
 * On a desktop it sits on the brand row next to the wordmark and says what
 * the shop sells - four product families in one line. It is allowed to wrap
 * onto a second line and no further: `60ch` above is the width, and this
 * caps the height so a long translation in a cloned market cannot push the
 * whole footer down. `text-wrap: pretty` keeps the two lines close in
 * length instead of leaving one word alone on the second.
 */
.mitode-footer__brand > .mitode-footer__tagline {
	flex: 1 1 22rem;
	text-wrap: pretty;
	/*
	 * `.mitode-footer__brand p` above caps every paragraph in this column at
	 * `60ch`, which is right for a body paragraph and was the real reason
	 * this one wrapped to four lines: measured, the flex row had 216 px of
	 * free space and the sentence refused all of it at 399 px wide. The cap
	 * is raised here, not removed there - the newsletter consent line is the
	 * other `p` in this column and 60ch is the correct measure for it.
	 *
	 * The selector is `.mitode-footer__brand > .mitode-footer__tagline`
	 * (0,2,1) and not the bare class (0,1,0), because the rule it has to beat
	 * is `.mitode-footer__brand p` (0,1,1). The bare class lost, silently -
	 * the sentence stayed 399 px wide through two measurements. Same
	 * arithmetic as the checkout label in assets/css/store.css; the third
	 * time this theme has paid for it.
	 */
	max-width: 42rem;
}

/*
 * Measured at 1440: the brand row is 1240 px and every pixel was spoken for -
 * logo 160, tagline 374, newsletter 642 - so the sentence wrapped to FOUR
 * lines in the narrowest column on the row while the newsletter had 226 px it
 * was not using for a control. The newsletter's own form is capped at 26rem;
 * the extra width came from the consent line's `46ch`, which is happy to wrap.
 *
 * Capping the newsletter hands that width to the sentence, which is the thing
 * §6 asks to be "kompakt" - two lines instead of four, and the row does not
 * get taller either way, because its height is set by the newsletter stack.
 *
 * Only from 1024 up: below that the brand row wraps and each child already
 * has the full width.
 */
@media (min-width: 1024px) {
	.mitode-footer__brand > .mitode-newsletter { flex: 0 1 28rem; }
}

/*
 * On a phone it goes, and it takes its gap with it.
 *
 * `display: none` and not `visibility: hidden`: the brand row is a flex
 * container with `gap: 1rem 2rem`, and a hidden-but-present item keeps both
 * its own box and the gap in front of it - which is exactly the "reserved
 * space" §6 asks to remove. A removed flex item has neither.
 *
 * Scoped to `.mitode-footer__tagline` and NOT to `.mitode-footer__brand p`:
 * the newsletter consent line - the sentence that points at the
 * Datenschutzerklärung - is also a `p` in this column, and it stays on
 * every width. So do the wordmark and the whole newsletter form.
 */
@media (max-width: 639.98px) {
	.mitode-footer__tagline { display: none; }
}

.mitode-footer__main { display: block; }
.mitode-footer__cols {
	display: grid;
	gap: 2rem 1.75rem;
	grid-template-columns: minmax(0, 1fr);
}
@media (min-width: 640px) {
	.mitode-footer__cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.mitode-footer__contact { grid-column: 1 / -1; }
}
@media (min-width: 1024px) {
	.mitode-footer__cols { grid-template-columns: repeat(4, minmax(0, 1fr)) minmax(0, 1.45fr); gap: 2rem 2rem; }
	.mitode-footer__contact { grid-column: auto; }
}

/* contact column */
.mitode-footer__contact h2 { margin-bottom: 1.1rem; }
.mitode-footer__advisor { margin: 0 0 .9rem; color: #fff; font-weight: 500; font-size: .9375rem; }
.mitode-footer__lines { list-style: none; margin: 0 0 1.1rem; padding: 0; display: grid; gap: .55rem; }
.mitode-footer__lines a {
	display: inline-flex;
	align-items: center;
	gap: .6rem;
	color: #fff;
	font-size: 1rem;
	font-weight: 500;
	text-decoration: none;
}
.mitode-footer__lines a:hover { color: var(--wp--preset--color--accent); text-decoration: none; }
.mitode-footer__lines svg,
.mitode-footer__social svg { width: 20px; height: 20px; flex: 0 0 auto; }
.mitode-footer__lines svg { fill: none; stroke: var(--wp--preset--color--accent); stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }

/* `.mitode-footer ul` is a grid (s11); these two lists need their own layout */
.mitode-footer ul.mitode-footer__social { list-style: none; margin: 0 0 1.25rem; padding: 0; display: flex; flex-wrap: wrap; gap: .5rem; }
.mitode-footer ul.mitode-footer__lines { display: grid; gap: .55rem; margin: 0 0 1.1rem; }
.mitode-footer__social a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 42px;
	height: 42px;
	border-radius: 999px;
	border: 1px solid rgba(255, 255, 255, .22);
	color: #fff;
	transition: background .16s var(--mitode-ease), border-color .16s var(--mitode-ease);
}
.mitode-footer__social a:hover,
.mitode-footer__social a:focus-visible { background: var(--wp--preset--color--accent); border-color: var(--wp--preset--color--accent); color: #fff; }
.mitode-footer__social svg { fill: currentColor; }

.mitode-footer .mitode-footer__cta {
	display: inline-flex;
	align-items: center;
	gap: .5rem;
	padding: .8rem 1.4rem;
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--accent);
	color: #fff;
	font-weight: 700;
	font-size: .9375rem;
	text-decoration: none;
	transition: background .16s var(--mitode-ease);
}
.mitode-footer .mitode-footer__cta:hover { background: var(--wp--preset--color--accent-dark); color: #fff; text-decoration: none; }
.mitode-footer .mitode-footer__cta { white-space: nowrap; }
.mitode-footer .mitode-footer__cta svg { width: 18px; height: 18px; flex: 0 0 auto; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

/* copyright row */
.mitode-footer__copy { background: var(--wp--preset--color--dark-deep); color: #8b8e99; font-size: .8125rem; }
.mitode-footer__copy-inner {
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding: .9rem var(--mitode-gut);
	/* W9K: copyright left, market selector right. */
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 1rem 2rem;
}
.mitode-footer__copy-inner > p { margin: 0; }
.mitode-footer__copy p { margin: 0; }

/* light closing section - the owner's brand block */
.mitode-closing {
	background: #fff;
	color: var(--wp--preset--color--contrast);
	text-align: center;
}
/*
 * W9N.1 - the closing section is as wide as the rest of the site.
 *
 * It was 62rem (992px) with the privacy line capped again at 62ch and the
 * disclaimer at 76ch. At this font the privacy cap measured about 460px -
 * which is what the owner reported - so the last thing on every page was a
 * narrow ribbon of text under a full-width footer. The reading-measure
 * argument that produced those caps does not apply to a centred legal
 * notice nobody reads line by line, and it made the page look broken.
 *
 * One width, the site's own.
 */
.mitode-closing__inner {
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding: clamp(2.25rem, 5vw, 3.5rem) var(--mitode-gut) clamp(2rem, 4vw, 3rem);
}
.mitode-footer .mitode-closing__brand { margin: 0 0 .5rem; font-size: 1rem; font-weight: 700; letter-spacing: .02em; color: var(--wp--preset--color--contrast); text-transform: none; }
.mitode-footer .mitode-closing__claim {
	color: var(--wp--preset--color--contrast);
	text-transform: none;
	letter-spacing: -.015em;
	margin: 0 0 1.5rem;
	font-size: clamp(1.35rem, 2.8vw, 2rem);
	font-weight: 700;
	line-height: 1.25;
	letter-spacing: -.015em;
}
.mitode-closing__claim mark {
	background: none;
	color: inherit;
	box-shadow: inset 0 -.32em 0 var(--wp--preset--color--accent);
	padding: 0 .08em;
}
.mitode-closing__privacy { margin: 0 auto 1.25rem; max-width: none; font-size: 1rem; line-height: 1.6; color: var(--wp--preset--color--contrast); }
/*
 * 10px, owner-set. The Haftungsausschluss has to be present and legible on
 * demand, and it is the longest text on the site nobody came to read; the
 * owner asked for it to be small. Line height stays generous, because 10px
 * at 1.65 is still readable while 10px at 1.2 would not be.
 */
.mitode-closing__disclaimer { margin: 0 auto; max-width: none; font-size: 10px; line-height: 1.65; color: var(--wp--preset--color--contrast-2); }
.mitode-closing__disclaimer b { color: var(--wp--preset--color--contrast); }
.mitode-closing hr { border: 0; border-top: 1px solid var(--wp--preset--color--border); margin: clamp(1.5rem, 3vw, 2.25rem) auto; max-width: 40rem; }
.mitode-footer .mitode-closing__pay-title { margin: 0 0 1rem; font-size: 1rem; font-weight: 700; color: var(--wp--preset--color--contrast); }
.mitode-pay {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex !important;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	gap: .75rem 1.25rem;
}
.mitode-pay__item { display: inline-flex; align-items: center; margin: 0; }
.mitode-pay .mitode-pay__item img.mitode-pay__img { display: block; height: 32px; width: auto; max-width: 130px; object-fit: contain; }


/* ---------------------------------------------------------------------
 * 17. W9D - footer 4 columns + certification row, certificate selector,
 *     homepage light-type / brand sections (core blocks), studies hotspots
 * ------------------------------------------------------------------ */

/* ---- footer: exactly four columns ------------------------------------ */

@media (min-width: 1024px) {
	.mitode-footer__cols { grid-template-columns: repeat(3, minmax(0, 1fr)) minmax(0, 1.45fr); }
}
@media (min-width: 640px) and (max-width: 1023px) {
	.mitode-footer__cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
	.mitode-footer__contact { grid-column: 1 / -1; }
}

/* CE / RoHS / WEEE - target-hosted marks, each a link to /zertifikate/ */
.mitode-footer__certs {
	margin-block-start: clamp(1.75rem, 4vw, 2.75rem);
	padding-block-start: clamp(1.25rem, 3vw, 2rem);
	border-top: 1px solid rgba(255, 255, 255, .1);
}
.mitode-footer .mitode-footer__certs ul {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	gap: 1rem 2.25rem;
	margin: 0;
	padding: 0;
	list-style: none;
}
.mitode-footer__cert a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 56px;
	padding: .4rem .6rem;
	border-radius: var(--mitode-radius);
	opacity: .92;
	transition: opacity .16s var(--mitode-ease), background .16s var(--mitode-ease);
}
.mitode-footer__cert a:hover,
.mitode-footer__cert a:focus-visible { opacity: 1; background: rgba(255, 255, 255, .06); }
.mitode-footer__cert img { display: block; height: 44px; width: auto; max-width: 120px; object-fit: contain; }
.mitode-footer__cert--weee img { height: 40px; }

/* ---- certificate selector (block mitochondriak/certificates) --------- */

.mitode-cert { margin-block: clamp(1.5rem, 3vw, 2.25rem) 0; }

.mitode-cert__marks {
	list-style: none;
	margin: 0 0 1.5rem;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: .75rem;
}
.mitode-cert__mark {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 96px;
	min-height: 64px;
	padding: .6rem .9rem;
	border-radius: var(--mitode-radius);
	background: var(--wp--preset--color--dark);
	margin: 0;
}
.mitode-cert__mark img { display: block; height: 40px; width: auto; max-width: 110px; object-fit: contain; }

.mitode-cert__box {
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	padding: clamp(1.1rem, 2.5vw, 1.5rem);
	box-shadow: var(--wp--preset--shadow--card);
}
.mitode-cert__lang {
	display: flex;
	flex-wrap: wrap;
	justify-content: flex-end;
	gap: .35rem;
	margin: 0 0 .75rem;
}
.mitode-cert__lang-btn {
	appearance: none;
	/* W9F - 40 px tall so the language chips clear the tap-target guideline */
	min-height: 40px;
	padding: .35rem .7rem;
	border-radius: 999px;
	border: 1px solid transparent;
	background: transparent;
	color: var(--wp--preset--color--contrast-2);
	font: inherit;
	font-size: .8125rem;
	font-weight: 700;
	letter-spacing: .04em;
	cursor: pointer;
	transition: background .14s var(--mitode-ease), color .14s var(--mitode-ease), border-color .14s var(--mitode-ease);
}
.mitode-cert__lang-btn:hover { background: var(--wp--preset--color--surface); border-color: var(--wp--preset--color--border); }
.mitode-cert__lang-btn.is-active { background: var(--wp--preset--color--contrast); color: #fff; border-color: var(--wp--preset--color--contrast); }
.mitode-cert__title { margin: 0 0 .4rem; font-size: clamp(1.35rem, 2.6vw, 1.75rem); }
.mitode-cert__subtitle { margin: 0 0 1.25rem; color: var(--wp--preset--color--contrast-2); }
.mitode-cert__label { display: block; margin: 0 0 .45rem; font-size: .875rem; font-weight: 700; }
.mitode-cert__row { display: grid; gap: .6rem; grid-template-columns: minmax(0, 1fr); align-items: stretch; }
@media (min-width: 720px) {
	.mitode-cert__row { grid-template-columns: minmax(0, 1fr) auto; }
}
.mitode-cert__select {
	width: 100%;
	min-height: 48px;
	padding: 0 2.5rem 0 .9rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
	background: #fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230f0f0f' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") no-repeat right .8rem center / 18px;
	color: var(--wp--preset--color--contrast);
	font: inherit;
	font-size: .9375rem;
	appearance: none;
	-webkit-appearance: none;
}
.mitode-cert .mitode-cert__open { padding-block: .8rem; white-space: nowrap; }
.mitode-cert__note { margin: .75rem 0 0; min-height: 1.4em; font-size: .9375rem; color: var(--wp--preset--color--contrast-2); }
.mitode-cert__note:empty { display: none; }

.mitode-cert__all { margin-top: 1rem; font-size: .9375rem; }
.mitode-cert__all summary { cursor: pointer; font-weight: 700; color: var(--wp--preset--color--contrast); }
.mitode-cert__table-wrap { overflow-x: auto; margin-top: .75rem; }
.mitode-cert__table { width: 100%; border-collapse: collapse; font-size: .875rem; }
.mitode-cert__table th,
.mitode-cert__table td { padding: .5rem .6rem; border-bottom: 1px solid var(--wp--preset--color--border); text-align: left; vertical-align: top; }
.mitode-cert__table thead th { font-size: .75rem; letter-spacing: .08em; text-transform: uppercase; color: var(--wp--preset--color--contrast-3); }
.mitode-cert__table tbody th { font-weight: 500; }
.mitode-cert__table td { white-space: nowrap; }
.mitode-cert__table abbr { text-decoration: none; }

/* ---- homepage light-type section (core blocks) ----------------------- */

.mitode-light .mitode-eyebrow { color: var(--wp--preset--color--accent); }
.mitode-light .mitode-light__title { margin: 0 0 1rem; max-width: 24ch; }
.mitode-light .mitode-light__lede { margin: 0; max-width: 62ch; font-size: var(--mitode-fs-lede); line-height: 1.6; }
.mitode-light .mitode-wave { margin-top: clamp(2rem, 4vw, 3rem); }
/* core flow layout adds margin-block-start to every sibling; grid items must not inherit it */
.mitode-light .mitode-wave > .mitode-wave__card,
.mitode-about .mitode-about__links > .mitode-about__link { margin-block: 0; }
.mitode-light .mitode-wave__card > * { margin: 0; }
.mitode-light .mitode-wave__value { color: var(--wp--preset--color--accent); font-size: 1.5rem; font-weight: 700; letter-spacing: -.01em; }
.mitode-light .mitode-wave__name { margin: .4rem 0 .35rem; color: #fff; font-size: 1rem; }
.mitode-light .mitode-wave__text { font-size: .875rem; color: rgba(255, 255, 255, .72); line-height: 1.5; max-width: 34ch; }
.mitode-light .mitode-light__actions { margin-top: clamp(2rem, 3.5vw, 2.75rem); }

/*
 * W27.6 - THE HALF-EMPTY BAND, MEASURED AND THEN LAID OUT.
 *
 * The complaint was "about half of this section is empty at 1280 and up".
 * Measured as INK rather than as boxes (tools/w27-6/browser/stress.mjs walks
 * the text nodes with Range.getClientRects, because a full-width <p> whose
 * text fills the left half still has a full-width border box):
 *
 *      width   head rows   worst unused right   average unused right
 *       1440       8              91 %                 75 %
 *       1280       8              91 %                 75 %
 *        834       8              85 %                 60 %
 *        390      10              69 %                 34 %
 *
 * So it was worse than half, and the cause is two deliberate measures doing
 * their job in a single column: `max-width: 24ch` on the title and
 * `max-width: 62ch` on the lede. Both are right - a 1240 px line of text is
 * unreadable - and both leave the rest of the row blank when they are
 * stacked.
 *
 * NO NEW COPY. The fix is composition: above 1080 the title and the lede sit
 * side by side, which is what the two measures were sized for. The
 * wavelength grid and the buttons keep the full width. Below 1080 nothing
 * changes - stacking is correct there and the numbers above show the space
 * is already used.
 *
 * `.mitode-light` exists on ONE page (the front page, id 58 - verified in
 * wp_posts), so this cannot reach a layout it was not measured against.
 */
@media (min-width: 1080px) {
	.mitode-light > .mitode-shell {
		display: grid;
		grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
		column-gap: clamp(2.5rem, 5vw, 4.5rem);
		align-items: end;
	}
	/*
	 * EVERY child spans both columns unless it is explicitly placed below.
	 * Without this, a block an editor adds to this section would be
	 * auto-placed into whichever half-width cell happened to be free and
	 * would silently become a one-column block. The four placements that
	 * follow override this; anything else stays full width, which is what an
	 * unplanned block should do.
	 */
	.mitode-light > .mitode-shell > * { grid-column: 1 / -1; }
	.mitode-light > .mitode-shell > .mitode-eyebrow { grid-column: 1; grid-row: 1; align-self: end; }
	/*
	 * The title KEEPS its 24ch measure. Lifting it (max-width: none) was
	 * tried and measured and is worse: the heading collapsed onto one long
	 * line that dropped BELOW the lede beside it, and the band's average
	 * unused right margin went 30 % -> 31 % with the worst row back at 91 %.
	 * A reading measure is not the same thing as a column width, and this
	 * one was already right.
	 */
	.mitode-light > .mitode-shell > .mitode-light__title { grid-column: 1; grid-row: 2; margin-block-end: 0; }
	/* the lede occupies the second column across both head rows and sits on
	   the same baseline as the title it belongs to */
	.mitode-light > .mitode-shell > .mitode-light__lede {
		grid-column: 2;
		grid-row: 1 / span 2;
		align-self: end;
		max-width: 46ch;
	}
	.mitode-light > .mitode-shell > .mitode-wave { grid-column: 1 / -1; grid-row: 3; }
	.mitode-light > .mitode-shell > .mitode-light__actions { grid-column: 1 / -1; grid-row: 4; }
	/*
	 * `repeat(auto-fit, minmax(min(100%, 200px), 1fr))` produced FIVE tracks
	 * for four cards at 1280 and 1440 (measured: the fifth is 0px). Raising
	 * the minimum to 260px makes 1240 / 260 = 4.7 -> four tracks, so the
	 * empty one is gone WITHOUT hard-coding the count: add a fifth
	 * wavelength card tomorrow and the grid still lays it out instead of
	 * overflowing, which a literal `repeat(4, ...)` would not.
	 */
	.mitode-light .mitode-wave { grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); }
}

/*
 * Core buttons inside the dark bands: red primary, white outline.
 * W9E - the second selector said `.mitode-brand`, which is the header
 * wordmark link; the brand band is `.mitode-about`. The rules therefore
 * never matched and the two dark bands shipped buttons of different
 * heights. Same class list, correct target, one pill radius.
 */
.mitode-light .wp-block-button__link,
.mitode-about .wp-block-button__link { border-radius: var(--mitode-radius-pill); font-weight: 700; padding: .95rem 1.9rem; }
.mitode-light .wp-block-button.is-style-outline > .wp-block-button__link,
.mitode-about .wp-block-button.is-style-outline > .wp-block-button__link {
	background: transparent;
	color: #fff;
	border: 2px solid rgba(255, 255, 255, .45);
	padding: calc(.95rem - 2px) calc(1.9rem - 2px);
}
.mitode-light .wp-block-button.is-style-outline > .wp-block-button__link:hover,
.mitode-about .wp-block-button.is-style-outline > .wp-block-button__link:hover { border-color: #fff; background: rgba(255, 255, 255, .1); color: #fff; }
.mitode-light .wp-block-buttons,
.mitode-about .wp-block-buttons { gap: .75rem; }

/* ---- homepage brand section (core blocks) ---------------------------- */

.mitode-about {
	position: relative;
	isolation: isolate;
	background: var(--wp--preset--color--dark-deep);
	color: #fff;
	overflow: hidden;
}
.mitode-about::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background:
		radial-gradient(110% 80% at 12% 20%, rgba(248, 1, 32, .34) 0%, rgba(248, 1, 32, 0) 60%),
		radial-gradient(70% 70% at 90% 90%, rgba(25, 151, 229, .16) 0%, rgba(25, 151, 229, 0) 60%),
		linear-gradient(160deg, #171717 0%, #0a0a0a 70%);
}
.mitode-about .mitode-shell { padding-block: var(--mitode-band-lg); }
.mitode-about .mitode-eyebrow { color: var(--wp--preset--color--accent); }
.mitode-about .mitode-about__title {
	margin: 0;
	color: #fff;
	font-size: clamp(1.875rem, 3.6vw, 2.75rem);
	line-height: 1.1;
	letter-spacing: -.02em;
}
.mitode-about .mitode-about__title em { font-style: normal; box-shadow: inset 0 -.28em 0 var(--wp--preset--color--accent); padding: 0 .06em; }
.mitode-about .mitode-about__title sup { font-size: .45em; top: -.8em; }
.mitode-about .mitode-about__motto { margin: 0 0 .75rem; font-size: 1.125rem; color: #fff; }
.mitode-about .mitode-about__text { margin: 0 0 1.5rem; font-size: 1.0625rem; line-height: 1.65; color: rgba(255, 255, 255, .82); max-width: 56ch; }
.mitode-about .mitode-about__split { margin: 0; gap: clamp(1.5rem, 4vw, 3.5rem); }
/*
 * W9E - the three knowledge entries are supporting links, not a second
 * card grid. Boxing them made the section read as "statement + three
 * identical cards" and put them on the same visual level as the brand
 * claim itself. Now: one hairline rule, three plain columns, small type.
 */
.mitode-about .mitode-about__links {
	display: grid;
	gap: clamp(1.25rem, 3vw, 2.5rem);
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 230px), 1fr));
	margin-top: clamp(2.25rem, 5vw, 3.5rem);
	padding-top: clamp(1.75rem, 4vw, 2.5rem);
	border-top: 1px solid rgba(255, 255, 255, .16);
}
.mitode-about .mitode-about__link {
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
}
.mitode-about .mitode-about__link > * { margin: 0; }
.mitode-about .mitode-about__link h3 { color: #fff; font-size: 1rem; margin-bottom: .35rem; }
.mitode-about .mitode-about__link p { font-size: .875rem; line-height: 1.5; color: rgba(255, 255, 255, .68); max-width: 34ch; }
.mitode-about .mitode-about__more { margin-top: .6rem; font-size: .875rem; }
.mitode-about .mitode-about__more a { color: #fff; font-weight: 700; text-decoration: none; }
.mitode-about .mitode-about__more a::after { content: " \2192"; color: var(--wp--preset--color--accent); }
.mitode-about .mitode-about__more a:hover { text-decoration: underline; }

/* ---- studies / benefits hotspots (W9E rebuild) ----------------------- */

/*
 * One widget, three parts: a text column (head + intro or detail panel), the
 * photograph with the eight markers, and - without JavaScript - the plain
 * detail list. W9D shipped a second, duplicated set of controls as a
 * horizontal rail of 88 px red cards for phones; it clipped five of eight
 * topics inside a 390 px viewport, doubled the focusable controls and read
 * as a detached product slider. W9E keeps the markers on the photograph at
 * every viewport, exactly as the source homepage does, and puts the detail
 * panel under the photograph on phones - so the panel never covers the
 * markers it was opened from (which is what the source itself gets wrong).
 */

.mitode-hotspots { background: var(--wp--preset--color--base); }
.mitode-hotspots .mitode-shell { padding-block: var(--mitode-band); }

.mitode-hotspots__grid {
	display: flex;
	flex-direction: column;
	gap: clamp(1.25rem, 3vw, 1.75rem);
}
/* the aside's children become flex items on phones (head / intro / panel) */
.mitode-hotspots__aside { display: contents; }
.mitode-hotspots__head { order: 1; }
.mitode-hotspots__intro { order: 2; }
.mitode-hotspots__stage { order: 3; margin: 0; }
.mitode-hotspots__panel { order: 4; }
.mitode-hotspots__details { order: 5; }

.mitode-hotspots__title {
	margin: 0;
	font-size: var(--mitode-fs-h2-long);
	line-height: 1.2;
	letter-spacing: -.015em;
}
.mitode-hotspots__lede {
	margin: 1rem 0 0;
	font-size: var(--mitode-fs-lede);
	line-height: 1.6;
	color: var(--wp--preset--color--contrast-2);
	max-width: 52ch;
}
.mitode-hotspots__hint {
	margin: 1rem 0 0;
	font-size: .9375rem;
	font-weight: 500;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-hotspots__hint::before {
	content: "";
	display: inline-block;
	width: .6rem;
	height: .6rem;
	margin-inline-end: .5rem;
	border-radius: 999px;
	background: var(--wp--preset--color--accent);
	vertical-align: baseline;
}
.mitode-hotspots__hint--desktop { display: none; }

/* ---- the photograph -------------------------------------------------- */

.mitode-hotspots__media { position: relative; }
.mitode-hotspots__img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: var(--mitode-radius-lg);
	box-shadow: var(--mitode-shadow-card);
}

/* markers exist at every viewport, but only with the script */
.mitode-hotspots__spots { display: none; list-style: none; margin: 0; padding: 0; }
.mitode-hotspots.is-ready .mitode-hotspots__spots { display: block; }
.mitode-hotspots__spot { position: absolute; left: var(--hs-x, 50%); top: var(--hs-y, 50%); transform: translate(-50%, -50%); margin: 0; }

.mitode-hotspot {
	appearance: none;
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	padding: 0;
	border: 2px solid #fff;
	border-radius: 999px;
	background: var(--wp--preset--color--accent);
	color: #fff;
	cursor: pointer;
	box-shadow: var(--mitode-shadow-btn);
	transition: transform .18s var(--mitode-ease), background .18s var(--mitode-ease);
}
.mitode-hotspot:hover,
.mitode-hotspot:focus-visible { transform: scale(1.08); background: var(--wp--preset--color--accent-dark); }
.mitode-hotspot.is-active { background: var(--wp--preset--color--contrast); transform: scale(1.08); }
.mitode-hotspot .mitode-hotspot__icon { width: 22px; height: 22px; object-fit: contain; display: block; }
.mitode-hotspot .mitode-hotspot__dot { width: 10px; height: 10px; border-radius: 999px; background: #fff; display: block; }
.mitode-hotspot .mitode-hotspot__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

@media (min-width: 520px) {
	.mitode-hotspot { width: 44px; height: 44px; }
	.mitode-hotspot .mitode-hotspot__icon { width: 24px; height: 24px; }
}
@media (min-width: 782px) {
	.mitode-hotspot { width: 52px; height: 52px; }
	.mitode-hotspot .mitode-hotspot__icon { width: 28px; height: 28px; }
	.mitode-hotspot .mitode-hotspot__dot { width: 12px; height: 12px; }
}

.mitode-hotspots__spot .mitode-hotspot::after {
	content: "";
	position: absolute;
	inset: -8px;
	border-radius: 999px;
	border: 2px solid rgba(248, 1, 32, .45);
	animation: mitode-pulse 2.4s ease-out infinite;
}
.mitode-hotspot.is-active::after { display: none; }
@keyframes mitode-pulse {
	0% { transform: scale(.8); opacity: .9; }
	100% { transform: scale(1.35); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
	.mitode-hotspots__spot .mitode-hotspot::after { animation: none; }
}

/* ---- detail panel ---------------------------------------------------- */

/*
 * The source opens a flat red panel over the photograph. W9E keeps the red
 * - on the darker brand red, so white body copy clears 4.5:1 - but anchors
 * the panel in the composition instead of floating it over the markers,
 * and gives it the storefront's card radius and shadow.
 */
.mitode-hotspots__panel {
	position: relative;
	padding: clamp(1.25rem, 2.4vw, 1.75rem);
	padding-inline-end: clamp(3rem, 4vw, 3.5rem);
	border: 0;
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--accent-dark);
	color: #fff;
	box-shadow: var(--mitode-shadow-card);
	outline-offset: 4px;
}
.mitode-hotspots__panel[hidden] { display: none; }
.mitode-hotspots__panel :is(h2, h3, b, strong) { color: #fff; }

.mitode-hotspots__close {
	position: absolute;
	top: .6rem;
	right: .6rem;
	width: 40px;
	height: 40px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	border: 1px solid rgba(255, 255, 255, .45);
	border-radius: 999px;
	background: transparent;
	color: #fff;
	cursor: pointer;
	transition: background .16s var(--mitode-ease), border-color .16s var(--mitode-ease);
}
.mitode-hotspots__close:hover { background: rgba(255, 255, 255, .16); border-color: #fff; }
.mitode-hotspots__close:focus-visible { outline: 3px solid #fff; outline-offset: 2px; }
.mitode-hotspots__close svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }

/* icon left, copy right - the composition of the source panel */
.mitode-hotspots__panel-body {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr);
	column-gap: clamp(.9rem, 1.6vw, 1.25rem);
	align-items: start;
}
.mitode-hotspots__panel-body > * { grid-column: 2; margin: 0 0 .6rem; }
.mitode-hotspots__panel-body > :last-child { margin-bottom: 0; }
.mitode-hotspots__panel .mitode-hotspots__detail-icon {
	grid-column: 1;
	grid-row: 1 / span 20;
	width: 56px;
	height: 56px;
	margin: 0;
	background: rgba(255, 255, 255, .18);
	border: 1px solid rgba(255, 255, 255, .28);
}
.mitode-hotspots__panel .mitode-hotspots__detail-icon img { width: 30px; height: 30px; }
.mitode-hotspots__panel .mitode-hotspots__detail-title { font-size: 1.25rem; line-height: 1.25; }
.mitode-hotspots__panel p { font-size: .9375rem; line-height: 1.6; color: rgba(255, 255, 255, .92); }
.mitode-hotspots__panel .mitode-hotspots__study {
	display: inline-flex;
	align-items: center;
	gap: .4rem;
	margin-top: .25rem;
	padding: .55rem 1.1rem;
	border-radius: var(--mitode-radius-pill);
	background: #fff;
	color: var(--wp--preset--color--accent-dark);
	font-weight: 700;
	font-size: .875rem;
	text-decoration: none;
}
.mitode-hotspots__panel .mitode-hotspots__study:hover { background: var(--wp--preset--color--contrast); color: #fff; }

/* on a phone a 56 px icon column would squeeze the copy to 29 characters */
@media (max-width: 519px) {
	.mitode-hotspots__panel-body { grid-template-columns: minmax(0, 1fr); }
	.mitode-hotspots__panel-body > * { grid-column: 1; }
	.mitode-hotspots__panel .mitode-hotspots__detail-icon { grid-row: auto; margin-bottom: .85rem; }
}
.mitode-hotspots__panel .mitode-hotspots__study:focus-visible { outline: 3px solid #fff; outline-offset: 2px; }

.mitode-hotspots__detail-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border-radius: 999px;
	background: var(--wp--preset--color--accent);
	margin-bottom: .75rem;
}
.mitode-hotspots__detail-icon img { width: 24px; height: 24px; object-fit: contain; }
.mitode-hotspots__detail-icon .mitode-hotspot__dot { width: 12px; height: 12px; border-radius: 999px; background: #fff; }
.mitode-hotspots__detail-title { margin: 0 0 .5rem; font-size: var(--mitode-fs-h3); }
.mitode-hotspots__detail p { font-size: .9375rem; line-height: 1.55; color: var(--wp--preset--color--contrast-2); }
.mitode-hotspots__result b { color: var(--wp--preset--color--contrast); }
.mitode-hotspots__detail .mitode-hotspots__study { font-weight: 700; color: var(--wp--preset--color--accent); }

/* detail cards: plain visible list without JS, hidden once the script runs */
.mitode-hotspots__details { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); }
.mitode-hotspots__detail { padding: 1.25rem; border: 1px solid var(--wp--preset--color--border); border-radius: var(--mitode-radius-lg); }
.mitode-hotspots__detail > * { margin: 0 0 .6rem; }
.mitode-hotspots__detail > :last-child { margin-bottom: 0; }
.mitode-hotspots.is-ready .mitode-hotspots__details { display: none; }

@media (min-width: 782px) {
	.mitode-hotspots__grid {
		display: grid;
		grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr);
		gap: clamp(2rem, 4vw, 3.25rem);
		align-items: center;
	}
	.mitode-hotspots__aside { display: block; order: 0; }
	.mitode-hotspots__stage { order: 0; }
	.mitode-hotspots__details { grid-column: 1 / -1; }
	.mitode-hotspots__hint--desktop { display: block; }
	.mitode-hotspots__hint--mobile { display: none; }
	.mitode-hotspots__panel { margin-top: clamp(1.25rem, 2vw, 1.75rem); }
	.mitode-hotspots__media { max-width: 760px; margin-inline: auto; }
}


/* ---------------------------------------------------------------------
 * W9H - category hero
 * ------------------------------------------------------------------ */

/*
 * The source category page opens with a full-bleed banner: copy left,
 * photography bleeding in from the right, two pill buttons. Everything is
 * editable from Products -> Categories (name, description, image) plus the
 * two button fields inc/category.php adds; with no image the band falls back
 * to a painted gradient rather than breaking.
 */
.mitode-archive-crumbs { padding-block: 1rem .25rem; }

.mitode-cathero {
	position: relative;
	overflow: hidden;
	background:
		radial-gradient(90% 140% at 88% 40%, rgba(248, 1, 32, .16) 0%, rgba(248, 1, 32, 0) 62%),
		linear-gradient(120deg, var(--wp--preset--color--surface) 0%, #f6eaec 100%);
}

.mitode-cathero__inner {
	position: relative;
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding: clamp(2rem, 4.5vw, 3.5rem) var(--mitode-gut);
	display: grid;
	grid-template-columns: 1fr;
	gap: clamp(1.5rem, 3vw, 2.5rem);
	align-items: center;
}

.mitode-cathero__copy { min-width: 0; }

.mitode-cathero__title {
	font-size: clamp(1.75rem, 4vw, 2.5rem);
	font-weight: 700;
	line-height: 1.12;
	letter-spacing: -.02em;
	color: var(--wp--preset--color--contrast);
	margin: 0 0 .75rem;
}

.mitode-cathero__text {
	max-width: 60ch;
	font-size: var(--mitode-fs-lede, 1.0625rem);
	line-height: 1.62;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-cathero__text p { margin: 0 0 .6rem; }
.mitode-cathero__text p:last-child { margin-bottom: 0; }
.mitode-cathero__text strong { color: var(--wp--preset--color--contrast); }

.mitode-cathero__lede {
	margin: 1.1rem 0 0;
	font-weight: 700;
	color: var(--wp--preset--color--contrast);
}

.mitode-cathero__actions { margin-top: 1.1rem; }

.mitode-cathero__media { display: none; }

@media (min-width: 900px) {
	.mitode-cathero__inner { grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr); }
	.mitode-cathero__media {
		display: block;
		align-self: stretch;
		min-height: 260px;
	}
	.mitode-cathero__img {
		width: 100%;
		height: 100%;
		max-height: 380px;
		object-fit: cover;
		border-radius: var(--mitode-radius-lg);
		display: block;
	}
	/* no image: let the copy use the full width instead of half a band */
	.mitode-cathero--plain .mitode-cathero__inner { grid-template-columns: 1fr; }
}

/*
 * W9N.3 - the split-banner variant renders the source vocabulary
 * (content-sections.css section 11); the section wrapper only keeps the
 * painted gradient as the loading background behind the photograph.
 */
.mitode-cathero--split .mitode-cathero__lede { margin: 0 0 15px; }

/* ---------------------------------------------------------------------
 * W9N.3 - category bottom content (block mitochondriak/category-content)
 * ------------------------------------------------------------------ */

/*
 * Term meta rendered under the product grid: vlastnosti sliders, banners
 * and the comparison table, all in the shared section vocabulary. A band
 * with its own padding, like every other mitode- section (the W9E blockGap
 * contract).
 */
.mitode-category-content { padding-block: clamp(2rem, 4.5vw, 3.5rem) 0; }
.mitode-category-content__inner > p:empty { display: none; }
.mitode-category-content__inner > p { margin: 0; }
.mitode-category-content__inner > center > .tabulka-porovnanie-generacie-title { margin-top: clamp(1.5rem, 3vw, 2.5rem); }
.mitode-category-content__inner > .responsive-banner_full_round { margin-block: clamp(1.5rem, 3.2vw, 2.5rem); }
/* in-content anchor targets must clear the sticky header */
.mitode-category-content__inner a[id]:empty {
	display: block;
	height: 0;
	scroll-margin-top: calc(var(--mitode-header-h, 8rem) + 1rem);
}
#tabulka-porovnanie-generacie-root { scroll-margin-top: calc(var(--mitode-header-h, 8rem) + 1rem); }

/* ---------------------------------------------------------------------
 * W9K - FAQ: the full page, the homepage section, the filter
 *
 * Reuses the W9H accordion (.mitode-faq__item / __q / __a) unchanged.
 * Only what W9K adds is defined here: category groups, the filter field,
 * the homepage variant and the HWG review marker.
 * ------------------------------------------------------------------ */

.mitode-faq--full { text-align: left; }
.mitode-faq--full .mitode-faq__list { margin-inline: 0; max-width: none; }

.mitode-faq__group + .mitode-faq__group { margin-top: 2.5rem; }
.mitode-faq__group-title {
	margin: 0 0 .9rem;
	font-size: clamp(1.25rem, 2.2vw, 1.5rem);
	line-height: 1.25;
	color: var(--wp--preset--color--contrast);
}
.mitode-faq__group[hidden] { display: none; }

/* filter -------------------------------------------------------------- */

.mitode-faq__filter { margin: 0 0 2rem; }
.mitode-faq__filter[hidden] { display: none; }
.mitode-faq__filter-label {
	display: block;
	margin-bottom: .4rem;
	font-size: .9375rem;
	font-weight: 600;
	color: var(--wp--preset--color--contrast);
}
.mitode-faq__filter-field { position: relative; max-width: 34rem; }
.mitode-faq__filter-input {
	width: 100%;
	padding: .7rem .95rem;
	font: inherit;
	font-size: 1rem;
	color: var(--wp--preset--color--contrast);
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
	transition: border-color .18s var(--mitode-ease), box-shadow .18s var(--mitode-ease);
}
.mitode-faq__filter-input:focus-visible {
	outline: none;
	border-color: var(--wp--preset--color--primary, #c62828);
	box-shadow: 0 0 0 3px rgba(198, 40, 40, .18);
}
.mitode-faq__filter-status {
	min-height: 1.4em;
	margin: .5rem 0 0;
	font-size: .9375rem;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-faq__empty {
	margin: 0 0 1.5rem;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-faq__empty[hidden] { display: none; }
.mitode-faq__item[hidden] { display: none; }

/* HWG review marker - Lab only, never rendered in production ---------- */

.mitode-faq__flag {
	margin: 0 0 .75rem;
	padding: .55rem .75rem;
	font-size: .875rem;
	line-height: 1.5;
	color: #7a1d1d;
	background: #fdf3f3;
	border: 1px dashed #d99;
	border-radius: var(--mitode-radius);
}

/* homepage ------------------------------------------------------------ */

.mitode-faq--home { background: var(--wp--preset--color--base); }
.mitode-faq--home .mitode-faq__title { margin-bottom: 1.5rem; }
.mitode-faq__more { margin: 1.75rem 0 0; }

@media (max-width: 700px) {
	.mitode-faq__group + .mitode-faq__group { margin-top: 2rem; }
	.mitode-faq__filter { margin-bottom: 1.5rem; }
}

/* ---------------------------------------------------------------------
 * W9K - blog cards, the homepage rail and archive pagination
 *
 * Reuses the W9B card and carousel systems unchanged (.mitode-card,
 * .mitode-cards--carousel, .mitode-carousel__btn). Only what a post card
 * has and a product card does not is defined here: the category eyebrow,
 * the date, the excerpt and the read-on link - plus a 16:9 image ratio,
 * because editorial photography is landscape where product photography
 * is portrait.
 * ------------------------------------------------------------------ */

.mitode-cards--posts { --mitode-card-ratio: 16 / 9; }

.mitode-card--post .mitode-card__body { gap: .45rem; padding-bottom: 1.15rem; }

/*
 * W9N.1 - the eyebrow is one line tall on every card, whatever it says.
 *
 * The category name is uppercased and letter-spaced, so at two cards per
 * 390px viewport "LICHT & INNENBELEUCHTUNG" wraps and "ROTLICHTTHERAPIE"
 * does not. That pushed one card's title 19px below its neighbour's -
 * measured on the homepage rail, tools/w9n1/browser/zone-probe.mjs. Same
 * defect the product card solved with reserved zone heights, same solution:
 * the zone is a fixed line, and a name too long for it is truncated rather
 * than allowed to move everything under it.
 */
.mitode-card__eyebrow {
	display: block;
	min-height: 1.05rem;
	max-height: 1.05rem;
	overflow: hidden;
	font-size: .75rem;
	font-weight: 700;
	letter-spacing: .08em;
	line-height: 1.4;
	text-transform: uppercase;
	white-space: nowrap;
	text-overflow: ellipsis;
	color: var(--wp--preset--color--accent);
}
.mitode-card__meta { font-size: .875rem; color: var(--wp--preset--color--contrast-3); }
.mitode-card__excerpt { line-height: 1.6; }
.mitode-card__more { margin-top: auto; padding-top: .5rem; }

/* ---------------------------------------------------------------------
 * W9N.2 - POST CARDS: ONE GEOMETRY FOR EVERY CARD IN A ROW.
 *
 * The owner's screenshot showed post cards whose "Artikel lesen" link sat
 * at a different height on each card. Measured before the fix
 * (tools/w9n2/browser/blog-cards.mjs, 7 real articles, titles 49-69 chars,
 * excerpts 106-137 chars):
 *
 *   viewport   CTA top spread   card height spread
 *   1440           23 px            22 px
 *   1280           23 px            23 px
 *    768           23 px            23 px
 *    390           22 px            22 px
 *    375           22 px            23 px
 *
 * TWO causes, and only fixing both makes the row square:
 *
 * 1. `.mitode-card__more { margin-top: auto }` was already there and did
 *    NOTHING. An auto margin can only consume FREE space, and there was
 *    none: `.mitode-card__body` is a flex column inside a flex column, and
 *    without `flex: 1` it is only as tall as its own content. The card grew
 *    to the row height, the body did not, and the leftover space collected
 *    under the body instead of above the link. This is why the same
 *    declaration works on product cards - those bodies do grow.
 *
 * 2. The excerpt zone had no reserved height. 24 words is two lines for one
 *    article and three for the next, so even a working auto margin would
 *    have left a ragged gap ABOVE the link rather than below it.
 *
 * The fix is the doctrine already written for product cards in section 7:
 * every zone is a fixed number of lines, the CTA is anchored to the bottom
 * of a body that actually fills the card, and nothing is nudged per card.
 * ------------------------------------------------------------------ */

/*
 * The rail is a flex row and the archive is a grid; `stretch` is the
 * default in both, but the rail sets its own alignment for the arrows, so
 * it is stated rather than assumed.
 */
.mitode-cards--posts { align-items: stretch; }
.mitode-card--post { height: 100%; }

/*
 * `min-height: 0` next to `flex: 1`: without it a flex item refuses to
 * shrink below its content, and the line-clamped excerpt below would then
 * push the card taller instead of clipping.
 */
.mitode-card--post .mitode-card__body {
	flex: 1 1 auto;
	min-height: 0;
}

/* date - one line, reserved */
.mitode-card--post .mitode-card__meta {
	min-height: 1.4rem;
	max-height: 1.4rem;
	overflow: hidden;
}

/*
 * excerpt - exactly three lines on every card.
 *
 * 0.9375rem x 1.6 line-height x 3 = 4.5rem. min-height reserves the space
 * for a short excerpt, the clamp caps a long one, and a card whose article
 * has no excerpt at all still gets the zone (::after keeps the box alive
 * when the element is absent is not possible, so the renderer always emits
 * the paragraph - see inc/blog.php).
 */
.mitode-card--post .mitode-card__excerpt {
	display: -webkit-box;
	-webkit-line-clamp: 3;
	line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
	min-height: 4.5rem;
	max-height: 4.5rem;
}

/* and now the auto margin has free space to consume */
.mitode-card--post .mitode-card__more { margin-top: auto; }

.mitode-link-arrow {
	display: inline-flex;
	align-items: center;
	gap: .35rem;
	font-weight: 600;
	font-size: .9375rem;
	color: var(--wp--preset--color--contrast);
	text-decoration: none;
}
.mitode-link-arrow span[aria-hidden] { transition: transform .18s var(--mitode-ease); }
.mitode-link-arrow:hover span[aria-hidden] { transform: translateX(3px); }
.mitode-card--post:hover .mitode-link-arrow { text-decoration: underline; }

.mitode-card__img--empty {
	display: block;
	width: 100%;
	aspect-ratio: var(--mitode-card-ratio);
	background: var(--wp--preset--color--surface);
}

/*
 * On a phone the rail shows a little over one card, so the edge of the
 * next one signals that the row scrolls. The shared carousel rule gives
 * 100% at this width, which reads as a static single card.
 */
@media (max-width: 700px) {
	.mitode-cards--posts.mitode-cards--carousel > .mitode-card { flex-basis: 78%; }
}

/*
 * Blog rail arrows sit BESIDE the cards, not on them.
 * The shared product rail places them at -12px, which overlaps the first
 * and last card by ~34px. On a product card that lands on the photograph;
 * on a post card it lands exactly on the category line and hides it.
 * The rail is inset instead, so the buttons have their own room.
 */
@media (min-width: 701px) {
	.mitode-blograil .mitode-carousel { padding-inline: 3.25rem; }
	.mitode-blograil .mitode-carousel__btn--prev { left: 0; }
	.mitode-blograil .mitode-carousel__btn--next { right: 0; }
}

/* Below that the rail is swiped, so the arrows are noise. */
@media (max-width: 700px) {
	.mitode-blograil .mitode-carousel__btn { display: none; }
}

.mitode-pagination { margin-top: 2.5rem; }
.mitode-pagination ul {
	display: flex;
	flex-wrap: wrap;
	gap: .4rem;
	justify-content: center;
	margin: 0;
	padding: 0;
	list-style: none;
}
.mitode-pagination a,
.mitode-pagination span {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 2.5rem;
	height: 2.5rem;
	padding-inline: .75rem;
	font-size: .9375rem;
	text-decoration: none;
	color: var(--wp--preset--color--contrast);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
}
.mitode-pagination .current {
	background: var(--wp--preset--color--contrast);
	border-color: var(--wp--preset--color--contrast);
	color: #fff;
}
.mitode-blog__empty { color: var(--wp--preset--color--contrast-2); }

/* ---------------------------------------------------------------------
 * W9K - search autocomplete
 *
 * The panel hangs under the field on desktop and tablet. On a phone the
 * header is narrow and the field is full-width already, so the panel
 * simply becomes full-width too and scrolls internally rather than
 * turning into a separate overlay screen - one less state to get stuck in.
 * ------------------------------------------------------------------ */

.mitode-search__clear {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 2rem;
	height: 2rem;
	margin-inline-end: .15rem;
	padding: 0;
	border: 0;
	background: transparent;
	cursor: pointer;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-search__clear svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }
.mitode-search__clear:hover { color: var(--wp--preset--color--contrast); }
.mitode-search__clear[hidden] { display: none; }
/*
 * W9K: input[type=search] draws its own clear button in Chrome/Safari, so
 * the field showed two X icons side by side. Ours stays - it is keyboard
 * reachable and carries an accessible name; the native one is neither
 * labelled nor stylable.
 */
.mitode-search__input::-webkit-search-cancel-button,
.mitode-search__input::-webkit-search-decoration { -webkit-appearance: none; appearance: none; }

.mitode-search__panel {
	position: absolute;
	z-index: 60;
	top: calc(100% + .4rem);
	inset-inline: 0;
	max-height: min(70vh, 32rem);
	overflow-y: auto;
	overscroll-behavior: contain;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	box-shadow: 0 18px 44px rgba(0, 0, 0, .16);
	text-align: start;
}
.mitode-search__panel[hidden] { display: none; }

.mitode-search__group + .mitode-search__group { border-top: 1px solid var(--wp--preset--color--border); }
.mitode-search__group-title {
	margin: 0;
	padding: .7rem .9rem .3rem;
	font-size: .6875rem;
	font-weight: 700;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-search__list { margin: 0; padding: 0 0 .35rem; list-style: none; }
.mitode-search__row { margin: 0; }
.mitode-search__link {
	display: flex;
	align-items: center;
	gap: .7rem;
	padding: .5rem .9rem;
	text-decoration: none;
	color: var(--wp--preset--color--contrast);
}
.mitode-search__row.is-active,
.mitode-search__row:hover { background: var(--wp--preset--color--surface); }
.mitode-search__thumb {
	flex: 0 0 auto;
	width: 44px;
	height: 44px;
	object-fit: contain;
	background: #fff;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
}
.mitode-search__text { display: flex; flex-direction: column; gap: .1rem; min-width: 0; }
.mitode-search__name {
	font-size: .9375rem;
	font-weight: 600;
	line-height: 1.3;
	overflow: hidden;
	text-overflow: ellipsis;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
}
.mitode-search__note { font-size: .8125rem; color: var(--wp--preset--color--contrast-2); }
.mitode-search__none { margin: 0; padding: 1rem .9rem; color: var(--wp--preset--color--contrast-2); }
.mitode-search__all {
	display: block;
	padding: .8rem .9rem;
	border-top: 1px solid var(--wp--preset--color--border);
	font-size: .9375rem;
	font-weight: 600;
	text-align: center;
	text-decoration: none;
	color: var(--wp--preset--color--contrast);
}
.mitode-search__all:hover { background: var(--wp--preset--color--surface); }

@media (max-width: 700px) {
	.mitode-search__panel { max-height: min(60vh, 26rem); }
	.mitode-search__thumb { width: 38px; height: 38px; }
}

/* ---------------------------------------------------------------------
 * W9K - search results page
 * ------------------------------------------------------------------ */

.mitode-searchpage__count,
.mitode-searchpage__none { margin: 0 0 1.5rem; color: var(--wp--preset--color--contrast-2); }
.mitode-searchpage__list { margin: 0; padding: 0; list-style: none; display: grid; gap: .25rem; }
.mitode-searchpage__item {
	display: flex;
	align-items: flex-start;
	gap: 1rem;
	padding: 1rem .25rem;
	border-bottom: 1px solid var(--wp--preset--color--border);
}
.mitode-searchpage__media { flex: 0 0 auto; }
.mitode-searchpage__media img {
	width: 72px;
	height: 72px;
	object-fit: contain;
	background: #fff;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
}
.mitode-searchpage__body { min-width: 0; }
.mitode-searchpage__kind {
	font-size: .6875rem;
	font-weight: 700;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-searchpage__title { margin: .15rem 0 .3rem; font-size: 1.0625rem; line-height: 1.35; }
.mitode-searchpage__title a { color: var(--wp--preset--color--contrast); text-decoration: none; }
.mitode-searchpage__title a:hover { text-decoration: underline; }
.mitode-searchpage__note { margin: 0; font-size: .9375rem; line-height: 1.55; color: var(--wp--preset--color--contrast-2); }

@media (max-width: 700px) {
	.mitode-searchpage__media img { width: 56px; height: 56px; }
}

/* ---------------------------------------------------------------------
 * W9N - FOOTER UTILITY ROW
 *
 * Replaces the W9M "Land und Sprache" band. That band had a heading and an
 * explanatory paragraph, which made it read as a SECTION of the page
 * sitting between the footer's link columns and its copyright strip - two
 * footers instead of one. It also described a language switcher, which
 * this brand does not have.
 *
 * The row lives INSIDE .mitode-footer__main, under the four columns and
 * above the copyright strip, separated by the same hairline the
 * certification row already used. Marks on the leading edge, shop selector
 * on the trailing edge, nothing else - no heading, no copy.
 *
 * Note what carries the separation: the hairline moved from
 * .mitode-footer__certs to this container. The marks are no longer the
 * thing that starts a new band; the row is. If the marks are ever absent,
 * the selector still sits in a properly separated row rather than floating
 * against the columns above it.
 * ------------------------------------------------------------------ */

.mitode-footer__utility {
	margin-block-start: clamp(1.75rem, 4vw, 2.75rem);
	padding-block-start: clamp(1.25rem, 3vw, 2rem);
	border-top: 1px solid rgba(255, 255, 255, .1);
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 1.25rem 2rem;
	min-width: 0;
}

/*
 * Inside the row the marks are one of two items, so they stop being a
 * centred band of their own and align to the leading edge. They keep the
 * right to grow: on a narrow viewport the row wraps and the marks take the
 * full width again, centred, which is how they read best.
 */
.mitode-footer__utility .mitode-footer__certs {
	margin-block-start: 0;
	padding-block-start: 0;
	border-top: 0;
	flex: 1 1 18rem;
	min-width: 0;
}
.mitode-footer__utility .mitode-footer__certs ul { justify-content: flex-start; }

.mitode-footer__utility .mitode-lang { flex: 0 0 auto; }

/*
 * Stacked, the row must still read as part of the footer and not as a new
 * strip: same background, no rules between the halves, and the marks go
 * back to centre so the stack has one axis.
 */
@media (max-width: 767px) {
	.mitode-footer__utility { justify-content: center; }
	.mitode-footer__utility .mitode-footer__certs { flex-basis: 100%; }
	.mitode-footer__utility .mitode-footer__certs ul { justify-content: center; }
	.mitode-footer__utility .mitode-lang { flex-basis: 100%; display: flex; justify-content: center; }
}

/* ---------------------------------------------------------------------
 * footer copy row (W9L; the market selector left it in W9M)
 * ------------------------------------------------------------------ */

@media (max-width: 700px) {
	.mitode-footer__copy-inner { justify-content: flex-start; }
}

/* ---------------------------------------------------------------------
 * W9K - Instagram section
 *
 * The plugin renders its own grid inside .mitode-ig__feed; these rules
 * only set how many tiles that grid shows per row and keep it from
 * turning into a tall vertical column on a phone. Deliberately scoped -
 * we do not restyle the plugin's internals, we constrain its container.
 * ------------------------------------------------------------------ */

.mitode-ig__feed { margin-top: 1.5rem; }

/*
 * W9N.2 - the feed is a GRID, and the plugin's float layout is replaced
 * rather than nudged.
 *
 * Smash Balloon lays the tiles out as floated blocks with a percentage
 * width and lets each one take the height of its own photograph. Instagram
 * mixes 1:1, 4:5 and 9:16 in the same feed, so that produces a row of
 * different heights - the "developer placeholder" look the owner rejected.
 * Nudging the float model with widths and paddings was the first attempt
 * and it left 78 px tiles in a 390 px column.
 *
 * A grid states the answer instead: six equal columns on the desktop,
 * three on a tablet, two on a phone, each tile a square, each photograph
 * cropped into it. That is what the Shoptet shops do with the same feed.
 * Measured: heightSpread 0 px and photo ratio 1.00 at 1440/1280/768/390/375.
 *
 * `!important` on width and float because the plugin writes both inline.
 */
.mitode-ig__feed #sb_instagram {
	display: grid !important;
	grid-template-columns: repeat(6, minmax(0, 1fr));
	gap: .5rem;
	padding-bottom: 0 !important;
	width: 100% !important;
}
.mitode-ig__feed #sb_instagram #sbi_images {
	display: contents;
}
.mitode-ig__feed #sb_instagram .sbi_item {
	width: auto !important;
	float: none !important;
	padding: 0 !important;
	margin: 0 !important;
}
.mitode-ig__feed #sb_instagram .sbi_photo_wrap,
.mitode-ig__feed #sb_instagram .sbi_photo {
	display: block;
	width: 100%;
	aspect-ratio: 1 / 1;
	height: auto !important;
	border-radius: var(--mitode-radius);
	overflow: hidden;
}
.mitode-ig__feed #sb_instagram .sbi_photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}
/* the plugin's own loader/footer have nothing to do in a static grid */
.mitode-ig__feed #sb_instagram #sbi_load,
.mitode-ig__feed #sb_instagram .sbi_loader { display: none !important; }

@media (max-width: 1100px) {
	.mitode-ig__feed #sb_instagram { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (max-width: 860px) {
	.mitode-ig__feed #sb_instagram { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 600px) {
	.mitode-ig__feed #sb_instagram { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* W9N.8: .mitode-ig__note is gone - the sentence it styled was removed
   from the section (see inc/instagram.php). The privacy behaviour is
   unchanged; only the explanation to the customer was dropped. */

/*
 * W9N.9 - the follow button, under the grid and centred.
 *
 * `display: flex` with `justify-content: center`, not `text-align: center`.
 * The button is an inline-flex box with its own width, and text-align on the
 * paragraph centres inline content in the line box - which happens to work
 * until something gives the button `display: block` or a width, and then it
 * silently goes back to the left edge. A flex row states the intent the
 * measurement checks: the button's own centre on the column's centre.
 *
 * No breakpoint of its own. The button is narrower than the narrowest
 * column the theme has (390 px minus the shell padding), so there is
 * nothing for a media query to fix.
 */
.mitode-ig__cta {
	display: flex;
	justify-content: center;
	margin: clamp(1.5rem, 3vw, 2.25rem) 0 0;
}

/* ---------------------------------------------------------------------
 * W9L - portrait in an editorial column
 *
 * One landscape photograph beside one portrait photograph left the second
 * column's heading 180px below the first, which read as "one of these two
 * people matters more". Same box for both.
 * ------------------------------------------------------------------ */

.mitode-portrait img {
	width: 100%;
	height: auto;
	aspect-ratio: 4 / 3;
	object-fit: cover;
	object-position: center 28%;
	border-radius: var(--mitode-radius-lg);
}

/* ---------------------------------------------------------------------
 * W9L - operator identity block (inc/legal.php)
 * ------------------------------------------------------------------ */

/*
 * W9N.2 - THE OPERATOR DETAILS ARE NOT A WIDGET.
 *
 * This used to be a bordered, tinted card with a two-column label grid. On
 * the AGB, the Datenschutzerklärung and the Gewährleistung - pages that are
 * running text - it read as a banner nobody had asked for, and the owner
 * said so. A company's address is written the way a company writes its
 * address: name, street, postal line, country, one under the other, in the
 * flow of the page.
 *
 * The Widerrufsbelehrung keeps its box (`.mitode-legal--widerruf`, below):
 * there the frame carries meaning - "this is the binding statutory text".
 */
.mitode-legal,
.mitode-commerce-facts { margin-block: 1.5rem; }
.mitode-legal__address {
	margin: 0 0 .6rem;
	font-style: normal;
	line-height: 1.7;
}
.mitode-legal__ids,
.mitode-legal__reach {
	margin: 0 0 .6rem;
	line-height: 1.7;
}
.mitode-legal__reach:last-child { margin-bottom: 0; }

/* Editors only - a visitor never reaches this branch (inc/legal.php). */
.mitode-legal__todo {
	margin-top: 1.25rem;
	padding: .9rem 1.1rem;
	border-left: 4px solid var(--wp--preset--color--accent);
	background: #fff;
	border-radius: var(--mitode-radius);
	font-size: .9375rem;
}
.mitode-legal__todo p { margin: 0 0 .5rem; }
.mitode-legal__todo ul { margin: 0; padding-left: 1.15rem; }



/* ---------------------------------------------------------------------
 * W9M - Widerrufsbelehrung, model form, and the commerce-fact blocks
 *
 * The Belehrung is long prescribed prose, so it gets ordinary reading
 * typography rather than the compact card the identity block uses - the
 * box is there to say "this is the binding text", not to compress it.
 * ------------------------------------------------------------------ */

.mitode-legal--widerruf {
	padding: clamp(1.25rem, 3vw, 1.75rem);
}
.mitode-legal--widerruf h3 {
	margin: 1.5rem 0 .75rem;
	font-size: 1.125rem;
	line-height: 1.3;
}
.mitode-legal--widerruf > h3:first-child { margin-top: 0; }
.mitode-legal--widerruf h4 {
	margin: 1.25rem 0 .5rem;
	font-size: 1rem;
	line-height: 1.35;
}
.mitode-legal--widerruf p {
	margin: 0 0 .85rem;
	font-size: .9375rem;
	line-height: 1.65;
}
.mitode-legal--widerruf p:last-child { margin-bottom: 0; }

/* Each line of the model form is a field the customer fills in, so each
   one gets its own rule to write on rather than running together as prose. */
.mitode-legal__form {
	list-style: none;
	margin: 0 0 .85rem;
	padding: 0;
	display: grid;
	gap: .75rem;
}
.mitode-legal__form li {
	margin: 0;
	padding-bottom: .75rem;
	border-bottom: 1px dashed var(--wp--preset--color--border);
	font-size: .9375rem;
	line-height: 1.5;
}
.mitode-legal__form li:last-child { border-bottom: 0; padding-bottom: 0; }

/* Shipping and payment facts, rendered from the live configuration. */
.mitode-commerce-facts { margin-block: 1rem; }
.mitode-commerce-facts p { margin: 0 0 .85rem; }
.mitode-commerce-facts p:last-child { margin-bottom: 0; }
.mitode-commerce-facts__list {
	list-style: none;
	margin: 0 0 .85rem;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: .5rem .75rem;
}
.mitode-commerce-facts__list li {
	margin: 0;
	padding: .45rem .85rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--surface);
	font-size: .9375rem;
}
.mitode-commerce-facts__list li span { color: var(--wp--preset--color--contrast-3); }

/* ---------------------------------------------------------------------
 * W9N.2 - ONE WIDTH. NO EXCEPTIONS, NO PER-PAGE RULES.
 *
 * The owner's instruction, twice: "Nas web ma mat jednu globalnu sablonu,
 * globalne CSS/JS a nie aby sme kazdu stranku upravovali samostatne a
 * spravala sa kazda stranka inak." Then, after a first attempt that only
 * unified the CANVAS: "samotna stranka je sice sirsia, ale nadpis stranky
 * aj popis v nej je uzky."
 *
 * Both reports were right and the second one was about a cap this file had
 * added: the canvas became 1320 px while the H1 and the running text were
 * still held at a 960 px reading column, so the page got wider and the
 * words in it did not.
 *
 * WHAT WAS THERE BEFORE, measured at 1440 px with
 * tools/w9n2/browser/width-probe.mjs:
 *
 *   /blog/, /produkt-kategorie/...     1320 px canvas
 *   /kontakt/, /versand..., /studien/  1120 px canvas
 *   /agb/, /datenschutz/, /impressum/  1040 px canvas
 *   /blog/<article>                    1040 px canvas
 *
 * Four canvases, and WHICH ONE a page got depended on which blocks
 * happened to be inside it. That is per-page layout with a rule painted on
 * it, and /kontakt/ really was ~280 px narrower than the category page one
 * click away in the same menu.
 *
 * NOW: `--mitode-shell` (1320 px) is the width of every page of this site -
 * shop, category, product, home, blog archive, article, contact, legal.
 * The page head and the page body are the same width as each other and as
 * every other page. There is no `--mitode-editorial`, no
 * `--mitode-editorial-text`, no `.mitode-page--wide`, and no width that
 * depends on the content.
 *
 * These rules exist only to say "the editorial body behaves like the
 * commerce shell". If a future page needs a different width, the answer is
 * to change `--mitode-shell` in section 1 - one value, one place.
 *
 * THE ONE THING THIS COSTS, stated because it is real: a paragraph on a
 * 1440 px screen is now about 1240 px wide, which is roughly 160 characters
 * per line where typography guidance says 45-75. That is the price of one
 * template, the owner has chosen it knowingly twice, and it is one token
 * away from being changed back.
 * ------------------------------------------------------------------ */

.mitode-page--editorial .mitode-page-head > .mitode-shell,
.mitode-page--editorial .mitode-page-body {
	max-width: var(--mitode-shell);
}

/* Nothing inside narrows it again. */
.mitode-page--editorial .mitode-prose { max-width: none; }
.mitode-page--editorial .mitode-prose > * { max-width: none; }

/* ---------------------------------------------------------------------
 * W9N.2 - the article has no width of its own any more.
 *
 * W9N gave it 920 px and W9N.1 corrected that to 960 px after the owner
 * measured 672 px on screen. Both were the right answer to the question
 * "how wide is an article" - and W9N.2 removes the question: an article is
 * a page, a page is `--mitode-shell`, and there is one template.
 *
 * The class survives because the rules below are still article-specific
 * and have nothing to do with width: a wide table must scroll inside its
 * own box, and an author's image must not exceed the column.
 * ------------------------------------------------------------------ */

.mitode-page--article .mitode-prose table {
	display: block;
	width: 100%;
	max-width: 100%;
	overflow-x: auto;
	border-collapse: collapse;
}

.mitode-page--article .mitode-prose :is(img, iframe, video) {
	max-width: 100%;
	height: auto;
}

/*
 * Anchor links inside the article ("Das erfahren Sie in diesem Artikel")
 * jump to a heading that would otherwise land under the sticky header.
 */
.mitode-page--article .mitode-prose :is(h2, h3)[id] {
	scroll-margin-top: calc(var(--mitode-header-h) + 1rem);
}

/* ---------------------------------------------------------------------
 * W9M - glossary (inc/glossary.php)
 *
 * The index is a card grid inside the wide editorial shell; a single term
 * is ordinary reading prose and needs nothing of its own. The only rules
 * here are for the index and for the source list under an entry.
 * ------------------------------------------------------------------ */

.mitode-glossar { margin-block: 1.5rem; }

.mitode-glossar__jump ul {
	list-style: none;
	margin: 0 0 2rem;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: .4rem;
}
.mitode-glossar__jump li { margin: 0; }
.mitode-glossar__jump a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 2.5rem;
	min-height: 2.5rem;
	padding: 0 .5rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
	font-weight: 700;
	text-decoration: none;
	color: var(--wp--preset--color--contrast);
}
.mitode-glossar__jump a:hover,
.mitode-glossar__jump a:focus-visible {
	border-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--accent);
	text-decoration: none;
}

.mitode-glossar__group { margin-block: 0 2.5rem; }
.mitode-glossar .mitode-glossar__letter {
	margin: 0 0 1rem;
	padding-bottom: .5rem;
	border-bottom: 2px solid var(--wp--preset--color--accent);
	font-size: 1.25rem;
	line-height: 1.2;
}

.mitode-glossar__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 1rem;
	grid-template-columns: minmax(0, 1fr);
}
@media (min-width: 700px) {
	.mitode-glossar__list { grid-template-columns: repeat(auto-fill, minmax(min(20rem, 100%), 1fr)); }
}
.mitode-glossar__item {
	margin: 0;
	padding: 1.15rem 1.25rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--surface);
	min-width: 0;
}
/* W9N.1 - the entry heading is h3 inside a lettered group and h2 without
   one (inc/glossary.php), so both levels are styled the same. Styling only
   h3 would have made the ungrouped glossary look different from the grouped
   one for no reason a reader could see. */
.mitode-glossar__item :is(h2, h3) { margin: 0 0 .35rem; font-size: 1.0625rem; line-height: 1.3; }
.mitode-glossar__item :is(h2, h3) a { color: var(--wp--preset--color--contrast); text-decoration: none; }
.mitode-glossar__item :is(h2, h3) a:hover { color: var(--wp--preset--color--accent); text-decoration: underline; }
.mitode-glossar__aliases {
	margin: 0 0 .4rem;
	font-size: .8125rem;
	letter-spacing: .02em;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-glossar__def {
	margin: 0;
	font-size: .9375rem;
	line-height: 1.6;
	color: var(--wp--preset--color--contrast-2);
	/* the definition is a full sentence; the card shows its opening */
	display: -webkit-box;
	-webkit-line-clamp: 4;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.mitode-glossar__sources { margin-block: 2rem 0; }
.mitode-glossar__sources h2 { margin: 0 0 .75rem; font-size: 1.0625rem; }
.mitode-glossar__sources ul { margin: 0; padding-left: 1.15rem; }
.mitode-glossar__sources li { margin: 0 0 .5rem; font-size: .9375rem; line-height: 1.55; }
.mitode-glossar__sources a { word-break: break-word; }

/* ---------------------------------------------------------------------
 * 17. W9N.1 - contact form and showroom sections
 *
 * The canonical page (mitochondriak.com/contact/, read-only capture) has
 * three sections in this order: the form, then address-beside-map, then
 * photo-beside-visit-details. The information architecture is taken over;
 * the visual language is this theme's own tokens - pill buttons, 20px card
 * radius, the band rhythm - so the page belongs to this storefront rather
 * than looking like a port of another one.
 *
 * The two showroom sections are a plain two-column grid rather than the
 * portable `columns_wrapper_product_page` vocabulary. That vocabulary is
 * the CROSS-PLATFORM CONTRACT for product copy an editor writes once and
 * publishes to several shops; this is a theme component reading one option,
 * so borrowing the contract's class names would suggest an interchange that
 * does not exist here.
 * ------------------------------------------------------------------ */

.mitode-showroom {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: clamp(1.5rem, 3.5vw, 3rem);
	align-items: center;
	margin-block: var(--mitode-band-sm);
}

/* One column below the tablet breakpoint. The map is the element that
   suffers most from a narrow column, so it keeps its 4:3 box and simply
   spans the full width. */
@media (max-width: 781px) {
	.mitode-showroom { grid-template-columns: minmax(0, 1fr); gap: 1.5rem; }
}

.mitode-showroom__col { min-width: 0; }

.mitode-showroom h2 {
	margin: 0 0 .75rem;
	font-size: var(--mitode-fs-h2);
	line-height: 1.15;
}

.mitode-showroom p { margin: 0 0 .85rem; }

.mitode-showroom__address {
	margin: 0 0 1rem;
	font-style: normal;
	font-size: 1.0625rem;
	line-height: 1.65;
}

.mitode-showroom__link { margin-bottom: 0; }

/*
 * The map is a third-party iframe: it gets a fixed box so the page does not
 * reflow when it loads, and the box is rounded and clipped like every other
 * media surface in the theme.
 */
.mitode-showroom__frame {
	position: relative;
	aspect-ratio: 4 / 3;
	border-radius: var(--mitode-radius-lg);
	overflow: hidden;
	background: var(--wp--preset--color--surface);
	box-shadow: var(--mitode-shadow-card);
}
.mitode-showroom__frame iframe {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
}

.mitode-showroom__cta { margin: 1rem 0 0; }

.mitode-showroom--visit img,
.mitode-showroom__col--photo img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 4 / 3;
	object-fit: cover;
	border-radius: var(--mitode-radius-lg);
	box-shadow: var(--mitode-shadow-card);
}

/*
 * Visit details as a two-column definition list rather than a bullet list:
 * the labels are short and repeated, so aligning them makes the block
 * scannable. `max-content` on the label column keeps it as narrow as the
 * longest label and no narrower.
 */
.mitode-showroom__lines {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: .6rem;
}
.mitode-showroom__lines li {
	display: grid;
	grid-template-columns: minmax(6rem, max-content) 1fr;
	gap: .25rem 1rem;
	padding-block: .5rem;
	border-top: 1px solid var(--wp--preset--color--border);
	margin: 0;
}
.mitode-showroom__lines li:last-child { border-bottom: 1px solid var(--wp--preset--color--border); }
.mitode-showroom__label {
	font-size: .875rem;
	font-weight: 700;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-showroom__lines a { color: var(--wp--preset--color--contrast); }

/* ---- the form ------------------------------------------------------- */

.mitode-form-wrap {
	/*
	 * Exactly as wide as the page's running text, never narrower. A 1040px
	 * text input on a wide page is uncomfortable, and a form squeezed into
	 * its own 600px box on a 1120px page is the "random narrow wrapper" this
	 * stage removed everywhere else. One column for both.
	 */
	max-width: var(--mitode-content);
	margin-block: var(--mitode-band-sm);
	padding: clamp(1.25rem, 3vw, 2.25rem);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--surface);
}

.mitode-form { display: grid; gap: 1.1rem; }

.mitode-form__row { display: grid; gap: .4rem; }

.mitode-form label {
	font-weight: 600;
	font-size: .9375rem;
}
.mitode-form__req { color: var(--wp--preset--color--accent); }

.mitode-form input[type="text"],
.mitode-form input[type="email"],
.mitode-form textarea {
	box-sizing: border-box;
	width: 100%;
	padding: .75rem .9rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--contrast);
	font: inherit;
	font-size: 1rem;
	line-height: 1.5;
}
.mitode-form textarea { resize: vertical; min-height: 9rem; }

.mitode-form :is(input, textarea):focus-visible {
	outline: 2px solid var(--wp--preset--color--accent);
	outline-offset: 1px;
	border-color: var(--wp--preset--color--accent);
}

/* An invalid field is marked by more than colour: the border thickens and
   the message under it says what to do. */
.mitode-form [aria-invalid="true"] {
	border-color: var(--wp--preset--color--accent);
	border-width: 2px;
}

.mitode-form__hint,
.mitode-form__error { font-size: .875rem; line-height: 1.5; }
.mitode-form__hint { color: var(--wp--preset--color--contrast-3); }
.mitode-form__error { color: var(--wp--preset--color--accent); font-weight: 600; }

.mitode-form__check {
	display: grid;
	grid-template-columns: auto 1fr;
	gap: .65rem;
	align-items: start;
	font-weight: 400;
	font-size: .9375rem;
	line-height: 1.55;
}
.mitode-form__check input[type="checkbox"] {
	width: 1.15rem;
	height: 1.15rem;
	margin: .2rem 0 0;
	accent-color: var(--wp--preset--color--accent);
}

.mitode-form__actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: .85rem 1.5rem;
}
.mitode-form__actions .mitode-btn { border: 0; cursor: pointer; }
.mitode-form__alt { margin: 0; font-size: .9375rem; color: var(--wp--preset--color--contrast-3); }

/*
 * The honeypot. Moved off-screen rather than `display:none`, because some
 * bots skip fields they can tell are hidden. It must never be reachable by
 * tab (the input carries tabindex="-1") and never be read out as a real
 * question (the wrapper is aria-hidden).
 */
.mitode-form__trap {
	position: absolute !important;
	left: -9999px;
	top: auto;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

.mitode-form__notice {
	margin: 0 0 1.25rem;
	padding: .9rem 1.1rem;
	border-radius: var(--mitode-radius);
	border-left: 4px solid var(--wp--preset--color--accent);
	background: var(--wp--preset--color--base);
	font-size: .9375rem;
	line-height: 1.6;
}
.mitode-form__notice--ok { border-left-color: #009901; }
.mitode-form__notice:focus-visible { outline: 2px solid var(--wp--preset--color--accent); outline-offset: 2px; }

/* ---------------------------------------------------------------------
 * 18. W9N.1 - Versand und Zahlung
 *
 * The visual architecture of the canonical page: a dark hero with a lead
 * and a row of fact pills, two panels of rows side by side, then a grid of
 * information cards. Rebuilt on this theme's tokens.
 *
 * The hero is full-bleed inside the editorial column rather than edge to
 * edge: this is an information page in a 960px text canvas, and a band that
 * escapes it would read as a homepage section that wandered onto the wrong
 * page.
 * ------------------------------------------------------------------ */

.mitode-dp__hero {
	margin-block: 0 var(--mitode-band-sm);
	padding: clamp(1.75rem, 4vw, 2.75rem);
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--dark, #111);
	color: #fff;
}
.mitode-dp__hero h2 {
	margin: 0 0 .75rem;
	font-size: var(--mitode-fs-h2);
	line-height: 1.12;
	color: #fff;
}
.mitode-dp__hero p {
	margin: 0;
	max-width: 46rem;
	font-size: var(--mitode-fs-lede);
	line-height: 1.6;
	color: rgba(255, 255, 255, .84);
}

.mitode-dp__pills {
	list-style: none;
	display: flex;
	flex-wrap: wrap;
	gap: .5rem .6rem;
	margin: 1.35rem 0 0;
	padding: 0;
}
.mitode-dp__pills li {
	margin: 0;
	padding: .4rem .9rem;
	border: 1px solid rgba(255, 255, 255, .28);
	border-radius: var(--mitode-radius-pill);
	background: rgba(255, 255, 255, .06);
	font-size: .875rem;
	line-height: 1.4;
	color: #fff;
}

/* ---- the two panels -------------------------------------------------- */

/*
 * `align-items: start`, not the grid default `stretch`.
 *
 * The two panels hold different amounts of information and they are allowed
 * to: the delivery panel lists four carriers, the payment panel currently
 * says one true thing. Stretched to a common height, the shorter one became
 * 300px of empty card - which reads as a component that failed to load
 * rather than as a short answer. Each panel is now as tall as its content.
 */
.mitode-dp__grid {
	display: grid;
	grid-template-columns: 1fr 1fr;
	align-items: start;
	gap: clamp(1rem, 2.4vw, 1.75rem);
	margin-block: var(--mitode-band-sm);
}
@media (max-width: 781px) {
	.mitode-dp__grid { grid-template-columns: minmax(0, 1fr); }
}

.mitode-dp__panel {
	display: flex;
	flex-direction: column;
	min-width: 0;
	padding: clamp(1.1rem, 2.2vw, 1.6rem);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--base);
}
.mitode-dp__head h3 {
	margin: 0 0 .4rem;
	font-size: var(--mitode-fs-h3);
	line-height: 1.2;
}
.mitode-dp__head p {
	margin: 0 0 1.1rem;
	font-size: .9375rem;
	line-height: 1.55;
	color: var(--wp--preset--color--contrast-2);
}

.mitode-dp__list { display: grid; gap: 0; }

/*
 * A row is mark / text / badges. The badge column is `max-content` so a
 * long carrier name never pushes the badge off the card, and the text
 * column is the one that gives way - which is right, because it is the only
 * one that can wrap gracefully.
 */
.mitode-dp__row {
	display: flex;
	align-items: center;
	gap: .95rem;
	min-width: 0;
	padding-block: .95rem;
	border-top: 1px solid var(--wp--preset--color--border);
}
.mitode-dp__row:first-child { border-top: 0; padding-top: 0; }

.mitode-dp__mark {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 2.35rem;
	padding-inline: .3rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
	background: var(--wp--preset--color--surface);
	font-size: .6875rem;
	font-weight: 700;
	letter-spacing: .02em;
	text-transform: uppercase;
	color: var(--wp--preset--color--contrast-2);
	overflow: hidden;
	white-space: nowrap;
}

.mitode-dp__text { min-width: 0; flex: 1 1 auto; }
.mitode-dp__text h4 {
	margin: 0;
	font-size: 1rem;
	font-weight: 600;
	line-height: 1.35;
}
.mitode-dp__text p {
	margin: .15rem 0 0;
	font-size: .875rem;
	line-height: 1.5;
	color: var(--wp--preset--color--contrast-3);
}

.mitode-dp__badges {
	flex: 0 0 auto;
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: .35rem;
	min-width: 7.25rem;
}
.mitode-dp__badge {
	padding: .2rem .6rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-pill);
	background: var(--wp--preset--color--surface);
	font-size: .75rem;
	font-weight: 600;
	line-height: 1.5;
	color: var(--wp--preset--color--contrast-2);
	white-space: nowrap;
}

/* The badge that carries the offer, in the brand red - `jl-dp-badge-red` on
   the reference page. Exactly one per row, or it stops meaning anything. */
.mitode-dp__badge--accent {
	border-color: var(--wp--preset--color--accent);
	background: var(--wp--preset--color--accent);
	color: #fff;
}

/* On a phone the badges drop under the text rather than squeezing it into a
   two-word column, and line up with the text, not with the logo tile. */
@media (max-width: 620px) {
	.mitode-dp__row { align-items: flex-start; flex-wrap: wrap; gap: .75rem; }
	.mitode-dp__text { flex: 1 1 calc(100% - 5rem); }
	.mitode-dp__badges {
		flex: 1 1 100%;
		flex-direction: row;
		flex-wrap: wrap;
		justify-content: flex-start;
		min-width: 0;
		padding-left: 4.15rem;
	}
	.mitode-dp__badge { white-space: normal; }
}

.mitode-dp__note {
	margin: 1.1rem 0 0;
	padding-top: 1rem;
	border-top: 1px solid var(--wp--preset--color--border);
	font-size: .875rem;
	line-height: 1.6;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-dp__panel .mitode-dp__note { margin-top: auto; }

.mitode-dp__empty {
	padding: 1rem 1.1rem;
	border-radius: var(--mitode-radius);
	border-left: 4px solid var(--wp--preset--color--accent);
	background: var(--wp--preset--color--surface);
}
.mitode-dp__empty p { margin: 0 0 .5rem; font-size: .9375rem; line-height: 1.6; }
.mitode-dp__empty p:last-child { margin-bottom: 0; }
/* W9N.7 - the same box used as the paragraph itself, not as a wrapper. */
p.mitode-dp__empty { margin: 0; font-size: .9375rem; line-height: 1.6; }

/* ---- information cards ---------------------------------------------- */

/*
 * 17rem, not 15rem: at 15rem the 1040px canvas fits four columns, and four
 * columns of a paragraph each is 240px wide - a column of two-word lines.
 * 17rem gives three, which is the widest count these texts read well at.
 */
.mitode-dp__cards {
	display: grid;
	/*
	 * W9N.7: two, explicitly. The third card ("Umsatzsteuer und Rechnung")
	 * was removed - the tax regime belongs on the invoice and in the legal
	 * pages, not on a shipping page - and a three-column grid holding two
	 * cards leaves a third of the row empty. `auto-fit` is still not used:
	 * it gave four columns then two then one depending on the viewport.
	 */
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: .875rem;
	margin-block: var(--mitode-band-sm);
}

@media (max-width: 900px) {
	.mitode-dp__cards { grid-template-columns: minmax(0, 1fr); }
}
.mitode-dp__card {
	padding: clamp(1.1rem, 2.2vw, 1.5rem);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--surface);
}
.mitode-dp__card h3 {
	margin: 0 0 .5rem;
	font-size: 1.0625rem;
	line-height: 1.3;
}
.mitode-dp__card p,
.mitode-dp__card li { font-size: .9375rem; line-height: 1.6; }
.mitode-dp__card p:last-child { margin-bottom: 0; }
.mitode-dp__card ul { margin: 0; padding-left: 1.1rem; }

/* ---------------------------------------------------------------------
 * 19. THE EDITORIAL HEADING SCALE, PINNED.
 *
 * W9N.1 pinned 18/15/14 px here. W9N.2 keeps the mechanism and replaces
 * the numbers; the tokens are defined in section 1 with the measurements
 * that produced them.
 *
 * WHY THE PIN EXISTS AT ALL. `settings.typography.fluid` is on, so
 * WordPress turns every theme.json heading size into a clamp() and prints
 *
 *   :root :where(h1) { font-size: clamp(<min>, ..., <max>) }
 *
 * The top of that range is what was asked for; the bottom is not. In W9N.1
 * it put an <h1> at 14px on a phone - the same size as an <h3> - which
 * removes the hierarchy on the viewport that can least afford to lose it.
 * These rules pin the value and the media query in section 1 provides the
 * one deliberate small-screen step.
 *
 * `:root h1` is (0,1,1) against WordPress's `:root :where(h1)` at (0,0,1)
 * - `:where()` contributes no specificity - so it wins regardless of
 * global-styles being printed after this stylesheet.
 *
 * theme.json carries the same numbers so the block editor shows the right
 * sizes; it is not a second source of truth, it is the same decision
 * written where the editor can read it.
 *
 * CONSEQUENCE, stated because it is the whole point: a section heading
 * rendered by a theme component and a heading typed by an editor now come
 * out the same size. Display typography that is deliberately larger - the
 * hero slide title, the footer brand statement - is a CLASS on a div or a
 * span, not an <h2>, and is untouched by these three rules.
 * ------------------------------------------------------------------ */

:root h1 { font-size: var(--mitode-fs-h1); }
:root h2 { font-size: var(--mitode-fs-h2); }
:root h3 { font-size: var(--mitode-fs-h3); }

/*
 * W9N.3 - the exception the comment above PROMISED but did not deliver.
 *
 * The hero slide title is display typography, but it is rendered as an
 * <h1 class="mitode-hero-slide__title"> (inc/hero.php), not as a classed
 * <div> - so `:root h1` at (0,1,1) silently beat the component class at
 * (0,1,0) and squashed the homepage headline to 26 px, where its 15ch
 * measure folded "Entdecken Sie Ihr volles Potenzial" onto three lines.
 * (The same specificity trap as W9H's trust icons and W9L's footer menu -
 * third occurrence now.) Restated AFTER the element rules so the class
 * wins the (0,1,1) tie; line-height comes along because the global h1
 * rule carries one too.
 */
:root .mitode-hero-slide__title {
	/* W72-C - kept byte-identical to the component rule above. This
	   restatement exists only to win the (0,1,1) tie against `:root h1`;
	   the moment the two values differ, the one up there is dead code and
	   the next reader edits it for an hour. */
	font-size: clamp(1.3875rem, 3.45vw, 2.7rem);
	line-height: 1.06;
}

/*
 * W51 asked for -25% on PHONES and wrote it here, at (0,2,0), because a
 * media query adds no specificity and the same rule placed next to the
 * component lost the tie and measured the old 29.6px. That note is kept
 * because the trap is real and this file has now hit it three times.
 *
 * W72-C - THE MEDIA QUERY IS GONE, AND NOT BECAUSE THE PHONE CHANGED.
 *
 * The owner has now asked for the same -25% on DESKTOP. Both reductions
 * start from the same W9N.3 clamp, so scaling that clamp once produces
 * the phone values W51 wrote, to the digit:
 *
 *   390px   floor 1.3875rem  = 22.2px   (W51: 22.2px)
 *   430px   floor 1.3875rem  = 22.2px   (W51: 22.2px)
 *   834px   3.45vw           = 28.8px   (was 38.4px)
 *   1280px  max 2.7rem       = 43.2px   (was 57.6px)
 *   1440px  max 2.7rem       = 43.2px   (was 57.6px)
 *
 * Two rules holding one value is how a stylesheet acquires a version of
 * the truth that nobody edits. One rule, one size, every width.
 */
:root .mitode-cathero__title { font-size: clamp(1.75rem, 4vw, 2.5rem); line-height: 1.12; }

/* ---------------------------------------------------------------------
 * 20. W9N.2 - consent, the embed gate, /kontakt/ and the About components
 *
 * Four things in one section because they arrived together, but they are
 * independent: nothing below depends on anything else below.
 * ------------------------------------------------------------------ */

/* ---- 20.1 the consent dialog ---------------------------------------- */

/*
 * Bottom sheet, not a full-screen overlay. A modal that covers the page
 * before a visitor has seen anything is the pattern that makes people click
 * "accept all" to get rid of it, and a consent obtained that way is not
 * worth having. The page stays readable and scrollable underneath.
 */
.mitode-consent {
	position: fixed;
	inset-inline: 0;
	inset-block-end: 0;
	z-index: 1000;
	padding: 1rem;
	pointer-events: none;
}
.mitode-consent[hidden] { display: none; }
.mitode-consent__panel {
	pointer-events: auto;
	max-width: 46rem;
	margin-inline: auto;
	padding: 1.35rem 1.5rem;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	box-shadow: var(--wp--preset--shadow--pop, 0 18px 44px rgba(0, 0, 0, .18));
}
.mitode-consent__title { margin: 0 0 .5rem; }
.mitode-consent__desc {
	margin: 0 0 1rem;
	font-size: .9375rem;
	line-height: 1.55;
	color: var(--wp--preset--color--contrast-2);
}
/*
 * `display: grid` ON A CLASS BEATS THE `hidden` ATTRIBUTE, AND THAT TURNED
 * THE BANNER INTO A COOKIE WALL.
 *
 * `[hidden] { display: none }` is a user-agent rule with the specificity of
 * an attribute selector; `.mitode-consent__cats { display: grid }` is a
 * class and wins. The category list was therefore ALWAYS rendered, the
 * panel came out 520 px tall on the desktop and covered the screen from
 * y=40 to y=884 on a 390 px phone - the whole viewport.
 *
 * Measured, not noticed: tools/w9l/browser/selector-interaction.mjs started
 * failing 16 checks because a real mouse click at the market selector hit
 * `H2.mitode-consent__title` instead. A test written for something else
 * caught it, which is the argument for running the whole suite rather than
 * the parts that seem related.
 *
 * A consent request that covers the page until it is answered is exactly
 * the pattern this file's header says it will not build: it is what makes
 * people click "accept all" to get rid of it.
 */
.mitode-consent__cats[hidden] { display: none; }
/*
 * Same trap, second element: .mitode-consent__save is a .mitode-btn and
 * .mitode-btn sets display:inline-flex, which beats the browser's
 * [hidden]{display:none}. "Auswahl speichern" was therefore visible next
 * to "Einstellungen" before the category list had been opened - a button
 * offering to save a choice the visitor had not been shown yet.
 */
.mitode-consent__save[hidden] { display: none; }
.mitode-consent__cats {
	display: grid;
	gap: .75rem;
	margin-bottom: 1rem;
}

/*
 * And a ceiling, so a future extra category cannot recreate the same
 * situation: the panel never takes more than half the screen, and the part
 * that would not fit scrolls inside it.
 */
.mitode-consent__panel {
	max-height: min(50vh, 32rem);
	overflow-y: auto;
	overscroll-behavior: contain;
}
.mitode-consent__check {
	display: grid;
	grid-template-columns: auto 1fr;
	gap: .6rem;
	align-items: start;
	font-size: .875rem;
	line-height: 1.5;
}
.mitode-consent__check input { margin-top: .2rem; }
.mitode-consent__check strong { display: block; }
.mitode-consent__check em {
	display: block;
	font-style: normal;
	font-size: .75rem;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-consent__check span span { color: var(--wp--preset--color--contrast-2); }
.mitode-consent__actions {
	display: flex;
	flex-wrap: wrap;
	gap: .6rem;
	align-items: center;
}
.mitode-consent__more,
.mitode-consent__link {
	appearance: none;
	background: none;
	border: 0;
	padding: 0;
	font: inherit;
	font-size: .875rem;
	color: inherit;
	text-decoration: underline;
	cursor: pointer;
}
.mitode-consent__more:hover,
.mitode-consent__link:hover { color: var(--wp--preset--color--accent); }
.mitode-footer .mitode-consent__link { color: #b9bcc7; font-size: .9375rem; }
.mitode-footer .mitode-consent__link:hover { color: #fff; }

@media (max-width: 600px) {
	.mitode-consent__actions .mitode-btn { flex: 1 1 100%; justify-content: center; }
	/*
	 * A phone has the least screen and the same banner. 50vh of a 900 px
	 * viewport was still 450 px of covered page, so the sheet is capped
	 * lower here and the padding comes down with it.
	 */
	.mitode-consent__panel { max-height: 42vh; padding: 1.1rem 1.15rem; }
	.mitode-consent__desc { font-size: .875rem; }
}

/* ---- 20.2 the embed gate -------------------------------------------- */

/*
 * The placeholder occupies the same box the map would, so granting consent
 * does not make the page jump. It is a local surface: no image, no icon
 * font, nothing fetched from anywhere.
 */
.mitode-embedgate {
	display: grid;
	place-items: center;
	min-height: 260px;
	padding: 1.5rem;
	background: var(--wp--preset--color--surface);
	border: 1px dashed var(--wp--preset--color--border);
	border-radius: var(--mitode-radius);
	text-align: center;
}
/*
 * W9N.5 - the local preview. Grid, not absolute positioning: the picture is
 * a row of its own above the text, so a long address in a narrow column
 * pushes the layout down instead of overlapping the image.
 */
.mitode-embedgate:has(.mitode-embedgate__preview) {
	align-content: start;
	gap: 1.1rem;
	padding: 1.15rem;
}
.mitode-embedgate__preview {
	width: 100%;
	max-width: 100%;
	height: auto;
	max-height: 260px;
	object-fit: cover;
	border-radius: var(--mitode-radius);
	display: block;
}
.mitode-embedgate__inner { max-width: 34rem; }
.mitode-embedgate__title { margin: 0 0 .35rem; font-weight: 700; }
.mitode-embedgate__address {
	margin: 0 0 .75rem;
	font-size: .9375rem;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-embedgate__note {
	margin: 0 0 1rem;
	font-size: .8125rem;
	line-height: 1.55;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-embedgate__actions {
	display: flex;
	flex-wrap: wrap;
	gap: .5rem;
	justify-content: center;
	margin: 0 0 .75rem;
}
.mitode-embedgate__settings { margin: 0; font-size: .8125rem; }

/* ---- 20.3 /kontakt/ --------------------------------------------------- */

.mitode-kontakt {
	display: grid;
	gap: 2rem;
	align-items: start;
}
@media (min-width: 900px) {
	/*
	 * The form is the wider half. On the source page the two columns are
	 * even, but the form has a textarea in it and the facts column is a
	 * list of short lines - an even split gives the textarea less room than
	 * the address needs.
	 */
	.mitode-kontakt { grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr); gap: 3rem; }
}
.mitode-kontakt__form > h2 { margin-top: 0; }
.mitode-kontakt__info {
	padding: 1.75rem;
	background: var(--wp--preset--color--surface);
	border-radius: var(--mitode-radius-lg);
}
.mitode-kontakt__info h2 { margin-top: 0; }
.mitode-kontakt__info h3 { margin: 1.5rem 0 .5rem; }
.mitode-kontakt__address {
	margin: 0 0 1rem;
	font-style: normal;
	line-height: 1.65;
}
.mitode-kontakt__ids {
	margin: 0 0 .75rem;
	line-height: 1.7;
}
.mitode-kontakt__reach { list-style: none; margin: 0; padding: 0; }
.mitode-kontakt__reach li {
	display: flex;
	align-items: center;
	gap: .55rem;
	padding: .25rem 0;
}
.mitode-kontakt__reach svg {
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
	fill: none;
	stroke: var(--wp--preset--color--accent);
	stroke-width: 1.8;
	stroke-linecap: round;
	stroke-linejoin: round;
}
.mitode-kontakt__map { margin-top: .75rem; }
.mitode-kontakt__map .mitode-showroom__frame { aspect-ratio: 4 / 3; }
.mitode-kontakt__map .mitode-embedgate { min-height: 220px; padding: 1.15rem; }
.mitode-kontakt__imprint {
	margin: 1.25rem 0 0;
	font-size: .8125rem;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-form__privacy {
	margin: .25rem 0 1rem;
	font-size: .8125rem;
	line-height: 1.5;
	color: var(--wp--preset--color--contrast-3);
}

/* ---- 20.4 the About components --------------------------------------- */

/*
 * FOUR reusable pieces, and the About page is nothing but these four in a
 * sequence. The source page (mitochondriak.pl/o-nas/) builds the same
 * rhythm out of a Shoptet `dm-flex`/`fl50` pair repeated with inline
 * styles; here it is one class that alternates, so a new section is one
 * more block and not one more copy of a layout.
 */

.mitode-split {
	display: grid;
	gap: 1.75rem;
	align-items: center;
	margin-block: var(--mitode-band-sm);
}
@media (min-width: 860px) {
	.mitode-split { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 3rem; }
	/* media first in the DOM stays second on screen, and vice versa */
	.mitode-split--reverse .mitode-split__media { order: -1; }
}
.mitode-split__text > :first-child { margin-top: 0; }
.mitode-split__text > :last-child { margin-bottom: 0; }
.mitode-split__media img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: var(--mitode-radius-lg);
}
.mitode-split__media figcaption {
	margin-top: .5rem;
	font-size: .8125rem;
	color: var(--wp--preset--color--contrast-3);
}

/* the numbered founder marker */
.mitode-marker {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 2.25rem;
	height: 2.25rem;
	margin-bottom: .75rem;
	border-radius: 999px;
	background: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--base);
	font-weight: 700;
	font-size: 1rem;
	line-height: 1;
}

.mitode-infobox {
	margin: 1.25rem 0 0;
	padding: 1.15rem 1.35rem;
	background: var(--wp--preset--color--surface);
	border-inline-start: 3px solid var(--wp--preset--color--accent);
	border-radius: var(--mitode-radius);
}
.mitode-infobox > :first-child { margin-top: 0; }
.mitode-infobox > :last-child { margin-bottom: 0; }
.mitode-infobox ul { margin: .5rem 0 0; padding-inline-start: 1.15rem; }
.mitode-infobox li { margin-bottom: .3rem; font-size: .9375rem; line-height: 1.55; }

/*
 * The RED / NIR / UV statement. The only full-bleed dark band on the page,
 * because the source gives that message its own visual weight and a page
 * of even-weight two-column blocks has no crescendo.
 */
.mitode-statement {
	margin-block: var(--mitode-band);
	padding: var(--mitode-band) clamp(1.25rem, 4vw, 3rem);
	background: var(--wp--preset--color--contrast);
	color: #fff;
	border-radius: var(--mitode-radius-lg);
	text-align: center;
}
.mitode-statement h2 { color: #fff; margin: 0 0 .75rem; }
.mitode-statement p {
	max-width: 62ch;
	margin-inline: auto;
	color: rgba(255, 255, 255, .82);
	line-height: 1.65;
}
.mitode-statement__waves {
	display: grid;
	gap: 1rem;
	margin: 1.75rem 0 0;
	padding: 0;
	list-style: none;
	text-align: start;
}
@media (min-width: 780px) {
	.mitode-statement__waves { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.mitode-statement__waves li {
	padding: 1.1rem 1.25rem;
	background: rgba(255, 255, 255, .07);
	border-radius: var(--mitode-radius);
}
.mitode-statement__waves b {
	display: block;
	color: var(--wp--preset--color--accent);
	font-size: 1.125rem;
}
.mitode-statement__waves span {
	display: block;
	margin-top: .35rem;
	font-size: .9375rem;
	line-height: 1.5;
	color: rgba(255, 255, 255, .78);
}

.mitode-about-social {
	display: flex;
	flex-wrap: wrap;
	gap: .75rem;
	margin: 1rem 0 0;
	padding: 0;
	list-style: none;
}
.mitode-about-social a {
	display: inline-flex;
	align-items: center;
	gap: .45rem;
	padding: .5rem .9rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 999px;
	font-size: .875rem;
	text-decoration: none;
}
.mitode-about-social a:hover { border-color: var(--wp--preset--color--accent); color: var(--wp--preset--color--accent); }
.mitode-about-social svg { width: 16px; height: 16px; }

/*
 * W9N.2 - the cookie table.
 *
 * Five columns of German prose do not fit in a 960 px reading column on a
 * 375 px phone, and a table that widens the PAGE is the horizontal-overflow
 * defect the responsive QA checks for. So the table scrolls inside its own
 * box and the page never does.
 */
.mitode-table-scroll {
	overflow-x: auto;
	margin-block: 1.25rem;
	-webkit-overflow-scrolling: touch;
}
.mitode-cookie-table {
	width: 100%;
	min-width: 46rem;
	border-collapse: collapse;
	font-size: .875rem;
}
.mitode-cookie-table th,
.mitode-cookie-table td {
	padding: .6rem .7rem;
	border-bottom: 1px solid var(--wp--preset--color--border);
	text-align: start;
	vertical-align: top;
	line-height: 1.5;
}
.mitode-cookie-table thead th {
	background: var(--wp--preset--color--surface);
	font-weight: 700;
	white-space: nowrap;
}
.mitode-cookie-table code {
	font-size: .8125rem;
	overflow-wrap: anywhere;
}
.mitode-legal__stand {
	margin-top: 2rem;
	font-size: .8125rem;
	color: var(--wp--preset--color--contrast-3);
}
.mitode-about-founders { margin-top: var(--mitode-band-sm); }

/*
 * W9N.2 - the ghost button on a LIGHT surface.
 *
 * `.mitode-btn--ghost` was written for the dark hero: white text on a
 * transparent background with a white border. On the consent panel and the
 * map placeholder - both light - that renders as white text on near-white,
 * i.e. an invisible button. Caught in the acceptance screenshot of
 * /kontakt/, where "In Google Maps öffnen" could not be read at all.
 *
 * The two light surfaces restate the three properties rather than the base
 * class being changed: every existing use of the class is on dark, and
 * changing the base would have moved all of them to fix two.
 */
.mitode-consent__panel .mitode-btn--ghost,
.mitode-embedgate .mitode-btn--ghost {
	color: var(--wp--preset--color--contrast);
	border-color: var(--wp--preset--color--border);
	background: var(--wp--preset--color--base);
}
.mitode-consent__panel .mitode-btn--ghost:hover,
.mitode-embedgate .mitode-btn--ghost:hover {
	color: var(--wp--preset--color--contrast);
	border-color: var(--wp--preset--color--contrast);
	background: var(--wp--preset--color--surface);
}

/* =====================================================================
   W9N.6 - VERSAND UND ZAHLUNG

   Geometry taken from the reference page the owner works from
   (mitochondriak.com/payment-and-shipping/): a 64x48 logo tile at the head
   of every row, text in the middle, price badges hard right, then a grey
   note, the bank cards and three information cards. W9N.6 first shipped a
   layout of its own - a separate logo strip and a four-card fact grid - and
   the owner rejected it. This is the reference structure.
   ===================================================================== */

/* ---- row logo tile ---------------------------------------------------
   The carrier SVGs carry their OWN background plate in the carrier's brand
   colour (blue for GLS, yellow for DHL), because an <img> cannot inherit
   the theme's colour and white GLS lettering would vanish. The tile is
   therefore a neutral frame, never a second background. */

.mitode-dp__logo {
	flex: 0 0 64px;
	width: 64px;
	height: 48px;
	display: flex;
	align-items: center;
	justify-content: center;
	overflow: hidden;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 13px;
	background: var(--wp--preset--color--surface);
}

.mitode-dp__logo img {
	display: block;
	width: auto;
	height: auto;
	max-width: 52px;
	max-height: 34px;
	/* `contain` by construction - a cropped carrier logo is a modified logo. */
	object-fit: contain;
}

.mitode-dp__logotext {
	font-size: .6875rem;
	font-weight: 800;
	line-height: 1.1;
	text-align: center;
	letter-spacing: .02em;
	color: var(--wp--preset--color--contrast);
}


/* ---- grey note box ---------------------------------------------------- */

.mitode-dp__callout {
	margin-top: var(--mitode-band-sm);
	padding: 1.05rem 1.15rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--surface);
}

.mitode-dp__callout p {
	margin: 0;
	font-size: .875rem;
	line-height: 1.6;
	color: var(--wp--preset--color--contrast-2);
}
.mitode-dp__callout p + p { margin-top: .5rem; }

/* ---- bank cards ------------------------------------------------------- */

.mitode-dp__banks {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: .875rem;
	margin-top: var(--mitode-band-sm);
}

@media (max-width: 780px) {
	.mitode-dp__banks { grid-template-columns: minmax(0, 1fr); }
}

.mitode-dp__bank {
	padding: 1rem 1.05rem;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--mitode-radius-lg);
	background: var(--wp--preset--color--base);
	box-shadow: var(--mitode-shadow-card);
	min-width: 0;
}

.mitode-dp__bank h3 { margin: 0 0 .5rem; font-size: var(--mitode-fs-h3); }

.mitode-dp__bank p {
	margin: 0;
	font-size: .8125rem;
	line-height: 1.55;
	color: var(--wp--preset--color--contrast-2);
	/* An IBAN is copied by hand and must never be re-flowed mid-group. */
	word-break: break-word;
}

.mitode-dp__cardlinks { margin-top: .5rem !important; }

/* ---------------------------------------------------------------------
 * W27.7 - glossary autolinks (inc/glossary-links.php)
 *
 * A dotted underline rather than the accent colour: these links are
 * sprinkled through body text and a red word every few paragraphs reads as
 * emphasis the author did not write. The dotted rule is the long-standing
 * convention for "this term has a definition", it inherits the surrounding
 * colour so it works on the light AND the dark bands, and it becomes a
 * solid accent underline on hover and focus so it is unmistakably a link
 * once the reader goes for it.
 * ------------------------------------------------------------------ */

.mitode-glossar-link {
	color: inherit;
	text-decoration: none;
	border-bottom: 1px dotted currentColor;
	/* the dotted rule sits too close to the descenders at body size */
	padding-bottom: .05em;
	transition: color .15s var(--mitode-ease), border-color .15s var(--mitode-ease);
}
.mitode-glossar-link:hover,
.mitode-glossar-link:focus-visible {
	color: var(--wp--preset--color--accent);
	border-bottom: 1px solid var(--wp--preset--color--accent);
}
/* On the dark bands the accent red on near-black is the weakest pair in the
   palette (4.16:1); white keeps the hover legible there. */
.mitode-light .mitode-glossar-link:hover,
.mitode-about .mitode-glossar-link:hover,
.mitode-light .mitode-glossar-link:focus-visible,
.mitode-about .mitode-glossar-link:focus-visible {
	color: #fff;
	border-bottom-color: #fff;
}

/* =====================================================================
 * W27.7 - THE MINI-CART DRAWER, WHICH THE W27.6 CART FIX COULD NOT REACH
 *
 * The owner reported the price column leaving the screen when the cart is
 * opened from the header on a phone, while the cart PAGE is fine. Both
 * halves of that are true, and the second half is why the first happened:
 * W27.6 scoped its `min-width: 0` fix to `.mitode-store-page` - but that
 * was only half the reason. The other half is why this block lives in
 * main.css and not next to the rest of the cart CSS: `store.css` is
 * enqueued ONLY on /warenkorb/ and /kasse/ (inc/store-ui.php), and the
 * drawer opens from the HEADER on every page of the shop. A rule written
 * there could never reach it. The first attempt at this fix went into
 * store.css and changed nothing at all - the measurement was identical
 * before and after, which is how the real reason surfaced.
 *
 * Measured (tools/w27-7/browser/minicart-break.mjs, a 9-item basket so the
 * total is five digits):
 *
 *     viewport   320     360     375     412     430     480
 *     price ends 374.5   374.5   374.5   396     414     464
 *     past edge  +54.5   +14.5    -0.5     ok      ok      ok
 *
 * Chrome names the rule (CSS.getMatchedStylesForNode on the row):
 *
 *     .is-medium table.wc-block-cart-items .wc-block-cart-items__row,
 *     .is-mobile table.wc-block-cart-items .wc-block-cart-items__row {
 *         display: grid; column-gap: 16px;
 *         grid-template-columns: 80px 132px;
 *     }
 *
 * BOTH tracks are fixed, the product cell spans `grid-column: 2 / 4`, and
 * the total lands in the implicit fourth track at its own 87.5px. The row's
 * minimum is therefore 80 + 16 + 132 + 16 + 87.5 = 331.5 before the product
 * cell contributes anything at all - and a drawer is only as wide as the
 * phone. Nothing in that layout can shrink, so the price simply leaves.
 *
 * The fix gives the row the shape the cart page already has: the product
 * column FLEXIBLE (`minmax(0, 1fr)` - the 0 is the part that matters, it is
 * what lets a grid item go below its content), the price column `auto` so
 * it takes exactly what the number needs, and the price stays on the right
 * where the reader looks for it instead of being stacked underneath.
 *
 * Row minimum is now 80 + 16 + 0 + 16 + price. It fits a 320px phone.
 * ================================================================== */

/*
 * SPECIFICITY, MEASURED THE HARD WAY.
 *
 * The first version of this block used three-class selectors and produced a
 * WORSE bug than the one it fixed: the price stopped leaving the screen and
 * started sitting ON TOP of the product name, at every width.
 *
 *   480px drawer   product  L112 R464   (352 wide)
 *                  total    L260 R464   (204 wide)   <- inside the product
 *
 * Because WooCommerce's own rule is
 *   `.is-mobile table.wc-block-cart-items .wc-block-cart-items__row
 *    .wc-block-cart-item__product { grid-column-start: 2; grid-column-end: 4 }`
 * which is (0,4,1). My product rule was (0,3,0) and LOST, so the product
 * kept spanning tracks 2-4; my total rule happened to win, so the total was
 * placed in track 3 - inside the span. Two items, one cell.
 *
 * Both placements have to come from the same hand or they contradict each
 * other. Five classes beats four-plus-an-element, so every rule below is
 * anchored on the drawer's full container chain and nothing here depends on
 * which stylesheet the browser loaded first.
 */
.wp-block-woocommerce-mini-cart-contents .wc-block-mini-cart__items .wc-block-mini-cart__products-table .wc-block-cart-items__row {
	grid-template-columns: 80px minmax(0, 1fr) auto;
	column-gap: 16px;
}
.wp-block-woocommerce-mini-cart-contents .wc-block-mini-cart__items .wc-block-mini-cart__products-table .wc-block-cart-items__row .wc-block-cart-item__image {
	grid-column: 1 / 2;
	grid-row: 1;
}
.wp-block-woocommerce-mini-cart-contents .wc-block-mini-cart__items .wc-block-mini-cart__products-table .wc-block-cart-items__row .wc-block-cart-item__product {
	grid-column: 2 / 3;
	grid-row: 1;
	min-width: 0;
}
.wp-block-woocommerce-mini-cart-contents .wc-block-mini-cart__items .wc-block-mini-cart__products-table .wc-block-cart-items__row .wc-block-cart-item__total {
	grid-column: 3 / 4;
	grid-row: 1;
	min-width: 0;
	text-align: right;
}
/* The product name is the one string long enough to push a track wide. */
.wp-block-woocommerce-mini-cart-contents .wc-block-mini-cart__items .wc-block-cart-item__wrap,
.wp-block-woocommerce-mini-cart-contents .wc-block-mini-cart__items .wc-block-cart-item__wrap > * {
	min-width: 0;
}

/* The drawer's own copy of the quantity stepper: the compact one. store.css
   sizes the cart PAGE control and is not loaded here, so this is not a
   duplicate - it is the only rule the drawer ever sees. */
.wc-block-mini-cart__items .wc-block-components-quantity-selector,
.wc-block-components-drawer .wc-block-components-quantity-selector {
	min-width: 6.5rem;
	max-width: 6.5rem;
}
.wc-block-mini-cart__items .wc-block-components-quantity-selector input,
.wc-block-components-drawer .wc-block-components-quantity-selector input {
	font-size: .9375rem;
	min-height: 0;
	height: 2.25rem;
	padding-block: 0;
}
.wc-block-mini-cart__items .wc-block-components-quantity-selector__button,
.wc-block-components-drawer .wc-block-components-quantity-selector__button {
	min-width: 2rem;
	height: 2.25rem;
}

/* ---------------------------------------------------------------------
 * W27.7 - the media / customer-voices band
 *
 * A white band, deliberately: it is the breather between the dark
 * wavelength band and the dark brand band, and the owner asked for exactly
 * that ("normal white area"). It uses the section head scale the rest of
 * the homepage uses, so when the reviews widget replaces the paragraph the
 * heading above it does not have to change.
 * ------------------------------------------------------------------ */

.mitode-press { background: var(--wp--preset--color--base); }
.mitode-press .mitode-shell { padding-block: var(--mitode-band); }

/*
 * W27.9 - THE HEAD IS CENTRED, AND `text-align` ALONE DID NOT DO IT.
 *
 * The owner asked for a centred heading and lede on desktop. The first
 * attempt added `text-align: center` and measured worse than it looked:
 *
 *   1440   title box x=93..327   (234 px wide)   shell x=53..1373
 *
 * The text was centred INSIDE a 234 px box that was still hard against
 * the left edge, because W27.7 gave the title `max-width: 24ch` - the
 * reading measure every homepage headline has. The measure is right and
 * stays; what was missing is `margin-inline: auto`, which centres the BOX
 * the text is centred in.
 *
 * Only the head. The rail below it is left-aligned running text in cards
 * and must stay that way.
 */
.mitode-press .mitode-eyebrow,
.mitode-press .mitode-press__title,
.mitode-press .mitode-press__lede {
	text-align: center;
	margin-inline: auto;
}
.mitode-press .mitode-press__title {
	margin-block: .35rem .75rem;
	/*
	 * 34ch, not the 24ch W27.7 set. That measure is right for a heading
	 * that starts at the left edge of a text column; centred over the full
	 * band it broke "Was Kundinnen und Kunden über Mitochondriak® sagen"
	 * into three short centred lines with a metre of white on either side.
	 * `text-wrap: balance` then evens the two lines it does take.
	 */
	max-width: 34ch;
	text-wrap: balance;
	font-size: var(--mitode-fs-h2);
	line-height: 1.15;
	letter-spacing: -.015em;
}
.mitode-press .mitode-press__lede {
	margin-block: 0 clamp(1.5rem, 3vw, 2.5rem);
	max-width: 62ch;
	font-size: var(--mitode-fs-lede);
	line-height: 1.6;
	color: var(--wp--preset--color--contrast-2);
}

/* ---------------------------------------------------------------------
 * W27.10 - PRODUCT RATING ON A CARD
 *
 * Lives in main.css and not in reviews.css on purpose: reviews.css is
 * enqueued only on pages that carry a review BLOCK, and this component
 * appears on the shop grid, on category archives, in the home page
 * carousel and on the PDP - pages that have no review block at all. A
 * component that can be placed anywhere has to be styled from the sheet
 * that is always there.
 * ------------------------------------------------------------------ */

.mitode-prating-row {
	margin-block-start: .25rem;
}

.mitode-prating {
	display: inline-flex;
	align-items: center;
	gap: .3em;
	font-size: .8125rem;
	line-height: 1.2;
	color: var(--wp--preset--color--contrast-2, #3a3a3a);
}

/* The star glyphs, scoped to this component.
 *
 * `.mitode-stars` is defined in reviews.css and stays there - it belongs
 * to the review pages. These rules are the same shape at card size,
 * written under `.mitode-prating` so the two sheets can never fight over
 * a global selector when a page happens to load both. */
.mitode-prating .mitode-stars {
	display: inline-flex;
	gap: .06em;
	line-height: 1;
}

.mitode-prating .mitode-stars__s svg {
	width: .95em;
	height: .95em;
	display: block;
}

/* W48: gold, from the one token. See --mitode-rating-color in :root. */
.mitode-prating .mitode-stars__s.is-full svg { fill: var(--mitode-rating-color); }
.mitode-prating .mitode-stars__s.is-empty svg { fill: var(--mitode-rating-empty); }
.mitode-prating .mitode-stars__s.is-half svg { fill: var(--mitode-rating-empty); }

.mitode-prating .mitode-stars__s.is-half {
	position: relative;
	display: inline-block;
}

.mitode-prating .mitode-stars__s.is-half::after {
	content: "";
	position: absolute;
	inset: 0 50% 0 0;
	overflow: hidden;
	background: var(--wp--preset--color--accent, #f80120);
	-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m12 2.6 2.9 5.9 6.5.9-4.7 4.6 1.1 6.4L12 17.4l-5.8 3 1.1-6.4L2.6 9.4l6.5-.9z'/%3E%3C/svg%3E") left top / .95em .95em no-repeat;
	mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m12 2.6 2.9 5.9 6.5.9-4.7 4.6 1.1 6.4L12 17.4l-5.8 3 1.1-6.4L2.6 9.4l6.5-.9z'/%3E%3C/svg%3E") left top / .95em .95em no-repeat;
}

.mitode-prating__value {
	font-weight: 600;
	font-variant-numeric: tabular-nums;
}

.mitode-prating__count {
	color: var(--wp--preset--color--contrast-3, #767676);
	font-variant-numeric: tabular-nums;
}

.mitode-prating--pdp {
	font-size: .9375rem;
}

.mitode-prating__breakdown {
	display: block;
	margin-block-start: .2rem;
	font-size: .8125rem;
	color: var(--wp--preset--color--contrast-3, #767676);
}

/* ---------------------------------------------------------------------
 * W27.10 - the cart product name is a tap target wherever it appears.
 *
 * It lives in main.css and not in store.css because store.css is enqueued
 * ONLY on the cart and the checkout (`mitode_is_store_funnel()`), and the
 * MINI-CART DRAWER is in the header of every page. Measured after the
 * density pass, on /bewertungsrichtlinie/ as well as on /warenkorb/: the
 * link box was 135x20 and 166x20, under the 24 px floor - and putting the
 * rule in the store sheet fixed the cart while leaving the drawer at 20.
 *
 * The type size is unchanged; the height comes from the box, so the row
 * does not grow.
 * ------------------------------------------------------------------ */

.wc-block-components-product-name {
	display: inline-flex;
	align-items: center;
	min-height: 24px;
}

/* ---------------------------------------------------------------------
   W48 - the rating as a link (product page only)

   The stars, the figure, the count and the spelled-out
   "N Kundenrezensionen" are ONE anchor, so the click target is the whole
   thing a shopper aims at rather than four words beside it. It inherits
   the surrounding colour and gets its underline only on the text part:
   underlining a star row draws a line under the picture.
   ------------------------------------------------------------------ */

.mitode-prating-link {
	display: inline-flex;
	align-items: center;
	gap: .45rem;
	flex-wrap: wrap;
	color: inherit;
	text-decoration: none;
	scroll-margin-top: var(--mitode-sticky-h, 5rem);
}

.mitode-prating__link-text {
	font-size: .8125rem;
	color: var(--wp--preset--color--contrast-3, #767676);
	text-decoration: underline;
	text-underline-offset: 2px;
}

.mitode-prating-link:hover .mitode-prating__link-text,
.mitode-prating-link:focus-visible .mitode-prating__link-text {
	color: var(--wp--preset--color--accent, #f80120);
}

.mitode-prating-link:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent, #f80120);
	outline-offset: 3px;
	border-radius: var(--mitode-radius, 8px);
}

/* Under the product title. Slightly larger than the card variant, and it
   is the first rating a shopper meets, so it carries the count in words. */
.mitode-prating-top { margin: 0 0 .35rem; }
.mitode-prating--pdp-top { font-size: .875rem; }
.mitode-prating--pdp-top .mitode-stars__s svg { width: 1.05em; height: 1.05em; }

/* Every in-page anchor lands below the sticky header. One declaration,
   on the elements that are actually fragment targets. */
[id="beschreibung"],
[id="technische-daten"],
[id="haeufige-fragen"],
[id="aehnliche-geraete"],
[id="kaufen"] {
	scroll-margin-top: var(--mitode-sticky-h, 5rem);
}

/* =====================================================================
   W48 - der kompakte Sticky-Header
   =====================================================================
   The tall header stays exactly as it is and scrolls away. This bar is a
   separate, fixed element that slides down once the sentinel after the
   header leaves the viewport. Heights: 56-64px desktop, 50-56px mobile.
   ===================================================================== */

/* One pixel, no box, no margin - it exists only so an
   IntersectionObserver has something to observe. */
.mitode-header-sentinel {
	height: 1px;
	margin-top: -1px;
	pointer-events: none;
}

.mitode-sticky {
	position: fixed;
	inset-block-start: 0;
	inset-inline: 0;
	z-index: 1000;
	background: var(--wp--preset--color--dark, #1a1a1a);
	color: #fff;
	border-bottom: 1px solid rgba(255, 255, 255, .1);
	transform: translateY(-100%);
	transition: transform .22s var(--mitode-ease, ease);
	will-change: transform;
}

.mitode-sticky.is-stuck { transform: translateY(0); }

/* The admin bar is fixed at the top for a logged-in editor, so the bar
   starts below it rather than under it. WordPress switches the admin bar
   to 46px and to `position: absolute` below 783px, where a fixed bar must
   go back to 0. Both are core's own breakpoints. */
.admin-bar .mitode-sticky { inset-block-start: 32px; }
@media screen and (max-width: 782px) {
	.admin-bar .mitode-sticky { inset-block-start: 46px; }
}
@media screen and (max-width: 600px) {
	.admin-bar .mitode-sticky { inset-block-start: 0; }
}

@media (prefers-reduced-motion: reduce) {
	.mitode-sticky { transition: none; }
}

.mitode-sticky__inner {
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding-inline: var(--mitode-gut);
	min-height: 60px;
	display: flex;
	align-items: center;
	gap: 1rem;
}

.mitode-sticky__brand { flex: 0 0 auto; display: inline-flex; align-items: center; }
/*
 * W53 - the sticky wordmark was the brief's loudest complaint ("najmä po
 * prechode do sticky stavu"). Measured before: 24px box on the desktop and
 * 21px on a phone, of which 92.55% was glyph - 22.2px and 19.4px of
 * actual wordmark. It is now the tight crop at 26/24, so 26px and 24px of
 * glyph: +17% and +24%, and still smaller than the tall header's 34/30,
 * which is what a compact bar should be.
 */
.mitode-sticky__brand img {
	display: block;
	height: 26px;
	width: auto;
	max-width: 210px;
	object-fit: contain;
}

/* The centre column is the ONLY flexible one: the brand and the actions
   are their own size, and what is left over is what the script measures
   when it decides how many items fit. `min-width: 0` is what allows it to
   be smaller than its content - without it the row grows and the page
   scrolls sideways instead. */
.mitode-sticky__nav {
	flex: 1 1 auto;
	min-width: 0;
	display: flex;
	align-items: center;
	gap: .5rem;
	overflow: hidden;
}

.mitode-sticky__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	align-items: center;
	gap: 1.15rem;
	flex: 1 1 auto;
	min-width: 0;
	white-space: nowrap;
}

.mitode-sticky__list a,
.mitode-sticky__more-list a {
	color: inherit;
	text-decoration: none;
	font-size: .9375rem;
	line-height: 1.2;
	white-space: nowrap;
}

.mitode-sticky__list a:hover,
.mitode-sticky__list a:focus-visible { text-decoration: underline; }

.mitode-sticky__more { position: relative; flex: 0 0 auto; }

.mitode-sticky__more-btn {
	display: inline-flex;
	align-items: center;
	gap: .25rem;
	background: none;
	border: 0;
	color: inherit;
	font: inherit;
	font-size: .9375rem;
	padding: .35rem .2rem;
	cursor: pointer;
}

.mitode-sticky__more-btn svg {
	width: 1em;
	height: 1em;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
}

.mitode-sticky__more-list {
	position: absolute;
	inset-block-start: calc(100% + .35rem);
	inset-inline-end: 0;
	min-width: 12rem;
	margin: 0;
	padding: .4rem;
	list-style: none;
	background: var(--wp--preset--color--dark, #1a1a1a);
	border: 1px solid rgba(255, 255, 255, .14);
	border-radius: var(--mitode-radius, 8px);
	box-shadow: 0 12px 32px rgba(0, 0, 0, .4);
	z-index: 2;
}

.mitode-sticky__more-list li { margin: 0; }
.mitode-sticky__more-list a { display: block; padding: .5rem .6rem; border-radius: var(--mitode-radius-sm, 4px); }
.mitode-sticky__more-list a:hover,
.mitode-sticky__more-list a:focus-visible { background: rgba(255, 255, 255, .1); text-decoration: none; }

.mitode-sticky__actions {
	flex: 0 0 auto;
	display: flex;
	align-items: center;
	gap: .25rem;
}

.mitode-sticky .mitode-iconbtn {
	color: inherit;
	background: none;
	border: 0;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 2.25rem;
	height: 2.25rem;
	border-radius: var(--mitode-radius-pill, 999px);
}

.mitode-sticky .mitode-iconbtn svg {
	width: 1.25rem;
	height: 1.25rem;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.8;
	stroke-linecap: round;
	stroke-linejoin: round;
}

.mitode-sticky .mitode-iconbtn:hover { background: rgba(255, 255, 255, .12); }
.mitode-sticky :focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

.mitode-sticky__cart { position: relative; }

.mitode-sticky__cart-n {
	position: absolute;
	inset-block-start: .1rem;
	inset-inline-end: .1rem;
	min-width: 1.05rem;
	height: 1.05rem;
	padding-inline: .2rem;
	border-radius: var(--mitode-radius-pill, 999px);
	background: var(--wp--preset--color--accent, #f80120);
	color: #fff;
	font-size: .6875rem;
	line-height: 1.05rem;
	text-align: center;
	font-weight: 600;
}

/* The search panel: a second row inside the bar, so opening it never
   covers the page content the reader is looking at. */
.mitode-sticky__search {
	border-top: 1px solid rgba(255, 255, 255, .1);
	background: var(--wp--preset--color--dark, #1a1a1a);
}

.mitode-sticky__form {
	max-width: var(--mitode-shell);
	margin-inline: auto;
	padding: .6rem var(--mitode-gut);
	display: flex;
	align-items: center;
	gap: .5rem;
	position: relative;
}

.mitode-sticky__form .mitode-search__icon {
	position: absolute;
	inset-inline-start: calc(var(--mitode-gut) + .7rem);
	width: 1.1rem;
	height: 1.1rem;
	fill: none;
	stroke: var(--wp--preset--color--contrast-3, #767676);
	stroke-width: 1.8;
	pointer-events: none;
}

.mitode-sticky__form .mitode-search__input {
	flex: 1 1 auto;
	min-width: 0;
	height: 2.5rem;
	padding-inline: 2.4rem .8rem;
	border-radius: var(--mitode-radius-pill, 999px);
	border: 0;
	background: #fff;
	color: var(--wp--preset--color--contrast, #0f0f0f);
}

.mitode-sticky__form .mitode-search__submit {
	flex: 0 0 auto;
	height: 2.5rem;
	padding-inline: 1.1rem;
	border: 0;
	border-radius: var(--mitode-radius-pill, 999px);
	background: var(--wp--preset--color--accent, #f80120);
	color: #fff;
	cursor: pointer;
}

.mitode-sticky__search-close {
	flex: 0 0 auto;
	background: none;
	border: 0;
	color: inherit;
	cursor: pointer;
	width: 2.25rem;
	height: 2.25rem;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}

.mitode-sticky__search-close svg {
	width: 1.1rem;
	height: 1.1rem;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
}

/* The burger replaces the inline menu below the tall header's own
   breakpoint, so the two headers change shape at the same width.
   Scoped under `.mitode-sticky`, because `.mitode-sticky .mitode-iconbtn`
   above is (0,2,0) and a bare `.mitode-sticky__burger` is (0,1,0) - the
   first draft lost that tie and the burger sat in the desktop bar next to
   the full menu. */
.mitode-sticky .mitode-sticky__burger { display: none; }

@media (max-width: 1079px) {
	.mitode-sticky__inner { min-height: 52px; gap: .5rem; }
	.mitode-sticky__brand img { height: 24px; max-width: 170px; }
	.mitode-sticky__nav { display: none; }
	.mitode-sticky .mitode-sticky__burger { display: inline-flex; }
	.mitode-sticky .mitode-lang { display: none; }
}

@media (max-width: 400px) {
	/* At 360 and 320 the account link is the first thing to go: it is the
	   least used of the four and the only one with a duplicate one tap
	   away inside the burger menu. Nothing is ever clipped. */
	.mitode-sticky__account { display: none; }
	/*
	 * W53 - `max-width: 118px` used to sit here and it was doing nothing:
	 * a 21px-tall wordmark at the old 5.319 ratio is 111.7px wide, so the
	 * cap never bound and the small logo came from the height alone. At
	 * 24px and the tight 5.62 ratio the wordmark is 134.9px, which still
	 * fits - measured budget at 320 is the 288px content box minus a
	 * 36px cart, a 36px burger and two 8px gaps = 200px. The cap is kept,
	 * raised to a figure that is a real guard rather than a silent
	 * shrink.
	 */
	.mitode-sticky__brand img { max-width: 150px; }
	.mitode-sticky__inner { gap: .4rem; }
	.mitode-sticky .mitode-iconbtn,
	.mitode-sticky .mitode-sticky__burger {
		/*
		 * Before this stage the sticky row at 320 measured 16..315.69
		 * inside a 16..304 content box: the burger sat 11.69px past its
		 * own gutter. Nothing clipped it, so no probe called it, but it
		 * is the only element on the page that touches the screen edge.
		 */
		min-width: 38px;
		width: 38px;
		height: 34px;
	}
}

/* =====================================================================
   W50 - PDP CONTENT TABS
   =====================================================================
   The strip is already styled above as a row of tab-shaped links with an
   `aria-current` selected state, and assets/js/pdp.js reuses exactly that
   attribute - so the only thing this block adds is the panel behaviour
   plus the affordances a real tablist needs.

   Everything here is scoped to `.mitode-pdp-nav--tabs`, a class the
   SCRIPT adds. Without JavaScript the nav is a row of anchors, every
   panel is open, and none of these rules apply.
   ===================================================================== */

/*
 * `hidden` is a presentation hint and loses to any rule that sets
 * `display`. Three of the five panels are `.wp-block-group` or a themed
 * section with their own display value, so without this the closed tabs
 * would stay on the page.
 */
.mitode-pdp .mitode-pdp-panel[hidden] { display: none !important; }

/*
 * The heading of an opened panel must clear the sticky header. The same
 * variable the header itself publishes, so the two cannot drift apart.
 */
.mitode-pdp .mitode-pdp-panel { scroll-margin-top: var(--mitode-sticky-h, 5rem); }
.mitode-pdp .mitode-pdp-panel [id] { scroll-margin-top: var(--mitode-sticky-h, 5rem); }

/*
 * A panel is focusable (tabindex="-1") so the keyboard tour continues
 * into the content after the tab strip. It must not therefore paint a
 * focus ring when it is reached by the mouse.
 */
.mitode-pdp .mitode-pdp-panel:focus { outline: none; }
.mitode-pdp .mitode-pdp-panel:focus-visible {
	outline: 2px solid var(--wp--preset--color--contrast, #0f0f0f);
	outline-offset: 4px;
}

/*
 * The first panel sits directly under the strip, so the band padding that
 * separated stacked sections is now doubled-up whitespace at the top.
 */
.mitode-pdp-nav--tabs + .mitode-longdesc > .mitode-band:first-child { padding-block-start: clamp(1.25rem, 3vw, 2rem); }

/* The selected tab must be reachable in the horizontally scrolling strip. */
.mitode-pdp-nav--tabs ul { scroll-behavior: smooth; }
.mitode-pdp-nav--tabs a[role="tab"] { scroll-snap-align: start; }

/* =====================================================================
   W53 - THE SAME SECTIONS AS AN ACCORDION ON A PHONE
   =====================================================================
   Measured before this stage on /produkt/mitochondriak-maxi/ at 390: the
   tab strip was 707px of content inside a 358px box - five tabs the
   reader had to swipe sideways to discover, on a page where the thumb is
   already moving down. Four of the five panels were `hidden`, so after
   the buy box the page went description -> footer, and "Weitere Produkte"
   was one of the hidden ones.

   Everything below is scoped to classes assets/js/pdp.js sets. With
   scripting off the nav is a row of anchors, every section is open, every
   heading is present, and none of this applies - the same contract the
   tabs have had since W50.

   The rows are HEADINGS containing a button, not bare buttons: they
   replace the panel's own <h2> visually (three of them would otherwise be
   said twice), so the document must not lose a heading level in the
   swap.
   ===================================================================== */

.mitode-pdp-acc {
	max-width: var(--mitode-shell);
	margin: 0 auto;
	padding: 0 var(--mitode-gut);
	font-size: 1rem;
	border-block-start: 1px solid var(--wp--preset--color--border, #dcdfe5);
}

.mitode-pdp-acc__btn {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	width: 100%;
	/* the WHOLE row is the control, as the brief asks */
	padding: 1.05rem 0;
	border: 0;
	background: none;
	color: var(--wp--preset--color--contrast, #0f0f0f);
	font-family: inherit;
	font-size: 1rem;
	font-weight: 700;
	line-height: 1.35;
	text-align: start;
	cursor: pointer;
}
.mitode-pdp-acc__btn:focus-visible {
	outline: 2px solid var(--wp--preset--color--contrast, #0f0f0f);
	outline-offset: -2px;
}
.mitode-pdp-acc__label { min-width: 0; }

.mitode-pdp-acc__chev {
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	fill: none;
	stroke: currentColor;
	stroke-width: 2;
	stroke-linecap: round;
	stroke-linejoin: round;
	transition: transform .18s var(--mitode-ease, ease);
}
.mitode-pdp-acc__btn[aria-expanded="true"] .mitode-pdp-acc__chev { transform: rotate(180deg); }

@media (prefers-reduced-motion: reduce) {
	.mitode-pdp-acc__chev { transition: none; }
}

/*
 * The row IS the section heading while the accordion is on, so the
 * panel's own title would be the same words twice. Only the three that
 * actually duplicate are named - the description panel has no heading of
 * its own and the cross-sell is not in the accordion at all - because a
 * blanket `first heading in a panel` rule would eventually hide a real
 * one somebody adds later.
 *
 * `display: none` and not a visually-hidden class: the accordion row
 * carries the identical text in an <h2> two elements earlier, so nothing
 * is lost to assistive technology, to a crawler or to an answer engine.
 */
.mitode-pdp--acc .mitode-specs__title,
.mitode-pdp--acc .mitode-pdp__faq .mitode-faq__title,
.mitode-pdp--acc .mitode-previews__title { display: none; }

/* An opened panel butts straight against its own row, so the band padding
   that separated stacked sections is doubled-up space at the top. */
.mitode-pdp--acc .mitode-pdp-panel > .mitode-band__inner,
.mitode-pdp--acc .mitode-longdesc > .mitode-band:first-child { padding-block-start: clamp(.75rem, 2vw, 1.25rem); }

/*
 * The cross-sell is the section the accordion exists to get the reader
 * to, so it is separated from the collapsed list rather than continuing
 * it - a hairline and real space, not another row.
 *
 * W77-A: on EVERY width, not only under `.mitode-pdp--acc`. The rail is no
 * longer a tab on the desktop (functions.php, mitode_render_pdp_nav), so
 * there it sits under the open panel exactly as it sits under the
 * accordion on a phone - measured at 1440 the boundary was ~150px of
 * plain whitespace with nothing to say "a new section starts here". Same
 * hairline, same space, one rule; and with scripting off the stacked
 * document gets the same separator.
 */
.mitode-pdp #aehnliche-geraete {
	border-block-start: 1px solid var(--wp--preset--color--border, #dcdfe5);
	padding-block-start: clamp(1.25rem, 4vw, 2rem);
	margin-block-start: 0;
}

/*
 * W50 - THE SPLIT BAND COULD NOT SHRINK BELOW ITS OWN CONTENT.
 *
 * A grid item's `min-width` defaults to `auto`, which means "never
 * narrower than my min-content". On the band-parser description path
 * (`.mitode-split`, used by every product whose description is plain
 * prose rather than the imported section vocabulary) that floor was
 * 330 px, so at a 320 px viewport the body sat at left 16 with a right
 * edge of 346 and the whole page scrolled sideways by 27 px.
 *
 * Measured on /produkt/rotes-nachtlicht-mitochondriak-bewegungssensor/
 * at 320, with JavaScript on AND off - so it predates the tabs.
 *
 * `minmax(0, …)` already says exactly this in the two-column rule above;
 * the single-column case below 900 px never got the same treatment.
 */
.mitode-split > * { min-width: 0; }

/* A long German compound must wrap rather than set the floor again. */
.mitode-split__body { overflow-wrap: break-word; }

/* =====================================================================
 * W64 §2 - THE EXPRESS LAYER.
 *
 * CLOSED IS NOT display:none, AND THAT IS THE WHOLE TRICK.
 *
 * Stripe's express element has to be inside this layer BEFORE Stripe mounts
 * it - W61 measured that re-parenting a mounted Stripe iframe leaves it
 * blank. An element inside `display: none` has no layout at all, so Stripe
 * would be mounting into a box of zero size. `visibility: hidden` keeps the
 * box, and `inert` (set in the HTML, removed by assets/js/express.js) is what
 * takes the closed layer out of the tab order and out of the accessibility
 * tree - the two things `display: none` was doing for free.
 * ================================================================== */
.mitode-express {
	position: fixed;
	inset: 0;
	z-index: 9000;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 1rem;
}
.mitode-express:not(.is-open) {
	visibility: hidden;
	opacity: 0;
	pointer-events: none;
}
.mitode-express__scrim {
	position: absolute;
	inset: 0;
	background: rgba(0, 0, 0, .55);
}
.mitode-express__dialog {
	position: relative;
	width: min(28rem, 100%);
	max-height: calc(100dvh - 2rem);
	overflow-y: auto;
	background: var(--wp--preset--color--base, #fff);
	color: var(--wp--preset--color--contrast, #1a1a1a);
	border-radius: 12px;
	box-shadow: 0 24px 60px rgba(0, 0, 0, .3);
	padding: 1.25rem;
	display: flex;
	flex-direction: column;
	gap: 1rem;
}
.mitode-express__head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.mitode-express__title { margin: 0; font-size: 1.25rem; line-height: 1.2; }
.mitode-express__close {
	flex: 0 0 auto;
	width: 40px; height: 40px;
	display: inline-flex; align-items: center; justify-content: center;
	background: none; border: 0; border-radius: 8px; cursor: pointer;
	color: inherit;
}
.mitode-express__close:hover { background: rgba(0, 0, 0, .06); }
.mitode-express__close svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }

.mitode-express__line { display: flex; align-items: center; gap: .75rem; }
.mitode-express__img { width: 56px; height: 56px; object-fit: cover; border-radius: 8px; flex: 0 0 auto; }
.mitode-express__line-text { display: flex; flex-direction: column; gap: .15rem; min-width: 0; flex: 1 1 auto; }
.mitode-express__name { font-weight: 600; line-height: 1.25; }
.mitode-express__meta { font-size: .875rem; opacity: .75; }
.mitode-express__meta:empty { display: none; }
.mitode-express__price { font-weight: 700; white-space: nowrap; }

.mitode-express__who {
	background: rgba(0, 0, 0, .04);
	border-radius: 8px;
	padding: .75rem .875rem;
	font-size: .875rem;
	display: flex; flex-direction: column; gap: .35rem;
}
.mitode-express__who p { margin: 0; }
.mitode-express__who-label { display: block; font-size: .75rem; text-transform: uppercase; letter-spacing: .04em; opacity: .6; }
.mitode-express__note { font-size: .8125rem; opacity: .7; }

/*
 * The wallet slot. It has no height of its own: Stripe reveals its element
 * only on a device that HAS a wallet, and an empty slot with a min-height
 * would be a black bar promising a button that never arrives.
 */
.mitode-express__wallet { border-radius: 8px; overflow: hidden; }
.mitode-express[data-mitode-express-wallet-state="wallet"] .mitode-express__wallet { min-height: 48px; }

/*
 * Exactly one of these two is ever shown. `none` is also the state before
 * Stripe has answered, which is the right way round: a device with no wallet
 * sees the truthful sentence immediately, and a device with one sees it
 * replaced the moment Stripe confirms.
 */
.mitode-express__nowallet { margin: 0; font-size: .875rem; opacity: .75; }
.mitode-express[data-mitode-express-wallet-state="wallet"] .mitode-express__nowallet { display: none; }

.mitode-express__foot { display: flex; }
.mitode-express__checkout {
	flex: 1 1 auto;
	min-height: 48px;
	display: inline-flex; align-items: center; justify-content: center;
	border: 1px solid currentColor; border-radius: 8px;
	background: none; color: inherit;
	font-weight: 600; cursor: pointer;
}
.mitode-express__checkout:hover { background: var(--wp--preset--color--dark, #1a1a1a); color: #fff; border-color: transparent; }

/* The page behind must not scroll while the layer is open. */
html.mitode-express-open, html.mitode-express-open body { overflow: hidden; }

@media (max-width: 599px) {
	.mitode-express { align-items: flex-end; padding: 0; }
	.mitode-express__dialog {
		width: 100%;
		max-height: 88dvh;
		border-radius: 14px 14px 0 0;
	}
}

/* ---------------------------------------------------------------------
 * 20. W72-B - bank transfer: the payment instruction and its GiroCode
 *
 * Rendered by mu-plugins/mitode-order-status/payment-instructions.php on
 * the order-confirmation page AND on My Account -> order detail. It lives
 * in main.css rather than store.css for exactly that reason: store.css
 * loads only on the cart and the checkout (`mitode_is_store_funnel()`), so
 * a customer who came back to My Account to pay would have met an unstyled
 * table. Nothing here is enqueued, so the W48 print-order contract above is
 * untouched.
 *
 * NOT `.mitode-pay`. That class is already the footer's payment-icon row
 * (`display: flex`, line 6327) and reusing it would have laid this section
 * out as a row of logos. One name, one meaning.
 * ------------------------------------------------------------------ */

.mitode-bankpay {
	margin: var(--mitode-band-sm, 2rem) 0;
	padding: clamp(1rem, 3vw, 1.75rem);
	border: 1px solid var(--wp--preset--color--border, #dcdfe5);
	border-radius: var(--mitode-radius-lg, 20px);
	background: var(--wp--preset--color--surface, #f7f8fa);
}

.mitode-bankpay__title { margin: 0 0 .5rem; font-size: var(--mitode-fs-h3, 1.125rem); }
.mitode-bankpay p { margin: 0 0 1rem; }

/*
 * The code and the numbers side by side once there is room for both, and
 * stacked before either has to shrink. `min-content` on the table column is
 * what stops an IBAN from being the thing that decides the layout.
 */
.mitode-bankpay__body {
	display: flex;
	flex-wrap: wrap;
	gap: clamp(1rem, 3vw, 2rem);
	align-items: flex-start;
}

.mitode-bankpay__figure { flex: 0 0 auto; max-width: 220px; }
.mitode-bankpay__qr { width: 180px; max-width: 100%; }
.mitode-bankpay__qr svg { display: block; width: 100%; height: auto; }
.mitode-bankpay__hint {
	margin: .5rem 0 0;
	font-size: .8125rem;
	line-height: 1.4;
	opacity: .8;
}

/*
 * `flex: 0 1 auto`, NOT `1 1 18rem`. Grow made the table fill the whole
 * 1320 px shell, and because the label column is `white-space: nowrap` the
 * growth all landed between the label and its value - "IBAN" on the left
 * edge and the number 400 px away, which reads as two columns of unrelated
 * text rather than as six labelled facts. Measured at 1440 px.
 */
.mitode-bankpay__table {
	flex: 0 1 auto;
	min-width: min(18rem, 100%);
	border-collapse: collapse;
	margin: 0;
	width: auto;
}
.mitode-bankpay__table th,
.mitode-bankpay__table td {
	padding: .35rem .75rem .35rem 0;
	text-align: left;
	vertical-align: top;
	border: 0;
	font-size: .9375rem;
	line-height: 1.5;
}
.mitode-bankpay__table th { font-weight: 500; opacity: .75; white-space: nowrap; }
/*
 * An IBAN is 24 characters with no break opportunity in it. Without
 * `anywhere` it pushes the table wider than its container on a 390px
 * screen and the page scrolls sideways - the defect class W53 and W50 both
 * met. Tabular figures so the digits line up under each other.
 */
.mitode-bankpay__table td {
	font-weight: 600;
	overflow-wrap: anywhere;
	font-variant-numeric: tabular-nums;
}

@media (max-width: 599px) {
	.mitode-bankpay__body { gap: 1.25rem; }
	.mitode-bankpay__figure { max-width: 160px; }
	.mitode-bankpay__qr { width: 160px; }

	/*
	 * BELOW 600 px THE LABEL GOES ABOVE ITS VALUE.
	 *
	 * Side by side, the label column takes ~100 px of a 358 px block and an
	 * IBAN is left with 155 px - so it wrapped as
	 * "SK93833000000020025 / 46153". `overflow-wrap: anywhere` is what
	 * makes that safe rather than an overflowing page, but a bank number
	 * broken across two lines is a number somebody copies wrongly.
	 * Stacking gives the value the full width and it fits on one line.
	 *
	 * Same technique main.css already uses for the order table below
	 * 600 px (see functions.php, "main.css sets display: block on the
	 * table"), so this is the house pattern rather than a new one.
	 */
	.mitode-bankpay__table,
	.mitode-bankpay__table tbody,
	.mitode-bankpay__table tr,
	.mitode-bankpay__table th,
	.mitode-bankpay__table td { display: block; width: auto; }

	.mitode-bankpay__table tr + tr { margin-top: .625rem; }
	.mitode-bankpay__table th { padding: 0; font-size: .8125rem; }
	.mitode-bankpay__table td { padding: 0; }
}
