/* Reveal-on-scroll fade-up (novaGlass/WEMA pattern).
 *
 * Hidden state is keyed on `html.ng-anim`, which is only added by the inline
 * head script when JS runs — so no-JS visitors and crawlers always see the
 * content. The IntersectionObserver in fade-up.js adds `.is-visible` (staggered
 * 120ms per item) to trigger the reveal.
 *
 * Only elements the server/templates mark with `.ng-fade-item` / `.ng-fade-self`
 * are affected — currently the page-title heroes. */

.ng-anim .ng-fade-item,
.ng-anim .ng-fade-self {
	opacity: 0;
	transform: translateY(24px);
	transition: opacity 0.7s ease, transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
	will-change: opacity, transform;
}

.ng-anim .ng-fade-item.is-visible,
.ng-anim .ng-fade-self.is-visible {
	opacity: 1;
	transform: none;
}

/* Respect reduced-motion: never hide, never animate. */
@media (prefers-reduced-motion: reduce) {
	.ng-anim .ng-fade-item,
	.ng-anim .ng-fade-self {
		opacity: 1;
		transform: none;
		transition: none;
	}
}
