/* Osool Partner Logos: endless marquee ----------------------------------------
 * The logo list is repeated by partners.js until it overfills the strip, then
 * the track slides by exactly one list width (--opl-shift) and starts again —
 * the copies line up, so the loop has no visible seam.
 * Design (1440): 93px strip on #F7F7F7, ~16px-high wordmarks, a small #EDE9E9 dot
 * halfway between logos (~42px each side), 189px fades at both edges.
 */
.opl {
	--opl-bg: #f7f7f7;
	--opl-pad: 38px;
	--opl-h: 16px;
	--opl-maxw: 200px;
	--opl-gap: 42px;
	--opl-dot: #ede9e9;
	--opl-dot-size: 4px;
	--opl-fade: 189px;
	--opl-fade-color: var(--opl-bg);
	--opl-opacity: 1;
	position: relative;
	overflow: hidden;
	padding-block: var(--opl-pad);
	background: var(--opl-bg);
}

.opl--bleed {
	width: 100vw;
	max-width: 100vw;
	margin-inline: calc(50% - 50vw);
}

.opl__viewport {
	overflow: hidden;
}

.opl__track {
	display: flex;
	width: max-content;
	will-change: transform;
}

.opl.is-running .opl__track {
	animation: opl-scroll var(--opl-duration, 30s) linear infinite;
}

.opl[data-direction="right"].is-running .opl__track {
	animation-direction: reverse;
}

@keyframes opl-scroll {
	from {
		transform: translate3d(0, 0, 0);
	}

	to {
		transform: translate3d(calc(-1 * var(--opl-shift, 0px)), 0, 0);
	}
}

.opl--pause:hover .opl__track,
.opl:focus-within .opl__track {
	animation-play-state: paused;
}

.opl .opl__set {
	display: flex;
	flex: none;
	align-items: center;
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Each item carries half a gap on both sides plus the dot at its end, so the
   spacing is identical across copies. */
.opl .opl__item {
	position: relative;
	display: flex;
	flex: none;
	align-items: center;
	margin: 0;
	padding: 0 var(--opl-gap);
	list-style: none;
}

.opl .opl__item::after {
	content: "";
	position: absolute;
	top: 50%;
	right: calc(var(--opl-dot-size) / -2);
	width: var(--opl-dot-size);
	height: var(--opl-dot-size);
	border-radius: 50%;
	background: var(--opl-dot);
	transform: translateY(-50%);
}

.opl-nodots-yes .opl .opl__item::after {
	display: none;
}

.opl .opl__link {
	display: flex;
	border-radius: 4px;
}

.opl .opl__link:focus-visible {
	outline: 2px solid #0088d3;
	outline-offset: 6px;
}

.opl .opl__logo {
	display: block;
	width: auto;
	max-width: var(--opl-maxw);
	height: var(--opl-h);
	max-height: none;
	margin: 0;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	object-fit: contain;
	opacity: var(--opl-opacity);
	user-select: none;
	transition: filter 0.25s ease, opacity 0.25s ease;
}

.opl-gray-yes .opl .opl__logo {
	filter: grayscale(1);
	opacity: calc(var(--opl-opacity) * 0.7);
}

.opl-gray-yes .opl .opl__item:hover .opl__logo,
.opl-gray-yes .opl .opl__link:focus-visible .opl__logo {
	filter: none;
	opacity: 1;
}

/* Edge fades. */
.opl::before,
.opl::after {
	content: "";
	position: absolute;
	z-index: 1;
	top: 0;
	bottom: 0;
	width: var(--opl-fade);
	pointer-events: none;
}

.opl::before {
	left: 0;
	background: linear-gradient(to right, var(--opl-fade-color), transparent);
}

.opl::after {
	right: 0;
	background: linear-gradient(to left, var(--opl-fade-color), transparent);
}

.opl-nofade-yes .opl::before,
.opl-nofade-yes .opl::after {
	display: none;
}

/* Phones. */
@media (max-width: 767px) {
	.opl {
		--opl-pad: 24px;
		--opl-h: 14px;
		--opl-maxw: 140px;
		--opl-gap: 26px;
		--opl-fade: 48px;
	}
}

/* No motion wanted: a still row that can be swiped / scrolled instead. */
@media (prefers-reduced-motion: reduce) {
	.opl.is-running .opl__track {
		animation: none;
	}

	.opl__viewport {
		overflow-x: auto;
		scrollbar-width: none;
	}

	.opl__viewport::-webkit-scrollbar {
		display: none;
	}

	.opl .opl__set[aria-hidden="true"] {
		display: none;
	}
}
