@import url("https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@300;400;500;600;700&family=Geist+Mono:wght@400;500&display=swap");
/* Fichier généré : ne pas modifier, éditer les sources dans assets/css/. empreinte:4eff6f00bd405c8e */

/* tokens/fonts.css */
/* Immopilier typefaces — all free (Google Fonts).
   Display : Instrument Serif  — grands titres éditoriaux, hero marketing
   UI      : Geist             — interface, données, tableaux (chiffres tabulaires)
   Mono    : Geist Mono        — références cadastrales, parcelles, IDs */


:root{
  --font-display:"Instrument Serif",ui-serif,Georgia,serif; /* @kind other */
  --font-ui:"Geist","Helvetica Neue",Helvetica,Arial,sans-serif; /* @kind other */
  --font-mono:"Geist Mono",ui-monospace,SFMono-Regular,Menlo,monospace; /* @kind other */
}

/* tokens/colors.css */
/* ============================================================
   IMMOPILIER — COULEURS
   Identité monochrome. 12 niveaux de gris neutres + 1 accent sobre.
   Toute valeur sémantique existe en clair ET en sombre.
   ============================================================ */

:root{
  /* --- Primitives : neutres (base cool-neutral) --- */
  --n-0:#ffffff;
  --n-25:#fbfbfc;
  --n-50:#f6f6f8;
  --n-100:#f0f0f2;
  --n-200:#e5e5e9;
  --n-300:#d5d5db;
  --n-400:#b3b3bc;
  --n-500:#8b8b96;
  --n-600:#6a6a75;
  --n-700:#4d4d57;
  --n-800:#33333a;
  --n-900:#1d1d22;
  --n-950:#121216;
  --n-1000:#000000;

  /* --- Primitives : accent unique (bleu institutionnel, usage parcimonieux) --- */
  --accent-50:#eef1ff;
  --accent-100:#dbe2ff;
  --accent-200:#b9c6ff;
  --accent-400:#6e88f7;
  --accent-500:#4a6bf2;
  --accent-600:#2e4fe6;
  --accent-700:#2340bd;
  --accent-900:#16255f;

  /* --- Primitives : sémantiques --- */
  --green-500:#128a5c; --green-300:#34c08a; --green-50:#e8f6ef;
  --amber-500:#a8620a; --amber-300:#e9a23b; --amber-50:#fbf2e4;
  --red-500:#b3261e;   --red-300:#f4776c;   --red-50:#fdecea;

  /* --- Étiquettes DPE : couleurs réglementaires, identiques dans les 2 thèmes ---
     Relevées sur les étiquettes officielles du DPE en vigueur depuis juillet 2021
     (charte graphique du ministère / ADEME). L'échelle « énergie » va du vert au rouge,
     l'échelle « climat » (GES) du bleu clair au violet sombre — ce sont bien deux
     échelles distinctes. Sur les deux, la lettre est blanche quelle que soit la classe. */
  --dpe-a:#00a06d; --dpe-b:#52b153; --dpe-c:#a5cc74; --dpe-d:#f4e70f;
  --dpe-e:#f0b40f; --dpe-f:#eb8235; --dpe-g:#d7221f;
  --dpe-a-ink:#ffffff; --dpe-b-ink:#ffffff; --dpe-c-ink:#ffffff;
  --dpe-d-ink:#ffffff; --dpe-e-ink:#ffffff; --dpe-f-ink:#ffffff; --dpe-g-ink:#ffffff;

  --ges-a:#a4dbf8; --ges-b:#8cb4d3; --ges-c:#7792b1; --ges-d:#606f8f;
  --ges-e:#4d5271; --ges-f:#393551; --ges-g:#281b35;
  --ges-a-ink:#ffffff; --ges-b-ink:#ffffff; --ges-c-ink:#ffffff;
  --ges-d-ink:#ffffff; --ges-e-ink:#ffffff; --ges-f-ink:#ffffff; --ges-g-ink:#ffffff;

  /* Encre et repères de l'étiquette officielle. */
  --dpe-trait:#1d1d1b; --dpe-passoire:#e30613; --dpe-repere:#9d9d9c;

  /* --- Palette catégorielle graphiques (6, distinguable en deutéranopie) --- */
  --cat-1:#2e4fe6; --cat-2:#0f766e; --cat-3:#9a6b12;
  --cat-4:#5b7ca6; --cat-5:#b14a3c; --cat-6:#4d4d57;
}

/* ============================================================
   THÈME CLAIR (défaut)
   ============================================================ */
:root,[data-theme="light"]{
  color-scheme:light;

  --color-bg:var(--n-0);
  --color-bg-subtle:var(--n-50);
  --color-bg-inset:var(--n-100);
  --color-surface:var(--n-0);
  --color-surface-elevated:var(--n-0);
  --color-surface-sunken:var(--n-50);
  --color-surface-hover:var(--n-50);
  --color-surface-active:var(--n-100);
  --color-overlay:rgba(18,18,22,.42);

  --color-border:var(--n-200);
  --color-border-strong:var(--n-300);
  --color-border-subtle:var(--n-100);
  --color-border-inverse:var(--n-800);

  --color-text-primary:var(--n-950);
  --color-text-secondary:var(--n-700);
  --color-text-muted:var(--n-600);
  --color-text-faint:var(--n-500);
  --color-text-inverse:var(--n-0);
  --color-text-on-accent:#ffffff;

  --color-accent:var(--accent-600);
  --color-accent-hover:var(--accent-700);
  --color-accent-subtle:var(--accent-50);
  --color-accent-border:var(--accent-200);
  --color-focus-ring:var(--accent-600);

  --color-action:var(--n-950);          /* bouton primaire : noir sur clair */
  --color-action-hover:var(--n-800);
  --color-action-text:var(--n-0);

  --color-success:var(--green-500); --color-success-bg:var(--green-50); --color-success-border:#bde3d0;
  --color-warning:var(--amber-500); --color-warning-bg:var(--amber-50); --color-warning-border:#ecd6ab;
  --color-danger:var(--red-500);    --color-danger-bg:var(--red-50);   --color-danger-border:#f3c6c1;
  --color-info:var(--accent-600);   --color-info-bg:var(--accent-50);  --color-info-border:var(--accent-200);

  --color-positive:var(--green-500);   /* variations de prix */
  --color-negative:var(--red-500);

  /* Heatmap prix/m² — 8 paliers séquentiels clair→foncé (CVD-safe, dérivée magma) */
  --heat-1:#fcf4e4; --heat-2:#f9d9a8; --heat-3:#f4a96b; --heat-4:#e97a4f;
  --heat-5:#cf5147; --heat-6:#a53048; --heat-7:#6f1f4c; --heat-8:#33143c;
  --heat-ink-low:#33143c; --heat-ink-high:#ffffff;

  /* Fond de carte minimaliste */
  --map-bg:#f4f4f2; --map-water:#e3e8ec; --map-road:#ffffff;
  --map-road-casing:#e5e5e9; --map-building:#e9e9e6; --map-label:#4d4d57;

  --color-agent:var(--accent-600);
  --color-agent-glow:rgba(46,79,230,.28);
}

/* ============================================================
   THÈME SOMBRE
   ============================================================ */
[data-theme="dark"]{
  color-scheme:dark;

  --color-bg:#0a0a0c;
  --color-bg-subtle:#0f0f12;
  --color-bg-inset:#08080a;
  --color-surface:#121216;
  --color-surface-elevated:#17171c;
  --color-surface-sunken:#0d0d10;
  --color-surface-hover:#1c1c22;
  --color-surface-active:#23232a;
  --color-overlay:rgba(0,0,0,.62);

  --color-border:#26262e;
  --color-border-strong:#34343e;
  --color-border-subtle:#1c1c22;
  --color-border-inverse:var(--n-200);

  --color-text-primary:#f5f5f7;
  --color-text-secondary:#b9b9c2;
  --color-text-muted:#93939e;
  --color-text-faint:#75757f;
  --color-text-inverse:#0a0a0c;
  --color-text-on-accent:#0a0a0c;

  --color-accent:var(--accent-400);
  --color-accent-hover:#8ba1ff;
  --color-accent-subtle:rgba(110,136,247,.12);
  --color-accent-border:rgba(110,136,247,.32);
  --color-focus-ring:var(--accent-400);

  --color-action:var(--n-0);            /* bouton primaire : blanc sur sombre */
  --color-action-hover:var(--n-200);
  --color-action-text:var(--n-950);

  --color-success:var(--green-300); --color-success-bg:rgba(52,192,138,.12); --color-success-border:rgba(52,192,138,.3);
  --color-warning:var(--amber-300); --color-warning-bg:rgba(233,162,59,.12); --color-warning-border:rgba(233,162,59,.3);
  --color-danger:var(--red-300);    --color-danger-bg:rgba(244,119,108,.12); --color-danger-border:rgba(244,119,108,.3);
  --color-info:var(--accent-400);   --color-info-bg:rgba(110,136,247,.12);   --color-info-border:rgba(110,136,247,.3);

  --color-positive:var(--green-300);
  --color-negative:var(--red-300);

  /* Heatmap — remontée en luminosité pour rester lisible sur fond sombre */
  --heat-1:#2b1433; --heat-2:#511f4a; --heat-3:#7d2a4c; --heat-4:#a83f47;
  --heat-5:#cb5c44; --heat-6:#e58452; --heat-7:#f3ad72; --heat-8:#fbd9a6;
  --heat-ink-low:#fbd9a6; --heat-ink-high:#2b1433;

  --map-bg:#0e0e11; --map-water:#121a22; --map-road:#23232a;
  --map-road-casing:#16161b; --map-building:#17171c; --map-label:#b9b9c2;

  --color-agent:var(--accent-400);
  --color-agent-glow:rgba(110,136,247,.34);

  /* Catégorielles éclaircies pour le sombre */
  --cat-1:#6e88f7; --cat-2:#3fb3a4; --cat-3:#d79b3a;
  --cat-4:#8fb0d6; --cat-5:#e0806f; --cat-6:#9a9aa6;
}

/* tokens/typography.css */
/* IMMOPILIER — TYPOGRAPHIE
   Display : Instrument Serif (grands titres) · UI : Geist · Mono : Geist Mono.
   Chiffres tabulaires obligatoires sur prix, surfaces, tableaux (.tnum / --fv-tabular). */
:root{
  --fw-light:300; /* @kind other */
  --fw-regular:400; /* @kind other */
  --fw-medium:500; /* @kind other */
  --fw-semibold:600; /* @kind other */
  --fw-bold:700; /* @kind other */

  /* Échelle (desktop) — taille / interligne / interlettrage */
  --text-display:4rem;
  --lh-display:1.02; /* @kind other */
  --ls-display:-.03em; /* @kind other */
  --text-display-s:3rem;
  --lh-display-s:1.05; /* @kind other */
  --ls-display-s:-.028em; /* @kind other */
  --text-h1:2.5rem;
  --lh-h1:1.1; /* @kind other */
  --ls-h1:-.024em; /* @kind other */
  --text-h2:2rem;
  --lh-h2:1.15; /* @kind other */
  --ls-h2:-.02em; /* @kind other */
  --text-h3:1.5rem;
  --lh-h3:1.25; /* @kind other */
  --ls-h3:-.016em; /* @kind other */
  --text-h4:1.25rem;
  --lh-h4:1.3; /* @kind other */
  --ls-h4:-.012em; /* @kind other */
  --text-h5:1.0625rem;
  --lh-h5:1.4; /* @kind other */
  --ls-h5:-.008em; /* @kind other */
  --text-h6:.9375rem;
  --lh-h6:1.45; /* @kind other */
  --ls-h6:-.004em; /* @kind other */
  --text-body-l:1.0625rem;
  --lh-body-l:1.6; /* @kind other */
  --text-body-m:.9375rem;
  --lh-body-m:1.55; /* @kind other */
  --text-body-s:.8125rem;
  --lh-body-s:1.5; /* @kind other */
  --text-caption:.75rem;
  --lh-caption:1.4; /* @kind other */
  --text-label:.75rem;
  --lh-label:1.2; /* @kind other */
  --ls-label:.01em; /* @kind other */
  --text-overline:.6875rem;
  --lh-overline:1.2; /* @kind other */
  --ls-overline:.09em; /* @kind other */
  --text-mono:.8125rem;
  --lh-mono:1.45; /* @kind other */
  --ls-mono:0; /* @kind other */

  /* Échelle fluide pour le hero (mobile-first) */
  --text-display-fluid:clamp(2.25rem,6vw,4rem);
  --text-h1-fluid:clamp(1.75rem,4.2vw,2.5rem);

  --fv-tabular:"tnum" 1,"lnum" 1; /* @kind other */
}

/* tokens/spacing.css */
/* IMMOPILIER — ESPACEMENTS (base 4px) */
:root{
  --space-0:0; --space-px:1px;
  --space-1:.25rem;  /* 4  */
  --space-2:.5rem;   /* 8  */
  --space-3:.75rem;  /* 12 */
  --space-4:1rem;    /* 16 */
  --space-5:1.25rem; /* 20 */
  --space-6:1.5rem;  /* 24 */
  --space-8:2rem;    /* 32 */
  --space-10:2.5rem; /* 40 */
  --space-12:3rem;   /* 48 */
  --space-16:4rem;   /* 64 */
  --space-20:5rem;   /* 80 */
  --space-24:6rem;   /* 96 */
  --space-32:8rem;   /* 128 */

  --gutter-mobile:var(--space-4);
  --gutter-tablet:var(--space-6);
  --gutter-desktop:var(--space-8);
  --tap-min:44px;             /* cible tactile minimale WCAG 2.2 */
}

/* tokens/radii.css */
/* IMMOPILIER — RAYONS */
:root{
  --radius-xs:4px;
  --radius-sm:6px;
  --radius-md:8px;
  --radius-lg:12px;
  --radius-xl:16px;
  --radius-2xl:24px;
  --radius-full:999px;
}

/* tokens/shadows.css */
/* IMMOPILIER — ÉLÉVATIONS (4 niveaux, très douces)
   Clair : ombres fines + halo diffus. Sombre : ombre profonde + liseré lumineux interne. */
:root,[data-theme="light"]{
  --shadow-1:0 1px 2px rgba(18,18,22,.05);
  --shadow-2:0 1px 2px rgba(18,18,22,.04),0 4px 12px -2px rgba(18,18,22,.07);
  --shadow-3:0 2px 4px rgba(18,18,22,.04),0 12px 28px -6px rgba(18,18,22,.1);
  --shadow-4:0 4px 8px rgba(18,18,22,.05),0 24px 56px -12px rgba(18,18,22,.16);
  --shadow-focus:0 0 0 2px var(--color-bg),0 0 0 4px var(--color-focus-ring);
  --shadow-inset:inset 0 1px 0 rgba(255,255,255,.6);
}
[data-theme="dark"]{
  --shadow-1:0 1px 2px rgba(0,0,0,.5);
  --shadow-2:0 1px 2px rgba(0,0,0,.5),0 4px 12px -2px rgba(0,0,0,.55);
  --shadow-3:0 2px 4px rgba(0,0,0,.5),0 12px 28px -6px rgba(0,0,0,.6);
  --shadow-4:0 4px 8px rgba(0,0,0,.55),0 24px 56px -12px rgba(0,0,0,.7);
  --shadow-focus:0 0 0 2px var(--color-bg),0 0 0 4px var(--color-focus-ring);
  --shadow-inset:inset 0 1px 0 rgba(255,255,255,.06);
}

/* tokens/borders.css */
/* IMMOPILIER — BORDURES : le trait 1px est la signature du système */
:root{
  --border-width:1px; /* @kind other */
  --border-width-strong:1.5px; /* @kind other */
  --border-width-focus:2px; /* @kind other */
  --border:var(--border-width) solid var(--color-border); /* @kind other */
  --border-strong:var(--border-width) solid var(--color-border-strong); /* @kind other */
  --border-subtle:var(--border-width) solid var(--color-border-subtle); /* @kind other */
  --border-dashed:var(--border-width) dashed var(--color-border-strong); /* @kind other */
}

/* tokens/layout.css */
/* IMMOPILIER — GRILLE, BREAKPOINTS, Z-INDEX */
:root{
  --bp-sm:480px; /* @kind other */ /* mobile large */
  --bp-md:768px; /* @kind other */ /* tablette */
  --bp-lg:1024px; /* @kind other */ /* desktop */
  --bp-xl:1440px; /* @kind other */ /* large desktop */

  --content-max:1280px;
  --content-max-narrow:720px;   /* lecture / chat */
  --content-max-wide:1600px;    /* carte, dashboards */
  --grid-columns:12; /* @kind other */
  --grid-gap:var(--space-6);

  --header-h:60px;
  --sidepanel-w:420px;
  --bottomsheet-peek:180px;

  --z-base:0; /* @kind other */
  --z-raised:10; /* @kind other */
  --z-sticky:100; /* @kind other */
  --z-header:200; /* @kind other */
  --z-dropdown:300; /* @kind other */
  --z-mapui:400; /* @kind other */
  --z-overlay:500; /* @kind other */
  --z-modal:600; /* @kind other */
  --z-toast:700; /* @kind other */
  --z-tooltip:800; /* @kind other */
}

/* tokens/motion.css */
/* IMMOPILIER — MOTION
   Principes : court, discret, jamais rebondissant. Transformer opacity/transform seulement. */
:root{
  --duration-instant:80ms; /* @kind other */
  --duration-fast:140ms; /* @kind other */
  --duration-base:200ms; /* @kind other */
  --duration-slow:320ms; /* @kind other */
  --duration-slower:520ms; /* @kind other */
  --duration-agent:2400ms; /* @kind other */ /* respiration de l'orbe AI */

  --ease-standard:cubic-bezier(.2,.8,.25,1); /* @kind other */
  --ease-out:cubic-bezier(.16,1,.3,1); /* @kind other */
  --ease-in:cubic-bezier(.55,0,1,.45); /* @kind other */
  --ease-inout:cubic-bezier(.65,0,.35,1); /* @kind other */
  --ease-linear:linear; /* @kind other */

  --transition-colors:color var(--duration-fast) var(--ease-standard),background-color var(--duration-fast) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard); /* @kind other */
  --transition-transform:transform var(--duration-base) var(--ease-out); /* @kind other */
  --transition-panel:transform var(--duration-slow) var(--ease-out),opacity var(--duration-base) var(--ease-standard); /* @kind other */
}
@media (prefers-reduced-motion:reduce){
  :root{
    --duration-instant:1ms; /* @kind other */
    --duration-fast:1ms; /* @kind other */
    --duration-base:1ms; /* @kind other */
    --duration-slow:1ms; /* @kind other */
    --duration-slower:1ms; /* @kind other */
    --duration-agent:1ms; /* @kind other */
  }
}

/* tokens/effects.css */
/* IMMOPILIER — OPACITÉS, BLUR, VERRE
   Le verre est réservé au header au scroll et aux panneaux flottants sur la carte. */
:root{
  --opacity-disabled:.42; /* @kind other */
  --opacity-muted:.62; /* @kind other */
  --opacity-hover-veil:.06; /* @kind other */
  --opacity-press-veil:.12; /* @kind other */

  --blur-sm:6px; /* @kind other */
  --blur-md:12px; /* @kind other */
  --blur-lg:24px; /* @kind other */

  --glass-bg:rgba(255,255,255,.72);
  --glass-border:rgba(18,18,22,.08);
  --glass-blur:saturate(1.4) blur(var(--blur-md)); /* @kind other */

  --scrim-map:linear-gradient(to bottom,rgba(255,255,255,.9),rgba(255,255,255,0)); /* @kind other */
}
[data-theme="dark"]{
  --glass-bg:rgba(18,18,22,.68);
  --glass-border:rgba(255,255,255,.08);
  --scrim-map:linear-gradient(to bottom,rgba(10,10,12,.92),rgba(10,10,12,0)); /* @kind other */
}

/* tokens/base.css */
/* IMMOPILIER — RESET MINIMAL + PRIMITIVES DE TEXTE
   Facultatif pour les consommateurs, mais c'est la base utilisée par les écrans du kit. */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--color-bg);color:var(--color-text-primary);
  font-family:var(--font-ui);font-size:var(--text-body-m);line-height:var(--lh-body-m);
  font-weight:var(--fw-regular);-webkit-font-smoothing:antialiased;text-wrap:pretty;
}
h1,h2,h3,h4,h5,h6,p,figure{margin:0}
a{color:var(--color-accent);text-decoration:none}
a:hover{color:var(--color-accent-hover);text-decoration:underline;text-underline-offset:2px}
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{
  outline:var(--border-width-focus) solid var(--color-focus-ring);outline-offset:2px;border-radius:var(--radius-xs);
}
button{font:inherit;color:inherit}
.tnum,table,td,th{font-variant-numeric:tabular-nums lining-nums;font-feature-settings:var(--fv-tabular)}
.u-display{font-family:var(--font-display);font-size:var(--text-display);line-height:var(--lh-display);letter-spacing:var(--ls-display);font-weight:var(--fw-regular)}
.u-overline{font-size:var(--text-overline);line-height:var(--lh-overline);letter-spacing:var(--ls-overline);text-transform:uppercase;color:var(--color-text-muted);font-weight:var(--fw-medium)}
.u-mono{font-family:var(--font-mono);font-size:var(--text-mono);letter-spacing:var(--ls-mono)}
.u-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* components/buttons.css */
/* BOUTONS ------------------------------------------------------------ */
.imm-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);font-family:var(--font-ui);font-weight:var(--fw-medium);border-radius:var(--radius-md);border:var(--border-width) solid transparent;cursor:pointer;white-space:nowrap;text-decoration:none;transition:var(--transition-colors),box-shadow var(--duration-fast) var(--ease-standard),transform var(--duration-instant) var(--ease-standard);position:relative;font-variant-numeric:tabular-nums}
.imm-btn:active{transform:scale(.985)}
.imm-btn:focus-visible{outline:none;box-shadow:var(--shadow-focus)}
.imm-btn[disabled],.imm-btn[aria-disabled="true"]{opacity:var(--opacity-disabled);pointer-events:none}
.imm-btn--sm{height:32px;padding:0 var(--space-3);font-size:var(--text-body-s)}
.imm-btn--md{height:40px;padding:0 var(--space-4);font-size:var(--text-body-m)}
.imm-btn--lg{height:48px;padding:0 var(--space-6);font-size:var(--text-body-l)}
.imm-btn--primary{background:var(--color-action);color:var(--color-action-text);border-color:var(--color-action)}
.imm-btn--primary:hover{background:var(--color-action-hover);border-color:var(--color-action-hover)}
.imm-btn--secondary{background:var(--color-surface);color:var(--color-text-primary);border-color:var(--color-border-strong);box-shadow:var(--shadow-1)}
.imm-btn--secondary:hover{background:var(--color-surface-hover)}
.imm-btn--ghost{background:transparent;color:var(--color-text-secondary)}
.imm-btn--ghost:hover{background:var(--color-surface-hover);color:var(--color-text-primary)}
.imm-btn--link{background:none;height:auto;padding:0;color:var(--color-accent);border:0}
.imm-btn--link:hover{text-decoration:underline;text-underline-offset:2px}
.imm-btn--danger{background:var(--color-danger);color:#fff;border-color:var(--color-danger)}
.imm-btn--accent{background:var(--color-accent);color:var(--color-text-on-accent);border-color:var(--color-accent)}
.imm-btn--accent:hover{background:var(--color-accent-hover);border-color:var(--color-accent-hover)}
.imm-btn--block{width:100%}
.imm-btn--loading{color:transparent!important}
.imm-btn--loading::after{content:"";position:absolute;width:15px;height:15px;border-radius:50%;border:1.5px solid currentColor;border-top-color:transparent;color:var(--color-action-text);animation:imm-spin .7s linear infinite}
.imm-btn--secondary.imm-btn--loading::after,.imm-btn--ghost.imm-btn--loading::after{color:var(--color-text-primary)}
@keyframes imm-spin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.imm-btn--loading::after{animation-duration:2s}}

/* Bouton icône — cible tactile 44px assurée par --imm-tap sur mobile */
.imm-iconbtn{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:var(--border-width) solid transparent;border-radius:var(--radius-md);color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}
.imm-iconbtn:hover{background:var(--color-surface-hover);color:var(--color-text-primary)}
.imm-iconbtn:focus-visible{outline:none;box-shadow:var(--shadow-focus)}
.imm-iconbtn[disabled]{opacity:var(--opacity-disabled);pointer-events:none}
.imm-iconbtn--sm{width:32px;height:32px}
.imm-iconbtn--md{width:40px;height:40px}
.imm-iconbtn--lg{width:44px;height:44px}
.imm-iconbtn--outline{border-color:var(--color-border);background:var(--color-surface)}
.imm-iconbtn--solid{background:var(--color-action);color:var(--color-action-text)}
.imm-iconbtn--solid:hover{background:var(--color-action-hover);color:var(--color-action-text)}
@media (pointer:coarse){.imm-iconbtn{min-width:var(--tap-min);min-height:var(--tap-min)}}

/* components/badges.css */
/* BADGES & TAGS ------------------------------------------------------ */
.imm-badge{display:inline-flex;align-items:center;gap:var(--space-1);height:22px;padding:0 var(--space-2);border-radius:var(--radius-sm);font-size:var(--text-caption);font-weight:var(--fw-medium);border:var(--border-width) solid var(--color-border);background:var(--color-surface-sunken);color:var(--color-text-secondary);white-space:nowrap}
.imm-badge--neutral{}
.imm-badge--success{background:var(--color-success-bg);border-color:var(--color-success-border);color:var(--color-success)}
.imm-badge--warning{background:var(--color-warning-bg);border-color:var(--color-warning-border);color:var(--color-warning)}
.imm-badge--danger{background:var(--color-danger-bg);border-color:var(--color-danger-border);color:var(--color-danger)}
.imm-badge--info{background:var(--color-info-bg);border-color:var(--color-info-border);color:var(--color-info)}
.imm-badge--solid{background:var(--color-action);border-color:var(--color-action);color:var(--color-action-text)}
.imm-badge--source{font-family:var(--font-mono);font-size:10px;letter-spacing:.02em;text-transform:uppercase;color:var(--color-text-muted)}
.imm-badge--lg{height:26px;font-size:var(--text-body-s)}
.imm-tag{display:inline-flex;align-items:center;gap:var(--space-2);height:28px;padding:0 var(--space-3);border-radius:var(--radius-full);border:var(--border);background:var(--color-surface);font-size:var(--text-body-s);color:var(--color-text-secondary)}
.imm-tag button{display:flex;background:none;border:0;padding:0;cursor:pointer;color:var(--color-text-faint)}
.imm-tag button:hover{color:var(--color-text-primary)}

/* DPE / GES --------------------------------------------------------- */
/* La lettre est blanche sur toutes les classes, comme sur l'étiquette officielle. Un liseré
   sombre la garde lisible sur les classes claires (D en jaune, A et B du climat). */
.imm-dpe{display:inline-flex;align-items:center;justify-content:center;font-weight:var(--fw-semibold);border-radius:var(--radius-xs);font-variant-numeric:tabular-nums;
  paint-order:stroke fill;-webkit-text-stroke:.6px rgba(29,29,27,.55);text-shadow:0 0 1px rgba(29,29,27,.35)}
.imm-dpe--sm{width:22px;height:22px;font-size:var(--text-caption)}
.imm-dpe--md{width:28px;height:28px;font-size:var(--text-body-m)}
.imm-dpe--lg{width:40px;height:40px;font-size:var(--text-h4)}
.imm-dpe-scale{display:flex;gap:2px}
.imm-dpe-scale .imm-dpe{opacity:.28}
.imm-dpe-scale .imm-dpe[data-active="true"]{opacity:1;box-shadow:0 0 0 1.5px var(--color-text-primary)}

/* components/cards.css */
/* CARDS ------------------------------------------------------------- */
.imm-card{background:var(--color-surface);border:var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-1);transition:box-shadow var(--duration-base) var(--ease-standard),border-color var(--duration-fast) var(--ease-standard),transform var(--duration-base) var(--ease-out)}
.imm-card--flat{box-shadow:none}
.imm-card--elevated{box-shadow:var(--shadow-2);background:var(--color-surface-elevated)}
.imm-card--pad{padding:var(--space-5)}
.imm-card--interactive{cursor:pointer;display:block;text-align:left;width:100%;text-decoration:none;color:inherit}
.imm-card--interactive:hover{box-shadow:var(--shadow-3);border-color:var(--color-border-strong);transform:translateY(-2px)}
.imm-card--interactive:focus-visible{outline:none;box-shadow:var(--shadow-focus)}

/* Card fonctionnalité */
.imm-feature{display:flex;flex-direction:column;gap:var(--space-3);padding:var(--space-5);min-height:172px}
.imm-feature__icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border:var(--border);border-radius:var(--radius-md);color:var(--color-text-primary);background:var(--color-surface-sunken)}
.imm-feature__title{font-size:var(--text-h5);font-weight:var(--fw-semibold);letter-spacing:var(--ls-h5)}
.imm-feature__desc{font-size:var(--text-body-s);color:var(--color-text-muted);line-height:var(--lh-body-s)}
.imm-feature__arrow{margin-top:auto;display:flex;align-items:center;gap:var(--space-2);font-size:var(--text-body-s);font-weight:var(--fw-medium);color:var(--color-text-primary)}
.imm-card--interactive:hover .imm-feature__arrow svg,.imm-card--interactive:hover .imm-feature__arrow span[data-arrow]{transform:translateX(3px)}
.imm-feature__arrow svg,.imm-feature__arrow span[data-arrow]{transition:var(--transition-transform)}

/* Card KPI */
.imm-kpi{padding:var(--space-5);display:flex;flex-direction:column;gap:var(--space-2)}
.imm-kpi__label{font-size:var(--text-caption);color:var(--color-text-muted)}
.imm-kpi__value{font-size:var(--text-h3);font-weight:var(--fw-semibold);letter-spacing:var(--ls-h3);font-variant-numeric:tabular-nums}
.imm-kpi__delta{display:inline-flex;align-items:center;gap:4px;white-space:normal;flex-wrap:wrap;line-height:1.35;font-size:var(--text-caption);font-variant-numeric:tabular-nums}
.imm-kpi__delta--up{color:var(--color-positive)}
.imm-kpi__delta--down{color:var(--color-negative)}
.imm-kpi__delta--flat{color:var(--color-text-muted)}
.imm-kpi__spark{margin-top:auto}

/* Card bien / transaction */
.imm-prop{display:flex;flex-direction:column;gap:var(--space-3);padding:var(--space-4)}
.imm-prop__head{display:flex;justify-content:space-between;gap:var(--space-3);align-items:flex-start}
.imm-prop__addr{font-size:var(--text-body-m);font-weight:var(--fw-medium);letter-spacing:-.01em}
.imm-prop__meta{font-size:var(--text-caption);color:var(--color-text-muted);margin-top:2px}
.imm-prop__price{font-size:var(--text-h4);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;letter-spacing:var(--ls-h4)}
.imm-prop__grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-3);padding-top:var(--space-3);border-top:var(--border-subtle)}
.imm-prop__cell dt{font-size:10px;text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-faint)}
.imm-prop__cell dd{margin:2px 0 0;font-size:var(--text-body-s);font-weight:var(--fw-medium);font-variant-numeric:tabular-nums}

/* Illustrations des guides. Le cadre porte un dégradé : si la photo ne vient pas, on ne
   voit pas un rectangle blanc cassé mais une surface tenue. */
.imm-guidephoto{margin:0;display:grid;gap:var(--space-2)}
.imm-guidephoto[hidden]{display:none}
.imm-guidephoto img{
  width:100%;height:auto;aspect-ratio:16/9;object-fit:cover;border-radius:var(--radius-lg);
  background:linear-gradient(135deg,var(--color-bg-subtle),var(--color-surface-sunken));
  border:1px solid var(--color-border);
}
.imm-guidephoto figcaption{font-size:var(--text-caption);color:var(--color-text-muted);text-align:right}
.imm-guidevignette{
  width:100%;height:auto;aspect-ratio:16/9;object-fit:cover;display:block;
  background:linear-gradient(135deg,var(--color-bg-subtle),var(--color-surface-sunken));
  border-bottom:1px solid var(--color-border);
}

/* Crédit photo : une pastille discrète posée sur l'image, pas une ligne sous elle.
   Lisible sur une photo claire comme sur une photo sombre grâce au voile noir. */
.imm-guidephoto{position:relative}
.imm-credit{
  position:absolute;right:8px;bottom:8px;display:inline-flex;align-items:center;gap:5px;
  padding:3px 8px;border-radius:999px;background:rgb(12 16 20 / .55);color:#fff;
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  font-size:11px;line-height:1.4;letter-spacing:.01em;pointer-events:none;
  text-shadow:0 1px 2px rgb(0 0 0 / .35);
}
.imm-credit--mini{right:6px;bottom:6px;padding:2px 7px;font-size:10px}
.imm-credit svg{opacity:.85}
.imm-guidevignette__cadre{position:relative;display:block}

/* components/forms.css */
/* FORMULAIRES ------------------------------------------------------- */
.imm-field{display:flex;flex-direction:column;gap:var(--space-2)}
.imm-label{font-size:var(--text-label);font-weight:var(--fw-medium);letter-spacing:var(--ls-label);color:var(--color-text-secondary)}
.imm-label span[data-req]{color:var(--color-danger);margin-left:2px}
.imm-hint{font-size:var(--text-caption);color:var(--color-text-muted)}
.imm-error{font-size:var(--text-caption);color:var(--color-danger);display:flex;align-items:center;gap:var(--space-1)}
.imm-input,.imm-textarea,.imm-select{width:100%;font-family:var(--font-ui);font-size:var(--text-body-m);color:var(--color-text-primary);background:var(--color-surface);border:var(--border-width) solid var(--color-border-strong);border-radius:var(--radius-md);transition:var(--transition-colors),box-shadow var(--duration-fast) var(--ease-standard)}
.imm-input::placeholder,.imm-textarea::placeholder{color:var(--color-text-faint)}
.imm-input:hover,.imm-textarea:hover,.imm-select:hover{border-color:var(--color-text-faint)}
.imm-input:focus,.imm-textarea:focus,.imm-select:focus{outline:none;border-color:var(--color-focus-ring);box-shadow:0 0 0 3px var(--color-accent-subtle)}
.imm-input[disabled],.imm-textarea[disabled],.imm-select[disabled]{background:var(--color-surface-sunken);color:var(--color-text-faint);cursor:not-allowed}
.imm-input--sm{height:32px;padding:0 var(--space-3);font-size:var(--text-body-s)}
.imm-input--md{height:40px;padding:0 var(--space-3)}
.imm-input--lg{height:48px;padding:0 var(--space-4)}
.imm-input--num{font-variant-numeric:tabular-nums}
.imm-input[aria-invalid="true"],.imm-textarea[aria-invalid="true"]{border-color:var(--color-danger)}
.imm-input[aria-invalid="true"]:focus{box-shadow:0 0 0 3px var(--color-danger-bg)}
.imm-textarea{padding:var(--space-3);min-height:96px;resize:vertical;line-height:var(--lh-body-m)}
.imm-inputwrap{position:relative;display:flex;align-items:center}
.imm-inputwrap>.imm-input{padding-left:38px}
.imm-inputwrap__icon{position:absolute;left:var(--space-3);display:flex;color:var(--color-text-faint);pointer-events:none}
.imm-inputwrap__suffix{position:absolute;right:var(--space-3);font-size:var(--text-body-s);color:var(--color-text-muted);font-variant-numeric:tabular-nums}
.imm-selectwrap{position:relative;display:flex;align-items:center}
.imm-select{appearance:none;height:40px;padding:0 36px 0 var(--space-3);cursor:pointer}
.imm-selectwrap__chev{position:absolute;right:var(--space-3);pointer-events:none;color:var(--color-text-muted);display:flex}

/* Checkbox / radio / switch */
.imm-check{display:flex;align-items:flex-start;gap:var(--space-3);cursor:pointer;font-size:var(--text-body-m);min-height:24px}
.imm-check input{appearance:none;margin:0;flex:none;width:18px;height:18px;border:var(--border-width-strong) solid var(--color-border-strong);background:var(--color-surface);cursor:pointer;transition:var(--transition-colors);position:relative}
.imm-check--box input{border-radius:var(--radius-xs)}
.imm-check--radio input{border-radius:var(--radius-full)}
.imm-check input:hover{border-color:var(--color-text-faint)}
.imm-check input:focus-visible{outline:none;box-shadow:var(--shadow-focus)}
.imm-check--box input:checked{background:var(--color-action);border-color:var(--color-action)}
.imm-check--box input:checked::after{content:"";position:absolute;inset:0;background:no-repeat center/11px url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E")}
[data-theme="dark"] .imm-check--box input:checked::after{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E")}
.imm-check--radio input:checked{border-color:var(--color-action);border-width:5px}
.imm-check input[disabled]{opacity:var(--opacity-disabled);cursor:not-allowed}
.imm-check__text{line-height:1.35}
.imm-check__desc{display:block;font-size:var(--text-caption);color:var(--color-text-muted);margin-top:2px}
.imm-switch{display:inline-flex;align-items:center;gap:var(--space-3);cursor:pointer;font-size:var(--text-body-m)}
.imm-switch input{appearance:none;margin:0;width:38px;height:22px;border-radius:var(--radius-full);background:var(--color-border-strong);position:relative;cursor:pointer;transition:background var(--duration-fast) var(--ease-standard)}
.imm-switch input::after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:var(--shadow-1);transition:transform var(--duration-fast) var(--ease-standard)}
.imm-switch input:checked{background:var(--color-action)}
.imm-switch input:checked::after{transform:translateX(16px)}
[data-theme="dark"] .imm-switch input:checked::after{background:var(--n-950)}
.imm-switch input:focus-visible{outline:none;box-shadow:var(--shadow-focus)}
.imm-switch input[disabled]{opacity:var(--opacity-disabled);cursor:not-allowed}

/* Slider de plage */
.imm-range{display:flex;flex-direction:column;gap:var(--space-3)}
.imm-range__head{display:flex;justify-content:space-between;align-items:baseline;font-size:var(--text-body-s)}
.imm-range__vals{font-variant-numeric:tabular-nums;font-weight:var(--fw-medium)}
.imm-range__track{position:relative;height:24px;display:flex;align-items:center}
.imm-range__rail{position:absolute;left:0;right:0;height:3px;border-radius:var(--radius-full);background:var(--color-bg-inset)}
.imm-range__fill{position:absolute;height:3px;border-radius:var(--radius-full);background:var(--color-action)}
.imm-range input[type=range]{position:absolute;left:0;width:100%;appearance:none;background:none;pointer-events:none;margin:0;height:24px}
.imm-range input[type=range]::-webkit-slider-thumb{appearance:none;pointer-events:auto;width:18px;height:18px;border-radius:50%;background:var(--color-surface);border:var(--border-width-strong) solid var(--color-action);box-shadow:var(--shadow-2);cursor:grab}
.imm-range input[type=range]::-webkit-slider-thumb:active{cursor:grabbing;transform:scale(1.06)}
.imm-range input[type=range]:focus-visible::-webkit-slider-thumb{box-shadow:var(--shadow-focus)}

/* Recherche d'adresse + autocomplétion */
.imm-search{position:relative}
.imm-search__box{display:flex;align-items:center;gap:var(--space-3);height:48px;padding:0 var(--space-4);background:var(--color-surface);border:var(--border-width) solid var(--color-border-strong);border-radius:var(--radius-lg);box-shadow:var(--shadow-1);transition:var(--transition-colors),box-shadow var(--duration-fast) var(--ease-standard)}
.imm-search__box:focus-within{border-color:var(--color-focus-ring);box-shadow:0 0 0 3px var(--color-accent-subtle)}
.imm-search__box input{flex:1;border:0;background:none;outline:none;font:inherit;font-size:var(--text-body-m);color:var(--color-text-primary)}
.imm-search__box input::placeholder{color:var(--color-text-faint)}
.imm-search__menu{position:absolute;z-index:var(--z-dropdown);top:calc(100% + 6px);left:0;right:0;background:var(--color-surface-elevated);border:var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-4);overflow:hidden;padding:var(--space-1)}
.imm-search__group{font-size:var(--text-overline);letter-spacing:var(--ls-overline);text-transform:uppercase;color:var(--color-text-faint);padding:var(--space-3) var(--space-3) var(--space-1)}
.imm-search__item{display:flex;align-items:center;gap:var(--space-3);width:100%;background:none;border:0;text-align:left;padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);cursor:pointer;min-height:44px}
.imm-search__item:hover,.imm-search__item[aria-selected="true"]{background:var(--color-surface-hover)}
.imm-search__item strong{font-weight:var(--fw-medium);font-size:var(--text-body-m)}
.imm-search__item small{display:block;color:var(--color-text-muted);font-size:var(--text-caption);font-variant-numeric:tabular-nums}

/* components/nav.css */
/* NAVIGATION -------------------------------------------------------- */
.imm-header{position:sticky;top:0;z-index:var(--z-header);height:var(--header-h);display:flex;align-items:center;background:var(--color-bg);border-bottom:var(--border);transition:background var(--duration-base) var(--ease-standard),border-color var(--duration-base) var(--ease-standard),backdrop-filter var(--duration-base)}
.imm-header[data-scrolled="true"]{background:var(--glass-bg);-webkit-backdrop-filter:var(--glass-blur);backdrop-filter:var(--glass-blur);border-color:var(--glass-border)}
.imm-header__inner{width:100%;max-width:var(--content-max-wide);margin:0 auto;padding:0 var(--space-6);display:flex;align-items:center;gap:var(--space-6)}
.imm-header__logo{display:flex;align-items:center;gap:var(--space-2);color:var(--color-text-primary);text-decoration:none}
.imm-header__logo img{height:20px;display:block}
.imm-nav{display:flex;align-items:center;gap:var(--space-1);margin-right:auto}
.imm-nav__link{display:flex;align-items:center;height:32px;padding:0 var(--space-3);border-radius:var(--radius-md);font-size:var(--text-body-s);font-weight:var(--fw-medium);color:var(--color-text-secondary);text-decoration:none;transition:var(--transition-colors)}
.imm-nav__link:hover{background:var(--color-surface-hover);color:var(--color-text-primary);text-decoration:none}
.imm-nav__link[aria-current="page"]{color:var(--color-text-primary);background:var(--color-surface-active)}
.imm-header__actions{display:flex;align-items:center;gap:var(--space-2)}
.imm-burger{display:none}
@media (max-width:1023px){.imm-nav{display:none}.imm-burger{display:inline-flex}.imm-header__inner{padding:0 var(--space-4);gap:var(--space-3)}.imm-header__logo{margin-right:auto}}
@media (max-width:479px){.imm-header__cta{display:none}}
/* Disposition mobile forcée (cadre d'aperçu étroit) : mêmes règles, sans media query. */
.imm-header[data-narrow] .imm-nav{display:none}
.imm-header[data-narrow] .imm-burger{display:inline-flex}
.imm-header[data-narrow] .imm-header__inner{padding:0 var(--space-4);gap:var(--space-3);max-width:none}
.imm-header[data-narrow] .imm-header__logo{margin-right:auto}
.imm-header[data-narrow] .imm-header__cta{display:none}

.imm-mobilemenu{position:absolute;inset:var(--header-h) 0 0;z-index:var(--z-overlay);background:var(--color-bg);display:flex;flex-direction:column;animation:imm-menu-in var(--duration-base) var(--ease-out)}
.imm-mobilemenu__links{flex:1;overflow-y:auto;padding:var(--space-3) var(--space-4);display:flex;flex-direction:column}
.imm-mobilemenu__links a{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);min-height:60px;padding:0 var(--space-2);border-bottom:var(--border-subtle);font-size:var(--text-h4);font-weight:var(--fw-medium);letter-spacing:var(--ls-h4);color:var(--color-text-primary);text-decoration:none;animation:imm-menu-item var(--duration-slow) var(--ease-out) both;animation-delay:calc(var(--i,0)*45ms + 40ms)}
.imm-mobilemenu__links a svg{color:var(--color-text-faint);transition:var(--transition-transform)}
.imm-mobilemenu__links a:hover{text-decoration:none;color:var(--color-text-primary)}
.imm-mobilemenu__links a:hover svg{transform:translateX(3px);color:var(--color-text-primary)}
.imm-mobilemenu__links a[aria-current]{color:var(--color-accent)}
.imm-mobilemenu__foot{padding:var(--space-4);border-top:var(--border);background:var(--color-bg-subtle);animation:imm-menu-item var(--duration-slow) var(--ease-out) 240ms both}
@keyframes imm-menu-in{from{opacity:0}to{opacity:1}}
@keyframes imm-menu-item{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes imm-fade{from{opacity:0}to{opacity:1}}

/* Symbole de marque animé (hero) — le pin se pose puis flotte. */
.imm-brandmark{position:relative;display:grid;place-items:center;color:var(--color-text-primary)}
.imm-brandmark__mark{position:relative;z-index:1;display:block;transform-origin:50% 92%;animation:imm-mark-drop 760ms var(--ease-out) both,imm-mark-float 4.2s var(--ease-inout) 760ms infinite}
.imm-brandmark__shadow{position:absolute;left:50%;bottom:-6%;width:34%;height:7%;margin-left:-17%;border-radius:50%;background:currentColor;opacity:.14;filter:blur(2px);animation:imm-mark-shadow 4.2s var(--ease-inout) 760ms infinite}
@keyframes imm-mark-drop{0%{transform:translateY(-26%) scale(.86);opacity:0}55%{transform:translateY(3%) scale(1.04);opacity:1}78%{transform:translateY(-1.5%) scale(.99)}100%{transform:none;opacity:1}}
@keyframes imm-mark-float{0%,100%{transform:translateY(0) scale(1)}50%{transform:translateY(-5%) scale(1.015)}}
@keyframes imm-mark-shadow{0%,100%{transform:scaleX(1);opacity:.14}50%{transform:scaleX(.84);opacity:.08}}
@media (prefers-reduced-motion:reduce){.imm-brandmark__mark{animation:none}.imm-brandmark__shadow{display:none}}

.imm-footer{border-top:var(--border);background:var(--color-bg-subtle);padding:var(--space-12) var(--space-6) var(--space-8)}
.imm-footer__inner{max-width:var(--content-max);margin:0 auto;display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--space-8)}
.imm-footer h3{font-size:var(--text-overline);letter-spacing:var(--ls-overline);text-transform:uppercase;color:var(--color-text-faint);margin-bottom:var(--space-3);font-weight:var(--fw-medium)}
.imm-footer ul{list-style:none;margin:0;padding:0;display:grid;gap:var(--space-2)}
.imm-footer a{font-size:var(--text-body-s);color:var(--color-text-secondary);text-decoration:none}
.imm-footer a:hover{color:var(--color-text-primary);text-decoration:underline;text-underline-offset:2px}
.imm-footer__sources{max-width:var(--content-max);margin:var(--space-8) auto 0;padding-top:var(--space-6);border-top:var(--border);display:flex;flex-wrap:wrap;gap:var(--space-3);align-items:center}
.imm-footer__legal{max-width:var(--content-max);margin:var(--space-4) auto 0;font-size:var(--text-caption);color:var(--color-text-faint)}

.imm-tabs{display:flex;gap:var(--space-1);border-bottom:var(--border);overflow-x:auto;scrollbar-width:none}
.imm-tabs::-webkit-scrollbar{display:none}
.imm-tab{position:relative;display:inline-flex;align-items:center;gap:var(--space-2);height:40px;padding:0 var(--space-3);background:none;border:0;font-size:var(--text-body-s);font-weight:var(--fw-medium);color:var(--color-text-muted);cursor:pointer;white-space:nowrap;transition:var(--transition-colors)}
.imm-tab:hover{color:var(--color-text-primary)}
.imm-tab[aria-selected="true"]{color:var(--color-text-primary)}
.imm-tab[aria-selected="true"]::after{content:"";position:absolute;left:var(--space-2);right:var(--space-2);bottom:-1px;height:2px;background:var(--color-text-primary);border-radius:var(--radius-full)}
.imm-tab[disabled]{opacity:var(--opacity-disabled);cursor:not-allowed}
.imm-tab__count{font-size:var(--text-caption);color:var(--color-text-faint);font-variant-numeric:tabular-nums}

.imm-seg{display:inline-flex;padding:2px;gap:2px;background:var(--color-bg-inset);border:var(--border-subtle);border-radius:var(--radius-md)}
.imm-seg button{height:28px;padding:0 var(--space-3);border:0;background:none;border-radius:var(--radius-sm);font-size:var(--text-body-s);font-weight:var(--fw-medium);color:var(--color-text-muted);cursor:pointer;transition:var(--transition-colors),box-shadow var(--duration-fast)}
.imm-seg button:hover{color:var(--color-text-primary)}
.imm-seg button[aria-pressed="true"]{background:var(--color-surface);color:var(--color-text-primary);box-shadow:var(--shadow-1)}
.imm-seg--lg button{height:36px;padding:0 var(--space-4)}

.imm-breadcrumb{display:flex;align-items:center;gap:var(--space-2);font-size:var(--text-body-s);color:var(--color-text-muted);flex-wrap:wrap}
.imm-breadcrumb a{color:var(--color-text-muted);text-decoration:none}
.imm-breadcrumb a:hover{color:var(--color-text-primary);text-decoration:underline;text-underline-offset:2px}
.imm-breadcrumb [aria-current]{color:var(--color-text-primary);font-weight:var(--fw-medium)}
.imm-breadcrumb__sep{color:var(--color-border-strong)}

.imm-pagination{display:flex;align-items:center;gap:var(--space-1)}
.imm-pagination__info{font-size:var(--text-body-s);color:var(--color-text-muted);margin-right:auto;font-variant-numeric:tabular-nums}
.imm-page{min-width:32px;height:32px;padding:0 var(--space-2);display:inline-flex;align-items:center;justify-content:center;border:var(--border-width) solid transparent;background:none;border-radius:var(--radius-md);font-size:var(--text-body-s);color:var(--color-text-secondary);cursor:pointer;font-variant-numeric:tabular-nums;transition:var(--transition-colors)}
.imm-page:hover{background:var(--color-surface-hover);color:var(--color-text-primary)}
.imm-page[aria-current="page"]{background:var(--color-surface);border-color:var(--color-border-strong);color:var(--color-text-primary);font-weight:var(--fw-medium)}
.imm-page[disabled]{opacity:var(--opacity-disabled);pointer-events:none}

/* Mentions du pied de page : indépendance vis-à-vis des portails, origine des données.
   Texte tassé et discret — il doit être lisible sans occuper le regard. */
/* Même largeur et même bord gauche que la ligne de copyright, sous laquelle il se lit :
   un retrait horizontal désalignait les deux blocs d'une demi-gouttière. */
.imm-footer__mentions{
  max-width:var(--content-max);margin:var(--space-6) auto 0;padding-top:var(--space-5);
  display:grid;gap:var(--space-2);border-top:1px solid var(--color-border);
}
.imm-footer__mentions p{
  margin:0;font-size:var(--text-caption);line-height:1.6;color:var(--color-text-muted);
}
.imm-footer__mentions a{color:var(--color-text-secondary);text-decoration:underline}

/* components/ai.css */
/* AGENT IMMOPILIER AI ---------------------------------------------- */
/* L'avatar EST le symbole du site (voir AgentOrb.jsx) : pas de sphère, pas de dessin concurrent. */
.imm-orb{position:relative;display:grid;place-items:center;flex:none;color:var(--color-text-primary)}
.imm-orb__mark{position:relative;z-index:1;display:block;transform-origin:50% 64%}
.imm-orb__ring{position:absolute;left:50%;top:50%;width:118%;height:118%;margin:-59% 0 0 -59%;border-radius:50%;border:1.5px solid transparent}
.imm-orb__glow{position:absolute;inset:-24%;border-radius:50%;background:radial-gradient(circle,var(--color-agent-glow),transparent 66%);opacity:0}
.imm-orb[data-state="idle"] .imm-orb__mark{animation:imm-breathe var(--duration-agent) var(--ease-inout) infinite}
.imm-orb[data-state="listening"] .imm-orb__glow{opacity:1;animation:imm-pulse 1.6s var(--ease-inout) infinite}
.imm-orb[data-state="listening"] .imm-orb__mark{animation:imm-breathe 1.6s var(--ease-inout) infinite}
.imm-orb[data-state="thinking"] .imm-orb__ring{border-top-color:var(--color-agent);animation:imm-spin 1.1s linear infinite}
.imm-orb[data-state="thinking"] .imm-orb__mark{animation:imm-breathe 1.2s var(--ease-inout) infinite}
.imm-orb[data-state="answering"] .imm-orb__mark{animation:imm-wave 2s var(--ease-inout) infinite}
.imm-orb[data-state="answering"] .imm-orb__glow{opacity:.7}
@keyframes imm-breathe{0%,100%{transform:scale(1)}50%{transform:scale(.93)}}
@keyframes imm-pulse{0%,100%{transform:scale(.98);opacity:.55}50%{transform:scale(1.08);opacity:1}}
@keyframes imm-wave{0%,100%{transform:scale(1) rotate(0)}33%{transform:scale(1.04) rotate(3deg)}66%{transform:scale(.97) rotate(-3deg)}}
@media (prefers-reduced-motion:reduce){.imm-orb *{animation:none!important}}

.imm-composer{background:var(--color-surface);border:var(--border-width) solid var(--color-border-strong);border-radius:var(--radius-xl);box-shadow:var(--shadow-2);padding:var(--space-3) var(--space-3) var(--space-2);transition:var(--transition-colors),box-shadow var(--duration-base) var(--ease-standard)}
.imm-composer:focus-within{border-color:var(--color-text-faint);box-shadow:var(--shadow-3)}
.imm-composer textarea{width:100%;border:0;outline:none;background:none;resize:none;font:inherit;font-size:var(--text-body-l);line-height:1.5;color:var(--color-text-primary);max-height:180px;padding:var(--space-2) var(--space-2) 0}
.imm-composer textarea::placeholder{color:var(--color-text-faint)}
.imm-composer__bar{display:flex;align-items:center;gap:var(--space-2);padding-top:var(--space-2)}
.imm-composer__hint{margin-left:auto;font-size:var(--text-caption);color:var(--color-text-faint)}
.imm-composer__send{width:36px;height:36px;border-radius:var(--radius-md);display:inline-flex;align-items:center;justify-content:center;border:0;background:var(--color-action);color:var(--color-action-text);cursor:pointer;transition:var(--transition-colors),transform var(--duration-instant)}
.imm-composer__send:hover{background:var(--color-action-hover)}
.imm-composer__send:active{transform:scale(.95)}
.imm-composer__send[disabled]{opacity:var(--opacity-disabled);pointer-events:none}
.imm-composer[data-busy="true"] .imm-composer__send{background:var(--color-surface-active);color:var(--color-text-primary)}

.imm-chips{display:flex;flex-wrap:wrap;gap:var(--space-2)}
.imm-chip{display:inline-flex;align-items:center;gap:var(--space-2);min-height:36px;padding:0 var(--space-3);border-radius:var(--radius-full);border:var(--border);background:var(--color-surface);font-size:var(--text-body-s);color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors),transform var(--duration-fast) var(--ease-out)}
.imm-chip:hover{border-color:var(--color-border-strong);color:var(--color-text-primary);background:var(--color-surface-hover)}
.imm-chip:focus-visible{outline:none;box-shadow:var(--shadow-focus)}

.imm-msg{display:flex;gap:var(--space-3);max-width:100%}
.imm-msg--user{justify-content:flex-end}
.imm-msg--user .imm-msg__body{background:var(--color-surface-active);border-radius:var(--radius-xl) var(--radius-xl) var(--radius-xs) var(--radius-xl);padding:var(--space-3) var(--space-4);max-width:min(560px,78%)}
.imm-msg--agent .imm-msg__body{max-width:min(680px,100%)}
.imm-msg__body{font-size:var(--text-body-l);line-height:1.65;color:var(--color-text-primary)}
.imm-msg__body p{margin:0 0 var(--space-3)}
.imm-msg__body p:last-child{margin-bottom:0}
.imm-msg__body ul,.imm-msg__body ol{margin:0 0 var(--space-3);padding-left:var(--space-5);display:grid;gap:var(--space-1)}
/* Titres d'une réponse de l'agent. Ils étaient rendus en paragraphe, dièses compris.
   Trois niveaux suffisent dans une bulle : au-delà, plus rien ne se distingue. */
.imm-msg__body .imm-md__t1,
.imm-msg__body .imm-md__t2,
.imm-msg__body .imm-md__t3{
  margin:var(--space-5) 0 var(--space-2);font-weight:var(--fw-semibold);
  line-height:1.3;letter-spacing:-.01em;color:var(--color-text-primary);
}
.imm-msg__body .imm-md__t1{font-size:var(--text-h5)}
.imm-msg__body .imm-md__t2{font-size:var(--text-body-l)}
.imm-msg__body .imm-md__t3{font-size:var(--text-body-m);color:var(--color-text-secondary)}
.imm-msg__body>.imm-md__t1:first-child,
.imm-msg__body>.imm-md__t2:first-child,
.imm-msg__body>.imm-md__t3:first-child{margin-top:0}
.imm-msg__body .imm-md__hr{border:0;border-top:var(--border-subtle);margin:var(--space-4) 0}
.imm-msg__body strong{font-weight:var(--fw-semibold)}
.imm-msg__body table{width:100%;border-collapse:collapse;font-size:var(--text-body-s);margin:0 0 var(--space-3)}
.imm-msg__body th{text-align:left;font-weight:var(--fw-medium);color:var(--color-text-muted);border-bottom:var(--border);padding:var(--space-2) var(--space-3)}
.imm-msg__body td{border-bottom:var(--border-subtle);padding:var(--space-2) var(--space-3);font-variant-numeric:tabular-nums}
.imm-msg__sources{display:flex;gap:var(--space-2);flex-wrap:wrap;margin-top:var(--space-3)}
.imm-typing{display:inline-flex;gap:5px;align-items:center;height:20px}
.imm-typing i{width:5px;height:5px;border-radius:50%;background:var(--color-text-faint);animation:imm-blink 1.2s var(--ease-inout) infinite}
.imm-typing i:nth-child(2){animation-delay:.15s}
.imm-typing i:nth-child(3){animation-delay:.3s}
@keyframes imm-blink{0%,100%{opacity:.25;transform:translateY(0)}50%{opacity:1;transform:translateY(-2px)}}
.imm-msg__caret{display:inline-block;width:7px;height:1.05em;vertical-align:-2px;background:var(--color-text-primary);animation:imm-caret 1s steps(2) infinite}
@keyframes imm-caret{0%,100%{opacity:1}50%{opacity:0}}

.imm-richcard{border:var(--border);border-radius:var(--radius-lg);background:var(--color-surface);overflow:hidden;box-shadow:var(--shadow-1);max-width:420px}
.imm-richcard__map{height:120px;background:var(--map-bg);position:relative;border-bottom:var(--border)}
.imm-richcard__body{padding:var(--space-4);display:grid;gap:var(--space-3)}
.imm-richcard__kpis{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)}
.imm-richcard__kpi dt{font-size:10px;text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-faint)}
.imm-richcard__kpi dd{margin:2px 0 0;font-size:var(--text-h5);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}
.imm-richcard__link{display:flex;align-items:center;justify-content:space-between;padding:var(--space-3) var(--space-4);border-top:var(--border-subtle);font-size:var(--text-body-s);font-weight:var(--fw-medium);color:var(--color-text-primary);text-decoration:none}
.imm-richcard__link:hover{background:var(--color-surface-hover);text-decoration:none}

/* components/map.css */
/* CARTE INTERACTIVE ------------------------------------------------- */
.imm-map{position:relative;width:100%;height:100%;overflow:hidden;background:var(--map-bg)}
/* MapLibre applique sa propre classe .maplibregl-map au conteneur, avec
   position:relative. À spécificité égale, sa feuille — chargée depuis le CDN après la
   nôtre — l'emportait : le conteneur repassait en relative, perdait sa hauteur et
   tombait à 0 px. La carte était alors invisible, sans la moindre erreur JavaScript.
   On passe donc à une spécificité supérieure et on fixe la hauteur explicitement. */
.imm-map .imm-map__canvas,.imm-map>.imm-map__canvas{position:absolute;inset:0;width:100%;height:100%}
.imm-map__ui{position:absolute;inset:0;pointer-events:none;z-index:var(--z-mapui)}
.imm-map__ui>*{pointer-events:auto}
.imm-mapctrl{position:absolute;display:flex;flex-direction:column;background:var(--glass-bg);-webkit-backdrop-filter:var(--glass-blur);backdrop-filter:var(--glass-blur);border:var(--border-width) solid var(--glass-border);border-radius:var(--radius-md);box-shadow:var(--shadow-2);overflow:hidden}
.imm-mapctrl button{width:40px;height:40px;display:grid;place-items:center;background:none;border:0;color:var(--color-text-secondary);cursor:pointer;transition:var(--transition-colors)}
.imm-mapctrl button+button{border-top:var(--border-subtle)}
.imm-mapctrl button:hover{background:var(--color-surface-hover);color:var(--color-text-primary)}
.imm-panel-glass{background:var(--glass-bg);-webkit-backdrop-filter:var(--glass-blur);backdrop-filter:var(--glass-blur);border:var(--border-width) solid var(--glass-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-3)}
.imm-layers{padding:var(--space-3);display:grid;gap:var(--space-1);min-width:208px}
.imm-layers__title{font-size:var(--text-overline);letter-spacing:var(--ls-overline);text-transform:uppercase;color:var(--color-text-faint);padding:0 var(--space-2) var(--space-1)}
.imm-layers label{display:flex;align-items:center;gap:var(--space-3);min-height:36px;padding:0 var(--space-2);border-radius:var(--radius-sm);font-size:var(--text-body-s);cursor:pointer}
.imm-layers label:hover{background:var(--color-surface-hover)}
.imm-legend{padding:var(--space-3) var(--space-4);display:grid;gap:var(--space-2);min-width:248px}
.imm-legend__title{font-size:var(--text-caption);font-weight:var(--fw-medium);color:var(--color-text-secondary)}
.imm-legend__bar{display:flex;height:10px;border-radius:var(--radius-xs);overflow:hidden}
.imm-legend__bar i{flex:1}
.imm-legend__scale{display:flex;justify-content:space-between;font-size:10px;font-family:var(--font-mono);color:var(--color-text-muted)}
.imm-marker{position:absolute;transform:translate(-50%,-100%);display:grid;place-items:center;cursor:pointer;filter:drop-shadow(0 2px 4px rgba(0,0,0,.25))}
.imm-marker--sale{width:12px;height:12px;border-radius:50%;background:var(--color-surface);border:2px solid var(--color-text-primary);transform:translate(-50%,-50%)}
.imm-marker--selected{width:30px;height:30px}
.imm-marker--cluster{transform:translate(-50%,-50%);min-width:34px;height:34px;padding:0 8px;border-radius:var(--radius-full);background:var(--color-action);color:var(--color-action-text);font-size:var(--text-caption);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;border:2px solid var(--color-surface)}
.imm-parceltip{position:absolute;transform:translate(-50%,calc(-100% - 12px));background:var(--color-surface-elevated);border:var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-3);padding:var(--space-3);min-width:196px;font-size:var(--text-body-s);pointer-events:none}
.imm-parceltip__addr{font-weight:var(--fw-medium);margin-bottom:var(--space-2)}
.imm-parceltip dl{display:grid;grid-template-columns:auto auto;gap:2px var(--space-3);margin:0;font-variant-numeric:tabular-nums}
.imm-parceltip dt{color:var(--color-text-muted)}
.imm-parceltip dd{margin:0;text-align:right;font-weight:var(--fw-medium)}
.imm-sidepanel{position:absolute;top:0;right:0;bottom:0;width:var(--sidepanel-w);background:var(--color-surface);border-left:var(--border);box-shadow:var(--shadow-4);display:flex;flex-direction:column;animation:imm-slide-in var(--duration-slow) var(--ease-out)}
@keyframes imm-slide-in{from{transform:translateX(16px);opacity:0}to{transform:none;opacity:1}}
.imm-sidepanel__head{padding:var(--space-4);border-bottom:var(--border);display:flex;gap:var(--space-3);align-items:flex-start}
.imm-sidepanel__body{flex:1;overflow-y:auto;padding:var(--space-4);display:grid;gap:var(--space-5);align-content:start}
.imm-sidepanel__foot{padding:var(--space-3) var(--space-4);border-top:var(--border);display:flex;gap:var(--space-2)}
.imm-sheet{position:absolute;left:0;right:0;bottom:0;background:var(--color-surface);border-top:var(--border);border-radius:var(--radius-2xl) var(--radius-2xl) 0 0;box-shadow:var(--shadow-4);max-height:78%;display:flex;flex-direction:column}
.imm-sheet__grip{width:36px;height:4px;border-radius:var(--radius-full);background:var(--color-border-strong);margin:var(--space-3) auto}
@media (max-width:767px){.imm-sidepanel{position:absolute;top:auto;left:0;width:auto;border-left:0;border-top:var(--border);border-radius:var(--radius-2xl) var(--radius-2xl) 0 0;max-height:78%}}

/* ——— Barre de commandes de la carte ————————————————————————————————————————
   Tout est visible d'un coup d'œil : fond, vue, données, couches. Les filtres, plus
   rares, sont derrière un bouton. Posée en haut à droite ; sur petit écran elle passe
   en bas, où le pouce l'atteint. */
/* Colonne de gauche : la recherche, puis les commandes, puis les filtres. Le côté
   droit reste libre pour la fiche d'adresse, qui glissait auparavant par-dessus. */
.imm-map__gauche{position:absolute;top:var(--space-4);left:var(--space-4);z-index:2;
  display:grid;gap:var(--space-2);width:380px;max-width:calc(100% - var(--space-8));
  pointer-events:none}
.imm-map__gauche>*{pointer-events:auto}
.imm-map .imm-map__gauche .imm-map__search{position:static;width:auto;max-width:none}

.imm-mapbar{position:static;display:grid;gap:var(--space-2);justify-items:start;max-width:none;z-index:2}
.imm-mapbar[hidden]{display:none}
.imm-mapbar__ligne{display:flex;gap:var(--space-2);flex-wrap:wrap;justify-content:flex-start}
.imm-mapbar__chips{display:flex;gap:var(--space-2);flex-wrap:wrap;justify-content:flex-start}
.imm-mapbar .imm-segbtn{background:var(--color-surface);border:var(--border);box-shadow:var(--shadow-2)}
.imm-mapbar .imm-checkchip{background:var(--color-surface);border:var(--border);border-radius:var(--radius-md);
  box-shadow:var(--shadow-2)}
.imm-mapbar__filtres{display:inline-flex;align-items:center;gap:6px;padding:7px 12px;border-radius:var(--radius-md);
  border:var(--border);background:var(--color-surface);box-shadow:var(--shadow-2);cursor:pointer;
  font:inherit;font-size:var(--text-body-s);font-weight:var(--fw-semibold);color:var(--color-text-secondary)}
.imm-mapbar__filtres:hover{color:var(--color-text-primary)}
.imm-mapbar__filtres[aria-expanded="true"]{background:var(--color-text-primary);color:var(--color-surface);border-color:transparent}
.imm-mapbar__statut{margin:0;padding:6px var(--space-3);border-radius:var(--radius-md);
  background:var(--color-surface);border:var(--border);box-shadow:var(--shadow-2);
  font-size:var(--text-caption);color:var(--color-text-secondary);max-width:40ch;text-align:left}
.imm-mapbar__statut[hidden]{display:none}
.imm-mapbar__panneau{display:grid;gap:var(--space-3);padding:var(--space-4);width:min(320px,90vw);
  background:var(--color-surface);border:var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-3)}
.imm-mapbar__panneau[hidden]{display:none}
@media (max-width:900px){
  /* Trop étroit pour une colonne : les réglages s'étalent sur toute la largeur, en haut,
     et chaque rangée défile latéralement plutôt que de manger la hauteur de carte. */
  .imm-map__gauche{left:var(--space-3);right:var(--space-3);width:auto;max-width:none}
  .imm-mapbar{justify-items:stretch}
  .imm-mapbar__ligne,.imm-mapbar__chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:2px}
  .imm-mapbar__statut{max-width:none}
  .imm-mapbar__panneau{width:auto}
}
.imm-mapbar .imm-segbtn button{white-space:nowrap}

/* components/data.css */
/* DONNÉES ----------------------------------------------------------- */
.imm-table-wrap{border:var(--border);border-radius:var(--radius-lg);overflow:hidden;background:var(--color-surface)}
.imm-table{width:100%;border-collapse:collapse;font-size:var(--text-body-s);font-variant-numeric:tabular-nums}
.imm-table th{text-align:left;font-weight:var(--fw-medium);font-size:var(--text-caption);color:var(--color-text-muted);background:var(--color-surface-sunken);border-bottom:var(--border);padding:var(--space-3) var(--space-4);white-space:nowrap;position:sticky;top:0}
.imm-table th[aria-sort]{cursor:pointer;user-select:none}
.imm-table th[aria-sort]:hover{color:var(--color-text-primary)}
.imm-table th button{display:inline-flex;align-items:center;gap:4px;background:none;border:0;padding:0;font:inherit;color:inherit;cursor:pointer}
.imm-table td{padding:var(--space-3) var(--space-4);border-bottom:var(--border-subtle);color:var(--color-text-primary)}
.imm-table tbody tr:last-child td{border-bottom:0}
.imm-table tbody tr:hover td{background:var(--color-surface-hover)}
.imm-table .num{text-align:right}
.imm-table__toolbar{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:var(--border);background:var(--color-surface)}
.imm-table__foot{display:flex;align-items:center;padding:var(--space-3) var(--space-4);border-top:var(--border);background:var(--color-surface)}
.imm-table--dense td,.imm-table--dense th{padding:var(--space-2) var(--space-3)}

.imm-chart{width:100%;font-variant-numeric:tabular-nums}
.imm-chart text{font-family:var(--font-ui);font-size:10px;fill:var(--color-text-faint)}
.imm-chart__grid{stroke:var(--color-border-subtle);stroke-width:1}
.imm-chart__axis{stroke:var(--color-border);stroke-width:1}
.imm-chart__line{fill:none;stroke:var(--color-text-primary);stroke-width:1.75;stroke-linejoin:round;stroke-linecap:round}
.imm-chart__area{fill:var(--color-surface-active);opacity:.6}
.imm-chart__dot{fill:var(--color-surface);stroke:var(--color-text-primary);stroke-width:1.75}
.imm-chart__bar{fill:var(--color-text-primary);opacity:.82}
.imm-chart__bar:hover{opacity:1}
.imm-chart__legend{display:flex;flex-wrap:wrap;gap:var(--space-3);font-size:var(--text-caption);color:var(--color-text-secondary)}
.imm-chart__legend span{display:inline-flex;align-items:center;gap:6px}
.imm-chart__legend i{width:8px;height:8px;border-radius:2px}
.imm-spark{display:block;overflow:visible}
.imm-spark path{fill:none;stroke:currentColor;stroke-width:1.5;stroke-linejoin:round;stroke-linecap:round}

.imm-score{display:flex;align-items:center;gap:var(--space-4)}
.imm-score__gauge{position:relative;flex:none}
.imm-score__val{position:absolute;inset:0;display:grid;place-items:center;font-size:var(--text-h3);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.imm-score__val small{display:block;text-align:center;font-size:10px;font-weight:var(--fw-regular);color:var(--color-text-muted);letter-spacing:.06em;text-transform:uppercase}
.imm-score__ring-bg{stroke:var(--color-bg-inset)}
.imm-score__ring{stroke:var(--color-text-primary);stroke-linecap:round;transition:stroke-dashoffset var(--duration-slower) var(--ease-out)}
.imm-criteria{display:grid;gap:var(--space-3);width:100%}
.imm-criterion{display:grid;grid-template-columns:1fr 44px;gap:var(--space-3) var(--space-4);align-items:center;font-size:var(--text-body-s)}
.imm-criterion__bar{grid-column:1/-1;height:4px;border-radius:var(--radius-full);background:var(--color-bg-inset);overflow:hidden}
.imm-criterion__bar i{display:block;height:100%;border-radius:var(--radius-full);background:var(--color-text-primary)}
.imm-criterion__score{text-align:right;font-variant-numeric:tabular-nums;font-weight:var(--fw-medium)}

.imm-sim{display:grid;gap:var(--space-5)}
.imm-sim__grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--space-4)}
.imm-sim__result{border:var(--border);border-radius:var(--radius-lg);background:var(--color-surface-sunken);padding:var(--space-5);display:grid;gap:var(--space-4)}
.imm-sim__line{display:flex;justify-content:space-between;align-items:baseline;font-size:var(--text-body-m);font-variant-numeric:tabular-nums}
.imm-sim__line dt{color:var(--color-text-secondary)}
.imm-sim__line dd{margin:0;font-weight:var(--fw-medium)}
.imm-sim__total{display:flex;justify-content:space-between;align-items:baseline;padding-top:var(--space-4);border-top:var(--border)}
.imm-sim__total dd{margin:0;font-size:var(--text-h3);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;letter-spacing:var(--ls-h3)}

.imm-defs{display:grid;gap:0;margin:0}
.imm-defs__row{display:grid;grid-template-columns:minmax(120px,44%) 1fr;gap:var(--space-4);padding:var(--space-3) 0;border-bottom:var(--border-subtle);font-size:var(--text-body-s)}
.imm-defs__row:last-child{border-bottom:0}
.imm-defs dt{color:var(--color-text-muted)}
.imm-defs dd{margin:0;font-weight:var(--fw-medium);font-variant-numeric:tabular-nums;text-align:right}
.imm-section{display:grid;gap:var(--space-3)}
/* Un titre de section appelé sans contenu — le contenu suivant alors dans la carte, en
   frère et non en enfant — n'avait aucune respiration en dessous : la grille n'a rien à
   espacer. On lui rend l'écart que le `gap` aurait produit. */
.imm-section:not(:last-child){margin-bottom:var(--space-4)}
.imm-section__head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3)}
.imm-section__title{font-size:var(--text-h6);font-weight:var(--fw-semibold);letter-spacing:var(--ls-h6)}

/* components/feedback.css */
/* FEEDBACK ---------------------------------------------------------- */
.imm-alert{display:flex;gap:var(--space-3);padding:var(--space-4);border-radius:var(--radius-md);border:var(--border-width) solid var(--color-border);background:var(--color-surface-sunken);font-size:var(--text-body-s);color:var(--color-text-secondary)}
.imm-alert__icon{flex:none;display:flex;color:var(--color-text-muted)}
.imm-alert__title{font-weight:var(--fw-semibold);color:var(--color-text-primary);font-size:var(--text-body-m);margin-bottom:2px}
.imm-alert--success{background:var(--color-success-bg);border-color:var(--color-success-border)}
.imm-alert--success .imm-alert__icon{color:var(--color-success)}
.imm-alert--warning{background:var(--color-warning-bg);border-color:var(--color-warning-border)}
.imm-alert--warning .imm-alert__icon{color:var(--color-warning)}
.imm-alert--danger{background:var(--color-danger-bg);border-color:var(--color-danger-border)}
.imm-alert--danger .imm-alert__icon{color:var(--color-danger)}
.imm-alert--info{background:var(--color-info-bg);border-color:var(--color-info-border)}
.imm-alert--info .imm-alert__icon{color:var(--color-info)}

.imm-toast-stack{position:fixed;bottom:var(--space-6);right:var(--space-6);z-index:var(--z-toast);display:grid;gap:var(--space-2);max-width:min(380px,calc(100vw - 32px))}
.imm-toast{display:flex;gap:var(--space-3);align-items:flex-start;padding:var(--space-3) var(--space-4);background:var(--color-surface-elevated);border:var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-4);font-size:var(--text-body-s);animation:imm-toast-in var(--duration-slow) var(--ease-out)}
.imm-toast__title{font-weight:var(--fw-medium);color:var(--color-text-primary)}
.imm-toast__desc{color:var(--color-text-muted);margin-top:2px}
.imm-toast__close{margin-left:auto}
@keyframes imm-toast-in{from{transform:translateY(8px) scale(.98);opacity:0}to{transform:none;opacity:1}}

.imm-overlay{position:fixed;inset:0;z-index:var(--z-overlay);background:var(--color-overlay);-webkit-backdrop-filter:blur(var(--blur-sm));backdrop-filter:blur(var(--blur-sm));display:grid;place-items:center;padding:var(--space-4);animation:imm-fade var(--duration-base) var(--ease-out)}
.imm-modal{position:relative;z-index:var(--z-modal);width:100%;max-width:520px;background:var(--color-surface-elevated);border:var(--border);border-radius:var(--radius-xl);box-shadow:var(--shadow-4);animation:imm-modal-in var(--duration-slow) var(--ease-out)}
.imm-modal__head{display:flex;align-items:flex-start;gap:var(--space-3);padding:var(--space-5) var(--space-5) var(--space-3)}
.imm-modal__title{font-size:var(--text-h4);font-weight:var(--fw-semibold);letter-spacing:var(--ls-h4)}
.imm-modal__desc{font-size:var(--text-body-s);color:var(--color-text-muted);margin-top:var(--space-1)}
.imm-modal__body{padding:0 var(--space-5) var(--space-5);font-size:var(--text-body-m);color:var(--color-text-secondary)}
.imm-modal__foot{display:flex;justify-content:flex-end;gap:var(--space-2);padding:var(--space-4) var(--space-5);border-top:var(--border)}
@keyframes imm-modal-in{from{transform:translateY(10px) scale(.985);opacity:0}to{transform:none;opacity:1}}

.imm-tooltip{position:relative;display:inline-flex}
.imm-tooltip__bubble{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);z-index:var(--z-tooltip);background:var(--color-text-primary);color:var(--color-bg);font-size:var(--text-caption);line-height:1.35;padding:var(--space-2) var(--space-3);border-radius:var(--radius-sm);white-space:nowrap;box-shadow:var(--shadow-2);opacity:0;pointer-events:none;transition:opacity var(--duration-fast) var(--ease-standard),transform var(--duration-fast) var(--ease-out)}
.imm-tooltip:hover .imm-tooltip__bubble,.imm-tooltip:focus-within .imm-tooltip__bubble{opacity:1;transform:translateX(-50%) translateY(-2px)}

.imm-skel{background:linear-gradient(90deg,var(--color-bg-inset) 25%,var(--color-surface-hover) 37%,var(--color-bg-inset) 63%);background-size:400% 100%;border-radius:var(--radius-sm);animation:imm-shimmer 1.4s var(--ease-linear) infinite}
@keyframes imm-shimmer{from{background-position:100% 0}to{background-position:0 0}}
@media (prefers-reduced-motion:reduce){.imm-skel{animation:none}}
.imm-skel--text{height:12px}
.imm-skel--title{height:20px}
.imm-skel--block{height:100%;min-height:64px}

.imm-empty{display:grid;justify-items:center;gap:var(--space-3);text-align:center;padding:var(--space-12) var(--space-6);border:var(--border-dashed);border-radius:var(--radius-lg);background:var(--color-bg-subtle)}
.imm-empty__icon{width:40px;height:40px;display:grid;place-items:center;border-radius:var(--radius-full);border:var(--border);background:var(--color-surface);color:var(--color-text-muted)}
.imm-empty__title{font-size:var(--text-h5);font-weight:var(--fw-semibold)}
.imm-empty__desc{font-size:var(--text-body-s);color:var(--color-text-muted);max-width:42ch}
.imm-empty--error .imm-empty__icon{color:var(--color-danger);border-color:var(--color-danger-border);background:var(--color-danger-bg)}

/* components/monetization.css */
/* MONÉTISATION — encarts publicitaires, vérification par SMS, accès payant ----------
   L'encart publicitaire est volontairement neutre et étiqueté : jamais de faux contenu
   éditorial, jamais de couleur de marque, jamais confondable avec une donnée du produit. */
.imm-ad{position:relative;display:grid;place-items:center;background:var(--color-bg-inset);border:var(--border-dashed);border-radius:var(--radius-lg);color:var(--color-text-faint);overflow:hidden}
.imm-ad::before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(135deg,transparent 0 11px,var(--color-border-subtle) 11px 12px);opacity:.7}
.imm-ad__label{position:relative;font-size:var(--text-overline);letter-spacing:var(--ls-overline);text-transform:uppercase;font-weight:var(--fw-medium);color:var(--color-text-muted)}
.imm-ad__note{position:relative;margin-top:var(--space-1);font-size:var(--text-caption);color:var(--color-text-faint)}
.imm-ad--landscape{aspect-ratio:8/1;min-height:96px}
.imm-ad--banner{height:90px}
.imm-ad--square{aspect-ratio:1;max-width:300px}
.imm-ad--inline{height:64px}
@media (max-width:639px){.imm-ad--landscape{aspect-ratio:3/1}}

.imm-gate{background:var(--color-surface);border:var(--border);border-radius:var(--radius-xl);box-shadow:var(--shadow-2);padding:var(--space-6);display:grid;gap:var(--space-5);max-width:520px}
.imm-gate__head{display:grid;gap:var(--space-2)}
.imm-gate__title{font-size:var(--text-h4);font-weight:var(--fw-semibold);letter-spacing:var(--ls-h4)}
.imm-gate__sub{font-size:var(--text-body-m);color:var(--color-text-secondary)}
.imm-gate__steps{display:flex;align-items:center;gap:var(--space-2);font-size:var(--text-caption);color:var(--color-text-faint)}
.imm-gate__steps i{flex:1;height:2px;border-radius:var(--radius-full);background:var(--color-bg-inset)}
.imm-gate__steps i[data-done]{background:var(--color-text-primary)}
.imm-gate__actions{display:flex;gap:var(--space-2);flex-wrap:wrap}
.imm-gate__foot{border-top:var(--border);padding-top:var(--space-4);display:grid;gap:var(--space-2)}
.imm-gate__legal{font-size:var(--text-caption);color:var(--color-text-muted)}

/* Saisie du code SMS : chiffres tabulaires, cases de 44px minimum */
.imm-code{display:flex;gap:var(--space-2)}
.imm-code input{width:44px;height:52px;text-align:center;font-size:var(--text-h4);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;background:var(--color-surface);border:var(--border-width) solid var(--color-border-strong);border-radius:var(--radius-md);color:var(--color-text-primary)}
.imm-code input:focus{outline:none;border-color:var(--color-focus-ring);box-shadow:0 0 0 3px var(--color-accent-subtle)}

/* Attente publicitaire : la minute est un compte à rebours honnête, jamais masqué. */
.imm-adwait{display:grid;gap:var(--space-4);justify-items:center;text-align:center}
.imm-adwait__count{display:flex;align-items:center;gap:var(--space-3);font-size:var(--text-body-s);color:var(--color-text-secondary)}
.imm-adwait__num{font-size:var(--text-h3);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums;letter-spacing:var(--ls-h3);color:var(--color-text-primary)}
.imm-adwait__bar{width:100%;height:3px;border-radius:var(--radius-full);background:var(--color-bg-inset);overflow:hidden}
.imm-adwait__bar i{display:block;height:100%;background:var(--color-text-primary);transition:width 1s var(--ease-linear)}

/* Offre d'accès — 25 € TTC, 30 jours, sans abonnement */
.imm-offer{border:var(--border-width) solid var(--color-border-strong);border-radius:var(--radius-lg);padding:var(--space-5);display:grid;gap:var(--space-4);background:var(--color-surface-sunken)}
.imm-offer__price{display:flex;align-items:baseline;gap:var(--space-2)}
.imm-offer__amount{font-size:var(--text-h1);font-weight:var(--fw-semibold);letter-spacing:var(--ls-h1);font-variant-numeric:tabular-nums;line-height:1}
.imm-offer__unit{font-size:var(--text-body-m);color:var(--color-text-muted)}
.imm-offer__list{list-style:none;margin:0;padding:0;display:grid;gap:var(--space-2);font-size:var(--text-body-s)}
.imm-offer__list li{display:flex;gap:var(--space-3);align-items:flex-start;color:var(--color-text-secondary)}
.imm-offer__list svg{flex:none;margin-top:2px;color:var(--color-positive)}
.imm-quota{display:inline-flex;align-items:center;gap:var(--space-2);font-size:var(--text-caption);color:var(--color-text-muted)}

/* components/motion-ui.css */
/* MOTION D'INTERFACE — entrées de page et révélations
   Utilitaires partagés : une page se pose, ses blocs se succèdent. Rien ne dure plus de 460ms,
   rien ne rebondit. Tout s'annule sous prefers-reduced-motion. */

/* Entrée de vue : à poser sur le conteneur de l'écran, avec une `key` de route en React pour
   que l'animation rejoue à chaque changement d'écran.
   NB : ne jamais nommer cette classe `.imm-page` — c'est déjà un bouton de pagination. */
.imm-view{display:block;animation:imm-view-in 340ms var(--ease-out) both}
@keyframes imm-view-in{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}

/* Révélation en cascade : les enfants directs entrent l'un après l'autre (12 max, puis groupés). */
.imm-stagger>*{animation:imm-rise 420ms var(--ease-out) both}
.imm-stagger>*:nth-child(1){animation-delay:40ms}
.imm-stagger>*:nth-child(2){animation-delay:90ms}
.imm-stagger>*:nth-child(3){animation-delay:140ms}
.imm-stagger>*:nth-child(4){animation-delay:190ms}
.imm-stagger>*:nth-child(5){animation-delay:240ms}
.imm-stagger>*:nth-child(6){animation-delay:290ms}
.imm-stagger>*:nth-child(7){animation-delay:330ms}
.imm-stagger>*:nth-child(8){animation-delay:370ms}
.imm-stagger>*:nth-child(n+9){animation-delay:410ms}
@keyframes imm-rise{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}

/* Variantes ponctuelles */
.imm-fade-in{animation:imm-fade 260ms var(--ease-standard) both}
.imm-scale-in{animation:imm-scale-in 300ms var(--ease-out) both}
@keyframes imm-scale-in{from{opacity:0;transform:scale(.97)}to{opacity:1;transform:none}}

/* Chiffres et barres qui se remplissent : la largeur/longueur est pilotée en style inline,
   la transition est ici pour qu'un changement de valeur soit toujours animé. */
.imm-criteria__bar i,.imm-gauge__fill{transition:width var(--duration-slower) var(--ease-out),stroke-dashoffset var(--duration-slower) var(--ease-out)}

@media (prefers-reduced-motion:reduce){
  .imm-view,.imm-stagger>*,.imm-fade-in,.imm-scale-in{animation:none!important}
  .imm-criteria__bar i,.imm-gauge__fill{transition:none}
}

/* css/app.css */
/* ============================================================
   IMMOPILIER — mises en page propres au site.
   Le design system (tokens/ + components/) reste la source de vérité visuelle :
   ce fichier ne fait que composer ses briques en gabarits de page.
   ============================================================ */

/* Colonne de contenu standard --------------------------------------- */
.imm-page-wrap{
  max-width:var(--content-max);margin:0 auto;
  padding:var(--space-12) var(--gutter-mobile) var(--space-20);
  display:grid;gap:var(--space-8);
}
.imm-page-wrap--dense{padding-top:var(--space-6);gap:var(--space-6)}
@media (min-width:768px){
  .imm-page-wrap{padding-left:var(--gutter-tablet);padding-right:var(--gutter-tablet)}
}
@media (min-width:1024px){
  .imm-page-wrap{padding-left:var(--gutter-desktop);padding-right:var(--gutter-desktop)}
}

/* Deux colonnes : contenu principal + colonne latérale.
   Mobile-first — la colonne latérale passe dessous et perd son `sticky`. */
.imm-cols{display:grid;gap:var(--space-6);align-items:start;grid-template-columns:minmax(0,1fr)}
@media (min-width:1024px){
  .imm-cols{grid-template-columns:minmax(0,1fr) 340px}
  .imm-cols--asset{grid-template-columns:minmax(0,1fr) 360px}
  .imm-cols--form{grid-template-columns:minmax(0,420px) minmax(0,1fr)}
  .imm-cols--wide{grid-template-columns:minmax(0,1.6fr) minmax(0,1fr)}
  .imm-cols--half{grid-template-columns:1fr 1fr}
  .imm-aside{position:sticky;top:calc(var(--header-h) + var(--space-4))}
  .imm-sticky{position:sticky;top:calc(var(--header-h) + var(--space-4))}
}
.imm-aside{display:grid;gap:var(--space-4);min-width:0}

/* Carte plein écran -------------------------------------------------- */
main.imm-main--full{flex:1;min-height:0;height:calc(100vh - var(--header-h));overflow:hidden}
main.imm-main--full>.imm-view{height:100%}
body[data-full]{overflow:hidden}
body[data-full] .imm-header{position:relative}

.imm-map__search{position:absolute;top:var(--space-4);left:var(--space-4);width:360px;max-width:calc(100% - var(--space-8))}
.imm-map .imm-layers{position:absolute;top:76px;left:var(--space-4);max-height:calc(100% - 240px);overflow-y:auto}
.imm-map .imm-mapctrl{top:var(--space-4);right:calc(var(--sidepanel-w) + var(--space-4))}
.imm-map .imm-legend{position:absolute;bottom:var(--space-4);left:var(--space-4)}
.imm-map .imm-sidepanel[hidden]{display:none}
.imm-map:not(:has(.imm-sidepanel:not([hidden]))) .imm-mapctrl{right:var(--space-4)}

@media (max-width:1023px){
  .imm-map__search{width:auto;right:var(--space-4);max-width:none}
  /* Le bottom sheet occupe 78 % de la carte : pas la place d'une pile de contrôles. */
  .imm-map .imm-layers{display:none}
  .imm-map .imm-mapctrl{top:80px;right:var(--space-4)}
  .imm-map .imm-legend{display:none}
  .imm-map .imm-sidepanel{
    top:auto;left:0;right:0;width:auto;border-left:0;border-top:var(--border);
    border-radius:var(--radius-2xl) var(--radius-2xl) 0 0;max-height:78%;
  }
  .imm-map:has(.imm-sidepanel:not([hidden])) .imm-mapctrl{display:none}
}

/* La vignette Leaflet doit porter les couleurs du thème, pas les siennes. */
.leaflet-container{background:var(--map-bg);font-family:var(--font-ui)}
.leaflet-control-attribution{
  background:var(--glass-bg)!important;color:var(--color-text-muted)!important;
  font-size:10px;border-radius:var(--radius-xs) 0 0 0;
}
.leaflet-control-attribution a{color:var(--color-text-secondary)}
.leaflet-control-zoom{display:none} /* remplacé par .imm-mapctrl */
[data-theme="dark"] .leaflet-tile-pane{filter:invert(1) hue-rotate(180deg) brightness(.92) contrast(.92)}

/* Résultat de géolocalisation --------------------------------------- */
.imm-candidate{display:grid;gap:var(--space-4);align-items:center;padding:var(--space-4);
  grid-template-columns:minmax(0,1fr) auto}
.imm-candidate__map{display:none}
.imm-candidate__body{display:grid;gap:var(--space-2);min-width:0}
.imm-candidate__score{text-align:right;display:grid;gap:var(--space-1);justify-items:end}
@media (min-width:640px){
  .imm-candidate{grid-template-columns:120px minmax(0,1fr) auto}
  .imm-candidate__map{display:block;position:relative;height:84px;border-radius:var(--radius-md);
    overflow:hidden;border:var(--border)}
}

/* Menu mobile : le gabarit public le pose en overlay sous l'en-tête. */
.imm-mobilemenu[hidden]{display:none}

/* Administration ----------------------------------------------------- */
.imm-admin{display:grid;grid-template-columns:240px minmax(0,1fr);min-height:100vh;background:var(--color-bg-subtle)}
.imm-admin__side{
  position:sticky;top:0;height:100vh;display:flex;flex-direction:column;gap:var(--space-4);
  padding:var(--space-4) 0;background:var(--color-surface);border-right:var(--border);
}
.imm-admin__brand{display:block;padding:0 var(--space-4) var(--space-2)}
.imm-admin__nav{display:grid;gap:2px;padding:0 var(--space-2);flex:1;align-content:start}
.imm-admin__nav a{
  display:flex;align-items:center;gap:var(--space-3);height:40px;padding:0 var(--space-3);
  border-radius:var(--radius-md);font-size:var(--text-body-s);font-weight:var(--fw-medium);
  color:var(--color-text-secondary);text-decoration:none;transition:var(--transition-colors);
}
.imm-admin__nav a:hover{background:var(--color-surface-hover);color:var(--color-text-primary);text-decoration:none}
.imm-admin__nav a[aria-current="page"]{background:var(--color-surface-active);color:var(--color-text-primary)}
.imm-admin__foot{display:grid;gap:var(--space-2);padding:var(--space-4) var(--space-4) 0;border-top:var(--border)}
.imm-admin__main{min-width:0;display:flex;flex-direction:column}
.imm-admin__head{
  position:sticky;top:0;z-index:var(--z-sticky);display:flex;align-items:center;gap:var(--space-4);
  justify-content:space-between;padding:var(--space-4) var(--space-6);
  background:var(--color-bg);border-bottom:var(--border);
}
.imm-admin__body{padding:var(--space-6);min-width:0}
@media (max-width:900px){
  .imm-admin{grid-template-columns:1fr}
  .imm-admin__side{position:static;height:auto;border-right:0;border-bottom:var(--border)}
  .imm-admin__nav{grid-auto-flow:column;grid-auto-columns:max-content;overflow-x:auto;padding-bottom:var(--space-2)}
  .imm-admin__foot{border-top:0}
  .imm-admin__body{padding:var(--space-4)}
}

/* Détails ------------------------------------------------------------ */
/* Un lien d'adresse dans un tableau reste discret : c'est une donnée, pas un appel à l'action. */
.imm-table a{color:var(--color-text-primary);text-decoration:none;border-bottom:1px solid var(--color-border-strong)}
.imm-table a:hover{color:var(--color-text-primary);border-color:var(--color-text-primary)}

/* Le composer s'étire à la saisie sans jamais faire sauter la page. */
.imm-composer textarea{field-sizing:content;min-height:28px}

/* Impression : la fiche adresse et l'analyse doivent sortir proprement. */
@media print{
  .imm-header,.imm-footer,.imm-ad,.imm-mobilemenu,.imm-composer,.imm-mapctrl{display:none!important}
  .imm-card{break-inside:avoid;box-shadow:none}
  .imm-page-wrap{padding:0}
  .imm-cols{grid-template-columns:1fr}
}

/* ============================================================
   LIENS — aucun bleu.
   Le design system réservait l'accent aux liens ; à l'usage, des liens bleus
   apparaissaient partout (onglets, pied de page, tableaux) et cassaient
   l'identité monochrome. La couleur du texte porte désormais le lien, et
   c'est le soulignement qui le signale. L'accent ne reste que sur l'anneau
   de focus, où il a une fonction d'accessibilité.
   ============================================================ */
a{color:var(--color-text-primary)}
a:hover{color:var(--color-text-primary)}
/* Surtout ne rien forcer sur les composants : chacun pose déjà sa couleur, et la règle
   `a{}` ci-dessus, de spécificité minimale, ne les atteint pas. Un `color:inherit` global
   ici rendait au contraire le texte des boutons primaires invisible sur leur fond noir. */
.imm-btn--link{color:var(--color-text-primary);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px;text-decoration-color:var(--color-border-strong)}
.imm-btn--link:hover{text-decoration-color:var(--color-text-primary)}
.imm-mobilemenu a[aria-current]{color:var(--color-text-primary);font-weight:var(--fw-semibold)}
.imm-breadcrumb a{color:var(--color-text-muted)}
.imm-footer a{color:var(--color-text-secondary)}
/* Un lien dans un bloc de texte reste identifiable sans couleur — mais un bouton posé
   au fil du texte reste un bouton : pas de soulignement dessus. */
.imm-prose a:not(.imm-btn){text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--color-border-strong)}
.imm-prose a:not(.imm-btn):hover{text-decoration-color:var(--color-text-primary)}

/* ============================================================
   ONGLETS SEGMENTÉS — version soignée, en liens comme en boutons.
   Les entrées peuvent être des <a> (état dans l'URL, partageable) : elles
   reçoivent exactement le traitement des <button>, plus un compteur.
   ============================================================ */
.imm-seg{position:relative}
.imm-seg a,.imm-seg button{
  display:inline-flex;align-items:center;gap:var(--space-2);
  height:32px;padding:0 var(--space-4);border:0;background:none;
  border-radius:var(--radius-sm);font-family:var(--font-ui);
  font-size:var(--text-body-s);font-weight:var(--fw-medium);
  color:var(--color-text-muted);cursor:pointer;text-decoration:none;white-space:nowrap;
  transition:var(--transition-colors),box-shadow var(--duration-fast) var(--ease-standard);
}
.imm-seg a:hover,.imm-seg button:hover{color:var(--color-text-primary);text-decoration:none}
.imm-seg a[aria-pressed="true"],.imm-seg button[aria-pressed="true"]{
  background:var(--color-surface);color:var(--color-text-primary);box-shadow:var(--shadow-1);
}
.imm-seg a:focus-visible,.imm-seg button:focus-visible{outline:none;box-shadow:var(--shadow-focus)}
.imm-seg--lg a,.imm-seg--lg button{height:36px;padding:0 var(--space-4)}
/* Compteur : la même information que dans les KPI, mais au fil de l'onglet. */
.imm-seg__count{
  font-size:var(--text-caption);font-variant-numeric:tabular-nums;
  color:var(--color-text-faint);padding:0 6px;height:18px;display:inline-flex;
  align-items:center;border-radius:var(--radius-full);background:var(--color-bg-inset);
}
.imm-seg a[aria-pressed="true"] .imm-seg__count,
.imm-seg button[aria-pressed="true"] .imm-seg__count{
  background:var(--color-surface-active);color:var(--color-text-secondary);
}
@media (max-width:639px){
  .imm-seg{overflow-x:auto;scrollbar-width:none;max-width:100%}
  .imm-seg::-webkit-scrollbar{display:none}
}

/* ============================================================
   BLOCS ÉDITORIAUX DE LA PAGE MARCHÉ
   ============================================================ */

/* Prix moyen par type — les deux chiffres que le visiteur vient chercher. */
.imm-pricecards{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:var(--space-4)}
.imm-pricecard{display:flex;gap:var(--space-4);align-items:center;padding:var(--space-5)}
.imm-pricecard__icon{
  width:48px;height:48px;flex:none;display:grid;place-items:center;
  border:var(--border);border-radius:var(--radius-lg);
  background:var(--color-surface-sunken);color:var(--color-text-primary);
}
.imm-pricecard__label{font-size:var(--text-body-s);color:var(--color-text-muted);display:block}
.imm-pricecard__value{
  font-size:var(--text-h2);font-weight:var(--fw-semibold);letter-spacing:var(--ls-h2);
  font-variant-numeric:tabular-nums;line-height:1.1;display:block;margin-top:2px;
}
.imm-pricecard__note{font-size:var(--text-caption);color:var(--color-text-faint);display:block;margin-top:4px}

/* Paragraphe de synthèse : de la lecture, pas un tableau de bord. */
.imm-prose{font-size:var(--text-body-l);line-height:1.7;color:var(--color-text-secondary);max-width:72ch}
.imm-prose p{margin:0 0 var(--space-4)}
.imm-prose p:last-child{margin-bottom:0}
.imm-prose strong{color:var(--color-text-primary);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}

/* Prix par nombre de pièces — barres horizontales comparables d'un coup d'œil. */
.imm-rooms{display:grid;gap:var(--space-3)}
.imm-room{display:grid;grid-template-columns:minmax(88px,auto) 1fr minmax(88px,auto);
  gap:var(--space-4);align-items:center;font-size:var(--text-body-s)}
.imm-room__label{color:var(--color-text-secondary)}
.imm-room__track{height:8px;border-radius:var(--radius-full);background:var(--color-bg-inset);overflow:hidden}
.imm-room__fill{display:block;height:100%;border-radius:var(--radius-full);background:var(--color-text-primary)}
.imm-room__value{text-align:right;font-weight:var(--fw-medium);font-variant-numeric:tabular-nums}
.imm-room__n{color:var(--color-text-faint);font-size:var(--text-caption);font-variant-numeric:tabular-nums}
@media (max-width:479px){
  .imm-room{grid-template-columns:1fr auto}
  .imm-room__track{grid-column:1/-1}
}

/* Tableau année / prix, sous la courbe. */
.imm-years{display:grid;grid-template-columns:repeat(auto-fit,minmax(92px,1fr));gap:var(--space-px);
  background:var(--color-border-subtle);border:var(--border);border-radius:var(--radius-lg);overflow:hidden}
.imm-year{background:var(--color-surface);padding:var(--space-3) var(--space-4);display:grid;gap:2px}
.imm-year dt{font-size:var(--text-caption);color:var(--color-text-muted);font-variant-numeric:tabular-nums}
.imm-year dd{margin:0;font-size:var(--text-body-m);font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}
.imm-year[data-last] dd{color:var(--color-text-primary)}

/* Agences immobilières géolocalisées. */
.imm-agencies{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--space-5)}
/* La carte a besoin de respirer : collée aux fiches, elle se lit comme une image cassée. */
.imm-agencies--after-map{margin-top:var(--space-6)}
.imm-agency{display:grid;gap:var(--space-3);padding:var(--space-4)}
.imm-agency__head{display:flex;gap:var(--space-3);align-items:flex-start;justify-content:space-between}
.imm-agency__name{font-size:var(--text-body-m);font-weight:var(--fw-semibold);letter-spacing:-.01em}
.imm-agency__addr{font-size:var(--text-body-s);color:var(--color-text-muted);margin-top:2px}
.imm-agency__hours{display:grid;gap:2px;font-size:var(--text-body-s);border-top:var(--border-subtle);padding-top:var(--space-3)}
.imm-agency__day{display:flex;justify-content:space-between;gap:var(--space-3);font-variant-numeric:tabular-nums}
.imm-agency__day[data-today]{font-weight:var(--fw-medium);color:var(--color-text-primary)}
.imm-agency__day span:last-child{color:var(--color-text-muted)}
.imm-agency__day[data-today] span:last-child{color:var(--color-text-primary)}
.imm-agency__links{display:flex;gap:var(--space-2);flex-wrap:wrap}
/* Fond neutre sous la carte : si les tuiles ne se chargent pas, on voit un cadre, pas un vide. */
.imm-agencymap{
  position:relative;height:320px;border:var(--border);border-radius:var(--radius-lg);overflow:hidden;
  background:var(--color-surface-sunken,var(--color-bg-subtle,#f4f4f5));
}

/* Points vérifiés — un risque écarté se dit d'une ligne et d'une coche, pas d'un encart. */
.imm-checks{display:grid;gap:var(--space-3)}
.imm-check-line{display:flex;gap:var(--space-3);align-items:flex-start;font-size:var(--text-body-s)}
.imm-check-line__icon{
  flex:none;display:grid;place-items:center;width:20px;height:20px;border-radius:var(--radius-full);
  background:var(--color-success-bg);border:var(--border-width) solid var(--color-success-border);
  color:var(--color-success);margin-top:1px;
}
.imm-check-line strong{display:block;font-weight:var(--fw-medium);color:var(--color-text-primary)}
.imm-check-line span span{display:block;color:var(--color-text-muted);margin-top:2px}

/* Sociétés domiciliées à l'adresse. */
.imm-firms{display:grid;gap:var(--space-4)}
.imm-firm{display:grid;gap:var(--space-3);padding:var(--space-4);border:var(--border);
  border-radius:var(--radius-lg);background:var(--color-surface-sunken);justify-items:start}
.imm-firm__head{display:flex;gap:var(--space-3);align-items:center;justify-content:space-between;width:100%;flex-wrap:wrap}
.imm-firm__name{font-size:var(--text-body-m);font-weight:var(--fw-semibold);letter-spacing:-.01em}
.imm-firm__activity{font-size:var(--text-body-s);color:var(--color-text-muted)}
.imm-firm .imm-defs{width:100%}

/* ---------------------------------------------------------- Liens sortants
   Un lien vers un site tiers s'annonce : on montre le domaine de destination,
   comme le fait une citation, plutôt que d'envoyer l'internaute à l'aveugle. */
.imm-cite{
  display:inline-flex;align-items:center;gap:var(--space-2);max-width:100%;
  padding:3px 9px 3px 3px;border:var(--border);border-radius:var(--radius-full);
  background:var(--color-surface);color:var(--color-text-primary);
  font-size:var(--text-caption);line-height:1.4;text-decoration:none;
  transition:background var(--duration-fast) var(--ease-out),border-color var(--duration-fast) var(--ease-out);
}
.imm-cite:hover{background:var(--color-bg-subtle);border-color:var(--color-border-strong)}
.imm-cite__mark{
  flex:none;display:grid;place-items:center;width:18px;height:18px;border-radius:var(--radius-full);
  background:var(--color-text-primary);color:var(--color-bg);
  font-size:10px;font-weight:var(--fw-semibold);line-height:1;
}
.imm-cite__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:var(--fw-medium)}
.imm-cite__host{color:var(--color-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.imm-cite__icon{flex:none;display:grid;place-items:center;color:var(--color-text-muted)}
.imm-cites{display:flex;flex-wrap:wrap;gap:var(--space-2)}

/* ------------------------------------------------- Occupation du sol */
.imm-landuse{display:grid;gap:var(--space-3)}
.imm-landuse__row{
  display:flex;justify-content:space-between;gap:var(--space-4);align-items:baseline;
  font-size:var(--text-body-s);color:var(--color-text-secondary);
}
.imm-landuse__row strong{color:var(--color-text-primary);font-variant-numeric:tabular-nums}
.imm-landuse__row--total{
  padding-top:var(--space-3);border-top:var(--border-subtle);
  font-size:var(--text-body-m);color:var(--color-text-primary);font-weight:var(--fw-medium);
}
.imm-landuse__bar{
  height:8px;border-radius:var(--radius-full);overflow:hidden;
  background:var(--color-bg-subtle);border:var(--border-subtle);
}
.imm-landuse__bar span{display:block;height:100%;background:var(--color-text-primary)}
.imm-landuse__note{font-size:var(--text-caption);color:var(--color-text-muted);line-height:1.55}

/* ------------------------------------------------------ Bâtiments */
.imm-bldg__head{
  display:flex;gap:var(--space-4);align-items:flex-start;justify-content:space-between;
  flex-wrap:wrap;margin-bottom:var(--space-4);
}
.imm-bldg__addr{font-size:var(--text-body-s);color:var(--color-text-muted);margin-top:var(--space-1)}
.imm-bldg__note{font-size:var(--text-caption);color:var(--color-text-muted);line-height:1.55;margin-top:var(--space-4)}

/* ------------------------------------------------------- Urbanisme */
.imm-zones{display:grid;gap:var(--space-4)}
.imm-zone{display:grid;gap:var(--space-2);padding:var(--space-4);border:var(--border);border-radius:var(--radius-lg)}
.imm-zone__head{display:flex;gap:var(--space-3);align-items:center;flex-wrap:wrap}
.imm-zone__code{
  display:inline-grid;place-items:center;min-width:44px;height:28px;padding:0 var(--space-2);
  border-radius:var(--radius-sm);background:var(--color-text-primary);color:var(--color-bg);
  font-family:var(--font-mono);font-size:var(--text-mono);font-weight:var(--fw-semibold);
}
.imm-zone__label{font-size:var(--text-body-m);font-weight:var(--fw-semibold);letter-spacing:-.01em}
.imm-zone__desc{font-size:var(--text-body-s);color:var(--color-text-secondary);line-height:1.55}
.imm-check-line__icon--info{
  background:var(--color-bg-subtle);border-color:var(--color-border);color:var(--color-text-secondary);
}

/* ------------------------------------- Annonces BODACC dans une fiche société */
.imm-firm__ads{
  display:grid;gap:var(--space-2);margin-top:var(--space-3);padding-top:var(--space-3);
  border-top:var(--border-subtle);
}
.imm-firm__adstitle{
  font-size:var(--text-caption);font-weight:var(--fw-semibold);
  text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted);
}
.imm-firm__ad{
  display:grid;grid-template-columns:96px minmax(0,1fr);gap:var(--space-3);
  font-size:var(--text-body-s);align-items:baseline;
}
.imm-firm__ad>span:first-child{color:var(--color-text-muted);font-variant-numeric:tabular-nums}
@media (max-width:520px){
  .imm-firm__ad{grid-template-columns:1fr;gap:2px}
}

/* ============================================================
   SURVOL DES COMPOSANTS CLIQUABLES
   `a:hover` (élément + pseudo-classe) a une spécificité supérieure à une
   simple classe : la règle générique du design system l'emportait donc sur
   `.imm-btn--primary`, repeignant en noir le texte d'un bouton à fond noir
   et le soulignant par-dessus le marché. On restaure ici, à spécificité
   suffisante, la couleur propre à chaque variante.
   ============================================================ */
a[class*="imm-"]:hover{text-decoration:none}
a.imm-btn--primary:hover{color:var(--color-action-text)}
a.imm-btn--secondary:hover{color:var(--color-text-primary)}
a.imm-btn--outline:hover{color:var(--color-text-primary)}
a.imm-btn--ghost:hover{color:var(--color-text-primary)}
a.imm-btn--accent:hover{color:var(--color-text-on-accent)}
a.imm-btn--danger:hover{color:#fff}
/* Le bouton « lien » est le seul à garder son soulignement : c'est ce qui le
   signale comme lien, il n'a ni fond ni bordure. */
a.imm-btn--link:hover{color:var(--color-text-primary);text-decoration:underline;text-underline-offset:2px}
a.imm-iconbtn:hover{color:var(--color-text-primary)}
a.imm-iconbtn--solid:hover{color:var(--color-action-text)}
a.imm-cite:hover{color:var(--color-text-primary)}
a.imm-tab:hover{color:var(--color-text-primary)}

/* ------------------------------------------------ Montant des transactions */
.imm-volume__lede{font-size:var(--text-body-m);color:var(--color-text-secondary);line-height:1.6;margin-bottom:var(--space-5)}
.imm-volume__lede strong{color:var(--color-text-primary);font-weight:var(--fw-semibold)}
.imm-volume__note{font-size:var(--text-caption);color:var(--color-text-muted);line-height:1.55;margin-top:var(--space-4)}

/* ---------------------------------------------- Profil de la commune */
.imm-ages{display:grid;gap:var(--space-2);margin-top:var(--space-5)}
.imm-age{display:grid;grid-template-columns:96px minmax(0,1fr) 48px;gap:var(--space-3);align-items:center;font-size:var(--text-body-s)}
.imm-age__label{color:var(--color-text-secondary)}
.imm-age__bar{height:8px;border-radius:var(--radius-full);background:var(--color-bg-subtle);border:var(--border-subtle);overflow:hidden}
.imm-age__bar span{display:block;height:100%;background:var(--color-text-primary)}
.imm-age__value{text-align:right;font-variant-numeric:tabular-nums;color:var(--color-text-primary)}
@media (max-width:520px){
  .imm-age{grid-template-columns:84px minmax(0,1fr) 44px;gap:var(--space-2)}
}

/* ------------------------------------------- Comparatif des voisines */
.imm-table tr[data-reference]{background:var(--color-surface-sunken)}
.imm-table tr[data-reference] th,.imm-table tr[data-reference] td{font-weight:var(--fw-semibold)}
.imm-voisin__dep{
  margin-left:var(--space-2);padding:1px 6px;border-radius:var(--radius-full);
  background:var(--color-bg-subtle);border:var(--border-subtle);
  font-size:10px;color:var(--color-text-muted);font-variant-numeric:tabular-nums;
}
/* Écart de prix entre communes voisines. Le repère est l'acheteur : moins cher que la
   commune consultée = vert, plus cher = rouge, équivalent = orange. */
.imm-ecart{
  display:inline-flex;flex-direction:column;align-items:flex-end;gap:1px;
  padding:3px 9px;border-radius:var(--radius-md);
  font-variant-numeric:tabular-nums;font-weight:var(--fw-medium);
  color:var(--color-text-secondary);line-height:1.25;
}
/* Le mot lève l'ambiguïté du signe : « +12 % » ne dit pas, seul, si la commune est
   plus chère ou meilleur marché que celle que l'on consulte. */
.imm-ecart small{font-size:var(--text-caption);font-weight:var(--fw-regular);opacity:.85;white-space:nowrap}
.imm-ecart[data-ton="bas"]{background:var(--color-success-bg);color:var(--color-success)}
.imm-ecart[data-ton="haut"]{background:var(--color-danger-bg);color:var(--color-danger)}
.imm-ecart[data-ton="egal"]{background:var(--color-warning-bg);color:var(--color-warning)}

/* Répartition des étiquettes énergie du parc communal.
   La barre est un bloc à part entière : une hauteur en pourcentage n'a aucun effet sur
   un élément en ligne, et l'histogramme restait invisible. */
.imm-dpebars{display:flex;gap:6px;align-items:stretch;height:180px}
/* Colonne en flex, et non en grille : la piste doit recevoir une hauteur DÉFINIE,
   sans quoi la hauteur en pourcentage de la barre ne se résout pas et toutes les
   colonnes se ressemblent. */
.imm-dpebar{flex:1;display:flex;flex-direction:column;gap:6px;align-items:center;min-width:0}
.imm-dpebar__track{flex:1;width:100%;display:flex;align-items:flex-end;min-height:0}
.imm-dpebar__fill{width:100%;border-radius:var(--radius-xs) var(--radius-xs) 0 0;min-height:2px}
.imm-dpebar__pct{font-size:10px;color:var(--color-text-faint);font-variant-numeric:tabular-nums}

/* Lettre d'étiquette énergie sous l'histogramme du parc. */
.imm-dpebar__letter{
  display:grid;place-items:center;min-width:20px;height:18px;padding:0 5px;
  border-radius:var(--radius-xs);font-size:var(--text-caption);font-weight:var(--fw-semibold);
  line-height:1;
  /* Blanc sur toute l'échelle, y compris sur le jaune : une ombre portée assure la
     lisibilité là où le fond est clair. */
  color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.45);
}

/* Unité accolée au prix, dans les barres par nombre de pièces. */
.imm-room__unit{margin-left:2px;font-size:.8em;font-weight:400;color:var(--color-text-muted)}

/* ------------------------------------------------- Diagnostic des API */
.imm-diag{display:grid;gap:var(--space-3)}
.imm-diag__item{
  display:grid;gap:var(--space-2);padding:var(--space-4);
  border:var(--border);border-radius:var(--radius-lg);border-left-width:3px;
}
.imm-diag__item[data-tone="success"]{border-left-color:var(--color-success)}
.imm-diag__item[data-tone="warning"]{border-left-color:var(--color-warning)}
.imm-diag__item[data-tone="danger"]{border-left-color:var(--color-danger)}
.imm-diag__head{display:flex;gap:var(--space-3);align-items:center;justify-content:space-between;flex-wrap:wrap}
.imm-diag__name{font-size:var(--text-body-m);font-weight:var(--fw-semibold);letter-spacing:-.01em}
.imm-diag__ms{font-size:var(--text-caption);color:var(--color-text-muted);font-variant-numeric:tabular-nums}
.imm-diag__verdict{font-size:var(--text-body-s);color:var(--color-text-secondary)}
.imm-diag__note{
  font-size:var(--text-caption);color:var(--color-text-secondary);line-height:1.5;
  padding:var(--space-2) var(--space-3);border-radius:var(--radius-sm);background:var(--color-bg-subtle);
  font-family:var(--font-mono);word-break:break-word;
}
.imm-diag__details summary{
  font-size:var(--text-caption);color:var(--color-text-muted);cursor:pointer;
  list-style:none;display:inline-flex;align-items:center;gap:var(--space-2);
}
.imm-diag__details summary::before{content:"▸"}
.imm-diag__details[open] summary::before{content:"▾"}
.imm-diag__url,.imm-diag__body{
  font-family:var(--font-mono);font-size:11px;line-height:1.5;word-break:break-all;
  margin-top:var(--space-2);padding:var(--space-3);border-radius:var(--radius-sm);
  background:var(--color-surface-sunken);border:var(--border-subtle);color:var(--color-text-secondary);
}
.imm-diag__body{white-space:pre-wrap;max-height:200px;overflow:auto}
.imm-bloc-echec{
  font-size:var(--text-body-s);color:var(--color-text-muted);line-height:1.6;
  padding:var(--space-4);border:var(--border-subtle);border-radius:var(--radius-lg);
  background:var(--color-bg-subtle);
}

/* ------------------------------------------ Analyse rédigée du marché */
.imm-analyse{display:grid;gap:var(--space-6)}
.imm-analyse__bloc{display:grid;gap:var(--space-3)}
.imm-analyse__titre{
  font-size:var(--text-body-l);font-weight:var(--fw-semibold);letter-spacing:-.01em;
  color:var(--color-text-primary);
}
.imm-analyse p{
  font-size:var(--text-body-m);line-height:1.7;color:var(--color-text-secondary);
  max-width:74ch;
}

/* ------------------------------- Repères de carte et fond d'attente */
.imm-pin{background:none;border:0}
.imm-pin__dot{
  display:grid;place-items:center;width:26px;height:26px;border-radius:var(--radius-full);
  background:#fff;border:1px solid rgba(0,0,0,.28);box-shadow:0 2px 6px rgba(0,0,0,.35);
  color:#111;font-size:11px;font-weight:600;line-height:1;font-variant-numeric:tabular-nums;
}
/* Repère blanc au centre, visible tant que la carte n'est pas montée. */
.imm-agencymap__placeholder{
  position:absolute;top:50%;left:50%;width:26px;height:26px;margin:-13px 0 0 -13px;
  border-radius:var(--radius-full);background:#fff;border:1px solid rgba(0,0,0,.28);
  box-shadow:0 2px 6px rgba(0,0,0,.35);
}
.imm-agencymap .leaflet-container ~ .imm-agencymap__placeholder,
.imm-agencymap:has(.leaflet-container) .imm-agencymap__placeholder{display:none}

/* ---------------------------------------------------- Contenu dépliable
   Le repli tient à une case à cocher : le texte est dans le HTML dès le premier
   rendu — donc lisible par un moteur de recherche — et le pli fonctionne sans
   la moindre ligne de JavaScript. */
.imm-deplier__contenu{
  display:grid;gap:var(--space-6);
  max-height:0;overflow:hidden;opacity:0;
  transition:max-height var(--duration-slow,.4s) var(--ease-out),opacity var(--duration-fast) var(--ease-out);
}
.imm-deplier__etat:checked ~ .imm-deplier__contenu{max-height:400rem;opacity:1;margin-top:var(--space-6)}
.imm-deplier__bouton{
  display:inline-flex;align-items:center;gap:var(--space-2);align-self:start;
  margin-top:var(--space-4);padding:8px 14px;cursor:pointer;
  border:var(--border);border-radius:var(--radius-full);background:var(--color-surface);
  font-size:var(--text-body-s);font-weight:var(--fw-medium);color:var(--color-text-primary);
  transition:var(--transition-colors);
}
.imm-deplier__bouton:hover{background:var(--color-surface-hover);border-color:var(--color-border-strong)}
.imm-deplier__bouton [data-deplie],
.imm-deplier__etat:checked ~ .imm-deplier__bouton [data-replie]{display:none}
.imm-deplier__etat:checked ~ .imm-deplier__bouton [data-deplie]{display:inline-flex;align-items:center;gap:var(--space-2)}
.imm-deplier__bouton [data-replie]{display:inline-flex;align-items:center;gap:var(--space-2)}
@media (prefers-reduced-motion:reduce){
  .imm-deplier__contenu{transition:none}
}

/* ------------------------------------------------- Portrait du parc */
.imm-parc{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--space-6)}
.imm-parc__col{display:grid;gap:var(--space-3);align-content:start}
.imm-parc__titre{
  display:flex;align-items:center;gap:var(--space-2);
  font-size:var(--text-body-m);font-weight:var(--fw-semibold);letter-spacing:-.01em;
}
.imm-parc__n{margin-left:auto;font-size:var(--text-caption);font-weight:400;color:var(--color-text-muted)}

/* ============================================================
   CARTE — réglages, filtres et rendu MapLibre
   ============================================================ */
/* MapLibre applique sa propre classe .maplibregl-map au conteneur, avec
   position:relative. À spécificité égale, sa feuille — chargée depuis le CDN après la
   nôtre — l'emportait : le conteneur repassait en relative, perdait sa hauteur et
   tombait à 0 px. La carte était alors invisible, sans la moindre erreur JavaScript.
   On passe donc à une spécificité supérieure et on fixe la hauteur explicitement. */
.imm-map .imm-map__canvas,.imm-map>.imm-map__canvas{position:absolute;inset:0;width:100%;height:100%}
.imm-map__noscript{position:absolute;top:96px;left:var(--space-4);right:var(--space-4);max-width:520px;z-index:2}
.imm-map__panne{position:absolute;top:96px;left:50%;transform:translateX(-50%);width:min(560px,calc(100% - var(--space-8)));z-index:4}
.imm-map__panne[hidden]{display:none}

/* Le panneau de réglages : trois familles de choix, visuellement séparées. */
.imm-mapkit{
  position:absolute;top:76px;left:var(--space-4);z-index:3;width:264px;max-width:calc(100% - var(--space-8));
  display:grid;gap:0;border:var(--border);border-radius:var(--radius-lg);overflow:hidden;
  background:var(--color-surface);box-shadow:var(--shadow-2);
  max-height:calc(100% - 200px);
}
/* `display:grid` l'emporterait sur l'attribut hidden : on le rétablit. */
.imm-mapkit[hidden]{display:none}
.imm-mapkit__toggle{
  display:flex;align-items:center;gap:var(--space-2);width:100%;padding:10px var(--space-4);
  background:var(--color-surface);border:0;border-bottom:var(--border-subtle);cursor:pointer;
  font-size:var(--text-body-s);font-weight:var(--fw-semibold);color:var(--color-text-primary);
}
.imm-mapkit__toggle:hover{background:var(--color-surface-hover)}
.imm-mapkit__body{display:grid;gap:var(--space-4);padding:var(--space-4);overflow-y:auto}
.imm-mapkit__body[hidden]{display:none}
.imm-mapkit__bloc{display:grid;gap:var(--space-2)}
.imm-mapkit__bloc h3{
  font-size:10px;font-weight:var(--fw-semibold);text-transform:uppercase;letter-spacing:.07em;
  color:var(--color-text-muted);
}
.imm-mapkit__actions{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;margin-top:var(--space-1)}
.imm-mapkit__compte{font-size:var(--text-caption);color:var(--color-text-muted)}

/* Groupes de boutons radio : un segment par choix. */
.imm-segbtn{display:flex;gap:2px;padding:2px;border-radius:var(--radius-md);background:var(--color-bg-subtle)}
.imm-segbtn--stack{flex-direction:column}
.imm-segbtn button{
  flex:1;display:flex;align-items:center;justify-content:center;gap:6px;
  padding:7px 8px;border:0;border-radius:var(--radius-sm);background:transparent;cursor:pointer;
  font-family:var(--font-ui);font-size:var(--text-caption);font-weight:var(--fw-medium);
  color:var(--color-text-secondary);transition:var(--transition-colors);
}
.imm-segbtn--stack button{justify-content:flex-start;flex-direction:column;align-items:flex-start;gap:1px}
.imm-segbtn button:hover{color:var(--color-text-primary)}
.imm-segbtn button[aria-checked="true"]{
  background:var(--color-surface);color:var(--color-text-primary);box-shadow:var(--shadow-1);
}
.imm-segbtn__aide{font-size:10px;font-weight:400;color:var(--color-text-muted)}

/* Repères : cases à cocher présentées en pastilles. */
.imm-checks-inline{display:flex;flex-wrap:wrap;gap:6px}
/* La pastille EST l'étiquette : sans boîte propre, le label restait un élément en ligne
   plus haut que sa pastille, et un clic près du bord tombait à côté de la case. */
.imm-checkchip{display:inline-flex;position:relative}
.imm-checkchip input{position:absolute;inset:0;opacity:0;pointer-events:none}
.imm-checkchip span{
  display:inline-flex;align-items:center;gap:5px;padding:5px 10px;cursor:pointer;
  border:var(--border);border-radius:var(--radius-full);background:var(--color-surface);
  font-size:var(--text-caption);color:var(--color-text-secondary);transition:var(--transition-colors);
}
.imm-checkchip span:hover{border-color:var(--color-border-strong);color:var(--color-text-primary)}
.imm-checkchip input:checked + span{
  background:var(--color-text-primary);border-color:var(--color-text-primary);color:var(--color-bg);
}
.imm-checkchip input:focus-visible + span{outline:2px solid var(--color-accent);outline-offset:2px}

/* Bornes numériques des filtres. */
.imm-filtre{display:grid;gap:5px}
.imm-filtre__nom{font-size:var(--text-caption);color:var(--color-text-secondary)}
.imm-filtre__paire{display:flex;align-items:center;gap:6px}
.imm-filtre__paire em{color:var(--color-text-faint);font-style:normal}
.imm-filtre__paire label{
  flex:1;display:flex;align-items:center;gap:3px;min-width:0;padding:5px 8px;
  border:var(--border);border-radius:var(--radius-sm);background:var(--color-surface);
}
.imm-filtre__paire input{
  width:100%;min-width:0;border:0;background:none;padding:0;
  font-family:var(--font-ui);font-size:var(--text-caption);color:var(--color-text-primary);
  font-variant-numeric:tabular-nums;
}
.imm-filtre__paire input:focus{outline:none}
.imm-filtre__paire label:focus-within{border-color:var(--color-text-primary)}
.imm-filtre__paire span{font-size:10px;color:var(--color-text-muted);flex:none}
/* Les flèches natives volent la place dans un champ de 60 px. */
.imm-filtre__paire input::-webkit-outer-spin-button,
.imm-filtre__paire input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.imm-filtre__paire input[type=number]{-moz-appearance:textfield}

/* Infobulles MapLibre, aux couleurs du site. */
.maplibregl-popup-content{
  padding:var(--space-3) var(--space-4);border-radius:var(--radius-lg);
  background:var(--color-surface);color:var(--color-text-primary);
  box-shadow:var(--shadow-3);font-family:var(--font-ui);
}
.maplibregl-popup-tip{border-top-color:var(--color-surface)!important;border-bottom-color:var(--color-surface)!important}
.maplibregl-popup-close-button{color:var(--color-text-muted);font-size:16px;padding:0 6px}
.imm-mappop{display:grid;gap:2px;font-size:var(--text-body-s)}
.imm-mappop strong{font-size:var(--text-body-m);font-weight:var(--fw-semibold)}
.imm-mappop__prix{margin-top:4px;font-weight:var(--fw-semibold);font-variant-numeric:tabular-nums}
.imm-mappop__prix span{font-weight:400;color:var(--color-text-muted)}
.imm-mappop__date{font-size:var(--text-caption);color:var(--color-text-muted)}
.maplibregl-ctrl-attrib{font-size:10px}
.maplibregl-ctrl-group{border-radius:var(--radius-md);box-shadow:var(--shadow-2)}

@media (max-width:900px){
  .imm-mapkit{top:auto;bottom:var(--space-4);left:var(--space-4);right:var(--space-4);width:auto;
              max-height:60%}
}
/* La légende occupe le bas de l'écran au centre : la colonne de gauche appartient
   au panneau de réglages, qui doit pouvoir se dérouler en entier. */
.imm-map [data-legende]{position:absolute;bottom:var(--space-4);left:50%;transform:translateX(-50%);z-index:3}
.imm-map [data-legende] .imm-legend{position:static}
.imm-mapkit{max-height:calc(100% - 132px)}
@media (max-width:900px){
  .imm-map [data-legende]{display:none}
}

/* Pied de page toujours collé en bas de l'écran, même sur une page courte ------ */
body:not([data-full]) main#contenu{display:flex;flex-direction:column;min-height:calc(100vh - var(--header-h));min-height:calc(100dvh - var(--header-h))}
body:not([data-full]) main#contenu>.imm-view{flex:1 0 auto}
body:not([data-full]) main#contenu>.imm-footer{flex-shrink:0;margin-top:auto}

/* Mention « connexion requise » sur les fonctionnalités murées ------------------ */
.imm-login-note{display:inline-flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;margin:0;font-size:var(--text-body-s);color:var(--color-text-muted)}
.imm-login-note a{font-weight:500;color:var(--color-accent);text-decoration:underline;text-underline-offset:3px}

/* ============================================================
   BARRE DE DÉFILEMENT — verre liquide
   ============================================================
   Le rail reste transparent, seule la poignée existe : un verre teinté, flouté
   par-dessus le contenu qui défile dessous, avec un liseré clair sur le bord
   supérieur pour donner l'épaisseur. WebKit d'abord ; Firefox, qui n'accepte
   pas ces pseudo-éléments, reçoit la version simple de `scrollbar-color`.
   La barre horizontale garde le même traitement. */
/* Pas de @supports ici : `selector(::-webkit-scrollbar)` renvoie faux sur certains
   navigateurs pourtant capables de styler la barre, ce qui désactiverait tout le bloc.
   Un pseudo-élément inconnu est de toute façon ignoré sans dommage. */
html{scrollbar-gutter:stable}
::-webkit-scrollbar{width:12px;height:12px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-corner{background:transparent}
::-webkit-scrollbar-thumb{
    border:3px solid transparent;           /* marge intérieure : la poignée flotte */
    border-radius:var(--radius-full);
    background:color-mix(in srgb,var(--color-text-primary) 22%,transparent);
    background-clip:padding-box;
    box-shadow:inset 0 1px 0 rgb(255 255 255 / .55),
               inset 0 -1px 0 rgb(0 0 0 / .06),
               0 1px 2px rgb(0 0 0 / .12);
    -webkit-backdrop-filter:blur(10px) saturate(160%);
    backdrop-filter:blur(10px) saturate(160%);
    transition:background .18s ease, box-shadow .18s ease;
  }
::-webkit-scrollbar-thumb:hover{
    background:color-mix(in srgb,var(--color-text-primary) 34%,transparent);
    background-clip:padding-box;
  }
::-webkit-scrollbar-thumb:active{
  background:color-mix(in srgb,var(--color-accent) 55%,transparent);
  background-clip:padding-box;
}

/* Firefox : pas de pseudo-éléments, mais une poignée fine et discrète. */
@supports (scrollbar-color: auto) {
  html{
    scrollbar-width:thin;
    scrollbar-color:color-mix(in srgb,var(--color-text-primary) 28%,transparent) transparent;
  }
}

/* En mode sombre, le liseré clair deviendrait un trait blanc : on l'atténue. */
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]) ::-webkit-scrollbar-thumb{
    box-shadow:inset 0 1px 0 rgb(255 255 255 / .16),
               inset 0 -1px 0 rgb(0 0 0 / .22),
               0 1px 2px rgb(0 0 0 / .3);
  }
}
:root[data-theme="dark"] ::-webkit-scrollbar-thumb{
  box-shadow:inset 0 1px 0 rgb(255 255 255 / .16),
             inset 0 -1px 0 rgb(0 0 0 / .22),
             0 1px 2px rgb(0 0 0 / .3);
}

/* Les barres masquées volontairement (onglets, segments) le restent. */
.imm-tabs::-webkit-scrollbar,.imm-seg::-webkit-scrollbar{display:none}

@media print{ ::-webkit-scrollbar{display:none} }
