/* ============================================================
   Course player
   ============================================================ */
body.player{background:#fff}
.crs-bar{position:sticky;top:env(safe-area-inset-top,0px);z-index:40;background:rgba(255,255,255,.94);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--gray-200)}
.crs-bar__in{display:flex;align-items:center;gap:.75rem;min-height:var(--hdr);padding-inline:12px 20px}
.crs-bar__back{display:inline-flex;align-items:center;gap:.4rem;color:var(--ink);font-weight:600;font-size:.92rem;padding:.55rem .75rem;border-radius:999px;min-height:44px;flex:none}
.crs-bar__back:hover{background:rgba(29,26,27,.05);text-decoration:none}
.crs-bar__mark{width:28px;height:28px;flex:none}
.crs-bar__title{min-width:0;flex:1;display:grid;line-height:1.25}
.crs-bar__title strong{font-family:var(--ff-display);letter-spacing:-.02em;font-size:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.crs-bar__title span{font-size:.78rem;color:var(--gray-600);font-family:var(--ff-mono);font-variant-numeric:tabular-nums}
.crs-bar__prog{width:200px;display:grid;gap:.3rem;flex:none}
.crs-bar__prog span{font-family:var(--ff-mono);font-size:.75rem;color:var(--gray-600);text-align:right;font-variant-numeric:tabular-nums}
.crs-bar__toc{display:none}
.crs-bar__sep{width:1px;height:28px;background:var(--gray-200);flex:none}

.player-grid{display:grid;grid-template-columns:var(--rail) minmax(0,1fr);min-height:calc(100vh - var(--hdr))}

/* contents rail */
.toc{position:sticky;top:var(--hdr);align-self:start;height:calc(100vh - var(--hdr));overflow-y:auto;
  border-right:1px solid var(--gray-200);background:var(--paper);padding:1.25rem .75rem 6rem;overscroll-behavior:contain}
.toc__hdr{display:flex;justify-content:space-between;align-items:center;padding:0 .5rem .75rem}
.toc__close{display:none}
.toc ol{list-style:none;margin:0;padding:0}
.toc-sec{border-radius:var(--r)}
.toc-sec>summary,.toc-sec__row{list-style:none;display:grid;grid-template-columns:22px minmax(0,1fr) auto;gap:.6rem;align-items:start;
  padding:.55rem .5rem;border-radius:var(--r);font-size:.9rem;line-height:1.35;cursor:pointer;color:var(--ink)}
.toc-sec>summary::-webkit-details-marker{display:none}
.toc-sec>summary:hover{background:rgba(29,26,27,.04)}
.toc-sec__n{font-family:var(--ff-mono);font-size:.72rem;font-weight:600;color:var(--gray-600);margin-right:.35rem}
.toc-sec__c{font-family:var(--ff-mono);font-size:.7rem;color:var(--gray-500);padding-top:.15rem;font-variant-numeric:tabular-nums}
.toc-sec__row{cursor:not-allowed;color:var(--gray-500);opacity:.7}
.toc-sec__row .toc-sec__n{color:var(--gray-500)}
.toc-st{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;margin-top:-.05rem}
.toc-st--done{background:var(--ok-100);color:var(--ok)}
.toc-st--now{background:var(--amber);color:var(--ink)}
.toc-st--lock{color:var(--gray-500)}
.toc-st .ico{width:13px;height:13px;stroke-width:2.6}
.toc-sec[open]>summary{font-weight:600}
.toc-sec--now{background:#fff;box-shadow:inset 0 0 0 1px var(--gray-200)}
.toc-pages{padding:.15rem 0 .5rem 2.1rem;display:grid;gap:1px}
/* one row per page: status mark | label | quiz badge (direct children only;
   the label is itself a span) */
.toc-pages>a,.toc-pages>span{display:grid;grid-template-columns:16px minmax(0,1fr) auto;column-gap:.6rem;align-items:start;padding:.45rem .6rem;border-radius:8px;font-size:.86rem;line-height:1.35;color:var(--gray-700)}
.toc-pages>a:hover{background:var(--gray-100);text-decoration:none;color:var(--ink)}
.toc-pages .ico{width:15px;height:15px;margin-top:.11rem;justify-self:center}
.toc-ring{width:10px;height:10px;margin-top:.3rem;justify-self:center;border-radius:50%;border:2px solid var(--gray-400,#B5AFA5)}
.toc-pages .is-done .ico{color:var(--ok)}
.toc-pages .is-now{background:var(--amber-100);color:var(--ink);font-weight:600}
.toc-pages .is-now .ico{color:var(--amber-700)}
.toc-pages .is-lock{color:var(--gray-500);opacity:.6;cursor:not-allowed}
.toc-pages .is-quiz em{font-style:normal;font-family:var(--ff-mono);font-size:.66rem;letter-spacing:.05em;text-transform:uppercase;
  padding:.1em .45em;border-radius:99px;background:var(--blue-50);color:var(--blue-700);border:1px solid var(--blue-border);margin-left:auto;white-space:nowrap;align-self:center}
.toc-pages .is-lock.is-quiz em{background:transparent;color:var(--gray-500);border-color:var(--gray-200)}
.toc__foot{margin:1rem .5rem 0;font-size:.82rem;color:var(--gray-600);display:flex;gap:.5rem;align-items:flex-start}

/* reading column */
.reader{padding:2.5rem clamp(20px,5vw,4rem) calc(var(--bar) + 4rem);min-width:0}
.reader__in{max-width:var(--read);margin-inline:auto;display:grid;gap:1.5rem}
.reader__hdr{display:grid;gap:.6rem}
.reader__hdr h1{font-size:clamp(1.65rem,3vw,2.25rem)}
.reader__admin{font-size:.85rem;display:flex;gap:1rem}
.reader__admin a{color:var(--gray-600)}
.flash{display:flex;align-items:center;gap:.7rem;padding:.75rem 1rem;border-radius:var(--r);background:var(--ok-100);color:var(--ok);font-weight:600;font-size:.95rem;border:1px solid var(--ok-border)}
.flash button{margin-left:auto;background:none;border:0;color:inherit;cursor:pointer;padding:.25rem;border-radius:6px;display:grid}

/* legacy CKEditor course content: tame inline styles, keep it readable on a phone */
.prose{font-size:17px;line-height:1.7;color:var(--ink);overflow-wrap:break-word}
.prose>*+*{margin-top:1.1em}
.prose p,.prose ul,.prose ol{margin:0}
.prose ul,.prose ol{padding-left:1.35em}
.prose li+li{margin-top:.35em}
.prose strong,.prose b{font-weight:650}
.prose h2,.prose h3,.prose h4{margin-top:1.6em}
.prose img{height:auto!important;max-width:100%!important;border-radius:var(--r)}
.prose iframe,.prose video{width:100%!important;height:auto!important;aspect-ratio:16/9;border:0;border-radius:var(--r)}
.prose .tbl-wrap{position:relative;overflow-x:auto;border:1px solid var(--gray-200);border-radius:var(--r-lg)}
.prose table{width:100%!important;border-collapse:collapse!important;border:0!important;font-size:.95rem;line-height:1.55}
.prose th,.prose td{padding:.85rem 1rem!important;border:0!important;border-bottom:1px solid var(--gray-200)!important;vertical-align:top;text-align:left}
.prose thead th,.prose thead td{font-family:var(--ff-mono);font-size:.72rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--gray-600);background:var(--gray-100)}
.prose tr[style]{background:transparent!important}
.prose tbody tr:nth-child(even){background:var(--paper)!important}
.prose tbody tr:last-child td{border-bottom:0!important}
.prose td:first-child{white-space:nowrap}
@media (max-width:600px){.prose td:first-child{white-space:normal}}
.media-ph{aspect-ratio:16/9;max-width:100%;border-radius:var(--r-lg);background:linear-gradient(135deg,#2a2627,var(--ink-900));color:#E9E5DE;display:grid;place-items:center;position:relative;overflow:hidden}
.media-ph__play{width:64px;height:64px;border-radius:50%;background:var(--amber);color:var(--ink);display:grid;place-items:center;box-shadow:0 10px 30px rgba(0,0,0,.35)}
.media-ph__play .ico{width:26px;height:26px;fill:currentColor;stroke:none;margin-left:3px}
.media-ph figcaption{position:absolute;left:1rem;bottom:.8rem;font-family:var(--ff-mono);font-size:.72rem;letter-spacing:.06em;text-transform:uppercase;color:#bdb6ac}

/* bottom action bar */
.pbar{position:fixed;left:var(--rail);right:0;bottom:0;z-index:30;background:rgba(255,255,255,.96);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  border-top:1px solid var(--gray-200);padding-bottom:env(safe-area-inset-bottom,0px)}
.pbar__in{max-width:calc(var(--read) + 8rem);margin-inline:auto;min-height:var(--bar);display:flex;align-items:center;gap:1rem;padding-inline:20px}
.pbar__mid{flex:1;display:grid;justify-items:center;gap:.35rem;font-family:var(--ff-mono);font-size:.78rem;color:var(--gray-600);font-variant-numeric:tabular-nums;text-align:center}
.pbar__mid .meter{width:min(220px,100%)}
.pbar .btn--primary{min-width:150px}

/* quiz */
.quiz{display:grid;gap:1.25rem}
.quiz-meta{display:flex;flex-wrap:wrap;gap:.5rem}
.q{border:1px solid var(--gray-200);border-radius:var(--r-lg);padding:1.25rem;margin:0;display:grid;gap:1rem;background:#fff;min-width:0}
.q legend{padding:0;display:contents}
.q__n{font-family:var(--ff-mono);font-size:.72rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--gray-600)}
.q__text{font-size:1.12rem;font-weight:650;line-height:1.4;letter-spacing:-.01em}
.opts{display:grid;gap:.5rem}
.opt{display:flex;align-items:center;gap:.85rem;padding:.85rem 1rem;min-height:52px;border:1.5px solid var(--gray-200);border-radius:var(--r);cursor:pointer;
  transition:border-color var(--t),background var(--t);font-size:1rem}
.opt:hover{border-color:var(--gray-300);background:var(--paper)}
.opt input{appearance:none;-webkit-appearance:none;width:22px;height:22px;border-radius:50%;border:2px solid var(--gray-300);margin:0;flex:none;display:grid;place-items:center;background:#fff}
.opt input::after{content:"";width:10px;height:10px;border-radius:50%;background:var(--blue-700);transform:scale(0);transition:transform .15s}
.opt input:checked{border-color:var(--blue-700)}
.opt input:checked::after{transform:scale(1)}
.opt input:focus-visible{outline:3px solid var(--blue);outline-offset:2px}
.opt:has(input:checked){border-color:var(--blue-700);background:var(--blue-50)}
.q__fb{display:none;gap:.6rem;align-items:flex-start;padding:.7rem .9rem;border-radius:var(--r);font-size:.93rem;font-weight:500}
.q__fb .ico{margin-top:.1rem}
.q[data-result="right"]{border-color:var(--ok-border)}
.q[data-result="right"] .q__fb--right{display:flex;background:var(--ok-100);color:var(--ok)}
.q[data-result="wrong"]{border-color:var(--red-border);box-shadow:0 0 0 3px var(--red-100)}
.q[data-result="wrong"] .q__fb--wrong{display:flex;background:var(--red-100);color:var(--red)}
.q[data-result="missing"]{border-color:var(--amber-border);box-shadow:0 0 0 3px var(--amber-50)}
.q[data-result="missing"] .q__fb--missing{display:flex;background:var(--amber-50);color:var(--amber-700)}
.quiz-fail{display:none}
.quiz[data-failed] .quiz-fail{display:flex}

/* player on small screens: rail becomes a drawer */
.scrim{display:none}
@media (max-width:960px){
  .player-grid{grid-template-columns:1fr}
  .crs-bar__prog,.crs-bar__sep,.crs-bar__back span{display:none}
  .crs-bar__toc{display:inline-flex}
  .toc{position:fixed;z-index:70;top:0;left:0;bottom:0;width:min(88vw,360px);height:auto;transform:translateX(-102%);
    transition:transform .25s var(--t);box-shadow:var(--shadow-lg);padding-top:calc(1rem + env(safe-area-inset-top,0px))}
  .toc__close{display:inline-flex}
  body.toc-open .toc{transform:none}
  body.toc-open .scrim{display:block;position:fixed;inset:0;z-index:65;background:rgba(20,18,19,.35)}
  .pbar{left:0}
  .reader{padding-top:1.5rem}
}
@media (max-width:520px){
  .pbar__in{gap:.5rem;padding-inline:12px}
  .pbar .btn--primary{min-width:0;padding-inline:1.1em}
  .pbar .btn--ghost span{display:none}
}

/* outline: nested sections, group labels, open pages */
.toc-depth-1{padding-left:.9rem}
.toc-depth-2{padding-left:1.8rem}
.toc-depth-3{padding-left:2.7rem}
.toc-group{padding:.85rem .5rem .3rem;font-family:var(--ff-mono);font-size:.7rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--gray-600)}
.toc-st--open{border:2px solid var(--gray-300);width:16px;height:16px;margin:3px}
.toc-pages .is-open{color:var(--ink)}
.pbar__spacer{min-width:44px}

/* quiz markup comes from Question#as_html: ul > li > label > input + span */
.opts{list-style:none;margin:0;padding:0;display:grid;gap:.5rem}
.opts li{margin:0}
.opts li>label{display:flex;align-items:center;gap:.85rem;padding:.85rem 1rem;min-height:52px;border:1.5px solid var(--gray-200);border-radius:var(--r);
  cursor:pointer;transition:border-color var(--t),background var(--t);font-size:1rem;background:#fff}
.opts li>label:hover{border-color:var(--gray-300);background:var(--paper)}
.opts input[type=radio]{appearance:none;-webkit-appearance:none;width:22px;height:22px;border-radius:50%;border:2px solid var(--gray-300);margin:0;flex:none;display:grid;place-items:center;background:#fff}
.opts input[type=radio]::after{content:"";width:10px;height:10px;border-radius:50%;background:var(--blue-700);transform:scale(0);transition:transform .15s}
.opts input[type=radio]:checked{border-color:var(--blue-700)}
.opts input[type=radio]:checked::after{transform:scale(1)}
.opts input[type=radio]:focus-visible{outline:3px solid var(--blue);outline-offset:2px}
.opts li>label:has(input:checked){border-color:var(--blue-700);background:var(--blue-50)}
.opts select,.opts input[type=text]{width:100%;min-height:48px;padding:.75rem 1rem;font:inherit;font-size:1rem;border:1px solid var(--gray-300);border-radius:var(--r);background:#fff}
.opts select:focus,.opts input[type=text]:focus{outline:0;border-color:var(--blue);box-shadow:0 0 0 4px rgba(23,153,206,.15)}
.q__text{font-size:1.12rem;font-weight:650;line-height:1.4;letter-spacing:-.01em}
.q__text p{margin:0}
.q__text strong,.q__text b{font-weight:inherit}
.quiz-submit{display:flex;justify-content:flex-end}
.reader .flashes{margin:0;padding:0;max-width:none}

/* legacy course content: floated images sit beside text on wide screens only */
.prose img[style*="float"],.prose img[align]{margin:.25rem 0 1rem 1.5rem}
.prose img[style*="float: left"],.prose img[align=left]{margin:.25rem 1.5rem 1rem 0}
.prose::after{content:"";display:table;clear:both}
.prose a{text-decoration:underline;text-underline-offset:3px}
.prose blockquote{margin:0;padding:.75rem 1.25rem;border-left:3px solid var(--amber);background:var(--amber-50);border-radius:0 var(--r) var(--r) 0}
@media (max-width:640px){
  .prose img{float:none!important;display:block;margin:0 0 1rem!important;width:auto!important}
  .prose [style*="width"]:not(img):not(table){width:auto!important;max-width:100%!important}
  .prose td,.prose th{white-space:normal}
}

/* Course content written for the old site's Bootstrap modals: the
   legacy-modals controller turns each div.modal into a dialog.modal and each
   link that opened one into a .legacy-modal-link button. Until then (or
   without JavaScript) the old markup stays hidden, as Bootstrap's .hide did. */
.prose div.modal{display:none}
.legacy-modal-link{display:inline;padding:0;border:0;background:none;font:inherit;color:var(--blue-700);
  text-decoration:underline;text-underline-offset:3px;cursor:pointer;text-align:left}
.legacy-modal-link:hover{color:var(--ink)}
.legacy-modal-link:focus-visible{outline:3px solid var(--blue);outline-offset:2px;border-radius:2px}
/* .prose>*+* spaces the page's blocks; a dialog centres itself with margin:auto. */
.prose dialog.legacy-modal{margin:auto;font-size:17px;line-height:1.6}
.legacy-modal .modal__head h2{margin:0}
.legacy-modal__body{display:grid;gap:.9rem}
.legacy-modal__body img{max-width:100%;height:auto!important}
