/**
 * Petzerhiel — Design tokens (BRD UI v1 §4.1, Sprint 31 Bloc 1 Fondations U1).
 *
 * SOURCE DE VÉRITÉ UNIQUE pour couleurs, espacements, typographie, rayons, ombres.
 * Aucune valeur hardcoded ailleurs (à terme : portal.css + admin.css migrent
 * progressivement vers ces variables — refactor distribué Bloc 10).
 *
 * Convention de nommage : --pz-{category}-{role}-{state?}.
 * Exemples : --pz-primary, --pz-urgent-hover, --pz-bg-raised, --pz-space-4.
 *
 * Modes thème : auto-détecté via prefers-color-scheme par défaut, override
 * possible via [data-theme="light"] ou [data-theme="dark"] sur <html>.
 * Densité : [data-density="compact"] (syndic/admin) ou [data-density="aerated"]
 * (copropriétaire/locataire/prestataire) sur <body>.
 *
 * RGPD/perf : zéro web-font fetch (system-ui), conforme cible Lighthouse ≥ 80
 * + TTI < 1.5s 4G (BRD §6.8).
 */

:root {
  /* ──────────────────────────────────────────────────────────────────────
   * COULEURS PRIMAIRES — Cyan Petzerhiel (préservé du portal.css existant)
   * ──────────────────────────────────────────────────────────────────────*/
  --pz-primary:        #0284c7;        /* S107 V_D.8 — sky-600 (vs sky-500 #0ea5e9) ratio 3.92:1 AA-large ✅ */
  --pz-primary-hover:  #0369a1;        /* sky-700 — ratio 5.17:1 AA ✅ */
  --pz-primary-active: #075985;        /* sky-800 — ratio 7.31:1 AAA ✅ */
  --pz-primary-soft:   #e0f2fe;

  /* ──────────────────────────────────────────────────────────────────────
   * COULEURS SÉMANTIQUES (BRD §3.6 zéro tolérance arbre-de-Noël)
   * Une couleur = un message, pas de déco gratuite.
   * ──────────────────────────────────────────────────────────────────────*/
  --pz-urgent:         #dc2626;   /* rouge — pile à dérouler, action requise */
  --pz-urgent-hover:   #b91c1c;
  --pz-urgent-active:  #991b1b;
  --pz-urgent-strong:  #7f1d1d;   /* S128 V_A.2 — dark red admin-alert-error bg + cabinet pilote palette */
  --pz-urgent-soft:    #fee2e2;

  --pz-warning:        #f59e0b;   /* jaune — anomalie persistante, à corriger un jour */
  --pz-warning-hover:  #d97706;
  --pz-warning-active: #b45309;
  --pz-warning-strong: #78350f;   /* S128 V_A.2 — dark amber pour bg badges legacy migrés */
  --pz-warning-soft:   #fef3c7;

  --pz-info:           #2563eb;   /* S107 V_D.8 — blue-600 (vs blue-500 #3b82f6) ratio 5.17:1 AA ✅ */
  --pz-info-hover:     #2563eb;
  --pz-info-active:    #1d4ed8;
  --pz-info-strong:    #1e3a8a;   /* S128 V_A.2 — dark blue bg cabinet pilote */
  --pz-info-soft:      #dbeafe;

  --pz-success:        #10b981;   /* vert — confirmation succès, baisse impayés OK */
  --pz-success-hover:  #059669;
  --pz-success-active: #047857;
  --pz-success-strong: #14532d;   /* S128 V_A.2 — dark green admin-alert-success bg */
  --pz-success-soft:   #d1fae5;

  --pz-proxy:          #8b5cf6;   /* S128 V_A.2 — violet AG mandats/représentations (semantic distinct primary) */
  --pz-proxy-soft:     #ede9fe;
  --pz-proxy-active:   #6d28d9;

  --pz-neutral:        #64748b;   /* gris — au repos, pas de message */
  --pz-neutral-hover:  #475569;
  --pz-neutral-active: #334155;
  --pz-neutral-soft:   #f1f5f9;
  --pz-video-backdrop: #000;      /* S141 — fond noir derrière flux vidéo (scanner QR AG Studio) */

  /* ──────────────────────────────────────────────────────────────────────
   * COULEURS SURFACE — adaptées dark/light via [data-theme]
   * (mode light par défaut, override automatique via prefers-color-scheme)
   * ──────────────────────────────────────────────────────────────────────*/
  --pz-bg-base:    #ffffff;        /* fond principal page (mode clair par défaut) */
  --pz-bg-raised:  #f8fafc;        /* fond panel/card légèrement élevé */
  --pz-bg-overlay: rgba(15, 23, 42, 0.6);   /* fond modal/drawer */
  --pz-bg-input:   #ffffff;        /* fond inputs/textarea/select */

  --pz-text-primary:   #0f172a;    /* texte principal */
  --pz-text-secondary: #475569;    /* texte secondaire/labels */
  --pz-text-muted:     #94a3b8;    /* texte désactivé/placeholder */
  --pz-text-on-primary: #ffffff;   /* texte sur fond primary/urgent/etc */
  --pz-link:           #0284c7;    /* S153 — couleur des liens de contenu (mode CLAIR, AA sur blanc).
                                       Bascule en bleu clair lisible en mode sombre (cf blocs dark). */

  --pz-border:        #e2e8f0;     /* bordure standard */
  --pz-border-strong: #cbd5e1;     /* bordure focus/hover */
  --pz-border-soft:   #f1f5f9;     /* bordure très discrète/séparateur */

  /* ──────────────────────────────────────────────────────────────────────
   * S70 V_A.2 — Logo Petzerhiel (canonique fixe NON personnalisable).
   * Bascule mode clair/sombre uniquement (pas de user-theme override).
   * Mode sombre = blanc, mode clair = cyan Petzerhiel #0ea5e9.
   * ──────────────────────────────────────────────────────────────────────*/
  --pz-brand-logo:    #0ea5e9;     /* mode clair défaut */

  /* S87 V_A α.2 — fond inputs disabled/readonly (Mon compte/Organisation lecture seule) */
  --pz-input-disabled-bg: rgba(15,23,42,0.04);

  /* ──────────────────────────────────────────────────────────────────────
   * S65 R1 — 5 vars PERSONNALISABLES par utilisateur (× 2 modes en DB
   * party_portal_auth.theme_dark_*/theme_light_*).
   * Override final via <style id="pzUserColors"> injecté en <head> par
   * lib/user_theme.php (cf includes/auth.php). NULL en DB = utilise les
   * défauts ci-dessous + dans les blocs body.light-mode/dark-mode/portal-page.
   * Cf docs/decisions/light-dark-mode-architecture.md (à mettre à jour S65 R6).
   * ──────────────────────────────────────────────────────────────────────*/
  --pz-primary-text:    #ffffff;       /* alias --pz-text-on-primary, prêt à override user */
  --pz-secondary:       #ffffff;       /* fond shell topbar/sidebar/cards (mode clair défaut) */
  --pz-secondary-text:  #0f172a;       /* texte INSIDE shell */
  --pz-bg-body:         #f8fafc;       /* fond body global (zones entre cards) */
  /* --pz-primary existe déjà ligne 24 (#0ea5e9 cyan) */

  /* Surfaces translucides shell (S62 V_A1) — utilisées par topbar/sidebar/overlays.
     IMPORTANT (S62 hotfix v1) : portal.css et admin.css gardent leur background
     hardcoded sombre par défaut (`body.portal-page { background: #0a1628 }`,
     `.admin-body { background: var(--pz-bg-base) }` avec gradient via
     `body:not(.light-mode)`) — ces tokens shell sont prêts pour les composants
     Lego qui voudront les utiliser, mais NE remplacent PAS les hardcoded core. */
  --pz-bg-shell-topbar:    rgba(0, 0, 0, 0.7);
  --pz-bg-shell-sidebar:   rgba(0, 0, 0, 0.55);
  --pz-bg-shell-modal:     #0f172a;
  --pz-border-shell:       rgba(255, 255, 255, 0.08);
  --pz-overlay-soft:       rgba(255, 255, 255, 0.04);
  --pz-overlay-strong:     rgba(255, 255, 255, 0.08);

  /* Texte semi-transparent sur shell — utilisés par sed batch portal.css 40
     occurrences `color: rgba(255,255,255, X)`. Valeurs identiques à l'ancien
     hardcoded en mode sombre, basculent en sombre semi-transparent en clair. */
  --pz-text-shell-strong:  rgba(255, 255, 255, 0.90);
  --pz-text-shell-medium:  rgba(255, 255, 255, 0.70);
  --pz-text-shell-soft:    rgba(255, 255, 255, 0.55);
  --pz-text-shell-faint:   rgba(255, 255, 255, 0.35);

  /* ──────────────────────────────────────────────────────────────────────
   * TYPOGRAPHIE — system-ui (zéro web-font fetch)
   * ──────────────────────────────────────────────────────────────────────*/
  --pz-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;

  --pz-font-size-xs:   0.75rem;   /* 12px */
  --pz-font-size-sm:   0.875rem;  /* 14px */
  --pz-font-size-base: 1rem;      /* 16px */
  --pz-font-size-lg:   1.125rem;  /* 18px */
  --pz-font-size-xl:   1.5rem;    /* 24px */

  --pz-font-weight-regular: 400;
  --pz-font-weight-medium:  500;
  --pz-font-weight-bold:    700;

  --pz-line-height-tight:   1.25;
  --pz-line-height-normal:  1.5;
  --pz-line-height-loose:   1.75;

  /* ──────────────────────────────────────────────────────────────────────
   * ESPACEMENTS — système 4px (BRD §4.1)
   * ──────────────────────────────────────────────────────────────────────*/
  /* Convention S91 DS interview Léa Q25 : grille 4px stricte.
     Echelle : 4/8/12/16/20/24/32/48/64/96. WCAG touch 44px = 11×4. */
  --pz-space-0:  0;
  --pz-space-1:  0.25rem;   /*  4px */
  --pz-space-2:  0.5rem;    /*  8px */
  --pz-space-3:  0.75rem;   /* 12px */
  --pz-space-4:  1rem;      /* 16px */
  --pz-space-5:  1.25rem;   /* 20px — S91 DS comble le trou 16→24 */
  --pz-space-6:  1.5rem;    /* 24px */
  --pz-space-8:  2rem;      /* 32px */
  --pz-space-12: 3rem;      /* 48px */
  --pz-space-16: 4rem;      /* 64px */
  --pz-space-24: 6rem;      /* 96px */

  /* ──────────────────────────────────────────────────────────────────────
   * DENSITÉ — adaptée par chapeau via [data-density]
   * Défaut : aérée (mobile-first copro/locataire). Surchargée pour syndic/admin
   * via [data-density="compact"] sur <body>.
   * ──────────────────────────────────────────────────────────────────────*/
  --pz-density-padding: var(--pz-space-4);   /* aéré : 16px */
  --pz-density-row:     var(--pz-space-3);   /* aéré : 12px de hauteur ligne */
  --pz-density-gap:     var(--pz-space-4);

  /* ──────────────────────────────────────────────────────────────────────
   * RAYONS DE BORDURE — convention hybride S91 DS interview Léa Q21
   * ──────────────────────────────────────────────────────────────────────
   * Mapping recommandé :
   *   --pz-radius-sm     (4px)  → inputs, buttons, small badges
   *   --pz-radius-card   (6px)  → cards, sections, panels (entité visuelle moyenne)
   *   --pz-radius-md     (8px)  → drawers, modals, dialogs
   *   --pz-radius-card-lg (10px) → cards aérées section-box, S92 ajouté pour normaliser 10px legacy
   *   --pz-radius-lg     (12px) → badges/chips pill, KPI tiles aérées
   *   --pz-radius-xl     (16px) → containers fortement arrondis (FAB cluster, modals XL)
   *   --pz-radius-full   (9999) → avatars 50%, pills 100% rondes
   * Modular et signifiant : chaque taille = un rôle métier visible.
   * ──────────────────────────────────────────────────────────────────────*/
  /* S153 — DIRECTIVE ARNAUD « zéro coin arrondi » : tous les rayons rectangulaires = 0.
     Tuiles / métriques / boutons / tables / cards / panels / inputs = CARRÉS stricts.
     Seul --pz-radius-full (cercles : avatars, puces de statut, toggles) est conservé —
     un cercle n'est pas un « coin arrondi ». */
  --pz-radius-sm:      0;     /* S153 : était 4px */
  --pz-radius-card:    0;     /* S140 : cards/sections CARRÉES (retour Arnaud) */
  --pz-radius-md:      0;     /* S153 : était 8px */
  --pz-radius-card-lg: 0;     /* S140 : section-box / panels CARRÉS (retour Arnaud) */
  --pz-radius-lg:      0;     /* S153 : était 12px */
  --pz-radius-xl:      0;     /* S153 : était 16px (FAB cluster, modals) */
  --pz-radius-full:    9999px; /* cercles/pills ronds uniquement (avatars, toggles, puces) */

  /* ──────────────────────────────────────────────────────────────────────
   * OMBRES — discrètes, cohérentes light/dark
   * ──────────────────────────────────────────────────────────────────────*/
  --pz-shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.05);
  --pz-shadow-md: 0 2px 4px rgba(15, 23, 42, 0.08), 0 1px 2px rgba(15, 23, 42, 0.04);
  --pz-shadow-lg: 0 8px 16px rgba(15, 23, 42, 0.12), 0 4px 8px rgba(15, 23, 42, 0.06);

  /* ──────────────────────────────────────────────────────────────────────
   * Z-INDEX — système hiérarchisé
   * ──────────────────────────────────────────────────────────────────────*/
  --pz-z-dropdown: 100;
  --pz-z-sticky:   200;
  --pz-z-overlay:  300;
  --pz-z-drawer:   400;
  --pz-z-modal:    500;
  --pz-z-toast:    600;
  --pz-z-tooltip:  700;
}

/* ────────────────────────────────────────────────────────────────────────
 * MODE CLAIR — Sprint 62 V_A1 refonte
 *
 * Architecture (BRD UI v1 + correctif S62) :
 *   - DÉFAUT (`:root`) = mode sombre (cf. portal.css legacy `body.portal-page`
 *     avec fond `#0a1628` et texte blanc — chapeau syndic/admin/pro).
 *   - `body.light-mode` (toggle JS portal.js + admin) = bascule explicite vers
 *     le mode clair en surchargeant TOUS les tokens. Source unique de vérité.
 *   - `[data-theme="light"]` = alias DOM-level pour API expressive (S31), idem.
 *   - `[data-theme="dark"]` / `body.dark-mode` = no-op (déjà défaut), conservés
 *     par rétrocompat pour expressivité.
 *
 * Bénéfice : les composants qui consomment `var(--pz-bg-base)`, `var(--pz-text-primary)`,
 * etc. basculent automatiquement. Plus besoin d'overrides `.light-mode .X { ... }`
 * dans portal.css/admin.css quand le composant est tokenisé.
 * ────────────────────────────────────────────────────────────────────────*/

/* Override clair via classe body.light-mode (utilisée par toggle topbar S31+) */
body.light-mode,
[data-theme="light"] {
  --pz-bg-base:    #ffffff;
  --pz-bg-raised:  #f8fafc;
  --pz-bg-overlay: rgba(15, 23, 42, 0.6);
  --pz-bg-input:   #ffffff;

  --pz-text-primary:   #0f172a;
  --pz-text-secondary: #475569;
  --pz-text-muted:     #94a3b8;
  --pz-link:           #0284c7;    /* S153 — liens contenu mode CLAIR (light-mode/data-theme=light) */

  /* S70 V_A.2 — Logo Petzerhiel canonique mode clair = cyan */
  --pz-brand-logo:    #0ea5e9;

  /* S65 R1 — 5 vars personnalisables, defaults Petzerhiel mode CLAIR */
  --pz-primary:         #0284c7;       /* cyan plus foncé (meilleur contraste sur fond clair) */
  --pz-primary-text:    #ffffff;
  --pz-secondary:       #ffffff;       /* shell blanc */
  --pz-secondary-text:  #0f172a;       /* texte sombre sur shell blanc */
  --pz-bg-body:         #f8fafc;       /* fond body très pâle gris */

  --pz-border:        #e2e8f0;
  --pz-border-strong: #cbd5e1;
  --pz-border-soft:   #f1f5f9;

  --pz-primary-soft:  #e0f2fe;
  --pz-urgent-soft:   #fee2e2;
  --pz-warning-soft:  #fef3c7;
  --pz-info-soft:     #dbeafe;
  --pz-success-soft:  #d1fae5;
  --pz-neutral-soft:  #f1f5f9;

  /* Surfaces translucides shell — bascule miroir */
  --pz-bg-shell-topbar:    rgba(255, 255, 255, 0.92);
  --pz-bg-shell-sidebar:   #ffffff;
  --pz-bg-shell-modal:     #ffffff;
  --pz-border-shell:       rgba(15, 23, 42, 0.08);
  --pz-overlay-soft:       rgba(15, 23, 42, 0.04);
  --pz-overlay-strong:     rgba(15, 23, 42, 0.08);

  /* Texte sur shell — bascule miroir (sombre semi-transparent sur fond clair) */
  --pz-text-shell-strong:  rgba(15, 23, 42, 0.92);
  --pz-text-shell-medium:  rgba(15, 23, 42, 0.72);
  --pz-text-shell-soft:    rgba(15, 23, 42, 0.55);
  --pz-text-shell-faint:   rgba(15, 23, 42, 0.40);
}

/* Mode AUTO via prefers-color-scheme — actif uniquement si aucun override explicite */
@media (prefers-color-scheme: light) {
  body:not(.light-mode):not(.dark-mode):not([data-theme]) {
    --pz-bg-base:    #ffffff;
    --pz-bg-raised:  #f8fafc;
    --pz-bg-overlay: rgba(15, 23, 42, 0.6);
    --pz-bg-input:   #ffffff;

    --pz-text-primary:   #0f172a;
    --pz-text-secondary: #475569;
    --pz-text-muted:     #94a3b8;
    --pz-link:           #0284c7;    /* S153 — liens contenu mode CLAIR (prefers-color-scheme:light) */

    /* S70 V_A.2 — Logo Petzerhiel canonique mode AUTO clair = cyan */
    --pz-brand-logo:    #0ea5e9;

    /* S65 R1 — 5 vars personnalisables, defaults Petzerhiel mode CLAIR (auto) */
    --pz-primary:         #0284c7;
    --pz-primary-text:    #ffffff;
    --pz-secondary:       #ffffff;
    --pz-secondary-text:  #0f172a;
    --pz-bg-body:         #f8fafc;

    --pz-border:        #e2e8f0;
    --pz-border-strong: #cbd5e1;
    --pz-border-soft:   #f1f5f9;

    --pz-primary-soft:  #e0f2fe;
    --pz-urgent-soft:   #fee2e2;
    --pz-warning-soft:  #fef3c7;
    --pz-info-soft:     #dbeafe;
    --pz-success-soft:  #d1fae5;
    --pz-neutral-soft:  #f1f5f9;

    --pz-bg-shell-topbar:    rgba(255, 255, 255, 0.92);
    --pz-bg-shell-sidebar:   #ffffff;
    --pz-bg-shell-modal:     #ffffff;
    --pz-border-shell:       rgba(15, 23, 42, 0.08);
    --pz-overlay-soft:       rgba(15, 23, 42, 0.04);
    --pz-overlay-strong:     rgba(15, 23, 42, 0.08);

    --pz-text-shell-strong:  rgba(15, 23, 42, 0.92);
    --pz-text-shell-medium:  rgba(15, 23, 42, 0.72);
    --pz-text-shell-soft:    rgba(15, 23, 42, 0.55);
    --pz-text-shell-faint:   rgba(15, 23, 42, 0.40);
  }
}

/* Override forcé dark — no-op vs défaut, conservé pour expressivité API */
[data-theme="dark"],
body.dark-mode {
  /* S120 V_A.7.11 — REVERT V_A.7.1 (gris hardcode) → défauts Petzerhiel STANDARD slate.
     Arnaud clarification : "le gris je l'avais choisi pour Sidney custom" → tokens
     défauts plateforme = palette Petzerhiel marque (slate cyan historique). Syndics
     qui veulent gris/autre = customiser via color picker settings (handler save
     fixé V_A.7.4 CSRF). Cascade canon S65 R2 pzUserColors !important override. */
  --pz-bg-base:    #0a1628;
  --pz-bg-raised:  #1e293b;
  --pz-bg-overlay: rgba(0, 0, 0, 0.7);
  --pz-bg-input:   #1e293b;

  --pz-text-primary:   #f1f5f9;
  --pz-text-secondary: #cbd5e1;
  --pz-text-muted:     #64748b;
  --pz-link:           #60a5fa;    /* S153 — liens contenu mode SOMBRE : bleu clair lisible sur fond foncé
                                       (vs #2563eb info trop sombre / vs bleu navigateur par défaut illisible) */

  /* S70 V_A.2 — Logo Petzerhiel canonique mode sombre = blanc */
  --pz-brand-logo:    #ffffff;

  /* S65 R1 — 5 vars personnalisables, defaults Petzerhiel mode SOMBRE.
     pzUserColors S65 R2 émet avec !important → ces defaults sont écrasés
     quand user customise theme_dark_* (cf lib/user_theme.php:397). */
  --pz-primary:         #0ea5e9;       /* cyan plus clair (meilleur contraste sur fond sombre) */
  --pz-primary-text:    #ffffff;
  --pz-secondary:       #0f172a;       /* shell ardoise foncée */
  --pz-secondary-text:  #f1f5f9;       /* texte clair sur shell sombre */
  --pz-bg-body:         #0a1628;       /* fond body bleu nuit */

  --pz-border:        #334155;
  --pz-border-strong: #475569;
  --pz-border-soft:   #1e293b;

  --pz-primary-soft:  #082f49;
  --pz-urgent-soft:   #450a0a;
  --pz-warning-soft:  #451a03;
  --pz-info-soft:     #1e3a8a;
  --pz-success-soft:  #064e3b;
  --pz-neutral-soft:  #1e293b;

  --pz-bg-shell-topbar:    rgba(0, 0, 0, 0.7);
  --pz-bg-shell-sidebar:   #0f172a;
  --pz-bg-shell-modal:     #0f172a;
  --pz-border-shell:       rgba(255, 255, 255, 0.08);
  --pz-overlay-soft:       rgba(255, 255, 255, 0.04);
  --pz-overlay-strong:     rgba(255, 255, 255, 0.08);

  --pz-text-shell-strong:  rgba(255, 255, 255, 0.90);
  --pz-text-shell-medium:  rgba(255, 255, 255, 0.70);
  --pz-text-shell-soft:    rgba(255, 255, 255, 0.55);
  --pz-text-shell-faint:   rgba(255, 255, 255, 0.35);
}

/* ────────────────────────────────────────────────────────────────────────
 * PORTAIL + ADMIN = SOMBRE PAR DÉFAUT (S62 hotfix v2)
 *
 * Le portail (body.portal-page) et l'admin (body.admin-body) sont sombres
 * par défaut historiquement (cf docs/decisions/light-dark-mode-architecture.md).
 * Sans cette règle, les composants Lego (trend_card, kpi_tile, etc.) qui
 * consomment var(--pz-bg-raised) auraient un fond CLAIR sur portail SOMBRE,
 * créant une dissonance visuelle.
 *
 * Cette règle force tokens en sombre dès qu'on est sur portail/admin SAUF si
 * l'utilisateur a forcé le mode clair via body.light-mode (toggle topbar).
 * ────────────────────────────────────────────────────────────────────────*/
body.portal-page:not(.light-mode),
body.admin-body:not(.light-mode) {
  /* S120 V_A.7.11 — REVERT V_A.7.1 (gris hardcode) → défauts Petzerhiel STANDARD slate.
     Parité body.dark-mode (FOUC prevention SSR). Custom user via color picker. */
  --pz-bg-base:    #0a1628;
  --pz-bg-raised:  #1e293b;
  --pz-bg-overlay: rgba(0, 0, 0, 0.7);
  --pz-bg-input:   #1e293b;

  --pz-text-primary:   #f1f5f9;
  --pz-text-secondary: #cbd5e1;
  --pz-text-muted:     #94a3b8;
  --pz-link:           #60a5fa;    /* S153 — liens contenu mode SOMBRE (portal-page:not(.light-mode)) */

  /* S70 V_A.2 — Logo Petzerhiel canonique mode sombre = blanc */
  --pz-brand-logo:    #ffffff;

  /* S65 R1 — 5 vars personnalisables, defaults Petzerhiel mode SOMBRE (portail/admin par défaut) */
  --pz-primary:         #0ea5e9;
  --pz-primary-text:    #ffffff;
  --pz-secondary:       #0f172a;
  --pz-secondary-text:  #f1f5f9;
  --pz-bg-body:         #0a1628;

  --pz-border:        #334155;
  --pz-border-strong: #475569;
  --pz-border-soft:   #1e293b;

  --pz-primary-soft:  #082f49;
  --pz-urgent-soft:   #450a0a;
  --pz-warning-soft:  #451a03;
  --pz-info-soft:     #1e3a8a;
  --pz-success-soft:  #064e3b;
  --pz-neutral-soft:  #1e293b;
}

/* ────────────────────────────────────────────────────────────────────────
 * DENSITÉ COMPACTE — syndic/admin/CS/tuteur (BRD §3.8)
 * ────────────────────────────────────────────────────────────────────────*/
[data-density="compact"] {
  --pz-density-padding: var(--pz-space-2);   /* 8px */
  --pz-density-row:     var(--pz-space-2);   /* 8px */
  --pz-density-gap:     var(--pz-space-3);   /* 12px */
}

/* ────────────────────────────────────────────────────────────────────────
 * DENSITÉ AÉRÉE — copro/locataire/prestataire (BRD §3.8, défaut)
 * Explicite pour éviter ambiguïté quand <body> a [data-density].
 * ────────────────────────────────────────────────────────────────────────*/
[data-density="aerated"] {
  --pz-density-padding: var(--pz-space-4);   /* 16px */
  --pz-density-row:     var(--pz-space-3);   /* 12px */
  --pz-density-gap:     var(--pz-space-4);   /* 16px */
}

/* ────────────────────────────────────────────────────────────────────────
 * FOCUS VISIBLE — a11y WCAG 2.1 AA (BRD §6.9)
 * Outline 2px sur tous focusables, couleur primary pour cohérence.
 * ────────────────────────────────────────────────────────────────────────*/
:focus-visible {
  outline: 2px solid var(--pz-primary);
  outline-offset: 2px;
  border-radius: var(--pz-radius-sm);
}

/* ────────────────────────────────────────────────────────────────────────
 * Sprint 69 V_B — ALIASES legacy pour tokens historiques (~110 réfs).
 *
 * Cause racine du « vrai bordel » mode clair/sombre constaté Arnaud post-S68 :
 * portal.css/admin.css/sections/components référencent `var(--pz-danger, ...)`,
 * `var(--pz-accent, ...)`, `var(--pz-text, ...)`, `var(--pz-surface, ...)`,
 * `var(--pz-surface-elevated, ...)`, `var(--pz-bg-elevated, ...)`,
 * `var(--pz-accent-soft, ...)`, `var(--pz-danger-soft, ...)` — qui ne sont
 * PAS définis dans :root ou body.light-mode, donc utilisent toujours leur
 * fallback hex hardcoded et ne basculent jamais entre modes.
 *
 * Stratégie : on définit ces aliases comme `var(--pz-canonical)` dans tous
 * les modes (le canonique est lui-même par mode via cascade existante).
 * Backward-compat 100% : aucune référence existante cassée. Cf ADR v2 §7.1.
 * Migration progressive vers tokens canoniques (--pz-urgent / --pz-info /
 * --pz-text-primary / --pz-bg-raised) recommandée Sprint 70+.
 *
 * Sprint 125 V_A.1 — 18 NEW tokens (audit B baseline 211 violations couleurs).
 * Pattern Léa A22 G+ : tous les boutons/sémantiques/surfaces consomment
 * tokens canoniques via cascade alias = Sidney customise --pz-primary palette
 * olive #a1b81c → propagation automatique cross-codebase (vs 46 instances
 * hardcoded #0ea5e9 settings.php color picker preview pre-S125 = déconnexion).
 * ────────────────────────────────────────────────────────────────────────*/
:root,
body.light-mode,
[data-theme="light"],
[data-theme="dark"],
body.dark-mode,
body.portal-page:not(.light-mode),
body.admin-body:not(.light-mode) {
  /* Alias urgent/danger (35 + 3 réfs) */
  --pz-danger:           var(--pz-urgent);
  --pz-danger-hover:     var(--pz-urgent-hover);
  --pz-danger-active:    var(--pz-urgent-active);
  --pz-danger-soft:      var(--pz-urgent-soft);

  /* S153 retour Arnaud — « tout doit venir du color picker de Sidney, aucun bleu » : l'accent
     (top/bottom bar, dropdowns, liens d'action) suivait --pz-info (BLEU figé). Re-câblé sur
     --pz-primary = la couleur de marque du cabinet (color picker user). Plus de bleu parasite. */
  --pz-accent:           var(--pz-primary);
  --pz-accent-hover:     var(--pz-primary-hover);
  --pz-accent-active:    var(--pz-primary-active);
  --pz-accent-soft:      var(--pz-primary-soft);

  /* Alias text-primary/text (17 réfs) */
  --pz-text:             var(--pz-text-primary);

  /* Alias bg-raised/surface (16 + 6 + 4 réfs) */
  --pz-surface:          var(--pz-bg-raised);
  --pz-surface-elevated: var(--pz-bg-raised);
  --pz-bg-elevated:      var(--pz-bg-raised);

  /* ──────────────────────────────────────────────────────────────────────
   * Sprint 125 V_A.1 — 18 NEW tokens (audit B 211 violations couleurs)
   * Pattern cascade alias canon → mode-aware via cascade existante.
   * ──────────────────────────────────────────────────────────────────────*/

  /* (1-5) Surfaces sémantiques BG — alias soft variants existants */
  --pz-info-bg:          var(--pz-info-soft);     /* bandeau information neutre */
  --pz-warn-bg:          var(--pz-warning-soft);  /* bandeau warning anomalie */
  --pz-ok-bg:            var(--pz-success-soft);  /* bandeau succès confirmation */
  --pz-pile-bg:          var(--pz-urgent-soft);   /* bandeau urgence pile à dérouler */

  /* (6-8) Surfaces élévation — gradient discret bg-base → bg-raised */
  --pz-bg-elev-0:        var(--pz-bg-base);       /* élévation 0 = fond page */
  --pz-bg-elev-1:        var(--pz-bg-raised);     /* élévation 1 = card/panel */
  --pz-bg-active:        var(--pz-primary-soft);  /* row/item actif sélectionné */

  /* (9) Marque accent cabinet — par défaut Petzerhiel cyan, Sidney override olive */
  --pz-brand-accent:     var(--pz-primary);

  /* (10-15) Boutons PRIMARY — cabinet brand (color picker Sidney customisable) */
  --pz-btn-primary-bg:         var(--pz-primary);
  --pz-btn-primary-color:      var(--pz-primary-text);
  --pz-btn-primary-border:     var(--pz-primary);
  --pz-btn-primary-hover-bg:   var(--pz-primary-hover);
  --pz-btn-primary-active-bg:  var(--pz-primary-active);
  --pz-btn-primary-disabled-bg: var(--pz-neutral-soft);

  /* (16-18) Boutons SECONDARY/DANGER/SUCCESS/WARNING — sémantiques canoniques */
  --pz-btn-secondary-bg:       var(--pz-bg-raised);
  --pz-btn-secondary-color:    var(--pz-text-primary);
  --pz-btn-secondary-border:   var(--pz-border-strong);
  --pz-btn-secondary-hover-bg: var(--pz-neutral-soft);

  --pz-btn-danger-bg:          var(--pz-urgent);
  --pz-btn-danger-color:       var(--pz-text-on-primary);
  --pz-btn-danger-border:      var(--pz-urgent);
  --pz-btn-danger-hover-bg:    var(--pz-urgent-hover);

  --pz-btn-success-bg:         var(--pz-success);
  --pz-btn-success-color:      var(--pz-text-on-primary);
  --pz-btn-success-border:     var(--pz-success);
  --pz-btn-success-hover-bg:   var(--pz-success-hover);

  --pz-btn-warning-bg:         var(--pz-warning);
  --pz-btn-warning-color:      var(--pz-text-on-primary);
  --pz-btn-warning-border:     var(--pz-warning);
  --pz-btn-warning-hover-bg:   var(--pz-warning-hover);

  /* Sprint 133 CI — aliases tokens consommés cross-codebase (check_theme_consistency S70) */
  --pz-info-soft-text:         var(--pz-info);
  --pz-bg-shell:               var(--pz-bg-shell-sidebar);
  --pz-info-fg:                var(--pz-info);
  --pz-warn-fg:                var(--pz-warning);
  --pz-pile-fg:                var(--pz-urgent);
  --pz-ok-fg:                  var(--pz-success);
  --pz-bg-card:                var(--pz-bg-raised);
  --pz-card-bg:                var(--pz-bg-raised);
  --pz-warning-dark:           var(--pz-warning-hover);
  --pz-info-dark:              var(--pz-info);
  --pz-pile:                   var(--pz-urgent);
  --pz-warn:                   var(--pz-warning);
  --pz-ok:                     var(--pz-success);
  --pz-success-bright:         #34d399;
  --pz-urgent-bright:          #f87171;
  --pz-urgent-light:           var(--pz-urgent-soft);
  --pz-warning-bright:         #fbbf24;
  --pz-info-bright:            #818cf8;
  --pz-reco-text:              var(--pz-text-primary);
  --pz-reco-text-muted:        var(--pz-text-secondary);
  --pz-reco-bg-card:           var(--pz-bg-raised);
  --pz-reco-bg-elevated:       var(--pz-bg-raised);
  --pz-reco-border:              var(--pz-border);
  --pz-text-on-accent:         var(--pz-text-on-primary);
  --pz-text-on-strong:         var(--pz-text-on-primary);
  --pz-text-on-warning:        var(--pz-text-on-primary);
  --pz-bg-accent-soft:         var(--pz-primary-soft);
  --pz-electricity:            #facc15;
  --pz-bg-shell-page:          var(--pz-bg-base);
  --pz-bg-camera:              #000000;
  --pz-success-bg:             var(--pz-success-soft);
  --pz-danger-bg:              var(--pz-urgent-soft);
  --pz-warning-bg:             var(--pz-warning-soft);
  --pz-bg-disabled:            var(--pz-input-disabled-bg);
  --pz-primary-dark:           var(--pz-primary-active);
}

/* ────────────────────────────────────────────────────────────────────────
 * CLASSES UTILITAIRES SHELL (Bloc 1 coquilles, Bloc 3 enrichira le shell)
 * Permettent d'instancier le shell minimal sans casser portal.css existant.
 * ────────────────────────────────────────────────────────────────────────*/
.pz-shell {
  font-family: var(--pz-font-family);
  color: var(--pz-text-primary);
  background: var(--pz-bg-base);
}

.pz-shell-topbar,
.pz-shell-sidebar,
.pz-shell-bottombar {
  background: var(--pz-bg-raised);
  border-color: var(--pz-border);
}
