/* public/css/design/shell.css
 * Ossature de l'application (topbar, sidebar, panneau reglages) — Phase 4, 20/07/2026.
 * Marquage 100% neuf (ssm-*), independant d'AdminLTE. adminlte.min.css reste charge
 * uniquement pour les composants pas encore repris a l'interieur de #body_app
 * (small-box/info-box/callout — voir DESIGN.md), mais ne stylise plus rien ici.
 * S'appuie sur les tokens de tokens.css (--bg, --surface, --accent, --ink, ...).
 */

* { box-sizing: border-box; }

body.ssm-app {
  margin: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: var(--font-ui);
  min-height: 100vh;
}

/* Scrollbar du navigateur (page entiere), meme couleur que le theme actif (retour utilisateur
   24/07/2026). La scrollbar RACINE (page entiere, dessinee par le navigateur/OS) ne suit QUE les
   styles poses sur <html> - stylee sur body seul, verifiee non coloree dans un vrai navigateur
   malgre un getComputedStyle correct sur body. --accent/--bg ne sont definies que sur
   body[data-design] (tokens.css) : un petit script inline (layout/header.php, juste apres
   l'ouverture de <body>) les recopie sur <html> avant le premier paint - ce qui suit ici lit ces
   memes variables une fois presentes sur html. */
html {
  scrollbar-width: thin;
  scrollbar-color: var(--accent, #3B49C8) var(--bg, #F3EDE1);
}
html::-webkit-scrollbar { width: 10px; height: 10px; }
html::-webkit-scrollbar-track { background: var(--bg, #F3EDE1); }
html::-webkit-scrollbar-thumb {
  background-color: var(--accent, #3B49C8);
  border-radius: 8px;
  border: 2px solid var(--bg, #F3EDE1);
  background-clip: content-box;
}
html::-webkit-scrollbar-thumb:hover { background-color: var(--accent-hover, var(--accent, #3B49C8)); }

.ssm-shell {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}

.ssm-body {
  display: flex;
  flex: 1;
  min-height: 0;
}

/* ---- Sidebar (menu classique) ----
   Retour utilisateur 23-24/07/2026 : "scroll de navigateur doit rester, on fait juste scroll
   pour le menu gauche tout seul, comme le panneau de reglages a droite" - meme principe que
   .ssm-settings (position:fixed, colonne independante du flux de page) plutot que de contraindre
   toute la page en overflow:hidden (tentative precedente, annulee : ca desactivait aussi le
   scroll navigateur normal sur .ssm-content). La sidebar est fixee sous la topbar (68px, .ssm-
   topbar) et defile UNIQUEMENT en interne si son propre contenu depasse la hauteur disponible ;
   le reste de la page (topbar sticky + .ssm-content) garde le defilement navigateur habituel,
   inchange. .ssm-content recoit un margin-left egal a la largeur de la sidebar pour ne pas passer
   dessous (la sidebar sort du flux flex normal avec position:fixed). */
.ssm-sidebar {
  width: 232px;
  position: fixed;
  top: 68px;
  bottom: 0;
  left: 0;
  z-index: 30;
  background: var(--surface);
  border-right: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  padding: 14px 10px 20px;
  overflow-y: auto;
  transition: margin-left .18s ease, width .18s ease;
  /* Scrollbar visible + couleur du theme actif (retour utilisateur 23/07/2026 : la scrollbar
     grise par defaut du navigateur etait a peine visible dans le menu classique). N'apparait que
     si le contenu de la sidebar depasse sa hauteur disponible (overflow-y:auto standard). */
  scrollbar-width: thin;
  scrollbar-color: var(--accent) transparent;
}
.ssm-sidebar::-webkit-scrollbar { width: 8px; }
.ssm-sidebar::-webkit-scrollbar-track { background: transparent; }
.ssm-sidebar::-webkit-scrollbar-thumb {
  background-color: var(--accent);
  border-radius: 8px;
  border: 2px solid transparent;
  background-clip: content-box;
}
body.ssm-sidebar-collapsed .ssm-sidebar { margin-left: -232px; }
body.ssm-layout-classique:not(.ssm-sidebar-collapsed) .ssm-content { margin-left: 232px; }
@media (max-width: 860px) {
  .ssm-sidebar { box-shadow: var(--shadow); }
  body.ssm-layout-classique:not(.ssm-sidebar-collapsed) .ssm-content { margin-left: 0; }
}

.ssm-brand {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 8px 16px; text-decoration: none; color: var(--ink);
  border-bottom: 1px solid var(--line); margin-bottom: 10px;
}
.ssm-brand-mark { width: 26px; height: 26px; border-radius: var(--radius); object-fit: contain; }
.ssm-brand-name { font: 800 15px var(--font-display); letter-spacing: .02em; }

.ssm-user { display: flex; align-items: center; gap: 9px; padding: 4px 8px 16px; }
/* Premier bloc de la sidebar depuis que le logo/nom de station a demenage dans la top bar
   (21/07/2026) - reprend la petite bordure de separation qu'avait le bloc marque avant. */
.ssm-user--haut { padding-top: 16px; border-bottom: 1px solid var(--line); margin-bottom: 10px; }
.ssm-user-avatar { color: var(--accent); font-size: 22px; }
.ssm-user-name { color: var(--ink); text-decoration: none; font: 600 13px var(--font-ui); }
.ssm-user-name:hover { color: var(--accent); }

.ssm-nav { display: flex; flex-direction: column; gap: 2px; }
/* body[data-design] prefixe partout ici : .ssm-nav-link/.ssm-nav-sublink sont des <a> pour les
   entrees simples/sous-entrees (les entetes de groupe, elles, sont des <button>, pas concernees) -
   sans ce prefixe, la regle generique "body[data-design] a { color: var(--accent); }"
   (components.css, specificite attribut+element) bat une simple classe et forcait ces liens en
   accent au lieu de var(--ink-2) - constate : "certains items du menu en noir, d'autres a la
   couleur du theme" (les boutons de groupe restaient corrects, seuls les <a> deviaient). Meme
   piege deja documente pour palette/rail/dock (§13) - il existait ici depuis bien plus longtemps. */
body[data-design] .ssm-nav-link {
  display: flex; align-items: center; gap: 10px; width: 100%;
  padding: 9px 10px; border-radius: var(--radius); color: var(--ink-2);
  text-decoration: none; font: 600 13px var(--font-ui); border: none; background: none;
  cursor: pointer; text-align: left;
}
.ssm-nav-link i { width: 16px; text-align: center; font-size: 13px; flex: none; }
body[data-design] .ssm-nav-link:hover { background: var(--surface-2); color: var(--ink); }
/* Fix (21/07/2026) : ".ssm-nav-link:hover" (classe+pseudo-classe) a une specificite superieure a
   ".ssm-nav-link--active" (une seule classe) - survoler un lien ACTIF faisait donc gagner le fond
   clair du survol (var(--surface-2)) pendant que le texte restait blanc (accent-ink, pense pour
   contraster sur l'accent, pas sur le fond clair du survol) => texte blanc invisible sur fond
   quasi-blanc, signale par l'utilisateur. Fix : background aussi en !important (comme deja fait
   pour color), l'etat actif ne doit jamais etre efface par un simple survol. */
body[data-design] .ssm-nav-link--active { background: var(--accent) !important; color: var(--accent-ink) !important; font-weight: 700; }
.ssm-nav-caret { margin-left: auto; font-size: 10px; transition: transform .15s; }
.ssm-nav-group--open .ssm-nav-caret { transform: rotate(90deg); }
.ssm-nav-sub { display: none; flex-direction: column; padding: 2px 0 4px 34px; gap: 1px; }
.ssm-nav-group--open .ssm-nav-sub { display: flex; }
body[data-design] .ssm-nav-sublink {
  display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-radius: var(--radius);
  color: var(--ink-2); text-decoration: none; font: 500 12.5px var(--font-ui);
}
.ssm-nav-sublink i { width: 14px; text-align: center; font-size: 11px; flex: none; }
body[data-design] .ssm-nav-sublink:hover { color: var(--ink); background: var(--surface-2); }
/* Meme piege que ci-dessus, moins critique ici (le fond du survol reste clair, le texte fonce
   n'est jamais illisible) mais corrige pour la coherence : l'etat actif doit rester visible. */
body[data-design] .ssm-nav-sublink--active { color: var(--accent) !important; font-weight: 700; }

/* ---- Topbar (21/07/2026 : agrandie + elements agrandis, retour utilisateur) ---- */
.ssm-topbar {
  display: flex; align-items: center; gap: 12px;
  height: 68px; padding: 0 20px; flex: none;
  background: var(--surface); border-bottom: 1px solid var(--line);
  /* position:sticky + z-index explicite : garantit que la topbar reste au-dessus de tout ce qui
     defile en dessous (notamment l'en-tete de tableau sticky, qui sinon pouvait passer par-dessus
     elle au lieu de s'arreter juste en dessous - signale par l'utilisateur). */
  position: sticky; top: 0; z-index: 20;
}
.ssm-topbar-toggle { font-size: 16px; }
/* Marque compacte dans la top bar (21/07/2026) : la top bar est desormais unique pour toutes les
   dispositions de navigation (palette/rail/dock n'ont pas de sidebar persistante ou logo/nom
   pourrait vivre) - logo + nom de la station, tronque proprement si trop long plutot que de
   deborder sur le fil d'ariane/bandeau juste a cote. Plus de doublon dans le menu classique (le
   nom de la station ne vit plus que ICI, voir left_bar.php) - top bar plus large donc plus de
   place pour bien le presenter. */
.ssm-brand--compact {
  display: flex; align-items: center; gap: 10px; padding: 0; flex: none; max-width: 240px;
  text-decoration: none; color: var(--ink);
}
.ssm-brand--compact:hover { color: var(--accent); text-decoration: none; }
.ssm-brand--compact .ssm-brand-mark { width: 32px; height: 32px; object-fit: contain; flex: none; }
.ssm-brand--compact .ssm-brand-name {
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px;
}
@media (max-width: 960px) { .ssm-brand--compact .ssm-brand-name { display: none; } }
/* Fil d'ariane en "piste" de pastilles (21/07/2026) - retour utilisateur "faire un style pour
   la partie Vente/Client..." (auparavant du texte brut + '/'). Meme langage visuel que le thumb
   du sous-menu de module (piste + segment plein pour l'etape courante). */
.ssm-breadcrumb {
  display: flex; align-items: center; gap: 2px; font: 700 12.5px var(--font-ui); flex: none;
  background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--radius);
  padding: 4px; text-transform: uppercase; letter-spacing: .03em;
}
.ssm-breadcrumb-item, .ssm-breadcrumb-current {
  padding: 6px 12px; border-radius: calc(var(--radius) - 2px);
}
.ssm-breadcrumb-item { color: var(--ink-2); text-decoration: none; }
.ssm-breadcrumb-item:hover { color: var(--ink); background: var(--surface); }
.ssm-breadcrumb-sep { display: none; }
.ssm-breadcrumb-current { background: var(--accent); color: var(--accent-ink); font-weight: 800; }
.ssm-topbar-spacer { flex: 1; }
.ssm-topbar-notifs { display: flex; align-items: center; gap: 6px; }

/* Bouton Reglages (21/07/2026) : detache de la top bar, sticky en bas a droite de l'ecran (retour
   utilisateur explicite - "je veux le separer, le faire sticky en bas a droite"). */
.ssm-settings-fab {
  position: fixed; right: 20px; bottom: 20px; z-index: 65; width: 48px; height: 48px;
  border-radius: 50%; border: none; background: var(--accent); color: var(--accent-ink);
  box-shadow: var(--shadow); display: flex; align-items: center; justify-content: center;
  font-size: 17px; cursor: pointer; transition: transform .2s ease;
}
.ssm-settings-fab:hover { transform: scale(1.07); }

.ssm-icon-btn {
  width: 38px; height: 38px; border-radius: var(--radius); border: 1px solid transparent;
  background: transparent; color: var(--ink-2); display: inline-grid; place-items: center;
  cursor: pointer; position: relative; font-size: 15px;
}
.ssm-icon-btn:hover { background: var(--surface-2); color: var(--ink); }
.ssm-icon-btn .navbar-badge, .ssm-icon-btn .badge {
  position: absolute; top: 2px; right: 2px; font-size: 9px; padding: 2px 4px;
}

.ssm-search { position: relative; display: flex; align-items: center; }
.ssm-search-panel {
  display: none; align-items: center; gap: 6px; position: absolute; right: 0; top: 42px;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); padding: 8px; z-index: 30; min-width: 260px;
}
.ssm-search-panel.ssm-search-open { display: flex; }

/* ---- Notifications (fragment AJAX) ---- */
.ssm-notif { position: relative; }
/* Elargi (21/07/2026) : chaque dropdown de notification affiche un seul domaine a la fois - retour
   utilisateur "chacune s'affiche toute seule, pourquoi ne pas utiliser l'espace pour que le
   contenu soit pro et lisible".
   Piege vecu et corrige : ".ssm-menu-lg" seule (une classe) a la MEME specificite que ".ssm-menu"
   (components.css, min-width:180px) - comme components.css est charge APRES shell.css
   (header.php), ".ssm-menu" gagnait la egalite de specificite par ordre de source et ecrasait
   les 420px (constate : texte du dropdown de notification retombe sur 2 lignes malgre cette
   regle). Fix : ".ssm-menu.ssm-menu-lg" (deux classes chainees, specificite superieure),
   gagne desormais quel que soit l'ordre des fichiers. */
.ssm-menu.ssm-menu-lg { min-width: 420px; max-width: min(460px, calc(100vw - 32px)); }
/* Fix (21/07/2026) : ces icones etaient en "text-white" en dur (héritage d'avant la refonte
   Phase 4, quand le bouton avait un fond sombre) - sur .ssm-icon-btn (fond transparent), une
   icone blanche est invisible en theme clair.
   V2 (meme jour) : retour utilisateur - une seule couleur pour les 4 (pas 4 couleurs differentes),
   accordee a l'accent du theme actif (s'adapte automatiquement aux 4 directions), et un peu plus
   grande pour mieux ressortir dans la top bar. */
.ssm-notif .ssm-icon-btn i.ssm-notif-icon,
.ssm-notif-icon--accent, .ssm-notif-icon--warn, .ssm-notif-icon--ok, .ssm-notif-icon--bad {
  color: var(--accent) !important; font-size: 16px !important;
}

/* Contenu des dropdowns de notification (21/07/2026) : rangees propres, meme famille visuelle
   que les comptes ouverts juste a cote (icone en pastille + texte + compteur), plus de
   <ul>/dropdown-divider/classes bootstrap text-*. */
body[data-design] .ssm-notif-panel { padding: 14px; }
.ssm-notif-list { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
body[data-design] .ssm-notif-row {
  display: flex; align-items: center; gap: 12px; padding: 12px 10px; border-radius: var(--radius);
  color: var(--ink); text-decoration: none;
}
body[data-design] .ssm-notif-row:hover { background: var(--surface-2); color: var(--ink); text-decoration: none; }
.ssm-notif-row-icon {
  width: 36px; height: 36px; border-radius: 50%; flex: none; background: var(--bad-bg); color: var(--bad);
  display: inline-flex; align-items: center; justify-content: center; font-size: 14px;
}
.ssm-notif-row-texte { flex: 1; min-width: 0; font: 600 13.5px var(--font-ui); }
.ssm-notif-row-count {
  flex: none; min-width: 26px; text-align: center; padding: 4px 9px; border-radius: 999px;
  background: var(--bad-bg); color: var(--bad); font: 800 12px var(--font-ui);
}
body[data-design] .ssm-notif-row--alerte .ssm-notif-row-texte { font-weight: 500; }
body[data-design] .ssm-notif-row--alerte .ssm-notif-row-texte strong { color: var(--bad); }

/* ---- Comptes ouverts (21/07/2026, separe du panneau Reglages) ---- */
.ssm-comptes-dropdown { position: relative; }
.ssm-comptes-btn { color: var(--ok); }
.ssm-comptes-btn:hover { background: var(--ok-bg); color: var(--ok); }
.ssm-comptes-menu { min-width: 300px; padding: 10px; }
.ssm-comptes-groupe { margin-bottom: 6px; }
.ssm-comptes-groupe:last-child { margin-bottom: 0; }
.ssm-comptes-groupe-titre {
  display: flex; align-items: center; gap: 8px; font: 700 11px var(--font-ui);
  text-transform: uppercase; letter-spacing: .04em; color: var(--ink-2); padding: 6px 8px 4px;
}
/* body[data-design] prefixe : specificite necessaire pour battre la regle generique
   "body[data-design] a { color: var(--accent); }" (components.css) - sans ca, ces liens
   heritaient de l'accent au lieu de var(--ink), constate lors des tests. */
body[data-design] .ssm-comptes-item {
  display: flex; align-items: center; gap: 10px; padding: 8px; border-radius: var(--radius);
  color: var(--ink); text-decoration: none; transition: background .15s;
}
body[data-design] .ssm-comptes-item:hover { background: var(--ok-bg); color: var(--ink); text-decoration: none; }
.ssm-comptes-item-icon {
  width: 28px; height: 28px; border-radius: 50%; flex: none; background: var(--ok-bg); color: var(--ok);
  display: inline-flex; align-items: center; justify-content: center; font-size: 12px;
}
.ssm-comptes-item-label { display: flex; flex-direction: column; font: 600 12.5px var(--font-ui); }
.ssm-comptes-item-nom { font: 700 13px var(--font-display); color: var(--ink); }
.ssm-comptes-vide {
  display: flex; align-items: center; gap: 8px; padding: 14px 8px; color: var(--ink-2);
  font: 500 12.5px var(--font-ui); justify-content: center;
}

/* ---- Bandeaux defilants de la top bar (21/07/2026) ----
   Decompose en DEUX bandeaux empiles (retour utilisateur) : actions (#journal_ticker_topbar) et
   derniers prix de vente des carburants (#prix_carburants_topbar) - meme mecanique de
   defilement/fondu des bords pour les deux, juste plus bas/compact pour tenir empiles dans la
   top bar agrandie. Marge propre avec les voisins (marque/fil d'ariane a gauche, recherche a
   droite) portee par le conteneur commun .ssm-ticker-stack plutot que par chaque bandeau. */
.ssm-ticker-stack { display: flex; flex-direction: column; gap: 4px; flex: 1; min-width: 0; margin: 0 12px; }
.ssm-journal-ticker, .ssm-price-ticker {
  display: flex; align-items: center; gap: 8px; height: 24px;
  background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--radius);
  padding: 0 10px; overflow: hidden;
}
.ssm-journal-ticker-icon, .ssm-price-ticker-icon { color: var(--ink-2); font-size: 11px; flex: none; display: flex; }
.ssm-journal-ticker-empty, .ssm-price-ticker-empty { color: var(--ink-2); font: 500 11.5px var(--font-ui); }
.ssm-journal-ticker-viewport, .ssm-price-ticker-viewport {
  flex: 1; min-width: 0; height: 100%; overflow: hidden;
  -webkit-mask-image: linear-gradient(to right, transparent 0, #000 18px, #000 calc(100% - 18px), transparent 100%);
  mask-image: linear-gradient(to right, transparent 0, #000 18px, #000 calc(100% - 18px), transparent 100%);
}
.ssm-journal-ticker-track, .ssm-price-ticker-track {
  display: flex; align-items: center; gap: 26px; height: 100%; width: max-content;
  animation-name: ssm-journal-scroll; animation-timing-function: linear; animation-iteration-count: infinite;
}
/* Le survol met le defilement en pause : l'action/le prix reste lisible tant qu'on ne bouge pas la souris. */
.ssm-journal-ticker-viewport:hover .ssm-journal-ticker-track,
.ssm-price-ticker-viewport:hover .ssm-price-ticker-track { animation-play-state: paused; }
@keyframes ssm-journal-scroll {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}
.ssm-journal-ticker-item {
  display: inline-flex; align-items: center; gap: 6px; border: none; background: transparent;
  color: var(--ink-2); font: 600 11.5px var(--font-ui); padding: 1px 4px; margin: 0; cursor: pointer;
  white-space: nowrap; border-radius: var(--radius);
}
.ssm-journal-ticker-item:hover { color: var(--ink); background: var(--surface); }
.ssm-journal-ticker-item b { color: var(--ink); font-weight: 700; }
.ssm-journal-ticker-time { color: var(--ink-2); font-weight: 500; opacity: .75; }
.ssm-journal-ticker-item--creation i { color: var(--ok); }
.ssm-journal-ticker-item--modification i { color: var(--warn); }
.ssm-journal-ticker-item--suppression i { color: var(--bad); }
/* Bouton reglages (28/07/2026) : ouvre la checklist des modules affiches dans le fil d'activite. */
.ssm-journal-ticker-reglages {
  flex: none; border: none; background: transparent; color: var(--ink-2); cursor: pointer;
  display: flex; align-items: center; justify-content: center; width: 18px; height: 18px;
  border-radius: var(--radius); font-size: 11px;
}
.ssm-journal-ticker-reglages:hover { color: var(--ink); background: var(--surface); }

/* Bandeau des prix carburant : meme gabarit, teinte legerement differente (icone accent) pour
   le distinguer au premier coup d'oeil du bandeau d'actions juste au-dessus. */
.ssm-price-ticker-icon { color: var(--accent); }
.ssm-price-ticker-item {
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; font: 600 11.5px var(--font-ui);
}
.ssm-price-ticker-nom { color: var(--ink-2); }
.ssm-price-ticker-valeur { color: var(--ink); font-weight: 800; font-variant-numeric: tabular-nums; }

@media (prefers-reduced-motion: reduce) {
  .ssm-journal-ticker-track, .ssm-price-ticker-track { animation: none; }
}
@media (max-width: 900px) {
  .ssm-ticker-stack { display: none; }
}

/* ---- Contenu ---- */
.ssm-content { flex: 1; min-width: 0; overflow-x: hidden; overflow-y: auto; }
/* Marge basse augmentee (21/07/2026) : reserve la place pour les boutons flottants sticky (FAB
   Reglages bas-droite - toujours present - et FAB du dock bas-gauche - disposition dock) qui
   chevauchaient sinon le contenu de fin de page (derniere ligne de tableau, boutons...). */
.ssm-container { padding: 18px 20px 96px; }
.ssm-panel { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-card); box-shadow: var(--shadow); }
.ssm-panel-head { padding: 12px 16px; border-bottom: 1px solid var(--line); font-weight: 700; }
.ssm-panel-body { padding: 16px; }

/* ---- Footer ---- */
.ssm-footer {
  display: flex; justify-content: space-between; align-items: center;
  padding: 10px 20px; font: 500 12px var(--font-ui); color: var(--ink-2);
  background: var(--surface); border-top: 1px solid var(--line); flex: none;
}

/* ---- Panneau reglages (glisse depuis la droite) ---- */
.ssm-settings {
  position: fixed; top: 0; right: -340px; bottom: 0; width: 320px; z-index: 50;
  background: var(--surface); border-left: 1px solid var(--line); box-shadow: var(--shadow);
  display: flex; flex-direction: column; transition: right .2s ease;
}
.ssm-settings.ssm-settings-open { right: 0; }
.ssm-settings-head {
  display: flex; justify-content: space-between; align-items: center;
  padding: 14px 16px; border-bottom: 1px solid var(--line); font: 700 14px var(--font-display);
}
/* Fix (21/07/2026) : sans "flex:1 1 auto" + "min-height:0", un enfant flex ne se contraint jamais
   en dessous de la hauteur de son contenu - l'"overflow-y:auto" ne se declenchait donc jamais
   (le contenu debordait silencieusement de .ssm-settings, sans barre de defilement, invisible en
   bas sur un ecran de petite hauteur - signale par l'utilisateur). */
.ssm-settings-body { padding: 16px; overflow-y: auto; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; gap: 18px; }
/* Pied de panneau (22/07/2026) : flex:none, hors de .ssm-settings-body qui defile - reste donc
   toujours visible en bas du panneau quel que soit le defilement, sans position:sticky (le
   parent .ssm-settings est deja une colonne flex de hauteur fixe - un simple element APRES le
   bloc qui defile suffit). Voir ssm_marquer_modifie() (footer.php) pour l'activation du bouton. */
.ssm-settings-footer { flex: none; padding: 12px 16px; border-top: 1px solid var(--line); background: var(--bg); }
.ssm-settings-footer .ssm-btn[disabled] { opacity: .45; cursor: not-allowed; }
.ssm-settings-section { display: flex; flex-direction: column; gap: 10px; }
.ssm-settings-title { font: 700 10.5px var(--font-ui); text-transform: uppercase; letter-spacing: .08em; color: var(--ink-2); }

.ssm-swatch-grid { display: flex; flex-direction: column; gap: 6px; }
.ssm-swatch-btn {
  display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: var(--radius);
  border: 1px solid var(--line); background: var(--bg); color: var(--ink); font: 600 12.5px var(--font-ui);
  cursor: pointer; text-align: left;
}
.ssm-swatch-btn:hover { border-color: var(--accent); }
.ssm-swatch-btn--active { border-color: var(--accent); background: var(--surface-2); font-weight: 700; }
.ssm-swatch { width: 20px; height: 20px; border-radius: 50%; flex: none; border: 1px solid rgba(0,0,0,.15); }
.ssm-swatch-dark { background: #1c1c1c; }
.ssm-swatch-blue { background: #5b9bd5; }
.ssm-swatch-majorelle { background: #3B49C8; }
.ssm-swatch-pupitre { background: #2AD4C3; }
.ssm-swatch-irise { background: #6C4CF1; }
.ssm-swatch-aurore { background: #FF5A1F; }

.ssm-seg { display: flex; border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; }
.ssm-seg-btn { flex: 1; padding: 8px; border: none; background: var(--bg); color: var(--ink-2); font: 700 12px var(--font-ui); cursor: pointer; }
.ssm-seg-btn--active { background: var(--accent); color: var(--accent-ink); }

/* ---- Disposition de navigation (21/07/2026) : classique/palette/rail/dock ---- */
.ssm-layout-grid { display: flex; flex-direction: column; gap: 6px; }
.ssm-layout-btn {
  display: flex; align-items: center; gap: 10px; padding: 9px 10px; border-radius: var(--radius);
  border: 1px solid var(--line); background: var(--bg); color: var(--ink); cursor: pointer; text-align: left;
}
.ssm-layout-btn:hover { border-color: var(--accent); }
.ssm-layout-btn--active { border-color: var(--accent); background: var(--surface-2); }
.ssm-layout-icon {
  width: 30px; height: 30px; border-radius: var(--radius); flex: none; background: var(--surface-2);
  color: var(--accent); display: inline-flex; align-items: center; justify-content: center; font-size: 13px;
}
.ssm-layout-btn--active .ssm-layout-icon { background: var(--accent); color: var(--accent-ink); }
.ssm-layout-texte { display: flex; flex-direction: column; font: 600 12.5px var(--font-ui); }
.ssm-layout-texte span { font: 500 11px var(--font-ui); color: var(--ink-2); }

/* ---- Style/alignement du sous-menu de module (22/07/2026, migration 014) : panneau Reglages
   global + repris (variante compacte) dans le dropdown "Theme" par module - voir
   ssm_nav_style_options()/ssm_nav_align_options() (vendor/function.php). Chaque bouton affiche
   un mini apercu (3 "onglets" factices) du style correspondant. ---- */
.ssm-navstyle-grid { display: flex; flex-direction: column; gap: 6px; }
.ssm-navstyle-btn {
  display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: var(--radius);
  border: 1px solid var(--line); background: var(--bg); color: var(--ink); font: 600 12px var(--font-ui);
  cursor: pointer; text-align: left;
}
.ssm-navstyle-btn:hover { border-color: var(--accent); }
.ssm-navstyle-btn--active { border-color: var(--accent); background: var(--surface-2); font-weight: 700; }
.ssm-navstyle-apercu { display: inline-flex; align-items: flex-end; gap: 3px; width: 44px; height: 18px; flex: none; }
.ssm-navstyle-apercu i { display: block; width: 12px; height: 14px; border-radius: 3px; background: var(--surface-2); font-style: normal; box-sizing: border-box; }
.ssm-navstyle-apercu--plein i:first-child { background: var(--accent); height: 16px; }
.ssm-navstyle-apercu--ligne i { height: 10px; border-radius: 2px 2px 0 0; border-bottom: 2px solid transparent; background: var(--surface-2); }
.ssm-navstyle-apercu--ligne i:first-child { border-bottom-color: var(--accent); }
.ssm-navstyle-apercu--contour i { background: transparent; border: 1px solid var(--line); height: 14px; }
.ssm-navstyle-apercu--contour i:first-child { border-color: var(--accent); border-width: 2px; }

/* Variante compacte utilisee dans le dropdown "Theme" par module (menu de largeur reduite). */
.ssm-navstyle-grid--module { gap: 3px; padding: 2px 4px; }
.ssm-navstyle-grid--module .ssm-navstyle-btn { padding: 6px 8px; font-size: 11.5px; border: none; background: transparent; }
.ssm-navstyle-grid--module .ssm-navstyle-btn:hover { background: var(--surface-2); }
.ssm-navstyle-grid--module .ssm-navstyle-btn--active { background: var(--surface-2); font-weight: 700; }
.ssm-seg--module { margin: 4px; }

@media (prefers-reduced-motion: reduce) {
  .ssm-sidebar, .ssm-settings, .ssm-nav-caret { transition: none; }
}
