/* =============================================================================
   Carto — couleurs de données métier
   Consomme public/css/carto-tokens.css.
   =============================================================================

   Ce fichier ne porte plus aucune valeur : il ne fait qu'associer les classes
   déjà utilisées par les pages et par js/belgium.js aux tokens métier. Les
   noms de classes sont inchangés — `belgium_operator_badge_class()` et
   `belgiumFrequencyClass()` continuent de produire exactement les mêmes.

   ── Ce qui change réellement ───────────────────────────────────────────────
   Les couleurs d'opérateur ne bougent pas : ce sont les couleurs de marque
   réelles, conservées sur décision du 10/08/2026.

   Les bandes et les technologies, elles, changent — et c'est le but. Elles
   empruntaient la palette d'états de Bootstrap : `.rf-tech-5g` et
   `.rf-band-2100` étaient le rouge d'erreur, `.rf-tech-4g` et `.rf-band-900`
   le vert de succès, `.rf-band-700` le bleu du bouton d'action. Trois familles
   de couleurs que la charte §3.1 exige de séparer se recouvraient en cinq
   points. Elles ont maintenant leur propre gamme, qui n'appartient ni aux
   états ni au signal.

   ── Contraste ─────────────────────────────────────────────────────────────
   La couleur de texte de chaque pastille est choisie pour tenir les 4,5:1 de
   WCAG AA (charte §10) et non par habitude. C'est ce qui explique le texte
   sombre sur l'orange et sur l'or : en blanc, ces deux-là tombaient autour de
   2,5:1 et n'étaient pas lisibles.
   ========================================================================== */

/* =============================================================================
   1 · Pastilles — forme commune
   ========================================================================== */

.rf-chip {
    display: inline-block;
    padding: 0.125rem var(--carto-space-2);
    border-radius: var(--carto-radius-chip);
    font-size: var(--carto-text-small);
    font-weight: var(--carto-weight-semibold);
    line-height: 1.4;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

.rf-chip-wrap {
    display: inline-flex;
    flex-wrap: wrap;
    gap: var(--carto-space-1);
    align-items: center;
}

/* =============================================================================
   2 · Opérateurs — données métier
   ⚠ MIROIR de inc/belgium_common.inc.php, js/belgium.js et, côté Android, de
   CartoColors dans ui/theme/Theme.kt.
   ========================================================================== */

.back-Proximus      { background-color: var(--carto-operator-proximus) !important;      color: #FFF !important; }
.back-Proximus-temp { background-color: var(--carto-operator-proximus-temp) !important; color: var(--carto-night) !important; }

/* Texte sombre : le blanc sur cet orange tombe à ~2,6:1. */
.back-Orange        { background-color: var(--carto-operator-orange) !important;        color: var(--carto-night) !important; }
.back-Orange-temp   { background-color: var(--carto-operator-orange-temp) !important;   color: var(--carto-night) !important; }

.back-Telenet       { background-color: var(--carto-operator-telenet) !important;       color: var(--carto-night) !important; }
.back-Telenet-temp  { background-color: var(--carto-operator-telenet-temp) !important;  color: var(--carto-night) !important; }

.back-digi          { background-color: var(--carto-operator-digi) !important;          color: #FFF !important; }
.back-digi-temp     { background-color: var(--carto-operator-digi-temp) !important;     color: var(--carto-night) !important; }

/* Repli : opérateur non reconnu, SNCB / Infrabel. */
.back-black         { background-color: var(--carto-operator-sncb) !important;          color: #FFF !important; }

/* Site porté par plusieurs opérateurs. */
.back-multi         { background-color: var(--carto-operator-multi) !important;         color: #FFF !important; }

/* =============================================================================
   2 bis · Régions — données métier
   Ces pastilles étaient réécrites à huit endroits — cinq tables de couleurs en
   JS ou en PHP, trois écritures directes en balisage — sous la forme de classes
   d'état de Bootstrap. Aucune n'était dans le système, et elles ne s'accordaient
   pas sur l'encre. Elle est ici choisie par la mesure, pas par habitude.
   ========================================================================== */

.rf-region-ibge     { background: var(--carto-region-ibge);     color: var(--carto-night); }
.rf-region-lne      { background: var(--carto-region-lne);      color: var(--carto-night); }
/* Blanc et non l'encre sombre : mesuré, le vert wallon donne 4,53:1 en blanc
   contre 4,09:1 en bleu nuit. */
.rf-region-wallonie { background: var(--carto-region-wallonie); color: #FFF; }
.rf-region-unknown  { background: var(--carto-region-unknown);  color: #FFF; }

/* La Belgique entière n'est pas une région mais elle prend place dans les mêmes
   séries de pastilles et d'en-têtes. Elle emprunte la surface pleine, qui
   bascule — `bg-dark` la figeait sur #212529. */
.rf-region-belgium  { background: var(--carto-surface-strong); color: var(--carto-text-on-inverse); }

/* Les mêmes teintes en bordure : les cartes de la page d'accueil et des
   statistiques encadraient chaque région avec `border-info` / `border-warning`
   / `border-success`, c'est-à-dire avec des couleurs d'état. */
.border-region-ibge     { border-color: var(--carto-region-ibge) !important; }
.border-region-lne      { border-color: var(--carto-region-lne) !important; }
.border-region-wallonie { border-color: var(--carto-region-wallonie) !important; }
.border-region-belgium  { border-color: var(--carto-border-strong) !important; }

/* Les grands compteurs de la page d'accueil. Écrits en `text-warning` /
   `text-info` / `text-success`, ils prenaient la couleur *vive* de l'état —
   1,5:1 pour l'ambre sur fond clair. La teinte de région ne convient pas
   davantage à du texte : ces trois-là empruntent l'encre d'état correspondante,
   qui est faite pour être lue et qui bascule. */
.text-region-ibge     { color: var(--carto-status-warning-text) !important; }
.text-region-lne      { color: var(--carto-data-live-text) !important; }
.text-region-wallonie { color: var(--carto-status-success-text) !important; }

/* Boutons d'accès par région : mêmes teintes, en contour. */
.btn-outline-region-ibge,
.btn-outline-region-lne,
.btn-outline-region-wallonie {
    --bs-btn-color:              var(--carto-text-primary);
    --bs-btn-hover-color:        var(--carto-night);
    --bs-btn-active-color:       var(--carto-night);
    --bs-btn-bg:                 transparent;
}
.btn-outline-region-ibge {
    --bs-btn-border-color: var(--carto-region-ibge);
    --bs-btn-hover-bg: var(--carto-region-ibge);
    --bs-btn-hover-border-color: var(--carto-region-ibge);
    --bs-btn-active-bg: var(--carto-region-ibge);
}
.btn-outline-region-lne {
    --bs-btn-border-color: var(--carto-region-lne);
    --bs-btn-hover-bg: var(--carto-region-lne);
    --bs-btn-hover-border-color: var(--carto-region-lne);
    --bs-btn-active-bg: var(--carto-region-lne);
}
.btn-outline-region-wallonie {
    --bs-btn-border-color: var(--carto-region-wallonie);
    --bs-btn-hover-bg: var(--carto-region-wallonie);
    --bs-btn-hover-border-color: var(--carto-region-wallonie);
    --bs-btn-active-bg: var(--carto-region-wallonie);
}

/* =============================================================================
   3 · Bandes de fréquence — données métier
   Rampe violette du grave à l'aigu : elle se lit comme une échelle ordonnée,
   ce que huit couleurs indépendantes ne permettaient pas. Les trois teintes
   les plus claires reçoivent du texte sombre, faute de quoi elles tombent
   sous 4,5:1.
   ========================================================================== */

.rf-band-700     { background: var(--carto-band-700);     color: #FFF; }
.rf-band-800     { background: var(--carto-band-800);     color: #FFF; }
.rf-band-900     { background: var(--carto-band-900);     color: #FFF; }
.rf-band-1400    { background: var(--carto-band-1400);    color: #FFF; }
.rf-band-1800    { background: var(--carto-band-1800);    color: #FFF; }
.rf-band-2100    { background: var(--carto-band-2100);    color: #FFF; }
.rf-band-2600    { background: var(--carto-band-2600);    color: var(--carto-night); }
.rf-band-3500    { background: var(--carto-band-3500);    color: var(--carto-night); }
.rf-band-generic { background: var(--carto-band-generic); color: #FFF; }

/* =============================================================================
   4 · Technologies — données métier
   Charte §3.7 : un badge de technologie ne doit pas reprendre les couleurs des
   niveaux de signal. Rampe sarcelle, distincte à la fois du signal, des états
   et du cyan de marque.
   ========================================================================== */

.rf-tech-2g { background: var(--carto-tech-2g); color: #FFF; }
.rf-tech-3g { background: var(--carto-tech-3g); color: #FFF; }
.rf-tech-4g { background: var(--carto-tech-4g); color: #FFF; }
.rf-tech-5g { background: var(--carto-tech-5g); color: var(--carto-night); }

/* =============================================================================
   5 · Qualité du signal — état, pas donnée métier
   Absente du Web jusqu'ici. Déclarée pour que les mesures remontées par
   l'application Android aient déjà leur représentation le jour où elles sont
   affichées côté Web, et pour que cette représentation soit la même.
   ========================================================================== */

.rf-signal-excellent { background: var(--carto-signal-excellent); color: #FFF; }
.rf-signal-good      { background: var(--carto-signal-good);      color: var(--carto-night); }
.rf-signal-medium    { background: var(--carto-signal-medium);    color: var(--carto-night); }
.rf-signal-weak      { background: var(--carto-signal-weak);      color: var(--carto-night); }
.rf-signal-critical  { background: var(--carto-signal-critical);  color: #FFF; }
.rf-signal-unknown   { background: var(--carto-signal-unknown);   color: var(--carto-night); }

/* Pastilles de la légende du relief radio — Web 0.5.2.
   Elles **rappellent** la couleur d'une classe ; elles ne la portent jamais
   seules. Chaque pastille est suivie du libellé de la classe et de ses bornes
   en dBm, et elle est marquée `aria-hidden` : sans elle, la légende se lit
   intégralement. C'est ce qui permet de lire la carte sans distinguer les
   teintes, ou imprimée en noir et blanc. */
.rf-band-swatch {
    display: inline-block;
    width: 0.85rem;
    height: 0.85rem;
    border-radius: 2px;
    /* Un liseré : sur un fond clair, un aplat jaune pâle sans bordure
       disparaît, et la pastille cesse même de rappeler quoi que ce soit. */
    border: 1px solid var(--carto-border-strong);
    flex: 0 0 auto;
}

.rf-band-very-strong { background: var(--carto-signal-very-strong); }
.rf-band-strong      { background: var(--carto-signal-strong); }
.rf-band-medium      { background: var(--carto-signal-medium); }
.rf-band-weak        { background: var(--carto-signal-weak); }
.rf-band-very-weak   { background: var(--carto-signal-very-weak); }

/* ── Pastille de la légende des rôles ────────────────────────────────────────

   Elle reproduit le marqueur de la carte : même rayon, même épaisseur de
   contour, même opacité, et le tiret de la porteuse secondaire. Les quatre
   valeurs sont passées en propriétés personnalisées depuis
   `radio_role_map_styles()` — la table qui style aussi les marqueurs. Les
   écrire en dur ici ferait une seconde table, et c'est elle qui aurait fini par
   décrire des symboles que la carte ne dessine plus.

   Le remplissage reste transparent : ce qui est légendé ici est le **contour**,
   c'est-à-dire le rôle. Lui donner une couleur de signal laisserait croire à un
   lien entre les deux dimensions, qui n'en ont aucun. */
.rf-role-swatch {
    display: inline-block;
    flex: 0 0 auto;
    width: var(--rf-role-size, 12px);
    height: var(--rf-role-size, 12px);
    border-radius: 50%;
    border-style: solid;
    border-width: var(--rf-role-weight, 1px);
    border-color: var(--rf-role-color, var(--carto-border-strong));
    opacity: var(--rf-role-opacity, 1);
    background: transparent;
}

.rf-role-swatch-dashed { border-style: dashed; }

/* Pastille de **qualité de localisation**.

   Elle représente le halo d'incertitude, et non le marqueur : un anneau
   discontinu autour d'un point atténué, exactement ce que la carte dessine
   autour d'une observation dont la précision déclarée dépasse le seuil.

   La distinction ne tient pas à la couleur — c'est la **présence de l'anneau**
   qui sépare une observation exploitable d'une observation informative, et elle
   reste lisible en niveaux de gris, à l'impression et pour un daltonien. */
.rf-quality-swatch {
    display: inline-block;
    flex: 0 0 auto;
    position: relative;
    width: 18px;
    height: 18px;
}

.rf-quality-swatch::before {
    content: '';
    position: absolute;
    inset: 50% auto auto 50%;
    width: 8px;
    height: 8px;
    margin: -4px 0 0 -4px;
    border-radius: 50%;
    background: var(--carto-border-strong);
    opacity: var(--rf-quality-opacity, 1);
}

/* L'anneau n'existe que pour les états qui en portent un sur la carte. */
.rf-quality-swatch-halo::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: 50%;
    border: 1px dashed var(--carto-observation-imprecise);
    background: color-mix(in srgb, var(--carto-observation-imprecise) 5%, transparent);
}

/* =============================================================================
   7 · Vérité terrain sur la carte — Web 0.5.3

   Le site confirmé par un humain doit se voir **sans ouvrir sa popup**, y
   compris posé sur un aplat vert du relief radio, en thème sombre, et au
   milieu de trois candidats à cinquante mètres.

   Trois dimensions le portent, jamais la couleur seule (charte §3.1 et
   accessibilité) : une **forme** carrée à coins arrondis là où les candidats
   sont des disques, une **coche** dessinée dans le marqueur, et un **anneau**
   blanc qui l'isole de tout fond. Imprimé en noir et blanc, il reste le seul
   marqueur carré à coche de la carte.
   ========================================================================== */

.rf-gt-marker {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    /* Ni un disque (les candidats le sont) ni un carré net (les secteurs le
       seraient) : un carré très arrondi, reconnaissable au premier coup d'œil
       et à petite taille. */
    border-radius: 7px;
    background: var(--carto-gt-confirmed);
    /* L'anneau est ce qui le détache d'un aplat vert du relief : sans lui, un
       marqueur vert sur une zone verte disparaîtrait. */
    border: 3px solid var(--carto-gt-confirmed-ring);
    box-shadow: 0 0 0 1.5px var(--carto-night), var(--carto-elevation-2);
    color: var(--carto-gt-confirmed-ink);
    font-size: 15px;
    font-weight: 700;
    line-height: 1;
}

/* La variante incertaine ne reçoit **pas** le poids du confirmé : une
   hypothèse et une validation ne se lisent pas de la même façon. Plus petite,
   ambre, et marquée « ? » plutôt que d'une coche. */
.rf-gt-marker--uncertain {
    width: 20px;
    height: 20px;
    border-radius: 6px;
    border-width: 2px;
    background: var(--carto-gt-uncertain);
    color: var(--carto-night);
    font-size: 12px;
}

/* Pastille de légende, même vocabulaire que le marqueur. */
.rf-gt-swatch {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1rem;
    height: 1rem;
    border-radius: 5px;
    background: var(--carto-gt-confirmed);
    border: 2px solid var(--carto-gt-confirmed-ring);
    box-shadow: 0 0 0 1px var(--carto-border-strong);
    color: var(--carto-gt-confirmed-ink);
    font-size: 0.6rem;
    font-weight: 700;
    flex: 0 0 auto;
}

/* Ligne de la table des candidats portant le site confirmé. Un liseré à
   gauche, pas un fond : un fond coloré sur une ligne de tableau entre en
   concurrence avec les badges qu'elle contient déjà. */
.rf-gt-row-confirmed {
    border-left: 4px solid var(--carto-gt-confirmed);
}

.rf-gt-row-rejected {
    border-left: 4px solid var(--carto-gt-rejected);
}

.rf-gt-row-uncertain {
    border-left: 4px solid var(--carto-gt-uncertain);
}

/* =============================================================================
   6 · Inspection des mesures d'une session
   La fiche session porte désormais, sous la carte, une ligne par mesure. Ces
   règles servent la **synchronisation** : dire quelle ligne est sélectionnée,
   et rendre les en-têtes de groupe cliquables sans les déguiser en boutons.

   Aucune couleur littérale : tout passe par les tokens, donc tout suit le
   thème sombre. Charte §3.1.
   ========================================================================== */

/* En-tête de groupe SIM / réseau : un bouton, mais qui doit lire comme un
   titre de section. */
.carto-group-toggle {
    background: var(--carto-surface-secondary);
    color: var(--carto-text-default);
    border-bottom: 1px solid var(--carto-border-default) !important;
}

.carto-group-toggle:hover,
.carto-group-toggle:focus-visible {
    background: var(--carto-surface-hover);
    color: var(--carto-text-default);
}

/* Ligne sélectionnée.
   ── Pourquoi une bordure et pas seulement un fond ────────────────────────────
   Un état signalé par la seule couleur de fond est invisible pour qui ne la
   distingue pas. La barre à gauche donne un second signal, de forme, et
   `aria-selected` en donne un troisième, pour les lecteurs d'écran. */
.carto-measure-row.is-selected > td {
    background: var(--carto-surface-hover) !important;
    box-shadow: inset 3px 0 0 0 var(--carto-brand-primary);
}

/* Le focus clavier doit rester visible sur une ligne de tableau, que Bootstrap
   ne prévoit pas comme cible focalisable. */
.carto-measure-row:focus-visible {
    outline: 2px solid var(--carto-brand-primary);
    outline-offset: -2px;
}

.carto-measure-row {
    cursor: pointer;
}

/* Sur petit écran, un tableau de sept colonnes ne tient pas. Les colonnes
   secondaires — position, canal, signal — passent sous la première, et la
   ligne devient un bloc lisible plutôt qu'un tableau à faire défiler
   horizontalement. */
@media (max-width: 767.98px) {
    .carto-measure-network table,
    .carto-measure-network thead,
    .carto-measure-network tbody,
    .carto-measure-network tr,
    .carto-measure-network td {
        display: block;
        width: 100%;
    }

    .carto-measure-network thead {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip: rect(0 0 0 0);
        white-space: nowrap;
    }

    .carto-measure-network tr {
        border-bottom: 1px solid var(--carto-border-default);
        padding: var(--carto-space-2) 0;
    }

    .carto-measure-network td {
        border: 0;
        padding: 0.125rem var(--carto-space-3);
    }

    /* L'intitulé de colonne revient devant la valeur : sans en-tête visible,
       « 4201 » seul ne dit pas qu'il s'agit d'un TAC. */
    .carto-measure-network td::before {
        content: attr(data-label);
        display: block;
        font-size: var(--carto-text-small);
        color: var(--carto-text-secondary);
    }

    .carto-measure-row.is-selected > td {
        box-shadow: none;
    }

    .carto-measure-row.is-selected {
        box-shadow: inset 3px 0 0 0 var(--carto-brand-primary);
        background: var(--carto-surface-hover);
    }
}
