/**
 * États initiaux des animations au scroll.
 *
 * Les éléments révélés sont masqués AVANT leur animation, mais uniquement quand
 * la classe `.has-anim` est présente sur <html> — posée par un petit script en
 * <head> seulement si l'utilisateur n'a pas demandé de réduire les animations et
 * si le JS s'exécute. Sans JS, sans GSAP, ou en `prefers-reduced-motion`, la
 * classe n'est pas posée : tout le contenu reste visible.
 */

.has-anim :is(
	.hero__eyebrow, .hero__title, .hero__lede, .hero__content .btn,
	.cat-hero__eyebrow, .cat-hero__title, .cat-hero__lede, .cat-hero__inner .btn, .cat-hero__reviews,
	.page-hero__eyebrow, .page-hero__title,
	.single-hero__eyebrow, .single-hero__title, .single-hero__author, .single-hero__download,
	.services__card, .services__eyebrow, .services__title, .services__intro, .services__item,
	.presentation__eyebrow, .presentation__title, .presentation__text, .presentation__stat,
	.documents__eyebrow, .documents__title, .documents__intro, .documents__cta, .documents__item,
	.documents-grid__item,
	.cat-content__title, .cat-content__body > p, .cat-content__body > h2,
	.cat-content__body > h3, .cat-content__body > ul, .cat-content__body > blockquote,
	.cat-tabs__eyebrow, .cat-tabs__title, .cat-tabs__intro, .cat-tab, .cat-panel:not([hidden]),
	.cta__card, .cta__eyebrow, .cta__title, .cta .btn, .cta__contact li,
	.cat-articles__eyebrow, .cat-articles__title, .cat-articles__item,
	.faq__eyebrow, .faq__title, .faq__item,
	.page-body__inner > *,
	.single-article__body > *, .single-toc, .single-aside__card,
	.footer-cta, .footer-cta__title, .footer-cta .btn, .footer-cta__contact li,
	.contact__pills li, .contact__info-title, .contact__item,
	/* blocs d'image (apparition gérée à part) */
	.hero__portrait, .presentation__media,
	.hero__decor-svg, .cat-hero__decor-svg, .page-hero__decor-svg, .documents__decor-svg,
	.document-card__icon-img
) {
	opacity: 0;
}

/* Traits du hero : « tracés » de gauche à droite (voir animations.js). État
   initial = trait invisible, découvert par le balayage. Les filets pleine ligne
   (cat / page) sont clippés ; celui de l'article, peint par un ::before, est
   réduit à zéro en largeur. */
.has-anim :is(.cat-hero__line, .page-hero__line) {
	clip-path: inset(0 100% 0 0);
}

.has-anim .single-hero__line {
	--line-draw: 0;
}

/* Filet double sécurité : si l'utilisateur active reduced-motion, on ne masque
   jamais rien même si .has-anim avait été posée. */
@media (prefers-reduced-motion: reduce) {
	.has-anim :is(
		.hero__eyebrow, .hero__title, .hero__lede, .cat-hero__title, .page-hero__title,
		.single-hero__title, .services__card, .services__item, .presentation__text, .documents__item,
		.documents-grid__item, .cat-tab, .cat-panel, .cta__card, .faq__item, .cat-articles__item,
		.page-body__inner > *, .single-article__body > *, .footer-cta, .footer-cta__title
	) {
		opacity: 1;
	}

	/* Traits : rétablis pleins, sans balayage. */
	.has-anim :is(.cat-hero__line, .page-hero__line) {
		clip-path: none;
	}

	.has-anim .single-hero__line {
		--line-draw: 1;
	}
}
