{ "$schema": "../../schemas/code-crispies-module-schema.json", "id": "units-variables", "title": "CSS Einheiten & Variablen", "description": "Verstehe die Vielfalt der CSS-Maßeinheiten und wie du Custom Properties für wartbare Stile definierst und verwendest.", "difficulty": "beginner", "lessons": [ { "id": "units-1", "title": "Absolute vs. Relative Einheiten", "description": "Lerne den Unterschied zwischen px, rem, em, % und vw/vh für flexible, responsive Layouts.", "task": "Setze die Breite von .box auf 80% und max-width auf 37.5rem.", "previewHTML": "
Ändere meine Größe!
", "previewBaseCSS": "body { font-family: sans-serif; padding: 1rem; } .box { background: #f5f5f5; padding: 1rem; }", "sandboxCSS": "", "codePrefix": "/* Setze flexible Größen */\n.box {", "initialCode": "", "codeSuffix": "}", "previewContainer": "preview-area", "validations": [ { "type": "contains", "value": "width", "message": "Verwende die width Eigenschaft", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "width", "expected": "80%" }, "message": "Setze width auf 80%" }, { "type": "contains", "value": "max-width", "message": "Verwende die max-width Eigenschaft", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "max-width", "expected": "37.5rem" }, "message": "Setze max-width auf 37.5rem" } ] }, { "id": "units-2", "title": "CSS Custom Properties", "description": "Definiere und verwende Variablen (--custom properties) wieder, um deine Theme-Werte zu zentralisieren.", "task": "Erstelle eine --main-color Variable in :root mit #6200ee und wende sie als Rahmenfarbe auf .themed an.", "previewHTML": "
Variablen-Box
", "previewBaseCSS": "body { font-family: sans-serif; padding: 1rem; } .themed { padding: 1rem; border: 0.125rem solid #ddd; }", "sandboxCSS": "", "codePrefix": "/* Definiere und verwende eine CSS-Variable */\n:root {", "initialCode": "", "codeSuffix": "}\n.themed { }", "previewContainer": "preview-area", "validations": [ { "type": "contains", "value": "--main-color", "message": "Definiere --main-color in :root", "options": { "caseSensitive": false } }, { "type": "contains", "value": "var(--main-color)", "message": "Verwende var(--main-color)", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "border", "expected": "var(--main-color)" }, "message": "Wende die Variable auf die Rahmenfarbe an", "options": { "exact": false } } ] }, { "id": "units-3", "title": "Einheiten-Berechnungen (calc)", "description": "Verwende die calc() Funktion, um verschiedene Einheiten in einem Ausdruck zu kombinieren.", "task": "Setze die Breite von .sized auf calc(100% - 2rem) und min-height auf calc(10vh + 1rem).", "previewHTML": "
Calc Demo
", "previewBaseCSS": "body { font-family: sans-serif; padding: 1rem; } .sized { background: #e8f5e9; padding: 1rem; }", "sandboxCSS": "", "codePrefix": "/* Verwende calc für dynamische Größen */\n.sized {", "initialCode": "", "codeSuffix": "}", "previewContainer": "preview-area", "validations": [ { "type": "contains", "value": "calc", "message": "Verwende die calc() Funktion", "options": { "caseSensitive": false } }, { "type": "regex", "value": "width:\\s*calc\\(100% - 2rem\\)", "message": "Width sollte calc(100% - 2rem) sein", "options": { "caseSensitive": false } }, { "type": "regex", "value": "min-height:\\s*calc\\(10vh \\+ 1rem\\)", "message": "Min-height sollte calc(10vh + 1rem) sein", "options": { "caseSensitive": false } } ] }, { "id": "units-4", "title": "Viewport & Responsive Einheiten", "description": "Steuere Layouts relativ zur Viewport-Größe mit vw, vh und vmin/vmax Einheiten.", "task": "Gib .view eine Breite von 50vw und Höhe von 20vh.", "previewHTML": "
Viewport-Box
", "previewBaseCSS": "body { font-family: sans-serif; padding: 1rem; } .view { background: #ffe0b2; }", "sandboxCSS": "", "codePrefix": "/* Verwende Viewport-Einheiten */\n.view {", "initialCode": "", "codeSuffix": "}", "previewContainer": "preview-area", "validations": [ { "type": "contains", "value": "vw", "message": "Verwende vw Einheit", "options": { "caseSensitive": false } }, { "type": "contains", "value": "vh", "message": "Verwende vh Einheit", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "width", "expected": "50vw" }, "message": "Setze width auf 50vw" }, { "type": "property_value", "value": { "property": "height", "expected": "20vh" }, "message": "Setze height auf 20vh" } ] } ] }