/**
 * SS4Y — styles de base.
 *
 * Ne contient QUE ce qui est global : polices, réglages transverses, styles
 * de blocs cœur et mise en page header / footer. Tout ce qui appartient à une
 * section vit dans blocks/<bloc>/style.css.
 *
 * Les couleurs, espacements et rayons viennent de theme.json
 * (--wp--preset--*, --wp--custom--*) : ne pas écrire de valeur en dur ici.
 */

/* ─── Polices ───────────────────────────────────────────────────────────────
   Déposer les .woff2 de la charte dans assets/fonts/, décommenter, puis
   activer le préchargement dans inc/assets.php.

@font-face {
	font-family: 'SS4Y Heading';
	src: url('../fonts/heading-600.woff2') format('woff2');
	font-weight: 600 700;
	font-style: normal;
	font-display: swap;
}

@font-face {
	font-family: 'SS4Y Body';
	src: url('../fonts/body-400.woff2') format('woff2');
	font-weight: 400 500;
	font-style: normal;
	font-display: swap;
}
─────────────────────────────────────────────────────────────────────────── */

/* ─── Réglages globaux ───────────────────────────────────────────────────── */
html {
	scroll-behavior: smooth;
	-webkit-text-size-adjust: 100%;

	/* Les ancres de section se décalent déjà de la barre (`scroll-margin-top`) :
	   on ajoute la hauteur du bandeau d'annonce épinglé, s'il y en a un. */
	scroll-padding-block-start: var(--ss4y-notice-height, 0);
}

@media (prefers-reduced-motion: reduce) {

	html {
		scroll-behavior: auto;
	}

	*,
	*::before,
	*::after {
		animation-duration: 0.01ms !important;
		transition-duration: 0.01ms !important;
	}
}

body {
	text-rendering: optimizelegibility;
	-webkit-font-smoothing: antialiased;

	/* Le bandeau d'annonce épinglé est hors flux : on lui rend sa place. */
	padding-block-start: var(--ss4y-notice-height, 0);
}

img,
video {
	max-width: 100%;
	height: auto;
}

:where(a, button, input, select, textarea):focus-visible {
	outline: 2px solid var(--wp--preset--color--primary-light);
	outline-offset: 2px;
}

/* Lien d'évitement : affiché uniquement au clavier. */
.skip-link:focus {
	background: var(--wp--preset--color--white);
	color: var(--wp--preset--color--primary);
	padding: 0.75rem 1.25rem;
	z-index: 100000;
}

/* ─── Rythme vertical des sections ─────────────────────────────────────────
   Le rythme vient uniquement du padding des sections, jamais d'une marge :
   on remet à zéro à chacun des trois niveaux où WordPress en pose une. */

/*
 * Niveau page : le cœur écarte de 1.5rem chaque enfant direct sauf le premier,
 * ce qui glissait une bande de fond nue entre l'en-tête et le contenu, puis
 * entre le contenu et le pied de page.
 */
.wp-site-blocks > * {
	margin-block-start: 0;
}

/* Niveau contenu. */
.ss4y-main > * {
	margin-block: 0;
}

.ss4y-main > .wp-block-group:not(.alignfull),
.ss4y-main > .wp-block-columns {
	padding-block: var(--wp--preset--spacing--section);
}

.ss4y-main--full > .wp-block-post-content > * {
	margin-block-start: 0;
}

/*
 * Niveau bloc : chaque section porte son propre padding vertical, la marge de
 * flux ferait double emploi entre deux sections qui se suivent.
 *
 * `[class]` en plus n'est pas décoratif : la règle du cœur
 * (`:root :where(.is-layout-flow) > *`) a la même spécificité qu'un sélecteur
 * de classe, et l'ordre des feuilles ne garantit pas qui gagne. Le second
 * sélecteur tranche. Une marge réglée à la main dans l'éditeur passe malgré
 * tout, WordPress l'écrivant en style inline.
 */
[class*="wp-block-ss4y-"][class] {
	margin-block-start: 0;
}

.ss4y-page-title,
.ss4y-main > .wp-block-query-title {
	margin-block: var(--wp--preset--spacing--lg) var(--wp--preset--spacing--md);
}

/* ─── En-tête ────────────────────────────────────────────────────────────────
   Barre flottante en pilule, fixée en haut de l'écran et posée par-dessus le
   contenu. La hauteur vient de theme.json : le décalage du contenu et les
   ancres de section s'y réfèrent. */
.ss4y-header {
	position: fixed;
	inset-inline: 0;

	/* Bandeau d'annonce épinglé au-dessus : la barre descend d'autant. */
	inset-block-start: var(--ss4y-notice-height, 0);
	z-index: 100;
	padding-block: 0.85rem;
	padding-inline: var(--wp--custom--section--padding-inline);
	pointer-events: none;
}

/* Deux classes : les styles de mise en page du cœur en ont une, il faut passer
   devant pour l'espacement et les marges. */
.ss4y-header .ss4y-header__bar {
	position: relative;
	max-width: var(--wp--style--global--wide-size, 1400px);
	margin-inline: auto;
	gap: var(--wp--preset--spacing--md);
	padding: 0.45rem 0.45rem 0.45rem 1.35rem;
	border: 1px solid rgb(16 48 58 / 6%);
	border-radius: var(--wp--custom--radius--pill);
	box-shadow: var(--wp--custom--shadow--md);

	/* Seule la pilule capte le clic : le reste de la bande laisse passer. */
	pointer-events: auto;
}

/*
 * Fond et flou portés par un pseudo-élément, et non par la pilule elle-même.
 * `backdrop-filter` fait de l'élément qui le porte le référent des positions
 * fixes de sa descendance : posé sur la barre, il enfermait le menu déroulé
 * dans la pilule au lieu de le laisser couvrir l'écran.
 */
.ss4y-header .ss4y-header__bar::before {
	content: "";
	position: absolute;
	z-index: -1;
	inset: 0;
	border-radius: inherit;
	background: rgb(255 255 255 / 82%);
	backdrop-filter: blur(14px);
}

.ss4y-header__brand {
	gap: 0.75rem;
	flex-shrink: 0;
}

.ss4y-header__brand .wp-block-site-title a {
	color: var(--wp--preset--color--primary);
	text-decoration: none;
}

/* Le logo porte déjà le nom de la marque : le titre ne sert que de secours. */
.ss4y-header__brand:has(.wp-block-site-logo) .wp-block-site-title {
	display: none;
}

/* WordPress recopie la classe sur le <ul> interne : on ne vise que le <nav>. */
.ss4y-header__bar > .ss4y-header__nav {
	flex: 1;
}

.ss4y-header .wp-block-navigation a {
	color: var(--wp--preset--color--text-muted);
	text-decoration: none;
}

.ss4y-header .wp-block-navigation a:hover {
	color: var(--wp--preset--color--primary);
}

.ss4y-header .wp-block-navigation .current-menu-item > a,
.ss4y-header .wp-block-navigation .current-menu-ancestor > a {
	color: var(--wp--preset--color--primary);
	text-decoration: underline;
	text-decoration-thickness: 2px;
	text-underline-offset: 0.55em;
}

/*
 * Sélecteur de langue : à gauche du bouton, collé à lui plutôt qu'au menu.
 * La marge négative reprend une partie de l'espacement de la barre — le
 * sélecteur appartient visuellement au bloc de droite, pas à la navigation.
 * Il ne vit dans la barre qu'au-delà du palier du menu : dès le hamburger,
 * c'est l'exemplaire du volet (`ss4y-header__menu-lang`) qui prend le relais.
 */
.ss4y-header__lang {
	flex-shrink: 0;
	margin-inline-end: calc(var(--wp--preset--spacing--md) * -0.35);
}

.ss4y-header__cta {
	flex-shrink: 0;
}

.ss4y-header__cta .wp-block-button__link {
	padding: 0.65rem 1.35rem;
	font-size: var(--wp--preset--font-size--small);
}

/*
 * Le contenu passe sous la barre : on lui rend la place. Sauf quand la page
 * ouvre sur un hero, conçu pour que la barre flotte par-dessus.
 */
.ss4y-main {
	padding-block-start: var(--wp--custom--header--height);
}

.ss4y-main:has(> .ss4y-hero:first-child),
.ss4y-main:has(> * > .ss4y-hero:first-child) {
	padding-block-start: 0;
}

/*
 * Le devis n'apparaît dans le menu déroulé que sur mobile : sur grand écran
 * c'est le bouton de la barre qui le porte. Deux classes : le cœur affiche
 * chaque élément en flex avec `.wp-block-navigation .wp-block-navigation-item`.
 */
.ss4y-header .ss4y-header__menu-cta {
	display: none;
}

/*
 * Même principe pour le sélecteur de langue du volet : il ne s'affiche qu'une
 * fois le menu déroulé — sur grand écran, c'est celui de la barre qui sert.
 * C'est l'élément de liste qu'il faut masquer, et non le bloc : le cœur pose
 * la classe sur le <nav> mais l'enveloppe dans un <li> de son cru, qui
 * laisserait sans cela une case vide dans le menu.
 */
.ss4y-header .wp-block-navigation-item:has(> .ss4y-header__menu-lang) {
	display: none;
}

/*
 * Palier du menu : 1030 px. La navigation du cœur bascule sur le hamburger à
 * 600 px et n'expose pas ce seuil en réglage ; dans la bande 600–1029 px on
 * annule donc ses règles pour la remettre en volet. Le bouton de la barre,
 * lui, reste affiché — c'est ce qui distingue cette bande du vrai mobile.
 */
@media (min-width: 600px) and (max-width: 1029px) {

	/*
	 * Deux `:not()` chez le cœur, donc trois classes de spécificité : le
	 * préfixe `.ss4y-header` suffit à passer devant.
	 */
	.ss4y-header .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) {
		position: fixed;
		inset: 0;
		display: none;
		width: auto;
	}

	.ss4y-header .wp-block-navigation__responsive-container-open:not(.always-shown) {
		display: flex;
	}
}

/* Territoire du hamburger : le volet et la mise en page qui va avec. */
@media (max-width: 1029px) {

	/* Sans menu centré à tenir, le hamburger se range à droite. */
	.ss4y-header__bar > .ss4y-header__nav {
		flex: 0 0 auto;
		margin-inline-start: auto;
	}

	/* La barre est trop courte pour le sélecteur : il descend dans le volet. */
	.ss4y-header .ss4y-header__lang {
		display: none;
	}

	/* ─── Menu déroulé, plein écran ──────────────────────────────────────── */
	.ss4y-header .wp-block-navigation__responsive-container.is-menu-open {
		position: fixed;
		inset: 0;
		padding-block: var(--wp--custom--header--height) var(--wp--preset--spacing--lg);
		padding-inline: var(--wp--custom--section--padding-inline);
		background: var(--wp--preset--gradient--primary-diagonal);
		overflow-y: auto;
	}

	.ss4y-header .is-menu-open .wp-block-navigation__responsive-container-content {
		gap: var(--wp--preset--spacing--md);

		/* Les liens occupent la largeur, et la liste se centre verticalement. */
		align-items: stretch;
		justify-content: center;
		min-height: 100%;
	}

	/* Sur le dégradé, le liseré de focus par défaut ne se voit plus. */
	.ss4y-header .is-menu-open a:focus-visible {
		outline: 2px solid var(--wp--preset--color--accent);
		outline-offset: 4px;
	}

	.ss4y-header .is-menu-open .wp-block-navigation__container {
		gap: var(--wp--preset--spacing--sm);
		align-items: stretch;
	}

	.ss4y-header .is-menu-open .wp-block-navigation-item__content {
		font-family: var(--wp--preset--font-family--heading);
		font-size: var(--wp--preset--font-size--title-m);
		font-weight: 700;
		color: var(--wp--preset--color--white);
	}

	.ss4y-header .is-menu-open .current-menu-item > a {
		color: var(--wp--preset--color--accent);
		text-decoration: none;
	}

	.ss4y-header .is-menu-open .wp-block-navigation__responsive-container-close {
		color: var(--wp--preset--color--white);
	}

	/*
	 * Le devis, en vrai bouton pleine largeur. `align-self` est nécessaire :
	 * la liste est un conteneur flex, sans quoi l'élément se réduit à son
	 * texte au lieu de s'étirer.
	 */
	.ss4y-header .is-menu-open .ss4y-header__menu-cta {
		display: block;
		width: 100%;
		align-self: stretch;
		margin-block-start: var(--wp--preset--spacing--md);
	}

	.ss4y-header .is-menu-open .ss4y-header__menu-cta > a {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
		gap: 0.15rem;
		width: 100%;
		min-height: 3.5rem;
		padding: 0.9rem 1.75rem;
		border-radius: var(--wp--custom--radius--pill);
		background: var(--wp--preset--color--accent);
		color: var(--wp--preset--color--text);
		text-align: center;
		box-shadow: 0 6px 20px rgb(16 48 58 / 25%);
	}

	/*
	 * La taille du texte se pose sur le libellé : c'est lui que la navigation
	 * du cœur dimensionne, pas le lien qui l'entoure.
	 */
	.ss4y-header .is-menu-open .ss4y-header__menu-cta .wp-block-navigation-item__label {
		font-family: var(--wp--preset--font-family--heading);
		font-size: var(--wp--preset--font-size--medium);
		font-weight: 700;
		letter-spacing: 0.01em;
	}

	/*
	 * Seconde ligne, « (3 mois offerts) » : la description du lien de
	 * navigation, rendue par le cœur dans le <a>. Même hiérarchie que la note
	 * du bouton ss4y/sticky-cta, qu'elle relaie.
	 */
	.ss4y-header .is-menu-open .ss4y-header__menu-cta .wp-block-navigation-item__description {
		display: block; /* Le cœur masque les descriptions de liens : on la rétablit. */
		font-size: 0.8rem;
		font-weight: 600;
		line-height: 1.2;
		opacity: 0.7;
	}

	.ss4y-header .is-menu-open .ss4y-header__menu-cta > a:hover,
	.ss4y-header .is-menu-open .ss4y-header__menu-cta > a:focus-visible {
		background: var(--wp--preset--color--accent-dark);
		color: var(--wp--preset--color--text);
	}

	/* ─── Langues, au pied du volet ──────────────────────────────────────── */
	.ss4y-header .is-menu-open .wp-block-navigation-item:has(> .ss4y-header__menu-lang) {
		display: flex;
		justify-content: center;
		margin-block-start: var(--wp--preset--spacing--sm);
	}

	/* Sur le dégradé, le bouton se contente d'un liseré et de texte blanc. */
	.ss4y-header .is-menu-open .ss4y-header__menu-lang .ss4y-lang__toggle {
		gap: 0.4rem;
		padding: 0.6rem 1.1rem;
		border: 1px solid rgb(255 255 255 / 35%);
		font-size: var(--wp--preset--font-size--small);
		color: var(--wp--preset--color--white);
	}

	.ss4y-header .is-menu-open .ss4y-header__menu-lang .ss4y-lang__toggle:hover,
	.ss4y-header .is-menu-open .ss4y-header__menu-lang .ss4y-lang__panel[open] > .ss4y-lang__toggle {
		background: rgb(255 255 255 / 12%);
		color: var(--wp--preset--color--white);
	}

	.ss4y-header .is-menu-open .ss4y-header__menu-lang .ss4y-lang__toggle:focus-visible {
		outline-color: var(--wp--preset--color--accent);
	}

	/*
	 * Le volet se termine ici : le panneau s'ouvre vers le haut, sinon il
	 * sortirait de l'écran et forcerait un défilement pour rien.
	 */
	.ss4y-header .is-menu-open .ss4y-header__menu-lang .ss4y-lang__list {
		inset-block-start: auto;
		inset-block-end: calc(100% + 0.5rem);
		inset-inline: 50% auto;
		translate: -50% 0;
	}
}

/*
 * Vrai mobile : le libellé du bouton ne tient plus à côté du logo et du
 * hamburger. Il cède la place, et le volet porte le devis — relayé au bas de
 * l'écran par ss4y/sticky-cta.
 */
@media (max-width: 599px) {

	/* Deux classes : le cœur en pose une sur `wp-block-buttons`. */
	.ss4y-header .ss4y-header__cta {
		display: none;
	}

	/*
	 * Padding symétrique : le retrait à droite n'était court que pour laisser
	 * le bouton affleurer le bord de la pilule. Sans lui, le hamburger doit
	 * respirer autant que le logo.
	 */
	.ss4y-header .ss4y-header__bar {
		padding: 0.45rem 1.35rem;
	}
}

/* ─── Pages légales ────────────────────────────────────────────────────────
   Texte long, dense, sans image : on privilégie la longueur de ligne et le
   repérage des titres. */
.ss4y-legal {
	padding-block: var(--wp--preset--spacing--section);
}

.ss4y-legal > * {
	max-width: 70ch;
}

.ss4y-legal h2 {
	margin-block: var(--wp--preset--spacing--lg) var(--wp--preset--spacing--sm);
	font-size: var(--wp--preset--font-size--title-s);
	color: var(--wp--preset--color--text);
}

.ss4y-legal h2:first-child {
	margin-block-start: 0;
}

.ss4y-legal p,
.ss4y-legal li {
	line-height: 1.75;
	color: var(--wp--preset--color--text-muted);
}

.ss4y-legal p {
	margin-block: 0 var(--wp--preset--spacing--sm);
}

.ss4y-legal ul {
	margin-block: 0 var(--wp--preset--spacing--sm);
	padding-inline-start: 1.25rem;
}

.ss4y-legal a {
	color: var(--wp--preset--color--primary);
}

/* Date de mise à jour, en pied de page légale. */
.ss4y-legal__updated {
	margin-block-start: var(--wp--preset--spacing--lg);
	padding-block-start: var(--wp--preset--spacing--sm);
	border-block-start: 1px solid var(--wp--preset--color--border);
	font-size: var(--wp--preset--font-size--small);
}

/* Le pied de page est un bloc à part entière : son style vit dans
   blocks/footer/style.css. */

/* ─── Styles de blocs cœur ───────────────────────────────────────────────── */
.wp-block-button.is-style-ss4y-outline .wp-block-button__link {
	background: transparent;
	border: 1.5px solid currentcolor;
	color: var(--wp--preset--color--primary);
}

.wp-block-button.is-style-ss4y-outline .wp-block-button__link:hover {
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--white);
}

.wp-block-button.is-style-ss4y-accent .wp-block-button__link {
	background: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--primary-dark);
}

.wp-block-button.is-style-ss4y-accent .wp-block-button__link:hover {
	filter: brightness(1.08);
}

.wp-block-group.is-style-ss4y-card {
	background: var(--wp--preset--color--white);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--wp--custom--radius--md);
	box-shadow: var(--wp--custom--shadow--sm);
	padding: var(--wp--preset--spacing--md);
}

.wp-block-image.is-style-ss4y-rounded img {
	border-radius: var(--wp--custom--radius--md);
}

/* ─── Boucle d'articles ──────────────────────────────────────────────────── */
.ss4y-loop__list {
	gap: var(--wp--preset--spacing--md);
}

.ss4y-loop__list > li {
	background: var(--wp--preset--color--white);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--wp--custom--radius--md);
	overflow: hidden;
	padding: 0 0 var(--wp--preset--spacing--sm);
	transition: box-shadow var(--wp--custom--transition), transform var(--wp--custom--transition);
}

.ss4y-loop__list > li:hover {
	box-shadow: var(--wp--custom--shadow--md);
	transform: translateY(-2px);
}

.ss4y-loop__list > li > :not(.ss4y-loop__thumb) {
	margin-inline: var(--wp--preset--spacing--sm);
}

.ss4y-loop__thumb img {
	width: 100%;
	object-fit: cover;
}

.ss4y-loop__date {
	color: var(--wp--preset--color--text-muted);
	margin-block-start: var(--wp--preset--spacing--sm);
}

.ss4y-loop__list .wp-block-post-title a {
	color: var(--wp--preset--color--primary);
	text-decoration: none;
}

.ss4y-pagination {
	margin-block-start: var(--wp--preset--spacing--lg);
	gap: var(--wp--preset--spacing--sm);
}

/* ─── Article ──────────────────────────────────────────────────────────────
   Corps de l'article à gauche, encart de conversion à droite. */
.ss4y-single .ss4y-breadcrumb {
	padding-block-start: var(--wp--preset--spacing--lg);
}

.ss4y-single .ss4y-single__cols {
	gap: var(--wp--preset--spacing--xl);
	margin-block: var(--wp--preset--spacing--md) var(--wp--preset--spacing--section);

	/*
	 * Sans cela, les colonnes s'étirent à la hauteur de la plus haute et
	 * `position: sticky` n'a plus de course : l'encart resterait immobile.
	 */
	align-items: start;
}

.ss4y-single__title {
	margin-block: var(--wp--preset--spacing--sm) 0;
	font-size: var(--wp--preset--font-size--title-l);
	line-height: 1.15;
}

/* Confort de lecture : le corps de texte reste sous les 70 caractères. */
.ss4y-single__body .wp-block-post-content > * {
	max-width: 68ch;
}

.ss4y-single__body .wp-block-post-content > .alignwide,
.ss4y-single__body .wp-block-post-content > .alignfull,
.ss4y-single__body .wp-block-post-content > figure,
.ss4y-single__body .wp-block-post-content > .wp-block-image {
	max-width: none;
}

.ss4y-single__meta {
	color: var(--wp--preset--color--text-muted);
	gap: var(--wp--preset--spacing--sm);
	font-size: var(--wp--preset--font-size--small);
}

@media (max-width: 781px) {

	.ss4y-single .ss4y-single__cols {
		gap: var(--wp--preset--spacing--lg);
	}
}

.ss4y-single__thumb img {
	border-radius: var(--wp--custom--radius--md);
}

.ss4y-single__nav {
	border-top: 1px solid var(--wp--preset--color--border);
	gap: var(--wp--preset--spacing--sm);
	margin-block-start: var(--wp--preset--spacing--lg);
	padding-block-start: var(--wp--preset--spacing--md);
}

/* ─── 404 & recherche ────────────────────────────────────────────────────── */
.ss4y-404 {
	padding-block: var(--wp--preset--spacing--xl);
	text-align: center;
}

.ss4y-search .wp-block-search__button {
	background: var(--wp--preset--color--primary);
	border: 0;
	border-radius: var(--wp--custom--radius--sm);
	color: var(--wp--preset--color--white);
	padding: 0.75rem 1.25rem;
}

.ss4y-search .wp-block-search__input {
	border: 1px solid var(--wp--preset--color--border);
	border-radius: var(--wp--custom--radius--sm);
	padding: 0.75rem 1rem;
}

/*
 * Widgets d'avis Trustindex, quel que soit le bloc qui les affiche.
 *
 * Le script de Trustindex décide seul du nombre d'avis visibles dans un
 * carrousel : il divise la largeur du conteneur par la largeur cible d'un avis.
 * Le seul moyen d'en imposer deux est donc de brider cette largeur, ce que fait
 * `--ss4y-trustindex-max` (voir ss4y_trustindex_widget()). Sans la variable, le
 * widget reprend toute la place disponible.
 */
.ss4y-trustindex .ti-widget {
	max-width: var(--ss4y-trustindex-max, none);
	margin-inline: auto;
}
