Files
LMS/design/style-a-university.html
Vladislav Kopnin 51d1b84297 Redesign B3 bordeaux + finish lab-page rework
- Lab page is now read-only with a settings screen for levels/variants;
  variant issuance moved to a large modal on the group page (assign-fragment).
- Header: bordeaux logo and 2px accent underline, bordeaux login/logout/theme
  buttons; smaller radii across the UI; filled secondary/danger buttons.
- Includes prior agent work (login backoff, no-cache pages, API timeouts,
  content tweaks) and fixes (variant usage Map.values, import order).
- Bump static asset version to v=9.
2026-10-02 15:41:16 +03:00

268 lines
15 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>LMS — демо стиля А: университетская классика</title>
<!-- Если нет интернета, сработают запасные шрифты: Georgia и системный гротеск -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=PT+Serif:wght@400;700&family=PT+Sans:wght@400;700&display=swap" rel="stylesheet">
<style>
:root {
--bg: #f5f3ee;
--surface: #fdfcf9;
--text: #21201c;
--muted: #6f6a5e;
--border: #ddd7c9;
--border-strong: #b9b2a0;
--accent: #1e5138;
--accent-hover: #173f2c;
--accent-soft: #e8efe9;
--danger: #8f2d3c;
--ok: #1e5138;
--warn: #8a5a12;
}
* { box-sizing: border-box; }
body {
margin: 0; background: var(--bg); color: var(--text);
font: 15px/1.5 "PT Sans", "Segoe UI", system-ui, sans-serif;
}
.demo-note {
background: #2c2a24; color: #f0ece2; text-align: center;
font-size: 12.5px; padding: 6px 12px; letter-spacing: .04em;
}
/* ── Шапка ─────────────────────────────────────────────── */
.page-header {
background: var(--surface); border-bottom: 2px solid var(--accent);
}
.header-inner {
max-width: 1180px; margin: 0 auto; padding: 14px 24px;
display: flex; align-items: center; gap: 24px;
}
.logo {
font-family: "PT Serif", Georgia, serif; font-size: 22px; font-weight: 700;
color: var(--accent); text-decoration: none; letter-spacing: .02em;
}
.nav { display: flex; gap: 18px; flex: 1; }
.nav a { color: var(--muted); text-decoration: none; font-size: 14px; padding-bottom: 2px; }
.nav a.active { color: var(--text); border-bottom: 2px solid var(--accent); }
.nav a:hover { color: var(--text); }
.user { display: flex; align-items: center; gap: 12px; font-size: 14px; }
/* ── Основная часть ────────────────────────────────────── */
.page-main { max-width: 1180px; margin: 0 auto; padding: 28px 24px 48px; }
.kicker {
margin: 0 0 4px; font-size: 11px; font-weight: 700; letter-spacing: .12em;
text-transform: uppercase; color: var(--muted);
}
h1 {
margin: 0 0 6px; font-family: "PT Serif", Georgia, serif;
font-size: 30px; font-weight: 700; line-height: 1.2;
}
.page-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 20px; }
.meta { margin: 0; color: var(--muted); font-size: 13.5px; }
.actions { display: flex; gap: 10px; }
.toolbar { display: flex; gap: 10px; margin-bottom: 14px; }
/* ── Таблица-ведомость ─────────────────────────────────── */
.matrix-wrap { background: var(--surface); border: 1px solid var(--border); }
table.matrix { width: 100%; border-collapse: collapse; }
.matrix th {
padding: 10px 14px; text-align: left;
font-size: 11px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
color: var(--muted); border-bottom: 1px solid var(--border-strong);
}
.matrix td { padding: 12px 14px; border-bottom: 1px solid var(--border); vertical-align: top; }
.matrix tbody tr:last-child td { border-bottom: none; }
.matrix tbody tr:hover { background: #f6f3ec; }
.sticky { min-width: 190px; }
.student-name { font-weight: 700; }
.student-no { color: var(--muted); font-size: 12.5px; font-variant-numeric: tabular-nums; }
.lab-no { display: block; color: var(--text); }
.lab-title { display: block; font-weight: 400; text-transform: none; letter-spacing: 0; font-size: 12px; }
.cell-main { display: flex; align-items: baseline; gap: 10px; }
.variant { font-family: "PT Serif", Georgia, serif; font-weight: 700; }
.score { font-variant-numeric: tabular-nums; font-weight: 700; }
.score.muted { color: var(--muted); font-weight: 400; }
.cell-sub { margin-top: 4px; display: flex; gap: 12px; font-size: 12.5px; color: var(--muted); }
.sub-link { color: var(--muted); text-decoration: none; border-bottom: 1px dotted var(--border-strong); }
.sub-link:hover { color: var(--text); }
.st { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }
.st::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--border-strong); }
.st.done { color: var(--ok); } .st.done::before { background: var(--ok); }
.st.active { color: var(--warn); } .st.active::before { background: var(--warn); }
.st.code { color: var(--muted); }
.eye { cursor: default; font-size: 13px; color: var(--border-strong); }
.eye.on { color: var(--accent); }
.ta-r { text-align: right; }
/* ── Кнопки, бейджи, поля ──────────────────────────────── */
.btn {
display: inline-block; padding: 7px 14px; font: inherit; font-size: 13.5px;
border: 1px solid var(--border-strong); background: var(--surface);
color: var(--text); border-radius: 3px; cursor: pointer; text-decoration: none;
}
.btn:hover { border-color: var(--text); }
.btn-primary { background: var(--accent); border-color: var(--accent); color: #fdfcf9; }
.btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
.btn-danger { background: transparent; border-color: var(--danger); color: var(--danger); }
.btn-danger:hover { background: var(--danger); color: #fdfcf9; }
.btn-sm { padding: 4px 9px; font-size: 12.5px; }
.input {
padding: 7px 10px; font: inherit; font-size: 13.5px; color: var(--text);
background: var(--surface); border: 1px solid var(--border-strong); border-radius: 3px;
}
.input:focus { outline: 2px solid var(--accent-soft); border-color: var(--accent); }
.badge {
display: inline-block; padding: 2px 8px; font-size: 11px; font-weight: 700;
letter-spacing: .06em; text-transform: uppercase;
border: 1px solid currentColor; border-radius: 2px;
}
.badge.warn { color: var(--warn); background: #f7f1e3; }
.badge.ok { color: var(--ok); background: var(--accent-soft); }
.notice { border: 1px solid var(--border-strong); border-left: 3px solid var(--accent); background: var(--surface); padding: 10px 14px; font-size: 13.5px; }
/* ── Секция элементов ──────────────────────────────────── */
.components { margin-top: 36px; border-top: 2px solid var(--border-strong); padding-top: 18px; }
.row { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; margin: 12px 0; }
.page-footer { text-align: center; color: var(--muted); font-size: 12px; padding: 20px; border-top: 1px solid var(--border); }
</style>
</head>
<body>
<div class="demo-note">Демо-шаблон «А. Университетская классика» · данные условные · тёмная тема будет в реализации</div>
<header class="page-header">
<div class="header-inner">
<a class="logo" href="#">LMS</a>
<nav class="nav">
<a href="#" class="active">Группы</a>
<a href="#">Пользователи</a>
<a href="#">Лабораторные</a>
</nav>
<div class="user">
<span>Копнин В.</span>
<button class="btn btn-sm">Выйти</button>
</div>
</div>
</header>
<main class="page-main">
<div class="page-head">
<div>
<p class="kicker">Ведомость группы</p>
<h1>М202-1 · Первый курс</h1>
<p class="meta">24 студента · 3 опубликованные лабораторные · длительность защиты 30 мин</p>
</div>
<div class="actions">
<button class="btn">Скачать пароли</button>
<button class="btn btn-primary">+ Студент</button>
</div>
</div>
<div class="toolbar">
<input class="input" style="width:260px" placeholder="Поиск по студенту…">
<select class="input"><option>все лабораторные</option><option>ЛР 1</option><option>ЛР 2</option></select>
</div>
<div class="matrix-wrap">
<table class="matrix">
<thead>
<tr>
<th class="sticky">Студент</th>
<th><span class="lab-no">ЛР 1</span><span class="lab-title">Анализ данных</span></th>
<th><span class="lab-no">ЛР 2</span><span class="lab-title">Сортировки</span></th>
<th><span class="lab-no">ЛР 3</span><span class="lab-title">Деревья поиска</span></th>
<th>Пароль</th>
<th class="ta-r">Действия</th>
</tr>
</thead>
<tbody>
<tr>
<td class="sticky"><div class="student-name">Иванова Анна</div><div class="student-no">2025001</div></td>
<td>
<div class="cell-main"><span class="variant">В-7</span><span class="score">4.5</span><span class="eye on">◉</span></div>
<div class="cell-sub"><a class="sub-link" href="#">сдача ↓ 2</a><span class="st done">защита: готов</span></div>
</td>
<td>
<div class="cell-main"><span class="variant">В-2</span><span class="score">3.0</span><span class="eye on">◉</span></div>
<div class="cell-sub"><a class="sub-link" href="#">сдача ↓ 1</a><span class="st code">защита: код 552314</span></div>
</td>
<td>
<div class="cell-main"><span class="score muted">—</span></div>
<div class="cell-sub"><span class="st">не выдан</span></div>
</td>
<td><span class="badge warn">временный</span></td>
<td class="ta-r"><button class="btn btn-sm">Сбросить</button> <button class="btn btn-sm btn-danger">Отчислить</button></td>
</tr>
<tr>
<td class="sticky"><div class="student-name">Петров Павел</div><div class="student-no">2025002</div></td>
<td>
<div class="cell-main"><span class="variant">В-1</span><span class="score">5.0</span><span class="eye on">◉</span></div>
<div class="cell-sub"><a class="sub-link" href="#">сдача ↓ 3</a><span class="st done">защита: готов</span></div>
</td>
<td>
<div class="cell-main"><span class="variant">В-4</span><span class="score muted">—</span><span class="eye on">◉</span></div>
<div class="cell-sub"><a class="sub-link" href="#">сдача ↓ 1</a><span class="st active">защита: идёт · 12:34</span></div>
</td>
<td>
<div class="cell-main"><span class="variant">В-3</span><span class="score muted">—</span><span class="eye">○</span></div>
<div class="cell-sub"><span class="st">не сдано</span></div>
</td>
<td><span class="badge ok">изменён</span></td>
<td class="ta-r"><button class="btn btn-sm">Сбросить</button> <button class="btn btn-sm btn-danger">Отчислить</button></td>
</tr>
<tr>
<td class="sticky"><div class="student-name">Сидоров Алексей</div><div class="student-no">2025017</div></td>
<td>
<div class="cell-main"><span class="variant">В-5</span><span class="score muted">—</span><span class="eye on">◉</span></div>
<div class="cell-sub"><span class="st">не сдано</span></div>
</td>
<td>
<div class="cell-main"><span class="score muted">—</span></div>
<div class="cell-sub"><span class="st">не выдан</span></div>
</td>
<td>
<div class="cell-main"><span class="score muted">—</span></div>
<div class="cell-sub"><span class="st">не выдан</span></div>
</td>
<td><span class="badge warn">временный</span></td>
<td class="ta-r"><button class="btn btn-sm">Сбросить</button> <button class="btn btn-sm btn-danger">Отчислить</button></td>
</tr>
<tr>
<td class="sticky"><div class="student-name">Кузнецова Мария</div><div class="student-no">2025021</div></td>
<td>
<div class="cell-main"><span class="variant">В-3</span><span class="score">4.0</span><span class="eye">○</span></div>
<div class="cell-sub"><a class="sub-link" href="#">сдача ↓ 1</a><span class="st done">защита: готов</span></div>
</td>
<td>
<div class="cell-main"><span class="variant">В-6</span><span class="score muted">—</span><span class="eye">○</span></div>
<div class="cell-sub"><a class="sub-link" href="#">сдача ↓ 1</a><span class="st active">защита: идёт · 03:07</span></div>
</td>
<td>
<div class="cell-main"><span class="score muted">—</span></div>
<div class="cell-sub"><span class="st">не выдан</span></div>
</td>
<td><span class="badge ok">изменён</span></td>
<td class="ta-r"><button class="btn btn-sm">Сбросить</button> <button class="btn btn-sm btn-danger">Отчислить</button></td>
</tr>
</tbody>
</table>
</div>
<section class="components">
<p class="kicker">Элементы интерфейса</p>
<div class="row">
<button class="btn btn-primary">Сохранить всё</button>
<button class="btn">Отмена</button>
<button class="btn btn-danger">Удалить</button>
<span class="badge ok">published</span>
<span class="badge warn">draft</span>
</div>
<div class="row">
<input class="input" style="width:220px" value="Поле ввода">
<input class="input" style="width:120px" value="552314">
</div>
<div class="notice">Оценки опубликованы всей группе — студенты видят баллы и комментарии.</div>
</section>
</main>
<footer class="page-footer">LMS · демо-шаблон · стиль А</footer>
</body>
</html>