/* ============================================================
   PaysagePro — 40-utilities.css
   Utilitaires reels.

   L'ancien socle n'en definissait que cinq (.muted, .text-right,
   .mt-0, .mb-0, .mt-2) alors que les vues en utilisaient une dizaine
   d'autres qui n'existaient nulle part : .mb-2 (16 vues), .row
   (9 vues), .mt-3 (3 vues), .col. Elles sont definies ici.

   Aucun !important, sauf .visually-hidden ou il est structurel.
   ============================================================ */

/* --- Texte --- */
.muted, .text-muted { color: var(--pp-text-muted); }
.text-subtle  { color: var(--pp-text-subtle); }
.text-danger  { color: var(--pp-danger-text); }
.text-success { color: var(--pp-success-text); }
.text-warning { color: var(--pp-warning-text); }
.text-info    { color: var(--pp-info-text); }
.text-primary { color: var(--pp-primary); }

.text-left   { text-align: left; }
.text-center { text-align: center; }
.text-right  { text-align: right; }

.text-sm  { font-size: var(--pp-fs-300); }
.text-xs  { font-size: var(--pp-fs-200); }
.text-lg  { font-size: var(--pp-fs-600); }
.fw-medium   { font-weight: var(--pp-fw-medium); }
.fw-semibold { font-weight: var(--pp-fw-semibold); }
.fw-bold     { font-weight: var(--pp-fw-bold); }

.text-truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.text-nowrap   { white-space: nowrap; }
.text-mono     { font-family: var(--pp-font-mono); }
.text-num      { font-variant-numeric: tabular-nums; }

/* --- Marges (les valeurs historiques sont conservees : .mt-2 valait
       16px dans app.css, pas 8px) --- */
.mt-0 { margin-top: 0; }
.mt-1 { margin-top: var(--pp-space-2); }
.mt-2 { margin-top: var(--pp-space-4); }
.mt-3 { margin-top: var(--pp-space-6); }
.mt-4 { margin-top: var(--pp-space-8); }
.mb-0 { margin-bottom: 0; }
.mb-1 { margin-bottom: var(--pp-space-2); }
.mb-2 { margin-bottom: var(--pp-space-4); }
.mb-3 { margin-bottom: var(--pp-space-6); }
.mb-4 { margin-bottom: var(--pp-space-8); }
.m-0  { margin: 0; }

/* --- Disposition --- */
.row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pp-space-4);
  align-items: flex-start;
}
.col { flex: 1 1 240px; min-width: 0; }
.col-auto { flex: 0 0 auto; }

.d-none         { display: none; }
.d-block        { display: block; }
.d-flex         { display: flex; }
.d-inline-flex  { display: inline-flex; }
.flex-1         { flex: 1 1 auto; min-width: 0; }
.items-center   { align-items: center; }
.justify-between{ justify-content: space-between; }
.justify-end    { justify-content: flex-end; }
.gap-1 { gap: var(--pp-space-1); }
.gap-2 { gap: var(--pp-space-2); }
.gap-3 { gap: var(--pp-space-3); }
.gap-4 { gap: var(--pp-space-4); }

.w-100 { width: 100%; }

/* --- Accessibilite ---
   Une vraie classe de masquage visuel : display:none retirerait le
   contenu de l'arbre d'accessibilite, ce qui est exactement l'inverse
   du but recherche. */
.visually-hidden,
.pp-visually-hidden,
.sr-only {
  position: absolute !important;
  inline-size: 1px;
  block-size: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}
.visually-hidden-focusable:not(:focus):not(:focus-within) {
  position: absolute !important;
  inline-size: 1px;
  block-size: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* --- Impression --- */
.print-only { display: none; }
@media print {
  .no-print   { display: none; }
  .print-only { display: block; }
}
