/* ---------------------------------------------------------------------------
 * pl4y-tokens.css — palette et identite visuelle de TOUT pl4y.store.
 *
 * SOURCE UNIQUE. Ce fichier est :
 *   - injecte dans la page d'accueil par build.mjs (placeholder __THEME_TOKENS__
 *     dans worker.template.js) ;
 *   - prefixe a pl4y-doc.css par docs/skin.mjs, dans chaque arbre documentaire.
 * Modifier la palette ici la change partout, d'un coup. Ne pas redefinir ces
 * variables ailleurs.
 *
 * THEME "NOCTURNE" — celui de la page de garde (osmo-operator-desktop.iso,
 * claude.ai/design). Fond bleu-nuit, accent lavande, police Inter, coins nets,
 * ombres douces (fines bagues + halos discrets). TOUT le site partage cette
 * grammaire : accueil, wiki, et les cinq arbres documentaires.
 *
 * SOMBRE PAR DEFAUT — la page de garde est sombre par construction, donc le
 * reste du site l'est aussi. La bascule (cle localStorage `pl4y-theme`) offre
 * une variante claire pour les pages documentaires ; l'accueil, lui, reste
 * Nocturne quel que soit le choix (son corps utilise les --color-* fixes).
 *
 * Les anciens noms de variables du theme sketchy (--sk-*, --sk-rough*,
 * --sk-grid) sont conserves mais remappes sur la grammaire Nocturne : plusieurs
 * feuilles y font encore reference (fond quadrille, coins traces a la main), on
 * les neutralise ici plutot que de toucher a chaque regle.
 * ------------------------------------------------------------------------- */

@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&display=swap');

/* =============================== SOMBRE (defaut) ========================= */
:root {
  /* --- palette Nocturne (identique au :root --color-* de la page de garde) --- */
  --nc-bg:#161826;
  --nc-surface:#232532;
  --nc-text:#e9e9ed;
  --nc-accent:#9184d9;
  --nc-accent-2:#a7a1db;
  --nc-accent-400:#b5abfc;
  --nc-neutral-700:#595d6c;
  --nc-neutral-800:#3f424d;
  --nc-neutral-900:#1b1d2a;

  /* Coins nets et reguliers (fini les rayons asymetriques "traces main"). */
  --sk-rough:12px;
  --sk-rough2:999px;      /* pilules de la barre de navigation */
  --sk-grid:transparent;  /* plus de papier quadrille : fond Nocturne uni */
  /* Alias du vieux vocabulaire sketchy, remappes sur Nocturne. Les bundles
     Quarto embarquent leur PROPRE sketchy.css qui dessine avec ces variables ;
     pl4y-doc.css se charge APRES, donc ces valeurs-ci gagnent et le bundle
     devient Nocturne sans le retoucher. (Les fonds codes en dur `#fff` du
     sketchy.css, eux, sont surcharges explicitement dans pl4y-doc.css.) */
  --sk-ink:var(--fg);
  --sk-paper:var(--bg);
  --sk-yellow:var(--accent);
  --sk-red:var(--red);
  --sk-teal:var(--accent-2);

  /* --- tokens du site, remappes sur la palette Nocturne --- */
  --bg:var(--nc-bg); --bg-2:#1c1e2b; --panel:var(--nc-surface);
  --border:color-mix(in srgb, var(--nc-text) 14%, transparent);
  --fg:var(--nc-text); --muted:#a7abbd;
  --accent:var(--nc-accent); --accent-2:var(--nc-accent-2);
  --green:#4fd6c4; --yellow:#e0b64a; --red:#ff8a5c;
  --code-bg:var(--nc-neutral-900); --code-fg:var(--nc-text);
  --btn-bg:#2b2d3c; --btn-hover:#343650;
  /* Halos radiaux Nocturne : discrets, derriere le contenu. */
  --glow-1:color-mix(in srgb, #2b2741 75%, transparent);
  --glow-2:color-mix(in srgb, black 30%, transparent);
  /* Ombres DOUCES : une fine bague + une ombre portee floue. */
  --shadow:0 0 0 1px color-mix(in srgb, var(--nc-text) 10%, transparent);
  --shadow-lg:0 10px 34px rgba(0,0,0,.45),
              0 0 0 1px color-mix(in srgb, var(--nc-text) 14%, transparent);
  --on-accent:#ffffff; --on-green:#161826;

  --mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  --sans:'Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif;
  --display:'Inter',system-ui,sans-serif;
}

/* =============================== CLAIR (bascule) ======================== */
/* Variante claire des memes tokens, teintee lavande pour rester dans la
 * famille Nocturne. Ne s'applique qu'aux pages documentaires : le corps de
 * l'accueil est fige en sombre. */
:root[data-theme="light"] {
  --bg:#f6f6fb; --bg-2:#ffffff; --panel:#ffffff;
  --border:#e4e4f0;
  --fg:#1c1e2b; --muted:#5a6070;
  --accent:#6f63c9; --accent-2:#7d76c6;
  --green:#12786e; --yellow:#a16207; --red:#d1492b;
  --code-bg:#f1f1f8; --code-fg:#1c1e2b;
  --btn-bg:#ecebf7; --btn-hover:#e0def3;
  --sk-grid:transparent;
  --glow-1:transparent; --glow-2:transparent;
  --shadow:0 0 0 1px #e4e4f0;
  --shadow-lg:0 10px 30px rgba(31,30,54,.12), 0 0 0 1px #e4e4f0;
  --on-accent:#ffffff; --on-green:#ffffff;
}

/* --------------------------------------------------- traits structurels ---
 * L'accueil et les sections partagent exactement le meme fond et la meme
 * famille de titres. Pose ici (et pas dans chaque feuille) pour un grain
 * identique partout.
 * ------------------------------------------------------------------------ */

/* Fond Nocturne : deux halos radiaux tres doux sur le bleu-nuit, comme la page
   de garde. Remplace l'ancien papier quadrille. */
.pl4y-paper {
  background-color:var(--bg);
  background-image:
    radial-gradient(1200px 720px at 82% -160px, var(--glow-1), transparent 60%),
    radial-gradient(1100px 800px at -10% 100%, var(--glow-2), transparent 55%);
  background-attachment:fixed;
}

/* Titres Inter (le theme manuscrit Caveat est retire). `font-synthesis:none`
   garde un rendu net avant que la fonte soit chargee. */
.pl4y-display {
  font-family:var(--display);
  font-weight:600;
  font-synthesis:none;
  letter-spacing:-.015em;
}

/* Bouton "Quick start" du bandeau : meme forme que les autres onglets mais
   accentue (lavande) pour ressortir. Defini ici pour couvrir les trois copies
   de la barre (accueil, wiki, pages documentaires) d'un seul endroit. */
.pl4y-bar nav a.pl4y-quick,
.pl4y-bar nav a.pl4y-quick:hover {
  color:var(--on-accent);
  background:var(--accent);
  border-color:var(--accent);
  font-weight:600;
}
.pl4y-bar nav a.pl4y-quick:hover { filter:brightness(1.08); }

/* ---------------------------------------------------------------------------
 * pl4y-doc.css — skin commun des docs servies sur pl4y.store
 *
 * Reprend a l'identique les tokens et le rendu de la page principale
 * (worker.template.js) et les applique aux trois chaines de rendu :
 *   - Quarto / Bootstrap  (qemu-calypso : calypso-full.qmd)
 *   - Sphinx / RTD        (software-defined-radio)
 *   - pandoc + template   (bbaranoff.github.io)
 *
 * Charge APRES le theme natif : tout est en surcharge.
 * ------------------------------------------------------------------------- */

/* Les tokens (:root, palette Nocturne, polices) vivent dans pl4y-tokens.css,
 * que docs/skin.mjs prefixe a ce fichier au moment d'ecrire pl4y-doc.css dans
 * chaque arbre. Ne pas les redefinir ici : la page d'accueil consomme la meme
 * source et les deux divergeraient. */

/* ------------------------------------------------------------------- base -- */
html { scroll-behavior:smooth; }
body {
  background-color:var(--bg) !important;
  /* Fond Nocturne : les memes halos radiaux que la page de garde. */
  background-image:
    radial-gradient(1200px 720px at 82% -160px, var(--glow-1), transparent 60%),
    radial-gradient(1100px 800px at -10% 100%, var(--glow-2), transparent 55%) !important;
  background-attachment:fixed !important;
  color:var(--fg) !important;
  font-family:var(--sans) !important;
  line-height:1.65;
  -webkit-font-smoothing:antialiased;
}
h1, h2, h3, h4, h5, h6 { color:var(--fg); font-family:var(--sans); }
/* Titres Inter (theme Nocturne), sans police manuscrite. */
h1, h2 { font-family:var(--display) !important; font-synthesis:none;
         letter-spacing:0 !important; }
h1 { font-size:clamp(1.7rem,4vw,2.3rem); font-weight:700; letter-spacing:-.025em;
     line-height:1.15; margin:0 0 .8rem; }
h2 { font-size:1.32rem; font-weight:700; letter-spacing:-.015em;
     margin:2.6rem 0 .7rem; padding-top:1.1rem; border-top:1px solid var(--border);
     scroll-margin-top:1.4rem; }
h3 { font-size:1.04rem; color:var(--accent); margin:1.5rem 0 .4rem; letter-spacing:-.01em; }
h4, h5, h6 { font-size:.95rem; color:var(--muted); text-transform:uppercase;
             letter-spacing:.08em; margin:1.2rem 0 .3rem; }
p, li, td, th, dd, dt { color:var(--fg); }
a { color:var(--accent); text-underline-offset:.18em; transition:color .15s ease; }
a:hover, a:focus { color:var(--accent-2); }
hr { border:0; border-top:1px solid var(--border); margin:2rem 0; }
::selection { background:color-mix(in srgb, var(--accent) 28%, transparent); }
img { max-width:100%; height:auto; }
blockquote {
  border-left:3px solid var(--accent); background:color-mix(in srgb, var(--accent) 8%, transparent);
  padding:.8rem 1.1rem; border-radius:0 10px 10px 0; margin:1.1rem 0; color:var(--fg);
}

/* ------------------------------------------------------------------- code -- */
code, kbd, samp, tt {
  font-family:var(--mono) !important; font-size:.86em;
  background:var(--code-bg); border:1px solid var(--border); border-radius:5px;
  padding:.08rem .36rem; color:var(--code-fg);
}
pre, div.sourceCode, div.highlight, .highlight pre {
  background:var(--code-bg) !important; border:1px solid var(--border) !important;
  border-radius:12px !important; color:var(--code-fg) !important;
  box-shadow:none !important;
}
pre { padding:1.05rem 1.15rem; overflow-x:auto; font-size:.82rem; line-height:1.55; }
pre code, pre > code, div.sourceCode code {
  background:none !important; border:0 !important; padding:0 !important;
  font-size:inherit; color:inherit;
}
div.sourceCode { max-height:72vh; overflow:auto; margin:.9rem 0; }
code span.co { color:var(--muted) !important; font-style:italic; }
code span.kw, code span.cf { color:var(--accent) !important; font-weight:600; }
code span.st, code span.ch { color:var(--green) !important; }
code span.dv, code span.fl, code span.bn { color:var(--accent-2) !important; }
code span.al, code span.er { color:var(--red) !important; }
code span.fu { color:var(--fg) !important; font-weight:600; }
/* numeros de ligne */
pre.numberSource a[href^="#cb"]::before,
code.sourceCode > span > a:first-child::before { color:var(--muted) !important; opacity:.5; }

/* ----------------------------------------------------------------- tables -- */
table, table.table, .rst-content table.docutils, .dataframe {
  border-collapse:separate !important; border-spacing:0; width:100%;
  margin:1rem 0; font-size:.9rem; display:block; overflow-x:auto;
  border:1px solid var(--border) !important; border-radius:12px;
  box-shadow:var(--shadow); background:var(--panel);
}
th, td, .rst-content table.docutils td, .rst-content table.docutils th {
  border:0 !important; border-bottom:1px solid var(--border) !important;
  padding:.55rem .8rem !important; text-align:left; background:transparent !important;
  color:var(--fg) !important; white-space:normal !important;
}
tr:last-child td { border-bottom:0 !important; }
thead th, th {
  background:color-mix(in srgb, var(--accent) 7%, var(--panel)) !important;
  font-size:.76rem; text-transform:uppercase; letter-spacing:.07em; font-weight:700;
}
tbody tr:nth-child(2n) > td { background:transparent !important; }

/* ---------------------------------------------------- callouts / admonitions */
.callout, .admonition, .rst-content .admonition, div.note, div.warning, div.tip {
  border:1px solid var(--border) !important; border-left:3px solid var(--accent) !important;
  background:color-mix(in srgb, var(--accent) 8%, var(--panel)) !important;
  border-radius:0 12px 12px 0 !important; box-shadow:var(--shadow) !important;
  padding:.2rem 0 !important; margin:1.1rem 0 !important; color:var(--fg) !important;
}
.callout-header, .admonition-title, .rst-content .admonition-title {
  background:transparent !important; color:var(--muted) !important;
  font-size:.74rem !important; text-transform:uppercase; letter-spacing:.12em;
  font-weight:700 !important; padding:.6rem 1.1rem .1rem !important; border:0 !important;
}
.callout-body, .callout-body-container, .admonition > p, .rst-content .admonition p {
  padding:.1rem 1.1rem .7rem !important; color:var(--fg) !important;
}
.callout-warning, div.warning, .admonition.warning {
  border-left-color:var(--yellow) !important;
  background:color-mix(in srgb, var(--yellow) 12%, var(--panel)) !important;
}
.callout-important, .callout-caution, div.danger, .admonition.danger {
  border-left-color:var(--red) !important;
  background:color-mix(in srgb, var(--red) 10%, var(--panel)) !important;
}
.callout-tip, div.tip, .admonition.tip, .admonition.hint {
  border-left-color:var(--green) !important;
  background:color-mix(in srgb, var(--green) 10%, var(--panel)) !important;
}
.callout .callout-icon-container, .callout .callout-icon { display:none !important; }

/* --------------------------------------------------------- barre pl4y (top) */
.pl4y-bar {
  position:sticky; top:0; z-index:1050; display:flex; align-items:center;
  gap:.8rem; flex-wrap:wrap;
  padding:.55rem clamp(.8rem,3vw,1.6rem);
  background:color-mix(in srgb, var(--panel) 88%, transparent);
  backdrop-filter:blur(12px);
  border-bottom:1px solid var(--border);
  font-family:var(--sans); font-size:.88rem;
}
.pl4y-bar .pl4y-home { font-weight:800; letter-spacing:-.02em; text-decoration:none;
  color:var(--fg); font-size:1rem; }
.pl4y-bar .pl4y-home .dot { color:var(--accent-2); }
.pl4y-bar nav { display:flex; gap:.4rem; flex-wrap:wrap; }
.pl4y-bar nav a {
  text-decoration:none; color:var(--muted); padding:.22rem .6rem;
  border:1px solid transparent; border-radius:999px; font-size:.82rem;
  transition:background .15s ease, color .15s ease, border-color .15s ease;
}
.pl4y-bar nav a:hover { color:var(--fg); background:var(--btn-bg); border-color:var(--border); }
.pl4y-bar nav a[aria-current="page"] {
  color:var(--fg); background:var(--btn-bg); border-color:var(--border); font-weight:600;
}
.pl4y-bar .spacer { flex:1; }
.pl4y-toggle {
  background:var(--panel); color:var(--fg); border:1px solid var(--border);
  border-radius:999px; padding:.32rem .8rem; font-size:.82rem; cursor:pointer;
  font-family:inherit; line-height:1; box-shadow:var(--shadow);
  transition:transform .15s ease, background .15s ease;
}
.pl4y-toggle:hover { background:var(--btn-hover); transform:translateY(-1px); }

/* ------------------------------------------------------ template pandoc pl4y */
.pl4y-doc { max-width:960px; margin:0 auto; padding:2rem 1rem 3rem; }
.pl4y-doc > header.title-block { margin-bottom:1.6rem; }
.pl4y-doc .subtitle { color:var(--muted); font-size:1.02rem; }
.pl4y-doc #TOC, .pl4y-doc nav#TOC {
  background:var(--panel); border:1px solid var(--border); border-radius:14px;
  padding:1.1rem 1.3rem; margin:0 0 1.6rem; box-shadow:var(--shadow);
}
.pl4y-doc #TOC > ul { margin:0; padding:0; list-style:none; columns:2; column-gap:1.6rem; }
.pl4y-doc #TOC ul ul { list-style:none; padding-left:1rem; }
.pl4y-doc #TOC li { break-inside:avoid; font-size:.92rem; margin:.1rem 0; }
.pl4y-doc #TOC a { text-decoration:none; }
.pl4y-doc #TOC a:hover { text-decoration:underline; }
@media (max-width:640px) { .pl4y-doc #TOC > ul { columns:1; } }
.pl4y-doc footer.pl4y-footer {
  color:var(--muted); font-size:.82rem; margin-top:3rem;
  border-top:1px solid var(--border); padding:1.1rem 0 2rem;
}
/* index de repertoire genere */
.pl4y-index { list-style:none; padding:0; margin:1rem 0; display:grid;
  grid-template-columns:repeat(auto-fill,minmax(15rem,1fr)); gap:.6rem; }
.pl4y-index li { margin:0; }
.pl4y-index a {
  display:block; background:var(--panel); border:1px solid var(--border);
  border-radius:12px; padding:.7rem .9rem; text-decoration:none; color:var(--fg);
  box-shadow:var(--shadow); transition:box-shadow .18s ease, transform .18s ease;
}
.pl4y-index a:hover { box-shadow:var(--shadow-lg); transform:translateY(-1px); color:var(--fg); }
.pl4y-index .meta { display:block; color:var(--muted); font-size:.78rem; margin-top:.15rem; }

/* --------------------------------------------------------- Quarto / Bootstrap */
body.quarto-light, body.quarto-dark { background:transparent; }
#quarto-content, main.content, .page-columns { background:transparent !important; }
#quarto-sidebar, .sidebar.sidebar-navigation, #quarto-margin-sidebar {
  background:color-mix(in srgb, var(--panel) 92%, transparent) !important;
  border-right:1px solid var(--border) !important; color:var(--fg) !important;
}
#quarto-sidebar .sidebar-item-text, #quarto-sidebar a,
#quarto-margin-sidebar a, nav[role="doc-toc"] a {
  color:var(--muted) !important; text-decoration:none; font-size:.88rem;
}
#quarto-sidebar a:hover, nav[role="doc-toc"] a:hover { color:var(--accent) !important; }
#quarto-sidebar a.active, nav[role="doc-toc"] a.active {
  color:var(--fg) !important; font-weight:650;
  border-left:2px solid var(--accent) !important;
}
nav[role="doc-toc"] > h2, .sidebar-title, #toc-title {
  color:var(--muted) !important; font-size:.74rem !important; text-transform:uppercase;
  letter-spacing:.12em; font-weight:700 !important;
}
.navbar, .quarto-title-banner {
  background:color-mix(in srgb, var(--panel) 88%, transparent) !important;
  border-bottom:1px solid var(--border) !important; color:var(--fg) !important;
}
.navbar .navbar-brand, .navbar a { color:var(--fg) !important; }
h1.title {
  font-family:var(--sans) !important; font-size:clamp(1.9rem,4.4vw,2.6rem) !important;
  font-weight:800 !important; letter-spacing:-.03em; color:var(--fg) !important;
  background:none !important; border:0 !important; box-shadow:none !important;
  transform:none !important; padding:0 !important; display:block !important;
}
.quarto-title .quarto-categories .quarto-category {
  background:var(--btn-bg) !important; border:1px solid var(--border) !important;
  color:var(--muted) !important; border-radius:999px !important;
}
.code-with-filename .code-with-filename-file {
  font-family:var(--mono) !important; font-size:.76rem !important; font-weight:600 !important;
  background:color-mix(in srgb, var(--accent) 10%, var(--panel)) !important;
  color:var(--muted) !important; border:1px solid var(--border) !important;
  border-bottom:0 !important; border-radius:10px 10px 0 0 !important;
  transform:none !important; padding:.35em .9em !important; letter-spacing:.02em;
}
.code-with-filename .code-with-filename-file + .sourceCode,
.code-with-filename div.sourceCode { border-radius:0 0 12px 12px !important; margin-top:0 !important; }
.code-copy-button { color:var(--muted) !important; }
.anchorjs-link { color:var(--muted) !important; }
/* meta par fichier + compteur de section (bundle calypso) */
.file-meta { color:var(--muted); font-size:.78rem; margin:-.2rem 0 .5rem; }
.file-meta .tag {
  font-family:var(--mono); font-size:.72rem; background:var(--btn-bg);
  border:1px solid var(--border); border-radius:999px; padding:.05rem .5rem;
  margin-right:.4rem; color:var(--muted);
}
.section-count { color:var(--muted); font-size:.85rem; margin:.2rem 0 1rem; }
/* champ de filtre (sk-filter.html) */
.sk-filter { margin:1rem 0 1.4rem; }
#sk-filter {
  width:100%; max-width:34rem; font-family:var(--mono); font-size:.9rem;
  background:var(--code-bg); color:var(--fg);
  border:1px solid var(--border); border-radius:10px; padding:.6rem .9rem;
  transition:border-color .15s ease;
}
#sk-filter:focus {
  outline:none; border-color:var(--accent);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);
}
#sk-filter::placeholder { color:var(--muted); }

/* -------------------------------------------------------------- Sphinx / RTD */
.wy-nav-side, .wy-side-nav-search, .wy-menu-vertical, .wy-nav-top {
  background:var(--panel) !important; border-right:1px solid var(--border);
}
.wy-side-nav-search { border-bottom:1px solid var(--border); }
.wy-side-nav-search > a, .wy-side-nav-search .wy-dropdown > a { color:var(--fg) !important; font-weight:800; }
.wy-side-nav-search input[type="text"] {
  background:var(--code-bg) !important; color:var(--fg) !important;
  border:1px solid var(--border) !important; border-radius:10px !important;
}
.wy-menu-vertical a, .wy-menu-vertical li.toctree-l1 a, .wy-menu-vertical li a {
  color:var(--muted) !important; font-size:.88rem;
}
.wy-menu-vertical a:hover { background:var(--btn-bg) !important; color:var(--fg) !important; }
.wy-menu-vertical li.current, .wy-menu-vertical li.current > a,
.wy-menu-vertical li.toctree-l1.current > a {
  background:transparent !important; color:var(--fg) !important;
  border-left:2px solid var(--accent) !important; font-weight:650;
}
.wy-menu-vertical li.current a { border-right:0 !important; }
/* RTD peint en dur les niveaux imbriques (#fcfcfc / #c9c9c9 / #bdbdbd) et le
   texte en #404040 : illisible sur fond sombre, on neutralise les deux. */
.wy-menu-vertical li.toctree-l2, .wy-menu-vertical li.toctree-l3,
.wy-menu-vertical li.toctree-l4, .wy-menu-vertical li.current ul,
.wy-menu-vertical li.toctree-l2.current > a,
.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a,
.wy-menu-vertical li.toctree-l3.current > a,
.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a {
  background:transparent !important; color:var(--muted) !important;
}
.wy-menu-vertical li.current > a, .wy-menu-vertical li.on a {
  background:var(--btn-bg) !important; color:var(--fg) !important;
}
.wy-menu-vertical li.toctree-l2 a:hover, .wy-menu-vertical li.toctree-l3 a:hover {
  background:var(--btn-hover) !important; color:var(--fg) !important;
}
.wy-menu-vertical p.caption, .wy-menu-vertical .caption-text {
  color:var(--muted) !important; font-size:.72rem; text-transform:uppercase; letter-spacing:.12em;
}
/* Ne PAS inclure .wy-body-for-nav ici : c'est le <body>, et le rendre
   transparent effacerait le fond de la page (texte clair sur canvas blanc). */
.wy-nav-content-wrap { background:transparent !important; }
.wy-nav-content { background:transparent !important; max-width:960px; padding:1.6rem 2rem 3rem; }
/* Le theme RTD force color:#404040 sur tout le corps : invisible en sombre. */
.rst-content, .rst-content .section, .rst-content section, .document,
.rst-content p, .rst-content li, .rst-content dd, .rst-content dt,
.rst-content blockquote, .rst-content strong, .rst-content em,
.rst-content h1, .rst-content h2, .rst-content h3, .rst-content h4,
.rst-content h5, .rst-content h6, .rst-content .toctree-wrapper p.caption,
.wy-plain-list-disc li, .wy-nav-content-wrap .wy-nav-content {
  color:var(--fg) !important;
}
.rst-content a, .rst-content a:visited { color:var(--accent) !important; }
.rst-content a:hover { color:var(--accent-2) !important; }
.rst-content .highlight, .rst-content pre.literal-block {
  background:var(--code-bg) !important; border:1px solid var(--border) !important;
  border-radius:12px !important;
}
.rst-content code.literal, .rst-content tt.literal {
  background:var(--code-bg) !important; border:1px solid var(--border) !important;
  color:var(--accent) !important;
}
.rst-content .toctree-wrapper > p.caption, .rst-content h1, .rst-content h2 { color:var(--fg) !important; }
.rst-versions, .rst-footer-buttons .btn, .btn-neutral, .btn {
  background:var(--btn-bg) !important; color:var(--fg) !important;
  border:1px solid var(--border) !important; border-radius:10px !important;
  box-shadow:none !important; text-shadow:none !important;
}
.btn-neutral:hover, .btn:hover { background:var(--btn-hover) !important; color:var(--fg) !important; }
footer, .rst-footer-buttons, .rst-content div[role="contentinfo"] { color:var(--muted) !important; }
.wy-breadcrumbs, .wy-breadcrumbs li a { color:var(--muted) !important; }
.wy-breadcrumbs-aside { display:none; }
.rst-content .headerlink { color:var(--muted) !important; opacity:.4; }
.rst-content .headerlink:hover { opacity:1; color:var(--accent) !important; }

@media (prefers-reduced-motion:reduce) {
  html { scroll-behavior:auto; }
  * { transition:none !important; }
}

/* --------------------------------------------------------------------------
   Sommaire de section (injecte par unify.mjs dans /bbaranoff/).
   Le depot Jekyll portait sa nav dans _includes/, non joue ici : sans ce bloc,
   la page de garde ne mene nulle part.
   -------------------------------------------------------------------------- */
.pl4y-sect {
  margin:0 0 1.8rem; padding:.85rem 1.1rem;
  background:var(--panel); border:1px solid var(--border); border-radius:14px;
  box-shadow:var(--shadow); font-size:.9rem;
}
.pl4y-sect-head {
  font-family:var(--mono); font-size:.74rem; letter-spacing:.08em;
  text-transform:uppercase; color:var(--muted); margin-bottom:.55rem;
}
.pl4y-sect-grp { border-top:1px solid var(--border); }
.pl4y-sect-grp:first-of-type { border-top:0; }
.pl4y-sect-grp > summary {
  cursor:pointer; padding:.4rem .1rem; list-style:none; font-weight:600;
  display:flex; align-items:center; gap:.5rem;
}
.pl4y-sect-grp > summary::-webkit-details-marker { display:none; }
.pl4y-sect-grp > summary::before {
  content:"›"; display:inline-block; color:var(--muted);
  transition:transform .15s ease; transform:rotate(0deg); width:.7em;
}
.pl4y-sect-grp[open] > summary::before { transform:rotate(90deg); }
.pl4y-sect-grp > summary:hover { color:var(--accent); }
.pl4y-sect-grp .n {
  font-family:var(--mono); font-size:.72rem; color:var(--muted);
  border:1px solid var(--border); border-radius:999px; padding:0 .45em;
}
.pl4y-sect-grp ul {
  list-style:none; margin:.1rem 0 .6rem; padding:0 0 0 1.2rem;
  display:grid; gap:.18rem; grid-template-columns:repeat(auto-fit,minmax(15rem,1fr));
}
.pl4y-sect-grp li { margin:0; }
.pl4y-sect-grp a { text-decoration:none; }
.pl4y-sect-grp a:hover { text-decoration:underline; }
.pl4y-sect-grp a[aria-current="page"] { font-weight:700; color:var(--fg); }
.pl4y-sect-grp a[aria-current="page"]::after { content:" •"; color:var(--accent); }

/* Pied de page des instantanes de test (/tests/). */
#pl4y-sources { margin:2rem 0 1rem; color:var(--muted); font-size:.92rem; }
#pl4y-sources ul { padding-left:1.2rem; }

/* ===========================================================================
   FINITION NOCTURNE
   ---------------------------------------------------------------------------
   L'ancienne "couche sketchy" (surligneur, rotations, ombres decalees,
   soulignes ondules) est retiree : les regles de base ci-dessus suffisent et
   sont deja aux tokens Nocturne. Ce bloc ne fait qu'ajouter les etats "actif"
   et le survol des cartes, dans la meme grammaire que la page de garde.
   ========================================================================= */

/* Cartes d'index : bordure nette, elevation douce au survol (pas de rotation). */
.pl4y-index a {
  border:1px solid var(--border); border-radius:12px;
  box-shadow:var(--shadow); transition:box-shadow .18s ease, transform .18s ease, border-color .18s ease;
}
.pl4y-index a:hover {
  box-shadow:var(--shadow-lg); transform:translateY(-2px);
  border-color:color-mix(in srgb, var(--accent) 55%, var(--border));
}

/* Sommaire / sidebar : l'entree courante en accent lavande, texte sur accent. */
nav[role="doc-toc"] a.active, #TOC a.active,
.wy-menu-vertical li.current > a, .wy-menu-vertical li.on a {
  background:var(--accent) !important; color:var(--on-accent) !important;
  border-radius:8px !important; border-left:0 !important; padding-inline:.5em !important;
}

/* Onglet "nom de fichier" au-dessus d'un bloc de code (Quarto) : accent discret. */
.code-with-filename .code-with-filename-file {
  background:color-mix(in srgb, var(--accent) 16%, var(--panel)) !important;
  color:var(--fg) !important; border:1px solid var(--border) !important;
  border-bottom:0 !important; border-radius:10px 10px 0 0 !important;
  font-family:var(--mono) !important; font-size:.76rem !important; font-weight:600 !important;
}

/* Titre de page Quarto/pandoc : Inter propre, sans pancarte ni rotation. */
h1.title {
  font-family:var(--display) !important; font-weight:700 !important;
  letter-spacing:-.02em !important; background:none !important; color:var(--fg) !important;
  border:0 !important; box-shadow:none !important; transform:none !important;
  padding:0 !important; display:block !important;
}

/* Colonnes laterales Sphinx / Quarto : filet fin. */
.wy-nav-side, .wy-side-nav-search,
#quarto-sidebar, .sidebar.sidebar-navigation {
  border-right:1px solid var(--border) !important;
}

/* ===========================================================================
   BUNDLES QUARTO → NOCTURNE
   ---------------------------------------------------------------------------
   Les pages Quarto (osmo-operator, qosmo-grgsm) embarquent leur PROPRE
   sketchy.css : pancartes surlignees, fonds papier codes en dur (#fff/#fffef9),
   rotations, soulignes ondules, et une coloration syntaxique pensee pour un
   fond clair (donc illisible sur le bleu-nuit). Les alias --sk-* (pl4y-tokens)
   reglent tout ce qui passe par variable ; ce bloc surcharge le reste — fonds
   en dur, formes, et surtout les jetons de code.
   Charge apres sketchy.css (skin.mjs), donc l'emporte a specificite egale.
   ========================================================================= */

/* --- titres : plus de pancarte, plus de rotation ------------------------- */
h1.title, h1:not(.title), h2, h2.anchored {
  background:none !important; box-shadow:none !important;
  transform:none !important; border:0 !important; border-radius:0 !important;
  display:block !important; padding:0 !important;
  font-family:var(--display) !important;
}
h1:not(.title) { border-bottom:1px solid var(--border) !important; padding-bottom:.2em !important; }
/* Le titre de fichier (h2 <code>...</code>) : un vrai en-tete, code en accent. */
h2.anchored { border-top:1px solid var(--border) !important; padding-top:1.1rem !important;
  margin-top:2.4rem !important; font-size:1.15rem !important; }
h2 code, h2.anchored code { background:none !important; color:var(--accent) !important;
  font-family:var(--mono) !important; padding:0 !important; }
.subtitle, .pl4y-doc .subtitle { transform:none !important; opacity:1 !important; color:var(--muted) !important; }

/* --- blocs de code : cadre net, pas de papier, pas de tilt --------------- */
div.sourceCode, pre:not(.sourceCode), pre {
  background:var(--code-bg) !important; border:1px solid var(--border) !important;
  border-radius:12px !important; box-shadow:none !important; transform:none !important;
}
/* Onglet nom-de-fichier au-dessus d'un bloc : accent discret, pas de Caveat. */
.code-with-filename .code-with-filename-file {
  background:color-mix(in srgb, var(--accent) 16%, var(--panel)) !important;
  color:var(--fg) !important; border:1px solid var(--border) !important;
  border-bottom:0 !important; border-radius:10px 10px 0 0 !important;
  font-family:var(--mono) !important; font-size:.76rem !important; font-weight:600 !important;
  transform:none !important; }

/* --- index de fichiers, filtre, pastilles -------------------------------- */
.bundle-index {
  background:var(--panel) !important; border:1px solid var(--border) !important;
  border-radius:12px !important; box-shadow:var(--shadow) !important;
}
.bundle-index tr:hover { background:color-mix(in srgb, var(--accent) 12%, transparent) !important; }
.section-count {
  background:var(--panel) !important; color:var(--muted) !important;
  border:1px solid var(--border) !important; border-radius:999px !important;
  transform:none !important;
}
.sk-filter { background:var(--bg) !important; }
.sk-filter input {
  background:var(--code-bg) !important; color:var(--fg) !important;
  border:1px solid var(--border) !important; border-radius:10px !important;
  box-shadow:none !important; font-family:var(--mono) !important; font-size:.95rem !important;
}
.sk-filter input:focus { border-color:var(--accent) !important; box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 35%,transparent) !important; }
.file-meta .tag { background:color-mix(in srgb,var(--accent-2) 20%,var(--panel)) !important;
  color:var(--fg) !important; border:1px solid var(--border) !important; }

/* --- liens du corps : souligne net (fini l'ondule) ----------------------- */
.pl4y-doc a, main a, #quarto-content a, .rst-content a {
  text-decoration-style:solid !important; color:var(--accent) !important;
}

/* --- sommaire actif ------------------------------------------------------ */
#TOC a.active, nav[role=doc-toc] a.active, .sidebar a.active {
  background:var(--accent) !important; color:var(--on-accent) !important;
  border-radius:8px !important;
}

/* --- COLORATION SYNTAXIQUE lisible sur fond sombre ----------------------- */
/* Base : tout le texte de code en clair, puis on recolore les jetons. */
pre code, div.sourceCode code, code.sourceCode, .sourceCode span {
  color:var(--code-fg) !important;
}
.sourceCode .co, .sourceCode .cm, .sourceCode .do, .sourceCode .cv {
  color:var(--muted) !important; font-style:italic !important; }
.sourceCode .kw, .sourceCode .cf, .sourceCode .im { color:var(--accent) !important; font-weight:600 !important; }
.sourceCode .st, .sourceCode .ss, .sourceCode .vs, .sourceCode .ch, .sourceCode .sc {
  color:var(--green) !important; }
.sourceCode .dv, .sourceCode .bn, .sourceCode .fl, .sourceCode .cn { color:var(--accent-2) !important; }
.sourceCode .fu { color:#b5abfc !important; }
.sourceCode .dt, .sourceCode .bu, .sourceCode .at { color:var(--yellow) !important; }
.sourceCode .va { color:var(--fg) !important; }
.sourceCode .op, .sourceCode .ot { color:var(--muted) !important; }
.sourceCode .pp, .sourceCode .er, .sourceCode .al, .sourceCode .wa { color:var(--red) !important; }
/* Numeros de ligne */
code.sourceCode > span > a:first-child::before,
pre.numberSource code > span > a:first-child::before { color:var(--muted) !important; opacity:.5 !important; }
