/*
 * [npm_slider] — generic horizontal slider/carousel — NPM Refinery
 *
 * Deliberately generic (not "accreditation-slider"): the markup/JS pair
 * (this file + npm-slider.js) knows nothing about what content it's
 * showing. First use is the Accreditations & Certificates logo strip,
 * but it's meant to be reused anywhere a horizontal scroll-snap
 * carousel is useful (testimonials, partner logos, a product spotlight
 * row, etc.) without writing a new slider from scratch.
 *
 * Structure (see the [npm_slider] shortcode in shortcodes.php):
 *   .npm-slider
 *     .npm-slider__head              optional heading only (nav lives below)
 *       .npm-slider__heading
 *     .npm-slider__body              flex row: prev arrow | viewport | next arrow
 *       .npm-slider__arrow.npm-slider__prev
 *       .npm-slider__viewport        overflow-x scroller (CSS scroll-snap)
 *         .npm-slider__track         flex row of slides
 *           .npm-slider__slide
 *             .npm-slider__link (or a plain div if the item has no href)
 *               .npm-slider__image
 *               .npm-slider__title   only when the shortcode's title="yes"
 *       .npm-slider__arrow.npm-slider__next
 *
 * Nav arrows flank the slide row itself, not the heading —
 * .npm-slider__body is a flex row so the arrows sit in their own
 * gutter beside the viewport rather than overlapping slide content,
 * staying vertically centered against whatever height the cards render at.
 *
 * No slider library — native overflow-x + scroll-snap-type handles the
 * actual scrolling/snapping; npm-slider.js only wires the prev/next
 * buttons to viewport.scrollBy() and toggles button disabled state at
 * the scroll bounds. Swipe/trackpad/scrollbar-drag all work for free.
 *
 * Design tokens match the rest of the theme:
 *   --wp--preset--color--primary     Deep Green  #182B0F
 *   --wp--preset--color--accent      Bronze      #BA9A52
 *   --wp--preset--color--background  Cream       #EDEDEB
 *   --wp--preset--color--contrast    Charcoal    #3D3D3C
 *   --wp--preset--color--base        White       #FFFFFF
 */

/* Full-bleed by design: spans the viewport edge-to-edge regardless of
   the wrapping block's own width — same calc(50% - 50vw) technique
   WordPress core uses for "Full width" alignment. box-sizing keeps the
   side padding from pushing past 100vw and causing overflow. */
.npm-slider {
	box-sizing: border-box;
	width: 100vw;
	max-width: 100vw;
	margin-left: calc(50% - 50vw);
	margin-right: calc(50% - 50vw);
	padding: 0 1.5rem;
}

/* ---- Head: heading only ---- */

.npm-slider__head {
	margin-bottom: 1.75rem;
}

.npm-slider__heading {
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	color: var(--wp--preset--color--primary);
	font-size: var(--wp--preset--font-size--x-large);
	margin: 0;
}

/* ---- Body: prev arrow | viewport | next arrow ---- */

.npm-slider__body {
	display: flex;
	align-items: center;
	gap: 1rem;
}

.npm-slider__viewport {
	flex: 1 1 auto;
	min-width: 0; /* lets the viewport shrink inside the flex row instead of forcing .npm-slider__body wider */
}

.npm-slider__arrow {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	width: 40px;
	height: 40px;
	padding: 0;
	border: none;
	border-radius: 50%;
	background-color: var(--wp--preset--color--background);
	color: var(--wp--preset--color--primary);
	cursor: pointer;
	transition: all ease 0.25s;
}

/* npm-slider.js toggles this modifier once it knows whether the track
   actually overflows the viewport — no arrows needed if everything fits. */
.npm-slider:not(.npm-slider--scrollable) .npm-slider__arrow {
	display: none;
}

/* Chevron via rotated border corner — same trick used for the
   prev/next post nav and the All Products filter check. */
.npm-slider__arrow::before {
	content: "";
	width: 8px;
	height: 8px;
	border: solid currentColor;
	border-width: 0 2px 2px 0;
}

.npm-slider__prev::before {
	margin-left: 3px;
	transform: rotate(135deg);
}

.npm-slider__next::before {
	margin-right: 3px;
	transform: rotate(-45deg);
}

.npm-slider__arrow:hover:not(:disabled) {
	background-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--base);
}

.npm-slider__arrow:disabled {
	opacity: 0.35;
	cursor: default;
}

/* ---- Viewport / track ---- */

.npm-slider__viewport {
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none; /* Firefox */
	-ms-overflow-style: none; /* old Edge */
}

.npm-slider__viewport::-webkit-scrollbar {
	display: none; /* nav buttons are the intended controls, not a visible scrollbar */
}

.npm-slider__track {
	display: flex;
	gap: 1.25rem;
}

.npm-slider__slide {
	flex: 0 0 auto;
	width: clamp(140px, 18vw, 190px);
	scroll-snap-align: start;
}

.npm-slider__link {
	display: flex;
	height: 100%;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	padding: 0 .25rem;
	border: 1px solid rgba(23, 38, 17, 0.12);
	border-radius: 6px;
	background-color: var(--wp--preset--color--base);
	color: inherit;
	text-decoration: none;
	transition: all ease 0.25s;
}

.npm-slider__link:hover {
	border-color: var(--wp--preset--color--accent);
	box-shadow: 0 8px 20px rgba(23, 38, 17, 0.1);
}

.npm-slider__image {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	aspect-ratio: 3 / 2;
}

.npm-slider__image img {
	max-width: 100%;
	max-height: 100%;
	object-fit: contain;
}

.npm-slider__title {
	margin: 0.85rem 0 0;
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	color: var(--wp--preset--color--contrast);
	text-align: center;
	line-height: 1.35;
}

@media (max-width: 900px) {
	.npm-slider {
		padding: 2.5rem 1.25rem;
	}

	.npm-slider__body {
		gap: 0.75rem;
	}

	.npm-slider__arrow {
		width: 36px;
		height: 36px;
	}
}

@media (max-width: 600px) {
	.npm-slider {
		padding: 1rem 0;
	}

	.npm-slider__head {
		margin-bottom: 1.25rem;
	}

	.npm-slider__heading {
		font-size: var(--wp--preset--font-size--large);
	}

	.npm-slider__body {
		gap: 0.5rem;
	}

	.npm-slider__track {
		gap: 0.85rem;
	}

	.npm-slider__slide {
		width: clamp(120px, 32vw, 150px);
	}

	.npm-slider__arrow {
		width: 32px;
		height: 32px;
	}
}

/* Very narrow phones: 32px arrows + gaps eat too much of the row
   relative to a ~120px card — drop them and rely on touch swipe
   (scroll-snap keeps working with no JS). They reappear above this width. */
@media (max-width: 380px) {
	.npm-slider__arrow {
		display: none;
	}

	.npm-slider__body {
		gap: 0;
	}
}

/* ============================================================
   Services layout — [npm_slider post_type="service"]
   ============================================================
   Scoped entirely under .npm-slider[data-post-type="service"], so
   none of the generic/shared rules above are touched — Accreditations
   (and any other future [npm_slider] use) keeps the compact logo-card
   treatment exactly as-is. Services are real photos with real copy,
   not small logos, so this swaps in: a photo-shaped aspect ratio
   (4:3, object-fit: cover, instead of the logo-oriented 3:2/contain),
   left-aligned title + short description text, a line-clamp so
   uneven description lengths don't blow out card height, and a
   corner arrow affordance on hover — same chevron used for
   .npm-grid__cta (custom.css), reimplemented here as a plain ::after
   rather than a second link, since the whole card is already the
   `<a>` (see [npm_slider]'s $tag logic) and nesting another <a>
   inside it for a Page Link field would be invalid markup.

   Use with the shortcode called like:
     [npm_slider post_type="service" heading="Our Services" title="yes"
       fields="short_description" image_size="medium"]
   (title="yes" + fields="short_description" — no "page_link" in
   `fields` here; the card itself already links out.)
   ============================================================ */

.npm-slider[data-post-type="service"] .npm-slider__slide {
	width: clamp(240px, 26vw, 320px);
}

.npm-slider[data-post-type="service"] .npm-slider__track {
	gap: 1.5rem;
}

.npm-slider[data-post-type="service"] .npm-slider__link {
	position: relative;
	align-items: stretch;
	justify-content: flex-start;
	padding: 0;
	overflow: hidden;
	text-align: left;
}

.npm-slider[data-post-type="service"] .npm-slider__image {
	width: 100%;
	aspect-ratio: 4 / 3;
}

.npm-slider[data-post-type="service"] .npm-slider__image img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.npm-slider[data-post-type="service"] .npm-slider__title {
	margin: 1.1rem 1.1rem 0;
	text-align: left;
	font-size: var(--wp--preset--font-size--medium);
}

.npm-slider[data-post-type="service"] .npm-grid__field {
	margin: 0.5rem 1.1rem 1.1rem;
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--small);
	color: var(--wp--preset--color--contrast);
	line-height: 1.55;
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

/* .npm-slider[data-post-type="service"] .npm-slider__link::after {
	content: "";
	position: absolute;
	right: 1.1rem;
	bottom: 1.1rem;
	width: 8px;
	height: 8px;
	border: solid var(--wp--preset--color--accent);
	border-width: 0 2px 2px 0;
	transform: rotate(-45deg);
	transition: transform ease .25s;
} */

/* .npm-slider[data-post-type="service"] .npm-slider__link:hover::after {
	transform: rotate(-45deg) translate(3px, 3px);
} */

@media (max-width: 900px) {
	.npm-slider[data-post-type="service"] .npm-slider__slide {
		width: clamp(220px, 60vw, 280px);
	}
}

@media (max-width: 600px) {
	.npm-slider[data-post-type="service"] .npm-slider__slide {
		width: clamp(200px, 78vw, 260px);
	}

	.npm-slider[data-post-type="service"] .npm-slider__track {
		gap: 1rem;
	}
}