/*
Theme Name: Beautiful Mind
Theme URI: https://www.beautifulmind.fr
Description: Thème sur mesure pour Beautiful Mind, accompagnement psychopédagogique à domicile de Marjolaine Valère. Direction « Organic » : fond crème, terre cuite, sauge en second, formes très arrondies, photographies lavées. Thème de blocs, pour que le site reste modifiable sans passer par le code.
Author: Hapi Agency
Version: 0.6.5
Requires at least: 6.6
Tested up to: 7.1
Requires PHP: 8.1
License: GNU General Public License v2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: beautifulmind
Tags: block-styles, full-site-editing, one-column, custom-colors, translation-ready
*/

/* L'apparence vit dans theme.json. Ne restent ici que les traitements
   qu'il ne sait pas exprimer, tous repris du système « Organic ». */

/* ---------- photographies ----------
   Règle centrale du système : une photo est LAVÉE pour s'asseoir dans le fond
   crème au lieu de flotter dessus. Sans ce traitement, une image un peu vive
   troue la page. Sur un bloc image, ajouter la classe « washed ». */
.washed img {
	filter: saturate(.78) contrast(.93) brightness(1.04);
	border-radius: 28px;
}

/* Le masque organique : une photo prend une forme de galet, jamais un carré. */
.bm-galet img,
.bm-galet.wp-block-image img {
	border-radius: 58% 42% 46% 54% / 52% 48% 52% 48%;
	aspect-ratio: 1 / 1.02;
	object-fit: cover;
	width: 100%;
}

/* Un emplacement encore vide garde la forme : il doit se lire comme une place
   réservée, pas comme un rectangle oublié. */
.bm-galet:not(:has(img)) {
	border-radius: 58% 42% 46% 54% / 52% 48% 52% 48%;
	aspect-ratio: 1 / 1.02;
	display: grid;
	place-content: center;
}

/* Le logo : les lettres colorées se resserrent un peu, sinon le mot se disloque. */
.bm-logo { letter-spacing: -.015em; }

/* ---------- le verbatim ----------
   Ni filet vertical ni guillemet décoratif : le système « Organic » proscrit les
   filets, et un guillemet géant en Caprasimo — police d'affichage très grasse —
   se lit comme une tache, pas comme une marque de citation. La parole rapportée
   est donc signalée par une PAIRE de guillemets français à la taille du texte,
   dans la police de labeur, plus fine que Caprasimo. Ils sont dans le contenu,
   et non en ::before : un guillemet ouvrant sans fermant n'est jamais juste, et
   ce qui se lit doit être dans le texte. Reste la signature détachée, et la
   vraie <blockquote> qui porte la citation par le balisage. */
.bm-verbatim {
	margin: 0;
	border: 0;
	padding-left: 0;
}
.bm-guillemet {
	font-family: var(--wp--preset--font-family--texte);
	font-weight: 400;
	font-size: .58em;
	line-height: 1;
	color: var(--wp--preset--color--terre);
	vertical-align: .22em;
}
.bm-verbatim cite {
	display: block;
	margin-top: var(--wp--preset--spacing--30);
	/* La citation hérite de la police de titrage du bloc « Citation » : on la
	   ramène au texte courant, Caprasimo étant illisible à cette taille. */
	font-family: var(--wp--preset--font-family--texte);
	font-style: normal;
	font-size: .875rem;
	font-weight: 600;
	letter-spacing: .06em;
	color: var(--wp--preset--color--gris);
}

/* ---------- surfaces ---------- */
.bm-carte {
	border-radius: 28px;
	box-shadow: 0 3px 10px color-mix(in srgb, #2e2b25 16%, transparent);
}

/* Deux cartes côte à côte n'ont jamais la même longueur de texte. Sans cette
   règle, chacune s'arrête sous son dernier mot et la rangée part en escalier.
   La colonne d'un bloc « Colonnes » est déjà étirée sur la hauteur de la
   rangée : il suffit que la carte remplisse sa colonne. */
.wp-block-column > .bm-carte {
	height: 100%;
}

/* Une pastille se dimensionne sur son texte, jamais sur la colonne qui la porte.
   Le liseré est ici et non dans le contenu : le bloc « Paragraphe » n'expose pas
   de réglage de bordure, une bordure posée dans le balisage serait effacée à la
   première réédition dans l'éditeur. Sans lui, la pastille ne se détachait pas
   du fond crème (1,02:1 entre l'ancien vert pâle et le fond, autant dire rien). */
.bm-pastille {
	width: fit-content;
	border: 1.5px solid var(--wp--preset--color--sauge-fonce);
}

/* Les sur-titres, en capitales espacées et en terre cuite foncée : la terre cuite
   pleine ne passe pas le contraste sur du texte de petite taille. */
.bm-surtitre {
	font-size: .8125rem;
	letter-spacing: .12em;
	text-transform: uppercase;
	font-weight: 700;
	color: var(--wp--preset--color--terre-fonce);
}

/* « Me joindre », dans le pied de page, mène au formulaire. Le lien ne doit pas se
   distinguer du sur-titre voisin : même couleur, soulignement au survol seulement. */
.bm-surtitre a,
.bm-pastille a {
	color: inherit;
	text-decoration: none;
}

/* La pastille TDAH renvoie à l'association TDAH France. Le lien ne doit pas casser la
   pastille : même couleur, souligné au survol seulement. */
.bm-pastille a:hover,
.bm-pastille a:focus-visible { text-decoration: underline; text-underline-offset: .25em; }

.bm-surtitre a:hover,
.bm-surtitre a:focus-visible { text-decoration: underline; text-underline-offset: .3em; }

/* Les quatre signes de l'accueil. Un point en terre cuite ancre chaque situation et
   donne son rythme à la liste : ce n'est pas un filet — le système en proscrit — mais
   une puce, posée en ::before pour rester hors du texte lu par un lecteur d'écran.
   Le retrait est porté par le groupe, pas par le titre seul, sinon la description
   se décalerait d'un cran par rapport à lui. */
.bm-signe {
	position: relative;
	padding-left: 1.9rem;
}
.bm-signe::before {
	content: "";
	position: absolute;
	left: 0;
	top: .58rem;
	width: .72rem;
	height: .72rem;
	border-radius: 50%;
	background: var(--wp--preset--color--terre);
}

/* ---------- la frise du parcours ----------
   Trois jalons reliés, sur la page À propos. C'est le seul trait continu que le système
   tolère : il ne décore pas, il porte la chronologie — côte à côte, les trois rôles se
   lisaient comme simultanés et non comme une suite.
   Elle est VERTICALE à toutes les largeurs : c'est le sens de lecture naturel d'un
   parcours, et le seul qui ne change pas de forme entre l'ordinateur et le téléphone.
   Le balisage est donc une pile de groupes, pas des colonnes déguisées : ce qu'on voit
   sur le site est ce que Marjolaine voit dans l'éditeur.
   Le trait est en CSS et non dans le contenu, pour qu'aucune réédition ne l'efface. */
.bm-frise__etape {
	position: relative;
	padding-left: 2.4rem;
	max-width: 58ch;
	/* Même piège que .bm-mesure : en mise en page « contrainte », WordPress centre tout
	   enfant borné, et il le fait avec !important. Sans cela la frise partait au milieu
	   de la page, décrochée de son titre. */
	margin-inline-start: 0 !important;
	margin-inline-end: auto !important;
}
.bm-frise__etape::before {                 /* le jalon */
	content: "";
	position: absolute;
	top: .42rem;
	left: 0;
	width: .95rem;
	height: .95rem;
	border-radius: 50%;
	background: var(--wp--preset--color--terre);
}
.bm-frise__etape::after {                  /* le trait jusqu'au jalon suivant */
	content: "";
	position: absolute;
	top: 1.55rem;
	left: .41rem;
	width: .13rem;
	height: calc(100% + var(--wp--preset--spacing--40));
	background: var(--wp--preset--color--gris-clair);
}
.bm-frise__etape:last-child::after { display: none; }

/* Un texte long se lit mieux borné. La marge de fin est explicite : dans une
   mise en page « contrainte », WordPress centre tout enfant qui porte une
   largeur maximale, et le paragraphe partait se placer au milieu — contre la
   règle de fer à gauche du système. */
/* Une exception à la mesure : la phrase d'accueil de la page Contact tient d'un seul
   souffle, elle se lit mieux d'une seule ligne sur un grand écran. Sur mobile, la
   mesure de 46 caractères reprend ses droits.
   ⚠️ Sélecteur composé, et non `.bm-mesure--pleine` seul : à spécificité égale c'est
   l'ordre du fichier qui tranche, et `.bm-mesure` vient plus bas. */
@media (min-width: 900px) {
	.bm-mesure.bm-mesure--pleine { max-width: none; }
}

.bm-mesure {
	max-width: 46ch;
	/* Le !important n'est pas un caprice : dans une mise en page « contrainte »,
	   WordPress centre lui-même tout enfant borné, et il le fait AVEC !important
	   (« margin-left:auto!important » dans sa feuille de blocs). Sans cela le
	   paragraphe partait au milieu, contre la règle de fer à gauche du système. */
	margin-inline-start: 0 !important;
	margin-inline-end: auto !important;
}

/* Deux lames pleine largeur qui se suivent doivent se TOUCHER. WordPress glisse
   24 px entre deux blocs frères d'une mise en page « contrainte » : entre deux fonds
   colorés, ce filet de crème se lit comme un bout de lame oublié, pas comme un blanc.
   Mettre la marge basse à zéro dans le contenu ne suffit pas — c'est la marge HAUTE
   du bloc suivant qu'il faut annuler. */
.wp-block-group.alignfull.has-background + .wp-block-group.alignfull.has-background {
	margin-block-start: 0;
}
/* Annuler la marge HAUTE de la seconde ne suffit pas : la marge BASSE de la première
   rouvre le même liseré. `:has(+ …)` permet de la viser — c'est la seule façon de
   désigner « la lame qui en précède une autre » en CSS. */
.wp-block-group.alignfull.has-background:has(+ .wp-block-group.alignfull.has-background) {
	/* !important obligatoire : la marge basse des lames est écrite EN LIGNE dans le
	   contenu (WordPress y met les réglages d'espacement du bloc), et une déclaration
	   en ligne bat n'importe quel sélecteur de feuille de styles. */
	margin-block-end: 0 !important;
}

/* ---------- la foire aux questions ----------
   Chaque question est un bloc « Détails » natif : l'ouverture et la fermeture sont
   assurées par le navigateur, sans une ligne de JavaScript, et le contenu replié reste
   DANS la page — donc trouvable par les moteurs et par la recherche du navigateur.
   La séparation entre les questions est portée par le cartouche blanc et non par un
   trait : le système proscrit les filets, c'est la surface qui sépare. */
.bm-faq summary {
	cursor: pointer;
	list-style: none;
	position: relative;
	padding-right: 2.6rem;
	font-family: var(--wp--preset--font-family--titre);
	font-size: var(--wp--preset--font-size--grand);
	line-height: 1.3;
}
.bm-faq summary::-webkit-details-marker { display: none; }
.bm-faq summary::after {                    /* le chevron, qui bascule à l'ouverture */
	content: "";
	position: absolute;
	right: .3rem;
	top: .34em;
	width: .78rem;
	height: .78rem;
	border-right: .17rem solid var(--wp--preset--color--terre);
	border-bottom: .17rem solid var(--wp--preset--color--terre);
	transform: rotate(45deg);
	transition: transform .2s ease;
}
.bm-faq[open] summary::after {
	top: .6em;
	transform: rotate(-135deg);
}
.bm-faq[open] summary { margin-bottom: var(--wp--preset--spacing--20); }
.bm-faq ul { margin: var(--wp--preset--spacing--20) 0 0; padding-left: 1.2rem; }
.bm-faq li + li { margin-top: .6rem; }

/* Le plan du site, au pied de page : c'est une navigation, donc pas de puces. */
.bm-plan {
	list-style: none;
	padding-left: 0;
}
.bm-plan li + li { margin-top: .45rem; }

/* Le pied de page n'a plus de marge haute : il porte son propre fond blanc et un filet,
   ce qui suffit à le détacher. La marge laissait apparaître une bande de fond entre lui
   et la lame de clôture, visible surtout sur mobile.
   ⚠️ La marge à annuler n'est PAS celle du groupe intérieur (mise à zéro dans le contenu)
   mais celle de l'ENVELOPPE `.wp-block-template-part`, à laquelle WordPress applique ses
   24 px d'écart entre blocs frères. Mesuré : groupe `margin-top: 0`, enveloppe `24px`.
   C'est exactement le même piège que le « bout de lame » entre deux bandes colorées. */
main + .wp-block-template-part {
	margin-block-start: 0;
}


/* Deux lames pleine largeur qui se suivent doivent se TOUCHER. WordPress glisse
   24 px entre deux blocs frères d'une mise en page « contrainte » : entre deux fonds
   colorés, ce filet de crème se lit comme un bout de lame oublié, pas comme un blanc.
   Mettre la marge basse à zéro dans le contenu ne suffit pas — c'est la marge HAUTE
   du bloc suivant qu'il faut annuler. */
.wp-block-group.alignfull.has-background + .wp-block-group.alignfull.has-background {
	margin-block-start: 0;
}
/* Annuler la marge HAUTE de la seconde ne suffit pas : la marge BASSE de la première
   rouvre le même liseré. `:has(+ …)` permet de la viser — c'est la seule façon de
   désigner « la lame qui en précède une autre » en CSS. */
.wp-block-group.alignfull.has-background:has(+ .wp-block-group.alignfull.has-background) {
	/* !important obligatoire : la marge basse des lames est écrite EN LIGNE dans le
	   contenu (WordPress y met les réglages d'espacement du bloc), et une déclaration
	   en ligne bat n'importe quel sélecteur de feuille de styles. */
	margin-block-end: 0 !important;
}

/* ---------- la foire aux questions ----------
   Chaque question est un bloc « Détails » natif : l'ouverture et la fermeture sont
   assurées par le navigateur, sans une ligne de JavaScript, et le contenu replié reste
   DANS la page — donc trouvable par les moteurs et par la recherche du navigateur.
   La séparation entre les questions est portée par le cartouche blanc et non par un
   trait : le système proscrit les filets, c'est la surface qui sépare. */
.bm-faq summary {
	cursor: pointer;
	list-style: none;
	position: relative;
	padding-right: 2.6rem;
	font-family: var(--wp--preset--font-family--titre);
	font-size: var(--wp--preset--font-size--grand);
	line-height: 1.3;
}
.bm-faq summary::-webkit-details-marker { display: none; }
.bm-faq summary::after {                    /* le chevron, qui bascule à l'ouverture */
	content: "";
	position: absolute;
	right: .3rem;
	top: .34em;
	width: .78rem;
	height: .78rem;
	border-right: .17rem solid var(--wp--preset--color--terre);
	border-bottom: .17rem solid var(--wp--preset--color--terre);
	transform: rotate(45deg);
	transition: transform .2s ease;
}
.bm-faq[open] summary::after {
	top: .6em;
	transform: rotate(-135deg);
}
.bm-faq[open] summary { margin-bottom: var(--wp--preset--spacing--20); }
.bm-faq ul { margin: var(--wp--preset--spacing--20) 0 0; padding-left: 1.2rem; }
.bm-faq li + li { margin-top: .6rem; }

/* Le plan du site, au pied de page : c'est une navigation, donc pas de puces. */
.bm-plan {
	list-style: none;
	padding-left: 0;
}
.bm-plan li + li { margin-top: .45rem; }

/* Une lame pleine largeur qui TERMINE une page doit toucher le pied de page. Le pied
   porte une marge haute de 5,5 rem : au-dessus d'une lame colorée, elle laissait une
   bande de crème et un filet flottant, comme un morceau de lame oublié. On ne supprime
   pas cette marge — les pages qui ne finissent pas par une lame en ont besoin — on
   l'annule seulement dans ce cas précis, ce que `:has()` permet de dire exactement. */
main:has(> .wp-block-post-content > .alignfull.has-background:last-child) + .wp-block-template-part > .wp-block-group {
	margin-block-start: 0;
}

/* ---------- le bandeau de consentement ----------
   Il ne bloque pas la page : la CNIL demande que refuser soit AUSSI SIMPLE
   qu'accepter, pas qu'on emprisonne le visiteur. Les deux boutons ont donc la même
   taille, la même graisse et le même niveau — seule la couleur les distingue, et
   « Refuser » reste un vrai bouton, jamais un lien discret en bas. */
.bm-consentement {
	position: fixed;
	left: 0;
	bottom: 0;
	z-index: 60;
	width: 100%;
	padding: 1rem;
	pointer-events: none;              /* la page reste utilisable tout autour */
}
.bm-consentement[hidden] { display: none; }
.bm-consentement__carte {
	pointer-events: auto;
	max-width: 30rem;
	background: var(--wp--preset--color--blanc);
	border-radius: 24px;
	padding: 1.5rem 1.6rem;
	box-shadow: 0 6px 24px color-mix(in srgb, #2e2b25 22%, transparent);
	animation: bm-consentement-entree .28s ease-out both;
}
.bm-consentement__texte {
	margin-top: .6rem;
	font-size: .9375rem;
	line-height: 1.55;
	color: var(--wp--preset--color--gris);
}
.bm-consentement__actions {
	display: flex;
	flex-wrap: wrap;
	gap: .7rem;
	margin-top: 1.1rem;
}
.bm-consentement__bouton {
	font: inherit;
	font-size: .9375rem;
	font-weight: 600;
	padding: .7rem 1.4rem;
	border-radius: 999px;
	border: 1.5px solid var(--wp--preset--color--terre-fonce);
	background: transparent;
	color: var(--wp--preset--color--terre-fonce);
	cursor: pointer;
}
.bm-consentement__bouton--oui {
	background: var(--wp--preset--color--terre-fonce);
	color: #fff;
}
.bm-consentement__lien {
	margin-top: .9rem;
	font-size: .8125rem;
	color: var(--wp--preset--color--gris);
}
@keyframes bm-consentement-entree {
	from { opacity: 0; transform: translateY(1rem); }
	to   { opacity: 1; transform: none; }
}

/* Les emplacements encore vides. Volontairement voyants : ce n'est pas une décoration
   du site, c'est un pense-bête pour Marjolaine. Ils s'éteignent d'eux-mêmes une fois
   remplis, et ne s'affichent qu'avant la mise en ligne ou pour qui peut éditer. */
.bm-a-remplir {
	background: #ffe9a8;
	color: var(--wp--preset--color--encre);
	border-radius: 6px;
	padding: .05em .35em;
	box-shadow: inset 0 0 0 1.5px #d8a72b;
	font-weight: 600;
}

/* ---------- le menu mobile ----------
   La couche par défaut de WordPress est nue : fond blanc, petits liens en haut à
   gauche. Sur un site dont tout le reste est soigné, c'est la seule vue qui ressemble
   à un brouillon. Fond crème, entrées en cartouches blancs à la taille du doigt, un
   pictogramme par rubrique.
   ⚠️ `bm-nav` se pose sur le <ul>, PAS sur la couche : WordPress applique la classe du
   bloc au conteneur de liste, qui est un DESCENDANT de
   `.wp-block-navigation__responsive-container`. Écrire `.bm-nav .is-menu-open` ne cible
   donc rien. Piège vécu.
   Le pictogramme est en `background-image` sur un ::before, jamais en <img> : il est
   décoratif, il n'a rien à faire dans le texte lu par un lecteur d'écran. */
@media ( max-width: 781px ) {
	.wp-block-navigation__responsive-container.is-menu-open {
		box-sizing: border-box;
		padding: 1.4rem 1.3rem 3rem;
		overflow-x: hidden;
	}
	.is-menu-open .wp-block-navigation__responsive-container-content {
		box-sizing: border-box;
		width: 100%;
		max-width: 100%;
		/* On descend sous la croix de fermeture : à 2,4 rem, la première entrée
		   arrivait à sa hauteur et l'on risquait de fermer en voulant ouvrir. */
		margin-top: 3.6rem;
	}
	.is-menu-open .bm-nav {
		box-sizing: border-box;
		width: 100%;
		max-width: 100%;
		gap: .55rem;
	}
	.is-menu-open .bm-nav .wp-block-navigation-item {
		box-sizing: border-box;
		width: 100%;
	}
	.is-menu-open .bm-nav .wp-block-navigation-item__content {
		box-sizing: border-box;
		display: flex;
		align-items: center;
		gap: 1rem;
		width: 100%;
		padding: .85rem .2rem;
		font-family: var(--wp--preset--font-family--titre);
		font-size: 1.2rem;
		font-weight: 400;
		line-height: 1.25;
		text-decoration: none;
	}
	/* « Mentions légales » est plus longue et moins importante : plus discrète. */
	.is-menu-open .bm-nav [href*="/mentions-legales/"] {
		font-family: var(--wp--preset--font-family--texte);
		font-size: .95rem;
		color: var(--wp--preset--color--gris);
	}
	.is-menu-open .bm-nav .wp-block-navigation-item__content::before {
		content: "";
		flex: 0 0 auto;
		width: 1.75rem;
		height: 1.75rem;
		background: center / contain no-repeat;
	}
	/* Un pictogramme par rubrique. Le sélecteur tolère l'adresse relative comme absolue. */
	.is-menu-open .bm-nav [href*="/offre/"]::before              { background-image: url(assets/img/menu-offre.svg); }
	.is-menu-open .bm-nav [href*="/methodes-et-outils/"]::before { background-image: url(assets/img/objectif-outils.svg); }
	.is-menu-open .bm-nav [href*="/a-propos/"]::before           { background-image: url(assets/img/menu-apropos.svg); }
	.is-menu-open .bm-nav [href*="/contact/"]::before            { background-image: url(assets/img/etape-entretien.svg); }
	.is-menu-open .bm-nav [href*="/mentions-legales/"]::before { background-image: url(assets/img/menu-mentions.svg); width: 1.4rem; height: 1.4rem; }

	/* La croix de fermeture : assez grande pour le pouce, et bien dans la couche. */
	.wp-block-navigation__responsive-container-close {
		top: 1.5rem;
		right: 1.4rem;
		padding: .4rem;
		color: var(--wp--preset--color--encre);
	}
	.wp-block-navigation__responsive-container-close svg {
		width: 1.9rem;
		height: 1.9rem;
	}
}

/* Le logo officiel « Services à la personne ». Il vient d'une capture sur fond gris :
   le gris a été remplacé par du BLANC plutôt que détouré, parce que le cartouche est
   blanc et qu'une découpe en transparence laisserait des franges sur les ombres portées.
   ⚠️ À remplacer par le fichier officiel de la charte SAP dès qu'on l'aura. */
.bm-sap {
	margin-top: var(--wp--preset--spacing--30);
}
.bm-sap img {
	display: block;
	height: auto;
}
/* Au pied de page le fond est crème, pas blanc : le carré blanc de l'image se verrait.
   Un léger arrondi et une ombre douce le font passer pour une vignette assumée. */
.bm-sap-pied {
	margin: 0;
}
.bm-sap-pied img {
	display: block;
	height: auto;
	border-radius: 8px;
}

/* « Mentions légales » n'existe dans la navigation QUE pour le menu mobile, où l'on
   attend de tout trouver. Sur ordinateur la barre du haut doit rester aux rubriques
   utiles ; le pied de page porte déjà le lien, à l'endroit où on le cherche. */
@media ( min-width: 782px ) {
	.bm-nav .wp-block-navigation-item:has( [href*="/mentions-legales/"] ),
	.bm-nav .wp-block-navigation-item:has( [href*="/contact/"] ) {
		display: none;
	}
}

/* ---------- la césure ----------
   Le français a des mots très longs, et « psychopédagogique » en tête. Sur un écran
   étroit, WordPress impose `overflow-wrap: break-word` : le mot est tranché n'importe
   où et SANS trait d'union, ce qui donne « L'accompagn / ement psychopédag / ogique ».
   On active la césure typographique : le navigateur coupe alors aux endroits permis par
   les règles françaises et pose le trait d'union. Elle ne fonctionne que parce que la
   page déclare `lang="fr-FR"` — sans cette langue, aucun dictionnaire de coupure.
   `hyphenate-limit-chars` interdit de couper les mots courts et de laisser des bouts
   de deux lettres, qui se lisent plus mal que pas de césure du tout. */
/* 🔴 AUCUNE CÉSURE, NULLE PART. Consigne client du 2026-08-24 : un mot coupé par un
   trait d'union se lit mal dans un titre, et le titre est ce qu'on lit en premier.
   `hyphens: manual` désactive la coupure automatique ; le trait d'union ne reste
   possible que là où on l'écrit soi-même.

   ⚠️ Ne pas s'arrêter là : WordPress impose `overflow-wrap: break-word`, qui coupe un
   mot trop long n'importe où et SANS trait d'union — c'est le défaut d'origine, pire
   que la césure. Sur les titres on le neutralise donc aussi. Un mot qui ne tient pas
   déborde plutôt que de se briser, et c'est la taille de police fluide qui l'en
   empêche : voir `titre-1` dans theme.json, minimum abaissé pour que le mot le plus
   long de la page d'accueil tienne à 320 px. */
:root {
	-webkit-hyphens: manual;
	hyphens: manual;
}

h1, h2, h3, h4,
.bm-titre-lame {
	overflow-wrap: normal;
	word-break: normal;
}

/* Les titres profitent d'une répartition équilibrée des lignes là où c'est reconnu ;
   ailleurs la déclaration est ignorée sans dommage. */
h1, h2, h3 {
	text-wrap: balance;
}

/* ---------- le bouton d'appel fixe ----------
   Il suit le lecteur dès que l'en-tête a quitté l'écran. En bas à droite sur grand
   écran, où il ne recouvre rien ; en pleine largeur sur téléphone, à la taille du
   pouce. Il s'efface quand l'appel final est visible : deux fois le même bouton à
   l'écran, c'est un de trop. */
.bm-cta-fixe {
	position: fixed;
	z-index: 50;
	right: 1.25rem;
	bottom: 1.25rem;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	padding: .95rem 1.8rem;
	border-radius: 999px;
	background: var(--wp--preset--color--terre);
	color: #fff;
	font-family: var(--wp--preset--font-family--texte);
	font-size: 1.0625rem;
	font-weight: 600;
	text-decoration: none;
	box-shadow: 0 6px 20px color-mix( in srgb, #2e2b25 28%, transparent );

	opacity: 0;
	transform: translateY( .8rem );
	pointer-events: none;
	transition: opacity .22s ease, transform .22s ease;
}
.bm-cta-fixe.est-visible {
	opacity: 1;
	transform: none;
	pointer-events: auto;
}
.bm-cta-fixe:hover,
.bm-cta-fixe:focus {
	background: var(--wp--preset--color--terre-fonce);
	color: #fff;
}
@media ( max-width: 781px ) {
	.bm-cta-fixe {
		left: 1rem;
		right: 1rem;
		bottom: 1rem;
	}
}
/* Sans JavaScript, le lien reste utile : on le montre en bas de page plutôt que de le
   laisser invisible à jamais. */
.no-js .bm-cta-fixe { position: static; opacity: 1; transform: none; pointer-events: auto; }

/* Le vide sous l'en-tête était de 128 px sur téléphone, pour rien. On le resserre :
   sur un petit écran, chaque centimètre gagné rapproche le titre du pouce. */
@media ( max-width: 781px ) {
	main {
		margin-block-start: 0;
	}
	main > .wp-block-post-content > *:first-child {
		margin-block-start: 0;
	}
}

/* ---------- confort et accessibilité ---------- */
.wp-block-navigation .current-menu-item > a { text-decoration: underline; text-underline-offset: .25em; }

html { overflow-x: clip; }

/* Le focus clavier doit rester visible : exigence d'accessibilité, pas option
   esthétique. Le système impose un liseré de 2 px en accent. */
:where(a, button, input, textarea, select, summary):focus-visible {
	outline: 2px solid var(--wp--preset--color--terre);
	outline-offset: 2px;
}

::selection { background: var(--wp--preset--color--terre-clair); }

@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

/* En-tête sur mobile : le menu se range à droite du logo, sur la même ligne, et le
   bouton « Prendre contact » disparaît — le bouton fixe qui suit le défilement le
   remplace, et deux fois le même appel dans une barre de 390 px, c'est un de trop. */
@media (max-width: 781px) {
	.bm-entete {
		flex-wrap: nowrap;
		align-items: center;
		gap: 1rem;
	}

	.bm-entete .wp-block-site-title { min-width: 0; }

	.bm-entete .wp-block-buttons { display: none; }
}

/* --- Les retours d'expérience, un à la fois --------------------------------------
   Trois situations côte à côte se lisaient en diagonale et aucune n'était vraiment lue.
   On n'en montre plus qu'une, et l'on passe à la suivante d'un geste. Le défilement est
   natif (accroche par vue), donc il fonctionne au doigt sans une ligne de script ; le
   script n'ajoute que les pastilles et les flèches, pour la souris et le clavier. */

.bm-temoins__piste {
	display: flex;
	gap: var(--wp--preset--spacing--40, 2rem);
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scroll-behavior: smooth;
	scrollbar-width: none;
	-ms-overflow-style: none;
	/* Un peu d'air en haut et en bas pour que l'ombre des cartes ne soit pas coupée.
	   ⚠️ Pas de marge négative horizontale : elle décalait la carte de 12 px vers la
	   gauche par rapport au titre de la lame. */
	padding-block: 0.75rem;
}

.bm-temoins__piste::-webkit-scrollbar { display: none; }

/* WordPress ajoute `is-layout-flow` au groupe et pose 24 px de marge haute entre
   enfants successifs. En rangée, cela décale les vues les unes par rapport aux autres. */
.bm-temoins__piste > * { margin-block-start: 0 !important; }

.bm-temoin {
	flex: 0 0 100%;
	scroll-snap-align: start;
	min-width: 0;
}

@media (prefers-reduced-motion: reduce) {
	.bm-temoins__piste { scroll-behavior: auto; }
}

.bm-temoins__nav {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 1.25rem;
	margin-top: var(--wp--preset--spacing--30, 1.5rem);
}

.bm-temoins__fleche {
	width: 2.75rem;
	height: 2.75rem;
	border-radius: 50%;
	border: 1px solid var(--wp--preset--color--gris-clair);
	background: var(--wp--preset--color--blanc);
	color: var(--wp--preset--color--terre-fonce);
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: background-color .18s ease, border-color .18s ease, opacity .18s ease;
}

.bm-temoins__fleche::before {
	content: "";
	width: .6rem;
	height: .6rem;
	border-right: 2px solid currentColor;
	border-bottom: 2px solid currentColor;
}

.bm-temoins__fleche--precedent::before { transform: rotate(135deg); margin-left: .2rem; }
.bm-temoins__fleche--suivant::before   { transform: rotate(-45deg); margin-right: .2rem; }

.bm-temoins__fleche:hover:not(:disabled) {
	background: var(--wp--preset--color--terre-clair);
	border-color: transparent;
}

.bm-temoins__fleche:disabled { opacity: .32; cursor: default; }

.bm-temoins__pastilles { display: flex; gap: .55rem; }

.bm-temoins__pastille {
	width: .6rem;
	height: .6rem;
	padding: 0;
	border: 0;
	border-radius: 50%;
	background: var(--wp--preset--color--gris-clair);
	cursor: pointer;
	transition: background-color .18s ease, transform .18s ease;
}

.bm-temoins__pastille.est-active {
	background: var(--wp--preset--color--terre);
	transform: scale(1.25);
}

/* La photo d'un retour d'expérience, dans un rond. Le recadrage se fait par
   `object-fit`, pour que Marjolaine puisse remplacer l'image par la sienne sans se
   soucier de ses proportions. */
.bm-temoin__photo {
	width: 128px;
	height: 128px;
	flex: 0 0 auto;
	margin: 0;
	border-radius: 50%;
	overflow: hidden;
	background: var(--wp--preset--color--surface);
}

.bm-temoin__photo img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

@media (max-width: 781px) {
	.bm-temoin__photo { width: 96px; height: 96px; }
}
