reading-teacher by jamesrochabrun/skills
npx skills add https://github.com/jamesrochabrun/skills --skill reading-teacher一款互动、有趣的阅读教师,通过互动式学习工具、可视化游戏场和游戏化挑战,为年轻学习者即时生成引人入胜的学习体验。
将阅读教育转变为互动、可视化的体验:
传统阅读教学:
使用此技能:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
技能:
活动:
技能:
活动:
技能:
活动:
技能:
活动:
用户提问: "帮助我的幼儿学习字母"
教师生成:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>🌈 Letter Land Adventure!</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Comic Sans MS', 'Chalkboard SE', cursive, sans-serif;
background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
padding: 20px;
color: #333;
}
.header {
text-align: center;
margin-bottom: 30px;
}
h1 {
font-size: 3em;
color: #FF6B9D;
text-shadow: 3px 3px 6px rgba(0,0,0,0.1);
margin-bottom: 10px;
}
.stars {
font-size: 2em;
background: rgba(255,255,255,0.8);
padding: 10px 30px;
border-radius: 30px;
display: inline-block;
}
.letter-display {
background: white;
width: 400px;
height: 400px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 15em;
font-weight: bold;
color: #FF6B9D;
box-shadow: 0 20px 60px rgba(0,0,0,0.2);
margin: 20px;
cursor: pointer;
transition: all 0.3s ease;
user-select: none;
}
.letter-display:hover {
transform: scale(1.05);
box-shadow: 0 30px 80px rgba(0,0,0,0.3);
}
.letter-display:active {
transform: scale(0.95);
}
.controls {
display: flex;
gap: 20px;
margin: 20px;
flex-wrap: wrap;
justify-content: center;
}
.btn {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
padding: 20px 40px;
font-size: 1.5em;
border-radius: 20px;
cursor: pointer;
transition: transform 0.2s;
font-weight: bold;
box-shadow: 0 10px 25px rgba(0,0,0,0.2);
}
.btn:hover { transform: translateY(-5px); }
.btn:active { transform: translateY(0); }
.letter-name {
font-size: 2em;
margin: 20px;
color: #667eea;
font-weight: bold;
}
.celebration {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0);
font-size: 10em;
animation: celebrate 1s ease forwards;
pointer-events: none;
z-index: 1000;
}
@keyframes celebrate {
0% { transform: translate(-50%, -50%) scale(0) rotate(0deg); }
50% { transform: translate(-50%, -50%) scale(1.5) rotate(180deg); }
100% { transform: translate(-50%, -50%) scale(1) rotate(360deg); opacity: 0; }
}
.alphabet-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));
gap: 10px;
max-width: 800px;
margin: 20px;
}
.alphabet-letter {
background: white;
padding: 20px;
border-radius: 15px;
font-size: 2em;
text-align: center;
cursor: pointer;
transition: all 0.2s;
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
font-weight: bold;
color: #667eea;
}
.alphabet-letter:hover {
transform: scale(1.1);
background: #FFD700;
}
.alphabet-letter.learned {
background: #4CAF50;
color: white;
}
@media (max-width: 768px) {
.letter-display { width: 300px; height: 300px; font-size: 10em; }
h1 { font-size: 2em; }
}
</style>
</head>
<body>
<div class="header">
<h1>🌈 Letter Land Adventure!</h1>
<div class="stars">
Stars: <span id="stars">0</span> ⭐
</div>
</div>
<div class="letter-display" id="letterDisplay" onclick="speakLetter()">
A
</div>
<div class="letter-name" id="letterName">
Click the letter to hear its name and sound!
</div>
<div class="controls">
<button class="btn" onclick="nextLetter()">Next Letter ➡️</button>
<button class="btn" onclick="randomLetter()">Random Letter 🎲</button>
<button class="btn" onclick="showAlphabet()">Show All 🔤</button>
</div>
<div class="alphabet-grid" id="alphabetGrid" style="display: none;"></div>
<script>
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
const letterNames = {
'A': 'Apple', 'B': 'Ball', 'C': 'Cat', 'D': 'Dog', 'E': 'Elephant',
'F': 'Fish', 'G': 'Goat', 'H': 'Hat', 'I': 'Ice Cream', 'J': 'Juice',
'K': 'Kite', 'L': 'Lion', 'M': 'Moon', 'N': 'Nest', 'O': 'Orange',
'P': 'Pig', 'Q': 'Queen', 'R': 'Rabbit', 'S': 'Sun', 'T': 'Tiger',
'U': 'Umbrella', 'V': 'Violin', 'W': 'Whale', 'X': 'X-ray', 'Y': 'Yellow', 'Z': 'Zebra'
};
const letterSounds = {
'A': 'ah', 'B': 'buh', 'C': 'kuh', 'D': 'duh', 'E': 'eh',
'F': 'fuh', 'G': 'guh', 'H': 'huh', 'I': 'ih', 'J': 'juh',
'K': 'kuh', 'L': 'luh', 'M': 'muh', 'N': 'nuh', 'O': 'ah',
'P': 'puh', 'Q': 'kwuh', 'R': 'ruh', 'S': 'sss', 'T': 'tuh',
'U': 'uh', 'V': 'vuh', 'W': 'wuh', 'X': 'ks', 'Y': 'yuh', 'Z': 'zzz'
};
let currentIndex = 0;
let stars = 0;
let learnedLetters = new Set();
const colors = ['#FF6B9D', '#4ECDC4', '#FFE66D', '#A8E6CF', '#FF8B94', '#C7CEEA'];
function updateDisplay(letter) {
const display = document.getElementById('letterDisplay');
display.textContent = letter;
display.style.color = colors[Math.floor(Math.random() * colors.length)];
const name = document.getElementById('letterName');
name.textContent = `${letter} is for ${letterNames[letter]}!`;
}
function speakLetter() {
const letter = document.getElementById('letterDisplay').textContent;
// Award star
stars++;
document.getElementById('stars').textContent = stars;
// Mark as learned
if (!learnedLetters.has(letter)) {
learnedLetters.add(letter);
updateAlphabetGrid();
}
// Show celebration
celebrate('🎉');
// Simulate speech (in real implementation, use Web Speech API)
const name = document.getElementById('letterName');
name.textContent = `${letter}! ${letter} says "${letterSounds[letter]}"`;
// Change color
const display = document.getElementById('letterDisplay');
display.style.color = colors[Math.floor(Math.random() * colors.length)];
// Could use Web Speech API here:
// const utterance = new SpeechSynthesisUtterance(`${letter}. ${letter} is for ${letterNames[letter]}`);
// speechSynthesis.speak(utterance);
}
function nextLetter() {
currentIndex = (currentIndex + 1) % alphabet.length;
updateDisplay(alphabet[currentIndex]);
}
function randomLetter() {
currentIndex = Math.floor(Math.random() * alphabet.length);
updateDisplay(alphabet[currentIndex]);
celebrate('✨');
}
function showAlphabet() {
const grid = document.getElementById('alphabetGrid');
if (grid.style.display === 'none') {
grid.style.display = 'grid';
if (grid.children.length === 0) {
alphabet.forEach(letter => {
const div = document.createElement('div');
div.className = 'alphabet-letter';
div.textContent = letter;
div.onclick = () => {
currentIndex = alphabet.indexOf(letter);
updateDisplay(letter);
speakLetter();
};
grid.appendChild(div);
});
}
} else {
grid.style.display = 'none';
}
}
function updateAlphabetGrid() {
const grid = document.getElementById('alphabetGrid');
if (grid.children.length > 0) {
Array.from(grid.children).forEach((div, i) => {
if (learnedLetters.has(alphabet[i])) {
div.classList.add('learned');
}
});
}
}
function celebrate(emoji) {
const celebration = document.createElement('div');
celebration.className = 'celebration';
celebration.textContent = emoji;
document.body.appendChild(celebration);
setTimeout(() => celebration.remove(), 1000);
}
// Initialize
updateDisplay(alphabet[0]);
// Encourage interaction
setTimeout(() => {
const name = document.getElementById('letterName');
name.textContent = '👆 Click the letter to hear it!';
}, 3000);
</script>
</body>
</html>
功能:
用户提问: "练习一年级的视觉词"
教师生成: 包含以下内容的互动探险游戏:
用户提问: "帮助提高阅读理解能力"
教师生成: 包含以下内容的互动故事工作坊:
活动:
示例代码:
function createLetterMatch() {
const uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
const lowercase = 'abcdefghijklmnopqrstuvwxyz'.split('');
// Shuffle and match pairs
const pairs = uppercase.map((u, i) => ({
upper: u,
lower: lowercase[i],
matched: false
}));
return pairs;
}
活动:
示例:
const wordFamilies = {
'at': ['cat', 'bat', 'rat', 'hat', 'mat', 'sat'],
'an': ['can', 'man', 'pan', 'ran', 'van', 'fan'],
'ig': ['big', 'dig', 'fig', 'pig', 'wig', 'jig']
};
function generateWordFamily(family) {
return wordFamilies[family].map(word => ({
word: word,
letters: word.split(''),
sound: `/${family}/`
}));
}
高频词 (Dolch/Fry 列表):
学前班:
const preK = ['a', 'and', 'away', 'big', 'blue', 'can', 'come',
'down', 'find', 'for', 'funny', 'go', 'help', 'here',
'I', 'in', 'is', 'it', 'jump', 'little', 'look', 'make',
'me', 'my', 'not', 'one', 'play', 'red', 'run', 'said',
'see', 'the', 'three', 'to', 'two', 'up', 'we', 'where',
'yellow', 'you'];
一年级:
const firstGrade = ['after', 'again', 'an', 'any', 'as', 'ask', 'by',
'could', 'every', 'fly', 'from', 'give', 'going',
'had', 'has', 'her', 'him', 'his', 'how', 'just',
'know', 'let', 'live', 'may', 'of', 'old', 'once',
'open', 'over', 'put', 'round', 'some', 'stop',
'take', 'thank', 'them', 'then', 'think', 'walk',
'were', 'when'];
互动视觉词游戏:
function createSightWordChallenge(wordList, timeLimit = 60) {
let score = 0;
let currentWord = '';
let timeRemaining = timeLimit;
function nextWord() {
currentWord = wordList[Math.floor(Math.random() * wordList.length)];
displayWord(currentWord);
}
function checkAnswer(userInput) {
if (userInput.toLowerCase() === currentWord.toLowerCase()) {
score++;
celebrate();
nextWord();
}
}
return { nextWord, checkAnswer, score };
}
策略:
互动问题:
const comprehensionQuestions = {
'The Cat and the Hat': [
{
question: 'Who are the main characters?',
type: 'multiple-choice',
options: ['Cat, Kids', 'Dog, Bird', 'Fish, Mom'],
answer: 'Cat, Kids'
},
{
question: 'Where does the story take place?',
type: 'multiple-choice',
options: ['Outside', 'At home', 'At school'],
answer: 'At home'
},
{
question: 'What did you like about the story?',
type: 'open-ended',
encouragement: 'Great thinking!'
}
]
};
组件:
const storyElements = {
characters: ['🐱 Cat', '🐶 Dog', '🦊 Fox', '🐻 Bear', '🦁 Lion'],
settings: ['🏠 House', '🌳 Forest', '🏖️ Beach', '🏰 Castle', '🚀 Space'],
problems: ['Lost something', 'Made a friend', 'Went on adventure', 'Solved mystery'],
solutions: ['Found it!', 'Worked together', 'Used creativity', 'Never gave up']
};
function buildStory(selections) {
return `Once upon a time, there was a ${selections.character}.
The ${selections.character} lived in a ${selections.setting}.
One day, the ${selections.character} ${selections.problem}.
In the end, ${selections.solution}!`;
}
const progressReport = {
childName: 'Emma',
age: 6,
level: 'Beginning Reader',
stats: {
lettersLearned: 26,
sightWordsMastered: 45,
storiesCompleted: 12,
currentStreak: 7,
totalTimeMinutes: 240
},
strengths: ['Letter recognition', 'Phonics', 'Enthusiasm'],
workingOn: ['Sight words', 'Reading fluency'],
nextSteps: ['Practice high-frequency words', 'Read aloud daily']
};
function speakText(text, rate = 1.0) {
if ('speechSynthesis' in window) {
const utterance = new SpeechSynthesisUtterance(text);
utterance.rate = rate;
utterance.pitch = 1.2; // Higher pitch for kids
utterance.volume = 1.0;
speechSynthesis.speak(utterance);
} else {
// Fallback: show text with pronunciation guide
showPronunciation(text);
}
}
function createWordBuilder(targetWord) {
const letters = targetWord.split('');
const scrambled = shuffle([...letters]);
let builtWord = [];
function addLetter(letter) {
builtWord.push(letter);
updateDisplay();
if (builtWord.join('') === targetWord) {
celebrate('Correct!');
return true;
}
return false;
}
function removeLetter() {
builtWord.pop();
updateDisplay();
}
return { addLetter, removeLetter, scrambled };
}
class FluencyTracker {
constructor(text) {
this.text = text;
this.wordCount = text.split(' ').length;
this.startTime = null;
this.endTime = null;
}
start() {
this.startTime = Date.now();
}
stop() {
this.endTime = Date.now();
return this.calculate();
}
calculate() {
const seconds = (this.endTime - this.startTime) / 1000;
const minutes = seconds / 60;
const wpm = Math.round(this.wordCount / minutes);
return {
wordsPerMinute: wpm,
timeSeconds: seconds,
wordCount: this.wordCount,
rating: this.getRating(wpm)
};
}
getRating(wpm) {
// Age-appropriate WPM benchmarks
if (wpm >= 100) return '🏆 Excellent!';
if (wpm >= 70) return '⭐ Great job!';
if (wpm >= 50) return '👍 Good work!';
return '💪 Keep practicing!';
}
}
所有内容包含在 /references 中:
所有脚本在 /scripts 中:
✅ 使用大而清晰的字体 (初学者至少 24pt) ✅ 包含音频发音 ✅ 提供即时积极反馈 ✅ 使用色彩丰富、引人入胜的视觉效果 ✅ 庆祝每一次成功 ✅ 保持会话简短 (5-15 分钟) ✅ 使其充满游戏性和趣味性 ✅ 可视化地追踪进度
❌ 使用复杂词汇 ❌ 显示负面反馈 ❌ 活动时间过长 ❌ 使用小或难以阅读的文本 ❌ 跳过音频支持 ❌ 使其感觉像工作 ❌ 用太多选择压倒孩子 ❌ 忘记庆祝进步
幼儿 (2岁):
"教我的幼儿学习字母表"
生成:带有可点击字母、发音、动画和追踪功能的互动字母乐园
幼儿园 (5岁):
"帮助学习 CVC 单词"
生成:带有 cat, bat, rat 的词族游戏 - 拖放字母构建并伴有发音
一年级 (6岁):
"练习视觉词"
生成:带有计时挑战、句子和进度徽章的视觉词探险
二年级 (7岁):
"阅读理解练习"
生成:带有嵌入式问题、词汇帮助和奖励的互动故事
此技能通过以下方式改变阅读教育:
"每个孩子都能在正确的支持和鼓励下学会阅读。" 📚
用法: 请求任何阅读技能方面的帮助 - 字母识别、自然拼读、视觉词、阅读理解 - 即可获得即时、互动的学习体验,并根据您孩子的水平量身定制!
每周安装数
116
代码库
GitHub 星标数
99
首次出现
2026年1月22日
安全审计
安装于
opencode103
codex98
gemini-cli97
cursor94
github-copilot91
amp85
An interactive, playful reading teacher that instantly generates engaging learning experiences through interactive artifacts, visual playgrounds, and gamified challenges for young learners.
Transforms reading education into interactive, visual experiences:
Traditional reading instruction:
With this skill:
Skills:
Activities:
Skills:
Activities:
Skills:
Activities:
Skills:
Activities:
User asks: "Help my toddler learn letters"
Teacher generates:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>🌈 Letter Land Adventure!</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Comic Sans MS', 'Chalkboard SE', cursive, sans-serif;
background: linear-gradient(135deg, #a8edea 0%, #fed6e3 100%);
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
padding: 20px;
color: #333;
}
.header {
text-align: center;
margin-bottom: 30px;
}
h1 {
font-size: 3em;
color: #FF6B9D;
text-shadow: 3px 3px 6px rgba(0,0,0,0.1);
margin-bottom: 10px;
}
.stars {
font-size: 2em;
background: rgba(255,255,255,0.8);
padding: 10px 30px;
border-radius: 30px;
display: inline-block;
}
.letter-display {
background: white;
width: 400px;
height: 400px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 15em;
font-weight: bold;
color: #FF6B9D;
box-shadow: 0 20px 60px rgba(0,0,0,0.2);
margin: 20px;
cursor: pointer;
transition: all 0.3s ease;
user-select: none;
}
.letter-display:hover {
transform: scale(1.05);
box-shadow: 0 30px 80px rgba(0,0,0,0.3);
}
.letter-display:active {
transform: scale(0.95);
}
.controls {
display: flex;
gap: 20px;
margin: 20px;
flex-wrap: wrap;
justify-content: center;
}
.btn {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
padding: 20px 40px;
font-size: 1.5em;
border-radius: 20px;
cursor: pointer;
transition: transform 0.2s;
font-weight: bold;
box-shadow: 0 10px 25px rgba(0,0,0,0.2);
}
.btn:hover { transform: translateY(-5px); }
.btn:active { transform: translateY(0); }
.letter-name {
font-size: 2em;
margin: 20px;
color: #667eea;
font-weight: bold;
}
.celebration {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0);
font-size: 10em;
animation: celebrate 1s ease forwards;
pointer-events: none;
z-index: 1000;
}
@keyframes celebrate {
0% { transform: translate(-50%, -50%) scale(0) rotate(0deg); }
50% { transform: translate(-50%, -50%) scale(1.5) rotate(180deg); }
100% { transform: translate(-50%, -50%) scale(1) rotate(360deg); opacity: 0; }
}
.alphabet-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));
gap: 10px;
max-width: 800px;
margin: 20px;
}
.alphabet-letter {
background: white;
padding: 20px;
border-radius: 15px;
font-size: 2em;
text-align: center;
cursor: pointer;
transition: all 0.2s;
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
font-weight: bold;
color: #667eea;
}
.alphabet-letter:hover {
transform: scale(1.1);
background: #FFD700;
}
.alphabet-letter.learned {
background: #4CAF50;
color: white;
}
@media (max-width: 768px) {
.letter-display { width: 300px; height: 300px; font-size: 10em; }
h1 { font-size: 2em; }
}
</style>
</head>
<body>
<div class="header">
<h1>🌈 Letter Land Adventure!</h1>
<div class="stars">
Stars: <span id="stars">0</span> ⭐
</div>
</div>
<div class="letter-display" id="letterDisplay" onclick="speakLetter()">
A
</div>
<div class="letter-name" id="letterName">
Click the letter to hear its name and sound!
</div>
<div class="controls">
<button class="btn" onclick="nextLetter()">Next Letter ➡️</button>
<button class="btn" onclick="randomLetter()">Random Letter 🎲</button>
<button class="btn" onclick="showAlphabet()">Show All 🔤</button>
</div>
<div class="alphabet-grid" id="alphabetGrid" style="display: none;"></div>
<script>
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
const letterNames = {
'A': 'Apple', 'B': 'Ball', 'C': 'Cat', 'D': 'Dog', 'E': 'Elephant',
'F': 'Fish', 'G': 'Goat', 'H': 'Hat', 'I': 'Ice Cream', 'J': 'Juice',
'K': 'Kite', 'L': 'Lion', 'M': 'Moon', 'N': 'Nest', 'O': 'Orange',
'P': 'Pig', 'Q': 'Queen', 'R': 'Rabbit', 'S': 'Sun', 'T': 'Tiger',
'U': 'Umbrella', 'V': 'Violin', 'W': 'Whale', 'X': 'X-ray', 'Y': 'Yellow', 'Z': 'Zebra'
};
const letterSounds = {
'A': 'ah', 'B': 'buh', 'C': 'kuh', 'D': 'duh', 'E': 'eh',
'F': 'fuh', 'G': 'guh', 'H': 'huh', 'I': 'ih', 'J': 'juh',
'K': 'kuh', 'L': 'luh', 'M': 'muh', 'N': 'nuh', 'O': 'ah',
'P': 'puh', 'Q': 'kwuh', 'R': 'ruh', 'S': 'sss', 'T': 'tuh',
'U': 'uh', 'V': 'vuh', 'W': 'wuh', 'X': 'ks', 'Y': 'yuh', 'Z': 'zzz'
};
let currentIndex = 0;
let stars = 0;
let learnedLetters = new Set();
const colors = ['#FF6B9D', '#4ECDC4', '#FFE66D', '#A8E6CF', '#FF8B94', '#C7CEEA'];
function updateDisplay(letter) {
const display = document.getElementById('letterDisplay');
display.textContent = letter;
display.style.color = colors[Math.floor(Math.random() * colors.length)];
const name = document.getElementById('letterName');
name.textContent = `${letter} is for ${letterNames[letter]}!`;
}
function speakLetter() {
const letter = document.getElementById('letterDisplay').textContent;
// Award star
stars++;
document.getElementById('stars').textContent = stars;
// Mark as learned
if (!learnedLetters.has(letter)) {
learnedLetters.add(letter);
updateAlphabetGrid();
}
// Show celebration
celebrate('🎉');
// Simulate speech (in real implementation, use Web Speech API)
const name = document.getElementById('letterName');
name.textContent = `${letter}! ${letter} says "${letterSounds[letter]}"`;
// Change color
const display = document.getElementById('letterDisplay');
display.style.color = colors[Math.floor(Math.random() * colors.length)];
// Could use Web Speech API here:
// const utterance = new SpeechSynthesisUtterance(`${letter}. ${letter} is for ${letterNames[letter]}`);
// speechSynthesis.speak(utterance);
}
function nextLetter() {
currentIndex = (currentIndex + 1) % alphabet.length;
updateDisplay(alphabet[currentIndex]);
}
function randomLetter() {
currentIndex = Math.floor(Math.random() * alphabet.length);
updateDisplay(alphabet[currentIndex]);
celebrate('✨');
}
function showAlphabet() {
const grid = document.getElementById('alphabetGrid');
if (grid.style.display === 'none') {
grid.style.display = 'grid';
if (grid.children.length === 0) {
alphabet.forEach(letter => {
const div = document.createElement('div');
div.className = 'alphabet-letter';
div.textContent = letter;
div.onclick = () => {
currentIndex = alphabet.indexOf(letter);
updateDisplay(letter);
speakLetter();
};
grid.appendChild(div);
});
}
} else {
grid.style.display = 'none';
}
}
function updateAlphabetGrid() {
const grid = document.getElementById('alphabetGrid');
if (grid.children.length > 0) {
Array.from(grid.children).forEach((div, i) => {
if (learnedLetters.has(alphabet[i])) {
div.classList.add('learned');
}
});
}
}
function celebrate(emoji) {
const celebration = document.createElement('div');
celebration.className = 'celebration';
celebration.textContent = emoji;
document.body.appendChild(celebration);
setTimeout(() => celebration.remove(), 1000);
}
// Initialize
updateDisplay(alphabet[0]);
// Encourage interaction
setTimeout(() => {
const name = document.getElementById('letterName');
name.textContent = '👆 Click the letter to hear it!';
}, 3000);
</script>
</body>
</html>
Features:
User asks: "Practice sight words for first grade"
Teacher generates: Interactive safari game with:
User asks: "Help with reading comprehension"
Teacher generates: Interactive story workshop with:
Activities:
Example Code:
function createLetterMatch() {
const uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
const lowercase = 'abcdefghijklmnopqrstuvwxyz'.split('');
// Shuffle and match pairs
const pairs = uppercase.map((u, i) => ({
upper: u,
lower: lowercase[i],
matched: false
}));
return pairs;
}
Activities:
Example:
const wordFamilies = {
'at': ['cat', 'bat', 'rat', 'hat', 'mat', 'sat'],
'an': ['can', 'man', 'pan', 'ran', 'van', 'fan'],
'ig': ['big', 'dig', 'fig', 'pig', 'wig', 'jig']
};
function generateWordFamily(family) {
return wordFamilies[family].map(word => ({
word: word,
letters: word.split(''),
sound: `/${family}/`
}));
}
High-Frequency Words (Dolch/Fry Lists):
Pre-K:
const preK = ['a', 'and', 'away', 'big', 'blue', 'can', 'come',
'down', 'find', 'for', 'funny', 'go', 'help', 'here',
'I', 'in', 'is', 'it', 'jump', 'little', 'look', 'make',
'me', 'my', 'not', 'one', 'play', 'red', 'run', 'said',
'see', 'the', 'three', 'to', 'two', 'up', 'we', 'where',
'yellow', 'you'];
First Grade:
const firstGrade = ['after', 'again', 'an', 'any', 'as', 'ask', 'by',
'could', 'every', 'fly', 'from', 'give', 'going',
'had', 'has', 'her', 'him', 'his', 'how', 'just',
'know', 'let', 'live', 'may', 'of', 'old', 'once',
'open', 'over', 'put', 'round', 'some', 'stop',
'take', 'thank', 'them', 'then', 'think', 'walk',
'were', 'when'];
Interactive Sight Word Game:
function createSightWordChallenge(wordList, timeLimit = 60) {
let score = 0;
let currentWord = '';
let timeRemaining = timeLimit;
function nextWord() {
currentWord = wordList[Math.floor(Math.random() * wordList.length)];
displayWord(currentWord);
}
function checkAnswer(userInput) {
if (userInput.toLowerCase() === currentWord.toLowerCase()) {
score++;
celebrate();
nextWord();
}
}
return { nextWord, checkAnswer, score };
}
Strategies:
Interactive Questions:
const comprehensionQuestions = {
'The Cat and the Hat': [
{
question: 'Who are the main characters?',
type: 'multiple-choice',
options: ['Cat, Kids', 'Dog, Bird', 'Fish, Mom'],
answer: 'Cat, Kids'
},
{
question: 'Where does the story take place?',
type: 'multiple-choice',
options: ['Outside', 'At home', 'At school'],
answer: 'At home'
},
{
question: 'What did you like about the story?',
type: 'open-ended',
encouragement: 'Great thinking!'
}
]
};
Components:
Character selection
Setting choices
Problem/solution structure
Sequence of events
Ending options
Illustration tools
const storyElements = { characters: ['🐱 Cat', '🐶 Dog', '🦊 Fox', '🐻 Bear', '🦁 Lion'], settings: ['🏠 House', '🌳 Forest', '🏖️ Beach', '🏰 Castle', '🚀 Space'], problems: ['Lost something', 'Made a friend', 'Went on adventure', 'Solved mystery'], solutions: ['Found it!', 'Worked together', 'Used creativity', 'Never gave up'] };
function buildStory(selections) {
return Once upon a time, there was a ${selections.character}. The ${selections.character} lived in a ${selections.setting}. One day, the ${selections.character} ${selections.problem}. In the end, ${selections.solution}!;
}
const progressReport = {
childName: 'Emma',
age: 6,
level: 'Beginning Reader',
stats: {
lettersLearned: 26,
sightWordsMastered: 45,
storiesCompleted: 12,
currentStreak: 7,
totalTimeMinutes: 240
},
strengths: ['Letter recognition', 'Phonics', 'Enthusiasm'],
workingOn: ['Sight words', 'Reading fluency'],
nextSteps: ['Practice high-frequency words', 'Read aloud daily']
};
function speakText(text, rate = 1.0) {
if ('speechSynthesis' in window) {
const utterance = new SpeechSynthesisUtterance(text);
utterance.rate = rate;
utterance.pitch = 1.2; // Higher pitch for kids
utterance.volume = 1.0;
speechSynthesis.speak(utterance);
} else {
// Fallback: show text with pronunciation guide
showPronunciation(text);
}
}
function createWordBuilder(targetWord) {
const letters = targetWord.split('');
const scrambled = shuffle([...letters]);
let builtWord = [];
function addLetter(letter) {
builtWord.push(letter);
updateDisplay();
if (builtWord.join('') === targetWord) {
celebrate('Correct!');
return true;
}
return false;
}
function removeLetter() {
builtWord.pop();
updateDisplay();
}
return { addLetter, removeLetter, scrambled };
}
class FluencyTracker {
constructor(text) {
this.text = text;
this.wordCount = text.split(' ').length;
this.startTime = null;
this.endTime = null;
}
start() {
this.startTime = Date.now();
}
stop() {
this.endTime = Date.now();
return this.calculate();
}
calculate() {
const seconds = (this.endTime - this.startTime) / 1000;
const minutes = seconds / 60;
const wpm = Math.round(this.wordCount / minutes);
return {
wordsPerMinute: wpm,
timeSeconds: seconds,
wordCount: this.wordCount,
rating: this.getRating(wpm)
};
}
getRating(wpm) {
// Age-appropriate WPM benchmarks
if (wpm >= 100) return '🏆 Excellent!';
if (wpm >= 70) return '⭐ Great job!';
if (wpm >= 50) return '👍 Good work!';
return '💪 Keep practicing!';
}
}
All included in /references:
All in /scripts:
✅ Use large, clear fonts (minimum 24pt for beginners) ✅ Include audio pronunciation ✅ Provide immediate positive feedback ✅ Use colorful, engaging visuals ✅ Celebrate every success ✅ Keep sessions short (5-15 minutes) ✅ Make it playful and fun ✅ Track progress visibly
❌ Use complex vocabulary ❌ Show negative feedback ❌ Make activities too long ❌ Use small or hard-to-read text ❌ Skip audio support ❌ Make it feel like work ❌ Overwhelm with too many choices ❌ Forget to celebrate progress
Toddler (Age 2):
"Teach my toddler the alphabet"
Generates: Interactive Letter Land with clickable letters, sounds, animations, and tracking
Kindergarten (Age 5):
"Help with CVC words"
Generates: Word family game with cat, bat, rat - drag-and-drop letter building with sounds
First Grade (Age 6):
"Practice sight words"
Generates: Sight Word Safari with timed challenges, sentences, and progress badges
Second Grade (Age 7):
"Reading comprehension practice"
Generates: Interactive story with embedded questions, vocabulary help, and rewards
This skill transforms reading education by:
"Every child can learn to read with the right support and encouragement." 📚
Usage: Ask for help with any reading skill - letter recognition, phonics, sight words, comprehension - and get an instant, interactive learning experience tailored to your child's level!
Weekly Installs
116
Repository
GitHub Stars
99
First Seen
Jan 22, 2026
Security Audits
Gen Agent Trust HubFailSocketPassSnykPass
Installed on
opencode103
codex98
gemini-cli97
cursor94
github-copilot91
amp85
dbs-hook:短视频开头优化AI工具,诊断开头问题并生成优化方案,提升视频吸引力
1,700 周安装
Xcode MCP 设置指南:连接 Claude、Cursor、VS Code 等 AI 助手到 Xcode 开发环境
101 周安装
Kotlin Multiplatform AGP 9.0 迁移指南:解决插件兼容性与项目重构
71 周安装
Vercel安全与访问控制:RBAC、SSO、部署保护、防火墙、审计日志配置指南
98 周安装
Better Auth Core - TypeScript身份验证库,支持无状态会话和社交登录
104 周安装
Medusa 开源无头电商系统 - 基于 Node.js 和 TypeScript 的完全可定制电商平台
95 周安装
Rust嵌入式开发:no_std、中断安全与硬件所有权领域约束实践指南
182 周安装