:root{--bg: #f4f6fb;--surface: #ffffff;--text: #1f2733;--muted: #6b7688;--border: #e4e8f0;--primary: #15803d;--primary-dark: #166534;--danger: #dc2626;--sidebar: #101828;--sidebar-active: #1d2b45;--radius: 12px;--shadow: 0 1px 3px rgba(16, 24, 40, .08), 0 1px 2px rgba(16, 24, 40, .06)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:var(--bg);color:var(--text);font-size:15px}a{color:inherit}.muted{color:var(--muted)}.small{font-size:13px}.center{text-align:center}.link{color:var(--primary);text-decoration:none;font-weight:500}.link:hover{text-decoration:underline}.app-shell{display:flex;min-height:100vh}.sidebar{width:250px;background:var(--sidebar);color:#cdd5e0;display:flex;flex-direction:column;padding:20px 14px;flex-shrink:0}.brand{display:flex;align-items:center;gap:12px;padding:6px 10px 22px}.brand strong{color:#fff;display:block;font-size:18px}.brand small{color:#8b96a8}.brand-mark{width:40px;height:40px;border-radius:10px;background:var(--primary);color:#fff;display:grid;place-items:center;font-weight:700;font-size:20px}.brand-mark.big{width:56px;height:56px;font-size:28px}.nav-link{display:flex;align-items:center;gap:12px;padding:11px 12px;border-radius:9px;text-decoration:none;color:#cdd5e0;margin-bottom:3px;font-weight:500;transition:background .15s}.nav-link:hover{background:#1a2436}.nav-link.active{background:var(--sidebar-active);color:#fff}.nav-icon{width:20px;text-align:center}.main{flex:1;display:flex;flex-direction:column;min-width:0}.topbar{height:64px;background:var(--surface);border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;padding:0 24px}.user-box{display:flex;align-items:center;gap:16px}.user-info{text-align:right;line-height:1.25}.user-info strong{display:block}.user-info small{display:block;color:var(--muted)}.content{padding:28px;flex:1}.page-title{font-size:24px;margin:4px 0 6px}.page-head{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:18px}.card-title{font-size:16px;margin:0 0 14px}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:20px;box-shadow:var(--shadow)}.stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:16px;margin-top:20px}.stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:18px 20px;box-shadow:var(--shadow)}.stat-value{font-size:28px;font-weight:700;color:var(--primary-dark)}.stat-label{font-weight:600;margin-top:4px}.stat-sub{font-size:13px;margin-top:2px}.table{width:100%;border-collapse:collapse}.table th,.table td{text-align:left;padding:11px 12px;border-bottom:1px solid var(--border)}.table th{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.table tbody tr:hover{background:#f9fafc}.badge{display:inline-block;padding:3px 9px;border-radius:999px;font-size:12px;font-weight:600;background:#eef1f6;color:#47536b}.badge-ACTIF{background:#e7f6ec;color:#1a7f43}.badge-SUSPENDU{background:#fdf0e3;color:#b45309}.badge-DIPLOME{background:#e7effd;color:#1d4ed8}.badge-PARTI{background:#f3e8ea;color:#9f1239}.badge-ok{background:#e7f6ec;color:#1a7f43}.badge-info{background:#e7effd;color:#1d4ed8}.badge-muted{background:#eef1f6;color:#6b7688}.toolbar{display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap}.input,.field input,.field select{padding:10px 12px;border:1px solid var(--border);border-radius:9px;font-size:14px;background:#fff;width:100%;font-family:inherit}.input{max-width:320px}.field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}.field span{font-size:13px;font-weight:600;color:#47536b}.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:0 16px}.grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:0 16px}.check-inline{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:14px}.card-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.tuteur-row{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.tuteur-actions{display:flex;gap:4px;flex-shrink:0}.tuteur-bloc{border:1px solid var(--border, #e5e7eb);border-radius:10px;padding:12px;margin-bottom:10px}.tuteur-bloc-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.tuteur-bloc-urgence{border-color:var(--primary, #4f46e5);box-shadow:0 0 0 1px var(--primary, #4f46e5) inset}.liste-libelles{list-style:none;margin:12px 0 0;padding:0}.liste-libelles li{display:flex;align-items:center;justify-content:space-between;padding:8px 4px;border-bottom:1px solid var(--border)}.liste-libelles li:last-child{border-bottom:none}.actions-cell{display:flex;gap:10px}.affectation-barre{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:12px}.affectation-cible{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.row-selected{background:#ecf6ef}.field-label{display:block;font-size:13px;font-weight:600;margin-bottom:6px}.logo-zone{width:160px;height:120px;border:1px dashed var(--border);border-radius:10px;display:flex;align-items:center;justify-content:center;text-align:center;cursor:pointer;overflow:hidden;background:#fafbfc;padding:6px}.logo-zone img{max-width:100%;max-height:100%;object-fit:contain}.appel-statuts{display:flex;gap:6px;flex-wrap:wrap}.appel-pill{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border:1px solid var(--border);border-radius:999px;cursor:pointer;font-size:13px}.appel-pill input{margin:0}.appel-pill.on.PRESENT{background:#e7f6ec;border-color:#1a7f43;color:#1a7f43}.appel-pill.on.ABSENT{background:#fdecec;border-color:#b91c1c;color:#b91c1c}.appel-pill.on.RETARD{background:#fff7ed;border-color:#b45309;color:#b45309}.btn{padding:10px 16px;border-radius:9px;border:1px solid transparent;font-size:14px;font-weight:600;cursor:pointer;font-family:inherit}.btn:disabled{opacity:.55;cursor:not-allowed}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover:not(:disabled){background:var(--primary-dark)}.btn-ghost{background:transparent;border-color:var(--border);color:var(--text)}.btn-ghost:hover:not(:disabled){background:#f0f2f7}.btn-danger{background:var(--danger);color:#fff}.btn-block{width:100%}.alert{padding:12px 16px;border-radius:9px;background:#eef2f8;margin-bottom:16px}.alert-error{background:#fdecec;color:#b91c1c}.alert-success{background:#e7f6ec;color:#1a7f43}.pagination{display:flex;align-items:center;justify-content:center;gap:18px;margin-top:18px}.detail{display:grid;grid-template-columns:130px 1fr;gap:8px 12px;margin:0}.detail dt{color:var(--muted);font-size:14px}.detail dd{margin:0}.detail-row{padding:8px 0;border-bottom:1px solid var(--border)}.detail-row:last-child{border-bottom:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#10182873;display:grid;place-items:center;padding:20px;z-index:50}.modal{background:#fff;border-radius:var(--radius);padding:24px;width:100%;max-width:560px}.modal-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:8px}.login-page{min-height:100vh;display:grid;place-items:center;background:linear-gradient(135deg,#14532d,#15803d);padding:20px}.login-logo{display:block;width:96px;height:auto;margin:0 auto 4px;object-fit:contain}.login-card{background:#fff;border-radius:16px;padding:34px;width:100%;max-width:400px;box-shadow:0 20px 50px #00000040}.login-brand{text-align:center;margin-bottom:22px}.login-brand h1{margin:12px 0 2px}.login-brand .brand-mark{margin:0 auto}.tabs{display:flex;gap:4px;border-bottom:2px solid var(--border)}.tab{padding:10px 18px;background:transparent;border:none;cursor:pointer;font-size:15px;font-weight:600;color:var(--muted);font-family:inherit;border-bottom:2px solid transparent;margin-bottom:-2px}.tab:hover{color:var(--text)}.tab-active{color:var(--primary);border-bottom-color:var(--primary)}.badge-fac-IMPAYEE{background:#fdecec;color:#b91c1c}.badge-fac-PARTIELLE{background:#fdf0e3;color:#b45309}.badge-fac-PAYEE{background:#e7f6ec;color:#1a7f43}.badge-fac-ANNULEE{background:#eef1f6;color:#6b7688}.modal-lg{max-width:720px}.link-danger{color:var(--danger)}.btn-danger-ghost{color:var(--danger);border-color:#f3c9c9}.btn-icon{padding:8px 10px}.ligne-row{display:flex;gap:8px;margin-bottom:8px;align-items:center}.ligne-row select,.ligne-row input{padding:8px 10px;border:1px solid var(--border);border-radius:8px;font-size:14px;font-family:inherit}.ligne-row select{max-width:130px}.ligne-row input:first-of-type,.ligne-row>input:nth-of-type(1){flex:1}.total-line{text-align:right;font-size:16px;margin:10px 0}.frais-check-list{display:flex;flex-direction:column;gap:8px;max-height:220px;overflow-y:auto;border:1px solid var(--border);border-radius:9px;padding:12px}.frais-check{display:flex;gap:8px;align-items:center;font-weight:500}.frais-check input{width:auto}.inline-field{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--muted)}.inline-field .input{max-width:170px}.table tfoot td{padding:8px 12px;border-top:2px solid var(--border);border-bottom:none}.btn-sm{padding:7px 12px;font-size:13px}.add-form{padding:16px 20px}.eval-chips{display:flex;flex-wrap:wrap;gap:8px}.eval-chip{display:flex;align-items:center;border:1px solid var(--border);border-radius:9px;overflow:hidden}.eval-chip-active{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary)}.eval-chip-main{background:transparent;border:none;padding:8px 12px;cursor:pointer;font-size:14px;font-family:inherit;font-weight:600}.eval-chip-del{background:#f7f8fa;border:none;border-left:1px solid var(--border);padding:8px 10px;cursor:pointer;color:var(--danger)}.bulletin-table td,.bulletin-table th{padding:8px 10px}.bulletin-synthese{display:flex;gap:32px;margin-top:16px;padding:14px 16px;background:#f5f7fb;border-radius:9px}.bulletin-synthese>div{display:flex;flex-direction:column}.bulletin-synthese strong{font-size:20px;color:var(--primary-dark)}.bulletin-appr{margin-top:12px;padding-top:10px;border-top:1px dashed var(--border)}.appr-edit{margin-top:14px}.appr-edit textarea{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:9px;font-family:inherit;font-size:14px;resize:vertical}@media print{.no-print{display:none!important}}.toggle-row{display:flex;gap:28px;flex-wrap:wrap}.switch{display:inline-flex;align-items:center;gap:8px;font-weight:600;cursor:pointer}.switch input{width:42px;height:22px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#cbd3e0;border-radius:999px;position:relative;cursor:pointer;transition:background .2s;flex-shrink:0}.switch input:checked{background:var(--primary)}.switch input:after{content:"";position:absolute;top:2px;left:2px;width:18px;height:18px;background:#fff;border-radius:50%;transition:transform .2s}.switch input:checked:after{transform:translate(20px)}.relance-canaux{display:flex;gap:18px;flex-wrap:wrap}.actions-row{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-start}.carte-modal{max-width:420px}.carte-print{display:flex;justify-content:center}.carte{width:85.6mm;height:54mm;box-sizing:border-box;border:.3mm solid var(--primary);border-radius:3mm;overflow:hidden;background:#fff;display:flex;flex-direction:column;font-size:3mm;line-height:1.25}.carte-bandeau{display:flex;align-items:center;gap:2mm;padding:1.6mm 3mm;background:linear-gradient(135deg,#14532d,#15803d);color:#fff}.carte-logo{width:6mm;height:6mm;border-radius:1.4mm;background:#ffffff40;display:grid;place-items:center;font-weight:700;font-size:3.4mm;flex-shrink:0}.carte-logo-img{width:6mm;height:6mm;border-radius:1.4mm;object-fit:contain;background:#fff;flex-shrink:0}.carte-etab{font-weight:800;letter-spacing:.02em;font-size:3mm;flex:1}.carte-annee{font-size:2.6mm;opacity:.9}.carte-corps{display:flex;gap:3mm;padding:3mm;flex:1}.carte-photo{width:22mm;height:28mm;border-radius:1.6mm;object-fit:cover;border:.3mm solid var(--border);flex-shrink:0}.carte-photo-vide{display:grid;place-items:center;background:var(--primary);color:#fff;font-weight:700;font-size:8mm}.carte-infos{flex:1;min-width:0}.carte-nom{font-size:4mm;font-weight:700;margin-bottom:.6mm}.carte-matr{font-size:2.8mm;color:var(--muted);margin-bottom:1.6mm}.carte-table{width:100%;border-collapse:collapse}.carte-table td{padding:.5mm 0;font-size:2.8mm}.carte-table td:first-child{color:var(--muted);width:38%}.carte-pied{padding:1.2mm 3mm;background:#f5f7fb;font-size:2mm;color:var(--muted);text-align:center}@media print{@page{size:85.6mm 54mm;margin:0}body *{visibility:hidden}.carte-print,.carte-print *{visibility:visible}.carte-print{position:fixed;top:0;right:0;bottom:0;left:0;margin:0;display:block}.carte{border-radius:0}.carte-actions,.sidebar,.topbar{display:none!important}}.eleve-form-top{display:flex;gap:18px;margin-bottom:6px;align-items:flex-start}.photo-zone{display:flex;flex-direction:column;gap:8px;align-items:center;width:130px;flex-shrink:0}.photo-preview{width:120px;height:120px;border-radius:10px;border:2px dashed var(--border);display:grid;place-items:center;overflow:hidden;cursor:pointer;background:#fafbfc}.photo-preview img{width:100%;height:100%;object-fit:cover}.identite-head{display:flex;gap:16px;align-items:flex-start}.eleve-photo{width:92px;height:92px;border-radius:10px;object-fit:cover;border:1px solid var(--border);flex-shrink:0}.eleve-photo-vide{display:grid;place-items:center;background:var(--primary);color:#fff;font-weight:700;font-size:28px}.danger-card{border:1px solid #f3c9c9;background:#fff8f8}.purge-list{margin:8px 0 12px;padding-left:22px}.purge-list li{margin:3px 0}.tab-badge{display:inline-block;margin-left:6px;background:var(--danger);color:#fff;border-radius:999px;font-size:11px;padding:1px 7px;font-weight:700;vertical-align:middle}.ta{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:9px;font-family:inherit;font-size:14px;resize:vertical}.annonce-list{display:flex;flex-direction:column;gap:14px}.annonce-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.annonce-titre{margin:0 0 6px;font-size:17px}.annonce-contenu{margin:6px 0 12px;white-space:pre-wrap}.annonce-foot{display:flex;align-items:center}.seg-btn2{padding:8px 16px;background:#fff;border:1px solid var(--border);border-right:none;cursor:pointer;font-family:inherit;font-weight:600;color:var(--muted)}.seg-btn2:first-child{border-radius:8px 0 0 8px}.seg-btn2:last-child{border-right:1px solid var(--border);border-radius:0 8px 8px 0}.seg-on2{background:var(--primary);color:#fff;border-color:var(--primary)}.msg-layout{display:grid;grid-template-columns:320px 1fr;gap:16px;align-items:start}.msg-list{padding:0;max-height:560px;overflow-y:auto}.msg-item{display:block;width:100%;text-align:left;background:transparent;border:none;border-bottom:1px solid var(--border);padding:12px 14px;cursor:pointer;font-family:inherit}.msg-item:hover{background:#f9fafc}.msg-active{background:#ecf6ef!important}.msg-unread .msg-item-sujet{font-weight:700}.msg-unread{border-left:3px solid var(--primary)}.msg-item-head{display:flex;justify-content:space-between;margin-bottom:3px}.msg-item-sujet{font-size:14px}.msg-item-apercu{margin-top:2px}.msg-view{min-height:200px}.notif{display:flex;align-items:center;gap:12px;padding:12px 6px;border-bottom:1px solid var(--border)}.notif:last-child{border-bottom:none}.notif-unread{background:#f5f8ff}.notif-ic{font-size:20px;width:30px;text-align:center}.notif-body{flex:1}.notif-titre{font-weight:600}@media (max-width: 820px){.msg-layout{grid-template-columns:1fr}}.edt-grille{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;overflow-x:auto}.edt-col{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:8px;min-width:130px}.edt-jour{font-weight:700;text-align:center;padding:6px 0 10px;color:var(--text);border-bottom:1px solid var(--border);margin-bottom:8px}.edt-vide{text-align:center;padding:12px 0}.edt-card{position:relative;background:#ecf6ef;border-left:3px solid var(--primary);border-radius:6px;padding:8px 10px;margin-bottom:8px}.edt-heure{font-size:12px;font-weight:700;color:var(--primary-dark)}.edt-matiere{font-weight:600;font-size:14px;margin:2px 0}.edt-meta{font-size:12px}.edt-del{position:absolute;top:4px;right:4px;background:transparent;border:none;color:var(--danger);cursor:pointer;font-size:12px;opacity:.6}.edt-del:hover{opacity:1}.badge-evt-FERIE{background:#e7f6ec;color:#1a7f43}.badge-evt-EXAMEN{background:#fdecec;color:#b91c1c}.badge-evt-EVENEMENT{background:#e7effd;color:#1d4ed8}@media (max-width: 820px){.edt-grille{grid-template-columns:repeat(3,minmax(120px,1fr))}}.seg{display:inline-flex;border:1px solid var(--border);border-radius:8px;overflow:hidden}.seg-btn{width:38px;padding:6px 0;background:#fff;border:none;border-right:1px solid var(--border);cursor:pointer;font-weight:700;font-family:inherit;color:var(--muted)}.seg-btn:last-child{border-right:none}.seg-btn:disabled{cursor:not-allowed}.seg-PRESENT.seg-on{background:#e7f6ec;color:#1a7f43}.seg-ABSENT.seg-on{background:#fdecec;color:#b91c1c}.seg-RETARD.seg-on{background:#fdf0e3;color:#b45309}.recu-modal{max-width:460px}.recu-print{padding:8px 4px}.recu-entete{display:flex;align-items:center;gap:12px;border-bottom:2px solid var(--border);padding-bottom:14px;margin-bottom:14px}.recu-logo{width:46px;height:46px;border-radius:10px;background:var(--primary);color:#fff;display:grid;place-items:center;font-weight:700;font-size:24px}.recu-logo-img{width:46px;height:46px;border-radius:10px;object-fit:contain;background:#fff;border:1px solid var(--border)}.recu-num{margin-left:auto;text-align:right}.recu-table{width:100%;border-collapse:collapse}.recu-table td{padding:8px 4px;border-bottom:1px solid var(--border)}.recu-table td:first-child{color:var(--muted);width:45%}.recu-table td:last-child{text-align:right}.recu-montant td{font-size:18px;font-weight:700;color:var(--primary-dark)}.recu-pied{margin-top:18px;padding-top:12px;border-top:1px dashed var(--border)}@media print{body *{visibility:hidden}.recu-print,.recu-print *{visibility:visible}.recu-print{position:fixed;top:0;right:0;bottom:0;left:0;margin:20px}.recu-actions,.sidebar,.topbar{display:none!important}}@media (max-width: 820px){.sidebar{width:68px;padding:16px 8px}.sidebar .brand strong,.sidebar .brand small,.nav-link{font-size:0}.nav-link{justify-content:center}.nav-icon{font-size:18px}.brand{justify-content:center}.brand>div{display:none}.grid-2,.grid-3{grid-template-columns:1fr}.detail{grid-template-columns:110px 1fr}}
