/* Atelier Pollen — styles du thème.
   Les couleurs, tailles et espacements viennent de theme.json ; on ne trouve
   ici que ce qu'un theme.json ne sait pas exprimer : la géométrie de la
   barre, les déroulants et les états. Toute valeur écrite en dur ci-dessous
   est une dette qui rouvrira l'écart avec le mockup. */

/* ---------------------------------------------------------------- Socle -- */

html { -webkit-text-size-adjust: 100%; }

/* Le mockup fige la page en clair. Un thème bloc expose sinon un mode sombre
   automatique qui casserait la palette crème. */
:root { color-scheme: light only; }

/* La barre est collante : sans cette marge, une ancre amène le titre visé
   sous la barre au lieu de le poser dessous. */
[id] { scroll-margin-top: var(--wp--custom--barre--hauteur); }

/* ---------------------------------------------------------------- Barre -- */

/* Une seule navigation, à toutes les largeurs. Le rail latéral de la v119 a
   été retiré : c'était un schéma de site éditorial et non de commerce, et il
   imposait trois systèmes différents — rail, barre, panneau — pour un même
   site. */
/* Le collant d'un élément est borné par son bloc conteneur, et celui de la
   barre était le <header> du template part : 113px de haut. La barre se
   décollait donc après 36px de défilement et quittait l'écran avec lui —
   ensuite le rail d'ancres, lui, restait seul en haut de la fenêtre. Dans le
   prototype la barre est fille de <body> et tient sur toute la page.
   « display: contents » retire la boîte du gabarit sans toucher au balisage :
   la barre devient fille de .wp-site-blocks, haute de toute la page, et le
   collant porte jusqu'en bas. Le rôle « banner » ne se perd pas — .ap-barre
   est elle-même un <header>. */
.wp-site-blocks > header.wp-block-template-part { display: contents; }

/* Sans cela, l'écart entre blocs de theme.json s'appliquerait aux deux
   morceaux désormais promus enfants directs de .wp-site-blocks, et glisserait
   34px entre le bandeau d'annonce et la barre. */
.ap-annonce,
.ap-barre { margin-block-start: 0; }

/* Le même écart tombait à l'autre bout de la page, entre la dernière section
   et le pied. Là il ne se contentait pas d'espacer : le pied est à l'encre
   forêt et les sections de fin sont beiges, si bien que les 34px laissaient
   voir le crème du corps — une bande claire en travers de la page, qui se
   lit comme un défaut de chargement plutôt que comme une respiration.
   L'en-tête était déjà traité, le pied avait été oublié. */
.wp-site-blocks > footer.wp-block-template-part { margin-block-start: 0; }

/* Et le même écart encore, cette fois entre les sections d'une page. Quatre
   bandes claires sur l'accueil, dont une entre deux sections beiges — le
   crème du corps par-dessous, visible dans l'interstice.
   Ces sections-là peignent leur fond et posent leur propre rembourrage
   vertical : quatre-vingts pixels en haut pour la boutique et le tableau des
   taux, autant ailleurs. Les trente-quatre de WordPress ne s'y ajoutent pas,
   ils s'y intercalent, et la couleur du corps passe entre deux aplats qui
   devraient se toucher. Le prototype les fait se toucher.
   La liste est nommée plutôt que balayée d'un « > * » : « .ap-enveloppe »,
   qui est l'autre enfant direct qu'on trouve à ce niveau, porte le texte
   courant des pages légales, où l'écart entre blocs a sa raison d'être.
   Le « .is-layout-flow > » n'est pas décoratif. WordPress pose l'écart par
   « :root :where(.is-layout-flow) > * », qui pèse une seule classe — autant
   qu'une classe seule de cette liste. À poids égal c'est l'ordre qui tranche,
   et ses styles en ligne sont écrits après cette feuille : la liste nue
   perdait. On reprend donc son conteneur, ce qui fait deux classes et
   désigne exactement l'endroit où l'écart est posé. */
.is-layout-flow > .ap-heros,
.is-layout-flow > .ap-boutique,
.is-layout-flow > .ap-socle,
.is-layout-flow > .ap-puissance,
.is-layout-flow > .ap-prix,
.is-layout-flow > .ap-faq,
.is-layout-flow > .ap-taux,
.is-layout-flow > .ap-page-hero,
.is-layout-flow > .ap-chapitre-gamme { margin-block-start: 0; }

.ap-barre {
	position: sticky;
	top: 0;
	z-index: 40;
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 16px 40px;

	/* La hauteur de la barre n'est pas seulement décrite par cette variable :
	   le rail d'ancres et les ancres de titres s'y calent. Elle doit donc
	   faire loi, faute de quoi un bouton de recherche qui grandit d'un pixel
	   décale silencieusement tout ce qui se range dessous. */
	min-height: var(--wp--custom--barre--hauteur);
	box-sizing: border-box;
	background: var(--wp--preset--color--creme);
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
	transition: transform .28s ease;
}

.ap-barre__liens {
	display: flex;
	align-items: center;
	gap: 26px;

	/* Un cran au-dessus du « ui » du prototype, à la demande du client : les
	   quatre entrées sont la seule navigation du site, elles méritent d'être
	   lues sans effort. On reste sur l'échelle de theme.json — « body », le
	   cran suivant — plutôt que d'écrire 15px en dur. */
	font-size: var(--wp--preset--font-size--body);
	font-weight: 500;
	color: var(--wp--preset--color--encre);

	/* Les blocs prennent toute la hauteur de la barre pour que le déroulant
	   s'ouvre pile sous elle. Sans ce débordement des 16px de rembourrage,
	   « top:100% » tombe au-dessus du filet et laisse un interstice où le
	   survol se perd. */
	align-self: stretch;
	align-items: stretch;
	margin-block: -16px;
}

.ap-barre__liens > li { position: relative; display: flex; align-items: center; }
.ap-barre__liens a { padding-block: 4px; text-decoration: none; }

/* ----------------------------------------------------------- Déroulants -- */

/* Sans déroulant, les références et les gammes ne seraient atteignables
   nulle part depuis la barre. */
.ap-barre__liens .wp-block-navigation-submenu__toggle + .wp-block-navigation__submenu-container,
.ap-barre__liens .wp-block-navigation__submenu-container {
	top: calc(100% + 1px);
	left: -16px;
	min-width: 206px;
	padding-block: 10px;
	background: var(--wp--preset--color--creme);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	z-index: 45;
}

/* ---------------------------------------------------------------- Icônes -- */

.ap-barre__icones { display: flex; align-items: center; gap: 18px; }

.ap-barre__icones .ap-icone {
	width: 18px;
	height: 18px;
	opacity: .8;
	transition: opacity .16s ease;
}

.ap-barre__icones a:hover .ap-icone,
.ap-barre__icones a:focus-visible .ap-icone { opacity: 1; }

/* --------------------------------------------------------------- Mobile -- */

/* 900px et non 782px : c'est la largeur où les quatre entrées, le logo et
   les trois icônes cessent de tenir sur une ligne. Le point de rupture par
   défaut de WordPress laisserait la barre se tasser entre les deux. */
@media (width <= 900px) {
	.ap-barre { padding: 16px 22px; }
	.ap-barre__liens { display: none; }

	/* La barre s'escamote en descendant et revient en remontant. Sur un écran
	   de téléphone elle mange sinon un dixième de la hauteur utile en
	   permanence. Réservé au mobile : sur grand écran la place ne manque pas
	   et une barre qui disparaît désoriente plus qu'elle ne sert. */
	.ap-barre.est-repliee { transform: translateY(-100%); }
}

/* ------------------------------------------------------------- Titrage -- */

/* Anton porte déjà sa graisse ; la demander en gras déclenche une graisse
   synthétique que le navigateur fabrique en épaississant les contours. */
h1, h2, h3, h4 { font-synthesis: none; }

/* --------------------------------------------------------------- Gamme -- */

/* Chaque gamme propage sa teinte en cascade : les éléments internes lisent
   --gamme sans savoir laquelle est active. Ajouter une gamme ne demande
   alors qu'une règle de plus ici. */
.ap-gamme--fleurs      { --gamme: var(--wp--preset--color--fleurs);      --gamme-encre: var(--wp--preset--color--fleurs-encre); }
.ap-gamme--pressees    { --gamme: var(--wp--preset--color--pressees);    --gamme-encre: var(--wp--preset--color--pressees); }
.ap-gamme--enrichies   { --gamme: var(--wp--preset--color--enrichies);   --gamme-encre: var(--wp--preset--color--enrichies); }
.ap-gamme--innovations { --gamme: var(--wp--preset--color--innovations); --gamme-encre: var(--wp--preset--color--innovations); }

.ap-gamme__surtitre {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	color: var(--gamme-encre, var(--wp--preset--color--encre));
	text-transform: uppercase;
	letter-spacing: .18em;
}

/* --------------------------------------------------------- Accessibilité -- */

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

@media (prefers-reduced-motion: reduce) {
	.ap-barre { transition: none; }
}

/* -------------------------------------------------------------- Annonce -- */

/* Bandeau d'annonce, au-dessus de la barre. Livraison et analyses : les deux
   objections que se pose un acheteur de CBD avant toute autre. */
.ap-annonce {
	padding: 9px 20px;
	background: var(--wp--preset--color--encre);
	color: color-mix(in srgb, var(--wp--preset--color--creme) 80%, transparent);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .03em;
	text-align: center;
}

.ap-annonce p { margin: 0; }

/* ----------------------------------------------------------- Enveloppe -- */

/* Reprise du .wrap du mockup. Les sections occupent toute la largeur et
   recentrent leur contenu elles-memes : c'est le modele du prototype, et il
   evite d'avoir a faire passer alignfull a travers post-content, ou le bloc
   retombait a la largeur de contenu par defaut. */
.ap-enveloppe {
	max-width: 1180px;
	margin-inline: auto;
	padding-inline: 40px;
}

@media (width <= 900px) {
	.ap-enveloppe { padding-inline: 22px; }
}

/* ---------------------------------------------------------------- Héros -- */

/* Le héros touche la barre. L'écart entre blocs de theme.json — 34px — est
   posé par « :where(.wp-site-blocks) > * » sur le <main> de l'accueil, et
   glissait une bande de crème entre le filet de la barre et la photo. Le
   prototype n'en a pas ; à cette place, la moindre bande se lit comme un
   défaut de chargement. La règle porte sur .ap-accueil, qui n'existe que sur
   l'accueil : les autres gabarits gardent l'écart, qui leur va. */
.ap-accueil { margin-block-start: 0; }

.ap-heros {
	position: relative;
	padding-bottom: 52px;

	/* L'ecart entre blocs de theme.json inserait 34px entre la photo et la
	   plaque, a rebours du chevauchement qu'on cherche. */
	--wp--style--block-gap: 0;
}

/* Le prototype fige deux hauteurs franches et non une interpolation : 82svh
   au-dessus de 900px, 42svh en deçà. Le clamp qui tenait ici rendait 378px
   sur un écran de 900 de haut — la moitié de la photo attendue, et un héros
   qui ne portait plus la page.
   svh et non vh : sur téléphone, vh compte la barre d'adresse escamotable,
   et la photo déborde d'autant à l'arrivée. */
.ap-heros__bandeau {
	height: 42svh;
	overflow: hidden;
}

.ap-heros__bandeau,
.ap-heros__bandeau figure { margin: 0; }

.ap-heros__bandeau img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}

/* La plaque remonte sur la photo : c'est ce chevauchement qui fait tenir la
   composition, pas la photo seule.
   La remontee porte sur l'enveloppe et non sur la plaque : une marge
   negative posee sur la plaque fusionne avec celle de son parent, qui n'a
   ni bordure ni rembourrage haut pour l'en separer, et ne deplace alors
   plus rien. */
.ap-heros .ap-enveloppe {
	position: relative;
	z-index: 2;
	margin-top: -104px;
}

.ap-heros__plaque {
	max-width: 660px;
	padding: 36px 40px 38px;
	background: var(--wp--preset--color--blanc-casse);
}

.ap-heros__surtitre {
	display: block;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
	text-transform: uppercase;
	letter-spacing: .12em;
}

/* La seule taille hors de l'échelle des sept : le titre du héros est une
   affiche, pas un niveau de titre, et il doit suivre la largeur de l'écran. */
.ap-heros__titre {
	margin: 12px 0 18px;
	font-size: clamp(30px, 3.6vw, 50px);
	color: var(--wp--preset--color--encre);
}

/* Exclut le surtitre : dans le prototype c'est un <span>, donc epargne par
   une regle visant les paragraphes. Ici tout est paragraphe, et sans cette
   exclusion le surtitre passait de 11,5 a 18px. */
.ap-heros__plaque p:not(.ap-heros__surtitre) {
	max-width: var(--wp--custom--justification--2);
	margin-bottom: 28px;
	font-size: var(--wp--preset--font-size--lead);
	line-height: 1.6;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 70%, transparent);
}

/* Au-dessus de 900px, la plaque ne suit plus la photo : elle se pose dedans.
   Le heros fait alors 82svh en tout — la photo seule — et l'enveloppe vient
   se caler a 52px de son bas. C'est ce que fait le prototype, et c'est ce qui
   change tout : en flux, la plaque s'ajoutait a la photo et le heros pesait
   1077px sur un ecran de 900 ; le titre et son bouton tombaient sous le pli
   alors qu'ils sont la raison d'etre du bandeau.
   La plaque se dimensionne sur son contenu plutot que sur 660px fixes :
   l'accroche tient sur deux lignes, jamais trois — « atelier » ne doit pas se
   retrouver seul en dessous — et c'est la plaque qui s'ajuste au titre,
   bornee a la colonne. */
@media (width >= 901px) {
	.ap-heros {
		padding-bottom: 0;
	}

	.ap-heros__bandeau { height: 82svh; }

	.ap-heros .ap-enveloppe {
		position: absolute;
		inset: auto 0 52px;
		margin-top: 0;
	}

	.ap-heros__plaque {
		width: max-content;
		max-width: 100%;
	}

	.ap-heros__titre { white-space: nowrap; }
}

/* Sous 900px, c'est le seuil qui commande : avec le bandeau d'annonce, la
   barre, un surtitre de trois lignes et un titre de trois, le bouton partait
   a 798px sur un ecran de 844. Le prototype tranche en trois gestes — la
   plaque mord 150px sur la photo au lieu de 56, le surtitre disparait, le
   paragraphe aussi. Les deux textes retires ne sont pas perdus : le
   paragraphe dit ce que les trois volets du recit redisent juste apres. */
@media (width <= 900px) {
	.ap-heros { padding-bottom: 34px; }
	.ap-heros .ap-enveloppe { margin-top: -150px; }
	.ap-heros__plaque { max-width: none; padding: 26px 24px 28px; }

	/* Restreint au héros. « .ap-heros__surtitre » porte le nom du bloc où le
	   style est né, mais c'est le surtitre de tout le site : la boutique, la
	   traçabilité, la grille tarifaire et la FAQ s'en servent aussi. Écrite
	   sans portée, cette règle les effaçait tous les quatre sur téléphone —
	   le prototype ne retire que celui du bandeau. */
	.ap-heros .ap-heros__surtitre,
	.ap-heros__plaque p:not(.ap-heros__surtitre) { display: none; }
}

/* ------------------------------------------------------------ Recherche -- */

/* Le bloc Recherche de WordPress rend un bouton plein, herite du style des
   boutons du theme. Dans la barre il doit etre une icone posee parmi les
   autres, pas un pave sombre. */
.ap-barre__icones .wp-block-search__button {
	padding: 0;
	background: transparent;
	border: 0;
	color: var(--wp--preset--color--encre);
	opacity: .8;
	transition: opacity .16s ease;
}

.ap-barre__icones .wp-block-search__button:hover,
.ap-barre__icones .wp-block-search__button:focus-visible {
	background: transparent;
	opacity: 1;
}

/* Le bouton est un conteneur flex, et son contenu s'y calait en haut : la
   colonne fait 44px — c'est le champ de saisie masqué qui la dimensionne —
   alors que l'icône n'en fait que dix-huit. La loupe flottait donc neuf
   pixels au-dessus du compte et du panier, qui sont, eux, centrés. */
.ap-barre__icones .wp-block-search__button {
	align-items: center;
	justify-content: center;
}

/* « min-width » autant que « width » : WordPress pose un plancher de 24px sur
   cette icône, et un plancher l'emporte sur la largeur demandée. La règle
   avait donc l'air correcte et ne changeait rien — la loupe restait d'un
   tiers plus grosse que les deux autres pictogrammes. */
.ap-barre__icones .wp-block-search__button svg {
	width: 18px;
	height: 18px;
	min-width: 18px;
	min-height: 18px;
	fill: currentColor;
}

.ap-barre__icones .wp-block-search { margin: 0; }

/* La loupe rejoint le compte et le panier sur leur cible tactile. Le champ
   masqué donnait déjà 44px de haut, mais dix-huit de large : trois
   pictogrammes côte à côte dont un seul se manque au doigt. */
@media (pointer: coarse) {
	.ap-barre__icones .wp-block-search__button {
		min-width: 44px;
		min-height: 44px;
	}
}

/* ------------------------------------------------------------- Boutique -- */

.ap-boutique { padding: 80px 0 104px; }

/* Hors de l'échelle des sept, comme le titre du héros : à cette place le
   texte est une affiche et suit la largeur de l'écran. */
.ap-boutique__titre {
	max-width: none;
	margin: 0 0 16px;
	font-size: clamp(30px, 4.4vw, 58px);
	line-height: 1.04;
	letter-spacing: -.02em;
}

/* En ch et non en px : la mesure qui compte pour la lisibilité est le nombre
   de caractères par ligne, pas une largeur absolue. */
.ap-boutique__chapo {
	max-width: 54ch;
	margin: 0 0 34px;
	font-size: 15.5px;
	line-height: 1.62;
	opacity: .84;
}

/* --------------------------------------------------------------- Ancres -- */

/* La barre reste accrochée pendant la descente : on sait toujours dans
   quelle gamme on se trouve. Elle ancre, elle ne filtre pas — les quatre
   gammes restent affichées à la suite. */
.ap-ancres {
	position: sticky;

	/* Le rail se glisse de 16px sous la barre : son filet supérieur passe
	   derrière elle, et les deux bandes se lisent comme une seule pièce. Posé
	   pile à la hauteur de la barre, il laissait paraître une ligne entre les
	   deux. */
	top: calc(var(--wp--custom--barre--hauteur) - 16px);
	z-index: 30;

	/* Flex, comme le <nav> du prototype : la piste devient élément flex, se
	   dimensionne sur son contenu et se centre par ses marges automatiques.
	   En bloc elle occupait toute la largeur et les quatre gammes se
	   rangeaient à gauche. */
	display: flex;
	margin-block: 0 52px;
	padding: 16px 40px;
	background: var(--wp--preset--color--blanc-casse);
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 18%, transparent);
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 18%, transparent);
}

.ap-ancres__piste { display: flex; gap: 0; }

.ap-ancre {
	position: relative;
	display: flex;
	align-items: baseline;
	gap: 9px;
	padding: 14px 26px 12px 0;
	margin-right: 26px;
	color: inherit;
	text-decoration: none;
	white-space: nowrap;
	opacity: .38;
	transition: opacity .18s;
}

.ap-ancre:hover { opacity: .72; }

.ap-ancre.est-active {
	opacity: 1;
	color: var(--gamme);
}

/* Le filet s'arrête avant la marge droite : il souligne le mot, pas
   l'espace qui le suit. */
.ap-ancre.est-active::after {
	content: "";
	position: absolute;
	inset: auto 26px -1px 0;
	height: 3px;
	background: var(--gamme);
}

.ap-ancre__num {
	font-family: var(--wp--preset--font-family--mono);
	font-size: 10.5px;
	letter-spacing: .16em;
	opacity: .65;
}

.ap-ancre__mot {
	font-family: var(--wp--preset--font-family--display);
	font-size: clamp(17px, 1.9vw, 25px);
	line-height: 1.18;
}

/* ------------------------------------------------------------- Chapitre -- */

/* Le numéro et le geste précèdent les produits : on annonce ce qu'on va
   voir avant de le montrer. */
.ap-chapitre {
	display: grid;
	grid-template-columns: auto 1fr;
	gap: 0 22px;
	align-items: start;
	margin: 0 0 26px;

	/* 6px collaient le numéro et le titre au filet, qui se lisait alors comme
	   un soulignement du chapitre précédent plutôt que comme l'ouverture de
	   celui-ci. Le filet a besoin d'air en dessous pour désigner ce qui
	   suit. */
	padding-top: 20px;
	border-top: 1px solid var(--gamme);
}

.ap-chapitre__num {
	grid-row: span 3;
	padding-top: 9px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: 11px;
	letter-spacing: .16em;
	color: var(--gamme);
}

.ap-chapitre__titre {
	margin: 4px 0 2px;
	font-size: clamp(28px, 3.6vw, 46px);
	line-height: 1.02;
	letter-spacing: -.017em;
	color: var(--gamme);
}

.ap-chapitre__surtitre {
	display: block;
	margin-bottom: 12px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: 11px;
	letter-spacing: .15em;
	text-transform: uppercase;
	opacity: .6;
}

.ap-chapitre__texte {
	max-width: 58ch;
	margin: 0 0 4px;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.64;
	opacity: .88;
}

/* -------------------------------------------------------------- Rangée -- */

.ap-rangee {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 18px;
	margin-bottom: 62px;
}

/* ------------------------------------------------------------- Produit -- */

.ap-produit {
	display: flex;
	flex-direction: column;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
	overflow: hidden;
	transition: transform .2s ease, box-shadow .2s ease;
}

.ap-produit:hover {
	transform: translateY(-4px);
	box-shadow: 0 16px 28px color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
}

.ap-produit__visuel {
	position: relative;
	aspect-ratio: 1;
	overflow: hidden;
	background: var(--wp--preset--color--pierre);
}

/* Deux photos superposées : la seconde est un macro qui se substitue à la
   première au survol. C'est ce qui remplace la mise en main, impossible
   derrière un écran. */
.ap-produit__visuel img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center 30%;
	opacity: 0;
	transition: opacity .35s ease;
}

.ap-produit__visuel img:first-child { opacity: 1; }
.ap-produit:hover .ap-produit__visuel img:first-child { opacity: 0; }
.ap-produit:hover .ap-produit__visuel img:nth-child(2) { opacity: 1; }

.ap-produit__corps {
	display: flex;
	flex: 1;
	flex-direction: column;
	padding: 14px 16px 18px;
}

.ap-produit__nom {
	margin-bottom: 5px;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.15;
	text-transform: none;
}

.ap-produit__desc {
	flex: 1;
	margin-bottom: 10px;
	font-size: var(--wp--preset--font-size--sm);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 60%, transparent);
}

.ap-produit__pied {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 8px;
	margin-top: auto;
}

.ap-produit__prix {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--ui);
	font-weight: 500;
}

.ap-produit__prix--attente { opacity: .55; }

.ap-produit__unite {
	display: block;
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 400;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 45%, transparent);
}

.ap-produit__lien {
	padding-top: 1px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	color: var(--wp--preset--color--foret);
	letter-spacing: .02em;
	white-space: nowrap;
	text-decoration: none;
}

/* --------------------------------------------------------------- Mobile -- */

@media (width <= 900px) {
	.ap-boutique { padding: 52px 0 72px; }
	.ap-boutique__titre br { display: none; }

	/* Le rail suit le retrait de la barre : 22px et non 40. */
	.ap-ancres { padding-inline: 22px; }

	/* La barre d'ancres déborde horizontalement plutôt que de passer à la
	   ligne : quatre gammes sur deux lignes cesseraient de se lire comme
	   une progression.
	   « overflow-x: auto » ramène aussi à zéro le min-width automatique de
	   l'élément flex : sans lui, la piste refuserait de se réduire sous la
	   largeur de ses quatre gammes et déborderait de l'écran au lieu de
	   défiler. */
	.ap-ancres__piste {
		overflow-x: auto;
		scrollbar-width: none;
		margin-inline: -22px;
	}

	.ap-ancres__piste::-webkit-scrollbar { display: none; }
	.ap-ancre { flex: 0 0 auto; padding: 11px 16px 12px 0; margin-right: 16px; }
	.ap-ancre:first-child { margin-left: 22px; }

	.ap-chapitre { grid-template-columns: 1fr; gap: 0; }
	.ap-chapitre__num { grid-row: auto; }

	/* Les fiches défilent au doigt. La description et le lien disparaissent :
	   à 78% de largeur d'écran, la photo et le prix suffisent à choisir. */
	.ap-rangee {
		display: flex;
		gap: 12px;
		overflow-x: auto;
		scroll-snap-type: x mandatory;
		scrollbar-width: none;
		margin: 0 -22px 44px;
		padding-inline: 22px;
	}

	.ap-rangee::-webkit-scrollbar { display: none; }
	.ap-produit { flex: 0 0 78%; scroll-snap-align: start; }
	.ap-produit__desc, .ap-produit__lien { display: none; }
}

/* Le taux figure sur chaque fiche : c'est une obligation reglementaire pour
   un produit au CBD, pas un argument commercial. Discret mais present. */
.ap-produit__taux {
	margin: 0 0 10px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .06em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 55%, transparent);
}

/* La fiche entiere est cliquable, mais la cible reste un vrai lien : le
   prototype posait un onclick sur la carte, ce qui la rend inatteignable au
   clavier et invisible pour un lecteur d'ecran. Le lien est etire sur la
   carte et le reste du contenu repasse au-dessus. */
.ap-produit { position: relative; }

.ap-produit__lien-total {
	position: absolute;
	inset: 0;
	z-index: 1;
}

.ap-produit__visuel,
.ap-produit__corps { position: relative; }

.ap-produit:focus-within {
	outline: 2px solid var(--wp--preset--color--encre);
	outline-offset: 2px;
}

/* ---------------------------------------------------------------- Socle -- */

/* « De la plante au colis ». Plus aucune rotation automatique sur grand
   écran : elle cachait deux messages sur trois. Les trois volets se lisent
   d'un regard, côte à côte. Le défilement horizontal ne subsiste que sur
   téléphone, où trois colonnes ne tiennent pas. */
.ap-socle {
	padding: 34px 0 6px;
	background: var(--wp--preset--color--creme);
}

.ap-socle .ap-heros__surtitre { margin-bottom: 6px; }

.ap-piste {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 38px;
}

.ap-volet { padding: 40px 0 34px; }

.ap-volet figure { margin: 0; }

.ap-volet img {
	display: block;
	width: 100%;
	aspect-ratio: 4 / 3;
	object-fit: cover;
}

.ap-volet__num {
	display: block;
	margin: 0 0 12px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: 11px;
	letter-spacing: .18em;
	opacity: .42;
}

.ap-volet__titre {
	margin: 0 0 12px;
	font-size: clamp(23px, 2.3vw, 31px);
	line-height: 1.06;
	letter-spacing: -.015em;
	text-transform: none;
}

.ap-volet__texte {
	max-width: var(--wp--custom--justification--3);
	margin: 0;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.66;
	opacity: .86;
}

/* Les puces ne servent qu'au défilement tactile. */
.ap-puces { display: none; }

@media (width <= 900px) {
	.ap-piste {
		display: flex;
		overflow-x: auto;
		overflow-y: hidden;
		scroll-snap-type: x mandatory;
		scrollbar-width: none;
		touch-action: pan-x;
		gap: 0;
	}

	.ap-piste::-webkit-scrollbar { display: none; }

	.ap-volet {
		flex: 0 0 100%;
		scroll-snap-align: start;
		display: grid;
		grid-template-columns: 1fr;
		gap: 20px;
		padding: 34px 0 30px;
	}

	/* La photo passe devant le texte : sur un écran étroit c'est elle qui
	   fait reconnaître l'étape. */
	.ap-volet figure { order: -1; }
	.ap-volet img { aspect-ratio: 16 / 9; }

	/* Les puces disent où l'on en est et permettent d'y aller. */
	.ap-puces {
		display: flex;
		gap: 9px;
		padding: 0 0 34px;
	}

	.ap-puces button {
		width: 30px;
		height: 3px;
		padding: 0;
		border: 0;
		background: color-mix(in srgb, var(--wp--preset--color--encre) 18%, transparent);
		cursor: pointer;
		transition: background .25s ease;
	}

	.ap-puces button.on { background: var(--wp--preset--color--encre); }
}

/* ------------------------------------------------ Visuel en attente -- */

/* Huit références sur treize n'ont pas encore de photo. Le cadre reste —
   il tient la grille — mais il le dit, au lieu de passer pour un défaut
   d'affichage. */
.ap-produit__visuel--vide {
	display: grid;
	place-content: center;
	gap: 6px;
	text-align: center;
	background: var(--wp--preset--color--pierre);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 40%, transparent);
}

.ap-produit__visuel--vide::before {
	content: "";
	display: block;
	width: 26px;
	height: 26px;
	margin: 0 auto;
	border: 1px solid currentColor;
	border-radius: 2px;
	opacity: .5;
}

.ap-produit__visuel--vide span {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .12em;
	text-transform: uppercase;
}

/* ---------------------------------------------- Garde-fou des grilles -- */

/* WordPress pose une marge haute sur tous les enfants d'un groupe sauf le
   premier. Dans une grille, cela fait remonter la premiere fiche et
   descendre les autres — un decalage qui ne ressemble pas a un probleme de
   marges et se cherche longtemps.
   Les rangees sont sorties du systeme de blocs, mais la regle est neutralisee
   ici pour que les reencapsuler depuis l'editeur ne ramene pas le defaut. */
.ap-rangee > *,
.ap-piste > *,
.ap-ancres__piste > * {
	margin-block: 0;
}

/* --------------------------------------------------------- Pied de page -- */

/* --accent est un rôle transverse, distinct des gammes. Sa valeur coïncide
   aujourd'hui avec le vert des fleurs, mais les deux ne doivent pas bouger
   ensemble : il vit donc dans custom et non dans la palette, où il aurait
   ajouté une pastille en double dans le sélecteur de couleur. */
.ap-pied {
	padding: 64px 0 26px;
	background: var(--wp--preset--color--encre);
	color: color-mix(in srgb, var(--wp--preset--color--creme) 70%, transparent);
}

.ap-pied__grille {
	display: grid;
	grid-template-columns: 1.6fr 1fr 1fr 1.3fr;
	gap: 40px;
	margin-bottom: 48px;
}

.ap-pied__logo {
	display: block;
	height: 40px;
	width: auto;
	margin-bottom: 16px;
}

.ap-pied h2,
.ap-pied h3,
.ap-pied h4 {
	margin-bottom: 14px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--wp--custom--accent);
}

/* Cible les colonnes seulement : appliquée à tous les paragraphes du pied,
   la largeur de 260px écraserait aussi la mention légale, qui a besoin de
   toute sa mesure. */
.ap-pied__grille p {
	max-width: 260px;
	font-size: var(--wp--preset--font-size--ui);
}

.ap-pied ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

.ap-pied li {
	margin-bottom: 9px;
	font-size: var(--wp--preset--font-size--ui);
}

.ap-pied a {
	color: inherit;
	text-decoration: none;
	transition: color .16s ease;
}

.ap-pied a:hover,
.ap-pied a:focus-visible { color: var(--wp--preset--color--blanc-casse); }

/* ------------------------------------------------------------- Infolettre */

.ap-pied__lettre input[type="email"] {
	width: 100%;
	margin-bottom: 10px;
	padding: 8px 0;
	background: transparent;
	border: 0;
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--creme) 30%, transparent);
	border-radius: 0;
	color: var(--wp--preset--color--blanc-casse);
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--ui);
}

.ap-pied__lettre input::placeholder {
	color: color-mix(in srgb, var(--wp--preset--color--creme) 40%, transparent);
}

.ap-pied__lettre button {
	padding: 0;
	background: none;
	border: 0;
	color: var(--wp--custom--accent);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	cursor: pointer;
}

/* ------------------------------------------------------------ Mentions -- */

/* La mention légale est longue à dessein : elle doit dire la majorité, le
   taux et l'absence de vertu thérapeutique. C'est ce dernier point qui
   requalifierait le produit en médicament s'il manquait. */
.ap-pied__legal {
	max-width: var(--wp--custom--justification--4);
	margin-bottom: 26px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.7;
	color: color-mix(in srgb, var(--wp--preset--color--creme) 40%, transparent);
}

.ap-pied__bas {
	display: flex;
	justify-content: space-between;
	gap: 16px;
	padding-top: 22px;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--creme) 12%, transparent);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	color: color-mix(in srgb, var(--wp--preset--color--creme) 45%, transparent);
}

@media (width <= 900px) {
	.ap-pied { padding: 44px 0 22px; }
	.ap-pied__grille { grid-template-columns: 1fr 1fr; gap: 28px; margin-bottom: 34px; }
	.ap-pied__bas { flex-direction: column; gap: 8px; }
}

/* ------------------------------------------------- Emplacements réservés -- */

/* Même langage visuel partout : un cadre qui tient la place exacte de
   l'élément attendu et l'annonce, plutôt qu'un vide qu'on prendrait pour un
   défaut d'affichage. Les visuels définitifs viendront du client. */
.ap-attente {
	display: inline-grid;
	place-content: center;
	border: 1px dashed currentColor;
	border-radius: 2px;
	opacity: .45;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .12em;
	text-transform: uppercase;
	text-align: center;
}

/* Le gabarit du logo tient sa hauteur exacte : quand le vrai fichier
   arrivera, rien ne bougera autour. */
.ap-attente--logo {
	height: 40px;
	min-width: 168px;
	padding-inline: 12px;
	margin-bottom: 16px;
}

.ap-attente--marque {
	height: 30px;
	min-width: 30px;
	margin-bottom: 0;
}

/* ------------------------------------------- Entrée du questionnaire -- */

/* Posée sous le chapô de la boutique, séparée par un filet : c'est au
   moment de regarder treize références qu'on hésite. */
.ap-boutique__quiz {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px 16px;
	margin-top: 22px;
	padding-top: 20px;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 14%, transparent);
}

.ap-boutique__quiz span {
	font-size: var(--wp--preset--font-size--body);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 70%, transparent);
}

.ap-boutique__quiz a {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	font-size: var(--wp--preset--font-size--body);
	font-weight: 600;
	color: var(--wp--preset--color--encre);
	text-decoration: underline;
	text-underline-offset: 4px;
}

/* ------------------------------------------------------------- Section -- */

/* En-tête commun aux sections de bas de page. */
.ap-section-tete {
	max-width: var(--wp--custom--justification--3);
	margin-bottom: 36px;
}

.ap-section-tete h2 {
	margin: 0;
	font-size: clamp(30px, 4.4vw, 58px);
	line-height: 1.04;
	letter-spacing: -.02em;
}

.ap-section-tete p {
	margin-top: 14px;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.7;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 70%, transparent);
}

/* ----------------------------------------------------------------- FAQ -- */

.ap-faq { padding: 80px 0; background: var(--wp--preset--color--creme); }

.ap-faq__liste { max-width: var(--wp--custom--justification--4); }

/* <details> plutôt qu'un bouton à bascule : l'état ouvert/fermé est alors
   porté par l'élément lui-même, donc annoncé aux lecteurs d'écran et
   navigable au clavier sans une ligne de script. Le prototype utilisait un
   bouton dont l'état n'était visible qu'à l'œil. */
.ap-faq__item {
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
}

.ap-faq__item:first-child {
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
}

.ap-faq__q {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 20px;
	padding: 20px 2px;
	font-weight: 600;
	font-size: var(--wp--preset--font-size--body);
	color: var(--wp--preset--color--encre);
	cursor: pointer;
	list-style: none;
}

/* Safari dessine sinon son propre triangle en plus de notre signe. */
.ap-faq__q::-webkit-details-marker { display: none; }

.ap-faq__q::after {
	content: "+";
	flex-shrink: 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--h3);
	line-height: 1;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 40%, transparent);
	transition: transform .25s ease;
}

.ap-faq__item[open] .ap-faq__q::after { transform: rotate(45deg); }

.ap-faq__item p {
	max-width: var(--wp--custom--justification--3);
	padding: 0 2px 22px;
	margin: 0;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.75;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 65%, transparent);
}

.ap-faq__item a { color: var(--wp--preset--color--foret); font-weight: 500; }

/* Le dépliage s'anime là où le navigateur sait interpoler une hauteur
   automatique. Ailleurs il s'ouvre d'un coup, ce qui reste correct. */
@supports (interpolate-size: allow-keywords) {
	.ap-faq__item::details-content {
		block-size: 0;
		overflow: hidden;
		transition: block-size .35s ease, content-visibility .35s allow-discrete;
	}

	.ap-faq__item[open]::details-content { block-size: auto; }
}

@media (width <= 900px) {
	.ap-faq { padding: 52px 0; }
}

/* ---------------------------------------------------------------- Prix -- */

.ap-prix { padding: 80px 0; background: var(--wp--preset--color--creme); }

.ap-prix__duo {
	display: grid;
	grid-template-columns: 1fr 240px;
	gap: 40px;
	align-items: stretch;
}

.ap-calc {
	padding: 30px 32px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-calc__gammes,
.ap-calc__formats {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin: 0 0 24px;
	padding: 0;
	list-style: none;
	border: 0;
}

.ap-calc__formats { gap: 8px; margin-bottom: 30px; }

.ap-calc__gammes button,
.ap-calc__formats button {
	padding: 9px 16px;
	background: transparent;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 15%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	color: var(--wp--preset--color--encre);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .03em;
	cursor: pointer;
	transition: background .2s, color .2s, border-color .2s;
}

/* La teinte de la gamme sélectionnée passe au bouton : c'est le même code
   couleur que dans la boutique, on ne réapprend rien. */
.ap-calc__gammes button[aria-pressed="true"] {
	background: var(--gamme, var(--wp--preset--color--encre));
	border-color: var(--gamme, var(--wp--preset--color--encre));
	color: var(--wp--preset--color--blanc-casse);
}

.ap-calc__formats button {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 50px;
	padding: 9px 13px;
	font-size: var(--wp--preset--font-size--ui);
	background: var(--wp--preset--color--blanc-casse);
}

.ap-calc__formats button[aria-pressed="true"] {
	background: var(--wp--preset--color--encre);
	border-color: var(--wp--preset--color--encre);
	color: var(--wp--preset--color--blanc-casse);
}

/* Le prix au gramme sous chaque format : c'est le critère de choix réel, et
   personne ne devrait avoir à cliquer les cinq options pour le reconstituer. */
.ap-calc__gramme {
	font-size: var(--wp--preset--font-size--xs);
	opacity: .6;
}

.ap-calc__ecran {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 30px;
}

.ap-calc__stat { display: flex; flex-direction: column; gap: 4px; }

.ap-calc__libelle {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.ap-calc__valeur {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--h2);
	line-height: 1;
	text-transform: none;
}

.ap-calc__jauge {
	flex: 1;
	min-width: 140px;
	height: 10px;
	overflow: hidden;
	background: color-mix(in srgb, var(--wp--preset--color--encre) 8%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-calc__jauge span {
	display: block;
	height: 100%;
	background: var(--gamme, var(--wp--preset--color--encre));
	border-radius: var(--wp--custom--rayon--surface);
	transition: width .4s cubic-bezier(.2, .8, .2, 1), background .3s;
}

.ap-calc__note {
	margin: 20px 0 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 45%, transparent);
}

.ap-prix__visuel {
	position: relative;
	margin: 0;
	overflow: hidden;
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-prix__visuel img {
	position: absolute;
	inset: 0;
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

@media (width <= 900px) {
	.ap-prix { padding: 52px 0; }
	.ap-prix__duo { grid-template-columns: 1fr; }
	.ap-prix__visuel { display: none; }
	.ap-calc { padding: 24px 20px; }
	.ap-calc__ecran { flex-direction: column; align-items: flex-start; gap: 16px; }
	.ap-calc__jauge { order: 3; width: 100%; }
}

@media (width <= 480px) {
	.ap-calc__valeur { font-size: var(--wp--preset--font-size--h3); }
}

/* ----------------------------------------------------------- Puissance -- */

/* Section à l'encre forêt : la traçabilité tranche visuellement avec le
   reste de la page, parce qu'elle répond à une objection plutôt qu'elle ne
   vend. */
.ap-puissance {
	padding: 80px 0;
	background: var(--wp--preset--color--foret);
	color: var(--wp--preset--color--blanc-casse);
}

.ap-puissance .ap-section-tete { max-width: var(--wp--custom--justification--2); }

.ap-puissance .ap-section-tete p {
	color: color-mix(in srgb, var(--wp--preset--color--creme) 72%, transparent);
}

.ap-puissance .ap-heros__surtitre {
	color: color-mix(in srgb, var(--wp--preset--color--creme) 60%, transparent);
}

/* -------------------------------------------------------------- Trace -- */

.ap-trace { margin-bottom: 24px; }

.ap-trace__etape {
	display: block;
	margin-bottom: 10px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .05em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--creme) 50%, transparent);
}

.ap-trace__gammes,
.ap-trace__produits {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin: 0 0 14px;
	padding: 0;
	border: 0;
}

.ap-trace__gammes button,
.ap-trace__produits button {
	padding: 9px 16px;
	background: transparent;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--creme) 30%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	color: var(--wp--preset--color--blanc-casse);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .03em;
	cursor: pointer;
	transition: background .2s, color .2s, border-color .2s;
}

.ap-trace__gammes button[aria-pressed="true"] {
	background: var(--gamme, var(--wp--preset--color--blanc-casse));
	border-color: var(--gamme, var(--wp--preset--color--blanc-casse));
	color: var(--wp--preset--color--blanc-casse);
}

.ap-trace__produits button[aria-pressed="true"] {
	background: var(--wp--preset--color--blanc-casse);
	border-color: var(--wp--preset--color--blanc-casse);
	color: var(--wp--preset--color--encre);
}

/* ---------------------------------------------------------- Révélation -- */

.ap-revelation {
	display: grid;
	grid-template-columns: 1.5fr 1fr;
	gap: 2px;
	overflow: hidden;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--creme) 15%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-revelation__photos {
	position: relative;
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 2px;
	background: var(--wp--preset--color--encre);
}

.ap-tuile {
	position: relative;
	aspect-ratio: 1;
	overflow: hidden;
}

.ap-tuile img {
	position: absolute;
	inset: 0;
	z-index: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Un voile sombre unifie deux photos prises dans des lumières différentes,
   et fait tenir le libellé par-dessus. */
.ap-tuile:not(.est-vide)::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	background: color-mix(in srgb, var(--wp--preset--color--encre) 22%, transparent);
}

.ap-tuile__libelle {
	position: absolute;
	bottom: 14px;
	left: 16px;
	z-index: 2;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .05em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--creme) 80%, transparent);
}

.ap-tuile.est-vide {
	display: flex;
	align-items: center;
	justify-content: center;
	background: color-mix(in srgb, var(--wp--preset--color--creme) 10%, transparent);
}

.ap-tuile.est-vide .ap-tuile__libelle {
	position: static;
	font-size: var(--wp--preset--font-size--sm);
	opacity: .7;
}

/* La méthode d'extraction apparaît au survol des photos : elle explique
   l'écart de concentration sans occuper la place en permanence. */
.ap-revelation__voile {
	position: absolute;
	inset: 0;
	z-index: 3;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 20px;
	text-align: center;
	background: color-mix(in srgb, var(--wp--preset--color--creme) 14%, transparent);
	backdrop-filter: blur(14px);
	opacity: 0;
	pointer-events: none;
	transition: opacity .35s ease;
}

.ap-revelation__photos:hover .ap-revelation__voile:not(:empty),
.ap-revelation__photos:focus-within .ap-revelation__voile:not(:empty) { opacity: 1; }

.ap-revelation__voile span {
	padding: 10px 18px;
	background: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--creme) 30%, transparent);
	border-radius: var(--wp--custom--rayon--pastille);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--ui);
	color: var(--wp--preset--color--blanc-casse);
}

/* ------------------------------------------------------------ Panneau -- */

.ap-panneau {
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 6px;
	padding: 18px 20px;
	background: var(--wp--preset--color--encre);
	border-left: 4px solid var(--gamme, color-mix(in srgb, var(--wp--preset--color--creme) 30%, transparent));
}

.ap-panneau__label {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .05em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--creme) 50%, transparent);
}

.ap-panneau__valeur {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.35;
	color: var(--wp--preset--color--blanc-casse);
}

.ap-panneau__methode {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	line-height: 1.35;
	color: color-mix(in srgb, var(--wp--preset--color--creme) 50%, transparent);
	text-transform: none;
}

/* L'échelle situe la référence parmi les méthodes plutôt que dans l'absolu :
   78 % ne veut rien dire tant qu'on ne sait pas que l'affinage à froid
   plafonne à 85. */
.ap-jauge {
	position: relative;
	width: 130px;
	height: 3px;
	margin-top: 5px;
	background: color-mix(in srgb, var(--wp--preset--color--creme) 20%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-jauge__plage {
	position: absolute;
	inset-block: 0;
	background: color-mix(in srgb, var(--wp--preset--color--creme) 40%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	transition: left .4s cubic-bezier(.2, .8, .2, 1), width .4s cubic-bezier(.2, .8, .2, 1);
}

.ap-jauge__repere {
	position: absolute;
	top: -3px;
	width: 2px;
	height: 10px;
	background: var(--wp--preset--color--blanc-casse);
	border-radius: var(--wp--custom--rayon--surface);
	transition: left .5s cubic-bezier(.2, .8, .2, 1);
}

.ap-panneau__certificat {
	align-self: flex-start;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	color: color-mix(in srgb, var(--wp--preset--color--creme) 75%, transparent);
	text-decoration: underline;
	text-underline-offset: 2px;
}

.ap-panneau__certificat:hover { color: var(--wp--preset--color--blanc-casse); }

.ap-panneau__cta {
	display: inline-block;
	align-self: flex-start;
	margin-top: 10px;
	padding: 7px 14px;
	background: var(--wp--preset--color--blanc-casse);
	border-radius: var(--wp--custom--rayon--surface);
	color: var(--wp--preset--color--encre);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
	text-decoration: none;
	transition: background .2s ease;
}

.ap-panneau__cta:hover {
	background: var(--wp--custom--accent);
	color: var(--wp--preset--color--blanc-casse);
}

@media (width <= 900px) {
	.ap-puissance { padding: 52px 0; }
	.ap-revelation { grid-template-columns: 1fr; }
}

/* ================================================== PAGES DE CONTENU == */

/* ------------------------------------------------------- Fil d'Ariane -- */

.ap-fil {
	padding: 18px 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .02em;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.ap-fil a { color: inherit; text-decoration: none; }
.ap-fil a:hover { color: var(--wp--preset--color--encre); }
.ap-fil [aria-current] { color: var(--wp--preset--color--encre); }
.ap-fil li + li::before { content: "/"; margin: 0 8px; opacity: .5; }

.ap-fil ol {
	display: flex;
	flex-wrap: wrap;
	margin: 0;
	padding: 0;
	list-style: none;
}

/* ---------------------------------------------------------- En-tête -- */

.ap-page-tete { padding: 44px 0 6px; }
.ap-page-tete h1 { margin-bottom: 8px; }

.ap-page-tete__maj {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .02em;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 45%, transparent);
}

/* ----------------------------------------------------------- Légal -- */

.ap-legal { max-width: var(--wp--custom--justification--4); padding: 26px 0 70px; }

.ap-legal__sommaire {
	margin-bottom: 38px;
	padding: 20px 24px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-legal__sommaire > span {
	display: block;
	margin-bottom: 10px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.ap-legal__sommaire ol {
	margin: 0;
	padding-left: 18px;
	font-size: var(--wp--preset--font-size--ui);
	line-height: 2;
}

.ap-legal__sommaire a { color: var(--wp--preset--color--encre); text-decoration: none; }
.ap-legal__sommaire a:hover { text-decoration: underline; }

.ap-legal section {
	margin-bottom: 34px;
	scroll-margin-top: calc(var(--wp--custom--barre--hauteur) + 24px);
}

.ap-legal h2 {
	margin-bottom: 12px;
	font-size: var(--wp--preset--font-size--lead);
	text-transform: none;
}

.ap-legal p, .ap-legal li {
	margin-bottom: 10px;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.75;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 75%, transparent);
}

/* --------------------------------------------------------- Contact -- */

.ap-contact {
	display: grid;
	grid-template-columns: 1.3fr 1fr;
	gap: 56px;
	align-items: start;
	padding: 26px 0 70px;
}

.ap-contact__intro {
	max-width: 520px;
	margin-bottom: 26px;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.7;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 75%, transparent);
}

.ap-champs {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 16px;
	margin-bottom: 16px;
}

.ap-champ { display: flex; flex-direction: column; gap: 6px; }
.ap-champ--large { grid-column: 1 / -1; }

.ap-champ label {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.ap-champ input,
.ap-champ textarea,
.ap-champ select {
	padding: 11px 14px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 15%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--body);
}

.ap-champ textarea { min-height: 130px; resize: vertical; }

/* ----------------------------------------------------- Récit marque -- */

.ap-recit { padding: 0 0 96px; }

.ap-recit__surtitre {
	display: block;
	padding-top: clamp(40px, 7vw, 64px);
	text-align: center;
}

.ap-recit__bloc {
	max-width: var(--wp--custom--justification--2);
	margin: 0 auto;
	padding: clamp(64px, 9vw, 104px) 0 0;
}

.ap-recit__bloc--centre { text-align: center; }

/* Le récit est composé en monospace, pas en courant : il se lit comme une
   déclaration et non comme un paragraphe de vente. */
.ap-recit__bloc p {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--h3);
	line-height: 1.55;
	color: var(--wp--preset--color--encre);
}

/* Les trois axes du produit, chacun avec son encre. Nommés par leur rôle et
   non par leur teinte : le prototype appelle « rouge » une couleur violette,
   ce qui égare à la première relecture. */
.ap-axe {
	font-weight: 500;
	text-transform: uppercase;
	border-bottom: 2px solid currentColor;
	padding-bottom: 1px;
}

.ap-axe--texture { color: var(--wp--custom--axe--texture); }
.ap-axe--arome   { color: var(--wp--custom--axe--arome); }
.ap-axe--saveur  { color: var(--wp--custom--axe--saveur); }

.ap-recit__duo,
.ap-recit__solo {
	max-width: var(--wp--custom--justification--4);
	margin: clamp(56px, 9vw, 110px) auto 0;
}

.ap-recit__duo {
	display: grid;
	justify-content: space-between;
	--gouttiere: 40px;
}

.ap-recit__duo figure,
.ap-recit__solo figure {
	margin: 0;
	overflow: hidden;
	aspect-ratio: 3 / 4;
	background: var(--wp--preset--color--pierre);
}

.ap-recit__duo img,
.ap-recit__solo img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Trois cadrages de duo, qui alternent au fil de la page pour que le récit
   ne prenne pas l'allure d'un catalogue. */
.ap-recit__duo--inegal { grid-template-columns: 58% 30%; }
.ap-recit__duo--decale { grid-template-columns: 34% 34%; }
.ap-recit__duo--aligne { grid-template-columns: 44% 44%; }

.ap-recit__duo--droite figure:last-child { margin-top: 93%; transform: translateX(var(--gouttiere)); }
.ap-recit__duo--gauche figure:first-child { margin-top: 93%; }

.ap-recit__solo figure { width: 62%; margin-left: auto; }

.ap-recit__signature {
	max-width: var(--wp--custom--justification--3);
	margin: 110px auto 0;
	text-align: center;
}

.ap-recit__signature p {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--h2);
	line-height: 1.25;
	text-transform: uppercase;
	color: var(--wp--preset--color--encre);
}

@media (width <= 900px) {
	.ap-contact { grid-template-columns: 1fr; gap: 32px; }
	.ap-champs { grid-template-columns: 1fr; }

	/* Les décalages verticaux des duos supposent deux colonnes ; empilés,
	   ils ne produiraient qu'un grand vide. */
	.ap-recit__duo { grid-template-columns: 1fr; gap: 20px; }
	.ap-recit__duo--droite figure:last-child,
	.ap-recit__duo--gauche figure:first-child { margin-top: 0; transform: none; }
	.ap-recit__solo figure { width: 100%; }
	.ap-recit__signature { margin-top: 64px; }
}

/* ================================================== PAGES DE GAMME == */

/* En-tête à l'encre forêt : il sépare franchement la page de gamme de
   l'accueil, qui est crème. */
.ap-page-hero {
	padding: 60px 0 36px;
	background: var(--wp--preset--color--foret);
	color: var(--wp--preset--color--blanc-casse);
}

.ap-page-hero h1 {
	margin-top: 12px;
	font-size: clamp(30px, 4vw, 46px);
	color: var(--wp--preset--color--blanc-casse);
}

.ap-page-hero .ap-heros__surtitre {
	color: color-mix(in srgb, var(--wp--preset--color--creme) 75%, transparent);
}

.ap-page-hero__chapo {
	max-width: var(--wp--custom--justification--3);
	margin-top: 22px;
	font-size: clamp(16px, 2vw, 19px);
	line-height: 1.6;
	color: color-mix(in srgb, var(--wp--preset--color--creme) 82%, transparent);
}

/* ------------------------------------------------------- Chapitre -- */

.ap-chapitre-gamme { padding: 64px 0 56px; }

.ap-chapitre-gamme__grille {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 52px;
	align-items: center;
	margin-bottom: 40px;
}

/* Les chapitres alternent le côté du visuel : trois blocs identiques à la
   suite se liraient comme un tableau plutôt que comme un parcours. */
.ap-chapitre-gamme:nth-of-type(even) .ap-chapitre-gamme__texte { order: 2; }

.ap-chapitre-gamme__surtitre {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .18em;
	text-transform: uppercase;
	color: var(--gamme);
}

.ap-chapitre-gamme h2 {
	margin: 10px 0 16px;
	font-size: clamp(28px, 3.6vw, 46px);
	line-height: 1.02;
	letter-spacing: -.017em;
	color: var(--gamme);
}

.ap-chapitre-gamme__texte p {
	max-width: 58ch;
	margin: 0;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.7;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 78%, transparent);
}

/* La vidéo de production n'existe pas encore. Le cadre garde sa place et le
   dit, comme les photos manquantes. */
.ap-video {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 12px;
	aspect-ratio: 16 / 10;
	background: var(--wp--preset--color--pierre);
	border-radius: var(--wp--custom--rayon--surface);
	color: var(--gamme, var(--wp--preset--color--encre));
}

.ap-video__icone {
	display: grid;
	place-content: center;
	width: 52px;
	height: 52px;
	border: 1px solid currentColor;
	border-radius: var(--wp--custom--rayon--pastille);
	opacity: .55;
}

.ap-video__libelle {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .1em;
	text-transform: uppercase;
	opacity: .65;
}

/* ------------------------------------------------- Tableau des taux -- */

.ap-taux {
	padding: 80px 0;
	background: var(--wp--preset--color--blanc-casse);
}

.ap-taux .ap-section-tete { max-width: var(--wp--custom--justification--2); margin-bottom: 30px; }

.ap-taux__ligne {
	display: grid;
	grid-template-columns: 210px 1fr 82px;
	align-items: center;
	gap: 16px;
	padding: 13px 0;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
}

.ap-taux__ligne:first-of-type { border-top: 0; }

/* Ce n'est un « h3 » que pour la structure du document : à l'œil c'est une
   étiquette de rangée, et la règle la sort déjà du style d'affichage par la
   police, le corps et la casse. Restaient deux héritages des grands titres,
   qu'on ne voit pas en lisant la règle :
     - une marge haute de 13px, qui poussait l'étiquette vers le bas de sa
       rangée. Il y avait 27px au-dessus du titre pour 18 sous la référence,
       alors que le rembourrage vaut 13 des deux côtés ;
     - un interligne de 0,98, juste pour des capitales de cinquante pixels,
       qui écrasait ici une ligne de treize.
   Le prototype pose zéro et 1,6. */
.ap-taux__ligne h3 {
	margin-top: 0;
	margin-bottom: 3px;
	font-family: var(--wp--preset--font-family--body);
	font-weight: 600;
	font-size: var(--wp--preset--font-size--ui);
	line-height: 1.6;
	text-transform: none;
	color: var(--wp--preset--color--encre);
}

.ap-taux__refs {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .02em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 45%, transparent);
}

.ap-taux__piste {
	position: relative;
	height: 7px;
	background: color-mix(in srgb, var(--wp--preset--color--encre) 8%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-taux__plage {
	position: absolute;
	inset-block: 0;
	background: var(--gamme, var(--wp--preset--color--encre));
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-taux__plage-valeur {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	text-align: right;
	white-space: nowrap;
	color: var(--wp--preset--color--encre);
}

@media (width <= 900px) {
	.ap-page-hero { padding: 40px 0 28px; }
	.ap-chapitre-gamme { padding: 44px 0 36px; }

	/* Empilés, le texte passe toujours devant : c'est lui qui annonce le
	   geste, l'image n'est qu'une illustration. */
	.ap-chapitre-gamme__grille { grid-template-columns: 1fr; gap: 24px; }
	.ap-chapitre-gamme:nth-of-type(even) .ap-chapitre-gamme__texte { order: 0; }

	.ap-taux { padding: 52px 0; }

	/* La piste disparaît : à cette largeur elle ne fait plus que quelques
	   dizaines de pixels et ne se lit plus. Le libellé et la plage chiffrée
	   portent alors seuls l'information.
	   Mais la piste portait aussi la teinte de la gamme, et c'était le seul
	   endroit où elle apparaissait dans ce tableau : sans elle, les six
	   méthodes deviennent six rangées grises qu'aucun regard ne distingue.
	   Le prototype déplace donc la couleur sur un filet vertical, qui prend
	   du même coup la place du trait de séparation horizontal — deux traits
	   pour délimiter la même rangée feraient une grille. */
	.ap-taux__ligne {
		grid-template-columns: 1fr auto;
		gap: 2px 14px;
		padding: 11px 0 11px 14px;
		border-top: 0;
		border-left: 3px solid var(--gamme, var(--wp--preset--color--encre));
	}

	.ap-taux__piste { display: none; }
}

/* ================================================== FICHE PRODUIT == */

.ap-fiche {
	display: grid;
	grid-template-columns: 1.1fr 1fr;
	gap: 56px;
	padding: 8px 0 60px;
}

/* --------------------------------------------------------- Galerie -- */

.ap-galerie { max-width: 430px; }

.ap-galerie__cadre {
	position: relative;
	aspect-ratio: 3 / 4;
	overflow: hidden;
	background: var(--wp--preset--color--pierre);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-galerie__cadre img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: contain;
	opacity: 0;
	transition: opacity .3s ease;
}

/* Le macro remplit le cadre : recadré, il montre la matière, alors qu'un
   « contain » laisserait deux bandes vides. */
.ap-galerie__cadre img[data-vue="macro"] { object-fit: cover; }
.ap-galerie__cadre img.est-active { opacity: 1; }

.ap-galerie__onglets {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin-top: 14px;
}

.ap-galerie__onglets button {
	padding: 9px 16px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 15%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .03em;
	cursor: pointer;
}

.ap-galerie__onglets button[aria-pressed="true"] {
	background: var(--wp--preset--color--encre);
	border-color: var(--wp--preset--color--encre);
	color: var(--wp--preset--color--blanc-casse);
}

.ap-galerie__onglets button[disabled] { opacity: .4; cursor: default; }

/* ----------------------------------------------------- Informations -- */

.ap-fiche__gamme {
	display: inline-block;
	margin-bottom: 16px;
	padding: 6px 14px 4px;
	background: var(--gamme);
	border-radius: var(--wp--custom--rayon--surface);
	color: var(--wp--preset--color--blanc-casse);
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--body);
	text-transform: uppercase;
}

/* Les fleurs ont une teinte claire : le texte y passe à l'encre. */
.ap-gamme--fleurs .ap-fiche__gamme { color: var(--wp--preset--color--encre); }

/* WooCommerce pose « margin-bottom: var(--wp--style--block-gap) » sur chaque
   enfant du résumé — trois classes et deux éléments, contre la seule classe
   du bandeau. Les 16px voulus devenaient 34, et la pastille flottait loin
   au-dessus du titre qu'elle qualifie. Le sélecteur ci-dessous reprend celui
   de WooCommerce et lui ajoute la classe visée. */
.single-product.woocommerce div.product div.summary > .ap-fiche__gamme {
	margin-bottom: 16px;
}

.ap-fiche__info h1 {
	margin-bottom: 10px;
	font-size: clamp(28px, 3.2vw, 40px);
}

.ap-fiche__suffixe {
	display: block;
	margin-bottom: 22px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--ui);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 55%, transparent);
}

.ap-fiche__desc {
	max-width: var(--wp--custom--justification--1);
	margin-bottom: 30px;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.7;
	color: var(--gamme-encre, color-mix(in srgb, var(--wp--preset--color--encre) 75%, transparent));
}

/* ---------------------------------------------------------- Format -- */

.ap-format { margin-bottom: 24px; }

.ap-format > span {
	display: block;
	margin-bottom: 10px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.ap-format__choix { display: flex; flex-wrap: wrap; gap: 8px; }

.ap-format__choix button {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 56px;
	padding: 9px 13px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 15%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--ui);
	cursor: pointer;
}

.ap-format__choix button[aria-pressed="true"] {
	background: var(--wp--preset--color--encre);
	border-color: var(--wp--preset--color--encre);
	color: var(--wp--preset--color--blanc-casse);
}

/* Le meilleur rapport au gramme, nommé sous son pavé. C'est le critère de
   choix réel : sans cette mention, il faut comparer cinq nombres écrits en
   petit pour retrouver ce que la rangée dit déjà. La mention est posée en
   ::after pour ne pas entrer dans la hauteur de la rangée — les cinq pavés
   doivent rester alignés. */
.ap-format__mieux { position: relative; }

.ap-format__mieux::after {
	content: 'Meilleur prix au gramme';
	position: absolute;
	top: calc(100% + 7px);
	left: 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .04em;
	white-space: nowrap;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

/* La mention s'aligne toujours sur le bord gauche de son pavé, jamais sur le
   droit. L'ancrer à droite du dernier pavé paraissait plus sûr — il porte le
   meilleur rapport dans les quatre gammes, et la colonne se termine là. Mais
   « dernier » ne veut pas dire « à droite » : sous 360px les cinq formats
   passent sur trois rangées, le centième gramme se retrouve seul et à
   gauche, et la mention ancrée à droite part alors à -29px, coupée par le
   bord de l'écran. Ancrée à gauche, elle s'étend vers l'intérieur de la
   colonne dans les deux cas. */

/* Les deux pièces que les pavés remplacent. Elles ne sont masquées que
   lorsque le script a pris la main — sans lui, la liste déroulante de
   WooCommerce reste la seule façon de choisir un format, et la masquer
   rendrait la fiche inachetable.
   Le tableau des variations demande un sélecteur plus appuyé que l'autre :
   WooCommerce écrit « .woocommerce table.variations { display: block } », deux
   classes et un élément, qui l'emporte sur deux classes seules. La règle
   courte s'appliquait donc au prix et pas au tableau, qui restait à l'écran
   sous les pavés. */
.woocommerce .ap-format-pilote table.variations,
.ap-format-pilote .woocommerce-variation-price { display: none; }

/* Le bouton d'ajout au panier de WooCommerce reprend l'allure de celui du
   prototype, que .ap-panier habillait sur les anciennes fiches. */
.ap-format-pilote .single_variation_wrap .quantity { margin-bottom: 14px; }

.ap-prix-ligne {
	display: flex;
	align-items: baseline;
	gap: 12px;
	margin-bottom: 18px;
}

.ap-prix-ligne__total {
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--h2);
	line-height: 1;
}

.ap-prix-ligne__gramme {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

/* Le panier n'est pas encore branché : le bouton le dit plutôt que de
   simuler un ajout qui ne se produira pas. */
.ap-panier {
	width: 100%;
	max-width: var(--wp--custom--justification--1);
	padding: 15px 26px;
	background: var(--wp--preset--color--encre);
	border: 0;
	border-radius: var(--wp--custom--rayon--surface);
	color: var(--wp--preset--color--blanc-casse);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--ui);
	text-transform: uppercase;
	letter-spacing: .08em;
	cursor: pointer;
}

.ap-panier[disabled] { opacity: .45; cursor: not-allowed; }

.ap-mention-legale {
	max-width: var(--wp--custom--justification--1);
	margin-top: 14px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	line-height: 1.7;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 42%, transparent);
}

/* ---------------------------------------------------- Blocs annexes -- */

.ap-confiance,
.ap-fiche__quiz,
.ap-conservation {
	margin-top: 24px;
	padding-top: 22px;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
}

.ap-confiance { display: flex; flex-direction: column; gap: 9px; }

.ap-confiance li {
	display: flex;
	align-items: center;
	gap: 9px;
	font-size: var(--wp--preset--font-size--ui);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 65%, transparent);
	list-style: none;
}

.ap-confiance li::before {
	content: "";
	flex-shrink: 0;
	width: 5px;
	height: 5px;
	border-radius: 50%;
	background: var(--gamme);
}

/* Le navigateur pose sur toute liste un retrait à gauche et des marges
   verticales, dont la fiche n'a que faire. Mais le « margin: 0 ; padding: 0 »
   qui les retirait emportait aussi l'écart posé plus haut pour les trois
   blocs annexes : même spécificité, et cette règle vient après. Le filet
   restait, l'air en dessous partait, et la première ligne se collait au
   séparateur — alors que le questionnaire et la conservation, qui ne
   subissent pas cette remise à zéro, respiraient normalement.
   Seuls le retrait et les marges basses sont donc retirés. */
.ap-confiance,
.ap-confiance ul {
	margin-bottom: 0;
	padding-inline: 0;
	padding-bottom: 0;
}

.ap-fiche__quiz > span,
.ap-conservation > span {
	display: block;
	margin-bottom: 9px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	letter-spacing: .06em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 45%, transparent);
}

.ap-fiche__quiz p,
.ap-conservation p {
	max-width: var(--wp--custom--justification--1);
	margin: 0 0 14px;
	font-size: var(--wp--preset--font-size--ui);
	line-height: 1.6;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 65%, transparent);
}

/* --------------------------------------------------------- Sensoriel -- */

.ap-sensoriel {
	margin-top: 24px;
	padding: 18px 20px 15px;
	background: var(--wp--preset--color--creme);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-sensoriel > span {
	display: block;
	margin-bottom: 10px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .06em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.ap-sensoriel__ligne {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	padding: 8px 0;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 8%, transparent);
}

.ap-sensoriel__ligne:first-of-type { border-top: 0; padding-top: 2px; }

.ap-sensoriel__critere {
	flex-shrink: 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .03em;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 55%, transparent);
}

.ap-sensoriel__valeur {
	text-align: right;
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--encre);
}

.ap-intensite { display: flex; gap: 5px; }

.ap-intensite span {
	width: 8px;
	height: 8px;
	border-radius: 50%;
	background: color-mix(in srgb, var(--wp--preset--color--encre) 15%, transparent);
}

.ap-intensite span.est-pleine { background: var(--gamme); }

/* ------------------------------------------------------------ Récit -- */

.ap-recit-produit {
	max-width: var(--wp--custom--justification--3);
	padding: 60px 0;
}

.ap-recit-produit h2 {
	margin-bottom: 18px;
	font-size: var(--wp--preset--font-size--h2);
}

.ap-recit-produit p {
	margin-bottom: 16px;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.75;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 72%, transparent);
}

/* ------------------------------------------------------ Suggestions -- */

.ap-suggestions { padding: 0 0 80px; }

.ap-suggestions > h2 {
	margin-bottom: 26px;
	font-size: var(--wp--preset--font-size--h3);
	text-transform: none;
}

@media (width <= 900px) {
	.ap-fiche { grid-template-columns: 1fr; gap: 28px; padding-bottom: 40px; }
	.ap-galerie { max-width: none; }
	.ap-recit-produit { padding: 40px 0; }
	.ap-suggestions { padding-bottom: 52px; }
}

/* Page FAQ : les questions sont groupees par sujet, ce que la FAQ de
   l'accueil ne fait pas — elle n'en reprend que les plus courantes. */
.ap-faq__categorie { margin-bottom: 44px; }

.ap-faq__categorie h2 {
	margin-bottom: 4px;
	font-size: var(--wp--preset--font-size--h3);
	text-transform: none;
}

/* ================================================== QUESTIONNAIRE == */

.ap-quiz {
	max-width: 640px;
	margin: 0 auto;
	padding: 8px 0 80px;
}

.ap-quiz__jauge {
	display: flex;
	gap: 6px;
	margin-bottom: 36px;
	padding: 0;
	list-style: none;
}

.ap-quiz__jauge li {
	flex: 1;
	height: 3px;
	background: color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-quiz__jauge li.est-faite { background: var(--wp--preset--color--foret); }

/* Sans script, les trois étapes s'affichent à la suite : le questionnaire
   reste lisible, on voit ce qu'il demande, et seule la recommandation
   automatique manque. */
.ap-quiz__etape[hidden] { display: none; }

.ap-quiz__surtitre {
	display: block;
	margin-bottom: 10px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.ap-quiz__etape h2 {
	margin-bottom: 28px;
	font-size: var(--wp--preset--font-size--h2);
	text-transform: none;
}

.ap-quiz__options {
	display: flex;
	flex-direction: column;
	gap: 12px;
	margin: 0;
	padding: 0;
	border: 0;
}

.ap-quiz__options button {
	width: 100%;
	padding: 18px 20px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 14%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	text-align: left;
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--body);
	color: var(--wp--preset--color--encre);
	cursor: pointer;
	transition: border-color .18s ease, background .18s ease;
}

.ap-quiz__options button:hover {
	background: var(--wp--preset--color--creme);
	border-color: var(--wp--preset--color--foret);
}

.ap-quiz__retour {
	display: inline-block;
	margin-top: 22px;
	background: none;
	border: 0;
	padding: 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
	text-decoration: underline;
	cursor: pointer;
}

/* -------------------------------------------------------- Résultats -- */

.ap-quiz__profil {
	margin-bottom: 8px;
	font-size: var(--wp--preset--font-size--h2);
	text-transform: none;
}

.ap-quiz__profil-desc {
	margin-bottom: 26px;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.7;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 72%, transparent);
}

/* Ce texte change selon la qualité de la correspondance : quand aucune
   référence ne réunit les trois critères, il le dit au lieu de présenter
   trois résultats comme s'ils répondaient à la demande. */
.ap-quiz__intro {
	margin-bottom: 30px;
	font-size: var(--wp--preset--font-size--body);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 65%, transparent);
}

.ap-quiz__resultats { display: flex; flex-direction: column; gap: 14px; }

.ap-quiz__resultat {
	position: relative;
	display: flex;
	gap: 16px;
	align-items: center;
	padding: 14px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	transition: box-shadow .2s ease;
}

.ap-quiz__resultat:hover {
	box-shadow: 0 10px 24px color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
}

.ap-quiz__vignette {
	position: relative;
	flex-shrink: 0;
	width: 96px;
	height: 96px;
	overflow: hidden;
	background: var(--wp--preset--color--creme);
	border-radius: var(--wp--custom--rayon--surface);
}

.ap-quiz__vignette img { width: 100%; height: 100%; object-fit: cover; }

.ap-quiz__vignette--vide {
	display: grid;
	place-content: center;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	text-align: center;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 40%, transparent);
}

.ap-quiz__resultat h3 {
	margin-bottom: 4px;
	font-size: var(--wp--preset--font-size--body);
	text-transform: none;
}

.ap-quiz__resultat p {
	margin: 0;
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.5;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 62%, transparent);
}

.ap-quiz__gamme {
	display: inline-block;
	margin-bottom: 6px;
	padding: 2px 8px;
	background: var(--gamme);
	border-radius: var(--wp--custom--rayon--surface);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	text-transform: uppercase;
	color: var(--wp--preset--color--blanc-casse);
}

/* ------------------------------------------------- Gabarit des pages -- */

/* Le gabarit ne contraint plus la largeur : chaque section gère la sienne
   via .ap-enveloppe, comme dans le prototype. La mise en page « contrainte »
   de WordPress plafonnait tout à la largeur de contenu, et les fiches
   produits s'affichaient à 600px au lieu de 1100.
   Le garde-fou ci-dessous rattrape un contenu saisi dans l'éditeur sans
   enveloppe : sans lui, il s'étalerait sur toute la largeur de l'écran. */
.ap-page > :where(p, h1, h2, h3, h4, ul, ol, blockquote, figure, .wp-block-image) {
	max-width: var(--wp--custom--justification--3);
	margin-inline: auto;
	padding-inline: 40px;
}

@media (width <= 900px) {
	.ap-page > :where(p, h1, h2, h3, h4, ul, ol, blockquote, figure, .wp-block-image) {
		padding-inline: 22px;
	}
}

/* ------------------------------------------ Direction artistique fiche -- */

/* Le titre d'une fiche n'est pas un titre courant : il est composé comme une
   affiche, en Rubik Mono One très espacé et dans l'encre de la gamme. Les
   marges négatives compensent la chasse que cet espacement ajoute de part et
   d'autre, pour que le bloc reste aligné sur la colonne. */
.ap-fiche__info h1 {
	margin-bottom: 10px;
	margin-left: -.04em;
	margin-right: -.16em;
	font-family: var(--wp--preset--font-family--affiche);
	font-weight: 400;
	font-size: clamp(22px, 2.6vw, 34px);
	line-height: 1.2;
	letter-spacing: .16em;
	word-spacing: -.62em;
	text-transform: uppercase;
	white-space: nowrap;
	color: var(--gamme-encre, var(--wp--preset--color--encre));
}

.ap-fiche__suffixe {
	margin-top: 12px;
	margin-bottom: 22px;
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .06em;
	word-spacing: -.41em;
	line-height: 1.5;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 65%, transparent);
}

/* Le cadre reste transparent : les photos produits sont détourées sur fond
   clair, un aplat derrière elles ajouterait un rectangle visible. Le fond
   pierre ne sert qu'aux emplacements en attente. */
.ap-galerie__cadre { background: transparent; }
.ap-galerie__cadre.ap-produit__visuel--vide { background: var(--wp--preset--color--pierre); }

/* Sur une fiche, les deux photos de la traçabilité se touchent : le contraste
   entre la vue d'ensemble et le macro se lit mieux sans interstice. */
.ap-fiche-tracabilite .ap-revelation,
.ap-fiche-tracabilite .ap-revelation__photos { gap: 0; }

/* --------------------------------------------------------- Bouton ligne -- */

/* Bouton contourné sur fond transparent : il propose sans réclamer. Le
   bouton plein est réservé à l'action principale de la page — ajouter au
   panier — et deux boutons pleins côte à côte se disputeraient l'attention. */
.ap-bouton-ligne {
	display: inline-block;
	padding: 11px 24px;
	background: transparent;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 40%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	color: var(--wp--preset--color--encre);
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--ui);
	font-weight: 600;
	text-decoration: none;
	cursor: pointer;
	transition: background .18s ease, color .18s ease, border-color .18s ease;
}

.ap-bouton-ligne:hover,
.ap-bouton-ligne:focus-visible {
	background: var(--wp--preset--color--encre);
	border-color: var(--wp--preset--color--encre);
	color: var(--wp--preset--color--blanc-casse);
}

@media (width <= 900px) {
	/* Pleine largeur au doigt : la cible devient évidente et atteignable. */
	.ap-fiche__quiz .ap-bouton-ligne { width: 100%; text-align: center; }
}

/* ============================ SURCOUCHES DU PROTOTYPE (v111 → v127) == */

/* Le prototype empile des blocs de styles datés, chacun amovible, qui
   reviennent sur des décisions antérieures. Ils font autorité sur le reste
   du fichier. Les trois repris ici m'avaient échappé : lire le balisage ne
   suffit pas, il faut lire ce qui le recouvre. */

/* -------------------------------------------- Cartes — v117 -------- */

/* La carte ne garde que le nom, le prix et le lien. Les descriptions sont la
   même prose reprise sur quatre à cinq cartes de la même gamme : elles
   n'aidaient pas à choisir. Elles restent dans le document, masquées — les
   remettre est une ligne à retirer. */
.ap-produit__desc { display: none; }

/* Le balisage des cartes est du HTML brut, hors du système de blocs : il
   n'hérite donc d'aucune réinitialisation de WordPress et reprend les marges
   par défaut du navigateur, soit 1em au-dessus de chaque titre et de chaque
   paragraphe. Sur une carte, cela ajoutait vingt-six pixels invisibles. */
.ap-produit__corps > :where(h1, h2, h3, h4, p),
.ap-fiche__info > :where(h1, h2, h3, h4, p),
.ap-chapitre > :where(h1, h2, h3, h4, p),
.ap-volet__txt > :where(h1, h2, h3, h4, p),
.ap-section-tete > :where(h1, h2, h3, h4, p),
.ap-panneau > div > :where(h1, h2, h3, h4, p) {
	margin-top: 0;
}

/* ----------------------------------------- Sous-titre — v119 ------- */

/* Le sous-titre ne porte qu'un mot — CBD, ou CBN pour le Charas. Il prend
   l'encre de la gamme et l'interlettrage d'un marqueur : c'est la seule
   différence de composition entre les treize fiches, autant qu'elle se voie. */
.ap-fiche__suffixe {
	margin-top: 14px;
	margin-bottom: 4px;
	font-size: var(--wp--preset--font-size--body);
	font-weight: 500;
	letter-spacing: .22em;
	word-spacing: normal;
	color: var(--gamme-encre, var(--wp--preset--color--encre));
}

/* ------------------------------------------ Galerie — v111 --------- */

/* Une jauge, pas des boutons : elle dit combien de visuels il y a et où l'on
   en est, et ne se clique pas. C'est l'image qui avance, au clic.
   Les boutons restent dans le document, hors champ visuel : ils portent la
   navigation au clavier et l'annonce aux lecteurs d'écran, que la jauge
   seule ne saurait rendre. */
.ap-galerie__onglets {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: 0;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

.ap-galerie__cadre { cursor: pointer; }

.ap-galerie__jauge {
	display: flex;
	gap: 6px;
	margin-top: 12px;
}

.ap-galerie__jauge i {
	flex: 1 1 0;
	height: 2px;
	background: color-mix(in srgb, var(--wp--preset--color--encre) 16%, transparent);
	transition: background .25s ease;
}

.ap-galerie__jauge i.est-active { background: var(--wp--preset--color--encre); }

/* Le surtitre est un paragraphe dans le balisage de blocs, alors que le
   prototype en fait un <span>. Toute règle visant « les paragraphes de
   telle section » l'attrape donc au passage, et l'emporte par spécificité.
   Cette déclaration finale le remet dans sa taille quoi qu'il arrive. */
p.ap-heros__surtitre {
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.6;
}


/* ------------------------------------- Écart entre blocs, neutralisé -- */

/* WordPress insère « margin-block-start » entre blocs frères via la règle
   « :root :where(.is-layout-flow) > * », qui lit --wp--preset--spacing--40
   et non --wp--style--block-gap : redéfinir cette dernière ne change donc
   rien. Il faut annuler la marge sur les éléments visés.
   Utile dans un flux de contenu libre, cet écart est nuisible ici : ces
   composants reprennent les espacements du prototype au pixel, et les 34px
   ajoutés décalaient la plaque du héros et le pied de page. */
.ap-heros__plaque > p,
.ap-heros__plaque > .wp-block-buttons,
.ap-pied__legal,
.ap-pied__bas,
.ap-section-tete > p,
.ap-fiche__info > p {
	margin-top: 0;
}

/* Les trois lignes d'une tête de section — surtitre, titre, chapo — se
   touchaient. Un « margin-top: 14px » est pourtant posé sur le chapo au
   moment où la tête est définie ; les deux règles de neutralisation
   ci-dessus, qui retirent l'écart entre blocs de WordPress, l'emportaient
   dessus par l'ordre puis par la spécificité. L'écart voulu partait avec
   celui qu'on ne voulait pas, et il ne restait que l'interlignage pour
   séparer un surtitre de onze pixels d'un titre de cinquante-huit.
   Les valeurs sont celles du héros — la seule autre pile surtitre / titre
   d'affichage / paragraphe du site — relevées à proportion du titre, qui est
   ici plus grand : seize et vingt au lieu de douze et dix-huit.
   La spécificité doit dépasser celle des règles ci-dessus, d'où le « > » et
   la classe répétée. */
.ap-section-tete > p.ap-heros__surtitre {
	margin-bottom: 16px;
}

.ap-section-tete > p:not(.ap-heros__surtitre) {
	margin-top: 20px;
}

/* Le surtitre est un <span> dans le prototype, où il occupe une ligne de
   texte et non un paragraphe entier. */
p.ap-heros__surtitre { line-height: 1.3; margin-bottom: 0; }

/* Le surtitre est un <span> dans le prototype : inline, il occupe la boîte
   de ligne du parent — 1,6 × 16px — et non sa propre hauteur de texte. Mon
   balisage en fait un paragraphe, qui se cale sur son interligne à lui. On
   rétablit la hauteur de ligne du parent pour retrouver le même rythme. */
.ap-heros__plaque > p.ap-heros__surtitre { line-height: 25.6px; }

/* Les cadres d'attente portent une bordure : sans border-box, elle
   s'ajoute à la hauteur demandée et le gabarit ne tient plus sa place
   exacte — ce qui est précisément sa raison d'être. */
.ap-attente { box-sizing: border-box; }

/* Les titres de colonnes du pied gardent la marge haute par défaut du
   navigateur, le balisage étant du HTML brut hors du système de blocs. */
.ap-pied__grille h3,
.ap-pied__grille h4,
.ap-pied__grille p,
.ap-pied__grille ul { margin-top: 0; }

/* ------------------------------------------------------------- Logos -- */

/* Le logo est un lockup horizontal — la feuille puis le mot. Sa hauteur
   fixe la barre ; la largeur suit le ratio du fichier. */
.ap-barre__marque .wp-block-site-logo img,
.ap-barre__marque .custom-logo {
	height: 34px;
	width: auto;
	max-width: none;
}

.ap-barre__marque .wp-block-site-logo { margin: 0; line-height: 0; }

.ap-pied__logo {
	display: block;
	height: 40px;
	width: auto;
	margin-bottom: 16px;
}

@media (width <= 900px) {
	.ap-barre__marque .wp-block-site-logo img,
	.ap-barre__marque .custom-logo { height: 28px; }
}

/* ================================================ CIBLES TACTILES == */

/* Sur écran tactile, une cible de moins de 44px se rate au doigt — c'est le
   seuil retenu par les recommandations d'accessibilité comme par les guides
   des deux plateformes mobiles. Le prototype compose pour la souris, où le
   pointeur est précis au pixel : on n'élargit donc qu'au toucher, et le
   rendu sur grand écran reste fidèle au dessin d'origine.
   Le ciblage porte sur le type de pointeur et non sur la largeur : une
   tablette large reste tactile, un petit écran de bureau ne l'est pas. */
@media (pointer: coarse) {

	/* Les liens du pied sont serrés les uns sous les autres. On les passe en
	   bloc pour que le rembourrage vertical compte, sans toucher à la
	   hauteur de ligne qui réglerait l'interligne du texte. */
	.ap-pied li a,
	.ap-fil a,
	.ap-legal a,
	.ap-faq__item a {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
	}

	.ap-pied li { margin-bottom: 0; }

	/* Boutons de sélection : gammes, formats, références, onglets de galerie. */
	.ap-trace__gammes button,
	.ap-trace__produits button,
	.ap-calc__gammes button,
	.ap-calc__formats button,
	.ap-format__choix button,
	.ap-quiz__options button,
	.ap-galerie__onglets button {
		min-height: 44px;
	}

	/* Liens présentés en bouton : le rembourrage seul ne suffit pas, il faut
	   un alignement vertical pour que le texte reste centré. */
	.ap-panneau__certificat,
	.ap-panneau__cta,
	.ap-bouton-ligne,
	.ap-boutique__quiz a {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
	}

	.ap-pied__lettre input[type="email"],
	.ap-champ input,
	.ap-champ select { min-height: 44px; }

	/* Les puces du carrousel mesurent 30 × 3px : les grossir les dénaturerait.
	   On élargit la zone sensible par du rembourrage, et « background-clip »
	   maintient le trait visible à sa taille. */
	.ap-puces button {
		height: auto;
		padding-block: 20px;
		background-clip: content-box;
	}

	.ap-puces { padding-block: 0 14px; }

	/* Le résumé d'un <details> porte le clic sur toute sa ligne ; sa hauteur
	   dépend du texte, qui peut tenir sur une seule ligne courte. */
	.ap-faq__q { min-height: 44px; }

	/* Le lien du logo n'enveloppe que l'image, haute de 28px au toucher. */
	.ap-barre__marque .custom-logo-link {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
	}

	.ap-pied__lettre button {
		min-height: 44px;
		padding-inline: 2px;
	}
}

/* ------------------------------------------ Pages d'erreur et recherche -- */

.ap-vide { max-width: var(--wp--custom--justification--3); padding: 80px 0 40px; }

.ap-vide h1 {
	margin: 10px 0 16px;
	font-size: clamp(30px, 4vw, 46px);
}

.ap-vide p {
	font-size: var(--wp--preset--font-size--lead);
	line-height: 1.6;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 70%, transparent);
}

.ap-vide__liens { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 26px; }

/* La recherche interne cherche dans les pages, pas dans des articles : les
   références en sont, et c'est ce qu'un visiteur tape. */
.ap-resultats { max-width: var(--wp--custom--justification--4); padding: 26px 0 60px; }

.ap-resultats > li { margin-bottom: 26px; list-style: none; }

.ap-resultats h2 { margin-bottom: 6px; text-transform: none; }

.ap-resultats a { text-decoration: none; }
.ap-resultats a:hover { text-decoration: underline; }

.ap-resultats p {
	margin: 0;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.7;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 68%, transparent);
}

.ap-page .wp-block-search { max-width: var(--wp--custom--justification--3); margin-inline: auto; padding-inline: 40px; }

@media (width <= 900px) {
	.ap-vide { padding-top: 48px; }
	.ap-page .wp-block-search { padding-inline: 22px; }
}

/* ============================================== VÉRIFICATION D'ÂGE == */

/* La barrière est le premier écran du site : elle doit lui ressembler, faute
   de quoi le visiteur croit s'être trompé d'adresse. L'extension expose ses
   couleurs en variables — on les redéfinit plutôt que de lutter contre sa
   feuille de styles, qui se charge après la nôtre. */
:root {
	--ag-background-color: var(--wp--preset--color--creme);
	--ag-form-background-color: var(--wp--preset--color--blanc-casse);
	--ag-text-color: var(--wp--preset--color--encre);
	--ag-form-margin: auto auto;
}

.age-gate {
	background: var(--wp--preset--color--creme);
	color: var(--wp--preset--color--encre);
	font-family: var(--wp--preset--font-family--body);
}

.age-gate__form {
	max-width: 460px;
	padding: 40px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

.age-gate__heading,
.age-gate__headline {
	font-family: var(--wp--preset--font-family--display);
	font-weight: 400;
	font-size: clamp(24px, 3vw, 34px);
	line-height: .98;
	letter-spacing: .005em;
	text-transform: uppercase;
	color: var(--wp--preset--color--encre);
}

.age-gate__message,
.age-gate__subheading {
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.7;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 72%, transparent);
}

/* Les trois champs de date : même traitement que les formulaires du site. */
.age-gate__input,
.age-gate select,
.age-gate input[type="text"],
.age-gate input[type="number"] {
	padding: 11px 14px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 15%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--body);
	color: var(--wp--preset--color--encre);
}

.age-gate__label {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.age-gate__submit,
.age-gate button[type="submit"] {
	min-height: 44px;
	padding: 13px 26px;
	background: var(--wp--preset--color--encre);
	border: 0;
	border-radius: var(--wp--custom--rayon--surface);
	color: var(--wp--preset--color--blanc-casse);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--ui);
	letter-spacing: .08em;
	text-transform: uppercase;
	cursor: pointer;
}

.age-gate__submit:hover,
.age-gate button[type="submit"]:hover { background: var(--wp--preset--color--foret); }

/* L'indicateur de chargement porte la couleur de la marque plutôt que le
   noir par défaut. */
.age-gate__loader { color: var(--wp--custom--accent); }

/* ================================================ CONTRASTES DU TEXTE == */

/* Trente-quatre éléments passaient sous le seuil de 4,5:1 exigé pour un
   texte courant. Deux causes distinctes, et deux corrections différentes.
   Le seuil n'est pas une formalité : à 2,4:1, une mention de dix pixels
   devient illisible pour une vision fatiguée, et sur un écran mal réglé
   elle disparaît. */

/* ------------------------- Les teintes de gamme portent du texte -------- */

/* Le prototype l'écrit lui-même : « les accents de base ne portent pas de
   texte sur fond clair — le bleu tombe à 2,88:1 et le vert à 1,81:1. Ces
   déclinaisons existent pour cet usage. » Il définit donc des encres de
   gamme, plus sombres. Je ne les avais pas appliquées à ces trois endroits,
   où c'est pourtant du texte et non un aplat. */
.ap-ancre__num,
.ap-chapitre__num,
.ap-ancre.est-active,
.ap-chapitre-gamme__surtitre {
	color: var(--gamme-encre, var(--gamme));
}

/* Le vert des fleurs est le plus clair des quatre : même son encre reste
   juste pour un titre de petite taille. Les grands titres, eux, bénéficient
   du seuil abaissé à 3:1 et gardent la teinte vive. */
.ap-gamme--fleurs {
	--gamme-encre: #1c6835;
}

/* -------------------- Le texte secondaire était trop pâle -------------- */

/* Ces mentions étaient posées entre 40 et 50 % d'opacité, repris des rgba du
   prototype. À dix ou douze pixels, cela donne de 2,4 à 4,1:1. Les passer à
   65 % les assombrit à peine à l'œil et les fait franchir le seuil. */
.ap-heros__surtitre,
.ap-calc__libelle {
	color: color-mix(in srgb, var(--wp--preset--color--encre) 65%, transparent);
}

/* Le panneau de tracabilite et le selecteur sont sur fond encre : leur
   donner une encre les rendait invisibles. C'est la creme qui doit y
   remonter. */
.ap-panneau__label,
.ap-panneau__methode,
.ap-trace__etape {
	color: color-mix(in srgb, var(--wp--preset--color--creme) 72%, transparent);
}

.ap-produit__unite,
.ap-calc__note {
	color: color-mix(in srgb, var(--wp--preset--color--encre) 66%, transparent);
}

.ap-produit__visuel--vide,
.ap-quiz__vignette--vide,
.ap-attente {
	color: color-mix(in srgb, var(--wp--preset--color--encre) 68%, transparent);
	opacity: 1;
}

/* Sur fond encre, c'est la crème qui doit remonter. */
.ap-pied__legal,
.ap-pied__bas {
	color: color-mix(in srgb, var(--wp--preset--color--creme) 70%, transparent);
}

.ap-puissance .ap-heros__surtitre,
.ap-trace__etape {
	color: color-mix(in srgb, var(--wp--preset--color--creme) 72%, transparent);
}

/* Le surtitre du héros est sur fond clair : la règle ci-dessus ne vaut que
   dans les sections à l'encre. */
.ap-heros__plaque .ap-heros__surtitre,
.ap-boutique .ap-heros__surtitre,
.ap-faq .ap-heros__surtitre,
.ap-prix .ap-heros__surtitre {
	color: color-mix(in srgb, var(--wp--preset--color--encre) 65%, transparent);
}

/* Les ancres inactives étaient à 38 % d'opacité : la distinction avec
   l'active restait lisible, le mot lui-même non. 55 % conserve la hiérarchie
   et rend le texte franchement lisible. */
.ap-ancre { opacity: .55; }

/* Dernier passage : cinq mentions restaient entre 3 et 4,4:1. Toutes sont
   des textes de dix à treize pixels, taille à laquelle le seuil ne pardonne
   pas. Les opacités montent juste ce qu'il faut — la hiérarchie visuelle
   tient au contraste relatif entre les niveaux, pas à leur pâleur absolue. */
.ap-ancre { opacity: .62; }
.ap-ancre__num { opacity: .85; }
.ap-chapitre__surtitre { opacity: .78; }
.ap-calc__gramme { opacity: .78; }
.ap-produit__prix--attente { opacity: .72; }

/* Le vert des fleurs est le plus clair des quatre teintes de gamme : sur
   crème il plafonne à 3,3:1. Son encre descend d'un cran de plus que les
   autres, pour la même raison que le prototype en définit une. */
.ap-gamme--fleurs .ap-ancre__mot,
.ap-gamme--fleurs.ap-ancre.est-active { color: #1c6835; }

/* L'état inactif des ancres passait par l'opacité du conteneur, qui se
   multipliait avec celle de chaque enfant : le numéro tombait à 2,7:1. En
   passant par la couleur, chaque niveau se règle pour lui-même et le
   contraste devient prévisible. */
.ap-ancre {
	opacity: 1;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 70%, transparent);
}

.ap-ancre:hover { color: var(--wp--preset--color--encre); }
.ap-ancre.est-active { color: var(--gamme-encre, var(--gamme)); }

.ap-ancre__num { opacity: 1; color: inherit; }

/* Le vert des fleurs est assez clair pour que du blanc n'y tienne pas :
   3,3:1. Le prototype le dit dans sa table des gammes, où « fleurs » est la
   seule à demander un texte à l'encre plutôt qu'en blanc. Partout où un
   aplat de gamme porte du texte, la règle s'applique. */
.ap-gamme--fleurs .ap-trace__gammes button[aria-pressed="true"],
.ap-gamme--fleurs.ap-trace__gammes button[aria-pressed="true"],
.ap-trace__gammes button.ap-gamme--fleurs[aria-pressed="true"],
.ap-calc__gammes button.ap-gamme--fleurs[aria-pressed="true"],
.ap-gamme--fleurs .ap-quiz__gamme {
	color: var(--wp--preset--color--encre);
}

/* ==================================================== WOOCOMMERCE == */

/* WooCommerce apporte ses propres gabarits pour la boutique, les fiches, le
   panier et la commande. Plutôt que de les remplacer, on les habille : ses
   classes sont stables d'une version à l'autre, alors qu'un gabarit copié
   se désynchronise à chaque mise à jour et finit par casser en silence. */

/* « .woocommerce » n'est pas une classe de contenu : WooCommerce la pose sur
   le BODY des fiches et des archives. Cette règle rétrécissait donc la page
   entière — bandeau d'annonce et barre de navigation compris, d'où la marge
   blanche au-dessus et les quarante pixels manquants à droite. On vise le
   conteneur que le gabarit classique produit vraiment. */
main.site-main {
	max-width: var(--wp--custom--justification, 1180px);
	margin-inline: auto;
	padding: 26px 40px 80px;
}

/* Le compte, le panier et la commande sont des pages, pas des gabarits
   WooCommerce : elles passent par le gabarit de blocs et n'ont donc pas de
   « main.site-main » à encadrer. WooCommerce leur pose bien un max-width de
   mille pixels, mais sans centrage ni retrait latéral — le contenu se collait
   au bord gauche de l'écran, et la bordure du formulaire de connexion sortait
   du cadre.
   Le sélecteur passe par « .entry-content » pour l'emporter sur celui de
   WooCommerce, « .woocommerce-account main .woocommerce », qui pèse deux
   classes et un élément. */
.woocommerce-account .entry-content > .woocommerce,
.woocommerce-cart .entry-content > .woocommerce,
.woocommerce-checkout .entry-content > .woocommerce {
	max-width: var(--wp--custom--justification, 1180px);
	margin-inline: auto;
	padding: 26px 40px 80px;
}

/* Deux champs et un bouton n'ont pas besoin de mille pixels de large : le
   formulaire se range sur une colonne de lecture, centrée comme le reste du
   site. La règle ne vise que la page déconnectée — « :has » la reconnaît au
   formulaire qu'elle contient — pour ne pas rétrécir le tableau des commandes
   ni les adresses, qui occupent légitimement toute la largeur une fois le
   client identifié. */
.woocommerce:has(> form.woocommerce-form-login) > h2,
.woocommerce:has(> form.woocommerce-form-login) > .woocommerce-notices-wrapper,
.woocommerce > form.woocommerce-form-login {
	max-width: var(--wp--custom--justification--2);
	margin-inline: auto;
}

@media (width <= 900px) {
	.woocommerce-account .entry-content > .woocommerce,
	.woocommerce-cart .entry-content > .woocommerce,
	.woocommerce-checkout .entry-content > .woocommerce {
		padding: 20px 22px 52px;
	}
}

/* ------------------------------------------------- Compte client -- */

/* Le tableau de bord sortait nu des gabarits de WooCommerce : une liste de
   liens soulignés à gauche, du texte brut à droite. Le prototype en fait
   deux colonnes — une navigation de deux cent vingt pixels, puis des cartes.
   Les valeurs qui suivent sont les siennes, relevées dans « .account-layout »
   et ses voisines ; le balisage, lui, est celui que WooCommerce produit
   vraiment, relevé par tools/lit-balisage-compte.php plutôt que supposé. */

.woocommerce-account.logged-in .entry-content > .woocommerce {
	display: grid;
	grid-template-columns: 240px 1fr;
	gap: 48px;
	align-items: start;
}

/* L'en-tête et les messages traversent les deux colonnes : un avis de
   commande enregistrée n'appartient pas à la colonne de droite. */
.ap-compte__entete,
.woocommerce-account.logged-in .entry-content > .woocommerce > .woocommerce-notices-wrapper {
	grid-column: 1 / -1;
}

.ap-compte__entete { margin-bottom: 8px; }

.ap-compte__entete h2 {
	margin: 12px 0 0;
	font-size: clamp(30px, 3.2vw, 42px);
	line-height: 1.04;
	letter-spacing: -.02em;
}

/* -- La navigation -- */

/* Le « .woocommerce-account » n'est pas de trop. WooCommerce prefixe ainsi
   ses propres regles de navigation — « margin: 0 0 2em » sur la liste,
   « padding: 1em 0 » sur chaque entree — et deux classes plus un element
   l'emportent sur une classe et un element. Sans ce prefixe, les rubriques
   restaient espacees de trente-deux pixels la ou le prototype en met deux,
   et un blanc de 2em pendait sous la colonne. */
.woocommerce-account .woocommerce-MyAccount-navigation ul {
	display: flex;
	flex-direction: column;
	gap: 2px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.woocommerce-account .woocommerce-MyAccount-navigation li {
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Le remplissage de la colonne, ecrit plutot que suppose. Une entree se
   dimensionnait sur son contenu et non sur la colonne : les libelles d'un
   seul mot tenaient, ceux qui portent une espace se cassaient a chaque
   espace — « Tableau / de / bord » sur trois lignes. C'est la signature
   d'une boite reduite a son mot le plus long, pas d'une colonne trop
   etroite : l'elargir seule n'y aurait rien fait.
   Trois largeurs et un « nowrap » : chaque maillon de la chaine occupe la
   colonne, et le libelle ne se coupe plus quoi qu'il arrive. */
.woocommerce-account .woocommerce-MyAccount-navigation { width: 100%; }

.woocommerce-account .woocommerce-MyAccount-navigation ul { width: 100%; align-items: stretch; }

.woocommerce-account .woocommerce-MyAccount-navigation li { width: 100%; }

/* Pas de « width: 100% » ici : le lien est deja de niveau bloc et remplit
   son entree. L'ecrire quand meme ajoutait les vingt-huit pixels de
   rembourrage par-dessus la largeur pleine, et les six entrees depassaient
   de la colonne. Seul le « nowrap » est utile. */
.woocommerce-account .woocommerce-MyAccount-navigation a { white-space: nowrap; }

/* WooCommerce souligne la rubrique courante. Le prototype la distingue par
   son fond creme, ce qui suffit : le soulignement par-dessus fait double.
   Le « li » n'est pas decoratif — sans lui la regle pese une unite de moins
   que celle de WooCommerce, et le soulignement restait. */
.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a { text-decoration: none; }

.woocommerce-MyAccount-navigation a {
	display: block;
	padding: 12px 14px;
	border-radius: var(--wp--custom--rayon--surface);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--ui);
	letter-spacing: .02em;
	text-decoration: none;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 60%, transparent);
	transition: color .16s ease, background .16s ease;
}

.woocommerce-MyAccount-navigation a:hover { color: var(--wp--preset--color--encre); }

.woocommerce-MyAccount-navigation .is-active a {
	background: var(--wp--preset--color--creme);
	font-weight: 500;
	color: var(--wp--preset--color--encre);
}

/* La déconnexion se détache du reste, à seize pixels sous la dernière
   rubrique. Sa teinte est celle du prototype : il la nomme « accent-red »
   mais la définit au violet des Innovations, et c'est cette valeur-là qui
   s'affiche à l'écran. */
.woocommerce-account .woocommerce-MyAccount-navigation-link--customer-logout {
	margin-top: 16px;
}

.woocommerce-account .woocommerce-MyAccount-navigation-link--customer-logout a {
	color: var(--wp--preset--color--innovations);
}

/* -- Le contenu, en carte -- */

.woocommerce-MyAccount-content {
	padding: 30px 32px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

.woocommerce-MyAccount-content > :first-child { margin-top: 0; }
.woocommerce-MyAccount-content > :last-child { margin-bottom: 0; }

.woocommerce-MyAccount-content h2,
.woocommerce-MyAccount-content h3,
.woocommerce-MyAccount-content legend {
	font-size: var(--wp--preset--font-size--lead);
	margin-bottom: 20px;
}

/* -- Les formulaires -- */

/* WooCommerce fait flotter ses rangées sur quarante-huit pour cent et glisse
   des « .clear » entre elles. Le flottant ne survit pas à une grille et les
   séparateurs n'y servent plus à rien. */
.woocommerce-EditAccountForm {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 16px;
}

.woocommerce-EditAccountForm .clear { display: none; }

.woocommerce-EditAccountForm > .form-row {
	float: none;
	width: auto;
	margin: 0;
	padding: 0;
}

.woocommerce-EditAccountForm > .form-row-wide,
.woocommerce-EditAccountForm > fieldset,
.woocommerce-EditAccountForm > p:last-of-type {
	grid-column: 1 / -1;
}

.woocommerce-EditAccountForm fieldset {
	margin: 12px 0 0;
	padding: 24px 0 0;
	border: 0;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
}

.woocommerce-EditAccountForm fieldset .form-row + .form-row { margin-top: 16px; }

.woocommerce-MyAccount-content label {
	display: block;
	margin-bottom: 6px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.woocommerce-MyAccount-content .woocommerce-Input,
.woocommerce-MyAccount-content input.input-text {
	width: 100%;
	padding: 11px 14px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 15%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--body);
}

.woocommerce-MyAccount-content em {
	display: block;
	margin-top: 6px;
	font-size: var(--wp--preset--font-size--sm);
	font-style: normal;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

/* -- Les adresses -- */

/* Le prototype ne met pas les deux adresses cote a cote : il les empile,
   chacune dans sa carte, coiffee d'une pastille — « Livraison »,
   « Facturation » — et suivie d'un lien « Modifier ». C'est le seul ecran du
   compte ou le contenu n'est pas UNE carte mais plusieurs : la carte
   exterieure s'efface, sinon on encadre un cadre. */
.woocommerce-MyAccount-content:has(.woocommerce-Addresses) {
	padding: 0;
	background: none;
	border: 0;
}

/* Une seule colonne, et les flottants de WooCommerce retires : sans cela ses
   deux colonnes a quarante-huit pour cent tiennent encore et les cartes se
   decalent. */
.woocommerce-account .woocommerce-MyAccount-content .woocommerce-Addresses {
	display: grid;
	grid-template-columns: 1fr;
	gap: 16px;
}

.woocommerce-account .woocommerce-MyAccount-content .woocommerce-Addresses > .woocommerce-Address {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	float: none;
	width: auto;
	margin: 0;
	padding: 22px 24px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
}

/* WooCommerce enferme le titre et le lien dans un meme en-tete, l'un au-dessus
   de l'autre. Le prototype les separe : la pastille en haut, l'adresse, puis
   le lien. « display: contents » retire la boite de l'en-tete sans toucher au
   balisage — ses deux enfants deviennent freres de l'adresse, et « order »
   les range. */
.woocommerce-Address-title { display: contents; }

.woocommerce-account .woocommerce-MyAccount-content .woocommerce-Address h2 {
	order: 1;
	margin: 0 0 10px;
	padding: 4px 9px;
	background: var(--wp--preset--color--creme);
	border-radius: var(--wp--custom--rayon--surface);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 400;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: var(--wp--preset--color--encre);
}

/* L'adresse renseignee vient dans un « address », l'etat vide dans un « p ». */
.woocommerce-account .woocommerce-MyAccount-content .woocommerce-Address address,
.woocommerce-account .woocommerce-MyAccount-content .woocommerce-Address > p {
	order: 2;
	margin: 0;
	font-style: normal;
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.6;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 75%, transparent);
}

.woocommerce-account .woocommerce-MyAccount-content .woocommerce-Address-title .edit {
	order: 3;
	float: none;
	display: inline-block;
	margin: 12px 0 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--foret);
	text-decoration: underline;
	text-underline-offset: 3px;
}

/* La fleche appartient au lien dans le prototype. Posee en « ::after », elle
   suit le soulignement sans entrer dans la traduction.
   Ecrite en clair et non en « 92 » : cette sequence a traverse une couche
   d'outils qui a lu «  » comme un code octal, et la feuille servait un
   caractere de controle suivi de « 92 » — un carre vide puis deux chiffres,
   au bout du lien.
   La police de texte, et non celle du lien : le sous-ensemble de JetBrains
   Mono livre avec le theme ne porte pas la fleche. Elle tombait sinon sur la
   police par defaut du navigateur, differente d'une machine a l'autre. */
.woocommerce-account .woocommerce-MyAccount-content .woocommerce-Address-title .edit::after {
	content: " →";
	font-family: var(--wp--preset--font-family--body);
}

/* La phrase d'introduction, au-dessus des deux cartes. */
.woocommerce-MyAccount-content:has(.woocommerce-Addresses) > p:first-of-type {
	margin: 0 0 18px;
	font-size: var(--wp--preset--font-size--body);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 70%, transparent);
}

/* -- Les commandes -- */

.woocommerce-orders-table { width: 100%; border-collapse: collapse; }

/* Deux classes et un élément pour passer devant « .woocommerce-page
   table.shop_table td », qui rembourre les cellules sur leurs quatre côtés.
   Le prototype ne rembourre que le haut et le bas : sans cela la première
   colonne rentre de seize pixels et ne s'aligne plus sur le titre qui la
   surmonte, ni sur le bord de la carte. */
.woocommerce-account .woocommerce-MyAccount-content table.woocommerce-orders-table th {
	padding: 0 0 12px;
	text-align: left;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 400;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 50%, transparent);
}

.woocommerce-account .woocommerce-MyAccount-content table.woocommerce-orders-table td {
	padding: 16px 0;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 8%, transparent);
	font-size: var(--wp--preset--font-size--ui);
}

.woocommerce-orders-table__cell-order-number a {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
}

/* -- Sur téléphone -- */

@media (width <= 900px) {
	.woocommerce-account.logged-in .entry-content > .woocommerce {
		grid-template-columns: 1fr;
		gap: 28px;
	}

	/* La navigation passe en rangée : une colonne de deux cent vingt pixels
	   au-dessus du contenu coûterait un écran avant d'arriver à celui-ci.
	   Le préfixe « .woocommerce-account » est repris ici aussi : sans lui ces
	   règles pesaient moins que celles du bloc de bureau, qui l'ont pris pour
	   passer devant WooCommerce — et la navigation restait en colonne sur
	   téléphone. Une montée en spécificité désarme ses propres exceptions si
	   on ne les relève pas avec elle. */
	.woocommerce-account .woocommerce-MyAccount-navigation ul {
		flex-direction: row;
		flex-wrap: wrap;
		gap: 8px;
	}

	.woocommerce-account .woocommerce-MyAccount-navigation a { padding: 9px 12px; }

	/* Les entrees reprennent leur largeur naturelle. Les cent pour cent qui
	   les font remplir la colonne sur grand ecran les mettaient ici une par
	   ligne — six lignes au lieu d'une rangee qui s'enroule. */
	.woocommerce-account .woocommerce-MyAccount-navigation li { width: auto; }

	.woocommerce-account .woocommerce-MyAccount-navigation-link--customer-logout {
		margin-top: 0;
		margin-left: auto;
	}

	.woocommerce-MyAccount-content { padding: 24px 20px; }

	.woocommerce-EditAccountForm { grid-template-columns: 1fr; }
}

/* Deux commandes du formulaire passaient sous la cible tactile que le reste
   du site tient : la bascule d'affichage du mot de passe, vingt-deux pixels
   de côté, et le lien « Mot de passe perdu ? », vingt de haut.
   La bascule porte son icône sur « ::before » ; « ::after » est libre et sert
   ici de zone de touche. L'agrandir plutôt que le bouton lui-même évite de
   déplacer l'icône, que WooCommerce positionne au pixel contre le bord du
   champ. Le bouton est déjà en position absolue, ce qui suffit à ancrer le
   pseudo-élément. */
@media (pointer: coarse) {
	.woocommerce .show-password-input::after {
		content: "";
		position: absolute;
		top: 50%;
		left: 50%;
		width: 44px;
		height: 44px;
		transform: translate(-50%, -50%);
	}

	.woocommerce-LostPassword a {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
	}
}

/* ------------------------------------------------------ Fil et titres -- */

.woocommerce-breadcrumb {
	padding: 18px 0;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .02em;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 60%, transparent);
}

.woocommerce-breadcrumb a { color: inherit; text-decoration: none; }
.woocommerce-breadcrumb a:hover { color: var(--wp--preset--color--encre); }

.woocommerce-products-header__title,
.product_title {
	font-family: var(--wp--preset--font-family--affiche);
	font-weight: 400;
	font-size: clamp(22px, 2.6vw, 34px);
	line-height: 1.2;
	letter-spacing: .16em;
	word-spacing: -.62em;
	text-transform: uppercase;
	color: var(--gamme-encre, var(--wp--preset--color--encre));
}

/* --------------------------------------------------------- Catalogue -- */

/* La grille reprend celle de l'accueil : quatre colonnes, pas d'arrondi, un
   filet discret. Une boutique qui ne ressemble pas au reste du site donne
   l'impression d'avoir changé de marque en route. */
.woocommerce ul.products {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 18px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.woocommerce ul.products li.product {
	display: flex;
	flex-direction: column;
	margin: 0;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
	transition: transform .2s ease, box-shadow .2s ease;
}

.woocommerce ul.products li.product:hover {
	transform: translateY(-4px);
	box-shadow: 0 16px 28px color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
}

.woocommerce ul.products li.product a img {
	aspect-ratio: 1;
	object-fit: cover;
	margin: 0;
}

.woocommerce ul.products li.product .woocommerce-loop-product__title {
	padding: 14px 16px 5px;
	font-family: var(--wp--preset--font-family--display);
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.15;
	text-transform: none;
}

.woocommerce ul.products li.product .price {
	padding: 0 16px 18px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--ui);
	font-weight: 500;
	color: var(--wp--preset--color--encre);
}

/* Le bouton de la grille n'a pas lieu d'être sur des produits à formats :
   on ne choisit pas une contenance depuis une vignette. */
.woocommerce ul.products li.product .button { display: none; }

.woocommerce .woocommerce-result-count,
.woocommerce .woocommerce-ordering select {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 60%, transparent);
}

/* ------------------------------------------------------------- Fiche -- */

.woocommerce div.product .price,
.woocommerce div.product span.price {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--h3);
	font-weight: 500;
	color: var(--wp--preset--color--encre);
}

.woocommerce div.product .woocommerce-product-details__short-description {
	max-width: var(--wp--custom--justification--1);
	font-size: var(--wp--preset--font-size--body);
	line-height: 1.7;
	color: var(--gamme-encre, color-mix(in srgb, var(--wp--preset--color--encre) 75%, transparent));
}

/* --------------------------------------------------- Champs et boutons -- */

.woocommerce select,
.woocommerce input[type="text"],
.woocommerce input[type="email"],
.woocommerce input[type="tel"],
.woocommerce input[type="password"],
.woocommerce input[type="number"],
.woocommerce textarea,
.select2-container .select2-selection--single {
	padding: 11px 14px;
	background: var(--wp--preset--color--blanc-casse);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 15%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--body);
	color: var(--wp--preset--color--encre);
	min-height: 44px;
}

.woocommerce label {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 60%, transparent);
}

.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.woocommerce #respond input#submit {
	min-height: 44px;
	padding: 14px 26px;
	background: var(--wp--preset--color--encre);
	border: 0;
	border-radius: var(--wp--custom--rayon--surface);
	color: var(--wp--preset--color--blanc-casse);
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--ui);
	letter-spacing: .08em;
	text-transform: uppercase;
}

.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.woocommerce button.button.alt:hover {
	background: var(--wp--preset--color--foret);
	color: var(--wp--preset--color--blanc-casse);
}

.woocommerce button.button.alt,
.woocommerce a.button.alt { background: var(--wp--preset--color--encre); }

/* ------------------------------------------------- Panier et commande -- */

.woocommerce table.shop_table {
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
	border-radius: var(--wp--custom--rayon--surface);
	border-collapse: collapse;
}

.woocommerce table.shop_table th {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 60%, transparent);
}

.woocommerce table.shop_table td,
.woocommerce table.shop_table th {
	padding: 14px 16px;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
}

.woocommerce .cart_totals h2,
.woocommerce-checkout h3 {
	font-size: var(--wp--preset--font-size--h3);
	text-transform: none;
}

/* Les messages de WooCommerce sont verts vif par défaut : on les ramène à
   la palette, en gardant le filet coloré qui les distingue. */
.woocommerce-message,
.woocommerce-info,
.woocommerce-error {
	padding: 16px 20px;
	background: var(--wp--preset--color--creme);
	border-top: 3px solid var(--wp--custom--accent);
	border-radius: var(--wp--custom--rayon--surface);
	font-size: var(--wp--preset--font-size--body);
	color: var(--wp--preset--color--encre);
}

.woocommerce-error { border-top-color: var(--wp--preset--color--pressees); }

.woocommerce-message::before,
.woocommerce-info::before,
.woocommerce-error::before { display: none; }

/* La mention réglementaire suit le prix partout où il apparaît : c'est là
   qu'un acheteur décide. */
.woocommerce div.product form.cart::after {
	content: "Produits réservés aux personnes majeures. Taux de THC inférieur à 0,3 %, conforme à la réglementation française. Ce produit n'est pas un médicament.";
	display: block;
	max-width: var(--wp--custom--justification--1);
	margin-top: 14px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--xs);
	line-height: 1.7;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 58%, transparent);
}

@media (width <= 900px) {
	.woocommerce,
	.woocommerce-page main { padding: 18px 22px 52px; }

	.woocommerce ul.products { grid-template-columns: repeat(2, 1fr); gap: 12px; }
}

@media (width <= 480px) {
	.woocommerce ul.products { grid-template-columns: 1fr; }
}

/* ------------------------------------------ Compte et panier dans la barre -- */

/* Le lien du compte, posé dans le groupe de droite avec la recherche et le
   panier. Sans cette règle il hériterait du soulignement des liens de
   contenu, et l'icône flotterait sur la ligne de base du texte. */
.ap-barre__client {
	display: inline-flex;
	align-items: center;
	color: var(--wp--preset--color--encre);
	opacity: .8;
	transition: opacity .16s ease;
}

.ap-barre__client:hover,
.ap-barre__client:focus-visible { opacity: 1; }

@media (pointer: coarse) {
	.ap-barre__client {
		min-width: 44px;
		min-height: 44px;
		justify-content: center;
	}
}


/* L'icône rejoint les trois autres du groupe : même taille, même opacité au
   repos. Le décompte se pose en pastille sur le coin haut droit du sac,
   plutôt qu'à côté — il doit pouvoir passer de 1 à 12 sans décaler la
   navigation. */

.ap-barre__panier {
	position: relative;
	display: inline-flex;
	align-items: center;
	color: var(--wp--preset--color--encre);
	opacity: .8;
	transition: opacity .16s ease;
}

.ap-barre__panier:hover,
.ap-barre__panier:focus-visible { opacity: 1; }

.ap-barre__compte {
	position: absolute;
	top: -6px;
	right: -8px;
	min-width: 15px;
	height: 15px;
	padding: 0 4px;
	border-radius: 8px;
	background: var(--wp--custom--accent);
	color: var(--wp--preset--color--blanc-casse);
	font-family: var(--wp--preset--font-family--inter);
	font-size: 10px;
	font-weight: 600;
	line-height: 15px;
	text-align: center;
	letter-spacing: 0;
}

/* Au doigt, la cible passe à 44px sans que l'icône grossisse : c'est la
   zone cliquable qui s'étend autour d'elle. */
@media (pointer: coarse) {
	.ap-barre__panier {
		min-width: 44px;
		min-height: 44px;
		justify-content: center;
	}

	.ap-barre__compte { top: 4px; right: 4px; }
}

/* ------------------------------------------------ Fiche produit WooCommerce -- */

/* Le gabarit classique met la galerie et le résumé côte à côte en les faisant
   flotter, à condition que la galerie soit la sienne. La nôtre remplace la
   sienne : les flottants ne trouvent plus leur prise et les deux colonnes
   retombent l'une sous l'autre. On reprend donc la grille de la maquette,
   posée directement sur le conteneur du produit. */

.single-product main.site-main {
	max-width: none;
	padding: 0 0 80px;
}

.single-product div.product {
	display: grid;
	grid-template-columns: 1.1fr 1fr;
	gap: 56px;
	max-width: var(--wp--custom--justification, 1180px);
	margin-inline: auto;
	padding: 8px 40px 60px;
}

.single-product div.product > .ap-galerie { grid-column: 1; }

/* Deux classes de plus que « .woocommerce div.product div.summary », qui
   impose un flottant à droite sur 48 % de la colonne — soit, dans une
   grille, 48 % d'une case déjà dimensionnée. Le résumé n'occupait que la
   moitié gauche de sa colonne. */
.single-product.woocommerce div.product > div.summary {
	grid-column: 2;
	margin: 0;
	float: none;
	width: auto;
}

/* Les onglets reprennent toute la largeur : ils ne font pas partie du
   face-à-face image / achat. */
.single-product div.product > .woocommerce-tabs {
	grid-column: 1 / -1;
	margin: 0;
}

/* Une seule colonne au format téléphone, l'image d'abord.
   Le résumé doit être repris avec le sélecteur exact qui l'a envoyé en
   colonne 2 plus haut — « .single-product.woocommerce div.product >
   div.summary », quatre classes et deux éléments. Écrit plus court, il
   perdait : le résumé restait en colonne 2, la grille fabriquait une
   deuxième colonne implicite pour l'y mettre, et toute la colonne d'achat —
   prix, formats, bouton d'ajout au panier — sortait de l'écran sur
   téléphone. Une règle à une seule colonne ne suffit pas si un élément
   demande explicitement la deuxième. */
@media (max-width: 900px) {
	.single-product div.product {
		grid-template-columns: 1fr;
		gap: 32px;
		padding-inline: 20px;
	}

	.single-product div.product > .ap-galerie,
	.single-product.woocommerce div.product > div.summary { grid-column: 1; }
}

/* ---------------------------------------------------- Onglets de la fiche -- */

/* Mêmes étiquettes que les onglets de la galerie : mono, capitales, petit
   corps. WooCommerce les livre en liste à puces avec des coins arrondis et
   un dégradé — un vestige d'une autre époque du web, qui jure avec tout le
   reste du site. */

.woocommerce-tabs ul.tabs {
	display: flex;
	gap: 0;
	margin: 0 0 28px;
	padding: 0;
	list-style: none;
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 14%, transparent);
}

.woocommerce-tabs ul.tabs li {
	margin: 0;
	padding: 0;
	background: none;
	border: 0;
	border-radius: 0;
}

.woocommerce-tabs ul.tabs li a {
	display: block;
	padding: 10px 18px 11px;
	border-bottom: 2px solid transparent;
	margin-bottom: -1px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	letter-spacing: .08em;
	text-transform: uppercase;
	text-decoration: none;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 62%, transparent);
	transition: color .16s ease, border-color .16s ease;
}

.woocommerce-tabs ul.tabs li a:hover { color: var(--wp--preset--color--encre); }

.woocommerce-tabs ul.tabs li.active a {
	color: var(--wp--preset--color--encre);
	border-bottom-color: var(--gamme-encre, var(--wp--preset--color--encre));
}

/* Le récit se lit sur une mesure courte. Étalé sur les 1180px du conteneur,
   l'œil perd sa ligne au retour chariot. */
.woocommerce-tabs .woocommerce-Tabs-panel { max-width: 68ch; }
.woocommerce-tabs .woocommerce-Tabs-panel > p { margin: 0 0 14px; }

.woocommerce-tabs .shop_attributes {
	width: 100%;
	max-width: 520px;
	border-collapse: collapse;
}

.woocommerce-tabs .shop_attributes th,
.woocommerce-tabs .shop_attributes td {
	padding: 9px 0;
	text-align: left;
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 10%, transparent);
	font-size: var(--wp--preset--font-size--ui);
}

.woocommerce-tabs .shop_attributes th {
	width: 38%;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 62%, transparent);
}

.woocommerce-tabs .shop_attributes td p { margin: 0; }

/* -- Ma sélection : le résultat du questionnaire sur le compte -- */

.ap-compte__vide p { margin: 0 0 16px; }

.ap-compte__selection h3 {
	margin: 6px 0 8px;
	font-size: clamp(22px, 2.4vw, 28px);
	line-height: 1.1;
}

/* Les trois réponses se lisent comme une fiche d'identité : le critère en
   petites capitales monospace, la réponse en texte courant. Même traitement
   que le tableau des caractéristiques d'une fiche produit, pour que les deux
   se reconnaissent. */
.ap-compte__reponses {
	margin: 18px 0 24px;
	padding: 0;
	list-style: none;
	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
}

.ap-compte__reponses li {
	display: flex;
	gap: 12px;
	justify-content: space-between;
	margin: 0;
	padding: 10px 0;
	list-style: none;
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--encre) 12%, transparent);
}

.ap-compte__reponses span {
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: color-mix(in srgb, var(--wp--preset--color--encre) 62%, transparent);
}

.ap-compte__sous-titre {
	margin: 24px 0 12px;
	font-family: var(--wp--preset--font-family--mono);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 500;
	letter-spacing: .04em;
	text-transform: uppercase;
}

.ap-compte__date {
	margin: 20px 0 12px;
	font-size: var(--wp--preset--font-size--sm);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 62%, transparent);
}

/* L'avis d'enregistrement, sous les résultats du questionnaire. Discret :
   il confirme, il n'annonce pas. */
.ap-quiz__enregistre {
	margin: 16px 0 0;
	font-size: var(--wp--preset--font-size--sm);
	color: color-mix(in srgb, var(--wp--preset--color--encre) 62%, transparent);
}
