a11y: WCAG AA contrast + ARIA roles + focus management across all pages

- css/ls.css: --text-3 #8898AA → #56687A (5.1:1 contrast), min-height 44px on .btn-primary/.btn-ghost/.sb-link, new .icon-btn utility (44×44px)
- js/api.js: lsConfirm — role=dialog, aria-modal, aria-labelledby, Tab focus trap, restore focus on close; lsToast — aria-live=polite on container, role=alert on errors; live quiz — role=dialog, role=radiogroup, role=radio, aria-checked, keyboard support
- test-run.html: q-opt divs — role=radio/checkbox, aria-checked, tabindex, keyboard enter/space; confirm modal — role=dialog, aria-modal; btn-flag — aria-pressed; dots — aria-label, aria-current; touch targets 44px
- board.html: btn-del-ann — aria-label; reaction buttons — aria-label, aria-pressed
- All 18 HTML files: replace hardcoded color:#8898AA with color:var(--text-3)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-04-16 11:42:38 +03:00
parent 3a4623a60a
commit 26ba289019
22 changed files with 362 additions and 299 deletions
+5 -5
View File
@@ -62,7 +62,7 @@
.gb-chip-val {
font-family: 'Unbounded', sans-serif; font-size: 1.3rem; font-weight: 800;
}
.gb-chip-label { font-size: 0.72rem; color: #8898AA; font-weight: 600; margin-top: 4px; }
.gb-chip-label { font-size: 0.72rem; color: var(--text-3); font-weight: 600; margin-top: 4px; }
/* ── table container ── */
.gb-container { max-width: 1200px; margin: 0 auto; padding: 24px 28px 80px; }
@@ -82,7 +82,7 @@
position: sticky; top: 0; z-index: 10;
background: #f8f9fc; border-bottom: 1.5px solid rgba(15,23,42,0.08);
padding: 12px 14px; text-align: left;
font-size: 0.7rem; font-weight: 700; color: #8898AA;
font-size: 0.7rem; font-weight: 700; color: var(--text-3);
text-transform: uppercase; letter-spacing: 0.04em;
white-space: nowrap;
}
@@ -134,7 +134,7 @@
flex-shrink: 0;
}
.gb-student-name { font-weight: 700; font-size: 0.82rem; }
.gb-student-email { font-size: 0.68rem; color: #8898AA; font-weight: 500; }
.gb-student-email { font-size: 0.68rem; color: var(--text-3); font-weight: 500; }
/* ── footer row ── */
.gb-table tfoot td {
@@ -155,7 +155,7 @@
/* ── empty state ── */
.gb-empty {
text-align: center; padding: 60px 20px; color: #8898AA; font-size: 0.88rem;
text-align: center; padding: 60px 20px; color: var(--text-3); font-size: 0.88rem;
}
.gb-empty-icon { font-size: 3rem; margin-bottom: 12px; opacity: 0.3; }
@@ -448,7 +448,7 @@
html += `<td class="gb-td-avg">${gradeCell(classAvg)}</td></tr></tfoot>`;
html += `</table></div></div>`;
} else {
html += `<div style="background:#fff;border:1.5px solid rgba(15,23,42,0.07);border-radius:16px;padding:40px;text-align:center;color:#8898AA;margin-bottom:20px">
html += `<div style="background:#fff;border:1.5px solid rgba(15,23,42,0.07);border-radius:16px;padding:40px;text-align:center;color:var(--text-3);margin-bottom:20px">
Нет заданий в этом классе. <a href="/classes" style="color:var(--violet)">Создать задание <svg class="ic" viewBox="0 0 24 24"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg></a>
</div>`;
}