diff --git a/backend/tests/math6-page.test.js b/backend/tests/math6-page.test.js index a918613..52b035f 100644 --- a/backend/tests/math6-page.test.js +++ b/backend/tests/math6-page.test.js @@ -159,10 +159,12 @@ test('ch6: наглядная геометрия — интерактивы §1 assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | ')); }); -test('hub: 6 карточек глав', async () => { +test('hub: 6 карточек глав + курсовой финал', async () => { const { doc, errors } = await loadDom('math_6_hub.html'); assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | ')); assert.equal(doc.querySelectorAll('.ch-grid .ch-card').length, 6, '6 глав'); + assert.ok(doc.querySelector('#cf-wrap') && doc.querySelector('#cf-go'), 'секция курсового финала'); + assert.ok(doc.querySelector('#cf-q').textContent.length > 0, 'первое испытание показано'); }); test('ch1 Волна 1: интерактивы §1–§3 монтируются без ошибок', async () => { diff --git a/frontend/textbooks/math_6_hub.html b/frontend/textbooks/math_6_hub.html index 8c65af6..004c20c 100644 --- a/frontend/textbooks/math_6_hub.html +++ b/frontend/textbooks/math_6_hub.html @@ -110,6 +110,32 @@ main{max-width:1100px;margin:0 auto;padding:32px 24px 60px} .ach-sub{font-size:.85rem;color:var(--muted);margin-top:2px} .ach-strip.lit .ach-title{color:#92400e} +/* COURSE FINAL */ +.cf-wrap{background:var(--card);border:1.5px solid var(--border);border-radius:18px;overflow:hidden;margin-bottom:28px;box-shadow:var(--sh)} +.cf-head{padding:18px 22px;background:linear-gradient(135deg,#312e81,#4f46e5 55%,#7c3aed);color:#fff;cursor:pointer;display:flex;align-items:center;gap:14px;user-select:none} +.cf-head:hover{filter:brightness(1.07)} +.cf-hi{width:46px;height:46px;border-radius:12px;background:rgba(255,255,255,.2);display:flex;align-items:center;justify-content:center;flex-shrink:0} +.cf-hi svg{width:26px;height:26px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round} +.cf-ht{flex:1;min-width:0} +.cf-tag{display:inline-block;padding:3px 9px;background:rgba(255,255,255,.24);border-radius:99px;font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px} +.cf-title{font-family:'Outfit',sans-serif;font-size:1.18rem;font-weight:800;line-height:1.25} +.cf-sub{font-size:.84rem;opacity:.9;margin-top:2px} +.cf-chev{flex-shrink:0;transition:transform .25s} +.cf-chev svg{width:24px;height:24px;stroke:#fff;fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round} +.cf-wrap.open .cf-chev{transform:rotate(180deg)} +.cf-body{display:none;padding:22px} +.cf-wrap.open .cf-body{display:block} +.cf-hp{height:14px;background:rgba(220,38,38,.12);border-radius:9px;overflow:hidden;border:1px solid #fecaca;margin:6px 0 12px} +.cf-hp-fill{height:100%;background:linear-gradient(90deg,#dc2626,#f59e0b);border-radius:9px;transition:width .5s} +.cf-meta{display:flex;gap:16px;font-size:.9rem;color:var(--muted);margin-bottom:10px;font-weight:600} +.cf-name{font-weight:800;color:#4338ca;text-align:center;margin-bottom:6px} +.cf-q{font-size:1.05rem;line-height:1.5;padding:12px 14px;background:var(--pri-soft);border-radius:9px;margin-bottom:10px;text-align:center} +.cf-row{display:flex;gap:10px;justify-content:center;align-items:center;flex-wrap:wrap} +.cf-inp{padding:9px 12px;border:1.5px solid var(--border);border-radius:8px;background:var(--card);color:var(--text);width:140px;text-align:center;font-family:'Outfit',monospace;font-size:1rem} +.cf-btn{padding:9px 18px;border-radius:9px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;font-weight:700;border:none;cursor:pointer} +.cf-fb{margin-top:10px;padding:10px 14px;border-radius:9px;font-weight:600;font-size:.9rem;display:none} +.cf-fb.ok{display:block;background:#d1fae5;color:#065f46} +.cf-fb.bad{display:block;background:#fee2e2;color:#7f1d1d} .foot{text-align:center;padding:24px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border)} @@ -230,6 +256,26 @@ main{max-width:1100px;margin:0 auto;padding:32px 24px 60px} +