877 lines
57 KiB
HTML
877 lines
57 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>Развитие ребёнка — гид для родителей по сферам и возрастам</title>
|
||
<meta name="description" content="Оценка развития ребёнка по возрастам: физическое, когнитивное, речевое и социально-эмоциональное. Данные и подходы на основе материалов ВОЗ и ЮНИСЕФ.">
|
||
<style>
|
||
:root{
|
||
--ink:#0F1218;
|
||
--cyan:#00E5FF;
|
||
--cyan-50:#E8FCFF;
|
||
--white:#fff;
|
||
--gray-500:#5B6573;
|
||
--gray-100:#F2F4F7;
|
||
--gray-200:#E5E9F0;
|
||
/* Сферы развития */
|
||
--phys:#16A34A; --phys-bg:#E7F7EE; /* физическое */
|
||
--cogn:#7C3AED; --cogn-bg:#F1ECFE; /* когнитивное */
|
||
--lang:#E07A00; --lang-bg:#FEF3E0; /* речевое */
|
||
--socio:#DB2777; --socio-bg:#FCE8F1; /* соц-эмоц */
|
||
--amber:#FFB74D;
|
||
}
|
||
*{box-sizing:border-box;margin:0;padding:0}
|
||
html{scroll-behavior:smooth}
|
||
body{font:17px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",Inter,system-ui,sans-serif;color:var(--ink);background:var(--white)}
|
||
img{max-width:100%}
|
||
a{color:inherit}
|
||
.container{max-width:1140px;margin:0 auto;padding:0 24px}
|
||
section{padding:80px 0}
|
||
@media (max-width:640px){section{padding:52px 0}}
|
||
|
||
/* ---------- Hero ---------- */
|
||
.hero{background:linear-gradient(135deg,#0F1218 0%,#13202B 55%,#0B3A47 100%);color:var(--white);overflow:hidden;position:relative}
|
||
.hero::after{content:"";position:absolute;inset:0;background:radial-gradient(900px 500px at 85% -10%,rgba(0,229,255,.18),transparent 60%);pointer-events:none}
|
||
.hero-inner{position:relative;z-index:1;padding:96px 0 92px}
|
||
.hero .eyebrow{display:inline-flex;align-items:center;gap:8px;background:rgba(0,229,255,.12);border:1px solid rgba(0,229,255,.4);color:var(--cyan);font-size:14px;font-weight:600;padding:7px 14px;border-radius:999px;margin-bottom:22px}
|
||
.hero h1{font-size:clamp(34px,6vw,58px);font-weight:800;line-height:1.06;margin-bottom:22px;letter-spacing:-.01em}
|
||
.hero p.lead{font-size:clamp(18px,2.4vw,21px);color:#aab3c2;max-width:620px;margin-bottom:30px}
|
||
.hero .ctas{display:flex;flex-wrap:wrap;gap:14px}
|
||
.btn{display:inline-flex;align-items:center;gap:9px;background:var(--cyan);color:var(--ink);padding:15px 30px;border-radius:10px;font-weight:700;text-decoration:none;transition:transform .15s,box-shadow .15s}
|
||
.btn:hover{transform:translateY(-2px);box-shadow:0 12px 30px rgba(0,229,255,.28)}
|
||
.btn.ghost{background:transparent;color:#fff;border:2px solid rgba(255,255,255,.25)}
|
||
.btn.ghost:hover{border-color:var(--cyan);box-shadow:none}
|
||
.hero-stats{display:flex;flex-wrap:wrap;gap:34px;margin-top:46px}
|
||
.hero-stats .st b{display:block;font-size:30px;font-weight:800;color:var(--cyan)}
|
||
.hero-stats .st span{font-size:14px;color:#9aa3b2}
|
||
|
||
/* ---------- Section heads ---------- */
|
||
.head{max-width:760px;margin-bottom:40px}
|
||
.head .kicker{color:var(--cyan);font-weight:700;font-size:14px;letter-spacing:.08em;text-transform:uppercase}
|
||
.head h2{font-size:clamp(27px,4vw,38px);font-weight:800;line-height:1.15;margin:10px 0 14px;letter-spacing:-.01em}
|
||
.head p{color:var(--gray-500);font-size:18px}
|
||
|
||
/* ---------- Spheres ---------- */
|
||
.spheres-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:18px}
|
||
.sphere-card{border-radius:16px;padding:26px 24px;border:1px solid var(--gray-200)}
|
||
.sphere-card .ico{width:46px;height:46px;border-radius:12px;display:grid;place-items:center;font-size:24px;margin-bottom:16px}
|
||
.sphere-card h3{font-size:19px;font-weight:700;margin-bottom:8px}
|
||
.sphere-card p{color:var(--gray-500);font-size:15px}
|
||
.s-phys{background:var(--phys-bg);border-color:#cdeed9}.s-phys .ico{background:#fff;color:var(--phys)}
|
||
.s-cogn{background:var(--cogn-bg);border-color:#e2d6fb}.s-cogn .ico{background:#fff;color:var(--cogn)}
|
||
.s-lang{background:var(--lang-bg);border-color:#faddb6}.s-lang .ico{background:#fff;color:var(--lang)}
|
||
.s-socio{background:var(--socio-bg);border-color:#f9cfe0}.s-socio .ico{background:#fff;color:var(--socio)}
|
||
|
||
/* ---------- Assessment tool ---------- */
|
||
.tool{background:linear-gradient(180deg,#FBFCFE,#F4F7FB)}
|
||
.tool-shell{background:var(--white);border:1px solid var(--gray-200);border-radius:20px;overflow:hidden;box-shadow:0 30px 60px -30px rgba(15,18,24,.18)}
|
||
.tool-top{padding:26px 28px 18px;border-bottom:1px solid var(--gray-100)}
|
||
.tool-top .lbl{font-size:14px;font-weight:700;color:var(--gray-500);text-transform:uppercase;letter-spacing:.06em;margin-bottom:14px}
|
||
.age-tabs{display:flex;flex-wrap:wrap;gap:8px}
|
||
.age-tab{border:1.5px solid var(--gray-200);background:#fff;color:var(--ink);padding:9px 15px;border-radius:999px;font-size:14.5px;font-weight:600;cursor:pointer;transition:.15s;font-family:inherit}
|
||
.age-tab:hover{border-color:#9fb0c4}
|
||
.age-tab.active{background:var(--ink);color:#fff;border-color:var(--ink)}
|
||
|
||
.tool-body{display:grid;grid-template-columns:280px 1fr}
|
||
@media (max-width:860px){.tool-body{grid-template-columns:1fr}}
|
||
|
||
.progress-side{background:#FAFBFD;padding:26px 24px;border-right:1px solid var(--gray-100)}
|
||
@media (max-width:860px){.progress-side{border-right:none;border-bottom:1px solid var(--gray-100)}}
|
||
.progress-side h4{font-size:15px;font-weight:700;margin-bottom:6px}
|
||
.progress-side .child-age{font-size:13px;color:var(--gray-500);margin-bottom:18px}
|
||
.ring-wrap{display:flex;align-items:center;gap:18px;margin-bottom:18px}
|
||
.ring{--p:0;--c:var(--cyan);width:84px;height:84px;border-radius:50%;background:conic-gradient(var(--c) calc(var(--p)*1%),#E5E9F0 0);display:grid;place-items:center;flex:none}
|
||
.ring::before{content:"";position:absolute;width:62px;height:62px;border-radius:50%;background:#FAFBFD}
|
||
.ring span{position:relative;font-weight:800;font-size:20px}
|
||
.ring-text b{font-size:16px;display:block}.ring-text span{font-size:13px;color:var(--gray-500)}
|
||
.per-sphere{display:flex;flex-direction:column;gap:11px}
|
||
.per-sphere .ps{font-size:13.5px}
|
||
.per-sphere .ps .top{display:flex;justify-content:space-between;gap:8px;margin-bottom:4px}
|
||
.per-sphere .ps .top b{font-weight:600}
|
||
.per-sphere .ps .bar{height:7px;border-radius:99px;background:var(--gray-200);overflow:hidden}
|
||
.per-sphere .ps .bar i{display:block;height:100%;width:0;border-radius:99px;transition:width .4s ease}
|
||
.disclaimer{margin-top:18px;font-size:12.5px;color:var(--gray-500);background:var(--cyan-50);border-radius:10px;padding:11px 13px;line-height:1.45}
|
||
|
||
.milestones{padding:24px 26px 30px}
|
||
.milestones .sphere-block{margin-bottom:24px}
|
||
.milestones .sphere-block:last-child{margin-bottom:0}
|
||
.sb-head{display:flex;align-items:center;gap:10px;margin-bottom:12px}
|
||
.sb-head .dot{width:11px;height:11px;border-radius:50%}
|
||
.sb-head h3{font-size:17px;font-weight:700}
|
||
.sb-head .cnt{margin-left:auto;font-size:13px;color:var(--gray-500);font-weight:600}
|
||
.mlist{list-style:none}
|
||
.mlist li{display:flex;align-items:flex-start;gap:12px;padding:11px 12px;border-radius:10px;cursor:pointer;transition:background .12s;font-size:15.5px;line-height:1.45}
|
||
.mlist li:hover{background:var(--gray-100)}
|
||
.mlist li .box{flex:none;width:22px;height:22px;border-radius:6px;border:2px solid var(--gray-200);margin-top:1px;display:grid;place-items:center;transition:.15s}
|
||
.mlist li.done .box{background:var(--ink);border-color:var(--ink)}
|
||
.mlist li.done .box::after{content:"✓";color:#fff;font-size:13px;font-weight:800}
|
||
.mlist li.done .txt{color:var(--gray-500)}
|
||
.mlist li.done .txt b{text-decoration:line-through;color:var(--gray-500)}
|
||
.mlist li .txt b{font-weight:600}
|
||
.mlist li .txt small{display:block;color:var(--gray-500);font-size:13px;margin-top:1px}
|
||
|
||
/* ---------- Nurturing care ---------- */
|
||
.nurturing{background:var(--ink);color:#fff}
|
||
.nurturing .head .kicker{color:var(--cyan)}
|
||
.nurturing .head p{color:#9aa3b2}
|
||
.nc-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:16px}
|
||
.nc-card{background:#1A212B;border:1px solid #283142;border-radius:16px;padding:24px}
|
||
.nc-card .num{width:38px;height:38px;border-radius:10px;background:rgba(0,229,255,.14);color:var(--cyan);display:grid;place-items:center;font-weight:800;margin-bottom:14px}
|
||
.nc-card h3{font-size:18px;margin-bottom:8px}
|
||
.nc-card p{color:#9aa3b2;font-size:14.5px}
|
||
|
||
/* ---------- Red flags ---------- */
|
||
.flags{background:#FFF8F6}
|
||
.flags .head .kicker{color:#D4441E}
|
||
.flags-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px}
|
||
.flag-card{background:#fff;border:1px solid #f3d8cf;border-left:4px solid #D4441E;border-radius:12px;padding:18px 20px}
|
||
.flag-card b{display:block;font-size:15px;margin-bottom:5px;color:#B23A18}
|
||
.flag-card span{font-size:14px;color:var(--gray-500)}
|
||
.flags-note{margin-top:22px;background:#fff;border:1px solid #f3d8cf;border-radius:12px;padding:18px 22px;display:flex;gap:14px;align-items:flex-start}
|
||
.flags-note .ic{font-size:22px;flex:none}
|
||
.flags-note p{font-size:15px;color:var(--gray-500)}
|
||
.flags-note p b{color:var(--ink)}
|
||
|
||
/* ---------- Tips ---------- */
|
||
.tips-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:18px}
|
||
.tip{background:var(--gray-100);border-radius:16px;padding:26px}
|
||
.tip .ico{font-size:26px;margin-bottom:12px}
|
||
.tip h3{font-size:18px;font-weight:700;margin-bottom:8px}
|
||
.tip p{color:var(--gray-500);font-size:15px}
|
||
|
||
/* ---------- Sources ---------- */
|
||
.sources{background:var(--gray-100)}
|
||
.src-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
|
||
.src{background:#fff;border:1px solid var(--gray-200);border-radius:12px;padding:18px 20px}
|
||
.src .org{display:inline-block;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:3px 9px;border-radius:6px;margin-bottom:10px}
|
||
.src.who .org{background:var(--cyan-50);color:#0B7C8C}
|
||
.src.unicef .org{background:#FDE7EF;color:#B23A7A}
|
||
.src h4{font-size:16px;font-weight:700;margin-bottom:6px}
|
||
.src p{font-size:14px;color:var(--gray-500);margin-bottom:10px}
|
||
.src a{font-size:14px;font-weight:600;color:#1a6fb0;text-decoration:none}
|
||
.src a:hover{text-decoration:underline}
|
||
.src-note{margin-top:20px;font-size:13.5px;color:var(--gray-500);max-width:820px}
|
||
|
||
/* ---------- Footer ---------- */
|
||
footer{background:var(--ink);color:#9aa3b2;padding:42px 0 50px;font-size:14px}
|
||
footer .fwrap{display:flex;flex-wrap:wrap;gap:16px;justify-content:space-between;align-items:center}
|
||
footer a{color:var(--cyan);text-decoration:none;font-weight:600}
|
||
|
||
/* nav */
|
||
.nav{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.85);backdrop-filter:blur(10px);border-bottom:1px solid var(--gray-200)}
|
||
.nav-inner{display:flex;align-items:center;justify-content:space-between;height:62px}
|
||
.nav .brand{font-weight:800;font-size:17px;display:flex;align-items:center;gap:9px}
|
||
.nav .brand .b-ico{width:30px;height:30px;border-radius:8px;background:var(--ink);color:var(--cyan);display:grid;place-items:center;font-size:17px}
|
||
.nav .links{display:flex;gap:22px}
|
||
.nav .links a{text-decoration:none;font-size:15px;font-weight:600;color:var(--gray-500)}
|
||
.nav .links a:hover{color:var(--ink)}
|
||
@media (max-width:720px){.nav .links{display:none}}
|
||
|
||
/* ---------- Results / recommendations ---------- */
|
||
.tool-results{border-top:1px solid var(--gray-100);padding:26px 28px 30px;background:#FBFCFE}
|
||
.res-empty{color:var(--gray-500);font-size:15px;display:flex;align-items:center;gap:10px;background:var(--gray-100);border-radius:12px;padding:16px 18px}
|
||
.res-status{display:flex;align-items:center;gap:14px;padding:16px 18px;border-radius:12px;margin-bottom:20px}
|
||
.res-status .badge{width:46px;height:46px;border-radius:12px;display:grid;place-items:center;font-size:24px;flex:none}
|
||
.res-status h3{font-size:18px;font-weight:700;margin-bottom:3px}
|
||
.res-status p{font-size:14.5px;color:var(--gray-500)}
|
||
.st-ok{background:var(--phys-bg)}.st-ok .badge{background:#fff;color:var(--phys)}
|
||
.st-watch{background:var(--lang-bg)}.st-watch .badge{background:#fff;color:var(--lang)}
|
||
.st-lag{background:#FFEDE7}.st-lag .badge{background:#fff;color:#D4441E}
|
||
.res-sub{font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--gray-500);margin:6px 0 12px}
|
||
.rec-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:14px}
|
||
.rec-card{background:#fff;border:1px solid var(--gray-200);border-radius:14px;padding:20px 22px;border-top:4px solid var(--gray-200)}
|
||
.rec-card h4{font-size:16px;font-weight:700;margin-bottom:6px;display:flex;align-items:center;gap:8px}
|
||
.rec-card .rc-pill{font-size:12px;font-weight:700;padding:3px 9px;border-radius:6px;margin-bottom:12px;display:inline-block}
|
||
.rc-lag{background:#FFEDE7;color:#B23A18}
|
||
.rc-watch{background:var(--lang-bg);color:var(--lang)}
|
||
.rec-card ul{list-style:none}
|
||
.rec-card ul li{position:relative;padding:7px 0 7px 22px;font-size:14.5px;color:var(--gray-500);line-height:1.45;border-bottom:1px solid var(--gray-100)}
|
||
.rec-card ul li:last-child{border-bottom:none}
|
||
.rec-card ul li::before{content:"→";position:absolute;left:0;top:7px;font-weight:700;color:var(--ink)}
|
||
.res-doctor{margin-top:18px;background:#FFF8F6;border:1px solid #f3d8cf;border-left:4px solid #D4441E;border-radius:12px;padding:16px 20px;display:flex;gap:14px;align-items:flex-start}
|
||
.res-doctor .ic{font-size:22px;flex:none}
|
||
.res-doctor p{font-size:14.5px;color:var(--gray-500)}
|
||
.res-doctor p b{color:#B23A18}
|
||
.res-base{margin-top:16px;background:var(--cyan-50);border:1px solid #c8eef3;border-radius:12px;padding:16px 20px}
|
||
.res-base h4{font-size:15px;font-weight:700;margin-bottom:10px}
|
||
.res-base ul{list-style:none;display:grid;gap:7px}
|
||
.res-base ul li{position:relative;padding-left:24px;font-size:14px;color:var(--gray-500);line-height:1.45}
|
||
.res-base ul li::before{content:"✓";position:absolute;left:0;top:0;color:#0B7C8C;font-weight:800}
|
||
.lag-hint{display:none;margin-top:14px;font-size:13px;font-weight:700;color:#B23A18;background:#FFEDE7;border-radius:8px;padding:8px 12px;text-align:center}
|
||
.lag-hint.show{display:block}
|
||
|
||
/* ---------- Collect panel ---------- */
|
||
.tool-collect{border-top:1px solid var(--gray-100);padding:26px 28px 30px;background:#fff}
|
||
.collect-head{display:flex;gap:16px;margin-bottom:18px}
|
||
.collect-head .ch-ic{width:46px;height:46px;border-radius:12px;background:var(--cyan-50);display:grid;place-items:center;font-size:24px;flex:none}
|
||
.collect-head h3{font-size:18px;font-weight:700;margin-bottom:4px}
|
||
.collect-head p{font-size:14px;color:var(--gray-500);max-width:640px}
|
||
.collect-form{display:grid;gap:14px;max-width:560px}
|
||
.cfield{display:grid;gap:6px;font-size:14px;font-weight:600}
|
||
.cfield small{font-weight:400;color:var(--gray-500)}
|
||
.cfield input{padding:11px 13px;border:1.5px solid var(--gray-200);border-radius:9px;font-size:15px;font-family:inherit}
|
||
.cfield input:focus{outline:none;border-color:var(--cyan)}
|
||
.cconsent{display:flex;gap:10px;align-items:flex-start;font-size:14px;color:var(--gray-500);cursor:pointer}
|
||
.cconsent input{margin-top:2px;width:18px;height:18px;flex:none;cursor:pointer}
|
||
.collect-actions{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
|
||
.collect-actions .btn{cursor:pointer;border:none;font-family:inherit;font-size:15px}
|
||
.cmsg{font-size:14px;font-weight:600;color:var(--gray-500);min-height:18px}
|
||
.cmsg.ok{color:var(--phys)}
|
||
.cmsg.err{color:#D4441E}
|
||
.collect-priv{font-size:12.5px;color:var(--gray-500);margin-top:2px;line-height:1.5}
|
||
.collect-off{background:var(--gray-100);border-radius:12px;padding:16px 18px;font-size:14.5px;color:var(--gray-500);line-height:1.5}
|
||
.collect-off b{color:var(--ink)}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<nav class="nav"><div class="container nav-inner">
|
||
<div class="brand"><span class="b-ico">◌</span> Развитие ребёнка</div>
|
||
<div class="links">
|
||
<a href="#spheres">Сферы</a>
|
||
<a href="#tool">Оценка</a>
|
||
<a href="#care">Уход</a>
|
||
<a href="#flags">Тревоги</a>
|
||
<a href="#sources">Источники</a>
|
||
</div>
|
||
</div></nav>
|
||
|
||
<!-- HERO -->
|
||
<header class="hero">
|
||
<div class="container hero-inner">
|
||
<span class="eyebrow">🌟 Гид для родителей · на основе ВОЗ и ЮНИСЕФ</span>
|
||
<h1>Развитие ребёнка<br>по возрастам и сферам</h1>
|
||
<p class="lead">Понятный инструмент, чтобы оценить, как развивается ваш ребёнок: физически, когнитивно, речево и социально-эмоционально. С рекомендациями по уходу и подсказками, когда обратиться к специалисту.</p>
|
||
<div class="ctas">
|
||
<a class="btn" href="#tool">Проверить развитие →</a>
|
||
<a class="btn ghost" href="#care">Советы родителям</a>
|
||
</div>
|
||
<div class="hero-stats">
|
||
<div class="st"><b>6</b><span>возрастных периодов</span></div>
|
||
<div class="st"><b>4</b><span>сферы развития</span></div>
|
||
<div class="st"><b>~100</b><span>вех развития</span></div>
|
||
<div class="st"><b>5</b><span>условий заботы ВОЗ/ЮНИСЕФ</span></div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- SPHERES -->
|
||
<section id="spheres">
|
||
<div class="container">
|
||
<div class="head">
|
||
<span class="kicker">4 сферы развития</span>
|
||
<h2>Развитие оценивают сразу в четырёх направлениях</h2>
|
||
<p>ВОЗ и ЮНИСЕФ рекомендуют смотреть на ребёнка целиком, а не только на рост и вес. Все четыре сферы связаны и влияют друг на друга.</p>
|
||
</div>
|
||
<div class="spheres-grid">
|
||
<div class="sphere-card s-phys">
|
||
<div class="ico">🏃</div>
|
||
<h3>Физическое и моторное</h3>
|
||
<p>Рост, вес, крупные движения (сидит, ползает, ходит) и мелкая моторика (хватает, рисует, застёгивает).</p>
|
||
</div>
|
||
<div class="sphere-card s-cogn">
|
||
<div class="ico">🧩</div>
|
||
<h3>Когнитивное</h3>
|
||
<p>Как ребёнок познаёт мир: внимание, память, причинно-следственные связи, игра, решение задач.</p>
|
||
</div>
|
||
<div class="sphere-card s-lang">
|
||
<div class="ico">💬</div>
|
||
<h3>Речевое и коммуникативное</h3>
|
||
<p>Понимание речи, лепет, первые слова и фразы, умение выразить мысль и быть понятым.</p>
|
||
</div>
|
||
<div class="sphere-card s-socio">
|
||
<div class="ico">❤️</div>
|
||
<h3>Социально-эмоциональное</h3>
|
||
<p>Привязанность, эмоции, общение со сверстниками и взрослыми, самостоятельность, эмпатия.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ASSESSMENT TOOL -->
|
||
<section id="tool" class="tool">
|
||
<div class="container">
|
||
<div class="head">
|
||
<span class="kicker">Интерактивная оценка</span>
|
||
<h2>Отметьте навыки, которые уже есть у ребёнка</h2>
|
||
<p>Выберите возраст — появятся вехи развития по четырём сферам. Отмечайте освоенные навыки: инструмент покажет общий прогресс и по каждой сфере отдельно.</p>
|
||
</div>
|
||
|
||
<div class="tool-shell">
|
||
<div class="tool-top">
|
||
<div class="lbl">Возраст ребёнка</div>
|
||
<div class="age-tabs" id="ageTabs"></div>
|
||
</div>
|
||
<div class="tool-body">
|
||
<div class="progress-side">
|
||
<h4>Ваш прогресс</h4>
|
||
<div class="child-age" id="childAge">Выберите возраст</div>
|
||
<div class="ring-wrap">
|
||
<div class="ring" id="ring"><span id="ringNum">0%</span></div>
|
||
<div class="ring-text"><b id="ringDone">0 из 0</b><span>вех освоено</span></div>
|
||
</div>
|
||
<div class="per-sphere" id="perSphere"></div>
|
||
<div class="lag-hint" id="lagHint">⚠ Смотрите рекомендации ниже</div>
|
||
<div class="disclaimer">Это памятка для родителей, а не диагноз. Дети развиваются индивидуально. Если что-то беспокоит — обсудите с педиатром.</div>
|
||
</div>
|
||
<div class="milestones" id="milestones"></div>
|
||
</div>
|
||
<div class="tool-results" id="toolResults"></div>
|
||
<div class="tool-collect" id="toolCollect">
|
||
<div class="collect-head">
|
||
<div class="ch-ic">📨</div>
|
||
<div>
|
||
<h3>Отправить результат для аналитики</h3>
|
||
<p>Помогите улучшить гид — отправьте обезличенный результат оценки. Мы не собираем имена и контакты детей, только возраст и отметки навыков.</p>
|
||
</div>
|
||
</div>
|
||
<div class="collect-form" id="collectForm">
|
||
<label class="cfield">
|
||
<span>Ваш email <small>(необязательно — если хотите получить копию результата)</small></span>
|
||
<input type="email" id="cEmail" placeholder="you@example.com">
|
||
</label>
|
||
<label class="cconsent">
|
||
<input type="checkbox" id="cConsent">
|
||
<span>Я согласен(на) на анонимную обработку данных оценки развития ребёнка в образовательных и исследовательских целях.</span>
|
||
</label>
|
||
<div class="collect-actions">
|
||
<button class="btn" id="cSubmit" type="button">Отправить результат</button>
|
||
<span class="cmsg" id="cMsg"></span>
|
||
</div>
|
||
<div class="collect-priv">Данные уходят через сервис FormSubmit. Первая отправка активируется по ссылке в письме владельцу сайта. Анализировать потом удобно в Google Таблицах: FormSubmit → экспорт в CSV.</div>
|
||
</div>
|
||
<div class="collect-off" id="collectOff"><b>Сбор данных скоро будет подключён.</b> Владельцу сайта нужно указать email для получения результатов — после этого форма станет активной.</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- NURTURING CARE -->
|
||
<section id="care" class="nurturing">
|
||
<div class="container">
|
||
<div class="head">
|
||
<span class="kicker">Заботливый уход</span>
|
||
<h2>5 условий для здорового развития</h2>
|
||
<p>Рамка «заботливого ухода» (Nurturing Care Framework) разработана ВОЗ, ЮНИСЕФ и Всемирным банком. Это пять условий, которые нужны ребёнку с рождения.</p>
|
||
</div>
|
||
<div class="nc-grid">
|
||
<div class="nc-card"><div class="num">1</div><h3>Здоровье</h3><p>Здоровая беременность и роды, наблюдение у врача, прививки по календарю, своевременное лечение.</p></div>
|
||
<div class="nc-card"><div class="num">2</div><h3>Питание</h3><p>Грудное вскармливание до 6 месяцев исключительно и до 2 лет и дольше, полноценный прикорм, необходимые нутриенты и витамины.</p></div>
|
||
<div class="nc-card"><div class="num">3</div><h3>Безопасность и защита</h3><p>Физически безопасная среда дома, защита от насилия и пренебрежения, стабильность в семье.</p></div>
|
||
<div class="nc-card"><div class="num">4</div><h3>Отзывчивая забота</h3><p>Замечать сигналы ребёнка и отвечать на них — улыбкой, словом, объятием. Это «диалог» с малышом с рождения.</p></div>
|
||
<div class="nc-card"><div class="num">5</div><h3>Раннее обучение</h3><p>Игра, исследование, разговоры, книги и песни — окружение, которое стимулирует любопытство и развитие мозга.</p></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- RED FLAGS -->
|
||
<section id="flags" class="flags">
|
||
<div class="container">
|
||
<div class="head">
|
||
<span class="kicker">Когда насторожиться</span>
|
||
<h2>Сигналы, при которых стоит обратиться к специалисту</h2>
|
||
<p>Это поводы для консультации с педиатром или неврологом, а не приговор. Раннее обращение помогает вовремя поддержать развитие.</p>
|
||
</div>
|
||
<div class="flags-grid">
|
||
<div class="flag-card"><b>Нет улыбки в ответ</b><span>К 2 месяцам ребёнок не улыбается, когда с ним разговаривают.</span></div>
|
||
<div class="flag-card"><b>Не держит голову</b><span>К 3–4 месяцам не удерживает голову, когда его держат вертикально.</span></div>
|
||
<div class="flag-card"><b>Не сидит с поддержкой</b><span>К 9 месяцам не садится даже с опорой.</span></div>
|
||
<div class="flag-card"><b>Нет лепета и указывания</b><span>К 12 месяцам не лепечет («ба-ба», «ма-ма») и не показывает пальцем.</span></div>
|
||
<div class="flag-card"><b>Нет первых слов</b><span>К 16–18 месяцам не произносит ни одного осмысленного слова.</span></div>
|
||
<div class="flag-card"><b>Не ходит</b><span>К 18 месяцам не делает самостоятельные шаги.</span></div>
|
||
<div class="flag-card"><b>Нет фраз из 2 слов</b><span>К 24 месяцам не соединяет слова во фразы («дай ми»).</span></div>
|
||
<div class="flag-card"><b>Потеря навыков</b><span>Ребёнок перестал делать то, что уже умел — речь, движения, контакт.</span></div>
|
||
<div class="flag-card"><b>Слабый зрительный контакт</b><span>Не смотрит в глаза, не откликается на имя к 12 месяцам.</span></div>
|
||
</div>
|
||
<div class="flags-note">
|
||
<div class="ic">🩺</div>
|
||
<p><b>Помните:</b> дети развиваются в своём темпе, и небольшой разброс нормален. Но если навык задерживается значительно или вы заметили регресс — не ждите, обратитесь к врачу. Раннее развитие мозга максимально пластично в первые годы жизни.</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TIPS -->
|
||
<section id="tips">
|
||
<div class="container">
|
||
<div class="head">
|
||
<span class="kicker">Практические советы</span>
|
||
<h2>Что могут делать родители каждый день</h2>
|
||
<p>Простые действия, основанные на принципе «отзывчивой заботы» и раннего обучения — главных условиях гармоничного развития.</p>
|
||
</div>
|
||
<div class="tips-grid">
|
||
<div class="tip"><div class="ico">🗣️</div><h3>Разговаривайте с ребёнком</h3><p>С самого рождения комментируйте действия, называйте предметы. Число слов, которые слышит ребёнок, напрямую связано с развитием речи.</p></div>
|
||
<div class="tip"><div class="ico">📚</div><h3>Читайте каждый день</h3><p>Даже несколько минут чтения и рассматривания картинок развивают речь, внимание и эмоциональную связь.</p></div>
|
||
<div class="tip"><div class="ico">🤸</div><h3>Играйте и двигайтесь</h3><p>Игра — главный способ обучения. Дайте время на «животик», ползание, бег, игры с мячом и мелкую моторику.</p></div>
|
||
<div class="tip"><div class="ico">🔁</div><h3>Отвечайте на сигналы</h3><p>«Подавайте и принимайте»: улыбнулся — улыбнитесь, показал интерес — поддержите. Это формирует мозг активнее любых занятий.</p></div>
|
||
<div class="tip"><div class="ico">🥗</div><h3>Кормите по потребности</h3><p>Грудное молоко до 6 месяцев, разнообразный прикорм после. Отзывчивое кормление — по сигналам голода и сытости.</p></div>
|
||
<div class="tip"><div class="ico">😴</div><h3>Обеспечьте сон и режим</h3><p>Достаточный сон, предсказуемый режим и спокойная обстановка снижают стресс и поддерживают развитие.</p></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- SOURCES -->
|
||
<section id="sources" class="sources">
|
||
<div class="container">
|
||
<div class="head">
|
||
<span class="kicker">Источники</span>
|
||
<h2>На чём основаны данные</h2>
|
||
<p>Материалы сайта опираются на публикуемые руководства и стандарты Всемирной организации здравоохранения и Детского фонда ООН (ЮНИСЕФ).</p>
|
||
</div>
|
||
<div class="src-list">
|
||
<div class="src who"><span class="org">ВОЗ</span><h4>Стандарты физического роста детей (WHO Child Growth Standards)</h4><p>Кривые роста, веса и окружности головы от рождения до 5 лет — основа оценки физического развития.</p><a href="https://www.who.int/tools/child-growth-standards" target="_blank" rel="noopener">who.int/tools/child-growth-standards →</a></div>
|
||
<div class="src who"><span class="org">ВОЗ</span><h4>Вехи моторного развития (Multicentre Reference Study)</h4><p>Шесть ключевых моторных вех: сидит, стоит с опорой, ползает, ходит с опорой, стоит сам, ходит сам.</p><a href="https://www.who.int/publications/i/item/924159693X" target="_blank" rel="noopener">WHO Motor Development Study →</a></div>
|
||
<div class="src who"><span class="org">ВОЗ</span><h4>Руководство по улучшению раннего развития детей</h4><p>Recommendations on interventions for ECD — рекомендации по стимуляции, отзывчивой заботе и питанию.</p><a href="https://www.who.int/publications/i/item/9789240010206" target="_blank" rel="noopener">Improving ECD guidelines →</a></div>
|
||
<div class="src unicef"><span class="org">ЮНИСЕФ</span><h4>Раннее развитие детей (Early Childhood Development)</h4><p>Подход ЮНИСЕФ к первым 1000 дням жизни и развитию детей до 8 лет через игру и заботу.</p><a href="https://www.unicef.org/early-childhood-development" target="_blank" rel="noopener">unicef.org/early-childhood-development →</a></div>
|
||
<div class="src unicef"><span class="org">ЮНИСЕФ</span><h4>Забота о развитии ребёнка (Care for Child Development)</h4><p>Пакет рекомендаций ЮНИСЕФ/ВОЗ для родителей: играй и общайся, чтобы поддержать развитие.</p><a href="https://www.unicef.org/early-childhood-development/care-for-child-development" target="_blank" rel="noopener">Care for Child Development →</a></div>
|
||
<div class="src unicef"><span class="org">ЮНИСЕФ</span><h4>Nurturing Care Framework</h4><p>Рамка заботливого ухода ВОЗ/ЮНИСЕФ/Всемирного банка — 5 условий для развития ребёнка.</p><a href="https://nurturing-care.org" target="_blank" rel="noopener">nurturing-care.org →</a></div>
|
||
</div>
|
||
<p class="src-note">Информация на сайте носит образовательный характер и не заменяет консультацию врача. Вехи развития приведены как ориентир — сроки их появления у конкретного ребёнка могут отличаться. Для индивидуальной оценки развития обращайтесь к педиатру.</p>
|
||
</div>
|
||
</section>
|
||
|
||
<footer>
|
||
<div class="container fwrap">
|
||
<div>Гид для родителей о развитии ребёнка · данные ВОЗ и ЮНИСЕФ</div>
|
||
<div>Образовательный ресурс, не медицинская консультация</div>
|
||
</div>
|
||
</footer>
|
||
|
||
<script>
|
||
/* ====== Данные по сферам и возрастам (на основе ВОЗ / ЮНИСЕФ) ====== */
|
||
const SPHERES = {
|
||
phys: {name:"Физическое и моторное", color:"var(--phys)", emoji:"🏃"},
|
||
cogn: {name:"Когнитивное", color:"var(--cogn)", emoji:"🧩"},
|
||
lang: {name:"Речевое", color:"var(--lang)", emoji:"💬"},
|
||
socio: {name:"Социально-эмоциональное",color:"var(--socio)", emoji:"❤️"}
|
||
};
|
||
|
||
const DATA = {
|
||
"0–6 мес": {
|
||
phys:[
|
||
["Удерживает голову","когда держат вертикально, к 3–4 мес"],
|
||
["Лежа на животе, приподнимает голову и грудь","~2–3 мес"],
|
||
["Тянется руками к предметам и тянет в рот",""],
|
||
["Переворачивается со спины на бок/живот","~4–6 мес"],
|
||
["Хватает предмет всей ладонью",""]
|
||
],
|
||
cogn:[
|
||
["Следит взглядом за движущимся предметом/лицом",""],
|
||
["Реагирует на звуки — поворачивает голову",""],
|
||
["Изучает предметы ртом и руками",""],
|
||
["Узнаёт лицо родителя на расстоянии",""]
|
||
],
|
||
lang:[
|
||
["Издаёт звуки — гулит («а-а», «гы»)","~2–3 мес"],
|
||
["Улыбается, когда с ним говорят",""],
|
||
["Поворачивается к источнику голоса",""],
|
||
["Начинает лепетать согласными","к концу периода"]
|
||
],
|
||
socio:[
|
||
["Социальная улыбка в ответ","~2 мес"],
|
||
["Успокаивается на руках у родителя",""],
|
||
["Различает знакомых и незнакомых",""],
|
||
["Издаёт разные звуки для разных потребностей",""]
|
||
]
|
||
},
|
||
"6–12 мес": {
|
||
phys:[
|
||
["Сидит без поддержки","~6 мес (ВОЗ)"],
|
||
["Стоит с опорой","~7,5 мес (ВОЗ)"],
|
||
["Ползает на четвереньках","~8,5 мес (ВОЗ)"],
|
||
["Ходит с поддержкой за руки","~9 мес (ВОЗ)"],
|
||
["Стоит самостоятельно","~11 мес (ВОЗ)"],
|
||
["Ходит самостоятельно","~12 мес (ВОЗ)"],
|
||
["Берёт предметы щепотью (пинцетный хват)","~9–10 мес"]
|
||
],
|
||
cogn:[
|
||
["Находит спрятанный на глазах предмет","понятие постоянства объекта"],
|
||
["Исследует предметы: стучит, трясёт, бросает",""],
|
||
["Подражает простым действиям",""],
|
||
["Понимает назначение предметов (расчёска, ложка)",""]
|
||
],
|
||
lang:[
|
||
["Лепечет слогами («ба-ба», «ма-ма»)",""],
|
||
["Откликается на своё имя",""],
|
||
["Понимает «нельзя»",""],
|
||
["Использует жесты: машет, показывает",""],
|
||
["Говорит первое осмысленное слово","~12 мес"]
|
||
],
|
||
socio:[
|
||
["Играет в «ку-ку»",""],
|
||
["Боится незнакомых (страхи новизны)",""],
|
||
["Тревожится при расставании с мамой",""],
|
||
["Показывает предпочтения и привязанность",""]
|
||
]
|
||
},
|
||
"1–2 года": {
|
||
phys:[
|
||
["Уверенно ходит сам",""],
|
||
["Бегает (несколько неуклюже)","~18 мес"],
|
||
["Поднимается по лестнице с опорой",""],
|
||
["Бьёт по мячу ногой",""],
|
||
["Строит башню из 2–4 кубиков",""],
|
||
["Черкает карандашом",""],
|
||
["Сам ест ложкой",""]
|
||
],
|
||
cogn:[
|
||
["Простая сюжетная игра (кормит куклу)",""],
|
||
["Показывает части тела по просьбе",""],
|
||
["Сортирует по форме в доску-вкладыш",""],
|
||
["Понимает простую причину-следствие",""]
|
||
],
|
||
lang:[
|
||
["10–50 слов к 18 мес, 50+ к 2 годам",""],
|
||
["Соединяет 2 слова во фразу","~2 года"],
|
||
["Понимает простые инструкции («принеси мяч»)",""],
|
||
["Показывает на названные предметы/картинки",""]
|
||
],
|
||
socio:[
|
||
["Играет рядом с детьми (параллельная игра)",""],
|
||
["Показывает независимость («я сам!», «нет!»)",""],
|
||
["Показывает вещи, чтобы поделиться интересом",""],
|
||
["Проявляет сочувствие при чужой грусти",""]
|
||
]
|
||
},
|
||
"2–3 года": {
|
||
phys:[
|
||
["Хорошо бегает",""],
|
||
["Прыгает на двух ногах",""],
|
||
["Едет на трёхколёсном велосипеде (педали)","~3 года"],
|
||
["Стоит на одной ноге пару секунд",""],
|
||
["Копирует круг",""],
|
||
["Нанизывает крупные бусины",""]
|
||
],
|
||
cogn:[
|
||
["Сортирует по цвету и форме",""],
|
||
["Считает до 3, понимает «один-много»",""],
|
||
["Собирает пазл из 3–4 деталей",""],
|
||
["Сложная сюжетная игра (готовит, лечит)",""]
|
||
],
|
||
lang:[
|
||
["Говорит фразами из 3 слов",""],
|
||
["Знает имя и возраст",""],
|
||
["Задаёт вопросы «почему?»",""],
|
||
["Выполняет двухступенчатую инструкцию",""],
|
||
["Речь понятна ~75%"]
|
||
],
|
||
socio:[
|
||
["Подражает взрослым и сверстникам",""],
|
||
["Проявляет нежность и заботу",""],
|
||
["Учится делиться и ждать очереди (с помощью)",""],
|
||
["Начинает играть «рядом и вместе»"]
|
||
]
|
||
},
|
||
"3–5 лет": {
|
||
phys:[
|
||
["Прыгает на одной ноге",""],
|
||
["Ловит отскочивший мяч",""],
|
||
["Ходит по лестнице чередуя ноги",""],
|
||
["Использует ножницы",""],
|
||
["Рисует человека из 3+ частей",""],
|
||
["Сам одевается и раздевается",""]
|
||
],
|
||
cogn:[
|
||
["Считает до 10",""],
|
||
["Знает основные цвета",""],
|
||
["Понимает время: утро, скоро, вчера",""],
|
||
["Сортирует по размеру",""],
|
||
["Узнаёт некоторые буквы и цифры",""]
|
||
],
|
||
lang:[
|
||
["Рассказывает короткие истории",""],
|
||
["Использует будущее время",""],
|
||
["Речь полностью понятна",""],
|
||
["Выполняет трёхступенчатую инструкцию",""],
|
||
["Задаёт много вопросов «как», «почему»"]
|
||
],
|
||
socio:[
|
||
["Совместная игра с правилами",""],
|
||
["Есть друзья, предпочитает кого-то",""],
|
||
["Легко расстаётся с родителями",""],
|
||
["Понимает чужие чувства, проявляет заботу",""]
|
||
]
|
||
},
|
||
"6–7 лет": {
|
||
phys:[
|
||
["Ездит на двухколёсном велосипеде",""],
|
||
["Умеет галоп/прыжки в длину",""],
|
||
["Завязывает шнурки",""],
|
||
["Пишет разборчиво, рисует детали",""],
|
||
["Ловит маленький мяч"]
|
||
],
|
||
cogn:[
|
||
["Читает простые слова и короткие тексты",""],
|
||
["Складывает и вычитает в пределах 10",""],
|
||
["Понимает сохранение количества",""],
|
||
["Планирует и доводит дело до конца",""],
|
||
["Логически рассуждает"]
|
||
],
|
||
lang:[
|
||
["Свободно ведёт беседу",""],
|
||
["Пересказывает историю последовательно",""],
|
||
["Читает самостоятельно",""],
|
||
["Пишет простые предложения"]
|
||
],
|
||
socio:[
|
||
["Устойчивые дружбы",""],
|
||
["Соблюдает правила класса/игры",""],
|
||
["Лучше управляет эмоциями",""],
|
||
["Понимает справедливость и делится"]
|
||
]
|
||
}
|
||
};
|
||
|
||
/* ====== Рекомендации по сферам (если отстаёт) ====== */
|
||
const REC = {
|
||
phys:{
|
||
title:"Физическое и моторное",
|
||
tips:[
|
||
"Давайте больше свободного движения на полу — без ходунков и шезлонгов, которые ограничивают.",
|
||
"Для малышей — время на животике по несколько раз в день.",
|
||
"Ежедневно активная игра: ползание, лазание, бег, игры с мячом (от 1 часа для детей 1–5 лет, по ВОЗ).",
|
||
"Развивайте мелкую моторику: шнуровки, крупные бусины, лепка, рисование, игры с песком и водой.",
|
||
"Покажите педиатру, чтобы исключить мышечный тонус и неврологические причины."
|
||
]
|
||
},
|
||
cogn:{
|
||
title:"Когнитивное",
|
||
tips:[
|
||
"Играйте в сортировку по цвету, форме и размеру; простые пазлы и вкладыши.",
|
||
"Показывайте причинно-следственные связи: «нажмёшь — зазвенит», «упадёт — покатится».",
|
||
"Сюжетные игры развивают мышление: кормим куклу, готовим, лечим, магазин.",
|
||
"Задавайте вопросы и давайте время подумать — не торопите и не делайте за ребёнка.",
|
||
"Меньше экрана — больше реального исследования предметов руками."
|
||
]
|
||
},
|
||
lang:{
|
||
title:"Речевое",
|
||
tips:[
|
||
"Разговаривайте постоянно: комментируйте действия и называйте предметы.",
|
||
"Читайте каждый день 5–10 минут и обсуждайте картинки.",
|
||
"Пойте песни, учите потешки и стишки — ритм помогает освоению речи.",
|
||
"Повторяйте за ребёнком его звуки и слова, расширяя до фразы («ма-ма» → «мама пришла»).",
|
||
"Нет слов к 1,5 годам или фраз к 2 годам — обратитесь к неврологу/логопеду."
|
||
]
|
||
},
|
||
socio:{
|
||
title:"Социально-эмоциональное",
|
||
tips:[
|
||
"Отвечайте на сигналы ребёнка — улыбкой, словом, объятием («подавай-принимай»).",
|
||
"Называйте эмоции вслух: «ты злишься», «тебе обидно» — так ребёнок их понимает.",
|
||
"Организуйте общение с детьми; учите делиться и ждать очереди через игру.",
|
||
"Сохраняйте предсказуемый режим дня — стабильность снижает тревогу.",
|
||
"Будьте рядом в новых ситуациях и поддерживайте, не заставляя преодолевать страх в одиночку."
|
||
]
|
||
}
|
||
};
|
||
|
||
const BASE_TIPS = [
|
||
"Отзывчивая забота: замечайте и отвечайте на сигналы ребёнка.",
|
||
"Разговаривайте, читайте и пойте каждый день.",
|
||
"Игра — главный способ обучения ребёнка.",
|
||
"Обеспечьте полноценное питание, достаточный сон и безопасную среду.",
|
||
"Если заметили потерю навыков — сразу обратитесь к врачу."
|
||
];
|
||
|
||
/* ====== Render tool ====== */
|
||
const ageTabs = document.getElementById('ageTabs');
|
||
const milestonesEl = document.getElementById('milestones');
|
||
const perSphereEl = document.getElementById('perSphere');
|
||
const ring = document.getElementById('ring');
|
||
const ringNum = document.getElementById('ringNum');
|
||
const ringDone = document.getElementById('ringDone');
|
||
const childAge = document.getElementById('childAge');
|
||
const toolResults = document.getElementById('toolResults');
|
||
const lagHint = document.getElementById('lagHint');
|
||
|
||
const ages = Object.keys(DATA);
|
||
let currentAge = ages[0];
|
||
const checked = {}; // key -> bool
|
||
|
||
ages.forEach(age => {
|
||
const b = document.createElement('button');
|
||
b.className = 'age-tab' + (age===currentAge?' active':'');
|
||
b.textContent = age;
|
||
b.onclick = () => { currentAge = age; render(); };
|
||
ageTabs.appendChild(b);
|
||
});
|
||
|
||
function render(){
|
||
document.querySelectorAll('.age-tab').forEach(t=>{
|
||
t.classList.toggle('active', t.textContent===currentAge);
|
||
});
|
||
childAge.textContent = 'Возраст: ' + currentAge;
|
||
milestonesEl.innerHTML = '';
|
||
const block = DATA[currentAge];
|
||
let sphereTotals = [];
|
||
let total=0, done=0;
|
||
|
||
Object.keys(SPHERES).forEach(key=>{
|
||
const sp = SPHERES[key];
|
||
const items = block[key] || [];
|
||
let sDone=0;
|
||
const sBlock = document.createElement('div');
|
||
sBlock.className = 'sphere-block';
|
||
sBlock.innerHTML = `<div class="sb-head"><span class="dot" style="background:${sp.color}"></span><h3>${sp.emoji} ${sp.name}</h3><span class="cnt"></span></div>`;
|
||
const ul = document.createElement('ul');
|
||
ul.className = 'mlist';
|
||
items.forEach((it, i)=>{
|
||
const id = currentAge+'|'+key+'|'+i;
|
||
const isDone = !!checked[id];
|
||
if(isDone) sDone++;
|
||
const li = document.createElement('li');
|
||
if(isDone) li.classList.add('done');
|
||
li.innerHTML = `<span class="box"></span><span class="txt"><b>${it[0]}</b>${it[1]?'<small>'+it[1]+'</small>':''}</span>`;
|
||
li.onclick = ()=>{ checked[id]=!checked[id]; render(); };
|
||
ul.appendChild(li);
|
||
});
|
||
sBlock.querySelector('.cnt').textContent = sDone+' / '+items.length;
|
||
sBlock.appendChild(ul);
|
||
milestonesEl.appendChild(sBlock);
|
||
total += items.length; done += sDone;
|
||
sphereTotals.push({key, name:sp.name, color:sp.color, done:sDone, len:items.length});
|
||
});
|
||
|
||
// progress ring
|
||
const pct = total? Math.round(done/total*100):0;
|
||
ring.style.setProperty('--p', pct);
|
||
ringNum.textContent = pct+'%';
|
||
ringDone.textContent = done+' из '+total;
|
||
|
||
// per-sphere bars
|
||
perSphereEl.innerHTML = sphereTotals.map(s=>{
|
||
const p = s.len? Math.round(s.done/s.len*100):0;
|
||
return `<div class="ps"><div class="top"><b>${s.name}</b><span>${s.done}/${s.len}</span></div><div class="bar"><i style="width:${p}%;background:${s.color}"></i></div></div>`;
|
||
}).join('');
|
||
|
||
// ===== рекомендации по итогам оценки =====
|
||
const RANK = {ok:0, watch:1, lag:2};
|
||
const sphereStats = sphereTotals.filter(s=>s.len).map(s=>{
|
||
const p = s.done/s.len*100;
|
||
const st = p >= 70 ? 'ok' : (p >= 40 ? 'watch' : 'lag');
|
||
return {...s, p:Math.round(p), st};
|
||
});
|
||
let worst = 0;
|
||
sphereStats.forEach(s=>{ worst = Math.max(worst, RANK[s.st]); });
|
||
const worstStatus = worst===2 ? 'lag' : worst===1 ? 'watch' : 'ok';
|
||
|
||
// индикатор в боковой панели
|
||
lagHint.classList.toggle('show', done>0 && (worstStatus==='lag' || worstStatus==='watch'));
|
||
|
||
if(done === 0){
|
||
toolResults.innerHTML = `<div class="res-empty">👆 Отметьте навыки, которые уже есть у ребёнка, — здесь сразу появятся персональные рекомендации.</div>`;
|
||
return;
|
||
}
|
||
|
||
// шапка-статус
|
||
const statusMap = {
|
||
ok: {cls:'st-ok', icon:'✅', title:'Развитие идёт хорошо', text:'Большинство вех освоено. Продолжайте играть, разговаривать и поддерживать ребёнка.'},
|
||
watch: {cls:'st-watch', icon:'🟠', title:'Некоторые навыки ещё осваиваются', text:'Это нормально для возраста. Ниже — как поддержать сферы, которые развиваются медленнее.'},
|
||
lag: {cls:'st-lag', icon:'🔴', title:'Есть сферы, требующие внимания', text:'Рекомендуем целенаправленно поддержать развитие в этих направлениях. При сохранении отставания — обратитесь к специалисту.'}
|
||
};
|
||
const sm = statusMap[worstStatus];
|
||
let html = `<div class="res-status ${sm.cls}"><div class="badge">${sm.icon}</div><div><h3>${sm.title}</h3><p>${sm.text}</p></div></div>`;
|
||
|
||
// карточки рекомендаций для отстающих/осваивающихся сфер (lag -> watch)
|
||
const focus = sphereStats.filter(s=>s.st==='lag' || s.st==='watch')
|
||
.sort((a,b)=> RANK[b.st]-RANK[a.st]);
|
||
if(focus.length){
|
||
html += `<div class="res-sub">Рекомендации по сферам развития</div><div class="rec-grid">`;
|
||
focus.forEach(s=>{
|
||
const r = REC[s.key];
|
||
const pill = s.st==='lag'
|
||
? `<span class="rc-pill rc-lag">Отстаёт · ${s.p}%</span>`
|
||
: `<span class="rc-pill rc-watch">Осваивается · ${s.p}%</span>`;
|
||
const lis = r.tips.map(t=>`<li>${t}</li>`).join('');
|
||
html += `<div class="rec-card" style="border-top-color:${s.color}">
|
||
<h4>${SPHERES[s.key].emoji} ${r.title}</h4>${pill}<ul>${lis}</ul></div>`;
|
||
});
|
||
html += `</div>`;
|
||
}
|
||
|
||
// блок «когда к специалисту» — заметнее при отставании
|
||
if(worstStatus === 'lag'){
|
||
html += `<div class="res-doctor"><div class="ic">🩺</div><p><b>Когда обратиться к специалисту.</b> Если отставание сохраняется дольше 1–2 месяцев, есть потеря освоенных навыков, ребёнок не откликается на имя или избегает зрительного контакта — покажите его педиатру, неврологу и (при речевых задержках) логопеду. Раннее развитие мозга максимально пластично: чем раньше начать поддержку, тем лучше результат.</p></div>`;
|
||
} else if(worstStatus === 'watch'){
|
||
html += `<div class="res-doctor"><div class="ic">👀</div><p>Понаблюдайте 3–4 недели, активно применяя рекомендации выше. Если навыки так и не появляются или вы заметили регресс — обратитесь к педиатру. Лучше перестраховаться, чем упустить время.</p></div>`;
|
||
}
|
||
|
||
// базовые принципы заботливого ухода (всегда)
|
||
html += `<div class="res-base"><h4>Базовые принципы заботливого ухода (ВОЗ/ЮНИСЕФ)</h4><ul>` +
|
||
BASE_TIPS.map(t=>`<li>${t}</li>`).join('') + `</ul></div>`;
|
||
|
||
toolResults.innerHTML = html;
|
||
}
|
||
|
||
render();
|
||
|
||
/* ====== Сбор результатов через FormSubmit (без регистрации) ====== */
|
||
const COLLECT_EMAIL = ""; // ← email владельца сайта для получения результатов, напр. "tsai.e@amu.kz"
|
||
const collectForm = document.getElementById('collectForm');
|
||
const collectOff = document.getElementById('collectOff');
|
||
const cEmail = document.getElementById('cEmail');
|
||
const cConsent = document.getElementById('cConsent');
|
||
const cSubmit = document.getElementById('cSubmit');
|
||
const cMsg = document.getElementById('cMsg');
|
||
|
||
if(COLLECT_EMAIL){
|
||
collectForm.style.display = 'grid';
|
||
collectOff.style.display = 'none';
|
||
} else {
|
||
collectForm.style.display = 'none';
|
||
collectOff.style.display = 'block';
|
||
}
|
||
|
||
function buildPayload(){
|
||
const block = DATA[currentAge];
|
||
const res = {'Возраст': currentAge};
|
||
let total=0, done=0;
|
||
Object.keys(SPHERES).forEach(key=>{
|
||
const items = block[key]||[];
|
||
let d=0; const got=[], miss=[];
|
||
items.forEach((it,i)=>{
|
||
const id=currentAge+'|'+key+'|'+i;
|
||
if(checked[id]){d++; got.push(it[0]);} else {miss.push(it[0]);}
|
||
});
|
||
total+=items.length; done+=d;
|
||
const p = items.length?Math.round(d/items.length*100):0;
|
||
const st = p>=70?'Хорошо':(p>=40?'Осваивается':'Отстаёт');
|
||
res['Сфера: '+SPHERES[key].name] = d+' / '+items.length+' ('+st+', '+p+'%)';
|
||
res[SPHERES[key].name+' — освоено'] = got.join('; ')||'—';
|
||
res[SPHERES[key].name+' — не освоено'] = miss.join('; ')||'—';
|
||
});
|
||
const pct = total?Math.round(done/total*100):0;
|
||
const overall = pct>=70?'Развитие идёт хорошо':(pct>=40?'Некоторые навыки осваиваются':'Есть сферы, требующие внимания');
|
||
res['Общий статус'] = overall+' ('+done+'/'+total+', '+pct+'%)';
|
||
res['Дата отправки'] = new Date().toLocaleString('ru-RU');
|
||
if(cEmail.value.trim()){ res['Email родителя (необязательно)'] = cEmail.value.trim(); }
|
||
return res;
|
||
}
|
||
|
||
cSubmit.onclick = async () => {
|
||
if(!COLLECT_EMAIL){ cMsg.textContent='Сбор данных ещё не подключён.'; cMsg.className='cmsg err'; return; }
|
||
let done=0; Object.keys(checked).forEach(k=>{ if(k.startsWith(currentAge+'|')&&checked[k]) done++; });
|
||
if(done===0){ cMsg.textContent='Сначала отметьте хотя бы один навык выше.'; cMsg.className='cmsg err'; return; }
|
||
if(!cConsent.checked){ cMsg.textContent='Подтвердите согласие на обработку данных.'; cMsg.className='cmsg err'; return; }
|
||
const payload = buildPayload();
|
||
payload._subject = 'Оценка развития ребёнка — '+currentAge;
|
||
payload._template = 'table';
|
||
payload._captcha = 'false';
|
||
cSubmit.disabled = true;
|
||
cMsg.textContent='Отправляем…'; cMsg.className='cmsg';
|
||
try{
|
||
const r = await fetch('https://formsubmit.co/ajax/'+encodeURIComponent(COLLECT_EMAIL), {
|
||
method:'POST',
|
||
headers:{'Content-Type':'application/json','Accept':'application/json'},
|
||
body: JSON.stringify(payload)
|
||
});
|
||
if(r.ok){ cMsg.textContent='✓ Спасибо! Результат отправлен.'; cMsg.className='cmsg ok'; cConsent.checked=false; }
|
||
else { cMsg.textContent='Не удалось отправить. Попробуйте позже.'; cMsg.className='cmsg err'; }
|
||
}catch(e){ cMsg.textContent='Нет связи с сервером. Проверьте интернет.'; cMsg.className='cmsg err'; }
|
||
cSubmit.disabled = false;
|
||
};
|
||
</script>
|
||
</body>
|
||
</html>
|