{ "$schema": "../../schemas/code-crispies-module-schema.json", "id": "html-progress-meter", "title": "HTML Progress & Meter", "description": "Zeige Fortschritt und Messwerte nativ an", "mode": "html", "difficulty": "beginner", "lessons": [ { "id": "progress-basic", "title": "Fortschrittsbalken", "description": "Das <progress>-Element zeigt den Aufgabenfortschritt. Verwende value für den aktuellen Stand und max für das Maximum.

Wichtig: Dies ist kein selbstschließendes Tag! Schreibe <progress>...</progress> mit einem Fallback-Text dazwischen für ältere Browser.", "task": "Erstelle einen Fortschrittsbalken mit 70% Fortschritt:
1. Füge ein <label> mit 'Download:' hinzu
2. Füge ein <progress> mit value=\"70\" und max=\"100\" hinzu", "previewHTML": "", "previewBaseCSS": "body { font-family: system-ui; padding: 20px; } label { display: block; margin-bottom: 8px; font-weight: 500; } progress { width: 100%; height: 20px; border-radius: 10px; } progress::-webkit-progress-bar { background: #e0e0e0; border-radius: 10px; } progress::-webkit-progress-value { background: linear-gradient(90deg, #4caf50, #8bc34a); border-radius: 10px; } progress::-moz-progress-bar { background: linear-gradient(90deg, #4caf50, #8bc34a); border-radius: 10px; }", "sandboxCSS": "", "initialCode": "", "solution": "\n70%", "previewContainer": "preview-area", "validations": [ { "type": "element_exists", "value": "progress", "message": "Füge ein <progress>-Element hinzu" }, { "type": "attribute_value", "value": { "selector": "progress", "attr": "value", "value": "70" }, "message": "Setze value=\"70\" beim Progress-Element" }, { "type": "attribute_value", "value": { "selector": "progress", "attr": "max", "value": "100" }, "message": "Setze max=\"100\" beim Progress-Element" }, { "type": "element_exists", "value": "label", "message": "Füge ein <label> für den Fortschrittsbalken hinzu" } ] }, { "id": "progress-indeterminate", "title": "Unbestimmter Fortschritt", "description": "Wenn der Fortschritt unbekannt ist (wie beim Laden), lasse das value-Attribut weg. Dies erstellt einen animierten unbestimmten Zustand.

Nützlich für Netzwerkanfragen oder Prozesse mit unbekannter Dauer.", "task": "Erstelle eine Ladeanzeige:
1. Füge ein <p> mit 'Lädt...' hinzu
2. Füge ein <progress> ohne value-Attribut hinzu", "previewHTML": "", "previewBaseCSS": "body { font-family: system-ui; padding: 20px; } p { margin-bottom: 10px; color: #666; } progress { width: 100%; height: 8px; border-radius: 4px; } progress::-webkit-progress-bar { background: #e0e0e0; border-radius: 4px; }", "sandboxCSS": "", "initialCode": "", "solution": "

Lädt...

\n", "previewContainer": "preview-area", "validations": [ { "type": "element_exists", "value": "progress", "message": "Füge ein <progress>-Element hinzu" }, { "type": "element_exists", "value": "p", "message": "Füge ein <p> mit Ladetext hinzu" } ] }, { "id": "meter-gauge", "title": "Meter-Anzeigen", "description": "Das <meter>-Element zeigt einen Skalarwert innerhalb eines Bereichs. Verwende es für Messungen wie Speicherplatz, Akku oder Bewertungen.

Setze low, high und optimum, um gute/schlechte Bereiche zu definieren - der Browser färbt es entsprechend ein!", "task": "Erstelle eine Akku-Anzeige:
1. Füge ein <label> mit 'Akku:' hinzu
2. Füge ein <meter> hinzu mit:
- value=\"0.8\"
- min=\"0\" und max=\"1\"
- low=\"0.2\" und high=\"0.8\"
- optimum=\"1\"", "previewHTML": "", "previewBaseCSS": "body { font-family: system-ui; padding: 20px; } label { display: block; margin-bottom: 8px; font-weight: 500; } meter { width: 100%; height: 25px; }", "sandboxCSS": "", "initialCode": "", "solution": "\n80%", "previewContainer": "preview-area", "validations": [ { "type": "element_exists", "value": "meter", "message": "Füge ein <meter>-Element hinzu" }, { "type": "attribute_value", "value": { "selector": "meter", "attr": "value", "value": "0.8" }, "message": "Setze value=\"0.8\" beim Meter" }, { "type": "attribute_value", "value": { "selector": "meter", "attr": "low", "value": "0.2" }, "message": "Setze low=\"0.2\", um den niedrigen Schwellenwert zu definieren" }, { "type": "element_exists", "value": "label", "message": "Füge ein <label> für das Meter hinzu" } ] } ] }