/* =========================================================================
   ANIMATIONS — scroll reveal + ambient motion
   Lightweight, GPU-friendly (opacity/transform only), reduced-motion safe.
   ========================================================================= */

.ph-reveal {
	opacity: 0;
	transform: translateY(22px);
	transition: opacity 0.8s var(--ph-ease), transform 0.8s var(--ph-ease);
	transition-delay: var(--ph-delay, 0s);
}
.ph-reveal.is-visible {
	opacity: 1;
	transform: translateY(0);
}
.ph-reveal--delay { transition-delay: calc(var(--ph-delay, 0s) + 0.12s); }

@media (prefers-reduced-motion: reduce) {
	.ph-reveal {
		opacity: 1 !important;
		transform: none !important;
		transition: none !important;
	}
}

@keyframes ph-portrait-float {
	0%, 100% { transform: translateY(0); }
	50% { transform: translateY(-10px); }
}

@keyframes ph-ring-rotate {
	from { transform: rotate(0deg); }
	to { transform: rotate(360deg); }
}

@keyframes ph-quote-pulse {
	0%, 100% { opacity: 0.6; transform: scale(1); }
	50% { opacity: 1; transform: scale(1.05); }
}

@media (prefers-reduced-motion: reduce) {
	.ph-hero__portrait,
	.ph-hero__portrait-ring,
	.ph-quote__bg,
	.ph-hero__scroll-cue span {
		animation: none !important;
	}
}

/* Sticky header entrance shadow once scrolled — toggled via JS class */
.ph-site-header.is-scrolled {
	box-shadow: 0 10px 30px -20px rgba(0, 0, 0, 0.6);
}
