-
@@ -1810,17 +1810,25 @@
var sidebar = document.getElementById('lessonSidebar');
if (!toggle || !sidebar) return;
+ function syncExpanded() {
+ toggle.setAttribute('aria-expanded', sidebar.classList.contains('open') ? 'true' : 'false');
+ }
+
toggle.addEventListener('click', function () {
sidebar.classList.toggle('open');
+ syncExpanded();
});
document.addEventListener('click', function (e) {
if (window.innerWidth <= 900 && sidebar.classList.contains('open')) {
if (!sidebar.contains(e.target) && e.target !== toggle) {
sidebar.classList.remove('open');
+ syncExpanded();
}
}
});
+
+ syncExpanded();
}
function initScrollProgress() {
@@ -2690,22 +2698,25 @@
for (var qi = 0; qi < questions.length; qi++) {
var q = questions[qi];
var qid = id + '-q' + qi;
- html += '
-
+
-
+
+
Loading lesson...
';
- html += '
diff --git a/site/style.css b/site/style.css
index 1f8268224..6828b4029 100644
--- a/site/style.css
+++ b/site/style.css
@@ -9,9 +9,13 @@
--bg-surface-hover: #ece9dc;
--ink: #1a1a1a;
--ink-soft: #4a4a4a;
- --ink-mute: #7a7a78;
+ /* Bumped from #7a7a78 → #686867 to meet WCAG AA 4.5:1 on --bg. */
+ --ink-mute: #686867;
--rule: #1a1a1a;
+ /* Decorative paper rules stay subtle; component borders use --rule-strong
+ for WCAG 1.4.11 (3:1) contrast against the background. */
--rule-soft: rgba(26, 26, 26, 0.16);
+ --rule-strong: rgba(26, 26, 26, 0.45);
--paper-rule: rgba(26, 26, 26, 0.08);
--blueprint: #3553ff;
@@ -50,9 +54,11 @@
--bg-surface-hover: #1b2244;
--ink: #e8e6dc;
--ink-soft: #a8a6a0;
- --ink-mute: #7a7878;
+ /* Bumped from #7a7878 → #9a9a98 to meet WCAG AA 4.5:1 on --bg. */
+ --ink-mute: #9a9a98;
--rule: #e8e6dc;
--rule-soft: rgba(232, 230, 220, 0.18);
+ --rule-strong: rgba(232, 230, 220, 0.5);
--paper-rule: rgba(232, 230, 220, 0.08);
--blueprint: #6b8eff;
@@ -123,6 +129,32 @@ body {
outline-offset: 2px;
}
+/* Visually-hidden but accessible to assistive tech. clip is kept as a
+ fallback for older WebKit; modern browsers honor clip-path. */
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ clip-path: inset(50%);
+ white-space: nowrap;
+ border: 0;
+}
+
+/* Global keyboard-focus indicator. Individual components may still override
+ for tighter styling, but every focusable element gets a visible ring. */
+a:focus-visible,
+button:focus-visible,
+[role="button"]:focus-visible,
+[tabindex]:focus-visible,
+summary:focus-visible {
+ outline: 2px solid var(--blueprint);
+ outline-offset: 2px;
+}
+
.container {
max-width: 1200px;
margin: 0 auto;
@@ -296,7 +328,7 @@ p.dropcap::first-letter {
align-items: center;
gap: 8px;
padding: 6px 12px;
- border: 1px solid var(--rule-soft);
+ border: 1px solid var(--rule-strong);
background: var(--bg-surface);
font-family: var(--font-mono);
font-size: 0.78rem;
@@ -334,7 +366,7 @@ p.dropcap::first-letter {
.theme-toggle {
background: transparent;
- border: 1px solid var(--rule-soft);
+ border: 1px solid var(--rule-strong);
width: 36px;
height: 36px;
cursor: pointer;
@@ -628,6 +660,17 @@ p.dropcap::first-letter {
border-bottom-color: var(--blueprint);
}
+.modal-lesson > .modal-lesson-pending {
+ color: var(--ink-mute);
+ font-family: var(--font-body);
+ font-size: 0.96rem;
+ font-weight: 500;
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
.modal-lesson-status {
width: 12px;
height: 12px;
@@ -1031,7 +1074,7 @@ body.js-anim .toc-row.in-view {
/* ── Search trigger button in the header ─────────────────────────────── */
.search-toggle {
background: transparent;
- border: 1px solid var(--rule-soft);
+ border: 1px solid var(--rule-strong);
width: 36px;
height: 36px;
cursor: pointer;
' + (qi + 1) + '. ' + escapeHtml(q.question) + '
';
- html += '';
return html;
}
@@ -2741,7 +2752,13 @@
}
var exp = questionDiv.querySelector('.quiz-explanation');
- if (exp) exp.style.display = 'block';
+ if (exp) {
+ var explanationText = exp.getAttribute('data-explanation');
+ if (explanationText && !exp.textContent) {
+ exp.textContent = explanationText;
+ }
+ exp.style.display = 'block';
+ }
if (persist && window.AIFSProgress && lessonPath) {
window.AIFSProgress.recordAnswer(lessonPath, questionDiv.id, chosen, chosen === correct);
diff --git a/site/prereqs.html b/site/prereqs.html
index b34f3c7cd..87324cba4 100644
--- a/site/prereqs.html
+++ b/site/prereqs.html
@@ -406,10 +406,10 @@
Catalog
Roadmap
Glossary
-
+
- …
+
-