feat(exam-prep F9): пробный экзамен — setup/active/result + таймер + балл по сетке + серверный чекер

This commit is contained in:
Maxim Dolgolyov
2026-05-29 11:06:57 +03:00
parent b07da5ee6d
commit cfcb233b6c
5 changed files with 825 additions and 39 deletions
+96
View File
@@ -612,6 +612,102 @@
border-radius: 10px;
}
/* ═══════════════════════════════════════════════════════════════
Mock exam view (`mk-*`) — used by exam-prep-mock.html
═══════════════════════════════════════════════════════════════ */
/* Setup */
.mk-setup p { font-size: .92rem; line-height: 1.7; }
.mk-source {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 14px;
margin: 18px 0 4px;
}
.mk-source-card {
border: 1.5px solid var(--border-h);
border-radius: 12px;
padding: 14px 16px;
cursor: pointer;
transition: all .15s;
}
.mk-source-card:hover { border-color: var(--violet); }
.mk-source-card.mk-source-active {
border-color: var(--violet);
background: rgba(155,93,229,.06);
}
.mk-source-head {
display: flex; align-items: center; gap: 10px;
font-family: 'Manrope', sans-serif; font-size: .95rem; font-weight: 700;
color: var(--text); margin-bottom: 10px;
}
.mk-source-head svg { width: 18px; height: 18px; color: var(--violet); }
.mk-source-body label {
display: flex; align-items: center; gap: 8px;
font-size: .85rem; color: var(--text-2);
}
.mk-input {
width: 80px;
padding: 6px 10px;
border: 1.5px solid var(--border-h);
border-radius: 7px;
background: var(--surface); color: var(--text);
font-family: 'Manrope', sans-serif; font-size: .9rem; font-weight: 600;
}
.mk-input:focus { outline: none; border-color: var(--violet); }
.mk-source-hint {
font-size: .78rem; color: var(--text-3); margin-top: 6px;
}
.mk-start-row { margin-top: 16px; }
/* Active phase: sticky bar */
.mk-bar {
position: sticky; top: 0; z-index: 50;
display: flex; align-items: center; gap: 14px;
background: var(--surface);
border: 1.5px solid var(--border);
border-radius: 12px;
padding: 12px 18px;
margin-bottom: 18px;
flex-wrap: wrap;
}
.mk-bar-info {
display: flex; flex-direction: column; gap: 2px;
flex: 1; min-width: 180px;
}
.mk-bar-source {
font-family: 'Unbounded', sans-serif; font-size: .9rem; font-weight: 800;
letter-spacing: -.01em;
}
.mk-bar-count {
font-size: .78rem; color: var(--text-2);
}
.mk-timer {
font-family: 'Unbounded', sans-serif;
font-size: 1.6rem; font-weight: 800;
color: var(--text);
font-variant-numeric: tabular-nums;
letter-spacing: -.01em;
}
.mk-timer.mk-timer-warn { color: #F8961E; }
.mk-timer.mk-timer-zero { color: #E63946; animation: mk-pulse .8s infinite; }
@keyframes mk-pulse {
0%, 100% { opacity: 1; }
50% { opacity: .4; }
}
.mk-finish-btn { white-space: nowrap; }
.mk-tasks { }
/* Result phase */
.mk-result-stats { margin-bottom: 18px; }
.mk-breakdown-title {
font-family: 'Unbounded', sans-serif;
font-size: 1.05rem; font-weight: 800;
margin: 26px 0 12px;
letter-spacing: -.01em;
}
/* ── Mobile tweaks ─────────────────────────────────────────────── */
@media (max-width: 640px) {
.ep-wrap { padding: 20px 16px 60px; }