/* Course Manager — shared UI system.
   Design tokens + app shell (top bar, user badge) + the reusable overlay
   components: buttons, popover menu, and modal/confirm dialog. Every
   confirmation, popup and modal in the app is built from these classes so they
   look identical. Page-specific CSS lives in each template's page_css block. */

:root{
  /* palette — "blueprint" (light, cool, precise); plain paper background */
  --paper:#EEF2F9;
  --card:#F8FAFD;
  --ink:#0B1F3A;
  --ink-60:#4a5a72;
  --ink-40:#8593a6;
  --eth-blue:#215CAF;
  --eth-blue-d:#1a4c92;
  --blueprint:#7FA6D8;
  --free:#2E9E8F;
  --signal:#E8543B;
  --signal-d:#c73f28;
  /* structure */
  --rule:rgba(127,166,216,.34);
  --rule-soft:rgba(127,166,216,.18);
  --topbar-bg:rgba(238,242,249,.86);
  --sheen:rgba(255,255,255,.55);   /* subtle top highlight on raised cards */
  --ethlogo-h:20px;              /* drives ETH wordmark height AND its clear-space */
  --radius:4px;
  --radius-lg:6px;
  --top-h:60px;
  --shadow-pop:0 12px 34px rgba(11,31,58,.16);
  --shadow-modal:0 24px 70px rgba(11,31,58,.28);
  --font-ui:"Space Grotesk",system-ui,sans-serif;
  --font-data:"IBM Plex Mono",ui-monospace,monospace;
}

/* ————— dark theme —————
   Applied when the user picks Dark (:root[data-theme="dark"]) or, under the
   System choice, when the OS prefers dark (:root without a data-theme). */
:root[data-theme="dark"]{
  --paper:#0B1220;--card:#131d30;--ink:#EAF0FA;--ink-60:#A7B6CC;--ink-40:#70819B;
  --eth-blue:#4C89DA;--eth-blue-d:#3f76c0;--blueprint:#7FA6D8;--free:#33B3A2;--signal:#F0684F;--signal-d:#d1543d;
  --rule:rgba(127,166,216,.26);--rule-soft:rgba(127,166,216,.14);
  --topbar-bg:rgba(11,18,32,.86);--sheen:rgba(255,255,255,.04);
  --shadow-pop:0 12px 34px rgba(0,0,0,.5);--shadow-modal:0 24px 70px rgba(0,0,0,.6);
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme]){
    --paper:#0B1220;--card:#131d30;--ink:#EAF0FA;--ink-60:#A7B6CC;--ink-40:#70819B;
    --eth-blue:#4C89DA;--eth-blue-d:#3f76c0;--blueprint:#7FA6D8;--free:#33B3A2;--signal:#F0684F;--signal-d:#d1543d;
    --rule:rgba(127,166,216,.26);--rule-soft:rgba(127,166,216,.14);
    --topbar-bg:rgba(11,18,32,.86);--sheen:rgba(255,255,255,.04);
    --shadow-pop:0 12px 34px rgba(0,0,0,.5);--shadow-modal:0 24px 70px rgba(0,0,0,.6);
  }
}
/* ETH wordmark: bright (dark-ink) variant on light theme, white variant on dark.
   Hide rule is doubled (.ethlogo.ethlogo-dark) so it beats the later .ethlogo{display:block}. */
.ethlogo.ethlogo-dark{display:none}
:root[data-theme="dark"] .ethlogo-bright{display:none}
:root[data-theme="dark"] .ethlogo-dark{display:block}
@media (prefers-color-scheme:dark){
  :root:not([data-theme]) .ethlogo-bright{display:none}
  :root:not([data-theme]) .ethlogo-dark{display:block}
}
*{box-sizing:border-box}
html,body{margin:0}
body{
  font-family:var(--font-ui);color:var(--ink);background:var(--paper);
  -webkit-font-smoothing:antialiased;line-height:1.45;
}
a{color:inherit}
.mono{font-family:var(--font-data)}
.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}

/* ————— top bar ————— */
.topbar{
  position:sticky;top:0;z-index:40;height:var(--top-h);
  display:flex;align-items:center;gap:16px;
  /* No LEFT padding: the org logo's own clear-space (.ethlogo padding = --ethlogo-h) is
     its margin, so its left gap equals its top/bottom gap and does not vary with window
     width. Right padding (for the alerts) still scales. */
  padding:0 clamp(14px,3vw,30px) 0 0;
  background:var(--topbar-bg);backdrop-filter:blur(9px);
  border-bottom:1px solid var(--rule);
}
.brand{display:flex;align-items:center;gap:14px;min-width:0}
.ethlogo{height:var(--ethlogo-h);padding:var(--ethlogo-h);box-sizing:content-box;display:block}
.brand-div{width:1px;height:26px;background:var(--rule);flex:none}
.emblem{width:26px;height:26px;flex:none;display:block}
.title{display:flex;flex-direction:column;min-width:0}
.title b{font-size:15px;font-weight:600;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.spacer{flex:1}
.alerts{display:flex;align-items:center;gap:6px}
.iconbtn{position:relative;width:38px;height:38px;flex:none;display:grid;place-items:center;
  border-radius:var(--radius);border:1px solid transparent;background:none;color:var(--ink-60);cursor:pointer}
.iconbtn:hover{background:rgba(33,92,175,.08);color:var(--ink)}
.iconbtn svg{width:19px;height:19px}
.hamburger{display:none}
.badge{position:absolute;top:5px;right:5px;min-width:15px;height:15px;padding:0 3px;display:grid;place-items:center;
  border-radius:8px;background:var(--signal);color:#fff;font-family:var(--font-data);font-size:9px;font-weight:600;
  border:1.5px solid var(--paper)}
.badge.is-zero{display:none}

/* ————— user badge + menu ————— */
.user{position:relative}
.userbtn{display:flex;align-items:center;gap:9px;padding:4px 8px 4px 5px;border-radius:999px;
  border:1px solid transparent;background:none;cursor:pointer;font-family:var(--font-ui)}
.userbtn:hover{background:rgba(33,92,175,.07)}
.userbtn[aria-expanded="true"]{background:rgba(33,92,175,.10);border-color:var(--rule)}
.avatar{width:32px;height:32px;flex:none;border-radius:50%;
  background:linear-gradient(135deg,var(--eth-blue),#3a78c9);color:#fff;display:grid;place-items:center;
  font-family:var(--font-data);font-weight:600;font-size:12px;letter-spacing:.02em}
.who{display:flex;flex-direction:column;line-height:1.2;text-align:left;min-width:0}
.who b{font-size:13px;font-weight:600;color:var(--ink)}
.who span{font-size:10.5px;color:var(--ink-40);font-family:var(--font-data)}
.chev{width:15px;height:15px;color:var(--ink-40);flex:none;transition:transform .15s}
.userbtn[aria-expanded="true"] .chev{transform:rotate(180deg)}

.popover{position:absolute;top:calc(100% + 8px);right:0;z-index:50;min-width:266px;
  background:var(--card);border:1px solid var(--rule);border-radius:var(--radius-lg);
  box-shadow:var(--shadow-pop);overflow:hidden;transform-origin:top right}
.popover[hidden]{display:none}
.pop-open{animation:pop .12s ease both}
@keyframes pop{from{opacity:0;transform:scale(.97) translateY(-4px)}to{opacity:1;transform:none}}
.pop-id{display:flex;gap:11px;padding:14px 15px;border-bottom:1px solid var(--rule-soft)}
.pop-id .avatar{width:40px;height:40px;font-size:14px}
.pop-id .meta{min-width:0}
.pop-id .nm{font-size:14px;font-weight:600;letter-spacing:-.01em}
.pop-id .un,.pop-id .em{font-family:var(--font-data);font-size:11px;color:var(--ink-40);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pop-roles{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}
.role-chip{font-family:var(--font-data);font-size:9.5px;font-weight:600;letter-spacing:.06em;
  padding:2px 7px;border-radius:3px;color:var(--eth-blue);background:rgba(33,92,175,.10)}
.pop-list{padding:6px}
.pop-item{width:100%;display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--radius);
  background:none;border:none;cursor:pointer;font-family:var(--font-ui);font-size:13.5px;color:var(--ink);
  text-align:left;text-decoration:none}
.pop-item svg{width:16px;height:16px;color:var(--ink-40);flex:none}
.pop-item:hover{background:rgba(33,92,175,.07)}
.pop-item.danger{color:var(--signal)}
.pop-item.danger svg{color:var(--signal)}
.pop-item.danger:hover{background:rgba(232,84,59,.09)}
.pop-div{height:1px;background:var(--rule-soft);margin:6px 6px}

/* ————— buttons ————— */
.btn{font-family:var(--font-ui);display:inline-flex;align-items:center;justify-content:center;gap:8px;
  height:40px;padding:0 16px;border-radius:var(--radius);font-size:14px;font-weight:600;letter-spacing:-.01em;
  border:1px solid transparent;cursor:pointer;background:none;color:var(--ink);
  transition:background .15s,transform .15s,box-shadow .15s,border-color .15s}
.btn:active{transform:translateY(1px)}
.btn-primary{background:var(--eth-blue);color:#fff;border-color:var(--eth-blue-d);box-shadow:0 4px 12px rgba(33,92,175,.22)}
.btn-primary:hover{background:var(--eth-blue-d)}
.btn-ghost{color:var(--ink-60);border-color:var(--rule)}
.btn-ghost:hover{background:rgba(33,92,175,.06);color:var(--ink)}
.btn-danger{background:var(--signal);color:#fff;border-color:var(--signal-d);box-shadow:0 4px 12px rgba(232,84,59,.22)}
.btn-danger:hover{background:var(--signal-d)}
.btn-sm{height:32px;padding:0 12px;font-size:13px}

/* ————— modal / confirm dialog ————— */
.modal-scrim{position:fixed;inset:0;z-index:100;display:grid;place-items:center;padding:24px;
  background:rgba(11,31,58,.42);backdrop-filter:blur(3px)}
.modal-scrim[hidden]{display:none}
.scrim-open{animation:fade .12s ease both}
@keyframes fade{from{opacity:0}to{opacity:1}}
.modal{width:100%;max-width:440px;background:var(--card);border:1px solid var(--rule);
  border-radius:var(--radius-lg);box-shadow:var(--shadow-modal);overflow:hidden}
/* Roomier variant for content-heavy dialogs (e.g. the add-members table): grows with the
   viewport up to a cap, and its body scrolls internally when tall so header/footer stay put. */
.modal-wide{max-width:min(960px,94vw);max-height:88vh;display:flex;flex-direction:column}
.modal-wide .modal-hd,.modal-wide .modal-ft{flex:none}
.modal-wide .modal-bd{overflow:auto;flex:1 1 auto}
.modal-open{animation:rise-modal .14s ease both}
@keyframes rise-modal{from{opacity:0;transform:translateY(8px) scale(.99)}to{opacity:1;transform:none}}
.modal-hd{display:flex;align-items:center;gap:11px;padding:16px 18px;border-bottom:1px solid var(--rule-soft)}
.modal-hd .tone{width:9px;height:9px;border-radius:50%;background:var(--eth-blue);flex:none}
.modal-hd.tone-danger .tone{background:var(--signal)}
.modal-hd h2{font-size:15px;font-weight:600;letter-spacing:-.01em;margin:0}
.modal-hd .modal-saved{margin-left:auto;display:none;font-family:var(--font-data);font-size:11px;font-weight:600;
  color:var(--free);background:rgba(46,158,143,.14);padding:3px 10px;border-radius:999px;white-space:nowrap}
.modal-hd .modal-saved.show{display:inline-block;animation:modalSaved 1.15s ease forwards}
@keyframes modalSaved{0%{opacity:0}12%{opacity:1}68%{opacity:1}100%{opacity:0}}
@media (prefers-reduced-motion:reduce){.modal-hd .modal-saved.show{animation-duration:.01s}}
.modal-hd .x{margin-left:auto;width:30px;height:30px;display:grid;place-items:center;border:none;background:none;
  cursor:pointer;color:var(--ink-40);border-radius:var(--radius)}
.modal-hd .x:hover{background:rgba(33,92,175,.08);color:var(--ink)}
.modal-bd{padding:16px 18px;font-size:14px;color:var(--ink-60);line-height:1.55}
.modal-bd p{margin:0 0 10px}
.modal-bd p:last-child{margin-bottom:0}
.modal-ft{display:flex;justify-content:flex-end;gap:10px;padding:14px 18px;border-top:1px solid var(--rule-soft)}

/* dummy preferences layout used inside a modal body */
.pref-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:11px 0;
  border-bottom:1px solid var(--rule-soft)}
.pref-row:last-child{border-bottom:none}
.pref-row .lbl{font-size:13.5px;color:var(--ink);font-weight:500}
.pref-row .hint{font-size:11px;color:var(--ink-40);font-family:var(--font-data)}
.pref-row select,.pref-row .toggle{font-family:var(--font-data);font-size:12.5px;color:var(--ink-60);
  border:1px solid var(--rule);border-radius:var(--radius);padding:6px 9px;background:var(--paper)}
.pref-row .pref-toggle{width:18px;height:18px;flex:none;cursor:pointer;accent-color:var(--eth-blue)}
.detail-dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:8px 14px}
.detail-dl dt{font-family:var(--font-data);font-size:11px;color:var(--ink-40);text-transform:uppercase;letter-spacing:.08em}
.detail-dl dd{margin:0;font-family:var(--font-data);font-size:12.5px;color:var(--ink);word-break:break-word}

a:focus-visible,button:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--eth-blue);outline-offset:2px}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
