- {!output &&
Click "Run Code" to execute tests...}
+ {!output &&
Click "Run Code" to execute tests...}
{output && (
-
+
{title || "Resumen"}
-
diff --git a/web/experience/src/components/blocks/DocumentPlayer.tsx b/web/experience/src/components/blocks/DocumentPlayer.tsx
index 977ff2d..d0bf000 100644
--- a/web/experience/src/components/blocks/DocumentPlayer.tsx
+++ b/web/experience/src/components/blocks/DocumentPlayer.tsx
@@ -26,14 +26,14 @@ export default function DocumentPlayer({ id, title, url }: DocumentPlayerProps)
return (
-
+
{title || "Material de Lectura"}
{isPdf ? (
-
+
{/* Overlay Controls */}
-
+
Vista Previa
@@ -65,13 +65,13 @@ export default function DocumentPlayer({ id, title, url }: DocumentPlayerProps)
) : (
-
+
-
Documento Adjunto
-
+
Documento Adjunto
+
Este archivo no puede previsualizarse. Descárgalo para leerlo.
diff --git a/web/experience/src/components/blocks/FillInTheBlanksPlayer.tsx b/web/experience/src/components/blocks/FillInTheBlanksPlayer.tsx
index 9fbdbb8..d121390 100644
--- a/web/experience/src/components/blocks/FillInTheBlanksPlayer.tsx
+++ b/web/experience/src/components/blocks/FillInTheBlanksPlayer.tsx
@@ -45,13 +45,13 @@ export default function FillInTheBlanksPlayer({ id, title, content, allowRetry =
return (
-
+
{title || "Rellena los Espacios en Blanco"}
-
-
+
+
{parsed.parts.map((part, i) => (
part.type === 'text' ? (
{part.value}
@@ -67,8 +67,8 @@ export default function FillInTheBlanksPlayer({ id, title, content, allowRetry =
}}
disabled={submitted}
className={`mx-1 px-2 py-0 border-b-2 bg-transparent transition-all focus:outline-none text-center rounded-t-sm ${submitted
- ? (isCorrect(part.index!) ? "border-green-500 text-green-400 bg-green-500/10" : "border-red-500 text-red-100 bg-red-500/10")
- : "border-blue-500/30 focus:border-blue-500 text-blue-400 focus:bg-blue-500/5"
+ ? (isCorrect(part.index!) ? "border-green-600 dark:border-green-500 text-green-700 dark:text-green-400 bg-green-500/10" : "border-red-600 dark:border-red-500 text-red-700 dark:text-red-100 bg-red-500/10")
+ : "border-blue-600/30 dark:border-blue-500/30 focus:border-blue-600 dark:focus:border-blue-500 text-blue-700 dark:text-blue-400 focus:bg-blue-600/5 dark:focus:bg-blue-500/5"
}`}
style={{ width: `${Math.max((part.answer?.length || 5) * 12, 60)}px` }}
placeholder="..."
@@ -91,7 +91,7 @@ export default function FillInTheBlanksPlayer({ id, title, content, allowRetry =
{submitted && (
diff --git a/web/experience/src/components/blocks/HotspotPlayer.tsx b/web/experience/src/components/blocks/HotspotPlayer.tsx
index 4a08738..cabb70a 100644
--- a/web/experience/src/components/blocks/HotspotPlayer.tsx
+++ b/web/experience/src/components/blocks/HotspotPlayer.tsx
@@ -68,18 +68,18 @@ export default function HotspotPlayer({
return (
-
+
-
{title}
-
{description}
+
{title}
+
{description}
-
+
{found.length} / {hotspots.length} FOUND
@@ -88,7 +88,7 @@ export default function HotspotPlayer({
{found.includes(h.id) ? : }
diff --git a/web/experience/src/components/blocks/MatchingPlayer.tsx b/web/experience/src/components/blocks/MatchingPlayer.tsx
index d753244..96678cf 100644
--- a/web/experience/src/components/blocks/MatchingPlayer.tsx
+++ b/web/experience/src/components/blocks/MatchingPlayer.tsx
@@ -40,21 +40,21 @@ export default function MatchingPlayer({ id, title, pairs, allowRetry = true }:
return (
-
+
{title || "Emparejamiento de Conceptos"}
-
+
-
+
{(pairs || []).map((pair, i) => (
-
+
{shuffledRight.map((item, i) => {
const matchedLeftIdx = Object.keys(matches).find(k => matches[parseInt(k)] === item.originalIdx);
const isCorrect = submitted && matchedLeftIdx !== undefined && parseInt(matchedLeftIdx) === item.originalIdx;
@@ -74,11 +74,11 @@ export default function MatchingPlayer({ id, title, pairs, allowRetry = true }:
key={i}
disabled={selectedLeft === null || submitted}
onClick={() => handleMatch(selectedLeft!, item.originalIdx)}
- className={`w-full p-4 rounded-xl border text-left text-sm font-bold transition-all ${selectedLeft !== null && matchedLeftIdx === undefined ? "hover:border-blue-500/50 hover:bg-white/5" : ""
- } ${isCorrect ? "border-green-500 bg-green-500/20 text-green-400" :
- isWrong ? "border-red-500 bg-red-500/20 text-red-100" :
- matchedLeftIdx !== undefined ? "border-blue-500/30 bg-blue-500/5 text-blue-400" :
- "border-white/5 bg-white/5 text-gray-200"
+ className={`w-full p-4 rounded-xl border text-left text-sm font-bold transition-all ${selectedLeft !== null && matchedLeftIdx === undefined ? "hover:border-blue-600/50 dark:hover:border-blue-500/50 hover:bg-black/5 dark:hover:bg-white/5" : ""
+ } ${isCorrect ? "border-green-600 dark:border-green-500 bg-green-500/20 text-green-700 dark:text-green-400" :
+ isWrong ? "border-red-600 dark:border-red-500 bg-red-500/20 text-red-700 dark:text-red-100" :
+ matchedLeftIdx !== undefined ? "border-blue-600/30 dark:border-blue-500/30 bg-blue-600/5 dark:bg-blue-500/5 text-blue-700 dark:text-blue-400" :
+ "border-black/5 dark:border-white/5 bg-black/5 dark:bg-white/5 text-gray-800 dark:text-gray-200"
}`}
>
@@ -104,7 +104,7 @@ export default function MatchingPlayer({ id, title, pairs, allowRetry = true }:
{submitted && (
diff --git a/web/experience/src/components/blocks/MediaPlayer.tsx b/web/experience/src/components/blocks/MediaPlayer.tsx
index 52f529c..d406fc2 100644
--- a/web/experience/src/components/blocks/MediaPlayer.tsx
+++ b/web/experience/src/components/blocks/MediaPlayer.tsx
@@ -95,14 +95,14 @@ export default function MediaPlayer({ id, lessonId, title, url, media_type, conf
if (locked) {
return (
-
{title || "Contenido Multimedia"}
-
-
+
{title || "Contenido Multimedia"}
+
+
-
Contenido Bloqueado
-
+
Contenido Bloqueado
+
Has alcanzado el límite de {maxPlays} reproducciones para este contenido.
@@ -135,9 +135,9 @@ export default function MediaPlayer({ id, lessonId, title, url, media_type, conf
return (
-
{title || "Contenido Multimedia"}
+
{title || "Contenido Multimedia"}
{maxPlays > 0 && (
-
+
{playCount} / {maxPlays} REPRODUCCIONES
)}
@@ -196,9 +196,9 @@ export default function MediaPlayer({ id, lessonId, title, url, media_type, conf
{!isLocalFile && playCount === 0 && (
-
@@ -213,8 +213,8 @@ export default function MediaPlayer({ id, lessonId, title, url, media_type, conf
)}
{/* Question Overlay */}
{activeMarker && (
-
-
+
+
Quick Check
@@ -259,9 +259,9 @@ export default function MediaPlayer({ id, lessonId, title, url, media_type, conf
}}
className={`px-4 py-3 rounded-xl font-medium transition-all text-left ${feedback
? idx === activeMarker.correctIndex
- ? "bg-green-500 text-white"
- : feedback.isCorrect === false && "bg-red-500 text-white"
- : "bg-gray-100 hover:bg-blue-500 hover:text-white"
+ ? "bg-green-600 dark:bg-green-500 text-white"
+ : feedback.isCorrect === false && "bg-red-600 dark:bg-red-500 text-white"
+ : "bg-black/5 dark:bg-gray-800 hover:bg-blue-600 dark:hover:bg-blue-500 hover:text-white"
}`}
>
{option}
diff --git a/web/experience/src/components/blocks/MemoryPlayer.tsx b/web/experience/src/components/blocks/MemoryPlayer.tsx
index 7186b9e..3b4f8f1 100644
--- a/web/experience/src/components/blocks/MemoryPlayer.tsx
+++ b/web/experience/src/components/blocks/MemoryPlayer.tsx
@@ -105,8 +105,8 @@ export default function MemoryPlayer({
-
{title}
-
+
{title}
+
Brain Training
Level: Beginner
@@ -114,16 +114,16 @@ export default function MemoryPlayer({
-
+
Moves
-
{moves}
+
{moves}
@@ -138,8 +138,8 @@ export default function MemoryPlayer({
{/* Card Front (Hidden) */}
-
-
+
+
{/* Card Back (Content) */}
@@ -166,8 +166,8 @@ export default function MemoryPlayer({
-
BRAVO!
-
+
BRAVO!
+
Finished in {moves} moves
diff --git a/web/experience/src/components/blocks/OrderingPlayer.tsx b/web/experience/src/components/blocks/OrderingPlayer.tsx
index 8417570..4aabf94 100644
--- a/web/experience/src/components/blocks/OrderingPlayer.tsx
+++ b/web/experience/src/components/blocks/OrderingPlayer.tsx
@@ -36,15 +36,15 @@ export default function OrderingPlayer({ id, title, items, allowRetry = true }:
return (
-
+
{title || "Ordenamiento de Secuencia"}
-
+
-
+
{shuffledItems.map((item, i) => {
const isPicked = userOrder.includes(item.originalIdx);
@@ -53,8 +53,8 @@ export default function OrderingPlayer({ id, title, items, allowRetry = true }:
key={i}
disabled={isPicked || submitted}
onClick={() => handlePick(item.originalIdx)}
- className={`px-6 py-3 rounded-full border text-sm font-bold transition-all ${isPicked ? "opacity-20 grayscale border-white/5 bg-white/5" :
- "border-white/10 bg-white/5 text-gray-200 hover:border-blue-500/50 hover:bg-blue-500/5"
+ className={`px-6 py-3 rounded-full border text-sm font-bold transition-all ${isPicked ? "opacity-20 grayscale border-black/5 dark:border-white/5 bg-black/5 dark:bg-white/5" :
+ "border-black/10 dark:border-white/10 bg-black/5 dark:bg-white/5 text-gray-800 dark:text-gray-200 hover:border-blue-600/50 dark:hover:border-blue-500/50 hover:bg-blue-600/5 dark:hover:bg-blue-500/5"
}`}
>
{item.value}
@@ -65,9 +65,9 @@ export default function OrderingPlayer({ id, title, items, allowRetry = true }:
-
+
- {userOrder.length === 0 &&
Haz clic en los elementos para construir la secuencia...
}
+ {userOrder.length === 0 &&
Haz clic en los elementos para construir la secuencia...
}
{userOrder.map((idx, i) => {
const isItemCorrect = submitted && idx === i;
const isItemWrong = submitted && idx !== i;
@@ -76,9 +76,9 @@ export default function OrderingPlayer({ id, title, items, allowRetry = true }:
!submitted && handlePick(idx)}
- className={`flex items-center gap-4 p-4 rounded-xl border text-sm font-bold transition-all cursor-pointer ${isItemCorrect ? "border-green-500 bg-green-500/20 text-green-400" :
- isItemWrong ? "border-red-500 bg-red-500/20 text-red-100" :
- "border-blue-500/30 bg-blue-500/5 text-blue-400 hover:bg-blue-500/10"
+ className={`flex items-center gap-4 p-4 rounded-xl border text-sm font-bold transition-all cursor-pointer ${isItemCorrect ? "border-green-600 dark:border-green-500 bg-green-500/20 text-green-700 dark:text-green-400" :
+ isItemWrong ? "border-red-600 dark:border-red-500 bg-red-500/20 text-red-700 dark:text-red-100" :
+ "border-blue-600/30 dark:border-blue-500/30 bg-blue-600/5 dark:bg-blue-500/5 text-blue-700 dark:text-blue-400 hover:bg-blue-600/10 dark:hover:bg-blue-500/10"
}`}
>
{i + 1}.
@@ -106,7 +106,7 @@ export default function OrderingPlayer({ id, title, items, allowRetry = true }:
{submitted && (
diff --git a/web/experience/src/components/blocks/QuizPlayer.tsx b/web/experience/src/components/blocks/QuizPlayer.tsx
index 810b8c1..b4e0c2b 100644
--- a/web/experience/src/components/blocks/QuizPlayer.tsx
+++ b/web/experience/src/components/blocks/QuizPlayer.tsx
@@ -64,11 +64,11 @@ export default function QuizPlayer({ id, title, quizData, allowRetry = true, max
return (
-
+
{title || "Verificación de Conocimientos"}
{maxAttempts > 0 && (
-
+
Intento {attempts} / {maxAttempts}
)}
@@ -76,8 +76,8 @@ export default function QuizPlayer({ id, title, quizData, allowRetry = true, max
{questions.map((q) => (
-