{ "$schema": "../../schemas/code-crispies-module-schema.json", "id": "responsive-design", "title": "CSS Responsive Design", "description": "Dostosuj swoje layouty do różnych rozmiarów ekranów używając media queries i technik płynnego designu.", "difficulty": "intermediate", "lessons": [ { "id": "responsive-1", "title": "Media Queries", "description": "Poznaj składnię i przypadki użycia CSS media queries do warunkowego stosowania stylów na podstawie cech viewport.

@media (max-width: 600px) {\n  .panel {\n    background: lightcoral;\n  }\n}
", "task": "Napisz media query z @media (max-width: 600px), która zmienia tło .panel na lightcoral.", "previewHTML": "
Resize the window
", "previewBaseCSS": "body { font-family: sans-serif; padding: 1rem; } .panel { padding: 1rem; background: lightblue; }", "sandboxCSS": "", "codePrefix": "/* Add your media query below */\n", "initialCode": "", "codeSuffix": "", "solution": "@media (max-width: 600px) {\n .panel {\n background: lightcoral;\n }\n}", "previewContainer": "preview-area", "validations": [ { "type": "regex", "value": "@media\\s*\\(max-width:\\s*600px\\)", "message": "Użyj @media (max-width: 600px)", "options": { "caseSensitive": false } }, { "type": "contains", "value": ".panel", "message": "Zaadresuj .panel wewnątrz media query", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "background", "expected": "lightcoral" }, "message": "Ustaw background: lightcoral", "options": { "exact": false } } ] }, { "id": "responsive-2", "title": "Fluid Type", "description": "Używaj jednostek względnych jak vw, aby rozmiary czcionek skalowały się z szerokością viewport.", "task": "Ustaw font-size: 5vw, aby skalowała się ze zmianą viewport.", "previewHTML": "

Fluid Typography

", "previewBaseCSS": "body { font-family: sans-serif; padding: 1rem; }", "sandboxCSS": "", "codePrefix": "/* Apply fluid font sizing */\n.text {", "initialCode": "", "codeSuffix": "}", "solution": " font-size: 5vw;", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "font-size", "expected": "5vw" }, "message": "Ustaw font-size: 5vw" } ] }, { "id": "responsive-3", "title": "Responsive Grid", "description": "Połącz CSS Grid z auto-fit lub auto-fill dla responsywnych układów kolumnowych, które automatycznie dostosowują liczbę kolumn na podstawie dostępnej przestrzeni.", "task": "Dodaj display: grid, grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)) i gap: 1rem.", "previewHTML": "

Fast

Lightning quick load times

Secure

Enterprise-grade security

Reliable

99.9% uptime guaranteed

Support

24/7 customer service

", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; background: #f5f5f5; } .feature { background: white; padding: 1rem; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .feature h3 { margin: 0 0 8px; color: steelblue; } .feature p { margin: 0; color: #666; font-size: 0.9rem; }", "sandboxCSS": "", "codePrefix": ".features {\n ", "initialCode": "", "codeSuffix": "\n}", "solution": "display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 1rem;", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "display", "expected": "grid" }, "message": "Ustaw display: grid" }, { "type": "regex", "value": "repeat\\(auto-fit,\\s*minmax\\(200px,\\s*1fr\\)\\)", "message": "Użyj repeat(auto-fit, minmax(200px, 1fr))", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "gap", "expected": "1rem" }, "message": "Ustaw gap: 1rem" } ] }, { "id": "responsive-4", "title": "Mobile-First", "description": "Zastosuj podejście mobile-first: pisz bazowe style dla małych ekranów i rozszerzaj dla większych viewport.", "task": "Napisz media query z @media (min-width: 768px), która ustawia szerokość .sidebar na 250px.", "previewHTML": "", "previewBaseCSS": "body { font-family: sans-serif; padding: 1rem; } .sidebar { background: #c8e6c9; padding: 1rem; }", "sandboxCSS": "", "codePrefix": "/* Add mobile-first enhancement */\n", "initialCode": "", "codeSuffix": "", "solution": "@media (min-width: 768px) {\n .sidebar {\n width: 250px;\n }\n}", "previewContainer": "preview-area", "validations": [ { "type": "regex", "value": "@media\\s*\\(min-width:\\s*768px\\)", "message": "Użyj @media (min-width: 768px)", "options": { "caseSensitive": false } }, { "type": "contains", "value": ".sidebar", "message": "Zaadresuj .sidebar w media query", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "width", "expected": "250px" }, "message": "Ustaw width: 250px", "options": { "exact": false } } ] } ] }