@@ -0,0 +1,355 @@
<!DOCTYPE html>
< html lang = "ru" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width,initial-scale=1.0" >
< title > Алгебра 8 класс — учебник< / title >
< link href = "https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800;900&family=Inter:wght@400;500;600;700&family=Unbounded:wght@400;700;800;900&display=swap" rel = "stylesheet" >
< script src = "/js/api.js" defer > < / script >
< script src = "/js/xp.js" defer > < / script >
< style >
: root {
--bg : #fdf2f8 ; --card : #fff ;
--text : #1a1a2e ; --muted : #6b5b73 ;
--border : #fce7f3 ;
--pri : #e91e63 ; --pri-d : #c2185b ;
--pri-soft : #fce7f3 ;
--ch1 : #e91e63 ; --ch1-d : #c2185b ;
--ch2 : #ad1457 ; --ch2-d : #880e4f ;
--ch3 : #6366f1 ; --ch3-d : #4f46e5 ;
--sh : 0 4 px 16 px rgba ( 233 , 30 , 99 , .09 ) ;
--sh-h : 0 12 px 36 px rgba ( 233 , 30 , 99 , .18 ) ;
}
html . dark {
--bg : #1a0f1a ; --card : #2a1929 ;
--text : #f5e6f0 ; --muted : #b0a0b0 ;
--border : #5a2a5a ;
--pri-soft : rgba ( 233 , 30 , 99 , .16 ) ;
}
* { margin : 0 ; padding : 0 ; box-sizing : border-box }
html , body { min-height : 100 vh }
body { font-family : 'Inter' , system-ui , sans-serif ; background : var ( - - bg ) ; color : var ( - - text ) ; line-height : 1.55 ; transition : background .25 s , color .25 s }
/* HEADER */
. hdr { position : relative ; background : linear-gradient ( 110 deg , #c2185b 0 % , #e91e63 55 % , #ec407a 100 % ) ; color : #fff ; padding : 32 px 24 px 28 px ; overflow : hidden ; border-bottom : 2 px solid rgba ( 255 , 180 , 210 , .15 ) }
. hdr :: before { content : 'АЛГЕБРА' ; position : absolute ; right : -14 px ; top : -18 % ; font-family : 'Outfit' , sans-serif ; font-size : clamp ( 5 rem , 16 vw , 13 rem ) ; font-weight : 900 ; letter-spacing : -.04 em ; color : transparent ; -webkit- text-stroke : 1.5 px rgba ( 255 , 220 , 235 , .10 ) ; line-height : 1 ; pointer-events : none ; user-select : none }
. hdr-inner { position : relative ; z-index : 1 ; max-width : 1100 px ; margin : 0 auto ; display : flex ; align-items : center ; gap : 18 px ; flex-wrap : wrap }
. hdr-back { display : inline-flex ; align-items : center ; gap : 8 px ; padding : 8 px 14 px ; background : rgba ( 255 , 255 , 255 , .14 ) ; border-radius : 9 px ; color : #fff ; text-decoration : none ; font-size : .85 rem ; font-weight : 600 ; transition : background .15 s }
. hdr-back : hover { background : rgba ( 255 , 255 , 255 , .24 ) }
. hdr h1 { font-family : 'Outfit' , sans-serif ; font-size : 1.85 rem ; font-weight : 900 ; letter-spacing : -.01 em }
. hdr-sub { font-size : .92 rem ; opacity : .85 ; margin-top : 4 px }
. hdr-side { margin-left : auto ; display : flex ; gap : 8 px }
. hdr-btn { padding : 8 px 12 px ; background : rgba ( 255 , 255 , 255 , .14 ) ; border : none ; color : #fff ; border-radius : 9 px ; cursor : pointer ; font-weight : 600 ; font-size : .82 rem ; display : inline-flex ; align-items : center ; gap : 6 px ; transition : background .15 s ; font-family : inherit }
. hdr-btn : hover { background : rgba ( 255 , 255 , 255 , .24 ) }
. ic { width : 16 px ; height : 16 px ; stroke : currentColor ; fill : none ; stroke-width : 2 ; stroke-linecap : round ; stroke-linejoin : round }
main { max-width : 1100 px ; margin : 0 auto ; padding : 32 px 24 px 60 px }
/* INTRO */
. intro { background : var ( - - card ) ; border : 1 px solid var ( - - border ) ; border-radius : 18 px ; padding : 24 px 26 px ; margin-bottom : 28 px ; box-shadow : var ( - - sh ) ; position : relative ; overflow : hidden }
. intro :: before { content : 'x' ; position : absolute ; right : -10 px ; top : -30 px ; font-size : 12 rem ; font-style : italic ; opacity : .04 ; line-height : 1 ; pointer-events : none ; font-family : 'Inter' , serif ; font-weight : 900 ; color : var ( - - pri - d ) }
. intro h2 { font-family : 'Outfit' , sans-serif ; font-size : 1.45 rem ; font-weight : 800 ; color : var ( - - pri - d ) ; margin-bottom : 10 px ; letter-spacing : -.01 em }
. intro p { font-size : 1.02 rem ; color : var ( - - text ) ; opacity : .9 ; max-width : 720 px ; margin-bottom : 8 px }
. intro . meta { margin-top : 14 px ; display : flex ; gap : 18 px ; flex-wrap : wrap ; font-size : .86 rem ; color : var ( - - muted ) }
. intro . meta b { color : var ( - - pri - d ) }
/* OVERALL PROGRESS */
. prog-overall { background : linear-gradient ( 135 deg , var ( - - pri - soft ) , rgba ( 99 , 102 , 241 , .12 ) ) ; border : 1 px solid var ( - - border ) ; border-radius : 14 px ; padding : 14 px 18 px ; margin-bottom : 28 px ; display : flex ; gap : 14 px ; align-items : center ; flex-wrap : wrap }
. po-icon { width : 46 px ; height : 46 px ; border-radius : 12 px ; background : linear-gradient ( 135 deg , #e91e63 , #6366f1 ) ; color : #fff ; display : flex ; align-items : center ; justify-content : center ; flex-shrink : 0 ; font-family : 'Outfit' , sans-serif ; font-size : 1.4 rem ; font-weight : 900 }
. po-text { flex : 1 ; min-width : 160 px }
. po-label { font-size : .78 rem ; font-weight : 700 ; color : var ( - - muted ) ; text-transform : uppercase ; letter-spacing : .06 em ; margin-bottom : 4 px }
. po-bar { height : 8 px ; background : rgba ( 233 , 30 , 99 , .12 ) ; border-radius : 5 px ; overflow : hidden ; margin-top : 6 px }
. po-fill { height : 100 % ; background : linear-gradient ( 90 deg , var ( - - pri ) , #6366f1 ) ; border-radius : 5 px ; transition : width .5 s }
. po-xp { display : inline-flex ; align-items : center ; gap : 6 px ; padding : 6 px 14 px ; background : linear-gradient ( 135 deg , #f59e0b , var ( - - pri ) ) ; color : #fff ; border-radius : 99 px ; font-size : .8 rem ; font-weight : 800 ; font-family : 'Unbounded' , sans-serif ; letter-spacing : .02 em ; box-shadow : 0 4 px 12 px rgba ( 233 , 30 , 99 , .22 ) }
/* CHAPTER GRID */
. ch-grid { display : grid ; grid-template-columns : 1 fr ; gap : 18 px ; margin-bottom : 30 px }
@ media ( min-width : 760px ) { . ch-grid { grid-template-columns : 1 fr 1 fr 1 fr } }
. ch-card { background : var ( - - card ) ; border : 1.5 px solid var ( - - border ) ; border-radius : 18 px ; overflow : hidden ; display : flex ; flex-direction : column ; transition : transform .2 s , box-shadow .2 s , border-color .2 s ; cursor : pointer ; text-decoration : none ; color : inherit }
. ch-card : hover { transform : translateY ( -4 px ) ; box-shadow : var ( - - sh - h ) }
. ch-cover { padding : 22 px 22 px 18 px ; color : #fff ; position : relative ; overflow : hidden }
. ch-cover-wm { position : absolute ; right : -10 px ; top : -30 px ; font-size : 8 rem ; font-weight : 900 ; font-family : 'Outfit' , sans-serif ; line-height : 1 ; letter-spacing : -.04 em ; color : rgba ( 255 , 255 , 255 , .13 ) ; pointer-events : none }
. ch-num { display : inline-block ; padding : 4 px 10 px ; background : rgba ( 255 , 255 , 255 , .22 ) ; border-radius : 99 px ; font-size : .7 rem ; font-weight : 700 ; text-transform : uppercase ; letter-spacing : .08 em ; margin-bottom : 8 px ; position : relative ; z-index : 1 }
. ch-title { font-family : 'Outfit' , sans-serif ; font-size : 1.2 rem ; font-weight : 800 ; letter-spacing : -.01 em ; position : relative ; z-index : 1 ; line-height : 1.3 }
. ch-range { font-size : .86 rem ; opacity : .85 ; margin-top : 4 px ; position : relative ; z-index : 1 ; font-weight : 500 }
. ch-cover . ch1 { background : linear-gradient ( 135 deg , #880e4f , #e91e63 60 % , #ec407a ) }
. ch-cover . ch2 { background : linear-gradient ( 135 deg , #560027 , #ad1457 60 % , #c2185b ) }
. ch-cover . ch3 { background : linear-gradient ( 135 deg , #312e81 , #6366f1 60 % , #818cf8 ) }
. ch-body { padding : 18 px 22 px 20 px ; display : flex ; flex-direction : column ; flex : 1 }
. ch-desc { font-size : .9 rem ; color : var ( - - text ) ; opacity : .82 ; flex : 1 ; margin-bottom : 14 px ; line-height : 1.55 }
. ch-tags { display : flex ; flex-wrap : wrap ; gap : 5 px ; margin-bottom : 14 px }
. ch-tag { padding : 3 px 9 px ; border-radius : 6 px ; font-size : .72 rem ; font-weight : 600 }
. ch-tag . pink { background : var ( - - pri - soft ) ; color : var ( - - pri - d ) }
. ch-tag . indigo { background : rgba ( 99 , 102 , 241 , .14 ) ; color : #4f46e5 }
html . dark . ch-tag . indigo { color : #818cf8 }
. ch-prog { margin-bottom : 14 px }
. ch-prog-label { display : flex ; justify-content : space-between ; font-size : .74 rem ; color : var ( - - muted ) ; font-weight : 600 ; margin-bottom : 4 px }
. ch-prog-bar { height : 6 px ; background : rgba ( 233 , 30 , 99 , .10 ) ; border-radius : 4 px ; overflow : hidden }
. ch-prog-fill { height : 100 % ; border-radius : 4 px ; transition : width .5 s }
. ch-card . ch1-card . ch-prog-fill { background : linear-gradient ( 90 deg , var ( - - ch1 ) , var ( - - ch1 - d ) ) }
. ch-card . ch2-card . ch-prog-fill { background : linear-gradient ( 90 deg , var ( - - ch2 ) , var ( - - ch2 - d ) ) }
. ch-card . ch3-card . ch-prog-fill { background : linear-gradient ( 90 deg , var ( - - ch3 ) , var ( - - ch3 - d ) ) }
. ch-action { display : flex ; align-items : center ; justify-content : space-between ; padding : 10 px 14 px ; border-radius : 11 px ; font-weight : 700 ; font-size : .92 rem ; color : #fff ; transition : filter .15 s }
. ch-action : hover { filter : brightness ( 1.08 ) }
. ch-card . ch1-card . ch-action { background : linear-gradient ( 135 deg , var ( - - ch1 ) , #ec407a ) }
. ch-card . ch2-card . ch-action { background : linear-gradient ( 135 deg , var ( - - ch2 ) , #d81b60 ) }
. ch-card . ch3-card . ch-action { background : linear-gradient ( 135 deg , var ( - - ch3 ) , #818cf8 ) }
/* ACHIEVEMENT STRIP */
. ach-strip { background : var ( - - card ) ; border : 1.5 px solid var ( - - border ) ; border-radius : 16 px ; padding : 18 px 22 px ; margin-bottom : 28 px ; display : flex ; align-items : center ; gap : 16 px ; transition : border-color .4 s , box-shadow .4 s }
. ach-strip . lit { border-color : #f59e0b ; box-shadow : 0 0 0 3 px rgba ( 245 , 158 , 11 , .18 ) }
. ach-icon { width : 52 px ; height : 52 px ; border-radius : 14 px ; background : rgba ( 0 , 0 , 0 , .06 ) ; display : flex ; align-items : center ; justify-content : center ; flex-shrink : 0 ; transition : background .4 s }
. ach-strip . lit . ach-icon { background : linear-gradient ( 135 deg , #fbbf24 , #f59e0b ) }
. ach-icon svg { width : 28 px ; height : 28 px ; stroke : var ( - - muted ) }
. ach-strip . lit . ach-icon svg { stroke : #fff }
. ach-text { flex : 1 }
. ach-title { font-weight : 800 ; font-size : 1.02 rem ; color : var ( - - text ) }
. ach-sub { font-size : .85 rem ; color : var ( - - muted ) ; margin-top : 2 px }
. ach-strip . lit . ach-title { color : #92400e }
. foot { text-align : center ; padding : 24 px 16 px ; color : var ( - - muted ) ; font-size : .78 rem ; border-top : 1 px solid var ( - - border ) }
< / style >
< / head >
< body >
< header class = "hdr" >
< div class = "hdr-inner" >
< div >
< a href = "/textbooks" class = "hdr-back" >
< svg class = "ic" viewBox = "0 0 24 24" > < polyline points = "15 18 9 12 15 6" / > < / svg >
К каталогу
< / a >
< / div >
< div >
< h1 > Алгебра — 8 класс< / h1 >
< div class = "hdr-sub" > Полный курс: корни, уравнения, неравенства< / div >
< / div >
< div class = "hdr-side" >
< button id = "theme-btn" class = "hdr-btn" title = "Сменить тему" >
< svg class = "ic" viewBox = "0 0 24 24" > < path d = "M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z" / > < / svg >
< span id = "theme-lab" > Тёмная< / span >
< / button >
< / div >
< / div >
< / header >
< main >
< section class = "intro" >
< h2 > Алгебра 8 класса< / h2 >
< p > Интерактивный учебник по алгебре 8 класса. Три главы охватывают весь курс: квадратные корни и действительные числа, квадратные уравнения, неравенства с одной переменной.< / p >
< p > 21 параграф, 3 финала глав, 100+ интерактивных заданий, 21 босс-проверка. По учебнику Арефьевой И. Г., Пирютко О. Н. (2018).< / p >
< div class = "meta" >
< span > < b > 21< / b > параграф< / span >
< span > < b > 3< / b > главы< / span >
< span > < b > 100+< / b > интерактивов< / span >
< span > < b > 21< / b > босс-проверка< / span >
< / div >
< / section >
< section class = "prog-overall" >
< div class = "po-icon" > x< / div >
< div class = "po-text" >
< div class = "po-label" > Общий прогресс по курсу< / div >
< div id = "overall-text" style = "font-size:1.05rem;font-weight:700" > Загрузка...< / div >
< div class = "po-bar" > < div id = "overall-fill" class = "po-fill" style = "width:0%" > < / div > < / div >
< / div >
< div id = "hero-xp-badge" class = "po-xp" style = "display:none" > 0 XP< / div >
< / section >
< div class = "ch-grid" >
< a href = "/textbook/algebra-8-ch1" class = "ch-card ch1-card" id = "ch-1" >
< div class = "ch-cover ch1" >
< div class = "ch-cover-wm" > I< / div >
< div class = "ch-num" > Глава 1< / div >
< div class = "ch-title" > Квадратные корни. Действительные числа< / div >
< div class = "ch-range" > §1–§6 + Финал< / div >
< / div >
< div class = "ch-body" >
< div class = "ch-desc" > Понятие квадратного корня, арифметический корень, свойства квадратных корней, упрощение выражений с корнями, числовые неравенства, действительные числа.< / div >
< div class = "ch-tags" >
< span class = "ch-tag pink" > Корни< / span >
< span class = "ch-tag pink" > Иррациональность< / span >
< span class = "ch-tag pink" > 6 параграфов< / span >
< / div >
< div class = "ch-prog" >
< div class = "ch-prog-label" > < span > Прогресс< / span > < span id = "prog-1" > 0%< / span > < / div >
< div class = "ch-prog-bar" > < div class = "ch-prog-fill" id = "fill-1" style = "width:0%" > < / div > < / div >
< / div >
< div class = "ch-action" >
< span id = "btn-1" > Открыть главу< / span >
< svg class = "ic" viewBox = "0 0 24 24" > < polyline points = "9 18 15 12 9 6" / > < / svg >
< / div >
< / div >
< / a >
< a href = "/textbook/algebra-8-ch2" class = "ch-card ch2-card" id = "ch-2" >
< div class = "ch-cover ch2" >
< div class = "ch-cover-wm" > II< / div >
< div class = "ch-num" > Глава 2< / div >
< div class = "ch-title" > Квадратные уравнения< / div >
< div class = "ch-range" > §7–§12 + Финал< / div >
< / div >
< div class = "ch-body" >
< div class = "ch-desc" > Квадратные уравнения и их решение, формула дискриминанта, теорема Виета, уравнения, сводимые к квадратным, задачи на составление уравнений.< / div >
< div class = "ch-tags" >
< span class = "ch-tag pink" > Дискриминант< / span >
< span class = "ch-tag pink" > Теорема Виета< / span >
< span class = "ch-tag pink" > 7 параграфов< / span >
< / div >
< div class = "ch-prog" >
< div class = "ch-prog-label" > < span > Прогресс< / span > < span id = "prog-2" > 0%< / span > < / div >
< div class = "ch-prog-bar" > < div class = "ch-prog-fill" id = "fill-2" style = "width:0%" > < / div > < / div >
< / div >
< div class = "ch-action" >
< span id = "btn-2" > Открыть главу< / span >
< svg class = "ic" viewBox = "0 0 24 24" > < polyline points = "9 18 15 12 9 6" / > < / svg >
< / div >
< / div >
< / a >
< a href = "/textbook/algebra-8-ch3" class = "ch-card ch3-card" id = "ch-3" >
< div class = "ch-cover ch3" >
< div class = "ch-cover-wm" > III< / div >
< div class = "ch-num" > Глава 3< / div >
< div class = "ch-title" > Неравенства с одной переменной< / div >
< div class = "ch-range" > §13–§18 + Финал< / div >
< / div >
< div class = "ch-body" >
< div class = "ch-desc" > Числовые неравенства, линейные неравенства с одной переменной, системы и совокупности неравенств, метод интервалов, квадратные неравенства.< / div >
< div class = "ch-tags" >
< span class = "ch-tag indigo" > Метод интервалов< / span >
< span class = "ch-tag indigo" > Системы< / span >
< span class = "ch-tag indigo" > 7 параграфов< / span >
< / div >
< div class = "ch-prog" >
< div class = "ch-prog-label" > < span > Прогресс< / span > < span id = "prog-3" > 0%< / span > < / div >
< div class = "ch-prog-bar" > < div class = "ch-prog-fill" id = "fill-3" style = "width:0%" > < / div > < / div >
< / div >
< div class = "ch-action" >
< span id = "btn-3" > Открыть главу< / span >
< svg class = "ic" viewBox = "0 0 24 24" > < polyline points = "9 18 15 12 9 6" / > < / svg >
< / div >
< / div >
< / a >
< / div >
< div class = "ach-strip" id = "ach-strip" >
< div class = "ach-icon" >
< svg viewBox = "0 0 24 24" fill = "none" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >
< path d = "M6 9H4l-1-3h18l-1 3h-2M6 9l1 6h10l1-6M6 9h12" / > < path d = "M9 21h6M12 15v6" / >
< / svg >
< / div >
< div class = "ach-text" >
< div class = "ach-title" > Магистр алгебры 8< / div >
< div class = "ach-sub" id = "ach-sub" > Прочитайте все 21 параграф трёх глав, чтобы получить достижение< / div >
< / div >
< / div >
< / main >
< footer class = "foot" >
Интерактивный учебник «Алгебра — 8 класс» · LearnSpace
< / footer >
< script >
'use strict' ;
/* THEME */
( function ( ) {
const saved = localStorage . getItem ( 'algebra8_theme' ) || localStorage . getItem ( 'theme' ) || 'light' ;
if ( saved === 'dark' ) document . documentElement . classList . add ( 'dark' ) ;
const lab = document . getElementById ( 'theme-lab' ) ;
if ( lab ) lab . textContent = saved === 'dark' ? 'Светлая' : 'Тёмная' ;
document . getElementById ( 'theme-btn' ) . addEventListener ( 'click' , function ( ) {
document . documentElement . classList . toggle ( 'dark' ) ;
const dark = document . documentElement . classList . contains ( 'dark' ) ;
localStorage . setItem ( 'algebra8_theme' , dark ? 'dark' : 'light' ) ;
localStorage . setItem ( 'theme' , dark ? 'dark' : 'light' ) ;
if ( lab ) lab . textContent = dark ? 'Светлая' : 'Тёмная' ;
} ) ;
} ) ( ) ;
/* PROGRESS — loaded from /api/textbooks/algebra-8/children via LS.api */
var TOTAL = 21 ;
/* Para counts per chapter (slugs algebra-8-ch1/ch2/ch3) */
var CH _PARA = { 'algebra-8-ch1' : 7 , 'algebra-8-ch2' : 7 , 'algebra-8-ch3' : 7 } ;
/* Map slug to card index 1/2/3 */
var CH _IDX = { 'algebra-8-ch1' : 1 , 'algebra-8-ch2' : 2 , 'algebra-8-ch3' : 3 } ;
function setChProg ( idx , readCount , total ) {
var pct = total ? Math . round ( readCount * 100 / total ) : 0 ;
var labelEl = document . getElementById ( 'prog-' + idx ) ;
var fillEl = document . getElementById ( 'fill-' + idx ) ;
var btnEl = document . getElementById ( 'btn-' + idx ) ;
if ( labelEl ) labelEl . textContent = pct + '%' ;
if ( fillEl ) fillEl . style . width = pct + '%' ;
if ( btnEl ) {
if ( readCount > 0 && readCount < total ) btnEl . textContent = 'Продолжить' ;
else if ( readCount >= total ) btnEl . textContent = 'Открыть снова' ;
else btnEl . textContent = 'Открыть главу' ;
}
return pct ;
}
function renderProgress ( children ) {
var totalRead = 0 ;
for ( var i = 0 ; i < children . length ; i ++ ) {
var ch = children [ i ] ;
var idx = CH _IDX [ ch . slug ] ;
if ( ! idx ) continue ;
var read = ch . progress ? ch . progress . read . length : 0 ;
var total = ch . para _count || CH _PARA [ ch . slug ] || 7 ;
totalRead += read ;
setChProg ( idx , read , total ) ;
}
var pct = Math . round ( totalRead * 100 / TOTAL ) ;
var overallEl = document . getElementById ( 'overall-text' ) ;
var fillEl = document . getElementById ( 'overall-fill' ) ;
if ( overallEl ) overallEl . textContent = totalRead + ' из ' + TOTAL + ' параграфов · ' + pct + '%' ;
if ( fillEl ) fillEl . style . width = pct + '%' ;
/* Achievement strip */
if ( totalRead >= TOTAL ) {
var strip = document . getElementById ( 'ach-strip' ) ;
var sub = document . getElementById ( 'ach-sub' ) ;
if ( strip ) strip . classList . add ( 'lit' ) ;
if ( sub ) sub . textContent = 'Выполнено! Вы прочитали весь курс алгебры 8 класса.' ;
}
}
function loadProgress ( ) {
/* Requires LS.api (window.LS from /js/api.js). Signature: LS.api(path, fetchOptions?) */
if ( typeof window . LS === 'undefined' || typeof window . LS . api !== 'function' ) {
/* Not authenticated: show zeros */
renderProgress ( [ ] ) ;
return ;
}
window . LS . api ( '/api/textbooks/algebra-8/children' )
. then ( function ( data ) {
if ( data && data . children ) renderProgress ( data . children ) ;
else renderProgress ( [ ] ) ;
} )
. catch ( function ( ) { renderProgress ( [ ] ) ; } ) ;
}
/* Wait for api.js to be ready */
if ( document . readyState === 'loading' ) {
document . addEventListener ( 'DOMContentLoaded' , loadProgress ) ;
} else {
loadProgress ( ) ;
}
window . addEventListener ( 'focus' , loadProgress ) ;
< / script >
< / body >
< / html >