/* ==========================================================================
   Travel Articles — card templates over a standard post type
   ========================================================================== */

.tpo-articles__list {
	display: flex;
	flex-direction: column;
	gap: 24px;
}

.tpo-articles__list--overlay {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
}

/* No overflow:hidden here on purpose: the Box Shadow controls (base + hover)
   paint on this same element, and a shadow is clipped by any overflow the
   element that casts it sets on itself — confirmed live, the shadow was
   cut off flush with the card edge instead of spreading past it. Nothing
   here actually needs the clip: the card's own background/border already
   follow border-radius natively without it, and the image is clipped by
   .tpo-articles__media's own overflow:hidden + radius below. Only the
   Overlay template's full-bleed gradient has no radius of its own, so that
   one modifier class (further down) still sets overflow:hidden itself. */
.tpo-articles__item {
	display: block;
	color: inherit;
	text-decoration: none;
	border-radius: 12px;
}

.tpo-articles__media {
	display: block;
	overflow: hidden;
	background: #f1f1f1;
}

/* !important on width/height: Elementor's own bundled reset ships
   ".elementor img { height: auto; max-width: 100% }" — a *higher-specificity*
   selector (one class + one tag) than a bare ".tpo-articles__img" (one
   class), so without this it silently wins and the image reverts to its
   natural aspect ratio, making object-fit a no-op (the box never differs
   from the image's own rendered size, so there's nothing to crop) — i.e.
   the image can never actually fill its frame. Confirmed live via computed
   styles, not guessed. */
.tpo-articles__img,
.tpo-articles__img--empty {
	display: block;
	width: 100% !important;
	height: 100% !important;
	object-fit: cover;
}

.tpo-articles__body {
	display: block;
	padding: 16px;
}

.tpo-articles__title {
	margin: 0 0 8px;
	font-size: 1.1rem;
	font-weight: 700;
	line-height: 1.35;
	color: #09090b;
}

.tpo-articles__date {
	display: block;
	font-size: 0.8125rem;
	font-weight: 600;
	color: #71717a;
	margin-bottom: 6px;
}

.tpo-articles__excerpt {
	margin: 0 0 12px;
	font-size: 0.9375rem;
	line-height: 1.6;
	color: #71717a;
}

.tpo-articles__button {
	display: inline-block;
	padding: 8px 18px;
	border-radius: 999px;
	background: #1a365d;
	color: #fff;
	font-size: 0.875rem;
	font-weight: 600;
}

.tpo-articles__empty {
	text-align: center;
	color: #718096;
}

/* Slider mode (Display = Slider): reuses Tour Grid's generic .tpo-slider
   Swiper mechanics wholesale (arrows/dots/track sizing already defined
   further down this file) — the only Travel-Articles-specific rule needed
   is making each card fill its .tpo-slide, same as .tpo-slider .tpo-slide
   .tpo-card already does for Tour Grid. */
.tpo-slider .tpo-slide .tpo-articles__item {
	height: 100%;
	width: 100%;
}

/* Template 1: Grid Classic — bordered card, image left (~42%), content
   right (title, excerpt, author byline + share button in the footer) —
   modeled on a reference "article card" design. Multiple articles stack
   as repeated full-width rows (.tpo-articles__list's own flex-column +
   gap already does that), not a multi-column grid.
   Background/border are set entirely by the Style → Card "Card background"
   / "Card border" controls (both scoped to .tpo-articles__item--grid only,
   with Global Color defaults) — no hardcoded fallback needed here since
   those controls always emit a value. The resting box-shadow has no
   matching control (only the hover shadow does — Style → Card Hover), so
   it keeps a plain static fallback. Hover lift/shadow/duration are their
   own dedicated system (Style → Card Hover), independent of the shared
   Hover Effect control the other templates use. */
.tpo-articles__item--grid {
	display: grid;
	grid-template-columns: minmax(0, var(--tpo-articles-media-width, 42%)) 1fr;
	box-shadow: 0 1px 3px rgba(15, 23, 42, 0.06);
}

/* Card Hover (Style → Card Hover) — shared by Templates 1–3. Only the
   motion and the transition live here; each template keeps its own layout
   rules, which is why this is a separate block rather than more properties
   on the grid rule above.
   Templates 2 and 3 also still offer the generic Hover Effect control
   (zoom / grayscale / lift). Its own lift rule is one class more specific
   than this one, so picking an effect there deliberately wins over this
   card lift instead of the two transforms fighting — leaving Hover Effect
   on "None" is what lets this section drive the card. */
.tpo-articles__item--grid,
.tpo-articles__item--list,
.tpo-articles__item--overlay {
	transition: transform var(--tpo-grid-hover-ms, 250ms) ease,
		box-shadow var(--tpo-grid-hover-ms, 250ms) ease,
		border-color var(--tpo-grid-hover-ms, 250ms) ease,
		background-color var(--tpo-grid-hover-ms, 250ms) ease;
}
@media (hover: hover) and (pointer: fine) {
	.tpo-articles__item--grid:hover,
	.tpo-articles__item--list:hover,
	.tpo-articles__item--overlay:hover {
		transform: translateY(calc(-1 * var(--tpo-grid-hover-lift, 6px)));
	}
}
.tpo-articles__item--grid .tpo-articles__media {
	height: var(--tpo-articles-media-height, 100%);
}
.tpo-articles__item--grid .tpo-articles__body {
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: 24px 28px;
	/* Sole spacing mechanism between title/excerpt/footer — title and
	   excerpt's own margin-bottom are zeroed out below so they don't stack
	   with this gap (Style → Card → "Content spacing" controls it). */
	gap: 16px;
}
.tpo-articles__item--grid .tpo-articles__title {
	font-size: 1.25rem;
	margin-bottom: 0;
}
.tpo-articles__item--grid .tpo-articles__excerpt {
	margin-bottom: 0;
}
.tpo-articles__title-link {
	color: inherit;
	text-decoration: none;
}
.tpo-articles__title-link:hover {
	text-decoration: underline;
}
.tpo-articles__footer {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
}
.tpo-articles__author {
	display: flex;
	align-items: center;
	gap: 10px;
	min-width: 0;
}
.tpo-articles__author-avatar {
	width: 36px;
	height: 36px;
	border-radius: 50%;
	object-fit: cover;
	flex-shrink: 0;
}
.tpo-articles__author-info {
	display: flex;
	flex-direction: column;
	line-height: 1.3;
	min-width: 0;
}
.tpo-articles__author-name {
	font-weight: 600;
	font-size: 0.875rem;
	color: #1a202c;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.tpo-articles__footer .tpo-articles__date {
	margin-bottom: 0;
	font-weight: 400;
}
/* border/background/color and their :hover equivalents come entirely from
   the Style → Share Button controls (Global Color defaults) — this element
   only exists in Template 1, so there's no cross-template fallback needed. */
/* border (style/width/color) and border-radius come entirely from the
   Style → Share Button "Border" group control and "Border radius" slider
   (both carry their own defaults) — this element only exists in Template 1,
   so there's no cross-template fallback to preserve here. */
.tpo-articles__share {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	cursor: pointer;
	flex-shrink: 0;
	transition: background-color 150ms ease, color 150ms ease;
}
.tpo-articles__share img {
	display: block;
	object-fit: contain;
}
.tpo-articles__share--copied::after {
	content: 'Copied!';
	position: absolute;
	bottom: 120%;
	right: 0;
	background: #1a202c;
	color: #fff;
	font-size: 0.6875rem;
	padding: 3px 8px;
	border-radius: 4px;
	white-space: nowrap;
}
@media (max-width: 767px) {
	.tpo-articles__item--grid {
		grid-template-columns: 1fr;
	}
	.tpo-articles__item--grid .tpo-articles__media {
		height: var(--tpo-articles-media-height, 220px);
	}
}

/* Template 2: "Blog 7" reference card (shadcnblocks.com) — full-width photo
   on top, title, summary, plain "Read more" text link. No author/date: the
   actual reference card doesn't have one (confirmed against a full
   screenshot of it, not guessed) — Template 1 already covers that byline
   style. Multi-column grid; the "Columns" control's selector targets this
   list class too (see TravelArticlesControls). */
.tpo-articles__list--list {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
}
.tpo-articles__item--list {
	display: flex;
	flex-direction: column;
	background: #fff;
	box-shadow: none;
}
.tpo-articles__item--list .tpo-articles__media {
	width: 100%;
	aspect-ratio: 3 / 2;
	/* --tpo-articles-media-height (Style → Image, unset by default) can
	   override this with a fixed pixel height, same "invalid var() falls
	   back to the initial value" trick used for Template 1/3 — when unset,
	   height resolves to auto and the aspect-ratio above governs instead. */
	height: var(--tpo-articles-media-height);
}
.tpo-articles__item--list .tpo-articles__body {
	display: flex;
	flex-direction: column;
	gap: 12px;
	flex: 1;
	padding: 20px 0 0;
}
.tpo-articles__item--list .tpo-articles__title {
	font-size: 1.25rem;
	/* Zeroed so it doesn't stack with the body's own flex gap (Style →
	   Card → "Content spacing") — same reasoning as Template 1's title. */
	margin-bottom: 0;
}
.tpo-articles__item--list .tpo-articles__excerpt {
	flex: 1;
	margin: 0;
}
/* Color/typography/gap all come from their own Style → "Read More" link
   controls now (literal defaults there reproduce color:#09090b, weight
   600, size 0.9375rem, gap 6px exactly — an Elementor control's own
   selector always wins over a plain class rule like this regardless, so
   nothing here would apply anyway once those controls exist). */
.tpo-articles__read-more {
	display: inline-flex;
	align-items: center;
	/* .tpo-articles__body is a flex column, and its default cross-axis
	   behaviour (align-items: stretch) was quietly stretching this to the
	   card's full width even though it's an inline-flex element — harmless
	   while it was plain text, obvious once a background/radius made it
	   look like a button. flex-start (hug its own content) is the default,
	   overridden by the "Position" control's --tpo-articles-read-more-align
	   once an editor picks something else. */
	align-self: var(--tpo-articles-read-more-align, flex-start);
}
.tpo-articles__read-more-arrow {
	transition: transform 200ms ease;
}
.tpo-articles__item--list:hover .tpo-articles__read-more-arrow {
	transform: translateX(var(--tpo-articles-read-more-shift, 3px));
}
@media (max-width: 767px) {
	.tpo-articles__list--list {
		grid-template-columns: 1fr !important;
	}
}

/* Template 3: Overlay — full-bleed image, gradient, title+date on image. */
.tpo-articles__item--overlay {
	position: relative;
	/* The gradient overlay span has no border-radius of its own (it's a
	   sibling of the media, not nested inside it), so this template alone
	   still needs the clip the base rule above no longer provides. */
	overflow: hidden;
}
.tpo-articles__item--overlay .tpo-articles__media {
	position: relative;
	aspect-ratio: 3 / 4;
	height: var(--tpo-articles-media-height);
}
.tpo-articles__item--overlay .tpo-articles__overlay {
	position: absolute;
	inset: 0;
	display: flex;
	flex-direction: column;
	justify-content: flex-end;
	padding: 20px;
	background: linear-gradient(to top, rgba(0, 0, 0, 0.75) 0%, rgba(0, 0, 0, 0) 55%);
}
.tpo-articles__item--overlay .tpo-articles__title,
.tpo-articles__item--overlay .tpo-articles__date {
	color: #fff;
}

/* Template 4: Minimal Text — no image, plain list with a divider. */
.tpo-articles__item--minimal {
	padding-bottom: 20px;
	border-bottom: 1px solid #e2e8f0;
	border-radius: 0;
}
.tpo-articles__item--minimal:last-child {
	border-bottom: 0;
}

/* Template 5: Compact — small square thumbnail + title/date, dense list. */
.tpo-articles__item--compact {
	display: grid;
	grid-template-columns: 64px 1fr;
	gap: 12px;
	align-items: center;
}
.tpo-articles__item--compact .tpo-articles__media {
	width: var(--tpo-articles-media-size, 64px);
	height: var(--tpo-articles-media-size, 64px);
	border-radius: 8px;
}
.tpo-articles__item--compact .tpo-articles__title {
	margin: 0 0 4px;
	font-size: 0.9375rem;
}
.tpo-articles__item--compact .tpo-articles__date {
	margin: 0;
}

/* Hover Effect (Style tab): each option is a distinct rule set scoped by a
   "tpo-articles__list--hover-{value}" class on the list wrapper (set in
   TravelArticlesWidget::render()) — same pattern as Promo Banners' Hover
   Effect control, for the same reason (the effects genuinely differ in
   which element animates and how). "none" has no rules, so it's a no-op. */
.tpo-articles__img {
	--tpo-articles-ms: 350ms;
	transition: transform var(--tpo-articles-ms) ease, filter var(--tpo-articles-ms) ease;
}

@media (hover: hover) and (pointer: fine) {
	.tpo-articles__list--hover-zoom .tpo-articles__item:hover .tpo-articles__img,
	.tpo-articles__list--hover-zoom-dark .tpo-articles__item:hover .tpo-articles__img {
		transform: scale(var(--tpo-articles-hover-scale, 1.06));
	}

	.tpo-articles__list--hover-zoom-dark .tpo-articles__item .tpo-articles__media {
		position: relative;
	}
	/* Resting state stays hardcoded transparent — it must always start
	   invisible for the fade-in-on-hover to work, so only the hover state's
	   darken color is exposed as a control (Style → Hover). Lift distance
	   and box-shadow are likewise Style → Hover controls now, each with a
	   default matching what used to be hardcoded here, so nothing changes
	   until the user actually adjusts one. */
	.tpo-articles__list--hover-zoom-dark .tpo-articles__item .tpo-articles__media::after {
		content: "";
		position: absolute;
		inset: 0;
		border-radius: inherit;
		background: rgba(0, 0, 0, 0);
		transition: background var(--tpo-articles-ms) ease;
		pointer-events: none;
	}
	.tpo-articles__list--hover-zoom-dark .tpo-articles__item:hover .tpo-articles__media::after {
		background: var(--tpo-articles-darken, rgba(0, 0, 0, 0.25));
	}

	.tpo-articles__list--hover-lift .tpo-articles__item {
		transition: transform var(--tpo-articles-ms) ease, box-shadow var(--tpo-articles-ms) ease;
	}
	.tpo-articles__list--hover-lift .tpo-articles__item:hover {
		transform: translateY(calc(-1 * var(--tpo-articles-hover-lift, 6px)));
	}

	.tpo-articles__list--hover-grayscale .tpo-articles__img {
		filter: grayscale(var(--tpo-articles-grayscale, 100%));
	}
	.tpo-articles__list--hover-grayscale .tpo-articles__item:hover .tpo-articles__img {
		filter: grayscale(0%);
	}
}

/* "View all" button: shared .tpo-view-all styles in tpo-base.css. */

@media (max-width: 767px) {
	.tpo-articles__list--overlay {
		grid-template-columns: 1fr !important;
	}
}


/* —— Boxed card variant (.tpo-articles--boxed) — Template 2 cards as white
   rounded boxes with a padded body; shared by Article Archive and the
   Article Single "related" grid. Body padding comes from the shared
   "Card padding" control (card_padding_list), whose default each widget sets. —— */
.tpo-root .tpo-articles--boxed .tpo-articles__item--list {
	display: flex;
	flex-direction: column;
	overflow: hidden;
	height: 100%;
	border: 1px solid color-mix(in srgb, var(--e-global-color-text, #1b1b1b) 10%, transparent);
	border-radius: 20px;
	background: #fff;
	transition: box-shadow 0.3s ease, transform 0.3s ease, background-color 0.3s ease;
}
.tpo-root .tpo-articles--boxed .tpo-articles__item--list:hover {
	box-shadow: 0 20px 40px -24px rgba(15, 23, 42, 0.35);
}
.tpo-root .tpo-articles--boxed .tpo-articles__item--list .tpo-articles__media {
	position: relative;
	margin: 0;
	display: block;
	overflow: hidden;
	aspect-ratio: 16 / 10;
	border-radius: 0;
}
.tpo-root .tpo-articles--boxed .tpo-articles__item--list .tpo-articles__img {
	width: 100% !important;
	height: 100% !important;
	object-fit: cover;
}
.tpo-articles__badge {
	position: absolute;
	top: 12px;
	left: 12px;
	padding: 5px 12px;
	border-radius: 999px;
	background: rgba(255, 255, 255, 0.92);
	font-family: var(--e-global-typography-accent-font-family, inherit);
	font-size: 0.75rem;
	font-weight: 600;
	line-height: 1.3;
	color: var(--e-global-color-primary, #2563eb);
	backdrop-filter: blur(6px);
}
.tpo-root .tpo-articles--boxed .tpo-articles__body {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	gap: 8px;
	padding: 20px 24px 24px;
}
.tpo-articles__meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px;
	font-family: var(--e-global-typography-accent-font-family, inherit);
	font-size: 0.8125rem;
	color: color-mix(in srgb, var(--e-global-color-text, #1b1b1b) 55%, transparent);
}
.tpo-articles__meta-sep {
	opacity: 0.6;
}
.tpo-root .tpo-articles--boxed .tpo-articles__title {
	display: -webkit-box;
	overflow: hidden;
	margin: 0;
	font-family: var(--e-global-typography-primary-font-family, inherit);
	font-size: 1.125rem;
	line-height: 1.4;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
}
.tpo-root .tpo-articles--boxed .tpo-articles__excerpt {
	display: -webkit-box;
	overflow: hidden;
	margin: 0;
	font-size: 0.9375rem;
	line-height: 1.65;
	color: color-mix(in srgb, var(--e-global-color-text, #1b1b1b) 60%, transparent);
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
}
.tpo-root .tpo-articles--boxed .tpo-articles__read-more {
	margin-top: auto;
	padding-top: 6px;
	font-family: var(--e-global-typography-accent-font-family, inherit);
	font-weight: 600;
	color: var(--e-global-color-primary, #2563eb);
}

/* ==========================================================================
   Current Travel Articles designs — Magazine Featured / Story Card /
   Floating Content. Text inherits the Kit's colour + font; every value
   here is a default the Style tab overrides.
   ========================================================================== */

.tpo-articles {
	--tpo-ta-badge-offset: 14px;
	--tpo-ta-float-overlap: 56px;
	--tpo-ta-float-inset: 16px;
	--tpo-ta-thumb: 96px;
}

.tpo-articles__item--magazine,
.tpo-articles__item--story,
.tpo-articles__item--floating,
.tpo-articles__item--mag-row {
	position: relative;
	color: inherit;
	font-family: inherit;
	transition: box-shadow 260ms ease, background-color 200ms ease;
}
.tpo-articles__item--magazine .tpo-articles__title,
.tpo-articles__item--story .tpo-articles__title,
.tpo-articles__item--floating .tpo-articles__title,
.tpo-articles__item--mag-row .tpo-articles__title {
	color: inherit;
	font-family: inherit;
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	overflow: hidden;
}
.tpo-articles__item--magazine .tpo-articles__badge,
.tpo-articles__item--story .tpo-articles__badge,
.tpo-articles__item--floating .tpo-articles__badge {
	top: var(--tpo-ta-badge-offset);
	left: var(--tpo-ta-badge-offset);
	z-index: 2;
	font-family: inherit;
	transition: background-color 200ms ease, color 200ms ease;
}
.tpo-articles__item .tpo-articles__img {
	transition: transform 500ms ease, filter 300ms ease;
}
/* The card is an <a>: keep the theme's a:hover colour from repainting the
   title/excerpt (they inherit the card colour). */
.tpo-articles .tpo-articles__item--magazine:hover,
.tpo-articles .tpo-articles__item--floating:hover,
.tpo-articles .tpo-articles__item--mag-row:hover {
	color: inherit;
}
.tpo-articles .tpo-articles__item--story:hover {
	color: #fff;
}

/* Grid wrappers: Story + Floating use the Columns control. */
.tpo-articles__list--story,
.tpo-articles__list--floating {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
}

/* —— Story Card —— */
.tpo-articles__item--story {
	display: flex;
	flex-direction: column;
	justify-content: flex-end;
	min-height: 420px;
	overflow: hidden;
	border-radius: 18px;
	color: #fff;
	isolation: isolate;
}
.tpo-articles__item--story .tpo-articles__media {
	position: absolute;
	inset: 0;
	z-index: -1;
	border-radius: 0;
}
.tpo-articles__shade {
	position: absolute;
	inset: 0;
	background-image: linear-gradient(180deg, rgba(15, 23, 42, 0) 25%, rgba(15, 23, 42, 0.55) 60%, rgba(15, 23, 42, 0.92) 100%);
	transition: opacity 300ms ease, filter 300ms ease, background 300ms ease;
}
.tpo-articles__item--story .tpo-articles__body {
	position: relative;
	margin-top: auto;
	padding: 22px;
	text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
}
.tpo-articles__item--story .tpo-articles__date {
	margin: 0 0 6px;
	color: inherit;
	opacity: 0.85;
}
.tpo-articles__item--story .tpo-articles__title {
	margin: 0;
	font-size: 1.125rem;
}
.tpo-articles__item--story .tpo-articles__excerpt {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	overflow: hidden;
	margin: 8px 0 0;
	color: inherit;
	opacity: 0.9;
}
.tpo-articles__item--story:hover .tpo-articles__img {
	transform: scale(1.05);
}

/* —— Floating Content —— */
.tpo-articles__item--floating {
	display: flex;
	flex-direction: column;
	border-radius: 18px;
}
.tpo-articles__item--floating .tpo-articles__media {
	position: relative;
	height: 240px;
	border-radius: 18px;
}
.tpo-articles__item--floating .tpo-articles__body {
	position: relative;
	z-index: 1;
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	margin: calc(-1 * var(--tpo-ta-float-overlap)) var(--tpo-ta-float-inset) 0;
	padding: 20px;
	border-radius: 14px;
	background-color: #fff;
	box-shadow: 0 18px 40px -18px rgba(15, 23, 42, 0.28);
	transition: background-color 200ms ease, box-shadow 260ms ease;
}
.tpo-articles__item--floating:hover .tpo-articles__img,
.tpo-articles__item--magazine:hover .tpo-articles__img,
.tpo-articles__item--mag-row:hover .tpo-articles__img {
	transform: scale(1.05);
}

/* Date pill (Floating + Magazine featured). */
.tpo-articles__date-pill {
	align-self: flex-start;
	margin: 0 0 10px;
	padding: 4px 12px;
	border-radius: 999px;
	background-color: color-mix(in srgb, var(--e-global-color-primary, #2563eb) 12%, transparent);
	color: var(--e-global-color-primary, #2563eb);
	font-family: inherit;
	font-size: 0.75rem;
	transition: background-color 200ms ease, color 200ms ease;
}
.tpo-articles__item--floating .tpo-articles__excerpt,
.tpo-articles__item--magazine .tpo-articles__excerpt {
	margin: 0 0 12px;
	color: inherit;
	opacity: 0.75;
}
.tpo-articles__item--floating .tpo-articles__read-more,
.tpo-articles__item--magazine .tpo-articles__read-more {
	margin-top: auto;
	color: var(--e-global-color-primary, #2563eb);
	font-size: 0.875rem;
	font-weight: 600;
	gap: 6px;
}
.tpo-articles__item--floating:hover .tpo-articles__read-more-arrow,
.tpo-articles__item--magazine:hover .tpo-articles__read-more-arrow {
	transform: translateX(var(--tpo-articles-read-more-shift, 3px));
}

/* —— Magazine Featured —— */
.tpo-articles__list--magazine {
	--tpo-ta-mag-split: 58%;
	display: grid;
	grid-template-columns: minmax(0, var(--tpo-ta-mag-split)) minmax(0, 1fr);
	align-items: start;
}
.tpo-articles__item--magazine {
	display: flex;
	flex-direction: column;
	overflow: hidden;
	border-radius: 18px;
	background-color: #fff;
}
.tpo-articles__item--magazine .tpo-articles__media {
	position: relative;
	height: 340px;
}
.tpo-articles__item--magazine .tpo-articles__body {
	display: flex;
	flex-direction: column;
	padding: 22px;
}
.tpo-articles__item--magazine .tpo-articles__title {
	font-size: 1.25rem;
	-webkit-line-clamp: 3;
}
.tpo-articles__side {
	display: flex;
	flex-direction: column;
	gap: 14px;
}
.tpo-articles__item--mag-row {
	display: flex;
	align-items: center;
	gap: 14px;
	padding: 10px;
	border-radius: 14px;
	background-color: #fff;
}
.tpo-articles__item--mag-row .tpo-articles__media {
	flex: 0 0 var(--tpo-ta-thumb);
	width: var(--tpo-ta-thumb);
	height: var(--tpo-ta-thumb);
	border-radius: 10px;
}
.tpo-articles__item--mag-row .tpo-articles__body {
	flex: 1 1 auto;
	min-width: 0;
	padding: 0;
}
.tpo-articles__item--mag-row .tpo-articles__title {
	margin: 0 0 6px;
	font-size: 1rem;
	transition: color 200ms ease;
}
.tpo-articles__item--mag-row .tpo-articles__date {
	color: inherit;
	opacity: 0.65;
}

/* Slider: cards fill their slide height. */
.tpo-slider__track--story .tpo-slide > .tpo-articles__item,
.tpo-slider__track--floating .tpo-slide > .tpo-articles__item,
.tpo-slider__track--magazine .tpo-slide > .tpo-articles__item {
	height: 100%;
}

@media (max-width: 1024px) {
	.tpo-articles__list--magazine {
		grid-template-columns: minmax(0, 1fr);
	}
	.tpo-articles__item--magazine .tpo-articles__media {
		height: 300px;
	}
}
@media (max-width: 767px) {
	.tpo-articles__list--story,
	.tpo-articles__list--floating {
		grid-template-columns: 1fr;
	}
	.tpo-articles__item--story {
		min-height: 360px;
	}
	.tpo-articles__item--floating .tpo-articles__media {
		height: 210px;
	}
	.tpo-articles__item--magazine .tpo-articles__media {
		height: 220px;
	}
	.tpo-articles__item--magazine .tpo-articles__title {
		font-size: 1.125rem;
	}
	.tpo-articles {
		--tpo-ta-thumb: 76px;
	}
}
@media (max-width: 380px) {
	.tpo-articles {
		--tpo-ta-float-inset: 10px;
		--tpo-ta-thumb: 64px;
	}
	.tpo-articles__item--floating .tpo-articles__body,
	.tpo-articles__item--story .tpo-articles__body {
		padding: 16px;
	}
}
@media (prefers-reduced-motion: reduce) {
	.tpo-articles__item .tpo-articles__img,
	.tpo-articles__shade {
		transition: none;
	}
}

/* Touch devices: no hover animations mid-swipe (sticky :hover on tap), no
   per-frame backdrop blur on the badge — desktop unchanged. */
@media (hover: none), (pointer: coarse) {
	.tpo-articles__item,
	.tpo-articles__item .tpo-articles__img,
	.tpo-root .tpo-articles--boxed .tpo-articles__item--list {
		transition: none !important;
	}
	.tpo-articles__item:hover .tpo-articles__img {
		transform: none !important;
	}
	.tpo-root .tpo-articles--boxed .tpo-articles__item--list:hover {
		box-shadow: none;
		transform: none;
	}
	.tpo-articles__badge {
		-webkit-backdrop-filter: none;
		backdrop-filter: none;
	}
}
