{ "name": "Responsive Design with Bootstrap", "order": 0.003, "challenges": [ { "id": "bad87fee1348bd9acde08712", "name": "Waypoint: Use Responsive Design with Bootstrap Fluid Containers", "dashedName": "waypoint-use-responsive-design-with-bootstrap-fluid-containers", "difficulty": 2.01, "description": [ "Now let's go back to our Cat Photo App. This time, we'll style it using the popular Bootstrap responsive CSS framework.", "Bootstrap will figure out how wide your screen is and respond by resizing your HTML elements - hence the name Responsive Design.", "With responsive design, there is no need to design a mobile version of your website. It will look good on devices with screens of any width.", "You can add Bootstrap to any app just by including it with <link rel='stylesheet' href='//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css'/> at the top of your HTML. But we've gone ahead and automatically added it to your Cat Photo App for you.", "To get started, we should nest all of our HTML in a div element with the class \"container-fluid\"." ], "tests": [ "assert($('div').hasClass('container-fluid'), 'Your div element should have the class \"row\"')", "assert(editor.match(/<\\/div>/g) && editor.match(/
/g).length === editor.match(/
div elements has a closing tag.')" ], "challengeSeed": [ "", "", "", "

CatPhotoApp

", "", "

Click here for cat photos.

", "", "", "", "

Things cats love:

", "", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9acde08812", "name": "Waypoint: Make Images Mobile Responsive", "dashedName": "waypoint-make-images-mobile-responsive", "difficulty": 2.02, "description": [ "First, Add a new image with the src attribute of \"http://bit.ly/fcc-kittens2\".", "It would be great if this image could be exactly the width of our phone's screen.", "Fortunately, with Bootstrap, all we need to do is add the \"img-responsive\" class to your image. Do this, and the image should perfectly fit the width of your page." ], "tests": [ "assert($('img').length > 1, 'You should have a total of two images.')", "assert($('img').hasClass('img-responsive'), 'Your new image should have the class \"img-responsive\".')", "assert(new RegExp('http://bit.ly/fcc-kittens2', 'gi').test($('img.img-responsive').attr('src')), 'Add a second image with the src of http://bit.ly/fcc-kittens2.')" ], "challengeSeed": [ "", "", "", "
", "

CatPhotoApp

", "", "

Click here for cat photos.

", "", " ", "", "

Things cats love:

", "
    ", "
  • cat nip
  • ", "
  • laser pointers
  • ", "
  • lasagna
  • ", "
", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd8acde08812", "name": "Waypoint: Center Text with Bootstrap", "dashedName": "waypoint-center-text-with-bootstrap", "difficulty": 2.03, "description": [ "Now that we're using Bootstrap, we can center our heading elements to make them look better. All we need to do is add the class text-center to our h1 and h2 elements.", "Remember that you can add several classes to the same element by separating each of them with a space, like this: <h2 class=\"text-red text-center\">your text</h2>." ], "tests": [ "assert($('h2').hasClass('text-center'), 'Your h2 element should be centered by applying the class \"text-center\"')" ], "challengeSeed": [ "", "", "", "
", "

CatPhotoApp

", "", "

Click here for cat photos.

", "", " ", "", " ", "

Things cats love:

", "
    ", "
  • cat nip
  • ", "
  • laser pointers
  • ", "
  • lasagna
  • ", "
", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348cd8acdf08812", "name": "Waypoint: Create a Bootstrap Button", "dashedName": "waypoint-create-a-bootstrap-button", "difficulty": 2.04, "description": [ "Bootstrap has its own styles for button elements, which look much better than the plain HTML ones.", "Create a new button element below your large kitten photo. Give it the class \"btn\" and the text of \"like this photo\"." ], "tests": [ "assert($('button').hasClass('btn'), 'Your new button should have the class \"btn\".')", "assert(new RegExp('like this photo','gi').test($('button.btn').text()), 'Your button should have the text \"like this photo\".')", "assert(editor.match(/<\\/button>/g) && editor.match(/", " ", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348cd8acef08812", "name": "Waypoint: Create a Block Element Bootstrap Button", "dashedName": "waypoint-create-a-block-element-bootstrap-button", "difficulty": 2.05, "description": [ "Normally, your button elements are only as wide as the text that they contain. By making them block elements, your button will stretch to fill your page's entire horizontal space.", "This image illustrates the difference between \"inline\" elements and \"block-level\" elements:", "An \"inline\" button is as small as the text it contains. In this image, it", "Note that these buttons still need the \"btn\" class.", "Add Bootstrap's \"btn-block\" class to your Bootstrap button." ], "tests": [ "assert($('button').hasClass('btn'), 'Your button should still have the class \"btn\".')", "assert($('button').hasClass('btn-block'), 'Your button should have the class \"btn-block\".')", "assert(editor.match(/<\\/button>/g) && editor.match(/", "

Things cats love:

", " ", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348cd8acef08811", "name": "Waypoint: Taste the Bootstrap Button Color Rainbow", "dashedName": "waypoint-taste-the-bootstrap-button-color-rainbow", "difficulty": 2.06, "description": [ "The \"btn-primary\" class is the main color you'll use in your app. It is useful for highlighting actions you want your user to take.", "Add Bootstrap's \"btn-primary\" class to your button.", "Note that this button will still need the \"btn\" and \"btn-block\" classes." ], "tests": [ "assert($('button').hasClass('btn-primary'), 'Your button should have the class \"btn-primary\".')", "assert($('button').hasClass('btn-block') && $('button').hasClass('btn'), 'Your button should still have the \"btn\" and \"btn-block\" classes.')", "assert(editor.match(/<\\/button>/g) && editor.match(/", "

Things cats love:

", " ", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348cd8acef08813", "name": "Waypoint: Call out Optional Actions with Button Info", "dashedName": "waypoint-call-out-optional-actions-with-button-info", "difficulty": 2.07, "description": [ "Bootstrap comes with several pre-defined colors for buttons. The \"btn-info\" class is used to call attention to optional actions that the user can take.", "Create a new block-level Bootstrap button below your \"Like\" button with the text \"Info\", and add Bootstrap's \"btn-info\" and \"btn-block\" classes to it.", "Note that these buttons still need the \"btn\" and \"btn-block\" classes." ], "tests": [ "assert($('button').hasClass('btn-info'), 'Your new button should have the class \"btn-info\".')", "assert($('button.btn-block.btn').length > 1, 'Both of your Bootstrap buttons should have the \"btn\" and \"btn-block\" classes.')", "assert(new RegExp('info', 'gi').test($('button.btn-info').text()), 'Your new button should have the text \"Info\".')", "assert(editor.match(/<\\/button>/g) && editor.match(/", "

Things cats love:

", " ", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348ce8acef08814", "name": "Waypoint: Warn your Users of a Dangerous Action", "dashedName": "waypoint-warn-your-users-of-a-dangerous-action", "difficulty": 2.08, "description": [ "Bootstrap comes with several pre-defined colors for buttons. The \"btn-danger\" class is the button color you'll use to notify users that the button performs a destructive action, such as deleting a cat photo.", "Create a button with the text \"Delete\" and give it the class \"btn-danger\".", "Note that these buttons still need the \"btn\" and \"btn-block\" classes." ], "tests": [ "assert($('button').hasClass('btn-danger'), 'Your new button should have the class \"btn-danger\".')", "assert($('button.btn-block.btn').length > 2, 'All of your Bootstrap buttons should have the \"btn\" and \"btn-block\" classes.')", "assert(new RegExp('delete', 'gi').test($('button.btn-danger').text()), 'Your new button should have the text \"delete\".')", "assert(editor.match(/<\\/button>/g) && editor.match(/", " ", "

Things cats love:

", " ", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad88fee1348ce8acef08815", "name": "Waypoint: Use the Bootstrap Grid to Put Elements Side By Side", "dashedName": "waypoint-use-the-bootstrap-grid-to-put-elements-side-by-side", "difficulty": 2.09, "description": [ "Bootstrap uses a responsive grid system, which makes it easy to put elements into rows and specify each element's relative width. Most of Bootstrap's classes can be applied to a div element.", "Here's a diagram of how Bootstrap's 12-column grid layout works:", "", "Note that in this illustration, the col-md-* class is being used. Here, \"md\" means \"medium\", and \"*\" is a number specifying how many columns wide the element should be. In this case, the column width of an element on a medium-sized screen, such as a laptop, is being specified.", "In the Cat Photo App that we're building, we'll use col-xs-*, where \"*\" is the number of columns wide the element should be, and \"xs\" means \"extra small\", like an extra-small mobile phone screen.", "Put the \"Like\", \"Info\" and \"Delete\" buttons side-by-side by nesting all three of them within one <div class=\"row\"> element, then each of them within a <div class=\"col-xs-4\"> element.", "The \"row\" class is applied to a div, and the buttons themselves can be nested within it." ], "tests": [ "assert($('div.row:has(button)').length > 0, 'Your buttons should all be nested within the same div element with the class \"row\".')", "assert($('div.col-xs-4:has(button)').length > 2, 'Each of your Bootstrap buttons should be nested within its own div element with the class \"col-xs-4\".')", "assert(editor.match(/<\\/button>/g) && editor.match(/", " ", " ", "

Things cats love:

", " ", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aedf08845", "name": "Waypoint: Ditch Custom CSS for Bootstrap", "dashedName": "waypoint-ditch-custom-css-for-bootstrap", "difficulty": 2.10, "description": [ "We can clean up our code and make our Cat Photo App look more conventional by using Bootstrap's built-in styles instead of the custom styles we created earlier.", "Don't worry - there will be plenty of time to customize our CSS later.", "Delete the \".red-text\", \"p\", and \".smaller-image\" CSS declarations from your style element so that the only declarations left in your style element are \"h2\" and \"thick-green-border\". Then Delete the p element that contains a dead link. Then remove the \"red-text\" class from your h2 element and replace it with the \"text-primary\" Bootstrap class. Finally, remove the \"smaller-image\" class from your first img element and replace it with the img-responsive class." ], "tests": [ "assert(!$('h2').hasClass('red-text'), 'Your h2 element should no longer have the class \"red-text\".')", "assert($('h2').hasClass('text-primary'), 'Your h2 element should now have the class \"text-primary\".')", "assert(!$('p').css('font-family').match(/monospace/i), 'Your paragraph elements should no longer use the font \"Monospace\".')", "assert(!$('img').hasClass('smaller-image'), 'Remove the \"smaller-image\" class from your top image.')", "assert($('.img-responsive').length > 1, 'Add the \"img-responsive\" class to your top image.')" ], "challengeSeed": [ "", "", "", "
", "

CatPhotoApp

", "", "

Click here for cat photos.

", "", " ", "", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "

Things cats love:

", " ", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aede08845", "name": "Waypoint: Create a Custom Heading", "dashedName": "waypoint-create-a-custom-heading", "difficulty": 2.11, "description": [ "We will make a simple heading for our Cat Photo App by putting them in the same row.", "Remember, Bootstrap uses a responsive grid system, which makes it easy to put elements into rows and specify each element's relative width. Most of Bootstrap's classes can be applied to a div element.", "Here's a diagram of how Bootstrap's 12-column grid layout works:", "", "Note that in this illustration, we use the \"col-md-*\" class. Here, \"md\" means \"medium\", and \"*\" is a number specifying how many columns wide the element should be. In this case, we're specifying how many columns wide an element should be on a medium-sized screen, such as a laptop.", "In the Cat Photo App that we're building, we'll use \"col-xs-*\", where \"*\" is the number of columns wide the element should be, and \"xs\" means \"extra small\", like an extra-small mobile phone screen.", "Nest your first image and your h2 element within a single <div class='row'> element. Nest your h2 text within a <div class='col-xs-8'> and your image in a <div class='col-xs-4'> so that they are on the same line.", "Notice how the image is now just the right size to fit along the text?" ], "tests": [ "assert($('div.row:has(h2)').length > 0 && $('div.row:has(img)').length > 0, 'Your h2 element and topmost img element should both be nested together within a div element with the class \"row\".')", "assert($('div.col-xs-4:has(img)').length > 0, 'Nest your topmost img element within a div with the class \"col-xs-4\".')", "assert($('div.col-xs-8:has(h2)').length > 0, 'Nest your h2 element within a div with the class \"col-xs-8\".')", "assert(editor.match(/<\\/div>/g) && editor.match(/
/g).length === editor.match(/
div elements has a closing tag.')" ], "challengeSeed": [ "", "", "", "", "
", "

CatPhotoApp

", "", " ", "", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "

Things cats love:

", "
    ", "
  • cat nip
  • ", "
  • laser pointers
  • ", "
  • lasagna
  • ", "
", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aedd08845", "name": "Waypoint: Add Font Awesome Icons to our Buttons", "dashedName": "waypoint-add-font-awesome-icons-to-our-buttons", "difficulty": 2.12, "description": [ "Font Awesome is a convenient library of icons. These icons are vector graphics, stored in the \".svg\" file format. These icons are treated just like fonts. You can specify their size using pixels, and they will assume the font size of their parent HTML elements.", "Use Font Awesome to add a \"thumbs-up\" icon to your like button by giving it a i element with the classes \"fa\" and \"fa-thumbs-up\"." ], "tests": [ "assert($('i').hasClass('fa fa-thumbs-up'), 'Add an i element with the classes \"fa\" and \"fa-thumbs-up\".')", "assert($('button').children('i').length > 0, 'Nest your i element within your button element.')", "assert(editor.match(/<\\/i>/g), 'Make sure your i element has a closing tag.')" ], "challengeSeed": [ "", "", "", "
", "
", "
", "

CatPhotoApp

", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "

Things cats love:

", "
    ", "
  • cat nip
  • ", "
  • laser pointers
  • ", "
  • lasagna
  • ", "
", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aedc08845", "name": "Waypoint: Add Font Awesome Icons to all of our Buttons", "dashedName": "waypoint-add-font-awesome-icons-to-all-of-our-Buttons", "difficulty": 2.13, "description": [ "Font Awesome is a convenient library of icons. These icons are vector graphics, stored in the \".svg\" file format. These icons are treated just like fonts. You can specify their size using pixels, and they will assume the font size of their parent HTML elements.", "Use Font Awesome to add a \"info-circle\" icon to your info button and a \"trash\" icon to your delete button." ], "tests": [ "assert($('i').hasClass('fa fa-trash'), 'You should add a <i class=\"fa fa-trash\"></i> within your delete button element.')", "assert($('i').hasClass('fa fa-info-circle'), 'You should add a <i class=\"fa fa-info-circle\"></i> within your info button element.')", "assert(editor.match(/<\\/i>/g) && editor.match(/<\\/i/g).length > 2, 'Make sure each of your i elements has a closing tag.')" ], "challengeSeed": [ "", "", "", "
", "
", "
", "

CatPhotoApp

", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "

Things cats love:

", "
    ", "
  • cat nip
  • ", "
  • laser pointers
  • ", "
  • lasagna
  • ", "
", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aedb08845", "name": "Waypoint: Responsively Style Radio Buttons", "dashedName": "waypoint-responsively-style-radio-buttons", "difficulty": 2.14, "description": [ "You can use Bootstrap's \"col-xs-*\" classes on form elements, too! This way, our radio buttons will be evenly spread out across the page, regardless of how wide the screen resolution is.", "Nest all of your radio buttons within a <div class='row'> element. Then nest each of them within a <div class='col-xs-6'> element." ], "tests": [ "assert($('div.row:has(input[type=\\'radio\\'])').length > 0, 'Nest all of your radio buttons inside one div with the class \"row\".')", "assert($('div.col-xs-6:has(input[type=\\'radio\\'])').length > 1, 'Nest each of your radio buttons inside its own div with the class \"col-xs-6\".')", "assert(editor.match(/<\\/div>/g) && editor.match(/
/g).length === editor.match(/
div elements has a closing tag.')" ], "challengeSeed": [ "", "", "", "
", "
", "
", "

CatPhotoApp

", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "

Things cats love:

", "
    ", "
  • cat nip
  • ", "
  • laser pointers
  • ", "
  • lasagna
  • ", "
", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", " ", " ", " ", " ", " ", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aeda08845", "name": "Waypoint: Responsively Style Checkboxes", "dashedName": "waypoint-responsively-style-checkboxes", "difficulty": 2.15, "description": [ "You can use Bootstrap's \"col-xs-*\" classes on form elements, too! This way, our checkboxes will be evenly spread out across the page, regardless of how wide the screen resolution is.", "Nest all your checkboxes in a <div class='row'> element. Then nest each of them in a <div class='col-xs-4'> element." ], "tests": [ "assert($('div.row:has(input[type=\\'checkbox\\'])').length > 0, 'Nest all of your checkboxes inside one div with the class \"row\".')", "assert($('div.col-xs-4:has(input[type=\\'checkbox\\'])').length > 2, 'Nest each of your checkboxes inside its own div with the class \"col-xs-4\".')", "assert(editor.match(/<\\/div>/g) && editor.match(/
/g).length === editor.match(/
div elements has a closing tag.')" ], "challengeSeed": [ "", "", "", "
", "
", "
", "

CatPhotoApp

", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "

Things cats love:

", "
    ", "
  • cat nip
  • ", "
  • laser pointers
  • ", "
  • lasagna
  • ", "
", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", "
", "
", " ", "
", "
", " ", "
", "
", " ", " ", " ", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aed908845", "name": "Waypoint: Style Text Inputs as Form Controls", "dashedName": "waypoint-style-text-inputs-as-form-controls", "difficulty": 2.16, "description": [ "You can add the \"fa-paper-plane\" Font Awesome icon by adding <i class=\"fa fa-paper-plane\"></i> within your submit button element.", "Give your form's text input field a class of \"form-control\". Give your form's submit button the classes \"btn btn-primary\". Also give this button the Font Awesome icon of \"fa-paper-plane\"." ], "tests": [ "assert($('button[type=\\'submit\\']').hasClass('btn btn-primary'), 'Give the submit button in your form the classes \"btn btn-primary\".')", "assert($('button[type=\\'submit\\']:has(i.fa.fa-paper-plane)').length > 0, 'Add a <i class=\"fa fa-paper-plane\"></i> within your submit button element.')", "assert($('input[type=\\'text\\']').hasClass('form-control'), 'Give the text input in your form the class \"form-control\".')", "assert(editor.match(/<\\/i>/g) && editor.match(/<\\/i/g).length > 3, 'Make sure each of your i elements has a closing tag.')" ], "challengeSeed": [ "", "", "", "
", "
", "
", "

CatPhotoApp

", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "

Things cats love:

", "
    ", "
  • cat nip
  • ", "
  • laser pointers
  • ", "
  • lasagna
  • ", "
", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", "
", "
", " ", "
", "
", " ", "
", "
", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908845", "name": "Waypoint: Line up Form Elements Responsively with Bootstrap", "dashedName": "waypoint-line-up-form-elements-responsively-with-bootstrap", "difficulty": 2.17, "description": [ "Now let's get your form input and your submission button on the same line. We'll do this the same way we have previously: by using a div element with the class \"row\", and other div elements within it using the \"col-xs-*\" class.", "Nest both your form's text input and submit button within a div with the class \"row\". Nest your form's text input within a div with the class of \"col-xs-7\". Nest your form's submit button in a div with the class \"col-xs-5\".", "This is the last challenge we'll do for our Cat Photo App for now. We hope you've enjoyed learning Font Awesome, Bootstrap, and responsive design!" ], "tests": [ "assert($('div.row:has(input[type=\\'text\\'])').length > 0 && $('div.row:has(button[type=\\'submit\\'])').length > 0, 'Nest your form submission button and text area in a div with class \"row\".')", "assert($('div.col-xs-5:has(button[type=\\'submit\\'])').length > 0, 'Nest your form submission button in a div with the class \"col-xs-5\".')", "assert($('div.col-xs-7:has(input[type=\\'text\\'])').length > 0, 'Nest your form text area in a div with the class \"col-xs-7\".')", "assert(editor.match(/<\\/div>/g) && editor.match(/
/g).length === editor.match(/
div elements has a closing tag.')" ], "challengeSeed": [ "", "", "", "
", "
", "
", "

CatPhotoApp

", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "

Things cats love:

", "
    ", "
  • cat nip
  • ", "
  • laser pointers
  • ", "
  • lasagna
  • ", "
", "

Top 3 things cats hate:

", "
    ", "
  1. flea treatment
  2. ", "
  3. thunder
  4. ", "
  5. other cats
  6. ", "
", "
", "
", "
", " ", "
", "
", " ", "
", "
", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", " ", " ", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908846", "name": "Waypoint: Create a Bootstrap Headline", "dashedName": "waypoint-create-a-bootstrap-headline", "difficulty": 2.18, "description": [ "Now let's build something from scratch to practice our HTML, CSS and Bootstrap skills.", "We'll build a jQuery playground, which we'll soon put to use in our jQuery challenges.", "To start with, create an h3 element, with the text \"jQuery Playground\".", "Color your h3 element with the \"text-primary\" Bootstrap class, and center it with the \"text-center\" bootstrap class." ], "tests": [ "assert($('h3') && $('h3').length > 0, 'Add a h3 element to your page.')", "assert(editor.match(/<\\/h3>/g) && editor.match(/

/g).length === editor.match(/

h3 element has a closing tag.')", "assert($('h3').hasClass('text-primary'), 'Your h3 element should be colored by applying the class \"text-primary\"')", "assert($('h3').hasClass('text-center'), 'Your h3 element should be centered by applying the class \"text-center\"')", "assert.isTrue((/jquery(\\s)+playground/gi).test($('h3').text()), 'Your h3 element should have the text \"jQuery Playground\".')" ], "challengeSeed": [ "", "", "" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908746", "name": "Waypoint: House our page within a Bootstrap Container Fluid Div", "dashedName": "waypoint-house-our-page-within-a-bootstrap-container-fluid-div", "difficulty": 2.18, "description": [ "Now let's make sure all the content on your page is mobile-responsive.", "Let's nest your h3 element within a div element with the class \"container-fluid\"." ], "tests": [ "assert($('div').hasClass('container-fluid'), 'Your div element should have the class \"container-fluid\"')", "assert(editor.match(/<\\/div>/g) && editor.match(/
/g).length === editor.match(/
div elements has a closing tag.')" ], "challengeSeed": [ "

jQuery Playground

", "", "" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9bec908846", "name": "Waypoint: Create a Bootstrap Row", "dashedName": "waypoint-create-a-bootstrap-row", "difficulty": 2.19, "description": [ "Now we'll create a Bootstrap row for our inline elements.", "Create a div element with the class \"row\"." ], "tests": [ "assert($('div').length > 1, 'Add a div element to your page.')", "assert($('div').hasClass('row'), 'Your div element should have the class \"row\"')", "assert(editor.match(/<\\/div>/g) && editor.match(/
/g).length === editor.match(/
div element has a closing tag.')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "", "" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908847", "name": "Waypoint: Split your Bootstrap Row", "dashedName": "waypoint-split-your-bootstrap-row", "difficulty": 2.20, "description": [ "Now that we have a Bootstrap Row, let's split it into two columns to house our elements.", "Create two div elements within your row, both with the class \"col-xs-6\"." ], "tests": [ "assert($('div.row').children('div.col-xs-6').length > 1, 'Nest two div class=\"col-xs-6\" elements within your div class=\"row\" element.')", "assert(editor.match(/<\\/div>/g) && editor.match(/
/g).length === editor.match(/
div elements have closing tags.')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908848", "name": "Waypoint: Create Bootstrap Wells", "dashedName": "waypoint-create-bootstrap-wells", "difficulty": 2.21, "description": [ "Bootstrap has a class called \"well\" that can create a visual sense of depth for your columns.", "Nest one div element with the class \"well\" within each of your \"col-xs-6\" div elements." ], "tests": [ "assert($('div').length > 4, 'Add two div elements inside your div class=\"row\"> element both with the class \"col-xs-6\"')", "assert($('div.row').children('div.col-xs-6').length > 1, 'Nest both of your div class=\"col-xs-6\" elements within your div class=\"row\" element.')", "assert($('div.col-xs-6').children('div.well').length > 1, 'Nest both of your div class=\"col-xs-6\" elements within your div class=\"row\" element.')", "assert(editor.match(/<\\/div>/g) && editor.match(/
/g).length === editor.match(/
div elements have closing tags.')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "
", "
", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908849", "name": "Waypoint: Add Elements within your Bootstrap Wells", "dashedName": "waypoint-add-elements-within-your-bootstrap-wells", "difficulty": 2.22, "description": [ "Now we're several div elements deep on each column of our row. This is as deep as we'll need to go. Now we can add our button elements.", "Nest three button elements within each of your \"well\" div elements." ], "tests": [ "assert($('div.well').children('button').length > 5, 'Nest three button elements within each of your div elements with class \"well\".')", "assert($('button') && $('button').length > 5, 'You should have a total of 6 button elements.')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908850", "name": "Waypoint: Apply the Default Bootstrap Button Style", "dashedName": "waypoint-apply-the-default-bootstrap-button-style", "difficulty": 2.23, "description": [ "Bootstrap has another button class called \"btn-default\"", "Apply both the \"btn\" and \"btn-default\" classes to each of your button elements." ], "tests": [ "assert($('.btn').length > 5, 'Apply the \"btn\" class to each of your button elements.')", "assert($('.btn-default').length > 5, 'Apply the \"btn-default\" class to each of your button elements.')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "
", " ", " ", " ", "
", "
", "
", "
", " ", " ", " ", "
", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908852", "name": "Waypoint: Create a Class to Target with jQuery Selectors", "dashedName": "waypoint-create-a-class-to-target-with-jquery-selectors", "difficulty": 2.24, "description": [ "Not every class needs to have corresponding CSS. Sometimes we create classes just for the purpose of selecting these elements more easily using jQuery.", "Give each of your button elements the class \"target\"." ], "tests": [ "assert($('.target').length > 5, 'Apply the \"target\" class to each of your button elements.')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "
", " ", " ", " ", "
", "
", "
", "
", " ", " ", " ", "
", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908853", "name": "Waypoint: Add ID Attributes to Bootstrap Elements", "dashedName": "waypoint-add-id-attributes-to-bootstrap-elements", "difficulty": 2.25, "description": [ "Recall that in addition to class attributes, you can give each of your elements an id attribute.", "Each id should be unique to a specific element.", "Let's give a unique id to each of our div elements of class \"well\".", "Remember that you can give an element an id like this: <div class=\"well\" id=\"center-well\">", "Give the well on the left the id of \"left-well\". Give the well on the right the id of \"right-well\"." ], "tests": [ "assert($('#left-well') && $('#left-well').length > 0, 'Give your left \"well\" the id of \"left-well\".')", "assert($('#right-well') && $('#right-well').length > 0, 'Give your right \"well\" the id of \"right-well\".')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "
", " ", " ", " ", "
", "
", "
", "
", " ", " ", " ", "
", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908854", "name": "Waypoint: Label Bootstrap Wells", "dashedName": "waypoint-label-bootstrap-wells", "difficulty": 2.26, "description": [ "For the sake of clarity, let's label both of our wells with their ids.", "Above your left-well, inside its \"col-xs-6\" div element, add a h4 element with the text \"#left-well\".", "Above your right-well, inside its \"col-xs-6\" div element, add a h4 element with the text \"#right-well\"." ], "tests": [ "assert($('.col-xs-12').children('h4') && $('.col-xs-12').children('h4').length > 1, 'Add an h4 element to each of your <div class=\\'col-xs-6\\'> elements.');", "assert(new RegExp('#left-well','gi').test($('h4').text()), 'One h4 element should have the text \"#left-well\".');", "assert(new RegExp('#right-well','gi').test($('h4').text()), 'One h4 element should have the text \"#right-well\".');" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "
", " ", " ", " ", "
", "
", "
", "
", " ", " ", " ", "
", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908855", "name": "Waypoint: Give Each Element a Unique ID", "dashedName": "waypoint-give-each-element-a-unique-id", "difficulty": 2.27, "description": [ "We will also want to be able to use jQuery to target each button by its unique id.", "Give each of your buttons a unique id like, starting with \"target1\" and ending with \"target6\"." ], "tests": [ "assert($('#target1') && $('#target1').length > 0, 'One button element should have the id \"target1\".')", "assert($('#target2') && $('#target2').length > 0, 'One button element should have the id \"target2\".')", "assert($('#target3') && $('#target3').length > 0, 'One button element should have the id \"target3\".')", "assert($('#target4') && $('#target4').length > 0, 'One button element should have the id \"target4\".')", "assert($('#target5') && $('#target5').length > 0, 'One button element should have the id \"target5\".')", "assert($('#target6') && $('#target6').length > 0, 'One button element should have the id \"target6\".')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "

#left-well

", "
", " ", " ", " ", "
", "
", "
", "

#right-well

", "
", " ", " ", " ", "
", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908856", "name": "Waypoint: Label Bootstrap Buttons", "dashedName": "waypoint-label-bootstrap-buttons", "difficulty": 2.28, "description": [ "Just like we labled our wells, we want to label our buttons.", "Give each of your buttons text that corresponds to their id." ], "tests": [ "assert(new RegExp('#target1','gi').test($('#target1').text()), 'Give your button element with the id \"target1\" the text \"#target1\".')", "assert(new RegExp('#target2','gi').test($('#target2').text()), 'Give your button element with the id \"target2\" the text \"#target2\".')", "assert(new RegExp('#target3','gi').test($('#target3').text()), 'Give your button element with the id \"target3\" the text \"#target3\".')", "assert(new RegExp('#target4','gi').test($('#target4').text()), 'Give your button element with the id \"target4\" the text \"#target4\".')", "assert(new RegExp('#target5','gi').test($('#target5').text()), 'Give your button element with the id \"target5\" the text \"#target5\".')", "assert(new RegExp('#target6','gi').test($('#target6').text()), 'Give your button element with the id \"target6\" the text \"#target6\".')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "

#left-well

", "
", " ", " ", " ", "
", "
", "
", "

#right-well

", "
", " ", " ", " ", "
", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] }, { "id": "bad87fee1348bd9aec908857", "name": "Waypoint: Use Comments to Clarify Code", "dashedName": "waypoint-use-comments-to-clarify-code", "difficulty": 2.29, "description": [ "When we start using jQuery, we will modify HTML elements without needing to actually change them in HTML.", "Let's make sure that everyone knows they shouldn't actually modify any of this code directly.", "Remember that you can start a comment with <!-- and end a comment with -->", "Add a comment at the top of your HTML that says You shouldn't need to modify code below this line." ], "tests": [ "assert(editor.match(//g).length > 1, 'Be sure to close your comment with -->.')" ], "challengeSeed": [ "
", "

jQuery Playground

", "
", "
", "

#left-well

", "
", " ", " ", " ", "
", "
", "
", "

#right-well

", "
", " ", " ", " ", "
", "
", "
", "
" ], "challengeType": 0, "nameCn": "", "descriptionCn": [], "nameFr": "", "descriptionFr": [], "nameRu": "", "descriptionRu": [], "nameEs": "", "descriptionEs": [], "namePt": "", "descriptionPt": [] } ] }