/* Atomic utilities. Use sparingly. */

.rehab-visually-hidden {
	position: absolute !important;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}

.rehab-text-center { text-align: center; }
.rehab-text-left { text-align: left; }
.rehab-text-right { text-align: right; }

.rehab-mt-0 { margin-top: 0; }
.rehab-mb-0 { margin-bottom: 0; }

/* Animation primitives — opt-in via class */
@keyframes rehab-fade-in-left {
	from { opacity: 0; transform: translateX(-1.25rem); }
	to { opacity: 1; transform: translateX(0); }
}

@keyframes rehab-fade-in-right {
	from { opacity: 0; transform: translateX(1.25rem); }
	to { opacity: 1; transform: translateX(0); }
}

@keyframes rehab-fade-in-up {
	from { opacity: 0; transform: translateY(1rem); }
	to { opacity: 1; transform: translateY(0); }
}

.rehab-animate-fade-in-left { animation: rehab-fade-in-left 0.8s var(--rehab-ease) both; }
.rehab-animate-fade-in-right { animation: rehab-fade-in-right 0.8s var(--rehab-ease) both; }
.rehab-animate-fade-in-up { animation: rehab-fade-in-up 0.8s var(--rehab-ease) both; }

/* Scroll-reveal — JS adds .rehab-reveal initially, then .is-revealed when in viewport. */
.rehab-reveal {
	opacity: 0;
	transform: translateY(1.25rem);
	transition: opacity 0.7s var(--rehab-ease), transform 0.7s var(--rehab-ease);
	will-change: opacity, transform;
}

.rehab-reveal.is-revealed {
	opacity: 1;
	transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
	.rehab-animate-fade-in-left,
	.rehab-animate-fade-in-right,
	.rehab-animate-fade-in-up {
		animation: none;
	}
	.rehab-reveal {
		opacity: 1 !important;
		transform: none !important;
		transition: none !important;
	}
}
