{ "$schema": "../schemas/code-crispies-module-schema.json", "id": "flexbox", "title": "CSS Flexbox", "description": "Master the flexible box layout model for modern responsive designs", "difficulty": "intermediate", "lessons": [ { "id": "flexbox-1", "title": "Flexbox Container Basics", "description": "Learn how to create a flex container and understand the main and cross axes.", "task": "Add display: flex to .flex-container to create a flexbox layout.", "previewHTML": "
1
2
3
", "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": ".flex-container { border: 2px dashed #aaa; padding: 1rem; }", "codePrefix": ".flex-container {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "display", "expected": "flex" }, "message": "Set display to 'flex'" } ] }, { "id": "flexbox-2", "title": "Flex Direction and Wrap", "description": "Control the direction and wrapping of flex items within a container.", "task": "Add flex-direction: column and flex-wrap: wrap to .flex-container.", "previewHTML": "
1
2
3
4
5
", "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": ".flex-container { border: 2px dashed #aaa; padding: 1rem; height: 16rem; display: flex; }", "codePrefix": ".flex-container {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "contains", "value": "flex-direction", "message": "Use the 'flex-direction' property", "options": { "caseSensitive": false } }, { "type": "contains", "value": "flex-wrap", "message": "Use the 'flex-wrap' property", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "flex-direction", "expected": "column" }, "message": "Set the flex-direction to 'column'", "options": { "exact": true } }, { "type": "property_value", "value": { "property": "flex-wrap", "expected": "wrap" }, "message": "Set flex-wrap to 'wrap'", "options": { "exact": true } } ] }, { "id": "flexbox-3", "title": "Justify Content", "description": "Learn how to align flex items along the main axis of the flex container.", "task": "Add justify-content: space-between to .flex-container to distribute the boxes evenly.", "previewHTML": "
1
2
3
", "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": ".flex-container { border: 2px dashed #aaa; padding: 1rem; display: flex; }", "codePrefix": ".flex-container {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "contains", "value": "justify-content", "message": "Use the 'justify-content' property", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "justify-content", "expected": "space-between" }, "message": "Set justify-content to 'space-between'", "options": { "exact": true } } ] }, { "id": "flexbox-4", "title": "Align Items", "description": "Control how flex items are aligned along the cross axis of the flex container.", "task": "Add align-items: center to .flex-container to vertically center the boxes.", "previewHTML": "
1
2
3
", "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": ".flex-container { border: 2px dashed #aaa; padding: 1rem; display: flex; height: 10rem; }", "codePrefix": ".flex-container {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "contains", "value": "align-items", "message": "Use the 'align-items' property", "options": { "caseSensitive": false } }, { "type": "property_value", "value": { "property": "align-items", "expected": "center" }, "message": "Set align-items to 'center'", "options": { "exact": true } } ] }, { "id": "flexbox-5", "title": "Flex Grow", "description": "The flex property controls how much an item grows relative to others.", "task": "Add flex: 2 to .box2 to make it grow twice as wide.", "previewHTML": "
1
2
3
", "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; }", "sandboxCSS": ".flex-container { border: 2px dashed #aaa; padding: 1rem; display: flex; }", "codePrefix": ".box2 {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "flex", "expected": "2" }, "message": "Set flex to '2'" } ] }, { "id": "flexbox-6", "title": "Align Self", "description": "Use align-self to override alignment for a single flex item.", "task": "Add align-self: flex-start to .middle to move it to the top.", "previewHTML": "
1
2
3
", "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": ".flex-container { border: 2px dashed #aaa; padding: 1rem; display: flex; height: 12rem; align-items: center; }", "codePrefix": ".middle {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "align-self", "expected": "flex-start" }, "message": "Set align-self to 'flex-start'" } ] } ] }