/* ==========================================================================
   OpenBots — charte SEEWORLD appliquée au panel (clair par défaut, sombre selon
   le système ou le choix du compte).

   Même charte que le site public (static/css/ob-site.css) : noir sur blanc,
   Glacial Indifference, titres et libellés en capitales espacées, contours
   pointillés 2 px qui deviennent pleins au survol, rayons 12 px (blocs) et
   15 px (pastilles). Les couleurs d'OpenBots gardent leur teinte en pastel.

   Contraste : un texte posé sur un aplat (--sw-<f>) utilise --sw-on — noir sur
   pastel en clair, blanc sur ton sourd en sombre.

   Toutes les couleurs du panel passent par ces variables (conversion faite par
   scripts/seeworld_couleurs.py) : une famille de teinte = trois tons
     --sw-<f>-soft  aplat très léger (fonds de sections, survols)
     --sw-<f>       pastel (boutons, pastilles, icônes sur fond clair)
     --sw-<f>-ink   version lisible en texte ou en trait
   Ajouter une couleur en dur ailleurs ferait réapparaître un îlot qui ne suit
   ni le thème ni la charte.
   ========================================================================== */
@font-face{font-family:"Glacial Indifference";font-weight:400;font-style:normal;font-display:swap;
  src:url("/openbots/static/fonts/glacial-indifference-400.woff2") format("woff2");}
@font-face{font-family:"Glacial Indifference";font-weight:700;font-style:normal;font-display:swap;
  src:url("/openbots/static/fonts/glacial-indifference-700.woff2") format("woff2");}

:root{
  color-scheme:light;
  --sw-font:"Glacial Indifference","Century Gothic","Futura","Trebuchet MS",sans-serif;
  /* Neutres — clair : papier et encre */
  --sw-bg:#ffffff; --sw-surface:#fafafa; --sw-inset:#f2f2f2; --sw-raised:#ececec; --sw-raised-2:#dedede; --sw-white:#ffffff;
  --sw-ink:#000000; --sw-ink-2:#262626; --sw-ink-3:#555555; --sw-ink-4:#6e6e6e; --sw-on:#000000;
  --sw-line:rgba(0,0,0,.12); --sw-line-2:rgba(0,0,0,.45);
  /* Commandes (boutons, pastilles, boutons-icônes) : une seule forme et un seul
     mouvement partout — panel, site public et nouvelle appli (frontend/globals.css). */
  --sw-radius-pill:15px; --sw-radius-block:12px; --sw-radius-field:9px;
  --sw-btn-h:38px; --sw-btn-h-sm:30px; --sw-btn-icon:36px;
  --sw-dur:.18s; --sw-ease:cubic-bezier(.2,.8,.2,1);
  /* Familles pastel (teinte d'origine conservée) */
  --sw-red-soft:#fee6e8;    --sw-red:#fcb1b6;    --sw-red-ink:#a11720;
  --sw-orange-soft:#fef0e6; --sw-orange:#fcd1b1; --sw-orange-ink:#a14e17;
  --sw-yellow-soft:#fef8e6; --sw-yellow:#fce8b1; --sw-yellow-ink:#866713;
  --sw-lime-soft:#f5fee6;   --sw-lime:#def9ae;   --sw-lime-ink:#4c7411;
  --sw-green-soft:#e6fef1;  --sw-green:#b1fcd4;  --sw-green-ink:#11743f;
  --sw-teal-soft:#e6fefb;   --sw-teal:#b1fcef;   --sw-teal-ink:#117467;
  --sw-cyan-soft:#e6fafe;   --sw-cyan:#b1f1fc;   --sw-cyan-ink:#137386;
  --sw-sky-soft:#e6f4fe;    --sw-sky:#b1dcfc;    --sw-sky-ink:#1765a1;
  --sw-blue-soft:#e6e9fe;   --sw-blue:#b8bef6;   --sw-blue-ink:#2d3cae;
  --sw-violet-soft:#efe6fe; --sw-violet:#cfb1fc; --sw-violet-ink:#4917a1;
  --sw-purple-soft:#f9e6fe; --sw-purple:#efb1fc; --sw-purple-ink:#8117a1;
  --sw-pink-soft:#fee6f3;   --sw-pink:#fcb1d6;   --sw-pink-ink:#a11760;

  /* Anciennes variables du design system : mêmes noms, nouvelles valeurs. */
  --dsx-bg:var(--sw-bg); --dsx-bg-deep:var(--sw-inset); --dsx-surface:var(--sw-surface);
  --dsx-surface-2:var(--sw-raised); --dsx-inset:var(--sw-inset);
  --dsx-line:var(--sw-line-2); --dsx-line-strong:var(--sw-line-2);
  --dsx-text:var(--sw-ink); --dsx-text-mut:var(--sw-ink-3); --dsx-text-dim:var(--sw-ink-4);
  --dsx-accent:var(--sw-blue); --dsx-accent-hover:color-mix(in srgb, var(--sw-blue) 80%, var(--sw-ink));
  --dsx-accent-soft:var(--sw-blue-soft);
  --dsx-ok:var(--sw-green-ink); --dsx-warn:var(--sw-yellow-ink); --dsx-danger:var(--sw-red-ink);
  --dsx-radius:12px; --dsx-radius-sm:9px; --dsx-shadow:none; --dsx-shadow-lg:0 10px 30px rgba(0,0,0,.12);
  --dsx-font:var(--sw-font);
  --cm-c:var(--sw-violet-ink); --cm-soft:var(--sw-violet-soft);
  /* Variables historiques de la mise en page (base.css, panel-shared.css) : malgré
     leur nom, ce sont les couleurs du panel, pas celles d'un aperçu Discord. */
  --discord-blurple:var(--sw-blue); --discord-dark:var(--sw-bg); --discord-bg:var(--sw-bg);
  --discord-sidebar:var(--sw-surface); --discord-deep:var(--sw-inset); --discord-footer:var(--sw-surface);
  --discord-text:var(--sw-ink); --discord-muted:var(--sw-ink-3); --discord-text-muted:var(--sw-ink-3);
  --discord-green:var(--sw-green); --discord-red:var(--sw-red); --discord-yellow:var(--sw-yellow);
}

/* Sombre : même pastels, encre et papier inversés. Le script du head pose
   data-theme ; la media query couvre une page sans JS. */
/* Sombre adouci (retour du 06/11/2026 : « contraste trop fort ») : gris anthracite
   plutôt que presque noir, encre gris clair plutôt que blanc pur, pointillés à 24 %. */
@media (prefers-color-scheme: dark){ :root:not([data-theme="light"]){
  color-scheme:dark;
  --sw-bg:#1a1b22; --sw-surface:#20222b; --sw-inset:#16171d; --sw-raised:#292b37; --sw-raised-2:#343747; --sw-white:#ececec;
  --sw-ink:#e4e4e7; --sw-ink-2:#cfcfd4; --sw-ink-3:#a3a3aa; --sw-ink-4:#8b8b93; --sw-on:#ececec;
  /* Aplats : le pastel devient un ton sourd de même teinte, pour que le texte
     (--sw-on, blanc ici) reste lisible dessus. */
  --sw-red:#d3222e; --sw-orange:#a7531b; --sw-yellow:#846615; --sw-lime:#4c7213; --sw-green:#147b44; --sw-teal:#147b6d; --sw-cyan:#17798c; --sw-sky:#1d70af; --sw-blue:#5d6ad4; --sw-violet:#6724db; --sw-purple:#b024db; --sw-pink:#ca217b;
  --sw-line:rgba(255,255,255,.08); --sw-line-2:rgba(255,255,255,.24);
  --sw-red-soft:#3b1c1e; --sw-red-ink:#fc9ca2;   --sw-orange-soft:#3b281c; --sw-orange-ink:#fcc29c;
  --sw-yellow-soft:#3b321c; --sw-yellow-ink:#fce39c; --sw-lime-soft:#2e3b1c; --sw-lime-ink:#d6fc9c;
  --sw-green-soft:#1c3b2a; --sw-green-ink:#9cfcc9; --sw-teal-soft:#1c3b36; --sw-teal-ink:#9cfcf0;
  --sw-cyan-soft:#1c353b; --sw-cyan-ink:#9cecfc;   --sw-sky-soft:#1c2d3b; --sw-sky-ink:#9cd2fc;
  --sw-blue-soft:#1c1f3b; --sw-blue-ink:#a5aef5;   --sw-violet-soft:#271c3b; --sw-violet-ink:#bf9cfc;
  --sw-purple-soft:#331c3b; --sw-purple-ink:#e69cfc; --sw-pink-soft:#3b1c2c; --sw-pink-ink:#fc9ccf;
  --dsx-shadow-lg:0 10px 30px rgba(0,0,0,.5);
}}
:root[data-theme="dark"]{
  color-scheme:dark;
  --sw-bg:#1a1b22; --sw-surface:#20222b; --sw-inset:#16171d; --sw-raised:#292b37; --sw-raised-2:#343747; --sw-white:#ececec;
  --sw-ink:#e4e4e7; --sw-ink-2:#cfcfd4; --sw-ink-3:#a3a3aa; --sw-ink-4:#8b8b93; --sw-on:#ececec;
  /* Aplats : le pastel devient un ton sourd de même teinte, pour que le texte
     (--sw-on, blanc ici) reste lisible dessus. */
  --sw-red:#d3222e; --sw-orange:#a7531b; --sw-yellow:#846615; --sw-lime:#4c7213; --sw-green:#147b44; --sw-teal:#147b6d; --sw-cyan:#17798c; --sw-sky:#1d70af; --sw-blue:#5d6ad4; --sw-violet:#6724db; --sw-purple:#b024db; --sw-pink:#ca217b;
  --sw-line:rgba(255,255,255,.08); --sw-line-2:rgba(255,255,255,.24);
  --sw-red-soft:#3b1c1e; --sw-red-ink:#fc9ca2;   --sw-orange-soft:#3b281c; --sw-orange-ink:#fcc29c;
  --sw-yellow-soft:#3b321c; --sw-yellow-ink:#fce39c; --sw-lime-soft:#2e3b1c; --sw-lime-ink:#d6fc9c;
  --sw-green-soft:#1c3b2a; --sw-green-ink:#9cfcc9; --sw-teal-soft:#1c3b36; --sw-teal-ink:#9cfcf0;
  --sw-cyan-soft:#1c353b; --sw-cyan-ink:#9cecfc;   --sw-sky-soft:#1c2d3b; --sw-sky-ink:#9cd2fc;
  --sw-blue-soft:#1c1f3b; --sw-blue-ink:#a5aef5;   --sw-violet-soft:#271c3b; --sw-violet-ink:#bf9cfc;
  --sw-purple-soft:#331c3b; --sw-purple-ink:#e69cfc; --sw-pink-soft:#3b1c2c; --sw-pink-ink:#fc9ccf;
  --dsx-shadow-lg:0 10px 30px rgba(0,0,0,.5);
}

/* ---------- Base ---------- */
html,body{background:var(--sw-bg);color:var(--sw-ink);}
body{font-family:var(--sw-font);-webkit-font-smoothing:antialiased;letter-spacing:.01em;}
button,input,select,textarea{font-family:inherit;}
:focus-visible{outline:2px solid var(--sw-ink)!important;outline-offset:2px;}
::selection{background:var(--sw-blue);color:var(--sw-on);}

/* Titres et libellés : capitales espacées (charte, § 3). Le texte courant reste en casse normale. */
h1,h2,h3,.dsx-pagehead h1,.dsx-card-title,.mc-block-h,.dash-section-title,.dash-panel-h,.mc-head h1,.mc-head h2{
  font-family:var(--sw-font);font-weight:700;text-transform:uppercase;letter-spacing:.12em;}

/* Logo OpenBots (blanc à point orange) : silhouette noire sur le papier, comme
   l'exige la charte pour les logos de projets ; d'origine sur le thème sombre. */
:root:not([data-theme="dark"]) img[src*="openbots-logo"]{filter:brightness(0)!important;background:transparent!important;}

/* ---------- Blocs : contour pointillé qui devient plein au survol ---------- */
.dsx-card,.mc-block,.dash-section,.dash-panel,.dsx-tile,.card{
  background:var(--sw-surface);border:2px dashed var(--sw-line-2)!important;border-radius:12px;box-shadow:none!important;
  transition:border-color .2s,border-style .2s,transform .2s;}
/* Survol : seul le bloc le plus intérieur se fige en trait plein. Sans :has(), survoler
   un bloc imbriqué allumait aussi son parent — deux cadres actifs pour un seul survol.
   (.dash-w n'est qu'une enveloppe de .dash-panel : il n'a pas de cadre à lui.) */
:is(.dsx-card,.mc-block,.dash-panel,.dsx-tile,.card):hover:not(:has(:is(.dsx-card,.mc-block,.dash-panel,.dsx-tile,.card):hover)){
  border-style:solid!important;border-color:var(--sw-ink)!important;}
a.dsx-tile:hover,.dsx-tile[onclick]:hover{transform:translateY(-4px);}
.dsx-card-head,.mc-block-h,.dash-section-header{border-bottom:2px dashed var(--sw-line-2)!important;}

/* ---------- Commandes : un seul système ----------
   Avant, chaque page dessinait ses boutons (rayons de 6 à 30 px, traits pleins ou
   absents, casse normale ou capitales, transitions « all »). Trois rôles seulement :
     principal  aplat pastel + trait plein d'encre ; survol : encre pleine, texte inversé
     secondaire contour pointillé ; survol : trait plein (comme les blocs)
     danger     principal en rouge
   et un bouton-icône rond pour les actions sans texte. Les classes historiques sont
   rattachées ici plutôt que réécrites dans chaque gabarit. */
:is(.mc-btn,.dsx-btn,.btn,.ac-btn,.bl-sub-btn,.tf-plans .cta,.tf-total a,.tf-pool-don button,
    .vd-btn-submit,.vd-btn-vote,.dash-customize-btn,.dash-customize-reset,.dash-customize-save,
    .cfg-action-btn,.ai-btn-primary,.ai-btn-ghost,.ai-btn-danger,.bot-btn,.bot-btn-primary,.bot-btn-ghost,
    .bot-btn-success,.mc-btn-test,.notif-action-btn,.tkt-action-btn,.ob-pf-btn,.pi-save,.c-save,.mc-tp-save,
    a.ld-cta,.btn-install,.sw-btn,
    .hdr-btn,.save-btn,.pb-btn,.cr-btn,.up-act-btn,.st-btn,.ba-btn,.cfg-fab-btn,.dbtn,.mod-cfg-btn,.vk-act-btn,
    .tk-action-btn,.ev-act-btn,.rm-btn,.gw-btn,.mc-pd-btn,.pm-reset-btn,.gm-cta,.abg-btn-primary,.sc-btn,
    .rpg-item-btn,.cb-add-btn,.eco-addbtn,.rule-add-btn,.rc-add-btn,.wb-cancel-btn,.mu-acc-addbtn,
    .fc-up,.mc-btn-proposal,.ac-back){
  box-sizing:border-box;align-items:center;justify-content:center;gap:8px;
  min-height:var(--sw-btn-h);padding:0 18px;cursor:pointer;text-decoration:none;white-space:nowrap;
  font-family:var(--sw-font)!important;font-weight:700;font-size:.74rem;line-height:1.1;
  text-transform:uppercase;letter-spacing:.12em;
  border-radius:var(--sw-radius-pill)!important;border:2px dashed var(--sw-line-2)!important;
  background:transparent;color:var(--sw-ink)!important;box-shadow:none!important;filter:none!important;
  transition:background-color var(--sw-dur) var(--sw-ease),border-color var(--sw-dur) var(--sw-ease),
             color var(--sw-dur) var(--sw-ease),transform var(--sw-dur) var(--sw-ease)!important;}
:is(.mc-btn,.dsx-btn,.btn,.ac-btn,.bl-sub-btn,.tf-plans .cta,.tf-total a,.tf-pool-don button,
    .vd-btn-submit,.vd-btn-vote,.dash-customize-btn,.dash-customize-reset,.dash-customize-save,
    .cfg-action-btn,.ai-btn-primary,.ai-btn-ghost,.ai-btn-danger,.bot-btn,.bot-btn-primary,.bot-btn-ghost,
    .bot-btn-success,.mc-btn-test,.notif-action-btn,.tkt-action-btn,.ob-pf-btn,.pi-save,.c-save,.mc-tp-save,
    a.ld-cta,.btn-install,.sw-btn,
    .hdr-btn,.save-btn,.pb-btn,.cr-btn,.up-act-btn,.st-btn,.ba-btn,.cfg-fab-btn,.dbtn,.mod-cfg-btn,.vk-act-btn,
    .tk-action-btn,.ev-act-btn,.rm-btn,.gw-btn,.mc-pd-btn,.pm-reset-btn,.gm-cta,.abg-btn-primary,.sc-btn,
    .rpg-item-btn,.cb-add-btn,.eco-addbtn,.rule-add-btn,.rc-add-btn,.wb-cancel-btn,.mu-acc-addbtn,
    .fc-up,.mc-btn-proposal,.ac-back):hover{
  border-style:solid!important;border-color:var(--sw-ink)!important;background:var(--sw-surface);transform:translateY(-1px);}
/* Affichage dans une règle SANS spécificité (:where) : une page qui masque un bouton
   (classe « mobile seulement », état replié…) doit toujours l'emporter. Dans la règle
   ci-dessus, le :is() très spécifique rendait visibles des boutons cachés — le bouton
   « Télécharger l'app », réservé au mobile, s'affichait sur ordinateur. */
:where(.mc-btn,.dsx-btn,.btn,.ac-btn,.bl-sub-btn,.tf-plans .cta,.tf-total a,.tf-pool-don button,
    .vd-btn-submit,.vd-btn-vote,.dash-customize-btn,.dash-customize-reset,.dash-customize-save,
    .cfg-action-btn,.ai-btn-primary,.ai-btn-ghost,.ai-btn-danger,.bot-btn,.bot-btn-primary,.bot-btn-ghost,
    .bot-btn-success,.mc-btn-test,.notif-action-btn,.tkt-action-btn,.ob-pf-btn,.pi-save,.c-save,.mc-tp-save,
    a.ld-cta,.btn-install,.sw-btn,
    .hdr-btn,.save-btn,.pb-btn,.cr-btn,.up-act-btn,.st-btn,.ba-btn,.cfg-fab-btn,.dbtn,.mod-cfg-btn,.vk-act-btn,
    .tk-action-btn,.ev-act-btn,.rm-btn,.gw-btn,.mc-pd-btn,.pm-reset-btn,.gm-cta,.abg-btn-primary,.sc-btn,
    .rpg-item-btn,.cb-add-btn,.eco-addbtn,.rule-add-btn,.rc-add-btn,.wb-cancel-btn,.mu-acc-addbtn,
    .fc-up,.mc-btn-proposal,.ac-back){display:inline-flex;}
[hidden]{display:none!important;}
/* Principal */
:is(.mc-btn-primary,.dsx-btn-primary,.btn-primary,.btn-success,.ac-btn:not(.ghost):not(.sec):not(.danger),.bl-sub-btn,.tf-plans .cta,
    .tf-total a,.tf-pool-don button,.vd-btn-submit,.dash-customize-save,.cfg-action-btn.primary,.ai-btn-primary,
    .bot-btn-primary,.bot-btn-success,.ob-pf-btn.primary,.pi-save,.c-save,.mc-tp-save,a.ld-cta,.btn-install,.sw-btn-primary,
    .hdr-btn-primary,.save-btn,.cr-btn-save,.ba-btn-primary,.cfg-fab-btn,.dbtn,.gm-cta,.abg-btn-primary,.ba-btn.primary,
    .fc-up,.mc-btn-proposal,.mu-acc-addbtn,.rc-add-btn,.pb-btn.primary,.pb-btn.success,.st-btn.primary){
  background:var(--sw-blue)!important;border:2px solid var(--sw-ink)!important;color:var(--sw-on)!important;}
:is(.mc-btn-primary,.dsx-btn-primary,.btn-primary,.btn-success,.ac-btn:not(.ghost):not(.sec):not(.danger),.bl-sub-btn,.tf-plans .cta,
    .tf-total a,.tf-pool-don button,.vd-btn-submit,.dash-customize-save,.cfg-action-btn.primary,.ai-btn-primary,
    .bot-btn-primary,.bot-btn-success,.ob-pf-btn.primary,.pi-save,.c-save,.mc-tp-save,a.ld-cta,.btn-install,.sw-btn-primary,
    .hdr-btn-primary,.save-btn,.cr-btn-save,.ba-btn-primary,.cfg-fab-btn,.dbtn,.gm-cta,.abg-btn-primary,.ba-btn.primary,
    .fc-up,.mc-btn-proposal,.mu-acc-addbtn,.rc-add-btn,.pb-btn.primary,.pb-btn.success,.st-btn.primary):hover{
  background:var(--sw-ink)!important;color:var(--sw-bg)!important;}
/* Danger */
:is(.btn-danger,.mc-btn-danger,.mc-btn.hr-danger,.dsx-btn-danger,.ac-btn.danger,.cfg-action-btn.danger,.ai-btn-danger,.sw-btn-danger,.cr-btn-del,.pm-reset-btn,.ba-btn.danger){
  background:var(--sw-red)!important;border:2px solid var(--sw-ink)!important;color:var(--sw-on)!important;}
:is(.btn-danger,.mc-btn-danger,.mc-btn.hr-danger,.dsx-btn-danger,.ac-btn.danger,.cfg-action-btn.danger,.ai-btn-danger,.sw-btn-danger,.cr-btn-del,.pm-reset-btn,.ba-btn.danger):hover{
  background:var(--sw-red-ink)!important;color:var(--sw-bg)!important;}
/* Jamais de dégradé sur une commande (charte : aplats pastel) — y compris ceux posés
   en style en ligne dans les gabarits : la feuille l'emporte grâce à !important. */
:is(button,a[class*=btn],[class*=-btn],.fc-up,.cta,.mc-btn,.cfg-action-btn){background-image:none!important;}
/* Petite taille (barres d'outils, lignes de tableau) */
:is(.btn-sm,.ai-btn-sm,.sw-btn-sm,
    .hdr-btn,.vk-act-btn,.tk-action-btn,.ev-act-btn,.sc-btn,.rpg-item-btn,.mod-cfg-btn,.cr-btn,.rm-btn,.gw-btn,
    .up-act-btn,.st-btn,.eco-addbtn,.cb-add-btn,.rule-add-btn,.rc-add-btn){min-height:var(--sw-btn-h-sm);padding:0 12px;font-size:.68rem;}

/* Puces, filtres et onglets : même pilule et même mouvement que les boutons, en plus
   discret ; l'état choisi (.active, .on, .sel, aria-pressed/selected) passe en aplat
   pastel + trait d'encre, comme un bouton principal. */
:is(.pub-filter-btn,.sp-selbtn,.main-tab-btn,.pub-view-btn,.pv-view-btn,.pv-lim-btn,.hr-p-btn,.hr-f-mode-btn,
    .fmt-dsc-state-btn,.dl-cols-btn,.tk-hdr-btn,.st-mini-btn,.rc-mini-btn,.sw-chip-btn,.tf-toggle button){
  align-items:center;justify-content:center;gap:6px;min-height:var(--sw-btn-h-sm);padding:0 12px;
  font-family:var(--sw-font)!important;font-weight:700;font-size:.72rem;cursor:pointer;white-space:nowrap;
  border-radius:var(--sw-radius-pill)!important;border:2px dashed var(--sw-line-2)!important;
  background:transparent!important;color:var(--sw-ink-2)!important;box-shadow:none!important;
  transition:background-color var(--sw-dur) var(--sw-ease),border-color var(--sw-dur) var(--sw-ease),
             color var(--sw-dur) var(--sw-ease),transform var(--sw-dur) var(--sw-ease)!important;}
:is(.pub-filter-btn,.sp-selbtn,.main-tab-btn,.pub-view-btn,.pv-view-btn,.pv-lim-btn,.hr-p-btn,.hr-f-mode-btn,
    .fmt-dsc-state-btn,.dl-cols-btn,.tk-hdr-btn,.st-mini-btn,.rc-mini-btn,.sw-chip-btn,.tf-toggle button):hover{
  border-style:solid!important;border-color:var(--sw-ink)!important;color:var(--sw-ink)!important;}
:is(.pub-filter-btn,.sp-selbtn,.main-tab-btn,.pub-view-btn,.pv-view-btn,.pv-lim-btn,.hr-p-btn,.hr-f-mode-btn,
    .fmt-dsc-state-btn,.dl-cols-btn,.tk-hdr-btn,.st-mini-btn,.rc-mini-btn,.sw-chip-btn,.tf-toggle button):is(.active,.on,.sel,.selected,[aria-pressed="true"],[aria-selected="true"]){
  background:var(--sw-blue)!important;border:2px solid var(--sw-ink)!important;color:var(--sw-on)!important;}

:where(.pub-filter-btn,.sp-selbtn,.main-tab-btn,.pub-view-btn,.pv-view-btn,.pv-lim-btn,.hr-p-btn,.hr-f-mode-btn,
    .fmt-dsc-state-btn,.dl-cols-btn,.tk-hdr-btn,.st-mini-btn,.rc-mini-btn,.sw-chip-btn,.tf-toggle button){display:inline-flex;}
/* Boutons d'outils (barres d'éditeur, rails, petits carrés + / −) : leur forme compacte
   reste — c'est une grille d'outils, pas une rangée d'actions — mais le trait, le
   survol et le mouvement sont ceux de la charte. */
:is(.cb-tb-btn,.ab-tb-btn,.px-tool-btn,.fmf-tool-btn,.dl-rail-btn,.pm-w-btn,.rc-btn,.mc-layout-btn,.mc-ed-emojibtn,
    .eco-cur-btn,.ck-btn,.logic-toggle-btn,.ca-roles-btn,.ca-edit-btn,.dcv-me-btn,.aic-pdf-btn,.rev-btn,.tf-step button){
  border-radius:var(--sw-radius-field)!important;
  transition:background-color var(--sw-dur) var(--sw-ease),border-color var(--sw-dur) var(--sw-ease),
             color var(--sw-dur) var(--sw-ease),transform var(--sw-dur) var(--sw-ease)!important;}
:is(.cb-tb-btn,.ab-tb-btn,.px-tool-btn,.fmf-tool-btn,.pm-w-btn,.rc-btn,.eco-cur-btn,.logic-toggle-btn,.ca-roles-btn,
    .ca-edit-btn,.aic-pdf-btn,.rev-btn,.tf-step button){border:2px dashed var(--sw-line-2)!important;}
:is(.cb-tb-btn,.ab-tb-btn,.px-tool-btn,.fmf-tool-btn,.dl-rail-btn,.pm-w-btn,.rc-btn,.mc-layout-btn,.mc-ed-emojibtn,
    .eco-cur-btn,.logic-toggle-btn,.ca-roles-btn,.ca-edit-btn,.aic-pdf-btn,.rev-btn,.tf-step button):hover{
  border-style:solid!important;border-color:var(--sw-ink)!important;color:var(--sw-ink)!important;}
:is(.cb-tb-btn,.ab-tb-btn,.px-tool-btn,.fmf-tool-btn,.dl-rail-btn,.mc-layout-btn,.eco-cur-btn,.logic-toggle-btn):is(.active,.on,.sel,.selected,[aria-pressed="true"]){
  background:var(--sw-blue)!important;border:2px solid var(--sw-ink)!important;color:var(--sw-on)!important;}
/* Volontairement HORS système : les aperçus de messages Discord (.dcv-btn, .dc-button,
   .pb-fake-btn) imitent les boutons de Discord, pas ceux du panel. */
.btn-close,.btn-close-white{filter:none!important;}
:root[data-theme="dark"] .btn-close{filter:invert(1)!important;}

/* Boutons-icônes : rond, contour pointillé qui devient plein, même rythme que les pilules. */
:where(.ob-theme-btn,.dash-customize-close,.notif-dismiss-btn,.dsx-tile .act-btn,.sw-icon-btn){display:inline-flex;}
:is(.ob-theme-btn,.dash-customize-close,.notif-dismiss-btn,.dsx-tile .act-btn,.sw-icon-btn){
  align-items:center;justify-content:center;flex:none;
  width:var(--sw-btn-icon);height:var(--sw-btn-icon);padding:0;border-radius:50%!important;
  border:2px dashed transparent;background:transparent;color:var(--sw-ink);cursor:pointer;
  transition:background-color var(--sw-dur) var(--sw-ease),border-color var(--sw-dur) var(--sw-ease),
             color var(--sw-dur) var(--sw-ease),transform var(--sw-dur) var(--sw-ease)!important;}
.ob-theme-btn{border-color:var(--sw-line-2);font-size:1rem;}
:is(.ob-theme-btn,.dash-customize-close,.notif-dismiss-btn,.dsx-tile .act-btn,.sw-icon-btn):hover{
  border-style:solid;border-color:var(--sw-ink);background:var(--sw-surface);}
.dsx-tile .act-btn.del:hover{color:var(--sw-red-ink);border-color:var(--sw-red-ink);}
/* Boutons de la barre du dashboard (onglets-icônes) : leur forme reste, le mouvement s'aligne. */
:is(.fc-dash-btn,.fc-community-btn,.fc-botbtn){border-radius:var(--sw-radius-block)!important;
  transition:background-color var(--sw-dur) var(--sw-ease),border-color var(--sw-dur) var(--sw-ease),
             color var(--sw-dur) var(--sw-ease),transform var(--sw-dur) var(--sw-ease)!important;}

/* États communs à TOUTES les commandes : appui, désactivé, focus clavier immédiat. */
:is(button,[role=button],input[type=submit],input[type=button],a[class*=btn]):not(:disabled):active{transform:translateY(0) scale(.97)!important;}
:is(button,[role=button],input[type=submit],input[type=button],a[class*=btn]):disabled,
:is(button,a[class*=btn])[aria-disabled=true]{opacity:.45!important;cursor:not-allowed!important;transform:none!important;}
:is(button,[role=button],input[type=submit],input[type=button],a,summary):focus-visible{
  outline:2px solid var(--sw-ink)!important;outline-offset:2px;transition:none!important;}

/* ---------- Champs ---------- */
/* .sw-bare : champ intégré à une boîte qui porte déjà la bordure (recherche avec icône,
   ex. compte Discord du staff) — sinon double cadre. */
input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]):not(.fmf-search-input):not(.sw-bare),select,textarea,.form-control,.form-select{
  background-color:var(--sw-bg)!important;color:var(--sw-ink)!important;border:2px solid var(--sw-line)!important;border-radius:9px;}
input:not([type=checkbox]):not([type=radio]):not(.fmf-search-input):not(.sw-bare):focus,select:focus,textarea:focus,.form-control:focus,.form-select:focus{
  border-color:var(--sw-ink)!important;box-shadow:none!important;outline:none;}
input::placeholder,textarea::placeholder{color:var(--sw-ink-4)!important;}
input[type=checkbox],input[type=radio],input[type=range]{accent-color:var(--sw-ink);}

/* ---------- Dashboard : en-tête, barre de modules, infobulles ---------- */
.fc-mod{border-radius:12px;}
.fc-mod.on{color:var(--sw-ink);}
.fc-mod:hover{transform:translateY(-2px);}
.fc-tip{font-family:var(--sw-font);text-transform:uppercase;letter-spacing:.12em;font-size:.66rem;font-weight:700;
  background:var(--sw-ink)!important;color:var(--sw-bg)!important;border:0!important;}

/* Bascule de thème (profil) */
.ob-theme-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;flex:none;border-radius:50%;
  border:2px dashed var(--sw-line-2);background:transparent;color:var(--sw-ink);cursor:pointer;font-size:1rem;}
.ob-theme-btn:hover{border-style:solid;border-color:var(--sw-ink);}
.ob-theme-btn .bi-sun-fill{display:none;}
:root[data-theme="dark"] .ob-theme-btn .bi-sun-fill{display:inline;}
:root[data-theme="dark"] .ob-theme-btn .bi-moon-stars-fill{display:none;}

@media (prefers-reduced-motion: reduce){
  .dsx-tile,.fc-mod,.mc-btn,.btn{transition:none!important;transform:none!important;}
  :is(button,[role=button],input[type=submit],a[class*=btn],a[class*=cta],.ob-theme-btn,.sw-icon-btn){transition:none!important;transform:none!important;}
}


/* Fenêtre « ＋ Créer un salon / rôle / catégorie » ajoutée à tous les menus de salon et
   de rôle (static/js/ob-pickers.js). */
.ob-pick-dlg{position:fixed;inset:0;z-index:10050;display:flex;align-items:center;justify-content:center;
  padding:16px;background:color-mix(in srgb,var(--sw-ink) 35%,transparent);}
.ob-pick-box{width:min(380px,100%);background:var(--sw-surface);color:var(--sw-ink);font-family:var(--sw-font);
  border:2px solid var(--sw-ink);border-radius:var(--sw-radius-block,12px);padding:20px;display:grid;gap:12px;}
.ob-pick-box h3{margin:0;font-size:1rem;}
.ob-pick-box label{display:grid;gap:6px;font-weight:700;font-size:.8rem;}
.ob-pick-box input{background:var(--sw-bg);color:var(--sw-ink);border:2px dashed var(--sw-line-2);
  border-radius:var(--sw-radius-field,9px);padding:9px 11px;font:inherit;font-weight:400;}
.ob-pick-box input:focus-visible{outline:none;border-style:solid;border-color:var(--sw-ink);}
.ob-pick-err{margin:0;color:var(--sw-red-ink);font-size:.8rem;}
.ob-pick-row{display:flex;justify-content:flex-end;gap:8px;}

/* Fenêtre « Lancer le Mode Communauté » (static/js/free-config.js, fcCmLaunchOpen) :
   aperçu de ce qui sera publié, à approuver avant tout envoi. */
.ob-launch-box{width:min(520px,100%);max-height:calc(100vh - 32px);overflow:auto;}
.ob-launch-steps{margin:0;padding-left:20px;display:grid;gap:6px;font-size:.85rem;}
.ob-launch-preview{border-left:4px solid var(--sw-blue);background:var(--sw-bg);
  border-radius:var(--sw-radius-field,9px);padding:10px 12px;font-size:.82rem;white-space:pre-line;}
.ob-launch-preview strong{display:block;margin-bottom:4px;font-size:.9rem;}
.ob-launch-days{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
.ob-launch-box .ob-check{display:flex;gap:8px;align-items:center;font-weight:400;}
.ob-launch-box .ob-check input{width:auto;}

/* ── Icônes Bootstrap centrées ──
   bootstrap-icons décale chaque glyphe vers le bas (::before { vertical-align:-.125em })
   pour l'aligner sur la ligne de base d'un TEXTE. Dans un bouton ou une pastille centrés en
   flex, l'icône n'est pas dans du texte : ce décalage, ajouté à la hauteur de ligne héritée
   (1.5), la laissait visiblement trop basse. line-height:1 partout, et plus de décalage pour
   une icône posée directement dans un bouton, un lien ou une boîte d'icône. */
.bi{line-height:1;}
:where(button,a,label,summary,[role=button],[class*=btn],[class*=-ic],[class*=icon],[class*=avatar],
  .mini,.cap-ic,.act-btn,.fc-mod,.dsx-tile .ic) > .bi::before{vertical-align:0;}
