/*
 * Composants : boutons, en-têtes de section, icônes, placeholders,
 * cartes produit et famille, formulaires.
 */

/* Icônes au trait (Lucide) */
.icon {
  width: 1.5rem;
  height: 1.5rem;
  flex-shrink: 0;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.5;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* Boutons */
.site-nav .button {
  white-space: nowrap;
}

.button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-xs);
  min-height: var(--button-height);
  padding: var(--button-padding);
  border: var(--rule-width) solid transparent;
  border-radius: var(--radius-sm);
  font-family: var(--font-body);
  font-size: var(--text-body);
  font-weight: 600;
  line-height: 1.2;
  text-align: center;
  text-decoration: none;
  hyphens: auto;
  transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out);
}

.button:active {
  transform: translateY(1px);
}

.button .icon {
  width: 1.125rem;
  height: 1.125rem;
}

.button--primary {
  background: var(--color-olive);
  color: var(--color-cream);
}

.button--primary:hover {
  background: var(--color-olive-deep);
  color: var(--color-cream);
}

.button--secondary {
  background: transparent;
  border-color: var(--color-olive);
  color: var(--color-olive);
}

.button--secondary:hover {
  background: var(--color-wheat);
  color: var(--color-olive-deep);
}

.button--on-dark {
  background: var(--color-cream);
  color: var(--color-olive-deep);
}

.button--on-dark:hover {
  background: var(--color-paper);
  color: var(--color-olive-deep);
}

.button--on-dark:focus-visible {
  outline-color: var(--color-night-focus);
}

.button[disabled],
.button[aria-disabled="true"] {
  opacity: 0.6;
  cursor: progress;
}

/* En-tête de section : surtitre et titre */
.section-heading {
  display: grid;
  gap: var(--space-sm);
  max-width: 44rem;
  margin-bottom: var(--space-2xl);
}

.section-heading--center {
  margin-inline: auto;
  text-align: center;
  justify-items: center;
}

.eyebrow {
  font-family: var(--font-body);
  font-size: var(--text-label);
  line-height: var(--leading-label);
  letter-spacing: var(--tracking-label);
  font-weight: var(--weight-label);
  text-transform: uppercase;
  color: var(--color-accent);
}

/* Le titre garde la taille des titres de section même quand il est le h1 d'une
   page (contact, pages légales). */
.section-heading__title {
  font-size: var(--text-headline);
  line-height: var(--leading-headline);
  letter-spacing: var(--tracking-headline);
  font-weight: var(--weight-headline);
}

.section-heading__intro {
  margin-top: var(--space-xs);
  max-width: var(--measure-lead);
  font-size: var(--text-lead);
  line-height: var(--leading-lead);
  color: var(--color-text-muted);
}

/* Placeholders « Photo à venir » : jamais d'image de banque. */
.placeholder {
  display: grid;
  place-content: center;
  justify-items: center;
  gap: var(--space-xs);
  background: var(--color-wheat);
  color: var(--color-olive-leaf);
  text-align: center;
}

.placeholder .icon {
  width: 2rem;
  height: 2rem;
  stroke-width: 1.25;
}

.placeholder__label {
  font-size: var(--text-small);
  line-height: var(--leading-small);
  color: var(--color-text-muted);
}

.placeholder--circle {
  aspect-ratio: 1;
  border-radius: var(--radius-full);
}

.placeholder--rect {
  aspect-ratio: 4 / 3;
  border-radius: var(--radius-md);
}

.placeholder--portrait {
  aspect-ratio: 4 / 5;
  border-radius: var(--radius-lg);
}

/* Carte produit : un tirage papier (photo carrée à marge blanche, un peu plus
   large en bas) tenu par un ruban adhésif, l'origine en petites capitales
   au-dessus du nom, la famille dessous. Choisi par Chris le 2026-10-01 parmi
   dix présentations ; l'inclinaison de chaque tirage vient de la rangée
   (home.css). */
.product-card {
  position: relative;
  display: grid;
  gap: var(--space-sm);
  padding: 0.7rem 0.7rem 1.1rem;
  background: var(--color-paper);
  box-shadow: var(--shadow-print);
  text-align: center;
  transition: transform var(--duration-base) var(--ease-out);
}

/* Le ruban : un morceau de papier blé translucide, aux bords déchirés. */
.product-card::before {
  content: "";
  position: absolute;
  z-index: 1;
  top: -0.7rem;
  left: calc(50% - 2.2rem);
  width: 4.4rem;
  height: 1.4rem;
  background: color-mix(in oklab, color-mix(in oklab, var(--color-wheat) 55%, var(--color-rule)) 88%, transparent);
  box-shadow: 0 1px 2px rgba(38, 38, 30, 0.12);
  clip-path: polygon(3% 0, 97% 4%, 100% 30%, 96% 60%, 100% 100%, 2% 96%, 0 66%, 4% 34%);
  transform: rotate(-3deg);
}

.product-card__media picture,
.product-card__media img {
  display: block;
  width: 100%;
}

.product-card__media img {
  aspect-ratio: 1;
  height: auto;
  object-fit: cover;
}

/* « Photo à venir » : le même carré que les photos. */
.product-card__media .placeholder {
  aspect-ratio: 1;
  border-radius: 0;
}

.product-card__label {
  display: grid;
  justify-items: center;
  gap: var(--space-2xs);
}

.product-card__name {
  font-size: var(--text-title);
  line-height: var(--leading-title);
}

/* Phrase à la place du nom de la marque (version d'Amaury, 2026-10-05) :
   une phrase, donc un cran plus petite qu'un nom, sur des lignes équilibrées. */
.product-card__name--tagline {
  max-width: 15em;
  font-size: var(--text-subtitle);
  line-height: 1.3;
  text-wrap: balance;
}

.product-card__family {
  font-size: var(--text-small);
  line-height: var(--leading-small);
  color: var(--color-text-muted);
}

/* Page à formulaire (acheteurs, producteurs, contact) : le texte à gauche, la
   carte du formulaire à droite dès 1100 px, un complément sous le texte ; sur
   mobile, le texte, le formulaire, puis le complément. */
.form-split {
  display: grid;
  grid-template-areas: "head" "form" "aside";
  gap: var(--space-2xl);
}

.form-split__head {
  grid-area: head;
}

.form-split__head .section-heading {
  margin-bottom: 0;
}

/* Le complément, séparé du texte par un filet, comme la liste des origines. */
.form-split__aside {
  grid-area: aside;
  padding-top: var(--space-xl);
  border-top: var(--rule-width) solid var(--color-rule);
}

.form-split__aside-title {
  margin-bottom: var(--space-lg);
  font-family: var(--font-body);
  font-size: var(--text-label);
  line-height: var(--leading-label);
  letter-spacing: var(--tracking-label);
  font-weight: var(--weight-label);
  text-transform: uppercase;
  color: var(--color-text);
}

/* La carte papier des formulaires du site ; sur une colonne, elle prend toute
   la largeur, comme l'illustration au-dessus (2026-10-05). */
.form-card {
  grid-area: form;
  padding: clamp(1.25rem, 3vw, 2.25rem);
  border: var(--rule-width) solid var(--color-rule);
  border-radius: var(--radius-md);
  background: var(--color-surface);
}

.form-card__title {
  margin-bottom: var(--space-lg);
  font-size: var(--text-subhead);
  line-height: 1.2;
}

/* Sous une petite ligne (pages acheteurs et producteurs), le titre s'en
   rapproche et son texte suit. */
.form-card .eyebrow + .form-card__title {
  margin-top: var(--space-xs);
  margin-bottom: 0;
}

.form-card__text {
  margin-top: var(--space-sm);
  margin-bottom: var(--space-lg);
  color: var(--color-text-muted);
}

@media (min-width: 68.75rem) {
  .form-split {
    grid-template-columns: minmax(0, 1fr) minmax(0, 33rem);
    grid-template-areas: "head form" "aside form";
    grid-template-rows: auto 1fr;
    column-gap: var(--space-3xl);
    row-gap: var(--space-2xl);
    align-items: start;
  }
}

/* Formulaires */
.lead-form {
  display: grid;
  gap: var(--space-lg);
}

.lead-form__grid {
  display: grid;
  gap: var(--space-lg);
}

@media (min-width: 37.5rem) {
  .lead-form__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .lead-form__grid > .form-row--wide {
    grid-column: 1 / -1;
  }
}

.form-row {
  display: grid;
  align-content: start;
  gap: var(--space-xs);
  min-width: 0;
}

.form-label,
.form-legend {
  font-size: var(--text-small);
  line-height: var(--leading-small);
  font-weight: 600;
  color: var(--color-text);
}

.form-legend {
  margin-bottom: var(--space-xs);
  padding: 0;
}

.form-fieldset {
  border: 0;
  padding: 0;
  margin: 0;
  min-width: 0;
}

.form-control {
  width: 100%;
  min-height: var(--input-height);
  padding: var(--input-padding);
  border: var(--rule-width) solid var(--color-field-border);
  border-radius: var(--radius-sm);
  background: var(--color-surface);
  color: var(--color-text);
  caret-color: var(--color-olive);
  line-height: 1.4;
  transition: border-color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out);
}

.form-control:hover {
  border-color: var(--color-ink-muted);
}

.form-control:focus-visible {
  outline: none;
  border-color: var(--color-olive);
  box-shadow: 0 0 0 var(--focus-width) var(--color-olive);
}

textarea.form-control {
  min-height: 9rem;
  resize: vertical;
}

select.form-control {
  appearance: none;
  padding-right: 2.75rem;
  background-image: url("../images/ui/select-chevron-7fYXPv3.svg");
  background-repeat: no-repeat;
  background-position: right 0.875rem center;
  background-size: 1.125rem;
}

.form-control[aria-invalid="true"] {
  border-color: var(--color-error);
}

.form-help {
  font-size: var(--text-small);
  line-height: var(--leading-small);
  color: var(--color-text-muted);
}

.form-error {
  display: flex;
  align-items: flex-start;
  gap: var(--space-xs);
  font-size: var(--text-small);
  line-height: var(--leading-small);
  font-weight: 600;
  color: var(--color-error);
}

.form-error .icon {
  width: 1.125rem;
  height: 1.125rem;
  margin-top: 0.15em;
}

.form-error ul {
  list-style: none;
  padding: 0;
}

/* Choix par boutons radio (type de point de vente) */
.choice-list {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs);
  list-style: none;
  padding: 0;
}

.choice {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: var(--space-xs);
  min-height: 2.75rem;
  padding: var(--space-xs) var(--space-md) var(--space-xs) var(--space-sm);
  border: var(--rule-width) solid var(--color-field-border);
  border-radius: var(--radius-sm);
  background: var(--color-surface);
  cursor: pointer;
  transition: border-color var(--duration-fast) var(--ease-out), background-color var(--duration-fast) var(--ease-out);
}

.choice:hover {
  border-color: var(--color-ink-muted);
}

.choice:has(input:checked) {
  border-color: var(--color-olive);
  background: var(--color-wheat);
}

.choice:has(input:focus-visible) {
  outline: var(--focus-width) solid var(--color-focus);
  outline-offset: var(--focus-offset);
}

.choice input {
  width: 1.125rem;
  height: 1.125rem;
  margin: 0;
  flex-shrink: 0;
}

.choice input:focus-visible {
  outline: none;
}

.form-fieldset[aria-invalid="true"] .choice {
  border-color: var(--color-error);
}

/* Champ piège anti-spam : hors écran, invisible et ignoré au clavier. */
.form-trap {
  position: absolute !important;
  left: -10000px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.form-footer {
  display: grid;
  gap: var(--space-md);
  justify-items: start;
}

.form-footer .button {
  min-width: 14rem;
}

@media (max-width: 37.49rem) {
  .form-footer .button {
    width: 100%;
  }
}

.form-privacy {
  font-size: var(--text-small);
  line-height: var(--leading-small);
  color: var(--color-text-muted);
}

/* Message de résultat (succès ou erreur), annoncé par aria-live. */
.form-status:empty {
  display: none;
}

.form-status__message {
  /* Espace avant le premier champ (revue du 2026-10-07 : le cadre touchait le libellé). */
  margin-bottom: var(--space-lg);
  display: flex;
  align-items: flex-start;
  gap: var(--space-sm);
  padding: var(--space-md) var(--space-lg);
  border: var(--rule-width) solid var(--color-rule);
  border-radius: var(--radius-md);
  background: var(--color-surface);
}

.form-status__message .icon {
  margin-top: 0.05em;
}

.form-status__message--success {
  border-color: var(--color-olive);
}

.form-status__message--success .icon {
  color: var(--color-olive);
}

.form-status__message--error {
  border-color: var(--color-error);
}

.form-status__message--error .icon {
  color: var(--color-error);
}

.form-status__message p + ul,
.form-status__message p + p {
  margin-top: var(--space-2xs);
}

.form-status__message ul {
  padding-left: 1.1em;
}

.form-status__message:focus {
  outline: none;
}

/*
 * Sélecteur de langue (header, menu mobile, footer), 2026-10-05 : médaillons,
 * des drapeaux ronds cerclés d'un fin anneau olive, séparé du drapeau par un
 * filet de la couleur du fond où il est posé (--flag-gap). Sur ordinateur, le
 * drapeau et le code de la langue en cours ouvrent une petite carte papier ;
 * dans le menu mobile, trois cases ; dans le footer, les trois langues en
 * toutes lettres.
 */
.flag {
  --flag-gap: var(--color-bg);
  display: inline-block;
  flex-shrink: 0;
  width: 1.375rem;
  aspect-ratio: 1;
  overflow: hidden;
  border-radius: 50%;
  box-shadow: 0 0 0 2px var(--flag-gap), 0 0 0 3px var(--color-olive-leaf);
}

.flag svg {
  display: block;
  width: 100%;
  height: 100%;
}

.lang__list {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-xs);
  margin: 0;
  padding: 0;
  list-style: none;
}

.lang__item {
  display: inline-flex;
  align-items: center;
  gap: 0.625rem;
  min-height: 2.75rem;
  color: var(--color-text-muted);
  text-decoration: none;
  transition: color var(--duration-base) var(--ease-out), border-color var(--duration-base) var(--ease-out), background-color var(--duration-base) var(--ease-out);
}

a.lang__item:hover {
  color: var(--color-text);
}

.lang__item[aria-current] {
  color: var(--color-text);
  font-weight: 600;
}

.lang__code {
  display: none;
  font-size: var(--text-label);
  font-weight: 600;
  letter-spacing: var(--tracking-label);
}

.lang__check,
.lang__menu {
  display: none;
}

/* Menu mobile : la langue en haut du panneau, sous « Fermer le menu », en
   trois cases égales, le drapeau au-dessus du nom. */
@media (max-width: 73.99rem) {
  .site-nav .lang {
    padding-bottom: var(--space-lg);
    border-bottom: var(--rule-width) solid var(--color-rule);
  }

  .lang--header .lang__list {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--space-xs);
    max-width: 26rem;
  }

  .lang--header .lang__item {
    flex-direction: column;
    justify-content: center;
    gap: 0.5rem;
    width: 100%;
    padding: 0.75rem 0.25rem 0.625rem;
    border: var(--rule-width) solid var(--color-rule);
    border-radius: var(--radius-md);
    font-size: var(--text-small);
  }

  .lang--header .lang__item[aria-current] {
    border-color: var(--color-olive);
    box-shadow: inset 0 0 0 0.5px var(--color-olive);
    background: var(--color-surface);
  }

  .lang--header .lang__item[aria-current] .flag {
    --flag-gap: var(--color-surface);
  }

  .lang--header .flag {
    width: 1.75rem;
  }
}

/* Ordinateur : entre les liens et les boutons d'action. Avec le sélecteur,
   le menu complet demande 1184 px de large (le menu mobile prend le relais
   en dessous, 2026-10-05). */
@media (min-width: 74rem) {
  .site-nav .lang {
    order: 1;
  }

  .site-nav__actions {
    order: 2;
  }

  .lang--header .lang__list {
    display: none;
  }

  .lang__menu {
    position: relative;
    display: block;
  }

  .lang__toggle {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    min-height: 2.75rem;
    padding: 0 0.5rem;
    border-radius: var(--radius-sm);
    color: var(--color-text);
    cursor: pointer;
    list-style: none;
    transition: background-color var(--duration-base) var(--ease-out);
  }

  .lang__toggle::-webkit-details-marker {
    display: none;
  }

  .lang__toggle:hover,
  .lang__menu[open] .lang__toggle {
    background: var(--color-surface);
  }

  .lang__toggle:hover .flag,
  .lang__menu[open] .lang__toggle .flag {
    --flag-gap: var(--color-surface);
  }

  .lang__toggle .lang__code {
    display: inline;
  }

  .lang__chevron {
    width: 1rem;
    height: 1rem;
    color: var(--color-text-muted);
    transition: transform var(--duration-base) var(--ease-out);
  }

  .lang__menu[open] .lang__chevron {
    transform: rotate(180deg);
  }

  .lang__panel {
    position: absolute;
    top: calc(100% + 0.5rem);
    right: 0;
    z-index: 70;
    display: grid;
    gap: 2px;
    min-width: 13.5rem;
    margin: 0;
    padding: 0.375rem;
    list-style: none;
    border: var(--rule-width) solid var(--color-rule);
    border-radius: var(--radius-md);
    background: var(--color-surface);
    box-shadow: var(--shadow-print);
  }

  .lang__panel .flag {
    --flag-gap: var(--color-surface);
    width: 1.5rem;
  }

  /* Le drapeau, le nom, puis le code ou la coche calés à droite. */
  .lang__panel .lang__item {
    display: grid;
    grid-template-columns: auto 1fr auto;
    gap: 0.75rem;
    width: 100%;
    padding: 0 0.75rem;
    border-radius: var(--radius-sm);
    color: var(--color-text);
  }

  .lang__panel a.lang__item:hover {
    background: var(--color-bg);
  }

  .lang__panel a.lang__item:hover .flag {
    --flag-gap: var(--color-bg);
  }

  .lang__panel .lang__code {
    display: inline;
    color: var(--color-text-muted);
    font-weight: 500;
  }

  .lang__panel [aria-current] .lang__code {
    display: none;
  }

  .lang__panel .lang__check {
    display: block;
    width: 1.125rem;
    height: 1.125rem;
    color: var(--color-olive);
  }
}

/* Footer : les trois langues en toutes lettres, sous la présentation. */
.lang--footer {
  margin-top: var(--space-lg);
}

.lang--footer .lang__list {
  gap: 0.25rem var(--space-lg);
}

.site-footer .lang__item {
  min-height: 2.25rem;
  color: var(--color-night-muted);
  font-size: var(--text-small);
  text-decoration: none;
}

.site-footer a.lang__item:hover,
.site-footer .lang__item[aria-current] {
  color: var(--color-night-ink);
}

.site-footer .flag {
  box-shadow: 0 0 0 2px var(--color-night), 0 0 0 3px var(--color-night-muted);
}

/*
 * Bannière de consentement (Google Analytics, 2026-10-05) : un tirage papier
 * à peine penché, tenu par le ruban adhésif des produits (design « tirage »,
 * choisi par Chris parmi trois), en bas à droite sur ordinateur et tablette,
 * sans voile ni blocage de la page ; sur téléphone, droit, posé en bas sur
 * toute la largeur. « Refuser » et « Accepter » ont exactement le même style
 * (exigence de l'Autorité de protection des données). Sous le panneau du
 * menu mobile (z-index 60).
 */
.consent {
  position: fixed;
  right: clamp(0.75rem, 2vw, 1.75rem);
  bottom: clamp(0.75rem, 2vw, 1.75rem);
  left: 0.75rem;
  z-index: 55;
  display: grid;
  gap: 0.5rem;
  padding: 1.5rem 1.25rem 1.25rem;
  background: var(--color-paper);
  box-shadow: var(--shadow-print);
  color: var(--color-text);
  animation: consent-in 420ms var(--ease-out) both;
}

.consent[hidden] {
  display: none;
}

/* Le ruban : celui des tirages de produits (.product-card::before). */
.consent::before {
  content: "";
  position: absolute;
  top: -0.7rem;
  left: calc(50% - 2.2rem);
  width: 4.4rem;
  height: 1.4rem;
  background: color-mix(in oklab, color-mix(in oklab, var(--color-wheat) 55%, var(--color-rule)) 88%, transparent);
  box-shadow: 0 1px 2px rgba(38, 38, 30, 0.12);
  clip-path: polygon(3% 0, 97% 4%, 100% 30%, 96% 60%, 100% 100%, 2% 96%, 0 66%, 4% 34%);
  transform: rotate(-3deg);
}

@media (min-width: 37.5rem) {
  .consent {
    left: auto;
    width: 22rem;
    rotate: -1.2deg;
  }
}

.consent__title {
  font-family: var(--font-display);
  font-size: 1.25rem;
  font-weight: var(--weight-headline);
  line-height: 1.2;
}

.consent__text {
  font-size: var(--text-small);
  line-height: var(--leading-small);
  color: var(--color-text-muted);
}

.consent__text a {
  color: inherit;
  text-underline-offset: 0.2em;
}

.consent__text a:hover {
  color: var(--color-text);
}

.consent__actions {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.5rem;
  margin-top: 0.5rem;
}

.consent__button {
  min-height: 2.75rem;
  padding: 0 1rem;
  border: 1.5px solid var(--color-olive);
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--color-olive);
  font: 600 var(--text-small) / 1.2 var(--font-body);
  cursor: pointer;
  transition: background-color var(--duration-base) var(--ease-out), color var(--duration-base) var(--ease-out);
}

.consent__button:hover {
  background: var(--color-olive);
  color: var(--color-cream);
}

@keyframes consent-in {
  from {
    opacity: 0;
    translate: 0 1rem;
  }
}

@media (prefers-reduced-motion: reduce) {
  .consent {
    animation: none;
  }
}
