/**
 * UltimateSaas — styles communs à tous les layouts (Materialize, Nexsas, …).
 * Chargé via asset('assets_all/styles.css') dans chaque layout racine.
 */

/* —— Bandeau RGPD / cookies —— */
.us-rgpd-banner {
  --us-primary: #666cff;
  --us-primary-rgb: 102, 108, 255;
  --us-primary-contrast: #fff;

  position: fixed;
  z-index: 1080;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 0.75rem 1rem calc(0.75rem + env(safe-area-inset-bottom, 0px));
  pointer-events: none;
  opacity: 0;
  transform: translateY(100%);
  transition: opacity 0.35s ease, transform 0.35s ease;
}

.us-rgpd-banner.is-visible {
  pointer-events: auto;
  opacity: 1;
  transform: translateY(0);
}

.us-rgpd-banner.is-hidden {
  display: none !important;
}

.us-rgpd-banner__inner {
  max-width: 72rem;
  margin: 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 1rem 1.25rem;
  padding: 1rem 1.25rem;
  border-radius: 0.75rem;
  background: #fff;
  border: 1px solid rgba(var(--us-primary-rgb), 0.22);
  box-shadow:
    0 4px 24px rgba(15, 23, 42, 0.12),
    0 0 0 1px rgba(15, 23, 42, 0.04);
}

.us-rgpd-banner__text {
  flex: 1 1 16rem;
  margin: 0;
  font-size: 0.875rem;
  line-height: 1.55;
  color: #3b4256;
}

.us-rgpd-banner__actions {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem 0.75rem;
}

.us-rgpd-banner__btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 2.5rem;
  padding: 0.5rem 1.25rem;
  border-radius: 0.5rem;
  font-size: 0.875rem;
  font-weight: 600;
  line-height: 1.25;
  cursor: pointer;
  border: none;
  text-decoration: none;
  transition: background-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease, transform 0.15s ease;
}

.us-rgpd-banner__btn:active {
  transform: scale(0.98);
}

.us-rgpd-banner__btn--primary {
  background: var(--us-primary);
  color: var(--us-primary-contrast);
  box-shadow: 0 2px 8px rgba(var(--us-primary-rgb), 0.35);
}

.us-rgpd-banner__btn--primary:hover {
  filter: brightness(1.06);
  box-shadow: 0 4px 14px rgba(var(--us-primary-rgb), 0.4);
}

.us-rgpd-banner__btn--ghost {
  background: rgba(var(--us-primary-rgb), 0.08);
  color: var(--us-primary);
}

.us-rgpd-banner__btn--ghost:hover {
  background: rgba(var(--us-primary-rgb), 0.14);
}

@media (max-width: 575.98px) {
  .us-rgpd-banner__inner {
    flex-direction: column;
    align-items: stretch;
  }

  .us-rgpd-banner__actions {
    width: 100%;
    flex-direction: column;
  }

  .us-rgpd-banner__btn {
    width: 100%;
  }
}

/* —— Topbar « impersonation » (connexion déléguée) —— */
/* Sticky en tête de <body> : pousse le contenu vers le bas ET reste visible au scroll. */
.us-impersonation-banner {
  position: sticky;
  top: 0;
  z-index: 1090;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem 1rem;
  flex-wrap: wrap;
  padding: 0.5rem 1rem;
  background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
  color: #fff;
  font-size: 0.875rem;
  line-height: 1.4;
  box-shadow: 0 2px 10px rgba(15, 23, 42, 0.25);
}

.us-impersonation-banner__info {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  min-width: 0;
}

.us-impersonation-banner__icon {
  flex: 0 0 auto;
  font-size: 1.15rem;
  line-height: 1;
}

.us-impersonation-banner__text {
  min-width: 0;
}

.us-impersonation-banner__text strong {
  font-weight: 700;
}

.us-impersonation-banner__email {
  opacity: 0.85;
}

.us-impersonation-banner__form {
  margin: 0;
  flex: 0 0 auto;
}

.us-impersonation-banner__btn {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.35rem 0.9rem;
  border: none;
  border-radius: 0.4rem;
  background: rgba(255, 255, 255, 0.95);
  color: #b45309;
  font-size: 0.8125rem;
  font-weight: 600;
  line-height: 1.2;
  cursor: pointer;
  white-space: nowrap;
  transition: background-color 0.15s ease, transform 0.1s ease, box-shadow 0.15s ease;
}

.us-impersonation-banner__btn:hover {
  background: #fff;
  box-shadow: 0 2px 8px rgba(15, 23, 42, 0.2);
  transform: translateY(-1px);
}

.us-impersonation-banner__btn:active {
  transform: translateY(0);
}

@media (max-width: 575.98px) {
  .us-impersonation-banner__email {
    display: none;
  }
}

/* —— Interrupteur On / Off des tableaux d'administration ——————————————————
   Un `.form-switch` de Bootstrap fait 2 rem de large et se perd dans un tableau
   dense : partout ou une colonne (ou un coin de carte) n'existe QUE pour cet
   interrupteur, on l'agrandit franchement.

   POURQUOI DANS LE COEUR. La regle vivait en double — `_switch_style.blade.php`
   du module Autoscraper et `spider-agent.css` du module SpiderAgent. Deux copies
   des memes valeurs, c'est la premiere retouche qui ne change la taille que d'une
   moitie des ecrans. Elle est ici, chargee par `commonMaster` sur toutes les pages
   d'admin de tous les deploiements ; un module qui veut ce style n'a plus qu'a
   poser la classe.

   `padding-left: 0` annule le decalage de `.form-check`, prevu pour laisser la
   place a un libelle : ici il n'y en a pas, la case doit rester au centre de sa
   colonne.

   CONVENTION D'USAGE — un etat DURABLE (actif/inactif, en pause) se regle par cet
   interrupteur, dans SA propre colonne a gauche des actions, et ne se redit PAS
   ailleurs sous forme de badge : deux rendus du meme booleen, c'est deux endroits
   a corriger le jour ou il change de sens, et un seul qui le sera. La case ne
   porte aucun `name` : le serveur bascule l'etat courant, il ne le recoit pas —
   poster la valeur affichee laisserait un second onglet reste ouvert sur une page
   perimee ecraser l'etat reel. */
.sw-onoff { padding-left: 0; }
.sw-onoff .form-check-input { width: 3rem; height: 1.6rem; margin: 0; float: none; cursor: pointer; }

/* —— Modale defilante dont le <form> enveloppe header / body / footer ————————
   Bootstrap suppose `.modal-header`, `.modal-body` et `.modal-footer` enfants
   DIRECTS de `.modal-content`, qui est un `flex-direction: column` : c'est ce qui
   donne au corps son `flex: 1 1 auto` et borne sa hauteur, sans quoi son
   `overflow-y: auto` (pose par `.modal-dialog-scrollable`) ne se declenche jamais.

   Des qu'un `<form>` s'intercale — pour poster toute la modale d'un bloc, ce que
   fait la moitie de nos modales d'edition — le corps n'est plus un flex item :
   il grandit librement, et le `overflow: hidden` de `.modal-content` COUPE
   simplement le bas du formulaire. Symptome : sur un ecran court, les derniers
   champs ET le bouton Enregistrer deviennent inatteignables, sans barre de
   defilement nulle part. Aucun message, aucune erreur console.

   On rend donc le formulaire lui-meme colonne flex, en relais de `.modal-content`.
   `min-height: 0` n'est pas decoratif : sans lui un flex item refuse de descendre
   sous la hauteur de son contenu, donc rien ne deborde et rien ne defile.

   POURQUOI DANS LE COEUR. Le defaut est structurel, pas propre a un ecran : il
   frappait 10 modales (roles, plans d'abonnement / de credits / One Shot, et les
   deux modales d'edition du module Email). Corrige ici, il l'est partout, et une
   modale future ecrite avec un form n'aura rien a faire de special. */
.modal-dialog-scrollable .modal-content > form {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
  max-height: 100%;
}
.modal-dialog-scrollable .modal-content > form > .modal-body { min-height: 0; }

/* —— Une action INDISPONIBLE sur une ligne garde sa place, grisee ————————————
   Retirer une icone quand elle ne s'applique pas decale TOUTES les suivantes :
   la colonne « Actions » est alignee a droite (`text-end`), donc une icone en
   moins fait glisser la corbeille d'une ligne sous le crayon de la ligne du
   dessus — on supprime en croyant editer, et on ne le decouvre qu'apres.

   Ce n'est volontairement PAS un `<button disabled>` : Bootstrap 5 pose
   `pointer-events: none` sur les boutons desactives, donc l'infobulle — le seul
   endroit qui dit POURQUOI l'action manque — ne s'afficherait jamais. C'est un
   `<span>` portant les memes classes `.btn`, neutralise ici.

   POURQUOI DANS LE COEUR : la meme regle etait deja recopiee dans deux modules
   (`.pe-act-off` cote Email, `.sa-act-off` cote SpiderAgent). Toute nouvelle vue
   utilise `.us-act-off` et le partial `materialize.admin.partials._action_off`. */
.us-act-off {
  opacity: .3;
  cursor: not-allowed;
}

/* Un survol qui repond donne l'illusion d'un bouton : la boite reste, la reaction non. */
.us-act-off:hover,
.us-act-off:focus,
.us-act-off:active {
  background-color: transparent;
  border-color: transparent;
  box-shadow: none;
  opacity: .3;
}

/* —— Fond personnalisé de la page de connexion (/login) ——
   Réglé dans Réglages → Personnalisation → Identité visuelle (HardSetting `login_background_path`).
   La vue ne pose que la classe `.us-auth-bg` et la variable `--us-auth-bg-image` (l'URL change
   d'un déploiement à l'autre) : tout le reste est ici. */
.us-auth-bg {
  position: relative;
  isolation: isolate;
  background-color: #0b0b14;
  background-image: var(--us-auth-bg-image);
  background-position: center;
  background-size: cover;
  background-repeat: no-repeat;
}

/* Voile sombre : le formulaire reste lisible quelle que soit l'image choisie. */
.us-auth-bg::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: radial-gradient(ellipse at center, rgba(8, 8, 16, .55) 0%, rgba(8, 8, 16, .25) 60%, rgba(8, 8, 16, .45) 100%);
  pointer-events: none;
}

/* La carte se détache du fond : ombre marquée, léger flou derrière elle. */
.us-auth-bg .authentication-inner > .card {
  box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, .45);
  backdrop-filter: blur(6px);
}

/* Aperçu 16:9 dans l'écran d'administration. */
.us-login-bg-preview {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 256px;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: #f6f6fa;
  border: 1px solid var(--bs-border-color);
  border-radius: 6px;
}
.us-login-bg-preview img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Écran « application » à pleine hauteur (Slack, WhatsApp — window.UsFullHeight, scripts.js) :
   la page ne défile pas. Le menu de gauche, plus haut que la fenêtre, allongeait la page ;
   il est figé à la hauteur de l'écran et défile dans son propre ascenseur. */
html.us-app-screen .layout-menu {
  position: sticky;
  top: 0;
  height: 100vh;
  align-self: flex-start;
}

/* Plein écran d'un écran « application » (bouton [data-us-app-fullscreen], scripts.js) : la boîte couvre
   la fenêtre, au-dessus du menu et de la barre du haut, sous les modales (1055) pour que la visionneuse
   et les fenêtres de l'écran restent au-dessus. */
.us-app-full {
  position: fixed !important;
  inset: 0;
  z-index: 1045;
  height: 100vh !important;
  min-height: 0 !important;
  margin: 0 !important;
  border-radius: 0 !important;
}

html.us-app-full-on,
html.us-app-full-on body {
  overflow: hidden;
}

/* Le menu (z-index 1080) et la barre du haut (1075) du thème passeraient au-dessus : masqués le temps
   du plein écran (visibility, pour ne pas faire bouger la mise en page dessous). */
html.us-app-full-on .layout-menu,
html.us-app-full-on .layout-navbar {
  visibility: hidden;
}

/* ════════════════════════════════════════════════════════════════════════════════════════════
   PANNEAU « AUTOMATISATION » COMMUN (context-panel.js, composant components.context.automation,
   carte fifi #115). Variables Bootstrap seulement : il s'ouvre sur tous les thèmes.
   ════════════════════════════════════════════════════════════════════════════════════════════ */
.us-ctx-wrap { position: relative; display: inline-flex; }
/* L'ouvreur du lanceur SpiderAgent historique : présent (il faut une position pour placer son
   menu), invisible. `display: none` lui ferait rendre un rectangle vide. */
.us-ctx-advanced {
  position: absolute; left: 0; bottom: 0; width: 1px; height: 1px;
  padding: 0; border: 0; opacity: 0; overflow: hidden; pointer-events: none;
}
.us-ctx-pane { max-height: 22rem; overflow-y: auto; overscroll-behavior: contain; }
.us-ctx-tabs .nav-link { text-transform: none; }
.us-ctx-bloc-titre {
  position: sticky; top: 0; z-index: 1; padding: .25rem .25rem;
  background: var(--bs-body-bg, #fff); font-size: .75rem; font-weight: 600;
  text-transform: uppercase; letter-spacing: .02em; color: var(--bs-secondary-color, #8592a3);
}
.us-ctx-groupe-titre { padding: .375rem .25rem .125rem; font-size: .75rem; font-weight: 600; color: var(--bs-body-color); }
.us-ctx-item { margin: 0 0 .125rem .5rem; font-size: .8125rem; }
.us-ctx-item .form-check-label { cursor: pointer; }
/* Onglet « Prompts de contexte » d'un module (components.context.prompts-manager). */
.us-ctx-gabarit {
  max-height: 16rem; overflow: auto; white-space: pre-wrap; font-size: .75rem;
  padding: .75rem; border-radius: .375rem; background: var(--bs-secondary-bg, #f5f5f9); color: var(--bs-body-color);
}
.us-ctx-grip-col { width: 2rem; }
.us-ctx-grip { cursor: grab; color: var(--bs-secondary-color, #8592a3); }
.us-ctx-manager tr.us-ctx-drag { opacity: .4; }
/* Le thème met `text-transform: capitalize` sur tout `.btn` : « Lanceur Avancé ». Pas ici. */
.us-ctx-modal .btn,
.us-ctx-wrap .btn { text-transform: none; }
/* ═══ LE MENU EN CASCADE DU BOUTON « AUTOMATISATION » (context-menu.js, façon menu Démarrer XP) ═══
   Chaque volet est un `position: fixed` indépendant, posé contre la ligne qui l'ouvre. */
.us-ctx-menu {
  position: fixed; z-index: 1095; min-width: 15rem; max-width: 26rem; max-height: 70vh; overflow-y: auto;
  overscroll-behavior: contain; padding: .25rem 0; border-radius: .375rem;
  background: var(--bs-body-bg, #fff); border: 1px solid var(--bs-border-color, #d9dee3);
  box-shadow: 0 .25rem 1.25rem rgba(0, 0, 0, .18); font-size: .8125rem;
}
.us-ctx-menu-titre {
  padding: .375rem .75rem .5rem; margin-bottom: .25rem; font-size: .75rem; font-weight: 600;
  color: var(--bs-secondary-color, #8592a3); border-bottom: 1px solid var(--bs-border-color, #d9dee3);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.us-ctx-menu-sep { margin: .25rem 0; border-top: 1px solid var(--bs-border-color, #d9dee3); }
.us-ctx-menu-vide { padding: .375rem .75rem; color: var(--bs-secondary-color, #8592a3); font-size: .75rem; }
.us-ctx-menu-item {
  display: flex; align-items: center; gap: .5rem; padding: .3125rem .75rem; cursor: pointer;
  color: var(--bs-body-color, #566a7f); line-height: 1.35;
}
.us-ctx-menu-item:hover, .us-ctx-menu-item.is-open { background: var(--bs-secondary-bg, #f5f5f9); }
.us-ctx-menu-label { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.us-ctx-menu-count { flex: 0 0 auto; font-size: .6875rem; color: var(--bs-secondary-color, #8592a3); }
.us-ctx-menu-chev { flex: 0 0 auto; }
/* Copier / Exécuter : discrets au repos, nets au survol de la ligne. */
.us-ctx-menu-actions { flex: 0 0 auto; display: inline-flex; gap: .25rem; opacity: .35; }
.us-ctx-menu-item:hover .us-ctx-menu-actions { opacity: 1; }
.us-ctx-menu-btn {
  padding: .0625rem .4rem; border: 1px solid var(--bs-border-color, #d9dee3); border-radius: .25rem;
  background: var(--bs-body-bg, #fff); color: var(--bs-primary, #666cff); font-size: .6875rem; line-height: 1.4;
}
.us-ctx-menu-btn:hover { background: var(--bs-primary, #666cff); color: #fff; }
.us-ctx-menu-btn.is-run { color: var(--bs-success, #72e128); }
.us-ctx-menu-btn.is-run:hover { background: var(--bs-success, #72e128); color: #fff; }
.us-ctx-menu-btn.is-armed { background: var(--bs-danger, #ff4d49); border-color: var(--bs-danger, #ff4d49); color: #fff; }
.us-ctx-menu-btn.is-ok { background: var(--bs-success, #72e128); border-color: var(--bs-success, #72e128); color: #fff; }
.us-ctx-menu-btn.is-ko { background: var(--bs-danger, #ff4d49); border-color: var(--bs-danger, #ff4d49); color: #fff; }
