diff --git a/lessons/21-html-forms-basic.json b/lessons/21-html-forms-basic.json
index 170ba41..9b18d33 100644
--- a/lessons/21-html-forms-basic.json
+++ b/lessons/21-html-forms-basic.json
@@ -48,24 +48,24 @@
{
"id": "input-types",
"title": "Input Types",
- "description": "Different input types provide appropriate keyboards and validation:type=\"text\" - General texttype=\"email\" - Email with @ validationtype=\"password\" - Hidden characterstype=\"number\" - Numeric keyboardtype=\"tel\" - Phone keyboard",
- "task": "Create a login form with two fields: 1. An email field: <label for=\"email\">Email:</label> and <input type=\"email\" id=\"email\"> 2. A password field: <label for=\"password\">Password:</label> and <input type=\"password\" id=\"password\"> ",
+ "description": "Different input types provide appropriate keyboards and validation:type=\"text\" - General texttype=\"email\" - Email with @ validationtype=\"password\" - Hidden characterstype=\"number\" - Numeric keyboardtype=\"tel\" - Phone keyboard",
+ "task": "Create a login form with two fields: 1. An email field: <label for=\"email\">Email:</label> and <input type=\"email\" id=\"email\"> 2. A password field: <label for=\"password\">Password:</label> and <input type=\"password\" id=\"password\"> ",
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 300px; } label { display: block; margin-top: 15px; margin-bottom: 5px; } label:first-child { margin-top: 0; } input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; }",
"sandboxCSS": "",
"initialCode": "
",
- "solution": "",
+ "solution": "",
"previewContainer": "preview-area",
"validations": [
{
"type": "element_exists",
"value": "input[type='email']",
- "message": "Add an input with type=\"email\" "
+ "message": "Add an input with type=\"email\""
},
{
"type": "element_exists",
"value": "input[type='password']",
- "message": "Add an input with type=\"password\" "
+ "message": "Add an input with type=\"password\""
},
{
"type": "element_count",
@@ -82,8 +82,8 @@
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 300px; } label { display: block; margin-top: 15px; margin-bottom: 5px; } label:first-child { margin-top: 0; } input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } button { width: 100%; margin-top: 20px; padding: 10px; background: #1976d2; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; } button:hover { background: #1565c0; }",
"sandboxCSS": "",
- "initialCode": "",
- "solution": "",
+ "initialCode": "",
+ "solution": "",
"previewContainer": "preview-area",
"validations": [
{
diff --git a/lessons/22-html-forms-validation.json b/lessons/22-html-forms-validation.json
index b35bb8f..b00fff0 100644
--- a/lessons/22-html-forms-validation.json
+++ b/lessons/22-html-forms-validation.json
@@ -14,8 +14,8 @@
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 350px; } label { display: block; margin-top: 15px; margin-bottom: 5px; } label:first-of-type { margin-top: 0; } input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } input:invalid { border-color: #d32f2f; } button { margin-top: 20px; padding: 10px 20px; background: #1976d2; color: white; border: none; border-radius: 4px; cursor: pointer; }",
"sandboxCSS": "",
- "initialCode": "",
- "solution": "",
+ "initialCode": "",
+ "solution": "",
"previewContainer": "preview-area",
"validations": [
{
@@ -38,8 +38,8 @@
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 350px; } label { display: block; margin-bottom: 5px; } input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } input:invalid:not(:placeholder-shown) { border-color: #d32f2f; } small { display: block; font-size: 12px; color: #666; margin-top: 4px; } button { margin-top: 20px; padding: 10px 20px; background: #1976d2; color: white; border: none; border-radius: 4px; cursor: pointer; }",
"sandboxCSS": "",
- "initialCode": "",
- "solution": "",
+ "initialCode": "",
+ "solution": "",
"previewContainer": "preview-area",
"validations": [
{
@@ -62,13 +62,13 @@
{
"id": "complete-registration",
"title": "Complete Registration Form",
- "description": "Build a complete registration form with all validation concepts: - Required fields marked with * - Email validation (use type=\"email\" ) - Password with length constraints - Terms checkbox (required) - Submit button",
+ "description": "Build a complete registration form with all validation concepts: - Required fields marked with * - Email validation (use type=\"email\") - Password with length constraints - Terms checkbox (required) - Submit button",
"task": "Complete the registration form. Add required attributes, proper input types, and validation constraints.",
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 400px; background: #f5f5f5; padding: 25px; border-radius: 8px; } h2 { margin-top: 0; margin-bottom: 20px; } label { display: block; margin-top: 15px; margin-bottom: 5px; font-weight: 500; } input[type='text'], input[type='email'], input[type='password'] { width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; font-size: 14px; } input:focus { outline: 2px solid #1976d2; border-color: transparent; } input[type='checkbox'] { width: auto; margin-right: 8px; vertical-align: middle; } label:has(input[type='checkbox']) { display: flex; align-items: center; font-weight: normal; } button { width: 100%; margin-top: 20px; padding: 12px; background: #1976d2; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; font-weight: 500; } button:hover { background: #1565c0; }",
"sandboxCSS": "",
"initialCode": "",
- "solution": "",
+ "solution": "",
"previewContainer": "preview-area",
"validations": [
{
diff --git a/lessons/28-html-forms-fieldset.json b/lessons/28-html-forms-fieldset.json
index 4b71c48..7abc27c 100644
--- a/lessons/28-html-forms-fieldset.json
+++ b/lessons/28-html-forms-fieldset.json
@@ -15,7 +15,7 @@
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; background: #f0f4f8; } form { max-width: 400px; } fieldset { border: 2px solid #3498db; border-radius: 10px; padding: 20px; background: white; } legend { color: #3498db; font-weight: 600; padding: 0 10px; font-size: 1.1rem; } label { display: block; margin: 15px 0 5px; color: #333; font-weight: 500; } input { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 16px; box-sizing: border-box; } input:focus { outline: 2px solid #3498db; border-color: transparent; }",
"sandboxCSS": "",
"initialCode": "",
- "solution": "",
+ "solution": "",
"previewContainer": "preview-area",
"validations": [
{
@@ -54,7 +54,7 @@
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; margin: 0; box-sizing: border-box; } form { max-width: 450px; margin: 0 auto; } fieldset { border: none; border-radius: 15px; padding: 30px; background: white; box-shadow: 0 10px 40px rgba(0,0,0,0.2); } legend { color: #667eea; font-weight: 700; padding: 0; font-size: 1.5rem; margin-bottom: 10px; } label { display: block; margin: 20px 0 8px; color: #333; font-weight: 500; } input, textarea { width: 100%; padding: 12px; border: 2px solid #e0e0e0; border-radius: 8px; font-size: 16px; box-sizing: border-box; font-family: inherit; } input:focus, textarea:focus { outline: none; border-color: #667eea; } textarea { resize: vertical; min-height: 100px; } button { margin-top: 20px; width: 100%; padding: 14px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; } button:hover { opacity: 0.9; }",
"sandboxCSS": "",
"initialCode": "",
- "solution": "",
+ "solution": "\n \n Contact Us \n Email: \n \n Message: \n \n Send Message \n \n ",
"previewContainer": "preview-area",
"validations": [
{
@@ -93,7 +93,7 @@
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; background: #fafafa; } form { max-width: 500px; } fieldset { border: 1px solid #ddd; border-radius: 10px; padding: 20px; margin-bottom: 20px; background: white; } legend { color: #2c3e50; font-weight: 600; padding: 0 10px; } label { display: block; margin: 15px 0 5px; color: #555; } input, textarea { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 16px; box-sizing: border-box; font-family: inherit; } input:focus, textarea:focus { outline: 2px solid #3498db; border-color: transparent; } textarea { resize: vertical; min-height: 80px; } button { width: 100%; padding: 14px; background: #2c3e50; color: white; border: none; border-radius: 8px; font-size: 16px; cursor: pointer; } button:hover { background: #34495e; }",
"sandboxCSS": "",
"initialCode": "",
- "solution": "\n \n Account Info \n Username: \n \n Password: \n \"password\" id=\"password\" name=\"password\">\n \n \n Preferences \n Bio: \n \n \n Register \n ",
+ "solution": "\n \n Account Info \n Username: \n \n Password: \n \n \n \n Preferences \n Bio: \n \n \n Register \n ",
"previewContainer": "preview-area",
"validations": [
{
diff --git a/lessons/de/21-html-forms-basic.json b/lessons/de/21-html-forms-basic.json
index 66c92e1..122690c 100644
--- a/lessons/de/21-html-forms-basic.json
+++ b/lessons/de/21-html-forms-basic.json
@@ -48,24 +48,24 @@
{
"id": "input-types",
"title": "Eingabetypen",
- "description": "Verschiedene Eingabetypen bieten passende Tastaturen und Validierung:type=\"text\" - Allgemeiner Texttype=\"email\" - E-Mail mit @-Validierungtype=\"password\" - Versteckte Zeichentype=\"number\" - Numerische Tastaturtype=\"tel\" - Telefon-Tastatur",
- "task": "Erstelle ein Anmeldeformular mit zwei Feldern: 1. Ein E-Mail-Feld: <label for=\"email\">E-Mail:</label> und <input type=\"email\" id=\"email\"> 2. Ein Passwort-Feld: <label for=\"password\">Passwort:</label> und <input type=\"password\" id=\"password\"> ",
+ "description": "Verschiedene Eingabetypen bieten passende Tastaturen und Validierung:type=\"text\" - Allgemeiner Texttype=\"email\" - E-Mail mit @-Validierungtype=\"password\" - Versteckte Zeichentype=\"number\" - Numerische Tastaturtype=\"tel\" - Telefon-Tastatur",
+ "task": "Erstelle ein Anmeldeformular mit zwei Feldern: 1. Ein E-Mail-Feld: <label for=\"email\">E-Mail:</label> und <input type=\"email\" id=\"email\"> 2. Ein Passwort-Feld: <label for=\"password\">Passwort:</label> und <input type=\"password\" id=\"password\"> ",
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 300px; } label { display: block; margin-top: 15px; margin-bottom: 5px; } label:first-child { margin-top: 0; } input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; }",
"sandboxCSS": "",
"initialCode": "\n \n ",
- "solution": "\n E-Mail: \n \"email\" id=\"email\" name=\"email\">\n \n Passwort: \n \"password\" id=\"password\" name=\"password\">\n ",
+ "solution": "\n E-Mail: \n \n \n Passwort: \n \n ",
"previewContainer": "preview-area",
"validations": [
{
"type": "element_exists",
"value": "input[type='email']",
- "message": "Füge eine Eingabe mit type=\"email\" hinzu"
+ "message": "Füge eine Eingabe mit type=\"email\" hinzu"
},
{
"type": "element_exists",
"value": "input[type='password']",
- "message": "Füge eine Eingabe mit type=\"password\" hinzu"
+ "message": "Füge eine Eingabe mit type=\"password\" hinzu"
},
{
"type": "element_count",
@@ -82,8 +82,8 @@
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 300px; } label { display: block; margin-top: 15px; margin-bottom: 5px; } label:first-child { margin-top: 0; } input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } button { width: 100%; margin-top: 20px; padding: 10px; background: #1976d2; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; } button:hover { background: #1565c0; }",
"sandboxCSS": "",
- "initialCode": "\n E-Mail: \n \"email\" id=\"email\">\n \n Passwort: \n \"password\" id=\"password\">\n \n \n ",
- "solution": "\n E-Mail: \n \"email\" id=\"email\">\n \n Passwort: \n \"password\" id=\"password\">\n \n Anmelden \n ",
+ "initialCode": "\n E-Mail: \n \n \n Passwort: \n \n \n \n ",
+ "solution": "\n E-Mail: \n \n \n Passwort: \n \n \n Anmelden \n ",
"previewContainer": "preview-area",
"validations": [
{
diff --git a/lessons/de/22-html-forms-validation.json b/lessons/de/22-html-forms-validation.json
index 4ffd7f6..34c6a34 100644
--- a/lessons/de/22-html-forms-validation.json
+++ b/lessons/de/22-html-forms-validation.json
@@ -14,8 +14,8 @@
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 350px; } label { display: block; margin-top: 15px; margin-bottom: 5px; } label:first-of-type { margin-top: 0; } input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } input:invalid { border-color: #d32f2f; } button { margin-top: 20px; padding: 10px 20px; background: #1976d2; color: white; border: none; border-radius: 4px; cursor: pointer; }",
"sandboxCSS": "",
- "initialCode": "\n Name: * \n \n \n E-Mail: * \n \"email\" id=\"email\" name=\"email\">\n \n Absenden \n ",
- "solution": "\n Name: * \n \n \n E-Mail: * \n \"email\" id=\"email\" name=\"email\" required>\n \n Absenden \n ",
+ "initialCode": "\n Name: * \n \n \n E-Mail: * \n \n \n Absenden \n ",
+ "solution": "\n Name: * \n \n \n E-Mail: * \n \n \n Absenden \n ",
"previewContainer": "preview-area",
"validations": [
{
@@ -38,8 +38,8 @@
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 350px; } label { display: block; margin-bottom: 5px; } input { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } input:invalid:not(:placeholder-shown) { border-color: #d32f2f; } small { display: block; font-size: 12px; color: #666; margin-top: 4px; } button { margin-top: 20px; padding: 10px 20px; background: #1976d2; color: white; border: none; border-radius: 4px; cursor: pointer; }",
"sandboxCSS": "",
- "initialCode": "\n Passwort: \n \"password\" id=\"password\" name=\"password\" required aria-describedby=\"password-hint\">\n Muss 8-20 Zeichen lang sein \n \n Konto erstellen \n ",
- "solution": "\n Passwort: \n \"password\" id=\"password\" name=\"password\" required minlength=\"8\" maxlength=\"20\" placeholder=\"Passwort eingeben\" aria-describedby=\"password-hint\">\n Muss 8-20 Zeichen lang sein \n \n Konto erstellen \n ",
+ "initialCode": "\n Passwort: \n \n Muss 8-20 Zeichen lang sein \n \n Konto erstellen \n ",
+ "solution": "\n Passwort: \n \n Muss 8-20 Zeichen lang sein \n \n Konto erstellen \n ",
"previewContainer": "preview-area",
"validations": [
{
@@ -62,13 +62,13 @@
{
"id": "complete-registration",
"title": "Vollständiges Registrierungsformular",
- "description": "Erstelle ein vollständiges Registrierungsformular mit allen Validierungskonzepten: - Pflichtfelder mit * markiert - E-Mail-Validierung (type=\"email\" verwenden) - Passwort mit Längenbeschränkungen - AGB-Checkbox (Pflichtfeld) - Absende-Button",
+ "description": "Erstelle ein vollständiges Registrierungsformular mit allen Validierungskonzepten: - Pflichtfelder mit * markiert - E-Mail-Validierung (type=\"email\" verwenden) - Passwort mit Längenbeschränkungen - AGB-Checkbox (Pflichtfeld) - Absende-Button",
"task": "Vervollständige das Registrierungsformular. Füge required -Attribute, passende Eingabetypen und Validierungsbeschränkungen hinzu.",
"previewHTML": "",
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; } form { max-width: 400px; background: #f5f5f5; padding: 25px; border-radius: 8px; } h2 { margin-top: 0; margin-bottom: 20px; } label { display: block; margin-top: 15px; margin-bottom: 5px; font-weight: 500; } input[type='text'], input[type='email'], input[type='password'] { width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; font-size: 14px; } input:focus { outline: 2px solid #1976d2; border-color: transparent; } input[type='checkbox'] { width: auto; margin-right: 8px; vertical-align: middle; } label:has(input[type='checkbox']) { display: flex; align-items: center; font-weight: normal; } button { width: 100%; margin-top: 20px; padding: 12px; background: #1976d2; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; font-weight: 500; } button:hover { background: #1565c0; }",
"sandboxCSS": "",
"initialCode": "\n Konto erstellen \n \n Vollständiger Name * \n \n \n E-Mail * \n \n \n Passwort * \n \n \n \n \n Ich stimme den Nutzungsbedingungen zu *\n \n \n Registrieren \n ",
- "solution": "\n Konto erstellen \n \n Vollständiger Name * \n \n \n E-Mail * \n \"email\" id=\"email\" name=\"email\" required>\n \n Passwort * \n \"password\" id=\"password\" name=\"password\" required minlength=\"8\">\n \n \n \n Ich stimme den Nutzungsbedingungen zu *\n \n \n Registrieren \n ",
+ "solution": "\n Konto erstellen \n \n Vollständiger Name * \n \n \n E-Mail * \n \n \n Passwort * \n \n \n \n \n Ich stimme den Nutzungsbedingungen zu *\n \n \n Registrieren \n ",
"previewContainer": "preview-area",
"validations": [
{
diff --git a/lessons/de/28-html-forms-fieldset.json b/lessons/de/28-html-forms-fieldset.json
index 8b8365e..17b0699 100644
--- a/lessons/de/28-html-forms-fieldset.json
+++ b/lessons/de/28-html-forms-fieldset.json
@@ -15,7 +15,7 @@
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; background: #f0f4f8; } form { max-width: 400px; } fieldset { border: 2px solid #3498db; border-radius: 10px; padding: 20px; background: white; } legend { color: #3498db; font-weight: 600; padding: 0 10px; font-size: 1.1rem; } label { display: block; margin: 15px 0 5px; color: #333; font-weight: 500; } input { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 16px; box-sizing: border-box; } input:focus { outline: 2px solid #3498db; border-color: transparent; }",
"sandboxCSS": "",
"initialCode": "",
- "solution": "\n \n Persönliche Daten \n Name: \n \n E-Mail: \n \"email\" id=\"email\" name=\"email\">\n \n ",
+ "solution": "\n \n Persönliche Daten \n Name: \n \n E-Mail: \n \n \n ",
"previewContainer": "preview-area",
"validations": [
{
@@ -54,7 +54,7 @@
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; margin: 0; box-sizing: border-box; } form { max-width: 450px; margin: 0 auto; } fieldset { border: none; border-radius: 15px; padding: 30px; background: white; box-shadow: 0 10px 40px rgba(0,0,0,0.2); } legend { color: #667eea; font-weight: 700; padding: 0; font-size: 1.5rem; margin-bottom: 10px; } label { display: block; margin: 20px 0 8px; color: #333; font-weight: 500; } input, textarea { width: 100%; padding: 12px; border: 2px solid #e0e0e0; border-radius: 8px; font-size: 16px; box-sizing: border-box; font-family: inherit; } input:focus, textarea:focus { outline: none; border-color: #667eea; } textarea { resize: vertical; min-height: 100px; } button { margin-top: 20px; width: 100%; padding: 14px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; } button:hover { opacity: 0.9; }",
"sandboxCSS": "",
"initialCode": "",
- "solution": "\n \n Kontaktiere uns \n E-Mail: \n \"email\" id=\"email\" name=\"email\">\n Nachricht: \n \n Nachricht senden \n \n ",
+ "solution": "\n \n Kontaktiere uns \n E-Mail: \n \n Nachricht: \n \n Nachricht senden \n \n ",
"previewContainer": "preview-area",
"validations": [
{
@@ -93,7 +93,7 @@
"previewBaseCSS": "body { font-family: system-ui; padding: 20px; background: #fafafa; } form { max-width: 500px; } fieldset { border: 1px solid #ddd; border-radius: 10px; padding: 20px; margin-bottom: 20px; background: white; } legend { color: #2c3e50; font-weight: 600; padding: 0 10px; } label { display: block; margin: 15px 0 5px; color: #555; } input, textarea { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 16px; box-sizing: border-box; font-family: inherit; } input:focus, textarea:focus { outline: 2px solid #3498db; border-color: transparent; } textarea { resize: vertical; min-height: 80px; } button { width: 100%; padding: 14px; background: #2c3e50; color: white; border: none; border-radius: 8px; font-size: 16px; cursor: pointer; } button:hover { background: #34495e; }",
"sandboxCSS": "",
"initialCode": "",
- "solution": "\n \n Kontodaten \n Benutzername: \n \n Passwort: \n \"password\" id=\"password\" name=\"password\">\n \n \n Einstellungen \n Bio: \n \n \n Registrieren \n ",
+ "solution": "\n \n Kontodaten \n Benutzername: \n \n Passwort: \n \n \n \n Einstellungen \n Bio: \n \n \n Registrieren \n ",
"previewContainer": "preview-area",
"validations": [
{