  :root{
    --bg:#141A24;
    --surface:#1D2530;
    --surface-2:#28313F;
    --border:#333E4F;
    --border-soft:#232B37;
    --text:#EAF1FB;
    --text-2:#8FA0BA;
    --text-3:#5C6C85;
    --accent:#5FA8FF;
    --accent-dim:#1D3454;
    --good:#4FBE9C;
    --good-dim:#153230;
    --warn:#E0A94D;
    --warn-dim:#332711;
    --bad:#E2665A;
    --bad-dim:#34201D;
    --rail-w:64px;
    --radius:10px;
    font-family:'Inter', system-ui, sans-serif;
  }

  /* ---------- Thème clair ---------- */
  :root[data-theme="light"]{
    --bg:#F4F6FA;
    --surface:#FFFFFF;
    --surface-2:#EEF2F8;
    --border:#DCE3ED;
    --border-soft:#E7ECF3;
    --text:#182233;
    --text-2:#5B6B82;
    --text-3:#93A1B5;
    --accent:#2F7DE1;
    --accent-dim:#E3EFFE;
    --good:#1F9C7A;
    --good-dim:#E3F7F0;
    --warn:#B9791F;
    --warn-dim:#FBF0DC;
    --bad:#D1453A;
    --bad-dim:#FBE7E5;
  }

  *{ box-sizing:border-box; -webkit-tap-highlight-color:transparent; }
  html,body{ margin:0; padding:0; }
  body{
    background:var(--bg);
    color:var(--text);
    min-height:100vh;
    -webkit-font-smoothing:antialiased;
    overscroll-behavior-y:none;
  }
  h1,h2,h3{ font-family:'Inter', sans-serif; margin:0; letter-spacing:-0.01em; }
  p{ margin:0; }
  button{ font-family:inherit; }
  .num{ font-family:'IBM Plex Mono', ui-monospace, monospace; font-variant-numeric:tabular-nums; }

  /* ---------- App shell ---------- */
  .app{ display:flex; min-height:100vh; }

  /* ---------- Left icon rail ---------- */
  .rail{
    position:fixed;
    top:0; left:0;
    /* Chaîne de secours, du moins fiable au plus fiable :
       1) 100vh : viewport "plein écran théorique" (vieux navigateurs)
       2) 100dvh : viewport dynamique (s'ajuste à la barre d'adresse mobile)
       3) --vh (calculée en JS, voir le <script> "hauteur réelle du
          viewport" dans le <body>) : mesure la hauteur RÉELLEMENT visible
          à l'instant T, y compris la barre de navigation système Android
          en PWA installée — cas où dvh seul ne suffit pas. Cette 3e ligne
          l'emporte dès que le JS a tourné (quelques millisecondes après
          le chargement) ; entre-temps, dvh sert de valeur de repli. */
    height:100vh;
    height:100dvh;
    height:calc(var(--vh, 1vh) * 100);
    width:var(--rail-w);
    background:var(--bg);
    border-right:1px solid var(--border-soft);
    display:flex;
    flex-direction:column;
    align-items:center;
    padding: max(16px, env(safe-area-inset-top)) 0 max(14px, env(safe-area-inset-bottom));
    z-index:40;
  }
  .rail-logo{
    width:30px; height:30px;
    border-radius:8px;
    border:1px solid var(--border);
    color:var(--accent);
    display:flex; align-items:center; justify-content:center;
    font-weight:700;
    font-size:13px;
    margin-bottom:20px;
    flex-shrink:0;
  }
  .rail-nav{
    display:flex;
    flex-direction:column;
    gap:2px;
    width:100%;
    align-items:center;
    overflow-y:auto;
    flex:1;
    min-height:0; /* permet à ce bloc de vraiment rétrécir/scroller au lieu de pousser l'onglet actif et l'avatar hors de l'écran sur les petits écrans */
    scrollbar-width:none;
  }
  .rail-nav::-webkit-scrollbar{ display:none; }
  .rail-divider{
    width:22px;
    height:1px;
    background:var(--border);
    margin:8px 0;
    flex-shrink:0;
  }
  .nav-icon{
    position:relative;
    width:44px; height:44px;
    border-radius:9px;
    border:none;
    background:transparent;
    color:var(--text-3);
    display:flex; align-items:center; justify-content:center;
    cursor:not-allowed;
    flex-shrink:0;
    text-decoration:none;
    transition:background .12s ease, color .12s ease;
  }
  a.nav-icon{ cursor:pointer; }
  a.nav-icon:hover{ background:var(--surface); color:var(--text); }
  .nav-icon svg{ width:18px; height:18px; }
  .nav-icon.is-active{
    background:var(--surface);
    color:var(--accent);
    cursor:default;
  }
  .nav-icon.is-active::before{
    content:"";
    position:absolute;
    left:-9px;
    top:50%; transform:translateY(-50%);
    width:2px; height:16px;
    border-radius:2px;
    background:var(--accent);
  }
  .nav-icon:disabled{ opacity:.62; }

  .nav-icon .tip{
    position:absolute;
    left:54px;
    white-space:nowrap;
    background:var(--surface-2);
    border:1px solid var(--border);
    color:var(--text);
    font-size:12px;
    padding:6px 10px;
    border-radius:7px;
    opacity:0;
    pointer-events:none;
    transform:translateX(-4px);
    transition:opacity .12s ease, transform .12s ease;
    z-index:5;
  }
  .nav-icon:hover .tip, .nav-icon:focus-visible .tip{
    opacity:1;
    transform:translateX(0);
  }

  .rail-foot{
    width:30px; height:30px;
    border-radius:50%;
    background:var(--surface-2);
    border:1px solid var(--border);
    color:var(--text-2);
    display:flex; align-items:center; justify-content:center;
    font-weight:600;
    font-size:12px;
    flex-shrink:0;
    margin-top:10px;
  }

  /* ---------- Main content ---------- */
  .main{
    margin-left:var(--rail-w);
    flex:1;
    min-width:0;
    padding: max(18px, env(safe-area-inset-top)) 16px calc(40px + env(safe-area-inset-bottom));
  }
  .wrap{ max-width:640px; margin:0 auto; }

  /* header */
  .topbar{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:10px;
    margin-bottom:26px;
  }
  .hello h1{ font-size:19px; font-weight:600; }
  .hello .date{ color:var(--text-2); font-size:12.5px; margin-top:3px; }
  .top-actions{ display:flex; align-items:center; gap:6px; }
  .icon-btn{
    width:36px; height:36px;
    border-radius:9px;
    border:1px solid var(--border);
    background:var(--surface);
    display:flex; align-items:center; justify-content:center;
    color:var(--text-2);
    cursor:pointer;
    flex-shrink:0;
    position:relative;
  }
  .icon-btn svg{ width:16px; height:16px; }
  .icon-btn .dot{
    position:absolute; top:7px; right:8px;
    width:6px; height:6px; border-radius:50%;
    background:var(--accent);
    border:1.5px solid var(--surface);
  }

  /* section label */
  .sec-head.with-nav{ align-items:center; }
  .day-nav{
    display:flex;
    align-items:center;
    gap:10px;
  }
  .day-nav-label{
    display:flex;
    flex-direction:column;
    align-items:center;
    gap:3px;
    min-width:0;
  }
  .day-nav-label .day-text{
    font-size:12.5px;
    color:var(--text-2);
    white-space:nowrap;
  }
  .day-nav-label .tag{
    font-size:10px;
    padding:2px 8px;
    order:-1; /* affiche le badge au-dessus de la date, quel que soit l'ordre dans le HTML */
  }
  .nav-arrow{
    width:28px; height:28px;
    border-radius:7px;
    border:1px solid var(--border);
    background:var(--surface);
    color:var(--text-2);
    display:flex; align-items:center; justify-content:center;
    cursor:pointer;
    flex-shrink:0;
    transition:background .12s ease, color .12s ease, opacity .12s ease;
  }
  .nav-arrow svg{ width:14px; height:14px; }
  .nav-arrow:hover:not(:disabled){ background:var(--surface-2); color:var(--text); }
  .nav-arrow:disabled{ opacity:.35; cursor:default; }

  .sched-row{
    padding:13px 16px;
    display:flex;
    align-items:flex-start;
    gap:14px;
    border-bottom:1px solid var(--border);
  }
  .sched-row:last-child{ border-bottom:none; }
  .sched-time{
    width:52px;
    flex-shrink:0;
    display:flex;
    flex-direction:column;
    line-height:1.35;
    padding-top:1px;
  }
  .sched-time .t-start{ font-size:13px; font-weight:600; color:var(--text); }
  .sched-time .t-end{ font-size:11px; color:var(--text-3); }
  .sched-rule{
    width:3px;
    border-radius:2px;
    align-self:stretch;
    flex-shrink:0;
    opacity:.85;
  }
  .sched-body{ flex:1; min-width:0; padding-top:1px; }
  .sched-subject{ display:flex; align-items:center; gap:8px; font-size:14px; font-weight:500; }
  .sched-dot{ width:8px; height:8px; border-radius:50%; flex-shrink:0; }
  .sched-meta{
    display:flex;
    flex-wrap:wrap;
    gap:12px;
    color:var(--text-2);
    font-size:12px;
    margin-top:4px;
  }
  .sched-meta span{ display:flex; align-items:center; gap:5px; }
  .sched-meta svg{ width:12px; height:12px; flex-shrink:0; color:var(--text-3); }
  .sched-badge{
    font-size:10px; font-weight:700; padding:1.5px 7px; border-radius:20px;
    color:#fff; flex-shrink:0; line-height:1.4;
  }
  .sched-badge-modifie{ background:#E0A94D; }
  .sched-badge-dispense{ background:#8BA0B8; }
  .sched-badge-cancelled{ background:#E05F5F; }

  .sched-empty{
    padding:28px 16px;
    text-align:center;
    color:var(--text-2);
    font-size:13px;
  }
  .sched-empty svg{ width:22px; height:22px; color:var(--text-3); margin-bottom:8px; }

  .sec-head{
    display:flex;
    align-items:baseline;
    justify-content:space-between;
    margin:28px 0 12px;
  }
  .sec-head h2{ font-size:13.5px; font-weight:600; color:var(--text); }
  .sec-head .muted{ font-size:12px; color:var(--text-3); }
  .sec-head h2 .sec-link{ color:inherit; text-decoration:none; }
  .sec-head h2 .sec-link:hover{ color:var(--accent); }

  /* hero: next class */
  .hero{
    border:1px solid var(--border);
    border-radius:var(--radius);
    padding:18px;
    display:flex;
    flex-direction:column;
    gap:12px;
  }
  .hero-top{ display:flex; align-items:center; justify-content:space-between; }
  .label-sm{ font-size:12px; color:var(--text-2); }
  .tag{
    font-size:11.5px;
    font-weight:600;
    color:var(--accent);
    background:var(--accent-dim);
    padding:3px 9px;
    border-radius:100px;
  }
  .hero-subject{ font-size:19px; font-weight:600; }
  .hero-meta{
    display:flex;
    flex-wrap:wrap;
    gap:16px;
    color:var(--text-2);
    font-size:13px;
  }
  .hero-meta span{ display:flex; align-items:center; gap:7px; }
  .hero-meta svg{ width:14px; height:14px; flex-shrink:0; color:var(--text-3); }

  /* stat grid */
  .stat-grid{
    display:grid;
    grid-template-columns:1fr 1fr;
    gap:10px;
  }
  .stat{
    border:1px solid var(--border);
    border-radius:var(--radius);
    padding:14px;
    display:flex;
    flex-direction:column;
    gap:10px;
  }
  .stat-icon{
    width:26px; height:26px;
    border-radius:7px;
    background:var(--surface);
    display:flex; align-items:center; justify-content:center;
    color:var(--text-2);
  }
  .stat-icon svg{ width:13px; height:13px; }
  .stat .stat-label{ font-size:12px; color:var(--text-2); }
  .stat .stat-value{ font-size:21px; font-weight:600; }
  .stat.warn .stat-value{ color:var(--warn); }
  .stat.good .stat-value{ color:var(--good); }

  /* average card w/ sparkline */
  .avg-card{
    border:1px solid var(--border);
    border-radius:var(--radius);
    padding:18px;
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:14px;
  }
  .avg-num{ font-size:32px; font-weight:600; color:var(--text); line-height:1; }
  .avg-num small{ font-size:15px; color:var(--text-3); font-weight:500; }
  .avg-trend{
    font-size:12px;
    color:var(--good);
    margin-top:8px;
    display:flex;
    align-items:center;
    gap:5px;
  }
  .avg-trend svg{ width:12px; height:12px; }

  /* flat list rows (notes) */
  .list{
    border:1px solid var(--border);
    border-radius:var(--radius);
    overflow:hidden;
  }
  .row{
    padding:14px 16px;
    display:flex;
    align-items:center;
    gap:12px;
    border-bottom:1px solid var(--border);
  }
  .row:last-child{ border-bottom:none; }
  .row-dot{ width:6px; height:6px; border-radius:50%; flex-shrink:0; }
  .row-dot.good{ background:var(--good); }
  .row-dot.warn{ background:var(--warn); }
  .row-body{ flex:1; min-width:0; }
  .row-subject{ font-size:14px; font-weight:500; }
  .row-sub{ font-size:12px; color:var(--text-2); margin-top:2px; }
  .row-grade{ font-size:16px; font-weight:600; text-align:right; flex-shrink:0; }
  .row-grade small{ font-size:11px; color:var(--text-3); font-weight:500; }
  .row-grade.good{ color:var(--good); }
  .row-grade.warn{ color:var(--warn); }

  /* homework checklist */
  .task{
    padding:14px 16px;
    display:flex;
    align-items:flex-start;
    gap:12px;
    border-bottom:1px solid var(--border);
    cursor:pointer;
    user-select:none;
  }
  .task:last-child{ border-bottom:none; }
  .task-box{
    width:18px; height:18px;
    border-radius:5px;
    border:1.5px solid var(--border);
    flex-shrink:0;
    margin-top:1px;
    display:flex; align-items:center; justify-content:center;
    transition:background .12s ease, border-color .12s ease;
  }
  .task-box svg{ width:11px; height:11px; opacity:0; color:var(--bg); transition:opacity .12s ease; }
  .task.done .task-box{ background:var(--accent); border-color:var(--accent); }
  .task.done .task-box svg{ opacity:1; }
  .task-body{ flex:1; min-width:0; }
  .task-title{ font-size:13.5px; font-weight:500; }
  .task.done .task-title{ color:var(--text-3); text-decoration:line-through; }
  .task-sub{ font-size:12px; color:var(--text-2); margin-top:4px; display:flex; gap:10px; flex-wrap:wrap; align-items:center; }
  .task-due{ font-size:11px; color:var(--text-2); }
  .task-due::before{ content:"·"; margin-right:10px; color:var(--text-3); }

  /* notification panel */
  .panel{
    margin-top:28px;
    border:1px solid var(--border);
    border-radius:var(--radius);
    padding:18px;
    display:flex;
    flex-direction:column;
    gap:10px;
  }
  .panel .icon-badge{
    width:32px; height:32px;
    border-radius:8px;
    background:var(--surface);
    color:var(--accent);
    display:flex; align-items:center; justify-content:center;
    margin-bottom:2px;
  }
  .panel .icon-badge svg{ width:15px; height:15px; }
  .panel h3{ font-size:14px; font-weight:600; }
  .panel p{ font-size:12.5px; color:var(--text-2); line-height:1.5; }
  .btn{
    align-self:flex-start;
    background:var(--accent);
    color:#0D1826;
    border:none;
    padding:10px 16px;
    border-radius:8px;
    font-size:13px;
    font-weight:600;
    cursor:pointer;
    display:flex;
    align-items:center;
    gap:8px;
    transition:opacity .15s ease, transform .1s ease;
  }
  .btn:active{ transform:scale(.97); }
  .btn:disabled{ background:var(--good-dim); color:var(--good); cursor:default; }
  .btn svg{ width:14px; height:14px; }
  .btn.ghost{
    background:transparent;
    color:var(--text);
    border:1px solid var(--border);
  }

  .install-panel{
    margin-top:12px;
    border:1px solid var(--border);
    border-radius:var(--radius);
    padding:16px 18px;
    display:none;
    align-items:center;
    justify-content:space-between;
    gap:12px;
  }
  .install-panel.show{ display:flex; }
  .install-panel .txt h3{ font-size:13.5px; font-weight:600; }
  .install-panel .txt p{ font-size:12px; color:var(--text-2); margin-top:2px; }

  .footnote{
    text-align:center;
    color:var(--text-3);
    font-size:11.5px;
    margin-top:30px;
  }

  /* ---------- Emploi du temps : bascule vue Jour / Semaine ---------- */
  .view-toggle{
    display:flex;
    background:var(--surface);
    border:1px solid var(--border);
    border-radius:10px;
    padding:3px;
    gap:2px;
    margin-bottom:22px;
  }
  .view-toggle-btn{
    flex:1;
    border:none;
    background:transparent;
    color:var(--text-2);
    font-family:inherit;
    font-size:13px;
    font-weight:600;
    padding:9px 0;
    border-radius:8px;
    cursor:pointer;
    transition:background .12s ease, color .12s ease;
  }
  .view-toggle-btn:hover:not(.is-active){ color:var(--text); }
  .view-toggle-btn.is-active{
    background:var(--surface-2);
    color:var(--text);
  }

  /* ---------- Emploi du temps : grille horaire (jour / semaine) ---------- */
  .tt-wrap{
    border:1px solid var(--border);
    border-radius:var(--radius);
    background:var(--surface);
    overflow-x:auto;
    overflow-y:hidden;
    -webkit-overflow-scrolling:touch;
    scroll-snap-type:x proximity;
  }
  .tt-grid{
    display:grid;
    grid-template-columns: 40px repeat(var(--cols), minmax(var(--colw,0), 1fr));
    width:100%;
  }
  .tt-grid.week-mode{ grid-template-rows:auto auto; }
  .tt-grid.day-mode{ grid-template-rows:auto; width:100%; }

  .tt-corner{
    position:sticky;
    top:0; left:0;
    z-index:4;
    background:var(--surface);
    border-bottom:1px solid var(--border);
    border-right:1px solid var(--border-soft);
  }
  .tt-day-head{
    position:sticky;
    top:0;
    z-index:3;
    background:var(--surface);
    text-align:center;
    padding:9px 2px;
    border-bottom:1px solid var(--border);
    border-right:1px solid var(--border-soft);
    scroll-snap-align:start;
  }
  .tt-day-head:last-child{ border-right:none; }
  .tt-day-head .d-name{ font-size:10.5px; color:var(--text-2); text-transform:uppercase; letter-spacing:.03em; }
  .tt-day-head .d-num{ font-size:15px; font-weight:600; margin-top:2px; color:var(--text); }
  .tt-day-head.is-today{ background:var(--accent-dim); }
  .tt-day-head.is-today .d-name,
  .tt-day-head.is-today .d-num{ color:var(--accent); }

  .tt-timecol{
    position:sticky;
    left:0;
    z-index:2;
    background:var(--surface);
    border-right:1px solid var(--border-soft);
  }
  .tt-hour-label{
    position:absolute;
    left:0; right:0;
    transform:translateY(-50%);
    font-size:10px;
    color:var(--text-3);
    text-align:right;
    padding-right:6px;
    box-sizing:border-box;
  }

  .tt-daybody{
    position:relative;
    border-right:1px solid var(--border-soft);
    scroll-snap-align:start;
    background-image:repeating-linear-gradient(
      to bottom,
      var(--border-soft) 0,
      var(--border-soft) 1px,
      transparent 1px,
      transparent var(--hourpx)
    );
    background-position:0 8px;
  }
  .tt-daybody:last-child{ border-right:none; }
  .tt-daybody.is-today{ background-color:rgba(95,168,255,.05); }

  .tt-block{
    position:absolute;
    left:3px; right:3px;
    border-radius:7px;
    border-left:3px solid;
    overflow:hidden;
    cursor:pointer;
    padding:4px 7px;
    box-sizing:border-box;
    line-height:1.25;
    transition:filter .12s ease, transform .1s ease;
  }
  .tt-block.compact .b-subject{ font-size:10.5px; line-height:1.15; }
  .tt-block.compact .b-time{ font-size:9.5px; }
  .tt-block:active{ filter:brightness(1.18); transform:scale(.98); }
  .tt-block.is-cancelled{ opacity:.55; }
  .tt-block.is-cancelled .b-subject{ text-decoration:line-through; }
  .tt-block .b-time{ font-size:10px; font-weight:600; color:var(--text-2); white-space:nowrap; }
  .tt-block .b-badges{
    position:absolute; top:3px; right:3px;
    display:flex; align-items:center; gap:2px;
    z-index:1;
  }
  .tt-block .b-badge{
    display:inline-flex; align-items:center; justify-content:center;
    width:15px; height:15px; border-radius:50%;
    font-size:9.5px; font-weight:700; line-height:1;
    color:#fff; flex-shrink:0;
    box-shadow:0 0 0 1.5px rgba(0,0,0,.18);
  }
  .tt-block.compact .b-badge{ width:13px; height:13px; font-size:8.5px; }
  .tt-block .b-badge-modifie{ background:#E0A94D; }
  .tt-block .b-badge-dispense{ background:#8BA0B8; }
  .tt-block .b-badge-cancelled{ background:#E05F5F; }
  .tt-block .b-subject{
    font-size:11.5px;
    font-weight:600;
    color:var(--text);
    white-space:normal;
    overflow-wrap:break-word;
    word-break:break-word;
  }
  .tt-block .b-room{
    font-size:10.5px;
    color:var(--text-2);
    white-space:normal;
    overflow-wrap:break-word;
    word-break:break-word;
    margin-top:1px;
  }

  /* ---------- Fiche détail (bottom sheet) ---------- */
  .tt-modal-backdrop{
    position:fixed;
    inset:0;
    background:rgba(10,13,18,.6);
    display:flex;
    align-items:flex-end;
    justify-content:center;
    z-index:60;
    opacity:0;
    pointer-events:none;
    transition:opacity .15s ease;
  }
  .tt-modal-backdrop.show{ opacity:1; pointer-events:auto; }
  .tt-modal{
    position:relative;
    width:100%;
    max-width:640px;
    background:var(--surface);
    border:1px solid var(--border);
    border-bottom:none;
    border-radius:18px 18px 0 0;
    padding:22px 20px calc(22px + env(safe-area-inset-bottom));
    transform:translateY(16px);
    transition:transform .18s ease;
  }
  .tt-modal-backdrop.show .tt-modal{ transform:translateY(0); }
  .tt-modal-close{
    position:absolute;
    top:14px; right:14px;
    width:30px; height:30px;
    border-radius:8px;
    border:1px solid var(--border);
    background:var(--surface-2);
    color:var(--text-2);
    display:flex; align-items:center; justify-content:center;
    cursor:pointer;
  }
  .tt-modal-close svg{ width:14px; height:14px; }
  .tt-modal-head{
    display:flex;
    align-items:flex-start;
    gap:10px;
    margin-bottom:18px;
    padding-right:34px;
  }
  .tt-modal-dot{ width:11px; height:11px; border-radius:50%; flex-shrink:0; margin-top:5px; }
  .tt-modal-subject{ font-size:17px; font-weight:600; }
  .tt-modal-day{ font-size:12.5px; color:var(--text-2); margin-top:3px; }
  .tt-modal-badges{ display:flex; flex-wrap:wrap; gap:6px; margin-top:8px; }
  .tt-modal-badges:empty{ display:none; }
  .tt-modal-badge{
    font-size:11px; font-weight:600; padding:3px 8px; border-radius:20px;
    color:#fff;
  }
  .tt-modal-badge-modifie{ background:#E0A94D; }
  .tt-modal-badge-dispense{ background:#8BA0B8; }
  .tt-modal-badge-cancelled{ background:#E37F7F; }
  .tt-modal-meta{ display:flex; flex-direction:column; gap:12px; }
  .tt-modal-meta span{
    display:flex;
    align-items:center;
    gap:10px;
    font-size:13.5px;
    color:var(--text);
  }
  .tt-modal-meta svg{ width:15px; height:15px; color:var(--text-3); flex-shrink:0; }

  /* ---------- Responsive ---------- */
  @media (min-width:640px){
    :root{ --rail-w:72px; }
    .wrap{ max-width:600px; }
    .stat-grid{ grid-template-columns:repeat(4,1fr); }
  }

  @media (min-width:860px){
    :root{ --rail-w:76px; }
    .wrap{ max-width:660px; }
  }

  @media (prefers-reduced-motion: reduce){
    *{ transition:none !important; animation:none !important; }
  }

  /* ---------- Page de connexion (login.html) ---------- */
  .login-page{
    min-height:100vh;
    display:flex;
    align-items:center;
    justify-content:center;
    padding:24px;
  }
  .login-card{
    width:100%;
    max-width:380px;
    background:var(--surface);
    border:1px solid var(--border);
    border-radius:16px;
    padding:32px 26px calc(28px + env(safe-area-inset-bottom));
  }
  .login-logo{
    width:44px; height:44px;
    border-radius:11px;
    border:1px solid var(--border);
    color:var(--accent);
    display:flex; align-items:center; justify-content:center;
    font-weight:700;
    font-size:19px;
    margin:0 auto 18px;
  }
  .login-title{
    text-align:center;
    font-size:19px;
    font-weight:700;
    margin-bottom:4px;
  }
  .login-sub{
    text-align:center;
    font-size:13px;
    color:var(--text-2);
    margin-bottom:26px;
    line-height:1.5;
  }
  .field{ margin-bottom:16px; }
  .field label{
    display:block;
    font-size:12.5px;
    font-weight:600;
    color:var(--text-2);
    margin-bottom:7px;
  }
  .field input,
  .field select{
    width:100%;
    background:var(--surface-2);
    border:1px solid var(--border);
    color:var(--text);
    font-family:inherit;
    font-size:14.5px;
    padding:11px 13px;
    border-radius:9px;
    outline:none;
    transition:border-color .12s ease;
    -webkit-appearance:none;
    appearance:none;
  }
  .field input::placeholder{ color:var(--text-3); }
  .field input:focus,
  .field select:focus{ border-color:var(--accent); }
  .field-error input,
  .field-error select{ border-color:var(--bad); }
  .field-error-msg{
    display:none;
    font-size:12px;
    color:var(--bad);
    margin-top:6px;
  }
  .field-error .field-error-msg{ display:block; }
  .field-pass-wrap{ position:relative; }
  .field-pass-wrap input{ padding-right:42px; }
  .pass-toggle{
    position:absolute;
    right:6px; top:50%;
    transform:translateY(-50%);
    width:30px; height:30px;
    border:none;
    background:transparent;
    color:var(--text-3);
    cursor:pointer;
    display:flex; align-items:center; justify-content:center;
    border-radius:6px;
  }
  .pass-toggle svg{ width:16px; height:16px; }
  .login-btn{
    width:100%;
    justify-content:center;
    margin-top:6px;
    padding:12px 16px;
    font-size:14px;
  }
  .login-foot{
    text-align:center;
    font-size:12px;
    color:var(--text-3);
    margin-top:20px;
  }
  .login-demo-note{
    display:flex;
    gap:9px;
    align-items:flex-start;
    background:var(--accent-dim);
    border:1px solid var(--border);
    border-radius:9px;
    padding:11px 12px;
    margin-bottom:20px;
    font-size:12px;
    color:var(--text-2);
    line-height:1.5;
  }
  .login-demo-note svg{ width:15px; height:15px; color:var(--accent); flex-shrink:0; margin-top:1px; }

  /* ---------- Modal d'onboarding (informations élève) ---------- */
  .onb-backdrop{
    position:fixed;
    inset:0;
    background:rgba(10,13,18,.68);
    display:flex;
    align-items:center;
    justify-content:center;
    z-index:80;
    padding:20px;
    opacity:0;
    pointer-events:none;
    transition:opacity .18s ease;
  }
  .onb-backdrop.show{ opacity:1; pointer-events:auto; }
  .onb-modal{
    width:100%;
    max-width:400px;
    max-height:calc(100vh - 40px);
    overflow-y:auto;
    background:var(--surface);
    border:1px solid var(--border);
    border-radius:16px;
    padding:26px 22px calc(22px + env(safe-area-inset-bottom));
    transform:translateY(10px) scale(.98);
    transition:transform .18s ease;
  }
  .onb-backdrop.show .onb-modal{ transform:translateY(0) scale(1); }
  .onb-head{ margin-bottom:20px; }
  .onb-title{ font-size:17px; font-weight:700; margin-bottom:5px; }
  .onb-sub{ font-size:12.5px; color:var(--text-2); line-height:1.5; }
  .onb-row{ display:flex; gap:10px; }
  .onb-row .field{ flex:1; min-width:0; }
  .onb-actions{ margin-top:4px; }
  .onb-actions .btn{ width:100%; justify-content:center; }

  /* ---------- États de formulaire (login / QCM) ---------- */
  .form-error{
    display:none;
    font-size:12.5px;
    color:var(--bad);
    background:var(--bad-dim);
    border:1px solid var(--border);
    border-radius:9px;
    padding:10px 12px;
    margin-bottom:16px;
    line-height:1.4;
  }
  .form-error.show{ display:block; }
  .btn.is-loading{ opacity:.65; pointer-events:none; }
  .link-btn{
    background:none;
    border:none;
    color:var(--text-2);
    font-size:12.5px;
    cursor:pointer;
    padding:0;
    text-decoration:underline;
    margin-top:14px;
    display:block;
    width:100%;
    text-align:center;
  }

  /* ---------- Options du QCM de double authentification ---------- */
  .qcm-question{
    font-size:14px;
    color:var(--text);
    line-height:1.5;
    margin-bottom:16px;
  }
  .qcm-options{
    display:flex;
    flex-direction:column;
    gap:8px;
    margin-bottom:18px;
  }
  .qcm-option{
    display:flex;
    align-items:center;
    gap:10px;
    border:1px solid var(--border);
    background:var(--surface-2);
    border-radius:9px;
    padding:11px 13px;
    cursor:pointer;
    font-size:13.5px;
    transition:border-color .12s ease;
  }
  .qcm-option:has(input:checked){ border-color:var(--accent); }
  .qcm-option input{ accent-color:var(--accent); width:16px; height:16px; flex-shrink:0; }

  /* ---------- Page Réglages ---------- */
  .settings-tabs{
    display:flex;
    gap:4px;
    border-bottom:1px solid var(--border-soft);
    margin-bottom:24px;
    overflow-x:auto;
    scrollbar-width:none;
  }
  .settings-tabs::-webkit-scrollbar{ display:none; }
  .settings-tab{
    appearance:none;
    background:transparent;
    border:none;
    color:var(--text-2);
    font-family:inherit;
    font-size:13.5px;
    font-weight:600;
    padding:10px 4px 12px;
    margin-right:22px;
    white-space:nowrap;
    cursor:pointer;
    position:relative;
    flex-shrink:0;
  }
  .settings-tab:hover{ color:var(--text); }
  .settings-tab.is-active{ color:var(--text); }
  .settings-tab.is-active::after{
    content:"";
    position:absolute;
    left:0; right:0; bottom:-1px;
    height:2px;
    border-radius:2px;
    background:var(--accent);
  }
  .settings-panel{ display:none; }
  .settings-panel.is-active{ display:block; }
  .settings-empty{
    color:var(--text-3);
    font-size:13px;
    padding:6px 0 2px;
  }
  .settings-block{
    border:1px solid var(--border);
    border-radius:var(--radius);
    padding:18px;
    margin-bottom:16px;
  }
  .settings-block h3{ font-size:14px; font-weight:600; margin-bottom:4px; }
  .settings-block .settings-block-sub{ font-size:12.5px; color:var(--text-2); line-height:1.5; margin-bottom:16px; }
  #notificationsTestRow{ display:flex; align-items:center; gap:12px; margin-top:4px; }
  #notificationsTestStatus{ font-size:12px; color:var(--text-2); }
  .theme-row.is-disabled{ opacity:.5; }
  .theme-row{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:16px;
  }
  .theme-row-text{ display:flex; flex-direction:column; gap:2px; }
  .theme-row-text strong{ font-size:13.5px; font-weight:600; }
  .theme-row-text span{ font-size:12px; color:var(--text-2); }
  .theme-switch{
    position:relative;
    width:46px; height:26px;
    flex-shrink:0;
    border-radius:999px;
    background:var(--surface-2);
    border:1px solid var(--border);
    cursor:pointer;
  }
  .theme-switch input{
    position:absolute;
    inset:0;
    opacity:0;
    margin:0;
    cursor:pointer;
  }
  .theme-switch .knob{
    position:absolute;
    top:2px; left:2px;
    width:20px; height:20px;
    border-radius:50%;
    background:var(--text-2);
    transition:transform .16s ease, background .16s ease;
  }
  .theme-switch input:checked ~ .knob{
    transform:translateX(20px);
    background:var(--accent);
  }
  .settings-save-row{
    display:flex;
    align-items:center;
    gap:12px;
    margin-top:2px;
  }
  .settings-saved-msg{
    font-size:12.5px;
    color:var(--good);
    opacity:0;
    transition:opacity .2s ease;
  }
  .settings-saved-msg.show{ opacity:1; }

  /* ---------- Réglages : couleurs des matières ---------- */
  .subject-list{
    display:flex;
    flex-direction:column;
    gap:2px;
  }
  .subject-row{
    display:flex;
    align-items:center;
    gap:12px;
    padding:11px 4px;
    border-bottom:1px solid var(--border-soft);
  }
  .subject-row:last-child{ border-bottom:none; }
  .subject-swatch{
    position:relative;
    width:28px; height:28px;
    border-radius:8px;
    border:1px solid var(--border);
    flex-shrink:0;
    overflow:hidden;
  }
  .subject-swatch input[type="color"]{
    position:absolute;
    inset:-4px;
    width:calc(100% + 8px);
    height:calc(100% + 8px);
    border:none;
    padding:0;
    cursor:pointer;
    background:none;
  }
  .subject-name{
    flex:1;
    min-width:0;
    font-size:13.5px;
    font-weight:500;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
  }
  .subject-tag{
    font-size:11px;
    color:var(--text-3);
    flex-shrink:0;
  }
  .subject-reset{
    appearance:none;
    background:transparent;
    border:1px solid var(--border);
    color:var(--text-2);
    font-family:inherit;
    font-size:12px;
    font-weight:600;
    padding:6px 10px;
    border-radius:7px;
    cursor:pointer;
    flex-shrink:0;
  }
  .subject-reset:hover{ color:var(--text); border-color:var(--text-2); }
  .subject-reset:disabled{ opacity:.4; cursor:default; }

  .session-list{
    display:flex;
    flex-direction:column;
    gap:2px;
  }
  .session-row{
    display:flex;
    align-items:center;
    gap:12px;
    padding:11px 4px;
    border-bottom:1px solid var(--border-soft);
  }
  .session-row:last-child{ border-bottom:none; }
  .session-info{
    flex:1;
    min-width:0;
    display:flex;
    flex-direction:column;
    gap:2px;
  }
  .session-device{
    font-size:13.5px;
    font-weight:500;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
  }
  .session-meta{
    font-size:12px;
    color:var(--text-2);
  }
  .session-tag{
    font-size:11px;
    font-weight:600;
    color:var(--good);
    background:var(--good-dim);
    padding:3px 8px;
    border-radius:6px;
    flex-shrink:0;
  }

  /* ---------- Réglages : changelog ---------- */
  .changelog-entry{ margin-bottom:14px; }
  .changelog-entry:last-child{ margin-bottom:0; }
  .changelog-version{ font-weight:600; font-size:13px; }
  .changelog-date{ color:var(--text-3); font-size:11.5px; margin-left:6px; }
  .changelog-notes{ margin:6px 0 0; padding-left:18px; font-size:12.5px; color:var(--text-2); line-height:1.6; }
