1007 lines
24 KiB
HTML
1007 lines
24 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>Метод Дейвиса — Интерактивные занятия</title>
|
||
<style>
|
||
:root {
|
||
--ink: #0F1218;
|
||
--cyan: #00E5FF;
|
||
--cyan-50: #E8FCFF;
|
||
--white: #FFFFFF;
|
||
--gray-500: #5B6573;
|
||
--gray-100: #F2F4F7;
|
||
--pink: #FF6B9D;
|
||
--green: #4CAF50;
|
||
--orange: #FF9800;
|
||
--purple: #9C27B0;
|
||
--yellow: #FFC107;
|
||
}
|
||
|
||
* {
|
||
box-sizing: border-box;
|
||
margin: 0;
|
||
padding: 0;
|
||
}
|
||
|
||
body {
|
||
font: 17px/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif;
|
||
color: var(--ink);
|
||
background: var(--white);
|
||
}
|
||
|
||
.container {
|
||
max-width: 1140px;
|
||
margin: 0 auto;
|
||
padding: 80px 24px;
|
||
}
|
||
|
||
/* Hero Section */
|
||
.hero {
|
||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||
color: var(--white);
|
||
padding: 60px 24px;
|
||
text-align: center;
|
||
}
|
||
|
||
.hero h1 {
|
||
font-size: 48px;
|
||
font-weight: 800;
|
||
line-height: 1.1;
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
.hero p {
|
||
font-size: 20px;
|
||
color: rgba(255,255,255,0.9);
|
||
max-width: 700px;
|
||
margin: 0 auto 30px;
|
||
}
|
||
|
||
/* Navigation */
|
||
.nav {
|
||
display: flex;
|
||
justify-content: center;
|
||
gap: 12px;
|
||
flex-wrap: wrap;
|
||
margin-bottom: 40px;
|
||
}
|
||
|
||
.nav-btn {
|
||
background: rgba(255,255,255,0.2);
|
||
color: var(--white);
|
||
border: 2px solid rgba(255,255,255,0.3);
|
||
padding: 12px 24px;
|
||
border-radius: 25px;
|
||
font-weight: 600;
|
||
cursor: pointer;
|
||
transition: all 0.3s;
|
||
}
|
||
|
||
.nav-btn:hover, .nav-btn.active {
|
||
background: var(--white);
|
||
color: var(--ink);
|
||
transform: translateY(-2px);
|
||
}
|
||
|
||
/* Section Styling */
|
||
.section {
|
||
padding: 60px 24px;
|
||
}
|
||
|
||
.section-title {
|
||
font-size: 36px;
|
||
font-weight: 700;
|
||
text-align: center;
|
||
margin-bottom: 40px;
|
||
color: var(--ink);
|
||
}
|
||
|
||
/* Letter Cards */
|
||
.letter-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
|
||
gap: 20px;
|
||
max-width: 900px;
|
||
margin: 0 auto;
|
||
}
|
||
|
||
.letter-card {
|
||
background: var(--gray-100);
|
||
border-radius: 16px;
|
||
padding: 30px;
|
||
text-align: center;
|
||
cursor: pointer;
|
||
transition: all 0.3s;
|
||
border: 3px solid transparent;
|
||
}
|
||
|
||
.letter-card:hover {
|
||
transform: translateY(-5px);
|
||
border-color: var(--cyan);
|
||
box-shadow: 0 10px 30px rgba(0,229,255,0.2);
|
||
}
|
||
|
||
.letter-card.selected {
|
||
background: var(--cyan-50);
|
||
border-color: var(--cyan);
|
||
}
|
||
|
||
.letter-card .letter {
|
||
font-size: 48px;
|
||
font-weight: 800;
|
||
margin-bottom: 10px;
|
||
color: var(--ink);
|
||
}
|
||
|
||
.letter-card .sound {
|
||
font-size: 16px;
|
||
color: var(--gray-500);
|
||
}
|
||
|
||
.speak-btn {
|
||
background: var(--cyan);
|
||
color: var(--ink);
|
||
border: none;
|
||
border-radius: 50%;
|
||
width: 36px;
|
||
height: 36px;
|
||
font-size: 18px;
|
||
cursor: pointer;
|
||
margin-top: 8px;
|
||
transition: all 0.3s;
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.speak-btn:hover {
|
||
background: #1be5ff;
|
||
transform: scale(1.1);
|
||
}
|
||
|
||
.speak-btn.speaking {
|
||
animation: pulse 0.6s infinite;
|
||
}
|
||
|
||
@keyframes pulse {
|
||
0%, 100% { transform: scale(1); }
|
||
50% { transform: scale(1.2); }
|
||
}
|
||
|
||
.speak-letter-btn {
|
||
background: var(--purple);
|
||
color: var(--white);
|
||
border: none;
|
||
border-radius: 50%;
|
||
width: 50px;
|
||
height: 50px;
|
||
font-size: 24px;
|
||
cursor: pointer;
|
||
margin-top: 15px;
|
||
transition: all 0.3s;
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.speak-letter-btn:hover {
|
||
background: #7B1FA2;
|
||
transform: scale(1.1);
|
||
}
|
||
|
||
.mirror-speak-btn {
|
||
background: var(--pink);
|
||
color: var(--white);
|
||
border: none;
|
||
border-radius: 50%;
|
||
width: 60px;
|
||
height: 60px;
|
||
font-size: 28px;
|
||
cursor: pointer;
|
||
margin: 15px 0;
|
||
transition: all 0.3s;
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.mirror-speak-btn:hover {
|
||
background: #E91E63;
|
||
transform: scale(1.1);
|
||
}
|
||
|
||
/* Mirror Exercise */
|
||
.mirror-container {
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
gap: 40px;
|
||
flex-wrap: wrap;
|
||
margin-bottom: 40px;
|
||
}
|
||
|
||
.mirror-letter {
|
||
font-size: 120px;
|
||
font-weight: 800;
|
||
color: var(--pink);
|
||
transition: transform 0.3s;
|
||
}
|
||
|
||
.mirror-letter.flipped {
|
||
transform: scaleX(-1);
|
||
}
|
||
|
||
.mirror-controls {
|
||
display: flex;
|
||
gap: 20px;
|
||
justify-content: center;
|
||
margin-top: 30px;
|
||
}
|
||
|
||
.btn {
|
||
display: inline-block;
|
||
padding: 14px 28px;
|
||
border-radius: 8px;
|
||
font-weight: 700;
|
||
text-decoration: none;
|
||
border: none;
|
||
cursor: pointer;
|
||
font-size: 16px;
|
||
transition: all 0.3s;
|
||
}
|
||
|
||
.btn-primary {
|
||
background: var(--cyan);
|
||
color: var(--ink);
|
||
}
|
||
|
||
.btn-primary:hover {
|
||
background: #1be5ff;
|
||
transform: translateY(-2px);
|
||
}
|
||
|
||
.btn-secondary {
|
||
background: transparent;
|
||
color: var(--ink);
|
||
border: 2px solid var(--ink);
|
||
}
|
||
|
||
.btn-secondary:hover {
|
||
background: var(--ink);
|
||
color: var(--white);
|
||
}
|
||
|
||
.btn-pink {
|
||
background: var(--pink);
|
||
color: var(--white);
|
||
}
|
||
|
||
.btn-green {
|
||
background: var(--green);
|
||
color: var(--white);
|
||
}
|
||
|
||
/* Sound Game */
|
||
.sound-game {
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
gap: 30px;
|
||
}
|
||
|
||
.sound-letter-display {
|
||
font-size: 80px;
|
||
font-weight: 800;
|
||
color: var(--purple);
|
||
background: var(--gray-100);
|
||
padding: 40px;
|
||
border-radius: 20px;
|
||
min-width: 200px;
|
||
text-align: center;
|
||
}
|
||
|
||
.sound-options {
|
||
display: flex;
|
||
gap: 15px;
|
||
flex-wrap: wrap;
|
||
justify-content: center;
|
||
}
|
||
|
||
.sound-option {
|
||
background: var(--white);
|
||
border: 3px solid var(--gray-100);
|
||
padding: 20px 30px;
|
||
border-radius: 12px;
|
||
font-size: 24px;
|
||
cursor: pointer;
|
||
transition: all 0.3s;
|
||
}
|
||
|
||
.sound-option:hover {
|
||
border-color: var(--cyan);
|
||
transform: scale(1.05);
|
||
}
|
||
|
||
.sound-option.correct {
|
||
background: #e8f5e9;
|
||
border-color: var(--green);
|
||
}
|
||
|
||
.sound-option.wrong {
|
||
background: #ffebee;
|
||
border-color: var(--pink);
|
||
}
|
||
|
||
/* Memory Game */
|
||
.memory-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
|
||
gap: 15px;
|
||
max-width: 600px;
|
||
margin: 0 auto;
|
||
}
|
||
|
||
.memory-card {
|
||
background: var(--gray-100);
|
||
border-radius: 12px;
|
||
padding: 30px;
|
||
text-align: center;
|
||
cursor: pointer;
|
||
transition: all 0.3s;
|
||
font-size: 36px;
|
||
font-weight: 800;
|
||
}
|
||
|
||
.memory-card:hover {
|
||
transform: scale(1.05);
|
||
}
|
||
|
||
.memory-card.flipped {
|
||
background: var(--cyan-50);
|
||
border-color: var(--cyan);
|
||
}
|
||
|
||
.memory-card.matched {
|
||
background: #e8f5e9;
|
||
border-color: var(--green);
|
||
pointer-events: none;
|
||
}
|
||
|
||
/* Progress */
|
||
.progress-container {
|
||
background: var(--gray-100);
|
||
border-radius: 10px;
|
||
padding: 20px;
|
||
margin-bottom: 30px;
|
||
text-align: center;
|
||
}
|
||
|
||
.progress-bar {
|
||
background: var(--gray-100);
|
||
border-radius: 10px;
|
||
height: 20px;
|
||
margin-top: 10px;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.progress-fill {
|
||
background: linear-gradient(90deg, var(--cyan), var(--green));
|
||
height: 100%;
|
||
width: 0%;
|
||
transition: width 0.5s;
|
||
}
|
||
|
||
.progress-text {
|
||
font-size: 16px;
|
||
color: var(--gray-500);
|
||
margin-top: 10px;
|
||
}
|
||
|
||
/* Feedback */
|
||
.feedback {
|
||
text-align: center;
|
||
padding: 20px;
|
||
border-radius: 12px;
|
||
margin-top: 20px;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.feedback.success {
|
||
background: #e8f5e9;
|
||
color: var(--green);
|
||
}
|
||
|
||
.feedback.error {
|
||
background: #ffebee;
|
||
color: var(--pink);
|
||
}
|
||
|
||
/* Clay Modeling */
|
||
.clay-area {
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
gap: 40px;
|
||
flex-wrap: wrap;
|
||
margin-bottom: 30px;
|
||
}
|
||
|
||
.clay-shape {
|
||
width: 150px;
|
||
height: 150px;
|
||
background: var(--orange);
|
||
border-radius: 50%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 48px;
|
||
color: var(--white);
|
||
font-weight: 800;
|
||
cursor: move;
|
||
transition: transform 0.2s;
|
||
}
|
||
|
||
.clay-shape:hover {
|
||
transform: scale(1.1);
|
||
}
|
||
|
||
.clay-reference {
|
||
font-size: 100px;
|
||
font-weight: 800;
|
||
color: var(--ink);
|
||
}
|
||
|
||
/* Responsive */
|
||
@media (max-width: 768px) {
|
||
.hero h1 {
|
||
font-size: 36px;
|
||
}
|
||
|
||
.hero p {
|
||
font-size: 18px;
|
||
}
|
||
|
||
.section-title {
|
||
font-size: 28px;
|
||
}
|
||
|
||
.letter-card .letter {
|
||
font-size: 36px;
|
||
}
|
||
|
||
.mirror-letter {
|
||
font-size: 80px;
|
||
}
|
||
|
||
.sound-letter-display {
|
||
font-size: 60px;
|
||
padding: 30px;
|
||
}
|
||
|
||
.container {
|
||
padding: 60px 20px;
|
||
}
|
||
}
|
||
|
||
/* Animations */
|
||
@keyframes bounce {
|
||
0%, 100% { transform: translateY(0); }
|
||
50% { transform: translateY(-10px); }
|
||
}
|
||
|
||
.bounce {
|
||
animation: bounce 0.6s ease-in-out;
|
||
}
|
||
|
||
/* Hidden sections */
|
||
.section-hidden {
|
||
display: none;
|
||
}
|
||
|
||
.section-visible {
|
||
display: block;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<!-- Hero Section -->
|
||
<section class="hero">
|
||
<div class="container">
|
||
<h1>Интерактивные занятия по методу Дейвиса</h1>
|
||
<p>Помогаем детям с дислексией и СДВГ учиться через игру и творчество</p>
|
||
|
||
<div class="nav">
|
||
<button class="nav-btn active" onclick="showSection('letters')">Буквы</button>
|
||
<button class="nav-btn" onclick="showSection('mirror')">Зеркальные буквы</button>
|
||
<button class="nav-btn" onclick="showSection('sounds')">Звуки</button>
|
||
<button class="nav-btn" onclick="showSection('memory')">Память</button>
|
||
<button class="nav-btn" onclick="showSection('clay')">Глина</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Letters Section -->
|
||
<section id="letters" class="section section-visible">
|
||
<div class="container">
|
||
<h2 class="section-title">Узнаём буквы</h2>
|
||
|
||
<div class="progress-container">
|
||
<div class="progress-bar">
|
||
<div class="progress-fill" id="letters-progress"></div>
|
||
</div>
|
||
<div class="progress-text" id="letters-progress-text">0 из 10 букв изучено</div>
|
||
</div>
|
||
|
||
<div class="letter-grid" id="letter-grid">
|
||
<!-- Letters will be added here -->
|
||
</div>
|
||
|
||
<div class="feedback" id="letters-feedback" style="display: none;"></div>
|
||
|
||
<div style="text-align: center; margin-top: 30px;">
|
||
<button class="btn btn-primary" onclick="resetLetters()">Начать заново</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Mirror Section -->
|
||
<section id="mirror" class="section section-hidden">
|
||
<div class="container">
|
||
<h2 class="section-title">Зеркальные буквы</h2>
|
||
<p style="text-align: center; margin-bottom: 40px; color: var(--gray-500);">
|
||
Помоги букве встать правильно! Нажимай на кнопки, чтобы перевернуть букву.
|
||
</p>
|
||
|
||
<div class="mirror-container">
|
||
<div style="text-align: center;">
|
||
<div class="mirror-letter" id="mirror-letter">Б</div>
|
||
<button class="mirror-speak-btn" onclick="speakMirrorLetter()">🔊</button>
|
||
</div>
|
||
<div style="text-align: center;">
|
||
<p style="font-size: 18px; margin-bottom: 20px;">Как должна выглядеть буква?</p>
|
||
<button class="btn btn-primary" onclick="rotateLetter(-90)">← Влево</button>
|
||
<button class="btn btn-primary" onclick="rotateLetter(90)">Вправо →</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mirror-controls">
|
||
<button class="btn btn-secondary" onclick="prevMirrorLetter()">← Предыдущая</button>
|
||
<button class="btn btn-green" onclick="checkMirrorLetter()">Проверить</button>
|
||
<button class="btn btn-secondary" onclick="nextMirrorLetter()">Следующая →</button>
|
||
</div>
|
||
|
||
<div class="feedback" id="mirror-feedback" style="display: none; margin-top: 30px;"></div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Sounds Section -->
|
||
<section id="sounds" class="section section-hidden">
|
||
<div class="container">
|
||
<h2 class="section-title">Соединяем звуки и буквы</h2>
|
||
|
||
<div class="sound-game">
|
||
<div class="sound-letter-display" id="sound-letter">А</div>
|
||
<button class="speak-letter-btn" onclick="speakCurrentSoundLetter()">🔊</button>
|
||
|
||
<div class="sound-options" id="sound-options">
|
||
<!-- Sound options will be added here -->
|
||
</div>
|
||
|
||
<div class="feedback" id="sounds-feedback" style="display: none;"></div>
|
||
|
||
<button class="btn btn-primary" onclick="nextSoundLetter()">Следующая буква →</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Memory Section -->
|
||
<section id="memory" class="section section-hidden">
|
||
<div class="container">
|
||
<h2 class="section-title">Игра на память</h2>
|
||
<p style="text-align: center; margin-bottom: 40px; color: var(--gray-500);">
|
||
Найди одинаковые буквы! Нажимай на карточки, чтобы перевернуть их.
|
||
</p>
|
||
|
||
<div class="memory-grid" id="memory-grid">
|
||
<!-- Memory cards will be added here -->
|
||
</div>
|
||
|
||
<div style="text-align: center; margin-top: 30px;">
|
||
<button class="btn btn-primary" onclick="initMemoryGame()">Начать игру заново</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Clay Section -->
|
||
<section id="clay" class="section section-hidden">
|
||
<div class="container">
|
||
<h2 class="section-title">Лепим из глины</h2>
|
||
<p style="text-align: center; margin-bottom: 40px; color: var(--gray-500);">
|
||
По методу Дейвиса дети лепят буквы из глины, чтобы лучше их запомнить.
|
||
Попробуй слепить букву, которая показана справа!
|
||
</p>
|
||
|
||
<div class="clay-area">
|
||
<div class="clay-shape" id="clay-shape" draggable="true">?</div>
|
||
<div class="clay-reference" id="clay-reference">А</div>
|
||
</div>
|
||
|
||
<div style="text-align: center; margin-top: 30px;">
|
||
<button class="btn btn-primary" onclick="nextClayLetter()">Следующая буква →</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<script>
|
||
// Letter learning data
|
||
const letters = [
|
||
{ letter: 'А', sound: 'а', example: 'Арбуз' },
|
||
{ letter: 'Б', sound: 'бэ', example: 'Бабочка' },
|
||
{ letter: 'В', sound: 'вэ', example: 'Волк' },
|
||
{ letter: 'Г', sound: 'гэ', example: 'Гриб' },
|
||
{ letter: 'Д', sound: 'дэ', example: 'Дом' },
|
||
{ letter: 'Е', sound: 'е', example: 'Ёж' },
|
||
{ letter: 'Ж', sound: 'жэ', example: 'Жук' },
|
||
{ letter: 'З', sound: 'зэ', example: 'Звезда' },
|
||
{ letter: 'И', sound: 'и', example: 'Игрушка' },
|
||
{ letter: 'К', sound: 'ка', example: 'Кот' }
|
||
];
|
||
|
||
// Mirror letters (pairs that are often confused)
|
||
const mirrorLetters = [
|
||
{ letter: 'Б', flipped: 'Ь', correct: 'Б' },
|
||
{ letter: 'В', flipped: 'В', correct: 'В' },
|
||
{ letter: 'Д', flipped: 'Д', correct: 'Д' },
|
||
{ letter: 'Р', flipped: 'Я', correct: 'Р' },
|
||
{ letter: 'С', flipped: 'С', correct: 'С' },
|
||
{ letter: 'Э', flipped: 'Э', correct: 'Э' }
|
||
];
|
||
|
||
// State variables
|
||
let currentSection = 'letters';
|
||
let selectedLetter = null;
|
||
let lettersLearned = 0;
|
||
let currentMirrorIndex = 0;
|
||
let currentRotation = 0;
|
||
let currentSoundLetterIndex = 0;
|
||
let memoryCards = [];
|
||
let flippedCards = [];
|
||
let matchedPairs = 0;
|
||
|
||
// Initialize the app
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
initLetters();
|
||
initMirrorExercise();
|
||
initSoundGame();
|
||
initMemoryGame();
|
||
initClayExercise();
|
||
});
|
||
|
||
// Navigation
|
||
function showSection(sectionId) {
|
||
// Hide all sections
|
||
document.querySelectorAll('.section').forEach(section => {
|
||
section.classList.remove('section-visible');
|
||
section.classList.add('section-hidden');
|
||
});
|
||
|
||
// Show selected section
|
||
document.getElementById(sectionId).classList.remove('section-hidden');
|
||
document.getElementById(sectionId).classList.add('section-visible');
|
||
|
||
// Update navigation buttons
|
||
document.querySelectorAll('.nav-btn').forEach(btn => {
|
||
btn.classList.remove('active');
|
||
});
|
||
event.target.classList.add('active');
|
||
|
||
currentSection = sectionId;
|
||
}
|
||
|
||
// Letters Section
|
||
function initLetters() {
|
||
const grid = document.getElementById('letter-grid');
|
||
grid.innerHTML = '';
|
||
|
||
letters.forEach((item, index) => {
|
||
const card = document.createElement('div');
|
||
card.className = 'letter-card';
|
||
card.innerHTML = `
|
||
<div class="letter">${item.letter}</div>
|
||
<div class="sound">${item.sound}</div>
|
||
<button class="speak-btn" onclick="event.stopPropagation(); speakLetter('${item.letter}', this)">🔊</button>
|
||
`;
|
||
card.onclick = () => selectLetter(index, card);
|
||
grid.appendChild(card);
|
||
});
|
||
|
||
updateLettersProgress();
|
||
}
|
||
|
||
function selectLetter(index, card) {
|
||
// Remove selection from all cards
|
||
document.querySelectorAll('.letter-card').forEach(c => c.classList.remove('selected'));
|
||
|
||
// Select this card
|
||
card.classList.add('selected');
|
||
selectedLetter = index;
|
||
|
||
// Show feedback
|
||
showFeedback('letters-feedback', `Буква "${letters[index].letter}" — ${letters[index].sound}. Пример: ${letters[index].example}`, 'success');
|
||
|
||
// Mark as learned
|
||
if (!card.classList.contains('learned')) {
|
||
card.classList.add('learned');
|
||
lettersLearned++;
|
||
updateLettersProgress();
|
||
}
|
||
|
||
// Add bounce animation
|
||
card.classList.add('bounce');
|
||
setTimeout(() => card.classList.remove('bounce'), 600);
|
||
}
|
||
|
||
function updateLettersProgress() {
|
||
const progress = (lettersLearned / letters.length) * 100;
|
||
document.getElementById('letters-progress').style.width = `${progress}%`;
|
||
document.getElementById('letters-progress-text').textContent = `${lettersLearned} из ${letters.length} букв изучено`;
|
||
}
|
||
|
||
function resetLetters() {
|
||
lettersLearned = 0;
|
||
document.querySelectorAll('.letter-card').forEach(card => {
|
||
card.classList.remove('selected', 'learned');
|
||
});
|
||
updateLettersProgress();
|
||
document.getElementById('letters-feedback').style.display = 'none';
|
||
}
|
||
|
||
// Mirror Exercise
|
||
function initMirrorExercise() {
|
||
currentMirrorIndex = 0;
|
||
currentRotation = 0;
|
||
updateMirrorDisplay();
|
||
}
|
||
|
||
function updateMirrorDisplay() {
|
||
const letter = mirrorLetters[currentMirrorIndex].letter;
|
||
document.getElementById('mirror-letter').textContent = letter;
|
||
document.getElementById('mirror-letter').style.transform = `rotate(${currentRotation}deg)`;
|
||
}
|
||
|
||
function rotateLetter(degrees) {
|
||
currentRotation += degrees;
|
||
document.getElementById('mirror-letter').style.transform = `rotate(${currentRotation}deg)`;
|
||
}
|
||
|
||
function prevMirrorLetter() {
|
||
currentMirrorIndex = (currentMirrorIndex - 1 + mirrorLetters.length) % mirrorLetters.length;
|
||
currentRotation = 0;
|
||
updateMirrorDisplay();
|
||
document.getElementById('mirror-feedback').style.display = 'none';
|
||
}
|
||
|
||
function nextMirrorLetter() {
|
||
currentMirrorIndex = (currentMirrorIndex + 1) % mirrorLetters.length;
|
||
currentRotation = 0;
|
||
updateMirrorDisplay();
|
||
document.getElementById('mirror-feedback').style.display = 'none';
|
||
}
|
||
|
||
function checkMirrorLetter() {
|
||
const isCorrect = currentRotation % 360 === 0;
|
||
const feedback = document.getElementById('mirror-feedback');
|
||
|
||
if (isCorrect) {
|
||
showFeedback('mirror-feedback', 'Молодец! Буква стоит правильно!', 'success');
|
||
} else {
|
||
showFeedback('mirror-feedback', 'Попробуй ещё раз! Буква должна стоять ровно.', 'error');
|
||
}
|
||
}
|
||
|
||
// Sound Game
|
||
function initSoundGame() {
|
||
currentSoundLetterIndex = 0;
|
||
updateSoundGame();
|
||
}
|
||
|
||
function updateSoundGame() {
|
||
const letter = letters[currentSoundLetterIndex];
|
||
document.getElementById('sound-letter').textContent = letter.letter;
|
||
|
||
const options = document.getElementById('sound-options');
|
||
options.innerHTML = '';
|
||
|
||
// Create correct answer
|
||
const correctOption = document.createElement('div');
|
||
correctOption.className = 'sound-option';
|
||
correctOption.textContent = letter.sound;
|
||
correctOption.onclick = () => checkSoundAnswer(correctOption, true);
|
||
options.appendChild(correctOption);
|
||
|
||
// Create wrong answers
|
||
const wrongAnswers = letters
|
||
.filter((_, index) => index !== currentSoundLetterIndex)
|
||
.sort(() => Math.random() - 0.5)
|
||
.slice(0, 3)
|
||
.map(item => item.sound);
|
||
|
||
wrongAnswers.forEach(sound => {
|
||
const wrongOption = document.createElement('div');
|
||
wrongOption.className = 'sound-option';
|
||
wrongOption.textContent = sound;
|
||
wrongOption.onclick = () => checkSoundAnswer(wrongOption, false);
|
||
options.appendChild(wrongOption);
|
||
});
|
||
|
||
// Shuffle options
|
||
const optionsArray = Array.from(options.children);
|
||
optionsArray.sort(() => Math.random() - 0.5);
|
||
optionsArray.forEach(option => options.appendChild(option));
|
||
|
||
document.getElementById('sounds-feedback').style.display = 'none';
|
||
}
|
||
|
||
function checkSoundAnswer(option, isCorrect) {
|
||
const feedback = document.getElementById('sounds-feedback');
|
||
|
||
if (isCorrect) {
|
||
option.classList.add('correct');
|
||
showFeedback('sounds-feedback', 'Правильно! Молодец!', 'success');
|
||
} else {
|
||
option.classList.add('wrong');
|
||
showFeedback('sounds-feedback', 'Не совсем. Попробуй ещё раз!', 'error');
|
||
}
|
||
}
|
||
|
||
function nextSoundLetter() {
|
||
currentSoundLetterIndex = (currentSoundLetterIndex + 1) % letters.length;
|
||
updateSoundGame();
|
||
}
|
||
|
||
// Memory Game
|
||
function initMemoryGame() {
|
||
const grid = document.getElementById('memory-grid');
|
||
grid.innerHTML = '';
|
||
|
||
// Create pairs of letters
|
||
const selectedLetters = letters.slice(0, 6);
|
||
const pairs = [...selectedLetters, ...selectedLetters];
|
||
|
||
// Shuffle
|
||
memoryCards = pairs.sort(() => Math.random() - 0.5);
|
||
flippedCards = [];
|
||
matchedPairs = 0;
|
||
|
||
memoryCards.forEach((item, index) => {
|
||
const card = document.createElement('div');
|
||
card.className = 'memory-card';
|
||
card.dataset.index = index;
|
||
card.dataset.letter = item.letter;
|
||
card.textContent = '?';
|
||
card.onclick = () => flipCard(card, index);
|
||
grid.appendChild(card);
|
||
});
|
||
}
|
||
|
||
function flipCard(card, index) {
|
||
// Ignore if already flipped or matched
|
||
if (card.classList.contains('flipped') || card.classList.contains('matched')) {
|
||
return;
|
||
}
|
||
|
||
// Flip the card
|
||
card.classList.add('flipped');
|
||
card.textContent = memoryCards[index].letter;
|
||
flippedCards.push({ card, index, letter: memoryCards[index].letter });
|
||
|
||
// Check if two cards are flipped
|
||
if (flippedCards.length === 2) {
|
||
const [first, second] = flippedCards;
|
||
|
||
if (first.letter === second.letter) {
|
||
// Match found
|
||
first.card.classList.add('matched');
|
||
second.card.classList.add('matched');
|
||
matchedPairs++;
|
||
|
||
// Check if game is complete
|
||
if (matchedPairs === memoryCards.length / 2) {
|
||
setTimeout(() => {
|
||
alert('Поздравляем! Ты нашёл все пары!');
|
||
initMemoryGame();
|
||
}, 500);
|
||
}
|
||
} else {
|
||
// No match - flip back
|
||
setTimeout(() => {
|
||
first.card.classList.remove('flipped');
|
||
first.card.textContent = '?';
|
||
second.card.classList.remove('flipped');
|
||
second.card.textContent = '?';
|
||
}, 1000);
|
||
}
|
||
|
||
flippedCards = [];
|
||
}
|
||
}
|
||
|
||
// Clay Exercise
|
||
function initClayExercise() {
|
||
nextClayLetter();
|
||
}
|
||
|
||
function nextClayLetter() {
|
||
const randomIndex = Math.floor(Math.random() * letters.length);
|
||
document.getElementById('clay-reference').textContent = letters[randomIndex].letter;
|
||
document.getElementById('clay-shape').textContent = '?';
|
||
}
|
||
|
||
// Feedback helper
|
||
function showFeedback(elementId, message, type) {
|
||
const feedback = document.getElementById(elementId);
|
||
feedback.textContent = message;
|
||
feedback.className = `feedback ${type}`;
|
||
feedback.style.display = 'block';
|
||
|
||
// Auto-hide after 3 seconds
|
||
setTimeout(() => {
|
||
feedback.style.display = 'none';
|
||
}, 3000);
|
||
}
|
||
|
||
// Speech synthesis function
|
||
function speakLetter(letter, button) {
|
||
// Check if speech synthesis is supported
|
||
if ('speechSynthesis' in window) {
|
||
// Cancel any ongoing speech
|
||
window.speechSynthesis.cancel();
|
||
|
||
// Create a new speech utterance
|
||
const utterance = new SpeechSynthesisUtterance(letter);
|
||
|
||
// Set language to Russian
|
||
utterance.lang = 'ru-RU';
|
||
|
||
// Set rate and pitch for child-friendly speech
|
||
utterance.rate = 0.8; // Slower speed
|
||
utterance.pitch = 1.2; // Higher pitch for children
|
||
|
||
// Add visual feedback
|
||
if (button) {
|
||
button.classList.add('speaking');
|
||
utterance.onend = () => {
|
||
button.classList.remove('speaking');
|
||
};
|
||
utterance.onerror = () => {
|
||
button.classList.remove('speaking');
|
||
};
|
||
}
|
||
|
||
// Speak the letter
|
||
window.speechSynthesis.speak(utterance);
|
||
} else {
|
||
// Fallback alert if speech synthesis is not supported
|
||
alert('Озвучка не поддерживается в этом браузере');
|
||
}
|
||
}
|
||
|
||
// Speak the current letter in sound game
|
||
function speakCurrentSoundLetter() {
|
||
const letter = letters[currentSoundLetterIndex];
|
||
speakLetter(letter.letter, null);
|
||
}
|
||
|
||
// Speak the current mirror letter
|
||
function speakMirrorLetter() {
|
||
const letter = mirrorLetters[currentMirrorIndex];
|
||
speakLetter(letter.letter, null);
|
||
}
|
||
</script>
|
||
|
||
</body>
|
||
</html>
|