diff --git a/lessons/00-welcome.json b/lessons/00-welcome.json
index 570b7e6..8dd3301 100644
--- a/lessons/00-welcome.json
+++ b/lessons/00-welcome.json
@@ -27,20 +27,20 @@
},
{
"id": "get-started",
- "title": "Get Started!",
- "description": "You're ready! Open the menu (☰) to explore all modules.
Recommended learning path:
1. HTML Block & Inline - Understand container vs inline elements
2. HTML Forms - Build interactive forms with validation
3. CSS Selectors - Target elements precisely
4. CSS Box Model - Master padding, margin, borders
5. CSS Flexbox - Create flexible layouts
6. CSS Animations - Add motion and transitions
Tips:
• Use Show Expected to see the target result
• Your progress is saved automatically
• Try Emmet in HTML mode: ul>li*3 + Tab
Open Source:
• GitHub · Gitea
• Made by librete.ch · LinkedIn",
- "task": "Let's go!",
- "previewHTML": "
Hello World! 🌍
Hallo Welt!
Bonjour le monde!
¡Hola Mundo!
Ciao Mondo!
こんにちは世界!
Привет мир!
مرحبا بالعالم!
", - "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 16px; } p { margin: 8px 0; padding: 8px 16px; border-radius: 8px; font-weight: 600; } p:nth-child(1) { background: #fef3c7; color: #92400e; font-size: 1.4em; } p:nth-child(2) { background: #dcfce7; color: #166534; font-size: 1.2em; } p:nth-child(3) { background: #dbeafe; color: #1e40af; font-size: 1.1em; } p:nth-child(4) { background: #fce7f3; color: #9d174d; } p:nth-child(5) { background: #e0e7ff; color: #4338ca; font-size: 1.3em; } p:nth-child(6) { background: #fef9c3; color: #854d0e; } p:nth-child(7) { background: #fee2e2; color: #991b1b; font-size: 1.1em; } p:nth-child(8) { background: #f3e8ff; color: #7c3aed; }", + "title": "Good Luck!", + "description": "You're ready! Open the menu (☰) to explore all modules.Hello World! 🌍
Hallo Welt!
Bonjour le monde!
¡Hola Mundo!
Ciao Mondo!
Olá Mundo!
こんにちは世界!
你好世界!
안녕 세상!
Привет мир!
שלום עולם!
مرحبا بالعالم!
", + "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 12px; } p { margin: 6px 0; padding: 6px 12px; border-radius: 6px; font-weight: 600; font-size: 0.95em; } p:nth-child(1) { background: #fef3c7; color: #92400e; font-size: 1.2em; } p:nth-child(2) { background: #dcfce7; color: #166534; } p:nth-child(3) { background: #dbeafe; color: #1e40af; } p:nth-child(4) { background: #fce7f3; color: #9d174d; } p:nth-child(5) { background: #e0e7ff; color: #4338ca; } p:nth-child(6) { background: #fef9c3; color: #854d0e; } p:nth-child(7) { background: #fee2e2; color: #991b1b; } p:nth-child(8) { background: #f3e8ff; color: #7c3aed; } p:nth-child(9) { background: #ccfbf1; color: #0f766e; } p:nth-child(10) { background: #fae8ff; color: #86198f; } p:nth-child(11) { background: #fef3c7; color: #b45309; } p:nth-child(12) { background: #d1fae5; color: #047857; }", "sandboxCSS": "", - "initialCode": "Hello World! 🌍
\nHallo Welt!
\nBonjour le monde!
\n¡Hola Mundo!
\nCiao Mondo!
\nこんにちは世界!
\nПривет мир!
\nمرحبا بالعالم!
", - "solution": "Hello World! 🌍
\nHallo Welt!
\nBonjour le monde!
\n¡Hola Mundo!
\nCiao Mondo!
\nこんにちは世界!
\nПривет мир!
\nمرحبا بالعالم!
", + "initialCode": "Hello World! 🌍
\nHallo Welt!
\nBonjour le monde!
\n¡Hola Mundo!
\nCiao Mondo!
\nOlá Mundo!
\nこんにちは世界!
\n你好世界!
\n안녕 세상!
\nПривет мир!
\nשלום עולם!
\nمرحبا بالعالم!
", + "solution": "Hello World! 🌍
\nHallo Welt!
\nBonjour le monde!
\n¡Hola Mundo!
\nCiao Mondo!
\nOlá Mundo!
\nこんにちは世界!
\n你好世界!
\n안녕 세상!
\nПривет мир!
\nשלום עולם!
\nمرحبا بالعالم!
", "previewContainer": "preview-area", "validations": [ { "type": "contains", - "value": "go", - "message": "Write 'Let's go!'" + "value": "Hello", + "message": "Click Next to continue" } ] } diff --git a/lessons/de/00-welcome.json b/lessons/de/00-welcome.json index 385b8a7..6b55cd3 100644 --- a/lessons/de/00-welcome.json +++ b/lessons/de/00-welcome.json @@ -27,20 +27,20 @@ }, { "id": "get-started", - "title": "Los geht's!", - "description": "Du bist bereit! Öffne das Menü (☰) um alle Module zu erkunden.Hello World! 🌍
Hallo Welt!
Bonjour le monde!
¡Hola Mundo!
Ciao Mondo!
こんにちは世界!
Привет мир!
مرحبا بالعالم!
", - "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 16px; } p { margin: 8px 0; padding: 8px 16px; border-radius: 8px; font-weight: 600; } p:nth-child(1) { background: #fef3c7; color: #92400e; font-size: 1.4em; } p:nth-child(2) { background: #dcfce7; color: #166534; font-size: 1.2em; } p:nth-child(3) { background: #dbeafe; color: #1e40af; font-size: 1.1em; } p:nth-child(4) { background: #fce7f3; color: #9d174d; } p:nth-child(5) { background: #e0e7ff; color: #4338ca; font-size: 1.3em; } p:nth-child(6) { background: #fef9c3; color: #854d0e; } p:nth-child(7) { background: #fee2e2; color: #991b1b; font-size: 1.1em; } p:nth-child(8) { background: #f3e8ff; color: #7c3aed; }", + "title": "Viel Erfolg!", + "description": "Du bist bereit! Öffne das Menü (☰) um alle Module zu erkunden.Hello World! 🌍
Hallo Welt!
Bonjour le monde!
¡Hola Mundo!
Ciao Mondo!
Olá Mundo!
こんにちは世界!
你好世界!
안녕 세상!
Привет мир!
שלום עולם!
مرحبا بالعالم!
", + "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 12px; } p { margin: 6px 0; padding: 6px 12px; border-radius: 6px; font-weight: 600; font-size: 0.95em; } p:nth-child(1) { background: #fef3c7; color: #92400e; font-size: 1.2em; } p:nth-child(2) { background: #dcfce7; color: #166534; } p:nth-child(3) { background: #dbeafe; color: #1e40af; } p:nth-child(4) { background: #fce7f3; color: #9d174d; } p:nth-child(5) { background: #e0e7ff; color: #4338ca; } p:nth-child(6) { background: #fef9c3; color: #854d0e; } p:nth-child(7) { background: #fee2e2; color: #991b1b; } p:nth-child(8) { background: #f3e8ff; color: #7c3aed; } p:nth-child(9) { background: #ccfbf1; color: #0f766e; } p:nth-child(10) { background: #fae8ff; color: #86198f; } p:nth-child(11) { background: #fef3c7; color: #b45309; } p:nth-child(12) { background: #d1fae5; color: #047857; }", "sandboxCSS": "", - "initialCode": "Hello World! 🌍
\nHallo Welt!
\nBonjour le monde!
\n¡Hola Mundo!
\nCiao Mondo!
\nこんにちは世界!
\nПривет мир!
\nمرحبا بالعالم!
", - "solution": "Hello World! 🌍
\nHallo Welt!
\nBonjour le monde!
\n¡Hola Mundo!
\nCiao Mondo!
\nこんにちは世界!
\nПривет мир!
\nمرحبا بالعالم!
", + "initialCode": "Hello World! 🌍
\nHallo Welt!
\nBonjour le monde!
\n¡Hola Mundo!
\nCiao Mondo!
\nOlá Mundo!
\nこんにちは世界!
\n你好世界!
\n안녕 세상!
\nПривет мир!
\nשלום עולם!
\nمرحبا بالعالم!
", + "solution": "Hello World! 🌍
\nHallo Welt!
\nBonjour le monde!
\n¡Hola Mundo!
\nCiao Mondo!
\nOlá Mundo!
\nこんにちは世界!
\n你好世界!
\n안녕 세상!
\nПривет мир!
\nשלום עולם!
\nمرحبا بالعالم!
", "previewContainer": "preview-area", "validations": [ { "type": "contains", - "value": "geht", - "message": "Schreibe 'Los geht's!'" + "value": "Hello", + "message": "Klicke auf Weiter" } ] } diff --git a/lessons/de/06-transitions-animations.json b/lessons/de/06-transitions-animations.json index 80c7976..dd7c3a4 100644 --- a/lessons/de/06-transitions-animations.json +++ b/lessons/de/06-transitions-animations.json @@ -18,7 +18,12 @@ "codeSuffix": "}", "previewContainer": "preview-area", "validations": [ - { "type": "contains", "value": "transition", "message": "Verwende die transition Eigenschaft", "options": { "caseSensitive": false } }, + { + "type": "contains", + "value": "transition", + "message": "Verwende die transition Eigenschaft", + "options": { "caseSensitive": false } + }, { "type": "regex", "value": "transition:\\s*background-color\\s*0\\.3s", @@ -66,14 +71,24 @@ "codeSuffix": "}\n.ball { }", "previewContainer": "preview-area", "validations": [ - { "type": "contains", "value": "@keyframes bounce", "message": "Definiere @keyframes bounce", "options": { "caseSensitive": false } }, + { + "type": "contains", + "value": "@keyframes bounce", + "message": "Definiere @keyframes bounce", + "options": { "caseSensitive": false } + }, { "type": "regex", "value": "50%.*transform: translateY\\(-20px\\)", "message": "Bei 50%, setze transform: translateY(-20px)", "options": { "caseSensitive": false } }, - { "type": "contains", "value": "animation", "message": "Verwende animation Eigenschaft auf .ball", "options": { "caseSensitive": false } }, + { + "type": "contains", + "value": "animation", + "message": "Verwende animation Eigenschaft auf .ball", + "options": { "caseSensitive": false } + }, { "type": "regex", "value": "animation:.*bounce.*1s.*infinite", @@ -113,8 +128,16 @@ "message": "Verwende animation-fill-mode", "options": { "caseSensitive": false } }, - { "type": "property_value", "value": { "property": "animation-duration", "expected": "2s" }, "message": "Setze animation-duration: 2s" }, - { "type": "property_value", "value": { "property": "animation-delay", "expected": "1s" }, "message": "Setze animation-delay: 1s" }, + { + "type": "property_value", + "value": { "property": "animation-duration", "expected": "2s" }, + "message": "Setze animation-duration: 2s" + }, + { + "type": "property_value", + "value": { "property": "animation-delay", "expected": "1s" }, + "message": "Setze animation-delay: 1s" + }, { "type": "property_value", "value": { "property": "animation-iteration-count", "expected": "2" }, diff --git a/src/app.js b/src/app.js index 72d34ea..00214dd 100644 --- a/src/app.js +++ b/src/app.js @@ -603,7 +603,7 @@ function runCode() { elements.previewWrapper?.classList.add("matched"); setTimeout(() => { elements.previewWrapper?.classList.remove("matched"); - }, 5000); + }, 10000); updateNavigationButtons(); updateProgressDisplay(); diff --git a/src/i18n.js b/src/i18n.js index 71f0acc..47cd041 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -83,7 +83,7 @@ const translations = { // Contact contactTitle: "Contact & Links", - contactText: "Code Crispies is developed by librete.ch", + contactText: "Code Crispies is developed by LibreTECH", // Reset dialog resetDialogTitle: "Reset Progress", @@ -182,7 +182,7 @@ const translations = { // Contact contactTitle: "Kontakt & Links", - contactText: "Code Crispies wird von librete.ch entwickelt", + contactText: "Code Crispies wird von LibreTECH entwickelt", // Reset dialog resetDialogTitle: "Fortschritt zurücksetzen", diff --git a/src/index.html b/src/index.html index e29b1a2..a27cca5 100644 --- a/src/index.html +++ b/src/index.html @@ -120,8 +120,9 @@ @@ -163,7 +164,6 @@Code Crispies is developed by librete.ch
+Code Crispies is developed by LibreTECH
diff --git a/src/main.css b/src/main.css index 50967e1..0355b51 100644 --- a/src/main.css +++ b/src/main.css @@ -595,7 +595,7 @@ code, kbd { border-radius: var(--border-radius-lg); font-weight: bold; font-size: 1.1rem; - animation: dvd-bounce 4s ease-in-out infinite; + animation: dvd-bounce 8s ease-in-out infinite; z-index: 10; white-space: nowrap; } @@ -914,7 +914,6 @@ button.lesson-list-item { .editor-tools { display: flex; gap: 4px; - margin-right: var(--spacing-sm); } .btn-ghost { @@ -954,6 +953,11 @@ button.lesson-list-item { border-color: var(--primary-dark); } +/* Hide Run button - live preview is stable */ +#run-btn { + display: none; +} + /* ================= TOGGLE SWITCH ================= */ .toggle-switch { display: flex; @@ -1105,6 +1109,45 @@ input:checked + .toggle-slider::before { margin-top: var(--spacing-lg); } +/* Project Cards in Help Dialog */ +.project-cards { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + margin-bottom: var(--spacing-md); +} + +.project-card { + display: block; + padding: var(--spacing-md); + background: var(--primary-bg-light); + border-radius: var(--border-radius-md); + border: 1px solid var(--primary-bg-medium); + text-decoration: none; + color: var(--text-color); + transition: all 0.2s ease; +} + +.project-card:hover { + background: var(--primary-bg-medium); + border-color: var(--primary-color); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(94, 75, 139, 0.15); +} + +.project-card strong { + display: block; + color: var(--primary-color); + font-size: 1rem; + margin-bottom: 4px; +} + +.project-card span { + font-size: 0.9rem; + color: var(--light-text); + line-height: 1.4; +} + /* ================= FOOTER ================= */ .app-footer { padding: var(--spacing-md);