├── .gitattributes ├── .github └── workflows │ └── gatsby.yml ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── assets └── README.md ├── csv.js ├── day-1-flexbox ├── 1-flexbox-intro │ ├── Flexbox Properties.txt │ ├── day1.pdf │ ├── flexbox notes.txt │ └── instructions.txt ├── 2-flexbox-grid │ ├── fem-2c-lg.png │ ├── fem-2c-sm.png │ └── instructions.txt ├── 3-figure-figcaption │ ├── finished.png │ └── instructions.txt ├── 4-flexbox-exercises │ ├── 4a-collections │ │ ├── begin │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── abstract.jpg │ │ │ │ ├── landscape.jpg │ │ │ │ ├── music.jpg │ │ │ │ ├── pop-art.jpg │ │ │ │ ├── vehicles.jpg │ │ │ │ └── vivid.jpg │ │ │ └── index.html │ │ ├── desktop.png │ │ ├── end │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── abstract.jpg │ │ │ │ ├── landscape.jpg │ │ │ │ ├── music.jpg │ │ │ │ ├── pop-art.jpg │ │ │ │ ├── vehicles.jpg │ │ │ │ └── vivid.jpg │ │ │ └── index.html │ │ ├── mobile.png │ │ └── tablet.png │ ├── 4b-mission │ │ ├── begin │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── abstract.jpg │ │ │ │ ├── landscape.jpg │ │ │ │ ├── music.jpg │ │ │ │ ├── pop-art.jpg │ │ │ │ ├── vehicles.jpg │ │ │ │ └── vivid.jpg │ │ │ └── index.html │ │ ├── end-alt │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── abstract.jpg │ │ │ │ ├── facebook-icon.svg │ │ │ │ ├── instagram-icon.svg │ │ │ │ ├── landscape.jpg │ │ │ │ ├── logo.png │ │ │ │ ├── logo2.png │ │ │ │ ├── music.jpg │ │ │ │ ├── pop-art.jpg │ │ │ │ ├── vehicles.jpg │ │ │ │ └── vivid.jpg │ │ │ └── index.html │ │ ├── end │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── abstract.jpg │ │ │ │ ├── landscape.jpg │ │ │ │ ├── logo2.png │ │ │ │ ├── music.jpg │ │ │ │ ├── pop-art.jpg │ │ │ │ ├── vehicles.jpg │ │ │ │ └── vivid.jpg │ │ │ └── index.html │ │ ├── logo.png │ │ ├── logo2.png │ │ ├── mission text.txt │ │ └── screenshots │ │ │ ├── desktop-alt.png │ │ │ ├── desktop.png │ │ │ ├── mobile-alt.png │ │ │ ├── mobile.png │ │ │ ├── tablet-alt.png │ │ │ └── tablet.png │ ├── 4c-footer │ │ ├── begin │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── abstract.jpg │ │ │ │ ├── landscape.jpg │ │ │ │ ├── logo2.png │ │ │ │ ├── music.jpg │ │ │ │ ├── pop-art.jpg │ │ │ │ ├── vehicles.jpg │ │ │ │ └── vivid.jpg │ │ │ └── index.html │ │ ├── end │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── abstract.jpg │ │ │ │ ├── facebook-icon.svg │ │ │ │ ├── instagram-icon.svg │ │ │ │ ├── landscape.jpg │ │ │ │ ├── logo2.png │ │ │ │ ├── music.jpg │ │ │ │ ├── pop-art.jpg │ │ │ │ ├── vehicles.jpg │ │ │ │ └── vivid.jpg │ │ │ └── index.html │ │ ├── facebook-icon.svg │ │ ├── instagram-icon.svg │ │ └── screenshots │ │ │ ├── desktop.png │ │ │ ├── mobile.png │ │ │ └── tablet.png │ └── instructions.txt ├── 5-header-navbar │ ├── begin │ │ ├── css │ │ │ └── style.css │ │ ├── img │ │ │ ├── abstract.jpg │ │ │ ├── facebook-icon.svg │ │ │ ├── instagram-icon.svg │ │ │ ├── landscape.jpg │ │ │ ├── logo2.png │ │ │ ├── music.jpg │ │ │ ├── pop-art.jpg │ │ │ ├── vehicles.jpg │ │ │ └── vivid.jpg │ │ └── index.html │ ├── end │ │ ├── css │ │ │ └── style.css │ │ ├── img │ │ │ ├── abstract.jpg │ │ │ ├── facebook-icon.svg │ │ │ ├── header-logo.svg │ │ │ ├── instagram-icon.svg │ │ │ ├── landscape.jpg │ │ │ ├── logo2.png │ │ │ ├── music.jpg │ │ │ ├── pop-art.jpg │ │ │ ├── vehicles.jpg │ │ │ └── vivid.jpg │ │ └── index.html │ ├── header-logo.svg │ ├── instructions.txt │ └── screenshots │ │ ├── desktop.png │ │ ├── mobile.png │ │ └── tablet.png ├── 6-responsive-images │ ├── banner demo │ │ ├── banners.html │ │ └── banners │ │ │ ├── banner-1084.png │ │ │ ├── banner-1200.png │ │ │ ├── banner-300.png │ │ │ ├── banner-583.png │ │ │ ├── banner-788.png │ │ │ └── banner-958.png │ ├── begin │ │ ├── css │ │ │ └── style.css │ │ ├── img │ │ │ ├── abstract.jpg │ │ │ ├── facebook-icon.svg │ │ │ ├── header-logo.svg │ │ │ ├── instagram-icon.svg │ │ │ ├── landscape.jpg │ │ │ ├── logo2.png │ │ │ ├── music.jpg │ │ │ ├── pop-art.jpg │ │ │ ├── vehicles.jpg │ │ │ └── vivid.jpg │ │ └── index.html │ ├── end │ │ ├── css │ │ │ └── style.css │ │ ├── img │ │ │ ├── abstract.jpg │ │ │ ├── facebook-icon.svg │ │ │ ├── header-logo.svg │ │ │ ├── hero-1200.png │ │ │ ├── hero-300.png │ │ │ ├── hero-838.png │ │ │ ├── instagram-icon.svg │ │ │ ├── landscape.jpg │ │ │ ├── logo2.png │ │ │ ├── music.jpg │ │ │ ├── pop-art.jpg │ │ │ ├── too-cool-1058.jpg │ │ │ ├── too-cool-1200.jpg │ │ │ ├── too-cool-300.jpg │ │ │ ├── too-cool-740.jpg │ │ │ ├── vehicles.jpg │ │ │ └── vivid.jpg │ │ └── index.html │ ├── hero.png │ ├── instructions.txt │ ├── responsive images.pdf │ ├── screenshots │ │ ├── desktop.png │ │ ├── mobile.png │ │ └── tablet.png │ └── too-cool.jpg └── 7-wrapup │ ├── begin │ ├── css │ │ └── style.css │ ├── img │ │ ├── abstract.jpg │ │ ├── facebook-icon.svg │ │ ├── header-logo.svg │ │ ├── hero-1200.png │ │ ├── hero-300.png │ │ ├── hero-838.png │ │ ├── instagram-icon.svg │ │ ├── landscape.jpg │ │ ├── logo2.png │ │ ├── music.jpg │ │ ├── pop-art.jpg │ │ ├── too-cool-1058.jpg │ │ ├── too-cool-1200.jpg │ │ ├── too-cool-300.jpg │ │ ├── too-cool-740.jpg │ │ ├── vehicles.jpg │ │ └── vivid.jpg │ └── index.html │ ├── end │ ├── css │ │ └── style.css │ ├── img │ │ ├── abstract.jpg │ │ ├── eyeing-you.jpg │ │ ├── facebook-icon.svg │ │ ├── fork-it-up.jpg │ │ ├── header-logo.svg │ │ ├── hero-1200.png │ │ ├── hero-300.png │ │ ├── hero-838.png │ │ ├── instagram-icon.svg │ │ ├── landscape.jpg │ │ ├── lets-scoot.jpg │ │ ├── logo2.png │ │ ├── music.jpg │ │ ├── pop-art.jpg │ │ ├── too-cool-1058.jpg │ │ ├── too-cool-1200.jpg │ │ ├── too-cool-300.jpg │ │ ├── too-cool-740.jpg │ │ ├── vehicles.jpg │ │ └── vivid.jpg │ └── index.html │ ├── eyeing-you.jpg │ ├── fork-it-up.jpg │ ├── instructions.txt │ ├── lets-scoot.jpg │ └── screenshots │ ├── desktop.png │ ├── mobile.png │ └── tablet.png ├── day-2-grid ├── 08-grid-intro │ ├── Grid Properties.txt │ └── day2.pdf ├── 09-mondrian-painting-demo │ └── instructions.txt ├── 10-grid-grid │ └── instructions.txt ├── 11-fig-figcaption │ └── instructions.txt ├── 12-challenge layout │ ├── 12a mosaic grid │ │ ├── begin │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── 1-place.jpg │ │ │ │ ├── 2-lippy.jpg │ │ │ │ ├── 3-skull.jpg │ │ │ │ ├── 4-yell.jpg │ │ │ │ ├── 5-fork.jpg │ │ │ │ ├── 6-drip.jpg │ │ │ │ ├── 7-invade.jpg │ │ │ │ ├── 8-school.jpg │ │ │ │ └── 9-doors.jpg │ │ │ └── index.html │ │ ├── end │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── 1-place.jpg │ │ │ │ ├── 2-lippy.jpg │ │ │ │ ├── 3-skull.jpg │ │ │ │ ├── 4-yell.jpg │ │ │ │ ├── 5-fork.jpg │ │ │ │ ├── 6-drip.jpg │ │ │ │ ├── 7-invade.jpg │ │ │ │ ├── 8-school.jpg │ │ │ │ └── 9-doors.jpg │ │ │ └── index.html │ │ ├── grid layout mobile.png │ │ └── grid layout-desktop.png │ ├── 12b home page │ │ ├── begin │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── abstract.jpg │ │ │ │ ├── eyeing-you.jpg │ │ │ │ ├── facebook-icon.svg │ │ │ │ ├── fork-it-up.jpg │ │ │ │ ├── header-logo.svg │ │ │ │ ├── hero-1200.png │ │ │ │ ├── hero-300.png │ │ │ │ ├── hero-838.png │ │ │ │ ├── instagram-icon.svg │ │ │ │ ├── landscape.jpg │ │ │ │ ├── lets-scoot.jpg │ │ │ │ ├── logo2.png │ │ │ │ ├── music.jpg │ │ │ │ ├── pop-art.jpg │ │ │ │ ├── too-cool-1058.jpg │ │ │ │ ├── too-cool-1200.jpg │ │ │ │ ├── too-cool-300.jpg │ │ │ │ ├── too-cool-740.jpg │ │ │ │ ├── vehicles.jpg │ │ │ │ └── vivid.jpg │ │ │ └── index.html │ │ ├── desktop.png │ │ ├── end │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── img │ │ │ │ ├── 1-place.jpg │ │ │ │ ├── 2-lippy.jpg │ │ │ │ ├── 3-skull.jpg │ │ │ │ ├── 4-yell.jpg │ │ │ │ ├── 5-fork.jpg │ │ │ │ ├── 6-drip.jpg │ │ │ │ ├── 7-invade.jpg │ │ │ │ ├── 8-school.jpg │ │ │ │ ├── 9-doors.jpg │ │ │ │ ├── abstract.jpg │ │ │ │ ├── eyeing-you.jpg │ │ │ │ ├── facebook-icon.svg │ │ │ │ ├── fork-it-up.jpg │ │ │ │ ├── header-logo.svg │ │ │ │ ├── hero-1200.png │ │ │ │ ├── hero-300.png │ │ │ │ ├── hero-838.png │ │ │ │ ├── instagram-icon.svg │ │ │ │ ├── landscape.jpg │ │ │ │ ├── lets-scoot.jpg │ │ │ │ ├── logo2.png │ │ │ │ ├── music.jpg │ │ │ │ ├── pop-art.jpg │ │ │ │ ├── too-cool-1058.jpg │ │ │ │ ├── too-cool-1200.jpg │ │ │ │ ├── too-cool-300.jpg │ │ │ │ ├── too-cool-740.jpg │ │ │ │ ├── vehicles.jpg │ │ │ │ └── vivid.jpg │ │ │ └── index.html │ │ ├── mobile.png │ │ └── tablet.png │ └── instructions.txt ├── 13-magazine │ └── instructions.txt ├── 14-cards │ └── instructions.txt └── 15-final-project │ ├── begin │ ├── css │ │ └── style.css │ ├── img │ │ ├── 1-place.jpg │ │ ├── 2-lippy.jpg │ │ ├── 3-skull.jpg │ │ ├── 4-yell.jpg │ │ ├── 5-fork.jpg │ │ ├── 6-drip.jpg │ │ ├── 7-invade.jpg │ │ ├── 8-school.jpg │ │ ├── 9-doors.jpg │ │ ├── abstract.jpg │ │ ├── eyeing-you.jpg │ │ ├── facebook-icon.svg │ │ ├── fork-it-up.jpg │ │ ├── header-logo.svg │ │ ├── hero-1200.png │ │ ├── hero-300.png │ │ ├── hero-838.png │ │ ├── instagram-icon.svg │ │ ├── landscape.jpg │ │ ├── lets-scoot.jpg │ │ ├── logo2.png │ │ ├── music.jpg │ │ ├── pop-art.jpg │ │ ├── too-cool-1058.jpg │ │ ├── too-cool-1200.jpg │ │ ├── too-cool-300.jpg │ │ ├── too-cool-740.jpg │ │ ├── vehicles.jpg │ │ └── vivid.jpg │ └── index.html │ ├── desktop.png │ ├── end │ ├── css │ │ └── style.css │ ├── img │ │ ├── 1-place.jpg │ │ ├── 2-lippy.jpg │ │ ├── 3-skull.jpg │ │ ├── 4-yell.jpg │ │ ├── 5-fork.jpg │ │ ├── 6-drip.jpg │ │ ├── 7-invade.jpg │ │ ├── 8-school.jpg │ │ ├── 9-doors.jpg │ │ ├── abstract.jpg │ │ ├── donut1.jpg │ │ ├── donut2.jpg │ │ ├── donut3.jpg │ │ ├── donut4.jpg │ │ ├── donut5.jpg │ │ ├── eyeing-you.jpg │ │ ├── facebook-icon.svg │ │ ├── fork-it-up.jpg │ │ ├── header-logo.svg │ │ ├── hero-1200.png │ │ ├── hero-300.png │ │ ├── hero-838.png │ │ ├── instagram-icon.svg │ │ ├── landscape.jpg │ │ ├── lets-scoot.jpg │ │ ├── logo2.png │ │ ├── music.jpg │ │ ├── pop-art.jpg │ │ ├── too-cool-1058.jpg │ │ ├── too-cool-1200.jpg │ │ ├── too-cool-300.jpg │ │ ├── too-cool-740.jpg │ │ ├── vehicles.jpg │ │ └── vivid.jpg │ └── index.html │ ├── instructions.txt │ ├── raw materials │ ├── pexels-sharon-mccutcheon-1191639.jpg │ ├── pexels-sharon-mccutcheon-1407346.jpg │ ├── pexels-sharon-mccutcheon-3779937.jpg │ ├── pexels-sharon-mccutcheon-3779945.jpg │ ├── pexels-sharon-mccutcheon-3784440.jpg │ └── text.txt │ └── tablet-mobile.png ├── gatsby-config.js ├── gatsby-node.js ├── lessons ├── card-layouts.md ├── css-grid-exercises.md ├── css-grid-intro.md ├── final-project.md ├── flexbox-exercises.md ├── flexbox-figure-figcaption.md ├── flexbox-grid-system.md ├── flexbox-wrapup.md ├── grid-figure-figcaption.md ├── grid-mondrian-exercise.md ├── grid-system-css-grid.md ├── header-navbar.md ├── intro.md ├── magazine-layouts.md └── responsive-images.md ├── package-lock.json ├── package.json ├── resources ├── Style Guide.png ├── Wall of Wonder Artist List.pdf └── resources.txt ├── src ├── components │ └── TOCCard.js ├── layouts │ ├── Footer.css │ ├── Footer.js │ ├── corner-image.svg │ ├── github-social.svg │ ├── index.css │ ├── index.js │ ├── linkedin-social.svg │ ├── twitter-social.svg │ └── variables.css ├── pages │ ├── 404.js │ └── index.js ├── templates │ └── lessonTemplate.js └── util │ └── helpers.js └── static ├── author.jpg ├── corner-image-active.svg ├── corner-image-inactive.svg ├── courseImage.jpg ├── courseImage.png └── posterframe.jpg /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/gatsby.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Gatsby Site to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@master 13 | - name: npm install, build, and csv 14 | run: | 15 | npm install 16 | npm run build 17 | npm run csv 18 | - name: Deploy site to gh-pages branch 19 | uses: crazy-max/ghaction-github-pages@v2 20 | with: 21 | target_branch: gh-pages 22 | build_dir: public 23 | env: 24 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Project dependencies 2 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 3 | node_modules 4 | .cache/ 5 | # Build directory 6 | public/ 7 | .DS_Store 8 | yarn-error.log 9 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | Frontend Masters: CSS Grids and Flexbox in Responsive Web Design v2 3 |
4 | 5 | [][fem] 6 | 7 | [Please click here][course] to head to the course website. 8 | 9 | # Issues and Pull Requests 10 | 11 | Please file issues and open pull requests here! Thank you! For issues with project files, either file issues on _this_ repo _or_ open a pull request on the projects repos. This repo itself is the course website. 12 | 13 | # License 14 | 15 | The content of this workshop is licensed under CC-BY-NC-4.0. Feel free to share freely but do not resell my content. 16 | 17 | The code, including the code of the site itself and the code in the exercises, are licensed under Apache 2.0. 18 | 19 | # Attributions 20 | 21 | Icons made by Freepik from www.flaticon.com 22 | 23 | [fem]: https://frontendmasters.com/ 24 | [course]: https://frontendmasters.github.io/grid-flexbox-v2 25 | -------------------------------------------------------------------------------- /assets/README.md: -------------------------------------------------------------------------------- 1 | # Frontend Masters: CSS Grids and Flexbox in Responsive Web Design v2 2 | 3 | ## Workshop Files 4 | 5 | Taught August 18-19, 2021, at Frontend Masters 6 | -------------------------------------------------------------------------------- /csv.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs").promises; 2 | const path = require("path"); 3 | const fm = require("front-matter"); 4 | const isUrl = require("is-url-superb"); 5 | const parseLinks = require("parse-markdown-links"); 6 | const { sorter } = require("./src/util/helpers"); 7 | const mdDir = process.env.MARKDOWN_DIR || path.join(__dirname, "lessons/"); 8 | const outputPath = 9 | process.env.OUTPUT_CSV_PATH || path.join(__dirname, "public/lessons.csv"); 10 | const linksOutputPath = 11 | process.env.LINKS_CSV_PATH || path.join(__dirname, "public/links.csv"); 12 | 13 | async function createCsv() { 14 | console.log(`making the markdown files into a CSV from ${mdDir}`); 15 | 16 | // get paths 17 | const allFiles = await fs.readdir(mdDir); 18 | const files = allFiles.filter(filePath => filePath.endsWith(".md")); 19 | 20 | // read paths, get buffers 21 | const buffers = await Promise.all( 22 | files.map(filePath => fs.readFile(path.join(mdDir, filePath))) 23 | ); 24 | 25 | // make buffers strings 26 | const contents = buffers.map(content => content.toString()); 27 | 28 | // make strings objects 29 | let frontmatters = contents.map(fm); 30 | 31 | // find all attribute keys 32 | const seenAttributes = new Set(); 33 | frontmatters.forEach(item => { 34 | Object.keys(item.attributes).forEach(attr => seenAttributes.add(attr)); 35 | }); 36 | const attributes = Array.from(seenAttributes.values()); 37 | 38 | if (attributes.includes("order")) { 39 | frontmatters = frontmatters.sort(sorter); 40 | } 41 | 42 | // get all data into an array 43 | let rows = frontmatters.map(item => { 44 | const row = attributes.map(attr => 45 | item.attributes[attr] ? JSON.stringify(item.attributes[attr]) : "" 46 | ); 47 | return row; 48 | }); 49 | 50 | // header row must be first row 51 | rows.unshift(attributes); 52 | 53 | // join into CSV string 54 | const csv = rows.map(row => row.join(",")).join("\n"); 55 | 56 | // write file out 57 | await fs.writeFile(outputPath, csv); 58 | 59 | console.log(`Wrote ${rows.length} rows to ${outputPath}`); 60 | 61 | // make links csv 62 | let longestLength = 0; 63 | let linksArray = frontmatters.map(row => { 64 | const links = parseLinks(row.body).filter(isUrl); 65 | longestLength = longestLength > links.length ? longestLength : links.length; 66 | const newRow = [row.attributes.order, row.attributes.title, ...links]; 67 | return newRow; 68 | }); 69 | 70 | if (longestLength) { 71 | // add title row 72 | linksArray = linksArray.map(array => { 73 | const lengthToFill = longestLength + 2 - array.length; 74 | return array.concat(Array.from({ length: lengthToFill }).fill("")); 75 | }); 76 | 77 | linksArray.unshift( 78 | ["order", "title"].concat( 79 | Array.from({ length: longestLength }).map((_, index) => `link${index}`) 80 | ) 81 | ); 82 | 83 | // join into CSV string 84 | const linksCsv = linksArray.map(row => row.join(",")).join("\n"); 85 | 86 | // write file out 87 | await fs.writeFile(linksOutputPath, linksCsv); 88 | 89 | console.log(`Wrote ${linksArray.length} rows to ${linksOutputPath}`); 90 | } 91 | } 92 | 93 | createCsv(); 94 | -------------------------------------------------------------------------------- /day-1-flexbox/1-flexbox-intro/Flexbox Properties.txt: -------------------------------------------------------------------------------- 1 | Flexbox Properties 2 | 3 | A complete version of these tips with image explanations and links is available at CSS Tricks: 4 | https://css-tricks.com/snippets/css/a-guide-to-flexbox/ 5 | 6 | 7 | Parent (Flex Container) 8 | display: flex | inline-flex; 9 | 10 | flex-direction: row | row-reverse | column | column-reverse; 11 | 12 | flex-wrap: wrap | nowrap | wrap-reverse; 13 | 14 | flex-flow (shorthand for flex-direction and flex-wrap) (flex-flow: row wrap;) 15 | 16 | 17 | These next two properties work similarly, just on their different axes. 18 | 19 | justify-content (main axis): flex-start | flex-end | center | space-between | space-around | space-evenly; 20 | 21 | align-items (cross axis): flex-start | flex-end | center | baseline | stretch; 22 | 23 | 24 | Align-content spans multiple line boxes. 25 | 26 | align-content: flex-start | flex-end | center | stretch | space-between | space-around | space-evenly; 27 | 28 | 29 | 30 | Children (Flex Items) 31 | order:
17 | We strive to bring people interesting and unique art that inspires them to be more creative and enjoy their homes. We know art can be expensive, so we work with
18 | a rotating set of artists and photographers to being you fantastic prints - all for free. We just ask that you donate what you think is fair, or share the site with someone who might like great art as much as you do.
19 |
25 | figure { 26 | display: flex; 27 | flex-flow: column nowrap; 28 | position: relative; 29 | } 30 | figcaption { 31 | position: absolute; 32 | bottom: 0%; 33 | width: 100%; 34 | opacity: 0.7; 35 | } 36 |37 | -------------------------------------------------------------------------------- /lessons/flexbox-wrapup.md: -------------------------------------------------------------------------------- 1 | --- 2 | path: "/flexbox-wrapup" 3 | title: "Flexbox Wrapup" 4 | order: "1G" 5 | section: "Flexbox" 6 | description: "" 7 | icon: "grip-lines" 8 | --- 9 | 10 | a. Add a "popular prints" section of the web page, just after "our mission". See the screenshots for how this should look. Captions for the photos include: 11 | 12 | - Fork It Up (the fork) 13 | - Eyeing You (the car) 14 | - Let's Scoot (the vespa scooter) 15 | 16 | b. If you have time, clean up the formatting, comments, spacing and alignment, etc, to make it portfolio-worthy! 17 | -------------------------------------------------------------------------------- /lessons/grid-figure-figcaption.md: -------------------------------------------------------------------------------- 1 | --- 2 | path: "/grid-figure-figcaption" 3 | title: "Figure Caption & Figure Caption with CSS Grid" 4 | order: "2D" 5 | section: "CSS Grid" 6 | description: "" 7 | icon: "th" 8 | --- 9 | 10 | ## Chapter 11: `
You just hit a route that doesn't exist... the sadness.
7 |