/** Utilitaires. */

.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; }
.text-center { text-align: center; }
.muted { color: var(--jdj-text-muted); }
.stack > * + * { margin-top: var(--sp-3); }
.flow > * + * { margin-top: var(--sp-2); }
.mt-0 { margin-top: 0; }
.mt-5 { margin-top: var(--sp-5); }
.no-results { text-align: center; padding: var(--sp-6) var(--sp-3); color: var(--jdj-text-muted); }
.no-results svg { width: 64px; height: 64px; margin-inline: auto; color: var(--jdj-text-faint); }

/* Apparition douce au scroll (progressive enhancement via .js). */
.js [data-reveal] { opacity: 0; transform: translateY(16px); transition: opacity 0.5s var(--ease), transform 0.5s var(--ease); }
.js [data-reveal].is-visible { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) { .js [data-reveal] { opacity: 1; transform: none; transition: none; } }

/* Aspect ratio helper. */
.ratio-16-9 { aspect-ratio: 16/9; object-fit: cover; }
