/* ============================================================================
 * TADA Hero — the live homepage layered slides (Etli / Vişneli / Biscotti).
 * Layered rebuild of the approved composites; coordinates measured off the golden
 * master. Namespace `.tada-hero-v2*` only (the live slider adds `.tada-hero-live`
 * / `.tada-hero-v2--slide` / `.tada-hero-mobile` at the bottom of this file).
 * Host geometry mirrors the production composite hero (viewport-fill, 50px
 * radius, gray card). The 2048/1123 stage is uniform-fit & centred; every layer
 * is positioned as a % of that stage so it tracks the golden composition.
 * ==========================================================================*/
.tada-hero-v2 {
	--hero-top-offset: 30px;
	--copy-left: 75px; /* == header search-icon left at 1440 (grid-aligned, measured) */
	/* Per-GROUP vertical trim vs the approved composite baseline
	   (references/qa/hero-composite-approved-baseline.png). Horizontal geometry is
	   frozen; only these Y offsets move whole groups. Negative = up. Measured deltas
	   at 1440×900: copy +5 / materials ~+3 / cloth +7 low; bowl, beans, video,
	   socials already aligned. */
	--copy-shift-y: -38px;
	--product-shift-y: -34px;
	--material-shift-y: -34px;
	--side-shift-y: -42px;
	--video-shift-y: -32px;
	--social-shift-y: -30px;
	--pagination-shift-y: -54px;
	/* Shared pagination tokens — measured from the Vişneli composite's baked
	   pagination (bars ~37×5px, ~11px gap) so both slides read identically. */
	--hero-pagination-item-width: 37px;
	--hero-pagination-item-height: 5px;
	--hero-pagination-gap: 11px;
	--hero-pagination-radius: 999px;
	--hero-pagination-active: #9e262d;
	--hero-pagination-inactive: #e3cacc;
	position: relative;
	width: min(calc(100% - 60px), 1860px);
	margin: var(--hero-top-offset) auto 0;
	height: calc(100svh - var(--hero-top-offset));
	max-height: calc(100svh - var(--hero-top-offset));
	overflow: hidden;
	isolation: isolate;
	background: #eaeaea;
	border-radius: 50px;
	display: grid;
	place-items: center;
}
@supports (height: 100dvh) {
	.tada-hero-v2 {
		height: calc(100dvh - var(--hero-top-offset));
		max-height: calc(100dvh - var(--hero-top-offset));
	}
}

/* Stage spans the FULL host width (never height-letterboxed horizontally) so the
   left copy — positioned inside the stage — stays on the same grid as the header
   search icon at every viewport height. When the viewport is shorter than the
   stage's aspect height the stage overflows vertically and is clipped by the
   host's overflow:hidden (decorative art only); when taller it centres with
   equal top/bottom bands. This is what keeps copyRect.left === searchRect.left. */
.tada-hero-v2__stage {
	position: relative;
	aspect-ratio: 2048 / 1123;
	width: 100%;
}

.tada-hero-v2__stage img { -webkit-user-drag: none; user-select: none; }

/* Mobile artwork-overlay image (320–699px band only — see the
   `.tada-hero-v2--has-mobile-artwork` block at the bottom of this file).
   display:none at every other breakpoint/state so a slide with the field
   empty never reserves space for it, and slides WITH artwork stay hidden on
   tablet/desktop where the live-layered composition still renders. */
.tada-hero-v2__mobile-artwork {
	display: none;
}

/* ---- Left copy: real HTML, left edge grid-aligned to the header search icon,
   vertical position + type scale measured off the golden composite. ---- */
.tada-hero-v2__copy {
	position: absolute;
	left: var(--copy-left);
	top: 38.9%;
	width: 30%;
	z-index: 20;
	transform: translateY(var(--copy-shift-y, 0px));
}
.tada-hero-v2__eyebrow {
	margin: 0 0 1.2%;
	color: #9e262d;
	font-size: clamp(14px, 1.55cqw, 28px);
	font-weight: 800;
	letter-spacing: .01em;
}
.tada-hero-v2__title {
	margin: 0 0 1.6%;
	font-family: var(--tada-font-display, "Baloo 2", Arial, sans-serif);
	font-weight: 800;
	font-size: clamp(30px, 3.35cqw, 62px);
	line-height: .96;
	letter-spacing: -.01em;
	color: var(--tada-black);
}
.tada-hero-v2__title span { display: block; }
.tada-hero-v2__features {
	margin: 0 0 2.6%;
	padding: 0;
	list-style: none;
	display: grid;
	gap: 4%;
	font-size: clamp(13px, 1.35cqw, 22px);
	font-weight: 700;
	color: var(--tada-black);
}
.tada-hero-v2__features li { display: flex; align-items: center; gap: 10px; }
.tada-hero-v2__features li::before {
	content: "";
	width: 1.1em;
	height: 1.1em;
	flex: 0 0 auto;
	background: url("../images/home/feature-check.svg") no-repeat center / contain;
}
.tada-hero-v2__cta {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 34%;
	padding: .62em 1.6em;
	font-size: clamp(13px, 1.15cqw, 18px);
	font-weight: 700;
	color: var(--tada-white);
	background: #9e262d;
	border-radius: 999px;
	text-decoration: none;
	/* Hover/focus = colour ONLY. No transform, no transition, no geometry change. */
	transform: none;
	transition: none;
}
.tada-hero-v2__cta:hover,
.tada-hero-v2__cta:focus-visible {
	background: #000;
	color: #fff;
	transform: none;
}

/* ---- Dish + cloth: independent right-anchored layers, flush to hero right. ----
   Asset alpha-bboxes (transparent padding baked into each PNG) are compensated
   so the VISIBLE content lands on the golden bbox:
   - cloth-checkered.png       740×1620, content L1.9 T1.6 W98.1 H98.4 → golden
     cloth top 17.81%, right flush, visible ~20% wide.
   - bean-stew-bowl-round.png  1024×1024 FULL round bowl (content 906×888, aspect
     1.02) — matches the golden dish exactly: the golden simply places this round
     bowl cut at the hero right edge (visible left 72% → the round bowl's left
     ~60%). Sized to golden bowl height (visible top 9.97%, height ~85%); the
     wrapper overflows past 100% and is clipped by the host's overflow:hidden. */
.tada-hero-v2__cloth {
	position: absolute;
	top: 16.5%;
	right: 0;
	width: 20.4%;
	z-index: 1;
	transform: translateY(var(--side-shift-y, 0px));
}
.tada-hero-v2__bowl {
	position: absolute;
	top: 22.24%;
	left: 81.36%;
	width: 36.59%;
	z-index: 2;
	transform: translateY(var(--side-shift-y, 0px));
}

/* ---- Product group: 3 separate packages. The FRONT bag is placed from a
   template-match of the front asset against the golden (visible L41% R59%
   T35.1% B83.8%); the two back bags flank it symmetrically (±9.5% offset,
   slightly higher & smaller), reproducing the golden fan L31.5%→R68.5%. Each
   asset's baked padding (visible = 55.5%W / 82%H, offset L22.2%/T9.8% of the
   square canvas) is compensated so the visible bags land on the golden.
   Three nested layers, same split as the materials below: POSITION (this
   rule — the approved fan geometry + group shift, never animated) → IDLE
   (continuous CSS drift, the whole fan moves as one heavy body) → MOTION
   (mouse-parallax, JS-driven). ---- */
.tada-hero-v2__product { position: absolute; inset: 0; z-index: 3; transform: translateY(var(--product-shift-y, 0px)); pointer-events: none; }
.tada-hero-v2__product-idle {
	position: absolute;
	inset: 0;
	animation: tada-hero-idle-float var(--idle-dur, 8s) ease-in-out var(--idle-delay, 0s) infinite;
	/* No explicit will-change here (unlike -motion below): a running CSS
	   keyframe animation on `transform` already gets layer-promoted by the
	   browser on its own. An unconditional will-change would instead reserve a
	   compositor layer for this wrapper on EVERY slide all the time — the two
	   inactive slides included, since animation-play-state:paused (further
	   down this file) stops the animation but doesn't undo a static
	   will-change declaration. */
}
.tada-hero-v2__product-motion {
	position: absolute;
	inset: 0;
	transform: translate3d(var(--px, 0px), var(--py, 0px), 0);
	will-change: transform;
}
.tada-hero-v2__pack { position: absolute; height: auto; }
.tada-hero-v2__pack--back-left  { left: 24.84%; top: 28.14%; width: 30%;    z-index: 1; }
.tada-hero-v2__pack--back-right { left: 45.19%; top: 28.14%; width: 30%;    z-index: 1; }
.tada-hero-v2__pack--front      { left: 33.77%; top: 29.28%; width: 32.55%; z-index: 2; }

/* ---- Small materials: position wrapper (layout) + idle wrapper (continuous
   drift) + motion wrapper (mouse parallax). ---- */
.tada-hero-v2__material {
	position: absolute;
	left: var(--x);
	top: var(--y);
	width: var(--w);
	z-index: var(--z, 4);
	pointer-events: none; /* decorative — never blocks the video/CTA/social hovers */
	/* Static: shared group shift + this piece's own extra shift. Never animated. */
	transform: translateY(calc(var(--material-shift-y, 0px) + var(--extra-shift-y, 0px)));
}
/* Idle wrapper: continuous CSS drift (see tada-hero-idle-float below). Amplitude/
   rotation scale off this piece's own --depth-x/--depth-y (the same numbers that
   drive its mouse-parallax reactivity a layer further in), so a piece that
   reacts more to the cursor also floats more on its own — one depth story for
   both idle and pointer motion. Duration/delay/direction come from the
   per-material `--idle-*` presets set by class name further down this file. */
.tada-hero-v2__material-idle {
	animation: tada-hero-idle-float var(--idle-dur, 6s) ease-in-out var(--idle-delay, 0s) infinite;
	/* No explicit will-change — see the matching note on .tada-hero-v2__product-idle. */
}
/* Motion wrapper: mouse-parallax (--px/--py set by JS) + this piece's static rotation. */
.tada-hero-v2__material-motion {
	transform: translate3d(var(--px, 0px), var(--py, 0px), 0) rotate(var(--rot, 0deg));
	will-change: transform;
}
.tada-hero-v2__material img { display: block; width: 100%; height: auto; }

/* ---- Shared idle-drift keyframe (product + material idle wrappers). Reads
   --depth-x/--depth-y (px multiplier "how far this layer travels") and
   --idle-dir-x/-y/-r (+1/-1, "which way") off the animated element itself, so
   one keyframe serves every layer at every depth/direction/timing. Uneven
   keyframe stops (30/55/80, not a mirrored 0/50/100) trace a small organic
   loop rather than a mechanical back-and-forth; ease-in-out on the animation
   keeps every stop-to-stop transition smooth with no dead pause at the ends. */
@keyframes tada-hero-idle-float {
	0%   { transform: translate3d(0, 0, 0) rotate(0deg); }
	30%  { transform: translate3d(calc(var(--depth-x, 6) * 0.5px * var(--idle-dir-x, 1)), calc(var(--depth-y, 6) * -0.7px * var(--idle-dir-y, 1)), 0) rotate(calc(var(--depth-x, 6) * 0.08deg * var(--idle-dir-r, 1))); }
	55%  { transform: translate3d(calc(var(--depth-x, 6) * 1.3px * var(--idle-dir-x, 1)), calc(var(--depth-y, 6) * 0.3px * var(--idle-dir-y, 1)), 0) rotate(calc(var(--depth-x, 6) * 0.15deg * var(--idle-dir-r, 1))); }
	80%  { transform: translate3d(calc(var(--depth-x, 6) * 0.2px * var(--idle-dir-x, 1)), calc(var(--depth-y, 6) * 1px * var(--idle-dir-y, 1)), 0) rotate(calc(var(--depth-x, 6) * -0.05deg * var(--idle-dir-r, 1))); }
	100% { transform: translate3d(0, 0, 0) rotate(0deg); }
}

/* ---- Per-material idle phase presets: 10 distinct (duration, delay,
   direction) combinations, assigned so that within any ONE slide every
   material gets its own preset — no two pieces in the same slide ever drift
   in sync. Amplitude itself is NOT set here — it comes from each piece's own
   --depth-x/--depth-y (set inline by the template, the same value already
   used for mouse-parallax). ---- */
/* Etli (10 materials — all 10 presets used once each). */
.tada-hero-v2__material--meat-top       { --idle-dur: 5.2s; --idle-delay: 0.0s; --idle-dir-x:  1; --idle-dir-y: -1; --idle-dir-r:  1; }
.tada-hero-v2__material--meat-bottom    { --idle-dur: 6.6s; --idle-delay: 1.3s; --idle-dir-x: -1; --idle-dir-y:  1; --idle-dir-r: -1; }
.tada-hero-v2__material--meat-right     { --idle-dur: 4.6s; --idle-delay: 2.4s; --idle-dir-x:  1; --idle-dir-y:  1; --idle-dir-r: -1; }
.tada-hero-v2__material--beans-top      { --idle-dur: 7.1s; --idle-delay: 0.7s; --idle-dir-x: -1; --idle-dir-y: -1; --idle-dir-r:  1; }
.tada-hero-v2__material--beans-top-2    { --idle-dur: 5.8s; --idle-delay: 1.9s; --idle-dir-x:  1; --idle-dir-y: -1; --idle-dir-r: -1; }
.tada-hero-v2__material--beans-front    { --idle-dur: 6.3s; --idle-delay: 0.3s; --idle-dir-x: -1; --idle-dir-y:  1; --idle-dir-r:  1; }
.tada-hero-v2__material--onion-ring     { --idle-dur: 4.9s; --idle-delay: 2.8s; --idle-dir-x:  1; --idle-dir-y:  1; --idle-dir-r:  1; }
.tada-hero-v2__material--onion-side     { --idle-dur: 7.4s; --idle-delay: 1.1s; --idle-dir-x: -1; --idle-dir-y: -1; --idle-dir-r: -1; }
.tada-hero-v2__material--tomato-mid     { --idle-dur: 5.5s; --idle-delay: 3.1s; --idle-dir-x:  1; --idle-dir-y: -1; --idle-dir-r:  1; }
.tada-hero-v2__material--tomato-side    { --idle-dur: 6.1s; --idle-delay: 2.6s; --idle-dir-x: -1; --idle-dir-y:  1; --idle-dir-r: -1; }
/* Vişneli (9 materials — 9 of the 10 presets, none repeated within this slide). */
.tada-hero-v2__material--sarma-02-tl    { --idle-dur: 4.6s; --idle-delay: 2.4s; --idle-dir-x:  1; --idle-dir-y:  1; --idle-dir-r: -1; }
.tada-hero-v2__material--sarma-06       { --idle-dur: 7.1s; --idle-delay: 0.7s; --idle-dir-x: -1; --idle-dir-y: -1; --idle-dir-r:  1; }
.tada-hero-v2__material--rice-b         { --idle-dur: 5.8s; --idle-delay: 1.9s; --idle-dir-x:  1; --idle-dir-y: -1; --idle-dir-r: -1; }
.tada-hero-v2__material--visne-02       { --idle-dur: 6.3s; --idle-delay: 0.3s; --idle-dir-x: -1; --idle-dir-y:  1; --idle-dir-r:  1; }
.tada-hero-v2__material--sarma-07       { --idle-dur: 4.9s; --idle-delay: 2.8s; --idle-dir-x:  1; --idle-dir-y:  1; --idle-dir-r:  1; }
.tada-hero-v2__material--rice-a         { --idle-dur: 7.4s; --idle-delay: 1.1s; --idle-dir-x: -1; --idle-dir-y: -1; --idle-dir-r: -1; }
.tada-hero-v2__material--sarma-02-br    { --idle-dur: 5.2s; --idle-delay: 0.0s; --idle-dir-x:  1; --idle-dir-y: -1; --idle-dir-r:  1; }
.tada-hero-v2__material--sarma-08       { --idle-dur: 6.6s; --idle-delay: 1.3s; --idle-dir-x: -1; --idle-dir-y:  1; --idle-dir-r: -1; }
.tada-hero-v2__material--visne-01       { --idle-dur: 5.5s; --idle-delay: 3.1s; --idle-dir-x:  1; --idle-dir-y: -1; --idle-dir-r:  1; }
/* Biscotti (6 materials — 6 of the 10 presets, none repeated within this slide). */
.tada-hero-v2__material--findik-02      { --idle-dur: 7.1s; --idle-delay: 0.7s; --idle-dir-x: -1; --idle-dir-y: -1; --idle-dir-r:  1; }
.tada-hero-v2__material--uzum-02        { --idle-dur: 5.8s; --idle-delay: 1.9s; --idle-dir-x:  1; --idle-dir-y: -1; --idle-dir-r: -1; }
.tada-hero-v2__material--biscotti-03    { --idle-dur: 6.3s; --idle-delay: 0.3s; --idle-dir-x: -1; --idle-dir-y:  1; --idle-dir-r:  1; }
.tada-hero-v2__material--uzum-01        { --idle-dur: 4.9s; --idle-delay: 2.8s; --idle-dir-x:  1; --idle-dir-y:  1; --idle-dir-r:  1; }
.tada-hero-v2__material--biscotti-01    { --idle-dur: 7.4s; --idle-delay: 1.1s; --idle-dir-x: -1; --idle-dir-y: -1; --idle-dir-r: -1; }
.tada-hero-v2__material--findik-01      { --idle-dur: 5.2s; --idle-delay: 0.0s; --idle-dir-x:  1; --idle-dir-y: -1; --idle-dir-r:  1; }

/* ---- Video badge: static position wrapper (button) + inner motion wrapper. ---- */
.tada-hero-v2__video {
	position: absolute;
	left: var(--copy-left, 75px); /* left-aligned to the copy/CTA reference line */
	bottom: 8.333333%;
	width: 7.284844%;
	aspect-ratio: 1 / 1;
	z-index: 12;
	/* Static placement only — the hover scale lives on the inner motion wrapper. */
	transform: translateY(var(--video-shift-y, 0px));
	padding: 0;
	border: 0;
	background: none;
	cursor: pointer;
}
.tada-hero-v2__video-motion {
	position: relative;
	display: block;
	width: 100%;
	height: 100%;
	transform: scale(1);
	transition: transform 220ms ease;
}
.tada-hero-v2__video:hover .tada-hero-v2__video-motion,
.tada-hero-v2__video:focus-visible .tada-hero-v2__video-motion {
	transform: scale(1.04);
}
.tada-hero-v2__video-ring { display: block; width: 100%; height: 100%; }
.tada-hero-v2__video-play {
	position: absolute;
	left: 50%;
	top: 50%;
	width: 25.738%;
	height: 30.057%;
	transform: translate(-44%, -50%);
}

/* ---- Socials: group shift on the nav; per-icon <a> owns its own hover. ---- */
.tada-hero-v2__socials { position: absolute; inset: 0; z-index: 13; transform: translateY(var(--social-shift-y, 0px)); pointer-events: none; }
.tada-hero-v2__social {
	position: absolute;
	top: 89.62963%;
	height: 2.037037%;
	color: #000;
	pointer-events: auto; /* only the small icons are interactive, not the full-stage nav */
	transform: translateY(0) scale(1);
	transition: transform 210ms ease, color 210ms ease;
}
.tada-hero-v2__social svg { display: block; width: 100%; height: 100%; fill: currentColor; }
.tada-hero-v2__social:hover,
.tada-hero-v2__social:focus-visible {
	color: #9e262d;
	transform: translateY(-2px) scale(1.05);
}
.tada-hero-v2__social--facebook  { left: 83.854167%; width: 0.644531%; }
.tada-hero-v2__social--instagram { left: 85.844271%; width: 1.145833%; }
.tada-hero-v2__social--youtube   { left: 88.292135%; width: 1.628177%; }
.tada-hero-v2__social--x         { left: 91.222396%; width: 1.121198%; }

/* ---- SHARED visible pagination component (both slides use this exact markup +
   CSS). Centred on the hero and sat on the SAME baseline as the video badge and
   social icons (item bottom ≈ 748 at 1440×900, == video/social bottom). Thin
   tokenised bars; only the active bar's colour differs. No hover geometry. ---- */
.tada-hero-v2__pagination {
	position: absolute;
	left: 50%;
	/* Locked to the SAME basis as the video badge (bottom 8.3333% + the fixed
	   -32px shift) so pagination.bottom === video.bottom at EVERY viewport width,
	   not just 1440 — a pure-% bottom drifted ~5–11px high at ≥1663px. */
	bottom: 8.333333%;
	transform: translate(-50%, var(--video-shift-y, -32px));
	display: flex;
	gap: var(--hero-pagination-gap, 11px);
	align-items: center;
	justify-content: center;
	z-index: 15;
}
.tada-hero-v2__pagination-item {
	display: block;
	width: var(--hero-pagination-item-width, 37px);
	height: var(--hero-pagination-item-height, 5px);
	padding: 0;
	margin: 0;
	border: 0;
	-webkit-appearance: none;
	appearance: none;
	border-radius: var(--hero-pagination-radius, 999px);
	background: var(--hero-pagination-inactive, #e3cacc);
	/* Colour is the only state; never scale/resize on hover. */
	transform: none;
	transition: none;
}
.tada-hero-v2__pagination-item.is-active { background: var(--hero-pagination-active, #9e262d); }
.tada-hero-v2__pagination-item:hover,
.tada-hero-v2__pagination-item:focus-visible { transform: none; }

/* Container-query context so copy type can scale off the stage width. */
.tada-hero-v2__stage { container-type: inline-size; }

/* ============================================================================
 * Vişneli + Biscotti LAYERED slides: separate-DOM-layer
 * build of the same approved Vişneli assets. Reuses every shared .tada-hero-v2__*
 * layer rule (product/pack/bowl/cloth/material + copy/CTA/video/socials/
 * pagination); the ONLY layered-specific behaviour is a shared -20px art shift
 * added to the art POSITION wrappers (never the copy/CTA/UI, never the parallax
 * motion wrapper). Parallax + hovers are inherited unchanged from Etli.
 * ==========================================================================*/
/* Products stay raised to the Etli product level (--visneli-art-shift-y). */
.tada-hero-v2--visneli-layered .tada-hero-v2__product,
.tada-hero-v2--biscotti-layered .tada-hero-v2__product {
	transform: translateY(calc(var(--product-shift-y, 0px) + var(--visneli-art-shift-y, 0px)));
}
/* Biscotti only: the 3-pack group (position layer) scaled up ~1.08x for more
   visual weight, matching the XD reference more closely. transform-origin is
   the group's own optical centre — NOT the default 50%/50%, which here would
   be the full stage's centre since this element is inset:0 — so scaling
   can't drift the group sideways. Centre X (54%) is straightforward (left/
   width % all resolve against stage WIDTH already). Centre Y (48.53%) is
   NOT `top% + (width% * imageAspect)/2` — that mixes a width-relative
   figure into a top/height percentage, which resolves against stage HEIGHT;
   converting requires the stage's own width:height ratio (1860:1019.9 at
   1920 wide, i.e. 2048:1123). Y derived from the front pack's actual pixel
   box (which alone spans the group's full vertical range — see the XD
   derivation in hero-v2-biscotti-layered.php): top 34.91% + half its true
   pixel height expressed as %-of-stage-height ≈ 48.53%. Verified empirically
   (measured getBoundingClientRect before/after) to keep the group's centre
   within ~0.2px of its pre-scale position. Same specificity as the shared
   rule above, later in source order, so it wins for Biscotti only; Vişneli
   is untouched. Idle/motion wrappers are children of this element and are
   not modified themselves — they simply inherit the already-scaled space,
   so the group still moves/drifts as one composition. */
.tada-hero-v2--biscotti-layered .tada-hero-v2__product {
	transform: translateY(calc(var(--product-shift-y, 0px) + var(--visneli-art-shift-y, 0px))) scale(1.08);
	transform-origin: 54% 48.53%;
}
/* ---- Vişneli / Biscotti pack geometry ----
   These six declarations were `style=""` attributes on the <img> tags in
   hero-v2-visneli-layered.php / -biscotti-layered.php. They are reproduced
   here VERBATIM — same values, same order — purely so the cascade can reach
   them: an inline style beats every stylesheet rule except `!important`, so
   while they lived in the markup the tablet block at the bottom of this file
   could not restyle these two slides at all, which is why both rendered their
   desktop fan inside the tablet's right column. Unscoped (no media query), so
   desktop and mobile resolve exactly as before; two-class specificity, so the
   three-class tablet rules can override them cleanly without `!important`. */
/* Same lift-out for each slide's own dish + cloth: these four were `style=""`
   too, reproduced verbatim so desktop is untouched, moved here so the tablet
   block can place them. Note each slide really does ship a DIFFERENT dish
   file (bean-stew-bowl-round / dish-visneli-yaprak-sarma /
   dish-glutensiz-biscotti); only the checked cloth is genuinely shared. */
.tada-hero-v2--visneli-layered .tada-hero-v2__cloth,
.tada-hero-v2--biscotti-layered .tada-hero-v2__cloth { top: 16.5%; width: 20.4%; }
.tada-hero-v2--visneli-layered .tada-hero-v2__bowl,
.tada-hero-v2--biscotti-layered .tada-hero-v2__bowl { left: 83%; right: auto; top: 27%; width: 31.5%; }

.tada-hero-v2--visneli-layered .tada-hero-v2__pack--back-left  { left: 33.22%; top: 33%;    width: 14.96%; transform: rotate(-2deg); }
.tada-hero-v2--visneli-layered .tada-hero-v2__pack--back-right { left: 50.82%; top: 33%;    width: 14.96%; transform: rotate(2deg); }
.tada-hero-v2--visneli-layered .tada-hero-v2__pack--front      { left: 42.25%; top: 34.91%; width: 15.86%; }
.tada-hero-v2--biscotti-layered .tada-hero-v2__pack--back-left  { left: 31.77%; top: 36.36%; width: 24.35%; }
.tada-hero-v2--biscotti-layered .tada-hero-v2__pack--back-right { left: 51.87%; top: 36.36%; width: 24.35%; }
.tada-hero-v2--biscotti-layered .tada-hero-v2__pack--front      { left: 38.5%;  top: 34.91%; width: 31%; }

/* Materials get their OWN (smaller) shift so they sit lower than the products. */
.tada-hero-v2--visneli-layered .tada-hero-v2__material,
.tada-hero-v2--biscotti-layered .tada-hero-v2__material {
	transform: translateY(calc(var(--material-shift-y, 0px) + var(--extra-shift-y, 0px) + var(--visneli-mat-shift-y, 0px)));
	/* XD visualBounds include a drop-shadow + rotation AABB; scale to the true object size. */
	width: calc(var(--w) * var(--visneli-mat-scale, 1));
}
/* Dish + cloth are NOT art-shifted here — they inherit the shared .tada-hero-v2__bowl
   / .tada-hero-v2__cloth base coords + --side-shift-y, i.e. the exact Etli position. */

/* ============================================================================
 * LIVE homepage slider — stacks the 3 layered slides into one crossfade
 * carousel (desktop) and swaps to a composite mobile hero (<= 1100px).
 * The wrapper owns the host sizing; each --slide fills it absolutely and
 * crossfades via .is-active. Base .tada-hero-v2 still supplies the rounded
 * gray card (border-radius/overflow/background) per slide.
 * ==========================================================================*/
.tada-hero-live {
	/* Was `aspect-ratio: 2048/1123` (content-driven height): at 1440×900 that
	   resolves to 756.7px, well short of the 870px first viewport actually has
	   below the 30px top offset — leaving the next section's top ~113px visible
	   on load. Switched to the SAME viewport-fill formula the standalone
	   `.tada-hero-v2` component already defines for itself (line ~36 above:
	   `height: calc(100svh - var(--hero-top-offset))`), so the approved hero
	   card now always reaches the fold, matching its own component's
	   already-designed behaviour instead of only fitting content height.
	   `--hero-offset` is subtracted TWICE (top margin + an equal bottom gap)
	   so the card reads as a card floating inside the viewport on all four
	   sides, not flush to the bottom — the reference design shows an equal
	   white band above and below the rounded card. Nothing inside a slide
	   changes: `.tada-hero-v2__stage` keeps its own
	   `aspect-ratio: 2048/1123; width: 100%`, sized independently of this
	   wrapper's height, and each slide's `display: grid; place-items: center`
	   (base `.tada-hero-v2` rule, unaffected) centres that unscaled stage in
	   the taller card — on short viewports this opens equal gray top/bottom
	   bands inside the existing rounded card rather than cropping or scaling
	   any layer. */
	--hero-offset: 30px;
	position: relative;
	width: min(calc(100% - 60px), 1860px);
	margin: var(--hero-offset) auto 0;
	height: calc(100svh - var(--hero-offset) - var(--hero-offset));
	max-height: calc(100svh - var(--hero-offset) - var(--hero-offset));
}
@supports (height: 100dvh) {
	.tada-hero-live {
		height: calc(100dvh - var(--hero-offset) - var(--hero-offset));
		max-height: calc(100dvh - var(--hero-offset) - var(--hero-offset));
	}
}

/* A slide inside the live slider fills the wrapper and crossfades. */
.tada-hero-live .tada-hero-v2--slide {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	max-height: none;
	margin: 0;
	opacity: 0;
	visibility: hidden;
	transition: opacity 0.6s ease, visibility 0.6s ease;
}
/* First slide visible before JS boots (no blank flash / no CLS). */
.tada-hero-live .tada-hero-v2--slide:first-child {
	opacity: 1;
	visibility: visible;
}
.tada-hero-live .tada-hero-v2--slide.is-active {
	opacity: 1;
	visibility: visible;
	z-index: 2;
}
/* Idle drift only runs on the slide actually on screen. The other two slides
   stay in the DOM (opacity:0/visibility:hidden, not display:none) so their
   crossfade can start instantly, but with no gate here their ~15–20 idle
   animations each would keep ticking in the background for the whole time
   they're hidden — three slides' worth of continuous compositor work at
   once instead of one. `animation-play-state` needs no JS: default is
   `running` (untouched outside the live slider, e.g. a standalone/preview
   render of one slide template), and this rule pauses it the moment a slide
   inside the live slider isn't `.is-active`. */
.tada-hero-live .tada-hero-v2--slide:not(.is-active) .tada-hero-v2__material-idle,
.tada-hero-live .tada-hero-v2--slide:not(.is-active) .tada-hero-v2__product-idle {
	animation-play-state: paused;
}
@media (prefers-reduced-motion: reduce) {
	.tada-hero-live .tada-hero-v2--slide {
		transition: none;
	}
	/* Idle drift fully off; mouse-parallax is already skipped at the JS level
	   (initParallax bails out early when this media query matches), so with
	   --px/--py never set the -motion wrappers' translate3d(var(--px,0px), ...)
	   simply resolves to its 0px fallback. */
	.tada-hero-v2__material-idle,
	.tada-hero-v2__product-idle {
		animation: none;
	}
}

/* The per-slide pagination dots become the shared slider control. */
.tada-hero-live .tada-hero-v2__pagination-item {
	cursor: pointer;
}

/* ---- Mobile composite hero (<= 1100px) ---- */
.tada-hero-mobile {
	display: none;
}
.tada-hero-mobile__viewport {
	position: relative;
	overflow: hidden;
	border-radius: 30px;
}
.tada-hero-mobile__slide {
	position: absolute;
	inset: 0;
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity 0.5s ease, visibility 0.5s ease;
}
/* Pre-init (no-JS) fallback: the first slide is the visible, in-flow one so the
   hero has height before the slider boots. Dropped once JS adds .is-ready. */
.tada-hero-mobile:not(.is-ready) .tada-hero-mobile__slide:first-child {
	position: relative;
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
}
/* After init: ONLY the active slide is in-flow + visible; every other slide
   stays absolute/hidden so nothing stacks and the hero height never changes.
   (visibility:hidden also keeps inactive slides' CTA out of the tab order.) */
.tada-hero-mobile.is-ready .tada-hero-mobile__slide.is-active {
	position: relative;
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
	z-index: 2;
}
.tada-hero-mobile__img {
	display: block;
	width: 100%;
	height: auto;
}
.tada-hero-mobile__copy {
	padding: 20px 24px 8px;
	text-align: center;
}
.tada-hero-mobile__eyebrow {
	margin: 0 0 6px;
	font-family: 'Montserrat', Arial, sans-serif;
	font-size: 12px;
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: #9e262d;
}
.tada-hero-mobile__title {
	margin: 0 0 14px;
	font-family: 'Baloo 2', Arial, sans-serif;
	font-size: clamp(26px, 8vw, 40px);
	line-height: 1.05;
	color: var(--tada-black, #111);
}
.tada-hero-mobile__cta {
	display: inline-block;
}
/* The one real pagination is overlaid on the composite's own baked dots
   (~93.5% down the image, centred) instead of sitting as a second row below the
   card, so only a single, clickable, slider-synced pagination is visible. */
/* The real HTML pagination is sized/placed to sit directly on top of the
   composite's baked bars (measured at ~50% x, ~93.7% y, ~9.6% of the image
   width) so it covers them with no mask/patch behind it — the composite's own
   background stays uninterrupted. Everything is %-based so it tracks the baked
   bars at every mobile width. */
/* Vertically centred on the baked bars (measured centre ~93.7% of the image),
   a touch wider than the baked group (~9.6%) and thick enough to fully cover
   them, so there's no mask AND no doubled/offset pagination — just the single
   real HTML pagination sitting exactly over the baked one. %-based so it tracks
   every mobile width. */
.tada-hero-mobile__dots {
	position: absolute;
	left: 50%;
	top: 93.7%;
	transform: translate(-50%, -50%);
	z-index: 3;
	display: flex;
	justify-content: center;
	gap: 1.2%;
	width: 11%;
	margin: 0;
}
.tada-hero-mobile__dots button {
	flex: 1 1 auto;
	width: auto;
	height: 6px;
	padding: 0;
	border: 0;
	border-radius: 999px;
	background: var(--hero-pagination-inactive, #e3cacc);
	cursor: pointer;
}
.tada-hero-mobile__dots button.is-active {
	background: var(--hero-pagination-active, #9e262d);
}

/* ============================================================================
 * Mobile/tablet (<= 1100px): the composite-image `.tada-hero-mobile` hero is
 * retired (kept in the DOM/JS for now but permanently hidden — see below) in
 * favour of showing the SAME live layered `.tada-hero-live` DOM used on
 * desktop, restyled into a vertically-stacked mobile composition instead of
 * the desktop's side-by-side one. No new elements, no duplicated copy/data —
 * only CSS position/display changes on the existing `.tada-hero-v2__*` nodes.
 *
 * Technique: `.tada-hero-v2__product`'s children (the 3 pack images) are
 * positioned as %s of `.tada-hero-v2__product` itself (its idle/motion
 * wrapper children are `inset: 0`, i.e. exactly its box). On desktop that box
 * IS the full 2048×1123 stage. Here `.tada-hero-v2__product` instead becomes
 * its own `position: relative` box, MUCH narrower, but given the identical
 * 2048/1123 aspect-ratio — so every pack's %-based left/top/width (whether
 * set via CSS custom property on Etli, or hardcoded inline `style=""` on the
 * Vişneli/Biscotti layered templates — both resolve the same way here)
 * renders at an IDENTICAL, undistorted relative position/size, just scaled
 * down as one rigid unit (the same "transform: scale() on the whole layer"
 * principle, applied via a proportional box resize instead of a transform).
 * The pack cluster only occupies the middle ~50% of that reference frame
 * horizontally, so the frame is intentionally wider than the visible cluster
 * and centred — the transparent excess overflows harmlessly and is clipped
 * by the card's own `overflow: hidden`.
 *
 * `.tada-hero-v2__copy` and `.tada-hero-v2__pagination` switch from
 * `position: absolute` (desktop: pinned inside the 2048×1123 stage) to
 * `position: relative` grid items, so they stack in normal flow BELOW the
 * product frame instead of overlapping it. Everything not in the reference
 * mobile composition (cloth, bowl, video badge, socials, and all but a
 * couple of the small decorative "materials" per slide) is hidden — see
 * Section 11 of CLAUDE.md: mobile may simplify decorative density only when
 * the reference itself shows a simplified mobile composition, which this
 * user-supplied mobile mockup does.
 *
 * Values below are measured off the user-supplied mobile reference mockup
 * (no XD mobile artboard exists for this composition yet) — closest-known,
 * flagged for visual QA confirmation per CLAUDE.md Section 2's fallback rule.
 * ============================================================================*/
@media (max-width: 699px) {
	.tada-hero-mobile {
		display: none !important;
	}
	.tada-hero-live {
		height: auto;
		max-height: none;
		margin-top: 12px;
		width: calc(100% - 24px);
	}
	/* display (not opacity/visibility) toggling: on mobile these slides are
	   normal-flow (position: relative, stacked vertically composition), not
	   absolutely stacked on top of each other like desktop — so exactly one
	   must be display:none at a time or they'd all take up real page height
	   at once. JS sets .is-active on slide 0 synchronously on script load
	   (bindLive()'s initial render()), before first paint in practice; the
	   true no-JS case is covered separately by hero-live.php's own <noscript>
	   fallback (which hides .tada-hero-live entirely), so no CSS-only
	   first-child fallback is needed here. */
	.tada-hero-live .tada-hero-v2--slide {
		position: relative;
		inset: auto;
		width: 100%;
		height: auto;
		display: none;
	}
	.tada-hero-live .tada-hero-v2--slide.is-active {
		display: block;
	}

	.tada-hero-v2 {
		width: 100%;
		height: auto;
		max-height: none;
		margin: 0;
		border-radius: 30px;
		display: block;
		padding: 84px 0 30px;
	}
	.tada-hero-v2__stage {
		aspect-ratio: auto;
		width: 100%;
		display: grid;
		grid-template-columns: 1fr;
		justify-items: center;
		row-gap: 28px;
		container-type: inline-size;
	}

	/* Hide everything not part of the mobile composition — cloth/bowl/video
	   badge/socials entirely, and every decorative "material" EXCEPT the few
	   curated per-slide exceptions re-enabled further below (Etli's is
	   immediately below; Vişneli/Biscotti selections land in a later pass). */
	.tada-hero-v2__cloth,
	.tada-hero-v2__bowl,
	.tada-hero-v2__video,
	.tada-hero-v2__socials,
	.tada-hero-v2__material {
		display: none;
	}

	/* ---- No motion of any kind on mobile/tablet, ever — not just visually. ----
	   Idle drift (tada-hero-idle-float) is a pure CSS @keyframes animation, so
	   turning it off here for real (not "hidden but still ticking"): killing
	   `animation` on the idle wrappers stops the keyframe outright rather than
	   masking it, and killing `transform` on the motion wrappers zeroes out
	   any --px/--py mouse-parallax offset a JS pointermove handler might still
	   set. Belt-and-braces with the JS-side fix (initParallax() in hero-v2.js
	   now also bails out per-event when `isDesktopHero` doesn't match, so no
	   pointermove/pointerleave listener touches these custom properties at
	   this breakpoint to begin with) — this rule guarantees the visual result
	   even if that JS gate were ever removed or a slide's markup changes. */
	.tada-hero-v2__product-idle,
	.tada-hero-v2__material-idle {
		animation: none;
	}
	.tada-hero-v2__product-motion,
	.tada-hero-v2__material-motion {
		transform: none;
	}

	/* ---- Product cluster: an INDEPENDENT mobile art direction, not a scaled
	   copy of the desktop fan. ----
	   Earlier revision reused the desktop 2048×1123 reference frame (scaled
	   down as one rigid unit) so every pack kept its desktop-relative
	   position/size exactly. Per explicit direction: mobile is its own art
	   direction — the desktop's relative geometry is NOT a constraint here.
	   `.tada-hero-v2__product` is instead a plain box (own width + aspect-
	   ratio, chosen for the mobile composition, unrelated to 2048/1123), and
	   each pack below gets FRESH mobile-only left/top/width/rotation values
	   (front pack bigger and dominant, back packs pushed further apart and
	   tilted for a wider, livelier fan) instead of inheriting the shared
	   desktop `.tada-hero-v2__pack--*` rules further up this file.
	   min-width: 0 still defeats CSS Grid's default `min-width: auto` (a grid
	   item otherwise won't shrink below its own specified width, blowing out
	   the 1fr track) — kept even though this box no longer intentionally
	   overflows the card, since a stray sub-pixel rounding blowout is still
	   possible without it. */
	/* Geometry measured directly off references/mobile-hero-reference.png
	   (2026-07-28 "gerçek referans" file — the single source of truth for this
	   composition; see the pixel-scan notes in the task report, not the earlier,
	   now-retracted measurement table). Reference card is 609px wide; the
	   3-pack cluster bbox measures 549×369px (90.2% × 60.6% of the card),
	   front pack ~205px wide (37% of the cluster), each back pack ~180px
	   (33%). Percentages below are relative to THIS box, which is itself 90%
	   of the card — i.e. large and dominant, matching the reference, not the
	   73%-shrunk box from the retracted revision. */
	.tada-hero-live .tada-hero-v2__product {
		position: relative;
		grid-row: 1;
		inset: auto;
		min-width: 0;
		width: 103%;
		max-width: 460px;
		aspect-ratio: 149 / 100;
		margin: 0;
		transform: none;
		z-index: auto;
	}
	.tada-hero-live .tada-hero-v2__pack {
		left: auto;
		top: auto;
		right: auto;
		bottom: auto;
	}
	.tada-hero-live .tada-hero-v2__pack--front {
		width: 37%;
		left: 29%;
		top: 11%;
		z-index: 2;
	}
	.tada-hero-live .tada-hero-v2__pack--back-left {
		width: 33%;
		left: 0%;
		top: 12%;
		z-index: 1;
		transform: rotate(-6deg);
	}
	.tada-hero-live .tada-hero-v2__pack--back-right {
		width: 33%;
		left: 67%;
		top: 16%;
		z-index: 1;
		transform: rotate(6deg);
	}

	/* ---- Etli's curated static decorative accents — "a few beans, 2 meat
	   pieces, 1 tomato, 1 onion" per explicit direction, matching the
	   reference's visual WEIGHT rather than copying its exact positions (no
	   XD mobile artboard exists for this composition — closest-known,
	   flagged for visual QA per CLAUDE.md §2's fallback rule). Positioned as
	   %s of the STAGE (their actual containing block — `position: absolute`
	   siblings of `.tada-hero-v2__product` do NOT inherit ITS box, only
	   `grid-row: 1` to keep them layered with it, measured/iterated against
	   the rendered result same as the product above). Fully static: no idle
	   animation, no parallax (both already killed above for every
	   `.tada-hero-v2__material`, curated or not), and no per-layer motion
	   during the slide swipe/crossfade either, since they carry no
	   transition of their own beyond the shared slide-level one. Etli-only
	   class names (Vişneli/Biscotti use entirely different name prefixes —
	   sarma/rice/visne, findik/uzum/biscotti — see hero-v2-visneli-layered.php
	   and hero-v2-biscotti-layered.php), so no per-slide guard is needed.
	   Hidden again at <= 360px (see the phone-tuning block further down) so
	   the smallest phones stay uncluttered. */
	.tada-hero-live .tada-hero-v2__material--beans-top,
	.tada-hero-live .tada-hero-v2__material--beans-top-2,
	.tada-hero-live .tada-hero-v2__material--meat-top,
	.tada-hero-live .tada-hero-v2__material--meat-bottom,
	.tada-hero-live .tada-hero-v2__material--tomato-mid,
	.tada-hero-live .tada-hero-v2__material--onion-ring {
		display: block;
		grid-row: 1;
		position: absolute;
		z-index: 4;
	}
	/* Pixel-measured directly off references/mobile-hero-reference.png (bbox
	   scan per decorative piece, converted from that image's own product-
	   cluster-relative % into this stage's coordinate space — see the task
	   report for the conversion math). Supersedes both the original guess
	   AND the retracted measurement-table pass. */
	.tada-hero-v2__material--beans-top { top: 4%; left: 63%; width: 16%; transform: rotate(-8deg); }
	.tada-hero-v2__material--beans-top-2 { top: 0%; left: 75%; width: 15%; transform: rotate(12deg); }
	.tada-hero-v2__material--meat-top { top: 6%; left: 6%; width: 20%; transform: rotate(8deg); }
	.tada-hero-v2__material--meat-bottom { top: 41%; left: 3%; width: 18%; transform: rotate(-10deg); }
	.tada-hero-v2__material--tomato-mid { top: 42%; left: 82%; width: 13%; transform: rotate(6deg); }
	.tada-hero-v2__material--onion-ring { top: 5%; left: 28%; width: 13%; transform: rotate(-5deg); }

	/* ---- Copy: centred, stacked below the product cluster. ---- */
	.tada-hero-v2__copy {
		position: relative;
		grid-row: 2;
		left: auto;
		top: auto;
		width: 100%;
		max-width: 360px;
		padding: 0 20px;
		box-sizing: border-box;
		text-align: center;
		transform: none;
	}
	.tada-hero-v2__eyebrow {
		font-size: 13px;
		margin-bottom: 2px;
	}
	/* references/mobile-hero-reference.png shows "ETLİ KURU FASULYE" as ONE
	   line at 390px — pixel-measured title width there is 76% of the card
	   (465/609px). `display: inline` (overriding the base rule's two-line
	   `display: block` spans) plus a fluid vw-based size that keeps the
	   longest real title within the copy block's own width is what makes
	   that one-line layout actually happen instead of wrapping. */
	.tada-hero-v2__title {
		font-size: clamp(20px, 7vw, 26px);
	}
	.tada-hero-v2__title span {
		display: inline;
	}
	/* margin-right (not a generated `::after{content:" "}`, which a current
	   Chrome stable release swallows between two now-inline spans) is what
	   guarantees a real gap between the two ACF title fields when rendered
	   as one flowing line — see the equivalent note this replaced. */
	.tada-hero-v2__title span:first-child {
		margin-right: 0.28em;
	}
	.tada-hero-v2__features {
		display: none;
	}
	/* CTA measured off the reference at 42% of card width / 12.5% of card
	   height (258×76 of a 609-wide card) — noticeably wider/taller than a
	   content-hugging pill. */
	.tada-hero-v2__cta {
		display: inline-flex;
		margin-top: 32px;
		min-width: 48%;
		padding: 1em 2em;
		font-size: 14px;
	}

	/* ---- Pagination: centred, stacked below the copy/CTA. Reference's dots
	   are noticeably taller than the desktop token (5px) — bumped locally
	   for this breakpoint only. ---- */
	.tada-hero-v2__pagination {
		position: relative;
		grid-row: 3;
		left: auto;
		bottom: auto;
		transform: none;
		--hero-pagination-item-height: 8px;
	}
}

@media (max-width: 360px) {
	/* Smallest phones: drop the curated accents entirely rather than shrink
	   them further (per task spec — "320px'te gerekirse bazı objeler
	   gizlenebilir") and allow the title its controlled 2-line fallback.
	   Selector is `.tada-hero-live` prefixed (2-class specificity) to
	   out-specificity the display:block re-enable rule above (also 2-class) —
	   a plain single-class selector here would lose to that rule even inside
	   this narrower, later-matching media query, since CSS specificity is
	   compared independent of how narrow/late the containing media query is. */
	.tada-hero-live .tada-hero-v2__material--beans-top,
	.tada-hero-live .tada-hero-v2__material--meat-top,
	.tada-hero-live .tada-hero-v2__material--tomato-mid {
		display: none;
	}
}




/* ============================================================================
 * TABLET — 700–1100px: THE DESKTOP COMPOSITION, SCALED DOWN AS ONE PIECE.
 *
 * There is deliberately NO composition in this block. No pack coordinate, no
 * material coordinate, no dish or cloth placement, no per-slide layout, no
 * per-object scale. Every one of those was removed: earlier revisions rebuilt
 * the scene for tablet (a two-column grid, curated material subsets, a
 * separately-sized dish column) and the result read as a different design
 * rather than as the hero at a smaller size.
 *
 * It needs none of that, because the desktop scene is already resolution
 * independent: `.tada-hero-v2__stage` is a 2048/1123 box and EVERY layer in
 * it — copy, the three packs, all ten materials, the dish, the cloth, the
 * video badge, the pagination — is positioned and sized as a percentage of
 * that box. Narrowing the stage therefore scales the whole scene uniformly
 * and keeps every relative coordinate identical, which is exactly the
 * "one parent, one factor" requirement — achieved by the percentage system
 * that was already there instead of by wrapping it in a transform. So the
 * `@media (max-width: 1100px)` block above, which used to overwrite all of
 * this, is now scoped to `max-width: 699px` and tablet simply inherits the
 * desktop rules.
 *
 * What is left here is only what genuinely cannot be a percentage:
 *
 * 1. CARD SIZE. Desktop fills the viewport (`100dvh - 60px`); on a portrait
 *    tablet that is far taller than the scene. The card is sized to the scene
 *    instead: stage height is width × 1123/2048, plus a top band for the
 *    header that floats over the card and a small bottom band.
 *
 * 2. THE PX GROUP TRIMS. `--copy-shift-y`, `--product-shift-y`,
 *    `--material-shift-y`, `--side-shift-y`, `--video-shift-y`,
 *    `--pagination-shift-y`, `--copy-left` and the two per-material
 *    `--extra-shift-y` values are absolute pixels measured against the 1380px
 *    stage at 1440. Left alone they would NOT scale, so at a 772px stage each
 *    would be ~1.8× too large and the groups would drift out of the desktop
 *    composition. Each is restated here in `cqw` — 1cqw is 1% of the stage,
 *    so `-34px ÷ 1380 × 100 = -2.4638cqw` reproduces the same offset at every
 *    width. Same numbers, expressed proportionally. The per-slide values that
 *    Vişneli and Biscotti set inline on their slide root are restated on their
 *    STAGE, which is where they have to land: every consumer of these
 *    variables lives inside the stage, so a declaration there wins over the
 *    inline one on the ancestor without needing `!important`.
 *
 * 3. MOTION OFF. Idle keyframes and the JS mouse-parallax translate are both
 *    killed; the materials keep only their static per-piece rotation.
 * ==========================================================================*/
@media (min-width: 700px) and (max-width: 1100px) {
	/* Card sits on the same 24px gutter as the header and every section below
	   it. Height = the scene's own height (stage width × 1123/2048) + 116px of
	   header clearance + a 12px bottom band. The stage then fits the padding
	   box exactly, so `place-items: center` has nothing to re-centre.

	   78px is measured, not guessed: the header floats over the card and, at
	   the tablet header height (76px row, see main.css), bottoms out at y=106
	   against a card top of y=12. On desktop the header
	   overlaps the top of the stage — harmless there, because the scene's own
	   empty top band is 11% of a 756px stage. At tablet the same 11% is only
	   ~46px of a 423px stage, so a literal overlap would put the topmost
	   decorative pieces behind the header. 96px offsets the stage just enough
	   that the highest layer clears the header by ~20px, which is the one
	   place the scene cannot be a pure scale-down: the header does not scale
	   with it. */
	.tada-hero-live {
		width: calc(100% - 48px);
		margin-top: 12px;
		height: calc((100vw - 48px) * 0.548340 + 90px);
		max-height: none;
	}
	.tada-hero-live .tada-hero-v2--slide {
		border-radius: 30px;
		padding: 78px 0 12px;
	}

	/* Group trims, restated proportionally. Values are the desktop pixels
	   divided by the 1380px reference stage: px ÷ 13.8 = cqw. */
	.tada-hero-live .tada-hero-v2__stage {
		--copy-left: 5.4348cqw;        /* 75px  */
		--copy-shift-y: -2.7536cqw;    /* -38px */
		--product-shift-y: -2.4638cqw; /* -34px */
		--material-shift-y: -2.4638cqw;/* -34px */
		--side-shift-y: -3.0435cqw;    /* -42px */
		--video-shift-y: -2.3188cqw;   /* -32px */
		--social-shift-y: -2.1739cqw;  /* -30px */
		--pagination-shift-y: -3.9130cqw; /* -54px */
	}
	.tada-hero-live .tada-hero-v2--visneli-layered .tada-hero-v2__stage {
		--copy-shift-y: -1.6667cqw;       /* -23px */
		--product-shift-y: -3.1159cqw;    /* -43px */
		--material-shift-y: 0cqw;         /*   0px */
		--side-shift-y: -3.2609cqw;       /* -45px */
		--visneli-art-shift-y: 1.2319cqw; /*  17px */
		--visneli-mat-shift-y: -2.8986cqw;/* -40px */
	}
	.tada-hero-live .tada-hero-v2--biscotti-layered .tada-hero-v2__stage {
		--copy-shift-y: -2.7536cqw;       /* -38px */
		--product-shift-y: -3.1159cqw;    /* -43px */
		--material-shift-y: 0cqw;         /*   0px */
		--side-shift-y: -3.2609cqw;       /* -45px */
		--visneli-art-shift-y: 6.3768cqw; /*  88px */
		--visneli-mat-shift-y: -1.8116cqw;/* -25px */
	}
	/* The only two materials carrying a per-piece px trim (hero-v2.php's
	   material table, extraShiftY column). `!important` because that column is
	   emitted as an inline custom property on the element itself, and unlike
	   the pack and dish coordinates it is real per-item DATA — lifting it out
	   of the template would hard-code two numbers that belong in the array.
	   Scoped to the tablet query and to these two pieces. Verified: without
	   it, both sat 3.1–3.5% of the stage height too high at 820px, because a
	   -34px trim measured against a 756px stage is -8% against a 423px one. */
	.tada-hero-live .tada-hero-v2__material--onion-side  { --extra-shift-y: -2.4638cqw !important; } /* -34px */
	.tada-hero-live .tada-hero-v2__material--tomato-side { --extra-shift-y: -2.1739cqw !important; } /* -30px */

	/* ---- Copy block: a fixed height so the CTA stops drifting. ----
	 *
	 * The scene layers all scale with the stage, but the copy's type does not:
	 * every font in it bottoms out on its `clamp()` minimum at tablet, so the
	 * block renders ~25% taller relative to the stage than it does at 1440.
	 * Because the block is anchored by its TOP and the CTA is simply the last
	 * thing in it, that surplus pushed the button straight down into the
	 * "Tanıtım Videosu" badge — which sits at its correct desktop-relative
	 * position (74.2% of the stage on both) and was being overlapped by 21–23px
	 * on Vişneli and Biscotti and touched exactly on Etli.
	 *
	 * Two fixes, both inside the copy: the type comes down to roughly its
	 * proportional size (the title lands at ~25.9px, which is the 3.35cqw
	 * desktop rule finally resolving above its own floor), and the feature list
	 * gets a `min-height` so a slide with one bullet reserves the same space as
	 * one with two. The CTA's offset from the copy top is then the same on all
	 * three slides, which is what puts the three buttons on one baseline —
	 * tighter than desktop, where they stagger across 30px.
	 *
	 * The smaller title is also what opens the gap to the product group that
	 * "KURU FASULYE" was closing on Etli. */
	.tada-hero-live .tada-hero-v2__eyebrow {
		font-size: 13px;
		margin-bottom: 0.8%;
	}
	.tada-hero-live .tada-hero-v2__title {
		font-size: clamp(22px, 3.35cqw, 62px);
		margin-bottom: 1.1%;
	}
	/* `margin-bottom` is `!important` only to cancel Vişneli's inline 41px.
	   That value is a DESKTOP correction: it pushes that slide's single-bullet
	   CTA down onto the two-bullet slides' baseline. Here the `min-height`
	   reserve already does that job, so keeping the margin as well would drop
	   Vişneli's button twice — straight back into the video badge. Reset to the
	   same 2.6% every other slide uses, which is a share of the copy width and
	   therefore already scales. */
	.tada-hero-live .tada-hero-v2__features {
		font-size: 10.5px;
		line-height: 1.2;
		gap: 4px;
		min-height: 28px;
		align-content: start;
		margin-bottom: 2.6% !important;
	}
	/* Biscotti's "Çölyak Hastaları İçin Uygundur" is the longest bullet on the
	   site and was wrapping to two lines, which alone made that slide's list
	   16px taller than the others and pushed its button into the badge. The
	   tick and its gap are trimmed to hand the text back ~9px so it sets on one
	   line; 10.5px is also almost exactly the proportional size (the desktop
	   rule is 1.35cqw, which resolves to 10.4px at this stage width). */
	.tada-hero-live .tada-hero-v2__features li { gap: 5px; align-items: start; }
	.tada-hero-live .tada-hero-v2__features li::before { width: .95em; height: .95em; margin-top: .1em; }
	.tada-hero-live .tada-hero-v2__cta {
		font-size: 12px;
		padding: .58em 1.5em;
	}

	/* Pagination bars are the one control, not a scene layer: desktop's
	   37×5px on a 1380px stage would scale to 20.7×2.8px here, which is too
	   thin to see or tap. Brought part of the way down instead — the position
	   is untouched and still matches desktop to 0.5% of the stage. This is the
	   only deliberate departure from a pure scale-down. */
	.tada-hero-live .tada-hero-v2__pagination {
		--hero-pagination-item-width: 26px;
		--hero-pagination-item-height: 4px;
		--hero-pagination-gap: 8px;
	}

	/* Motion off. The idle keyframe is stopped outright rather than hidden,
	   and the parallax wrapper keeps only its static rotation so the JS
	   `--px`/`--py` custom properties can no longer move anything. */
	.tada-hero-live .tada-hero-v2__product-idle,
	.tada-hero-live .tada-hero-v2__material-idle {
		animation: none;
	}
	.tada-hero-live .tada-hero-v2__product-motion {
		transform: none;
	}
	.tada-hero-live .tada-hero-v2__material-motion {
		transform: rotate(var(--rot, 0deg));
	}
}

/* ============================================================================
 * Mobile artwork mode — 320–699px. When a slide's ACF
 * `slide_mobile_artwork_image` field is set, `.tada-hero-v2--has-mobile-
 * artwork` swaps every decorative/product layer (cloth, bowl, product fan,
 * all materials, video badge, socials) for ONE baked artwork image, and the
 * live `.tada-hero-v2__copy` / `.tada-hero-v2__pagination` HTML flows
 * underneath it. 700–1100px (tablet) and >1100px (desktop) are untouched:
 * `.tada-hero-v2__mobile-artwork` stays `display: none` outside this media
 * query (base rule near the top of this file), and every rule here requires
 * `.tada-hero-v2--has-mobile-artwork`, so a slide with the field left empty
 * keeps the live-layered mobile composition from the `@media (max-width:
 * 1100px)` block above, unchanged.
 *
 * UPPER BOUND 430 → 699. Small tablets now get this approved composition
 * rather than a widened phone layout or a squeezed desktop one. It is safe on
 * resolution: all three masters are 700×685 and the card is
 * `calc(100% - 32px)`, so at the top of the band (699px viewport) the card is
 * 667px — still below the artwork's native width, i.e. never upscaled. Above
 * 700px the two-column tablet block takes over precisely because the artwork
 * would start to soften there.
 *
 * NORMAL FLOW, NOT AN OVERLAY. The previous revision absolutely positioned
 * the copy and the dots as percentages of the stage, over an artwork whose
 * blank copy band started at a different height in every master (59.05% /
 * 58.18% / 54.21%). That could not be made to hold: one shared band top was
 * wrong for at least one slide, the dots were pinned independently of the
 * copy, so any title that wrapped to a second line (Vişneli below ~341px)
 * pushed the CTA straight into them — and every fix was a new per-slide
 * magic number (a 67.3% copy top, a 17px title, two CTA margins), with the
 * next slide an editor adds needing its own.
 *
 * So there is no percentage geometry here at all. The artwork is a plain
 * grid item in row 1 of the same ≤1100px stage grid the layered composition
 * already uses; copy (row 2) and pagination (row 3) keep the flow positions
 * that block already gives them. Nothing overlaps, because nothing is taken
 * out of flow: a longer title simply makes the card taller and pushes the
 * CTA and dots down with it. No per-slide rule exists, or is needed.
 *
 * This is paid for in the assets, not the CSS. The three masters were
 * reprocessed (see the `flow/` files under assets/images/hero-mobile-
 * artwork/): white page margin and baked rounded corners removed, background
 * flattened from each master's own gradient — Etli a flat ~233 with a light
 * pool under the packs, Vişneli/Biscotti a ~236→246 radial — to one shared
 * #ededed, and everything below the deepest composition's last shadow pixel
 * cut off. All three are emitted at an identical 700×686, so the card
 * geometry is frozen across slides and the copy does not shift during the
 * live slider's crossfade.
 * ==========================================================================*/
@media (max-width: 699px) {
	/* The base ≤1100px rule's `width: calc(100% - 24px)` (12px/side) is not
	   this project's mobile section gutter: every other home section's
	   content wrapper (`.home-sales-map__panel`, `.home-timeline__panel`,
	   `.home-catalog__panel`, `.home-brands__logos`, `.home-categories__head`)
	   measures 16px/side at 390px. Re-pinned to 16px so the hero card's
	   left/right edges land flush with them. Scoped to this band; the shared
	   ≤1100px rule used by 431–1100px tablet is untouched. */
	.tada-hero-live {
		width: calc(100% - 32px);
	}

	.tada-hero-live .tada-hero-v2--has-mobile-artwork {
		/* Sampled out of the encoded artwork's own flattened background, which
		   the crop's bottom edge hands straight over to this fill — the two
		   have to be the same value or the join reads as a horizontal band.
		   All three assets decode to a dominant rgb(238,238,238) across that
		   region (the flattening targets 237; WebP's RGB→YUV round trip lands
		   it one level up, so the encoded value, not the target, is what this
		   has to match). Re-sample it if the artwork is ever re-exported. */
		--hero-mobile-card: #eeeeee;
		background: var(--hero-mobile-card);
		/* No top padding: the artwork bakes its own blank top band, sized for
		   the live header that floats over the card (`.home .site-header` in
		   main.css). Reserving header space here as well would push the
		   artwork down and read as two stacked cards. */
		padding: 0 0 30px;
	}

	/* Row gaps are set per element below rather than by the grid, because the
	   artwork→copy gap has to account for the shadow-tail padding already
	   baked into the bottom of the image while the copy→dots gap does not. */
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__stage {
		row-gap: 0;
	}

	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__mobile-artwork {
		display: block;
		grid-row: 1;
		/* min-width: 0 defeats CSS Grid's default `min-width: auto`, which for
		   a replaced element is its intrinsic width — the 700px artwork would
		   otherwise set the 1fr track's floor and blow the whole card (and the
		   page) out to 700px at every phone width. Same reason the ≤1100px
		   block sets it on `.tada-hero-v2__product`. */
		min-width: 0;
		width: 100%;
		max-width: 100%;
		height: auto;
	}

	/* The artwork replaces all of these. Three-class selectors so they beat
	   the ≤1100px block's two-class `.tada-hero-live .tada-hero-v2__material--*`
	   re-enables for Etli's curated accents. */
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__cloth,
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__bowl,
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__video,
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__socials,
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__product,
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__material {
		display: none;
	}

	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__copy {
		margin-top: 14px;
	}
	/* The ≤1100px block's 2px is tuned for the layered composition, where the
	   eyebrow sits much closer to the product cluster. Against the artwork the
	   eyebrow and title read as one clumped block at that value. */
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__eyebrow {
		margin-bottom: 8px;
	}
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__cta {
		margin-top: 26px;
	}
	.tada-hero-live .tada-hero-v2--has-mobile-artwork .tada-hero-v2__pagination {
		margin-top: 30px;
	}
}
.tada-hero-v2--generic { background: var(--tada-red); }
.tada-hero-v2__generic-stage { overflow: hidden; background: linear-gradient(135deg, #b1262d 0%, #8f1f25 100%); }
.tada-hero-v2--generic .tada-hero-v2__copy { z-index: 3; }
.tada-hero-v2__generic-image { position: absolute; z-index: 1; right: 0; top: 0; width: 62%; height: 100%; object-fit: cover; object-position: center; -webkit-mask-image: linear-gradient(to right, transparent 0%, #000 24%); mask-image: linear-gradient(to right, transparent 0%, #000 24%); }
@media (max-width: 1100px) {
	.tada-hero-v2__generic-image { width: 100%; opacity: .42; -webkit-mask-image: linear-gradient(to bottom, #000 0%, transparent 78%); mask-image: linear-gradient(to bottom, #000 0%, transparent 78%); }
	.tada-hero-v2--generic .tada-hero-v2__copy { position: absolute; left: 8%; right: 8%; bottom: 10%; top: auto; width: auto; }
}
