/* ==========================================================================
   Annonces de location — côté exploitant et côté public
   ========================================================================== */

.annonces {
  display: grid;
  gap: .75rem;
}

.annonce {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  align-items: flex-start;
  justify-content: space-between;
  padding: 1rem 1.1rem;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
}

.annonce__tete {
  display: flex;
  align-items: center;
  gap: .6rem;
  flex-wrap: wrap;
}

.annonce__tete h3 { margin: 0; font-size: 1rem; }

.annonce__prix {
  margin: .4rem 0 .2rem;
  font-variant-numeric: tabular-nums;
}

.annonce__meta { margin: 0; font-size: .85rem; }

.annonce__actions {
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
  align-items: center;
}

/* --- Demandes reçues ------------------------------------------------------ */

.demandes { display: grid; gap: .85rem; }

.demande {
  padding: 1rem 1.1rem;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  display: grid;
  gap: .6rem;
}

.demande__tete {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  flex-wrap: wrap;
}

.demande__tete > div {
  display: flex;
  align-items: center;
  gap: .55rem;
  flex-wrap: wrap;
}

.demande__quand { font-size: .82rem; }
.demande__sujet { margin: 0; font-size: .92rem; }

.demande__coord {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .25rem .9rem;
  margin: 0;
  font-size: .88rem;
}

.demande__coord dt { color: var(--text-muted); }
.demande__coord dd { margin: 0; }

.demande__message {
  margin: 0;
  padding: .7rem .85rem;
  background: var(--surface);
  border-radius: calc(var(--radius) - 2px);
  font-size: .9rem;
  line-height: 1.55;
}

.demande__form { display: grid; gap: .5rem; }

.demande__actions {
  display: flex;
  gap: .4rem;
  flex-wrap: wrap;
}

/* --- Services à venir ----------------------------------------------------- */

.services { display: grid; gap: .85rem; }

.service {
  display: flex;
  gap: 1rem;
  align-items: flex-start;
  padding: 1.1rem 1.25rem;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
}

.service__icone {
  flex: 0 0 auto;
  width: 2.5rem;
  height: 2.5rem;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--bg);
  color: var(--text-muted);
}

.service__corps h2 {
  margin: 0 0 .4rem;
  font-size: 1rem;
  display: flex;
  align-items: center;
  gap: .5rem;
  flex-wrap: wrap;
}

.service__corps p { margin: 0 0 .4rem; line-height: 1.55; }
.service__pourquoi { font-size: .88rem; }

/* --- Vitrine publique ----------------------------------------------------- */

.vitrine-filtres {
  display: flex;
  gap: .5rem;
  flex-wrap: wrap;
  margin: 1.5rem 0;
}

.vitrine-filtres input[type="search"] { flex: 1 1 14rem; }

.vitrine-retour { margin: 1.5rem 0 .75rem; }

.annonces-publiques {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  gap: 1rem;
}

.annonce-carte {
  display: block;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  transition: border-color .15s ease, transform .15s ease;
}

.annonce-carte:hover,
.annonce-carte:focus-visible {
  border-color: var(--accent, #1a7f5a);
  transform: translateY(-2px);
}

@media (prefers-reduced-motion: reduce) {
  .annonce-carte { transition: none; }
  .annonce-carte:hover, .annonce-carte:focus-visible { transform: none; }
}

.annonce-carte__photo {
  aspect-ratio: 16 / 10;
  background: var(--bg);
  overflow: hidden;
}

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

.annonce-carte__corps { padding: .9rem 1rem; }
.annonce-carte__corps h2 { margin: 0 0 .4rem; font-size: 1rem; line-height: 1.35; }

.annonce-carte__prix {
  margin: 0 0 .5rem;
  font-variant-numeric: tabular-nums;
}

.annonce-carte__prix strong { font-size: 1.1rem; }
.annonce-carte__prix span { color: var(--text-muted); font-size: .85rem; }

.annonce-carte__points {
  margin: 0 0 .6rem;
  padding-left: 1.1rem;
  font-size: .85rem;
  color: var(--text-muted);
  display: grid;
  gap: .15rem;
}

.annonce-carte__pied { margin: 0; font-size: .82rem; }

/* --- Détail d'une annonce ------------------------------------------------- */

.annonce-detail {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 1.5rem;
  display: grid;
  gap: 1rem;
  margin-bottom: 1.5rem;
}

.annonce-detail h1 { margin: 0 0 .3rem; font-size: 1.5rem; }
.annonce-detail header p { margin: 0; }

.annonce-detail__photo {
  border-radius: var(--radius);
  overflow: hidden;
  max-height: 22rem;
}

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

.annonce-detail__prix {
  font-variant-numeric: tabular-nums;
  display: flex;
  align-items: baseline;
  gap: .4rem;
  flex-wrap: wrap;
}

.annonce-detail__prix strong { font-size: 1.6rem; }

.annonce-detail__faits {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: .4rem 1.2rem;
  margin: 0;
  font-size: .92rem;
}

.annonce-detail__faits dt { color: var(--text-muted); }
.annonce-detail__faits dd { margin: 0; }

.annonce-detail__texte { line-height: 1.65; }

.annonce-detail__contact {
  display: flex;
  gap: .5rem;
  flex-wrap: wrap;
  margin: 0;
}

.annonce-demande { margin-bottom: 2.5rem; }

@media (max-width: 640px) {
  .annonce { flex-direction: column; }
  .annonce-detail__faits { grid-template-columns: 1fr; gap: .1rem .5rem; }
  .annonce-detail__faits dt { margin-top: .5rem; }
}

/* --- Disponibilité (calendrier d'occupation) ------------------------------ */

.dispo {
  flex-basis: 100%;
  border-top: 1px solid var(--border);
  padding-top: .7rem;
  margin-top: .2rem;
}

.dispo > summary {
  cursor: pointer;
  font-size: .88rem;
  display: flex;
  align-items: center;
  gap: .5rem;
}

.dispo__corps { padding-top: .75rem; display: grid; gap: .85rem; }

.dispo__liste {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: .35rem;
  font-size: .88rem;
}

.dispo__liste li {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  padding: .4rem .6rem;
  background: var(--surface);
  border-radius: calc(var(--radius) - 2px);
}

.dispo__champs {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
  gap: .6rem;
  margin-bottom: .6rem;
}

/* --- Vitrine : cartes homogènes ------------------------------------------- */

.annonce-carte__photo {
  position: relative;
  aspect-ratio: 16 / 10;
  background: var(--bg);
  overflow: hidden;
}

.annonce-carte__photo.est-vide {
  display: grid;
  place-items: center;
  color: var(--text-muted);
}

.annonce-carte__photo.est-vide svg { width: 40%; max-width: 5rem; opacity: .45; }

.annonce-carte__etiq {
  position: absolute;
  left: .6rem;
  bottom: .6rem;
  padding: .2rem .55rem;
  border-radius: 999px;
  background: rgba(0, 0, 0, .68);
  color: #fff;
  font-size: .72rem;
  letter-spacing: .02em;
}

/* --- Périodes occupées, côté public --------------------------------------- */

.annonce-detail__occupe {
  padding: .9rem 1.1rem;
  background: var(--bg);
  border-radius: var(--radius);
}

.annonce-detail__occupe h2 { margin: 0 0 .5rem; font-size: .95rem; }

.annonce-detail__occupe ul {
  margin: 0 0 .5rem;
  padding-left: 1.15rem;
  display: grid;
  gap: .2rem;
  font-size: .9rem;
}

.annonce-detail__occupe p { margin: 0; font-size: .85rem; }

/* ==========================================================================
   Calendrier d'occupation

   Compact par principe : un planning se lit d'un coup d'œil. La première
   version étirait la grille sur toute la largeur de la carte, ce qui donnait
   des cases de 140 px pour y écrire deux chiffres — beaucoup de place pour
   très peu d'information, et un mois qui ne tenait plus dans l'écran.
   ========================================================================== */

.cal {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 3px;
  max-width: 26rem;
}

.cal__entete {
  text-align: center;
  font-size: .68rem;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--text-muted);
  padding-bottom: .25rem;
}

.cal__vide { min-height: 2.2rem; }

/* Un bouton, donc on neutralise l'apparence native avant de la refaire. */
.cal__jour {
  appearance: none;
  font: inherit;
  text-align: left;
  min-height: 2.2rem;
  border: 1px solid var(--border);
  border-radius: 5px;
  padding: .2rem .3rem;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  background: var(--surface);
  color: inherit;
  cursor: pointer;
  transition: background-color .12s ease, border-color .12s ease;
}

.cal__jour:hover:not(:disabled) { border-color: var(--accent, #1a7f5a); }
.cal__jour:focus-visible { outline: 2px solid var(--accent, #1a7f5a); outline-offset: 1px; }

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

.cal__num {
  font-size: .78rem;
  font-variant-numeric: tabular-nums;
  color: var(--text-muted);
  line-height: 1.1;
}

/* Loué : non sélectionnable, et le curseur le dit avant le clic. */
.cal__jour.est-pris {
  background: color-mix(in srgb, var(--danger, #c62828) 13%, var(--surface));
  border-color: color-mix(in srgb, var(--danger, #c62828) 32%, var(--border));
  cursor: not-allowed;
}

.cal__jour.est-pris .cal__num { color: var(--text); font-weight: 600; }

.cal__jour.est-choisi {
  background: color-mix(in srgb, var(--accent, #1a7f5a) 22%, var(--surface));
  border-color: var(--accent, #1a7f5a);
}

.cal__jour.est-choisi .cal__num { color: var(--text); font-weight: 700; }

.cal__jour.est-aujourdhui { box-shadow: inset 0 0 0 2px var(--accent, #1a7f5a); }

.cal__etiq {
  font-size: .55rem;
  line-height: 1.05;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text-muted);
}

.cal__legende {
  margin: .85rem 0 0;
  font-size: .82rem;
  display: flex;
  align-items: center;
  gap: .35rem;
  flex-wrap: wrap;
}

.cal__pastille {
  width: .75rem;
  height: .75rem;
  border-radius: 3px;
  border: 1px solid var(--border);
  display: inline-block;
}

.cal__pastille--pris {
  background: color-mix(in srgb, var(--danger, #c62828) 13%, var(--surface));
  border-color: color-mix(in srgb, var(--danger, #c62828) 32%, var(--border));
}

.cal__pastille--libre  { background: var(--surface); }

.cal__pastille--choisi {
  background: color-mix(in srgb, var(--accent, #1a7f5a) 22%, var(--surface));
  border-color: var(--accent, #1a7f5a);
}

.cal__selection {
  margin-top: .9rem;
  padding: .65rem .85rem;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  flex-wrap: wrap;
  font-size: .9rem;
}

.cal__actions { display: flex; gap: .4rem; flex-wrap: wrap; }

@media (max-width: 480px) {
  .cal { max-width: none; }
  .cal__etiq { display: none; }
}

.demande__creer {
  margin: 0;
  display: flex;
  align-items: center;
  gap: .6rem;
  flex-wrap: wrap;
  font-size: .85rem;
}

/* ============================================================================
   Pages publiques de location — mise en page

   Le contenu s'étalait sur toute la largeur de l'écran : sur un 27 pouces, six
   colonnes d'annonces et des lignes de texte de trois cents caractères. Il
   passe désormais par `.vit__wrap`, comme le reste du site. Le reste de ce
   bloc donne à ces deux pages la respiration qui leur manquait.
   ========================================================================== */

.loc-page, .ann-page { padding-block: clamp(1.5rem, 4vw, 2.5rem) clamp(3rem, 7vw, 5rem); }

/* ---- Filtres ------------------------------------------------------------- */

.vitrine-filtres {
  display: flex;
  flex-wrap: wrap;
  gap: .7rem;
  margin-bottom: clamp(1.5rem, 4vw, 2.5rem);
  padding: .8rem;
  background: #fff;
  border: 1px solid var(--lf-nuage, #e6e4ef);
  border-radius: 14px;
  box-shadow: 0 10px 26px -22px rgb(23 21 41 / .5);
}

/* La recherche prend la place restante ; la zone et le bouton gardent la
   leur. Trois champs à largeur égale donneraient un champ de recherche trop
   court pour ce qu'on y tape. */
.vitrine-filtres input[type="search"] { flex: 1 1 16rem; min-width: 0; }
.vitrine-filtres select { flex: 0 1 12rem; }
.vitrine-filtres .btn { flex: 0 0 auto; }

/* ---- Grille -------------------------------------------------------------- */

/* Trois colonnes au maximum. En `auto-fill` sans plafond, un grand écran en
   affichait six, et chaque carte devenait une vignette illisible. */
.annonces-publiques {
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 18rem), 1fr));
  gap: clamp(1rem, 2.5vw, 1.6rem);
  max-width: 74rem;
}

.annonce-carte { transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease; }

.annonce-carte:hover {
  transform: translateY(-3px);
  border-color: var(--lf-magenta, #a5195b);
  box-shadow: 0 18px 34px -22px rgb(23 21 41 / .5);
}

/* ---- Fiche d'un véhicule ------------------------------------------------- */

.vitrine-retour {
  margin: 0 0 1.2rem;
  font-size: .88rem;
}

/* Deux colonnes : le véhicule à gauche, la demande à droite et qui suit le
   défilement. Empilé, le formulaire finissait sous une description longue —
   on lisait l'annonce, on ne savait plus comment y répondre. */
.annonce-detail {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(1.25rem, 3vw, 2.5rem);
  align-items: start;
  max-width: 68rem;
}

@media (min-width: 960px) {
  .annonce-detail { grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr); }
  .annonce-detail__photo { grid-column: 1; }
}

.annonce-detail__photo {
  border-radius: 16px;
  overflow: hidden;
  aspect-ratio: 16 / 10;
  background: linear-gradient(150deg, #1d1655, #a5195b);
}

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

.annonce-detail h1 {
  margin: 0 0 .3rem;
  font-family: var(--lf-titre, inherit);
  font-size: clamp(1.5rem, 3.2vw, 2.2rem);
  font-weight: 800;
  letter-spacing: -.02em;
  line-height: 1.15;
  text-wrap: balance;
}

.annonce-detail__prix {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: .5rem;
  margin: .8rem 0 1.2rem;
  font-size: 1.6rem;
  font-weight: 800;
  color: var(--lf-magenta, #a5195b);
  font-variant-numeric: tabular-nums;
}

.annonce-detail__faits {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
  gap: .9rem;
  margin: 0 0 1.4rem;
  padding: 1rem;
  background: var(--lf-lin, #f6f5fa);
  border-radius: 12px;
}

.annonce-detail__faits dt {
  font-size: .72rem;
  text-transform: uppercase;
  letter-spacing: .07em;
  color: var(--lf-ardoise, #55516e);
}
.annonce-detail__faits dd { margin: .15rem 0 0; font-weight: 600; }

.annonce-detail__texte { line-height: 1.7; max-width: 62ch; }

.annonce-detail__occupe {
  margin-top: 1.4rem;
  padding: 1rem;
  border: 1px solid var(--lf-nuage, #e6e4ef);
  border-left: 3px solid #d97706;
  border-radius: 0 12px 12px 0;
  background: #fff;
}

.annonce-detail__contact {
  display: flex;
  flex-wrap: wrap;
  gap: .6rem;
  margin-top: 1.2rem;
}

@media (prefers-reduced-motion: reduce) {
  .annonce-carte { transition: none; }
  .annonce-carte:hover { transform: none; }
}
