/*
 * BEJOY — Console front /espace
 * Portée de docs/mockup/style.css — couleurs tokenisées (var(--bj-*)),
 * classes préfixées `.bj-`, sélecteurs table scopés à .bj-tablewrap.
 * NE PAS modifier admin.css — ce fichier est indépendant.
 */

/* ── Reset minimal ─────────────────────────────────────── */
/* Plein écran réel : on annule le margin/padding par défaut du <body> (≈8px du
   navigateur) — le thème le faisait avant, mais son CSS est neutralisé sur la
   console. Sans ça, un liseré blanc apparaît sur les 4 côtés. */
html, body.bejoy-espace-body { margin: 0; padding: 0 }
body.bejoy-espace-body { background: var(--bj-bg) }
.bj-shell *,
.bj-shell *::before,
.bj-shell *::after { box-sizing: border-box }

/* ── Shell plein écran ─────────────────────────────────── */
.bj-shell { display: flex; min-height: 100vh; font-family: var(--bj-font); color: var(--bj-text); background: var(--bj-bg); font-size: 14px; -webkit-font-smoothing: antialiased }

/* ── Sidebar ───────────────────────────────────────────── */
.bj-side { width: 248px; background: var(--bj-side-bg); border-right: 1px solid var(--bj-cr); display: flex; flex-direction: column; flex-shrink: 0; position: sticky; top: 0; height: 100vh }
.bj-side__brand { display: flex; align-items: center; gap: 9px; font-weight: 500; font-size: 16px; padding: 16px 16px 6px }
.bj-side__brand .logo { width: 24px; height: 24px; border-radius: 7px; background: var(--bj-clay); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 13px }
.bj-side__nav { flex: 1; overflow-y: auto; padding: 8px 8px 16px }
.bj-grp { font-size: 11px; letter-spacing: .09em; text-transform: uppercase; color: var(--bj-text-3); margin: 14px 10px 5px }
.bj-nav { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 8px; font-size: 13.5px; color: var(--bj-text-2); text-decoration: none; margin-bottom: 1px; transition: background var(--bj-dur-base) var(--bj-ease-out), color var(--bj-dur-base) var(--bj-ease-out) }
.bj-nav i { font-size: 18px }
.bj-nav:hover { background: rgba(51,41,36,.045); color: var(--bj-text) }
/* Badge nav « Demandes » : nombre + clochette. Même définition visuelle que le
   chip « X demandes à traiter » de la barre de filtres Réservations. */
.bj-nav-badge { margin-left: auto; display: inline-flex; align-items: center; justify-content: center; gap: 3px; min-width: 18px; height: 18px; padding: 0 6px; border-radius: 999px; background: var(--bj-text); color: var(--bj-btn-fg); font-size: 11px; font-weight: 500 }
.bj-nav-badge i { font-size: 12px }
.bj-nav-badge__n { font-variant-numeric: tabular-nums; line-height: 1 }
.bj-nav--on { background: rgba(51,41,36,.07); color: var(--bj-text); font-weight: 500 }
.bj-side__foot { border-top: 1px solid var(--bj-cr); padding: 10px }
.bj-side__foot a, .bj-side__foot button { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 8px; font-size: 13.5px; color: var(--bj-text-2); text-decoration: none; width: 100%; text-align: left; background: none; border: 0; cursor: pointer; font-family: inherit }
.bj-side__foot a:hover, .bj-side__foot button:hover { background: rgba(51,41,36,.045); color: var(--bj-text) }
.bj-side__foot i { font-size: 18px }

/* ── Zone de contenu ───────────────────────────────────── */
.bj-content { flex: 1; min-width: 0; background: var(--bj-content-bg); display: flex; flex-direction: column }
.bj-pagebar { display: flex; align-items: center; gap: 14px; padding: 18px 28px 14px; flex-wrap: wrap }
.bj-pagebar h1 { font-size: 22px; font-weight: 600; margin: 0; letter-spacing: -.01em }
.bj-pagebar .spacer { flex: 1 }
.bj-pagebar__actions { display: flex; align-items: center; gap: 8px }
.bj-burger { display: none; background: none; border: 0; font-size: 22px; color: var(--bj-text); cursor: pointer; padding: 0 4px 0 0 }

/* Cloche de notifications (pagebar équipe) : bouton + compteur + panneau déroulant. */
.bj-notif { position: relative; flex-shrink: 0 }
.bj-notif__btn { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; border: 1px solid var(--bj-cr); border-radius: 10px; background: var(--bj-content-bg); color: var(--bj-text); cursor: pointer; transition: background var(--bj-dur-base) var(--bj-ease-out) }
.bj-notif__btn:hover { background: var(--bj-hover) }
.bj-notif__btn i { font-size: 19px }
.bj-notif__count { position: absolute; top: -6px; right: -6px; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px; background: var(--bj-err); color: #fff; font-size: 11px; font-weight: 500; display: inline-flex; align-items: center; justify-content: center; border: 2px solid var(--bj-content-bg) }
.bj-notif__panel { position: absolute; top: calc(100% + 8px); right: 0; width: 344px; max-width: calc(100vw - 32px); background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 14px; box-shadow: 0 12px 34px rgba(51,41,36,.14); z-index: 70; overflow: hidden }
.bj-notif__panel[hidden] { display: none }
.bj-notif__head { display: flex; justify-content: space-between; align-items: center; padding: 13px 15px; border-bottom: 1px solid var(--bj-cr) }
.bj-notif__title { font-size: 14px; font-weight: 500; color: var(--bj-text) }
.bj-notif__mark { background: none; border: 0; font-family: inherit; font-size: 12px; color: var(--bj-text-3); cursor: pointer }
.bj-notif__mark:hover { color: var(--bj-text-2) }
.bj-notif__list { max-height: 380px; overflow-y: auto }
.bj-notif__it { display: flex; gap: 11px; padding: 12px 15px; border-bottom: 1px solid var(--bj-hover); text-decoration: none; color: inherit }
.bj-notif__it:last-child { border-bottom: 0 }
.bj-notif__it:hover { background: var(--bj-hover) }
.bj-notif__it--unread { background: var(--bj-bg) }
.bj-notif__ic { flex-shrink: 0; width: 32px; height: 32px; border-radius: 9px; display: inline-flex; align-items: center; justify-content: center }
.bj-notif__ic i { font-size: 16px }
.bj-notif__ic--demande { background: #EDEAFB; color: #5B48C2 }
.bj-notif__ic--pack { background: #DFF3F0; color: #237A70 }
.bj-notif__ic--paid { background: #E7F7DA; color: #357A2B }
.bj-notif__ic--cancel { background: #FCEAEA; color: #BE3A2B }
.bj-notif__b { min-width: 0; flex: 1 }
.bj-notif__t { display: block; font-size: 13px; color: var(--bj-text) }
.bj-notif__s { display: block; font-size: 12px; color: var(--bj-text-3); margin-top: 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
.bj-notif__dot { flex-shrink: 0; width: 7px; height: 7px; border-radius: 50%; background: var(--bj-err); margin-top: 6px }
.bj-notif__empty { padding: 22px 15px; text-align: center; font-size: 13px; color: var(--bj-text-3); margin: 0 }
/* Barre de filtres façon Stripe : DEUX rangées — onglets (chips) puis recherche
   pleine largeur. */
.bj-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding: 0 28px 16px }
/* __tabs et __bar en pleine largeur → forcent leurs DEUX rangées (filtersBar) ; les
   filtres du calendrier (chips enfants directs, sans wrapper) restent en ligne. */
/* `min-width: 0` : sans lui, l'auto-min-size de ce conteneur flex vaut la largeur
   de son contenu → il refuse de rétrécir sous la largeur du segbar, et le
   `__scroll` déborde le viewport au lieu de défiler (bug PWA mobile). */
.bj-filters__tabs { flex: 1 1 100%; min-width: 0; display: flex; align-items: center; gap: 6px; flex-wrap: wrap }
.bj-filters__bar { flex: 1 1 100%; display: flex; align-items: center; gap: 10px }
.bj-filters__bar .bj-search { flex: 1 1 auto; max-width: none }
/* Onglets/chips façon Stripe : inactif = texte simple ; actif = carte blanche
   bordurée + ombre légère (jamais d'aplat espresso). Partagé filtres/périodes/modes. */
.bj-chip { font-size: 13px; padding: 7px 13px; border: 1px solid transparent; border-radius: 8px; background: transparent; color: var(--bj-text-2); text-decoration: none; display: inline-flex; align-items: center; gap: 6px; cursor: pointer; transition: background var(--bj-dur-base) var(--bj-ease-out), color var(--bj-dur-base) var(--bj-ease-out), box-shadow var(--bj-dur-base) var(--bj-ease-out) }
.bj-chip:hover { background: var(--bj-hover); color: var(--bj-text) }
.bj-chip i { font-size: 14px }
.bj-chip--on { background: var(--bj-surface); color: var(--bj-text); border-color: var(--bj-cr); box-shadow: 0 1px 2px rgba(51,41,36,.05); font-weight: 500 }
.bj-chip--on:hover { background: var(--bj-surface); color: var(--bj-text) }
/* ── Contrôle segmenté des filtres d'état (façon Stripe Test/Production) ──
   Conteneur pilule GRIS CLAIR (--bj-hover) padding 3px ; segment actif = carte
   blanche bordée --bj-cr + ombre très discrète, texte 500 (JAMAIS 700) ; inactifs
   = texte secondaire, fond transparent. Hauteur totale 36px = boutons du DS
   (.bj-btn). Le wrapper `__scroll` porte le défilement horizontal mobile (PAS de
   wrap) sans casser l'arrondi ; scrollbar masquée. NB : `.bj-seg` (Réglages) est
   un AUTRE composant — noms distincts, zéro collision. */
.bj-segbar__scroll { max-width: 100%; min-width: 0; flex: 0 1 auto; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; border-radius: 12px }
.bj-segbar__scroll::-webkit-scrollbar { display: none }
.bj-segbar { display: inline-flex; align-items: center; gap: 2px; padding: 3px; min-height: 36px; background: var(--bj-hover); border-radius: 12px; white-space: nowrap }
.bj-segbar__opt { display: inline-flex; align-items: center; gap: 6px; padding: 5px 13px; min-height: 30px; border: 1px solid transparent; border-radius: 9px; background: transparent; font-size: 13px; color: var(--bj-text-2); text-decoration: none; white-space: nowrap; cursor: pointer; -webkit-appearance: none; appearance: none; font-family: inherit; line-height: 1.2; margin: 0; transition: background var(--bj-dur-base) var(--bj-ease-out), color var(--bj-dur-base) var(--bj-ease-out), box-shadow var(--bj-dur-base) var(--bj-ease-out) }
.bj-segbar__opt i { font-size: 14px }
.bj-segbar__opt:hover { color: var(--bj-text); background: rgba(51,41,36,.05) }
.bj-segbar__opt--on, .bj-segbar__opt--on:hover { background: var(--bj-surface); border-color: var(--bj-cr); color: var(--bj-text); font-weight: 500; box-shadow: 0 1px 2px rgba(51,41,36,.06) }
.bj-search { flex: 0 1 320px; display: flex; align-items: center; gap: 8px; background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 8px; padding: 8px 14px; font-size: 13.5px; color: var(--bj-text); min-width: 200px }
/* Barre unifiée : compteur « N résultats » poussé à droite (non capitalisé). */
.bj-filters .bj-count { margin-left: auto; text-transform: none; letter-spacing: 0; font-size: 12px; color: var(--bj-text-3) }
.bj-search i { font-size: 16px; color: var(--bj-text-3) }
.bj-search input { border: 0; outline: 0; background: transparent; font: inherit; color: var(--bj-text); width: 100% }
.bj-search input::placeholder { color: var(--bj-text-3) }
.bj-search:focus-within { border-color: var(--bj-text); box-shadow: 0 0 0 3px rgba(51,41,36,.10) }

/* ── Select recherchable (combobox) façon Stripe — habille `select.bj-select`. ── */
.bj-cbx { position: relative; display: inline-block; min-width: 220px; vertical-align: top }
.bj-cbx__btn { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 12px; border: 1px solid var(--bj-cr); border-radius: 8px; background: var(--bj-content-bg); color: var(--bj-text); font: 400 13.5px var(--bj-font); cursor: pointer; text-align: left; transition: border-color .15s ease, box-shadow .15s ease }
.bj-cbx__btn:hover { border-color: #d6cfc4 }
/* Focus clavier : anneau DS (jamais l'outline bleu natif du navigateur). */
.bj-cbx__btn:focus-visible { outline: 0; border-color: var(--bj-text); box-shadow: 0 0 0 3px rgba(51,41,36,.10) }
.bj-cbx.is-open .bj-cbx__btn { border-color: var(--bj-text); box-shadow: 0 0 0 3px rgba(51,41,36,.10) }
.bj-cbx.is-invalid .bj-cbx__btn { border-color: var(--bj-err); box-shadow: 0 0 0 3px rgba(190,58,43,.12) }
.bj-cbx__btn > .ti { color: var(--bj-text-3); font-size: 16px; flex: 0 0 auto }
.bj-cbx__val { overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
.bj-cbx__val--ph { color: var(--bj-text-3) }
/* `outline: 0` : le panneau reçoit un focus PROGRAMMATIQUE (tabindex -1, nav
   clavier ↑↓) — sans ça, liseré bleu natif du navigateur hors DS (bug signalé,
   filtre espace du calendrier). Le retour visuel reste porté par le bouton
   (état is-open) + l'option .is-active. `max-width` : jamais plus large que le
   viewport ; les classes --right/--up sont posées par espace-menufit.js. */
.bj-cbx__panel { position: absolute; z-index: 60; top: calc(100% + 6px); left: 0; right: 0; min-width: 220px; max-width: calc(100vw - 32px); outline: 0; background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 10px; box-shadow: 0 8px 28px rgba(51,41,36,.14); overflow: hidden }
.bj-cbx__panel--right { left: auto; right: 0 }
.bj-cbx__panel--up { top: auto; bottom: calc(100% + 6px) }
.bj-cbx__search { padding: 8px; border-bottom: 1px solid var(--bj-cr) }
.bj-cbx__search input { width: 100%; border: 0; outline: 0; background: transparent; font: 400 13.5px var(--bj-font); color: var(--bj-text); padding: 4px 6px }
.bj-cbx__search input::placeholder { color: var(--bj-text-3) }
.bj-cbx__list { list-style: none; margin: 0; padding: 4px; max-height: 260px; overflow-y: auto }
.bj-cbx__opt { padding: 8px 10px; border-radius: 6px; font-size: 13.5px; color: var(--bj-text); cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis }
.bj-cbx__opt:hover, .bj-cbx__opt.is-active { background: var(--bj-hover) }
.bj-cbx__opt.is-sel { background: var(--bj-muted-bg); font-weight: 500 }
/* Résultats de recherche client (popups « Nouvelle réservation » + pose de pack
   équipe) : liste-carte NETTE sous le champ — sans ces styles, les options
   s'affichaient en boutons nus quasi invisibles (bug signalé, pose de pack). */
.bj-client-results { margin-top: 6px; background: var(--bj-surface); border: 1px solid var(--bj-cr); border-radius: 10px; overflow: hidden; box-shadow: 0 6px 18px rgba(51,41,36,.10) }
.bj-client-opt { display: block; width: 100%; text-align: left; padding: 11px 13px; background: none; border: 0; border-bottom: 1px solid var(--bj-cr); font: 500 13.5px var(--bj-font); color: var(--bj-text); cursor: pointer; transition: background var(--bj-dur-base) var(--bj-ease-out) }
.bj-client-opt:last-child { border-bottom: 0 }
.bj-client-opt:hover { background: var(--bj-hover) }
.bj-client-empty { padding: 11px 13px; font-size: 13px; color: var(--bj-text-3) }
.bj-cbx__opt.is-dis { color: var(--bj-text-3); cursor: default }
.bj-cbx__empty { padding: 12px 10px; font-size: 13px; color: var(--bj-text-3); text-align: center }

/* ── Toast de téléchargement (PDF facture) façon Stripe — bas-centre, spinner. ── */
.bj-dl-toast { position: fixed; left: 50%; bottom: 28px; transform: translate(-50%, 14px); z-index: 9999; display: flex; align-items: center; gap: 12px; max-width: min(92vw, 460px); padding: 13px 20px; border-radius: 12px; background: #3a3a44; color: #fff; font: 400 14px var(--bj-font); box-shadow: 0 14px 40px rgba(0,0,0,.30); opacity: 0; pointer-events: none; transition: opacity .2s var(--bj-ease-out), transform .2s var(--bj-ease-out) }
.bj-dl-toast.is-on { opacity: 1; transform: translate(-50%, 0) }
.bj-dl-toast__label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
.bj-dl-toast__spin { width: 16px; height: 16px; flex: 0 0 auto; border-radius: 50%; border: 2px solid rgba(255,255,255,.35); border-top-color: #fff; animation: bj-dl-spin .7s linear infinite }
@keyframes bj-dl-spin { to { transform: rotate(360deg) } }
@media (prefers-reduced-motion: reduce) { .bj-dl-toast__spin { animation-duration: 1.8s } .bj-dl-toast { transition: opacity .2s linear } }
@media (max-width: 720px) { .bj-dl-toast { bottom: calc(72px + env(safe-area-inset-bottom, 0px)) } }
/* Toast de RETOUR D'ACTION (avoir émis, payée, remboursée, erreur…) : même pilule
   que le toast de téléchargement, avec une icône colorée (vert succès / rouge erreur). */
.bj-toast { font-weight: 500 }
.bj-toast i { font-size: 18px; flex: 0 0 auto }
.bj-toast--ok i { color: #6ee7a8 }
.bj-toast--err i { color: #ff9b8f }

/* ── Boutons ───────────────────────────────────────────── */
/* Bouton façon Stripe : rectangle arrondi net, padding généreux (~42px de haut →
   tactile sans surcharge mobile), forme IDENTIQUE desktop/mobile. */
.bj-btn { display: inline-flex; align-items: center; justify-content: center; gap: 7px; background: var(--bj-text); color: var(--bj-btn-fg); border: 0; border-radius: 9px; padding: 8px 16px; font: 500 13.5px var(--bj-font); cursor: pointer; text-decoration: none; white-space: nowrap; transition: background var(--bj-dur-base) var(--bj-ease-out), transform .08s var(--bj-ease-out) }
.bj-btn i { font-size: 17px }
.bj-btn:hover { background: #241c18 }
.bj-btn:active { transform: scale(.97) }
.bj-btn--ghost { background: transparent; color: var(--bj-text); border: 1px solid var(--bj-cr) }
.bj-btn--ghost:hover { background: rgba(51,41,36,.04) }

/* ── Contenu principal ─────────────────────────────────── */
/* `background` explicite : garantit le blanc même si une feuille héritée
   (admin.css sur les pages de config) tente d'y appliquer un fond crème. */
.bj-main { padding: 4px 28px 40px; background: var(--bj-content-bg) }

/* ── KPIs ──────────────────────────────────────────────── */
.bj-kpis { display: grid; grid-template-columns: repeat(4,1fr); gap: 14px; margin-bottom: 22px }
.bj-kpi { background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 12px; padding: 15px 18px }
.bj-kpi__l { font-size: 12px; color: var(--bj-text-2); margin-bottom: 8px }
.bj-kpi__v { font-size: 26px; font-weight: 600; font-variant-numeric: tabular-nums }
.bj-kpi__s { font-size: 12px; color: var(--bj-text-2); margin-top: 5px; display: flex; align-items: center; gap: 5px }
.bj-kpi__d { display: inline-flex; align-items: center; gap: 3px; font-weight: 500; font-variant-numeric: tabular-nums }
.bj-kpi__d i { font-size: 14px }
.bj-kpi__d.up { color: var(--bj-ok) }
.bj-kpi__d.down { color: var(--bj-err) }

/* ── Tableau — COMPOSANT CANONIQUE UNIQUE (par classe .bj-table, sûr pour
 *    FullCalendar). `.bj-tablewrap` = conteneur bordé unique. ── */
/* Liste façon Stripe : pas de boîte autour, juste des lignes à filets fins. */
.bj-tablewrap { overflow-x: auto; border: 0; border-radius: 0; background: transparent }
.bj-table { width: 100%; border-collapse: collapse; font-size: 13.5px }
.bj-table th { text-align: left; font: 500 12px var(--bj-font); letter-spacing: 0; text-transform: none; color: var(--bj-text-3); padding: 12px 16px }
.bj-table td { padding: 13px 16px; border-top: 1px solid var(--bj-cr); color: var(--bj-text); vertical-align: middle }
.bj-table thead th { border-top: 0 }
.bj-table tbody tr:hover { background: var(--bj-hover) }
/* Ligne/carte cliquable (détail = page) : curseur + ouverture via JS (ConsoleShell). */
.bj-rowlink { cursor: pointer }
.bj-table .num, .bj-table td.num, .bj-table .bj-num, .bj-table td.bj-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap }
.bj-table th.num, .bj-table th.bj-num { text-align: right }
.bj-table .mono { font-variant-numeric: tabular-nums; letter-spacing: .01em }

/* ── Cellules client ───────────────────────────────────── */
.bj-cli { display: flex; align-items: center; gap: 10px }
.bj-avatar { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600; flex-shrink: 0 }
.bj-avatar--img { background-size: cover; background-position: center }
.bj-avatar--ph { background: var(--bj-muted-bg); color: var(--bj-text-3) }
.bj-avatar--ph .ti { font-size: 15px }
.bj-rcap { display: inline-flex; align-items: center; gap: 5px; color: var(--bj-text-2) }
.bj-rcap .ti { font-size: 14px; color: var(--bj-text-3) }
.bj-sub { color: var(--bj-text-2); font-size: 12.5px }
/* Récap de l'invitation équipe (étape 2 de la modale). */
.bj-invite-recap { display: flex; align-items: center; gap: 8px; padding: 10px 12px; margin: 0 0 14px; border: 1px solid var(--bj-cr); border-radius: 9px; background: var(--bj-hover); font-size: 13px; font-weight: 500 }
.bj-invite-recap .ti { font-size: 16px; color: var(--bj-text-3); flex: none }
.bj-invite-recap .bj-sub { font-weight: 400 }
/* Marqueur « journée de pack » dans une liste de réservations (prépayée). */
.bj-tag-pack { display: inline-flex; align-items: center; gap: 3px; margin-left: 6px; padding: 1px 7px; border-radius: 6px; background: var(--bj-muted-bg); color: var(--bj-text-2); font-size: 11px; font-weight: 500; vertical-align: 1px; white-space: nowrap }
.bj-tag-pack .ti { font-size: 12px }
/* Badges façon Stripe : rectangle arrondi + bordure colorée + fond teinté clair. */
.bj-badge { display: inline-flex; align-items: center; gap: 5px; font: 500 12px var(--bj-font); padding: 3px 9px; border-radius: 7px; border: 1px solid transparent; white-space: nowrap }
.bj-badge .ti { font-size: 13px } /* icône optionnelle (badges abonnement/connecteurs) */
.bj-badge--ok { background: #E7F7DA; color: #357A2B; border-color: #C7E9A9 }      /* Payée */
.bj-badge--warn { background: #FBF0D6; color: #97670F; border-color: #EFD9A4 }    /* À régler */
.bj-badge--err { background: #FCEAEA; color: #BE3A2B; border-color: #F3C9C9 }     /* En retard */
.bj-badge--muted { background: #EBEEF2; color: #4A5666; border-color: #D8DFE8 }   /* Brouillon / Invité */
/* Destinataires d'e-mails (Réglages › E-mails) : une couleur par audience. */
.bj-badge--client { background: #E8F0FB; color: #2E5AAC; border-color: #CBDDF4 }       /* Client */
.bj-badge--equipe { background: #EFEBFB; color: #5B48C2; border-color: #DAD1F3 }       /* Équipe */
.bj-badge--owner { background: #DFF3F0; color: #237A70; border-color: #B7E4DD }        /* Propriétaire */
.bj-badge--member { background: #E8F7DC; color: #3B7A2E; border-color: #C9E9AC }       /* Membre */
/* Colonne « Total » façon Stripe : montant gras + badge de statut collé. */
.bj-total { display: inline-flex; align-items: center; gap: 9px }
.bj-total .bj-amt { font-weight: 500; font-variant-numeric: tabular-nums }
.bj-when { color: var(--bj-text-2) }
/* Sous-titre carte facture (n° · échéance) : rendu UNIQUEMENT en carte mobile
   (voir bloc ≤720 px). Masqué sur desktop pour ne pas dédoubler le tableau. */
.bj-c-meta { display: none }
/* Actions de ligne TOUJOURS visibles (réflexe utilisateur : on ne cache pas une
   action derrière le survol). Le survol ne fait que renforcer le contraste. */
.bj-rowact, .bj-row-actions { opacity: 1; transition: color .12s var(--bj-ease-out); background: none; border: 0; color: var(--bj-text-3); cursor: pointer; font-size: 18px }
.bj-table tbody tr:hover .bj-rowact, .bj-table tbody tr:hover .bj-row-actions, .bj-rowact:hover, .bj-row-actions:hover { color: var(--bj-text) }

/* Menu d'actions par ligne (factures…) + bouton danger (confirmations). */
.bj-rowwrap { position: relative; display: inline-block }
.bj-rowwrap:focus-within .bj-rowact { opacity: 1 }
.bj-rowmenu { position: absolute; top: calc(100% + 4px); right: 0; min-width: 210px; max-width: calc(100vw - 32px); background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 10px; box-shadow: 0 12px 34px rgba(51,41,36,.16); padding: 5px; z-index: 40; display: none; text-align: left }
.bj-rowmenu.open { display: block }
/* Ouverture vers le haut (dernières lignes : évite le rognage par .bj-tablewrap). */
.bj-rowmenu.up { top: auto; bottom: calc(100% + 4px) }
.bj-rowmenu a, .bj-rowmenu button { display: flex; align-items: center; gap: 9px; width: 100%; background: none; border: 0; cursor: pointer; padding: 8px 10px; border-radius: 7px; font: 400 13px var(--bj-font); color: var(--bj-text); text-align: left; text-decoration: none }
.bj-rowmenu a i, .bj-rowmenu button i { font-size: 17px; color: var(--bj-text-3); width: 18px; text-align: center }
.bj-rowmenu a:hover, .bj-rowmenu button:hover { background: var(--bj-hover) }
.bj-rowmenu__sep { height: 1px; background: var(--bj-cr); margin: 5px 2px }
.bj-rowmenu button.danger, .bj-rowmenu button.danger i { color: var(--bj-err) }
.bj-rowmenu button.danger:hover { background: var(--bj-err-bg) }
/* Bouton danger : défini plus bas (.bj-btn--danger, outline rouge canonique du DS). */
.bj-confirm-body { font-size: 13.5px; color: var(--bj-text-2); line-height: 1.55; margin: 0 }
.bj-confirm-body strong { color: var(--bj-text); font-weight: 500 }
/* Emphase dans un texte muté (hints d'aide) : jamais 700 par défaut du navigateur. */
.bj-faint strong { font-weight: 500 }
/* Note = callout sobre (surface tintée) plutôt que texte gris flottant. */
.bj-confirm-note { font-size: 12.5px; color: var(--bj-text-2); line-height: 1.5; margin: 12px 0 0; padding: 10px 12px; border-radius: 9px; background: rgba(51,41,36,.045); background: color-mix(in srgb, var(--bj-text) 4.5%, transparent) }
/* Ancre visuelle du popup de confirmation : pastille icône (danger rouge / ok vert). */
.bj-confirm-ic { width: 40px; height: 40px; border-radius: 11px; display: inline-flex; align-items: center; justify-content: center; font-size: 21px; flex-shrink: 0 }
.bj-confirm-ic--danger { background: var(--bj-err-bg); color: var(--bj-err) }
.bj-confirm-ic--ok { background: var(--bj-ok-bg); color: var(--bj-ok) }
#bj-inv-confirm .bj-modal__name { font-size: 16px; font-weight: 600; line-height: 1.3 }
/* Ligne d'information du popup d'annulation (phrase serveur facture/crédit) :
   légèrement plus présente que la note générique — c'est elle qui rassure. */
.bj-cancel-note { font-size: 13px; color: var(--bj-text-2) }
/* Note (message du client) dans le détail d'une demande. */
.bj-dem-note-row { align-items: flex-start }
.bj-dem-note-row .v { flex: 1 }
.bj-dem-note { display: block; background: var(--bj-hover); border: 1px solid var(--bj-cr); border-radius: 9px; padding: 11px 13px; font-size: 13px; line-height: 1.55; color: var(--bj-text); margin-top: 2px; font-weight: 400 }
.bj-dem-note--empty { color: var(--bj-text-3); font-style: italic }

/* ── Miniliste ─────────────────────────────────────────── */
.bj-minilist { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column }
.bj-minilist li { display: flex; align-items: center; gap: 10px; padding: 9px 0; border-top: 1px solid var(--bj-cr); font-size: 13px }
.bj-minilist li:first-child { border-top: 0 }
.bj-minilist .grow { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
.bj-minilist .meta { color: var(--bj-text-2); font-variant-numeric: tabular-nums; white-space: nowrap }
.bj-minilist .when { color: var(--bj-text-3); font-size: 12px; white-space: nowrap }

/* ── Calendrier ────────────────────────────────────────── */
.bj-calbar { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; flex-wrap: wrap }
/* Intégrée à la barre d'outils du calendrier (slot filtres) : pas de marge propre. */
.bj-filters .bj-calbar { margin: 0 }
.bj-calbar__nav { display: inline-flex; border: 1px solid var(--bj-cr); border-radius: 8px; overflow: hidden }
.bj-calbar__nav button { background: var(--bj-content-bg); border: 0; border-left: 1px solid var(--bj-cr); width: 34px; height: 34px; color: var(--bj-text); cursor: pointer; font-size: 18px; display: inline-flex; align-items: center; justify-content: center }
.bj-calbar__nav button:first-child { border-left: 0 }
.bj-calbar__nav button:hover { background: var(--bj-hover) }
.bj-calbar__today { height: 34px; padding: 0 12px; border: 1px solid var(--bj-cr); border-radius: 8px; background: var(--bj-content-bg); color: var(--bj-text); font: 500 13px var(--bj-font); cursor: pointer }
.bj-calbar__today:hover { background: var(--bj-hover) }
.bj-calbar__label { font-size: 15px; font-weight: 500; color: var(--bj-text) }

/* (Les anciennes règles de grille semaine faites main — .bj-cal__head/__body/
   __gutter/__h/__col/__dh et le `.bj-cal` carte — ont été retirées : markup non
   utilisé, et `.bj-cal` entrait en conflit avec le date-picker du modal Nouvelle
   réservation, seul usage légitime de `.bj-cal` aujourd'hui.) */

/* Le calendrier est rendu par FullCalendar (#bj-espace-cal, instance .fc) — voir le
   bloc « FullCalendar » plus bas. Les anciennes règles de grille faites main
   (.bj-evt absolu, .bj-month*, .bj-mevt) ont été retirées : markup non utilisé et
   sélecteur nu `.bj-evt` qui fuyait sur les events FullCalendar. */

/* ── Formulaires (modaux) ───────────────────────────────── */
.bj-modal__title { font-size: 16px; font-weight: 600; margin: 0 }
.bj-field { display: flex; flex-direction: column; gap: 5px; margin-bottom: 12px }
.bj-field > label { font-size: 12.5px; color: var(--bj-text-2) }
/* Liste de mise en route (onglet Application) : une ligne = un réglage de CET
   appareil, avec son état à droite. L'ordre porte la dépendance (sur iPhone les
   notifications n'existent qu'une fois la PWA installée). */
.bj-applist { padding: 0; overflow: hidden }
.bj-approw { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 15px 16px }
.bj-approw + .bj-approw { border-top: 1px solid var(--bj-cr) }
.bj-approw.is-off { opacity: .55 }
.bj-approw__d { display: flex; flex-direction: column; min-width: 0 }
.bj-approw__l { font-size: 14.5px; color: var(--bj-text) }
.bj-approw__s { font-size: 12px; color: var(--bj-text-2); margin-top: 2px }
.bj-approw__a { display: flex; align-items: center; gap: 10px; flex-shrink: 0 }
.bj-approw__ok { font-size: 13px; color: #4E7A3E; display: flex; align-items: center; gap: 5px; white-space: nowrap }
.bj-approw__mut { font-size: 12.5px; color: var(--bj-text-3); white-space: nowrap }
@media (max-width: 480px) {
  .bj-approw { align-items: flex-start; flex-direction: column; gap: 10px }
  .bj-approw__a { width: 100% }
}

.bj-notify-opt { display: flex; align-items: center; gap: 8px; margin-top: 12px; font-size: 13px; color: var(--bj-text-2); cursor: pointer }
.bj-notify-opt input { width: 15px; height: 15px; accent-color: var(--bj-text); cursor: pointer }
.bj-field input,
.bj-field select,
.bj-field textarea { width: 100%; padding: 10px 12px; border: 1px solid var(--bj-cr); border-radius: 8px; font: 400 13.5px var(--bj-font); background: var(--bj-content-bg); color: var(--bj-text); transition: border-color .15s ease, box-shadow .15s ease }
.bj-field input:hover,
.bj-field select:hover,
.bj-field textarea:hover { border-color: #d6cfc4 }
/* Focus façon Stripe : bordure accent + halo discret. */
.bj-field input:focus,
.bj-field select:focus,
.bj-field textarea:focus { outline: 0; border-color: var(--bj-text); box-shadow: 0 0 0 3px rgba(51,41,36,.10) }
.bj-field textarea { min-height: 74px; resize: vertical }
.bj-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px }
/* `.bj-field` est en flex : sans cette règle, un champ masqué via [hidden]
   resterait affiché (piège connu : [hidden] vs display:flex). */
.bj-field[hidden] { display: none }
.bj-field__legend { font-size: 12.5px; color: var(--bj-text-2) }
/* Choix de portée du blocage : deux options radio empilées, cibles cliquables
   confortables, sélection soulignée discrètement (monochrome). */
.bj-radio-group { display: flex; flex-direction: column; gap: 6px }
.bj-radio { display: flex; align-items: flex-start; gap: 9px; padding: 9px 11px; border: 1px solid var(--bj-cr); border-radius: 8px; cursor: pointer; font-size: 13.5px; color: var(--bj-text); transition: border-color .12s, background .12s }
.bj-radio:hover { background: var(--bj-hover) }
.bj-radio input { width: auto; margin: 2px 0 0; accent-color: var(--bj-clay) }
.bj-radio em { font-style: normal; color: var(--bj-text-2) }
.bj-radio:has(input:checked) { border-color: var(--bj-clay); background: var(--bj-muted-bg) }

/* Modal « Nouvelle réservation » — flux guidé (offre → créneaux dispo) */
/* L'attribut [hidden] doit l'emporter sur les `display:flex/inline-flex` des
   classes ci-dessous (sinon les champs masqués restent visibles). */
.bj-field[hidden], .bj-mode-tag[hidden], .bj-recap[hidden], .bj-modal-err[hidden],
.bj-client-new[hidden], .bj-client-results[hidden], .bj-daybox[hidden],
.bj-btn[hidden], #bj-nb-step1[hidden], #bj-nb-step2[hidden], #bj-nb-billing-pay[hidden] { display: none }
.bj-mode-tag { display: inline-flex; align-items: center; gap: 5px; font-size: 11.5px; color: var(--bj-text-2); background: var(--bj-hover); border-radius: 6px; padding: 2px 8px; margin-top: 5px; width: fit-content }
.bj-slot-note { font-size: 11.5px; color: var(--bj-text-3); display: flex; align-items: center; gap: 5px; margin-top: 3px }
.bj-slot-note i { font-size: 13px }
.bj-daybox { background: var(--bj-hover); border: 1px solid var(--bj-cr); border-radius: 9px; padding: 10px 12px; font-size: 13px; color: var(--bj-text); display: flex; align-items: center; gap: 8px }
.bj-daybox i { color: var(--bj-text-2); font-size: 17px }
.bj-linkbtn { background: none; border: 0; color: var(--bj-clay); font: 500 12.5px var(--bj-font); cursor: pointer; padding: 4px 0; margin-top: 2px; text-align: left }
.bj-client-pick { position: relative }
/* `position:absolute` = REPLI (JS off). À l'affichage, le JS (pack-staff /
   calendrier) passe la liste en `position:fixed` via bjMenuFit.fixed : les
   modals ont un corps scrollable (.bj-nb-body / .bj-cmodal) qui rognerait la
   liste absolue (bug signalé : résultats coupés dans « Poser une journée »).
   Le scroll reste INTERNE à la liste (max-height), jamais au modal. */
.bj-client-results { position: absolute; left: 0; right: 0; top: calc(100% + 3px); background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 9px; box-shadow: 0 12px 30px rgba(51,41,36,.14); z-index: 5; max-height: 200px; overflow: auto; padding: 4px }
/* min-height 44px : cible tactile confortable (une option = un doigt). */
.bj-client-opt { display: flex; align-items: center; box-sizing: border-box; min-height: 44px; width: 100%; text-align: left; background: none; border: 0; padding: 8px 10px; border-radius: 7px; font-size: 13px; color: var(--bj-text); cursor: pointer }
.bj-client-opt:hover { background: var(--bj-hover) }
.bj-client-empty { padding: 8px 10px; font-size: 12.5px; color: var(--bj-text-3) }
.bj-client-new { display: flex; flex-direction: column; gap: 8px; margin-top: 8px }
.bj-client-new input { width: 100%; padding: 9px 11px; border: 1px solid var(--bj-cr); border-radius: 8px; font: 400 13.5px var(--bj-font); background: var(--bj-content-bg); color: var(--bj-text); box-sizing: border-box }
.bj-recap { background: #FBF7F1; border: 1px solid var(--bj-cr); border-radius: 10px; padding: 11px 13px; margin: 4px 0 2px; font-size: 13px; color: var(--bj-text) }
.bj-recap__when { color: var(--bj-text-2); font-size: 12.5px; margin-bottom: 3px }
.bj-recap__main { font-weight: 500 }
.bj-recap__strike { color: var(--bj-text-3); text-decoration: line-through; margin-right: 6px }
.bj-recap__discount { display: block; color: var(--bj-text-2); font-size: 12px; margin-top: 2px }
/* Code promo (modal Nouvelle réservation) : champ + bouton Appliquer + message */
.bj-promo-row { display: flex; gap: 8px; align-items: stretch }
.bj-promo-row input { flex: 1 }
.bj-promo-row .bj-btn { white-space: nowrap; flex: none }
.bj-promo-msg { font-size: 12px; margin-top: 5px }
.bj-promo-msg[hidden] { display: none }
.bj-promo-msg.is-ok { color: var(--bj-es, #2f6f4f) }
.bj-promo-msg.is-err { color: var(--bj-err) }
.bj-modal-err { background: var(--bj-err-bg); border: 1px solid rgba(166,64,47,.25); color: var(--bj-err); border-radius: 9px; padding: 9px 12px; font-size: 12.5px; margin-top: 10px }
/* Étape 2 « Facturation » : options en cartes radio */
.bj-billing { display: flex; flex-direction: column; gap: 10px }
.bj-radio { display: flex; align-items: flex-start; gap: 12px; padding: 13px 15px; border: 1px solid var(--bj-cr); border-radius: 11px; cursor: pointer; transition: border-color .12s var(--bj-ease-out) }
.bj-radio:hover { border-color: var(--bj-text-3) }
.bj-radio input { margin-top: 2px; flex-shrink: 0; width: auto; accent-color: var(--bj-text) }
.bj-radio:has(input:checked) { border-color: var(--bj-text) }
.bj-radio > span { display: flex; flex-direction: column; font-size: 13.5px; color: var(--bj-text); line-height: 1.3 }
.bj-radio:has(input:checked) > span { font-weight: 500 }
.bj-radio small { font-size: 11.5px; color: var(--bj-text-3); margin-top: 3px; font-weight: 400 }
/* Calendrier de dates (jours fermés/complets/passés grisés) */
.bj-cal { border: 1px solid var(--bj-cr); border-radius: 10px; padding: 8px 10px 9px; background: var(--bj-content-bg) }
.bj-cal__bar { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px }
.bj-cal__month { font-size: 12.5px; font-weight: 500; text-transform: capitalize }
.bj-cal__nav { width: 24px; height: 24px; border: 1px solid var(--bj-cr); border-radius: 6px; background: var(--bj-content-bg); color: var(--bj-text); cursor: pointer; display: inline-flex; align-items: center; justify-content: center }
.bj-cal__nav i { font-size: 15px }
.bj-cal__nav:hover:not(:disabled) { background: var(--bj-hover) }
.bj-cal__nav:disabled { opacity: .4; cursor: default }
.bj-cal__dow { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; margin-bottom: 2px }
.bj-cal__dow span { text-align: center; font-size: 10px; color: var(--bj-text-3); font-weight: 600 }
.bj-cal__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; min-height: 180px }
.bj-cal__day { height: 30px; display: flex; align-items: center; justify-content: center; font-size: 12.5px; border-radius: 6px; border: 0; background: none; padding: 0 }
.bj-cal__day--empty { visibility: hidden }
.bj-cal__day--off { color: var(--bj-text-3); opacity: .45; text-decoration: line-through }
.bj-cal__day--ok { color: var(--bj-text); cursor: pointer }
.bj-cal__day--ok:hover { background: var(--bj-hover) }
.bj-cal__day.is-today { font-weight: 600; box-shadow: inset 0 0 0 1px var(--bj-cr) }
.bj-cal__day.is-sel, .bj-cal__day.is-sel:hover { background: var(--bj-clay); color: #fff }

/* ── Popup détail ───────────────────────────────────────── */
.bj-modal-scrim { position: fixed; inset: 0; background: rgba(38,28,23,.44); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); display: none; align-items: center; justify-content: center; z-index: 60; padding: 20px }
.bj-modal-scrim.open { display: flex; animation: bjScrimIn .16s var(--bj-ease-out) both }
.bj-cmodal { background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 16px; max-width: 380px; width: 100%; padding: 22px; box-shadow: 0 1px 2px rgba(38,28,23,.08), 0 12px 28px rgba(38,28,23,.14), 0 28px 64px rgba(38,28,23,.12); max-height: calc(100vh - 40px); max-height: calc(100dvh - 40px); overflow-y: auto }
.bj-modal-scrim.open .bj-cmodal { animation: bjModalIn .22s var(--bj-ease-out) both }
@keyframes bjScrimIn { from { opacity: 0 } to { opacity: 1 } }
@keyframes bjModalIn { from { opacity: 0; transform: translateY(10px) scale(.975) } to { opacity: 1; transform: none } }
@media (prefers-reduced-motion: reduce) { .bj-modal-scrim.open, .bj-modal-scrim.open .bj-cmodal { animation: none } }
/* Modal « Nouvelle réservation » : en-tête + actions FIXES, corps scrollable —
   le CTA reste toujours visible quelle que soit la hauteur d'écran (responsive). */
#bj-modal-new .bj-cmodal { display: flex; flex-direction: column; overflow: hidden }
#bj-modal-new .bj-modal__head { flex-shrink: 0 }
/* Modal réservation : étapes courtes → on peut respirer (aéré). */
#bj-modal-new .bj-field { margin-bottom: 15px }
.bj-nb-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; margin: 0 -20px; padding: 0 20px }
#bj-modal-new .bj-modal__acts { flex-shrink: 0; margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--bj-cr) }
.bj-modal__head { display: flex; align-items: center; gap: 11px; margin-bottom: 16px }
.bj-modal__head .bj-avatar { width: 40px; height: 40px; font-size: 14px }
.bj-modal__name { font-size: 15px; font-weight: 500; margin: 0 }
.bj-modal__sub { font-size: 12.5px; color: var(--bj-text-2); margin: 1px 0 0 }
.bj-modal__close { margin-left: auto; background: none; border: 0; color: var(--bj-text-3); cursor: pointer; font-size: 20px; align-self: flex-start; width: 34px; height: 34px; display: inline-flex; align-items: center; justify-content: center; border-radius: 9px; transition: background .12s var(--bj-ease-out), color .12s var(--bj-ease-out) }
.bj-modal__close:hover { background: color-mix(in srgb, var(--bj-text) 6%, transparent); color: var(--bj-text) }
.bj-modal__rows { border-top: 1px solid var(--bj-cr); padding-top: 12px; display: flex; flex-direction: column; gap: 10px }
.bj-modal__row { display: flex; align-items: center; gap: 10px; font-size: 13px }
.bj-modal__row i { font-size: 17px; color: var(--bj-text-3); width: 18px; text-align: center }
.bj-modal__row .k { color: var(--bj-text-2); min-width: 78px }
.bj-modal__row .v { color: var(--bj-text); font-weight: 500 }
.bj-modal__acts { display: flex; gap: 8px; margin-top: 18px }
.bj-modal__acts .bj-btn { flex: 1; justify-content: center }
/* Variante empilée : lien texte (action douce) au-dessus d'une rangée de boutons. */
.bj-modal__acts--stacked { flex-direction: column; align-items: stretch; gap: 12px }
.bj-modal__actrow { display: flex; gap: 8px }
.bj-modal__actrow .bj-btn { flex: 1; justify-content: center }
.bj-modal__foot { display: flex; align-items: center; gap: 12px; margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--bj-cr) }
.bj-modal__foot-acts { margin-left: auto; display: flex; gap: 8px }
.bj-offer-del-confirm { align-items: center; gap: 8px; font-size: 13px; color: var(--bj-text-2) }
.bj-btn--danger-ghost { color: var(--bj-err) }
.bj-btn--danger-ghost:hover { background: #FCEAEA; border-color: #F3C9C9; color: var(--bj-err) }
.bj-modal__textlink { align-self: center; background: none; border: 0; padding: 2px 4px; margin: 0; cursor: pointer; font: 500 13px var(--bj-font); color: var(--bj-text-2); display: inline-flex; align-items: center; gap: 6px; text-decoration: none }
.bj-modal__textlink:hover { color: var(--bj-text); text-decoration: underline }
.bj-modal__textlink i { font-size: 16px }

/* ── Pagination ─────────────────────────────────────────── */
.bj-pager { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 4px 0; font-size: 13px; color: var(--bj-text-2); flex-wrap: wrap }
.bj-pager__nav { display: flex; align-items: center; gap: 4px }
.bj-pager__btn { display: inline-flex; align-items: center; justify-content: center; min-width: 32px; height: 32px; padding: 0 9px; border: 1px solid var(--bj-cr); border-radius: 8px; background: var(--bj-content-bg); color: var(--bj-text); font: 500 13px var(--bj-font); cursor: pointer; text-decoration: none; transition: background var(--bj-dur-base) var(--bj-ease-out) }
.bj-pager__btn:hover { background: var(--bj-hover) }
.bj-pager__btn--on { background: var(--bj-text); color: var(--bj-btn-fg); border-color: var(--bj-text) }
.bj-pager__btn[disabled] { opacity: .4; cursor: default; pointer-events: none }
.bj-pager__dots { padding: 0 2px; color: var(--bj-text-3) }

/* ── Scrim menu mobile ──────────────────────────────────── */
.bj-scrim { display: none; position: fixed; inset: 0; background: rgba(51,41,36,.35); z-index: 40; opacity: 0; transition: opacity var(--bj-dur-base) var(--bj-ease-out) }

/* ── Responsive ─────────────────────────────────────────── */
@media (max-width: 960px) {
  /* Sidebar off-canvas */
  .bj-side { position: fixed; left: 0; top: 0; z-index: 50; transform: translateX(-100%); transition: transform var(--bj-dur-base) var(--bj-ease-out); height: 100dvh }
  body.nav-open .bj-side { transform: translateX(0) }
  body.nav-open .bj-scrim { display: block; opacity: 1 }
  .bj-burger { display: inline-block }

  /* KPIs, grilles, panels */
  .bj-kpis { grid-template-columns: repeat(2,1fr) }
  .bj-dash__kpis { grid-template-columns: repeat(2,1fr) }
  .bj-dash__grid { grid-template-columns: 1fr }

  /* Pagebar + filtres : espacement mobile + actions visibles */
  .bj-pagebar,
  .bj-filters,
  .bj-main { padding-left: 18px; padding-right: 18px }
  .bj-pagebar { flex-wrap: wrap; gap: 10px }
  .bj-pagebar__actions { flex-wrap: wrap }
  .bj-filters { flex-wrap: wrap; gap: 8px }

  /* Recherche pleine largeur */
  .bj-search { min-width: 0; flex: 1 1 100% }

  /* Tableau : colonnes secondaires masquées, scroll horizontal */
  .bj-tablewrap .bj-table td.hide-sm,
  .bj-tablewrap .bj-table th.hide-sm { display: none }
  .bj-tablewrap { overflow-x: auto; -webkit-overflow-scrolling: touch }

  /* FullCalendar scrollable : c'est .bj-cal-fc qui scrolle en X et la VRAIE
     instance #bj-espace-cal (pas .bj-cal, qui est le date-picker du modal) qui
     garde une largeur min en vue SEMAINE (7 colonnes, illisible sinon). La vue
     JOUR (une seule colonne) ne force AUCUNE largeur → pas de scroll horizontal
     parasite sur 375px. Le Mois reste lisible en pastilles compactes sans largeur
     forcée. FullCalendar émet `fc-timeGridWeek-view` / `fc-timeGridDay-view` sur
     le conteneur de la vue courante ; on cible donc la seule Semaine. */
  .bj-cal-fc { overflow-x: auto; -webkit-overflow-scrolling: touch }
  #bj-espace-cal:has(.fc-timeGridWeek-view) { min-width: 560px }

  /* Formulaires : champs côte-à-côte → colonne */
  .bj-field-row { grid-template-columns: 1fr }

  /* Modal : lisible sur mobile */
  .bj-cmodal { max-width: 100%; margin: 0 16px; padding: 16px }

  /* Barre calendrier mobile */
  .bj-calbar { gap: 8px }

  /* Cibles tactiles ≥44px pour boutons de pagination */
  .bj-pager__btn { min-height: 44px; min-width: 44px }

  /* Le bouton garde sa forme (déjà ~42px, tactile). Pas de surcharge mobile. */
  .bj-calbar__nav button { width: 44px; height: 44px }
  .bj-calbar__today { height: 44px }
}

/* ===== App-like mobile : barre d'onglets du bas + ••• Plus + safe-area ===== */
.bj-tabbar, .bj-more { display: none }
@media (max-width: 720px) {
  /* Encoche : décale le contenu sous la status bar en PWA (0 ailleurs). */
  .bj-content { padding-top: env(safe-area-inset-top, 0px) }
  /* Barre d'onglets fixe en bas (téléphone). */
  body.has-tabbar .bj-tabbar { display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 55; background: var(--bj-surface); border-top: 1px solid var(--bj-cr); justify-content: space-around; align-items: flex-start; padding: 13px 4px calc(18px + env(safe-area-inset-bottom, 0px)) }
  body.has-tabbar .bj-tabbar .bj-tab { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 2px; text-decoration: none; color: var(--bj-text-3); border-bottom: 0 }
  /* L'onglet « Plus » est un <button> : neutraliser le style natif du bouton
     pour qu'il soit visuellement identique aux <a> de la barre. */
  body.has-tabbar .bj-tabbar button.bj-tab { background: none; border: 0; font-family: inherit; cursor: pointer; -webkit-appearance: none; appearance: none }
  body.has-tabbar .bj-tabbar .bj-tab--on { color: var(--bj-text) }
  body.has-tabbar .bj-tabbar .bj-tab:active { transform: scale(.94) }
  /* Onglets de CONTENU (ex. Réglages : Général/Paiement/…) — même classe .bj-tab que la
     nav du bas, à NE PAS écraser. Sur mobile : strip défilable horizontalement. */
  .bj-tabs { overflow-x: auto; flex-wrap: nowrap; -webkit-overflow-scrolling: touch; scrollbar-width: none }
  .bj-tabs::-webkit-scrollbar { display: none }
  .bj-tabs .bj-tab { flex: 0 0 auto; white-space: nowrap }
  .bj-tab__ic { position: relative; font-size: 25px; line-height: 1 }
  .bj-tab__lb { font-size: 11px; line-height: 1; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
  .bj-tab--on .bj-tab__lb { font-weight: 500 }
  .bj-tab__badge { position: absolute; top: -6px; left: 13px; min-width: 16px; height: 16px; box-sizing: border-box; padding: 0 4px; background: var(--bj-err); color: #fff; font-size: 10px; font-weight: 500; line-height: 16px; text-align: center; border-radius: 8px }
  /* Espace pour la barre fixe. */
  body.has-tabbar .bj-main { padding-bottom: calc(98px + env(safe-area-inset-bottom, 0px)) }
  /* Le menu burger laisse place au ••• Plus (haut-droite), qui ouvre le tiroir. */
  body.has-tabbar .bj-burger { display: none }
  body.has-tabbar .bj-more { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border: 1px solid var(--bj-cr); border-radius: 10px; background: var(--bj-surface); color: var(--bj-text); font-size: 22px }
  /* Repli sidebar off-canvas : safe-area en bas si jamais elle est ouverte. */
  body.has-tabbar.nav-open .bj-side { padding-bottom: calc(16px + env(safe-area-inset-bottom, 0px)) }

  /* ── Tiroir « Plus » : feuille modale basse (bottom sheet, valeurs maquette) ──
     Grille tactile 3 colonnes des sections restantes. Grip + scrim, ferme au tap
     dehors / grip / Échap. Chaque cible ≥ 44 px. Masqué par [hidden] hors ouverture. */
  .bj-sheet-scrim { position: fixed; inset: 0; z-index: 60; background: rgba(51,41,36,.28); opacity: 0; transition: opacity var(--bj-dur-base) var(--bj-ease-out) }
  body.bj-sheet-open .bj-sheet-scrim { opacity: 1 }
  .bj-sheet { position: fixed; left: 0; right: 0; bottom: 0; z-index: 61; background: var(--bj-content-bg); border-radius: 20px 20px 0 0; box-shadow: 0 -8px 30px rgba(51,41,36,.16); padding: 8px 0 calc(10px + env(safe-area-inset-bottom, 0px)); max-height: 74%; overflow-y: auto; transform: translateY(100%); transition: transform var(--bj-dur-base) var(--bj-ease-out) }
  body.bj-sheet-open .bj-sheet { transform: translateY(0) }
  .bj-sheet[hidden], .bj-sheet-scrim[hidden] { display: none }
  .bj-sheet__grip { display: block; width: 40px; height: 4px; border: 0; border-radius: 2px; background: var(--bj-cr); margin: 6px auto 8px; padding: 0; cursor: pointer }
  .bj-sheet__ttl { font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--bj-text-3); padding: 4px 20px 8px }
  .bj-sheet__grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 4px; padding: 0 12px }
  .bj-sheet__it { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 16px 6px; border-radius: 12px; text-decoration: none; color: var(--bj-text); text-align: center; min-height: 44px }
  .bj-sheet__it:active { background: var(--bj-hover) }
  .bj-sheet__it--on { background: var(--bj-hover) }
  .bj-sheet__it i { font-size: 24px; color: var(--bj-text-2) }
  .bj-sheet__it span { font-size: 12px; font-weight: 500 }
  .bj-sheet__ic { position: relative }
  .bj-sheet__ic .bj-tab__badge { top: -6px; left: 13px }

  /* Tableaux → VRAIES cartes (pas de libellés « Statut : / Montant : »). Chaque ligne
     est une carte aérée : titre (client/offre) en tête, lignes de détail, puis un pied
     « montant (gauche) · statut (droite) ». Le menu ••• va en coin haut-droite. */
  .bj-tablewrap { overflow: visible }
  .bj-tablewrap .bj-table thead { display: none }
  .bj-tablewrap .bj-table, .bj-tablewrap .bj-table tbody { display: block }
  .bj-tablewrap:not([data-invoices-card]) .bj-table tr { display: flex; flex-wrap: wrap; align-items: center; column-gap: 10px; row-gap: 7px; position: relative; background: var(--bj-surface); border: 1px solid var(--bj-cr); border-radius: 16px; padding: 16px 16px 15px; margin-bottom: 12px }
  .bj-tablewrap:not([data-invoices-card]) .bj-table td { display: block; padding: 0; border: 0; text-align: left; order: 3 }
  .bj-tablewrap:not([data-invoices-card]) .bj-table td.hide-sm { display: none }
  /* Titre : client / offre — pleine largeur, en tête (place à droite pour le •••). */
  .bj-tablewrap:not([data-invoices-card]) .bj-table td:has(.bj-cli), .bj-tablewrap:not([data-invoices-card]) .bj-table td:has(.bj-client), .bj-tablewrap:not([data-invoices-card]) .bj-table td:has(.bj-name) { flex: 1 1 100%; order: 1; font-weight: 500; padding-right: 36px }
  /* Numéro de facture : muté, juste sous le titre. */
  .bj-tablewrap:not([data-invoices-card]) .bj-table td.mono { flex: 1 1 100%; order: 2; margin-top: -4px; color: var(--bj-text-3); font-size: 13px }
  /* Lignes de détail (offre, quand, créneau…) : pleine largeur, discrètes. */
  .bj-tablewrap:not([data-invoices-card]) .bj-table td[data-label]:not(.num):not(:has(.bj-badge)) { flex: 1 1 100%; order: 4; color: var(--bj-text-2); font-size: 13.5px }
  /* Pied : montant (gauche, marqué) + statut (poussé à droite). */
  .bj-tablewrap:not([data-invoices-card]) .bj-table td.num { order: 5; margin-top: 3px; font-weight: 500; font-size: 16px }
  .bj-tablewrap:not([data-invoices-card]) .bj-table td:has(.bj-badge) { order: 6; margin-top: 3px; margin-left: auto; font-weight: 400; font-size: 14px }
  /* Menu d'actions ••• : coin haut-droite. */
  .bj-tablewrap:not([data-invoices-card]) .bj-table td:has(.bj-rowact), .bj-tablewrap:not([data-invoices-card]) .bj-table td:has(.bj-rowwrap) { position: absolute; top: 13px; right: 12px; padding: 0 }
  /* Boutons texte (Voir / Modifier) : pleine largeur en bas de carte. */
  .bj-tablewrap:not([data-invoices-card]) .bj-table td:has(.bj-row-actions) { flex: 1 1 100%; order: 8; margin-top: 9px; font-size: 14px }
  .bj-tablewrap:not([data-invoices-card]) .bj-table td:has(.bj-row-actions) .bj-btn { width: 100%; justify-content: center }

  /* ══════════════════════════════════════════════════════════════════════
   * FACTURES ÉQUIPE — carte mobile ROBUSTE (data-invoices-card).
   * Rendu déterministe par classes explicites bj-c-* au lieu de l'heuristique
   * td:has() ci-dessus (fragile). Fidèle à la maquette écran 4 (mobile-team) :
   *  — filet fin (pas de boîte), place laissée à la tabbar (padding bas),
   *  — client = titre (500) + sous-titre « n° · échéance » discret (jamais gras),
   *  — Total = montant tabulaire 500 + badge Stripe groupés en haut-droite,
   *  — menu ⋯ TOUJOURS visible sous le Total (norme : jamais caché au hover).
   * Surcharge par SPÉCIFICITÉ ([data-invoices-card] …) les règles génériques.
   * ════════════════════════════════════════════════════════════════════ */
  .bj-tablewrap[data-invoices-card] { overflow: visible; padding: 0 18px calc(98px + env(safe-area-inset-bottom, 0px)) }
  /* Ligne = flex à filet fin (maquette .bj-rrow) : [main] [total] [⋯]. */
  .bj-tablewrap[data-invoices-card] .bj-table { width: 100%; display: block }
  .bj-tablewrap[data-invoices-card] .bj-table tbody { display: block; width: 100% }
  .bj-tablewrap[data-invoices-card] .bj-table tr { display: flex; width: 100%; flex-wrap: nowrap; align-items: center; gap: 8px; background: none; border: 0; border-top: 1px solid var(--bj-cr); border-radius: 0; padding: 14px 0; margin: 0; min-height: 44px }
  .bj-tablewrap[data-invoices-card] .bj-table tr:first-child { border-top: 0 }
  .bj-tablewrap[data-invoices-card] .bj-table tr:active { background: var(--bj-hover) }
  /* Réinitialise les bordures de CELLULE héritées de la table desktop : sinon
     chaque cellule flex porte son propre filet haut → segments fragmentés (le vrai
     filet de carte est porté par la ligne `tr`). */
  .bj-tablewrap[data-invoices-card] .bj-table td { border: 0 }
  /* Colonne gauche (grow) : client (titre 500) + sous-titre n° · échéance. */
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-client { flex: 1; min-width: 0; padding: 0; margin: 0; order: 1 }
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-client .bj-cli { display: block; font-size: 14px; font-weight: 500; color: var(--bj-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis }
  /* L'avatar n'a pas sa place sur la carte (titre = simple nom, comme la maquette). */
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-client .bj-avatar { display: none }
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-client .bj-c-meta { display: block; margin-top: 3px; font-size: 13px; font-weight: 400; color: var(--bj-text-2); font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis }
  /* Total (montant + badge) empilés à droite. */
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-total { flex: 0 0 auto; padding: 0; margin: 0; order: 2 }
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-total .bj-total { flex-direction: column; align-items: flex-end; gap: 5px }
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-total .bj-amt { font-size: 14px }
  /* Cellules absorbées dans le sous-titre / superflues sur la carte : masquées. */
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-num,
  .bj-tablewrap[data-invoices-card] .bj-table td.hide-sm { display: none }
  /* Menu ⋯ : en bout de ligne, TOUJOURS visible, cible ≥ 44 px. */
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-act { flex: 0 0 auto; position: static; padding: 0; margin: 0 -14px 0 0; order: 3 }
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-act .bj-rowwrap { position: static }
  .bj-tablewrap[data-invoices-card] .bj-table td.bj-c-act .bj-rowact { min-width: 44px; min-height: 44px; display: inline-flex; align-items: center; justify-content: flex-start; color: var(--bj-text-3); font-size: 18px }

  /* ══════════════════════════════════════════════════════════════════════
   * ÉQUIPE — carte mobile (data-team-card). S'appuie sur l'heuristique carte
   * générique (nom = titre + ••• coin, e-mail + dernière connexion = lignes de
   * détail via data-label) et ne corrige que 3 points par SPÉCIFICITÉ :
   *  — le rôle est un badge : l'heuristique le pousse à droite comme un statut ;
   *    on le ramène en petit détail sous le nom (order 2, à gauche) ;
   *  — la dernière connexion reçoit un libellé « Dernière connexion : » (sinon
   *    une date nue serait ambiguë hors de son entête de colonne) ;
   *  — la cellule d'action VIDE (« — » sans menu) est inutile sur la carte.
   * ════════════════════════════════════════════════════════════════════ */
  .bj-tablewrap[data-team-card] .bj-table td[data-label="Rôle"] { order: 2; margin: 2px 0 0; margin-left: 0 }
  .bj-tablewrap[data-team-card] .bj-table td[data-label="E-mail"] .bj-link { color: var(--bj-text-2); text-decoration: none }
  .bj-tablewrap[data-team-card] .bj-table td[data-label="Dernière connexion"]::before { content: "Dernière connexion : "; color: var(--bj-text-3) }
  .bj-tablewrap[data-team-card] .bj-table td.num:not(:has(.bj-rowwrap)) { display: none }

  /* ══════════════════════════════════════════════════════════════════════
   * CRM / CLIENTS — carte mobile (data-clients-card). L'heuristique générique
   * amputait la carte : e-mail/téléphone/total sont en `hide-sm` (masqués) et
   * il ne restait que « nom + nombre de résas nu ». De plus le badge « Prospect »
   * vit DANS la cellule titre → `td:has(.bj-badge)` (order 6) écrasait le titre
   * et le renvoyait en bas-droite. On rétablit par SPÉCIFICITÉ :
   *  — la cellule titre (`td:has(.bj-client)`) reprend sa place en tête ;
   *  — e-mail, téléphone, total : on annule `hide-sm` et on les remet en lignes
   *    de détail labellisées (`data-label`) VISIBLES ;
   *  — « Réservations » (td.num nu) reçoit un libellé « Réservations : » ;
   *  — « Total dépensé » (td.num) reçoit « Total : ».
   * ════════════════════════════════════════════════════════════════════ */
  .bj-tablewrap[data-clients-card] .bj-table td:has(.bj-client) { flex: 1 1 100%; order: 1; margin: 0; padding-right: 36px; font-weight: 500 }
  .bj-tablewrap[data-clients-card] .bj-table td.hide-sm { display: block }
  .bj-tablewrap[data-clients-card] .bj-table td[data-label="E-mail"],
  .bj-tablewrap[data-clients-card] .bj-table td[data-label="Téléphone"] { flex: 1 1 100%; order: 4; margin: 2px 0 0; color: var(--bj-text-2); font-size: 13.5px }
  .bj-tablewrap[data-clients-card] .bj-table td[data-label="E-mail"] .bj-link,
  .bj-tablewrap[data-clients-card] .bj-table td[data-label="Téléphone"] .bj-link { color: var(--bj-text-2); text-decoration: none }
  .bj-tablewrap[data-clients-card] .bj-table td[data-label="Réservations"] { order: 5; margin-top: 5px; margin-left: 0; font-weight: 400; font-size: 13.5px; color: var(--bj-text-2) }
  .bj-tablewrap[data-clients-card] .bj-table td[data-label="Réservations"]::before { content: "Réservations : "; color: var(--bj-text-3) }
  .bj-tablewrap[data-clients-card] .bj-table td[data-label="Total dépensé"] { order: 6; margin-top: 5px; margin-left: auto; font-weight: 500; font-size: 14px }
  .bj-tablewrap[data-clients-card] .bj-table td[data-label="Total dépensé"]::before { content: "Total : "; font-weight: 400; color: var(--bj-text-3) }

  /* ══════════════════════════════════════════════════════════════════════
   * PACKS — historique des journées (data-packhist-card). Aucune cellule ne
   * matchait un pattern de titre → pile de valeurs nues dans l'ordre DOM.
   * On donne un titre (la date, portée par .bj-name), on labellise créneau et
   * « posée par », on pousse le statut en pied à droite, et on place proprement
   * l'action : bouton « Annuler » pleine largeur (équipe) ou menu ••• en coin
   * (pro, via .bj-rowwrap déjà géré par l'heuristique).
   * ════════════════════════════════════════════════════════════════════ */
  .bj-tablewrap[data-packhist-card] .bj-table td[data-label="Date"] { flex: 1 1 100%; order: 1; margin: 0; padding-right: 36px; font-weight: 500 }
  .bj-tablewrap[data-packhist-card] .bj-table td[data-label="Date"] .bj-name { font-weight: 500 }
  .bj-tablewrap[data-packhist-card] .bj-table td[data-label="Créneau"] { flex: 1 1 100%; order: 3; margin: 2px 0 0; color: var(--bj-text-2); font-size: 13.5px }
  .bj-tablewrap[data-packhist-card] .bj-table td[data-label="Créneau"]::before { content: "Créneau : "; color: var(--bj-text-3) }
  .bj-tablewrap[data-packhist-card] .bj-table td[data-label="Posée par"] { flex: 1 1 100%; order: 4; margin: 2px 0 0; color: var(--bj-text-2); font-size: 13.5px }
  .bj-tablewrap[data-packhist-card] .bj-table td[data-label="Posée par"]::before { content: "Posée par : "; color: var(--bj-text-3) }
  .bj-tablewrap[data-packhist-card] .bj-table td:has(.bj-badge) { order: 6; margin-top: 6px; margin-left: 0; font-weight: 400; font-size: 14px }
  /* Action « Annuler » (équipe) : cellule td.num contenant un bouton → pleine
     largeur en pied de carte. La cellule d'action VIDE (pas d'annulation
     possible) est masquée. Le menu ••• (pro, .bj-rowwrap) reste en coin. */
  .bj-tablewrap[data-packhist-card] .bj-table td.num:has(.bj-btn) { flex: 1 1 100%; order: 8; margin-top: 10px; padding: 0 }
  .bj-tablewrap[data-packhist-card] .bj-table td.num:has(.bj-btn) .bj-btn { width: 100%; justify-content: center; min-height: 44px }
  .bj-tablewrap[data-packhist-card] .bj-table td.num:not(:has(.bj-btn)):not(:has(.bj-rowwrap)) { display: none }

  /* ══════════════════════════════════════════════════════════════════════
   * RESSOURCES — liste des espaces (data-resources-card). L'heuristique carte
   * suffit presque (titre = .bj-client, capacité labellisée, badge « Sans
   * offre » en pied, ••• en coin) ; on ne fait que préfixer le compte d'offres
   * NU (« 3 offres ») pour lever l'ambiguïté, sans toucher au badge.
   * ════════════════════════════════════════════════════════════════════ */
  .bj-tablewrap[data-resources-card] .bj-table td[data-label="Offres"]:not(:has(.bj-badge))::before { content: "Offres : "; color: var(--bj-text-3) }

  /* ══════════════════════════════════════════════════════════════════════
   * OFFRES d'une ressource (data-offers-card). Table .bj-offers : 3 cellules
   * NUES (nom+descripteur via .bj-fx-cell, prix .num, crayon .num.bj-fx-editcell)
   * qui, sans scope, se tassent sur une seule ligne. On empile : nom en titre
   * pleine largeur (le <b> passe en 600, pas de 700), descripteur en gris sous
   * le titre, prix labellisé « Prix : » en pied à gauche, crayon en coin.
   * ════════════════════════════════════════════════════════════════════ */
  .bj-tablewrap[data-offers-card] .bj-table td:has(.bj-fx-cell) { flex: 1 1 100%; order: 1; padding-right: 36px }
  .bj-tablewrap[data-offers-card] .bj-table .bj-fx-cell { display: flex; align-items: flex-start; gap: 10px }
  .bj-tablewrap[data-offers-card] .bj-table .bj-fx-txt { display: block }
  .bj-tablewrap[data-offers-card] .bj-table .bj-fx-txt b { font-weight: 600; font-size: 14px; color: var(--bj-text) }
  .bj-tablewrap[data-offers-card] .bj-table .bj-fx-txt > span { display: block; margin-top: 2px; color: var(--bj-text-2); font-size: 13.5px }
  .bj-tablewrap[data-offers-card] .bj-table td.num:has(.bj-fx-price) { flex: 1 1 100%; order: 2; margin-top: 8px; font-weight: 500; font-size: 14px }
  .bj-tablewrap[data-offers-card] .bj-table td.num:has(.bj-fx-price)::before { content: "Prix : "; font-weight: 400; color: var(--bj-text-3) }
  /* Prix déjà porté par le descripteur (tout sauf pack-jour-fixe) → la ligne
     « Prix » de la carte mobile ferait doublon : masquée. Le desktop garde sa
     colonne Prix. (Même spécificité que la règle ci-dessus + plus bas → gagne.) */
  .bj-tablewrap[data-offers-card] .bj-table td.num.bj-fx-price-dup { display: none }
  .bj-tablewrap[data-offers-card] .bj-table td.bj-fx-editcell { position: absolute; top: 14px; right: 14px; order: 0; margin: 0; padding: 0 }
  .bj-tablewrap[data-offers-card] .bj-table td.bj-fx-editcell .bj-fx-edit { color: var(--bj-text-3); font-size: 17px }

  /* ══════════════════════════════════════════════════════════════════════
   * HISTORIQUE ABONNEMENT (data-subhist-card). Table .bj-abo-inv (PAS .bj-table)
   * → l'heuristique carte ne s'y applique pas ; on convertit explicitement :
   * date en titre, montant et statut labellisés, lien « Afficher » en pied.
   * ════════════════════════════════════════════════════════════════════ */
  .bj-tablewrap[data-subhist-card] { overflow: visible }
  .bj-tablewrap[data-subhist-card] .bj-abo-inv,
  .bj-tablewrap[data-subhist-card] .bj-abo-inv tbody { display: block; width: 100% }
  .bj-tablewrap[data-subhist-card] .bj-abo-inv tr { display: flex; flex-wrap: wrap; align-items: center; column-gap: 10px; row-gap: 7px; position: relative; background: var(--bj-surface); border: 1px solid var(--bj-cr); border-radius: 16px; padding: 16px; margin-bottom: 12px }
  .bj-tablewrap[data-subhist-card] .bj-abo-inv tr:first-child td { border-top: 0 }
  .bj-tablewrap[data-subhist-card] .bj-abo-inv td { display: block; padding: 0; border: 0; text-align: left }
  .bj-tablewrap[data-subhist-card] .bj-abo-inv td[data-label="Date"] { flex: 1 1 100%; order: 1; padding-right: 90px; font-weight: 500; color: var(--bj-text) }
  .bj-tablewrap[data-subhist-card] .bj-abo-inv td[data-label="Montant"] { order: 4; margin-top: 2px; color: var(--bj-text-2); font-size: 13.5px }
  .bj-tablewrap[data-subhist-card] .bj-abo-inv td[data-label="Montant"]::before { content: "Montant : "; color: var(--bj-text-3) }
  .bj-tablewrap[data-subhist-card] .bj-abo-inv td[data-label="Statut"] { position: absolute; top: 14px; right: 14px; order: 2; font-size: 14px }
  .bj-tablewrap[data-subhist-card] .bj-abo-inv td.bj-abo-inv__act { flex: 1 1 100%; order: 6; margin-top: 9px; font-size: 14px }
  /* Ligne sans facture affichable (« — » nu) : inutile sur la carte mobile. */
  .bj-tablewrap[data-subhist-card] .bj-abo-inv td.bj-abo-inv__act:not(:has(.bj-abo-show)) { display: none }

}

@media (prefers-reduced-motion: reduce) { * { transition: none !important } }

/* ── FullCalendar — theming scopé .fc (jamais de sélecteurs nus) ─────── */
.bj-cal-fc { border: 1px solid var(--bj-cr); border-radius: 12px; overflow: hidden; background: #fff; padding: 6px 10px 10px }

.fc {
  --fc-border-color: var(--bj-cr);
  --fc-today-bg-color: #FBF6F4;
  --fc-page-bg-color: #fff;
  --fc-now-indicator-color: var(--bj-clay);
  font-family: var(--bj-font);
  font-size: 13px;
}
/* border:0 COMPLET : la carte .bj-cal-fc porte déjà le cadre arrondi — les bords
   droite/bas du scrollgrid dessinaient un 2e cadre interne (bug signalé, vue mois). */
.fc .fc-scrollgrid { border: 0 }
/* …et les CELLULES du dernier rang / de la dernière colonne dessinent encore leur
   trait droit/bas contre le cadre de la carte (2e signalement) : on ne retire QUE
   les bords extérieurs — les filets internes restent. */
.fc-theme-standard th:last-child, .fc-theme-standard td:last-child { border-right: 0 }
.fc .fc-scrollgrid tbody tr:last-child > td { border-bottom: 0 }
.fc .fc-scrollgrid-section > td, .fc .fc-scrollgrid-section > th { border-right: 0; border-bottom: 0 }
.fc-theme-standard td, .fc-theme-standard th { border-color: var(--bj-cr) }
.fc .fc-col-header-cell-cushion { color: var(--bj-text-2); font-weight: 500; font-size: 12px; padding: 9px 6px; text-decoration: none }
.fc .fc-day-today .fc-col-header-cell-cushion { color: var(--bj-clay); font-weight: 600 }
.fc .fc-timegrid-slot-label-cushion, .fc .fc-timegrid-axis-cushion { color: var(--bj-text-3); font-size: 11px }
.fc .fc-timegrid-slot { height: 48px }
.fc .fc-daygrid-day-number { color: var(--bj-text-2); font-size: 12.5px; text-decoration: none; padding: 6px 8px }
.fc .fc-daygrid-day.fc-day-today .fc-daygrid-day-number { color: #fff; background: var(--bj-clay); border-radius: 50%; width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; margin: 5px 6px 0 0 }
/* Event NEUTRE (monochrome) : fond atténué unique, SANS bordure ; l'espace est
   le seul différenciateur (libellé), jamais la couleur. Rendu Jour/Semaine :
   espace en gras au-dessus, client dessous. */
.fc .fc-event { border: 1px solid rgba(51,41,36,.12) !important; border-radius: 8px !important; padding: 4px 7px; cursor: pointer; font-size: 11.5px; line-height: 1.3; box-shadow: 0 1px 2px rgba(51,41,36,.05) !important; background: var(--bj-muted-bg); color: var(--bj-text) !important; --fc-event-text-color: var(--bj-text); transition: box-shadow .15s var(--bj-ease-out), border-color .15s var(--bj-ease-out), transform .08s var(--bj-ease-out) }
.fc .fc-event.bj-evt:hover { border-color: rgba(51,41,36,.2) !important }
.fc .fc-event:hover { box-shadow: 0 2px 8px rgba(51,41,36,.14) !important }
.fc .fc-event:active { transform: scale(.99) }
.bj-evt-c b { display: block; font-weight: 500; color: inherit; white-space: nowrap; overflow: hidden; text-overflow: ellipsis }
.bj-evt-c b i { font-size: 12px; vertical-align: -1px }
.bj-evt-c span { display: block; color: var(--bj-text-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis }
/* Montant sur le bloc (Jour/Semaine) : chiffres tabulaires, discret. */
.bj-evt-c .bj-evt-price { font-size: 11px; color: var(--bj-text-2); font-variant-numeric: tabular-nums }
/* Résa passée / terminée : event atténué (toutes vues). */
.fc .fc-event.bj-evt--past { opacity: .5 }
/* « Mon calendrier » (espace pro) : conteneur du calendrier lecture seule. */
.bj-mycal-wrap { margin-top: 2px }
.bj-mycal-wrap .fc { font-size: 13px }
.fc .fc-event.bj-evt { cursor: pointer }
/* Récap du popup « Mon calendrier » (clic sur une réservation). */
.bj-mycal-recap { margin: 14px 0 4px }
.bj-mycal-row { display: flex; justify-content: space-between; gap: 12px; padding: 6px 0; font-size: 13.5px; border-bottom: 1px solid var(--bj-cr) }
.bj-mycal-row:last-child { border-bottom: 0 }
.bj-mycal-row > span { color: var(--bj-text-2) }
.bj-mycal-row > b { font-weight: 500; text-align: right }

/* À régler (hold 24 h) : pointillé, transparent, atténué + horloge (Jour/Semaine). */
.fc .fc-event.bj-evt--hold { background: transparent !important; border: 1px dashed var(--bj-cr) !important }
.fc .fc-event.bj-evt--hold .bj-evt-c b { font-weight: 500; color: var(--bj-text-2) }

/* Blocage : FOND PLEIN espresso (couleur du bouton d'action principal), texte
   clair (Jour/Semaine). Sobre, monochrome, un SEUL traitement — pas de bordure
   claire ni d'outline redondant (invisibles/moches sur fond foncé). Deux portées
   coexistent au même créneau :
   - GLOBAL (tous les espaces) : EN DESSOUS.
   - ESPACE (un seul) : prend l'ASCENDANT (z-index) et un léger liseré clair pour
     se distinguer subtilement quand il « noie » un global ou un autre blocage. */
.fc .fc-event.bj-evt--block { background: var(--bj-text) !important; color: var(--bj-btn-fg) !important; --fc-event-text-color: var(--bj-btn-fg); border: 0 !important; background-image: none !important }
.fc .fc-event.bj-evt--block .bj-evt-c b, .fc .fc-event.bj-evt--block .bj-evt-c b i, .fc .fc-event.bj-evt--block .bj-evt-c span { color: var(--bj-btn-fg) }
.fc .fc-event.bj-evt--block:hover { border: 0 !important }
.fc .fc-event.bj-evt--block-global { z-index: 1 }
.fc .fc-event.bj-evt--block-resource { z-index: 3; box-shadow: inset 0 0 0 1px rgba(255,255,255,.28) !important }

/* ── Vue Mois : PASTILLE compacte (différenciée par le LIBELLÉ) ──────── */
/* border:0 : sans lui, le wrapper hérite de la bordure générique .fc-event ET la
   pastille interne a la sienne → DOUBLE contour (bug signalé, vue mois). */
.fc-daygrid-event.bj-evt { padding: 0 !important; background: transparent !important; box-shadow: none !important; border: 0 !important; margin-top: 2px }
.fc-daygrid-event.bj-evt:hover { box-shadow: none !important }
.fc-daygrid-event.bj-evt .fc-event-main { padding: 0 }
.bj-mevt-c { display: flex; align-items: center; gap: 5px; background: var(--bj-muted-bg); color: var(--bj-text); font-weight: 500; font-size: 11.5px; line-height: 1; padding: 4px 8px; border: 1px solid rgba(51,41,36,.1); border-radius: 999px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis }
.bj-mevt-c i { font-size: 12px; flex-shrink: 0 }
/* Marqueur « journée de pack » : icône colis discrète, monochrome atténuée
   (jamais une couleur) — différencie une journée de pack d'une résa payée. */
.bj-evt-pack { color: var(--bj-text-2); opacity: .85 }
/* À régler (Mois) : pastille en pointillé + horloge. */
.fc-daygrid-event.bj-evt--hold { background: transparent !important; border: 0 !important }
.fc-daygrid-event.bj-evt--hold .bj-mevt-c { background: transparent; border: 1px dashed var(--bj-cr); color: var(--bj-text-2); font-weight: 400; padding: 3px 7px }
/* Blocage (Mois) : pastille à FOND PLEIN espresso, texte clair, un seul traitement
   (ni bordure claire ni outline). Le liseré interne subtil distingue un blocage
   d'ESPACE d'un blocage GLOBAL. */
.fc-daygrid-event.bj-evt--block .bj-mevt-c { background: var(--bj-text); color: var(--bj-btn-fg); border-color: transparent }
.fc-daygrid-event.bj-evt--block .bj-mevt-c i { color: var(--bj-btn-fg) }
.fc-daygrid-event.bj-evt--block-resource .bj-mevt-c { box-shadow: inset 0 0 0 1px rgba(255,255,255,.3) }

/* ── Rangée « Journée » (all-day) des vues Jour/Semaine ──────────────── */
/* Les réservations à la journée y arrivent en events allDay rendus en PASTILLES
   compactes (.bj-mevt-c). Le harnais all-day de FullCalendar est un
   .fc-daygrid-event : les règles anti double-contour de la vue Mois ci-dessus
   (padding 0, fond/bordure/ombre du wrapper neutralisés) s'appliquent déjà —
   AUCUNE surcharge d'event à dupliquer ici. Reste : libellé d'axe qui ne se coupe
   pas, respiration sobre autour des pastilles (elles s'empilent, la rangée peut
   grandir — c'est voulu), et séparateur fin vers la grille horaire. */
.fc .fc-timegrid-axis-cushion { white-space: nowrap }
.fc .fc-timegrid .fc-daygrid-day-events { margin: 2px 2px 3px }
/* Séparateur rangée « Journée » / grille horaire : filet crème discret à la place
   de la barre grise épaisse par défaut (padding du .fc-cell-shaded). */
.fc .fc-timegrid-divider { padding: 0; background: var(--bj-bg) }

/* Repli « +N espaces ». */
.fc .fc-daygrid-more-link { font-size: 11px; color: var(--bj-text-2); font-weight: 400; margin-top: 3px }
.fc .fc-daygrid-more-link:hover { color: var(--bj-text) }

/* Mois : numéro du jour à GAUCHE (comme la maquette). */
.fc .fc-daygrid-day-top { flex-direction: row }

/* Vue Liste (listMonth) : l'event est un <tr>, pas un bloc positionné de grille.
   On neutralise le style grille `.bj-evt`/`.bj-evt--hold`/`.bj-evt--block`
   (pastille, pointillé, hachures) qui casserait la mise en page du tableau. */
.fc-list-event.bj-evt { position: static; left: auto; right: auto; border: 0 !important; border-radius: 0; padding: 0; font-size: 13.5px; overflow: visible; transition: none; background: none !important; background-image: none !important }
.fc-list-event.bj-evt:hover { box-shadow: none }
.fc-list-event.bj-evt .bj-mevt-c { background: none; padding: 0; border: 0; border-radius: 0; display: inline; font-weight: 500 }
.fc .fc-list-event:hover td { background: var(--bj-hover) }
.fc-list-event .bj-evt-c b { font-weight: 500 }
/* Vue Liste : pas de carte/conteneur autour (.bj-cal-fc) — la liste s'affiche à
   plat. La carte reste sur les vues grille (Jour/Semaine/Mois). */
.bj-cal-fc:has(.fc-list) { border: 0; border-radius: 0; padding: 0; background: none; overflow: visible }
.fc .fc-list { border: 0 }
/* ── Vue Liste épurée : en-tête de jour en crème (pas de barre grise lourde),
      pastille FC retirée, heure tabulaire, lignes aérées. ── */
.fc .fc-list-day-cushion { background: var(--bj-bg); padding: 10px 16px }
.fc .fc-list-day-text, .fc .fc-list-day-side-text { color: var(--bj-text-2) }
.fc .fc-list-day-side-text { color: var(--bj-text-3); font-weight: 400 }
.fc .fc-list-table td { padding: 12px 16px; border-color: var(--bj-cr) }
.fc .fc-list-event-time { color: var(--bj-text-2); white-space: nowrap; font-variant-numeric: tabular-nums; width: 116px }
.fc .fc-list-event-graphic { display: none }
/* ── Calendrier : demi-heures plus discrètes que les heures pleines. ── */
.fc .fc-timegrid-slot-minor { border-top-color: #F3EFE8 }
/* Chip « À facturer (N) » du calendrier : réservations fermes jamais facturées.
   Variante warn (mêmes couleurs que .bj-badge--warn), lien vers ?filter=a_facturer. */
.bj-cal-afacturer { background: #FBF0D6; color: #97670F; border-color: #EFD9A4; gap: 5px; text-decoration: none; font-weight: 500 }
.bj-cal-afacturer:hover { background: #FBF0D6; color: #97670F; border-color: #EFD9A4; opacity: .85 }
.bj-cal-afacturer i { font-size: 13px }
.fc .fc-list { border-radius: 12px; overflow: hidden }
/* En-têtes de jour de la vue Liste : pas de gras (règle Delvic : aucun bold). */
.fc .fc-list-day-text, .fc .fc-list-day-side-text { font-weight: 500 }
.fc .fc-list-event:hover td { background: var(--bj-hover) }
.fc .fc-list-day-cushion { background: var(--bj-hover) }
.fc .fc-list-event-dot { display: none }

/* ── Tableau de bord — classes .bj-dash* (portées depuis dashboard.css
 *    pour que le front /espace/pilotage soit stylé via espace.css ;
 *    dashboard.css reste chargé en wp-admin — NE PAS le supprimer).
 *    Fond blanc (--bj-content-bg) pour cohérence DS maquette. ──────── */
.bj-dash { color: var(--bj-text); font-family: var(--bj-font) }
.bj-dash__filters { display: flex; align-items: center; gap: 12px; flex-wrap: wrap }
/* Select Espace (repli natif sans JS) : même pilule grise que le segmenté (36px). */
.bj-dash__res { box-sizing: border-box; height: 36px; font: 500 13px var(--bj-font); padding: 0 12px; border: 1px solid transparent; border-radius: 9px; background: var(--bj-hover); color: var(--bj-text); cursor: pointer; max-width: 220px }
.bj-dash__res:focus { outline: 0; border-color: var(--bj-text) }
/* Les chips restants des barres (alerte demandes / à facturer) : même hauteur que
   le segmenté et la pilule période (36px). */
.bj-dash__filters .bj-chip, .bj-filters .bj-chip { box-sizing: border-box; min-height: 36px; border-radius: 9px }
/* Form de filtres dashboard sur le front : transparent (pas de boîte propre) →
 * ses enfants (select + chips) deviennent enfants directs de `.bj-filters` et
 * s'alignent au même bord que le titre/contenu. Évite le double padding. */
.bj-filters-form { display: contents }

/* ── Pilule « Période » façon Stripe (tableau de bord) ─────────────────────────
 * Pilule CLAIRE, même famille que le contrôle segmenté `.bj-segbar` : fond gris
 * --bj-hover, texte --bj-text, poids 500 (JAMAIS de bold), hauteur 36px, radius
 * pilule. État OUVERT (aria-expanded, posé par espace-period.js) = bordure
 * accentuée. Menu déroulant blanc inchangé. Cible tactile ≥44px sous
 * (pointer: coarse). NB : la console front ne charge QUE espace.css
 * (admin.css n'existe plus ; wp-admin redirige vers /espace). */
.bj-period { position: relative; display: inline-flex }
.bj-period__btn { box-sizing: border-box; display: inline-flex; align-items: center; gap: 8px; border: 1px solid transparent; border-radius: 9px; padding: 7px 14px; min-height: 36px; background: var(--bj-hover); color: var(--bj-text); font: 500 13px var(--bj-font); cursor: pointer; white-space: nowrap; transition: background var(--bj-dur-base) var(--bj-ease-out), border-color var(--bj-dur-base) var(--bj-ease-out), transform .08s var(--bj-ease-out) }
.bj-period__btn:hover { background: #F0EEEA }
.bj-period__btn:active { transform: scale(.97) }
.bj-period__btn:focus-visible { outline: 0; box-shadow: 0 0 0 3px rgba(51,41,36,.12) }
.bj-period__btn[aria-expanded="true"] { border-color: var(--bj-text) }
.bj-period__btn .ti-calendar-event { font-size: 15px }
.bj-period__btn .ti-chevron-down { font-size: 14px; opacity: .72 }
.bj-period__menu { position: absolute; top: calc(100% + 6px); left: 0; z-index: 80; min-width: 224px; max-width: calc(100vw - 32px); background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 10px; box-shadow: 0 8px 24px rgba(51,41,36,.12); padding: 6px }
/* Anti-débordement viewport (posée par espace-period.js si le menu sort à droite). */
.bj-period__menu--right { left: auto; right: 0 }
.bj-period__opt { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 10px; border-radius: 7px; font-size: 13px; color: var(--bj-text); text-decoration: none }
.bj-period__opt:hover { background: var(--bj-hover) }
.bj-period__opt--on { font-weight: 500 }
.bj-period__opt .ti-check, .bj-period__custom-title .ti-check { font-size: 14px; color: var(--bj-text) }
.bj-period__custom { border-top: 1px solid var(--bj-cr); margin-top: 6px; padding: 8px 10px 6px }
.bj-period__custom-title { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 11px; letter-spacing: .06em; text-transform: uppercase; color: var(--bj-text-3); margin-bottom: 7px }
.bj-period__custom--on .bj-period__custom-title { color: var(--bj-text) }
.bj-period__custom-row { display: flex; align-items: center; gap: 6px }
.bj-period__date { flex: 1; min-width: 0; box-sizing: border-box; font: 400 12.5px var(--bj-font); border: 1px solid var(--bj-cr); border-radius: 7px; padding: 5px 7px; background: var(--bj-content-bg); color: var(--bj-text) }
.bj-period__date:focus { outline: 0; border-color: var(--bj-text); box-shadow: 0 0 0 3px rgba(51,41,36,.10) }
.bj-period__arrow { color: var(--bj-text-3); font-size: 12px; flex: none }
.bj-period__apply { flex: none; border: 0; border-radius: 7px; background: var(--bj-text); color: var(--bj-btn-fg); font: 500 12.5px var(--bj-font); padding: 6px 10px; cursor: pointer }
.bj-period__apply:hover { background: #241c18 }
@media (pointer: coarse) {
  /* Cibles tactiles ≥44px : segments, pilule + options du menu. */
  .bj-segbar__opt { min-height: 44px }
  .bj-period__btn { min-height: 44px }
  .bj-period__opt { min-height: 44px; box-sizing: border-box }
  .bj-period__apply { min-height: 40px }
}
.bj-dash__kpis { display: grid; grid-template-columns: repeat(4,1fr); gap: 14px; margin-bottom: 18px }
.bj-dash__kpi { background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 12px; padding: 16px 18px }
.bj-dash__kpi-label { font-size: 12px; color: var(--bj-text-2); margin-bottom: 8px }
.bj-dash__kpi-value { font-size: 26px; font-weight: 600; font-variant-numeric: tabular-nums }
.bj-dash__kpi-sub { font-size: 12px; color: var(--bj-text-2); margin-top: 4px; font-variant-numeric: tabular-nums; display: flex; align-items: center; gap: 5px }
.bj-dash__grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 14px }
.bj-dash__card { background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 12px; padding: 16px 18px }
.bj-dash__card--wide { grid-column: 1 / -1 }
.bj-dash__card-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 14px }
.bj-dash__card-head .bj-dash__title { margin-bottom: 0 }
.bj-dash__panel-link { font-size: 12.5px; color: var(--bj-text-2); text-decoration: none; display: inline-flex; align-items: center; gap: 3px; white-space: nowrap }
.bj-dash__panel-link:hover { color: var(--bj-text) }
.bj-av { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 50%; font-size: 11px; font-weight: 600; flex-shrink: 0 }
.bj-dash__title { font-size: 13px; font-weight: 600; color: var(--bj-text-2); margin: 0 0 14px }
.bj-dash__empty { font-size: 13px; color: var(--bj-text-2); margin: 0 }
.bj-dash__bars { display: flex; flex-direction: column; gap: 10px }
.bj-dash__bar-row { display: grid; grid-template-columns: 1fr 2fr auto; align-items: center; gap: 10px; font-size: 13px }
.bj-dash__bar-name { color: var(--bj-text) }
.bj-dash__bar-track { height: 8px; background: var(--bj-cr); border-radius: 999px; overflow: hidden }
.bj-dash__bar-fill { display: block; height: 100%; background: var(--bj-clay); border-radius: 999px; transition: width .4s ease }
.bj-dash__bar-val { color: var(--bj-text-2); font-variant-numeric: tabular-nums }
/* ── Graphe du CA en barres par période (maquette « B ») ──
 * SVG serveur (grille + barres) ; les textes des axes sont en HTML superposé,
 * la bulle de survol est créée par espace-chart.js et masquée au repos. La barre
 * survolée passe en état actif (bj-chart__bar--on, plus foncée). */
.bj-chart__legend { display: flex; flex-wrap: wrap; gap: 6px 18px; margin-bottom: 14px; font-size: 12.5px; color: var(--bj-text-2) }
.bj-chart__key { display: inline-flex; align-items: center; gap: 7px }
.bj-chart__amt { font-weight: 500; color: var(--bj-text); font-variant-numeric: tabular-nums }
.bj-chart__swatch { width: 11px; height: 11px; border-radius: 3px; background: var(--bj-clay); flex-shrink: 0 }
.bj-chart__plot { position: relative; height: 220px }
.bj-chart__svg { width: 100%; height: 100%; display: block }
.bj-chart__grid { stroke: var(--bj-cr); stroke-width: 1 }
.bj-chart__bar { fill: var(--bj-clay); transition: fill .12s ease }
.bj-chart__bar--on { fill: var(--bj-text) }
.bj-chart__ylabels span { position: absolute; left: 0; transform: translateY(3px); font-size: 10.5px; color: var(--bj-text-3); font-variant-numeric: tabular-nums; pointer-events: none }
.bj-chart__xlabels { position: relative; height: 16px; margin-top: 8px; font-size: 11px; color: var(--bj-text-3) }
.bj-chart__xl { position: absolute; top: 0; transform: translateX(-50%); white-space: nowrap; font-variant-numeric: tabular-nums }
.bj-chart__xl--start { transform: none }
.bj-chart__xl--end { transform: translateX(-100%) }
.bj-chart__tip { position: absolute; z-index: 5; background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 10px; padding: 8px 10px; font-size: 12.5px; box-shadow: 0 4px 14px rgba(26,21,18,.08); pointer-events: none; white-space: nowrap; display: none }
.bj-chart__tip-main { font-weight: 500; color: var(--bj-text); font-variant-numeric: tabular-nums }
.bj-chart--on .bj-chart__tip { display: block }
/* Delta KPI (hausse/baisse vs période précédente) */
.bj-kpi__d { display: inline-flex; align-items: center; gap: 3px; font-weight: 500; font-variant-numeric: tabular-nums }
.bj-kpi__d i { font-size: 13px }
.bj-kpi__d.up { color: var(--bj-ok) }
.bj-kpi__d.down { color: var(--bj-err) }
@media (max-width: 1024px) {
  .bj-dash__kpis { grid-template-columns: repeat(2,1fr) }
  .bj-dash__grid { grid-template-columns: 1fr }
}
@media (max-width: 720px) {
  /* Graphe du CA à ≤720 px : barres moins hautes, un repère X sur deux (lisibilité). */
  .bj-chart__plot { height: 170px }
  .bj-chart__xl:nth-child(even) { display: none }
}
@media (prefers-reduced-motion: reduce) {
  .bj-dash__bar-fill, .bj-chart__bar { transition: none }
}

/* ══ Vocabulaire de composants (intégré depuis admin.css, restylé DS, sans crème)
 * Les vues de contenu (CrmView, listes, pages de config) utilisent ces classes.
 * admin.css N'EST PLUS chargé sur le front : tout vit ici. Surfaces blanches,
 * bordures neutres `--bj-cr`, hovers gris neutre. Les classes de SHELL et les
 * doublons (boutons/chips/recherche/avatar/badges) sont volontairement OMIS :
 * le shell + le DS sont définis plus haut dans ce fichier. ══════════════════ */
.bj-h1 { font-size: 20px; font-weight: 600; margin: 0 }
.bj-sub { font-size: 13px; color: var(--bj-text-2); margin: 3px 0 0 }
.bj-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 16px }
.bj-results-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 0 0 12px }
.bj-results-head__l { display: flex; align-items: center; gap: 12px; min-width: 0; flex-wrap: wrap }
.bj-count { font-size: 11px; letter-spacing: .05em; color: var(--bj-text-3); text-transform: uppercase; white-space: nowrap }
.bj-card { background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 12px; padding: 18px 20px; margin-bottom: 14px }
/* Bloc « nu » du détail pack : pas de cadre/fond, juste l'espacement vertical.
   Les cartes KPI et les séparateurs de lignes du tableau gardent leur rendu. */
.bj-pack-block { margin-bottom: 26px }
.bj-pack-block:last-child { margin-bottom: 0 }
.bj-card__title { font: 600 15px var(--bj-font); color: var(--bj-text); margin: 0 0 10px }
.bj-list { display: flex; flex-direction: column }
.bj-row { padding: 12px 0; border-bottom: 1px solid var(--bj-cr) }
.bj-list .bj-row:last-child { border-bottom: 0 }
.bj-row__top { display: flex; align-items: baseline; justify-content: space-between; gap: 12px }
.bj-name { font-size: 15px; font-weight: 500 }
.bj-meta { font-size: 13px; color: var(--bj-text-2) }
.bj-faint { color: var(--bj-text-3); font-weight: 400; font-size: 13px }
.bj-link { color: var(--bj-text); font-size: 13px; text-decoration: none; border-bottom: 1px solid var(--bj-cr); cursor: pointer }
/* (table = composant canonique unique défini plus haut ; pas de redéfinition ici) */
.bj-field--check label { display: flex; align-items: center; gap: 8px }
.bj-field--check input { width: auto }
.bj-empty { font-size: 13px; color: var(--bj-text-2); padding: 14px 16px; text-align: left; margin: 0 }
.bj-empty .bj-btn { margin-top: 10px }
.bj-btn--sm { padding: 5px 10px; font-size: 12px }
.bj-pack-cal { margin-top: 12px }

/* Modal « Poser une journée » (équipe, espace-pack-staff.js) : pièces structurelles.
   Réutilise par ailleurs bj-client-*/tunnel-day/bj-field/bj-recap/bj-pack-cal. */
.bj-pp-packs { display: flex; flex-direction: column; gap: 7px; margin-top: 4px }
.bj-pp-pack { display: flex; flex-direction: column; gap: 2px; width: 100%; text-align: left; background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 9px; padding: 9px 12px; cursor: pointer }
.bj-pp-pack:hover { background: var(--bj-hover); border-color: var(--bj-text-3) }
.bj-pp-pack__l { font-weight: 500; color: var(--bj-text); font-size: 13px }
.bj-pp-pack__meta { font-size: 12px; color: var(--bj-text-2) }
.bj-pp-picked { font-size: 13px; color: var(--bj-text-2); padding: 8px 11px; background: var(--bj-muted-bg); border-radius: 9px; margin-bottom: 10px }
.bj-pp-picked strong { color: var(--bj-text); font-weight: 500 }
.bj-pp-valid { color: var(--bj-text-3) }
.bj-pp-block { background: #FBF7F1; border: 1px solid var(--bj-cr); border-radius: 10px; padding: 10px 13px; font-size: 13px; font-weight: 500; color: var(--bj-text); margin-top: 4px }
.bj-pp-block[hidden] { display: none }
.tunnel-cal__loading { display: block; text-align: center; color: var(--bj-text-3); padding: 14px 0 }

/* Multi-sélection flexible : compteur + chips des journées choisies. */
.bj-pp-cal-label { display: flex; align-items: baseline; justify-content: space-between; gap: 8px }
.bj-pp-counter { font-size: 12px; color: var(--bj-text-2); font-variant-numeric: tabular-nums }
/* Zone des jours choisis BORNÉE : scroll interne à hauteur fixe (≈ 2 lignes) pour
   que le popup ne grandisse plus quand on coche beaucoup de journées. */
.bj-pp-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 9px; max-height: 72px; overflow-y: auto; padding-right: 2px }
.bj-pp-chips[hidden] { display: none }
.bj-pp-chip { padding-right: 6px; gap: 4px }
.bj-pp-chip__x { display: inline-flex; align-items: center; justify-content: center; border: 0; background: transparent; color: inherit; cursor: pointer; padding: 0; margin-left: 2px; line-height: 1; opacity: .75; transition: opacity var(--bj-dur-base) var(--bj-ease-out) }
.bj-pp-chip__x:hover { opacity: 1 }
.bj-pp-chip__x i { font-size: 13px }

/* ── Packs (vues équipe) : badge mode, mini-barre de jours, eye, en-tête détail ── */
/* Offre — Espace (cellule liste) : la ressource est toujours collée à l'offre. */
.bj-pack-offer { display: block; font-size: 13.5px; color: var(--bj-text); font-weight: 500 }
/* Badge « mode » (à la carte / consécutif) : MÊME taille que les badges de statut
   (`.bj-badge`/`.bj-badge--muted`). On ne garde ici que le placement en sous-ligne
   sous l'offre dans la liste — aucune réduction de taille/padding. */
.bj-pack-mode { margin-top: 3px; width: fit-content }
.bj-pack-head__badges .bj-pack-mode { margin-top: 0 }
/* Mini-barre « restants/total » : valeur tabulaire + jauge consommée. */
.bj-days { display: inline-flex; align-items: center; gap: 9px }
.bj-days__v { font-variant-numeric: tabular-nums; font-size: 13px; color: var(--bj-text); white-space: nowrap }
.bj-days__bar { position: relative; width: 64px; height: 5px; border-radius: 999px; background: var(--bj-cr); overflow: hidden }
.bj-days__fill { position: absolute; inset: 0 auto 0 0; height: 100%; border-radius: 999px; background: var(--bj-clay) }
/* Bouton-icône (œil) d'action de ligne, aligné sur la teinte des row-actions. */
.bj-iconbtn { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border-radius: 7px; color: var(--bj-text-3); text-decoration: none; transition: background .12s var(--bj-ease-out), color .12s var(--bj-ease-out) }
.bj-iconbtn i { font-size: 18px }
.bj-iconbtn:hover { background: var(--bj-hover); color: var(--bj-text) }
.bj-table tbody tr:hover .bj-iconbtn { color: var(--bj-text-2) }
/* En-tête de la carte de détail : à gauche le sous-titre client + badges
   (mode/statut, même taille) ; à droite l'action principale + le menu « ⋯ ». */
.bj-pack-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; flex-wrap: wrap }
.bj-pack-head__l { display: flex; flex-direction: column; gap: 8px; min-width: 0 }
.bj-pack-head__sub { font-size: 14px; color: var(--bj-text-2) }
/* Ligne méta unique du détail (« Depuis le … · Expire le … ») — dates jamais en gras. */
.bj-pack-metaline { margin: 18px 0 0; font-size: 13.5px; color: var(--bj-text-2) }
.bj-pack-head__badges { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap }
.bj-pack-head__acts { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap }
/* « ⋯ » de l'en-tête : même empreinte qu'un bouton secondaire (≠ icône de ligne). */
.bj-rowact--btn { display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; border: 1px solid var(--bj-cr); border-radius: var(--bj-radius-sm); background: var(--bj-content-bg) }
.bj-rowact--btn:hover { background: var(--bj-hover) }
/* Filtre espace (liste Packs) : chip-select inline, aligné avec les chips. */
.bj-filters__select { display: inline-flex; align-items: center }

.bj-dl { display: grid; grid-template-columns: max-content 1fr; gap: 8px 18px; margin: 0 }
.bj-dl dt { font: 500 11px var(--bj-font); letter-spacing: .04em; text-transform: uppercase; color: var(--bj-text-3); align-self: center }
.bj-dl dd { margin: 0; font-size: 14px; color: var(--bj-text) }
@media (max-width: 520px) { .bj-dl { grid-template-columns: 1fr; gap: 2px 0 } .bj-dl dd { margin-bottom: 8px } }
.bj-content code { font: 12px ui-monospace, SFMono-Regular, Menlo, monospace; background: var(--bj-hover); padding: 2px 5px; border-radius: 4px; color: var(--bj-text) }
.bj-media-pick { display: flex; align-items: center; gap: 12px; margin-top: 8px }
.bj-media-preview { max-height: 64px; max-width: 200px; border: 1px solid var(--bj-cr); border-radius: 6px; padding: 6px; background: var(--bj-content-bg); object-fit: contain }
.bj-media-choose { flex-shrink: 0 }
.bj-logo-pick { display: flex; align-items: center; gap: 12px; margin-top: 8px }
.bj-logo-preview { max-height: 64px; max-width: 200px; border: 1px solid var(--bj-cr); border-radius: 6px; padding: 6px; background: var(--bj-content-bg); object-fit: contain }
.bj-notice { font-size: 13px; color: var(--bj-ok); background: var(--bj-ok-bg); border: 1px solid rgba(78,122,62,.25); border-radius: 8px; padding: 9px 12px; margin: 0 0 18px; overflow: hidden; max-height: 200px; transition: opacity .2s ease, transform .2s ease, max-height .28s ease, margin .28s ease, padding .28s ease, border-width .28s ease }
.bj-notice--error { color: var(--bj-err); background: var(--bj-err-bg); border-color: rgba(166,64,47,.25) }
/* Sortie en fondu + repli des notices de succès (auto-dismiss piloté en JS dans la console). */
.bj-notice--out { opacity: 0; transform: translateY(-4px); max-height: 0; margin-bottom: 0; padding-top: 0; padding-bottom: 0; border-width: 0 }
/* Bandeau d'état d'abonnement : strip pleine largeur EN HAUT de la zone de contenu,
   au-dessus de la pagebar (cf. maquette abonnement-statut). Variantes trial / due. */
.bj-topbar { display: flex; align-items: center; gap: 10px; padding: 11px 28px; font-size: 13.5px; border-bottom: 1px solid var(--bj-cr) }
.bj-topbar i { font-size: 17px; flex-shrink: 0 }
.bj-topbar strong { font-weight: 500 }
.bj-topbar__act { margin-left: auto; color: inherit; font-weight: 600; text-decoration: none; border: 1px solid currentColor; border-radius: 7px; padding: 5px 11px; font-size: 12.5px; white-space: nowrap }
.bj-topbar__act:hover { background: rgba(0,0,0,.04) }
.bj-topbar--trial { background: #F7EFDF; color: #7a5a17 }
.bj-topbar--due { background: #F6E8E4; color: #8a2f1f }
@media (max-width:640px){ .bj-topbar { padding-left: 18px; padding-right: 18px } }
/* Console verrouillée (abonnement bloqué) : items de menu grisés + mur d'abonnement. */
.bj-nav--muted { opacity: .42; pointer-events: none }
.bj-gate { min-height: 58vh; display: flex; align-items: center; justify-content: center; padding: 24px }
.bj-paywall { background: var(--bj-surface); border: 1px solid var(--bj-cr); border-radius: 16px; padding: 34px 30px; max-width: 430px; text-align: center; box-shadow: 0 10px 40px rgba(51,41,36,.06) }
.bj-paywall__ico { width: 52px; height: 52px; border-radius: 14px; background: var(--bj-hover); display: flex; align-items: center; justify-content: center; font-size: 26px; color: var(--bj-text-2); margin: 0 auto 16px }
.bj-paywall h2 { font-size: 18px; font-weight: 600; margin: 0 0 8px }
.bj-paywall p { font-size: 14px; color: var(--bj-text-2); margin: 0 0 22px; line-height: 1.55 }
.bj-paywall .bj-btn { text-decoration: none }
.bj-paywall__keep { margin-top: 18px; font-size: 12.5px; color: var(--bj-text-3); display: flex; align-items: center; justify-content: center; gap: 6px }
.bj-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--bj-cr); margin: 0 0 16px }
.bj-tab { padding: 9px 12px; font-size: 13px; color: var(--bj-text-2); text-decoration: none; border-bottom: 2px solid transparent; margin-bottom: -1px }
.bj-tab:hover { color: var(--bj-text) }
.bj-tab--on { color: var(--bj-text); font-weight: 500; border-bottom-color: var(--bj-text) }
.bj-client { display: flex; align-items: center; gap: 10px; min-width: 0 }
.bj-client__name { font-size: 14px; font-weight: 500; color: var(--bj-text); text-decoration: none }
/* Badge dans la liste façon Stripe « Invité » : rectangle arrondi gris discret. */
.bj-client .bj-badge { font-size: 11.5px; font-weight: 500; padding: 2px 8px; border-radius: 6px }
/* Coche « compte activé » : signe discret à côté du nom (le libellé vit dans le
   title/aria-label). Vert du DS, jamais de texte — décision produit. */
.bj-cli-check { font-size: 15px; color: #357A2B; flex: 0 0 auto; cursor: help }
.tunnel-cal__head { display: flex; align-items: center; justify-content: space-between; gap: 8px }
/* Modale des pages de config (overlay + carte) — distincte de la modale
   calendrier `.bj-cmodal` (carte dans `.bj-modal-scrim`), donc pas de collision. */
.bj-modal { position: fixed; inset: 0; background: rgba(51,41,36,.3); z-index: 9999; display: flex; align-items: center; justify-content: center }
.bj-modal[hidden] { display: none }
.bj-modal__card { background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 12px; padding: 28px; width: 440px; max-width: 90vw; max-height: 90vh; overflow: auto }
/* Norme de largeur de contenu (config) : mono-colonne = 50%, 2 colonnes = 50/50. */
.bj-set-col { max-width: 50% }
.bj-2col { display: block }
.bj-2col__main { min-width: 0 }
.bj-2col__aside { margin-top: 24px; min-width: 0 }
.bj-test-card { border: 1px solid var(--bj-cr); border-radius: 10px; padding: 18px; background: var(--bj-content-bg) }
@media (min-width: 960px) { .bj-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; align-items: start } .bj-2col__aside { margin-top: 0 } .bj-2col__aside .bj-test-card { position: sticky; top: 24px } }
@media (max-width: 960px) { .bj-set-col { max-width: 100% } }

/* ── Compléments (variantes/branding non couverts par la maquette) ──────────── */
.bj-btn--danger { background: transparent; color: var(--bj-err); border: 1px solid var(--bj-cr) }
.bj-btn--danger:hover { background: var(--bj-err-bg); border-color: var(--bj-err) }
.bj-side__name { font-weight: 500; font-size: 16px; letter-spacing: .02em; color: var(--bj-text) }
.bj-side__logo { display: block }
.bj-cli__txt { display: flex; flex-direction: column; gap: 1px; min-width: 0 }
.bj-offer-unit-hint { font-size: 12px; color: var(--bj-text-2); margin-top: 4px }

/* Filtre espace du calendrier (select compact dans la barre de filtres). */
/* Repli natif sans JS : même pilule grise que le segmenté (36px). */
.bj-cal-resource-pick select { box-sizing: border-box; min-height: 36px; padding: 6px 28px 6px 12px; border: 1px solid transparent; border-radius: 999px; background: var(--bj-hover); color: var(--bj-text); font: 500 13px var(--bj-font); cursor: pointer; max-width: 200px }
.bj-cal-resource-pick select:focus { outline: 0; border-color: var(--bj-text) }
/* Combobox (espace-select.js) DANS une barre de filtres : la pilule remplace la
   carte blanche 8px — même hauteur/rayon/famille de gris que `.bj-segbar` et la
   pilule Période. État ouvert = bordure accentuée (comme la pilule Période). */
.bj-filters .bj-cbx { min-width: 0 }
.bj-filters .bj-cbx__btn { min-height: 36px; padding: 6px 12px; border-color: transparent; border-radius: 9px; background: var(--bj-hover); color: var(--bj-text); font: 500 13px var(--bj-font) }
.bj-filters .bj-cbx__btn:hover { border-color: transparent; background: #F0EEEA }
.bj-filters .bj-cbx.is-open .bj-cbx__btn { border-color: var(--bj-text); box-shadow: none; background: var(--bj-hover) }
/* Focus clavier sur la pilule : même accent que l'état ouvert (pas d'anneau). */
.bj-filters .bj-cbx__btn:focus-visible { border-color: var(--bj-text); box-shadow: none; background: var(--bj-hover) }

/* ── Bloc compte (sidebar) : nom du compte connecté → menu Se déconnecter ──── */
.bj-account { position: relative; margin: 10px 12px 4px }
.bj-account__btn { display: flex; align-items: center; gap: 8px; width: 100%; background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 8px; padding: 7px 10px; cursor: pointer; font-family: inherit; color: var(--bj-text); text-align: left }
.bj-account__btn:hover { background: var(--bj-hover) }
.bj-account__btn .bj-avatar { width: 24px; height: 24px; font-size: 10px }
.bj-account__name { flex: 1; min-width: 0; font-size: 13px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap }
.bj-account__btn i { color: var(--bj-text-3); font-size: 15px; flex-shrink: 0 }
.bj-account__menu { position: absolute; left: 0; right: 0; top: calc(100% + 4px); background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 8px; box-shadow: 0 6px 20px rgba(51,41,36,.12); padding: 4px; z-index: 20 }
.bj-account__menu[hidden] { display: none }
.bj-account__menu button { display: flex; align-items: center; gap: 8px; width: 100%; background: none; border: 0; border-radius: 6px; padding: 8px 10px; font-family: inherit; font-size: 13px; color: var(--bj-text-2); cursor: pointer; text-align: left }
.bj-account__menu button:hover { background: var(--bj-hover); color: var(--bj-text) }
.bj-account__menu i { font-size: 16px }

/* Réglages : le bouton « Enregistrer » inline est un fallback wp-admin. Sur le
 * front, l'action principale est en pagebar (haut-droite) → on masque l'inline.
 * (espace.css n'est pas chargé en wp-admin, qui garde donc son bouton inline.) */
.bj-wp-admin-save { display: none }

/* ════════════════════════════════════════════════════════════════════════
 * Composants config portes depuis admin.css (la console front charge espace.css
 * et JAMAIS admin.css). Memes classes que le markup partage (ReglagesPage /
 * ResourcesPage), styles au DS front via tokens.
 * ════════════════════════════════════════════════════════════════════════ */

/* Badges d'état : SUPPRIMÉS — un seul système de badge dans l'app, la famille
   canonique `.bj-badge--*` (école Stripe : rectangle arrondi + bordure). Les
   anciens `.bj-state--*` (pilule sans bordure) ont été migrés (abonnement,
   promos, connecteurs Réglages). `.bj-state-grp` plus bas n'est PAS un badge :
   c'est le toggle d'affichage des groupes de connecteurs, conservé. */

/* Onglet Paiement : connecteurs Stripe / PayPal */
.bj-conn{background:var(--bj-surface);border:1px solid var(--bj-cr);border-radius:12px;padding:18px 20px;margin-bottom:16px;max-width:560px}
.bj-conn-head{display:flex;align-items:center;gap:12px;margin-bottom:14px}
.bj-conn-ico{width:38px;height:38px;border-radius:9px;background:var(--bj-muted-bg);display:flex;align-items:center;justify-content:center;font-size:20px;color:var(--bj-text);flex-shrink:0}
.bj-conn-ico--pp{color:#1d3a8a}
.bj-conn-tt{display:flex;flex-direction:column;gap:1px;min-width:0}
.bj-conn-tt b{font-weight:500;font-size:14.5px;color:var(--bj-text)}
.bj-conn-tt span{font-size:12.5px;color:var(--bj-text-3)}
.bj-conn-head .bj-state-grp{margin-left:auto}
.bj-state-grp{display:none}
.bj-state-grp.on{display:inline-flex}
.bj-seg-label{font-size:12.5px;color:var(--bj-text-2);margin:0 0 6px}
.bj-seg{display:inline-flex;border:1px solid var(--bj-cr);border-radius:9px;margin-bottom:14px;background:#EFEDE9;padding:3px;gap:3px}
.bj-seg button{appearance:none;border:0;background:transparent;padding:7px 16px;border-radius:7px;font-weight:500;font-size:13px;color:var(--bj-text-2);cursor:pointer;transition:background .15s,color .15s,box-shadow .15s}
.bj-seg button:hover{color:var(--bj-text)}
.bj-seg button.on{background:#fff;color:var(--bj-text);font-weight:600;box-shadow:0 1px 2px rgba(51,41,36,.12)}
.bj-conn-foot{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:4px}
.bj-mode-grp{display:none}
.bj-mode-grp.on{display:block}

/* Ressources : liste = .bj-table (cf. ResourcesView). Kebab + menu d'actions ci-dessous. */
.bj-rkebab{width:32px;height:32px;border:1px solid var(--bj-cr);border-radius:7px;background:var(--bj-surface);color:var(--bj-text-2);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;transition:background .12s}
.bj-rkebab:hover{background:var(--bj-hover);color:var(--bj-text)}
.bj-rmenu{position:fixed;z-index:10000;background:var(--bj-surface);border:1px solid var(--bj-cr);border-radius:10px;box-shadow:0 12px 34px rgba(51,41,36,.16);padding:5px;min-width:180px;max-width:calc(100vw - 32px)}
.bj-rmenu[hidden]{display:none}
.bj-rmenu button{display:flex;align-items:center;gap:9px;width:100%;border:0;background:none;padding:9px 11px;border-radius:7px;font:400 13px var(--bj-font);color:var(--bj-text);cursor:pointer;text-align:left}
.bj-rmenu button:hover{background:var(--bj-hover)}
.bj-rmenu button.danger{color:var(--bj-err)}
.bj-rmenu button.danger:hover{background:var(--bj-err-bg)}
.bj-rmenu hr{border:0;border-top:1px solid var(--bj-cr);margin:4px 6px}

/* Ressources : formulaire (edition / creation) */
.bj-res-form{max-width:720px}
/* Édition ressource : une colonne flat (formulaire + photos, puis offres),
   sections sans cartes ni filets — juste de l'espace. */
.bj-res-edit{display:grid;grid-template-columns:1fr;gap:30px;align-items:start}
.bj-res-sec{margin-bottom:24px}
.bj-res-sec:last-child{margin-bottom:0}
.bj-res-sec__title{font:600 14px var(--bj-font);color:var(--bj-text);margin:0 0 14px}
.bj-res-sec__head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 14px}
.bj-res-sec__head .bj-res-sec__title{margin:0}
/* Photos intégrées au bloc Informations */
.bj-res-photos{margin-top:20px}
.bj-res-photos__label{font-size:13px;font-weight:500;color:var(--bj-text);margin:0 0 10px}
.bj-media-grid{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:12px}
.bj-card__sub{font-size:12.5px;color:var(--bj-text-2);margin:0 0 16px}
.bj-frow{display:grid;grid-template-columns:200px 1fr;gap:16px;align-items:start}
@media(max-width:560px){.bj-frow{grid-template-columns:1fr}}
.bj-locked{display:flex;align-items:flex-start;gap:12px;background:var(--bj-hover);border:1px dashed var(--bj-cr);border-radius:10px;padding:14px 16px;color:var(--bj-text-2);font-size:13px;line-height:1.5}
.bj-locked .ti{font-size:20px;color:var(--bj-text-3);margin-top:1px;flex-shrink:0}
/* Liste des offres (édition ressource) en .bj-table — cellule icône + nom + sous-titre. */
.bj-offers tr:first-child td{border-top:0}
.bj-fx-cell{display:flex;align-items:center;gap:13px;min-width:0}
.bj-fx-ico{width:36px;height:36px;border-radius:9px;background:var(--bj-muted-bg);display:flex;align-items:center;justify-content:center;color:var(--bj-text-2);flex-shrink:0;font-size:18px}
.bj-fx-txt{min-width:0}
.bj-fx-txt b{font-size:13.5px;font-weight:500;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bj-fx-txt span{font-size:12px;color:var(--bj-text-2)}
.bj-fx-price{font-weight:500;font-variant-numeric:tabular-nums}
.bj-fx-price.is-quote{color:var(--bj-text-2);font-weight:500}
.bj-fx-editcell{width:1%;padding-left:4px!important}
.bj-fx-edit{color:var(--bj-text-3);font-size:16px;opacity:.5;transition:opacity .12s,color .12s}
.bj-table tbody tr:hover .bj-fx-edit{opacity:1;color:var(--bj-text-2)}

/* Calendrier : jours fermes (event de fond non selectionnable) */
.fc .fc-bg-event.bj-closed{background:var(--bj-muted-bg);opacity:.6;background-image:repeating-linear-gradient(45deg,transparent,transparent 6px,rgba(51,41,36,.06) 6px,rgba(51,41,36,.06) 12px)}
.fc .fc-bg-event.bj-closed .fc-event-title{display:flex;align-items:center;justify-content:center;font:600 11px var(--bj-font);letter-spacing:.04em;text-transform:uppercase;color:var(--bj-text-3);height:100%}
.fc .fc-daygrid-bg-harness .bj-closed{border-radius:4px}

.bj-mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;letter-spacing:.02em}

/* Onglet Abonnement (SaaS equipe) */
.bj-abo-card{background:var(--bj-surface);border:1px solid var(--bj-cr);border-radius:14px;padding:24px;margin-bottom:16px;max-width:600px}
.bj-abo-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
.bj-abo-label{font-size:14px;font-weight:500;color:var(--bj-text-2);letter-spacing:.01em;margin:0}
.bj-abo-price{font-size:28px;font-weight:600;letter-spacing:-.02em;margin:6px 0;color:var(--bj-text)}
.bj-abo-price .u{font-size:17px;font-weight:500;color:var(--bj-text-2)}
.bj-abo-next{font-size:14px;color:var(--bj-text-2);margin:0}
.bj-abo-cta{margin:18px 0 0}
.bj-abo-sec{font:600 11px var(--bj-font);letter-spacing:.06em;text-transform:uppercase;color:var(--bj-text-3);margin:0 0 14px}
.bj-abo-inv{width:100%;border-collapse:collapse;font-size:13.5px}
.bj-abo-inv th{text-align:left;font:600 11px var(--bj-font);letter-spacing:.05em;text-transform:uppercase;color:var(--bj-text-3);padding:0 18px 10px}
.bj-abo-inv td{padding:12px 18px;border-top:1px solid var(--bj-cr);vertical-align:middle;font-variant-numeric:tabular-nums}
.bj-abo-inv th:first-child,.bj-abo-inv td:first-child{padding-left:0}
.bj-abo-inv th:last-child,.bj-abo-inv td:last-child{padding-right:0}
.bj-abo-inv td.r,.bj-abo-inv th.r{text-align:right}
/* Historique de facturation : HORS carte, comme les listes de factures de la console
   (filets fins entre lignes, pas d'en-têtes de colonnes, dates jamais en gras). */
.bj-abo-hist{max-width:600px;margin:24px 0 16px}
.bj-abo-hist .bj-abo-sec{margin-bottom:4px}
.bj-abo-hist .bj-abo-inv tr:first-child td{border-top:0}
.bj-abo-show{color:var(--bj-text);font-weight:500;text-decoration:underline;text-underline-offset:3px;transition:color var(--bj-dur-base) var(--bj-ease-out)}
.bj-abo-show:hover{color:#241c18}
/* Écran abonnement façon app : carte de statut + carte formule (avantages + CTA). */
.bj-abo-status{display:flex;align-items:center;gap:12px;border:1px solid var(--bj-cr);border-radius:14px;padding:14px 16px;margin-bottom:14px;max-width:600px}
.bj-abo-status>.ti{font-size:24px;flex:0 0 auto}
.bj-abo-status__t{font-size:14px;font-weight:500;color:var(--bj-text)}
.bj-abo-status__s{font-size:13px;color:var(--bj-text-2);margin-top:1px}
.bj-abo-status--warn{background:var(--bj-warn-bg);border-color:rgba(176,128,32,.28)}
.bj-abo-status--warn>.ti,.bj-abo-status--warn .bj-abo-status__t{color:var(--bj-warn)}
.bj-abo-status--err{background:var(--bj-err-bg);border-color:rgba(166,64,47,.28)}
.bj-abo-status--err>.ti,.bj-abo-status--err .bj-abo-status__t{color:var(--bj-err)}
.bj-abo-status--muted{background:var(--bj-muted-bg)}
.bj-abo-plan{font-size:15px;font-weight:500;color:var(--bj-text)}
.bj-abo-head{align-items:baseline}
.bj-abo-feats{list-style:none;margin:14px 0 0;padding:14px 0 0;border-top:1px solid var(--bj-cr);display:flex;flex-direction:column;gap:10px}
.bj-abo-feats li{display:flex;align-items:center;gap:9px;font-size:13.5px;color:var(--bj-text)}
.bj-abo-feats li>.ti{font-size:17px;color:var(--bj-ok);flex:0 0 auto}
.bj-abo-sub{width:100%;justify-content:center;margin-top:16px}
.bj-abo-secure{display:flex;align-items:center;justify-content:center;gap:5px;font-size:11.5px;color:var(--bj-text-3);margin:10px 0 0}

/* iOS Safari ZOOME au focus d'un champ dont la police fait moins de 16px (et reste
   zoomé : il faut dézoomer à la main). Sur écran TACTILE uniquement, les champs de
   saisie passent à 16px → plus de zoom intempestif. Desktop inchangé (rendu compact
   conservé). Sélecteur plus spécifique que les règles de base → s'applique sans !important. */
@media (pointer: coarse) {
  .bejoy-espace-body input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
  .bejoy-espace-body select,
  .bejoy-espace-body textarea { font-size: 16px; }
}

/* ── Détail facture équipe + frise d'activité ──────────── */
.bj-inv-detail { max-width: 1040px; margin: 0 auto }
.bj-inv-detail__sub { color: var(--bj-text-2); font-size: 13.5px; margin: 6px 0 0 }
.bj-inv-detail__acts { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 16px 0 4px }
/* Menu « ⋯ » de la barre d'actions facture (actions secondaires repliées). */
.bj-menu { position: relative; display: inline-flex }
.bj-menu__toggle { padding: 0; width: 40px; justify-content: center }
.bj-menu__pop { position: absolute; top: calc(100% + 6px); right: 0; min-width: 232px; background: var(--bj-content-bg); border: 1px solid var(--bj-cr); border-radius: 12px; box-shadow: 0 12px 30px rgba(51,41,36,.14); padding: 5px; z-index: 40 }
.bj-menu__pop[hidden] { display: none }
.bj-menu__it { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 11px; border: 0; border-radius: 8px; background: none; font: 400 13.5px var(--bj-font); color: var(--bj-text); text-decoration: none; text-align: left; cursor: pointer; white-space: nowrap }
.bj-menu__it i { font-size: 16px; color: var(--bj-text-3); flex-shrink: 0 }
.bj-menu__it:hover { background: var(--bj-hover) }
.bj-menu__it.danger, .bj-menu__it.danger i { color: var(--bj-err) }
.bj-sec-title { font-size: 15px; font-weight: 600; margin: 26px 0 14px; padding-top: 18px; border-top: 1px solid var(--bj-cr) }
.bj-inv-detail__activity .bj-sec-title { border-top: 0; padding-top: 0 }
.bj-tl { margin-left: 8px }
.bj-ev { position: relative; padding-left: 30px; padding-bottom: 18px; border-left: 1.5px solid var(--bj-cr) }
.bj-ev:last-child { border-left-color: transparent; padding-bottom: 0 }
/* Anneau couleur-fond autour de la pastille : détache l'icône du rail (le trait
   ne « touche » plus le cercle), lecture verticale plus nette. */
.bj-ev__dot { position: absolute; left: -12px; top: -1px; width: 23px; height: 23px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--bj-muted-bg); border: 1px solid var(--bj-cr); box-shadow: 0 0 0 3px var(--bj-content-bg) }
.bj-ev__dot i { font-size: 13px; color: var(--bj-text-2) }
.bj-ev--ok .bj-ev__dot { background: var(--bj-ok-bg); border-color: #cfe0c2 }
.bj-ev--ok .bj-ev__dot i { color: var(--bj-ok) }
.bj-ev--err .bj-ev__dot { background: var(--bj-err-bg); border-color: #ebcabf }
.bj-ev--err .bj-ev__dot i { color: var(--bj-err) }
.bj-ev--warn .bj-ev__dot { background: var(--bj-warn-bg); border-color: #ecdcba }
.bj-ev--warn .bj-ev__dot i { color: var(--bj-warn) }
.bj-ev--clay .bj-ev__dot { background: #F3E4E0; border-color: #e2c4bc }
.bj-ev--clay .bj-ev__dot i { color: var(--bj-clay) }
.bj-ev__t { font-size: 14px; line-height: 1.45 }
.bj-ev__t b { font-weight: 500 }
.bj-ev__m { font-size: 12.5px; color: var(--bj-text-3); margin-top: 1px }
/* Note d'équipe = bulle (parole humaine ≠ événement machine). Coin haut-gauche
   droit : la bulle « sort » du rail, façon commentaire. */
.bj-ev--note .bj-ev__t { display: inline-block; background: rgba(51,41,36,.045); background: color-mix(in srgb, var(--bj-text) 4.5%, transparent); border-radius: 0 10px 10px 10px; padding: 8px 12px; font-size: 13.5px; color: var(--bj-text-2) }
.bj-ev--note .bj-ev__m { margin-top: 4px }
.bj-tl-empty { color: var(--bj-text-3); font-size: 13.5px }
.bj-inv-note { display: flex; flex-direction: column; gap: 8px; margin-top: 16px; max-width: 460px }
.bj-inv-note .bj-field { margin-bottom: 0 }
.bj-inv-note .bj-btn { align-self: flex-start }

/* ── Grille 2 colonnes (main + side) ──────────────────── */
.bj-inv-detail__grid { display: grid; grid-template-columns: 1fr 280px; gap: 24px; align-items: start; margin-top: 8px }
.bj-inv-detail__main { min-width: 0 }
.bj-inv-detail__side { position: sticky; top: 20px }
.bj-inv-panel { background: var(--bj-bg); border: 1px solid var(--bj-cr); border-radius: 12px; padding: 18px 20px }
.bj-inv-kv { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; padding: 9px 0; border-bottom: 1px solid var(--bj-cr); font-size: 13.5px }
.bj-inv-kv:last-child { border-bottom: 0; padding-bottom: 0 }
.bj-inv-kv:first-child { padding-top: 0 }
.bj-inv-kv__k { color: var(--bj-text-2); white-space: nowrap; flex-shrink: 0 }
.bj-inv-kv__v { text-align: right; font-weight: 500; word-break: break-all }
.bj-inv-kv__v b { font-weight: 600 } /* accent DS (600), jamais le bold 700 du navigateur */
.bj-inv-kv__v a { color: var(--bj-text); text-decoration: underline; text-underline-offset: 2px }
.bj-inv-kv__v a:hover { opacity: .75 }
@media (max-width: 800px) {
  .bj-inv-detail__grid { grid-template-columns: 1fr }
  .bj-inv-detail__side { position: static }
}

/* Fiche d'avoir « recentrée » (teamAvoirDetailContent) : lecture directe d'un
   document figé — identité, chiffre focal, faits, détail. Max ~640px, pas de vide. */
.bj-avoir { max-width: 640px }
.bj-avoir__head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap }
.bj-avoir__idline { display: flex; align-items: center; gap: 10px }
.bj-avoir__num { font-size: 19px; font-weight: 500; letter-spacing: .2px; color: var(--bj-text) }
.bj-avoir__sub { margin: 7px 0 0; font-size: 13.5px; color: var(--bj-text-2) }
.bj-avoir__sub a { color: var(--bj-text); text-decoration: underline; text-underline-offset: 2px }
.bj-avoir__acts { display: flex; gap: 8px; flex-shrink: 0 }
.bj-avoir__hero { margin: 22px 0; padding: 18px 20px; background: var(--bj-bg); border: 1px solid var(--bj-cr); border-radius: 12px }
.bj-avoir__hero-k { margin: 0; font-size: 12px; color: var(--bj-text-3) }
.bj-avoir__hero-amt { margin: 4px 0 3px; font-size: 29px; font-weight: 500; letter-spacing: .3px; color: var(--bj-text) }
.bj-avoir__hero-note { margin: 0; font-size: 12.5px; color: var(--bj-text-3) }
.bj-avoir__facts { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 32px; padding-bottom: 20px; border-bottom: 1px solid var(--bj-cr) }
.bj-avoir__fact-k { margin: 0 0 2px; font-size: 12px; color: var(--bj-text-3) }
.bj-avoir__fact-v { margin: 0; font-size: 13.5px; color: var(--bj-text) }
.bj-avoir__fact-v a { color: var(--bj-text); text-decoration: underline; text-underline-offset: 2px }
.bj-avoir__detail { padding-top: 18px }
.bj-avoir__detail-title { margin: 0 0 12px; font-size: 13px; font-weight: 500; color: var(--bj-text-2) }
.bj-avoir__row { display: flex; justify-content: space-between; font-size: 13.5px; color: var(--bj-text); padding: 5px 0 }
.bj-avoir__row span:first-child { color: var(--bj-text-2) }
.bj-avoir__total { display: flex; justify-content: space-between; align-items: baseline; font-size: 14px; padding: 11px 0 0; margin-top: 6px; border-top: 1px solid var(--bj-cr); font-weight: 500; color: var(--bj-text) }
.bj-avoir__total-v { display: inline-flex; align-items: baseline; gap: 8px }
.bj-avoir__total-v { font-size: 15.5px }
.bj-avoir__ded { font-size: 12px; font-weight: 400; color: var(--bj-text-3) }
.bj-avoir__caption { margin: 12px 0 0; font-size: 12px; color: var(--bj-text-3); line-height: 1.5 }
@media (max-width: 640px) {
  .bj-avoir__facts { grid-template-columns: 1fr; gap: 14px }
  /* PDF = action principale de l'avoir → bouton PLEIN pleine largeur (cible 44px),
     pas un ghost pleine largeur qui fait « vide » dans la PWA. */
  .bj-avoir__head { gap: 12px }
  .bj-avoir__acts { width: 100%; margin-top: 2px }
  .bj-avoir__acts .bj-btn { flex: 1; min-height: 44px; background: var(--bj-text); color: var(--bj-btn-fg); border: 0 }
  .bj-avoir__acts .bj-btn:hover { background: #241c18 }
}

.bj-inv-lines { width: 100%; border-collapse: collapse; font-size: 13.5px }
.bj-inv-lines td { padding: 10px 0; border-bottom: 1px solid var(--bj-cr) }
.bj-inv-lines .bj-num { text-align: right }
.bj-inv-lines tfoot td { font-weight: 500; border-bottom: 0 }
.bj-inv-lines thead th { padding: 0 0 8px; font-weight: 500; color: var(--bj-muted); text-align: left; border-bottom: 1px solid var(--bj-line, var(--bj-cr)) }
.bj-inv-lines thead th.bj-num { text-align: right }
.bj-inv-lines__qty { width: 56px }

/* Bloc des totaux du Résumé (aligné à droite, filets fins, comme la facture). */
.bj-inv-tot { width: 100%; max-width: 320px; margin: 14px 0 0 auto; border-collapse: collapse; font-size: 13.5px }
.bj-inv-tot td { padding: 7px 0 }
.bj-inv-tot td.bj-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap }
.bj-inv-tot tr td:first-child { color: var(--bj-muted) }
.bj-inv-tot__remise td { color: var(--bj-muted) }
.bj-inv-tot__strong td { font-weight: 500; color: var(--bj-text); border-top: 1px solid var(--bj-text); padding-top: 9px }
.bj-inv-tot__paid td { color: #1f7a4d; font-weight: 500 }
.bj-inv-tot__due td { font-weight: 500; color: var(--bj-text) }

/* Récapitulatif MOBILE du détail facture (maquette écran 5) : bloc rows clé/valeur +
   barre d'actions basse. MASQUÉS sur desktop — le rendu ≥721px reste strictement
   celui d'avant (grille main + Résumé + panneau Détails). Le passage mobile est
   entièrement porté par le bloc @media (max-width:720px) plus bas. */
.bj-inv-mob, .bj-inv-mob-acts { display: none }

/* Éditeur enrichi de la mention CGV (Réglages › Conditions générales) :
   barre discrète (Gras / Lien / Retirer le lien) + zone contenteditable stylée
   comme un champ DS. Aucun bold 700 sur le chrome ; liens en argile. */
.bj-rte { border: 1px solid var(--bj-cr); border-radius: 8px; background: var(--bj-content-bg); overflow: hidden; transition: border-color .15s ease, box-shadow .15s ease }
.bj-rte:focus-within { border-color: var(--bj-text); box-shadow: 0 0 0 3px rgba(51,41,36,.10) }
.bj-rte__bar { display: flex; align-items: center; gap: 2px; padding: 5px 6px; border-bottom: 1px solid var(--bj-cr); background: var(--bj-surface) }
.bj-rte__btn { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; border: 0; border-radius: 6px; background: transparent; color: var(--bj-text-2); font: 500 13.5px var(--bj-font); cursor: pointer; transition: background .12s ease, color .12s ease }
.bj-rte__btn i { font-size: 17px }
.bj-rte__btn:hover { background: rgba(51,41,36,.06); color: var(--bj-text) }
.bj-rte__btn:active { transform: scale(.94) }
/* Bouton texte « Conditions particulières » : plus large qu un bouton icône, il
   porte un libellé pour lever l ambiguïté avec le « Lien » fixe. Graisse 500 (pas de bold). */
.bj-rte__btn--cp { width: auto; gap: 5px; padding: 0 9px }
.bj-rte__btn--cp .bj-rte__btn-txt { font: 500 12.5px var(--bj-font) }
.bj-rte__area { min-height: 90px; padding: 10px 12px; font: 400 13.5px var(--bj-font); color: var(--bj-text); line-height: 1.5; outline: 0 }
.bj-rte__area:empty::before { content: attr(data-placeholder); color: var(--bj-muted) }
.bj-rte__area a { color: var(--bj-clay); text-decoration: underline }

/* Détail facture mobile : déplacé APRÈS les règles de base pour gagner l ordre
   de cascade (sinon les rules desktop plus bas ré-affichaient le desktop). */
@media (max-width: 720px) {
  /* ══════════════════════════════════════════════════════════════════════
   * DÉTAIL FACTURE ÉQUIPE — vue plein écran app-like (maquette écran 5).
   * Sur mobile, on remplace la grille desktop (Résumé + panneau Détails) par
   *  — un en-tête léger : badge d'état + nom du client (le n° est DÉJÀ le titre
   *    de la pagebar, avec le chip retour « ← Factures ») ;
   *  — des rows clé/valeur .bj-inv-kv (Client, Objet, Émise le, Échéance, Total
   *    TTC, Document → PDF) ;
   *  — la frise d'activité EXISTANTE (.bj-tl/.bj-ev, attribution « Équipe · … »
   *    déjà rendue par ActivityTimeline) — inchangée, simplement conservée ;
   *  — une barre d'actions basse pleine largeur avec safe-area.
   * Les blocs desktop redondants (head, Résumé, panneau latéral, note) sont
   * masqués — mais restent INTACTS ≥721px (règles hors media query). Le filet
   * de chaque row est porté par .bj-inv-kv lui-même (continu, jamais fragmenté).
   * ════════════════════════════════════════════════════════════════════ */
  .bj-inv-detail { max-width: none; margin: 0 }
  /* Masque les blocs desktop non repris sur la carte mobile. */
  .bj-inv-detail__head,
  .bj-inv-detail__summary,
  .bj-inv-detail__side,
  .bj-inv-note { display: none }
  /* La grille redevient un simple flux vertical (seule l'Activité y subsiste). */
  .bj-inv-detail__grid { display: block; margin: 0 }
  .bj-inv-detail__main { min-width: 0 }

  /* Barre d'actions : reste visible sur mobile (sortie du header), alignée 18px. */
  .bj-inv-detail__acts { padding: 0 18px; margin: 18px 0 8px }
  .bj-inv-detail__acts .bj-btn:not(.bj-menu__toggle) { flex: 1 1 auto; justify-content: center; min-height: 44px }

  /* En-tête mobile : badge + sous-titre client, sous la pagebar. */
  .bj-inv-mob { display: block; padding: 0 18px }
  .bj-inv-mob__head { margin: 2px 0 6px }
  .bj-inv-mob__sub { font-size: 13.5px; color: var(--bj-text-2); margin: 0 0 10px }
  /* Rows clé/valeur : filet CONTINU porté par la row (border-bottom), jamais des
     segments. Les tokens (--bj-cr) sont chargés via tokens.css sur le vrai site. */
  .bj-inv-mob .bj-inv-kv { padding: 13px 0 }
  .bj-inv-mob .bj-inv-kv__v { word-break: normal; font-variant-numeric: tabular-nums }
  .bj-inv-mob .bj-inv-kv__v a { display: inline-flex; align-items: center; gap: 5px; padding: 4px 0; min-height: 32px }
  .bj-inv-mob .bj-inv-kv__v a i { font-size: 15px; color: var(--bj-text-2) }

  /* Frise d'activité : titre de section « Activité » repris tel quel, marge propre. */
  .bj-inv-detail__activity { padding: 0 18px; margin-top: 18px }

  /* Barre d'actions basse : pleine largeur, safe-area, place laissée à la tabbar. */
  .bj-inv-mob-acts { display: flex; flex-direction: column; gap: 8px; padding: 16px 18px calc(98px + env(safe-area-inset-bottom, 0px)) }
  .bj-inv-mob-acts .bj-btn { width: 100%; justify-content: center }
}

/* Puce « CP liée » dans la liste des offres (feedback visuel de l'assignation). */
.bj-offer-cp-chip{font-size:11px;padding:1px 7px;gap:4px;margin-left:6px;vertical-align:middle}
.bj-offer-cp-chip .ti{font-size:12px}

/* « Voir le texte accepté » dans la frise d'activité (preuve d'acceptation CGV). */
.bj-tl-terms{margin:7px 0}
.bj-tl-terms>summary{cursor:pointer;color:var(--bj-text-3);font-size:12px;list-style:none;display:inline-flex;align-items:center;gap:4px}
.bj-tl-terms>summary:hover{color:var(--bj-text-2)}
.bj-tl-terms>summary::-webkit-details-marker{display:none}
.bj-tl-terms__ic{font-size:14px;transition:transform .15s ease}
.bj-tl-terms[open]>summary .bj-tl-terms__ic{transform:rotate(90deg)}
.bj-tl-terms__body{margin-top:6px;padding:9px 11px;border:1px solid var(--bj-cr);border-radius:8px;background:transparent;font-size:12.5px;line-height:1.55;color:var(--bj-text-2)}
.bj-tl-terms__body a{color:var(--bj-text-2);text-decoration:underline;text-underline-offset:2px}

/* Accordéons de configuration (gabarits e-mails des Réglages) : 18 cartes repliées. */
.bj-acc{border:1px solid var(--bj-cr);border-radius:10px;background:var(--bj-content-bg);margin-bottom:10px;overflow:hidden}
.bj-acc__sum{display:flex;align-items:center;gap:10px;padding:12px 14px;cursor:pointer;font-size:13.5px;font-weight:500;color:var(--bj-text);list-style:none;user-select:none}
.bj-acc__sum::-webkit-details-marker{display:none}
.bj-acc__title{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bj-acc__to{flex-shrink:0}
.bj-acc__chev{flex-shrink:0;margin-left:auto;font-size:16px;color:var(--bj-text-3);transition:transform .18s ease}
.bj-acc__sum:hover{background:var(--bj-hover)}
.bj-acc[open]>.bj-acc__sum{border-bottom:1px solid var(--bj-cr)}
.bj-acc[open]>.bj-acc__sum .bj-acc__chev{transform:rotate(180deg);color:var(--bj-text-2)}
.bj-acc__body{padding:14px 15px 15px}
