Files
Learn_System/frontend/mocks-redesign.html
Maxim Dolgolyov 5381679c68 chore: консолидация незакоммиченной работы (биохимия + System Health + lab/textbooks)
Зафиксирована накопленная незакоммиченная работа рабочего дерева, КРОМЕ файлов
учебника «Химия 7» (migration 046, chemistry_7_*.html, chem7_svg.js, тест —
оставлены незакоммиченными по запросу).

Включает: модуль биохимии (ядро BIO, 3D VSEPR, химдвижок, баланс, challenges,
пути из БД), System Health Level 1 (вердикт/мониторинг), а также frontend-
страницы и lab/textbooks-правки параллельной сессии.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 18:12:55 +03:00

2065 lines
93 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>LearnSpace — Re-Design Dossier № 01</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght,SOFT,WONK@9..144,300..900,0..100,0..1&family=Newsreader:ital,opsz,wght@0,6..72,300..700;1,6..72,300..700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
/* ────────────────────────────────────────────────────────────────
LEARNSPACE — RE-DESIGN DOSSIER
Aesthetic: Academic Risograph.
Paper-stock cream, two inks (deep indigo + warm vermilion),
distinctive editorial typography, asymmetric grid,
visible grain, ruled margins, hand-numbered sections.
──────────────────────────────────────────────────────────────── */
:root{
--paper: #f1ebe0; /* warm cream stock */
--paper-2: #ece4d3; /* darker fold */
--paper-3: #e3d8bf; /* margin tint */
--ink: #14213d; /* primary ink, deep indigo */
--ink-soft: #2b3a5a;
--ink-mute: #5b6479;
--rule: #14213d;
--vermilion: #d94e1f; /* second ink */
--vermilion-2: #b53d12;
--moss: #495c2b; /* tertiary, used sparingly */
--gold: #b8893a;
--shadow-ink: 0 1px 0 #14213d, 0 2px 0 rgba(20,33,61,.15);
--serif: 'Fraunces', 'Newsreader', Georgia, serif;
--body: 'Newsreader', Georgia, serif;
--mono: 'JetBrains Mono', ui-monospace, Menlo, monospace;
}
*{ box-sizing:border-box; margin:0; padding:0 }
html,body{ background:var(--paper); color:var(--ink); }
body{
font-family:var(--body);
font-size:16px;
line-height:1.5;
font-feature-settings: "ss01","ss02","liga","onum";
-webkit-font-smoothing:antialiased;
text-rendering:optimizeLegibility;
overflow-x:hidden;
}
/* ── grain & registration texture across whole page ── */
body::before{
content:""; position:fixed; inset:0; pointer-events:none; z-index:2000;
opacity:.45; mix-blend-mode:multiply;
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220' viewBox='0 0 220 220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.08 0 0 0 0 0.13 0 0 0 0 0.24 0 0 0 0.22 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
}
body::after{
content:""; position:fixed; inset:0; pointer-events:none; z-index:1999;
background:
radial-gradient(ellipse at 8% 12%, rgba(217,78,31,.07), transparent 45%),
radial-gradient(ellipse at 92% 88%, rgba(20,33,61,.10), transparent 55%);
}
/* ── document edges ── */
.doc{
max-width:1280px;
margin:0 auto;
padding:48px 56px 120px;
position:relative;
}
.doc::before, .doc::after{
content:""; position:absolute; top:0; bottom:0; width:1px;
background:repeating-linear-gradient(to bottom, var(--ink) 0 6px, transparent 6px 12px);
opacity:.45;
}
.doc::before{ left:32px } .doc::after{ right:32px }
/* ── masthead ── */
.masthead{
display:grid;
grid-template-columns: 1fr auto 1fr;
align-items:end;
gap:24px;
padding-bottom:14px;
border-bottom:3px double var(--ink);
}
.mast-left, .mast-right{
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.14em;
color:var(--ink-soft);
line-height:1.6;
}
.mast-right{ text-align:right }
.mast-center{
font-family:var(--serif);
font-weight:300;
font-variation-settings: "opsz" 144, "SOFT" 0, "WONK" 1;
font-size: clamp(56px, 9vw, 132px);
line-height:.86;
text-align:center;
letter-spacing:-.025em;
color:var(--ink);
position:relative;
}
.mast-center em{
font-style:italic;
font-variation-settings: "opsz" 144, "SOFT" 100, "WONK" 1;
color:var(--vermilion);
}
.mast-sub{
display:flex; justify-content:space-between; align-items:baseline;
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.18em;
color:var(--ink);
padding:10px 0 0;
}
.mast-sub b{ font-weight:700 }
.mast-sub .dot{ color:var(--vermilion) }
/* ── deck / standfirst ── */
.deck{
margin: 36px 0 64px;
display:grid;
grid-template-columns: 4fr 5fr;
gap: 56px;
align-items:start;
}
.deck-l{
font-family:var(--serif);
font-style:italic;
font-variation-settings:"opsz" 32, "SOFT" 60;
font-size: clamp(22px, 2.2vw, 30px);
line-height:1.28;
color:var(--ink-soft);
}
.deck-l b{
font-style:normal; font-weight:600;
color:var(--ink);
background: linear-gradient(transparent 62%, rgba(217,78,31,.35) 62% 92%, transparent 92%);
padding: 0 .1em;
}
.deck-r{
font-family:var(--mono); font-size:12px; line-height:1.7;
color:var(--ink-soft);
border-left:1px solid var(--ink);
padding-left:20px;
columns: 2; column-gap: 28px; column-rule: 1px dotted var(--ink);
}
.deck-r h6{
font-family:var(--mono); font-size:10px; letter-spacing:.18em; text-transform:uppercase;
color:var(--vermilion); margin-bottom:6px; break-after:avoid;
}
.deck-r p{ margin-bottom:14px; break-inside:avoid }
/* ── section anatomy ── */
.section{
margin: 96px 0;
padding-top: 28px;
border-top: 1px solid var(--ink);
position:relative;
}
.section::before{
/* hand-numbered chapter mark */
content: attr(data-num);
position:absolute;
top:-30px; left:-12px;
font-family:var(--serif);
font-variation-settings:"opsz" 144,"SOFT" 0,"WONK" 1;
font-weight:300; font-style:italic;
font-size:84px; line-height:1;
color:var(--vermilion);
background:var(--paper);
padding: 0 18px;
}
.section-head{
display:grid;
grid-template-columns: minmax(0,1fr) 240px;
gap:48px;
align-items:end;
margin-bottom: 36px;
}
.s-kicker{
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.22em;
color:var(--vermilion);
display:flex; align-items:center; gap:10px;
margin-bottom:10px;
}
.s-kicker::after{ content:""; flex:1; height:1px; background:var(--ink); opacity:.4 }
.s-title{
font-family:var(--serif);
font-weight:400;
font-variation-settings:"opsz" 110,"SOFT" 30;
font-size: clamp(40px, 5.2vw, 72px);
line-height:.95;
letter-spacing:-.02em;
}
.s-title em{
font-style:italic;
font-variation-settings:"opsz" 110,"SOFT" 100,"WONK" 1;
color:var(--vermilion);
}
.s-meta{
font-family:var(--mono); font-size:11px; line-height:1.7;
color:var(--ink-soft); text-transform:uppercase; letter-spacing:.1em;
border:1px solid var(--ink); padding:14px 16px;
background:var(--paper-2);
}
.s-meta b{ color:var(--vermilion); font-weight:700 }
.s-meta div + div{ margin-top:4px }
/* ── two-column body: mock frame + marginalia ── */
.bay{
display:grid;
grid-template-columns: minmax(0, 7fr) minmax(0, 3fr);
gap: 40px;
align-items:start;
}
.bay.flip{ grid-template-columns: minmax(0,3fr) minmax(0,7fr); }
.notes{
font-family:var(--mono); font-size:12px; line-height:1.7;
color:var(--ink-soft);
padding-top: 8px;
position:sticky; top:24px;
}
.notes h4{
font-family:var(--serif);
font-style:italic;
font-variation-settings:"opsz" 24,"SOFT" 60;
font-weight:500; font-size:20px;
color:var(--ink); margin-bottom:8px;
}
.notes p{ margin-bottom:14px }
.notes ul{ list-style:none; padding:0; margin: 8px 0 18px }
.notes li{
padding:4px 0 4px 18px; position:relative; border-bottom:1px dotted rgba(20,33,61,.25);
}
.notes li::before{
content:""; position:absolute; left:2px; top:4px;
color:var(--vermilion); font-weight:700;
}
.notes .tag{
display:inline-block; font-family:var(--mono); font-size:10px;
padding:2px 8px; margin:0 4px 4px 0;
background:var(--ink); color:var(--paper); letter-spacing:.1em;
}
.notes .tag.v{ background:var(--vermilion) }
.notes .tag.o{ background:transparent; color:var(--ink); border:1px solid var(--ink) }
/* ── the mock frame itself ── */
.mock{
position:relative;
background:var(--paper);
border:2px solid var(--ink);
box-shadow:
8px 8px 0 var(--vermilion),
8px 8px 0 1px var(--ink);
overflow:hidden;
}
.mock::before{
/* registration crosshair top-left */
content:""; position:absolute; top:6px; left:6px; width:14px; height:14px;
background:
linear-gradient(var(--vermilion), var(--vermilion)) center/100% 1px no-repeat,
linear-gradient(var(--vermilion), var(--vermilion)) center/1px 100% no-repeat;
z-index:3;
}
.mock::after{
content:""; position:absolute; top:6px; right:6px;
width:8px; height:8px; border-radius:50%;
background:var(--vermilion); z-index:3;
}
.mock-caption{
display:flex; justify-content:space-between; align-items:center;
font-family:var(--mono); font-size:10px; text-transform:uppercase; letter-spacing:.18em;
color:var(--ink-soft);
padding: 10px 14px;
border-top:1px solid var(--ink);
background:var(--paper-2);
}
.mock-caption b{ color:var(--vermilion); font-weight:700 }
.mock-canvas{ padding:0; }
/* ============================================================
GENERIC MOCK PRIMITIVES (used inside .mock-canvas)
============================================================ */
.frame{
position:relative;
background:var(--paper);
font-family:var(--body);
color:var(--ink);
min-height:440px;
}
.frame.dark{
background:var(--ink);
color:var(--paper);
}
.frame.dark .topbar, .frame.dark .sidebar{ background:#0f1a30; color:var(--paper) }
.frame .topbar{
display:flex; align-items:center; gap:20px;
padding: 14px 22px;
border-bottom:1px solid var(--ink);
background:var(--paper-2);
}
.frame .brand{
font-family:var(--serif);
font-variation-settings:"opsz" 48,"SOFT" 0,"WONK" 1;
font-weight:500; font-size:24px; letter-spacing:-.02em;
}
.frame .brand em{ color:var(--vermilion); font-style:italic; font-variation-settings:"opsz" 48,"SOFT" 100,"WONK" 1; }
.frame .nav{
display:flex; gap:22px; margin-left:auto;
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.14em;
}
.frame .nav span{ position:relative; cursor:default }
.frame .nav span.cur{ color:var(--vermilion) }
.frame .nav span.cur::after{ content:""; position:absolute; left:-2px; right:-2px; bottom:-6px; height:2px; background:var(--vermilion) }
.frame .avatar{
width:28px; height:28px; border-radius:50%;
background:var(--ink); color:var(--paper);
display:grid; place-items:center;
font-family:var(--serif); font-size:14px;
font-variation-settings:"opsz" 24,"SOFT" 50;
}
.frame .body{ display:grid; min-height: 440px; }
.frame .sidebar{
background:var(--paper-3);
border-right:1px solid var(--ink);
padding:18px 14px;
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.12em;
color:var(--ink-soft);
}
.sb-group{ margin-bottom:14px }
.sb-group h6{ color:var(--vermilion); font-weight:700; font-size:10px; margin-bottom:6px }
.sb-link{ display:flex; align-items:center; gap:8px; padding:5px 6px; border-radius:0; cursor:default; line-height:1.4 }
.sb-link.cur{ background:var(--ink); color:var(--paper) }
.sb-link .ic{ width:10px; height:10px; border:1px solid currentColor; display:inline-block }
.pad{ padding: 26px 30px; }
.eyebrow{
font-family:var(--mono); font-size:10px; text-transform:uppercase; letter-spacing:.22em;
color:var(--vermilion); display:flex; gap:10px; align-items:center;
}
.eyebrow::before{ content:""; width:14px; height:1px; background:var(--vermilion) }
.h-title{
font-family:var(--serif);
font-weight:400;
font-variation-settings:"opsz" 96,"SOFT" 30;
font-size: clamp(34px, 4vw, 52px);
line-height:.96;
letter-spacing:-.02em;
margin: 8px 0 4px;
}
.h-title em{ font-style:italic; color:var(--vermilion); font-variation-settings:"opsz" 96,"SOFT" 100,"WONK" 1; }
.lede{
font-family:var(--serif); font-style:italic;
font-variation-settings:"opsz" 24,"SOFT" 60;
font-size:18px; line-height:1.4; color:var(--ink-soft);
max-width:62ch;
margin-bottom: 18px;
}
/* buttons */
.btn{
display:inline-flex; align-items:center; gap:8px;
padding: 10px 18px;
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.16em;
border:1.5px solid var(--ink); background:var(--paper);
color:var(--ink); cursor:default;
box-shadow: 3px 3px 0 var(--ink);
transition: transform .15s, box-shadow .15s;
}
.btn:hover{ transform:translate(-1px,-1px); box-shadow:4px 4px 0 var(--ink) }
.btn:active{ transform:translate(2px,2px); box-shadow:1px 1px 0 var(--ink) }
.btn.fill{ background:var(--ink); color:var(--paper) }
.btn.v{ background:var(--vermilion); color:var(--paper); border-color:var(--vermilion); box-shadow:3px 3px 0 var(--ink) }
.btn-row{ display:flex; gap:10px; flex-wrap:wrap; margin: 12px 0 }
/* generic rule strip */
.rule-strip{
display:flex; gap:16px; align-items:center;
padding: 10px 0; border-top:1px solid var(--ink); border-bottom:1px solid var(--ink);
font-family:var(--mono); font-size:10px; text-transform:uppercase; letter-spacing:.14em;
color:var(--ink-soft);
}
.rule-strip b{ color:var(--vermilion); font-weight:700 }
/* "cards" but as editorial blocks */
.cardgrid{ display:grid; gap:18px; }
.cardgrid.x2{ grid-template-columns:repeat(2,1fr) }
.cardgrid.x3{ grid-template-columns:repeat(3,1fr) }
.cardgrid.x4{ grid-template-columns:repeat(4,1fr) }
.card{
border:1px solid var(--ink);
background:var(--paper);
padding: 16px;
position:relative;
}
.card.alt{ background:var(--paper-2) }
.card.ink{ background:var(--ink); color:var(--paper) }
.card .num{
font-family:var(--serif); font-variation-settings:"opsz" 96,"SOFT" 80,"WONK" 1;
font-weight:400; font-size:54px; line-height:.9; letter-spacing:-.04em;
}
.card .num em{ font-style:italic; color:var(--vermilion) }
.card .lbl{
font-family:var(--mono); font-size:10px; text-transform:uppercase; letter-spacing:.16em;
color:var(--ink-soft); margin-bottom:6px;
}
.card .ttl{
font-family:var(--serif); font-weight:500;
font-variation-settings:"opsz" 32,"SOFT" 30;
font-size:22px; line-height:1.15; margin:4px 0 6px;
}
.card .ttl em{ font-style:italic; color:var(--vermilion) }
.card.ink .lbl{ color:rgba(241,235,224,.65) }
.card.ink .ttl em{ color:#ff8c5e }
/* progress as ruled bar */
.bar{ height:8px; background:var(--paper-3); border:1px solid var(--ink); position:relative; overflow:hidden }
.bar > i{ display:block; height:100%; background:repeating-linear-gradient(45deg, var(--vermilion) 0 4px, var(--vermilion-2) 4px 8px); }
/* ascii-ish data viz */
.chart-bars{ display:grid; grid-template-columns:repeat(12,1fr); gap:6px; height:120px; align-items:end; padding:8px 0 }
.chart-bars i{ display:block; background:var(--ink); border-top:3px solid var(--vermilion) }
.chart-bars i.alt{ background:var(--vermilion); border-top-color:var(--ink) }
/* swatch row */
.sw-row{ display:flex; gap:8px; flex-wrap:wrap; margin: 8px 0 }
.sw{ width:42px; height:42px; border:1px solid var(--ink); position:relative }
.sw::after{
content:attr(data-hex);
position:absolute; left:0; right:0; top:100%;
font-family:var(--mono); font-size:9px; text-align:center; padding-top:3px;
color:var(--ink-soft); letter-spacing:.06em;
}
/* ============================================================
01 — LOGIN MOCK
============================================================ */
.login-mock{
display:grid; grid-template-columns: 1fr 1.1fr; min-height:520px;
}
.lm-left{
background:var(--ink); color:var(--paper);
padding: 36px 36px;
position:relative; overflow:hidden;
}
.lm-left::before{
/* huge typographic flourish */
content:"L"; position:absolute; right:-40px; bottom:-80px;
font-family:var(--serif); font-style:italic;
font-variation-settings:"opsz" 144,"SOFT" 100,"WONK" 1;
font-weight:300; font-size:520px; line-height:1;
color:#1d2c4f;
}
.lm-left .brand{ color:var(--paper); position:relative; z-index:1; margin-bottom:32px }
.lm-left .brand em{ color:#ff8c5e }
.lm-left h2{
font-family:var(--serif); font-weight:300;
font-variation-settings:"opsz" 110,"SOFT" 20;
font-size:52px; line-height:.95; letter-spacing:-.025em;
position:relative; z-index:1;
}
.lm-left h2 em{ color:#ff8c5e; font-style:italic;
font-variation-settings:"opsz" 110,"SOFT" 100,"WONK" 1; }
.lm-quote{
position:relative; z-index:1;
margin-top:auto; padding-top:120px;
font-family:var(--serif); font-style:italic; font-size:17px;
font-variation-settings:"opsz" 18,"SOFT" 80;
border-top:1px solid rgba(241,235,224,.3);
padding-top:14px; margin-top:24px;
color:rgba(241,235,224,.85);
}
.lm-quote cite{
display:block; font-family:var(--mono); font-size:10px; text-transform:uppercase;
letter-spacing:.18em; color:rgba(241,235,224,.55); margin-top:6px; font-style:normal;
}
.lm-right{ padding: 44px 48px; display:flex; flex-direction:column; justify-content:center }
.lm-right .num-mark{
font-family:var(--mono); font-size:10px; letter-spacing:.22em; color:var(--vermilion);
text-transform:uppercase; margin-bottom:12px;
}
.lm-right h3{
font-family:var(--serif); font-weight:400;
font-variation-settings:"opsz" 72,"SOFT" 20;
font-size:40px; line-height:1; letter-spacing:-.015em; margin-bottom:6px;
}
.lm-right h3 em{ font-style:italic; color:var(--vermilion);
font-variation-settings:"opsz" 72,"SOFT" 100,"WONK" 1; }
.lm-right p{ font-family:var(--serif); font-style:italic; color:var(--ink-soft); margin-bottom:24px;
font-variation-settings:"opsz" 20,"SOFT" 60; font-size:16px }
.field{
display:flex; flex-direction:column; gap:6px; margin-bottom:16px;
}
.field label{
font-family:var(--mono); font-size:10px; text-transform:uppercase; letter-spacing:.18em;
color:var(--ink-soft);
}
.field .inp{
border:none; border-bottom:1.5px solid var(--ink);
background:transparent; padding: 6px 0;
font-family:var(--serif); font-size:22px; color:var(--ink);
font-variation-settings:"opsz" 24,"SOFT" 10;
height:38px;
}
.lm-row{
display:flex; justify-content:space-between; align-items:center;
margin-top: 6px;
font-family:var(--mono); font-size:11px; letter-spacing:.06em; color:var(--ink-soft);
}
.lm-row a{ color:var(--vermilion); text-decoration:underline }
/* ============================================================
02 — DASHBOARD MOCK
============================================================ */
.dash-mock .body{
grid-template-columns: 180px 1fr;
}
.dash-hero{
display:grid; grid-template-columns: 2fr 1fr; gap:24px;
border-bottom:1px solid var(--ink);
padding: 20px 0 24px;
margin-bottom:18px;
}
.dash-hero .greet em{ color:var(--vermilion); font-style:italic;
font-variation-settings:"opsz" 96,"SOFT" 100,"WONK" 1; }
.streak{
border:1px solid var(--ink); padding:12px 14px; background:var(--paper-2);
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.12em;
display:flex; flex-direction:column; justify-content:space-between;
}
.streak .big{
font-family:var(--serif); font-variation-settings:"opsz" 110,"SOFT" 80,"WONK" 1;
font-size:64px; line-height:1; letter-spacing:-.04em; font-weight:400;
}
.streak .big em{ color:var(--vermilion); font-style:italic }
.dash-cols{
display:grid; grid-template-columns: 2fr 1fr; gap:24px; align-items:start;
}
.lesson-stack{ display:flex; flex-direction:column; }
.lesson-row{
display:grid; grid-template-columns: 64px 1fr auto; gap:16px;
padding: 16px 4px;
border-bottom:1px solid var(--ink);
align-items:baseline;
}
.lesson-row:first-child{ border-top:1px solid var(--ink) }
.lesson-row .when{
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.14em;
color:var(--vermilion);
}
.lesson-row h5{
font-family:var(--serif); font-weight:500;
font-variation-settings:"opsz" 32,"SOFT" 30; font-size:22px; line-height:1.15;
}
.lesson-row .meta{
font-family:var(--mono); font-size:11px; color:var(--ink-soft); margin-top:4px;
text-transform:uppercase; letter-spacing:.1em;
}
.lesson-row .go{
font-family:var(--mono); font-size:11px; letter-spacing:.16em; text-transform:uppercase;
color:var(--ink); border-bottom:1px solid var(--vermilion); padding-bottom:2px;
}
/* ============================================================
03 — CLASSROOM / WHITEBOARD MOCK
============================================================ */
.board-mock{ background:#1a3b1a; color:#f1ebe0; min-height:520px; position:relative; overflow:hidden }
.board-mock::before{
/* chalk grain */
content:""; position:absolute; inset:0;
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='c'><feTurbulence baseFrequency='0.65' numOctaves='2'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.08 0'/></filter><rect width='100%25' height='100%25' filter='url(%23c)'/></svg>");
opacity:.6;
}
.board-mock::after{
/* wooden frame inner */
content:""; position:absolute; inset:0;
border:14px solid #4a2e16;
box-shadow: inset 0 0 0 2px #6b4423, inset 0 0 0 3px #2c1810, 0 0 0 3px #2c1810;
pointer-events:none;
}
.board-toolbar{
position:absolute; top:28px; left:50%; transform:translateX(-50%);
display:flex; gap:0; z-index:2;
background:rgba(20,33,61,.85);
border:1px solid #f1ebe0; padding:4px;
}
.board-toolbar i{
width:34px; height:34px; display:grid; place-items:center;
font-family:var(--mono); font-size:13px; color:#f1ebe0;
border-right:1px solid rgba(241,235,224,.2); font-style:normal;
}
.board-toolbar i:last-child{ border-right:none }
.board-toolbar i.cur{ background:var(--vermilion); color:var(--paper) }
.board-content{
position:absolute; inset:36px; z-index:1;
display:grid; grid-template-columns: 1fr 200px; gap:0;
font-family:'Caveat', var(--serif);
}
.board-area{ padding:24px 30px; position:relative; }
.board-title{
font-family:var(--serif); font-style:italic;
font-variation-settings:"opsz" 96,"SOFT" 100,"WONK" 1;
font-weight:300; font-size:46px; line-height:1;
color:#f1ebe0; letter-spacing:-.01em;
text-shadow: 0 0 6px rgba(241,235,224,.15);
}
.board-title::after{
content:""; display:block; width:120px; height:2px; background:#ff8c5e; margin-top:6px;
box-shadow:0 0 8px rgba(255,140,94,.5);
}
.board-eq{
font-family:var(--serif); font-style:italic;
font-variation-settings:"opsz" 144,"SOFT" 100,"WONK" 1;
font-weight:300; font-size:74px; color:#f1ebe0;
margin: 40px 0 8px; letter-spacing:-.01em;
text-shadow: 0 0 8px rgba(241,235,224,.2);
}
.board-eq em{ color:#ff8c5e; font-style:italic }
.board-note{
font-family:'Newsreader',serif; font-style:italic;
font-size:18px; color:rgba(241,235,224,.85);
max-width:60ch; margin-top:6px;
font-variation-settings:"opsz" 18,"SOFT" 80;
}
.board-sticky{
position:absolute; right:24%; bottom:24%;
width:120px; height:120px; padding:12px;
background:#f5d76e; color:#2b3a5a;
font-family:var(--serif); font-style:italic; font-size:14px;
transform:rotate(-4deg);
box-shadow: 4px 6px 12px rgba(0,0,0,.4);
font-variation-settings:"opsz" 14,"SOFT" 60;
}
.board-thumbs{
border-left:1px solid rgba(241,235,224,.25);
padding: 10px 8px; display:flex; flex-direction:column; gap:8px;
background:rgba(20,33,61,.35);
}
.board-thumbs .th{
height:60px; border:1px solid rgba(241,235,224,.35);
background: rgba(241,235,224,.05);
font-family:var(--mono); font-size:10px; text-align:center; padding-top:4px;
color:rgba(241,235,224,.7);
position:relative;
}
.board-thumbs .th.cur{ outline:2px solid var(--vermilion); outline-offset:-1px }
/* ============================================================
04 — LIBRARY / TEXTBOOKS MOCK (editorial spread)
============================================================ */
.lib-mock{ padding: 0; min-height:580px; }
.lib-head{
display:grid; grid-template-columns: 1fr auto;
padding: 20px 28px; border-bottom:1px solid var(--ink);
align-items:end;
}
.lib-grid{
display:grid; grid-template-columns: repeat(12,1fr); gap:0;
border-bottom:1px solid var(--ink);
}
.book{
grid-column: span 3;
padding: 22px 22px 26px;
border-right:1px solid var(--ink);
border-bottom:1px solid var(--ink);
background:var(--paper); position:relative;
display:flex; flex-direction:column; gap:8px;
}
.book:nth-child(4n){ border-right:none }
.book:nth-child(n+9){ border-bottom:none }
.book.span2{ grid-column: span 6 }
.book.ink{ background:var(--ink); color:var(--paper) }
.book.v{ background:var(--vermilion); color:var(--paper) }
.book .cat{
font-family:var(--mono); font-size:10px; text-transform:uppercase; letter-spacing:.18em;
color:var(--vermilion);
}
.book.ink .cat, .book.v .cat{ color:#ffd8c2 }
.book h4{
font-family:var(--serif); font-weight:400;
font-variation-settings:"opsz" 56,"SOFT" 30;
font-size: 26px; line-height:1.05; letter-spacing:-.01em;
}
.book.span2 h4{ font-size:38px }
.book h4 em{ font-style:italic; color:var(--vermilion);
font-variation-settings:"opsz" 56,"SOFT" 100,"WONK" 1; }
.book.ink h4 em, .book.v h4 em{ color:#ffd8c2 }
.book .au{
font-family:var(--mono); font-size:10px; letter-spacing:.12em; text-transform:uppercase;
color:var(--ink-soft); margin-top:auto; padding-top:14px;
border-top:1px dotted var(--ink); display:flex; justify-content:space-between;
}
.book.ink .au, .book.v .au{ color:rgba(241,235,224,.7); border-top-color:rgba(241,235,224,.3) }
.book .deco{
font-family:var(--serif); font-style:italic;
font-variation-settings:"opsz" 144,"SOFT" 100,"WONK" 1;
font-size:90px; line-height:.8; font-weight:300; opacity:.85;
margin: 6px 0 -4px;
}
/* ============================================================
05 — LAB / SIMULATIONS MOCK
============================================================ */
.lab-mock{ padding: 0; min-height:540px }
.lab-head{
padding: 20px 28px; border-bottom:1px solid var(--ink);
display:grid; grid-template-columns: 1fr auto; gap:24px; align-items:end;
}
.lab-filters{
display:flex; gap:10px;
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.12em;
}
.lab-filters i{
border:1px solid var(--ink); padding:5px 10px; font-style:normal;
}
.lab-filters i.cur{ background:var(--ink); color:var(--paper) }
.lab-grid{
display:grid; grid-template-columns: repeat(3, 1fr); gap:0;
}
.sim{
border-right:1px solid var(--ink); border-bottom:1px solid var(--ink);
padding: 18px 20px 22px;
display:flex; flex-direction:column; gap:8px;
background:var(--paper);
min-height: 200px;
}
.sim:nth-child(3n){ border-right:none }
.sim .tag-mini{
display:inline-block; font-family:var(--mono); font-size:9px; letter-spacing:.16em;
text-transform:uppercase; padding:2px 6px; border:1px solid var(--ink); color:var(--ink);
align-self:flex-start;
}
.sim h5{
font-family:var(--serif); font-weight:500;
font-variation-settings:"opsz" 32,"SOFT" 30;
font-size: 22px; line-height:1.1; letter-spacing:-.005em;
}
.sim h5 em{ color:var(--vermilion); font-style:italic;
font-variation-settings:"opsz" 32,"SOFT" 100,"WONK" 1; }
.sim .desc{
font-family:var(--serif); font-style:italic;
font-variation-settings:"opsz" 14,"SOFT" 60;
font-size:14px; line-height:1.35; color:var(--ink-soft);
}
.sim .schema{
margin-top:auto; padding-top:8px;
display:flex; align-items:center; gap:6px;
font-family:var(--mono); font-size:10px; color:var(--ink-soft); letter-spacing:.1em;
}
.sim .schema .dot{ width:8px; height:8px; border-radius:50%; background:var(--vermilion); display:inline-block }
.sim svg{ display:block; margin: 4px 0 }
/* ============================================================
06 — EXAM PREP MOCK
============================================================ */
.exam-mock{ padding:0; min-height: 540px }
.exam-head{
padding: 22px 28px; border-bottom:1px solid var(--ink);
display:grid; grid-template-columns: 1fr auto; align-items:end; gap:24px;
}
.exam-cols{
display:grid; grid-template-columns: 1.3fr 1fr; min-height: 440px;
}
.exam-left{
padding: 26px 28px; border-right:1px solid var(--ink);
background:var(--paper);
}
.exam-q{
font-family:var(--serif); font-weight:400;
font-variation-settings:"opsz" 56,"SOFT" 30;
font-size: 30px; line-height: 1.15; letter-spacing:-.005em;
margin-bottom: 22px;
}
.exam-q em{ font-style:italic; color:var(--vermilion);
font-variation-settings:"opsz" 56,"SOFT" 100,"WONK" 1; }
.exam-q sup{ font-family:var(--mono); font-size:11px; color:var(--ink-soft); vertical-align:super; margin-left:6px; font-weight:400 }
.opt{
display:grid; grid-template-columns: 28px 1fr; gap:14px;
padding: 12px 0;
border-bottom:1px solid var(--ink);
align-items:baseline; font-family:var(--serif); font-size:18px;
}
.opt .let{
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.14em;
color:var(--vermilion); border:1px solid var(--vermilion); text-align:center; height:24px; line-height:22px;
}
.opt.cur{ background:var(--paper-2) }
.opt.cur .let{ background:var(--vermilion); color:var(--paper) }
.exam-right{
padding: 26px 28px; background:var(--paper-2);
display:flex; flex-direction:column; gap: 20px;
}
.exam-timer{
font-family:var(--serif); font-variation-settings:"opsz" 144,"SOFT" 80,"WONK" 1;
font-weight:300; font-size: 72px; line-height: .9; letter-spacing:-.04em;
}
.exam-timer em{ font-style:italic; color:var(--vermilion) }
.exam-grid{
display:grid; grid-template-columns: repeat(10, 1fr); gap:4px;
}
.exam-grid i{
aspect-ratio:1; border:1px solid var(--ink);
font-family:var(--mono); font-size:10px; text-align:center; line-height:1.8;
color:var(--ink); font-style:normal;
}
.exam-grid i.done{ background:var(--ink); color:var(--paper) }
.exam-grid i.cur{ background:var(--vermilion); color:var(--paper); border-color:var(--vermilion) }
.exam-grid i.flag{ background:var(--paper); border-color:var(--vermilion); color:var(--vermilion) }
/* ============================================================
07 — TEACHER (GRADEBOOK) MOCK
============================================================ */
.gb-mock{ padding:0 }
.gb-head{
padding: 18px 24px; border-bottom:1px solid var(--ink);
display:grid; grid-template-columns: 1fr auto; align-items:end; gap:16px;
}
.gb-tabs{ display:flex; gap:0;
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.12em;
}
.gb-tabs i{
padding:6px 14px; border:1px solid var(--ink); border-right:none; font-style:normal;
}
.gb-tabs i:last-child{ border-right:1px solid var(--ink) }
.gb-tabs i.cur{ background:var(--vermilion); color:var(--paper); border-color:var(--vermilion) }
.gb-table{
width:100%; border-collapse:collapse;
font-family:var(--mono); font-size:11px;
}
.gb-table th, .gb-table td{
padding: 9px 10px;
border-right:1px solid var(--ink); border-bottom:1px solid var(--ink);
text-align:center; height: 34px;
}
.gb-table th{
background:var(--paper-2); color:var(--ink); text-transform:uppercase; letter-spacing:.1em;
font-size:10px; font-weight:700;
}
.gb-table td.name{
text-align:left; font-family:var(--serif); font-size:16px;
font-variation-settings:"opsz" 18,"SOFT" 30;
padding-left:18px;
background:var(--paper);
}
.gb-table tr:last-child td{ border-bottom:none }
.gb-table td:last-child, .gb-table th:last-child{ border-right:none }
.g{ font-family:var(--serif); font-size:18px; font-variation-settings:"opsz" 24,"SOFT" 60 }
.g.hi{ color:var(--moss); font-weight:600 }
.g.lo{ color:var(--vermilion); font-weight:600 }
.g.mid{ color:var(--ink) }
.g.none{ color:var(--ink-soft); font-family:var(--mono); font-size:14px }
/* ============================================================
08 — ADMIN MOCK
============================================================ */
.admin-mock{ padding:0; min-height: 540px }
.admin-head{
padding: 22px 28px; border-bottom:1px solid var(--ink);
}
.admin-cols{
display:grid; grid-template-columns: 160px 1fr;
min-height: 440px;
}
.admin-side{
background:var(--ink); color:var(--paper);
padding: 18px 14px;
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.12em;
}
.admin-side h6{ color:#ff8c5e; font-size:10px; font-weight:700; margin: 10px 0 6px }
.admin-side a{
display:block; color:rgba(241,235,224,.85); padding:5px 0;
border-bottom:1px dotted rgba(241,235,224,.18);
}
.admin-side a.cur{ color:#ff8c5e }
.admin-main{ padding: 22px 28px }
.kpi-row{ display:grid; grid-template-columns: repeat(4,1fr); gap:16px; margin-bottom: 22px }
.admin-log{
border-top:1px solid var(--ink); padding-top:14px;
font-family:var(--mono); font-size:11px; line-height:1.8; color:var(--ink-soft);
}
.admin-log p span{ color:var(--vermilion); margin-right:8px }
.admin-log p b{ color:var(--ink); font-weight:700 }
/* ============================================================
09 — PROFILE / PET MOCK
============================================================ */
.profile-mock{ padding: 0; min-height: 540px }
.pf-cols{
display:grid; grid-template-columns: 1fr 1.4fr; min-height: 540px;
}
.pf-left{
background:var(--ink); color:var(--paper);
padding: 36px 32px;
position:relative; overflow:hidden;
}
.pf-left::before{
content:""; position:absolute; right:-60px; top:-60px;
width:280px; height:280px; border-radius:50%;
background: radial-gradient(circle at 30% 30%, #ff8c5e, var(--vermilion));
}
.pf-name{
font-family:var(--serif); font-weight:300;
font-variation-settings:"opsz" 110,"SOFT" 30;
font-size:50px; line-height:1; letter-spacing:-.02em;
margin: 32px 0 4px; position:relative;
}
.pf-name em{ color:#ff8c5e; font-style:italic;
font-variation-settings:"opsz" 110,"SOFT" 100,"WONK" 1; }
.pf-class{
font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:.18em;
color:rgba(241,235,224,.7);
}
.pf-stats{
display:grid; grid-template-columns: repeat(3,1fr); gap:0;
margin-top:40px; border-top:1px solid rgba(241,235,224,.25);
}
.pf-stats div{
padding:14px 0 4px; border-right:1px solid rgba(241,235,224,.25);
}
.pf-stats div:last-child{ border-right:none }
.pf-stats .lbl{
font-family:var(--mono); font-size:10px; text-transform:uppercase; letter-spacing:.16em;
color:rgba(241,235,224,.55);
}
.pf-stats .v{
font-family:var(--serif); font-variation-settings:"opsz" 96,"SOFT" 80,"WONK" 1;
font-weight:400; font-size:42px; line-height:1; letter-spacing:-.03em;
}
.pf-stats .v em{ color:#ff8c5e; font-style:italic }
.pf-right{ padding: 30px 32px; background:var(--paper) }
.pet{
border:1px solid var(--ink); background:var(--paper-2);
padding: 20px 20px; margin-bottom:18px;
display:grid; grid-template-columns: 110px 1fr; gap:18px;
align-items:center;
}
.pet svg{ display:block }
.pet h5{
font-family:var(--serif); font-weight:500;
font-variation-settings:"opsz" 32,"SOFT" 30; font-size: 24px; line-height:1.1;
}
.pet h5 em{ color:var(--vermilion); font-style:italic;
font-variation-settings:"opsz" 32,"SOFT" 100,"WONK" 1; }
.pet .stat{
display:grid; grid-template-columns: 60px 1fr 32px; gap:10px;
align-items:center;
font-family:var(--mono); font-size:10px; text-transform:uppercase; letter-spacing:.12em;
margin-top:4px;
}
.ach-grid{
display:grid; grid-template-columns: repeat(5,1fr); gap:10px;
}
.ach{
aspect-ratio:1; border:1px solid var(--ink); display:grid; place-items:center;
font-family:var(--serif); font-variation-settings:"opsz" 48,"SOFT" 60,"WONK" 1;
font-style:italic; font-size:24px; color:var(--ink-soft);
background:var(--paper-2);
}
.ach.got{ background:var(--vermilion); color:var(--paper); font-style:italic }
/* ============================================================
10 — DESIGN TOKENS MOCK
============================================================ */
.tokens-grid{
display:grid; grid-template-columns: 1fr 1fr 1fr; gap:0;
border:1px solid var(--ink); min-height: 380px;
}
.tk{
padding: 20px 22px; border-right:1px solid var(--ink);
background:var(--paper);
}
.tk:last-child{ border-right:none }
.tk h6{
font-family:var(--mono); font-size:10px; text-transform:uppercase; letter-spacing:.2em;
color:var(--vermilion); margin-bottom:14px;
}
.tk .specimen{
font-family:var(--serif); font-weight:300;
font-variation-settings:"opsz" 144,"SOFT" 60,"WONK" 1;
font-size: 96px; line-height:.85; letter-spacing:-.04em;
}
.tk .specimen em{ font-style:italic; color:var(--vermilion);
font-variation-settings:"opsz" 144,"SOFT" 100,"WONK" 1; }
.tk .stack{
font-family:var(--mono); font-size:11px; line-height:1.7; color:var(--ink-soft);
letter-spacing:.04em;
}
.tk .stack b{ color:var(--ink); font-weight:700 }
/* ── colophon ── */
.colophon{
margin-top: 100px;
padding-top: 30px;
border-top: 3px double var(--ink);
display:grid; grid-template-columns: 2fr 1fr; gap:40px;
font-family:var(--mono); font-size:11px; color:var(--ink-soft);
text-transform:uppercase; letter-spacing:.12em; line-height:1.8;
}
.colophon h3{
font-family:var(--serif); font-style:italic;
font-variation-settings:"opsz" 56,"SOFT" 80,"WONK" 1;
font-weight:300; font-size:38px;
color:var(--ink); letter-spacing:-.01em;
text-transform:none;
margin-bottom: 8px;
}
.colophon h3 em{ color:var(--vermilion) }
.colophon p{ font-family:var(--serif); font-style:italic;
font-variation-settings:"opsz" 18,"SOFT" 60;
font-size:15px; color:var(--ink-soft); text-transform:none; letter-spacing:0;
margin-bottom:12px; line-height:1.5;
}
/* ── small screens: just stack ── */
@media (max-width: 900px){
.doc{ padding: 24px 18px 80px }
.doc::before, .doc::after{ display:none }
.mast-center{ font-size: 56px }
.deck, .bay, .bay.flip, .section-head, .colophon{ grid-template-columns:1fr }
.login-mock, .pf-cols, .exam-cols, .admin-cols, .dash-mock .body{ grid-template-columns:1fr }
.lib-grid, .lab-grid{ grid-template-columns: repeat(2,1fr) }
.book{ grid-column: span 1 }
.frame .body{ grid-template-columns:1fr }
.sidebar{ display:none }
.kpi-row{ grid-template-columns: repeat(2,1fr) }
}
</style>
</head>
<body>
<div class="doc">
<!-- ═══════════════════════ MASTHEAD ═══════════════════════ -->
<header class="masthead">
<div class="mast-left">
Dossier № 01<br>
Volume MMXXVI<br>
Issue&nbsp;·&nbsp;Spring
</div>
<h1 class="mast-center">Learn<em>·</em>Space</h1>
<div class="mast-right">
Re — Design<br>
Re — Visioned<br>
Re — Issued
</div>
</header>
<div class="mast-sub">
<span>Academic Risograph &nbsp;·&nbsp; Edition One</span>
<span><b>10 Systems</b> <span class="dot"></span> <b>1 Vision</b> <span class="dot"></span> <b>Зерно &amp; Чернила</b></span>
<span>For Maxim D. &nbsp;·&nbsp; 2026.05.29</span>
</div>
<!-- ═══════════════════════ STANDFIRST ═══════════════════════ -->
<section class="deck">
<div class="deck-l">
Сегодня LearnSpace выглядит как любая ed-tech платформа: <b>фиолетовый градиент, Inter,
округлые карточки</b>. Этот документ предлагает противоположное —
<b>интеллектуальную графическую систему</b> с характером печатной книги,
редакторской сетки и двух чернильных тонов, которая отличает учебный
продукт от продукта-курьера.
</div>
<div class="deck-r">
<h6>Принципы</h6>
<p><b>Бумага, не экран.</b> Цвет #f1ebe0 — тёплая бумажная основа. Никакого чисто-белого.</p>
<p><b>Два чернила.</b> Глубокий индиго #14213d и вермильон #d94e1f. Третий цвет — только для семантики.</p>
<h6>Типографика</h6>
<p><b>Fraunces</b> — дисплейный сериф с осью оптического размера и SOFT/WONK для эмоции.</p>
<p><b>Newsreader</b> — тело текста, оптимизированное для длинного чтения.</p>
<p><b>JetBrains Mono</b> — метаданные, технические надписи, рубрики.</p>
<h6>Сетка</h6>
<p>Асимметричная редакторская. <b>Линейки</b> вместо обводок. <b>Зерно</b> поверх всего как след печати.</p>
</div>
</section>
<!-- ════════════════════ 00 — TOKENS ════════════════════ -->
<section class="section" data-num="00">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 00 — фундамент</div>
<h2 class="s-title">Палитра, литеры <em>&amp;</em> сетка</h2>
</div>
<div class="s-meta">
<div>Tokens: <b>26</b></div>
<div>Fonts: <b>3 семейства</b></div>
<div>Grid: <b>12 col / 8px</b></div>
<div>Effects: <b>grain, riso, rule</b></div>
</div>
</div>
<div class="bay">
<div class="mock">
<div class="mock-canvas">
<div class="tokens-grid">
<div class="tk">
<h6>① TYPOGRAPHIC SCALE</h6>
<div class="specimen">A<em>a</em></div>
<div class="stack">
<b>Fraunces</b> — display, opsz 110, SOFT 30<br>
<b>Fraunces italic</b> — accent, SOFT 100, WONK 1<br>
<b>Newsreader</b> — body 16/24, italic 18/27<br>
<b>JetBrains Mono</b> — meta 11/16, eyebrows
</div>
</div>
<div class="tk">
<h6>② INK</h6>
<div class="sw-row" style="margin-top:12px">
<span class="sw" data-hex="#f1ebe0" style="background:#f1ebe0"></span>
<span class="sw" data-hex="#14213d" style="background:#14213d"></span>
<span class="sw" data-hex="#d94e1f" style="background:#d94e1f"></span>
</div>
<div class="sw-row" style="margin-top:34px">
<span class="sw" data-hex="#ece4d3" style="background:#ece4d3"></span>
<span class="sw" data-hex="#2b3a5a" style="background:#2b3a5a"></span>
<span class="sw" data-hex="#b53d12" style="background:#b53d12"></span>
<span class="sw" data-hex="#495c2b" style="background:#495c2b"></span>
<span class="sw" data-hex="#b8893a" style="background:#b8893a"></span>
</div>
<p class="stack" style="margin-top:42px">
Бумага&nbsp;→ ink&nbsp;→ вермильон.<br>
Семантика — мох (успех), охра (предупр.).
</p>
</div>
<div class="tk">
<h6>③ EFFECTS & TEXTURES</h6>
<div style="position:relative;height:90px;border:1px solid var(--ink);background:var(--paper-2);overflow:hidden;margin-bottom:10px">
<div style="position:absolute;inset:0;background-image: url(&quot;data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='80' height='80'><filter id='n'><feTurbulence baseFrequency='1.2' numOctaves='2'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='0.25'/></svg>&quot;);"></div>
<span style="position:absolute;left:10px;top:10px;font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase">GRAIN</span>
</div>
<div style="height:14px;border:1px solid var(--ink);background:repeating-linear-gradient(45deg,var(--vermilion) 0 4px, var(--vermilion-2) 4px 8px);margin-bottom:8px"></div>
<div style="height:14px;border:1px solid var(--ink);background:repeating-linear-gradient(0deg,transparent 0 5px, var(--ink) 5px 6px);"></div>
<p class="stack" style="margin-top:14px">
<b>Grain</b> — fixed overlay, multiply.<br>
<b>Hatch</b> — fill для прогресс-баров.<br>
<b>Rule</b> — горизонтальные разделители вместо box-shadow.
</p>
</div>
</div>
</div>
<div class="mock-caption">
<span>fig. 00 — design tokens, three columns</span>
<span><b>SPEC</b> · LS-DS / v.02</span>
</div>
</div>
<aside class="notes">
<h4>Что меняется в&nbsp;ls.css</h4>
<ul>
<li>--bg: <b>#f1ebe0</b> вместо #eef2ff</li>
<li>Шрифты: Fraunces + Newsreader + JetBrains Mono вместо Manrope/Unbounded</li>
<li>Скругления: <b>0—2px</b>, не 12—16px</li>
<li>Тени: жёсткие <b>3px&nbsp;3px&nbsp;0</b> вместо мягких box-shadow</li>
<li>Градиенты исчезают — заменяются <b>штриховкой</b></li>
</ul>
<div>
<span class="tag">tokens</span>
<span class="tag v">paper</span>
<span class="tag o">grain</span>
<span class="tag o">rule</span>
</div>
</aside>
</div>
</section>
<!-- ════════════════════ 01 — LOGIN ════════════════════ -->
<section class="section" data-num="01">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 01 — точка входа</div>
<h2 class="s-title">Login. Первое <em>впечатление</em></h2>
</div>
<div class="s-meta">
<div>Path: <b>/login.html</b></div>
<div>Roles: <b>all</b></div>
<div>Length: <b>один экран</b></div>
<div>Tone: <b>уверенный</b></div>
</div>
</div>
<div class="bay">
<div class="mock">
<div class="mock-canvas">
<div class="frame login-mock">
<div class="lm-left">
<div class="brand">Learn<em>·</em>Space</div>
<h2>Учить — это&nbsp;<em>ремесло.</em><br>Войдите в&nbsp;мастерскую.</h2>
<div class="lm-quote">
«Школа должна напоминать не&nbsp;офис, а&nbsp;тихую читальню, где
каждый занят своим переплётом смысла.»
<cite>— Колофон, 2026</cite>
</div>
</div>
<div class="lm-right">
<div class="num-mark">№ 01 · auth</div>
<h3>Здравствуй <em>снова</em></h3>
<p>Введите вашу почту или логин. Пароль помнит вас.</p>
<div class="field">
<label>Почта или логин</label>
<div class="inp">maxim<span style="color:var(--vermilion)">@</span>school.by</div>
</div>
<div class="field">
<label>Пароль</label>
<div class="inp">• • • • • • • •</div>
</div>
<div class="btn-row" style="margin-top:14px">
<span class="btn v">Войти →</span>
<span class="btn">Гостем</span>
</div>
<div class="lm-row">
<span>Нет аккаунта? <a>Создать</a></span>
<span><a>Забыли пароль?</a></span>
</div>
</div>
</div>
</div>
<div class="mock-caption">
<span>fig. 01 — login screen, split column</span>
<span><b>MOCK</b> · auth/login</span>
</div>
</div>
<aside class="notes">
<h4>Решения</h4>
<p>Половина экрана отдана <b>манифесту</b>. Гигантская курсивная «L» как декоративная литера на тёмной стороне.</p>
<ul>
<li>Поля — <b>линия снизу</b>, не box. Шрифт ввода — сериф 22px.</li>
<li>Один primary в <b>вермильоне</b>, secondary — outline.</li>
<li>Цитата-эпиграф в подвале левой колонки.</li>
</ul>
<span class="tag">login.html</span>
<span class="tag o">auth</span>
<span class="tag v">primary screen</span>
</aside>
</div>
</section>
<!-- ════════════════════ 02 — DASHBOARD ════════════════════ -->
<section class="section" data-num="02">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 02 — каждодневный экран</div>
<h2 class="s-title">Dashboard <em>как</em> утренняя газета</h2>
</div>
<div class="s-meta">
<div>Path: <b>/dashboard.html</b></div>
<div>Roles: <b>student / teacher</b></div>
<div>Density: <b>высокая</b></div>
<div>Hierarchy: <b>сегодня → неделя</b></div>
</div>
</div>
<div class="bay">
<div class="mock">
<div class="mock-canvas">
<div class="frame dash-mock">
<div class="topbar">
<div class="brand">L<em>·</em>S</div>
<div class="nav">
<span class="cur">Dashboard</span>
<span>Уроки</span>
<span>Доска</span>
<span>Библиотека</span>
<span>Лаборатория</span>
</div>
<div class="avatar">М</div>
</div>
<div class="body">
<aside class="sidebar">
<div class="sb-group">
<h6>Учусь</h6>
<div class="sb-link cur"><span class="ic"></span> Главная</div>
<div class="sb-link"><span class="ic"></span> Расписание</div>
<div class="sb-link"><span class="ic"></span> Домашнее</div>
</div>
<div class="sb-group">
<h6>Знание</h6>
<div class="sb-link"><span class="ic"></span> Книги</div>
<div class="sb-link"><span class="ic"></span> Лаборатория</div>
<div class="sb-link"><span class="ic"></span> Карты</div>
</div>
<div class="sb-group">
<h6>Профиль</h6>
<div class="sb-link"><span class="ic"></span> Я</div>
<div class="sb-link"><span class="ic"></span> Питомец</div>
</div>
</aside>
<div class="pad">
<div class="dash-hero">
<div class="greet">
<div class="eyebrow">Пятница · 29 мая · 06:42</div>
<h1 class="h-title">Доброе утро,<br><em>Максим.</em></h1>
<div class="lede">Три урока, одна контрольная и&nbsp;тёплый чай. День сложится.</div>
</div>
<div class="streak">
<div>
<div style="color:var(--vermilion)">Стрик</div>
<div style="margin-top:6px">дней&nbsp;подряд</div>
</div>
<div class="big"><em>17</em></div>
</div>
</div>
<div class="rule-strip">
<span><b>Сегодня</b> &nbsp;·&nbsp; 4&nbsp;занятия</span>
<span style="margin-left:auto">→ всё расписание</span>
</div>
<div class="lesson-stack">
<div class="lesson-row">
<div class="when">08:30</div>
<div>
<h5>Алгебра. <em>Корни третьей степени</em></h5>
<div class="meta">9-Б · И.&nbsp;К.&nbsp;Петрова · 45 мин</div>
</div>
<div class="go">войти →</div>
</div>
<div class="lesson-row">
<div class="when">10:15</div>
<div>
<h5>Физика. <em>Закон сохранения импульса</em></h5>
<div class="meta">9-Б · М.&nbsp;Я.&nbsp;Шилов · лаборатория</div>
</div>
<div class="go">войти →</div>
</div>
<div class="lesson-row">
<div class="when">12:00</div>
<div>
<h5>Английский. <em>Reported speech, drill</em></h5>
<div class="meta">9-Б · A.&nbsp;Sokolova · self-paced</div>
</div>
<div class="go">войти →</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mock-caption">
<span>fig. 02 — dashboard, student view</span>
<span><b>MOCK</b> · dashboard.html</span>
</div>
</div>
<aside class="notes">
<h4>Решения</h4>
<p>Иерархия чтения: <b>имя → день → расписание</b>. Никаких «Welcome back, John!» баннеров.</p>
<ul>
<li>Стрик отдельным <b>геральдическим блоком</b> справа.</li>
<li>Уроки — <b>табличная типографика</b>: время / название / преподаватель / ссылка.</li>
<li>Сайдбар: моноширинные капители, не «Material-icons».</li>
<li>Hero-фраза с <b>курсивным выделением</b> имени.</li>
</ul>
<span class="tag">dashboard.html</span>
<span class="tag o">student</span>
<span class="tag o">teacher</span>
<span class="tag v">основной экран</span>
</aside>
</div>
</section>
<!-- ════════════════════ 03 — CLASSROOM / BOARD ════════════════════ -->
<section class="section" data-num="03">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 03 — урок в реальном времени</div>
<h2 class="s-title">Доска. Зелень <em>и</em> мел</h2>
</div>
<div class="s-meta">
<div>Path: <b>/classroom.html</b></div>
<div>Tools: <b>22 инструмента</b></div>
<div>Theme: <b>сохраняется</b></div>
<div>Поверх: <b>стеклянный UI</b></div>
</div>
</div>
<div class="bay flip">
<aside class="notes">
<h4>Сохраняем — &nbsp;улучшаем</h4>
<p>Школьная доска уже — <b>отличный аэстетический выбор</b>. Не трогаем зелёный фон и деревянную раму. Меняем только <b>служебный UI</b>: тулбар, миниатюры, всплывающие панели.</p>
<ul>
<li>Тулбар: <b>тёмный индиго-стакан</b> с моно-литерами, вермильон для активного инструмента.</li>
<li>Стикеры — <b>тёплая охра</b> вместо неонового жёлтого.</li>
<li>Заголовок страницы — <b>Fraunces italic</b> с подчёркивающим штрихом-«мелом».</li>
<li>Миниатюры справа — без обводок, тонкие линии.</li>
</ul>
<span class="tag">classroom.html</span>
<span class="tag o">whiteboard.js</span>
<span class="tag v">SSE-sync</span>
</aside>
<div class="mock">
<div class="mock-canvas">
<div class="frame">
<div class="board-mock">
<div class="board-toolbar">
<i></i><i class="cur"></i><i></i><i></i><i></i><i></i><i>T</i><i></i><i></i><i></i>
</div>
<div class="board-content">
<div class="board-area">
<div class="board-title">Закон Ньютона <em>·</em> второй</div>
<div class="board-eq">F&nbsp;=&nbsp;m<em>·</em>a</div>
<div class="board-note">
Сила, действующая на тело, равна произведению его массы на&nbsp;ускорение,
которое она&nbsp;ему&nbsp;сообщает.
</div>
<div class="board-sticky">
Спросить:<br>что такое <b>m</b>?<br>— инертная или гравитационная?
</div>
</div>
<div class="board-thumbs">
<div class="th cur">01</div>
<div class="th">02</div>
<div class="th">03</div>
<div class="th" style="opacity:.5">+</div>
</div>
</div>
</div>
</div>
</div>
<div class="mock-caption">
<span>fig. 03 — classroom whiteboard, live</span>
<span><b>MOCK</b> · classroom.html</span>
</div>
</div>
</div>
</section>
<!-- ════════════════════ 04 — LIBRARY / TEXTBOOKS ════════════════════ -->
<section class="section" data-num="04">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 04 — фонд знания</div>
<h2 class="s-title">Библиотека. <em>Книжная</em> сетка</h2>
</div>
<div class="s-meta">
<div>Path: <b>/library.html · /textbooks.html</b></div>
<div>Layout: <b>12-col modular</b></div>
<div>Item: <b>обложка-плита</b></div>
<div>Tone: <b>каталог</b></div>
</div>
</div>
<div class="bay">
<div class="mock">
<div class="mock-canvas">
<div class="frame lib-mock">
<div class="lib-head">
<div>
<div class="eyebrow">Фонд № 02 · учебники</div>
<h1 class="h-title">Каталог <em>учебников</em></h1>
</div>
<div class="lab-filters">
<i class="cur">Все</i><i>Математика</i><i>Физика</i><i>Химия</i><i>Биология</i>
</div>
</div>
<div class="lib-grid">
<div class="book span2 ink">
<div class="cat">Алгебра · 9 класс</div>
<div class="deco"></div>
<h4>Алгебра в <em>задачах и&nbsp;примерах</em></h4>
<div class="au"><span>Е.&nbsp;П.&nbsp;Кузнецова</span><span>2024 · 304&nbsp;стр.</span></div>
</div>
<div class="book">
<div class="cat">Физика · 10</div>
<h4>Механика, <em>энергия, поле</em></h4>
<div class="au"><span>Жилко В.&nbsp;В.</span><span>2023</span></div>
</div>
<div class="book v">
<div class="cat">★ Подборка</div>
<h4>ЦЭ <em>2025</em> · математика</h4>
<div class="au"><span>Сборник</span><span>40 вариантов</span></div>
</div>
<div class="book">
<div class="cat">Геометрия · 10</div>
<h4>Стереометрия. <em>Введение</em></h4>
<div class="au"><span>Шлыков В.&nbsp;В.</span><span>2024</span></div>
</div>
<div class="book">
<div class="cat">Химия · 11</div>
<h4>Органические <em>соединения</em></h4>
<div class="au"><span>Колевич Т.&nbsp;А.</span><span>2024</span></div>
</div>
<div class="book ink">
<div class="cat">Биология · 11</div>
<div class="deco"></div>
<h4>Генетика и&nbsp;<em>эволюция</em></h4>
<div class="au"><span>Лисов Н.&nbsp;Д.</span><span>2024</span></div>
</div>
<div class="book">
<div class="cat">Геометрия · 11</div>
<h4>Векторы <em>в&nbsp;пространстве</em></h4>
<div class="au"><span>Латотин Л.&nbsp;А.</span><span>2023</span></div>
</div>
</div>
</div>
</div>
<div class="mock-caption">
<span>fig. 04 — library, modular spread</span>
<span><b>MOCK</b> · library / textbooks</span>
</div>
</div>
<aside class="notes">
<h4>Решения</h4>
<p>Каждый учебник — <b>каменная плита</b>. Двенадцатиколоночная сетка позволяет редактору «вытаскивать» избранные тайтлы в&nbsp;span-6&nbsp;блоки.</p>
<ul>
<li>Три «вкуса» плит: бумага, чернила, вермильон. Чередуются вручную в&nbsp;редакторском ритме.</li>
<li>Большие декоративные литеры (<b>∫ ∞</b>) как обложечные элементы.</li>
<li>Метаданные в&nbsp;футере карточки — моноширинно, по&nbsp;разделителю.</li>
</ul>
<span class="tag">library.html</span>
<span class="tag o">textbooks.html</span>
<span class="tag v">каталог</span>
</aside>
</div>
</section>
<!-- ════════════════════ 05 — LAB / SIMS ════════════════════ -->
<section class="section" data-num="05">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 05 — эксперимент</div>
<h2 class="s-title">Лаборатория. <em>Карточки-опыты</em></h2>
</div>
<div class="s-meta">
<div>Path: <b>/lab.html</b></div>
<div>Items: <b>симуляции + игры</b></div>
<div>Schematic: <b>каждая карточка</b></div>
<div>Filter: <b>предмет / тип</b></div>
</div>
</div>
<div class="bay flip">
<aside class="notes">
<h4>Решения</h4>
<p>В каждой карточке — <b>миниатюрная схема</b> опыта вместо превью-картинки. Schemа рисуется SVG, читается и при ч/б печати.</p>
<ul>
<li>Курсив <b>Fraunces italic</b> в названии — выделяет «суть» эксперимента.</li>
<li>Подзаголовок — короткий гипотетический вопрос («что будет, если…»).</li>
<li>Один <b>точка-индикатор</b> вместо тегов «сложности» с цветами.</li>
</ul>
<span class="tag">lab.html</span>
<span class="tag o">biochem-*</span>
<span class="tag o">red-book-*</span>
<span class="tag v">simulations</span>
</aside>
<div class="mock">
<div class="mock-canvas">
<div class="frame lab-mock">
<div class="lab-head">
<div>
<div class="eyebrow">Опыт № 12 · кафедра</div>
<h1 class="h-title">Лабор<em>атория</em></h1>
</div>
<div class="lab-filters">
<i class="cur">Все</i><i>Физика</i><i>Химия</i><i>Биология</i><i>Игры</i>
</div>
</div>
<div class="lab-grid">
<div class="sim">
<span class="tag-mini">Физика · оптика</span>
<h5>Интер<em>ференция</em> волн</h5>
<div class="desc">Что произойдёт, если две&nbsp;щели окажутся ближе длины волны?</div>
<svg width="100%" height="50" viewBox="0 0 200 50"><g fill="none" stroke="#14213d" stroke-width="1">
<path d="M0,25 L60,25"/><path d="M140,25 L200,25"/>
<path d="M60,15 L60,35 M68,15 L68,35"/>
<path d="M72,5 Q106,25 72,45 M82,5 Q116,25 82,45 M92,5 Q126,25 92,45" stroke="#d94e1f"/>
</g></svg>
<div class="schema"><span class="dot"></span> готов · 4 мин</div>
</div>
<div class="sim">
<span class="tag-mini">Химия · растворы</span>
<h5>Титрование <em>кислоты</em></h5>
<div class="desc">Найти точку эквивалентности по&nbsp;индикатору. Считать каждую каплю.</div>
<svg width="100%" height="50" viewBox="0 0 200 50"><g fill="none" stroke="#14213d" stroke-width="1.2">
<rect x="90" y="2" width="20" height="22"/>
<path d="M100,24 L100,30 M97,30 L103,30"/>
<path d="M82,30 L118,30 L114,48 L86,48 Z" fill="#d94e1f" fill-opacity=".22" />
</g></svg>
<div class="schema"><span class="dot"></span> готов · 7 мин</div>
</div>
<div class="sim">
<span class="tag-mini">Биохимия</span>
<h5>Цикл <em>Кребса</em></h5>
<div class="desc">Восемь стадий, восемь фермент. Поставить молекулы по&nbsp;кругу.</div>
<svg width="100%" height="50" viewBox="0 0 200 50"><g fill="none" stroke="#14213d" stroke-width="1">
<circle cx="100" cy="25" r="20"/>
<circle cx="100" cy="5" r="3" fill="#d94e1f" stroke="none"/>
<circle cx="120" cy="25" r="3" fill="#14213d"/>
<circle cx="100" cy="45" r="3" fill="#14213d"/>
<circle cx="80" cy="25" r="3" fill="#14213d"/>
</g></svg>
<div class="schema"><span class="dot"></span> 8 шагов · ~12 мин</div>
</div>
<div class="sim">
<span class="tag-mini">Игра</span>
<h5>Кросс<em>ворд</em> · термины</h5>
<div class="desc">20 ключевых слов из главы «Электролиз». На&nbsp;время.</div>
<svg width="100%" height="50" viewBox="0 0 200 50"><g fill="none" stroke="#14213d" stroke-width="1">
<g><rect x="40" y="5" width="10" height="10"/><rect x="50" y="5" width="10" height="10"/><rect x="60" y="5" width="10" height="10" fill="#d94e1f" fill-opacity=".4"/><rect x="70" y="5" width="10" height="10"/></g>
<g><rect x="60" y="15" width="10" height="10"/><rect x="60" y="25" width="10" height="10"/><rect x="60" y="35" width="10" height="10"/></g>
<g><rect x="100" y="20" width="10" height="10"/><rect x="110" y="20" width="10" height="10"/><rect x="120" y="20" width="10" height="10"/></g>
</g></svg>
<div class="schema"><span class="dot"></span> игра · до 10 мин</div>
</div>
<div class="sim">
<span class="tag-mini">Физика · механика</span>
<h5>Маятник <em>Фуко</em></h5>
<div class="desc">Вращение Земли через 24-часовое движение&nbsp;точки.</div>
<svg width="100%" height="50" viewBox="0 0 200 50"><g fill="none" stroke="#14213d" stroke-width="1">
<path d="M100,2 L70,42 M100,2 L130,42" stroke-dasharray="2 2"/>
<path d="M100,2 L100,40"/>
<circle cx="100" cy="42" r="5" fill="#d94e1f"/>
</g></svg>
<div class="schema"><span class="dot"></span> наблюдение · 3&nbsp;мин</div>
</div>
<div class="sim">
<span class="tag-mini">Биология · экосистемы</span>
<h5>Красная <em>книга</em> · биомы</h5>
<div class="desc">Найти причину сокращения вида и&nbsp;собрать факторы среды.</div>
<svg width="100%" height="50" viewBox="0 0 200 50"><g fill="none" stroke="#14213d" stroke-width="1">
<path d="M20,40 L60,20 L100,35 L140,15 L180,40"/>
<path d="M20,40 L180,40"/>
<circle cx="100" cy="35" r="4" fill="#d94e1f"/>
<circle cx="60" cy="20" r="3"/>
<circle cx="140" cy="15" r="3"/>
</g></svg>
<div class="schema"><span class="dot"></span> 6 видов · ~15 мин</div>
</div>
</div>
</div>
</div>
<div class="mock-caption">
<span>fig. 05 — laboratory, simulation index</span>
<span><b>MOCK</b> · lab.html</span>
</div>
</div>
</div>
</section>
<!-- ════════════════════ 06 — EXAM PREP ════════════════════ -->
<section class="section" data-num="06">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 06 — серьёзный режим</div>
<h2 class="s-title">Экзамен. <em>Чёрный</em> кабинет</h2>
</div>
<div class="s-meta">
<div>Path: <b>/exam-prep* · /test-run</b></div>
<div>Mode: <b>сфокусированный</b></div>
<div>Сетка: <b>40&nbsp;вопросов</b></div>
<div>Timer: <b>крупно</b></div>
</div>
</div>
<div class="bay">
<div class="mock">
<div class="mock-canvas">
<div class="frame exam-mock">
<div class="exam-head">
<div>
<div class="eyebrow">ЦЭ · 2025 · Математика · Вариант 03</div>
<h2 class="h-title" style="font-size:36px">Сеанс <em>в&nbsp;тишине</em></h2>
</div>
<div class="btn-row" style="margin:0">
<span class="btn">Пауза</span>
<span class="btn v">Сдать раньше</span>
</div>
</div>
<div class="exam-cols">
<div class="exam-left">
<div class="eyebrow" style="margin-bottom:12px">Вопрос 13 из 40 · 2 балла</div>
<div class="exam-q">
Найдите наибольшее значение функции
<em>f(x) = x³ 12x + 5</em>
на отрезке&nbsp;<em>[3;&nbsp;3]</em>.<sup>02</sup>
</div>
<div class="opt"><div class="let">A</div><div>21</div></div>
<div class="opt cur"><div class="let">B</div><div>23</div></div>
<div class="opt"><div class="let">C</div><div>17</div></div>
<div class="opt"><div class="let">D</div><div>11</div></div>
<div class="btn-row" style="margin-top:18px">
<span class="btn">← Назад</span>
<span class="btn fill">Вперёд →</span>
<span class="btn" style="margin-left:auto">⚑ Пометить</span>
</div>
</div>
<div class="exam-right">
<div>
<div class="eyebrow">Осталось времени</div>
<div class="exam-timer">01<em>:</em>47<em>:</em>22</div>
</div>
<div>
<div class="eyebrow" style="margin-bottom:8px">Карта · 40&nbsp;вопросов</div>
<div class="exam-grid">
<i class="done">1</i><i class="done">2</i><i class="done">3</i><i class="done">4</i><i class="done">5</i>
<i class="done">6</i><i class="done">7</i><i class="done">8</i><i class="done">9</i><i class="done">10</i>
<i class="done">11</i><i class="flag">12</i><i class="cur">13</i><i>14</i><i>15</i>
<i>16</i><i>17</i><i>18</i><i>19</i><i>20</i>
<i>21</i><i>22</i><i>23</i><i>24</i><i>25</i>
<i>26</i><i>27</i><i>28</i><i>29</i><i>30</i>
<i>31</i><i>32</i><i>33</i><i>34</i><i>35</i>
<i>36</i><i>37</i><i>38</i><i>39</i><i>40</i>
</div>
</div>
<div style="margin-top:auto;font-family:var(--mono);font-size:10px;color:var(--ink-soft);text-transform:uppercase;letter-spacing:.14em;border-top:1px dotted var(--ink);padding-top:10px">
⛬ полный экран · клавиша F11
</div>
</div>
</div>
</div>
</div>
<div class="mock-caption">
<span>fig. 06 — exam mode, focused</span>
<span><b>MOCK</b> · test-run.html</span>
</div>
</div>
<aside class="notes">
<h4>Решения</h4>
<p>Экзамен — не&nbsp;дашборд. Никакого сайдбара. <b>Один вопрос — одна страница</b>, всё&nbsp;остальное — карта&nbsp;справа.</p>
<ul>
<li>Таймер набран <b>гигантским Fraunces</b> — главный визуальный якорь.</li>
<li>Карта вопросов — <b>матрица 10×4</b>, не круглые «pills».</li>
<li>Активный — вермильон, пометка — рамка-флажок, готов — чернила залиты.</li>
<li>Опции набраны <b>сериф 18px</b> — как в&nbsp;печатном пособии.</li>
</ul>
<span class="tag">test-run.html</span>
<span class="tag o">exam-prep.html</span>
<span class="tag v">focused mode</span>
</aside>
</div>
</section>
<!-- ════════════════════ 07 — TEACHER / GRADEBOOK ════════════════════ -->
<section class="section" data-num="07">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 07 — учительский стол</div>
<h2 class="s-title">Журнал. <em>Линованная</em> ведомость</h2>
</div>
<div class="s-meta">
<div>Path: <b>/gradebook · /my-students</b></div>
<div>Density: <b>максимальная</b></div>
<div>Стиль: <b>бухгалтерский</b></div>
<div>Color: <b>3 семантических</b></div>
</div>
</div>
<div class="bay flip">
<aside class="notes">
<h4>Решения</h4>
<p>Журнал — <b>самый плотный экран продукта</b>. Это не место для&nbsp;воздуха. Стиль — старая бухгалтерская книга в&nbsp;линейку.</p>
<ul>
<li>Имена — <b>Newsreader 16px</b>, цифры — мини-капители <b>Fraunces&nbsp;18</b>.</li>
<li>Семантика по цвету: <b>хорошо&nbsp;— мох</b>, <b>плохо — вермильон</b>, нет — точка.</li>
<li>Вкладки сверху — <b>квадратные</b>, без скруглений.</li>
<li>Все границы — <b>1px чернила</b>, никаких shadow-карточек.</li>
</ul>
<span class="tag">gradebook.html</span>
<span class="tag o">analytics.html</span>
<span class="tag o">homework.html</span>
<span class="tag v">teacher</span>
</aside>
<div class="mock">
<div class="mock-canvas">
<div class="frame gb-mock">
<div class="gb-head">
<div>
<div class="eyebrow">Журнал · 9-Б · Алгебра · IV&nbsp;четверть</div>
<h2 class="h-title" style="font-size:34px">Ведомость <em>оценок</em></h2>
</div>
<div class="gb-tabs">
<i>Список</i><i class="cur">Оценки</i><i>Пропуски</i><i>Отчёт</i>
</div>
</div>
<table class="gb-table">
<thead>
<tr>
<th style="text-align:left;padding-left:18px;width:32%">Ученик</th>
<th>05.04</th><th>08.04</th><th>12.04</th><th>15.04</th><th>19.04</th>
<th>22.04</th><th>26.04</th><th>03.05</th><th>10.05</th>
<th style="background:var(--vermilion);color:var(--paper)">Ср.</th>
</tr>
</thead>
<tbody>
<tr><td class="name">Антонов Кирилл</td>
<td><span class="g hi">9</span></td><td><span class="g mid">7</span></td><td><span class="g hi">10</span></td><td><span class="g hi">9</span></td><td><span class="g mid">8</span></td>
<td><span class="g hi">9</span></td><td><span class="g none">·</span></td><td><span class="g hi">10</span></td><td><span class="g hi">9</span></td>
<td><span class="g hi">9.0</span></td></tr>
<tr><td class="name">Бондарь Анна</td>
<td><span class="g mid">8</span></td><td><span class="g mid">8</span></td><td><span class="g mid">7</span></td><td><span class="g lo">5</span></td><td><span class="g mid">7</span></td>
<td><span class="g mid">8</span></td><td><span class="g mid">7</span></td><td><span class="g mid">8</span></td><td><span class="g hi">9</span></td>
<td><span class="g mid">7.4</span></td></tr>
<tr><td class="name">Васильев Олег</td>
<td><span class="g lo">4</span></td><td><span class="g none">н</span></td><td><span class="g lo">5</span></td><td><span class="g lo">6</span></td><td><span class="g mid">7</span></td>
<td><span class="g lo">5</span></td><td><span class="g mid">7</span></td><td><span class="g lo">6</span></td><td><span class="g lo">5</span></td>
<td><span class="g lo">5.6</span></td></tr>
<tr><td class="name">Григорьева Дарья</td>
<td><span class="g hi">10</span></td><td><span class="g hi">9</span></td><td><span class="g hi">10</span></td><td><span class="g hi">10</span></td><td><span class="g hi">9</span></td>
<td><span class="g hi">10</span></td><td><span class="g hi">10</span></td><td><span class="g hi">9</span></td><td><span class="g hi">10</span></td>
<td><span class="g hi">9.7</span></td></tr>
<tr><td class="name">Денисенко Илья</td>
<td><span class="g mid">7</span></td><td><span class="g mid">8</span></td><td><span class="g mid">7</span></td><td><span class="g mid">8</span></td><td><span class="g hi">9</span></td>
<td><span class="g mid">8</span></td><td><span class="g mid">7</span></td><td><span class="g mid">8</span></td><td><span class="g mid">8</span></td>
<td><span class="g mid">7.8</span></td></tr>
<tr><td class="name">Журавлёв Артём</td>
<td><span class="g none">·</span></td><td><span class="g lo">5</span></td><td><span class="g mid">7</span></td><td><span class="g mid">7</span></td><td><span class="g mid">6</span></td>
<td><span class="g mid">7</span></td><td><span class="g mid">8</span></td><td><span class="g mid">7</span></td><td><span class="g mid">8</span></td>
<td><span class="g mid">6.9</span></td></tr>
<tr><td class="name">Зайцева Полина</td>
<td><span class="g hi">9</span></td><td><span class="g mid">8</span></td><td><span class="g mid">8</span></td><td><span class="g hi">9</span></td><td><span class="g hi">9</span></td>
<td><span class="g hi">10</span></td><td><span class="g hi">9</span></td><td><span class="g hi">9</span></td><td><span class="g hi">10</span></td>
<td><span class="g hi">9.0</span></td></tr>
</tbody>
</table>
</div>
</div>
<div class="mock-caption">
<span>fig. 07 — gradebook, dense ledger</span>
<span><b>MOCK</b> · gradebook.html</span>
</div>
</div>
</div>
</section>
<!-- ════════════════════ 08 — ADMIN ════════════════════ -->
<section class="section" data-num="08">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 08 — машинная комната</div>
<h2 class="s-title">Админ. <em>Журнал</em> аппарата</h2>
</div>
<div class="s-meta">
<div>Path: <b>/admin · /admin-textbooks</b></div>
<div>Tone: <b>служебный</b></div>
<div>Sidebar: <b>тёмный, моно</b></div>
<div>KPI: <b>четыре карточки</b></div>
</div>
</div>
<div class="bay">
<div class="mock">
<div class="mock-canvas">
<div class="frame admin-mock">
<div class="admin-head">
<div class="eyebrow">Узел № 1 · служба</div>
<h2 class="h-title" style="font-size:36px">Аппарат <em>LearnSpace</em></h2>
</div>
<div class="admin-cols">
<aside class="admin-side">
<h6>System</h6>
<a class="cur">→ Overview</a>
<a>· Users</a>
<a>· Classes</a>
<a>· Roles</a>
<h6>Content</h6>
<a>· Textbooks</a>
<a>· Sims</a>
<a>· Lessons</a>
<h6>Maintenance</h6>
<a>· Logs</a>
<a>· Backups</a>
<a>· SQL console</a>
</aside>
<div class="admin-main">
<div class="kpi-row">
<div class="card">
<div class="lbl">Пользователей</div>
<div class="num">1<em>·</em>284</div>
<div style="font-family:var(--mono);font-size:10px;color:var(--ink-soft);margin-top:6px">+ 12 за неделю</div>
</div>
<div class="card alt">
<div class="lbl">Уроков сегодня</div>
<div class="num"><em>47</em></div>
<div style="font-family:var(--mono);font-size:10px;color:var(--ink-soft);margin-top:6px">из 312 за месяц</div>
</div>
<div class="card">
<div class="lbl">Активных классов</div>
<div class="num">38</div>
<div style="font-family:var(--mono);font-size:10px;color:var(--ink-soft);margin-top:6px">6 классов офлайн</div>
</div>
<div class="card ink">
<div class="lbl">Аптайм</div>
<div class="num">99<em>.</em>97<span style="font-size:24px">%</span></div>
<div style="font-family:var(--mono);font-size:10px;opacity:.6;margin-top:6px">30 дн.</div>
</div>
</div>
<div style="margin-bottom:16px">
<div class="eyebrow" style="margin-bottom:8px">Активность · 12 недель</div>
<div class="chart-bars">
<i style="height:40%"></i><i style="height:55%"></i><i style="height:48%"></i>
<i style="height:65%"></i><i class="alt" style="height:72%"></i><i style="height:60%"></i>
<i style="height:75%"></i><i style="height:82%"></i><i class="alt" style="height:90%"></i>
<i style="height:78%"></i><i style="height:84%"></i><i class="alt" style="height:96%"></i>
</div>
</div>
<div class="admin-log">
<div class="eyebrow" style="margin-bottom:6px;color:var(--ink)">Журнал событий</div>
<p><span>06:42</span> <b>auth</b> &nbsp; teacher@ksenia.by → login ok</p>
<p><span>06:38</span> <b>backup</b> &nbsp; ls-2026-05-29-0638.tar.gz · 412&nbsp;MB · ok</p>
<p><span>06:31</span> <b>seed</b> &nbsp; gen_phys10_ch.js · 24 вопроса добавлено</p>
<p><span>06:29</span> <b>sse</b> &nbsp; classroom/14 · 6 connections</p>
</div>
</div>
</div>
</div>
</div>
<div class="mock-caption">
<span>fig. 08 — admin overview</span>
<span><b>MOCK</b> · admin.html</span>
</div>
</div>
<aside class="notes">
<h4>Решения</h4>
<p>Админка — <b>служебный, не парадный</b> экран. Сайдбар тёмный (это часто открыто фоном). Никаких «illustrations».</p>
<ul>
<li>KPI-карточки <b>чередуют</b> бумагу/индиго/вермильон-акцент.</li>
<li>Простой <b>ASCII-style</b> бар-чарт без gridlines.</li>
<li>Журнал событий — <b>моноширинно</b>, время и&nbsp;модуль выделены вермильоном.</li>
</ul>
<span class="tag">admin.html</span>
<span class="tag o">admin-textbooks.html</span>
<span class="tag v">служебный</span>
</aside>
</div>
</section>
<!-- ════════════════════ 09 — PROFILE / PET ════════════════════ -->
<section class="section" data-num="09">
<div class="section-head">
<div>
<div class="s-kicker">Раздел 09 — игровая часть</div>
<h2 class="s-title">Профиль <em>&amp;</em> Питомец</h2>
</div>
<div class="s-meta">
<div>Path: <b>/profile · /pet</b></div>
<div>Tone: <b>тёплый</b></div>
<div>Геймификация: <b>тонкая</b></div>
<div>Питомец: <b>SVG-рисунок</b></div>
</div>
</div>
<div class="bay flip">
<aside class="notes">
<h4>Решения</h4>
<p>Профиль может быть тёплым, но&nbsp;не&nbsp;скатывается в&nbsp;<b>детский сад «Duolingo-style»</b>. Геральдика&nbsp;> стикеры.</p>
<ul>
<li>Левый блок — <b>тёмный портрет</b> с&nbsp;большой курсивной литерой-инициалом.</li>
<li>Достижения — <b>пятиугольная сетка</b> из&nbsp;курсивных литер, а&nbsp;не значки.</li>
<li>Питомец — <b>ручной SVG-рисунок</b> в&nbsp;стиле гравюры, не&nbsp;3D-моделька.</li>
<li>Стрики и&nbsp;уровни — без&nbsp;ярких неоновых полосок.</li>
</ul>
<span class="tag">profile.html</span>
<span class="tag o">pet.html</span>
<span class="tag v">gamification</span>
</aside>
<div class="mock">
<div class="mock-canvas">
<div class="frame profile-mock">
<div class="pf-cols">
<div class="pf-left">
<div class="eyebrow" style="color:#ff8c5e">Профиль № 1284</div>
<!-- big italic initial -->
<svg width="120" height="120" viewBox="0 0 120 120" style="margin-top:18px">
<circle cx="60" cy="60" r="58" fill="none" stroke="#f1ebe0" stroke-width="1.5" stroke-dasharray="3 3"/>
<text x="60" y="92" text-anchor="middle"
font-family="Fraunces" font-style="italic" font-size="110"
font-weight="300" fill="#ff8c5e">М</text>
</svg>
<div class="pf-name">Максим <em>Долголёв</em></div>
<div class="pf-class">9-Б · Учитель физики · Минск</div>
<div class="pf-stats">
<div><div class="v"><em>17</em></div><div class="lbl" style="padding:6px 0 12px">стрик</div></div>
<div><div class="v">8<em>.</em>4</div><div class="lbl" style="padding:6px 0 12px">ср&nbsp;балл</div></div>
<div><div class="v">142</div><div class="lbl" style="padding:6px 0 12px">уроков</div></div>
</div>
</div>
<div class="pf-right">
<div class="eyebrow">Питомец · уровень 12</div>
<div class="pet" style="margin-top:8px">
<!-- engraving-style cat -->
<svg width="110" height="110" viewBox="0 0 100 100" fill="none" stroke="#14213d" stroke-width="1.2">
<path d="M30,40 Q20,20 32,28 L40,38 Q50,32 60,38 L68,28 Q80,20 70,40 Q82,60 70,76 Q50,88 30,76 Q18,60 30,40 Z"/>
<circle cx="42" cy="52" r="2.5" fill="#14213d"/>
<circle cx="58" cy="52" r="2.5" fill="#14213d"/>
<path d="M48,62 Q50,66 52,62"/>
<path d="M45,60 L50,62 L55,60" stroke="#d94e1f"/>
<path d="M20,70 Q5,72 14,82" stroke-dasharray="2 2"/>
<path d="M80,70 Q95,72 86,82" stroke-dasharray="2 2"/>
</svg>
<div>
<h5>Феликс, <em>учёный кот</em></h5>
<div class="stat">
<span>Сытость</span>
<span class="bar"><i style="width:72%"></i></span>
<span style="font-family:var(--mono);font-size:11px">72</span>
</div>
<div class="stat">
<span>Знание</span>
<span class="bar"><i style="width:88%"></i></span>
<span style="font-family:var(--mono);font-size:11px">88</span>
</div>
<div class="stat">
<span>Настр.</span>
<span class="bar"><i style="width:55%"></i></span>
<span style="font-family:var(--mono);font-size:11px">55</span>
</div>
</div>
</div>
<div class="eyebrow" style="margin-top:18px">Достижения · 8 из 20</div>
<div class="ach-grid" style="margin-top:8px">
<div class="ach got">A</div>
<div class="ach got">B</div>
<div class="ach got">C</div>
<div class="ach got">D</div>
<div class="ach">·</div>
<div class="ach got">E</div>
<div class="ach got">F</div>
<div class="ach got">G</div>
<div class="ach got">H</div>
<div class="ach">·</div>
</div>
</div>
</div>
</div>
</div>
<div class="mock-caption">
<span>fig. 09 — profile &amp; pet</span>
<span><b>MOCK</b> · profile / pet</span>
</div>
</div>
</div>
</section>
<!-- ═══════════════════════ COLOPHON ═══════════════════════ -->
<footer class="colophon">
<div>
<h3>Колоф<em>он</em></h3>
<p>
Все макеты в&nbsp;этом дoссье — статические HTML/CSS-мокапы, без&nbsp;JavaScript-логики.
Они предлагают <b>аэстетическое направление</b>, а&nbsp;не&nbsp;готовый
интерфейс. Следующий шаг — выбрать раздел и&nbsp;перенести
токены и&nbsp;типографику в&nbsp;<b>css/ls.css</b>, оставив существующую
разметку и&nbsp;логику страниц&nbsp;нетронутой.
</p>
<p>
Шрифты загружаются с&nbsp;Google Fonts. Зерно реализовано через&nbsp;SVG-filter
в&nbsp;data&nbsp;URL. Никаких изображений извне.
</p>
</div>
<div>
Set in <b>Fraunces</b><br>
&amp; <b>Newsreader</b><br>
&amp; <b>JetBrains Mono</b><br><br>
Inked in <b>#14213d</b><br>
&amp; <b>#d94e1f</b><br>
On <b>#f1ebe0</b><br><br>
Pressed <b>2026.05.29</b><br>
Edition <b>01 / 100</b>
</div>
</footer>
</div>
</body>
</html>