/* Карточки, оповещения, формы, кнопки */
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:20px 22px;margin-bottom:18px;box-shadow:var(--sh)}
.narrow{max-width:560px;margin-left:auto;margin-right:auto}
.page-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.page-head h1,.page-head h2{margin:0}
.actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.alert{background:var(--warn-soft);border:1px solid color-mix(in srgb,var(--warn) 35%,transparent);color:var(--text);border-radius:var(--r);padding:10px 14px;margin:0 0 14px}
.alert-ok{background:var(--ok-soft);border-color:color-mix(in srgb,var(--ok) 35%,transparent)}
.alert-info{background:var(--info-soft);border-color:color-mix(in srgb,var(--info) 35%,transparent)}
.alert-err{background:var(--bad-soft);border-color:color-mix(in srgb,var(--bad) 40%,transparent)}
/* Пустые состояния списков: заголовок, подсказка, действие */
.empty{text-align:center;padding:28px 12px}.empty b{font-size:16px;display:block}.empty p{margin:6px auto 12px;max-width:46ch}.empty-cell{padding:8px!important}
label{display:block;margin:0 0 13px;font-weight:600;font-size:13.5px;color:var(--text-2)}
label small{display:block;font-weight:400;color:var(--muted);margin-top:4px}
input:not([type=checkbox]):not([type=radio]):not([type=file]),select,textarea{display:block;width:100%;margin-top:6px;padding:9px 12px;border:1px solid var(--line-2);border-radius:var(--r-sm);font:inherit;background:var(--surface);color:var(--text);transition:border-color .12s,box-shadow .12s}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--accent);box-shadow:var(--ring)}
textarea{resize:vertical;min-height:72px}input[type=file]{margin-top:6px;font-weight:400;color:var(--text-2)}
.check{display:flex;align-items:center;gap:8px;font-weight:500}.check input{margin:0;accent-color:var(--accent)}
.radio-row{display:flex;gap:10px;margin-bottom:14px}.radio-row .check{flex:1;justify-content:center;border:1px solid var(--line-2);border-radius:var(--r);padding:10px 14px;cursor:pointer;font-weight:600;background:var(--surface);transition:background .12s,border-color .12s}.radio-row .check:hover{background:var(--surface-2)}.radio-row .grade-pass:has(input:checked){background:var(--ok-soft);border-color:var(--ok);color:var(--ok)}.radio-row .grade-fail:has(input:checked){background:var(--bad-soft);border-color:var(--bad);color:var(--bad)}
fieldset{border:1px solid var(--line);border-radius:var(--r);padding:10px 14px;margin:0 0 14px}legend{font-weight:600;font-size:12.5px;color:var(--muted);padding:0 6px;text-transform:uppercase;letter-spacing:.04em}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 14px;border:1px solid var(--line-2);border-radius:var(--r-sm);background:var(--surface);color:var(--text);font:inherit;font-weight:600;font-size:14px;cursor:pointer;line-height:1.3;transition:background .12s,border-color .12s,transform .06s;box-shadow:var(--sh-sm)}
.btn:hover{background:var(--surface-3);text-decoration:none}.btn:active{transform:translateY(1px)}
.btn-primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn-primary:hover{background:var(--accent-2);border-color:var(--accent-2)}
:root[data-theme="dark"] .btn-primary{color:#0b1020}
.btn-ghost{border-color:transparent;background:transparent;box-shadow:none}.btn-ghost:hover{background:var(--surface-3)}
.btn-sm{padding:5px 10px;font-size:13px}.btn-block{display:flex;width:100%;margin-top:10px}
.btn-ok{background:var(--ok-soft);border-color:color-mix(in srgb,var(--ok) 40%,transparent);color:var(--ok)}
.btn-danger{background:var(--bad-soft);border-color:color-mix(in srgb,var(--bad) 40%,transparent);color:var(--bad)}
.btn:disabled{opacity:.6;cursor:default}
.inline{display:inline}.inline-form{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap}.inline-form label{margin:0;flex:1 1 180px}.inline-form.compact{gap:4px}
/* Значки, таблицы, списки, сетки, прогресс, плитки */
.badge{display:inline-flex;align-items:center;gap:4px;padding:2px 9px;border-radius:999px;font-size:12px;font-weight:600;background:var(--surface-3);color:var(--text-2);white-space:nowrap;line-height:1.5}
.badge-ok{background:var(--ok-soft);color:var(--ok)}.badge-warn{background:var(--warn-soft);color:var(--warn)}
.status-not_started{background:var(--surface-3);color:var(--text-2)}.status-in_progress{background:var(--info-soft);color:var(--info)}
.status-submitted{background:var(--warn-soft);color:var(--warn)}.status-pass{background:var(--ok-soft);color:var(--ok)}
.status-fail{background:var(--bad-soft);color:var(--bad)}.status-graded{background:var(--violet-soft);color:var(--violet)}
.table{width:100%;border-collapse:collapse;font-size:14px}
.table th,.table td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--line);vertical-align:middle}
.table th{font-size:11.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);font-weight:600;background:var(--surface-2)}
.table tbody tr:hover{background:var(--surface-2)}.table tbody tr:last-child td{border-bottom:0}
.table-scroll{overflow-x:auto}.scoreboard td:nth-child(2){white-space:nowrap}.row-draft{opacity:.65}.row-pending{background:var(--warn-soft)}.row-me{background:var(--accent-soft)}
.list{list-style:none;padding:0;margin:0}.list li{padding:8px 0;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:8px;flex-wrap:wrap}.list li:last-child{border-bottom:0}
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:0 18px}.grid-3{display:grid;grid-template-columns:2fr 1fr 1fr;gap:0 16px}.grid-4{display:grid;grid-template-columns:repeat(4,1fr);gap:0 16px}
.align-start{align-items:start}.grid-2>.card{margin-bottom:0}
.bar{height:8px;background:var(--surface-3);border-radius:999px;overflow:hidden;min-width:90px}.bar span{display:block;height:100%;background:linear-gradient(90deg,var(--ok),#22c55e);transition:width .3s}.bar.big{height:10px;margin:8px 0}
.lab-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}
.lab-tile{display:flex;flex-direction:column;gap:6px;padding:14px 16px;border:1px solid var(--line);border-radius:var(--r);color:var(--text);background:var(--surface);position:relative;overflow:hidden;transition:border-color .12s,box-shadow .12s}
.lab-tile::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--line-2)}
.lab-tile:hover{text-decoration:none;border-color:var(--accent);box-shadow:var(--sh)}
.lab-tile.status-in_progress::before{background:var(--info)}.lab-tile.status-submitted::before{background:var(--warn)}.lab-tile.status-pass::before{background:var(--ok)}.lab-tile.status-fail::before{background:var(--bad)}.lab-tile.status-graded::before{background:var(--violet)}
.lab-tile.status-in_progress,.lab-tile.status-submitted,.lab-tile.status-pass,.lab-tile.status-fail,.lab-tile.status-graded{background:var(--surface);color:var(--text)}
.lab-num{font-size:12px;color:var(--muted);font-weight:600;letter-spacing:.03em}.lab-title{font-weight:650;line-height:1.3}.lab-status{font-size:12.5px;color:var(--muted)}
.course-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}
.course-card{display:block;color:var(--text);padding:0;overflow:hidden}.course-card:hover{text-decoration:none;border-color:var(--accent);box-shadow:var(--sh-lg)}
.course-card .cover{width:100%;aspect-ratio:16/7;object-fit:cover;display:block}.course-card h2,.course-card p{padding:0 18px}.course-card h2{margin-top:14px}.course-card p{padding-bottom:14px}
.join-code{font:600 22px/1 var(--mono);letter-spacing:.14em;background:var(--accent-soft);color:var(--accent-ink);padding:6px 12px;border-radius:var(--r-sm)}
.queue{border-left:4px solid var(--warn)}
.scoreboard td.cell-pass{color:var(--ok);font-weight:700}.scoreboard td.cell-fail{color:var(--bad);font-weight:700}.scoreboard td.cell-submitted{color:var(--warn)}.scoreboard td.cell-none{color:var(--line-2)}

.resume{display:flex;align-items:center;justify-content:space-between;gap:16px;border-left:4px solid var(--accent);background:linear-gradient(90deg,var(--accent-soft),var(--surface) 55%)}.resume-body{min-width:0;flex:1}.resume-meta{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.resume-progress{display:flex;align-items:center;gap:10px;margin-top:4px}.resume-progress .bar{flex:1 1 120px;max-width:320px}.resume-progress .nowrap{flex:none}@media (max-width:640px){.resume{flex-direction:column;align-items:stretch}.resume-meta{white-space:normal}.resume .btn{width:100%}}
.resume-body{display:flex;flex-direction:column;gap:5px}.resume-kicker{font-size:11.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.resume-title{font-size:19px;font-weight:700;color:var(--text);line-height:1.3}.resume-title:hover{color:var(--accent-ink);text-decoration:none}
/* Дашборд преподавателя */
.staff-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px}
.staff-card{display:flex;flex-direction:column;gap:10px;padding:16px 18px;border:1px solid var(--line);border-radius:var(--r);background:var(--surface-2)}
.staff-card h3{margin:0;font-size:16px}
.stats{display:flex;gap:14px;flex-wrap:wrap}
.stat{display:flex;flex-direction:column;gap:2px;min-width:80px}.stat b{font:600 20px var(--mono);color:var(--text)}.stat span{font-size:12px;color:var(--muted)}
.stat.warn b{color:var(--warn)}
/* Строка-указатель на дашборде: преподавание живёт в отдельном разделе */
.staff-strip{display:flex;flex-direction:column;gap:10px}
.staff-strip-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
/* Быстрый переход в свой курс прямо с «Моих курсов» */
.course-jump{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.course-chip{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid var(--line);border-radius:999px;background:var(--surface-2);color:var(--text);font-weight:600;font-size:14px}
.course-chip:hover{border-color:var(--accent);color:var(--accent-ink);text-decoration:none;background:var(--surface)}
.course-chip-mark{font-size:15px;line-height:1}
.course-chip-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:min(52vw,360px)}
/* Управление курсами: карточка курса со счётчиками и ссылками в разделы */
.manage-card{display:flex;flex-direction:column;gap:12px}
.manage-card-head h2{margin:0;font-size:19px}.manage-card-head p{margin:2px 0 0}
.manage-links{display:flex;gap:8px;flex-wrap:wrap}
/* Панель администратора: блоки в две колонки и список «ключ — значение» */
.admin-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(420px,100%),1fr));gap:14px;align-items:start}
.admin-grid .card{margin:0}
/* Заявки на курс: подтвердить одной кнопкой, отклонить — с причиной в той же строке */
.req-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.req-reject{display:flex;align-items:center;gap:6px}
.req-reject input[name="reason"]{width:200px;min-width:0}
@media (max-width:720px){.req-reject{flex:1 1 100%}.req-reject input[name="reason"]{flex:1}}
/* Привязка второго фактора: QR слева, ручной ключ справа */
.totp-setup{display:flex;gap:18px;flex-wrap:wrap;align-items:flex-start;margin:10px 0 14px}
.totp-qr{flex:none;width:184px;height:184px;padding:8px;background:#fff;border:1px solid var(--line);border-radius:var(--r)}
.totp-qr svg{display:block;width:100%;height:100%}
.totp-manual{flex:1 1 220px;min-width:0}
.totp-manual p{margin:0 0 6px}
.totp-secret{overflow-wrap:anywhere}
.kv{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;margin:0}
.kv dt{color:var(--muted);font-size:13px}
.kv dd{margin:0;font-size:13px;min-inline-size:0;overflow-wrap:anywhere}
@media (max-width:520px){.kv{grid-template-columns:1fr;gap:2px 0}.kv dd{margin-bottom:6px}}

/* Дашборд студента: шапка курса со сводкой и список лабораторных строками */
.course-block{padding:0;overflow:hidden}
.course-head{display:flex;align-items:center;gap:16px;padding:18px 22px;border-bottom:1px solid var(--line);background:var(--surface-2)}
.course-thumb{width:64px;height:64px;border-radius:var(--r);object-fit:cover;flex:none;border:1px solid var(--line)}
.course-head-body{flex:1;min-width:0}.course-head h2{margin:0 0 6px;font-size:20px}.course-head h2 a{color:var(--text)}.course-head h2 a:hover{color:var(--accent-ink);text-decoration:none}
.course-summary{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.course-summary .bar{flex:0 1 220px}
.lab-list{list-style:none;margin:0;padding:0}
.lab-row{display:flex;align-items:center;gap:14px;padding:13px 22px;border-bottom:1px solid var(--line);color:var(--text);transition:background .12s}
.lab-list li:last-child .lab-row{border-bottom:0}
.lab-row:hover{background:var(--surface-2);text-decoration:none}
.lab-row-mark{flex:none;width:34px;height:34px;border-radius:50%;display:grid;place-items:center;font-weight:700;font-size:13.5px;background:var(--surface-3);color:var(--muted);border:2px solid transparent}
.lab-row.st-in_progress{background:color-mix(in srgb,var(--info) 5%,var(--surface))}.lab-row.st-in_progress .lab-row-mark{background:var(--surface);color:var(--info);border-color:var(--info)}
.lab-row.st-submitted .lab-row-mark{background:var(--warn-soft);color:var(--warn)}
.lab-row.st-pass .lab-row-mark,.lab-row.st-graded .lab-row-mark{background:var(--ok);color:#fff}
.lab-row.st-fail .lab-row-mark{background:var(--bad-soft);color:var(--bad)}
.lab-row-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.lab-row-title{font-weight:600;line-height:1.35}
.lab-row-meta{display:flex;flex-wrap:wrap;gap:4px 12px;font-size:12.5px;color:var(--muted)}
.lab-row-meta .env-chip{margin-left:0}
.lab-row-side{flex:none;display:flex;align-items:center;gap:12px}
.bar.mini{width:90px;min-width:90px;height:6px}
.lab-row .badge{min-width:92px;text-align:center}
@media (max-width:640px){
  .course-head{flex-wrap:wrap;padding:14px 16px}.course-head .actions{width:100%}
  .lab-row{padding:12px 16px;flex-wrap:wrap}.lab-row-side{width:100%;padding-left:48px;justify-content:space-between}.bar.mini{flex:1}
}

/* Страницы курса: навигация по разделам на странице курса и боковое меню на самой странице */
.course-nav-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px 24px}
.course-nav-sec,.page-nav-sec{font-size:11.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin:0 0 6px}
.course-nav ul,.page-nav ul{list-style:none;margin:0 0 14px;padding:0}
.course-nav li,.page-nav li{padding:4px 0}
.course-nav li a{font-weight:500}
.page-layout{display:grid;grid-template-columns:250px minmax(0,1fr);gap:18px;align-items:start}
.page-nav{position:sticky;top:76px;padding:16px 18px}
.page-nav>a.muted{display:block;margin-bottom:12px}
.page-nav li.on>a{color:var(--text);font-weight:600}
.page-nav li.on{border-left:3px solid var(--accent);padding-left:8px;margin-left:-11px}
.page-nav .btn-block{margin-top:6px}
.page-body{padding:26px 32px}.page-body h1{margin-top:2px}.page-kicker{letter-spacing:.06em;text-transform:uppercase;font-weight:600}
.page-body .lab-nav{margin-top:28px}
.page-body img{max-width:100%;border-radius:var(--r)}
.md img.img-right{float:right;max-width:min(300px,45%);margin:4px 0 12px 22px}.md img.img-left{float:left;max-width:min(300px,45%);margin:4px 22px 12px 0}.md img.img-center{display:block;margin:12px auto}
.md::after,.page-body::after{content:"";display:table;clear:both}
@media (max-width:900px){.page-layout{grid-template-columns:1fr}.page-nav{position:static;order:2}.page-body{padding:18px}.md img.img-right,.md img.img-left{max-width:45%}}

/* Индикатор сложности пароля и статусы заявок (регистрация, профиль, админка). */
.pw-strength { display: flex; align-items: center; gap: .5rem; margin: -.4rem 0 .6rem; }
.pw-meter { width: 10rem; height: .5rem; }
.pw-meter.pw-0::-moz-meter-bar, .pw-meter.pw-1::-moz-meter-bar { background: var(--err, #bf4d4d); }
.pw-meter.pw-2::-moz-meter-bar { background: var(--warn, #c98a1b); }
.pw-meter.pw-3::-moz-meter-bar, .pw-meter.pw-4::-moz-meter-bar { background: var(--ok, #3f8f5b); }
.pw-meter.pw-0::-webkit-meter-optimum-value, .pw-meter.pw-1::-webkit-meter-optimum-value { background: var(--err, #bf4d4d); }
.pw-meter.pw-2::-webkit-meter-optimum-value { background: var(--warn, #c98a1b); }
.pw-meter.pw-3::-webkit-meter-optimum-value, .pw-meter.pw-4::-webkit-meter-optimum-value { background: var(--ok, #3f8f5b); }
.err-text { color: var(--err, #bf4d4d); }
.totp-fieldset { margin-block: .8rem; }
.totp-secret { font-family: var(--font-mono, monospace); letter-spacing: .08em; user-select: all; }
.row-pending { background: color-mix(in srgb, var(--warn, #c98a1b) 10%, transparent); }
.badge-sm { font-size: .7em; padding: 0 .35em; }

/* Обращения студентов: ветка переписки на странице лабораторной и в панели курса. */
.thread { list-style: none; padding: 0; margin: .6rem 0; display: grid; gap: .6rem; }
.thread-msg { border: 1px solid var(--line, #d9d9d9); border-radius: 8px; padding: .5rem .7rem; }
.thread-msg.from-staff { border-color: var(--accent, #0e7c8c); background: color-mix(in srgb, var(--accent, #0e7c8c) 6%, transparent); }
.thread-head { margin-bottom: .3rem; }
.thread-body > :first-child { margin-top: 0; }
.thread-body > :last-child { margin-bottom: 0; }
.ticket-list { margin-bottom: .8rem; }
.ticket-form textarea { width: 100%; }

/* Форма в одну строку с полями разной ширины: сдвиг сроков, личные продления. */
.row-form{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end}
.row-form label{display:flex;flex-direction:column;gap:4px;font-size:13px;font-weight:600}
.row-form small{font-weight:400;color:var(--muted)}
.row-form input,.row-form select{min-width:160px}

/* Срок сдачи на странице лабораторной: состояние словами, цвет — только усиление. */
.deadline{display:inline-flex;align-items:center;gap:6px}
.deadline-soon{color:var(--warn)}
.deadline-late{color:var(--warn)}
.deadline-closed{color:var(--bad)}
.deadline-wait{color:var(--muted)}

/* Айдентика курса: знак, девиз и подпись правообладателя. Акцент приходит переменной с сервера,
   поэтому отдельных цветовых правил тут нет — курс перекрашивает кнопки и ссылки сам. */
.course-title{display:flex;align-items:center;gap:14px}
.course-emblem{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;flex:none;
  border-radius:12px;background:var(--accent-soft);color:var(--accent-ink);font-size:24px;line-height:1}
.course-motto{margin:2px 0 0;color:var(--muted);font-size:13.5px}
.course-copy{color:var(--muted)}
@media (max-width:600px){.course-emblem{width:38px;height:38px;font-size:19px}}

/* Вкладки разделов управления курсом. Рельс, а не кнопки: вкладка — это «где я сейчас»,
   а не действие. Активная подчёркнута акцентом, счётчик незакрытых дел стоит прямо в ней,
   чтобы не приходилось заходить в каждую вкладку и проверять. */
.tabs{display:flex;flex-wrap:wrap;gap:4px;margin:0 0 16px;border-bottom:1px solid var(--line);padding-bottom:0}
.tabs .tab{display:inline-flex;align-items:center;gap:6px;padding:9px 14px;border:0;border-bottom:2px solid transparent;
  border-radius:8px 8px 0 0;color:var(--text-2);font-size:13.5px;font-weight:600;line-height:1.2;white-space:nowrap}
.tabs .tab:hover{text-decoration:none;color:var(--accent-ink);background:var(--surface-2)}
.tabs .tab-on{color:var(--accent-ink);border-bottom-color:var(--accent);background:transparent}
@media (max-width:600px){.tabs{overflow-x:auto;flex-wrap:nowrap;-webkit-overflow-scrolling:touch}
  .tabs .tab{padding:9px 11px}}

/* Список пользователей в админке. Карточки вместо таблицы на девять столбцов: на узком экране
   та не читалась, а правка шла прямо в ячейках мелкими целями. Видное — сразу, правка — под
   раскрытием, чтобы ежедневный просмотр не тонул в полях ввода. */
.user-list{list-style:none;margin:12px 0 0;padding:0;display:flex;flex-direction:column;gap:2px}
.user-row{display:flex;gap:12px;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;
  padding:12px;border-top:1px solid var(--line)}
.user-row:first-child{border-top:0}
.user-row.row-pending{background:var(--warn-soft, var(--surface-2));border-radius:8px}
.user-main{min-width:0;flex:1 1 320px}
.user-head{display:flex;flex-wrap:wrap;align-items:center;gap:6px}
.user-name{margin-top:2px}
.user-meta{display:flex;flex-wrap:wrap;gap:4px 12px;margin-top:2px}
.user-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-start}
.user-edit{flex:0 0 auto}
.user-edit>summary{cursor:pointer;list-style:none}
.user-edit>summary::-webkit-details-marker{display:none}
.user-edit[open]{flex:1 1 100%;margin-top:8px;padding:12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2)}
.user-form{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end}
.user-form label{display:flex;flex-direction:column;gap:4px;font-size:13px}
.user-decision{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:12px;padding-top:12px;border-top:1px dashed var(--line)}
@media (max-width:600px){.user-row{padding:12px 4px}.user-form{gap:10px}}

/* Приём работы: решение по студенту — одна строка.
   Было три: поле баллов, комментарий и кнопки переносились, потому что ячейка решения узкая, и
   строка на студента занимала около 150 точек. На одиннадцати студентах страница выходила за две
   тысячи точек, на потоке в тридцать — за шесть, а преподаватель здесь как раз идёт по списку
   подряд (снято со стенда 15.09.2026). Ячейке задана ширина, форма не переносится, комментарий
   занимает остаток. На узком экране перенос возвращается: там лучше три строки, чем прокрутка. */
.results-table td:last-child{min-width:470px}
.results-table .inline-form.compact{flex-wrap:nowrap;align-items:center;gap:6px}
.results-table .inline-form.compact input[type="text"]{flex:1 1 120px;min-width:0}
@media (max-width:1100px){
  .results-table td:last-child{min-width:0}
  .results-table .inline-form.compact{flex-wrap:wrap}
}

/* Ход работы студента на экранах преподавателя (учебный журнал, docs/DESIGN-ACTIVITY-LOG.md).
   Блок вспомогательный: он не должен спорить за внимание с тем, ради чего открыт экран, —
   с оценкой. Поэтому сводка строкой, лента раскрывается и набрана мелко. */
.activity{margin-top:8px}
.activity-sum{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:0}
.activity-feed{margin-top:8px;max-height:320px;overflow-y:auto;border:1px solid var(--line);border-radius:var(--r);padding:8px 10px}
.activity-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px;font-size:13px}
.activity-list li{display:flex;flex-wrap:wrap;gap:6px;align-items:baseline;line-height:1.4}
.activity-list time{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}

/* Здоровье портала в панели администратора. Стоит первым в блоке состояния и обязано читаться
   за секунду: администратор заходит сюда не изучать, а убедиться, что всё в порядке. */
.health{margin:0 0 12px;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r)}
.health-warn{border-color:var(--warn,#b45309)}
.health p{margin:0 0 6px}
.health-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:3px;font-size:13px}
.health-list li{line-height:1.4}
.user-remove{margin-top:12px;padding-top:12px;border-top:1px dashed var(--line)}

/* Учебное место в профиле: показывается, но не редактируется студентом. Оформлено блоком, а не
   серой строкой под заголовком, — чтобы читалось как часть карточки, а не как отладочная подпись. */
.study-place{margin:4px 0 12px;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r);background:var(--surface-2,transparent)}
.study-place-h{display:block;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:4px}
.study-place p{margin:0 0 4px}
.study-place p:last-child{margin-bottom:0}

/* Плашка роли. Переехала из шапки: там она у почти всех читалась «студент» и занимала место,
   а в профиле это факт учётной записи и стоит на своём месте. */
.role-badge{font-size:11px;font-weight:500;color:var(--muted);border:1px solid var(--line);border-radius:999px;padding:1px 8px;background:var(--surface)}
.account-kv{margin:0 0 14px;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r)}

/* Оценка работы студентом (docs/DESIGN-FEEDBACK.md). Карточка появляется в момент, когда работа
   закончена, и не должна выглядеть требованием: обычная карточка, а не модальное окно, и кнопка
   «Скрыть» на виду. */
.work-feedback .wf-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px}
.work-feedback .wf-head h2{margin:0}
.work-feedback .wf-why{margin:4px 0 12px}
.wf-rows{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}
.wf-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.wf-label{min-width:92px;font-size:14px}
.stars,.scale{display:inline-flex;gap:2px}
.star,.dot{border:0;background:none;cursor:pointer;font:inherit;padding:2px 3px;line-height:1;color:var(--line)}
.star{font-size:22px}
.star.on{color:#e0a106}
.dot{width:28px;height:28px;border:1px solid var(--line);border-radius:8px;color:var(--text-2);font-size:13px}
.dot.on{background:var(--accent-soft);color:var(--accent-ink);border-color:var(--accent-soft)}
.wf-scale-word{min-width:96px}
.wf-comment{display:flex;flex-direction:column;gap:4px;font-size:14px}
.wf-sign{margin:10px 0}
.wf-actions{display:flex;align-items:center;gap:10px}
.linkish{border:0;background:none;padding:0;color:var(--accent-ink);cursor:pointer;font:inherit;text-decoration:underline}
@media (max-width:600px){.wf-label{min-width:0;flex-basis:100%}}

/* Панель курса (docs/DESIGN-COURSE-NAV.md §7.1). Плитка «О курсе» — единственный выделенный
   элемент карты: то, что читают один раз, стоит первым и заметно, но не громко. */
.course-about{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;margin:0 0 14px;border:1px solid var(--accent-soft);background:var(--accent-soft);border-radius:var(--r);text-decoration:none;color:var(--text)}
.course-about:hover{text-decoration:none;border-color:var(--accent)}
.course-about.on{border-color:var(--accent)}
.course-about-star{color:var(--accent-ink);font-size:16px;line-height:1.3}
.course-about-body{display:flex;flex-direction:column;gap:2px;min-width:0}
.page-nav-cols{display:flex;flex-direction:column}
.page-nav .course-about{margin-bottom:10px}

/* «Мои результаты»: комментарий преподавателя в строке — одной строкой с обрезкой, полностью
   на странице работы, куда строка и ведёт. */
.results-note{font-style:italic;color:var(--text-2);max-width:48ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.card.no-pad .page-head{padding:14px 22px 6px}

/* «Мои курсы»: карточка курса целиком — ссылка; внутри мои числа, а не чужие. */
.course-card-desc{margin:6px 0 10px}
.course-card-desc p{margin:0}
/* Полоса в колонке: без своего правила она брала flex-basis 220px из строчной раскладки — и это
   становилось высотой (снимок автора 16.09: «карточку разнесло»). */
.course-card .course-summary{display:flex;flex-direction:column;align-items:stretch;gap:6px;margin:auto 0 0;padding:0 18px 16px}
.course-card .course-summary .bar{flex:none;width:100%;max-width:none;height:8px}
.course-card h2{display:flex;gap:8px;align-items:flex-start;line-height:1.3}
.course-card .course-card-desc{padding:0 18px}.course-card .course-card-desc p{padding:0}
.join-inline{text-align:center}
.join-inline-row{display:flex;gap:8px;justify-content:center;margin-top:10px;flex-wrap:wrap}
.join-inline-row input{max-width:220px}

/* Сообщения об ошибках платформы (docs/DESIGN-FEEDBACK.md, часть II) */
.footer-bug{color:var(--muted)}.footer-bug:hover{color:var(--accent-ink)}
.bug-form textarea{width:100%;font:inherit;resize:vertical}
.bug-attached{margin:14px 0;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r);background:var(--surface-2,var(--surface))}
.bug-attached-h{font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:8px}
.bug-body{white-space:pre-line;overflow-wrap:anywhere;margin:10px 0}
.bug-note{overflow-wrap:anywhere}
.bug-list{display:flex;flex-direction:column;gap:6px;margin-top:12px}
.bug-item{border:1px solid var(--line);border-radius:var(--r);background:var(--surface)}
.bug-item>summary{display:grid;grid-template-columns:auto auto auto minmax(0,1fr) auto minmax(0,2fr) auto;gap:6px 12px;align-items:center;padding:8px 12px;cursor:pointer;font-size:13px;list-style:none}
.bug-item>summary::-webkit-details-marker{display:none}
.bug-item>summary>span{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bug-sum-id{font-weight:600}.bug-sum-when,.bug-sum-who{color:var(--muted)}.bug-sum-text{color:var(--text-2)}
.bug-item[open]>summary{border-bottom:1px solid var(--line)}
.bug-item-body{padding:10px 14px 14px}
.bug-status-form{display:flex;flex-wrap:wrap;gap:10px 14px;align-items:end;margin-top:10px}
.bug-status-form label{display:flex;flex-direction:column;gap:4px;font-size:13px;flex:1 1 220px}
.help-bug{margin:10px 0 0}
@media (max-width:720px){.bug-item>summary{grid-template-columns:auto 1fr auto}.bug-sum-when,.bug-sum-who,.bug-sum-rid,.bug-sum-page{display:none}}
.page-body-col{min-inline-size:0;display:flex;flex-direction:column;gap:14px}
.bug-inline{margin:0}.bug-inline .actions{margin-top:10px}
/* Видно только на телефоне: дубли ссылок шапки, которая там прячет разделы */
.phone-only{display:none}
@media (max-width:900px){.phone-only{display:inline-flex}}
.admin-grid .admin-wide{grid-column:1/-1}
.state-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(380px,100%),1fr));gap:6px 28px;align-items:start}
.state-cols .health{margin-bottom:0}
/* Кнопки «Мои результаты · Результаты курса» — в строке заголовка «Карта курса» */
.course-nav-actions{display:flex;flex-wrap:wrap;gap:8px}
/* Сводка оценок работы (О2): три ряда с распределением по пяти столбикам. */
.fb-rows{display:grid;gap:10px;margin:8px 0}.fb-row{display:grid;grid-template-columns:110px 150px 1fr;align-items:end;gap:14px}
.fb-label{font-weight:600}.fb-bars{display:flex;align-items:flex-end;gap:5px;height:40px}
.fb-bar{flex:1;display:flex;flex-direction:column;justify-content:flex-end;height:100%;position:relative}
.fb-bar span{display:block;min-height:2px;background:var(--accent);border-radius:3px 3px 0 0}
.fb-bar i{font-style:normal;font-size:10px;color:var(--muted);text-align:center;line-height:1;margin-top:2px}
.fb-num b{font-size:1.15em}.fb-comments{list-style:none;padding:0;margin:8px 0 0;display:grid;gap:8px}
.fb-comments li{border-left:3px solid var(--line);padding:2px 12px}.fb-comments p{margin:0 0 2px;white-space:pre-wrap}
@media (max-width:640px){.fb-row{grid-template-columns:1fr;gap:4px}}
