{ "$schema": "../../schemas/code-crispies-module-schema.json", "id": "responsive-design", "title": "CSS Responsive Design", "description": "Adapta tus layouts a diferentes tamaños de pantalla usando media queries y técnicas de diseño fluido.", "difficulty": "intermediate", "lessons": [ { "id": "responsive-1", "title": "Media Queries", "description": "Comprende la sintaxis y casos de uso de las media queries de CSS para aplicar estilos condicionalmente basándose en características del viewport.

@media (max-width: 600px) {\n  .panel {\n    background: lightcoral;\n  }\n}
", "task": "Escribe una media query con @media (max-width: 600px) que cambie el fondo de .panel a 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": "Usa @media (max-width: 600px)", "options": { "caseSensitive": false } }, { "type": "contains", "value": ".panel", "message": "Selecciona .panel dentro de la media query", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "background", "expected": "lightcoral" }, "message": "Establece background: lightcoral", "options": { "exact": false } } ] }, { "id": "responsive-2", "title": "Fluid Type", "description": "Usa unidades relativas como vw para que los tamaños de fuente escalen con el ancho del viewport.", "task": "Establece font-size: 5vw para que escale con el 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": "Establece font-size: 5vw" } ] }, { "id": "responsive-3", "title": "Responsive Grid", "description": "Combina CSS Grid con auto-fit o auto-fill para layouts de columnas responsivos que ajustan automáticamente el número de columnas según el espacio disponible.", "task": "Añade display: grid, grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)) y 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": "Establece display: grid" }, { "type": "regex", "value": "repeat\\(auto-fit,\\s*minmax\\(200px,\\s*1fr\\)\\)", "message": "Usa repeat(auto-fit, minmax(200px, 1fr))", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "gap", "expected": "1rem" }, "message": "Establece gap: 1rem" } ] }, { "id": "responsive-4", "title": "Mobile-First", "description": "Adopta un enfoque mobile-first escribiendo estilos base para pantallas pequeñas y mejorándolos para viewports más grandes.", "task": "Escribe una media query con @media (min-width: 768px) que establezca el ancho de .sidebar a 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": "Usa @media (min-width: 768px)", "options": { "caseSensitive": false } }, { "type": "contains", "value": ".sidebar", "message": "Selecciona .sidebar en la media query", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "width", "expected": "250px" }, "message": "Establece width: 250px", "options": { "exact": false } } ] } ] }