feat: Puente Mayúscula-Minúscula + TTS SpeechSynthesis + E2E fixes

This commit is contained in:
renato97
2026-07-21 15:31:46 -03:00
commit fa8e0c58ce
120 changed files with 16013 additions and 0 deletions
+95
View File
@@ -0,0 +1,95 @@
import type { Stage } from '../types'
const restas = [
{ a: 2, b: 1, r: 1, emoji: '🍎-🍎' },
{ a: 3, b: 1, r: 2, emoji: '🍎🍎-🍎' },
{ a: 3, b: 2, r: 1, emoji: '🍎🍎-🍎🍎' },
{ a: 4, b: 1, r: 3, emoji: '🍪🍪🍪🍪-🍪' },
{ a: 4, b: 2, r: 2, emoji: '🍪🍪🍪🍪-🍪🍪' },
{ a: 5, b: 1, r: 4, emoji: '⭐-⭐' },
{ a: 5, b: 2, r: 3, emoji: '⭐⭐-⭐⭐' },
{ a: 5, b: 3, r: 2, emoji: '⭐⭐⭐-⭐⭐⭐' },
{ a: 5, b: 4, r: 1, emoji: '⭐⭐⭐⭐-⭐⭐⭐⭐' },
{ a: 6, b: 1, r: 5, emoji: '🌸-🌸' },
{ a: 6, b: 2, r: 4, emoji: '🌸🌸-🌸🌸' },
{ a: 6, b: 3, r: 3, emoji: '🌸🌸🌸-🌸🌸🌸' },
{ a: 7, b: 2, r: 5, emoji: '🌻🌻-🌻🌻' },
{ a: 7, b: 3, r: 4, emoji: '🌻🌻🌻-🌻🌻🌻' },
{ a: 8, b: 3, r: 5, emoji: '🍄🍄🍄-🍄🍄🍄' },
{ a: 8, b: 4, r: 4, emoji: '🍄🍄🍄🍄-🍄🍄🍄🍄' },
{ a: 9, b: 4, r: 5, emoji: '🍂🍂🍂🍂-🍂🍂🍂🍂' },
{ a: 9, b: 5, r: 4, emoji: '🍂🍂🍂🍂🍂-🍂🍂🍂🍂🍂' },
{ a: 10, b: 1, r: 9, emoji: '💎-💎' },
{ a: 10, b: 2, r: 8, emoji: '💎💎-💎💎' },
{ a: 10, b: 3, r: 7, emoji: '💎💎💎-💎💎💎' },
{ a: 10, b: 4, r: 6, emoji: '💎💎💎💎-💎💎💎💎' },
{ a: 10, b: 5, r: 5, emoji: '💎💎💎💎💎-💎💎💎💎💎' },
{ a: 8, b: 5, r: 3, emoji: '🍀🍀🍀🍀🍀-🍀🍀🍀🍀🍀' },
{ a: 7, b: 5, r: 2, emoji: '🌺🌺🌺🌺🌺-🌺🌺🌺🌺🌺' },
{ a: 6, b: 5, r: 1, emoji: '🌷🌷🌷🌷🌷-🌷🌷🌷🌷🌷' },
]
const exercises: any[] = []
for (const { a, b, r, emoji } of restas) {
exercises.push({
id: `num6-resta-${a}-${b}`,
stage: 6,
skillCode: 'resta',
type: 'problema',
prerequisites: a <= 5 ? ['num5-suma-visual-1-1'] : [`num6-resta-${a - 1}-${Math.max(1, b - 1)}` || 'num5-suma-10-1'],
content: {
instruction: `¿Cuánto es ${a} - ${b}?`,
text: `${a} - ${b} = ?`,
audioText: `${a} menos ${b}`,
emoji,
options: [
...Array.from({ length: 4 }, (_, i) => r - 2 + i + (i >= 2 ? 2 : 0))
.filter(j => j >= 0 && j <= 10 && j !== r)
.slice(0, 2)
.map(j => ({ label: String(j), correct: false, id: String(j) })),
{ label: String(r), correct: true, id: String(r) },
].sort(() => Math.random() - 0.5),
},
functionalContext: 'Restar números pequeños.',
errorType: 'discriminacion-auditiva',
})
}
// Visual subtraction: take away
const visuales = [
{ a: 3, b: 1, r: 2 },
{ a: 4, b: 2, r: 2 },
{ a: 5, b: 3, r: 2 },
]
for (const { a, b, r } of visuales) {
exercises.push({
id: `num6-resta-visual-${a}-${b}`,
stage: 6,
skillCode: 'resta-visual',
type: 'conciencia',
prerequisites: [`num6-resta-${a}-${b}`],
content: {
instruction: `${a} - ${b} = ? Sacamos ${b}`,
text: `${'🟢'.repeat(a)}\nSacamos ${'🔴'.repeat(b)}\nQuedan...`,
audioText: `Sacamos ${b}, quedan ${r}`,
options: [
{ label: '🟢'.repeat(r), correct: true, id: String(r) },
{ label: '🟢'.repeat(r + 2), correct: false, id: String(r + 2) },
{ label: '🟢'.repeat(Math.max(1, r + 1)), correct: false, id: String(r + 1) },
],
emoji: '',
},
functionalContext: 'Visualizar la resta como quitar elementos.',
errorType: 'discriminacion-auditiva',
})
}
const stage: Stage = {
id: 6,
name: 'Restas simples (1-10)',
description: 'Restar números del 1 al 10 con ayudas visuales.',
exercises,
}
export default stage