/* =============================================================================
   SETKA — Espace client ERPNext · socle de design bi-thème + liquid glass
   -----------------------------------------------------------------------------
   Servi statiquement en /assets/setka/css/setka-portail.css depuis le volume
   `sites` (nginx : root .../sites ; location /assets { try_files $uri =404; }).
   Aucun rebuild d'image, aucun `bench build`.

   Source de vérité : docker-stacks/erpnext/portail/assets/css/setka-portail.css
   Déploiement      : portail/deploy-assets.ps1

   Transposé de PRESTKA V15 (C:\DEV-RICKY\PRESTKA\app\assets\stylesheets\) :
   tokens.css (échelle + dual thème), glass.css (4 niveaux), components.css.

   THÈME : attribut [data-theme] sur <html>. « dark » est le DÉFAUT (le jeu
   complet vit dans :root, seul le clair est un bloc d'override).

   RÈGLE ABSOLUE : aucune couleur en dur hors de la section « 2. TOKENS ».
   ============================================================================= */


/* =============================================================================
   1. POLICES AUTO-HÉBERGÉES
   -----------------------------------------------------------------------------
   La CSP de production (Caddy) impose `style-src 'self'` et `font-src 'self' data:` :
   les <link> vers fonts.googleapis.com étaient BLOQUÉS et la typo n'a jamais
   chargé sur gestion.cloudka.fr. Fichiers repris de PRESTKA (licences OFL).

   PIÈGE (constaté au rendu par PRESTKA le 2026-07-11) : les .woff2 d'Instrument
   Serif sont livrés INVERSÉS — « instrument-serif-italic-*.woff2 » contient les
   glyphes ROMAINS et « instrument-serif-*.woff2 » les ITALIQUES. Tous les titres
   du design system étant en font-style:italic, un mapping naïf les affiche DROITS.
   On ré-associe donc chaque style à la source qui porte réellement les bons
   glyphes, sans renommer les binaires.
   ============================================================================= */

@font-face {
  font-family: "Instrument Serif"; font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/instrument-serif-italic-latin.woff2") format("woff2"); /* nom trompeur : glyphes ROMAINS */
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Instrument Serif"; font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/instrument-serif-italic-latin-ext.woff2") format("woff2"); /* nom trompeur : glyphes ROMAINS */
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Instrument Serif"; font-style: italic; font-weight: 400; font-display: swap;
  src: url("../fonts/instrument-serif-latin.woff2") format("woff2"); /* nom trompeur : glyphes ITALIQUES */
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Instrument Serif"; font-style: italic; font-weight: 400; font-display: swap;
  src: url("../fonts/instrument-serif-latin-ext.woff2") format("woff2"); /* nom trompeur : glyphes ITALIQUES */
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Geist"; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url("../fonts/geist-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Geist"; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url("../fonts/geist-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Geist Mono"; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url("../fonts/geist-mono-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Geist Mono"; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url("../fonts/geist-mono-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}


/* =============================================================================
   2. TOKENS
   ============================================================================= */

:root {
  /* ── Marque (immuable, identique dans les deux thèmes) ───────────────────── */
  --sk-primary:       #004D95;   /* bleu Setka */
  --sk-primary-dark:  #003A73;
  --sk-primary-light: #1A6BB5;
  --sk-violet:        #393A8F;   /* violet Prestka */
  --sk-violet-light:  #5054B8;
  --sk-gold:          #D4AF37;   /* accent RARE : eyebrows, filets, épinglage */

  /* ── Fonds bruts ─────────────────────────────────────────────────────────── */
  --sk-obsidian:   #06011a;   /* MENU en thème sombre (valeur imposée §5.1) */
  --sk-navy:       #08042B;   /* PAGE en thème sombre (valeur imposée §5.1) */
  --sk-cloud-page: #E9F0FA;   /* PAGE en thème clair — bleu très pâle */
  --sk-cloud-nav:  #F8FBFF;   /* MENU en thème clair — plus clair que la page */
  --sk-paper:      #FAFAFA;
  --sk-paper-dim:  #E7EAF0;
  --sk-paper-soft: #A7B0C0;
  --sk-ink:        #0A1B33;

  /* ── Statuts (pastilles d'abonnement / d'annonce) ───────────────────────── */
  --sk-ok:     #0F7A57;
  --sk-warn:   #B45309;
  --sk-danger: #780000;

  /* ═════════ SÉMANTIQUE — THÈME SOMBRE (défaut) ═════════════════════════════
     Échelle d'élévation, du plus bas au plus haut : menu < page < carte.
     Le menu ne suit PAS --sk-bg : c'est ce qui le détache du contenu (pattern
     PRESTKA --bg / --nav-bg, repris tel quel).                                */
  --sk-bg:             var(--sk-navy);
  --sk-nav-bg:         var(--sk-obsidian);
  --sk-nav-bg-2:       #0A0530;                     /* bas du dégradé de menu */
  --sk-text-primary:   var(--sk-paper);
  --sk-text-secondary: var(--sk-paper-dim);
  --sk-text-tertiary:  var(--sk-paper-soft);
  --sk-text-mute:      #7C8698;
  --sk-text-on-nav:    rgba(255, 255, 255, 0.78);   /* items de menu au repos */

  /* L'INDIGO/BLEU DE MARQUE N'EST PAS UNE COULEUR DE TEXTE (leçon PRESTKA,
     tokens.css L140-163) : #004D95 mesure ~1,9:1 sur le fond sombre, très en
     dessous des 4,5:1 exigés pour du texte. D'où la séparation stricte :
       • --sk-primary  = SURFACES (dégradés, filets, halos, fonds de bouton)
       • --sk-accent   = TEXTE et états interactifs portés par le bleu          */
  --sk-accent:       color-mix(in srgb, var(--sk-primary-light) 55%, var(--sk-paper));
  --sk-accent-hover: color-mix(in srgb, var(--sk-primary-light) 38%, var(--sk-paper));
  /* Eyebrow : l'or pur est lisible sur le sombre (≈6:1), il s'assombrit en clair. */
  --sk-eyebrow: var(--sk-gold);

  --sk-line:        rgba(250, 250, 250, 0.16);
  --sk-line-strong: rgba(250, 250, 250, 0.26);

  /* Teinte des surfaces translucides — suit le fond de page (pattern PRESTKA) */
  --sk-surface-tint:  var(--sk-navy);
  --sk-surface-solid: #120C3C;   /* carte OPAQUE, reste au-dessus de --sk-bg */
  /* Panneau du contenu natif : verre SIMULÉ, sans backdrop-filter (cf. RF-1) */
  --sk-panel-bg: color-mix(in srgb, var(--sk-paper) 6%, var(--sk-bg));

  /* Pastilles de statut : sur fond sombre, les teintes pleines sont trop
     sombres → on éclaircit vers --sk-paper (même technique que PRESTKA
     pour --banner-*). Le fond reste à faible opacité. */
  --sk-ok-fg:     color-mix(in srgb, var(--sk-ok) 48%, var(--sk-paper));
  --sk-warn-fg:   color-mix(in srgb, var(--sk-warn) 52%, var(--sk-paper));
  --sk-danger-fg: color-mix(in srgb, var(--sk-danger) 45%, var(--sk-paper));

  /* ── Verre (4 niveaux ; utilitaires en section 5) ────────────────────────── */
  --sk-glass-subtle-bg:     color-mix(in srgb, var(--sk-surface-tint) 45%, transparent);
  --sk-glass-subtle-blur:   12px;
  --sk-glass-subtle-sat:    1.4;
  --sk-glass-subtle-border: rgba(250, 250, 250, 0.07);
  --sk-glass-medium-bg:     color-mix(in srgb, var(--sk-surface-tint) 62%, transparent);
  --sk-glass-medium-blur:   20px;
  --sk-glass-medium-sat:    1.8;
  --sk-glass-medium-border: rgba(250, 250, 250, 0.12);
  --sk-glass-strong-bg:     color-mix(in srgb, var(--sk-surface-tint) 82%, transparent);
  --sk-glass-strong-blur:   28px;
  --sk-glass-strong-sat:    2.0;
  --sk-glass-strong-border: rgba(250, 250, 250, 0.16);
  --sk-glass-hero-bg:       color-mix(in srgb, var(--sk-violet) 22%, transparent);
  --sk-glass-hero-blur:     30px;
  --sk-glass-hero-sat:      1.8;
  --sk-glass-hero-border:   rgba(212, 175, 55, 0.18);

  --sk-glass-highlight: rgba(255, 255, 255, 0.07);   /* liseré spéculaire haut */
  --sk-glass-sheen-top: rgba(255, 255, 255, 0.08);   /* lumière haute interne  */
  --sk-glass-inner:     inset 0 -22px 38px -28px rgba(0, 0, 0, 0.55);
  --sk-glass-edge:      inset 0 0 0 1px rgba(255, 255, 255, 0.03);

  /* Halos du fond de page (ce que le verre floute — sans eux, une carte de la
     même teinte que la page serait invisible). */
  --sk-halo-1: color-mix(in srgb, var(--sk-primary) 30%, transparent);
  --sk-halo-2: color-mix(in srgb, var(--sk-violet) 26%, transparent);

  /* ── Typographie ─────────────────────────────────────────────────────────── */
  --sk-serif: "Instrument Serif", Georgia, "Times New Roman", serif;
  --sk-sans:  "Geist", system-ui, -apple-system, "Segoe UI", sans-serif;
  --sk-mono:  "Geist Mono", ui-monospace, "Cascadia Code", monospace;

  --sk-text-xs: 0.75rem;  --sk-text-sm: 0.875rem; --sk-text-base: 1rem;
  --sk-text-md: 1.125rem; --sk-text-lg: 1.25rem;  --sk-text-xl: 1.563rem;
  --sk-text-2xl: 1.953rem; --sk-text-3xl: 2.441rem;

  --sk-tracking-caps: 0.20em;
  --sk-tracking-wide: 0.06em;

  /* ── Espacement / rayons ─────────────────────────────────────────────────── */
  --sk-space-1: 4px;  --sk-space-2: 8px;  --sk-space-3: 12px; --sk-space-4: 16px;
  --sk-space-5: 24px; --sk-space-6: 32px; --sk-space-7: 48px;

  --sk-radius-sm: 6px;  --sk-radius-md: 10px; --sk-radius-lg: 14px;
  --sk-radius-xl: 18px; --sk-radius-2xl: 24px; --sk-radius-full: 9999px;

  /* ── Ombres ──────────────────────────────────────────────────────────────── */
  --sk-shadow-sm:      0 1px 2px rgba(0, 0, 0, 0.20);
  --sk-shadow-md:      0 4px 14px -4px rgba(0, 0, 0, 0.35);
  --sk-shadow-lg:      0 18px 40px -16px rgba(0, 0, 0, 0.55);
  --sk-shadow-xl:      0 32px 64px -24px rgba(0, 0, 0, 0.65);
  --sk-shadow-ambient: 0 2px 10px -4px rgba(0, 0, 0, 0.30);
  --sk-glow-brand:     0 0 36px -6px color-mix(in srgb, var(--sk-primary) 55%, transparent);

  /* Ombre portée des titres posés à même le fond (lisibilité sur les halos).
     Neutralisée en thème clair. */
  --sk-title-shadow: 0 2px 18px rgba(4, 2, 18, 0.55);

  /* ── Filets de marque ────────────────────────────────────────────────────── */
  --sk-bar:      linear-gradient(90deg, var(--sk-primary) 0%, var(--sk-violet) 100%);
  --sk-bar-v:    linear-gradient(180deg, var(--sk-primary) 0%, var(--sk-violet) 100%);
  --sk-rule:     linear-gradient(90deg, var(--sk-primary-light), var(--sk-gold));
  --sk-cta:      linear-gradient(135deg, var(--sk-primary), var(--sk-primary-light));
  --sk-cta-over: linear-gradient(135deg, var(--sk-primary-dark), var(--sk-primary));

  /* ── Mouvement ───────────────────────────────────────────────────────────── */
  --sk-ease-silk: cubic-bezier(0.22, 1, 0.36, 1);
  --sk-dur-fast: 150ms; --sk-dur: 250ms; --sk-dur-slow: 420ms;

  /* ── Empilement ──────────────────────────────────────────────────────────── */
  --sk-z-nav: 1020; --sk-z-backdrop: 1040; --sk-z-sidenav: 1045; --sk-z-modal: 2000;
}


/* ═════════════ THÈME CLAIR ══════════════════════════════════════════════════
   Symétrie exacte du sombre, sens inverse : le menu reste PLUS CLAIR que la
   page (le sombre fait l'inverse), et tout ce qui était éclairci vers --sk-paper
   est ici assombri vers --sk-ink.                                             */
[data-theme="light"] {
  --sk-bg:             var(--sk-cloud-page);
  --sk-nav-bg:         var(--sk-cloud-nav);
  --sk-nav-bg-2:       #EEF4FD;
  --sk-text-primary:   var(--sk-ink);
  --sk-text-secondary: #2A3B52;
  --sk-text-tertiary:  #5A6B80;
  --sk-text-mute:      #78879B;
  --sk-text-on-nav:    #33455E;

  /* Sur l'ivoire, le bleu de marque est déjà lisible : on descend d'un cran
     pour lui donner de la présence, et le survol remonte vers la marque. */
  --sk-accent:       var(--sk-primary-dark);
  --sk-accent-hover: var(--sk-primary);
  /* L'or pur mesure ~1,7:1 sur du blanc : c'est la teinte qui souffre le plus
     du passage au clair. 62 % vers l'encre lui rend du contraste sans le faire
     virer au brun (dosage repris de PRESTKA --banner-warning). */
  --sk-eyebrow: color-mix(in srgb, var(--sk-gold) 62%, var(--sk-ink));

  --sk-line:        rgba(10, 27, 51, 0.10);
  --sk-line-strong: rgba(10, 27, 51, 0.20);

  --sk-surface-tint:  #FFFFFF;
  --sk-surface-solid: #FFFFFF;
  --sk-panel-bg:      #FFFFFF;

  --sk-ok-fg:     var(--sk-ok);
  --sk-warn-fg:   var(--sk-warn);
  --sk-danger-fg: var(--sk-danger);

  --sk-glass-subtle-bg:     rgba(255, 255, 255, 0.58);
  --sk-glass-medium-bg:     rgba(255, 255, 255, 0.74);
  --sk-glass-strong-bg:     rgba(255, 255, 255, 0.88);
  --sk-glass-hero-bg:       rgba(255, 255, 255, 0.40);
  --sk-glass-subtle-border: rgba(10, 27, 51, 0.08);
  --sk-glass-medium-border: rgba(10, 27, 51, 0.11);
  --sk-glass-strong-border: rgba(10, 27, 51, 0.14);
  --sk-glass-hero-border:   rgba(212, 175, 55, 0.30);

  --sk-glass-highlight: rgba(255, 255, 255, 0.90);
  --sk-glass-sheen-top: rgba(255, 255, 255, 0.75);
  --sk-glass-inner:     inset 0 -22px 40px -30px rgba(10, 27, 51, 0.14);
  --sk-glass-edge:      inset 0 0 0 1px rgba(255, 255, 255, 0.60);

  --sk-halo-1: color-mix(in srgb, var(--sk-primary) 12%, transparent);
  --sk-halo-2: color-mix(in srgb, var(--sk-violet) 10%, transparent);

  --sk-shadow-md:      0 4px 14px -4px rgba(10, 27, 51, 0.12);
  --sk-shadow-lg:      0 18px 40px -18px rgba(10, 27, 51, 0.20);
  --sk-shadow-xl:      0 32px 64px -26px rgba(10, 27, 51, 0.24);
  --sk-shadow-ambient: 0 2px 10px -4px rgba(10, 27, 51, 0.10);

  --sk-title-shadow: none;
}


/* =============================================================================
   3. BASE
   ============================================================================= */

/* Posé sur <html> : évite le flash blanc en surdéfilement et pendant que le
   <link> se résout. La classe/attribut data-theme est écrit par le stub
   anti-FOUC de head_html, AVANT ce fichier. */
html {
  background: var(--sk-bg);
  transition: background var(--sk-dur) var(--sk-ease-silk);
}

/* Le portail = tout sauf /login. Le fond porte deux halos : sans eux, une carte
   de verre teintée comme la page serait invisible.
   PAS de `background-attachment:fixed` — pitfall perf documenté avec
   backdrop-filter + artefacts de capture CDP. */
/* Les halos vivent sur un pseudo-element FIXE, pas sur le fond du body.
   Sur le body, ils etaient dimensionnes en vw/vh mais peints sur la boite du
   document : des que le contenu depassait la fenetre, on voyait la coupure du
   degrade sur le bord droit (signale par le DG). Ancres a la fenetre, ils
   couvrent toujours exactement l'ecran, quelle que soit la hauteur ou la largeur
   du contenu. `background-attachment: fixed` aurait fait la meme chose mais est
   deconseille ici (cout de composition avec les backdrop-filter des cartes). */
html body:not([data-path="login"])::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background:
    radial-gradient(62vw 52vh at 10% -10%, var(--sk-halo-1), transparent 60%),
    radial-gradient(52vw 46vh at 104% 104%, var(--sk-halo-2), transparent 58%),
    var(--sk-bg);
}
html body:not([data-path="login"]) {
  background: transparent;
  color: var(--sk-text-primary);
  font-family: var(--sk-sans);
  min-height: 100vh;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
html body:not([data-path="login"]) .page-content-wrapper { background: transparent; }

/* ── Remappage des variables NATIVES de Frappe ───────────────────────────────
   website.bundle.css declare ses propres variables (--control-bg, --text-color,
   --border-color…) et les applique via des selecteurs tres specifiques, par
   exemple `[data-doctype="Web Form"] .page-content-wrapper .container
   .form-control` — soit (0,4,0), que nos regles de portail ne battent pas sans
   surenchere d'`!important`.
   On ne se bat donc pas sur les regles : on reprend les VARIABLES. Un seul bloc,
   et tous les controles natifs (champs, listes, cartes, textes secondaires)
   suivent le theme courant, dans les deux sens.
   Scope `body:not([data-path=login])` : ni la page de connexion, ni le Desk
   (head_html est website-only) ne sont touches. */
html body:not([data-path="login"]) {
  --control-bg:          var(--sk-glass-subtle-bg);
  --control-bg-on-gray:  var(--sk-glass-medium-bg);
  --disabled-control-bg: color-mix(in srgb, var(--sk-text-mute) 18%, transparent);
  --awesomplete-hover-bg: color-mix(in srgb, var(--sk-primary) 22%, transparent);
  --text-color:          var(--sk-text-primary);
  --text-muted:          var(--sk-text-tertiary);
  --text-light:          var(--sk-text-mute);
  --heading-color:       var(--sk-text-primary);
  --border-color:        var(--sk-line);
  --dark-border-color:   var(--sk-line-strong);
  --bg-color:            transparent;
  --fg-color:            transparent;
  --card-bg:             var(--sk-glass-medium-bg);
  --subtle-accent:       color-mix(in srgb, var(--sk-primary) 16%, transparent);
  --shadow-base:         var(--sk-shadow-md);
  --input-disabled-bg:   color-mix(in srgb, var(--sk-text-mute) 14%, transparent);
}

html body:not([data-path="login"]) ::selection {
  background: var(--sk-primary); color: #fff;
}
html body:not([data-path="login"]) :focus-visible {
  outline: 2px solid var(--sk-accent); outline-offset: 3px; border-radius: 3px;
}

/* Barres de défilement discrètes, accordées au thème */
html body:not([data-path="login"]) * { scrollbar-width: thin; scrollbar-color: var(--sk-line-strong) transparent; }
html body:not([data-path="login"]) ::-webkit-scrollbar { width: 11px; height: 11px; }
html body:not([data-path="login"]) ::-webkit-scrollbar-track { background: transparent; }
html body:not([data-path="login"]) ::-webkit-scrollbar-thumb {
  background: var(--sk-line-strong); border-radius: var(--sk-radius-full);
  border: 3px solid transparent; background-clip: padding-box;
}

html body:not([data-path="login"]) a { color: var(--sk-accent); }
html body:not([data-path="login"]) a:hover { color: var(--sk-accent-hover); }


/* =============================================================================
   4. LOGIN — inchangé (hors périmètre du chantier), simplement dé-Googlisé
   -----------------------------------------------------------------------------
   La page de connexion n'a pas d'utilisateur : elle ne peut donc pas porter de
   préférence de thème. Elle reste sur son identité bleu nuit d'origine.
   ============================================================================= */

html body[data-path="login"] { background: #0A1F3F !important; min-height: 100vh; }
html body[data-path="login"] .setka-login-hero { max-width: 400px; margin: 0 auto 26px; text-align: center; }
html body[data-path="login"] .setka-hero-logo { height: 84px; width: auto; filter: drop-shadow(0 8px 20px rgba(0,0,0,.4)); }
html body[data-path="login"] .setka-hero-line { width: 56px; height: 2px; background: var(--sk-gold); margin: 16px auto 12px; }
html body[data-path="login"] .setka-hero-tag {
  font-family: var(--sk-mono); color: rgba(255,255,255,.62);
  font-size: 12px; letter-spacing: .34em; text-transform: uppercase;
}
html body[data-path="login"] .page-card {
  border: none !important; border-radius: var(--sk-radius-xl) !important;
  box-shadow: 0 34px 90px rgba(0,0,0,.5) !important;
  padding: 36px 36px 30px !important; background: #ffffff !important;
  position: relative; overflow: hidden;
}
html body[data-path="login"] .page-card::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--sk-bar);
}
html body[data-path="login"] .page-card-head { border: none !important; padding: 0 0 6px !important; text-align: center; }
html body[data-path="login"] .page-card-head .app-logo { display: none !important; }
html body[data-path="login"] .page-card-head h4 { display: none !important; }
html body[data-path="login"] .page-card-head > div { font-family: var(--sk-sans); color: var(--sk-ink); }
html body[data-path="login"] .form-control { border-radius: 9px; border: 1px solid #E0DDD6; padding: 10px 12px; }
html body[data-path="login"] .form-control:focus { border-color: var(--sk-primary); box-shadow: 0 0 0 3px rgba(0,77,149,.13); }
html body[data-path="login"] .btn-login,
html body[data-path="login"] .btn-primary {
  background: var(--sk-primary) !important; border-color: var(--sk-primary) !important;
  border-radius: 9px; font-family: var(--sk-sans); letter-spacing: .03em; font-weight: 600; padding: 9px;
}
html body[data-path="login"] .btn-login:hover { background: var(--sk-primary-dark) !important; }
html body[data-path="login"] a { color: var(--sk-primary); }
html body[data-path="login"] .login-divider { color: #8A8698; }
html body[data-path="login"] .navbar,
html body[data-path="login"] .web-footer,
html body[data-path="login"] footer { display: none !important; }
html body[data-path="login"] .page_content,
html body[data-path="login"] main.container { padding-top: 0 !important; margin-top: 0 !important; }


/* =============================================================================
   5. VERRE — 4 niveaux
   -----------------------------------------------------------------------------
   Transposition de PRESTKA glass.css. RÈGLE DE PLACEMENT (RF-1) : le
   backdrop-filter ne va JAMAIS sur un grand conteneur — sur fond sombre avec
   navbar sticky, Chrome déclenche un bug de recomposition au défilement (flash
   d'un grand bloc de fond). Il est réservé aux CARTES FILLES, petites et
   nombreuses. Le grand panneau utilise du verre SIMULÉ (§7).
   ============================================================================= */

.sk-glass-subtle, .sk-glass-medium, .sk-glass-strong, .sk-glass-hero {
  position: relative;
  border-radius: var(--sk-radius-xl);
  isolation: isolate;
}

.sk-glass-subtle {
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 32%), var(--sk-glass-subtle-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-subtle-blur)) saturate(var(--sk-glass-subtle-sat));
  backdrop-filter: blur(var(--sk-glass-subtle-blur)) saturate(var(--sk-glass-subtle-sat));
  border: 1px solid var(--sk-glass-subtle-border);
  box-shadow: var(--sk-shadow-md), var(--sk-shadow-ambient),
              inset 0 1px 0 var(--sk-glass-highlight), var(--sk-glass-edge), var(--sk-glass-inner);
}
.sk-glass-medium {
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 30%), var(--sk-glass-medium-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  border: 1px solid var(--sk-glass-medium-border);
  box-shadow: var(--sk-shadow-lg), var(--sk-shadow-ambient),
              inset 0 1px 0 var(--sk-glass-highlight), var(--sk-glass-edge), var(--sk-glass-inner);
}
.sk-glass-strong {
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 28%), var(--sk-glass-strong-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-strong-blur)) saturate(var(--sk-glass-strong-sat));
  backdrop-filter: blur(var(--sk-glass-strong-blur)) saturate(var(--sk-glass-strong-sat));
  border: 1px solid var(--sk-glass-strong-border);
  box-shadow: var(--sk-shadow-xl), var(--sk-shadow-ambient),
              inset 0 1px 0 var(--sk-glass-highlight), var(--sk-glass-edge), var(--sk-glass-inner);
}
.sk-glass-hero {
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 34%), var(--sk-glass-hero-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-hero-blur)) saturate(var(--sk-glass-hero-sat));
  backdrop-filter: blur(var(--sk-glass-hero-blur)) saturate(var(--sk-glass-hero-sat));
  border: 1px solid var(--sk-glass-hero-border);
  box-shadow: var(--sk-shadow-xl), var(--sk-glow-brand), var(--sk-shadow-ambient),
              inset 0 1px 0 var(--sk-glass-highlight), var(--sk-glass-edge), var(--sk-glass-inner);
}

/* Liseré spéculaire haut — la lumière qui glisse sur l'arête du verre */
.sk-glass-subtle::after, .sk-glass-medium::after,
.sk-glass-strong::after, .sk-glass-hero::after {
  content: ""; position: absolute; inset: 0;
  border-radius: inherit;
  background: linear-gradient(180deg, var(--sk-glass-highlight), transparent 35%);
  -webkit-mask: linear-gradient(#000, transparent 40%);
  mask: linear-gradient(#000, transparent 40%);
  pointer-events: none;
  z-index: -1;
}

/* Repli sans backdrop-filter (Firefox anciens, GPU désactivé) : surface dense,
   la lisibilité prime sur l'effet. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .sk-glass-subtle { background: color-mix(in srgb, var(--sk-surface-solid) 88%, transparent); }
  .sk-glass-medium { background: color-mix(in srgb, var(--sk-surface-solid) 94%, transparent); }
  .sk-glass-strong,
  .sk-glass-hero   { background: var(--sk-surface-solid); }
}


/* =============================================================================
   6. CHROME — navbar, fil d'Ariane, menu latéral, pied, modale de thème
   ============================================================================= */

/* ── Navbar ───────────────────────────────────────────────────────────────────
   AUCUN backdrop-filter ici : c'est la combinaison « blur + position:sticky »
   qui provoquait le bug de recomposition (RF-1). Surface pleine. */
html body:not([data-path="login"]) .navbar {
  background: var(--sk-nav-bg) !important;
  border-bottom: 1px solid var(--sk-line);
  box-shadow: var(--sk-shadow-md);
  position: sticky; top: 0; z-index: var(--sk-z-nav);
}
html body:not([data-path="login"]) .navbar-brand img { content: url("/files/setka_logo_clair.png"); height: 34px; width: auto; }
/* Certaines pages (Web Form) rendent la marque en TEXTE et non en logo.
   Ciblé sur .navbar-brand seul — `.navbar a` casserait les items du menu. */
html body:not([data-path="login"]) .navbar-brand,
html body:not([data-path="login"]) .navbar-brand span { color: var(--sk-text-primary) !important; }
html body:not([data-path="login"]) .navbar .nav-link,
html body:not([data-path="login"]) .navbar .dropdown-toggle,
html body:not([data-path="login"]) .navbar .navbar-nav .nav-item > a {
  font-family: var(--sk-sans); color: var(--sk-text-on-nav) !important; font-weight: 500;
}
html body:not([data-path="login"]) .navbar .nav-link:hover { color: var(--sk-text-primary) !important; }
html body:not([data-path="login"]) .navbar-toggler { border-color: var(--sk-line-strong); }
html body:not([data-path="login"]) .navbar-toggler .icon { stroke: var(--sk-text-primary); }

/* Menu déroulant de l'avatar (accueille l'entrée « Thème », cf. §6.5) */
html body:not([data-path="login"]) .navbar .dropdown-menu {
  background: var(--sk-surface-solid);
  border: 1px solid var(--sk-line);
  border-radius: var(--sk-radius-lg);
  box-shadow: var(--sk-shadow-lg);
  padding: 6px;
}
html body:not([data-path="login"]) .navbar .dropdown-menu .dropdown-item {
  color: var(--sk-text-secondary); border-radius: var(--sk-radius-sm);
  font-family: var(--sk-sans); font-size: var(--sk-text-sm); padding: 8px 12px;
  display: flex; align-items: center; gap: 9px;
}
html body:not([data-path="login"]) .navbar .dropdown-menu .dropdown-item:hover {
  background: color-mix(in srgb, var(--sk-primary) 18%, transparent);
  color: var(--sk-text-primary);
}
html body:not([data-path="login"]) .navbar .dropdown-menu .dropdown-item svg { width: 15px; height: 15px; flex: 0 0 auto; opacity: .8; }

/* ── Fil d'Ariane ─────────────────────────────────────────────────────────── */
html body:not([data-path="login"]) .page-breadcrumbs { margin: 18px 2px 0; }
html body:not([data-path="login"]) .page-breadcrumbs,
html body:not([data-path="login"]) .page-breadcrumbs a,
html body:not([data-path="login"]) .page-breadcrumbs li,
html body:not([data-path="login"]) .page-breadcrumbs .breadcrumb-item {
  color: var(--sk-text-tertiary) !important;
  font-family: var(--sk-mono); font-size: 11px; letter-spacing: .05em;
}
html body:not([data-path="login"]) .page-breadcrumbs a:hover { color: var(--sk-text-primary) !important; }

/* ── Menu latéral ─────────────────────────────────────────────────────────── */
.setka-sidenav {
  position: fixed; top: 0; left: 0; bottom: 0; width: 244px; z-index: var(--sk-z-sidenav);
  display: flex; flex-direction: column;
  background: linear-gradient(180deg, var(--sk-nav-bg) 0%, var(--sk-nav-bg-2) 100%);
  border-right: 1px solid var(--sk-line);
  overflow-y: auto; overflow-x: hidden;
  font-family: var(--sk-sans);
  /* `width` est VOLONTAIREMENT absent de la transition : animer une largeur
     force un recalcul de mise en page a chaque image. Le repli est donc
     instantane, ce qui est de toute facon le comportement attendu d'un rail.
     `transform` (tiroir mobile) et `background` (bascule de theme) restent
     animes : ce sont des proprietes composees, sans cout de mise en page.

     NOTE DE RECETTE (2026-08-06) — ne pas se laisser piéger : dans un
     navigateur pilote par CDP, la boucle d'images est GELEE (requestAnimationFrame
     ne se declenche jamais, verifie). Toute propriete en transition y reste donc
     bloquee sur sa valeur de depart, au rendu comme a la mesure : le rail
     semblait rester a 244 px et le tiroir mobile a -252 px. Neutraliser la
     transition ramenait immediatement 66 px et 0. Ce ne sont PAS des defauts du
     CSS. Pour verifier une animation, il faut un navigateur reel et focalise. */
  transition: transform var(--sk-dur) var(--sk-ease-silk),
              background var(--sk-dur) var(--sk-ease-silk);
}
.setka-sidenav .brand { padding: 22px 22px 16px; display: flex; justify-content: center; align-items: center; }
.setka-sidenav .brand img {
  height: 46px; width: auto; max-width: 100%; object-fit: contain;
  filter: drop-shadow(0 6px 16px rgba(0, 0, 0, .35));
  transition: height var(--sk-dur-fast) var(--sk-ease-silk), width var(--sk-dur-fast) var(--sk-ease-silk);
}
/* Le logo monté est la version CLAIRE (pensée pour un fond sombre). En thème
   clair on ne l'inverse PAS — un logo inversé n'est plus la marque : on sert le
   logo officiel en couleurs, qui existe déjà dans les fichiers du site.
   `content: url()` sur une <img> est la même technique que pour .navbar-brand. */
[data-theme="light"] .setka-sidenav .brand img {
  content: url("/files/setka_logo.png");
  filter: none;
}

.setka-sidenav .menu { display: flex; flex-direction: column; padding: 4px 0; }
.setka-sidenav .grp {
  font-family: var(--sk-mono); font-size: 9px; letter-spacing: .2em; text-transform: uppercase;
  color: var(--sk-eyebrow); padding: 16px 24px 6px; white-space: nowrap;
}
.setka-sidenav a.nav {
  display: flex; align-items: center; gap: 12px; margin: 2px 12px; padding: 10px 14px;
  border-radius: var(--sk-radius-lg);
  color: var(--sk-text-on-nav); text-decoration: none; font-weight: 500; font-size: 14px;
  white-space: nowrap; overflow: hidden;
  transition: background var(--sk-dur-fast), color var(--sk-dur-fast);
}
.setka-sidenav a.nav .i {
  width: 22px; height: 22px; display: inline-flex; align-items: center; justify-content: center;
  flex: 0 0 auto; opacity: .9;
}
.setka-sidenav a.nav .i svg { width: 19px; height: 19px; }
.setka-sidenav a.nav:hover {
  background: color-mix(in srgb, var(--sk-primary) 22%, transparent);
  color: var(--sk-text-primary);
}
.setka-sidenav a.nav.active {
  background: linear-gradient(135deg, var(--sk-primary), var(--sk-violet));
  color: #fff; box-shadow: 0 8px 20px -6px color-mix(in srgb, var(--sk-primary) 75%, transparent);
}
.setka-sidenav a.nav.active .i { opacity: 1; }
.setka-sidenav .spacer { flex: 1 1 auto; }
.setka-sidenav .foot {
  padding: 14px 24px; font-family: var(--sk-mono); font-size: 9px; letter-spacing: .14em;
  text-transform: uppercase; color: var(--sk-text-mute);
  border-top: 1px solid var(--sk-line); white-space: nowrap;
}

/* Bouton de repli — LOT 1 : en BAS du menu, centré, chevron < / > (maquette). */
.sk-nav-toggle {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  margin: 10px 12px; padding: 9px 12px;
  background: color-mix(in srgb, var(--sk-primary) 16%, transparent);
  border: 1px dashed var(--sk-line-strong);
  border-radius: var(--sk-radius-full);
  color: var(--sk-text-on-nav); cursor: pointer;
  font-family: var(--sk-mono); font-size: 10px; letter-spacing: var(--sk-tracking-caps); text-transform: uppercase;
  transition: background var(--sk-dur-fast), color var(--sk-dur-fast), border-color var(--sk-dur-fast);
}
.sk-nav-toggle:hover {
  background: color-mix(in srgb, var(--sk-primary) 30%, transparent);
  border-color: var(--sk-accent); color: var(--sk-text-primary);
}
.sk-nav-toggle svg { width: 14px; height: 14px; stroke: currentColor; fill: none; flex: 0 0 auto; }
.sk-nav-toggle .lbl { white-space: nowrap; }
/* Chevron : `<` quand le menu est déployé (action = replier), `>` une fois replié. */
.sk-nav-toggle .ico-close { display: inline-flex; }
.sk-nav-toggle .ico-open  { display: none; }
html.sk-collapsed .sk-nav-toggle .ico-close { display: none; }
html.sk-collapsed .sk-nav-toggle .ico-open  { display: inline-flex; }

.sk-backdrop { position: fixed; inset: 0; background: rgba(4, 2, 18, .6); z-index: var(--sk-z-backdrop); display: none; }

@media (min-width: 801px) {
  html.setka-has-sidenav body:not([data-path="login"]) { padding-left: 244px; }
  html.setka-has-sidenav.sk-collapsed body:not([data-path="login"]) { padding-left: 66px; }
  html.setka-has-sidenav body:not([data-path="login"]) .web-sidebar { display: none !important; }
  html.setka-has-sidenav body:not([data-path="login"]) .navbar .navbar-brand { display: none !important; }
  /* `width: auto` est indispensable : Bootstrap donne `width:100%` a
     `.container`, et un element en 100 % de son bloc conteneur AUXQUELLES on
     ajoute des marges laterales deborde d'autant. Mesure : 6 px de
     defilement horizontal parasite sur toutes les pages natives. */
  html.setka-has-sidenav body:not([data-path="login"]) main.container,
  html.setka-has-sidenav body:not([data-path="login"]) .sk-wrap {
    width: auto;
    margin-left: 30px !important; margin-right: 30px !important;
    max-width: 1180px;
  }
  html.setka-has-sidenav body:not([data-path="login"]) .page-breadcrumbs { margin-left: 30px; }

  /* État RÉDUIT = rail d'icônes de 66 px */
  html.sk-collapsed .setka-sidenav { width: 66px; }
  html.sk-collapsed .setka-sidenav .t,
  html.sk-collapsed .setka-sidenav .grp,
  html.sk-collapsed .setka-sidenav .foot,
  html.sk-collapsed .sk-nav-toggle .lbl { display: none; }
  html.sk-collapsed .setka-sidenav .brand { padding: 16px 6px 12px; }
  html.sk-collapsed .setka-sidenav .brand img { height: auto; width: 38px; }
  html.sk-collapsed .setka-sidenav a.nav { justify-content: center; margin: 2px 10px; padding: 10px 0; }
  html.sk-collapsed .sk-nav-toggle { margin: 10px 10px; padding: 9px 0; }
  .sk-backdrop { display: none !important; }
}

/* ── Pied de page ─────────────────────────────────────────────────────────── */
html body:not([data-path="login"]) .web-footer {
  background: transparent; border-top: 1px solid var(--sk-line);
  color: var(--sk-text-tertiary); margin-top: 26px; font-family: var(--sk-sans);
}
html body:not([data-path="login"]) .web-footer a { color: var(--sk-text-secondary); }
html body:not([data-path="login"]) .web-footer a:hover { color: var(--sk-text-primary); }
html body:not([data-path="login"]) .web-footer .footer-powered { display: none !important; }

/* ── Modale de sélection du thème ─────────────────────────────────────────────
   Recréée intégralement : `frappe.ui.ThemeSwitcher` est une classe du DESK et
   n'existe pas côté portail (RF-2). On n'en reprend que l'ergonomie. */
.sk-theme-bg {
  position: fixed; inset: 0; background: rgba(4, 2, 18, .72);
  z-index: var(--sk-z-modal); display: none; align-items: center; justify-content: center; padding: 20px;
}
.sk-theme-bg.open { display: flex; }
.sk-theme-modal { max-width: 460px; width: 100%; padding: 26px; animation: sk-pop .18s var(--sk-ease-silk); }
.sk-theme-modal .hd { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 4px; }
.sk-theme-modal h3 {
  font-family: var(--sk-serif); font-style: italic; font-weight: 400; font-size: var(--sk-text-xl);
  color: var(--sk-text-primary); margin: 0;
}
.sk-theme-modal .x {
  background: none; border: none; font-size: 1.5rem; line-height: 1;
  color: var(--sk-text-tertiary); cursor: pointer; padding: 0 2px;
}
.sk-theme-modal .x:hover { color: var(--sk-text-primary); }
.sk-theme-modal .lead {
  font-family: var(--sk-mono); font-size: var(--sk-text-xs); letter-spacing: var(--sk-tracking-caps);
  text-transform: uppercase; color: var(--sk-eyebrow); margin: 0 0 6px;
}
.sk-theme-modal .sub { font-family: var(--sk-sans); font-size: 13.5px; color: var(--sk-text-tertiary); margin: 0 0 18px; }
.sk-theme-opts { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
@media (max-width: 520px) { .sk-theme-opts { grid-template-columns: 1fr; } }
.sk-theme-opt {
  display: flex; flex-direction: column; gap: 10px; padding: 12px;
  background: transparent; border: 1px solid var(--sk-line);
  border-radius: var(--sk-radius-lg); cursor: pointer; text-align: left;
  font-family: var(--sk-sans); color: var(--sk-text-secondary);
  transition: border-color var(--sk-dur-fast), background var(--sk-dur-fast), transform var(--sk-dur-fast);
}
.sk-theme-opt:hover { transform: translateY(-2px); border-color: var(--sk-accent); }
.sk-theme-opt[aria-checked="true"] {
  border-color: var(--sk-accent);
  background: color-mix(in srgb, var(--sk-primary) 16%, transparent);
  color: var(--sk-text-primary);
}
/* Vignette d'aperçu : miniature fidèle « menu + page + carte » de chaque thème.
   Valeurs littérales assumées — une vignette doit montrer le thème qu'elle
   représente, pas celui qui est actif. */
.sk-theme-opt .prev {
  height: 62px; border-radius: var(--sk-radius-md); overflow: hidden;
  display: flex; border: 1px solid var(--sk-line);
}
.sk-theme-opt .prev i { display: block; height: 100%; }
.sk-theme-opt .prev .m { width: 26%; }
.sk-theme-opt .prev .p { width: 74%; position: relative; }
.sk-theme-opt .prev .p::after {
  content: ""; position: absolute; left: 10%; right: 18%; top: 26%; height: 42%;
  border-radius: 4px; border: 1px solid rgba(127, 127, 127, .35);
}
.sk-theme-opt[data-theme-value="dark"]  .prev .m { background: #06011a; }
.sk-theme-opt[data-theme-value="dark"]  .prev .p { background: #08042B; }
.sk-theme-opt[data-theme-value="dark"]  .prev .p::after { background: rgba(255, 255, 255, .10); }
.sk-theme-opt[data-theme-value="light"] .prev .m { background: #F8FBFF; }
.sk-theme-opt[data-theme-value="light"] .prev .p { background: #E9F0FA; }
.sk-theme-opt[data-theme-value="light"] .prev .p::after { background: rgba(255, 255, 255, .92); }
.sk-theme-opt .nm { display: flex; align-items: center; gap: 7px; font-weight: 600; font-size: 13.5px; }
.sk-theme-opt .nm svg { width: 15px; height: 15px; stroke: currentColor; fill: none; flex: 0 0 auto; }
.sk-theme-opt .ds {
  font-family: var(--sk-mono); font-size: 10px; letter-spacing: var(--sk-tracking-wide);
  text-transform: uppercase; color: var(--sk-text-mute);
}


/* =============================================================================
   7. CONTENU NATIF FRAPPE (listes, pages détail, web forms, /me)
   ============================================================================= */

/* Le grand panneau de contenu. Verre SIMULÉ : dégradé semi-opaque + hairline,
   SANS backdrop-filter (RF-1, parade 3). Il ne subsiste que sur les pages
   DÉTAIL rendues par Frappe, où le texte a besoin d'une surface porteuse. */
html body:not([data-path="login"]) main.container {
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 24%), var(--sk-panel-bg);
  border: 1px solid var(--sk-line);
  border-radius: var(--sk-radius-2xl);
  box-shadow: var(--sk-shadow-lg), inset 0 1px 0 var(--sk-glass-highlight);
  padding: 36px 40px 30px;
  position: relative; overflow: hidden;
  margin-top: 22px; margin-bottom: 36px;
  color: var(--sk-text-primary);
}
html body:not([data-path="login"]) main.container::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--sk-bar);
}

/* Pages où le panneau ne doit PAS exister : listes natives, états vides, web
   forms, et NOS pages (marquées par .sk-wrap / .dc-wrap / .ap-wrap / …).
   RF-4 : ces exceptions utilisent :has() (Chrome 105+). Toute nouvelle règle de
   fond sur main.container doit composer avec elles, sinon le panneau réapparaît. */
html body:not([data-path="login"]) main.container:has(.website-list),
html body:not([data-path="login"]) main.container:has(.empty-apps-state),
html body:not([data-path="login"]) main.container:has(.web-form-wrapper),
html body:not([data-path="login"]) main.container:has(.sk-page),
html body:not([data-path="login"]) main.container:has(.sk-wrap),
html body:not([data-path="login"]) main.container:has(.dc-wrap),
html body:not([data-path="login"]) main.container:has(.ap-wrap),
html body:not([data-path="login"]) main.container:has(.nw-wrap),
html body:not([data-path="login"]) main.container:has(.pf-wrap),
html body:not([data-path="login"]) main.container:has(.setka-cat-wrap) {
  background: none !important;
  border: none !important;
  box-shadow: none !important;
  padding: 6px 0 0 !important;
  overflow: visible;
}
html body:not([data-path="login"]) main.container:has(.website-list)::before,
html body:not([data-path="login"]) main.container:has(.empty-apps-state)::before,
html body:not([data-path="login"]) main.container:has(.web-form-wrapper)::before,
html body:not([data-path="login"]) main.container:has(.sk-page)::before,
html body:not([data-path="login"]) main.container:has(.sk-wrap)::before,
html body:not([data-path="login"]) main.container:has(.dc-wrap)::before,
html body:not([data-path="login"]) main.container:has(.ap-wrap)::before,
html body:not([data-path="login"]) main.container:has(.nw-wrap)::before,
html body:not([data-path="login"]) main.container:has(.pf-wrap)::before,
html body:not([data-path="login"]) main.container:has(.setka-cat-wrap)::before { display: none !important; }
html body:not([data-path="login"]) main.container:has(.website-list) .page-header,
html body:not([data-path="login"]) main.container:has(.website-list) .my-account-header,
html body:not([data-path="login"]) main.container:has(.empty-apps-state) .page-header,
html body:not([data-path="login"]) main.container:has(.web-form-wrapper) .page-header,
html body:not([data-path="login"]) main.container:has(.sk-page) .page-header,
html body:not([data-path="login"]) main.container:has(.sk-wrap) .page-header,
html body:not([data-path="login"]) main.container:has(.dc-wrap) .page-header,
html body:not([data-path="login"]) main.container:has(.ap-wrap) .page-header,
html body:not([data-path="login"]) main.container:has(.nw-wrap) .page-header,
html body:not([data-path="login"]) main.container:has(.pf-wrap) .page-header,
html body:not([data-path="login"]) main.container:has(.setka-cat-wrap) .page-header { display: none !important; }

/* La colonne latérale native (col-sm-2), vidée par notre menu, laissait un trou */
html.setka-has-sidenav body:not([data-path="login"]) .main-column { flex: 0 0 100% !important; max-width: 100% !important; }
html.setka-has-sidenav body:not([data-path="login"]) .row > div:has(> .web-sidebar) { display: none !important; }

/* ── Typographie éditoriale ───────────────────────────────────────────────── */
/* h4/h5/h6 inclus : le titre « Tâches » de la page de detail d'un projet est un
   <h4> auquel Frappe pose `color:#171717` — il etait bleu nuit sur bleu nuit,
   donc invisible (signale par le DG). */
html body:not([data-path="login"]) h1,
html body:not([data-path="login"]) h2,
html body:not([data-path="login"]) h3,
html body:not([data-path="login"]) h4,
html body:not([data-path="login"]) h5,
html body:not([data-path="login"]) h6,
html body:not([data-path="login"]) .my-account-header h4,
html body:not([data-path="login"]) .page-header,
html body:not([data-path="login"]) .my-account-header {
  font-family: var(--sk-serif) !important; font-style: italic;
  color: var(--sk-text-primary); font-weight: 400; letter-spacing: .005em;
}
/* Instrument Serif italique rend petit → titres du portail agrandis */
html body:not([data-path="login"]) .page-header { font-size: var(--sk-text-3xl); line-height: 1.15; margin-bottom: 4px; }
html body:not([data-path="login"]) .my-account-header { font-size: var(--sk-text-3xl); line-height: 1.15; margin-bottom: 20px; }
html body:not([data-path="login"]) .website-list h1,
html body:not([data-path="login"]) main.container > h1,
html body:not([data-path="login"]) .page_content > h1 { font-size: var(--sk-text-3xl); line-height: 1.15; }
html body:not([data-path="login"]) h4.text-muted,
html body:not([data-path="login"]) .sub-title {
  font-family: var(--sk-mono); font-size: 11px; letter-spacing: .16em;
  text-transform: uppercase; color: var(--sk-eyebrow) !important;
}
html body:not([data-path="login"]) .text-muted { color: var(--sk-text-tertiary) !important; }
html body:not([data-path="login"]) main.container p,
html body:not([data-path="login"]) main.container li,
html body:not([data-path="login"]) main.container td,
html body:not([data-path="login"]) main.container th,
html body:not([data-path="login"]) main.container label,
html body:not([data-path="login"]) main.container dd,
html body:not([data-path="login"]) main.container dt { color: var(--sk-text-secondary); }
html body:not([data-path="login"]) main.container table { border-color: var(--sk-line); }
html body:not([data-path="login"]) main.container td,
html body:not([data-path="login"]) main.container th { border-color: var(--sk-line) !important; }

/* ── En-tête de page injecté (lead mono doré + titre serif + filet + résumé) ── */
.sk-phead { margin: 4px 0 20px; }
.sk-phead .lead {
  font-family: var(--sk-mono); font-size: 11px; letter-spacing: .18em;
  text-transform: uppercase; color: var(--sk-eyebrow); margin: 0 0 6px;
}
.sk-phead .ttl {
  font-family: var(--sk-serif); font-style: italic; font-weight: 400;
  font-size: var(--sk-text-3xl); line-height: 1.12;
  color: var(--sk-text-primary); margin: 0; text-shadow: var(--sk-title-shadow);
}
.sk-phead .ttl::after {
  content: ""; display: block; width: 44px; height: 2px; margin-top: 10px;
  background: var(--sk-rule); border-radius: 2px;
}
.sk-phead .sub {
  font-family: var(--sk-sans); color: var(--sk-text-tertiary);
  font-size: 15px; line-height: 1.55; max-width: 660px; margin: 12px 0 0;
}

/* ── Rangées natives → cartes de verre ────────────────────────────────────── */
html body:not([data-path="login"]) .website-list .result { margin-top: 2px; display: flex; flex-direction: column; gap: 14px; }
/* Le conteneur de liste natif porte un fond blanc dans website.bundle.css :
   il doit redevenir transparent, sinon les cartes de verre flottent sur un
   grand aplat blanc (constate sur /invoices). */
html body:not([data-path="login"]) .website-list,
html body:not([data-path="login"]) .website-list .result,
html body:not([data-path="login"]) .transaction-list-item { background: transparent; }

html body:not([data-path="login"]) .web-list-item {
  position: relative; overflow: hidden;
  border-radius: var(--sk-radius-xl); padding: 18px 22px; margin: 0;
  /* Le verre : meme recette que les cartes de page (§8). */
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 30%), var(--sk-glass-medium-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  border: 1px solid var(--sk-glass-medium-border);
  box-shadow: var(--sk-shadow-lg), var(--sk-shadow-ambient),
              inset 0 1px 0 var(--sk-glass-highlight), var(--sk-glass-edge), var(--sk-glass-inner);
  color: var(--sk-text-secondary);
  transition: transform var(--sk-dur-fast) var(--sk-ease-silk), box-shadow var(--sk-dur-fast) var(--sk-ease-silk);
  animation: sk-rise var(--sk-dur-slow) var(--sk-ease-silk) both;
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  html body:not([data-path="login"]) .web-list-item {
    background: color-mix(in srgb, var(--sk-surface-solid) 94%, transparent);
  }
}
html body:not([data-path="login"]) .web-list-item::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--sk-bar); z-index: 1;
}
html body:not([data-path="login"]) .web-list-item:hover {
  transform: translateY(-2px);
  box-shadow: var(--sk-shadow-xl), var(--sk-glow-brand), inset 0 1px 0 var(--sk-glass-highlight);
}
html body:not([data-path="login"]) .web-list-item:nth-child(2) { animation-delay: .05s; }
html body:not([data-path="login"]) .web-list-item:nth-child(3) { animation-delay: .09s; }
html body:not([data-path="login"]) .web-list-item:nth-child(4) { animation-delay: .13s; }
html body:not([data-path="login"]) .web-list-item:nth-child(5) { animation-delay: .17s; }
html body:not([data-path="login"]) .web-list-item:nth-child(6) { animation-delay: .21s; }
html body:not([data-path="login"]) .web-list-item:nth-child(n+7) { animation-delay: .25s; }
@keyframes sk-rise { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
@keyframes sk-pop  { from { transform: translateY(8px) scale(.98); opacity: .6; } to { transform: none; opacity: 1; } }

html body:not([data-path="login"]) .transaction-list-item .list-item-name {
  font-family: var(--sk-sans); font-weight: 600; color: var(--sk-text-primary); font-size: 15px;
}
html body:not([data-path="login"]) .transaction-list-item .transaction-time,
html body:not([data-path="login"]) .transaction-list-item .items-preview {
  font-family: var(--sk-mono); font-size: 11px; color: var(--sk-text-mute); letter-spacing: .02em;
}
html body:not([data-path="login"]) .transaction-list-item .item-total {
  font-family: var(--sk-mono); font-weight: 600; color: var(--sk-accent);
  font-variant-numeric: tabular-nums; font-size: 15px;
}
html body:not([data-path="login"]) .indicator-pill {
  font-family: var(--sk-mono); font-size: 10px; letter-spacing: .05em; text-transform: uppercase;
  font-weight: 500; padding: 4px 11px; border-radius: var(--sk-radius-full);
}
html body:not([data-path="login"]) .btn-more {
  background: var(--sk-glass-subtle-bg) !important;
  border: 1px solid var(--sk-line-strong) !important;
  color: var(--sk-accent) !important; border-radius: var(--sk-radius-md);
  font-family: var(--sk-mono); font-size: 11px; letter-spacing: .09em; text-transform: uppercase; font-weight: 500;
}

/* ── Web Form (ouvrir un ticket / nouvelle demande) ───────────────────────── */
html body:not([data-path="login"]) .web-form-wrapper {
  position: relative; overflow: hidden;
  border-radius: var(--sk-radius-xl); padding: 30px 32px 26px; margin-top: 2px;
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 28%), var(--sk-glass-medium-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  border: 1px solid var(--sk-glass-medium-border);
  box-shadow: var(--sk-shadow-lg), var(--sk-shadow-ambient),
              inset 0 1px 0 var(--sk-glass-highlight), var(--sk-glass-edge), var(--sk-glass-inner);
  color: var(--sk-text-secondary);
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  html body:not([data-path="login"]) .web-form-wrapper {
    background: color-mix(in srgb, var(--sk-surface-solid) 94%, transparent);
  }
}
html body:not([data-path="login"]) .web-form-wrapper::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--sk-bar); z-index: 1;
}
html body:not([data-path="login"]) .web-form-wrapper,
html body:not([data-path="login"]) .web-form-wrapper * { font-family: var(--sk-sans); }

/* ── LOTs 7 & 9 — le formulaire de demande de commande ───────────────────────
   Mesure du 2026-08-06 : le blanc ne venait PAS de `.web-form-wrapper` mais de
   trois autres blocs — `.web-form-header`, `form.web-form` et `.success-page`
   (l'ecran de validation, masque tant que le formulaire n'est pas envoye).
   C'est ce dernier qui repond au LOT 7.5 « page de validation : fond bleu ». */
html body:not([data-path="login"]) .web-form-header,
html body:not([data-path="login"]) form.web-form,
html body:not([data-path="login"]) .success-page {
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 28%), var(--sk-glass-medium-bg) !important;
  -webkit-backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  border: 1px solid var(--sk-glass-medium-border) !important;
  border-radius: var(--sk-radius-xl) !important;
  box-shadow: var(--sk-shadow-lg), inset 0 1px 0 var(--sk-glass-highlight) !important;
  color: var(--sk-text-secondary) !important;
}
html body:not([data-path="login"]) .web-form-header { margin-bottom: var(--sk-space-4); padding: 22px 26px !important; }
html body:not([data-path="login"]) form.web-form { padding: 24px 26px !important; }
html body:not([data-path="login"]) .success-page { padding: 40px 26px !important; text-align: center; }
html body:not([data-path="login"]) .success-title,
html body:not([data-path="login"]) .success-message {
  color: var(--sk-text-primary) !important; font-family: var(--sk-serif); font-style: italic;
}
html body:not([data-path="login"]) .success-message { font-family: var(--sk-sans); font-style: normal; color: var(--sk-text-secondary) !important; }
html body:not([data-path="login"]) .success-icon { color: var(--sk-ok-fg); fill: currentColor; width: 44px; height: 44px; }

/* Titre du formulaire : serif italique, aligne a GAUCHE (demande DG). Le
   libelle lui-meme est corrige en JS — Frappe compose `_("New {0}")`, et la
   traduction francaise donne « Nouveau Demande de commande ». */
html body:not([data-path="login"]) .web-form-title h1,
html body:not([data-path="login"]) .web-form-head .title h1 {
  font-family: var(--sk-serif) !important; font-style: italic; font-weight: 400;
  font-size: var(--sk-text-xl); line-height: 1.2;
  color: var(--sk-text-primary) !important; text-align: left !important; margin: 0;
}
html body:not([data-path="login"]) .web-form-head .title { justify-content: flex-start; gap: var(--sk-space-3); }
html body:not([data-path="login"]) .web-form-introduction { color: var(--sk-text-tertiary) !important; margin-top: var(--sk-space-2); }
html body:not([data-path="login"]) .web-form-header .indicator-pill.orange {
  background: color-mix(in srgb, var(--sk-warn) 20%, transparent);
  color: var(--sk-warn-fg); border: 1px solid color-mix(in srgb, var(--sk-warn) 34%, transparent);
}
html body:not([data-path="login"]) .web-form .form-section,
html body:not([data-path="login"]) .web-form .section-body,
html body:not([data-path="login"]) .web-form .form-column { background: transparent !important; }
html body:not([data-path="login"]) .web-form .page-footer,
html body:not([data-path="login"]) .web-form-container .page-footer { background: transparent !important; }

/* LOT 7.4 — encart de la photo de l'offre, injecte par setka-portail.js */
.sk-offre-visuel {
  display: flex; gap: var(--sk-space-4); align-items: center;
  margin: 0 0 var(--sk-space-4); padding: var(--sk-space-3) var(--sk-space-4);
  border-radius: var(--sk-radius-lg);
  background: var(--sk-glass-subtle-bg); border: 1px solid var(--sk-line);
}
.sk-offre-visuel img {
  width: 88px; height: 88px; object-fit: cover; flex: 0 0 auto;
  border-radius: var(--sk-radius-md); border: 1px solid var(--sk-line-strong); background: var(--sk-surface-solid);
}
.sk-offre-visuel .sk-offre-vide {
  width: 88px; height: 88px; flex: 0 0 auto; display: grid; place-items: center;
  border-radius: var(--sk-radius-md); border: 1px dashed var(--sk-line-strong);
  color: var(--sk-text-mute); font-family: var(--sk-mono); font-size: 9px;
  text-align: center; text-transform: uppercase; letter-spacing: .08em; padding: 6px;
}
.sk-offre-visuel .t { font-family: var(--sk-serif); font-style: italic; font-size: 1.15rem; color: var(--sk-text-primary); margin: 0 0 3px; }
.sk-offre-visuel .c { font-family: var(--sk-mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--sk-eyebrow); }
.sk-offre-visuel .p { font-family: var(--sk-mono); font-size: 13px; color: var(--sk-accent); margin-top: 4px; }
html body:not([data-path="login"]) .web-form-wrapper .form-control,
html body:not([data-path="login"]) main.container .form-control,
html body:not([data-path="login"]) main.container .form-select,
html body:not([data-path="login"]) main.container select,
html body:not([data-path="login"]) main.container textarea,
html body:not([data-path="login"]) main.container input[type="text"],
html body:not([data-path="login"]) main.container input[type="email"],
html body:not([data-path="login"]) main.container input[type="password"],
html body:not([data-path="login"]) main.container input[type="number"],
html body:not([data-path="login"]) main.container input[type="date"] {
  background: var(--sk-glass-subtle-bg);
  border: 1px solid var(--sk-line-strong);
  color: var(--sk-text-primary);
  border-radius: var(--sk-radius-md);
  font-family: var(--sk-sans);
}
html body:not([data-path="login"]) main.container .form-control:focus,
html body:not([data-path="login"]) main.container select:focus,
html body:not([data-path="login"]) main.container textarea:focus {
  border-color: var(--sk-accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--sk-primary) 25%, transparent);
  background: var(--sk-glass-medium-bg);
}
html body:not([data-path="login"]) main.container ::placeholder { color: var(--sk-text-mute); opacity: 1; }
/* Les <option> héritent du fond système : sans fond explicite, la liste
   déroulante est illisible en thème sombre. */
html body:not([data-path="login"]) main.container option { background: var(--sk-surface-solid); color: var(--sk-text-primary); }
html body:not([data-path="login"]) main.container .control-label,
html body:not([data-path="login"]) .web-form-wrapper .control-label { color: var(--sk-text-secondary); font-weight: 500; }

/* ── États vides ──────────────────────────────────────────────────────────────
   Un état vide n'est pas une carte : pas de fond plein, un liseré pointillé.
   (Répond aussi au LOT 4.1 « fond transparent ».) */
html body:not([data-path="login"]) .empty-apps-state {
  background: none; border: 1px dashed var(--sk-line-strong);
  border-radius: var(--sk-radius-xl); box-shadow: none;
  text-align: center; padding: 44px 20px;
  color: var(--sk-text-tertiary); font-family: var(--sk-sans); margin-top: 2px;
}
html body:not([data-path="login"]) .empty-apps-state .empty-list-icon { opacity: .35; width: 92px; height: auto; }

/* ── Boutons natifs ───────────────────────────────────────────────────────── */
html body:not([data-path="login"]) .btn-primary {
  background: var(--sk-cta) !important; border: none !important; color: #fff !important;
  border-radius: var(--sk-radius-md); font-family: var(--sk-sans); font-weight: 600; letter-spacing: .01em;
  box-shadow: var(--sk-shadow-ambient), inset 0 1px 0 rgba(255, 255, 255, .18);
}
html body:not([data-path="login"]) .btn-primary:hover { background: var(--sk-cta-over) !important; box-shadow: var(--sk-glow-brand); }
html body:not([data-path="login"]) .btn-default,
html body:not([data-path="login"]) .btn-secondary {
  background: var(--sk-glass-subtle-bg) !important;
  border: 1px solid var(--sk-line-strong) !important;
  color: var(--sk-text-primary) !important;
  border-radius: var(--sk-radius-md); font-family: var(--sk-sans); font-weight: 500;
}

/* ── Page « Mon compte » (/me) — page Frappe standard, non éditable en base
      (RF-6) : son restylage passe obligatoirement par ce CSS global. ───────── */
/* `.account-info` porte un fond blanc en dur dans le template Frappe : sur le
   panneau sombre, le texte clair y devenait invisible. Passe en verre. */
html body:not([data-path="login"]) .my-account-container .account-info {
  gap: 2px; padding: 6px 18px; border-radius: var(--sk-radius-xl);
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 30%), var(--sk-glass-medium-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  border: 1px solid var(--sk-glass-medium-border);
  box-shadow: var(--sk-shadow-lg), inset 0 1px 0 var(--sk-glass-highlight);
}
html body:not([data-path="login"]) .my-account-container .account-info > .col { padding: 16px 6px; border-bottom: 1px solid var(--sk-line); }
html body:not([data-path="login"]) .my-account-container .account-info > .col:last-child { border-bottom: none; }
html body:not([data-path="login"]) .my-account-name { font-family: var(--sk-serif); font-style: italic; font-size: 1.4rem; color: var(--sk-text-primary); }
/* L'avatar de /me est un cercle clair portant les initiales dans une teinte
   grise heritee de Frappe : mesure 2,6:1 sur le verre sombre. On lui donne le
   degrade de marque et un texte blanc — c'est le meme composant que .sk-ava. */
html body:not([data-path="login"]) .my-account-avatar .avatar,
html body:not([data-path="login"]) .my-account-avatar .avatar-frame {
  border: 2px solid var(--sk-line-strong);
  background: linear-gradient(135deg, var(--sk-primary), var(--sk-violet)) !important;
  color: #fff !important;
  /* `.avatar.avatar-small` arrive avec border-radius:0 sur cette page : l'avatar
     y etait un carre, alors qu'il est rond partout ailleurs dans le portail. */
  border-radius: 50% !important;
  overflow: hidden;
}
html body:not([data-path="login"]) .my-account-avatar .avatar-frame,
html body:not([data-path="login"]) .my-account-avatar .avatar .avatar-frame,
html body:not([data-path="login"]) .my-account-avatar .standard-image {
  color: #fff !important; font-family: var(--sk-serif); font-style: italic;
}
html body:not([data-path="login"]) .my-account-item { font-family: var(--sk-sans); font-weight: 600; color: var(--sk-text-primary); }
html body:not([data-path="login"]) .my-account-item-desc { color: var(--sk-text-tertiary); font-size: 13px; }
html body:not([data-path="login"]) .my-account-item-link a {
  display: inline-flex; align-items: center; gap: 6px; padding: 8px 15px;
  border-radius: var(--sk-radius-md);
  background: color-mix(in srgb, var(--sk-primary) 20%, transparent);
  border: 1px solid var(--sk-line-strong);
  color: var(--sk-text-primary) !important;
  font-family: var(--sk-sans); font-weight: 500; text-decoration: none;
  transition: background var(--sk-dur-fast), box-shadow var(--sk-dur-fast);
}
html body:not([data-path="login"]) .my-account-item-link a:hover {
  background: var(--sk-cta); color: #fff !important; box-shadow: var(--sk-glow-brand);
}
html body:not([data-path="login"]) .my-account-item-link a .icon { stroke: currentColor; }

/* LOT 6.2 — masquer « Manage your apps ».
   Le template de /me n'expose aucune classe par ligne : on cible la colonne qui
   CONTIENT le lien, via :has(). C'est la seule prise stable — un :nth-child
   casserait dès que Frappe ajoute ou retire une entrée.
   La cible est `/third_party_apps` (mesuré le 2026-08-06) ; `/apps` est conservé
   par précaution, c'est la route du sélecteur d'applications du Desk. */
html body:not([data-path="login"]) .my-account-container .account-info > .col:has(a[href^="/third_party_apps"]),
html body:not([data-path="login"]) .my-account-container .account-info > .col:has(a[href^="/apps"]) { display: none !important; }
/* L'entrée « Applications » du menu de l'avatar mène au même endroit. */
html body:not([data-path="login"]) #website-post-login .dropdown-menu .dropdown-item.apps { display: none !important; }

/* ── LOT 6.4 — pages de formulaire Frappe standard ───────────────────────────
   /update-password et /update-profile ne sont PAS editables en base (RF-6) :
   leur habillage passe obligatoirement par ce CSS global.
   Demande DG : fond bleu et non blanc, titre serif italique ALIGNE A GAUCHE,
   champs alignes a gauche. Patron repris de PRESTKA (forms.css : .field-row,
   .form-grid ; components.css : .btn--*). */
/* Le prefixe `html.setka-has-sidenav` est necessaire : sans lui cette regle est
   a egalite de specificite avec celle du menu lateral (§6), qui impose
   max-width:1180px, et le formulaire flotterait au centre d'un panneau vide. */
html.setka-has-sidenav body[data-path="update-password"] main.container,
html.setka-has-sidenav body[data-path="update-profile"] main.container {
  max-width: 720px;
}
/* Frappe centre `.page-card` ; la demande DG est un alignement a GAUCHE. */
html body[data-path="update-password"] .page-card,
html body[data-path="update-profile"] .page-card,
html body[data-path="update-password"] .for-reset-password,
html body[data-path="update-profile"] .for-reset-password {
  margin-left: 0 !important;
  margin-right: 0 !important;
  max-width: 480px;
  width: 100%;
  text-align: left;
}
html body[data-path="update-password"] .page-card,
html body[data-path="update-profile"] .page-card,
html body[data-path="update-password"] .web-form-wrapper,
html body[data-path="update-profile"] .web-form-wrapper {
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 28%), var(--sk-glass-medium-bg) !important;
  -webkit-backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  border: 1px solid var(--sk-glass-medium-border) !important;
  border-radius: var(--sk-radius-xl) !important;
  box-shadow: var(--sk-shadow-lg), inset 0 1px 0 var(--sk-glass-highlight) !important;
  color: var(--sk-text-secondary);
  padding: 28px 30px 24px !important;
}
/* Titre : serif italique, à GAUCHE (le template Frappe le centre). */
html body[data-path="update-password"] .page-card-head,
html body[data-path="update-profile"] .page-card-head,
html body[data-path="update-password"] .page-header,
html body[data-path="update-profile"] .page-header {
  text-align: left !important;
  border: none !important;
  padding: 0 0 6px !important;
}
html body[data-path="update-password"] .page-card-head h4,
html body[data-path="update-profile"] .page-card-head h4,
html body[data-path="update-password"] .page-card-head h1,
html body[data-path="update-profile"] .page-card-head h1 {
  display: block !important;
  font-family: var(--sk-serif) !important; font-style: italic; font-weight: 400;
  font-size: var(--sk-text-xl); color: var(--sk-text-primary); margin: 0 0 4px;
}
html body[data-path="update-password"] .page-card-head .app-logo,
html body[data-path="update-profile"] .page-card-head .app-logo { display: none !important; }
/* Champs alignes a gauche, libelles en mono discret — patron .field-row. */
html body[data-path="update-password"] .form-group,
html body[data-path="update-profile"] .form-group { text-align: left !important; margin-bottom: var(--sk-space-4); }
html body[data-path="update-password"] label,
html body[data-path="update-profile"] label {
  display: block; text-align: left !important;
  font-family: var(--sk-mono); font-size: 10px; letter-spacing: var(--sk-tracking-caps);
  text-transform: uppercase; color: var(--sk-text-mute); margin: 0 0 5px;
}
html body[data-path="update-password"] .form-control,
html body[data-path="update-profile"] .form-control {
  background: var(--sk-glass-subtle-bg) !important;
  border: 1px solid var(--sk-line-strong) !important;
  color: var(--sk-text-primary) !important;
  border-radius: var(--sk-radius-md) !important;
  font-family: var(--sk-sans); padding: 10px 12px;
}
html body[data-path="update-password"] .form-control:focus,
html body[data-path="update-profile"] .form-control:focus {
  border-color: var(--sk-accent) !important;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--sk-primary) 25%, transparent) !important;
}
html body[data-path="update-password"] .btn-primary,
html body[data-path="update-profile"] .btn-primary { width: auto; }
/* Indicateur de robustesse du mot de passe : lisible sur verre sombre */
html body[data-path="update-password"] .password-strength-message,
html body[data-path="update-password"] .indicator { color: var(--sk-text-tertiary) !important; }


/* =============================================================================
   7bis. LISTES NATIVES ENRICHIES (V2)
   -----------------------------------------------------------------------------
   Les gabarits Jinja d'ERPNext (project_row, transaction_row, order, projects)
   sont livres dans l'image : ni editables en base, ni modifiables sans rebuild.
   Les en-tetes de colonnes et les barres de filtres qu'ils n'ont pas sont donc
   injectes par `setka-portail.js` PAR-DESSUS le DOM rendu, et habilles ici.

   UNE SEULE GRILLE POUR L'EN-TETE ET LA LIGNE. `.sk-lhead` et `.sk-prow`
   partagent `--sk-cols` : changer le gabarit de colonnes a un seul endroit
   garde l'en-tete aligne sur les lignes. Une grille par famille de liste
   (projets, transactions), declaree sur le conteneur.
   ============================================================================= */

/* ── En-tete de colonnes injecte ──────────────────────────────────────────── */
.sk-lhead {
  display: grid;
  grid-template-columns: var(--sk-cols);
  gap: var(--sk-space-4);
  align-items: end;
  padding: 0 22px var(--sk-space-2);
  margin: 0 0 6px;
  border-bottom: 1px solid var(--sk-line);
}
.sk-lhead > span {
  font-family: var(--sk-mono); font-size: 9.5px;
  letter-spacing: var(--sk-tracking-caps); text-transform: uppercase;
  color: var(--sk-text-mute);
}
.sk-lhead > span.r { text-align: right; }
.sk-lhead > span.c { text-align: center; }

/* ── Ligne de projet rendue par le JS ─────────────────────────────────────────
   Elle REPREND `.web-list-item` (verre, filet, hover, animation d'entree deja
   definis §7) et n'ajoute que la mise en colonnes. */
.sk-plist { --sk-cols: 44px minmax(0, 2.2fr) 1.5fr 1fr auto; }
.sk-tlist { --sk-cols: minmax(0, 2fr) 1.2fr minmax(0, 1.6fr) 1fr; }

.sk-prow {
  display: grid;
  grid-template-columns: var(--sk-cols);
  gap: var(--sk-space-4);
  align-items: center;
}
.sk-prow .nm {
  font-family: var(--sk-sans); font-weight: 600; font-size: 15px;
  color: var(--sk-text-primary); margin: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sk-prow .id {
  font-family: var(--sk-mono); font-size: 10px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--sk-eyebrow); margin-top: 2px;
}
.sk-prow .dt {
  font-family: var(--sk-mono); font-size: 11px; color: var(--sk-text-mute);
  text-align: right; font-variant-numeric: tabular-nums;
}
/* Sous une pastille de statut, la date se lit à gauche, alignée sur elle. */
.sk-prow .dt.sk-dt-l { text-align: left; margin-top: 5px; }

/* Vignette de projet (D3) — MEME composant que `.sk-ava`, decline en 40 px.
   La teinte est derivee du nom par une ROTATION du degrade de marque, pas par
   une couleur inventee : on reste dans la famille bleu → violet, et le texte
   blanc reste blanc (hue-rotate ne deplace pas les achromatiques). L'amplitude
   est bornee cote JS pour ne pas sortir de la charte. */
.sk-ava--row {
  width: 40px; height: 40px; font-size: .95rem;
  filter: hue-rotate(var(--sk-ava-rot, 0deg));
}

/* ── Avancement : barre + valeur ──────────────────────────────────────────── */
.sk-prog { display: flex; align-items: center; gap: var(--sk-space-2); }
.sk-prog .bar {
  flex: 1 1 auto; height: 5px; border-radius: var(--sk-radius-full);
  background: color-mix(in srgb, var(--sk-text-mute) 26%, transparent);
  overflow: hidden;
}
.sk-prog .bar > i { display: block; height: 100%; background: var(--sk-bar); border-radius: inherit; }
.sk-prog .v {
  font-family: var(--sk-mono); font-size: 11px; color: var(--sk-text-secondary);
  font-variant-numeric: tabular-nums; min-width: 34px; text-align: right;
}

/* ── Pastilles de statut de projet ────────────────────────────────────────────
   « Ouvert » n'est pas une anomalie : le rouge lui est retire. Il reste
   disponible pour ce qui en est vraiment une. */
.sk-pill.encours {
  background: color-mix(in srgb, var(--sk-text-mute) 20%, transparent);
  border-color: var(--sk-line-strong); color: var(--sk-text-secondary);
}
.sk-pill.termine {
  background: color-mix(in srgb, var(--sk-ok) 20%, transparent);
  border-color: color-mix(in srgb, var(--sk-ok) 34%, transparent); color: var(--sk-ok-fg);
}
.sk-pill.annule {
  background: color-mix(in srgb, var(--sk-text-mute) 14%, transparent);
  border-color: var(--sk-line); color: var(--sk-text-mute);
}

/* MEME correction sur le gabarit NATIF, qui reste servi si le fetch echoue :
   `project_row.html` code `indicator-pill red` en dur des que l'avancement est
   nul. `:has(.project-link)` ne cible que la liste des projets — le rouge des
   autres listes (factures en retard, tickets ouverts) est preserve. */
html body:not([data-path="login"]) .web-list-item:has(.project-link) .indicator-pill.red {
  background: color-mix(in srgb, var(--sk-text-mute) 20%, transparent) !important;
  color: var(--sk-text-secondary) !important;
  border: 1px solid var(--sk-line-strong);
}

/* ── Bouton d'action de ligne ─────────────────────────────────────────────── */
.sk-prow .sk-btn { padding: 7px 13px; font-size: 12px; white-space: nowrap; }

/* ── En-tete des listes de vente (LOT 5) ─────────────────────────────────────
   Variante Bootstrap de `.sk-lhead` : elle ne pose PAS de grille, elle herite
   de `.row`/`.col-sm-*`, exactement comme les lignes de `transaction_row.html`.
   Une grille CSS parallele se serait desalignee au premier changement de
   proportion cote Frappe. */
.sk-lhead--bs { display: block; padding: 0 22px var(--sk-space-2); }
.sk-lhead--bs .row { margin: 0; }
.sk-lhead--bs [class^="col-"] { padding-left: 0; padding-right: 0; }

/* ── Bouton d'impression (LOT 5) ──────────────────────────────────────────────
   Icone seule au repos, libelle au survol : la demande est « un bouton
   d'impression direct avec icone, le texte apparaissant au survol ». La largeur
   est animee via `max-width` et non `width` — `width:auto` ne s'anime pas. */
.sk-print { padding: 9px 12px; overflow: hidden; }
.sk-print .lb {
  display: inline-block; max-width: 0; opacity: 0;
  white-space: nowrap; overflow: hidden;
  transition: max-width var(--sk-dur) var(--sk-ease-silk), opacity var(--sk-dur),
              margin-left var(--sk-dur) var(--sk-ease-silk);
  margin-left: 0;
}
.sk-print:hover .lb, .sk-print:focus-visible .lb {
  max-width: 120px; opacity: 1; margin-left: 7px;
}
/* Si le menu « Actions » porte d'autres entrees, il reste : le bouton se pose a
   cote et ne doit pas coller au menu. */
.sk-print--double { margin-right: var(--sk-space-3); }
@media (prefers-reduced-motion: reduce) {
  .sk-print .lb { max-width: 120px; opacity: 1; margin-left: 7px; transition: none; }
}

/* ── Detail d'un document de vente (LOTs 5 et 6) ──────────────────────────────
   « Reprendre le style du PDF que le client recoit, mais avec le fond du
   theme ». On transpose la COMPOSITION de `Setka Facture Luxe` — filet mono
   dore, table d'articles a filets fins, totaux detaches — sans en copier les
   couleurs : elles sont faites pour du papier blanc. Les tokens font le reste,
   et la page suit le theme.
   RF-3 : `order.html` sert les trois familles, ces regles valent pour les trois. */
html body[data-path="order"] .transaction-subheading {
  font-family: var(--sk-mono); font-size: 10.5px;
  letter-spacing: var(--sk-tracking-wide); text-transform: uppercase;
  color: var(--sk-text-mute);
}
html body[data-path="order"] .indicator-container {
  align-items: center;
  padding-bottom: var(--sk-space-4);
  border-bottom: 1.5px solid var(--sk-line-strong);
  margin-bottom: var(--sk-space-5);
}
html body[data-path="order"] .indicator-container b {
  font-family: var(--sk-serif); font-style: italic; font-weight: 400;
  font-size: var(--sk-text-lg); color: var(--sk-text-primary);
}

/* Table des articles — memes proportions typographiques que le PDF : en-tetes
   en mono minuscule espacee, montants tabulaires. */
html body[data-path="order"] .order-item-header {
  border-top: 1.5px solid var(--sk-line-strong);
  border-bottom: 1px solid var(--sk-line);
  padding: 9px 0; margin-bottom: 0 !important;
}
html body[data-path="order"] .order-item-header span {
  font-family: var(--sk-mono); font-size: 9px;
  letter-spacing: var(--sk-tracking-caps); text-transform: uppercase;
  color: var(--sk-text-mute) !important;
}
html body[data-path="order"] .order-items:not(.order-item-header) {
  padding: 14px 0; border-bottom: 1px solid var(--sk-line);
}
html body[data-path="order"] .order-item-name { color: var(--sk-text-primary); }
html body[data-path="order"] .item-description { color: var(--sk-text-tertiary) !important; }
html body[data-path="order"] .order-rate,
html body[data-path="order"] .order-items span:last-child {
  font-family: var(--sk-mono); font-variant-numeric: tabular-nums;
}
/* Vignette d'article sans image : un carre gris clair en dur dans le gabarit. */
html body[data-path="order"] .no-image-cart-item {
  min-height: 0 !important; height: 54px; width: 54px;
  display: grid; place-items: center;
  border-radius: var(--sk-radius-md);
  border: 1px dashed var(--sk-line-strong);
  background: var(--sk-glass-subtle-bg);
  color: var(--sk-text-mute);
  font-family: var(--sk-mono); font-size: 11px; letter-spacing: .06em;
}
html body[data-path="order"] .order-image img {
  border-radius: var(--sk-radius-md); border: 1px solid var(--sk-line);
}

/* Totaux — le bloc que le lecteur cherche en premier, comme sur le PDF. */
html body[data-path="order"] .order-taxes,
html body[data-path="order"] .tax-grand-total,
html body[data-path="order"] .grand-total {
  font-family: var(--sk-mono); font-variant-numeric: tabular-nums;
  color: var(--sk-text-primary);
}
html body[data-path="order"] .tax-grand-total-icon,
html body[data-path="order"] .grand-total {
  font-family: var(--sk-serif) !important; font-style: italic;
  font-size: var(--sk-text-xl); color: var(--sk-text-primary);
}
html body[data-path="order"] .terms-and-condition {
  margin-top: var(--sk-space-6); padding-top: var(--sk-space-4);
  border-top: 1px solid var(--sk-line); color: var(--sk-text-tertiary) !important;
}
html body[data-path="order"] hr { border-color: var(--sk-line); }

/* ── Detail d'un projet (LOT 2) ───────────────────────────────────────────────
   `projects.html` masque son propre titre : la regle `:has(.website-list)` de la
   §7 eteint `.page-header` ET `.my-account-header` sur toute page portant une
   liste — mesure du 2026-08-07, les deux sont a `display:none`. L'en-tete de
   cette page est donc entierement a notre charge. */
.sk-phero {
  display: flex; align-items: flex-start; gap: var(--sk-space-4);
  margin: 4px 0 var(--sk-space-5);
}
.sk-phero .sk-ava { width: 58px; height: 58px; font-size: 1.5rem; }
.sk-phero .tx { min-width: 0; flex: 1 1 auto; }
.sk-phero .lead {
  font-family: var(--sk-mono); font-size: 10.5px; letter-spacing: .18em;
  text-transform: uppercase; color: var(--sk-eyebrow); margin: 0 0 4px;
}
.sk-phero h1 {
  font-family: var(--sk-serif) !important; font-style: italic; font-weight: 400;
  font-size: var(--sk-text-2xl); line-height: 1.12; margin: 0;
  color: var(--sk-text-primary); text-shadow: var(--sk-title-shadow);
}
.sk-phero .bas {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sk-space-3); margin-top: var(--sk-space-2);
}

/* Grille de metadonnees : `.sk-kv` (§8) pose deja la ligne cle/valeur, on ne
   fournit ici que la mise en colonnes et le fond de verre qui la porte. */
.sk-kvgrid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(228px, 1fr));
  gap: 0 var(--sk-space-6);
  padding: var(--sk-space-4) var(--sk-space-5);
  margin: 0 0 var(--sk-space-5);
  border-radius: var(--sk-radius-xl);
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 40%), var(--sk-glass-subtle-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-subtle-blur)) saturate(var(--sk-glass-subtle-sat));
  backdrop-filter: blur(var(--sk-glass-subtle-blur)) saturate(var(--sk-glass-subtle-sat));
  border: 1px solid var(--sk-glass-subtle-border);
  box-shadow: var(--sk-shadow-md), inset 0 1px 0 var(--sk-glass-highlight);
}
/* `.sk-kv:last-of-type` (§8) retire le filet du dernier ENFANT ; en grille, la
   derniere ligne de CHAQUE colonne doit le perdre, sinon des traits flottent
   sous des colonnes inegales. */
.sk-kvgrid .sk-kv:nth-last-child(-n+2) { border-bottom: none; }
.sk-kvgrid .sk-kv .v { text-align: right; }

.sk-notes {
  font-family: var(--sk-sans); font-size: 14px; line-height: 1.65;
  color: var(--sk-text-secondary);
  padding: var(--sk-space-4) var(--sk-space-5); margin: 0 0 var(--sk-space-5);
  border-left: 3px solid var(--sk-accent); border-radius: var(--sk-radius-md);
  background: color-mix(in srgb, var(--sk-primary) 12%, transparent);
}
.sk-notes p:first-child { margin-top: 0; }
.sk-notes p:last-child { margin-bottom: 0; }

/* ── Lignes de taches re-rendues ──────────────────────────────────────────── */
.sk-tlist { --sk-cols: minmax(0, 2.4fr) 1.1fr 1fr 1fr; }
.sk-tlist .sk-prow .nm { font-size: 14.5px; font-weight: 500; }
.sk-tlist .sk-prow .nm a { color: inherit; text-decoration: none; }
.sk-tlist .sk-prow .nm a:hover { color: var(--sk-accent); }
.sk-tlist .web-list-item { padding: 14px 22px; }

/* Priorites de tache — la haute n'est pas une anomalie, elle est signalee en
   ambre et non en rouge ; le rouge reste au retard averé. */
.sk-pill.pr-urgent { background: color-mix(in srgb, var(--sk-danger) 22%, transparent);
  border-color: color-mix(in srgb, var(--sk-danger) 36%, transparent); color: var(--sk-danger-fg); }
.sk-pill.pr-high   { background: color-mix(in srgb, var(--sk-warn) 20%, transparent);
  border-color: color-mix(in srgb, var(--sk-warn) 34%, transparent); color: var(--sk-warn-fg); }
.sk-pill.pr-medium { background: color-mix(in srgb, var(--sk-primary) 20%, transparent);
  border-color: var(--sk-line-strong); color: var(--sk-text-secondary); }
.sk-pill.pr-low    { background: color-mix(in srgb, var(--sk-text-mute) 16%, transparent);
  border-color: var(--sk-line); color: var(--sk-text-mute); }

.sk-pill.st-open    { background: color-mix(in srgb, var(--sk-text-mute) 20%, transparent);
  border-color: var(--sk-line-strong); color: var(--sk-text-secondary); }
.sk-pill.st-working { background: color-mix(in srgb, var(--sk-primary) 24%, transparent);
  border-color: var(--sk-line-strong); color: var(--sk-text-primary); }
.sk-pill.st-done    { background: color-mix(in srgb, var(--sk-ok) 20%, transparent);
  border-color: color-mix(in srgb, var(--sk-ok) 34%, transparent); color: var(--sk-ok-fg); }
.sk-pill.st-late    { background: color-mix(in srgb, var(--sk-danger) 22%, transparent);
  border-color: color-mix(in srgb, var(--sk-danger) 36%, transparent); color: var(--sk-danger-fg); }

/* Titre de section — `h4` est deja serif italique (§7), on ne pose que le rang. */
.sk-sect {
  display: flex; flex-wrap: wrap; align-items: baseline;
  justify-content: space-between; gap: var(--sk-space-3);
  margin: var(--sk-space-6) 0 var(--sk-space-3);
}
.sk-sect h4 { margin: 0; font-size: var(--sk-text-xl); }

/* ── RF-9 : la liste deroulante des champs Link ───────────────────────────────
   « La liste de priorite est coupee, seul Bas s'affiche » (DG). Ce n'est pas un
   probleme de donnees — les trois priorites existent — ni un defaut de Frappe :
   son `ul` est deja en `max-height:300px; overflow-y:auto`.

   LA CAUSE EST NOTRE PROPRE REGLE. `.web-form-wrapper` (§7) porte
   `overflow:hidden`, pose pour que le filet `::before` soit rogne par les coins
   arrondis de la carte. Une liste en `position:absolute` qui depasse du bas de
   cette carte est donc tranchee net.

   On rend l'`overflow` visible et on arrondit le filet lui-meme : il epouse les
   coins sans que le conteneur ait a decouper quoi que ce soit. Meme resultat
   visuel, sans amputer les descendants positionnes. */
html body:not([data-path="login"]) .web-form-wrapper { overflow: visible; }
html body:not([data-path="login"]) .web-form-wrapper::before {
  border-radius: var(--sk-radius-xl) var(--sk-radius-xl) 0 0;
}

/* Le `ul` natif n'a AUCUN fond (mesure : `rgba(0,0,0,0)`) : sur le verre sombre
   il se superposait au contenu. Il lui faut une surface pleine. */
html body:not([data-path="login"]) .awesomplete > ul {
  background: var(--sk-surface-solid);
  border: 1px solid var(--sk-line-strong);
  border-radius: var(--sk-radius-md);
  box-shadow: var(--sk-shadow-lg);
  max-height: 320px; overflow-y: auto;
  padding: 4px; margin-top: 4px;
}
html body:not([data-path="login"]) .awesomplete > ul > li {
  font-family: var(--sk-sans); font-size: 13.5px;
  color: var(--sk-text-primary);
  padding: 8px 10px; border-radius: var(--sk-radius-sm);
}
html body:not([data-path="login"]) .awesomplete > ul > li:hover,
html body:not([data-path="login"]) .awesomplete > ul > li[aria-selected="true"] {
  background: color-mix(in srgb, var(--sk-primary) 26%, transparent);
  color: var(--sk-text-primary);
}
html body:not([data-path="login"]) .awesomplete > ul > li mark,
html body:not([data-path="login"]) .awesomplete mark {
  background: transparent; color: var(--sk-accent); font-weight: 600;
}
/* Frappe pose un `::before` en forme de fleche sur son `ul` : sans fond assorti
   il dessine un triangle clair au-dessus de notre surface. */
html body:not([data-path="login"]) .awesomplete > ul::before { background: var(--sk-surface-solid); }

/* ── Modales natives de Frappe (`frappe.msgprint`) ────────────────────────────
   Trou de la V1 : aucune regle ne les ciblait. Ce sont des modales Bootstrap,
   donc blanches — « Missing Values Required » s'affichait en aplat blanc au
   milieu du portail sombre. On leur donne le verre `strong`, comme `.sk-modal`
   (§8), sans reecrire leur balisage : elles sont creees par Frappe a la volee. */
html body:not([data-path="login"]) .modal-content {
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 26%), var(--sk-glass-strong-bg) !important;
  -webkit-backdrop-filter: blur(var(--sk-glass-strong-blur)) saturate(var(--sk-glass-strong-sat));
  backdrop-filter: blur(var(--sk-glass-strong-blur)) saturate(var(--sk-glass-strong-sat));
  border: 1px solid var(--sk-glass-strong-border) !important;
  border-radius: var(--sk-radius-xl) !important;
  box-shadow: var(--sk-shadow-xl), inset 0 1px 0 var(--sk-glass-highlight) !important;
  color: var(--sk-text-secondary) !important;
  position: relative; overflow: hidden;
}
html body:not([data-path="login"]) .modal-content::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 4px;
  background: var(--sk-bar); z-index: 1;
}
html body:not([data-path="login"]) .modal-header,
html body:not([data-path="login"]) .modal-footer {
  background: transparent !important; border-color: var(--sk-line) !important;
}
html body:not([data-path="login"]) .modal-title,
html body:not([data-path="login"]) .modal-header .modal-title {
  font-family: var(--sk-serif) !important; font-style: italic; font-weight: 400;
  font-size: var(--sk-text-lg); color: var(--sk-text-primary) !important;
}
html body:not([data-path="login"]) .modal-body { color: var(--sk-text-secondary) !important; }
html body:not([data-path="login"]) .modal-body .msgprint,
html body:not([data-path="login"]) .modal-body p,
html body:not([data-path="login"]) .modal-body li { color: var(--sk-text-secondary) !important; }
html body:not([data-path="login"]) .modal-backdrop { background: var(--sk-obsidian); }
html body:not([data-path="login"]) .modal-backdrop.show { opacity: .72; }
/* Le bouton de fermeture est un `×` noir en `opacity:.5` : invisible sur verre. */
html body:not([data-path="login"]) .modal-header .btn-modal-close,
html body:not([data-path="login"]) .modal-header .close,
html body:not([data-path="login"]) .modal-header button.close {
  color: var(--sk-text-tertiary) !important; opacity: 1 !important;
  background: transparent !important; border: none !important;
}
html body:not([data-path="login"]) .modal-header .btn-modal-close:hover,
html body:not([data-path="login"]) .modal-header .close:hover { color: var(--sk-text-primary) !important; }
html body:not([data-path="login"]) .modal-header .btn-modal-close svg,
html body:not([data-path="login"]) .modal-header .icon { stroke: currentColor; fill: none; }

/* ── Champ de recherche des barres de filtres ─────────────────────────────────
   `.sk-filters` (§8) ne stylait que les `<select>` : la V2 y ajoute une saisie
   libre et un intervalle de dates, qui doivent s'y fondre. */
.sk-filters input[type="search"],
.sk-filters input[type="text"],
.sk-filters input[type="date"] {
  font-family: var(--sk-sans); font-size: 13px; padding: 7px 10px;
  border-radius: var(--sk-radius-md);
  background: var(--sk-glass-medium-bg); border: 1px solid var(--sk-line-strong);
  color: var(--sk-text-primary); min-width: 150px;
}
.sk-filters input:focus {
  outline: none; border-color: var(--sk-accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--sk-primary) 25%, transparent);
}
.sk-filters input::placeholder { color: var(--sk-text-mute); opacity: 1; }

/* Etat « aucun resultat » apres filtrage — distinct de l'etat vide natif. */
.sk-nores {
  display: none; text-align: center; padding: 34px 20px;
  border: 1px dashed var(--sk-line-strong); border-radius: var(--sk-radius-xl);
  color: var(--sk-text-tertiary); font-family: var(--sk-sans); font-size: 14px;
}
.sk-nores.on { display: block; }

/* ── Repli mobile ─────────────────────────────────────────────────────────────
   En dessous de 800 px la grille en colonnes devient illisible : les en-tetes
   disparaissent (ils n'ont plus de colonne a nommer) et la ligne s'empile. */
@media (max-width: 800px) {
  .sk-lhead { display: none; }
  .sk-prow { grid-template-columns: 40px minmax(0, 1fr); gap: var(--sk-space-3); }
  .sk-prow > *:nth-child(n+3) { grid-column: 2; }
  .sk-prow .dt { text-align: left; }
  .sk-filters .f, .sk-filters input { min-width: 0; width: 100%; }
}


/* =============================================================================
   8. PRIMITIVES DE PAGE — mutualisées
   -----------------------------------------------------------------------------
   Les 8 Web Pages portaient chacune son <style> inline, avec SIX préfixes de
   classes différents (.sk- .dc- .ap- .nw- .pf- .setka-cat-) pour un vocabulaire
   visuel identique — et trois pages (/espace /abonnements /assistance)
   embarquaient trois COPIES du même bloc. Tout est ramené ici, une fois, en
   tokens ; les noms de classes d'origine sont conservés pour que le HTML et le
   JS des pages n'aient pas à changer.
   ============================================================================= */

/* ── Conteneurs ───────────────────────────────────────────────────────────── */
.sk-wrap, .dc-wrap, .ap-wrap, .nw-wrap, .pf-wrap, .setka-cat-wrap { max-width: 1120px; margin: 0 auto; }
.nw-wrap, .pf-wrap { max-width: 900px; }
.dc-wrap, .ap-wrap { max-width: 1180px; }

/* ── En-têtes de page ─────────────────────────────────────────────────────── */
.sk-lead, .dc-lead, .ap-lead, .nw-lead, .pf-lead, .setka-cat-lead {
  font-family: var(--sk-mono); font-size: 11px; letter-spacing: .18em;
  text-transform: uppercase; color: var(--sk-eyebrow); margin: 0 0 6px;
}
.sk-hello, .dc-h1, .ap-h1, .nw-h1, .pf-h1, .setka-cat-h1 {
  font-family: var(--sk-serif); font-style: italic; font-weight: 400;
  font-size: var(--sk-text-3xl); line-height: 1.12;
  color: var(--sk-text-primary); margin: 0; text-shadow: var(--sk-title-shadow);
}
.sk-hello { margin: 0 0 8px; }
.dc-h1::after, .ap-h1::after, .nw-h1::after, .pf-h1::after, .setka-cat-h1::after {
  content: ""; display: block; width: 44px; height: 2px; margin-top: 10px;
  background: var(--sk-rule); border-radius: 2px;
}
.sk-sub, .dc-sub, .ap-sub, .nw-sub, .pf-sub, .setka-cat-intro {
  font-family: var(--sk-sans); color: var(--sk-text-tertiary);
  font-size: 15px; line-height: 1.55; max-width: 660px; margin: 12px 0 26px;
}
.sk-sub { max-width: 640px; margin: 0 0 26px; }
.setka-cat-intro { max-width: 640px; margin: 0 0 22px; }

.sk-h2, .setka-cat-section > h2 {
  font-family: var(--sk-serif); font-style: italic; font-weight: 400;
  font-size: var(--sk-text-xl); color: var(--sk-text-primary) !important;
  margin: 26px 0 14px; text-shadow: var(--sk-title-shadow);
}
.sk-h2::after, .setka-cat-section > h2::after {
  content: ""; display: block; width: 40px; height: 2px; margin-top: 8px;
  background: var(--sk-rule); border-radius: 2px;
}
.setka-cat-section { margin: 34px 0; }
.ap-cat {
  font-family: var(--sk-mono); font-size: 11px; letter-spacing: .16em;
  text-transform: uppercase; color: var(--sk-text-tertiary); margin: 26px 0 12px;
}

/* ── Grilles ──────────────────────────────────────────────────────────────── */
.sk-grid          { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 18px; }
.dc-grid          { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }
.ap-grid          { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; }
.setka-cat-grid   { display: grid; grid-template-columns: repeat(auto-fill, minmax(258px, 1fr)); gap: 18px; }
.pf-cards         { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 640px) { .pf-cards { grid-template-columns: 1fr; } }

/* ── LA CARTE — verre commun à toutes les pages ────────────────────────────
   backdrop-filter assumé ici : ce sont des surfaces PETITES et NOMBREUSES,
   exactement le cas d'usage sûr décrit en RF-1. */
.sk-card, .dc-card, .ap-card, .nw-item, .pf-card, .pf-hero,
.setka-cat-card, .sk-kpi, .sk-contact, .sk-summary {
  position: relative; overflow: hidden;
  border-radius: var(--sk-radius-xl);
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 30%), var(--sk-glass-medium-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  backdrop-filter: blur(var(--sk-glass-medium-blur)) saturate(var(--sk-glass-medium-sat));
  border: 1px solid var(--sk-glass-medium-border);
  box-shadow: var(--sk-shadow-lg), var(--sk-shadow-ambient),
              inset 0 1px 0 var(--sk-glass-highlight), var(--sk-glass-edge), var(--sk-glass-inner);
  color: var(--sk-text-secondary);
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .sk-card, .dc-card, .ap-card, .nw-item, .pf-card, .pf-hero,
  .setka-cat-card, .sk-kpi, .sk-contact, .sk-summary {
    background: color-mix(in srgb, var(--sk-surface-solid) 94%, transparent);
  }
}

/* Filet de marque : horizontal en haut par défaut, vertical à gauche pour les
   blocs « bandeau » (interlocuteur, récap, annonce, profil, KPI). */
.sk-card::before, .dc-card::before, .ap-card::before,
.pf-card::before, .setka-cat-card::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--sk-bar); z-index: 1;
}
.sk-contact::before, .sk-summary::before, .nw-item::before, .pf-hero::before, .sk-kpi::before {
  content: ""; position: absolute; top: 0; left: 0; bottom: 0; width: 4px; background: var(--sk-bar-v); z-index: 1;
}
.nw-item.pin::before { background: linear-gradient(180deg, var(--sk-gold), var(--sk-warn)); }

/* Survol : lift + halo de marque (jamais un changement de fond, qui ferait
   « clignoter » le verre). */
a.sk-card, .dc-card, .ap-card, .setka-cat-card, .sk-abo {
  transition: transform var(--sk-dur-fast) var(--sk-ease-silk), box-shadow var(--sk-dur-fast) var(--sk-ease-silk);
}
a.sk-card:hover, .dc-card:hover, .ap-card:hover, .setka-cat-card:hover, .sk-abo:hover {
  transform: translateY(-3px);
  box-shadow: var(--sk-shadow-xl), var(--sk-glow-brand), inset 0 1px 0 var(--sk-glass-highlight);
}

/* Mises en forme internes communes */
.sk-card, .dc-card { display: flex; flex-direction: column; gap: 8px; padding: 20px; text-decoration: none; }
.setka-cat-card    { display: flex; flex-direction: column; gap: 9px; padding: 20px 20px 18px; }
.pf-card           { padding: 20px 22px; }
.nw-item           { padding: 22px 24px; margin-bottom: 16px; animation: sk-rise var(--sk-dur-slow) var(--sk-ease-silk) both; }
.dc-card, .ap-card { animation: sk-rise var(--sk-dur-slow) var(--sk-ease-silk) both; }

.sk-card h3, .dc-card h3, .setka-cat-card h3, .ap-tx h3, .pf-card h3, .nw-item h3 {
  font-family: var(--sk-serif); font-style: italic; font-weight: 400;
  font-size: 1.28rem; line-height: 1.2; color: var(--sk-text-primary); margin: 0;
}
.pf-card h3 { margin: 0 0 12px; }
.nw-item h3 { font-size: 1.5rem; margin: 0 0 6px; }
.sk-card .d, .dc-card p, .setka-cat-card .desc, .ap-tx p {
  font-family: var(--sk-sans); font-size: 13px; line-height: 1.5;
  color: var(--sk-text-tertiary); margin: 0; flex: 1;
}
.nw-body { font-family: var(--sk-sans); font-size: 14px; color: var(--sk-text-secondary); line-height: 1.6; }
.nw-body p { margin: 0 0 8px; }
.sk-card .ic { color: var(--sk-accent); display: inline-flex; margin-bottom: 2px; }
.sk-card .ic svg { width: 26px; height: 26px; }

/* ── Méta : codes, montants, dates, cadences ──────────────────────────────── */
.sk-card .code, .setka-cat-card .code {
  font-family: var(--sk-mono); font-size: 10px; letter-spacing: .14em;
  text-transform: uppercase; color: var(--sk-eyebrow);
}
.sk-card .amount, .setka-cat-card .price {
  font-family: var(--sk-mono); font-weight: 600; font-size: 1.08rem;
  color: var(--sk-accent); font-variant-numeric: tabular-nums;
}
.setka-cat-card .tva, .sk-cad, .sk-abo .since, .dc-date, .nw-date {
  font-family: var(--sk-mono); font-size: 10.5px; letter-spacing: .06em; color: var(--sk-text-mute);
}
.sk-cad { text-transform: uppercase; letter-spacing: .08em; font-size: 10px; color: var(--sk-text-tertiary); }
.nw-date { margin-left: auto; }
.sk-row {
  display: flex; justify-content: space-between; align-items: center; gap: 8px;
  font-family: var(--sk-mono); font-size: 11px; color: var(--sk-text-mute);
}
.setka-cat-card .foot { display: flex; flex-direction: column; gap: 0; margin-top: 2px; }
.sk-abo { cursor: pointer; }
.sk-abo .more, .dc-code {
  font-family: var(--sk-mono); font-size: 10px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--sk-accent); margin-top: 2px;
}

/* ── Pastilles ────────────────────────────────────────────────────────────── */
.sk-pill, .dc-pill, .nw-pill, .nw-pin {
  font-family: var(--sk-mono); font-size: 9.5px; letter-spacing: .06em; text-transform: uppercase;
  font-weight: 600; padding: 3px 9px; border-radius: var(--sk-radius-full);
  border: 1px solid transparent;
}
.dc-pill, .nw-pill {
  background: color-mix(in srgb, var(--sk-primary) 22%, transparent);
  border-color: color-mix(in srgb, var(--sk-primary) 34%, transparent);
  color: var(--sk-accent);
}
.nw-pin { background: none; padding: 3px 0; color: var(--sk-warn-fg); }
.sk-pill.actif     { background: color-mix(in srgb, var(--sk-ok) 20%, transparent);     border-color: color-mix(in srgb, var(--sk-ok) 34%, transparent);     color: var(--sk-ok-fg); }
.sk-pill.suspendu  { background: color-mix(in srgb, var(--sk-warn) 20%, transparent);   border-color: color-mix(in srgb, var(--sk-warn) 34%, transparent);   color: var(--sk-warn-fg); }
.sk-pill.resilie   { background: color-mix(in srgb, var(--sk-danger) 22%, transparent); border-color: color-mix(in srgb, var(--sk-danger) 36%, transparent); color: var(--sk-danger-fg); }
.dc-top, .nw-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.nw-top { margin: 0 0 6px; }

/* ── Blocs « bandeau » ────────────────────────────────────────────────────── */
.sk-contact { display: flex; align-items: center; gap: 18px; padding: 22px 24px; }
.pf-hero    { display: flex; align-items: center; gap: 18px; padding: 22px 24px; margin-bottom: 16px; }
.sk-summary { display: flex; flex-wrap: wrap; gap: 30px; padding: 18px 26px; margin: 0 0 20px; }
@media (max-width: 800px) { .sk-contact { flex-direction: column; text-align: center; } }

.sk-ava, .pf-ava {
  flex: 0 0 auto; width: 60px; height: 60px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(135deg, var(--sk-primary), var(--sk-violet));
  color: #fff; font-family: var(--sk-serif); font-style: italic; font-size: 1.6rem;
  box-shadow: var(--sk-shadow-md);
}
.pf-ava { width: 66px; height: 66px; font-size: 1.8rem; }
.sk-contact .nm, .pf-hero .nm {
  font-family: var(--sk-serif); font-style: italic; font-size: 1.4rem; color: var(--sk-text-primary); margin: 0;
}
.pf-hero .nm { font-size: 1.6rem; }
.sk-contact .rl, .pf-hero .co {
  font-family: var(--sk-sans); font-size: 13px; color: var(--sk-text-tertiary); margin: 2px 0 6px;
}
.pf-hero .co { margin: 3px 0 0; font-size: 13.5px; }
.sk-contact .lk { font-family: var(--sk-sans); font-size: 13px; }
.sk-contact .lk a { color: var(--sk-accent); text-decoration: none; font-weight: 500; margin-right: 14px; }

/* ── KPI ──────────────────────────────────────────────────────────────────── */
.sk-kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(158px, 1fr)); gap: 14px; margin: 2px 0 28px; }
.sk-kpi  { padding: 15px 18px; display: flex; flex-direction: column; gap: 3px; }
.sk-kpi .v, .sk-summary .kpi .v {
  font-family: var(--sk-serif); font-style: italic; font-size: 1.95rem; line-height: 1; color: var(--sk-text-primary);
}
.sk-kpi .v.alert { color: var(--sk-warn-fg); }
.sk-kpi .l, .sk-summary .kpi .l {
  font-family: var(--sk-mono); font-size: 9.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--sk-text-mute);
}
.sk-kpi .s { font-family: var(--sk-sans); font-size: 11.5px; color: var(--sk-text-tertiary); min-height: 14px; }
.sk-summary .kpi { display: flex; flex-direction: column; gap: 3px; }

/* ── Applications ─────────────────────────────────────────────────────────── */
.ap-card { display: flex; gap: 15px; align-items: flex-start; padding: 18px 20px; text-decoration: none; }
.ap-ic {
  flex: 0 0 auto; width: 52px; height: 52px; border-radius: var(--sk-radius-lg);
  display: flex; align-items: center; justify-content: center; color: #fff;
  font-family: var(--sk-serif); font-style: italic; font-size: 1.7rem;
  box-shadow: var(--sk-shadow-md); overflow: hidden;
}
.ap-ic img { width: 100%; height: 100%; object-fit: cover; }
.ap-tx { min-width: 0; }
.ap-tx h3 { margin: 0 0 3px; display: flex; align-items: center; gap: 7px; }
.ap-tx h3 .ext { opacity: .45; flex: 0 0 auto; }

/* ── Profil ───────────────────────────────────────────────────────────────── */
.pf-kv, .sk-kv {
  display: flex; justify-content: space-between; gap: 16px; padding: 10px 0;
  border-bottom: 1px solid var(--sk-line);
}
.pf-kv:last-child, .sk-kv:last-of-type { border-bottom: none; }
.pf-kv .k, .sk-kv .k {
  font-family: var(--sk-mono); font-size: 10.5px; letter-spacing: .05em;
  text-transform: uppercase; color: var(--sk-text-mute);
}
.pf-kv .v, .sk-kv .v {
  font-family: var(--sk-sans); font-size: 14px; color: var(--sk-text-primary);
  font-weight: 500; text-align: right;
}
.sk-kv .v.amount { font-family: var(--sk-mono); color: var(--sk-accent); font-weight: 600; }
.pf-actions { margin-top: 18px; display: flex; flex-wrap: wrap; gap: 10px; }
/* LOT 6 — carte « Mon compte » : rendue en frère de .pf-cards (pas dans la
   grille), elle prend donc naturellement toute la largeur. */
.pf-card--wide { margin-top: 16px; }
.pf-hint { font-family: var(--sk-sans); font-size: 13px; color: var(--sk-text-tertiary); margin: 0 0 4px; }

/* ── Boutons de page ──────────────────────────────────────────────────────── */
.sk-btn, .pf-btn, .dc-dl, .setka-cat-card .cmd {
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  padding: 9px 16px; border-radius: var(--sk-radius-md);
  font-family: var(--sk-sans); font-weight: 600; font-size: 13px;
  text-decoration: none; cursor: pointer; border: 1px solid transparent;
  transition: transform var(--sk-dur-fast) var(--sk-ease-silk), box-shadow var(--sk-dur-fast), background var(--sk-dur-fast);
}
.sk-btn:hover, .pf-btn:hover, .dc-dl:hover, .setka-cat-card .cmd:hover { transform: translateY(-1px); }
.sk-btn.primary, .pf-btn, .dc-dl, .setka-cat-card .cmd {
  background: var(--sk-cta); color: #fff !important;
  box-shadow: var(--sk-shadow-ambient), inset 0 1px 0 rgba(255, 255, 255, .18);
}
.sk-btn.primary:hover, .pf-btn:hover, .dc-dl:hover, .setka-cat-card .cmd:hover { box-shadow: var(--sk-glow-brand); }
.dc-dl { align-self: flex-start; margin-top: 6px; }
.setka-cat-card .cmd { margin-top: 10px; display: flex; }
/* Bouton secondaire en verre — jamais un aplat gris (charte PRESTKA .btn--ghost) */
.sk-btn.ghost {
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 62%), var(--sk-glass-subtle-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-subtle-blur)) saturate(var(--sk-glass-subtle-sat));
  backdrop-filter: blur(var(--sk-glass-subtle-blur)) saturate(var(--sk-glass-subtle-sat));
  border-color: var(--sk-line-strong); color: var(--sk-text-primary);
}
.sk-btn.ghost:hover { border-color: var(--sk-accent); }
.sk-btn svg, .pf-btn svg, .dc-dl svg, .setka-cat-card .cmd svg { width: 15px; height: 15px; flex: 0 0 auto; }

/* ── Barre de filtres (LOT 4 — /documents) ────────────────────────────────── */
.sk-filters {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--sk-space-4);
  margin: 0 0 var(--sk-space-5); padding: var(--sk-space-4) var(--sk-space-5);
  border-radius: var(--sk-radius-xl);
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 40%), var(--sk-glass-subtle-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-subtle-blur)) saturate(var(--sk-glass-subtle-sat));
  backdrop-filter: blur(var(--sk-glass-subtle-blur)) saturate(var(--sk-glass-subtle-sat));
  border: 1px solid var(--sk-glass-subtle-border);
  box-shadow: var(--sk-shadow-md), inset 0 1px 0 var(--sk-glass-highlight);
}
/* `hidden` doit l'emporter sur `display:flex` — sinon la barre reste visible
   quand il n'y a rien à filtrer (piège déjà rencontré sur le hub AMV). */
.sk-filters[hidden] { display: none; }
.sk-filters .f { display: flex; flex-direction: column; gap: 5px; min-width: 132px; }
.sk-filters label {
  font-family: var(--sk-mono); font-size: 9.5px; letter-spacing: var(--sk-tracking-caps);
  text-transform: uppercase; color: var(--sk-text-mute); margin: 0;
}
.sk-filters select {
  font-family: var(--sk-sans); font-size: 13px; padding: 7px 10px;
  border-radius: var(--sk-radius-md);
  background: var(--sk-glass-medium-bg); border: 1px solid var(--sk-line-strong);
  color: var(--sk-text-primary); cursor: pointer;
}
.sk-filters select:focus {
  outline: none; border-color: var(--sk-accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--sk-primary) 25%, transparent);
}
/* Les <option> héritent du fond système : sans fond explicite, la liste
   déroulante est illisible en thème sombre. */
.sk-filters option { background: var(--sk-surface-solid); color: var(--sk-text-primary); }
.sk-filters__reset {
  font-family: var(--sk-mono); font-size: 10px; letter-spacing: var(--sk-tracking-wide);
  text-transform: uppercase; padding: 8px 14px; border-radius: var(--sk-radius-full);
  background: transparent; border: 1px dashed var(--sk-line-strong);
  color: var(--sk-text-tertiary); cursor: pointer;
  transition: border-color var(--sk-dur-fast), color var(--sk-dur-fast);
}
.sk-filters__reset:hover { border-color: var(--sk-accent); color: var(--sk-text-primary); }
.sk-filters__count {
  margin-left: auto; align-self: center;
  font-family: var(--sk-mono); font-size: 11px; color: var(--sk-text-mute);
}

/* Méta de carte document : code + type + taille */
.dc-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sk-space-2); margin-top: 2px; }
.dc-code {
  font-family: var(--sk-mono); font-size: 10px; letter-spacing: .12em;
  text-transform: uppercase; color: var(--sk-eyebrow);
}
.dc-tag {
  font-family: var(--sk-mono); font-size: 9.5px; letter-spacing: .06em;
  padding: 2px 7px; border-radius: var(--sk-radius-sm);
  border: 1px solid var(--sk-line); color: var(--sk-text-mute);
}

/* ── États vides des pages ────────────────────────────────────────────────── */
.sk-empty, .dc-empty, .nw-empty, .ap-empty, .pf-empty, .setka-cat-gate {
  font-family: var(--sk-sans);
  background: none;
  border: 1px dashed var(--sk-line-strong);
  border-radius: var(--sk-radius-xl);
  box-shadow: none;
  padding: 38px 24px; text-align: center; color: var(--sk-text-tertiary);
}
.sk-empty a, .dc-empty a, .setka-cat-gate a { color: var(--sk-accent); font-weight: 600; }

/* ── Modale de détail (abonnements, offres…) ──────────────────────────────── */
.sk-modal-bg {
  position: fixed; inset: 0; background: rgba(4, 2, 18, .72); z-index: var(--sk-z-modal);
  display: none; align-items: center; justify-content: center; padding: 20px;
}
.sk-modal-bg.open { display: flex; }
.sk-modal {
  position: relative; overflow: hidden;
  max-width: 520px; width: 100%; border-radius: var(--sk-radius-xl);
  background: linear-gradient(180deg, var(--sk-glass-sheen-top), transparent 28%), var(--sk-glass-strong-bg);
  -webkit-backdrop-filter: blur(var(--sk-glass-strong-blur)) saturate(var(--sk-glass-strong-sat));
  backdrop-filter: blur(var(--sk-glass-strong-blur)) saturate(var(--sk-glass-strong-sat));
  border: 1px solid var(--sk-glass-strong-border);
  box-shadow: var(--sk-shadow-xl), inset 0 1px 0 var(--sk-glass-highlight), var(--sk-glass-edge);
  animation: sk-pop .16s var(--sk-ease-silk);
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .sk-modal { background: var(--sk-surface-solid); }
}
.sk-modal::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--sk-bar); z-index: 1; }
.sk-modal .hd { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 26px 26px 6px; }
.sk-modal .hd h3 {
  font-family: var(--sk-serif); font-style: italic; font-weight: 400;
  font-size: 1.6rem; color: var(--sk-text-primary); margin: 0; line-height: 1.15;
}
.sk-modal .x {
  background: none; border: none; font-size: 1.6rem; line-height: 1;
  color: var(--sk-text-tertiary); cursor: pointer; padding: 0 2px;
}
.sk-modal .x:hover { color: var(--sk-text-primary); }
.sk-modal .bd { padding: 8px 26px 18px; }
.sk-modal .ft {
  padding: 14px 26px 22px; display: flex; gap: 10px; justify-content: flex-end;
  border-top: 1px solid var(--sk-line);
}
.sk-note {
  font-family: var(--sk-sans); font-size: 13.5px; line-height: 1.55; color: var(--sk-text-secondary);
  margin: 14px 0 0; padding: 12px 14px;
  background: color-mix(in srgb, var(--sk-primary) 14%, transparent);
  border: 1px solid var(--sk-line); border-radius: var(--sk-radius-md);
}

/* ── Éditeur de texte riche (Quill) ──────────────────────────────────────────
   Le champ « Description » du formulaire de ticket est un Text Editor : il
   n'hérite d'aucun de nos styles de champ (ce n'est ni un input ni un textarea)
   et restait donc en gris clair, illisible sur le verre sombre. */
html body:not([data-path="login"]) .ql-toolbar.ql-snow {
  background: var(--sk-glass-medium-bg);
  border: 1px solid var(--sk-line-strong) !important;
  border-bottom: none !important;
  border-radius: var(--sk-radius-md) var(--sk-radius-md) 0 0;
}
html body:not([data-path="login"]) .ql-container.ql-snow {
  background: var(--sk-glass-subtle-bg);
  border: 1px solid var(--sk-line-strong) !important;
  border-radius: 0 0 var(--sk-radius-md) var(--sk-radius-md);
  color: var(--sk-text-primary);
  font-family: var(--sk-sans);
}
html body:not([data-path="login"]) .ql-editor { color: var(--sk-text-primary); min-height: 160px; }
html body:not([data-path="login"]) .ql-editor.ql-blank::before {
  color: var(--sk-text-mute); font-style: normal;
}
/* Les icônes de la barre d'outils sont des traits/aplats SVG : sans ces deux
   règles elles restent noires sur fond sombre. */
html body:not([data-path="login"]) .ql-snow .ql-stroke { stroke: var(--sk-text-secondary); }
html body:not([data-path="login"]) .ql-snow .ql-fill,
html body:not([data-path="login"]) .ql-snow .ql-stroke.ql-fill { fill: var(--sk-text-secondary); }
html body:not([data-path="login"]) .ql-snow .ql-picker { color: var(--sk-text-secondary); }
html body:not([data-path="login"]) .ql-snow .ql-picker-options {
  background: var(--sk-surface-solid);
  border: 1px solid var(--sk-line-strong);
  border-radius: var(--sk-radius-md);
  box-shadow: var(--sk-shadow-lg);
}
html body:not([data-path="login"]) .ql-snow .ql-picker-item { color: var(--sk-text-secondary); }
html body:not([data-path="login"]) .ql-snow.ql-toolbar button:hover .ql-stroke,
html body:not([data-path="login"]) .ql-snow.ql-toolbar button.ql-active .ql-stroke { stroke: var(--sk-accent); }
html body:not([data-path="login"]) .ql-snow.ql-toolbar button:hover .ql-fill,
html body:not([data-path="login"]) .ql-snow.ql-toolbar button.ql-active .ql-fill { fill: var(--sk-accent); }
html body:not([data-path="login"]) .ql-snow a { color: var(--sk-accent); }

/* Encart d'aide injecté sur /issues (cf. setka-portail.js) */
.sk-hint {
  font-family: var(--sk-sans); font-size: 12.5px; color: var(--sk-text-secondary);
  background: color-mix(in srgb, var(--sk-primary) 16%, transparent);
  border: 1px solid var(--sk-line); border-left: 3px solid var(--sk-accent);
  border-radius: var(--sk-radius-md); padding: 9px 12px; margin: 0 0 10px;
}


/* =============================================================================
   9. MOBILE
   -----------------------------------------------------------------------------
   RF-5 : l'ancienne media query forçait `background:rgba(255,255,255,.95)` sur
   main.container, .web-sidebar et .navbar — « plus de cartes blanches » y était
   donc faux. On garde ici les surfaces du THÈME COURANT ; seul le blur tombe,
   pour la performance sur mobile, remplacé par une surface pleine équivalente.
   ============================================================================= */

@media (max-width: 800px) {
  /* Menu en tiroir hors-écran */
  html.setka-has-sidenav body:not([data-path="login"]) { padding-left: 0; }
  .setka-sidenav { width: 252px; transform: translateX(-100%); }
  html.sk-open .setka-sidenav { transform: none; box-shadow: 0 0 60px rgba(0, 0, 0, .6); }
  html.sk-open .sk-backdrop { display: block; }

  html body:not([data-path="login"]) main.container { border-radius: var(--sk-radius-xl); padding: 24px 18px; }
  html body:not([data-path="login"]) .web-sidebar { position: static; margin-bottom: 16px; }

  /* Le blur tombe, la teinte du thème reste. */
  .sk-card, .dc-card, .ap-card, .nw-item, .pf-card, .pf-hero,
  .setka-cat-card, .sk-kpi, .sk-contact, .sk-summary, .sk-modal,
  html body:not([data-path="login"]) .web-list-item,
  html body:not([data-path="login"]) .web-form-wrapper {
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;
    background: color-mix(in srgb, var(--sk-surface-solid) 92%, transparent) !important;
  }
}

/* Le mobile n'a pas de menu latéral fixe : le bouton de repli n'y a pas de sens,
   c'est le bouton hamburger de la navbar (injecté en JS) qui ouvre le tiroir. */
@media (max-width: 800px) { .sk-nav-toggle { display: none; } }
.sk-drawer-open {
  display: none; background: color-mix(in srgb, var(--sk-primary) 22%, transparent);
  border: 1px solid var(--sk-line-strong); cursor: pointer; padding: 7px;
  border-radius: var(--sk-radius-md); color: var(--sk-text-primary); align-items: center;
}
.sk-drawer-open svg { width: 22px; height: 22px; stroke: currentColor; fill: none; }
@media (max-width: 800px) { .sk-drawer-open { display: inline-flex; } }


/* =============================================================================
   10. ACCESSIBILITÉ
   ============================================================================= */

@media (prefers-reduced-motion: reduce) {
  html body:not([data-path="login"]) *,
  html body:not([data-path="login"]) *::before,
  html body:not([data-path="login"]) *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
  a.sk-card:hover, .dc-card:hover, .ap-card:hover, .setka-cat-card:hover,
  .sk-abo:hover, body:not([data-path="login"]) .web-list-item:hover { transform: none; }
}
