/* =======================================================================
   Dedicated Product page template
   All rules scoped under #dedicated-product / .dp-page to prevent cascade
   into other pages of the theme.
   ======================================================================= */

#dedicated-product.dp-page {
	/* ------------ tokens ------------ */
	--dp-bg:          #000;
	--dp-surface:     #121212;
	--dp-surface-2:   #1d1d1f;
	--dp-text:        #ffffff;
	--dp-text-soft:   #c4c7c8;
	--dp-muted:       #86868b;
	--dp-accent:      #D90500;            /* theme red, matches shop-*/
	--dp-accent-2:    #ff3a1f;
	--dp-border:      rgba(255,255,255,0.10);
	--dp-glass:       rgba(255,255,255,0.08);
	--dp-glass-hi:    rgba(255,255,255,0.15);

	/* 'Montserrat' is the weight-linked family (style.css registers 300-900
	 * under this one name); 'Montserrat-Regular' elsewhere in the theme is a
	 * single face and must not be used where a weight above 400 is asked for,
	 * or the browser synthesises the bold instead of loading the real cut.
	 * The CJK faces trail the Latin ones so Japanese copy entered in any DP
	 * field lands on the theme's intended JP stack rather than the browser
	 * default -- Montserrat itself carries no CJK glyphs, and Latin rendering
	 * is unaffected because Montserrat still resolves first. */
	--dp-font: 'Montserrat', 'Helvetica Neue', Arial,
		'Hiragino Kaku Gothic ProN', 'Yu Gothic', Meiryo, 'Noto Sans JP', sans-serif;
	--dp-unit: 8px;
	--dp-gutter: 24px;
	--dp-container-max: 1200px;
	/* Single shared content column. Every section's text and controls sit on
	   this one measure so their edges agree; previously Showcase capped at
	   1320, Location/exA Stage at 1440, the bottom hero at 1280, and
	   Highlights/Choosing Games not at all — which only became visible when the
	   viewport grew past the widest cap (zooming out, or an ultrawide display). */
	--dp-content-max: 1440px;
	--dp-showcase-max: var(--dp-content-max);
	--dp-baseline-max: var(--dp-content-max);
	/* Inset from a full-bleed section's edge to that column. Resolves to 0
	   until the viewport exceeds the column, so nothing shifts at or below
	   1440px. Controls that live inside a deliberately bleeding track offset by
	   this to stay on the column — the same relationship apple.com keeps
	   between its full-width gallery and its paddle buttons. */
	--dp-column-gutter: max(0px, calc((100% - var(--dp-content-max)) / 2));
	/* Shared carousel motion. Measured off apple.com/watch — see
	 * DP_CAROUSEL_EASE in js/dedicated-product.js. Every carousel on the page
	 * uses this curve so a chevron press feels the same in each. */
	--dp-carousel-ease: cubic-bezier(0.45, 0, 0.55, 1);
	--dp-section-gap: clamp(80px, 12vw, 160px);
	--dp-margin: clamp(20px, 5vw, 64px);

	/* ------------ baseline ------------ */
	display: block;
	background: var(--dp-bg);
	color: var(--dp-text);
	font-family: var(--dp-font);
	/* Set once, here, for the whole component. Static across resting, active and
	   animating states so the font rasterizer can never change strategy — and so
	   never change weight or position — as layers come and go beneath it. */
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	/* `hidden` on one axis makes this wrapper a scroll container on the other
	   axis, which destabilizes sticky descendants in mobile WebKit/Blink. */
	overflow-x: hidden;
	overflow-x: clip;
	/* Trap all page content in one stacking context at the root's base level.
	   The masthead sits at z-index 1300 (fixed nav 2000), so nothing inside
	   this page — whatever its internal z-index — can ever paint over the nav. */
	position: relative;
	z-index: 0;
	isolation: isolate;
}

#dedicated-product.dp-page * { box-sizing: border-box; }
#dedicated-product.dp-page img,
#dedicated-product.dp-page video { display: block; max-width: 100%; }

/* Apple-style scroll-triggered reveal.
   Honors prefers-reduced-motion: targets are visible immediately. */
@media (prefers-reduced-motion: no-preference) {
	/* No permanent will-change here: forcing a GPU layer on every reveal
	   target for the page's lifetime cost compositing memory and added scroll
	   latency. The opacity/transform transition runs fine without it. */
	#dedicated-product.dp-page .dp-reveal {
		opacity: 0;
		transform: translate3d(0, 48px, 0);
		transition: opacity .9s cubic-bezier(.2, .65, .2, 1),
		            transform .9s cubic-bezier(.2, .65, .2, 1);
	}
	#dedicated-product.dp-page .dp-reveal.is-in-view {
		opacity: 1;
		/* Settles to `none`, not translate3d(0,0,0): an identity transform still
		   promotes the card to a composited layer, and every image inside it is
		   then GPU-resampled with a fast bilinear filter — the same downscale
		   fault that was fixed on the images themselves. `none` releases the
		   layer once the entrance has played. */
		transform: none;
	}
	#dedicated-product.dp-page .dp-reveal.is-out-above {
		opacity: 0;
		transform: translate3d(0, -32px, 0);
	}
}

/* Override foundation's global h1-h6 color/font/weight so headings inherit
   the dark-theme white and Montserrat we want inside this template. */
#dedicated-product.dp-page h1,
#dedicated-product.dp-page h2,
#dedicated-product.dp-page h3,
#dedicated-product.dp-page h4,
#dedicated-product.dp-page h5,
#dedicated-product.dp-page h6 {
	color: var(--dp-text);
	font-family: var(--dp-font);
	margin: 0;
	line-height: 1.2;
}
/* Foundation sets links red — keep our CTAs/site links untouched but
   neutralize the default link color for our scoped content. */
#dedicated-product.dp-page a { color: inherit; }
#dedicated-product.dp-page a.dp-btn--primary { color: #000; }
#dedicated-product.dp-page .dp-faq__answer a { color: var(--dp-accent); }

#dedicated-product.dp-page .dp-container {
	width: 100%;
	max-width: var(--dp-container-max);
	margin: 0 auto;
	padding: 0 var(--dp-margin);
}
#dedicated-product.dp-page .dp-container--narrow { max-width: 880px; }
#dedicated-product.dp-page .dp-container--showcase { max-width: var(--dp-showcase-max); }

/* ------------------------------------------------------------------ *
 * Shared button styles
 * ------------------------------------------------------------------ */
#dedicated-product.dp-page .dp-btn {
	display: inline-block;
	padding: 14px 32px;
	border-radius: 999px;
	font-weight: 600;
	font-size: 17px;
	line-height: 1;
	text-decoration: none;
	transition: background-color .2s ease, color .2s ease, transform .2s ease;
	white-space: nowrap;
}
#dedicated-product.dp-page .dp-btn--primary {
	background: #fff;
	color: #000;
}
#dedicated-product.dp-page .dp-btn--primary:hover { background: #e5e5e5; }
#dedicated-product.dp-page .dp-btn--ghost {
	background: var(--dp-glass);
	color: #fff;
	border: var(--renewal-cta-border-width-compact, 2px) solid var(--dp-border);
	backdrop-filter: blur(8px);
}
#dedicated-product.dp-page .dp-btn--ghost:hover { background: var(--dp-glass-hi); }

/* ------------------------------------------------------------------ *
 * Standardized CTA matrix — ARC-32 + System templates.
 * Soft-cornered rectangles with a shared bounding box; the primary "Buy" /
 * "Request Pricing" button is brand-red with a clean inversion on hover.
 * Scoped to .dp-page--arc32 so it drives BOTH the System hero CTAs and the
 * shared bottom-hero CTAs on the System AND ARC-32 pages in parity, while the
 * master Dedicated Product template keeps its original pills. These rules sit
 * after the base .dp-btn block so equal-specificity selectors win on source
 * order (matching the pattern used elsewhere in this sheet).
 * ------------------------------------------------------------------ */
#dedicated-product.dp-page--arc32 .dp-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* Shared bounding box: both CTAs lock to one size regardless of label length
	   or translation, so EN/JA strings never desync the pair. */
	min-width: 208px;
	padding: 14px 32px;
	border: var(--renewal-cta-border-width, 2px) solid transparent;
	border-radius: 8px;           /* soft rectangle, replaces the 999px pill */
	text-align: center;
	/* Typography matched 1:1 to the System Support button (.dp-cta__btn) so the
	   hero/footer CTAs read with the exact same face, size and weight. */
	font-family: 'Montserrat-Bold', Helvetica, Arial, sans-serif;
	font-size: 1.05rem;
	font-weight: 500;
	line-height: 1.2;
}
#dedicated-product.dp-page--arc32 a.dp-btn--primary { color: #fff; }
#dedicated-product.dp-page--arc32 .dp-btn--primary {
	background: var(--dp-accent);
	color: #fff;
	border-color: var(--dp-accent);
}
#dedicated-product.dp-page--arc32 .dp-btn--primary:hover,
#dedicated-product.dp-page--arc32 .dp-btn--primary:focus-visible,
#dedicated-product.dp-page--arc32 .dp-btn--primary:active {
	/* Inversion: white fill, red text, sharp red outline. */
	background: #fff;
	color: var(--dp-accent);
	border-color: var(--dp-accent);
}
/* Secondary "Upgrade" / "See what earns": outlined by default (white fill, red
   text, red outline); on hover/active it fills red with white text. */
#dedicated-product.dp-page--arc32 .dp-btn--ghost {
	background: #fff;
	color: var(--dp-accent);
	border: var(--renewal-cta-border-width, 2px) solid var(--dp-accent);
	border-radius: 8px;
}
#dedicated-product.dp-page--arc32 .dp-btn--ghost:hover,
#dedicated-product.dp-page--arc32 .dp-btn--ghost:focus-visible,
#dedicated-product.dp-page--arc32 .dp-btn--ghost:active {
	background: var(--dp-accent);
	color: #fff;
	border-color: var(--dp-accent);
}
/* Exact-parity pair: an equal-column grid sizes BOTH CTAs to the wider one, so
   uneven label/translation lengths can never desync their bounding boxes (the
   208px min-width is the floor; 1fr equalises above it). Desktop only — the pair
   stacks full-width on mobile below. */
@media (min-width: 769px) {
	#dedicated-product.dp-page--arc32 .dp-hero__ctas,
	#dedicated-product.dp-page--arc32 .dp-bottom-hero__ctas {
		display: inline-grid;
		grid-auto-flow: column;
		grid-auto-columns: 1fr;
	}
}
/* Narrow viewports: drop the min-width floor and let the pair stack full-width
   (uniformly) so forced dimensions never overflow a small screen. */
@media (max-width: 768px) {
	#dedicated-product.dp-page--arc32 .dp-btn {
		min-width: 0;
		width: 100%;
		max-width: 320px;
	}
}

/* ------------------------------------------------------------------ *
 * 1. Hero
 * ------------------------------------------------------------------ */
#dedicated-product .dp-hero {
	position: relative;
	/* The masthead sits in normal flow above the hero, so a full 100vh pushes
	   the bottom-anchored CTAs/subtitle a nav-height below the fold. Subtract
	   the live nav height (set by nav.php) so the hero bottom — and the
	   foreground content pinned to it — lands inside the first viewport. */
	min-height: calc(100vh - var(--renewal-main-nav-height, 5.3125rem));
	background: #000;
	display: flex;
	flex-direction: column;
	align-items: center;
	padding-top: clamp(48px, 8vw, 96px);
	overflow: hidden;
}
#dedicated-product .dp-hero__type-bg {
	position: absolute;
	top: clamp(60px, 8vw, 110px);
	left: 0; right: 0;
	z-index: 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	pointer-events: none;
	user-select: none;
	opacity: 1;
	transition: opacity .45s ease;
}
/* Hold the title text hidden until the hero media has finished loading,
   so the layered design doesn't flash giant red text alone. */
#dedicated-product .dp-hero--awaits-media .dp-hero__type-bg { opacity: 0; }
#dedicated-product .dp-hero--media-ready .dp-hero__type-bg  { opacity: 1; }
#dedicated-product .dp-hero__eyebrow {
	margin: 0 0 -2vw;
	font-size: clamp(22px, 3vw, 36px);
	font-weight: 600;
	letter-spacing: -0.02em;
	color: #fff;
}
#dedicated-product .dp-hero__title {
	margin: 0;
	font-size: clamp(96px, 25vw, 360px);
	line-height: 0.8;
	font-weight: 900;
	letter-spacing: -0.03em;
	text-transform: uppercase;
	background: linear-gradient(180deg, var(--dp-accent-2) 0%, var(--dp-accent) 100%);
	-webkit-background-clip: text;
	-webkit-text-fill-color: transparent;
	background-clip: text;
	color: transparent;
	/* Promote to its own layer so the scroll parallax is a GPU composite
	   rather than a per-frame repaint of this large gradient-clipped text. */
	will-change: transform;
}
#dedicated-product .dp-hero__media {
	position: relative;
	z-index: 1;
	width: 100%;
	max-width: 1920px;
	margin-top: clamp(-12vw, -10vw, -4vw);
	display: flex;
	justify-content: center;
}
#dedicated-product .dp-hero__media-el {
	width: 100%;
	height: auto;
	object-fit: contain;
}
/* Editor-driven hero scale: the wrapper sets --dp-hero-scale (50–150%);
   the flex parent keeps the scaled media centered. */
#dedicated-product .dp-hero__media--scaled .dp-hero__media-el {
	width: var(--dp-hero-scale, 100%);
	max-width: 100%;
}
#dedicated-product .dp-hero__foreground {
	position: absolute;
	/* Lift the CTAs/subtitle into the middle of the first viewport on load
	   instead of hugging the bottom. Tune this single value to raise/lower. */
	bottom: clamp(200px, 38vh, 480px);
	left: 0; right: 0;
	z-index: 2;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 24px;
	padding: 0 var(--dp-margin);
	text-align: center;
}
#dedicated-product .dp-hero__ctas {
	display: flex;
	gap: 16px;
	flex-wrap: wrap;
	justify-content: center;
}
#dedicated-product .dp-hero__subtitle {
	margin: 0;
	color: var(--dp-text-soft);
	font-size: clamp(14px, 1.4vw, 20px);
	font-weight: 500;
	letter-spacing: 0.02em;
}
#dedicated-product .dp-hero__fade {
	position: absolute;
	bottom: 0; left: 0; right: 0;
	height: 30vh;
	/* Multi-stop eased ramp to #000 (the hero bg and the colour the next
	   section's top fade starts from) so the seam is seamless and free of the
	   banding a 2-stop linear-alpha gradient produces. */
	background: linear-gradient(
		to top,
		#000 0%,
		rgba(0, 0, 0, 0.92) 14%,
		rgba(0, 0, 0, 0.74) 34%,
		rgba(0, 0, 0, 0.45) 58%,
		rgba(0, 0, 0, 0.18) 80%,
		transparent 100%
	);
	z-index: 1;
	pointer-events: none;
}

/* Optional standard page title, styled to match the /distributors/ hero title. */
#dedicated-product .dp-hero__page-title-wrap {
	position: absolute;
	top: clamp(80px, 12vw, 160px);
	left: 0; right: 0;
	z-index: 3;
	display: flex;
	justify-content: center;
	padding: 0 var(--dp-margin);
	pointer-events: none;
}
#dedicated-product .dp-hero__page-title {
	margin: 0;
	font-family: var(--dp-font);
	font-weight: 700;
	font-size: clamp(2rem, 5vw, 3rem);
	line-height: 1.1;
	color: #fff;
	text-align: center;
	text-shadow: 0 10px 28px rgba(0, 0, 0, 0.4);
}

/* ------------------------------------------------------------------ *
 * 2. Features
 * ------------------------------------------------------------------ */
#dedicated-product .dp-features {
	position: relative;
	background: var(--dp-surface);
	padding: var(--dp-section-gap) 0;
}
#dedicated-product .dp-features__fade {
	position: absolute;
	top: 0; left: 0; right: 0;
	height: 120px;
	background: linear-gradient(to bottom, #000, var(--dp-surface));
	pointer-events: none;
}
#dedicated-product .dp-features__header {
	position: relative;
	max-width: 760px;
	margin: 0 auto clamp(48px, 8vw, 96px);
	text-align: center;
	display: flex;
	flex-direction: column;
	gap: 16px;
}
#dedicated-product .dp-features__title {
	margin: 0;
	font-size: clamp(28px, 4vw, 48px);
	font-weight: 700;
	letter-spacing: -0.01em;
	line-height: 1.2;
}
#dedicated-product .dp-features__intro {
	margin: 0;
	font-size: clamp(16px, 1.6vw, 20px);
	line-height: 1.5;
	color: var(--dp-text-soft);
}
#dedicated-product .dp-features__grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
	gap: var(--dp-gutter);
	position: relative;
	/* Dedicated breathing room so the Section Heading isn't flush with the cards. */
	margin-top: clamp(24px, 4vw, 56px);
}
/* Premium "pop-out" card: the asset breaks out above the card's top edge.
   (a) wrapper is overflow-visible & background-free, (b) the glass bg + radius
   live on the inner body, (c) the image is layered on top and tucked over the
   body via a negative margin, (d) the body reserves top padding for the title. */
#dedicated-product .dp-feature {
	position: relative;
	display: flex;
	flex-direction: column;
	background: none;
	border: 0;
	overflow: visible;
	transition: transform .4s ease;
}
#dedicated-product .dp-feature:hover { transform: translateY(-4px); }
#dedicated-product .dp-feature__media {
	position: relative;
	z-index: 2;
	display: flex;
	align-items: flex-end;
	justify-content: center;
	padding: 0;
	/* Fixed media-box height so every card's asset occupies the same vertical
	   span regardless of the image's intrinsic aspect ratio. Bottom-aligned
	   assets then hand off to a body that tucks up to one shared baseline —
	   without this, taller assets (e.g. Monitor) push their card lower than
	   the others and the row reads as staggered. */
	height: calc(clamp(240px, 26vw, 360px) * var(--dp-feature-scale, 1));
}
#dedicated-product .dp-feature__media > * {
	width: auto;
	max-width: 92%;
	/* Cap to the fixed media-box height; --dp-feature-scale (editor-driven,
	   default 1) multiplies the box and therefore the asset cap in lockstep. */
	max-height: 100%;
	object-fit: contain;
	border-radius: 18px;
	transition: transform .6s ease;
}
#dedicated-product .dp-feature:hover .dp-feature__media > * { transform: scale(1.04); }
#dedicated-product .dp-feature__body {
	position: relative;
	z-index: 1;
	/* Tuck the card up over the asset's bottom half: lower half sits inside the
	   card, upper half spills above its top edge. Pairs with the media cap so
	   the overlap is ~50% of the asset height at every breakpoint. */
	margin-top: clamp(-180px, -13vw, -120px);
	padding: clamp(140px, 15vw, 210px) 32px 32px;
	display: flex;
	flex-direction: column;
	gap: 12px;
	background: linear-gradient(180deg, rgba(255,255,255,0.08) 0%, rgba(255,255,255,0.03) 100%);
	backdrop-filter: blur(40px);
	border: 1px solid var(--dp-border);
	border-radius: 28px;
}
/* Imageless cards (body is the only child): drop the overlap + extra top pad. */
#dedicated-product .dp-feature__body:only-child {
	margin-top: 0;
	padding-top: 32px;
}
#dedicated-product .dp-feature__title {
	margin: 0;
	font-size: clamp(17px, 1.5vw, 21px);
	font-weight: 600;
	line-height: 1.3;
}
#dedicated-product .dp-feature__text {
	margin: 0;
	font-size: 14px;
	line-height: 1.55;
	color: var(--dp-text-soft);
}

/* ------------------------------------------------------------------ *
 * 3. Showcase
 * ------------------------------------------------------------------ */
/* Flat showcase canvas (#121212). The former grey→black seam gradient was
   purged: the section now sits flush with the equally-flat surfaces above
   and below it. */
#dedicated-product .dp-showcase {
	position: relative;
	background: var(--dp-surface);
	/* Viewport-mask compression: tight outer rhythm plus a fold guard so the
	   whole "Features Zoom" block stays inside the desktop viewport without a
	   nested scroll. The inner heights below are tuned to land under this cap,
	   so overflow:hidden is a safety rail, not an active clip. */
	padding: 2rem 0;
	max-height: 90vh;
	height: auto;
	overflow: hidden;
}
#dedicated-product .dp-showcase__panel {
	position: relative;
	background: #000;
	border: 1px solid rgba(255,255,255,0.05);
	border-radius: 40px;
	/* Compressed inner panel: vertical padding pulled down so the panel + media
	   fit the fold; horizontal breathing space preserved. */
	padding: clamp(36px, 4.5vw, 64px) clamp(32px, 5vw, 88px);
	overflow: hidden;
}
#dedicated-product .dp-showcase__title {
	margin: clamp(12px, 2vw, 24px) 0 clamp(20px, 3vw, 36px);
	font-size: clamp(28px, 4vw, 48px);
	font-weight: 700;
	letter-spacing: -0.01em;
}
#dedicated-product .dp-showcase__layout {
	display: flex;
	flex-direction: column;
	gap: 24px;
	align-items: stretch;
}
@media (min-width: 1024px) {
	/* Overlay model: the media pane fills the panel and the card list floats
	   on top of it. The list never constricts the media, and the media never
	   constricts the card text width — both lie naturally in their own layer. */
	#dedicated-product .dp-showcase__layout {
		display: block;
		position: relative;
		/* Reduced overlay height so the media + floating list clear the fold;
		   the ARC-32 blueprint is object-fit:cover so it stays fully framed. */
		min-height: 480px;
	}
}
#dedicated-product .dp-showcase__nav {
	display: none;
}
@media (min-width: 1024px) {
	/* Original placement: a vertical up/down control column, left-aligned and
	   vertically centred against the card list. Hidden until a card is opened. */
	#dedicated-product .dp-showcase__nav {
		display: flex;
		flex-direction: column;
		gap: 24px;
		position: absolute;
		left: 0;
		top: 50%;
		transform: translateY(-50%);
		z-index: 4;
		opacity: 0;
		visibility: hidden;
		pointer-events: none;
		transition: opacity .3s ease, visibility .3s ease;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__nav {
		opacity: 1;
		visibility: visible;
		pointer-events: auto;
	}
}
#dedicated-product .dp-showcase__nav-btn {
	width: 40px; height: 40px;
	border-radius: 50%;
	border: 0;
	background: #29292c;
	color: #fff;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	cursor: pointer;
	transition: background-color .2s ease, color .2s ease, opacity .2s ease;
}
#dedicated-product .dp-showcase__nav-btn:not(:disabled):hover { background: #34343a; }
#dedicated-product .dp-showcase__nav-btn:disabled,
#dedicated-product .dp-showcase__nav-btn[aria-disabled="true"] {
	background: #171719;
	color: #55555b;
	cursor: default;
	pointer-events: none;
}
/* Heavy Apple-style chevrons replacing the old ▲/▼ system glyphs. The SVG
   carries its own stroke-width; sizing it large keeps the mark bold and clean. */
#dedicated-product .dp-showcase__chevron {
	width: 20px;
	height: 20px;
	display: block;
	pointer-events: none;
}

#dedicated-product .dp-showcase__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	/* Inter-pill rhythm, matched to the reference guide's .pills-container.
	   The former 8px was condensing the stack to fit the fold; the cards read
	   as one welded block at that value. */
	gap: 12px;
	/* Sit above the intro backdrop (z-index 1) at every breakpoint. */
	position: relative;
	z-index: 3;
	contain: layout style;

	/* Widest a card title may run before it wraps — the single value that keeps
	   the collapsed pill and the open card agreeing on line count. Raise it to
	   let longer titles stay on one row; the card cap follows automatically. */
	--dp-showcase-title-measure: 330px;
	/* Space a card spends beside its title: the resting pill's icon (25px) + row
	   gap (10px) + side padding (10px/30px) + borders (2px) = 77px, which is more
	   than the open card's 28px/28px + borders = 58px. The larger of the two is
	   used so neither state's box clips the measure above. */
	--dp-showcase-card-chrome: 77px;
}
@media (min-width: 1024px) {
	/* Pills hug their own content (Apple-style): short labels stay small, long
	   ones grow, and the active card widens to fit its description. */
	#dedicated-product .dp-showcase__list {
		position: relative;
		z-index: 3;
		width: auto;
		/* Tighter, editorial footprint: the card stack no longer stretches toward
		   the media pane, and it hugs the up/down chevron column with only a slim
		   gutter (~14px) so the two read as one control cluster. */
		max-width: 52%;
		align-items: flex-start;
		margin-left: 20px;
	}
	#dedicated-product .dp-showcase__item {
		width: fit-content;
		/* Shortened so labels/descriptions no longer expand far to the right.
		   Derived from the shared title measure plus the widest chrome either
		   card state puts beside the text, so the cap can never be the thing
		   that forces a wrap before --dp-showcase-title-measure does. */
		max-width: min(calc(var(--dp-showcase-title-measure) + var(--dp-showcase-card-chrome)), 100%);
	}

	/* One wrap point for a card title, in BOTH states.
	 *
	 * The resting pill and the open card restate the same string, but they had
	 * different amounts of room for it: the pill spends 35px on the "+" icon and
	 * its gap and uses 10px/20px side padding, while the open card drops the icon
	 * and uses 28px/28px. At the shared 380px cap that left the pill 312px of
	 * measure against the open card's 324px — so any title between those two
	 * numbers sat on two rows collapsed and snapped to one row when clicked
	 * ("Sanwa or Seimitsu Parts Compatible" is 324px, right in the gap).
	 *
	 * Capping the TEXT rather than the box removes the straddle by construction:
	 * both states now wrap at exactly --dp-showcase-title-measure regardless of
	 * the chrome around them, so a title that fits on one line open also fits on
	 * one line closed, and a genuinely long title wraps identically in both. */
	#dedicated-product .dp-showcase__label,
	#dedicated-product .dp-showcase__desc-title {
		max-width: var(--dp-showcase-title-measure);
	}
}
/* Cards rest on a single uniform grey (#29292c) in every state — collapsed,
   hover, focus, and active — matching the chevron / +/× controls so nothing
   brightens or shifts tint when a card opens (Apple-style parity). */
#dedicated-product .dp-showcase__item {
	background: #29292c;
	border: 1px solid transparent;
	border-radius: 24px;
	/* Trailing space after the label is deliberately generous — the pill used to
	   close up tight against the last glyph. Roughly two spaces' worth, matching
	   the breathing room Apple leaves on its feature pills. */
	padding: 7px 24px 7px 9px;
	cursor: pointer;
	color: #fff;
	position: relative;
	overflow: hidden;
	transition: background-color .2s ease, border-color .2s ease;
}
#dedicated-product .dp-showcase__item:hover,
#dedicated-product .dp-showcase__item:focus-visible { background: #29292c; }
#dedicated-product .dp-showcase__item.is-active {
	background: #29292c;
	border-color: rgba(255,255,255,0.14);
	border-radius: 24px;
	padding: 14px 20px;
}
#dedicated-product .dp-showcase__item.is-active:hover { background: #29292c; }
#dedicated-product .dp-showcase__item.is-size-animating {
	transform-origin: top left;
	will-change: transform;
}
/* The opening card is revealed by an animated clip rather than scaled, so its
   contents must NOT be promoted or transformed — that promotion is half of why
   the type used to change weight mid-animation. */
/* The opening card is revealed by an animated clip, never scaled — scaling the
   container scales the type inside it and no counter-transform can undo the
   resampling that causes. The card takes its final box in layout on frame one,
   so the copy is measured and laid out exactly once: there is no reflow to hit
   mid-animation, and nothing to re-settle at the end. */
#dedicated-product .dp-showcase__item.is-revealing {
	/* Declared for the duration of the reveal only. A permanent will-change
	   would hold a layer for the life of the page, which this file already
	   avoids elsewhere for the same reason. */
	will-change: clip-path;
}
/* Nothing state-specific on the body any more. Its compositing hint, backface
   and font-smoothing are permanent (see .dp-showcase__body), which is the whole
   point — a hint applied for the duration of the animation is a hint that gets
   taken away at the end of it, and that removal was the last artifact left. */
#dedicated-product .dp-showcase__row-head {
	display: flex;
	align-items: center;
	gap: 10px;
}
/* Active card: hide the "+" and label so the description + variant switches
   fill the whole card. */
#dedicated-product .dp-showcase__item.is-active .dp-showcase__row-head {
	display: none;
}
/* Compact circular wrapper (Apple-style): the ring hugs the "+" with minimal
   dead space. The glyph keeps its baseline 19px size — only the circle shrank. */
#dedicated-product .dp-showcase__icon {
	width: 25px; height: 25px;
	border: 1.5px solid #fff;
	border-radius: 50%;
	background: #29292c;
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	/* Slightly larger "+" per Apple's premium ring glyphs, at a lighter weight. */
	font-size: 21px;
	font-weight: 600;
	line-height: 1;
	color: #fff;
}
/* Label (collapsed) and description (expanded) share one identical type ramp.
   overflow-wrap guards long single tokens / labels sitting at the card's max
   width so a word can never be clipped — it wraps to the next line instead. */
#dedicated-product .dp-showcase__label,
#dedicated-product .dp-showcase__desc {
	font-size: 15px;
	font-weight: 500;
	line-height: 1.45;
	color: #fff;
	overflow-wrap: anywhere;
	word-break: break-word;
}
/* Block content inside the Showcase description.
 *
 * The description is authored in a real editor whose root block is <p>, which is
 * what makes paragraph alignment work at all — TinyMCE sets `text-align` on a
 * block, so without one the align buttons have nothing to act on. The cost is
 * that the saved value now arrives wrapped, and an unqualified <p> re-inherits
 * the base theme's paragraph sizing and margins, silently shrinking the copy it
 * is supposed to be carrying. (The same trap has bitten the hero headline and
 * the Link Up lead.)
 *
 * `font: inherit` rather than a restated size, so this can never drift from the
 * card typography above it. Edge margins are flattened so a block never adds
 * outer spacing the plain-text field did not have, and the gap between blocks is
 * restored deliberately. `text-align` is NOT reset — it is the whole point, and
 * wp_kses_post() already passes it through safecss_filter_attr.
 *
 * Mirrors the treatment .dp-syshl__title already carries in
 * dedicated-product-system.css, which is where the Highlights title's own
 * (higher-specificity) block rules live — deliberately not restated here. */
#dedicated-product .dp-showcase__desc > :first-child { margin-top: 0; }
#dedicated-product .dp-showcase__desc > :last-child { margin-bottom: 0; }

#dedicated-product .dp-showcase__desc p {
	margin: 0 0 .6em;
	font: inherit;
	color: inherit;
	letter-spacing: inherit;
}
#dedicated-product .dp-showcase__desc h1,
#dedicated-product .dp-showcase__desc h2,
#dedicated-product .dp-showcase__desc h3,
#dedicated-product .dp-showcase__desc h4,
#dedicated-product .dp-showcase__desc h5,
#dedicated-product .dp-showcase__desc h6 {
	margin: 0 0 .3em;
	color: inherit;
	font-family: inherit;
	font-weight: 700;
	line-height: 1.2;
	letter-spacing: -0.01em;
}
#dedicated-product .dp-showcase__desc h1 { font-size: 1.5em; }
#dedicated-product .dp-showcase__desc h2 { font-size: 1.32em; }
#dedicated-product .dp-showcase__desc h3 { font-size: 1.16em; }
#dedicated-product .dp-showcase__desc h4 { font-size: 1em; }
#dedicated-product .dp-showcase__desc h5 { font-size: 0.88em; }
#dedicated-product .dp-showcase__desc h6 { font-size: 0.8em; }

/* Lists are reachable from the toolbar; keep their markers inside the card. */
#dedicated-product .dp-showcase__desc ul,
#dedicated-product .dp-showcase__desc ol {
	margin: 0 0 .5em;
	padding-left: 1.2em;
}
#dedicated-product .dp-showcase__desc li {
	font: inherit;
	color: inherit;
}

/* Resting cards read semibold by default (the description body stays regular;
   its own bold lead-in is supplied by .dp-showcase__desc-title). */
#dedicated-product .dp-showcase__label {
	/* Apple-style high-contrast title: solid bold + tightened tracking so
	   the title reads distinctly punchier than its regular-weight description. */
	font-weight: 700;
	letter-spacing: -0.02em;
}
@media (min-width: 1024px) {
	/* Desktop card sizing overrides. Placed AFTER the base .dp-showcase__item /
	   __label rules above so they win on source order (equal specificity) — the
	   early @media block up top only carries width/max-width, which don't clash. */
	#dedicated-product .dp-showcase__item {
		padding: 10px 30px 10px 10px;
	}
	#dedicated-product .dp-showcase__item.is-active {
		/* Taller bounding box when opened. */
		padding: 24px 28px;
	}
	#dedicated-product .dp-showcase__label,
	#dedicated-product .dp-showcase__desc {
		font-size: 17px;
		line-height: 1.6;
		letter-spacing: -0.01em;
	}
}
/* Active-card title: the restated label owns a dedicated row immediately
   above the description.
   It is marked up as <strong>, which the site-wide `strong { font-family:
   "Montserrat-Bold" }` rule in style.css would otherwise swap to a separate
   heavy Montserrat-Bold typeface — making the active title look like a totally
   different, extra-bold font from the resting pill label. `font-family: inherit`
   pulls it back onto the exact same Montserrat body face the resting label uses,
   and weight 600 / normal style match it, so the transplanted title is
   typographically identical to the default card title (full parity). */
#dedicated-product .dp-showcase__desc-title {
	display: block;
	margin-bottom: .22em;
	font-family: inherit;
	/* Bold + tightened tracking, matching the resting label so the active
	   card's restated title stays punchy against its regular-weight description. */
	font-weight: 700;
	letter-spacing: -0.02em;
	font-style: normal;
	color: #fff;
}
/* The controller measures the resting and expanded card rectangles and FLIPs
   the outer box between those exact dimensions. The body only owns visibility;
   avoiding max-height and auto-width interpolation removes the late expansion
   correction that previously made the card balloon near the end. */
/* Card copy animates OPACITY AND NOTHING ELSE.
 *
 * Two transforms used to live here: a 4px lift on activate and, at rest,
 * `transform: translate3d(0, 0, 0)`. The lift was a second piece of movement
 * layered on top of the container's own animation. The identity transform was
 * worse — it is not a no-op, it promotes the body to its own compositing layer
 * permanently, so when the reveal finished and the element flipped from
 * `transform: none` back to this rule the layer was recreated and the glyphs
 * re-rasterized. That is the shift at the very end of the expansion: not a
 * reflow, a re-raster. (The same trap is documented on .dp-reveal above.)
 *
 * With no transform in any state the body is never promoted on geometry, the
 * type is rasterized once at its resting position, and the only thing that
 * changes is alpha. */
#dedicated-product .dp-showcase__body {
	max-height: 0;
	width: 0;
	opacity: 0;
	overflow: hidden;
	padding-bottom: 0;
	/* NO compositing hint of its own — deliberately.
	 *
	 * A permanent translateZ(0) here gave the copy its own hardware layer nested
	 * inside a card that animates clip-path. When the card's clipping layer is
	 * torn down at the end of the expansion, a separately-composited child has to
	 * re-align its sub-pixel coordinates against the screen, and that realignment
	 * was the last snap. The text is now plain content inside the card and is
	 * rasterized in the card's own layer, so there is nothing to re-align.
	 * Acceleration belongs to the container alone (see .is-revealing).
	 *
	 * Font smoothing is set once on the page root rather than here, so the
	 * rasterizer's strategy is identical in every state and cannot change with
	 * the element's layer status. */
	transform: none;
	transition: opacity .2s ease;
}
#dedicated-product .dp-showcase__item.is-active .dp-showcase__body {
	max-height: none;
	width: auto;
	min-width: 200px;
	opacity: 1;
	/* Matches the resting rule exactly. Any difference here would reintroduce a
	   layer change at the moment .is-active is applied or removed. */
	transform: none;
	padding-bottom: 2px;
	transition: opacity .22s ease .04s;
}

/* Apple "Take a closer look" cross-fade.
 *
 * The outgoing card used to lose .is-active in the same frame as the incoming
 * card gained it, so its description was yanked to opacity:0 / max-height:0 with
 * no transition — the old copy vanished while the new copy faded in. .is-fading-out
 * is held on the outgoing card for one beat so its text can dissolve first; the
 * controller only then swaps the active state. max-height/width stay at their
 * open values for that beat, so the box does not collapse under the fading text
 * and the FLIP still measures a stable rectangle. */
/* Holds ONLY opacity. It used to pin max-height/width open so the copy could
   fade before the state swapped, but the swap is no longer deferred — the card
   collapses and its copy dissolves at the same time, and the FLIP needs to see
   the real collapsed rectangle in the frame it measures. */
#dedicated-product .dp-showcase__item.is-fading-out .dp-showcase__body {
	opacity: 0;
	/* Straight dissolve — no drift, and no transform, matching the other two
	   states so the element's layer status never changes across the cross-fade. */
	transform: none;
	transition: opacity .28s ease-out;
}

/* The description no longer moves on its own at all. It used to drift -6px
   while fading out, which is a second animation on text that is already being
   dissolved by its parent — and any transform on a text node is another chance
   for it to be rasterized at a fractional offset. The body's alpha carries it. */

#dedicated-product .dp-showcase__media {
	position: relative;
	z-index: 2;                /* above the intro backdrop (z-index 1) */
	min-height: 320px;
	border-radius: 28px;
	overflow: hidden;
	/* No fill: the right pane is a transparent window so the looping intro
	   backdrop (and the panel beneath) show through when no card is selected.
	   Selected-item media still fills the host on top. */
	background: transparent;
}
@media (min-width: 1024px) {
	/* Context-aware pane behind the floating card list. Custom consumes the
	   editor's percentage; Full expands across the complete panel. */
	#dedicated-product .dp-showcase__media {
		position: absolute;
		top: 0; right: 0; bottom: 0;
		left: auto;
		grid-column: 1 / -1;
		grid-row: 1;
		width: var(--dp-showcase-media-width, 50%);
		min-height: 0;
		z-index: 2;
		transition: width .7s cubic-bezier(.4,0,.2,1), right .7s cubic-bezier(.4,0,.2,1);
		will-change: width;
	}
	#dedicated-product .dp-showcase__media.is-custom { right: 0; }
	#dedicated-product .dp-showcase__media.is-full {
		width: 100%;
		left: 0;
		right: 0;
	}
}
#dedicated-product .dp-showcase__media-host {
	position: absolute;
	inset: 0;
}
#dedicated-product .dp-showcase__media-host > * {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: contain;
	opacity: 0;
	transform: scale(1.05) translate3d(0, 12px, 0);
	transform-origin: center center;
	pointer-events: none;
	backface-visibility: hidden;
	-webkit-backface-visibility: hidden;
	transition: opacity .7s cubic-bezier(.16,1,.3,1),
	            transform .7s cubic-bezier(.16,1,.3,1);
	will-change: transform, opacity;
}
#dedicated-product .dp-showcase__media-host > .is-active {
	opacity: 1;
	transform: scale(1) translate3d(0, 0, 0);
	pointer-events: auto;
}
#dedicated-product .dp-showcase__media.allows-vertical-overflow { overflow: visible; }
#dedicated-product .dp-showcase__media.allows-vertical-overflow .dp-showcase__media-host {
	top: -7%;
	bottom: -7%;
}
/* Same compact ring as the "+" wrapper, but the "×" glyph is scaled UP inside
   it for contrast and easier dismiss-target visibility. */
#dedicated-product .dp-showcase__close {
	position: absolute;
	top: 16px;
	right: 16px;
	/* Compact dismiss target — small circle, but a bold, slightly enlarged "×". */
	width: 34px;
	height: 34px;
	border-radius: 50%;
	box-sizing: border-box;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	border: 0;
	background: #29292c;
	color: #fff;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 0;
	appearance: none;
	-webkit-appearance: none;
	font-size: 28px;
	font-weight: 700;
	line-height: 1;
	cursor: pointer;
	z-index: 5;
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: background .2s ease, opacity .3s ease, visibility .3s ease;
}
/* The close control only appears once a card is opened. */
#dedicated-product .dp-showcase.is-engaged .dp-showcase__close,
#dedicated-product .dp-showcase__panel.is-engaged .dp-showcase__close {
	opacity: 1;
	visibility: visible;
	pointer-events: auto;
}
#dedicated-product .dp-showcase__close:hover { background: #34343a; }

/* ---- Variant switches (color swatch / icon / text) ---- */
#dedicated-product .dp-showcase__variants {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin-top: 18px;
}
#dedicated-product .dp-showcase__variant {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 8px 14px;
	background: rgba(255,255,255,0.08);
	border: 1px solid transparent;
	border-radius: 999px;
	color: var(--dp-text-soft);
	/* matched to the showcase description ramp (15px base / 17px desktop).
	   Font-size only — colours, padding and layout are intentionally unchanged. */
	font-size: 15px;
	font-weight: 500;
	cursor: pointer;
	transition: background .3s ease, border-color .3s ease, color .3s ease, transform .3s ease;
}
@media (min-width: 1024px) {
	#dedicated-product .dp-showcase__variant { font-size: 17px; }
}
#dedicated-product .dp-showcase__variant:hover { background: rgba(255,255,255,0.14); }
#dedicated-product .dp-showcase__variant.is-active {
	background: rgba(255,255,255,0.16);
	border-color: rgba(255,255,255,0.3);
	color: #fff;
}
#dedicated-product .dp-showcase__variant--swatch { padding: 6px; }
#dedicated-product .dp-showcase__swatch {
	width: 26px; height: 26px;
	border-radius: 50%;
	background: var(--swatch, #555);
	box-shadow: inset 0 0 0 1px rgba(255,255,255,0.25);
	display: block;
	transition: box-shadow .3s ease;
}
#dedicated-product .dp-showcase__variant--swatch.is-active {
	box-shadow: 0 0 0 2px var(--dp-bg), 0 0 0 4px #fff;
}
#dedicated-product .dp-showcase__variant-icon {
	width: 20px; height: 20px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}
#dedicated-product .dp-showcase__variant-icon svg { width: 100%; height: 100%; }

/* ---- Cinematic intro backdrop + staggered card slide-in ----
 * The intro media (looping muted video, or a static image) is a persistent
 * full-panel BACKDROP at the bottom of the stack. The right media pane is
 * transparent, so this shows through whenever no card is selected — i.e. it is
 * the default state and re-appears when the visitor closes a card. The cards
 * float above it. For a video, cards are click-locked for the first 1.0s (.is-
 * locked) then slide in and become interactive while the video keeps looping. */
/* Resting right-pane media (all viewports). Fills the media pane while idle and
 * fades out the instant a card opens (.is-engaged), restoring when all close. */
#dedicated-product .dp-showcase__default {
	position: absolute;
	inset: 0;
	z-index: 2;            /* sits above the pane edges so an enlarged image overspills on top */
	overflow: visible;     /* let a zoomed default media extend past the frame */
	border-radius: inherit;
	opacity: 1;
	visibility: visible;
	pointer-events: none;
	transform: scale(1) translate3d(0, 0, 0);
	transition: opacity .7s cubic-bezier(.16,1,.3,1),
	            transform .7s cubic-bezier(.16,1,.3,1),
	            visibility 0s linear 0s;
	will-change: transform, opacity;
	display: none;
}
#dedicated-product .dp-showcase__default.is-current { display: block; }
#dedicated-product .dp-showcase__default-media {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: contain;
	transform: none;
	transform-origin: center center;
}
#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__default {
	opacity: 0;
	visibility: hidden;
	transform: scale(1.05) translate3d(0, 12px, 0);
	transition: opacity .7s cubic-bezier(.16,1,.3,1),
	            transform .7s cubic-bezier(.16,1,.3,1),
	            visibility 0s linear .7s;
}

#dedicated-product .dp-showcase__intro {
	position: absolute;
	inset: 0;
	z-index: 1;
	overflow: hidden;
	background: var(--dp-bg);
	pointer-events: none;
}
#dedicated-product .dp-showcase__intro-video,
#dedicated-product .dp-showcase__intro-img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}
/* Interaction lockout while the intro video runs its opening second. */
#dedicated-product .dp-showcase__layout.is-locked .dp-showcase__list {
	pointer-events: none;
}
/* ================================================================== *
 * Showcase entrance — reference style guide
 *
 * Replaces the former `.is-intro` / `.is-cards-in` slide-in (cards drifted in
 * from translateX(-40px) on one shared curve, right pane static).
 *
 * The cards now arrive as compressed circles at icon width and expand to their
 * OWN width; the middle card lands first on a spring, then the rest cascade.
 * Per-card widths cannot be expressed in CSS: every label is admin copy of a
 * different length, and `width` will not animate from or to `fit-content`. The
 * controller measures each resting card once and writes --dp-card-w / --dp-card-h,
 * which is also why the collapsed circle is --dp-card-h rather than a magic
 * number — it has to equal the card's own height to actually read as a circle
 * across the desktop/compact padding change.
 *
 * Every animated property here is compositor-friendly (width is the one
 * exception and is deliberately confined to the entrance, never to the
 * interactive open/close path, which stays on the FLIP transform).
 * ================================================================== */
#dedicated-product .dp-showcase__layout {
	/* The reference guide's two curves. The spring overshoots past 1 — that
	   overshoot is the whole character of the expansion, so it must not be
	   swapped for the page's standard --dp-carousel-ease. */
	--dp-showcase-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
	--dp-showcase-bounce: cubic-bezier(0.175, 0.885, 0.32, 1.275);

	/* Cascade pacing. --dp-card-step (the card's index in VISIBLE order) is
	   written by the controller; these two turn it into the pair of delays each
	   card needs. --dp-label-lead is the beat between a card starting to grow
	   and its label fading up, measured from THAT card's own start — so it has
	   to be added to the card's delay rather than authored as a second series.
	   CASCADE_STEP in dedicated-product.js must stay equal to the step value. */
	--dp-cascade-step: .06s;
	--dp-label-lead: .2s;
}

@media (min-width: 1024px) and (prefers-reduced-motion: no-preference) {
	/* Armed: hidden from the moment the page loads, before the section can be
	   scrolled to. Opacity only — the cards keep their natural layout so the
	   controller can still measure their target widths. Without this the stack
	   painted normally and was then yanked out of view the instant the panel
	   crossed the observer, which read as a flash-then-hide. */
	#dedicated-product .dp-showcase__layout.is-entrance-armed .dp-showcase__item {
		opacity: 0;
	}

	/* Parked state: an icon-width circle, scaled out and nudged left.
	   The locked HEIGHT is not decoration — it is what makes the whole effect
	   possible. Squeezing the box to icon width with the height left to `auto`
	   reflows the label to one character per line, so each card grows to
	   hundreds of pixels tall, the list balloons (measured: 3314px), and the
	   absolutely-positioned media pane is dragged far below the fold — the
	   panel renders as an empty void for the length of the entrance. Pinning
	   the height to the measured resting height, and holding the label on one
	   line, is the same guard the reference guide gets from its fixed 48px
	   pill and `white-space: nowrap` label. */
	#dedicated-product .dp-showcase__layout.is-entrance .dp-showcase__item {
		width: var(--dp-card-h, 45px);
		height: var(--dp-card-h, 45px);
		opacity: 0;
		transform: translateX(-20px) scale(0);
		will-change: width, transform, opacity;
		transition:
			width .5s var(--dp-showcase-spring),
			transform .38s ease-out,
			opacity .28s ease-out;
	}

	/* Content must not re-lay-out while the box is narrow: the row keeps its
	   single line, the icon keeps its full size, and the label runs off into
	   the card's own overflow:hidden instead of wrapping. */
	#dedicated-product .dp-showcase__layout.is-entrance .dp-showcase__row-head {
		flex-wrap: nowrap;
		height: 100%;
	}
	#dedicated-product .dp-showcase__layout.is-entrance .dp-showcase__icon {
		flex: 0 0 auto;
	}

	/* The label is held at 0 until the box has most of its width, so the
	   width run happens behind an invisible element rather than as visible
	   text jitter. The icon stays lit throughout.
	   The lead here is measured from the moment THAT CARD starts expanding, so
	   the per-card stagger below has to be added on top of it. With a flat lead
	   the last card's label reached full opacity while its box was still a
	   0-19px circle, printing the text straight through the clipped edge and
	   only looking correct once the cascade caught up. */
	#dedicated-product .dp-showcase__layout.is-entrance .dp-showcase__label {
		white-space: nowrap;
		opacity: 0;
		transition: opacity .22s ease var(--dp-label-lead);
	}

	/* Stage 1 — the anchor card arrives alone as a bouncing dot. */
	@keyframes dp-showcase-anchor-arrival {
		0%   { opacity: 0; transform: translateX(-30px) scale(0.2); }
		50%  { opacity: 1; transform: translateX(10px) scale(1.35); }
		75%  { opacity: 1; transform: translateX(-3px) scale(0.92); }
		100% { opacity: 1; transform: translateX(0) scale(1); }
	}
	#dedicated-product .dp-showcase__layout.is-entrance .dp-showcase__item.is-anchor-arriving {
		animation: dp-showcase-anchor-arrival .5s var(--dp-showcase-bounce) forwards;
	}

	/* Stage 2 — the anchor expands to its own measured width. */
	#dedicated-product .dp-showcase__layout.is-entrance .dp-showcase__item.is-anchor-expanded {
		width: var(--dp-card-w);
		opacity: 1;
		/* Beats the arrival keyframe's forwards fill, which still holds the
		   element at its final transform. */
		transform: translateX(0) scale(1) !important;
		transition: width .5s var(--dp-showcase-spring);
	}
	#dedicated-product .dp-showcase__layout.is-entrance .dp-showcase__item.is-anchor-expanded .dp-showcase__label {
		opacity: 1;
	}

	/* Stage 3 — the remaining cards cascade out to their own widths. */
	#dedicated-product .dp-showcase__layout.is-entrance.is-cards-cascading .dp-showcase__item:not(.is-anchor) {
		width: var(--dp-card-w);
		opacity: 1;
		transform: translateX(0) scale(1);
	}
	#dedicated-product .dp-showcase__layout.is-entrance.is-cards-cascading .dp-showcase__label {
		opacity: 1;
	}
	/* Stagger. Each card's width/transform/opacity share one delay, and its
	   label carries the SAME delay plus --dp-label-lead, so every card reveals
	   its text at the same point in its OWN expansion rather than at a point in
	   the cascade's. Without the paired label delay the later cards print their
	   labels through a box that has not started growing yet.

	   Keyed on --dp-card-step, the card's index in visible order, which the
	   controller writes during its measure pass. This replaced ten authored
	   :nth-child(2..6) rules, which were wrong on two counts: :nth-child counts
	   DOM position, so a view-tab filter (hidden items keep their positions) or
	   a drag-reorder in the editor handed the visible cards a scattered subset
	   of the series; and there were only five slots, so a sixth-and-later
	   visible card matched nothing and fired at delay 0 — ahead of the cards it
	   was supposed to follow. Computing from the index removes both the
	   ordering assumption and the ceiling. */
	#dedicated-product .dp-showcase__layout.is-entrance.is-cards-cascading .dp-showcase__item:not(.is-anchor) {
		transition-delay: calc(var(--dp-card-step, 0) * var(--dp-cascade-step));
	}
	#dedicated-product .dp-showcase__layout.is-entrance.is-cards-cascading .dp-showcase__item:not(.is-anchor) .dp-showcase__label {
		transition-delay: calc(var(--dp-card-step, 0) * var(--dp-cascade-step) + var(--dp-label-lead));
	}

	/* The anchor runs its own two-stage arrival, so its label must not inherit
	   a cascade delay — it reveals against .is-anchor-expanded instead.
	   .3s, not the .2s lead the cascading cards get: the original pair was
	   .5s against a .85s width run, because at the plain lead the box measured
	   228.7px against a 229px content requirement and the final character landed
	   exactly on the clipped edge. What matters is the FRACTION of the run, not
	   the wall-clock value, so shortening the run to .5s carries the anchor's
	   lead to .3s — still past the spring's overshoot peak, where there is room
	   to spare. */
	#dedicated-product .dp-showcase__layout.is-entrance .dp-showcase__item.is-anchor .dp-showcase__label { transition-delay: .3s; }

	/* Right pane: blur-to-focus. The resting media is the reference's product
	   shot; it resolves from blur behind the progress line.
	   `transition: none` while parking is the point — with a transition here the
	   media would animate INTO the blur over 0.8s on scroll-into-view, which
	   reads as the image degrading. It has to start blurred and only the
	   resolve is animated. */
	#dedicated-product .dp-showcase__media.is-entrance .dp-showcase__default-media {
		/* 16px, not 25px. The resolve is now gated on the real decode and runs in
		   0.35s rather than 0.8s, and a 25px radius cannot cross that distance
		   without reading as a jump — it also costs materially more to composite
		   across a full-height pane. */
		filter: blur(16px);
		transform: scale(1.05);
		transition: none;
		/* Promoted only for the duration of the entrance; the controller drops
		   .is-entrance on settle, which takes the layer back with it. */
		will-change: filter, transform;
	}
	#dedicated-product .dp-showcase__media.is-entrance.is-media-loaded .dp-showcase__default-media {
		filter: blur(0);
		transform: scale(1);
		transition: filter .35s ease-out, transform .35s ease-out;
	}
}

/* Progress line under the resting media. Present only while the entrance runs;
   the controller removes it from the flow afterwards. Kept outside the
   reduced-motion guard so the bar itself is never left half-drawn — it is
   simply never shown when the entrance is skipped. */
#dedicated-product .dp-showcase__loader {
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	z-index: 3;
	width: 120px;
	height: 4px;
	border-radius: 2px;
	background: rgba(255, 255, 255, 0.2);
	overflow: hidden;
	opacity: 0;
	pointer-events: none;
	transition: opacity .25s ease;
}
#dedicated-product .dp-showcase__media.is-entrance .dp-showcase__loader {
	opacity: 1;
}
#dedicated-product .dp-showcase__media.is-entrance.is-media-loaded .dp-showcase__loader {
	opacity: 0;
}
#dedicated-product .dp-showcase__loader-fill {
	display: block;
	width: 0;
	height: 100%;
	background: #fff;
	box-shadow: 0 0 8px rgba(255, 255, 255, 0.8);
	/* The bar is a progress indication, not a fixed animation: it has to be able
	   to complete inside the shortest resolve the entrance now allows (the 260ms
	   floor), or it would still be visibly filling when the image is already
	   sharp. */
	transition: width .5s cubic-bezier(0.22, 1, 0.36, 1);
}
#dedicated-product .dp-showcase__media.is-loader-filling .dp-showcase__loader-fill {
	width: 100%;
}

/* ------------------------------------------------------------------ *
 * 5. FAQ
 * ------------------------------------------------------------------ */
#dedicated-product .dp-faq {
	position: relative;
	background: var(--dp-bg);
	padding: var(--dp-section-gap) 0;
}
#dedicated-product .dp-faq__fade {
	position: absolute;
	top: 0; left: 0; right: 0;
	height: 120px;
	background: linear-gradient(to bottom, var(--dp-surface), var(--dp-bg));
	pointer-events: none;
}
#dedicated-product .dp-faq__title {
	position: relative;
	margin: 0 0 clamp(32px, 5vw, 56px);
	font-size: clamp(28px, 4vw, 48px);
	font-weight: 700;
	letter-spacing: -0.01em;
	text-align: center;
}
#dedicated-product .dp-faq__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 12px;
}
#dedicated-product .dp-faq__item details {
	background: rgba(255,255,255,0.04);
	border: 1px solid var(--dp-border);
	border-radius: 16px;
	padding: 20px 24px;
	transition: background .2s ease;
}
#dedicated-product .dp-faq__item details[open] {
	background: rgba(255,255,255,0.07);
	border-color: var(--dp-accent);
}
#dedicated-product .dp-faq__question {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	font-size: clamp(16px, 1.5vw, 19px);
	font-weight: 600;
	color: #fff;
	cursor: pointer;
	list-style: none;
}
#dedicated-product .dp-faq__question::-webkit-details-marker { display: none; }
#dedicated-product .dp-faq__q-icon {
	width: 28px; height: 28px;
	border-radius: 50%;
	border: 1px solid rgba(255,255,255,0.4);
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 18px;
	line-height: 1;
	flex-shrink: 0;
	transition: transform .25s ease, border-color .25s ease, color .25s ease;
}
#dedicated-product .dp-faq__item details[open] .dp-faq__q-icon {
	transform: rotate(45deg);
	border-color: var(--dp-accent);
	color: var(--dp-accent);
}
#dedicated-product .dp-faq__answer {
	margin-top: 16px;
	color: var(--dp-text-soft);
	font-size: 16px;
	line-height: 1.6;
}
#dedicated-product .dp-faq__answer p { margin: 0 0 12px; }
#dedicated-product .dp-faq__answer p:last-child { margin-bottom: 0; }
#dedicated-product .dp-faq__answer a { color: var(--dp-accent); text-decoration: underline; }

/* ------------------------------------------------------------------ *
 * 6. Request Support CTA (replaces FAQ in the page flow — )
 * ------------------------------------------------------------------ */
#dedicated-product .dp-cta {
	position: relative;
	background: var(--dp-bg);
	padding: var(--dp-section-gap) 0;
}
#dedicated-product .dp-cta__fade {
	position: absolute;
	top: 0; left: 0; right: 0;
	height: 120px;
	background: linear-gradient(to bottom, var(--dp-surface), var(--dp-bg));
	pointer-events: none;
}
#dedicated-product .dp-cta__inner {
	position: relative;
	text-align: center;
	border-top: 1px solid var(--dp-border);
	padding-top: clamp(40px, 6vw, 72px);
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 20px;
}
#dedicated-product .dp-cta__title {
	margin: 0;
	font-size: clamp(28px, 4vw, 44px);
	font-weight: 700;
	letter-spacing: -0.01em;
}
#dedicated-product .dp-cta__desc {
	margin: 0;
	max-width: 46rem;
	color: var(--dp-text-soft);
	font-size: clamp(16px, 1.6vw, 19px);
	line-height: 1.5;
}
/* 1:1 clone of the game hero "Shop Now" button below "Available Now" —
   .button-red-shadowed plus its hero-stack overrides (css/style.css:506 & 917).
   Effective: Montserrat-Bold 500, 1.05rem, 0.85rem×1.6rem padding, 8px radius,
   soft drop shadow, 15–22rem width, invert-on-hover. Centred in the band
   rather than floated like the original. */
#dedicated-product .dp-cta__btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	text-align: center;
	margin-top: 8px;
	width: auto;
	min-width: 15rem;
	max-width: min(100%, 22rem);
	padding: 0.85rem 1.6rem;
	background-color: #D90500;
	color: #fff;
	font-family: 'Montserrat-Bold', Helvetica, Arial, sans-serif;
	font-size: 1.05rem;
	font-weight: 500;
	line-height: 1.2;
	text-decoration: none;
	border-radius: 8px;
	/* Shared red CTA outline (full size — this is a 15rem-wide primary CTA, same
	   footprint as .button-red-shadowed). Reserved transparent over the red fill
	   at rest, red once the button inverts to white. box-sizing is border-box for
	   everything under .dp-page, so the footprint is unchanged. */
	border: var(--renewal-cta-border-width, 2px) solid transparent;
	box-shadow: 0 8px 18px rgba(3, 3, 3, 0.18);
	white-space: normal;
	transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}
#dedicated-product .dp-cta__btn:hover {
	background-color: #fff;
	color: #D90500;
	border-color: var(--renewal-cta-border-color, #D90500);
}

/* ------------------------------------------------------------------ *
 * 7. Bottom Hero
 * ------------------------------------------------------------------ */
#dedicated-product .dp-bottom-hero {
	position: relative;
	width: 100%;
	max-width: none;
	min-height: clamp(300px, 40vh, 400px);
	margin: 0;
	padding: 0;
	overflow: hidden;
	/* Match the neighbouring surface while media loads or is unavailable. */
	background: var(--dp-surface);
}
#dedicated-product .dp-bottom-hero::after {
	content: '';
	position: absolute;
	inset-inline: 0;
	width: 100%;
	bottom: 0;
	height: 1px;
	background: rgba(255, 255, 255, 0.2);
	pointer-events: none;
	z-index: 3;
}
/* Media bleeds across the section; the copy remains bounded independently. */
#dedicated-product .dp-bottom-hero__media {
	position: absolute;
	inset: 0;
	width: 100%;
	z-index: 0;
	overflow: hidden;
}
/* Framing parity with the computed /en/about-products/ cascade: the image
   keeps its natural aspect ratio at full width and the media band clips the
   surplus from the top. The editor scale adds proportional zoom from the same
   top-center anchor. */
#dedicated-product .dp-bottom-hero__img {
	display: block;
	width: 100%;
	height: auto;
	object-fit: cover;
	object-position: 50% 50%;
	transform: scale(var(--dp-bottom-hero-image-scale, 1));
	transform-origin: 50% 0;
}
/* Shade the complete media band, including ultrawide gutters. */
#dedicated-product .dp-bottom-hero__shade {
	position: absolute;
	inset: 0;
	width: 100%;
	z-index: 1;
	background: linear-gradient(90deg, rgba(3, 3, 3, 0.86) 0%, rgba(3, 3, 3, 0.64) 52%, rgba(3, 3, 3, 0.48) 100%);
}
/* The photo behind this (.dp-bottom-hero__media) stays full-bleed by design;
   only the headline/CTA block is pulled onto the shared column. */
#dedicated-product .dp-bottom-hero__inner {
	position: relative;
	z-index: 2;
	max-width: var(--dp-content-max);
	min-height: inherit;
	margin: 0 auto;
	padding: 3.25rem var(--dp-margin) 2.25rem;
	display: flex;
	flex-direction: column;
	justify-content: center;
	align-items: flex-start;
}
#dedicated-product .dp-bottom-hero__headline {
	margin: 0 0 1rem;
	max-width: 16ch;
	font-size: clamp(2rem, 3vw + 0.7rem, 3.25rem);
	font-weight: 700;
	line-height: 1.14;
	letter-spacing: -0.01em;
	text-align: left;
	text-wrap: balance;
}
#dedicated-product .dp-bottom-hero__headline--inline {
	max-width: none;
	width: max-content;
	font-size: clamp(2rem, 3.6vw + 0.5rem, 3.65rem);
	font-weight: 600;
	white-space: nowrap;
}
#dedicated-product .dp-rotating-slot {
	display: inline-grid;
	/* Without this, every word (all sharing grid-area 1/1) stretches to the
	   slot's current width. The JS measure pass then reads that stretched box
	   back and latches each slot to its widest-ever value, leaving a gap after
	   the shorter words. Sizing items to their content keeps the measurement
	   honest. */
	justify-items: start;
	overflow: hidden;
	vertical-align: baseline;
	line-height: inherit;
	text-align: left;
	transition: width 0.6s cubic-bezier(0.65, 0, 0.35, 1);
}
#dedicated-product .dp-rotating-word {
	grid-area: 1 / 1;
	white-space: nowrap;
	color: var(--dp-accent);
	transform: translateY(110%);
	transition: transform 0.6s cubic-bezier(0.65, 0, 0.35, 1);
}
#dedicated-product .dp-rotating-word--active {
	transform: translateY(0);
}
#dedicated-product .dp-rotating-word--exit-up {
	transform: translateY(-110%);
}
#dedicated-product .dp-bottom-hero__ctas {
	display: flex;
	flex-wrap: wrap;
	justify-content: flex-start;
	gap: 0.65rem;
}

/* ---- Bottom Hero: Associations ----
   1:1 port of .exa-footer-hero__assoc-* from assets/css/exa.css.
   One rule from the source is intentionally NOT carried over: an
   `img:nth-child(3)` invert filter, which is tuned to the specific third logo
   on the reference page and would misfire on any other logo set or order. */
/* The overlay is a sibling of .dp-bottom-hero__inner, so offset it by the
   content gutter while the media continues to bleed beneath it. */
#dedicated-product .dp-bottom-hero__assoc-overlay {
	position: absolute;
	right: calc(var(--dp-column-gutter) + clamp(1rem, 4vw, 4rem));
	bottom: clamp(1rem, 5vh, 2.25rem);
	z-index: 2;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.6rem;
	width: fit-content;
	max-width: min(34rem, 48vw);
}
#dedicated-product .dp-bottom-hero__assoc-text {
	margin: 0;
	font-size: clamp(0.92rem, 0.85vw + 0.4rem, 1.05rem);
	font-weight: 400;
	line-height: 1.45;
	letter-spacing: 0.01em;
	color: rgba(186, 186, 186, 0.78);
	text-align: center;
	width: 100%;
	max-width: 100%;
}
#dedicated-product .dp-bottom-hero__assoc-logos {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: clamp(0.75rem, 1.5vw, 1.5rem);
}
#dedicated-product .dp-bottom-hero__assoc-logos img {
	height: clamp(2.35rem, 3.8vw, 3.8rem);
	width: auto;
	max-width: 9.5rem;
	object-fit: contain;
	opacity: 0.72;
	filter: grayscale(1) saturate(0) brightness(0.82) contrast(1.05);
	transition: filter 0.28s ease, opacity 0.28s ease;
}
/* JAIA is rendered from an actual transparent white asset. Keep it out of the
   generic opaque-logo filter so its transparent pixels stay transparent. */
#dedicated-product .dp-bottom-hero__assoc-logos img.is-jaia {
	filter: none;
	mix-blend-mode: normal;
}

/* ---- Showcase: mobile / reduced-motion fallbacks ---- */
@media (max-width: 1023px) {
	#dedicated-product .dp-showcase__media,
	#dedicated-product .dp-showcase__media.is-full { width: 100%; min-height: 320px; }
	/* Keep the same responsive media band as /about-products/ so object-fit
	   computes the same crop at every viewport. */
	#dedicated-product .dp-bottom-hero {
		height: auto;
		min-height: clamp(300px, 44vh, 380px);
	}
	#dedicated-product .dp-bottom-hero__shade {
		background: linear-gradient(180deg, rgba(3, 3, 3, 0.84) 0%, rgba(3, 3, 3, 0.58) 50%, rgba(3, 3, 3, 0.78) 100%);
	}
	#dedicated-product .dp-bottom-hero__inner {
		min-height: auto;
		align-items: center;
		text-align: center;
		/* Bottom padding carries the CTA→associations separation, mirroring how
		   the reference page splits it (~48px inside the inner + a 12px margin
		   on the block itself) rather than one large margin. */
		padding: 2.3rem var(--dp-margin) 3rem;
	}
	#dedicated-product .dp-bottom-hero__headline,
	#dedicated-product .dp-bottom-hero__headline--inline {
		text-align: center;
		margin-left: auto;
		margin-right: auto;
		max-width: none;
	}
	#dedicated-product .dp-bottom-hero__ctas {
		justify-content: center;
	}
	/* Associations un-pin from the corner and stack under the CTAs, matching
	   the reference page's <=1024px treatment. */
	#dedicated-product .dp-bottom-hero__assoc-overlay {
		position: relative;
		right: auto;
		bottom: auto;
		margin: 0.75rem auto 1rem;
		max-width: 90%;
	}
	#dedicated-product .dp-bottom-hero__assoc-logos {
		flex-wrap: wrap;
	}
}
/* ---- Bottom Hero headline: responsive ladder ----
   Ported breakpoint-for-breakpoint from the reference page so the rotating
   inline headline always fits the viewport. The base rule is nowrap +
   max-content (a single unbroken line, which is what desktop wants); without
   this ladder that line simply ran off-screen on phones. */
@media (max-width: 768px) {
	#dedicated-product .dp-bottom-hero {
		min-height: 320px;
	}
	#dedicated-product .dp-bottom-hero__headline {
		font-size: clamp(1.65rem, 7.2vw, 2.4rem);
		max-width: 14ch;
	}
	#dedicated-product .dp-bottom-hero__headline--inline {
		font-size: clamp(1.6rem, 7.4vw, 2.45rem);
	}
}
/* 40em is deliberate, not arbitrary: js/dedicated-product.js uses the very
   same (max-width: 40em) query to stop pinning per-word slot widths. Wrapping
   must switch on at exactly the point the JS lets go, or the two disagree. */
@media (max-width: 40em) {
	#dedicated-product .dp-bottom-hero__headline--inline {
		white-space: normal;
		text-wrap: balance;
		width: auto;
	}
}
@media (max-width: 480px) {
	#dedicated-product .dp-bottom-hero {
		min-height: 340px;
	}
	#dedicated-product .dp-bottom-hero__headline {
		width: 100%;
		max-width: none;
		font-size: clamp(1.6rem, 7vw, 2.2rem);
		text-align: center;
		margin-bottom: 1rem;
	}
	#dedicated-product .dp-bottom-hero__headline--inline {
		width: fit-content;
		max-width: 100%;
		font-size: clamp(1.6rem, 7.2vw, 2.25rem);
		text-align: center;
		margin-left: auto;
		margin-right: auto;
	}
}

/* Mobile-only: the rotating headline and CTA buttons share one column start. */
@media (max-width: 768px) {
	#dedicated-product .dp-bottom-hero__headline--inline,
	#dedicated-product .dp-bottom-hero__ctas {
		width: 100%;
		max-width: 320px;
		margin-left: auto;
		margin-right: auto;
	}
	#dedicated-product .dp-bottom-hero__headline--inline {
		text-align: left;
	}
	#dedicated-product .dp-bottom-hero__ctas {
		justify-content: flex-start;
	}
}

@media (prefers-reduced-motion: reduce) {
	#dedicated-product .dp-showcase__default {
		transform: translate3d(0, 0, 0) !important;
		will-change: auto;
	}
	#dedicated-product .dp-showcase__media-host > * {
		transition: none;
		will-change: auto;
	}
	#dedicated-product .dp-showcase__media,
	#dedicated-product .dp-showcase__item,
	#dedicated-product .dp-showcase__body,
	#dedicated-product .dp-showcase__icon,
	#dedicated-product .dp-rotating-slot,
	#dedicated-product .dp-rotating-word { transition: none; }
}

/* Controls wrapper is an invisible box on desktop — its children (nav + list)
   behave exactly as before. The mobile layout turns it into the label rail +
   description deck beneath the media pane. */
#dedicated-product .dp-showcase__controls,
#dedicated-product .dp-showcase__deck { display: contents; }
#dedicated-product .dp-showcase__mobile-description[hidden] { display: none; }

/* =======================================================================
   Showcase — mobile "closer look" rail (≤768px)
   Media first, horizontally swipeable label rail second, and the active
   description deck below. Chevrons stay hidden until a label is active, then
   slide partially off-canvas to mimic Apple's clipped edge treatment.
   ======================================================================= */
@media (max-width: 768px) {
	#dedicated-product .dp-showcase { padding: 0; background: #000; }
	#dedicated-product.dp-page .dp-showcase .dp-container--showcase {
		max-width: none;
		padding: 0;
	}
	#dedicated-product.dp-page .dp-showcase__title,
	#dedicated-product.dp-page .dp-showcase__title.dp-reveal {
		display: block;
		margin: 0;
		padding: 16px var(--dp-margin) 10px;
		/* Inherit the canonical section-title size from the base rule
		   (clamp(28px, 4vw, 48px), see ~L544) instead of the legacy
		   clamp(20px, 5vw, 26px) that shrank this heading below every other
		   landing section on mobile. line-height matches .dp-features__title. */
		line-height: 1.2;
		text-align: left;
		opacity: 1;
		transform: none;
	}
	#dedicated-product.dp-page .dp-showcase__panel,
	#dedicated-product.dp-page .dp-showcase__panel.dp-reveal,
	#dedicated-product.dp-page .dp-showcase__panel.dp-reveal.is-in-view {
		background: #000;
		border: 0;
		border-radius: 0;
		padding: 0 0 28px;
		position: relative;
		opacity: 1;
		transform: none;
		overflow: hidden;
	}
	#dedicated-product .dp-showcase__layout {
		display: flex;
		flex-direction: column;
		gap: 12px;
		position: relative;
		overflow: hidden;
	}
	#dedicated-product .dp-showcase__intro {
		display: block;
		z-index: 0;
		transition: opacity .35s ease;
	}
	#dedicated-product .dp-showcase__panel.has-mobile-default .dp-showcase__intro {
		display: none;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__intro { opacity: 0; }
	#dedicated-product .dp-showcase__intro-video,
	#dedicated-product .dp-showcase__intro-img { object-fit: contain; }

	#dedicated-product .dp-showcase__media,
	#dedicated-product .dp-showcase__media.is-custom,
	#dedicated-product .dp-showcase__media.is-full {
		order: 1;
		position: relative;
		width: 100%;
		min-height: clamp(340px, 68vw, 520px);
		aspect-ratio: 16 / 10;
		flex: 0 0 auto;
		border-radius: 0;
		background: transparent;
		z-index: 1;
	}
	#dedicated-product .dp-showcase__media-host {
		position: absolute;
		inset: 0 4px;
	}
	#dedicated-product .dp-showcase__media-host.is-idle {
		visibility: hidden;
		opacity: 0;
		pointer-events: none;
	}
	#dedicated-product .dp-showcase__media-host > * { object-fit: contain; }

	#dedicated-product .dp-showcase__close {
		top: 10px;
		right: var(--dp-margin);
		width: 42px;
		height: 42px;
		padding: 0;
		box-sizing: border-box;
		aspect-ratio: 1 / 1;
		display: inline-flex;
		align-items: center;
		justify-content: center;
		border-radius: 50%;
		border: 0;
		appearance: none;
		-webkit-appearance: none;
		font-size: 30px;
		font-weight: 700;
		line-height: 1;
		background: #29292c;
		color: #fff;
		opacity: 0;
		visibility: hidden;
		pointer-events: none;
		z-index: 6;
	}
	#dedicated-product .dp-showcase.is-engaged .dp-showcase__close,
	#dedicated-product .dp-showcase__panel.is-engaged .dp-showcase__close {
		opacity: 1;
		visibility: visible;
		pointer-events: auto;
	}

	#dedicated-product .dp-showcase__nav {
		display: none;
		position: absolute;
		top: 50%;
		left: 0;
		right: 0;
		width: 100%;
		height: 48px;
		transform: translateY(-50%);
		opacity: 0;
		visibility: hidden;
		pointer-events: none;
		z-index: 5;
		transition: opacity .2s ease;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__nav {
		display: block;
		opacity: 1;
		visibility: visible;
		pointer-events: none;
	}
	#dedicated-product .dp-showcase__nav-btn,
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__nav-btn {
		position: absolute;
		top: 50%;
		width: 46px;
		height: 46px;
		display: inline-flex;
		align-items: center;
		justify-content: center;
		border-radius: 50%;
		font-size: 0;
		margin: 0;
		background: #29292c;
		opacity: 0;
		visibility: hidden;
		pointer-events: none;
		transform: translateY(-50%);
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__nav-btn {
		opacity: 1;
		visibility: visible;
		pointer-events: auto;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__nav-btn:disabled,
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__nav-btn[aria-disabled="true"] {
		background: #151517;
		color: #55555b;
		opacity: .72;
		pointer-events: none;
	}
	#dedicated-product .dp-showcase__nav-btn[data-dir="-1"] {
		left: 0;
	}
	#dedicated-product .dp-showcase__nav-btn[data-dir="1"] {
		right: 0;
	}
	/* Mobile prev/next is horizontal: hide the vertical SVG chevrons and fall
	   back to the ‹ › guillemet control drawn via ::before below. */
	#dedicated-product .dp-showcase__chevron {
		display: none;
	}
	#dedicated-product .dp-showcase__nav-btn::before {
		display: block;
		font-size: 30px;
		font-weight: 400;
		line-height: 1;
		position: relative;
		top: -1px;
	}
	#dedicated-product .dp-showcase__nav-btn[data-dir="-1"]::before {
		content: "\2039";
		transform: translateX(-1px);
	}
	#dedicated-product .dp-showcase__nav-btn[data-dir="1"]::before {
		content: "\203A";
		transform: translateX(1px);
	}

	#dedicated-product .dp-showcase__controls {
		order: 2;
		display: flex;
		flex-direction: column;
		gap: 10px;
		padding: 0 var(--dp-margin);
		position: relative;
		z-index: 3;
		overflow: visible;
	}
	#dedicated-product .dp-showcase__deck {
		display: flex;
		flex-direction: column;
		gap: 10px;
		min-width: 0;
		width: 100%;
		overflow: visible;
	}
	#dedicated-product .dp-showcase__list {
		margin: 0;
		padding: 0 0 2px;
		max-width: none;
		display: flex;
		flex-direction: row;
		flex-wrap: nowrap;
		align-items: center;
		justify-content: flex-start;
		gap: 10px;
		overflow-x: auto;
		overflow-y: hidden;
		touch-action: pan-x;
		overscroll-behavior-x: contain;
		scroll-snap-type: x mandatory;
		scroll-padding-inline: var(--dp-margin);
		-webkit-overflow-scrolling: touch;
		scrollbar-width: none;
		white-space: normal;
		width: 100%;
	}
	#dedicated-product .dp-showcase__list::-webkit-scrollbar { display: none; }
	#dedicated-product .dp-showcase__item,
	#dedicated-product .dp-showcase__item:hover,
	#dedicated-product .dp-showcase__item:focus-visible {
		display: block;
		flex: 0 0 auto;
		width: min(78vw, 320px);
		max-width: min(78vw, 320px);
		background: transparent;
		border: 0;
		padding: 0;
		scroll-snap-align: start;
		scroll-snap-stop: always;
	}
	#dedicated-product .dp-showcase__row-head {
		display: inline-flex;
		align-items: center;
		justify-content: flex-start;
		gap: 8px;
		width: 100%;
		min-height: 48px;
		padding: 10px 18px;
		background: #29292c;
		border-radius: 24px;
		white-space: normal;
		overflow: visible;
	}
	#dedicated-product .dp-showcase__label {
		font-size: 13px;
		line-height: 1.35;
		white-space: normal;
		overflow-wrap: anywhere;
		word-break: break-word;
	}
	#dedicated-product .dp-showcase__item.is-active,
	#dedicated-product .dp-showcase__item.is-active:hover {
		background: transparent;
		border: 0;
		border-radius: 0;
		padding: 0;
	}
	#dedicated-product .dp-showcase__item.is-active .dp-showcase__row-head {
		display: inline-flex;
	}
	#dedicated-product .dp-showcase__item.is-active .dp-showcase__row-head {
		background: #29292c;
	}
	#dedicated-product .dp-showcase__body { display: none; }
	#dedicated-product .dp-showcase__mobile-description {
		display: none !important;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__list {
		overflow: hidden;
		scroll-snap-type: none;
		width: 100%;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__controls {
		padding-left: 56px;
		padding-right: 56px;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__item {
		display: none;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__item.is-active,
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__item.is-active:hover,
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__item.is-active:focus-visible {
		display: block;
		flex: 0 1 auto;
		width: 100%;
		max-width: 100%;
		margin-inline: auto;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__item.is-active .dp-showcase__row-head {
		display: none;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__item.is-active .dp-showcase__body {
		display: block;
		max-height: none;
		width: 100%;
		min-width: 0;
		height: auto !important;
		opacity: 1;
		overflow: visible;
		box-sizing: border-box;
		margin-inline: 0;
		padding: 14px 18px;
		background: #29292c;
		border-radius: 24px;
		text-align: left;
		touch-action: pan-x;
		word-wrap: break-word;
		overflow-wrap: anywhere;
		word-break: break-word;
		animation: dp-showcase-mobile-card-in .5s cubic-bezier(.16, 1, .3, 1);
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__item.is-active .dp-showcase__desc {
		margin: 0;
		font-size: 14px;
		line-height: 1.5;
		text-align: left;
		white-space: normal;
		overflow-wrap: anywhere;
		word-break: break-word;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__item.is-active .dp-showcase__variants {
		justify-content: flex-start;
		margin-top: 12px;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__variants--three {
		flex-wrap: nowrap;
		gap: clamp(4px, 1.5vw, 8px);
		width: 100%;
	}
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__variants--three > .dp-showcase__variant {
		flex: 1 1 0;
		justify-content: center;
		min-width: 0;
		padding: 8px clamp(5px, 2vw, 10px);
		gap: 4px;
		font-size: clamp(11px, 3.2vw, 14px);
		white-space: nowrap;
	}
}

@keyframes dp-showcase-mobile-card-in {
	from { opacity: 0; transform: translate3d(0, 6px, 0); }
	to { opacity: 1; transform: translate3d(0, 0, 0); }
}
@media (prefers-reduced-motion: reduce) {
	#dedicated-product .dp-showcase__layout.is-engaged .dp-showcase__item.is-active .dp-showcase__body {
		animation: none;
	}
}

@media (min-width: 48.0625rem) {
	#dedicated-product .dp-subnav__brand {
		display: inline-flex !important;
	}
	#dedicated-product .dp-subnav__brand-text {
		display: inline-block !important;
		visibility: visible !important;
		opacity: 1 !important;
	}
	#dedicated-product .dp-subnav__mobile-label {
		display: none !important;
	}
}

/* ==========================================================================
   Injected info-card sections — Location Consideration / Choosing Games /
   Accessories. Rendered below the Showcase. Glass icon cards (Location +
   Games) and Apple-style image cards (Accessories), all on the page grey
   surface with the brand crimson accent.
   ========================================================================== */
#dedicated-product .dp-infocards {
	background: var(--dp-surface);
	padding: clamp(56px, 8vw, 112px) 0;
}
#dedicated-product .dp-infocards--locations .dp-container {
	max-width: var(--dp-baseline-max);
}
#dedicated-product .dp-infocards__header {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: clamp(28px, 4vw, 56px);
}
#dedicated-product .dp-infocards__intro { max-width: 48rem; }
#dedicated-product .dp-infocards__eyebrow {
	display: block;
	margin-bottom: 12px;
	font-size: 12px;
	font-weight: 600;
	line-height: 1;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: #D90500;
}
#dedicated-product .dp-infocards__title {
	margin: 0;
	font-size: clamp(28px, 4vw, 48px);
	font-weight: 700;
	line-height: 1.15;
	letter-spacing: -0.01em;
}
/* `a.` + `.dp-page` raises specificity above `#dedicated-product.dp-page a
   { color: inherit }`, which would otherwise force these links white. */
#dedicated-product.dp-page a.dp-infocards__headlink {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	color: #D90500;
	font-weight: 600;
	text-decoration: none;
	white-space: nowrap;
}
#dedicated-product.dp-page a.dp-infocards__headlink:hover { text-decoration: underline; }
#dedicated-product .dp-infocards__chevron { font-size: 1.1em; line-height: 1; }

#dedicated-product .dp-infocards__grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
	gap: var(--dp-gutter);
}
#dedicated-product .dp-infocard {
	display: flex;
	flex-direction: column;
	height: 100%;
	transition: transform .4s ease;
}
#dedicated-product .dp-infocard:hover { transform: translateY(-4px); }

/* Glass icon card (Location / Games) */
#dedicated-product .dp-infocard--icon {
	padding: clamp(28px, 3vw, 48px);
	background: linear-gradient(180deg, rgba(255,255,255,0.06) 0%, rgba(255,255,255,0.03) 100%);
	border: 1px solid var(--dp-border);
	border-radius: 28px;
	backdrop-filter: blur(40px);
}
#dedicated-product .dp-infocard__icon {
	width: 42px;
	height: 42px;
	margin-bottom: 24px;
	color: var(--dp-text);
}
#dedicated-product .dp-infocard__icon svg { width: 100%; height: 100%; }

/* Apple-style image card (Accessories) */
#dedicated-product .dp-infocard__media {
	aspect-ratio: 0.73;
	overflow: hidden;
	border-radius: 24px;
	background: #0e0e0e;
	margin-bottom: 20px;
}
#dedicated-product .dp-infocard__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform .6s ease;
}
#dedicated-product .dp-infocard--image:hover .dp-infocard__media img { transform: scale(1.04); }
#dedicated-product .dp-infocard--image .dp-infocard__body { padding: 0 4px; }

#dedicated-product .dp-infocard__title {
	margin: 0 0 12px;
	font-size: clamp(18px, 1.6vw, 22px);
	font-weight: 600;
	line-height: 1.3;
}
#dedicated-product .dp-infocard__text {
	margin: 0;
	font-size: 14px;
	line-height: 1.6;
	color: var(--dp-text-soft);
}
#dedicated-product.dp-page a.dp-infocard__link {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	margin-top: 24px;
	color: #D90500;
	font-weight: 600;
	text-decoration: none;
}
#dedicated-product.dp-page a.dp-infocard__link:hover { text-decoration: underline; }

#dedicated-product .dp-infocards__carousel-shell { display: block; }
#dedicated-product .dp-infocards--accessories .dp-infocard {
	border-radius: 24px;
}
#dedicated-product .dp-infocards--accessories .dp-infocard:hover {
	transform: none;
}
#dedicated-product .dp-infocards--accessories .dp-infocard__media {
	margin-bottom: 16px;
	border-radius: 24px;
}
#dedicated-product .dp-infocards--accessories .dp-infocard__media img {
	transition: none;
}
#dedicated-product .dp-infocards--accessories .dp-infocard--image:hover .dp-infocard__media img {
	transform: none;
}
#dedicated-product .dp-infocards--accessories .dp-infocard__body {
	display: flex;
	flex-direction: column;
	gap: 6px;
	padding: 0;
}
#dedicated-product .dp-infocards--accessories .dp-infocard__title,
#dedicated-product .dp-infocards--accessories .dp-infocard__text {
	font-size: 16px;
	line-height: 1.55;
	text-align: left;
}
#dedicated-product .dp-infocards--accessories .dp-infocard__title {
	margin: 0;
	color: #FFFFFF;
	font-weight: 600;
}
#dedicated-product .dp-infocards--accessories .dp-infocard__text {
	margin: 0;
	color: var(--dp-text-soft);
}
#dedicated-product .dp-infocards--accessories .dp-infocard__link {
	margin-top: 8px;
	align-self: flex-start;
	font-weight: 400;
}

@media (max-width: 600px) {
	#dedicated-product .dp-infocards__header { flex-direction: column; align-items: flex-start; }
}

/* ---- Info-card carousel (shown only when > 3 cards) ---------------------- */
#dedicated-product .dp-infocards--carousel .dp-infocards__grid {
	display: flex;
	grid-template-columns: none;
	gap: var(--dp-gutter);
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scroll-behavior: smooth;
	scrollbar-width: none;                 /* Firefox */
	-ms-overflow-style: none;              /* IE/Edge */
	/* room so card hover-lift + focus ring aren't clipped by overflow */
	padding-bottom: 4px;
}
#dedicated-product .dp-infocards--carousel .dp-infocards__grid::-webkit-scrollbar { display: none; }
#dedicated-product .dp-infocards--carousel .dp-infocards__grid:focus-visible { outline: 2px solid var(--dp-text); outline-offset: 4px; }
#dedicated-product .dp-infocards--carousel .dp-infocard {
	flex: 0 0 calc((100% - 2 * var(--dp-gutter)) / 3);  /* 3 per view on desktop */
	scroll-snap-align: start;
}
#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocards__carousel-shell {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: var(--dp-gutter);
	align-items: start;
	overflow: hidden;
}
#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocards__grid {
	grid-column: 1 / -1;
}
#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocards__grid.is-looping {
	overflow: visible;
	scroll-behavior: auto;
	scroll-snap-type: none;
	padding-bottom: 0;
	touch-action: pan-y;
	will-change: transform;
}
#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocards__grid.is-looping:focus-visible {
	outline: none;
}
@media (max-width: 900px) {
	#dedicated-product .dp-infocards--carousel .dp-infocard { flex-basis: calc((100% - var(--dp-gutter)) / 2); }
	#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocards__carousel-shell {
		display: block;
	}
}
@media (max-width: 600px) {
	#dedicated-product .dp-infocards--carousel .dp-infocard { flex-basis: 82%; }
}

#dedicated-product .dp-infocards__nav {
	display: flex;
	gap: 12px;
	margin-top: 28px;          /* below the carousel, lower-left */
	justify-content: flex-start;
}
#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocards__nav {
	grid-column: 3;
	margin-top: 6px;
	justify-content: flex-end;
}
#dedicated-product .dp-infocards__navbtn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border: 0;
	border-radius: 50%;
	background: rgba(255,255,255,0.10);
	color: #fff;
	cursor: pointer;
	transition: background .2s ease, opacity .2s ease;
}
#dedicated-product .dp-infocards--accessories .dp-infocards__navbtn {
	width: 54px;
	height: 54px;
}
#dedicated-product .dp-infocards--accessories .dp-infocards__navbtn svg {
	width: 34px;
	height: 34px;
}
#dedicated-product .dp-infocards__navbtn:hover { background: rgba(255,255,255,0.20); }
#dedicated-product .dp-infocards__navbtn:disabled { opacity: 0.35; cursor: default; }
#dedicated-product .dp-infocards__navbtn:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
/* If the track isn't actually overflowing (few cards on a wide screen), JS
   adds this to hide the controls — mirrors Apple's responsive behaviour. */
#dedicated-product .dp-infocards__nav.is-hidden { display: none; }

/* One boundary-state contract for every product carousel. State remains owned
   by each controller; this rule only standardizes its visible affordance. */
#dedicated-product :is(
	.exa-slider__inline-nav,
	.exa-slider__nav-btn,
	.dp-showcase__nav-btn,
	.dp-infocards__navbtn,
	.dp-location__nav,
	.dp-stage__nav
):is(:disabled, [aria-disabled="true"], .is-disabled) {
	opacity: 0.35 !important;
	cursor: not-allowed !important;
	pointer-events: none !important;
}

@media (max-width: 768px) {
	#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocards__grid {
		gap: 14px;
		margin-inline: calc(var(--dp-margin) * -1);
		padding-inline: calc(var(--dp-margin) + 7vw);
		scroll-padding-inline: calc(var(--dp-margin) + 7vw);
	}
	#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocards__grid.is-looping {
		margin-inline: 0;
		padding-inline: 0;
		scroll-padding-inline: 0;
	}
	#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocard {
		flex-basis: min(76vw, 320px);
		scroll-snap-align: center;
	}
	#dedicated-product .dp-infocards--accessories .dp-infocard,
	#dedicated-product .dp-infocards--accessories .dp-infocard__media {
		border-radius: 18px;
	}
	#dedicated-product .dp-infocards--accessories.dp-infocards--carousel .dp-infocards__nav {
		justify-content: flex-end;
		margin-top: 14px;
	}
}

/* ==========================================================================
   Dedicated Product EXA carousel transplant
   --------------------------------------------------------------------------
   EXA's section-8 slider CSS ships from assets/css/exa.css. These bridge rules
   restore the few page-level styles EXA normally scopes under `.exa-page` and
   align the block with the dedicated-product spacing system.
   ========================================================================== */
#dedicated-product .dp-exa-carousel {
	background: var(--dp-surface);
	padding: clamp(56px, 8vw, 112px) 0;
}
#dedicated-product .dp-exa-carousel .exa-carousel__heading {
	margin-bottom: 1rem;
}
#dedicated-product p.exa-carousel__subtitle {
	display: block;
	text-align: center;
	font-family: 'Montserrat-Regular', Helvetica, Arial, sans-serif;
	font-size: clamp(0.9375rem, 1.2vw + 0.4rem, 1.125rem);
	color: rgba(255,255,255,0.7);
	line-height: 1.6;
	max-width: 40rem;
	margin: 0 auto 1.25rem;
	padding: 0 1.25rem;
}
#dedicated-product .dp-exa-carousel .exa-slider {
	max-width: min(80rem, calc(100vw - (var(--dp-margin) * 2)));
}
#dedicated-product .dp-exa-carousel .exa-slider__caption {
	font-size: clamp(0.8rem, 0.45vw + 0.7rem, 0.95rem);
}

/* =======================================================================
   Sticky sub-navigation
   Docks flush beneath the fixed masthead once the visitor scrolls past the
   hero. The page root is z-index:0 / isolate (see top of file), so this fixed
   bar can never paint over the masthead no matter how high its z-index — that
   z-index only orders it *within* the page.

   Depth is the shared secondary-nav token, one step under the site header, so
   an expanded nav dropdown overlays this bar. It used to be 1400 to out-stack a
   z-index:1300 that the old bare `header {…}` selector leaked onto every
   section's semantic <header> (.dp-features__header, .dp-infocards__header, …),
   which made those headings paint over the bar as they scrolled under it. The
   rule is scoped to `.site-header` now (style.css), so the leak — and the need
   to out-stack it — is gone.
   ======================================================================= */
#dedicated-product.dp-page {
	--dp-subnav-h: 52px;
	--dp-subnav-drawer-h: 0px;
}

/* Sections clear both stacked bars when jumped to via anchor. */
#dedicated-product.dp-page [id^="dp-section-"] {
	scroll-margin-top: calc(var(--renewal-main-nav-height, 5.3125rem) + var(--dp-subnav-h) + 8px);
}
@media (prefers-reduced-motion: no-preference) {
	html:has(#dedicated-product.dp-page) { scroll-behavior: smooth; }
}

#dedicated-product .dp-subnav {
	position: fixed;
	top: var(--renewal-main-nav-height, 5.3125rem);
	left: 0;
	right: 0;
	z-index: var(--renewal-secondary-nav-z-index, 1190);
	height: var(--dp-subnav-h);
	/* Semi-transparent frosted bar. Opacity kept high enough that page
	   headings/links scrolling underneath never read through as "overlap"
	   even where backdrop-filter is unsupported; the blur is enhancement. */
	background: rgba(0, 0, 0, 0.82);
	-webkit-backdrop-filter: saturate(160%) blur(18px);
	backdrop-filter: saturate(160%) blur(18px);
	border-bottom: 1px solid var(--dp-glass-hi);
	/* Hidden state: tucked up under the masthead, transparent, inert. */
	transform: translateY(-100%);
	opacity: 0;
	pointer-events: none;
	transition: transform .35s cubic-bezier(.2, .65, .2, 1), opacity .35s ease;
	will-change: transform, opacity;
}
#dedicated-product .dp-subnav.is-visible {
	transform: translateY(0);
	opacity: 1;
	pointer-events: auto;
}
@media (prefers-reduced-motion: reduce) {
	#dedicated-product .dp-subnav { transition: none; }
}

#dedicated-product .dp-subnav__inner {
	max-width: var(--dp-container-max);
	min-height: var(--dp-subnav-h);
	margin: 0 auto;
	padding: 0 var(--dp-margin);
	display: flex;
	align-items: center;
	flex-wrap: nowrap;
	gap: 24px;
}

/* --- Identity (left) --- */
#dedicated-product .dp-subnav__identity {
	display: inline-flex;
	align-items: center;
	flex: 0 0 auto;
	min-width: 0;
	position: relative;
	z-index: 2;
}
#dedicated-product .dp-subnav__brand {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	text-decoration: none;
	flex: 0 0 auto;
	position: relative;
	z-index: 2;
	transition: opacity .2s ease;
}
#dedicated-product .dp-subnav__brand:hover { opacity: .8; }
#dedicated-product .dp-subnav__brand-text {
	color: var(--dp-text);
	font-family: var(--dp-font);
	font-weight: 700;
	font-size: 1.02rem;
	letter-spacing: -0.01em;
	line-height: 1;
	display: inline-block;
	position: relative;
	z-index: 2;
	visibility: visible;
	opacity: 1;
	white-space: nowrap;
}
#dedicated-product .dp-subnav__logo {
	height: 22px;
	width: auto;
}
#dedicated-product .dp-subnav__mobile-label {
	display: none;
}

/* --- Right cluster: desktop drawer + CTA --- */
#dedicated-product .dp-subnav__right {
	display: flex;
	align-items: center;
	gap: 12px;
	flex: 0 0 auto;
	margin-left: auto;
}
#dedicated-product .dp-subnav__toggle {
	display: none;
}
#dedicated-product .dp-subnav__drawer {
	display: flex;
	align-items: stretch;
	order: 2;
	flex: 1 1 auto;
	min-width: 0;
}
#dedicated-product .dp-subnav__right {
	order: 3;
}
#dedicated-product .dp-subnav__links {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: flex-end;
	gap: clamp(14px, 2vw, 32px);
	min-height: var(--dp-subnav-h);
	min-width: 0;
	flex: 1 1 auto;
	overflow-x: auto;
	scrollbar-width: none;
	-ms-overflow-style: none;
	scroll-snap-type: x proximity;
}
#dedicated-product .dp-subnav__links::-webkit-scrollbar { display: none; }
/* `a.` + `.dp-page` raises specificity above `#dedicated-product.dp-page a`
   (color: inherit), which would otherwise force the links to the page's white.
   Resting state is the reference grey; active/hover go white. */
#dedicated-product.dp-page a.dp-subnav__link {
	display: inline-flex;
	align-items: center;
	height: 100%;
	flex: 0 0 auto;
	scroll-snap-align: start;
	color: var(--dp-text-soft);
	font-family: var(--dp-font);
	font-weight: 600;
	font-size: 0.82rem;
	letter-spacing: 0.02em;
	white-space: nowrap;
	text-decoration: none;
	transition: color .2s ease;
}
#dedicated-product.dp-page a.dp-subnav__link:hover,
#dedicated-product.dp-page a.dp-subnav__link[data-active="true"] {
	color: var(--dp-text);
}
#dedicated-product .dp-subnav__indicator {
	position: absolute;
	bottom: -1px;
	left: 0;
	width: 0;
	height: 2px;
	background: var(--dp-text);
	opacity: 0;
	pointer-events: none;
	transition: left .3s ease, width .3s ease, opacity .2s ease;
}
@media (prefers-reduced-motion: reduce) {
	#dedicated-product .dp-subnav__indicator { transition: none; }
}

/* --- Action button (right) --- */
#dedicated-product.dp-page a.dp-subnav__cta {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: 7px 13px;
	border: var(--renewal-cta-border-width-compact, 2px) solid transparent;
	border-radius: 6px;
	background: var(--dp-accent);
	color: #fff;
	font-family: var(--dp-font);
	font-weight: 600;
	font-size: 0.8rem;
	letter-spacing: 0.02em;
	line-height: 1.2;
	text-decoration: none;
	white-space: nowrap;
	transition: background .2s ease, color .2s ease, border-color .2s ease;
}
#dedicated-product .dp-subnav__cta-label {
	display: block;
	line-height: 1.2;
}
#dedicated-product.dp-page a.dp-subnav__cta:hover {
	background: #fff;
	color: var(--dp-accent);
	border-color: var(--dp-accent);
}
.dp-subnav__veil {
	display: none;
}

/* --- Mobile: sticky row, accordion drawer, frosted isolation veil --- */
@media (max-width: 48rem) {
	#dedicated-product.dp-page { --dp-subnav-h: 56px; }
	#dedicated-product .dp-subnav {
		background: #030303;
		-webkit-backdrop-filter: none;
		backdrop-filter: none;
		border-bottom: 1px solid rgba(217, 217, 217, 0.72);
	}
	#dedicated-product .dp-subnav.is-mobile-open {
		border-bottom-color: transparent;
	}
	#dedicated-product .dp-subnav__inner {
		max-width: none;
		padding: 0 20px;
		position: relative;
		flex-wrap: wrap;
		align-items: stretch;
		gap: 0 10px;
	}
	#dedicated-product .dp-subnav__identity {
		flex: 1 1 auto;
		min-width: 0;
		min-height: var(--dp-subnav-h);
	}
	#dedicated-product .dp-subnav__brand {
		display: none;
	}
	#dedicated-product .dp-subnav__mobile-label {
		display: inline-flex;
		align-items: center;
		min-width: 0;
		color: var(--dp-text);
		font-family: var(--dp-font);
		font-size: 0.9rem;
		font-weight: 600;
		letter-spacing: -0.01em;
		line-height: 1.2;
		white-space: nowrap;
		overflow: hidden;
		text-overflow: ellipsis;
	}
	#dedicated-product .dp-subnav__drawer {
		position: absolute;
		top: 100%;
		left: 0;
		right: 0;
		display: block;
		width: 100%;
		box-sizing: border-box;
		padding: 0 20px;
		max-height: 0;
		opacity: 0;
		overflow: hidden;
		transform: translate3d(0, -10px, 0);
		pointer-events: none;
		z-index: 1;
		background: #030303;
		transition: max-height .34s cubic-bezier(.2, .65, .2, 1),
		            opacity .2s ease,
		            transform .34s cubic-bezier(.2, .65, .2, 1);
		will-change: max-height, opacity, transform;
	}
	#dedicated-product .dp-subnav.is-mobile-open .dp-subnav__drawer {
		max-height: min(var(--dp-subnav-drawer-h), calc(100dvh - var(--renewal-main-nav-height, 5.3125rem) - var(--dp-subnav-h) - 12px));
		opacity: 1;
		/* Settles to `none`, not translate3d(0,0,0): an identity transform still
		   promotes the card to a composited layer, and every image inside it is
		   then GPU-resampled with a fast bilinear filter — the same downscale
		   fault that was fixed on the images themselves. `none` releases the
		   layer once the entrance has played. */
		transform: none;
		pointer-events: auto;
	}
	#dedicated-product .dp-subnav__links {
		min-height: 0;
		max-height: calc(100dvh - var(--renewal-main-nav-height, 5.3125rem) - var(--dp-subnav-h) - 12px);
		padding: 8px 0;
		flex-direction: column;
		align-items: stretch;
		justify-content: flex-start;
		gap: 0;
		overflow-x: hidden;
		overflow-y: auto;
		-webkit-overflow-scrolling: touch;
		scroll-snap-type: none;
		-webkit-mask-image: none;
		mask-image: none;
	}
	#dedicated-product.dp-page a.dp-subnav__link {
		height: auto;
		display: flex;
		align-items: center;
		padding: 7px 0;
		font-size: 0.82rem;
		line-height: 1.35;
		white-space: normal;
	}
	#dedicated-product.dp-page a.dp-subnav__link::before {
		content: '';
		flex: 0 0 auto;
		width: 1px;
		height: 1.05rem;
		margin-right: 12px;
		background: transparent;
		transition: background-color .2s ease;
	}
	#dedicated-product.dp-page a.dp-subnav__link:hover::before,
	#dedicated-product.dp-page a.dp-subnav__link[data-active="true"]::before,
	#dedicated-product.dp-page a.dp-subnav__link:focus-visible::before,
	#dedicated-product.dp-page a.dp-subnav__link:active::before {
		background: rgba(255, 255, 255, 0.96);
	}
	.dp-subnav__links.is-mobile-floating {
		display: flex;
		flex-direction: column;
		align-items: stretch;
		justify-content: flex-start;
		gap: 0;
		width: 100%;
		min-height: 0;
		padding: 4px 20px 12px;
		box-sizing: border-box;
		background: #030303;
		border-bottom: 1px solid rgba(217, 217, 217, 0.72);
		overflow-x: hidden;
		overflow-y: auto;
		scroll-snap-type: none;
		-webkit-overflow-scrolling: touch;
		-webkit-mask-image: none;
		mask-image: none;
	}
	.dp-subnav__links.is-mobile-floating .dp-subnav__indicator {
		display: none;
	}
	.dp-subnav__links.is-mobile-floating a.dp-subnav__link {
		display: flex;
		align-items: center;
		height: auto;
		padding: 6px 0;
		color: var(--dp-text-soft, #c4c7c8);
		font-family: var(--dp-font, 'Montserrat', 'Helvetica Neue', Arial, sans-serif);
		font-size: 0.82rem;
		font-weight: 600;
		letter-spacing: 0.02em;
		line-height: 1.35;
		text-decoration: none;
		white-space: normal;
	}
	.dp-subnav__links.is-mobile-floating a.dp-subnav__link:hover,
	.dp-subnav__links.is-mobile-floating a.dp-subnav__link[data-active="true"] {
		color: var(--dp-text, #ffffff);
	}
	.dp-subnav__links.is-mobile-floating a.dp-subnav__link::before {
		content: '';
		flex: 0 0 auto;
		width: 1px;
		height: 1.05rem;
		margin-right: 12px;
		background: transparent;
		transition: background-color .2s ease;
	}
	.dp-subnav__links.is-mobile-floating a.dp-subnav__link:hover::before,
	.dp-subnav__links.is-mobile-floating a.dp-subnav__link[data-active="true"]::before,
	.dp-subnav__links.is-mobile-floating a.dp-subnav__link:focus-visible::before,
	.dp-subnav__links.is-mobile-floating a.dp-subnav__link:active::before {
		background: rgba(255, 255, 255, 0.96);
	}
	#dedicated-product .dp-subnav__indicator {
		display: none;
	}
	#dedicated-product .dp-subnav__right {
		order: 2;
		gap: 10px;
		min-height: var(--dp-subnav-h);
		margin-left: auto;
	}
	#dedicated-product.dp-page a.dp-subnav__cta {
		border-radius: 8px;
	}
	#dedicated-product .dp-subnav__toggle {
		display: inline-flex;
		align-items: center;
		justify-content: center;
		width: 34px;
		height: 34px;
		margin: auto 0;
		padding: 0;
		border: 0;
		background: transparent;
		border-radius: 999px;
		cursor: pointer;
		-webkit-appearance: none;
		appearance: none;
	}
	#dedicated-product .dp-subnav__toggle-icon {
		display: block;
		width: 10px;
		height: 10px;
		border-right: 1.5px solid rgba(255, 255, 255, 0.9);
		border-bottom: 1.5px solid rgba(255, 255, 255, 0.9);
		transform: translateY(-2px) rotate(45deg);
		transform-origin: center;
		transition: transform .25s ease, border-color .2s ease;
	}
	#dedicated-product .dp-subnav.is-mobile-open .dp-subnav__toggle-icon {
		transform: translateY(2px) rotate(-135deg);
	}
	.dp-subnav__veil {
		display: block;
		position: fixed;
		left: 0;
		right: 0;
		bottom: 0;
		top: var(--dp-subnav-veil-top, calc(var(--renewal-main-nav-height, 5.3125rem) + var(--dp-subnav-h)));
		z-index: 1399;
		opacity: 0;
		pointer-events: none;
		background: rgba(3, 3, 3, 0.22);
		backdrop-filter: blur(14px) brightness(60%);
		-webkit-backdrop-filter: blur(14px) brightness(60%);
		transition: opacity .22s ease;
	}
	.dp-subnav__veil.is-active {
		opacity: 1;
		pointer-events: auto;
	}
	body.renewal-dp-subnav-open {
		overflow: hidden;
	}
}


/* ------------------------------------------------------------------ *
 * 10. Choosing Games — auto-scrolling marquee carousel (ARC-32 only)
 * ------------------------------------------------------------------ */
#dedicated-product .dp-gcar {
	position: relative;
	background: var(--dp-surface);
	color: var(--dp-text);
	padding: var(--dp-section-gap) 0;
	overflow: hidden;
}
#dedicated-product .dp-gcar__baseline {
	width: 100%;
	max-width: var(--dp-baseline-max);
	margin: 0 auto;
	padding: 0 var(--dp-margin);
}
#dedicated-product .dp-gcar__header {
	width: 100%;
	margin: 0 auto clamp(32px, 5vw, 56px);
	text-align: left;
}
#dedicated-product .dp-gcar__eyebrow {
	display: block;
	margin-bottom: 10px;
	color: var(--dp-accent);
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.3em;
	text-transform: uppercase;
}
#dedicated-product .dp-gcar__title {
	margin: 0;
	font-size: clamp(28px, 4vw, 44px);
	font-weight: 700;
	line-height: 1.12;
	letter-spacing: -0.01em;
	color: #fff;
	/* was centered while its own .dp-gcar__header parent is left-aligned,
	   which read as an unintentional outdent against the eyebrow above it. */
	text-align: left;
}
#dedicated-product .dp-gcar__deck {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: clamp(20px, 3vw, 40px);
	margin-top: clamp(28px, 4vw, 44px);
	padding-top: 0;
	text-align: left;
}
#dedicated-product .dp-gcar__col {
	display: flex;
	flex-direction: column;
	gap: 16px;
	padding: clamp(22px, 2.4vw, 28px);
	/* the 3 intro deck columns carry the Features 2 glass card container
	   (shared token background / border / radius + frost). */
	border: var(--dp-card-border, 1px solid var(--dp-border));
	border-radius: var(--dp-card-radius, 28px);
	background: var(--dp-card-bg, linear-gradient(180deg, rgba(255,255,255,0.08) 0%, rgba(255,255,255,0.03) 100%));
	-webkit-backdrop-filter: blur(40px);
	backdrop-filter: blur(40px);
}
#dedicated-product .dp-gcar__col-title {
	margin: 0;
	font-size: 1.25rem;
	font-weight: 600;
	letter-spacing: -0.01em;
	color: #fff;
}
#dedicated-product .dp-gcar__col-body {
	margin: 0;
	font-size: 1rem;
	line-height: 1.6;
	color: var(--dp-text-soft);
}

#dedicated-product .dp-gcar__rows {
	display: flex;
	flex-direction: column;
	gap: 18px;
}
/* The moving rows bleed to the viewport; the header and footer controls stay
   on .dp-gcar__baseline and therefore remain aligned to the content column. */
#dedicated-product .dp-gcar__rows-shell {
	width: 100%;
	max-width: none;
	margin-inline: 0;
}
#dedicated-product .dp-gcar__row {
	position: relative;
	width: 100%;
	overflow: hidden;
	cursor: grab;
	touch-action: pan-y pinch-zoom;
	user-select: none;
}
#dedicated-product .dp-gcar__row.is-dragging { cursor: grabbing; }
#dedicated-product .dp-gcar__row.is-paused .dp-gcar__card::after {
	content: "";
	position: absolute;
	inset: 0;
	border: 1px solid rgba(255,255,255,0.16);
	border-radius: inherit;
	pointer-events: none;
}
#dedicated-product .dp-gcar__track {
	display: flex;
	align-items: stretch;
	width: max-content;
	will-change: transform;
	transform: translate3d(0, 0, 0);
	backface-visibility: hidden;
	contain: layout paint style;
	animation-duration: var(--gcar-duration, 60s);
	animation-timing-function: linear;
	animation-iteration-count: infinite;
	animation-play-state: paused;
}
#dedicated-product .dp-gcar__track--left  { animation-name: dp-gcar-loop; }
#dedicated-product .dp-gcar__track--right {
	animation-name: dp-gcar-loop;
	animation-direction: reverse;
}
#dedicated-product .dp-gcar__track--fast  { animation-duration: calc(var(--gcar-duration, 60s) * 0.72); }
@keyframes dp-gcar-loop {
	from { transform: translate3d(0, 0, 0); }
	to   { transform: translate3d(-50%, 0, 0); }
}
#dedicated-product .dp-gcar.is-active.is-motion-ready .dp-gcar__track { animation-play-state: running; }
#dedicated-product .dp-gcar.is-manually-paused .dp-gcar__track { animation-play-state: paused; }
#dedicated-product .dp-gcar__row.is-paused .dp-gcar__track { animation-play-state: paused; }
/* Same weight as the .is-active.is-motion-ready "running" rule above plus one
   class, so the JS-driven pause actually wins. Without this, .is-paused (1,3,0)
   lost to the running rule (1,4,0): the row got the class and the card showed
   its CTA, but the lane kept scrolling. Desktop hid the bug because the :hover
   rule below is (1,5,0) and outranked it — touch devices, which never match
   :hover, got the CTA with a still-moving lane. */
#dedicated-product .dp-gcar.is-active.is-motion-ready .dp-gcar__row.is-paused .dp-gcar__track {
	animation-play-state: paused;
}
@media (hover: hover) and (pointer: fine) {
	#dedicated-product .dp-gcar.is-active.is-motion-ready .dp-gcar__row:hover .dp-gcar__track {
		animation-play-state: paused;
	}
}

#dedicated-product .dp-gcar__card {
	position: relative;
	flex: 0 0 280px;
	width: 280px;
	min-width: 280px;
	max-width: 280px;
	aspect-ratio: 16 / 9;
	margin: 0 12px 0 0;
	border-radius: var(--dp-unit);
	overflow: hidden;
	background: var(--dp-surface-2);
}
#dedicated-product .dp-gcar__media-slot {
	display: block;
	width: 100%;
	height: 100%;
	background: linear-gradient(135deg, rgba(255,255,255,.055), rgba(255,255,255,.018));
	contain: layout paint;
}
#dedicated-product .dp-gcar__media {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transform: translateZ(0);
	backface-visibility: hidden;
	-webkit-backface-visibility: hidden;
	image-rendering: auto;
	opacity: 0;
	transition: opacity .28s ease;
}
#dedicated-product .dp-gcar__media-slot.is-loaded .dp-gcar__media {
	opacity: 1;
}

#dedicated-product .dp-gcar__caption {
	position: absolute;
	/* anchored to BOTH edges. Previously only `right: 0` was set, so a
	   long title had no left bound and grew leftward past the card edge — the
	   "leaking outside the container" symptom. max-width keeps the badge inside
	   the 280px card, and the nowrap/ellipsis trio holds it to a single row. */
	left: 0;
	right: 0;
	bottom: 0;
	max-width: 100%;
	box-sizing: border-box;
	padding: 4px 12px;
	background: rgba(0, 0, 0, 0.6);
	border-top-left-radius: var(--dp-unit);
	color: #fff;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: 0.05em;
	text-transform: uppercase;
	/* Absolute single-row constraint. Applies to JA multi-byte titles too:
	   ellipsis truncates cleanly rather than clipping a glyph mid-form. */
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	text-align: right;
}
/* ---- Choosing Games: exAclusive brand mark + shine ----
   Gradient sweep ported from .exa-aboutus__slogan in css/exa-aboutus.css
   (the "Slogan Image URL (centered)" component). Renamed to avoid colliding
   with that page's keyframes, and driven by the existing dp-reveal observer
   rather than a second IntersectionObserver. */
#dedicated-product .dp-gcar__brand {
	display: flex;
	justify-content: center;
	margin: 0 0 clamp(8px, 1.2vw, 14px);
}
#dedicated-product .dp-gcar__brand-shine {
	position: relative;
	display: inline-block;
	overflow: hidden;
	line-height: 0;
}
#dedicated-product .dp-gcar__brand-logo {
	display: block;
	width: auto;
	height: clamp(26px, 3.2vw, 42px);
	max-width: 100%;
	object-fit: contain;
	position: relative;
}
#dedicated-product .dp-gcar__brand-shine::after {
	content: '';
	position: absolute;
	top: 0;
	left: -100%;
	width: 60%;
	height: 100%;
	background: linear-gradient(
		90deg,
		transparent 0%,
		rgba(255, 255, 255, 0.08) 40%,
		rgba(255, 255, 255, 0.18) 50%,
		rgba(255, 255, 255, 0.08) 60%,
		transparent 100%
	);
	transform: skewX(-20deg);
	pointer-events: none;
	z-index: 1;
}
#dedicated-product .dp-gcar__motion-group.is-in-view .dp-gcar__brand-shine::after {
	animation: dp-gcar-brand-shine 1.2s ease-out forwards;
}

/* Deliberate reveal cadence: informational cards first, exAclusive brand as
   its own beat, then the multiline marquee. Delays apply only on entry so
   reverse-scroll fade-out remains immediate and independent. */
@media (prefers-reduced-motion: no-preference) {
	#dedicated-product.dp-page--arc32 .dp-gcar__col:nth-child(1).is-in-view { transition-delay: .08s; }
	#dedicated-product.dp-page--arc32 .dp-gcar__col:nth-child(2).is-in-view { transition-delay: .18s; }
	#dedicated-product.dp-page--arc32 .dp-gcar__col:nth-child(3).is-in-view { transition-delay: .28s; }
	#dedicated-product.dp-page--arc32 .dp-gcar__motion-group.is-in-view { transition-delay: .52s; }
	#dedicated-product.dp-page--arc32 .dp-gcar__motion-group.is-in-view .dp-gcar__brand-shine::after {
		animation-delay: .72s;
	}
}

#dedicated-product.dp-page--arc32 .dp-gcar__brand-logo {
	height: clamp(30px, 3.8vw, 50px);
}
@keyframes dp-gcar-brand-shine {
	0%   { left: -100%; }
	100% { left: 150%; }
}
@media (prefers-reduced-motion: reduce) {
	#dedicated-product .dp-gcar__motion-group.is-in-view .dp-gcar__brand-shine::after {
		animation: none;
	}
}

#dedicated-product .dp-gcar__footer-wrap {
	margin-top: clamp(24px, 3vw, 36px);
}
#dedicated-product .dp-gcar__footer {
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	column-gap: 16px;
	row-gap: 16px;
}
#dedicated-product .dp-gcar__footer-cta.button-red-shadowed {
	display: inline-flex;
	width: auto;
	max-width: min(100%, 22rem);
	box-sizing: border-box;
	align-items: center;
	justify-content: center;
	margin: 0;
	margin-inline: 0;
	margin-bottom: 0;
	border: var(--renewal-cta-border-width, 2px) solid transparent;
	border-radius: var(--renewal-cta-radius);
	padding: 0.85rem 1.6rem;
	font-family: "Montserrat-Bold", Helvetica, Arial, sans-serif;
	font-size: 1.05rem;
	font-weight: 500;
	line-height: 1.2;
	text-align: center;
	text-transform: none;
	white-space: normal;
	grid-column: 2;
	justify-self: center;
	background-color: #D90500;
	color: #fff;
}
#dedicated-product .dp-gcar__footer-cta.button-red-shadowed:hover,
#dedicated-product .dp-gcar__footer-cta.button-red-shadowed:focus-visible,
#dedicated-product .dp-gcar__footer-cta.button-red-shadowed:active {
	background-color: #fff;
	color: #D90500;
	border-color: #D90500;
	text-decoration: none;
}
#dedicated-product .dp-gcar__motion-toggle {
	width: 44px;
	height: 44px;
	padding: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	border: 0;
	border-radius: 999px;
	background: rgba(255, 255, 255, 0.2);
	color: #fff;
	cursor: pointer;
	-webkit-backdrop-filter: blur(20px);
	backdrop-filter: blur(20px);
	transition: background 0.2s ease, opacity 0.3s ease;
	grid-column: 3;
	justify-self: end;
}
#dedicated-product .dp-gcar__motion-toggle:hover,
#dedicated-product .dp-gcar__motion-toggle:focus-visible {
	background: rgba(255, 255, 255, 0.32);
}
#dedicated-product .dp-gcar__motion-toggle .dp-arc32-hero__icon {
	width: 22px;
	height: 22px;
}
#dedicated-product .dp-gcar__motion-toggle .dp-arc32-hero__icon--play {
	display: none;
}
#dedicated-product .dp-gcar__motion-toggle.is-paused .dp-arc32-hero__icon--pause {
	display: none;
}
#dedicated-product .dp-gcar__motion-toggle.is-paused .dp-arc32-hero__icon--play {
	display: block;
}

@supports (-moz-appearance: none) {
	#dedicated-product .dp-gcar__track {
		transform: translateX(0);
		backface-visibility: visible;
		contain: layout style;
	}
	#dedicated-product .dp-gcar__caption {
		transform: translateZ(0);
		backface-visibility: hidden;
		-webkit-backface-visibility: hidden;
		text-rendering: geometricPrecision;
	}
	@keyframes dp-gcar-loop-firefox {
		from { transform: translateX(0); }
		to   { transform: translateX(-50%); }
	}
	#dedicated-product .dp-gcar__track--left,
	#dedicated-product .dp-gcar__track--right {
		animation-name: dp-gcar-loop-firefox;
	}
}

#dedicated-product .dp-gcar__hover {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	background: linear-gradient(to top, rgba(0,0,0,0.76), rgba(0,0,0,0.32));
	opacity: 0;
	transition: opacity .4s ease;
}
#dedicated-product .dp-gcar__card:hover .dp-gcar__hover,
#dedicated-product .dp-gcar__card:focus-within .dp-gcar__hover {
	opacity: 1;
}
/* click-to-select darken is now available on every viewport (parity with
   mobile tap), not just the touch layer below. */
#dedicated-product .dp-gcar__card.is-touch-active .dp-gcar__hover,
#dedicated-product .dp-gcar__card.is-touch-active:focus-within .dp-gcar__hover {
	opacity: 1;
}
#dedicated-product .dp-gcar__cta {
	display: inline-flex;
	align-items: center;
	gap: 0.35em;
	padding: 8px 12px;
	background: var(--dp-accent);
	color: #fff;
	border-radius: 999px;
	font-size: 14px;
	font-weight: 600;
	line-height: 1.15;
	text-decoration: none;
	transition: background-color .24s ease, color .24s ease;
}
#dedicated-product .dp-gcar__cta-label {
	white-space: nowrap;
}
#dedicated-product .dp-gcar__cta-icon {
	width: 1.22em;
	height: 1.22em;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	border-radius: 50%;
	background: #fff;
	color: var(--dp-accent);
}
#dedicated-product .dp-gcar__cta-icon svg {
	display: block;
	width: 0.96em;
	height: 0.96em;
	margin: 0 auto;
	transform: translateX(0.2px);
	vector-effect: non-scaling-stroke;
}
#dedicated-product .dp-gcar__cta:hover,
#dedicated-product .dp-gcar__cta:focus-visible,
#dedicated-product .dp-gcar__cta:active {
	background: #fff;
	color: var(--dp-accent);
}
#dedicated-product .dp-gcar__cta:hover .dp-gcar__cta-icon,
#dedicated-product .dp-gcar__cta:focus-visible .dp-gcar__cta-icon,
#dedicated-product .dp-gcar__cta:active .dp-gcar__cta-icon {
	background: var(--dp-accent);
	color: #fff;
}
#dedicated-product .dp-gcar.is-static .dp-gcar__row {
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	scroll-snap-type: x mandatory;
	cursor: default;
	user-select: auto;
}
#dedicated-product .dp-gcar.is-static .dp-gcar__track {
	transform: none !important;
}
#dedicated-product .dp-gcar.is-static .dp-gcar__card[aria-hidden="true"] {
	display: none;
}
#dedicated-product .dp-gcar.is-static .dp-gcar__card {
	scroll-snap-align: start;
}

@media (max-width: 768px) {
	#dedicated-product .dp-gcar__deck { grid-template-columns: 1fr; gap: 20px; }
	#dedicated-product .dp-gcar__title { font-size: clamp(26px, 7vw, 36px); }
	#dedicated-product .dp-gcar__rows {
		gap: 12px;
	}
	#dedicated-product .dp-gcar__row {
		cursor: default;
	}
	#dedicated-product .dp-gcar__track {
		animation-duration: var(--gcar-duration-mobile, var(--gcar-duration, 60s));
	}
	#dedicated-product .dp-gcar__track--fast {
		animation-duration: calc(var(--gcar-duration-mobile, var(--gcar-duration, 60s)) * 0.72);
	}
	#dedicated-product .dp-gcar__card {
		width: 260px;
		min-width: 260px;
		max-width: 260px;
		flex-basis: 260px;
		aspect-ratio: 16 / 9;
	}
	#dedicated-product .dp-gcar__caption {
		display: none;
	}
	#dedicated-product .dp-gcar__hover {
		opacity: 0;
		background: linear-gradient(to top, rgba(0,0,0,0.72), rgba(0,0,0,0.2));
		align-items: center;
		justify-content: center;
		padding: 0;
	}
	#dedicated-product .dp-gcar__card.is-touch-active .dp-gcar__hover,
	#dedicated-product .dp-gcar__card.is-touch-active:focus-within .dp-gcar__hover {
		opacity: 1;
	}
	#dedicated-product .dp-gcar__cta {
		display: none;
	}
	/* ARC-32 mobile cards can still report :hover on stylus, trackpad, and
	 * browser-emulated touch viewports. Keep the CTA in the same revealed
	 * state as the overlay instead of leaving an empty darkened card. */
	#dedicated-product.dp-page--arc32 .dp-gcar__card:hover .dp-gcar__cta,
	#dedicated-product.dp-page--arc32 .dp-gcar__card:focus-within .dp-gcar__cta,
	#dedicated-product .dp-gcar__card.is-touch-active .dp-gcar__cta,
	#dedicated-product .dp-gcar__card.is-touch-active:focus-within .dp-gcar__cta {
		display: inline-flex;
	}
	/* One row: the "See all games" CTA centred, the play/pause toggle pinned to
	 * the right edge. */
	#dedicated-product .dp-gcar__footer {
		position: relative;
		display: flex;
		flex-direction: row;
		flex-wrap: nowrap;
		align-items: center;
		justify-content: center;
		gap: 12px;
	}
	#dedicated-product .dp-gcar__footer-cta.button-red-shadowed {
		width: auto;
		max-width: none;
		flex: 0 0 auto;
		min-width: 200px;          /* slightly wider CTA */
		padding-inline: 28px;
	}
	#dedicated-product .dp-gcar__motion-toggle {
		position: absolute;
		right: 0;
		flex: 0 0 auto;
		justify-self: auto;
	}
}

@media (prefers-reduced-motion: reduce) {
	#dedicated-product .dp-gcar__track { animation: none; }
	#dedicated-product .dp-gcar__row { overflow-x: auto; -webkit-overflow-scrolling: touch; }
	#dedicated-product .dp-gcar__track { transform: none !important; }
	#dedicated-product .dp-gcar__card[aria-hidden="true"] { display: none; }
	#dedicated-product .dp-gcar__card { transition: none; }
}

/* =========================================================================
   Showcase — Apple-style segmented "view tabs"
   The pill control renders only when the admin defines 2+ tabs. Heading
   centering is scoped to that case (:has) so tab-less showcases keep their
   original left-aligned layout untouched.
   ========================================================================= */
#dedicated-product .dp-showcase__title:has(+ .dp-showcase__tabs) {
	text-align: center;
	margin-bottom: clamp(10px, 1.6vw, 18px);
}

#dedicated-product .dp-showcase__tabs {
	position: relative;
	display: flex;
	width: -moz-fit-content;
	width: fit-content;
	max-width: 100%;
	margin: 0 auto clamp(20px, 3vw, 36px);
	padding: 4px;
	/* Frosted glass: translucent so any right-pane media sitting behind the bar
	   shows through, blurred. Falls back to a near-solid tint where backdrop
	   filters aren't supported. */
	background: rgba(28, 28, 31, 0.55);
	-webkit-backdrop-filter: blur(20px) saturate(1.3);
	backdrop-filter: blur(20px) saturate(1.3);
	border: 1px solid var(--dp-border);
	border-radius: 9999px;
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	scrollbar-width: none;
}
#dedicated-product .dp-showcase__tabs::-webkit-scrollbar { display: none; }

#dedicated-product .dp-showcase__tab {
	position: relative;
	z-index: 1;
	flex: 0 0 auto;
	-webkit-appearance: none;
	appearance: none;
	border: 0;
	background: transparent;
	color: var(--dp-muted);
	font-family: var(--dp-font);
	font-size: clamp(13px, 1.4vw, 16px);
	font-weight: 600;
	line-height: 1.2;
	white-space: nowrap;
	padding: 10px 22px;
	border-radius: 9999px;
	cursor: pointer;
	transition: color 0.3s ease;
}
#dedicated-product .dp-showcase__tab:hover { color: var(--dp-text-soft); }
#dedicated-product .dp-showcase__tab.is-active { color: var(--dp-text); }
#dedicated-product .dp-showcase__tab:focus-visible {
	outline: 2px solid var(--dp-accent);
	outline-offset: 2px;
}

/* Sliding background pill. Positioned by JS (width + translateX read from the
   active button's offsets); hardware-accelerated via transform. */
#dedicated-product .dp-showcase__tab-indicator {
	position: absolute;
	top: 4px;
	left: 0;
	width: 0;
	height: calc(100% - 8px);
	background: var(--dp-glass-hi);
	border-radius: 9999px;
	transform: translateX(0);
	transition: transform 0.35s cubic-bezier(0.25, 1, 0.5, 1), width 0.35s cubic-bezier(0.25, 1, 0.5, 1);
	will-change: transform, width;
	pointer-events: none;
	z-index: 0;
}

/* Items filtered out of the active view tab. */
#dedicated-product .dp-showcase__item.is-hidden-by-tab { display: none !important; }

@media (prefers-reduced-motion: reduce) {
	#dedicated-product .dp-showcase__tab-indicator { transition: none; }
}

@media (max-width: 768px) {
	/* Keep the segmented control in ordinary document flow above the dark media
	   block on compact viewports. */
	#dedicated-product.dp-page .dp-showcase:has(.dp-showcase__tabs) {
		margin-top: 0;
	}
	#dedicated-product.dp-page .dp-showcase__title:has(+ .dp-showcase__tabs),
	#dedicated-product.dp-page .dp-showcase__title.dp-reveal:has(+ .dp-showcase__tabs) {
		text-align: center;
		margin-top: 0;
	}
	#dedicated-product .dp-showcase__tabs {
		margin: 0 auto 16px;
		max-width: calc(100% - 2 * var(--dp-margin));
	}
	#dedicated-product .dp-showcase__tab { padding: 8px 16px; }
}

@media (max-width: 768px) {
	/* Keep the right-pane media strictly BEHIND the segmented pills and the
	   showcase item list so it can never swallow taps — even on iOS Safari, where
	   overflow:hidden can fail to clip a transform:scale()d child. The panel gets
	   its own stacking context so its internal media z-indexes can't compete with
	   the sibling pill bar, and the pill bar is lifted above it. The media stays
	   behind at z-index level while the frosted controls (below) sit on top and
	   let it read through, blurred. Scoped to the tabbed showcase (:has) so
	   tab-less pages are unchanged. */
	#dp-section-showcase:has(.dp-showcase__tabs) .dp-showcase__panel { z-index: 0; }
	#dedicated-product .dp-showcase__tabs { position: relative; z-index: 1; }
}

@media (max-width: 768px) {
	/* Showcase item chips (tabbed showcase only): the same solid #29292c grey as
	   the resting chips, chevron and ×/+ controls. Previously these were frosted
	   translucent tints (rgba(31,31,33,.5) resting / rgba(50,50,52,.55) active),
	   which read as a different colour from both the plain chips and the segmented
	   pill AND brightened noticeably on select — the source of the mobile
	   discrepancy. Unified to one opaque grey for cross-viewport parity. */
	#dp-section-showcase:has(.dp-showcase__tabs) .dp-showcase__row-head {
		background: #29292c;
	}
	#dp-section-showcase:has(.dp-showcase__tabs) .dp-showcase__item.is-active .dp-showcase__row-head,
	#dp-section-showcase:has(.dp-showcase__tabs) .dp-showcase__layout.is-engaged .dp-showcase__item.is-active .dp-showcase__body {
		background: #29292c;
	}

	/* Positive spacing prevents the pills and controls from crossing the media
	   block's top boundary. */
	#dp-section-showcase:has(.dp-showcase__tabs) .dp-showcase__tabs {
		margin-bottom: 20px;
	}
	#dp-section-showcase:has(.dp-showcase__tabs) .dp-showcase__controls {
		margin-top: 0;
		position: relative;
		z-index: 3;
	}
}

/* =======================================================================
   ARC-32 template restructuring — scoped to .dp-page--arc32 so the
   master + System dedicated-product templates stay untouched.

   Shared card design tokens are the single source of truth for the glass card
   background transplanted across Features 2, Location Considerations and the
   Games Carousel slides (DRY — no repeated gradient/border literals).
   ======================================================================= */
#dedicated-product.dp-page--arc32 {
	--dp-card-bg:     linear-gradient(180deg, rgba(255,255,255,0.08) 0%, rgba(255,255,255,0.03) 100%);
	--dp-card-border: 1px solid var(--dp-border);
	--dp-card-radius: 28px;
}

/* Route the Features 2 card background (its original literal) through the token
   so the transplant targets below inherit an identical treatment. */
#dedicated-product.dp-page--arc32 .dp-feature__body {
	background: var(--dp-card-bg);
	border: var(--dp-card-border);
	border-radius: var(--dp-card-radius);
}

/* BETA — Features 2 typography inherits the *actual rendered* Location
   Considerations treatment (its ARC-32 "informational columns" block:
   Montserrat header/body, 1.25rem card titles). The header line-height matches
   .dp-infocards__title (1.15). GAMMA itself lives in dedicated-product-arc32.css
   alongside the existing Locations block it transforms. */
#dedicated-product.dp-page--arc32 .dp-features__title { line-height: 1.15; }
#dedicated-product.dp-page--arc32 .dp-feature__title {
	margin: 0;
	font-family: 'Montserrat-Bold', var(--dp-font);
	font-size: 1.25rem;
	font-weight: 600;
	letter-spacing: -0.01em;
	line-height: 1.3;
}
#dedicated-product.dp-page--arc32 .dp-feature__text {
	font-family: 'Montserrat-Regular', var(--dp-font);
	font-size: 1rem;
	line-height: 1.6;
	opacity: 0.75;
}

/* DELTA — remove the black band between Location Considerations and the Games
   Carousel: the base `.exa-carousel { margin-top: 4rem }` exposed the body
   background as a bar between two grey sections. Inherit the uniform surface. */
#dedicated-product.dp-page--arc32 .dp-exa-carousel { margin-top: 0; }

/* 2B — Games Carousel heading matches the Choosing Games / hero header. */
#dedicated-product.dp-page--arc32 .dp-exa-carousel .exa-carousel__heading {
	font-size: clamp(28px, 4vw, 44px);
	font-weight: 700;
	line-height: 1.12;
	letter-spacing: -0.01em;
	color: #fff;
	text-align: center;
}

/* 2C — Games Carousel slides inherit the Features 2 card background token.
   (Media is object-fit:cover, so the glass reads at the slide's edges.) */
#dedicated-product.dp-page--arc32 .dp-exa-carousel .exa-slider__slide {
	background: var(--dp-card-bg);
	border: var(--dp-card-border);
	border-radius: var(--dp-card-radius);
}
