refactor: add HTML/CSS prefixes to German module titles and improve UI

- Shorten German module titles with consistent HTML/CSS prefixes
- Add .completion-badge styling for the lesson title completion badge
- Make sidebar lessons section fill available height on desktop
- Improve flexbox lesson descriptions with more context
This commit is contained in:
2025-12-30 20:38:41 +01:00
parent f66920ac21
commit 9e96be983e
15 changed files with 56 additions and 35 deletions

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "css-basic-selectors", "id": "css-basic-selectors",
"title": "CSS: Grundlegende Selektoren", "title": "CSS Selektoren",
"description": "CSS-Selektoren sind die Grundlage für das Stylen von Webseiten und ermöglichen es dir, bestimmte HTML-Elemente für die Gestaltung auszuwählen. Dieses Modul stellt grundlegende Selektortypen vor, einschließlich Element-Typ-Selektoren, Klassen-Selektoren, ID-Selektoren und des universellen Selektors.", "description": "CSS-Selektoren sind die Grundlage für das Stylen von Webseiten und ermöglichen es dir, bestimmte HTML-Elemente für die Gestaltung auszuwählen. Dieses Modul stellt grundlegende Selektortypen vor, einschließlich Element-Typ-Selektoren, Klassen-Selektoren, ID-Selektoren und des universellen Selektors.",
"difficulty": "beginner", "difficulty": "beginner",
"lessons": [ "lessons": [

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "box-model", "id": "box-model",
"title": "Padding, Borders und Margins", "title": "CSS Box Model",
"description": "Beherrsche die Grundprinzipien der Raumverwaltung im Webdesign durch das CSS Box-Modell.", "description": "Beherrsche die Grundprinzipien der Raumverwaltung im Webdesign durch das CSS Box-Modell.",
"difficulty": "beginner", "difficulty": "beginner",
"lessons": [ "lessons": [

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "units-variables", "id": "units-variables",
"title": "Einheiten, var() und calc()", "title": "CSS Einheiten & Variablen",
"description": "Verstehe die Vielfalt der CSS-Maßeinheiten und wie du Custom Properties für wartbare Stile definierst und verwendest.", "description": "Verstehe die Vielfalt der CSS-Maßeinheiten und wie du Custom Properties für wartbare Stile definierst und verwendest.",
"difficulty": "beginner", "difficulty": "beginner",
"lessons": [ "lessons": [

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "transitions-animations", "id": "transitions-animations",
"title": "Transitions & Animationen", "title": "CSS Animationen",
"description": "Bringe Interaktivität in dein UI durch sanfte Eigenschaftsübergänge und Keyframe-gesteuerte Animationen.", "description": "Bringe Interaktivität in dein UI durch sanfte Eigenschaftsübergänge und Keyframe-gesteuerte Animationen.",
"difficulty": "beginner", "difficulty": "beginner",
"lessons": [ "lessons": [

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "responsive-design", "id": "responsive-design",
"title": "Responsive Design & Media Queries", "title": "CSS Responsive Design",
"description": "Passe deine Layouts an verschiedene Bildschirmgrößen an mit Media Queries und flüssigen Design-Techniken.", "description": "Passe deine Layouts an verschiedene Bildschirmgrößen an mit Media Queries und flüssigen Design-Techniken.",
"difficulty": "intermediate", "difficulty": "intermediate",
"lessons": [ "lessons": [

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "html-elements", "id": "html-elements",
"title": "HTML-Elemente: Block vs Inline", "title": "HTML Block & Inline",
"description": "Verstehe den grundlegenden Unterschied zwischen Container- (Block-) und Inline-Elementen", "description": "Verstehe den grundlegenden Unterschied zwischen Container- (Block-) und Inline-Elementen",
"mode": "html", "mode": "html",
"difficulty": "beginner", "difficulty": "beginner",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "html-forms-basic", "id": "html-forms-basic",
"title": "HTML-Formulare: Grundlegende Eingaben", "title": "HTML Formulare",
"description": "Lerne, Formulare mit verschiedenen Eingabetypen zu erstellen", "description": "Lerne, Formulare mit verschiedenen Eingabetypen zu erstellen",
"mode": "html", "mode": "html",
"difficulty": "beginner", "difficulty": "beginner",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "html-forms-validation", "id": "html-forms-validation",
"title": "HTML-Formulare: Validierung", "title": "HTML Validierung",
"description": "Lerne die eingebauten HTML5-Formular-Validierungsattribute kennen", "description": "Lerne die eingebauten HTML5-Formular-Validierungsattribute kennen",
"mode": "html", "mode": "html",
"difficulty": "intermediate", "difficulty": "intermediate",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "html-details-summary", "id": "html-details-summary",
"title": "Details & Summary: Aufklapp-Elemente", "title": "HTML Details & Summary",
"description": "Erstelle aufklappbare Inhaltsbereiche ohne JavaScript", "description": "Erstelle aufklappbare Inhaltsbereiche ohne JavaScript",
"mode": "html", "mode": "html",
"difficulty": "beginner", "difficulty": "beginner",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "html-progress-meter", "id": "html-progress-meter",
"title": "Progress & Meter Elemente", "title": "HTML Progress & Meter",
"description": "Zeige Fortschritt und Messwerte nativ an", "description": "Zeige Fortschritt und Messwerte nativ an",
"mode": "html", "mode": "html",
"difficulty": "beginner", "difficulty": "beginner",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "html-tables", "id": "html-tables",
"title": "HTML-Tabellen", "title": "HTML Tabellen",
"description": "Erstelle strukturierte Datentabellen mit Überschriften und Beschriftungen", "description": "Erstelle strukturierte Datentabellen mit Überschriften und Beschriftungen",
"mode": "html", "mode": "html",
"difficulty": "beginner", "difficulty": "beginner",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "html-marquee", "id": "html-marquee",
"title": "Das Marquee-Element", "title": "HTML Marquee",
"description": "Erstelle Lauftext mit dem klassischen (veralteten aber lustigen!) Marquee-Element", "description": "Erstelle Lauftext mit dem klassischen (veralteten aber lustigen!) Marquee-Element",
"mode": "html", "mode": "html",
"difficulty": "beginner", "difficulty": "beginner",

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "../../schemas/code-crispies-module-schema.json", "$schema": "../../schemas/code-crispies-module-schema.json",
"id": "html-svg", "id": "html-svg",
"title": "SVG Grundlagen", "title": "HTML SVG",
"description": "Zeichne skalierbare Vektorgrafiken direkt in HTML", "description": "Zeichne skalierbare Vektorgrafiken direkt in HTML",
"mode": "html", "mode": "html",
"difficulty": "beginner", "difficulty": "beginner",

View File

@@ -7,10 +7,10 @@
"lessons": [ "lessons": [
{ {
"id": "flexbox-1", "id": "flexbox-1",
"title": "Flexbox Container Grundlagen", "title": "Flex Container",
"description": "Lerne, wie du einen Flex-Container erstellst und die Haupt- und Querachse verstehst.", "description": "Flexbox ist ein eindimensionales Layout-System. Mit <kbd>display: flex</kbd> wird ein Element zum Flex-Container. Alle direkten Kinder werden automatisch zu Flex-Items und richten sich horizontal (Hauptachse) aus. Die Querachse verläuft senkrecht dazu.",
"task": "Füge <code>display: flex</code> zu <code>.wrap</code> hinzu, um ein Flexbox-Layout zu erstellen.", "task": "Füge <kbd>display: flex</kbd> zu <kbd>.wrap</kbd> hinzu.",
"previewHTML": "<div class='flex-container'><div class='box'>1</div><div class='box'>2</div><div class='box'>3</div></div>", "previewHTML": "<div class='wrap'><div class='box'>1</div><div class='box'>2</div><div class='box'>3</div></div>",
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; }", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; }",
"sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; }",
"codePrefix": ".wrap {\n ", "codePrefix": ".wrap {\n ",
@@ -27,10 +27,10 @@
}, },
{ {
"id": "flexbox-2", "id": "flexbox-2",
"title": "Flex-Richtung und Umbruch", "title": "Direction & Wrap",
"description": "Steuere die Richtung und den Umbruch von Flex-Elementen innerhalb eines Containers.", "description": "<kbd>flex-direction</kbd> bestimmt die Hauptachse: <kbd>row</kbd> (horizontal, Standard) oder <kbd>column</kbd> (vertikal). Mit <kbd>flex-wrap: wrap</kbd> brechen Items in die nächste Zeile/Spalte um, wenn der Platz nicht reicht.",
"task": "Füge <code>flex-direction: column</code> und <code>flex-wrap: wrap</code> zu <code>.wrap</code> hinzu.", "task": "Füge <kbd>flex-direction: column</kbd> und <kbd>flex-wrap: wrap</kbd> zu <kbd>.wrap</kbd> hinzu.",
"previewHTML": "<div class='flex-container'><div class='box'>1</div><div class='box'>2</div><div class='box'>3</div><div class='box'>4</div><div class='box'>5</div></div>", "previewHTML": "<div class='wrap'><div class='box'>1</div><div class='box'>2</div><div class='box'>3</div><div class='box'>4</div><div class='box'>5</div></div>",
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; }", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; }",
"sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; height: 16rem; display: flex; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; height: 16rem; display: flex; }",
"codePrefix": ".wrap {\n ", "codePrefix": ".wrap {\n ",
@@ -53,9 +53,9 @@
{ {
"id": "flexbox-3", "id": "flexbox-3",
"title": "Justify Content", "title": "Justify Content",
"description": "Lerne, wie du Flex-Elemente entlang der Hauptachse des Containers ausrichtest.", "description": "<kbd>justify-content</kbd> verteilt Items entlang der Hauptachse. Werte: <kbd>flex-start</kbd> (Anfang), <kbd>flex-end</kbd> (Ende), <kbd>center</kbd> (Mitte), <kbd>space-between</kbd> (gleichmäßig mit Abstand), <kbd>space-around</kbd> (gleichmäßig mit Rand).",
"task": "Füge <code>justify-content: space-between</code> zu <code>.wrap</code> hinzu, um die Boxen gleichmäßig zu verteilen.", "task": "Füge <kbd>justify-content: space-between</kbd> zu <kbd>.wrap</kbd> hinzu.",
"previewHTML": "<div class='flex-container'><div class='box'>1</div><div class='box'>2</div><div class='box'>3</div></div>", "previewHTML": "<div class='wrap'><div class='box'>1</div><div class='box'>2</div><div class='box'>3</div></div>",
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; text-align: center; font-weight: bold; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; }", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; text-align: center; font-weight: bold; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; }",
"sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; }",
"codePrefix": ".wrap {\n ", "codePrefix": ".wrap {\n ",
@@ -73,9 +73,9 @@
{ {
"id": "flexbox-4", "id": "flexbox-4",
"title": "Align Items", "title": "Align Items",
"description": "Steuere, wie Flex-Elemente entlang der Querachse des Containers ausgerichtet werden.", "description": "<kbd>align-items</kbd> richtet Items entlang der Querachse aus (bei <kbd>row</kbd>: vertikal). Werte: <kbd>stretch</kbd> (Standard, füllt Höhe), <kbd>flex-start</kbd> (oben), <kbd>flex-end</kbd> (unten), <kbd>center</kbd> (Mitte), <kbd>baseline</kbd> (Textlinie).",
"task": "Füge <code>align-items: center</code> zu <code>.wrap</code> hinzu, um die Boxen vertikal zu zentrieren.", "task": "Füge <kbd>align-items: center</kbd> zu <kbd>.wrap</kbd> hinzu.",
"previewHTML": "<div class='flex-container'><div class='box tall'>1</div><div class='box'>2</div><div class='box short'>3</div></div>", "previewHTML": "<div class='wrap'><div class='box tall'>1</div><div class='box'>2</div><div class='box short'>3</div></div>",
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; width: 3rem; display: flex; justify-content: center; } .tall { height: 6rem; } .short { height: 3rem; }", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; width: 3rem; display: flex; justify-content: center; } .tall { height: 6rem; } .short { height: 3rem; }",
"sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; height: 10rem; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; height: 10rem; }",
"codePrefix": ".wrap {\n ", "codePrefix": ".wrap {\n ",
@@ -93,12 +93,12 @@
{ {
"id": "flexbox-5", "id": "flexbox-5",
"title": "Flex Grow", "title": "Flex Grow",
"description": "Die <code>flex</code> Eigenschaft steuert, wie stark ein Element im Verhältnis zu anderen wächst.", "description": "Die <kbd>flex</kbd>-Eigenschaft ist eine Kurzform für <kbd>flex-grow</kbd>, <kbd>flex-shrink</kbd> und <kbd>flex-basis</kbd>. Ein höherer Wert bedeutet, dass das Element mehr vom verfügbaren Platz einnimmt. <kbd>flex: 2</kbd> wächst doppelt so schnell wie <kbd>flex: 1</kbd>.",
"task": "Füge <code>flex: 2</code> zu <code>.box2</code> hinzu, um sie doppelt so breit wachsen zu lassen.", "task": "Füge <kbd>flex: 2</kbd> zu <kbd>.green</kbd> hinzu.",
"previewHTML": "<div class='flex-container'><div class='box box1'>1</div><div class='box box2'>2</div><div class='box box3'>3</div></div>", "previewHTML": "<div class='wrap'><div class='box red'>1</div><div class='box green'>2</div><div class='box yellow'>3</div></div>",
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; display: flex; align-items: center; justify-content: center; } .box1 { background: coral; flex: 1; } .box2 { background: mediumseagreen; } .box3 { background: gold; flex: 1; }", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; display: flex; align-items: center; justify-content: center; } .red { background: coral; flex: 1; } .green { background: mediumseagreen; } .yellow { background: gold; flex: 1; }",
"sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; }",
"codePrefix": ".box2 {\n ", "codePrefix": ".green {\n ",
"initialCode": "", "initialCode": "",
"codeSuffix": "\n}", "codeSuffix": "\n}",
"previewContainer": "preview-area", "previewContainer": "preview-area",
@@ -113,9 +113,9 @@
{ {
"id": "flexbox-6", "id": "flexbox-6",
"title": "Align Self", "title": "Align Self",
"description": "Verwende <code>align-self</code>, um die Ausrichtung für ein einzelnes Flex-Element zu überschreiben.", "description": "<kbd>align-self</kbd> überschreibt <kbd>align-items</kbd> für ein einzelnes Element. So kannst du ein Item individuell auf der Querachse positionieren, während alle anderen Items ihrer Standard-Ausrichtung folgen.",
"task": "Füge <code>align-self: flex-start</code> zu <code>.middle</code> hinzu, um es nach oben zu verschieben.", "task": "Füge <kbd>align-self: flex-start</kbd> zu <kbd>.middle</kbd> hinzu.",
"previewHTML": "<div class='flex-container'><div class='box'>1</div><div class='box middle'>2</div><div class='box'>3</div></div>", "previewHTML": "<div class='wrap'><div class='box'>1</div><div class='box middle'>2</div><div class='box'>3</div></div>",
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; } .middle { background: mediumseagreen; }", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; } .middle { background: mediumseagreen; }",
"sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; height: 12rem; align-items: center; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; height: 12rem; align-items: center; }",
"codePrefix": ".middle {\n ", "codePrefix": ".middle {\n ",

View File

@@ -259,6 +259,20 @@ code, kbd {
margin-bottom: var(--spacing-sm); margin-bottom: var(--spacing-sm);
} }
.completion-badge {
display: inline-block;
margin-left: 0.5rem;
padding: 0.15rem 0.5rem;
background: var(--success-color);
color: white;
font-size: 0.7rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
border-radius: var(--border-radius-sm);
vertical-align: middle;
}
.lesson-description { .lesson-description {
font-size: 0.95rem; font-size: 0.95rem;
line-height: 1.6; line-height: 1.6;
@@ -645,6 +659,13 @@ code, kbd {
border-bottom: none; border-bottom: none;
} }
/* Make the lessons nav section fill available space */
nav.sidebar-section {
flex: 1;
overflow-y: auto;
min-height: 0;
}
.sidebar-section h4 { .sidebar-section h4 {
font-size: 0.75rem; font-size: 0.75rem;
text-transform: uppercase; text-transform: uppercase;