Defeating your Foe: the Red Dot is Ours!
", + "To Come...
", + "diff --git a/seed/challenges/01-front-end-development-certification/advanced-ziplines.json b/seed/challenges/01-front-end-development-certification/advanced-ziplines.json
deleted file mode 100644
index ffa27f7fdfb5fc..00000000000000
--- a/seed/challenges/01-front-end-development-certification/advanced-ziplines.json
+++ /dev/null
@@ -1,245 +0,0 @@
-{
- "name": "Advanced Front End Development Projects",
- "order": 12.5,
- "time": "150 hours",
- "helpRoom": "HelpFrontEnd",
- "challenges": [
- {
- "id": "bd7158d8c442eddfaeb5bd17",
- "title": "Build a JavaScript Calculator",
- "description": [
- "Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/freeCodeCamp/full/rLJZrA/.",
- "Fulfill the following user stories. Use whichever libraries or APIs you need. Give it your own personal style.",
- "User Story: I can add, subtract, multiply and divide two numbers.",
- "User Story: I can clear the input field with a clear button.",
- "User Story: I can keep chaining mathematical operations together until I hit the equal button, and the calculator will tell me the correct output.",
- "Remember to use Read-Search-Ask if you get stuck.",
- "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ",
- "You can get feedback on your project by sharing it with your friends on Facebook."
- ],
- "challengeSeed": [
- "Drnp29SJY8w"
- ],
- "tests": [],
- "type": "zipline",
- "challengeType": 3,
- "isRequired": true,
- "translations": {
- "es": {
- "title": "Crea una calculadora JavaScript",
- "description": [
- "Objetivo: Crea una aplicación con CodePen.io cuya funcionalidad sea similar a esta: https://codepen.io/freeCodeCamp/full/PNKdjo/.",
- "Regla #1: No veas el código del proyecto de ejemplo en CodePen. Encuentra la forma de hacerlo por tu cuenta.",
- "Regla #2: Satisface las siguientes historias de usuario. Usa cualquier librería o API que necesites. Dale tu estilo personal.",
- "Historia de usuario: Puedo sumar, restar, multiplicar y dividir dos números.",
- "Historia de usuario opcional: Puedo limpiar la pantalla con un botón de borrar.",
- "Historia de usuario opcional: Puedo concatenar continuamente varias operaciones hasta que pulse el botón de igual, y la calculadora me mostrará la respuesta correcta.",
- "Recuerda utilizar Leer-Buscar-Preguntar si te sientes atascado.",
- "Cuando hayas terminado, pulsa el botón de \"I've completed this challenge\" e incluye un enlace a tu CodePen. ",
- "Puedes obtener retroalimentación sobre tu proyecto por parte de otros campistas, compartiéndolo en nuestra Sala de chat para revisión de código. También puedes compartirlo en Twitter y en el campamento de tu ciudad (en Facebook)."
- ]
- },
- "pt-br": {
- "title": "Construa uma calculadora JavaScript",
- "description": [
- "Objetivo: Construa uma aplicação em CodePen.io cuja funcionalidade seja similar a esta: https://codepen.io/freeCodeCamp/full/rLJZrA/.",
- "Regra #1: Não veja o código do projeto de exemplo no CodePen. Encontre a sua própria forma de fazê-lo.",
- "Regra #2: Satisfaça as seguintes histórias de usuário. Utilize qualquer biblioteca ou API que você precisar. Dê o seu próprio estilo pessoal.",
- "História de usuário: Eu posso somar, subtrair, multiplicar e dividir dois números.",
- "História de usuário opcional: Eu posso limpar o campo de entrada com um botão claro.",
- "História de usuário opcional: Eu posso manter o encadeamento de operações matemáticas juntas até eu apertar o botão de igual, e a calculadora irá me dizer a resposta correta.",
- "Lembre-se de utilizar Ler-Buscar-Perguntar se você tiver dificuldades.",
- "Quando tiver terminado, clique no botão \"Eu concluí este desafio\" e inclua um link para o seu projeto no CodePen. ",
- "Você pode obter feedback sobre o seu projeto compartilhando-o com os seus amigos no Facebook."
- ]
- }
- }
- },
- {
- "id": "bd7158d8c442eddfaeb5bd0f",
- "title": "Build a Pomodoro Clock",
- "description": [
- "Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/freeCodeCamp/full/aNyxXR/.",
- "Fulfill the following user stories. Use whichever libraries or APIs you need. Give it your own personal style.",
- "User Story: I can start a 25 minute pomodoro, and the timer will go off once 25 minutes has elapsed.",
- "User Story: I can reset the clock for my next pomodoro.",
- "User Story: I can customize the length of each pomodoro.",
- "Remember to use Read-Search-Ask if you get stuck.",
- "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ",
- "You can get feedback on your project by sharing it with your friends on Facebook."
- ],
- "challengeSeed": [
- "lgj3nfzV0xM"
- ],
- "tests": [],
- "type": "zipline",
- "isRequired": true,
- "challengeType": 3,
- "translations": {
- "es": {
- "title": "Crea un reloj pomodoro",
- "description": [
- "Objetivo: Crea una aplicación con CodePen.io cuya funcionalidad sea similar a la de esta: https://codepen.io/freeCodeCamp/full/aNyxXR/.",
- "Regla #1: No veas el código del proyecto de ejemplo en CodePen. Encuentra la forma de hacerlo por tu cuenta.",
- "Regla #2: Satisface las siguientes historias de usuario. Usa cualquier librería o APIs que necesites. Dale tu estilo personal.",
- "Historia de usuario: Puedo iniciar un pomodoro de 25 minutos, y el cronómetro terminará cuando pasen 25 minutos.",
- "Historia de usuario: Como usuario, puedo reiniciar el reloj para comenzar mi siguiente pomodoro.",
- "Historia de usuario: Como usuario, puedo personalizar la longitud de cada pomodoro.",
- "Recuerda utilizar Leer-Buscar-Preguntar si te sientes atascado.",
- "Cuando hayas terminado, pulsa el botón de \"I've completed this challenge\" e incluye un enlace a tu CodePen.",
- "Puedes obtener retroalimentación sobre tu proyecto por parte de otros campistas, compartiéndolo en nuestra Sala de chat para revisión de código. También puedes compartirlo en Twitter y en el campamento de tu ciudad (en Facebook)."
- ]
- },
- "ru": {
- "title": "Создайте таймер Pomodoro",
- "description": [
- "Задание: Создайте CodePen.io который успешно копирует вот этот: https://codepen.io/freeCodeCamp/full/aNyxXR/.",
- "Правило #1: Не подсматривайте код приведенного на CodePen примера. Напишите его самостоятельно.",
- "Правило #2: Можете использовать любые библиотеки или API, которые потребуются.",
- "Правило #3: Воссоздайте функционал приведенного примера и не стесняйтесь добавить что-нибудь от себя.",
- "Реализуйте следующие пользовательские истории, сделайте также бонусные по желанию:",
- "Пользовательская история: В качестве пользователя, я могу запустить 25 минутную 'помидорку', по истечении которой таймер выключится.",
- "Бонусная пользовательская история: В качестве пользователя, я могу сбросить таймер для установки следующей 'помидорки'.",
- "Бонусная пользовательская история: В качестве пользователя, я могу выбирать длительность 'помидорки'.",
- "Если что-то не получается, воспользуйтесь Read-Search-Ask.",
- "Когда выполните задание кликните кнопку \"I've completed this challenge\" и добавьте ссылку на ваш CodePen. Если вы программировали с кем-то в паре, также добавьте имя вашего напарника.",
- "Если вы хотите получить немедленную оценку вашего проекта, нажмите эту кнопку и добавьте ссылку на ваш CodePen. В противном случае мы проверим его перед тем как вы приступите к проектам для некоммерческих организаций.
Click here then add your link to your tweet's text"
- ]
- },
- "pt-br": {
- "title": "Construa um relógio Pomodoro",
- "description": [
- "Objetivo: Construa uma aplicação em CodePen.io cuja funcionalidade seja similar a esta: https://codepen.io/freeCodeCamp/full/aNyxXR/.",
- "Regra #1: Não veja o código do projeto de exemplo no CodePen. Encontre a sua própria forma de fazê-lo.",
- "Regra #2: Satisfaça as seguintes histórias de usuário. Utilize qualquer biblioteca ou API que você precisar. Dê o seu próprio estilo pessoal.",
- "História de usuário: Eu posso começar um pomodoro de 25 minutos, e o temporizador desligará quando 25 minutos tiverem passado.",
- "História de usuário: Eu posso zerar o relógio para o meu próximo pomodoro.",
- "Lembre-se de utilizar Ler-Buscar-Perguntar se você tiver dificuldades.",
- "Quando tiver terminado, clique no botão \"Eu concluí este desafio\" e inclua um link para o seu projeto no CodePen. ",
- "Você pode obter feedback sobre o seu projeto compartilhando-o com os seus amigos no Facebook."
- ]
- }
- }
- },
- {
- "id": "bd7158d8c442eedfaeb5bd1c",
- "title": "Build a Tic Tac Toe Game",
- "description": [
- "Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/freeCodeCamp/full/KzXQgy/.",
- "Fulfill the following user stories. Use whichever libraries or APIs you need. Give it your own personal style.",
- "User Story: I can play a game of Tic Tac Toe with the computer.",
- "User Story: My game will reset as soon as it's over so I can play again.",
- "User Story: I can choose whether I want to play as X or O.",
- "Remember to use Read-Search-Ask if you get stuck.",
- "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.",
- "You can get feedback on your project by sharing it with your friends on Facebook."
- ],
- "challengeSeed": [
- "Ia69O1ZNGEg"
- ],
- "tests": [],
- "type": "zipline",
- "challengeType": 3,
- "isRequired": true,
- "translations": {
- "es": {
- "title": "Crea un juego de Tic Tac Toe",
- "description": [
- "Objetivo: Construye una aplicación en CodePen.io cuya funcionalidad sea similar a la de esta: https://codepen.io/freeCodeCamp/full/KzXQgy/.",
- "Regla #1: No veas el código del proyecto de ejemplo en CodePen. Encuentra la forma de hacerlo por tu cuenta.",
- "Regla #2: Satisface las siguientes historias de usuario. Usa cualquier librería o APIs que necesites. Dale tu estilo personal.",
- "Historia de usuario: Puedo jugar un juego de Tic Tac Toe contra el computador.",
- "Historia de usuario: Mi juego se reiniciará tan pronto como termine para poder jugar de nuevo.",
- "Historia de usuario: Puedo elegir si quiero jugar como X o como O.",
- "Recuerda utilizar Leer-Buscar-Preguntar si te sientes atascado.",
- "Cuando hayas terminado, pulsa el botón de \"I've completed this challenge\" e incluye un enlace a tu CodePen.",
- "Puedes obtener retroalimentación sobre tu proyecto por parte de otros campistas, compartiéndolo en nuestra Sala de chat para revisión de código. También puedes compartirlo en Twitter y en el campamento de tu ciudad (en Facebook)."
- ]
- },
- "pt-br": {
- "title": "Construa um Jogo da Velha",
- "description": [
- "Objetivo: Construa uma aplicação em CodePen.io cuja funcionalidade seja similar a esta: https://codepen.io/freeCodeCamp/full/aNyxXR/.",
- "Regra #1: Não veja o código do projeto de exemplo no CodePen. Encontre a sua própria forma de fazê-lo.",
- "Regra #2: Satisfaça as seguintes histórias de usuário. Utilize qualquer biblioteca ou API que você precisar. Dê o seu próprio estilo pessoal.",
- "História de usuário: Eu posso jogar o Jogo da Velha com o computador.",
- "História de usuário: Meu jogo reiniciará assim que acabar para que eu possa jogar novamente.",
- "História de usuário: Eu posso escolher se eu quero jogar como X ou O.",
- "Lembre-se de utilizar Ler-Buscar-Perguntar se você tiver dificuldades.",
- "Quando tiver terminado, clique no botão \"Eu concluí este desafio\" e inclua um link para o seu projeto no CodePen. ",
- "Você pode obter feedback sobre o seu projeto compartilhando-o com os seus amigos no Facebook."
- ]
- }
- }
- },
- {
- "id": "bd7158d8c442eddfaeb5bd1c",
- "title": "Build a Simon Game",
- "description": [
- "Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/freeCodeCamp/full/obYBjE.",
- "Fulfill the following user stories. Use whichever libraries or APIs you need. Give it your own personal style.",
- "User Story: I am presented with a random series of button presses.",
- "User Story: Each time I input a series of button presses correctly, I see the same series of button presses but with an additional step.",
- "User Story: I hear a sound that corresponds to each button both when the series of button presses plays, and when I personally press a button.",
- "User Story: If I press the wrong button, I am notified that I have done so, and that series of button presses starts again to remind me of the pattern so I can try again.",
- "User Story: I can see how many steps are in the current series of button presses.",
- "User Story: If I want to restart, I can hit a button to do so, and the game will return to a single step.",
- "User Story: I can play in strict mode where if I get a button press wrong, it notifies me that I have done so, and the game restarts at a new random series of button presses.",
- "User Story: I can win the game by getting a series of 20 steps correct. I am notified of my victory, then the game starts over.",
- "Hint: Here are mp3s you can use for each button: https://s3.amazonaws.com/freecodecamp/simonSound1.mp3
, https://s3.amazonaws.com/freecodecamp/simonSound2.mp3
, https://s3.amazonaws.com/freecodecamp/simonSound3.mp3
, https://s3.amazonaws.com/freecodecamp/simonSound4.mp3
.",
- "Remember to use Read-Search-Ask if you get stuck.",
- "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.",
- "You can get feedback on your project by sharing it with your friends on Facebook."
- ],
- "challengeSeed": [
- "tAPut8a47bA"
- ],
- "tests": [],
- "type": "zipline",
- "challengeType": 3,
- "isRequired": true,
- "translations": {
- "es": {
- "title": "Construye un juego de Simon",
- "description": [
- "Objetivo: Construye una aplicación en CodePen.io cuya funcionalidad sea similar a la de esta: https://codepen.io/Em-Ant/full/QbRyqq/.",
- "Regla #1: No veas el código del proyecto de ejemplo en CodePen. Encuentra la forma de hacerlo por tu cuenta.",
- "Regla #2: Satisface las siguientes historias de usuario. Usa cualquier librería o APIs que necesites. Dale tu estilo personal.",
- "Historia de usuario: Se me presenta una serie aleatoria de pulsaciones a botones.",
- "Historia de usuario: Cada vez que presiono una secuencia de pulsaciones correctamente, veo que vuelve a ejecutarse la misma serie de pulsaciones con un paso adicional.",
- "Historia de usuario: Escucho un sonido que corresponde a cada botón cuando se ejecuta una secuencia de pulsaciones, así como cuando yo presiono un botón.",
- "Historia de usuario: Si presiono el botón equivocado, se me notifica sobre mi error, y se ejecuta de nuevo la serie correcta de pulsaciones para recordarme cuál es la secuencia correcta, tras lo cual puedo intentar de nuevo.",
- "Historia de usuario: Puedo ver cuántos pasos hay en la serie de pulsaciones actual.",
- "Historia de usuario: Si deseo reiniciar, puedo pulsar un botón para hacerlo, y el juego comenzará desde una secuencia con un solo paso.",
- "Historia de usuario: Puedo jugar en modo estricto donde si presiono el botón equivocado, se me notifica de mi error, y el juego vuelve a comenzar con una nueva serie aleatoria de colores.",
- "Historia de usuario: Puedo ganar el juego si completo 20 pasos correctos. Se me notifica sobre mi victoria, tras lo cual el juego se reinicia.",
- "Pista: Aquí hay algunos mp3s que puedes utilizar para tus botones: https://s3.amazonaws.com/freecodecamp/simonSound1.mp3
, https://s3.amazonaws.com/freecodecamp/simonSound2.mp3
, https://s3.amazonaws.com/freecodecamp/simonSound3.mp3
, https://s3.amazonaws.com/freecodecamp/simonSound4.mp3
.",
- "Recuerda utilizar Leer-Buscar-Preguntar si te sientes atascado.",
- "Cuando hayas terminado, pulsa el botón de \"I've completed this challenge\" e incluye un enlace a tu CodePen.",
- "Puedes obtener retroalimentación sobre tu proyecto por parte de otros campistas, compartiéndolo en nuestra Sala de chat para revisión de código. También puedes compartirlo en Twitter y en el campamento de tu ciudad (en Facebook)."
- ]
- },
- "pt-br": {
- "title": "Construa um jogo de Simon",
- "description": [
- "Objetivo: Construa uma aplicação em CodePen.io cuja funcionalidade seja similar a esta: https://codepen.io/freeCodeCamp/full/aNyxXR/.",
- "Regra #1: Não veja o código do projeto de exemplo no CodePen. Encontre a sua própria forma de fazê-lo.",
- "Regra #2: Satisfaça as seguintes histórias de usuário. Utilize qualquer biblioteca ou API que você precisar. Dê o seu próprio estilo pessoal.",
- "História de usuário: Eu sou apresentado a uma sequência aleatória de botões para presisonar.",
- "História de usuário: Cada vez que eu pressionar uma sequência de botões corretamente, eu vejo a mesma sequência de botões, mas com um passo adicional.",
- "História de usuário: Eu ouço um som que corresponde a cada botão quando a sequência é tocada, e quando eu, pessoalmente, pressiono cada botão.",
- "História de usuário: Se eu pressionar o botão errado, eu sou notificado, e essa sequência de botões recomeça para que eu possa me lembrar do padrão e tentar novamente.",
- "História de usuário: Eu posso ver quantos passos estão na sequência atual de botões para pressionar.",
- "História de usuário: Se eu quiser reiniciar, eu posso pressionar um botão e o jogo retornará para um único passo na sequência de botões.",
- "História de usuário: Eu posso jogar no modo rigoroso, onde se eu pressionar um botão errado, eu sou notificado e o jogo recomeça em uma nova série aleatória de botões para pressionar.",
- "História de usuário: Eu posso ganhar o jogo pressionando uma sequência de 20 passos corretamente. Eu sou notificado da minha vitória e então o jogo recomeça.",
- "Dica: Aqui estão alguns mp3s que você pode usar para cada botão: https://s3.amazonaws.com/freecodecamp/simonSound1.mp3
, https://s3.amazonaws.com/freecodecamp/simonSound2.mp3
, https://s3.amazonaws.com/freecodecamp/simonSound3.mp3
, https://s3.amazonaws.com/freecodecamp/simonSound4.mp3
.",
- "Lembre-se de utilizar Ler-Buscar-Perguntar se você tiver dificuldades.",
- "Quando tiver terminado, clique no botão \"Eu concluí este desafio\" e inclua um link para o seu projeto no CodePen. ",
- "Você pode obter feedback sobre o seu projeto compartilhando-o com os seus amigos no Facebook."
- ]
- }
- }
- }
- ]
-}
diff --git a/seed/challenges/01-front-end-development-certification/basic-ziplines.json b/seed/challenges/01-front-end-development-certification/basic-ziplines.json
deleted file mode 100644
index ca2c683885a77b..00000000000000
--- a/seed/challenges/01-front-end-development-certification/basic-ziplines.json
+++ /dev/null
@@ -1,329 +0,0 @@
-{
- "name": "Basic Front End Development Projects",
- "order": 5.5,
- "time": "50 hours",
- "helpRoom": "HelpFrontEnd",
- "challenges": [
- {
- "id": "bd7158d8c442eddfbeb5bd1f",
- "title": "Get Set for our Front End Development Projects",
- "description": [
- [
- "//i.imgur.com/OAD6SJz.png",
- "An image of a Simon game, one our front end projects.",
- "Our front end development projects will give you a chance to apply the front end skills you've developed up to this point. We'll use a popular browser-based code editor called CodePen.",
- ""
- ],
- [
- "//i.imgur.com/WBetuBa.jpg",
- "A programmer punching through his laptop screen in frustration.",
- "These projects are hard. It takes most campers several days to build each project. You will get frustrated. But don't quit. This gets easier with practice.",
- ""
- ],
- [
- "//i.imgur.com/p2TpOQd.jpg",
- "A cute dog jumping over a hurdle and winking and pointing his paw at you.",
- "When you get stuck, just use the Read-Search-Ask methodology. Don't worry - you've got this.",
- ""
- ],
- [
- "//i.imgur.com/G1saeDt.gif",
- "A gif showing how to create a Codepen account.",
- "For our front end project challenges, we'll use a popular browser-based code editor called CodePen. Click the \"Open link in new tab\" button below to open CodePen's signup page. Fill out the form and click \"Sign up\".
h1
element with the text \"Hello World\". You can drag the frames around to resize them. You can also click the \"Change View\" button and change the orientation of the frames.",
- ""
- ],
- [
- "//i.imgur.com/G9KFQDL.gif",
- "A gif showing the process of adding Bootstrap to your pen.",
- "Click the gear in the upper left hand corner of the CSS box, then scroll down to \"Quick add\" and choose Bootstrap. Now give your h1
element the class of text-primary
to change its color and prove that Bootstrap is now available.",
- ""
- ],
- [
- "//i.imgur.com/m0pWik2.gif",
- "A gif showing the process of turning off auto update preview",
- "When using CodePen and Ajax, it is a good idea to turn off automatic preview updating so API calls are not made too often. Too many API calls can sometimes lead to temporary blockages, and may require waiting periods before they can be used again. h1
com o texto \"Hello World\". Você pode arrastar as bordas para redimensioná-las. Você pode também clicar no botão \"Change View\" e mudar a orientação das janelas.",
- ""
- ],
- [
- "//i.imgur.com/G9KFQDL.gif",
- "Um gif mostrando como adicionar o Bootstrap à sua pen.",
- "Clique na engrenagem no canto superior esquerdo da caixa do CSS, então role para baixo até \"Quick add\" e escolha Bootstrap. Agora adicione ao seu elemento h1
a classe text-primary
para mudar sua cor e provar que o Bootstrap agora está disponível.",
- ""
- ],
- [
- "//i.imgur.com/m0pWik2.gif",
- "Um gif mostrando o processo de desativar o update automático da janela de visualização",
- "Ao usar CodePen e Ajax, é uma boa idea desativar o update automático da janela de visualização para que as chamadas para as APIs não sejam feitas a todo momento. Muitas chamadas para API pode levar à bloqueios temporários e podem requerer períodos de esperar para que possam ser usadas novamente. https://en.wikipedia.org/wiki/Special:Random
.",
- "Hint #2: Here's an entry on using Wikipedia's API: https://www.mediawiki.org/wiki/API:Main_page
.",
- "Hint #3: Use this link to experiment with Wikipedia's API.",
- "Remember to use Read-Search-Ask if you get stuck.",
- "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.",
- "You can get feedback on your project by sharing it with your friends on Facebook."
- ],
- "challengeSeed": [
- "wJhcPwVYA1g"
- ],
- "tests": [],
- "type": "zipline",
- "challengeType": 3,
- "isRequired": true,
- "translations": {
- "es": {
- "title": "Crea un buscador de Wikipedia",
- "description": [
- "Objetivo: Crea una aplicación con CodePen.io cuya funcionalidad sea similar a la de esta: https://codepen.io/freeCodeCamp/full/wGqEga/.",
- "Regla #1: No veas el código del proyecto de ejemplo en CodePen. Encuentra la forma de hacerlo por tu cuenta.",
- "Regla #2: Satisface las siguientes historias de usuario. Usa cualquier librería o APIs que necesites. Dale tu estilo personal.",
- "Historia de usuario: Pedo obtener información acerca del clima en mi localización actual.",
- "Historia de usuario: Puedo ver un icono diferente o una imagen de fondo diferente (e.g. montaña con nieve, desierto caliente) dependiendo del clima.",
- "Historia de usuario: Puedo pulsar un botón para cambiar la unidad de temperatura de grados Fahrenheit a Celsius y viceversa.",
- "Historia de usuario: Puedo buscar entradas en Wikipedia en un cuadro de búsqueda y ver las entradas de Wikipedia resultantes.",
- "Historia de usuario:Puedo pulsar un botón para ver un artículo aleatorio de Wikipedia.",
- "Pista 1: Aquí está una URL donde puedes ver una entrada aleatoria de Wikipedia: https://es.wikipedia.org/wiki/Special:Random<
.",
- "Pista 2: Este es un artículo muy útil relativo al uso del API de Wikipedia: https://www.mediawiki.org/wiki/API:Main_page
.",
- "Pista 3: Usa este enlace para experimentar con el API de Wikipedia.",
- "Recuerda utilizar Leer-Buscar-Preguntar si te sientes atascado.",
- "Cuando hayas terminado, pulsa el botón de \"I've completed this challenge\" e incluye un enlace a tu CodePen.",
- "Puedes obtener retroalimentación sobre tu proyecto por parte de otros campistas, compartiendolo en nuestra Sala de chat para revisión de código. También puedes compartirlo en Twitter y en el campamento de tu ciudad (en Facebook)."
- ]
- }
- }
- },
- {
- "id": "bd7158d8c442eddfaeb5bd1f",
- "title": "Use the Twitch.tv JSON API",
- "description": [
- "Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/freeCodeCamp/full/Myvqmo/.",
- "Fulfill the following user stories. Use whichever libraries or APIs you need. Give it your own personal style.",
- "User Story: I can see whether Free Code Camp is currently streaming on Twitch.tv.",
- "User Story: I can click the status output and be sent directly to the Free Code Camp's Twitch.tv channel.",
- "User Story: if a Twitch user is currently streaming, I can see additional details about what they are streaming.",
- "User Story: I will see a placeholder notification if a streamer has closed their Twitch account (or the account never existed). You can verify this works by adding brunofin and comster404 to your array of Twitch streamers.",
- "Hint: See an example call to Twitch.tv's JSONP API at http://forum.freecodecamp.com/t/use-the-twitchtv-json-api/19541.",
- "Hint: The relevant documentation about this API call is here: https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel.",
- "Hint: Here's an array of the Twitch.tv usernames of people who regularly stream: [\"ESL_SC2\", \"OgamingSC2\", \"cretetion\", \"freecodecamp\", \"storbeck\", \"habathcx\", \"RobotCaleb\", \"noobs2ninjas\"]
",
- "UPDATE: Due to a change in conditions on API usage explained here Twitch.tv now requires an API key, but we've built a workaround. Use https://wind-bow.gomix.me/twitch-api instead of twitch's API base URL (i.e. https://api.twitch.tv/kraken ) and you'll still be able to get account information, without needing to sign up for an API key.",
- "Remember to use Read-Search-Ask if you get stuck.",
- "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.",
- "You can get feedback on your project by sharing it with your friends on Facebook."
- ],
- "challengeSeed": [
- "6WrbY1d-IHI"
- ],
- "tests": [],
- "type": "zipline",
- "challengeType": 3,
- "isRequired": true,
- "translations": {
- "es": {
- "title": "Usa el API JSON de Twitch.tv",
- "description": [
- "Objetivo: Crea una aplicación con CodePen.io cuya funcionalidad sea similar a la de esta: https://codepen.io/freeCodeCamp/full/Myvqmo/.",
- "Regla #1: No veas el código del proyecto de ejemplo en CodePen. Encuentra la forma de hacerlo por tu cuenta.",
- "Regla #2: Satisface las siguientes historias de usuario. Usa cualquier librería o APIs que necesites. Dale tu estilo personal.",
- "Historia de usuario: Puedo verificar si Free Code Camp está transmitiendo actualmente en Twitch.tv",
- "Historia de usuario: Puedo pulsar el estatus y ser enviado directamente al canal de Free Code Camp en Twitch.tv.",
- "Historia de usuario: Si un usuario Twitch está transmitiendo actualmente, puedo ver detalles adicionales acerca del contenido que están transmitiendo.",
- "Historia de usuario: Puedo ver una notificación si el usuario ha cerrado su cuenta de Twitch (o si la cuenta nunca ha existido). Puedes verificar si esto funciona agregando brunofin y comster404 a tu vector de usuarios de Twitch.",
- "Pista: Obseva una llamada de ejemplo al API JSONP de Twitch.tv en http://forum.freecodecamp.com/t/use-the-twitchtv-json-api/19541
.",
- "Pista: La documentación relevante sobre esta llamada al API está aquí: https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel.",
- "Pista: Aquí está un vector de usuarios en Twitch.tv que regularmente transmiten sobre programación: [\"ESL_SC2\", \"OgamingSC2\", \"cretetion\", \"freecodecamp\", \"storbeck\", \"habathcx\", \"RobotCaleb\", \"noobs2ninjas\"]
",
- "Recuerda utilizar Leer-Buscar-Preguntar si te sientes atascado.",
- "Cuando hayas terminado, pulsa el botón de \"I've completed this challenge\" e incluye un enlace a tu CodePen.",
- "Puedes obtener retroalimentación sobre tu proyecto por parte de otros campistas, compartiendolo en nuestra Sala de chat para revisión de código. También puedes compartirlo en Twitter y en el campamento de tu ciudad (en Facebook)."
- ]
- },
- "ru": {
- "title": "Используйте Twitch.tv JSON API",
- "description": [
- "Задание: Создайте CodePen.io который успешно копирует вот этот: https://codepen.io/freeCodeCamp/full/Myvqmo/.",
- "Правило #1: Не подсматривайте код приведенного на CodePen примера. Напишите его самостоятельно.",
- "Правило #2: Можете использовать любые библиотеки или API, которые потребуются.",
- "Правило #3: Воссоздайте функционал приведенного примера и не стесняйтесь добавить что-нибудь от себя.",
- "Реализуйте следующие пользовательские истории, сделайте также бонусные по желанию:",
- "Пользовательская история: В качестве пользователя, я могу увидеть идет ли в данный момент на Twitch.tv трансляция Free Code Camp.",
- "Пользовательская история: В качестве пользователя, я могу, кликнув на описание трансляции, перейти на канал Free Code Camp.",
- "Пользовательская история: В качестве пользователя, я могу видеть дополнительную информацию о текущей трансляции Free Code Camp.",
- "Бонусная пользовательская история: В качестве пользователя, я могу произвести поиск среди перечисленных каналов.",
- "Бонусная пользовательская история: В качестве пользователя, я могу видеть уведомление, если создатель канала закрыл свой аккаунт на Twitch.tv. Добавьте в массив имена пользователей brunofin и comster404, чтобы убедиться, что эта функция реализована правильно.",
- "Подсказка: Пример запроса к Twitch.tv JSON API: https://api.twitch.tv/kraken/streams/freecodecamp
.",
- "Подсказка: Документацию об этом запросе можно найти по ссылке: https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel.",
- "Подсказка: В этом массиве приведены имена пользователей, которые регулярно пишут код онлайн: [\"ESL_SC2\", \"OgamingSC2\", \"cretetion\", \"freecodecamp\", \"storbeck\", \"habathcx\", \"RobotCaleb\", \"noobs2ninjas\"]
",
- "Если что-то не получается, воспользуйтесь Read-Search-Ask.",
- "Когда выполните задание кликните кнопку \"I've completed this challenge\" и добавьте ссылку на ваш CodePen. Если вы программировали с кем-то в паре, также добавьте имя вашего напарника.",
- "Если вы хотите получить немедленную оценку вашего проекта, нажмите эту кнопку и добавьте ссылку на ваш CodePen. В противном случае мы проверим его перед тем как вы приступите к проектам для некоммерческих организаций.$(document).ready()
function does. This function runs such that all of the code inside of it executes only once our page has finished loading.",
- "So Let's start by implementing a click event handler
inside of our $(document).ready()
function by adding this code:",
- "$(\"#getMessage\").on(\"click\", function(){});", - "After completing this, proceed to the next challenge where we will make our \"Get Message\" button change the text of the element with the class
message
."
- ],
- "challengeSeed": [
- "fccss",
- " $(document).ready(function() {",
- " // Only change code below this line.",
- " ",
- " // Only change code above this line.",
- " });",
- "fcces",
- "",
- "",
- "getMessage
');",
- "assert(code.match(/\\n*?\\s*?\\}\\n*?\\s*?\\);/gi) && code.match(/\\n*?\\s*?\\}\\);/gi).length >= 2, 'message: Be sure to close your functions with });
');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "es": {
- "title": "Activa eventos de pulsación con jQuery",
- "description": [
- "En esta sección, vamos a aprender cómo obtener datos de las APIs. Las APIs - o interfaces de programación de aplicaciones - son herramientas que utilizan los computadores para comunicarse entre sí.",
- "También aprenderemos cómo actualizar HTML con los datos que obtenemos de estas API usando una tecnología llamada Ajax.",
- "En primer lugar, vamos a revisar lo que hace la función $(document).ready()
. Esta función hace que todo el código dentro de ella se ejecute sólo hasta que nuestra página ha sido cargada.",
- "Hagamos que nuestro botón \"Get message\" cambie el texto del elemento con clase message
.",
- "Antes de poder hacer esto, tenemos que implementar un evento de pulsación
dentro de nuestra función $(document).ready()
, añadiendo este código:",
- "$(\"#getMessage\").on(\"click\", function(){});" - ] - }, - "pt": { - "title": "Ativando eventos de clique com jQuery", - "description": [ - "Nesta sessão, vamos aprender como obter dados de uma API. As APIS - Interface de Programação de Aplicativos - são ferramentas usadas pelos computadores para se comunicarem entre si.", - "Também aprenderemos como utilizar o HTML com os dados obtidos de uma API usando uma tecnologia chamada Ajax", - "Em primeiro lugar, vamos revir o que faz a função
$(document).ready()
. Esta função faz com que todo o codigo que esteja dentro de seu escopo execute somente quando a nossa página tenha sido carregada.",
- "Vamos fazer nosso butão \"Get message\" mudar o texto do elemento com a classe message
.",
- "Antes de poder fazer isso, temos que implementar um evento de clique
dentro da nossa função $(document).ready()
, adicionando este código:",
- "$(\"#getMessage\").on(\"click\", function(){});" - ] - } - } - }, - { - "id": "56bbb991ad1ed5201cd392d5", - "title": "Change Text with Click Events", - "description": [ - "When our click event happens, we can use jQuery to update an HTML element.", - "Let's make it so that when a user clicks the \"Get Message\" button, we change the text of the element with the class
message
to say \"Here is the message\".",
- "We can do this by adding the following code within our click event:",
- "$(\".message\").html(\"Here is the message\");
"
- ],
- "challengeSeed": [
- "fccss",
- " $(document).ready(function() {",
- " $(\"#getMessage\").on(\"click\", function(){",
- " // Only change code below this line.",
- " ",
- " // Only change code above this line.",
- " });",
- " });",
- "fcces",
- "",
- "",
- "message
the text \"Here is the message\".');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "es": {
- "title": "Cambia texto con eventos de pulsación",
- "description": [
- "Cuando nuestro evento de pulsación ocurre, podemos utilizar jQuery para actualizar un elemento HTML.",
- "Hagamos que cuando un usuario pulse el botón \"Get Message\", el texto del elemento con la clase message
cambie para decir \"Here is the message\".",
- "Podemos hacerlo añadiendo el siguiente código dentro de nuestro evento de pulsación:",
- "$(\".message\").html(\"Here is the message\");
"
- ]
- },
- "pt": {
- "title": "Mundando texto com eventos de clique",
- "description": [
- "Quando nosso evento de clique ocorre, podemos utilizar o jQuery para atualixar um elemento HTML",
- "Vamos fazer que quando um usuário clicar no botão \"Get Message\", o texto do elemento com a classe message
passe a dizer \"Here is the message\".",
- "Podemos fazer isso adicionando o seguinte código dentro do nosso evento de clique:",
- "$(\".message\").html(\"Here is the message\");
"
- ]
- }
- }
- },
- {
- "id": "56bbb991ad1ed5201cd392d6",
- "title": "Get JSON with the jQuery getJSON Method",
- "description": [
- "You can also request data from an external source. This is where APIs come into play.",
- "Remember that APIs - or Application Programming Interfaces - are tools that computers use to communicate with one another.",
- "Most web APIs transfer data in a format called JSON. JSON stands for JavaScript Object Notation.",
- "You've already been using JSON whenever you create a JavaScript object. JSON is nothing more than object properties and their current values, sandwiched between a {
and a }
.",
- "These properties and their values are often referred to as \"key-value pairs\".",
- "Let's get the JSON from Free Code Camp's Cat Photo API.",
- "Here's the code you can put in your click event to do this:",
- "$.getJSON(\"/json/cats.json\", function(json) {", - "Once you've added this, click the \"Get Message\" button. Your Ajax function will replace the \"The message will go here\" text with the raw JSON output from the Free Code Camp Cat Photo API." - ], - "challengeSeed": [ - "fccss", - " $(document).ready(function() {", - "", - " $(\"#getMessage\").on(\"click\", function(){", - " // Only change code below this line.", - " ", - " ", - " ", - " // Only change code above this line.", - " });", - "", - " });", - "fcces", - "", - "
$(\".message\").html(JSON.stringify(json));
});
getMessage
button to trigger the AJAX request.');",
- "assert(code.match(/\\s*?\\}\\s*?\\)\\s*?\\;/g), 'message: You should have at least one closing set of brackets and parenthesis.');",
- "assert(code.match(/\\s*?\\}\\s*?\\)\\s*?\\;/g) && code.match(/\\,\\s*?function\\s*?\\(\\s*?[A-Za-z_\\$]?\\w*?\\s*?\\)\\s*?\\{/g) && code.match(/\\s*?\\}\\s*?\\)\\s*?\\;/g).length === code.match(/\\s*?function\\s*?\\(\\s*?[A-Za-z_\\$]?\\w*?\\s*?\\)\\s*?\\{/g).length, 'message: Each callback function should have a closing set of brackets and parenthesis.');",
- "assert(code.match(/\\$\\s*?\\.\\s*?getJSON\\s*?\\(\\s*?(\\\"|\\')\\/json\\/cats\\.json(\\\"|\\')\\s*?\\,\\s*?function\\s*?\\(\\s*?[A-Za-z_\\$]\\w*\\s*?\\)\\s*?\\{/g), 'message: You should be making use of the getJSON
method given in the description to load data from the JSON file.');",
- "assert(code.match(/\\$\\s*?\\.\\s*?getJSON\\s*?\\(\\s*?(\\\"|\\')\\/json\\/cats\\.json(\\\"|\\')\\s*?\\,\\s*?function\\s*?\\(\\s*?([A-Za-z_\\$]\\w*)\\s*?\\)\\s*?{/g) && /\\$\\s*?\\.\\s*?getJSON\\s*?\\(\\s*?(\\\"|\\')\\/json\\/cats\\.json(\\\"|\\')\\s*?,\\s*?function\\s*?\\(\\s*?([A-Za-z_\\$]\\w*)\\s*?\\)/g.exec(code)[3] === /\\$\\(\\s*?(\\\"|\\')\\.message\\s*?(\\\"|\\')\\s*?\\)\\s*?\\.html\\s*?\\(\\s*?JSON\\s*?\\.\\s*?stringify\\s*?\\(\\s*?([A-Za-z_\\$]\\w*)\\s*?\\)\\s*?\\)/g.exec(code)[3], 'message: Don't forget to make the .html
change the contents of the message box so that it contains the result of the getJSON
.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "es": {
- "title": "Obtén JSON con el método getJSON de jQuery",
- "description": [
- "También puedes solicitar los datos de una fuente externa. Aquí es donde entran en juego las API. ",
- "Recuerda que las API - o interfaces de programación de aplicaciones - son herramientas que utilizan los ordenadores para comunicarse entre sí.",
- "La mayoría de las API para el web transfieren datos en un formato llamado JSON. JSON significa notación de objeto JavaScript (JavaScript Object Notation).",
- "Tú ya has usado JSON al crear objetos en JavaScript. JSON no es más que las propiedades del objeto y sus valores actuales, intercalados entre un {
y un }
. ",
- "Estas propiedades y sus valores a menudo se denominan \" pares llave-valor\".",
- "Vamos a obtener el JSON de la API de fotos de gato de Free Code Camp.",
- "Aquí está el código que puedes poner en tu evento de pulsación para lograrlo:",
- "$.getJSON(\"/json/cats.json\", function(json) {", - "Una vez lo añadas, pulsa el botón \"Get Message\". Tu función Ajax sustituirá el texto \"The message will go here\" con la salida JSON en bruto de la API de fotos de gato de Free Code Camp." - ] - }, - "pt": { - "title": "Obter um JSON com o método getJSON do jQuery", - "description": [ - "Também é possivel solicitar os dados de uma fonte externa. É aqui onde as API's entram em jogo.", - "Lembre que as API's - Interface de Programação de Aplicativos - são ferramentas que os computadores usam para se comunicar entre si.", - "A maioria das API's transferem de dados para web em um formato chamado JSON. JSON significa notação de objeto JavaScript (JavaScript Object Notation).", - "Você já usou JSON para criar objetos em JavaScript. O JSON não é mais que as propriedades de um objeto e seus valores atuais, separados entre
$(\".message\").html(JSON.stringify(json));
});
{
e um }
.",
- "Estas propriedades e seus valores são muitas vezes denominados de \" pares chave-valor\".",
- "Vamos obter o JSON da API de fotos de gatos do Free Code Camp.",
- "Aqui esta o código que você pode por no nosso evento de clique para fazer isso:",
- "$.getJSON(\"/json/cats.json\", function(json) {", - "Uma vez adicionadas, aperte o botão \"Get Message\". Sua função Ajax substituirá o texto \"The message will go here\" com a saída bruta do JSON da API de gatos do Free Code Camp." - ] - } - } - }, - { - "id": "56bbb991ad1ed5201cd392d7", - "title": "Convert JSON Data to HTML", - "description": [ - "Now that we're getting data from a JSON API, let's display it in our HTML.", - "We can use the
$(\".message\").html(JSON.stringify(json));
});
.forEach()
method to loop through our data and modify our HTML elements.",
- "First, let's declare an html variable with var html = \"\";
.",
- "Then, let's loop through our JSON, adding more HTML to that variable. When the loop is finished, we'll render it.",
- "Here's the code that does this:",
- "json.forEach(function(val) { var keys = Object.keys(val); html += \"<div class='cat'>\"; keys.forEach(function(key) { html += \"<strong>\" + key + \"</strong>: \" + val[key] + \"<br>\"; }); html += \"</div><br>\";});" - ], - "challengeSeed": [ - "fccss", - " $(document).ready(function() {", - "", - " $(\"#getMessage\").on(\"click\", function() {", - " $.getJSON(\"/json/cats.json\", function(json) {", - "", - " var html = \"\";", - " // Only change code below this line.", - " ", - " ", - " ", - " // Only change code above this line.", - "", - " $(\".message\").html(html);", - "", - " });", - " });", - " });", - "fcces", - "", - "
.forEach()
para recorrer nuestros datos y modificar nuestros elementos HTML.",
- "En primer lugar, vamos a declarar una variable llamada html
con var html = \"\";
.",
- "Después, iteremos a traveś de nuestro JSON, añadiendo más HTML a esa variable. Cuando se termina el ciclo, vamos a presentarla. ",
- "Aquí está el código que hace esto:",
- "json.forEach(function(val) { var keys = Object.keys(val); html += \"<div class='cat'>\"; keys.forEach(function(key) { html += \"<strong>\" + key + \"</strong>: \" + val[key] + \"<br>\"; }); html += \"</div><br>\";});" - ] - }, - "pt": { - "title": "Converter dados JSON para HTML", - "description": [ - "Agora que estamos obtendo os dados de uma API JSON, vamos mostra-los em nosso HTML", - "Podemos usar o método
.forEach()
para percorrer os nossos dados e modificar o elementos HTML.",
- "Em primeiro lugar, vamos declarar uma variável chamada html
com var html = \"\";
.",
- "Depois, vamos percorrer através do nosso JSON, adicionando mais HTML para a nossa variável. Quando essa iteração terminar, vamos apresentar o resultado.",
- "Aqui está o código que faz isso:",
- "json.forEach(function(val) { var keys = Object.keys(val); html += \"<div class='cat'>\"; keys.forEach(function(key) { html += \"<strong>\" + key + \"</strong>: \" + val[key] + \"<br>\"; }); html += \"</div><br>\";});" - ] - } - } - }, - { - "id": "56bbb991ad1ed5201cd392d8", - "title": "Render Images from Data Sources", - "description": [ - "We've seen from the last two lessons that each object in our JSON array contains an
imageLink
key with a value that is the URL of a cat's image.",
- "When we're looping through these objects, let's use this imageLink
property to display this image in an img
element.",
- "Here's the code that does this:",
- "html += \"<img src='\" + val.imageLink + \"' \" + \"alt='\" + val.altText + \"'>\";
"
- ],
- "challengeSeed": [
- "fccss",
- " $(document).ready(function() {",
- "",
- " $(\"#getMessage\").on(\"click\", function() {",
- " $.getJSON(\"/json/cats.json\", function(json) {",
- "",
- " var html = \"\";",
- "",
- " json.forEach(function(val) {",
- "",
- " html += \"imageLink
property to display the images.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "es": {
- "title": "Presenta imágenes de fuentes de datos",
- "description": [
- "Hemos visto en las dos últimas lecciones que cada objeto en nuestro vector JSON contiene una llave imageLink
con un valor que corresponde a la URL de la imagen de un gato.",
- "Cuando estamos recorriendo estos objetos, usemos esta propiedad imageLink
para visualizar la imagen en un elemento img
.",
- "Aquí está el código que hace esto:",
- "html += \"<img src='\" + val.imageLink + \"' \" + \"alt='\" + val.altText + \"'>\";
"
- ]
- },
- "pt": {
- "title": "Apresentar as imagens da fonte de dados",
- "description": [
- "Como temos visto nas ultimas lições, cada objeto em nosso array JSON contém a chave imageLink
com um valor que corresponde a URL da imagem de um gato.",
- "Quando estamos percorrendo por estes objetos, usamos a propriedade imageLink
para visualizar a imagem em um elemento img
.",
- "Aqui está o código para fazer isso:",
- "html += \"<img src='\" + val.imageLink + \"' \" + \"alt='\" + val.altText + \"'>\";
"
- ]
- }
- }
- },
- {
- "id": "56bbb991ad1ed5201cd392d9",
- "title": "Prefilter JSON",
- "description": [
- "If we don't want to render every cat photo we get from our Free Code Camp's Cat Photo JSON API, we can pre-filter the json before we loop through it.",
- "Let's filter out the cat whose \"id\" key has a value of 1.",
- "Here's the code to do this:",
- "json = json.filter(function(val) { return (val.id !== 1);});" - ], - "challengeSeed": [ - "fccss", - " $(document).ready(function() {", - "", - " $(\"#getMessage\").on(\"click\", function() {", - " $.getJSON(\"/json/cats.json\", function(json) {", - "", - " var html = \"\";", - "", - " // Only change code below this line.", - " ", - " ", - " ", - " // Only change code above this line.", - "", - " json.forEach(function(val) {", - "", - " html += \"
json = json.filter(function(val) { return (val.id !== 1);});" - ] - }, - "pt": { - "title": "Pré-filtro JSON", - "description": [ - "Se não queremos apresentar cada foto de gato que obtemos da API JSON de fotos de gatos do Free Code Camp, podemos realizar um pré-filtro o JSON antes de iterar através dele.", - "Vamos filtrar o gato cuja a chave \"id\" tenha o valor 1.", - "Aqui está o código para fazer isso:", - "
json = json.filter(function(val) { return (val.id !== 1);});" - ] - } - } - }, - { - "id": "56bbb991ad1ed5201cd392da", - "title": "Get Geo-location Data", - "description": [ - "Another cool thing we can do is access our user's current location. Every browser has a built in navigator that can give us this information.", - "The navigator will get our user's current longitude and latitude.", - "You will see a prompt to allow or block this site from knowing your current location. The challenge can be completed either way, as long as the code is correct.", - "By selecting allow you will see the text on the output phone change to your latitude and longitude", - "Here's some code that does this:", - "
if (navigator.geolocation) {", - "Don't forget to use double quotes around selectors as mentioned here." - ], - "challengeSeed": [ - "fccss", - " // Only change code below this line.", - " ", - " ", - " ", - " // Only change code above this line.", - "fcces", - "
navigator.geolocation.getCurrentPosition(function(position) {
$(\"#data\").html(\"latitude: \" + position.coords.latitude + \"<br>longitude: \" + position.coords.longitude);
});
}
navigator.geolocation
to access the users current location.');",
- "assert(code.match(/position\\.coords\\.latitude/gi), 'message: You should make use of position.coords.latitude
to display the users' latitudinal location.');",
- "assert(code.match(/position\\.coords\\.longitude/gi), 'message: You should make use of position.coords.longitude
to display the users' longitudinal location.');",
- "assert(code.match(/\\$\\(\\s*['\"]#data['\"]\\s*\\)\\s*\\.html\\([.\\w\\W]*?\\);/gi), 'message: You should display the users' position within the data
div element');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "es": {
- "title": "Recibir datos de Geo-localización",
- "description": [
- "Otra cosa interesante que podemos hacer es acceder a la ubicación actual de nuestros usuarios. Todos los navegadores han incorporado un geo-localizador que nos puede dar esta información. ",
- "El navegador puede obtener la longitud y latitud actual de nuestros usuarios.",
- "Como usuario verás un mensaje para permitir o evitar que el sitio conozca tu ubicación actual. El desafío se puede completar de cualquier manera, siempre y cuando el código sea correcto. ",
- "Si lo permites, verás que el texto en el teléfono de la derecha cambiará con tu latitud y longitud",
- "Aquí hay un código que hace esto:",
- "if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { $(\"#data\").html(\"latitude: \" + position.coords.latitude + \"<br>longitude: \" + position.coords.longitude); });}" - ] - }, - "pt": { - "title": "Receber dados de Geo-localização", - "description": [ - "Outra coisa interessante que podemos fazer é acessar a atual localização do nosso usuário. Todos os navegadores tem implementado um geo-localizador que pode nos fornecer essa informação.", - "O navegador pode obter a longitude e latitude atual de nossos usuários", - "Você irá ver uma janela para bloquear ou permitir que o site possa conhecer a nossa localização atual. O desafio será completado de qualquer maneira, sempre que o código estará correto.", - "Se você permitir, irá ver o texto de saída do telefone mudar para sua latitude e longitude.", - "Aqui está o código para fazer isso:", - "
if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { $(\"#data\").html(\"latitude: \" + position.coords.latitude + \"<br>longitude: \" + position.coords.longitude); });}" - ] - } - } - } - ] -} diff --git a/seed/challenges/01-front-end-development-certification/object-oriented-and-functional-programming.json b/seed/challenges/01-front-end-development-certification/object-oriented-and-functional-programming.json deleted file mode 100644 index d5c3bbc17eae6c..00000000000000 --- a/seed/challenges/01-front-end-development-certification/object-oriented-and-functional-programming.json +++ /dev/null @@ -1,698 +0,0 @@ -{ - "name": "Object Oriented and Functional Programming", - "order": 7, - "time": "2 hours", - "helpRoom": "HelpJavaScript", - "note": [ - "Methods", - "Closures", - "Factories", - "Pure Functions", - "Currying Functions", - "Functors", - "Currying Functions" - ], - "challenges": [ - { - "id": "cf1111c1c15feddfaeb1bdef", - "title": "Declare JavaScript Objects as Variables", - "description": [ - "Before we dive into Object Oriented Programming, let's revisit JavaScript objects.", - "Give your
motorBike
object wheels
, engines
and seats
attributes and set each to a number."
- ],
- "challengeSeed": [
- "var car = {",
- " \"wheels\":4,",
- " \"engines\":1,",
- " \"seats\":5",
- "};",
- "",
- "var motorBike = {",
- "",
- " // Only change code below this line.",
- "",
- "};"
- ],
- "tail": [
- "(function() {return JSON.stringify(motorBike);})();"
- ],
- "solutions": [
- "var car = {\n \"wheels\":4,\n \"engines\":1,\n \"seats\":5\n};\n\nvar motorBike = {\n \"wheels\": 4,\n \"engines\": 1,\n \"seats\": 2\n};"
- ],
- "tests": [
- "assert(typeof motorBike.engines === 'number', 'message: motorBike
should have an engines
attribute set to a number.');",
- "assert(typeof motorBike.wheels === 'number', 'message: motorBike
should have a wheels
attribute set to a number.');",
- "assert(typeof motorBike.seats === 'number', 'message: motorBike
should have a seats
attribute set to a number.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Declara objetos de JavaScript como variables",
- "description": [
- "Antes de sumergirnos en Programación Orientada a Objetos, vamos a revisar los objetos de JavaScript.",
- "Dale a tu objeto motorBike
un atributo wheels
, otro llamado motors
y otro seats
y asignales números."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c15feddfaeb2bdef",
- "title": "Construct JavaScript Objects with Functions",
- "description": [
- "We are also able to create objects using constructor
functions.",
- "A constructor
function is given a capitalized name to make it clear that it is a constructor
.",
- "Here's an example of a constructor
function:",
- "var Car = function() {", - "In a
this.wheels = 4;
this.engines = 1;
this.seats = 5;
};
constructor
the this
variable refers to the new object being created by the constructor. So when we write,",
- " this.wheels = 4;
",
- "inside of the constructor
we are giving the new object it creates a property called wheels
with a value of 4
.",
- "You can think of a constructor
as a description for the object it will create.",
- "Have your MotorBike
constructor
describe an object with wheels
, engines
and seats
properties and set them to numbers."
- ],
- "challengeSeed": [
- "var Car = function() {",
- " this.wheels = 4;",
- " this.engines = 1;",
- " this.seats = 5;",
- "};",
- "",
- "// Only change code below this line.",
- "",
- "var MotorBike = function() {",
- "",
- "};"
- ],
- "tail": [
- "(function() {return JSON.stringify(new MotorBike());})();"
- ],
- "solutions": [
- "var Car = function() {\n this.wheels = 4;\n this.engines = 1;\n this.seats = 5;\n};\n\nvar myCar = new Car();\n\nvar MotorBike = function() {\n this.engines = 1;\n this.seats = 1;\n this.wheels = 4;\n};\n\nvar myMotorBike = new MotorBike();"
- ],
- "tests": [
- "assert(typeof (new MotorBike()).engines === 'number', 'message: MotorBike
should have an engines
attribute set to a number.');",
- "assert(typeof (new MotorBike()).wheels === 'number', 'message: MotorBike
should have a wheels
attribute set to a number.');",
- "assert(typeof (new MotorBike()).seats === 'number', 'message: MotorBike
should have a seats
attribute set to a number.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Construye objetos de JavaScript con funciones",
- "description": [
- "También podemos crear objetos utilizando funciones constructoras
.",
- "A cada función constructora
se le da un nombre comenzando en mayúsculas para que quede claro que es una constructora
.",
- "He aquí un ejemplo de una función constructora
:",
- "var Carro = function() {
",
- "& nbsp; & nbsp; this.llantas = 4;
",
- "& nbsp; & nbsp; this.motores = 1;
",
- "& nbsp; & nbsp; this.asientos = 5;
",
- "};
",
- "En una constructora
la variable this
hace referencia al nuevo objeto que está siendo creado por la constructora. Así que cuando escribimos ",
- " this.llantas = 4;
",
- "dentro de la constructora
le estamos dando el nuevo objeto que se crea una propiedad llamada llantas
con un valor de 4
.",
- "Puedes pensar en una constructora
como una descripción del objeto que crea.",
- "Haz que tu constructora
MotorBike
describa un objeto con las propiedades wheels
,engines
and seats
y asignales números."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c15feddfaeb4bdef",
- "title": "Make Instances of Objects with a Constructor Function",
- "description": [
- "Now let's put that great constructor
function we made in the last lesson to use!",
- "To use a constructor
function we call it with the new
keyword in front of it like:",
- "var myCar = new Car();
",
- "myCar
is now an instance
of the Car
constructor that looks like the object it described:",
- "{", - "Note that it is important to use the
wheels: 4,
engines: 1,
seats: 5
}
new
keyword when calling a constructor. This is how Javascript knows to create a new object and that all the references to this
inside the constructor should be referring to this new object.",
- "Now, once the myCar
instance
is created it can be used like any other object and can have its properties accessed and modified the same way you would usually. For example:",
- "myCar.turboType = \"twin\";
",
- "Our myCar
variable now has a property turboType
with a value of \"twin\"
.",
- "In the editor, use the Car
constructor
to create a new instance
and assign it to myCar
.",
- "Then give myCar
a nickname
property with a string value."
- ],
- "challengeSeed": [
- "var Car = function() {",
- " this.wheels = 4;",
- " this.engines = 1;",
- " this.seats = 5;",
- "};",
- "",
- "// Only change code below this line.",
- "",
- "var myCar;"
- ],
- "tail": [
- "(function() {return JSON.stringify(myCar);})();"
- ],
- "solutions": [
- "var Car = function() {\n this.wheels = 4;\n this.engines = 1;\n this.seats = 5;\n};\n\nvar myCar = new Car();\n\nmyCar.nickname = \"Lucy\";"
- ],
- "tests": [
- "assert((new Car()).wheels === 4, 'message: The property wheels
should still be 4
in the object constructor
.');",
- "assert(typeof (new Car()).nickname === 'undefined', 'message: There should not be a property nickname
in the object constructor
.');",
- "assert(myCar.wheels === 4, 'message: The property wheels
of myCar
should equal 4
.');",
- "assert(typeof myCar.nickname === 'string', 'message: The property nickname
of myCar
should be a string.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Crea instancias de objetos con funciones constructoras",
- "description": [
- "¡Ahora usemos esa gran constructora
que hicimos en la última lección!",
- "Para utilizar una función constructora
la llamamos con la palabra reservada new
al frente, como:",
- "var miCarro = new Carro();
",
- "miCarro
es ahora una instancia
de la constructora Carro
que se parece al objeto que describe:",
- "{
",
- " wheels: 4,
",
- " engines: 1,
",
- " seats: 5
",
- "}
",
- "Ten en cuenta que es importante utilizar la palabra reservada new
cuando se llama a una constructora. Así es como Javascript sabe crear un objeto nuevo y hace que todas las referencias a this
dentro del constructor se refieran al objeto nuevo ",
- "Ahora, una vez que la instancia
miCarro
se crea, puede ser utilizada como cualquier otro objeto y puedes acceder o modificar sus propiedades como lo harías normalmente. Por ejemplo:",
- "miCarro.tipoTurbo = \"doble\";
",
- "Nuestra variable miCarro
tiene ahora una propiedad tipoTurbo
con un valor de \"doble\"
.",
- "En el editor, utiliza la constructora
Car
para crear una nueva instancia
y asignala a myCar
.",
- "A continuación, dale a myCar
una propiedad nickname
con un valor tipo cadena."
- ]
- }
- }
- },
- {
- "id": "563cfb55594311ffcb333c70",
- "title": "Make Unique Objects by Passing Parameters to our Constructor",
- "description": [
- "The constructor
we have is great, but what if we don't always want to create the same object?",
- "To solve this we can add parameters
to our constructor
. We do this like the following example:",
- "var Car = function(wheels, seats, engines) {", - "Now we can pass in
this.wheels = wheels;
this.seats = seats;
this.engines = engines;
};
arguments
when we call our constructor
.",
- "var myCar = new Car(6, 3, 1);
",
- "This code will create an object that uses the arguments
we passed in and looks like:",
- "{", - "Now give it a try yourself! Alter the
wheels: 6,
seats: 3,
engines: 1
}
Car
constructor
to use parameters
to assign values to the wheels
, seats
, and engines
properties.",
- "Then call your new constructor
with three number arguments
and assign it to myCar
to see it in action."
- ],
- "challengeSeed": [
- "var Car = function() {",
- " //Change this constructor",
- " this.wheels = 4;",
- " this.seats = 5;",
- " this.engines = 1;",
- "};",
- "",
- "//Try it out here",
- "var myCar;"
- ],
- "tail": [
- "(function() {return JSON.stringify(myCar);})();"
- ],
- "solutions": [
- "var Car = function(wheels,seats,engines) {\n this.wheels = wheels;\n this.seats = seats;\n this.engines = engines;\n};\n\nvar myCar = new Car(4,1,1);"
- ],
- "tests": [
- "assert((function(){var testCar = new Car(3,1,2); return testCar.wheels === 3 && testCar.seats === 1 && testCar.engines === 2;})(), 'message: Calling new Car(3,1,2)
should produce an object with a wheels
property of 3
, a seats
property of 1
, and an engines
property of 2
.');",
- "assert((function(){var testCar = new Car(4,4,2); return testCar.wheels === 4 && testCar.seats === 4 && testCar.engines === 2;})(), 'message: Calling new Car(4,4,2)
should produce an object with a wheels
property of 4
, a seats
property of 4
, and an engines
property of 2
.');",
- "assert((function(){var testCar = new Car(2,6,3); return testCar.wheels === 2 && testCar.seats === 6 && testCar.engines === 3;})(), 'message: Calling new Car(2,6,3)
should produce an object with a wheels
property of 2
, a seats
property of 6
, and an engines
property of 3
.');",
- "assert(typeof myCar.wheels === 'number' && typeof myCar.seats === 'number' && typeof myCar.engines === 'number', 'message: myCar
should have number values for the wheels
, seats
, and engines
properties.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Crea objetos únicos pasando parámetros a la constructora",
- "description": [
- "La constructora
que tenemos es fabulosa, pero ¿qué hacer si no queremos crear siempre el mismo objeto?",
- "Para solucionar esto podemos añadirparámetros
en nuestra constructora
. Hacemos esto como en el siguiente ejemplo: ",
- "var Carro = function (ruedas, asientos, motores) {
",
- " this.ruedas = ruedas;
",
- " this.asientos = asientos;
",
- " this.motores = motores;
",
- "};
",
- "Ahora podemos pasar argumentos
cuando llamamos a nuestra constructora
.",
- "var miCarro = nuevo Carro(6, 3, 1);
",
- "Este código crea un objeto que utiliza los argumentos
que pasamos en y se ve así:",
- "{
",
- " ruedas: 6,
",
- " asientos: 3,
",
- " motores: 1
",
- "}
",
- "¡Ahora date una oportunidad a ti mismo! Modifica la constructora
Car
para que use parámetros
que permitan asignar valores para las propiedades wheels
, seats
, y engines
. ",
- "Entonces llama a tu nueva constructora
con tres argumentos
numéricos y asígnala a myCar
para verla en acción."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c15feddfaeb3bdef",
- "title": "Make Object Properties Private",
- "description": [
- "Objects have their own attributes, called properties
, and their own functions, called methods
.",
- "In the previous challenges, we used the this
keyword to reference public properties
of the current object.",
- "We can also create private properties
and private methods
, which aren't accessible from outside the object.",
- "To do this, we create the variable inside the constructor
using the var
keyword we're familiar with, instead of creating it as a property
of this
.",
- "This is useful for when we need to store information about an object but we want to control how it is used by outside code.",
- "For example, what if we want to store the speed
our car is traveling at but we only want outside code to be able to modify it by accelerating or decelerating, so the speed changes in a controlled way?",
- "In the editor you can see an example of a Car
constructor
that implements this pattern.",
- "Now try it yourself! Modify the Bike
constructor
to have a private property
called gear
and two public methods
called getGear
and setGear
to get and set that value.",
- "Further explanation on this
keyword"
- ],
- "challengeSeed": [
- "var Car = function() {",
- " // this is a private variable",
- " var speed = 10;",
- "",
- " // these are public methods",
- " this.accelerate = function(change) {",
- " speed += change;",
- " };",
- "",
- " this.decelerate = function() {",
- " speed -= 5;",
- " };",
- "",
- " this.getSpeed = function() {",
- " return speed;",
- " };",
- "};",
- "",
- "var Bike = function() {",
- "",
- " // Only change code below this line.",
- "",
- "};",
- "",
- "var myCar = new Car();",
- "",
- "var myBike = new Bike();"
- ],
- "tail": [
- "if(myBike.hasOwnProperty('getGear')){(function() {return JSON.stringify(myBike.getGear());})();}"
- ],
- "solutions": [
- "var Car = function() {\n var speed = 10;\n\n this.accelerate = function(change) {\n speed += change;\n };\n\n this.decelerate = function() {\n speed -= 5;\n };\n\n this.getSpeed = function() {\n return speed;\n };\n};\n\nvar Bike = function() {\n var gear = 1;\n \n this.getGear = function() {\n return gear;\n };\n \n this.setGear = function(newGear) {\n gear = newGear;\n };\n};\n\nvar myCar = new Car();\n\nvar myBike = new Bike();"
- ],
- "tests": [
- "assert(typeof myBike.getGear !== 'undefined' && typeof myBike.getGear === 'function', 'message: The method getGear
of myBike
should be accessible outside the object.');",
- "assert(typeof myBike.setGear !== 'undefined' && typeof myBike.setGear === 'function', 'message: The method setGear
of myBike
should be accessible outside the object.');",
- "assert(typeof myBike.gear === 'undefined', 'message: myBike.gear
should remain undefined.');",
- "assert.strictEqual((function () { myBike.setGear(4); return myBike.getGear(); })(), 4, 'message: myBike.getGear()
should return 4
after calling myBike.setGear(4)
.');",
- "assert.strictEqual((function () { myBike.setGear(3); return myBike.getGear(); })(), 3, 'message: myBike.getGear()
should return 3
after calling myBike.setGear(3)
.');",
- "assert.strictEqual((function () { myBike.setGear(1); return myBike.getGear(); })(), 1, 'message: myBike.getGear()
should return 1
after calling myBike.setGear(1)
.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Crea propiedades privadas de un objeto",
- "description": [
- "Los objetos tienen sus propios atributos, llamados propiedades
, y sus propias funciones, llamadasmétodos
.",
- "En los desafíos anteriores, se utilizó la palabra reservada this
para referenciar propiedades públicas
del objeto actual.",
- "También podemos crear propiedades privadas
y métodos privados
, que no son accesibles desde fuera del objeto.",
- "Para ello, creamos la variable dentro de la constructora
usando la palabra reservada var
, con la cual ya estamos familiarizados, en lugar de crearla con this
. ",
- "Esto es útil cuando necesitamos almacenar información sobre un objeto, pero controlando como se usa en el código externo al objeto.",
- "Por ejemplo, ¿qué pasa si queremos almacenar la velocidad
con la cual se desplaza nuestro carro, pero queremos que el código externo pueda modificarla sólo acelerando o desacelerando, de forma que la velocidad cambie de una manera controlada?",
- "En el editor se puede ver un ejemplo de una constructora
de Car
que implementa este patrón.",
- "¡Ahora pruébalo tú mismo! Modifica la constructora
Bike
para tener una propiedad privada
llamada gear
y dosmétodos públicos
llamados getGear
ysetGear
para obtener y establecer ese valor."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c15feddfaeb7bdef",
- "title": "Iterate over Arrays with .map",
- "description": [
- "The map
method is a convenient way to iterate through arrays. Here's an example usage:",
- "var oldArray = [1, 2, 3];", - "The
var timesFour = oldArray.map(function(val){
return val * 4;
});
console.log(timesFour); // returns [4, 8, 12]
console.log(oldArray); // returns [1, 2, 3]
map
method will iterate through every element of the array, creating a new array with values that have been modified by the callback function, and return it. Note that it does not modify the original array.",
- "In our example the callback only uses the value of the array element (the val
argument) but your callback can also include arguments for the index
and array
being acted on.",
- "Use the map function to add 3 to every value in the variable oldArray
, and save the results into variable newArray
. oldArray should not change."
- ],
- "challengeSeed": [
- "var oldArray = [1,2,3,4,5];",
- "",
- "// Only change code below this line.",
- "",
- "var newArray = oldArray;"
- ],
- "tail": [
- "(function() {return newArray;})();"
- ],
- "solutions": [
- "var oldArray = [1,2,3,4,5];\nvar newArray = oldArray.map(function(val){\n return val + 3;\n});"
- ],
- "tests": [
- "assert.deepEqual(oldArray, [1,2,3,4,5], 'message: You should not change the original array.');",
- "assert.deepEqual(newArray, [4,5,6,7,8], 'message: You should add three to each value in the array.');",
- "assert(editor.getValue().match(/\\.map\\s*\\(/gi), 'message: You should be making use of the map
method.');",
- "assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\]/gi), 'message: You should only modify the array with map
.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Iterar sobre vectores con .map",
- "description": [
- "El método map
es una manera conveniente de iterar sobre vectores. He aquí un ejemplo de uso: ",
- "var porCuatro = vectorAntiguo.map(function(val){
",
- " return val * 4;
",
- "});
",
- "El método map
iterará sobre cada elemento del vector, creando un nuevo vector con los valores modificados por la función de devolución de llamada (callback) y retornará ese nuevo arreglo.",
- "En nuestro ejemplo, la función de devolución de llamada sólo usa el valor del elemento del vector sobre el que está iterando (parámetro val
), pero tu función de devolución de llamada también puede incluir parámetros para el índice
y el vector
completo. ",
- "Usa la función map
para añadir 3 a cada valor de la variable oldArray
."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c15feddfaeb8bdef",
- "title": "Condense arrays with .reduce",
- "description": [
- "The array method reduce
is used to iterate through an array and condense it into one value.",
- "To use reduce
you pass in a callback whose arguments are an accumulator (in this case, previousVal
) and the current value (currentVal
).",
- "The accumulator is like a total that reduce
keeps track of after each operation. The current value is just the next element in the array you're iterating through.",
- "reduce
has an optional second argument which can be used to set the initial value of the accumulator. If no initial value is specified it will be the first array element and currentVal
will start with the second array element.",
- "Here is an example of reduce
being used to subtract all the values of an array:",
- "var singleVal = array.reduce(", - "Use thefunction(previousVal, currentVal) {
return previousVal - currentVal;
}, 0);
reduce
method to sum all the values in array
and assign it to singleVal
."
- ],
- "challengeSeed": [
- "var array = [4,5,6,7,8];",
- "var singleVal = 0;",
- "",
- "// Only change code below this line.",
- "",
- "singleVal = array;"
- ],
- "tail": [
- "(function() {return singleVal;})();"
- ],
- "solutions": [
- "var array = [4,5,6,7,8];\nvar singleVal = 0;\nsingleVal = array.reduce(function(previousVal, currentVal) {\n return previousVal + currentVal;\n}, 0);"
- ],
- "tests": [
- "assert(singleVal == 30, 'message: singleVal
should be equal to the sum of all items in the array
variable.');",
- "assert(editor.getValue().match(/\\.reduce\\s*\\(/gi), 'message: You should have made use of the reduce
method.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Condensa vectores con .reduce",
- "description": [
- "El método reduce
de un vector, se utiliza para iterar a través del vector y condensarlo en un valor.",
- "Para usar reduce
tu le pasas una función de devolución de llamada cuyos argumentos sean un acumulador (en este caso, valorPrevio
) y el valor actual (valorActual
). ",
- "reduce
tiene un argumento opcional que puede usarse para asignar un valor inicial al acumulador. Si no se especifica ningún valor inicial, este será el primer elemento del vector y valorActual
comenzará en el segundo elemento del vector. ",
- "He aquí un ejemplo dereduce
cuando se utiliza para restar todos los valores de una matriz:",
- "var singleVal = array.reduce(function(valorAnterior, valorActual) {
",
- " return valorAnterior - valorActual;
",
- "}, 0);
",
- "Usa el método reduce
para sumar todos los valores en array
y asignarlo a singleVal
."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c15feddfaeb9bdef",
- "title": "Filter Arrays with .filter",
- "description": [
- "The filter
method creates a new array from an existing one by iterating over it and returning only the elements where a given condition returns true.",
- "filter
is passed a callback function which takes the current value (we've called that val
) as an argument.",
- "Any array element for which the callback returns true will be kept and elements that return false will be filtered out.",
- "The following code is an example of using filter
to remove array elements that are equal to five:",
- "Note: We omit the second and third arguments since we only need the value",
- "array = array.filter(function(val) {", - "Use
return val !== 5;
});
filter
to create a new array with all the values from oldArray
which are less than 6. The oldArray
should not change."
- ],
- "challengeSeed": [
- "var oldArray = [1,2,3,4,5,6,7,8,9,10];",
- "",
- "// Only change code below this line.",
- "",
- "var newArray = oldArray;"
- ],
- "tail": [
- "(function() {return newArray;})();"
- ],
- "solutions": [
- "var oldArray = [1,2,3,4,5,6,7,8,9,10];\nvar newArray = oldArray.filter(function(val) {\n return val < 6;\n});"
- ],
- "tests": [
- "assert.deepEqual(oldArray, [1,2,3,4,5,6,7,8,9,10], 'message: You should not change the original array.');",
- "assert.deepEqual(newArray, [1,2,3,4,5], 'message: newArray
should be an array containing only the values from oldArray
that are less than 6.');",
- "assert(editor.getValue().match(/array\\.filter\\s*\\(/gi), 'message: You should be using the filter
method to create a new array.');",
- "assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7\\,8\\,9\\,10\\]/gi), 'message: You should only be using filter
to make the new array.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Filtrar vectores con .filter",
- "description": [
- "El método filter
se utiliza para iterar a través de un vector y filtrar los elementos que hagan falsa un condición determinada.",
- "filter
recibe una función de devolución de llamada que a su vez recibe como argumento el valor actual (que hemos llamado val
).",
- "Cualquier elemento del vector para el cual la función de devolución de llamada retorne true
se mantendrá y los elementos que devuelven false
serán filtrados.",
- "El código siguiente es un ejemplo del uso de filter
para eliminar los elementos de un vector que son iguales a cinco:",
- "Nota: Omitimos el segundo y tercer argumentos ya que sólo necesitamos el valor",
- "array = array.filter(function(val) {
",
- " return val !== 5;
",
- "});
",
- "Usa filter
para crear un nuevo vector con todos los valores de oldArray
que son menores a 6. oldArray
no debe cambiar."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c16feddfaeb1bdef",
- "title": "Sort Arrays with .sort",
- "description": [
- "You can use the method sort
to easily sort the values in an array alphabetically or numerically.",
- "Unlike the previous array methods we have been looking at, sort
actually alters the array in place. However, it also returns this sorted array.",
- "sort
can be passed a compare function as a callback. The compare function should return a negative number if a
should be before b
, a positive number if a
should be after b
, or 0
if they are equal.",
- "If no compare (callback) function is passed in, it will convert the values to strings and sort alphabetically.",
- "Here is an example of using sort with a compare function that will sort the elements from smallest to largest number:",
- "var array = [1, 12, 21, 2];", - "Use
array.sort(function(a, b) {
return a - b;
});
sort
to sort array
from largest to smallest.",
- "Further explanation on the .sort()
method can be found here."
- ],
- "challengeSeed": [
- "var array = [1, 12, 21, 2];",
- "",
- "// Only change code below this line.",
- "",
- "array.sort();"
- ],
- "tail": [
- "(function() {return array;})();"
- ],
- "solutions": [
- "var array = [1, 12, 21, 2];\narray.sort(function(a, b) {\n return b - a;\n});"
- ],
- "tests": [
- "assert.deepEqual(array, [21, 12, 2, 1], 'message: You should have sorted the array from largest to smallest.');",
- "assert(editor.getValue().match(/\\[1,\\s*12,\\s*21,\\s*2\\];/gi), 'message: You should only be using sort
to modify the array.');",
- "assert(editor.getValue().match(/\\.sort\\s*\\(/g), 'message: You should have made use of the sort
method.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Ordena vectores con .sort",
- "description": [
- "Puedes utilizar el método sort
para ordenar alfabética o numéricamente los valores de un vector.",
- "A diferencia de los métodos de vector que hemos visto,sort
en realidad altera el vector en su lugar. Sin embargo, también devuelve este vector ordenado. ",
- "sort
puede recibir como parámetro una función de devolución de llamada para comparar. Sin no se provee una función de comparación, convertirá los valores a cadenas y los ordenará alfabéticamente. ",
- "He aquí un ejemplo del uso de sort
con una función de comparación que ordena los elementos de menor a mayor:",
- "var array = [1, 12, 21, 2];
",
- "array.sort(function(a, b) {
",
- " return a - b;
",
- "});
",
- "Usa sort
para ordenararray
de mayor a menor."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c16feddfaeb2bdef",
- "title": "Reverse Arrays with .reverse",
- "description": [
- "You can use the reverse
method to reverse the elements of an array.",
- "reverse
is another array method that alters the array in place, but it also returns the reversed array.",
- "var myArray = [1, 2, 3];", - "returns [3, 2, 1]", - "Use
myArray.reverse();
reverse
to reverse the array
variable and assign it to newArray
."
- ],
- "challengeSeed": [
- "var array = [1,2,3,4,5,6,7];",
- "var newArray = [];",
- "",
- "// Only change code below this line.",
- "",
- "newArray = array;"
- ],
- "tail": [
- "(function() {return newArray;})();"
- ],
- "solutions": [
- "var array = [1,2,3,4,5,6,7];\nvar newArray = [];\nnewArray = array.reverse();"
- ],
- "tests": [
- "assert.deepEqual(newArray, [7,6,5,4,3,2,1], 'message: You should reverse the array.');",
- "assert(editor.getValue().match(/\\.reverse\\s*\\(\\)/gi), 'message: You should use the reverse
method.');",
- "assert(editor.getValue().match(/\\[1\\,2\\,3\\,4\\,5\\,6\\,7/gi), 'message: You should only be using reverse
to modify array
.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Invierte vectores con .reverse",
- "description": [
- "Puedes utilizar el método reverse
para invertir los elementos en un vector.",
- "reverse
es otro método de vector que altera el vector mismo, y también devuelve el vector invertido.",
- "var miVector = [1, 2, 3];
",
- "miVector.reverse();
",
- "devuelve [3, 2, 1]",
- "Usa reverse
para invertir la variable array
y asignarla a newArray
."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c16feddfaeb3bdef",
- "title": "Concatenate Arrays with .concat",
- "description": [
- "concat
can be used to merge the contents of two or more arrays into one.",
- "concat
takes an array as an argument and returns a new array with the elements of this array concatenated onto the end.",
- "Here are examples of concat
being used to concatenate arrays:",
- "Example 1: otherArray
onto the end of oldArray
:",
- "newArray = oldArray.concat(otherArray);", - "Example 2:
newArray
with all the elements of arr1
, arr2
, and arr3
:",
- "newArray = arr1.concat(arr2, arr3);", - "Use
.concat()
to concatenate concatMe
onto the end of oldArray
and assign it to newArray
."
- ],
- "challengeSeed": [
- "var oldArray = [1,2,3];",
- "var newArray = [];",
- "",
- "var concatMe = [4,5,6];",
- "",
- "// Only change code below this line.",
- "",
- "newArray = oldArray;"
- ],
- "tail": [
- "(function() {return newArray;})();"
- ],
- "solutions": [
- "var oldArray = [1,2,3];\nvar newArray = [];\nvar concatMe = [4,5,6];\nnewArray = oldArray.concat(concatMe);"
- ],
- "tests": [
- "assert.deepEqual(newArray, [1,2,3,4,5,6], 'message: You should concatenate the two arrays together.');",
- "assert(editor.getValue().match(/\\.concat\\s*\\(/gi), 'message: You should be using the concat
method to merge the two arrays.');",
- "assert(editor.getValue().match(/\\[1\\,2\\,3\\]/gi) && editor.getValue().match(/\\[4\\,5\\,6\\]/gi), 'message: You should only be using concat
to modify the arrays.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Concatena vectores con .concat",
- "description": [
- "concat
se puede utilizar para combinar el contenido de dos vectores en uno solo.",
- "concat
recibe un vector como argumento y devuelve un nuevo vector con los elementos del vector que recibe concatenados al final.",
- "He aquí un ejemplo de concat
cuando se usa para concatenar otroVector
al final de vectorAntiguo
:",
- "vectorNuevo = vectorAntiguo.concat(otroVector);
",
- "Usa .concat ()
para concatenar concatMe
al final de oldArray
y asigna el vector resultante a newArray
."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c16feddfaeb4bdef",
- "title": "Split Strings with .split",
- "description": [
- "You can use the split
method to split a string into an array.",
- "split
uses the argument you pass in as a delimiter to determine which points the string should be split at.",
- "Here is an example of split
being used to split a string at every s
character:",
- "var array = string.split('s');
",
- "Use split
to create an array of words from string
and assign it to array
."
- ],
- "challengeSeed": [
- "var string = \"Split me into an array\";",
- "var array = [];",
- "",
- "// Only change code below this line.",
- "",
- "array = string;"
- ],
- "tail": [
- "(function() {return array;})();"
- ],
- "solutions": [
- "var string = \"Split me into an array\";\nvar array = [];\narray = string.split(\" \");"
- ],
- "tests": [
- "assert(/\\.split\\(/gi, 'message: You should use the split
method on the string.');",
- "assert(typeof array === 'object' && array.length === 5, 'message: You should split the string by its spaces.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Divide cadenas con .split",
- "description": [
- "Puedes utilizar el método split
para dividir una cadena en un vector.",
- "split
utiliza el argumento que recibe como delimitador para determinar en qué puntos debe dividir la cadena.",
- "He aquí un ejemplo del uso de split
para dividir una cadena en cada caracter s
:",
- "var vector = string.split('s');
",
- "Usa split
para crear un vector con las palabras de una cadena
y asígnalo a la variable array
."
- ]
- }
- }
- },
- {
- "id": "cf1111c1c16feddfaeb5bdef",
- "title": "Join Strings with .join",
- "description": [
- "We can use the join
method to join each element of an array into a string separated by whatever delimiter you provide as an argument.",
- "The following is an example of using join
to join all of the elements of an array into a string with all the elements separated by word and
:",
- "var veggies = [\"Celery\", \"Radish\", \"Carrot\", \"Potato\"];", - "Use the
var salad = veggies.join(\" and \");
console.log(salad); // \"Celery and Radish and Carrot and Potato\"
join
method to create a string from joinMe
with spaces in between each element and assign it to joinedString
."
- ],
- "challengeSeed": [
- "var joinMe = [\"Split\",\"me\",\"into\",\"an\",\"array\"];",
- "var joinedString = '';",
- "",
- "// Only change code below this line.",
- "",
- "joinedString = joinMe;"
- ],
- "tail": [
- "(function() {return joinedString;})();"
- ],
- "solutions": [
- "var joinMe = [\"Split\",\"me\",\"into\",\"an\",\"array\"];\nvar joinedString = '';\njoinedString = joinMe.join(\" \");"
- ],
- "tests": [
- "assert(typeof joinedString === 'string' && joinedString === \"Split me into an array\", 'message: You should join the elements of the array with spaces.');",
- "assert(/\\.join\\(/gi, 'message: You should use of the join
method on the array.');"
- ],
- "type": "waypoint",
- "challengeType": 1,
- "translations": {
- "es": {
- "title": "Une cadenas con .join",
- "description": [
- "Podemos usar el método join
para unir los elementos de un vector en una cadena, separándolos con el delimitador que proporciones como argumento.",
- "El siguiente es un ejemplo del uso de join
para unir todos los elementos de un vector en una cadena con todos los elementos separados entre si por palabra` Na`: ",
- "var uneme = [\"Na \", \"Na \", \"Na \", \"Na \", \"Batman!\"];
",
- "var cadenaUnida = uneme.join(\"Na \");
",
- "console.log(cadenaUnida);
",
- "Usa el método join
para crear una cadena a partir joinMe
con espacios entre cada par de elementos y asignarla a joinedString
."
- ]
- }
- }
- }
- ]
-}
diff --git a/seed/challenges/01-responsive-web-design/applied-accessibility.json b/seed/challenges/01-responsive-web-design/applied-accessibility.json
new file mode 100644
index 00000000000000..467b9c07d531b0
--- /dev/null
+++ b/seed/challenges/01-responsive-web-design/applied-accessibility.json
@@ -0,0 +1,1522 @@
+{
+ "name": "Applied Accessibility",
+ "order": 3,
+ "time": "5 hours",
+ "helpRoom": "Help",
+ "challenges": [
+ {
+ "id": "587d774b367417b2b2512a9b",
+ "title": "Introduction to the Applied Accessibility Challenges",
+ "description": [
+ [
+ "",
+ "",
+ "\"Accessibility\" generally means having web content and a user interface that can be understood, navigated, and interacted with by a broad audience. This includes people with visual, auditory, mobility, or cognitive disabilities.",
+ ""
+ ],
+ [
+ "",
+ "",
+ "Websites should be open and accessible to everyone, regardless of a user's abilities or resources. Some users rely on assistive technology such as a screen reader or voice recognition software. Other users may be able to navigate through a site only using a keyboard. Keeping the needs of various users in mind when developing your project can go a long way towards creating an open web.",
+ ""
+ ],
+ [
+ "",
+ "",
+ "Here are three general concepts this section will explore throughout the following challenges:alt
attribute on an img
tag in other challenges. Alt
text describes the content of the image and provides a text-alternative. This helps in case the image fails to load or can't be seen by a user. It's also used by search engines to understand what an image contains to include it in search results. Here's an example:",
+ "<img src="importantLogo.jpeg" alt="Company logo">
",
+ "People with visual impairments rely on screen readers to convert web content to an audio interface. They won't get information if it's only presented visually. For images, screen readers can access the alt
attribute and read its contents to deliver key information.",
+ "Good alt
text is short but descriptive, and meant to briefly convey the meaning of the image. You should always include an alt
attribute on your image. Per HTML5 specification, this is now considered mandatory.",
+ "alt
attribute in the img
tag, that explains Camper Cat is doing karate. (The image src
doesn't link to an actual file, so you should see the alt
text in the display.)"
+ ],
+ "challengeSeed": [
+ ""
+ ],
+ "tests": [
+ "assert($('img').attr('alt'), 'message: Your img
tag should have an alt
attribute, and it should not be empty.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d774c367417b2b2512a9d",
+ "title": "Know When Alt Text Should be Left Blank",
+ "description": [
+ "In the last challenge, you learned that including an alt
attribute on img tags is mandatory. However, sometimes images are grouped with a caption already describing them, or are used for decoration only. In these cases alt
text may seem redundant or unnecessary.",
+ "In situations when an image is already explained with text content, or does not add meaning to a page, the img
still needs an alt
attribute, but it can be set to an empty string. Here's an example:",
+ "<img src="visualDecoration.jpeg" alt="">
",
+ "Background images usually fall under the 'decorative' label as well. However, they are typically applied with CSS rules, and therefore not part of the markup screen readers process.",
+ "Notealt
text, since it helps search engines catalog the content of the image.",
+ "alt
attribute to the img
tag and set it to an empty string. (Note that the image src
doesn't link to an actual file - don't worry that there are no swords showing in the display.)"
+ ],
+ "challengeSeed": [
+ "To Come...
", + "To Come...
", + "img
tag should have an alt
attribute.');",
+ "assert($('img').attr('alt') == '', 'message: The alt
attribute should be set to an empty string.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d774d367417b2b2512a9e",
+ "title": "Use Headings to Show Hierarchical Relationships of Content",
+ "description": [
+ "Headings (h1
through h6
elements) are workhorse tags that help provide structure and labeling to your content. Screen readers can be set to read only the headings on a page so the user gets a summary. This means it is important for the heading tags in your markup to have semantic meaning and relate to each other, not be picked merely for their size values.",
+ "Semantic meaning means that the tag you use around content indicates the type of information it contains.",
+ "If you were writing a paper with an introduction, a body, and a conclusion, it wouldn't make much sense to put the conclusion as a subsection of the body in your outline. It should be its own section. Similarly, the heading tags in a webpage need to go in order and indicate the hierarchical relationships of your content.",
+ "Headings with equal (or higher) rank start new implied sections, headings with lower rank start subsections of the previous one.",
+ "As an example, a page with an h2
element followed by several subsections labeled with h4
tags would confuse a screen reader user. With six choices, it's tempting to use a tag because it looks better in a browser, but you can use CSS to edit the relative sizing.",
+ "One final point, each page should always have one (and only one) h1
element, which is the main subject of your content. This and the other headings are used in part by search engines to understand the topic of the page.",
+ "h5
tags to the proper heading level to indicate they are subsections of the h2
ones."
+ ],
+ "challengeSeed": [
+ "h3
tags.');",
+ "assert($('h5').length === 0, 'message: Your code should not have any h5
tags.');"
+ ],
+ "solutions": [],
+ "hints": [
+ "All the h5 tags are siblings, and should be changed to the same new heading level."
+ ],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d774e367417b2b2512a9f",
+ "title": "Jump Straight to the Content Using the Main Element",
+ "description": [
+ "HTML5 introduced a number of new elements that give developers more options while also incorporating accessibility features. These tags include main
, header
, footer
, nav
, article
, and section
, among others.",
+ "By default, a browser renders these elements similarly to the humble div
. However, using them where appropriate gives additional meaning in your markup. The tag name alone can indicate the type of information it contains, which adds semantic meaning to that content. Assistive technologies can access this information to provide better page summary or navigation options to their users.",
+ "The main
element is used to wrap (you guessed it) the main content, and there should be only one per page. It's meant to surround the information that's related to the central topic of your page. It's not meant to include items that repeat across pages, like navigation links or banners.",
+ "The main
tag also has an embedded landmark feature that assistive technology can use to quickly navigate to the main content. If you've ever seen a \"Jump to Main Content\" link at the top of a page, using a main tag automatically gives assistive devices that functionality.",
+ "main
tags between the header
and footer
(covered in other challenges). Keep the main
tags empty for now."
+ ],
+ "challengeSeed": [
+ "main
tag.');",
+ "assert(code.match(/<\\/header>\\s*?main
tags should be between the closing header
tag and the opening footer
tag.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d774e367417b2b2512aa0",
+ "title": "Wrap Content in the Article Element",
+ "description": [
+ "Article
is another one of the new HTML5 elements that adds semantic meaning to your markup. Article
is a sectioning element, and is used to wrap independent, self-contained content. The tag works well with blog entries, forum posts, or news articles.",
+ "Determining whether content can stand alone is usually a judgement call, but there are a couple simple tests you can use. Ask yourself if you removed all surrounding context, would that content still make sense? Similarly for text, would the content hold up if it were in an RSS feed?",
+ "Remember that folks using assistive technologies rely on organized, semantically meaningful markup to better understand your work.",
+ "Note about section
and div
section
element is also new with HTML5, and has a slightly different semantic meaning than article
. An articles
is for standalone content, and a section
is for grouping thematically related content. They can be used within each other, as needed. For example, if a book is the article
, then each chapter is a section
. When there's no relationship between groups of content, then use a div
.",
+ "<div> - blocks content", + "
<section> - blocks related content
<article> - blocks independent, self-contained content
article
tags to wrap the posts on his blog page, but he forgot to use them around the top one. Change the div
tag to use an article
tag instead."
+ ],
+ "challengeSeed": [
+ "The internet is littered with varying opinions on nutritional paradigms, from catnip paleo to hairball cleanses. But let's turn our attention to an often overlooked fitness fuel, and examine the protein-carb-NOM trifecta that is lasagna...
", + "Felines the world over have been waging war on the most persistent of foes. This red nemesis combines both cunning stealth and lightening speed. But chin up, fellow fighters, our time for victory may soon be near...
", + "Chuck Norris is widely regarded as the premier martial artist on the planet, and it's a complete coincidence anyone who disagrees with this fact mysteriously disappears soon after. But the real question is, is he a cat person?...
", + "article
tags.');",
+ "assert($('div').length == 0, 'message: Your code should not have any div
tags.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7787367417b2b2512aa1",
+ "title": "Make Screen Reader Navigation Easier with the Header Landmark",
+ "description": [
+ "The next HTML5 element that adds semantic meaning and improves accessibility is the header
tag. It's used to wrap introductory information or navigation links for its parent tag, and works well around content that's repeated at the top on multiple pages.",
+ "Header
shares the embedded landmark feature you saw with main
, allowing assistive technologies to quickly navigate to that content.",
+ "NoteHeader
is meant for use in the body
tag of your HTML document. This is different than the head
element, which contains the page's title, meta information, etc.",
+ "div
that currently contains the h1
to a header
tag instead."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ " header
tag.');",
+ "assert($('header').children('h1').length == 1, 'message: Your header
tags should wrap around the h1
.');",
+ "assert($('div').length == 0, 'message: Your code should not have any div
tags.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7788367417b2b2512aa2",
+ "title": "Make Screen Reader Navigation Easier with the Nav Landmark",
+ "description": [
+ "The nav
element is another HTML5 item with the embedded landmark feature for easy screen reader navigation. This tag is meant to wrap around the main navigation links in your page.",
+ "If there are repeated site links at the bottom of the page, it isn't necessary to markup those with a nav
tag as well. Using a footer
(covered in the next challenge) is sufficient.",
+ "div
. Change the div
to a nav
tag to improve the accessibility on his page."
+ ],
+ "challengeSeed": [
+ "",
+ " nav
tag.');",
+ "assert($('nav').children('ul').length == 1, 'message: Your nav
tags should wrap around the ul
and its list items.');",
+ "assert($('div').length == 0, 'message: Your code should not have any div
tags.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7788367417b2b2512aa3",
+ "title": "Make Screen Reader Navigation Easier with the Footer Landmark",
+ "description": [
+ "Similar to header
and nav
, the footer
element has a built-in landmark feature that allows assistive devices to quickly navigate to it. It's primarily used to contain copyright information or links to related documents that usually sit at the bottom of a page.",
+ "div
he used to wrap his copyright information at the bottom of the page to a footer
element."
+ ],
+ "challengeSeed": [
+ "",
+ " footer
tag.');",
+ "assert($('div').length == 0, 'message: Your code should not have any div
tags.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7789367417b2b2512aa4",
+ "title": "Improve Accessibility of Audio Content with the Audio Element",
+ "description": [
+ "HTML5's audio
element gives semantic meaning when it wraps sound or audio stream content in your markup. Audio content also needs a text alternative to be accessible to the deaf or hard of hearing. This can be done with nearby text on the page or a link to a transcript.",
+ "The audio
tag supports the controls
attribute. This shows the browser default play, pause, and other controls, and supports keyboard functionality. This is a boolean attribute, meaning it doesn't need a value, it's presence on the tag turns the setting on.",
+ "Here's an example:",
+ "<audio id="meowClip" controls>", + "Note
<source src="audio/meow.mp3" type="audio/mpeg" />
<source src="audio/meow.ogg" type="audio/ogg" />
</audio>
audio
element after the p
. Include the controls
attribute. Then place a source
tag inside the audio
tags with the src
attribute set to \"https://s3.amazonaws.com/freecodecamp/screen-reader.mp3\" and type
attribute set to \"audio/mpeg\"."
+ ],
+ "challengeSeed": [
+ "",
+ " A sound clip of Zersiax's screen reader in action.
", + " ", + " ", + " ", + "audio
tag.');",
+ "assert($('audio').attr('controls'), 'message: The audio
tag should have the controls
attribute.');",
+ "assert($('source').length === 1, 'message: Your code should have one source
tag.');",
+ "assert($('audio').children('source').length === 1, 'message: Your source
tag should be inside the audio
tags.');",
+ "assert($('source').attr('src') === 'https://s3.amazonaws.com/freecodecamp/screen-reader.mp3', 'message: The value for the src
attribute on the source
tag should match the link in the instructions exactly.');",
+ "assert($('source').attr('type') === 'audio/mpeg', 'message: Your code should include a type
attribute on the source
tag with a value of audio/mpeg.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778a367417b2b2512aa5",
+ "title": "Improve Chart Accessibility with the Figure Element",
+ "description": [
+ "HTML5 introduced the figure
element, along with the related figcaption
. Used together, these items wrap a visual representation (like an image, diagram, or chart) along with its caption. This gives a two-fold accessibility boost by both semantically grouping related content, and providing a text alternative that explains the figure
.",
+ "For data visualizations like charts, the caption can be used to briefly note the trends or conclusions for users with visual impairments. Another challenge covers how to move a table version of the chart's data off-screen (using CSS) for screen reader users.",
+ "Here's an example - note that the figcaption
goes inside the figure
tags and can be combined with other elements:",
+ "<figure>", + "
<img src="roundhouseDestruction.jpeg" alt="Photo of Camper Cat executing a roundhouse kick">
<br>
<figcaption>
Master Camper Cat demonstrates proper form of a roundhouse kick.
</figcaption>
</figure>
div
tag he used to a figure
tag, and the p
tag that surrounds the caption to a figcaption
tag."
+ ],
+ "challengeSeed": [
+ "",
+ " Breakdown per week of time to spend training in stealth, combat, and weapons.
", + "figure
tag.');",
+ "assert($('figcaption').length == 1, 'message: Your code should have one figcaption
tag.');",
+ "assert($('div').length == 0, 'message: Your code should not have any div
tags.');",
+ "assert($('p').length == 0, 'message: Your code should not have any p
tags.');",
+ "assert($('figure').children('figcaption').length == 1, 'message: The figcaption
should be a child of the figure
tag.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778a367417b2b2512aa6",
+ "title": "Improve Form Field Accessibility with the Label Element",
+ "description": [
+ "Improving accessibility with semantic HTML markup applies to using both appropriate tag names as well as attributes. The next several challenges cover some important scenarios using attributes in forms.",
+ "The label
tag wraps the text for a specific form control item, usually the name or label for a choice. This ties meaning to the item and makes the form more readable. The for
attribute on a label
tag explicitly associates that label
with the form control and is used by screen readers.",
+ "The value of the for
attribute must be the same as the value of the id
attribute of the form control. Here's an example:",
+ "<form>", + "
<label for="name">Name:</label>
<input type="text" id="name" name="name">
</form>
for
attribute on the email label
that matches the id
on its input
field."
+ ],
+ "challengeSeed": [
+ "",
+ " The internet is littered with varying opinions on nutritional paradigms, from catnip paleo to hairball cleanses. But let's turn our attention to an often overlooked fitness fuel, and examine the protein-carb-NOM trifecta that is lasagna...
", + "Felines the world over have been waging war on the most persistent of foes. This red nemesis combines both cunning stealth and lightening speed. But chin up, fellow fighters, our time for victory may soon be near...
", + "Chuck Norris is widely regarded as the premier martial artist on the planet, and it's a complete coincidence anyone who disagrees with this fact mysteriously disappears soon after. But the real question is, is he a cat person?...
", + "for
attribute on the label
tag that is not empty.');",
+ "assert($('label').attr('for') == 'email', 'message: Your for
attribute value should match the id
value on the email input
.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778b367417b2b2512aa7",
+ "title": "Wrap Radio Buttons in a Fieldset Element for Better Accessibility",
+ "description": [
+ "The next form topic covers accessibility of radio buttons. Each choice is given a label
with a for
attribute tying to the id
of the corresponding item as covered in the last challenge. Since radio buttons often come in a group where the user must choose one, there's a way to semantically show the choices are part of a set.",
+ "The fieldset
tag surrounds the entire grouping of radio buttons to achieve this. It often uses a legend
tag to provide a description for the grouping, which is read by screen readers for each choice in the fieldset
element.",
+ "The fieldset
wrapper and legend
tag are not necessary when the choices are self-explanatory, like a gender selection. Using a label
with the for
attribute for each radio button is sufficient.",
+ "Here's an example:",
+ "<form>", + "
<fieldset>
<legend>Choose one of these three items:</legend>
<input id="one" type="radio" name="items" value="one">
<label for="one">Choice One</label><br>
<input id="two" type="radio" name="items" value="two">
<label for="two">Choice Two</label><br>
<input id="three" type="radio" name="items" value="three">
<label for="three">Choice Three</label>
</fieldset>
</form>
for
attributes for each choice. Go Camper Cat! However, his code still needs some help. Change the div tag surrounding the radio buttons to a fieldset tag, and change the p tag inside it to a legend."
+ ],
+ "challengeSeed": [
+ "",
+ " The internet is littered with varying opinions on nutritional paradigms, from catnip paleo to hairball cleanses. But let's turn our attention to an often overlooked fitness fuel, and examine the protein-carb-NOM trifecta that is lasagna...
", + "Felines the world over have been waging war on the most persistent of foes. This red nemesis combines both cunning stealth and lightening speed. But chin up, fellow fighters, our time for victory may soon be near...
", + "Chuck Norris is widely regarded as the premier martial artist on the planet, and it's a complete coincidence anyone who disagrees with this fact mysteriously disappears soon after. But the real question is, is he a cat person?...
", + "fieldset
tag around the radio button set.');",
+ "assert($('legend').length == 1, 'message: Your code should have a legend
tag around the text asking what level ninja a user is.');",
+ "assert($('div').length == 0, 'message: Your code should not have any div
tags.');",
+ "assert($('p').length == 4, 'message: Your code should no longer have a p
tag around the text asking what level ninja a user is.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778b367417b2b2512aa8",
+ "title": "Add an Accessible Date Picker",
+ "description": [
+ "Forms often include the input
field, which can be used to create several different form controls. The type
attribute on this element indicates what kind of input will be created.",
+ "You may have noticed the text
and submit
input types in prior challenges, and HTML5 introduced an option to specify a date
field. Depending on browser support, a date picker shows up in the input
field when it's in focus, which makes filling in a form easier for all users.",
+ "For older browsers, the type will default to text
, so it helps to show users the expected date format in the label or as placeholder text just in case.",
+ "Here's an example:",
+ "<label for="input1">Enter a date (MM-DD-YYYY):</label>", + "
<input type="date" id="input1" name="input1">
input
tag with a type
attribute of \"date\", an id
attribute of \"pickdate\", and a name
attribute of \"date\"."
+ ],
+ "challengeSeed": [
+ "",
+ " input
tag for the date selector field.');",
+ "assert($('input').attr('type') == 'date', 'message: Your input
tag should have a type
attribute with a value of date.');",
+ "assert($('input').attr('id') == 'pickdate', 'message: Your input
tag should have an id
attribute with a value of pickdate.');",
+ "assert($('input').attr('name') == 'date', 'message: Your input
tag should have a name
attribute with a value of date.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778c367417b2b2512aa9",
+ "title": "Standardize Times with the HTML5 Datetime Attribute",
+ "description": [
+ "Continuing with the date theme, HTML5 also introduced the time
element along with a datetime
attribute to standardize times. This is an inline element that can wrap a date or time on a page. A valid format of that date is held by the datetime
attribute. This is the value accessed by assistive devices. It helps avoid confusion by stating a standardized version of a time, even if it's written in an informal or colloquial manner in the text.",
+ "Here's an example:",
+ "<p>Master Camper Cat officiated the cage match between Goro and Scorpion <time datetime="2013-02-13">last Wednesday</time>, which ended in a draw.</p>
",
+ "time
tag around the text \"Thursday, September 15<sup>th</sup>\" and add a datetime
attribute to it set to \"2016-09-15\"."
+ ],
+ "challengeSeed": [
+ "",
+ " Thank you to everyone for responding to Master Camper Cat's survey. The best day to host the vaunted Mortal Combat tournament is Thursday, September 15th. May the best ninja win!
", + " ", + " ", + " ", + "Posted by: Sub-Zero on
", + "Johnny Cage better be there, I'll finish him!
", + "Posted by: Doge on
", + "Wow, much combat, so mortal.
", + "Posted by: The Grim Reaper on
", + "Looks like I'll be busy that day.
", + "time
tags should wrap around the text \"Thursday, September 15<sup>th</sup>\".');",
+ "assert($('time').attr('datetime'), 'message: Your time
tag should have a datetime
attribute that is not empty.');",
+ "assert($('time').attr('datetime') === \"2016-09-15\", 'message: Your datetime
attribute should be set to a value of 2016-09-15.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778d367417b2b2512aaa",
+ "title": "Make Elements Only Visible to a Screen Reader by Using Custom CSS",
+ "description": [
+ "Have you noticed that all of the applied accessibility challenges so far haven't used any CSS? This is to show the importance of a logical document outline, and using semantically meaningful tags around your content before introducing the visual design aspect.",
+ "However, CSS's magic can also improve accessibility on your page when you want to visually hide content meant only for screen readers. This happens when information is in a visual format (like a chart), but screen reader users need an alternative presentation (like a table) to access the data. CSS is used to position the screen reader-only elements off the visual area of the browser window.",
+ "Here's an example of the CSS rules that accomplish this:",
+ ".sr-only {", + "Note
position: absolute;
left: -10000px;
width: 1px;
height: 1px;
top: auto;
overflow: hidden;
}
display: none;
or visibility: hidden;
hides content for everyone, including screen reader userswidth: 0px; height: 0px;
removes that element from the flow of your document, meaning screen readers will ignore itsr-only
class, but the CSS rules aren't filled in yet. Give the position
an absolute value, the left
a -10000px value, and the width
and height
both 1px values."
+ ],
+ "challengeSeed": [
+ "",
+ " ",
+ "",
+ "",
+ " ", + " | Stealth & Agility | ", + "Combat | ", + "Weapons | ", + "Total | ", + "
---|---|---|---|---|
Week One | ", + "3 | ", + "5 | ", + "2 | ", + "10 | ", + "
Week Two | ", + "4 | ", + "5 | ", + "3 | ", + "12 | ", + "
Week Three | ", + "4 | ", + "6 | ", + "3 | ", + "13 | ", + "
position
property of the sr-only
class to a value of absolute.');",
+ "assert($('.sr-only').css('left') == '-10000px', 'message: Your code should set the left
property of the sr-only
class to a value of -10000px.');",
+ "assert(code.match(/width:\\s*?1px/gi), 'message: Your code should set the width
property of the sr-only
class to a value of 1 pixel.');",
+ "assert(code.match(/height:\\s*?1px/gi), 'message: Your code should set the height
property of the sr-only
class to a value of 1 pixel.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778e367417b2b2512aab",
+ "title": "Improve Readability with High Contrast Text",
+ "description": [
+ "Low contrast between the foreground and background colors can make text difficult to read. Sufficient contrast improves the readability of your content, but what exactly does \"sufficient\" mean?",
+ "The Web Content Accessibility Guidelines (WCAG) recommend at least a 4.5 to 1 contrast ratio for normal text. The ratio is calculated by comparing the relative luminance values of two colors. This ranges from 1:1 for the same color, or no contrast, to 21:1 for white against black, the strongest contrast. There are many contrast checking tools available online that calculate this ratio for you.",
+ "color
of the text from the current gray (#D3D3D3
) to a darker gray (#636363
) to improve the contrast ratio to 6:1."
+ ],
+ "challengeSeed": [
+ "",
+ " ",
+ "",
+ "",
+ " The influence that catnip has on feline behavior is well-documented, and its use as an herbal supplement in competitive ninja circles remains controversial. Once again, the debate to ban the substance is brought to the public's attention after the high-profile win of Kittytron, a long-time proponent and user of the green stuff, at the Claw of Fury tournament.
", + "As I've stated in the past, I firmly believe a true ninja's skills must come from within, with no external influences. My own catnip use shall continue as purely recreational.
", + "color
for the body
to the darker gray.');",
+ "assert($('body').css('background-color') == 'rgb(255, 255, 255)', 'message: Your code should not change the background-color
for the body
.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778f367417b2b2512aac",
+ "title": "Avoid Colorblindness Issues by Using Sufficient Contrast",
+ "description": [
+ "Color is a large part of visual design, but its use introduces two accessibility issues. First, color alone should not be used as the only way to convey important information because screen reader users won't see it. Second, foreground and background colors need sufficient contrast so colorblind users can distinguish them.",
+ "Previous challenges covered having text alternatives to address the first issue. The last challenge introduced contrast checking tools to help with the second. The WCAG-recommended contrast ratio of 4.5:1 applies for color use as well as gray-scale combinations.",
+ "Colorblind users have trouble distinguishing some colors from others - usually in hue but sometimes lightness as well. You may recall the contrast ratio is calculated using the relative luminance (or lightness) values of the foreground and background colors.",
+ "In practice, the 4.5:1 ratio can be reached by darkening the darker color and lightening the lighter one with the aid of a color contrast checker. Darker colors on the color wheel are considered to be blues, violets, magentas, and reds, whereas lighter colors are oranges, yellows, greens, and blue-greens.",
+ "background-color
with maroon text color
has a 2.5:1 contrast ratio. You can easily adjust the lightness of the colors since he declared them using the CSS hsl()
property (which stands for hue, saturation, lightness) by changing the third argument. Increase the background-color
lightness value from 35% to 55%, and decrease the color
lightness value from 20% to 15%. This improves the contrast to 5.9:1."
+ ],
+ "challengeSeed": [
+ "",
+ " ",
+ "",
+ "",
+ " The influence that catnip has on feline behavior is well-documented, and its use as an herbal supplement in competitive ninja circles remains controversial. Once again, the debate to ban the substance is brought to the public's attention after the high-profile win of Kittytron, a long-time proponent and user of the green stuff, at the Claw of Fury tournament.
", + "As I've stated in the past, I firmly believe a true ninja's skills must come from within, with no external influences. My own catnip use shall continue as purely recreational.
", + "color
property to a value of 15%.');",
+ "assert(code.match(/background-color:\\s*?hsl\\(120,\\s*?25%,\\s*?55%\\)/gi), 'message: Your code should only change the lightness value for the background-color
property to a value of 55%.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778f367417b2b2512aad",
+ "title": "Avoid Colorblindness Issues by Carefully Choosing Colors that Convey Information",
+ "description": [
+ "There are various forms of colorblindness. These can range from a reduced sensitivity to a certain wavelength of light to the inability to see color at all. The most common form is a reduced sensitivity to detect greens.",
+ "For example, if two similar green colors are the foreground and background color of your content, a colorblind user may not be able to distinguish them. Close colors can be thought of as neighbors on the color wheel, and those combinations should be avoided when conveying important information.",
+ "Note#FFFF33
) background-color
and the green (#33FF33
) text color
are neighboring hues on the color wheel and virtually indistinguishable for some colorblind users. (Their similar lightness also fails the contrast ratio check). Change the text color
to a dark blue (#003366
) to solve both problems."
+ ],
+ "challengeSeed": [
+ "",
+ " ",
+ "",
+ "",
+ " color
for the button
to the dark blue.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d778f367417b2b2512aae",
+ "title": "Give Links Meaning by Using Descriptive Link Text",
+ "description": [
+ "Screen reader users have different options for what type of content their device reads. This includes skipping to (or over) landmark elements, jumping to the main content, or getting a page summary from the headings. Another option is to only hear the links available on a page.",
+ "Screen readers do this by reading the link text, or what's between the anchor (a
) tags. Having a list of \"click here\" or \"read more\" links isn't helpful. Instead, you should use brief but descriptive text within the a
tags to provide more meaning for these users.",
+ "a
) tags so they wrap around the text \"information about batteries\" instead of \"Click here\"."
+ ],
+ "challengeSeed": [
+ "",
+ " Felines the world over have been waging war on the most persistent of foes. This red nemesis combines both cunning stealth and lightening speed. But chin up, fellow fighters, our time for victory may soon be near. Click here for information about batteries
", + "a
tags from around the words \"Click here\" to wrap around the words \"information about batteries\".');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7790367417b2b2512aaf",
+ "title": "Make Links Navigatable with HTML Access Keys",
+ "description": [
+ "HTML offers the accesskey
attribute to specify a shortcut key to activate or bring focus to an element. This can make navigation more efficient for keyboard-only users.",
+ "HTML5 allows this attribute to be used on any element, but it's particularly useful when it's used with interactive ones. This includes links, buttons, and form controls.",
+ "Here's an example:",
+ "<button accesskey="b">Important Button</button>
",
+ "accesskey
attribute to both links and set the first one to \"g\" (for Garfield) and the second one to \"c\" (for Chuck Norris)."
+ ],
+ "challengeSeed": [
+ "",
+ " The internet is littered with varying opinions on nutritional paradigms, from catnip paleo to hairball cleanses. But let's turn our attention to an often overlooked fitness fuel, and examine the protein-carb-NOM trifecta that is lasagna...
", + "Chuck Norris is widely regarded as the premier martial artist on the planet, and it's a complete coincidence anyone who disagrees with this fact mysteriously disappears soon after. But the real question is, is he a cat person?...
", + "accesskey
attribute to the a
tag with the id
of \"first\".');",
+ "assert($('#second').attr('accesskey'), 'message: Your code should add an accesskey
attribute to the a
tag with the id
of \"second\".');",
+ "assert($('#first').attr('accesskey') == 'g', 'message: Your code should set the accesskey
attribute on the a
tag with the id
of \"first\" to \"g\". Note that case matters.');",
+ "assert($('#second').attr('accesskey') == 'c', 'message: Your code should set the accesskey
attribute on the a
tag with the id
of \"second\" to \"c\". Note that case matters.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7790367417b2b2512ab0",
+ "title": "Use Tabindex to Add keyboard Focus to an Element",
+ "description": [
+ "The HTML tabindex
attribute has three distinct functions relating to an element's keyboard focus. When it's on a tag, it indicates that element can be focused on. The value (an integer that's positive, negative, or zero) determines the behavior.",
+ "Certain elements, such as links and form controls, automatically receive keyboard focus when a user tabs through a page. It's in the same order as the elements come in the HTML source markup. This same functionality can be given to other elements, such as div
, span
, and p
, by placing a tabindex=\"0\"
attribute on them. Here's an example:",
+ "<div tabindex="0">I need keyboard focus!</div>
",
+ "Notetabindex
value (typically -1) indicates that an element is focusable, but is not reachable by the keyboard. This method is generally used to bring focus to content programmatically (like when a div
used for a pop-up window is activated), and is beyond the scope of these challenges.",
+ "tabindex
attribute to the p
tag and set its value to \"0\". Bonus - using tabindex
also enables the CSS pseudo-class :focus
to work on the p
tag."
+ ],
+ "challengeSeed": [
+ "",
+ " ",
+ "",
+ "",
+ " tabindex
attribute to the p
tag that holds the form instructions.');",
+ "assert($('p').attr('tabindex') == '0', 'message: Your code should set the tabindex
attribute on the p
tag to a value of 0.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7790367417b2b2512ab1",
+ "title": "Use Tabindex to Specify the Order of Keyboard Focus for Several Elements",
+ "description": [
+ "The tabindex
attribute also specifies the exact tab order of elements. This is achieved when the value of the attribute is set to a positive number of 1 or higher.",
+ "Setting a tabindex=\"1\" will bring keyboard focus to that element first. Then it cycles through the sequence of specified tabindex
values (2, 3, etc.), before moving to default and tabindex=\"0\"
items.",
+ "It's important to note that when the tab order is set this way, it overrides the default order (which uses the HTML source). This may confuse users who are expecting to start navigation from the top of the page. This technique may be necessary in some circumstances, but in terms of accessibility, take care before applying it.",
+ "Here's an example:",
+ "<div tabindex="1">I get keyboard focus, and I get it first!</div>
",
+ "<div tabindex="2">I get keyboard focus, and I get it second!</div>
",
+ "input
and submit input
form controls to be the first two items in the tab order. Add a tabindex
attribute set to \"1\" to the search input
, and a tabindex
attribute set to \"2\" to the submit input
."
+ ],
+ "challengeSeed": [
+ "",
+ " ", + "", + "“There's no Theory of Evolution, just a list of creatures I've allowed to live.”
", + "
", + " - Chuck Norris
", + "", + " ", + "" + ], + "tests": [ + "assert($('#search').attr('tabindex'), 'message: Your code should add a“Wise men say forgiveness is divine, but never pay full price for late pizza.”
", + "
", + " - TMNT
tabindex
attribute to the search input
tag.');",
+ "assert($('#submit').attr('tabindex'), 'message: Your code should add a tabindex
attribute to the submit input
tag.');",
+ "assert($('#search').attr('tabindex') == '1', 'message: Your code should set the tabindex
attribute on the search input
tag to a value of 1.');",
+ "assert($('#submit').attr('tabindex') == '2', 'message: Your code should set the tabindex
attribute on the submit input
tag to a value of 2.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/seed/challenges/01-responsive-web-design/applied-visual-design.json b/seed/challenges/01-responsive-web-design/applied-visual-design.json
new file mode 100644
index 00000000000000..7e8aedf8bac165
--- /dev/null
+++ b/seed/challenges/01-responsive-web-design/applied-visual-design.json
@@ -0,0 +1,3766 @@
+{
+ "name": "Applied Visual Design",
+ "order": 1,
+ "time": "5 hours",
+ "helpRoom": "Help",
+ "challenges": [
+ {
+ "id": "587d7790367417b2b2512ab2",
+ "title": "Introduction to the Applied Visual Design Challenges",
+ "description": [
+ [
+ "",
+ "",
+ "Visual Design in web development is a broad topic. It combines typography, color theory, graphics, animation, and page layout to help deliver a site's message. The definition of good design is a well-discussed subject, with many books on the theme.text-align
property.",
+ "h4
tag's text, which says \"Google\", to the center. Then justify the paragraph tag which contains information about how Google was founded. Finally, align the two anchor tags to the left by using the links
class selector.",
+ "NoteGoogle was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "h4
tag to set it to center.');",
+ "assert($('p').css('text-align') == 'justify', 'message: Your code should use the text-align property on the p
tag to set it to justify.');",
+ "assert($('.links').css('text-align') == 'left', 'message: Your code should use the text-align property on the a
tags by accessing their class links
to set it to left.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7791367417b2b2512ab4",
+ "title": "Adjust the Width of an Element Using the Width Property",
+ "description": [
+ "You can specify the width of an element using the width
property in CSS. Values can be given in relative length units (such as em), absolute length units (such as px), or as a percentage of its containing parent element. Here's an example that changes the width of an image to 220px:",
+ "img {", + "
width: 220px;
}
width
property to the entire card and set it to an absolute value of 245px. Use the fullCard
class to select the element."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "width
property of the card to 245 pixels by using the fullCard
class selector.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7791367417b2b2512ab5",
+ "title": "Adjust the Height of an Element Using the Height Property",
+ "description": [
+ "You can specify the height of an element using the height
property in CSS, similar to the width
property. Here's an example that changes the height of an image to 20px:",
+ "img {", + "
height: 20px;
}
height
property to the h4
tag and set it to 40px."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "h4
height
property to a value of 40 pixels.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d7791367417b2b2512ab6",
+ "title": "Create Visual Balance with the Height of an Element",
+ "description": [
+ "This challenge changes the layout of the links by stacking them to look more like a list.",
+ "To keep everything balanced, you can make sure every element's width and height makes sense in that context.",
+ "height
of the h4
tag to 25px to make the card more compact and a little cleaner."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "h4
height value to 25 pixels.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781a367417b2b2512ab7",
+ "title": "Use the Strong Tag to Make Text Bold",
+ "description": [
+ "To make text bold, you can use the strong
tag. This is often used to draw attention to text and symbolize that it is important. With the strong
tag, the browser applies the CSS of font-weight: bold;
to the element.",
+ "strong
tag around the entire h4
element and its contents."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "strong
tag to the markup.');",
+ "assert($('strong').children('h4').length == 1, 'message: The strong
tag should wrap around the h4
tag and its contents.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781a367417b2b2512ab8",
+ "title": "Use the u Tag to Underline Text",
+ "description": [
+ "To underline text, you can use the u
tag. This is often used to signify that a section of text is important, or something to remember. With the u
tag, the browser applies the CSS of text-decoration: underline;
to the element.",
+ "u
tag around the two anchor tags. It should not include the parent div
that has the class of cardLinks
.",
+ "Noteu
tag when it could be confused for a link. Anchor tags also have a default underlined formatting."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "u
tag to the markup.');",
+ "assert($('u').children('a').length == 2, 'message: The u
tag should wrap around and contain the two a
tags.');",
+ "assert($('u').children('div').length == 0, 'message: The u
tag should not wrap around the parent div
tag.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781a367417b2b2512ab9",
+ "title": "Use the em Tag to Italicize Text",
+ "description": [
+ "To emphasize text, you can use the em
tag. This displays text as italicized, as the browser applies the CSS of font-style: italic;
to the element.",
+ "em
tag around the paragraph tag to give it emphasis."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "em
tag to the markup.');",
+ "assert($('em').children('p').length == 1, 'message: The em
tag should wrap around the p
tag and its contents.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781b367417b2b2512aba",
+ "title": "Use the del Tag to Strikethrough Text",
+ "description": [
+ "To strikethrough text, which is when a horizontal line cuts across the characters, you can use the del
tag. It shows that a section of text is no longer valid. With the del
tag, the browser applies the CSS of text-decoration: line-through;
to the element.",
+ "del
tag around \"Google\" inside the h4
tag and then add the word Alphabet beside it, which should not have the strikethrough formatting."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "del
tag to the markup.');",
+ "assert($('del').text().match(/Google/gi) && !$('del').text().match(/Alphabet/gi), 'message: A del
tag should wrap around the Google text in the h4
tag. It should not contain the word Alphabet.');",
+ "assert($('h4').html().match(/Alphabet/gi), 'message: Include the word Alphabet in the h4
tag, without strikethrough formatting.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781b367417b2b2512abb",
+ "title": "Create a Horizontal Line Using the hr Element",
+ "description": [
+ "You can use the hr
tag to add a horizontal line across the width of its containing element. This can be used to define a change in topic or to visually separate groups of content.",
+ "hr
tag underneath the h4
which contains the card title.",
+ "Notehr
is a self-closing tag, and therefore doesn't need a separate closing tag."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "hr
tag to the markup.');",
+ "assert(code.match(/<\\/strong>\\s*?hr
tag should come between the title and the paragraph.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781b367417b2b2512abc",
+ "title": "Adjust the Background-color Property of Text",
+ "description": [
+ "Instead of adjusting your overall background or the color of the text to make the foreground easily readable, you can add a background-color
to the element holding the text you want to emphasize. This challenge uses rgba()
instead of hex
codes or normal rgb()
.",
+ "rgba stands for:", + "The rgb values can range from 0 to 255. The alpha value can range from 1, which is fully opaque or a solid color, to 0, which is fully transparent or clear.
r = red
g = green
b = blue
a = alpha/level of opacity
rgba()
is great to use in this case, as it allows you to adjust the opacity. This means you don't have to completely block out the background.",
+ "You'll use background-color: rgba(45, 45, 45, 0.1)
for this challenge. It produces a dark gray color that is nearly transparent given the low opacity value of 0.1.",
+ "background-color
of the h4
element to the given rgba()
value.",
+ "Also for the h4
, remove the height
property and add padding
of 10px."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "background-color
property to the h4
element set to rgba(45, 45, 45, 0.1)
.');",
+ "assert($('h4').css('padding-top') == '10px' && $('h4').css('padding-right') == '10px' && $('h4').css('padding-bottom') == '10px' && $('h4').css('padding-left') == '10px', 'message: Your code should add a padding
property to the h4
element and set it to 10 pixels.');",
+ "assert(!($('h4').css('height') == '25px'), 'message: The height
property on the h4
element should be removed.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781b367417b2b2512abd",
+ "title": "Adjust the Size of a Header Versus a Paragraph Tag",
+ "description": [
+ "The font size of header tags (h1
through h6
) should generally be larger than the font size of paragraph tags. This makes it easier for the user to visually understand the layout and level of importance of everything on the page. You use the font-size
property to adjust the size of the text in an element.",
+ "font-size
of the h4
tag to 27 pixels."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "font-size
property to the h4
element set to 27 pixels.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781b367417b2b2512abe",
+ "title": "Add a Box-shadow to a Card-like Element",
+ "description": [
+ "The box-shadow
property applies one or more shadows to an element. This technique can be used on any state of an element, but here you'll apply it on hover.",
+ "The box-shadow
property takes values for offset-x
(how far to push the shadow horizontally from the element), offset-y
(how far to push the shadow vertically from the element), blur-radius
, spread-radius
and a color value, in that order. The blur-radius
and spread-radius
values are optional.",
+ "Here's an example of the CSS to create multiple shadows with some blur, at mostly-transparent black colors:",
+ "box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);", + "
box-shadow
on the card. The element now has an id of thumbnail
, use this selector to place the shadows for the hover state."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "box-shadow
property for the thumbnail
id on its hover state.');",
+ "assert(code.match(/box-shadow:\\s*?0\\s+?10px\\s+?20px\\s+?rgba\\(\\s*?0\\s*?,\\s*?0\\s*?,\\s*?0\\s*?,\\s*?0?\\.19\\),\\s*?0\\s+?6px\\s+?6px\\s+?rgba\\(\\s*?0\\s*?,\\s*?0\\s*?,\\s*?0\\s*?,\\s*?0?\\.23\\)/gi), 'message: You should use the given CSS for the box-shadow
value.');"
+ ],
+ "solutions": [],
+ "hints": [
+ "Remember to use the appropriate pseudo-class selector to place the box-shadows only on the hover state."
+ ],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781c367417b2b2512abf",
+ "title": "Decrease the Opacity of an Element",
+ "description": [
+ "The opacity
property in CSS is used to adjust the opacity, or conversely, the transparency for an item.",
+ "A value of 1 is opaque, which isn't transparent at all.", + "The value given will apply to the entire element, whether that's an image with some transparency, or the foreground and background colors for a block of text.", + "
A value of 0.5 is half see-through.
A value of 0 is completely transparent.
opacity
of the anchor tags to 0.7 using links
class to select them."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "opacity
property to 0.7 on the anchor tags by selecting the class of links
.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781c367417b2b2512ac0",
+ "title": "Use the Text-transform Property to Make Text Uppercase",
+ "description": [
+ "The text-transform
property in CSS is used to set text to uppercase.",
+ "Noteh4
tag to be uppercase using the text-transform
property."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "h4
text should be uppercase.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781c367417b2b2512ac1",
+ "title": "Use a Google Font",
+ "required": [
+ {
+ "link": "https://fonts.googleapis.com/css?family=Open+Sans",
+ "raw": true
+ }
+ ],
+ "description": [
+ "Google Fonts
is a great way to find free fonts to use in a project.",
+ "Once you have selected the preferred font, copy the link tag that is provided and insert it into the head
of your page.",
+ "The Open Sans font is already added for you behind the scenes, but the code to include it in your own project is the following:",
+ "<link href=\"https://fonts.googleapis.com/css?family=Open+Sans\" rel=\"stylesheet\">
",
+ "Once the link is in place, the font is available to include in your CSS by using the pattern font-family: 'FONT', FAMILY_NAME;
.",
+ "In this example, \"FONT\" would be 'Open Sans' and \"FAMILY_NAME\" would be sans-serif. The quotes around 'Open Sans' are required because it has a space in its name. Also, capitalization of the font name matters.",
+ "font-family
of the body to \"Open Sans\"."
+ ],
+ "challengeSeed": [
+ "",
+ "Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.
", + "body
tag should have the font of \"Open Sans\".');"
+ ],
+ "solutions": [],
+ "hints": [
+ "Remember to include both the font and the family-name."
+ ],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781c367417b2b2512ac2",
+ "title": "Set the Font-size for Multiple Heading Elements",
+ "description": [
+ "The font-size
property is used to specify how large the text is in a given element. This rule can be used for multiple elements to create visual consistency of text on a page. In this challenge, you'll set the values for all h1
through h6
tags to balance the heading sizes.",
+ "font-size
of the h1
tag to 68px.font-size
of the h2
tag to 52px.font-size
of the h3
tag to 40px.font-size
of the h4
tag to 32px.font-size
of the h5
tag to 21px.font-size
of the h6
tag to 14px.font-size
property for the h1
tag to 68 pixels.');",
+ "assert($('h2').css('font-size') == '52px', 'message: Your code should set the font-size
property for the h2
tag to 52 pixels.');",
+ "assert($('h3').css('font-size') == '40px', 'message: Your code should set the font-size
property for the h3
tag to 40 pixels.');",
+ "assert($('h4').css('font-size') == '32px', 'message: Your code should set the font-size
property for the h4
tag to 32 pixels.');",
+ "assert($('h5').css('font-size') == '21px', 'message: Your code should set the font-size
property for the h5
tag to 21 pixels.');",
+ "assert($('h6').css('font-size') == '14px', 'message: Your code should set the font-size
property for the h6
tag to 14 pixels.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781c367417b2b2512ac3",
+ "title": "Set the Font-weight for Multiple Heading Elements",
+ "description": [
+ "You set the font-size
of each heading tag in the last challenge, here you'll adjust the font-weight
.",
+ "The font-weight
property sets how thick or thin characters are in a section of text.",
+ "font-weight
of the h1
tag to 800.font-weight
of the h2
tag to 600.font-weight
of the h3
tag to 500.font-weight
of the h4
tag to 400.font-weight
of the h5
tag to 300.font-weight
of the h6
tag to 200.font-weight
property for the h1
tag to 800.');",
+ "assert($('h2').css('font-weight') == '600', 'message: Your code should set the font-weight
property for the h2
tag to 600.');",
+ "assert($('h3').css('font-weight') == '500', 'message: Your code should set the font-weight
property for the h3
tag to 500.');",
+ "assert($('h4').css('font-weight') == '400', 'message: Your code should set the font-weight
property for the h4
tag to 400.');",
+ "assert($('h5').css('font-weight') == '300', 'message: Your code should set the font-weight
property for the h5
tag to 300.');",
+ "assert($('h6').css('font-weight') == '200', 'message: Your code should set the font-weight
property for the h6
tag to 200.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781c367417b2b2512ac4",
+ "title": "Set the Font-size of Paragraph Text",
+ "description": [
+ "The font-size
property in CSS is not limited to headings, it can be applied to any element containing text.",
+ "font-size
property for the paragraph to 16px to make it more visible."
+ ],
+ "challengeSeed": [
+ "",
+ "", + " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.", + "
" + ], + "tests": [ + "assert($('p').css('font-size') == '16px', 'message: Yourp
tag should have a font-size
of 16 pixels.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781d367417b2b2512ac5",
+ "title": "Set the Line-height of Paragraphs",
+ "description": [
+ "CSS offers the line-height
property to change the height of each line in a block of text. As the name suggests, it changes the amount of vertical space that each line of text gets.",
+ "line-height
property to the p
tag and set it to 25px."
+ ],
+ "challengeSeed": [
+ "",
+ "", + " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.", + "
" + ], + "tests": [ + "assert($('p').css('line-height') == '25px', 'message: Your code should set theline-height
of the p
tag to 25 pixels.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781d367417b2b2512ac7",
+ "title": "Adjust the Color of an Anchor Tag",
+ "description": [
+ "You can adjust the text color of any text in an element with the color
property.",
+ "color
property of the anchor (a
) tag to #000
(black)."
+ ],
+ "challengeSeed": [
+ "",
+ "CatPhotoApp"
+ ],
+ "tests": [
+ "assert($('a').css('color') == 'rgb(0, 0, 0)', 'message: The color
of the anchor tag text should be black.')"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781d367417b2b2512ac8",
+ "title": "Adjust the Hover State of an Anchor Tag",
+ "description": [
+ "Following from the previous challenge, the styling of the anchor tag can be changed for its hover state using the :hover
pseudo-class selector.",
+ "a
tag's CSS so when the user hovers over it, the color
is blue and the underline is removed.",
+ "Notetext-decoration
property set to none."
+ ],
+ "challengeSeed": [
+ "",
+ "CatPhotoApp"
+ ],
+ "tests": [
+ "assert($('a').css('color') == 'rgb(0, 0, 0)', 'message: The anchor tag color
should remain black, only add CSS rules for the :hover
state.');",
+ "assert(code.match(/(?:a:hover\\s*?{\\s*?color:\\s*?blue;\\s*?text-decoration:\\s*?none;\\s*?}|a:hover\\s*?{\\s*?text-decoration:\\s*?none;\\s*?color:\\s*?blue;\\s*?})/gi), 'message: The anchor tag should have a color
of blue and no underline on hover.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781e367417b2b2512ac9",
+ "title": "Change an Element's Relative Position",
+ "description": [
+ "CSS treats each HTML element as its own box, which is usually referred to as the CSS Box Model
. Block-level items automatically start on a new line (think headings, paragraphs, and divs) while inline items sit within surrounding content (like images or spans). The default layout of elements in this way is called the normal flow
of a document, but CSS offers the position property to override it.",
+ "When the position of an element is set to relative
, it allows you to specify how CSS should move it relative to its current position in the normal flow of the page. It pairs with the CSS offset properties of left
or right
, and top
or bottom
. These say how many pixels, percentages, or ems to move the item away from where it is normally positioned. The following example moves the paragraph 10 pixels away from the bottom:",
+ "p {", + "Changing an element's position to relative does not remove it from the normal flow - other elements around it still behave as if that item were in its default position.", + "Note
position: relative;
bottom: 10px;
}
position
of the h2
to relative
, and use a CSS offset to move it 15 pixels away from the top
of where it sits in the normal flow. Notice there is no impact on the positions of the surrounding h1 and p elements."
+ ],
+ "challengeSeed": [
+ " ",
+ "",
+ " I still think the h2 is where it normally sits.
", + "" + ], + "tests": [ + "assert($('h2').css('position') == 'relative', 'message: Theh2
element should have a position
property set to relative
.');",
+ "assert($('h2').css('top') == '15px', 'message: Your code should use a CSS offset to relatively position the h2
15px away from the top
of where it normally sits.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781e367417b2b2512aca",
+ "title": "Move a Relatively Positioned Element with CSS Offsets",
+ "description": [
+ "The CSS offsets of top
or bottom
, and left
or right
tell the browser how far to offset an item relative to where it would sit in the normal flow of the document. This can be slightly confusing, because you're offsetting an element away from a given spot, which effectively moves it towards the opposite direction. As you saw in the last challenge, using the top offset moved the h2 downwards. Likewise, using a left offset effectively moves an item to the right.",
+ "h2
15 pixels to the right and 10 pixels up."
+ ],
+ "challengeSeed": [
+ "",
+ " ",
+ "",
+ "",
+ " I still think the h2 is where it normally sits.
", + "" + ], + "tests": [ + "assert($('h2').css('bottom') == '10px', 'message: Your code should use a CSS offset to relatively position theh2
10px upwards. In other words, move it 10px away from the bottom
of where it normally sits.');",
+ "assert($('h2').css('left') == '15px', 'message: Your code should use a CSS offset to relatively position the h2
15px towards the right. In other words, move it 15px away from the left
of where it normally sits.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781e367417b2b2512acb",
+ "title": "Lock an Element to its Parent with Absolute Positioning",
+ "description": [
+ "The next option for the CSS position
property is absolute
, which locks the element in place relative to its parent container. Unlike the relative
position, this removes the element from the normal flow of the document, so surrounding items ignore it. The CSS offset properties (top or bottom and left or right) are used to adjust the position.",
+ "One nuance with absolute positioning is that it will be locked relative to its closest positioned ancestor. If you forget to add a position rule to the parent item, (this is typically done using position: relative;
), the browser will keep looking up the chain and ultimately default to the body tag.",
+ "#searchbar
element to the top-right of its section
parent by declaring its position
as absolute
. Give it top
and right
offsets of 0 pixels each."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ " #searchbar
element should have a position
set to absolute
.');",
+ "assert($('#searchbar').css('top') == '0px', 'message: Your code should use the top
CSS offset of 0 pixels on the #searchbar
element.');",
+ "assert($('#searchbar').css('right') == '0px', 'message: Your code should use the right
CSS offset of 0 pixels on the #searchbar
element.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d781e367417b2b2512acc",
+ "title": "Lock an Element to the Browser Window with Fixed Positioning",
+ "description": [
+ "The next layout scheme that CSS offers is the fixed
position, which is a type of absolute positioning that locks an element relative to the browser window. Similar to absolute positioning, it's used with the CSS offset properties and also removes the element from the normal flow of the document. Other items no longer \"realize\" where it is positioned, which may require some layout adjustments elsewhere.",
+ "One key difference from the absolute
position is that the element won't move when the user scrolls.",
+ "navbar
. Change its position
to fixed
, and offset it 0 pixels from the top
and 0 pixels from the left
. Notice the (lack of) impact to the h1
position, it hasn't been pushed down to accommodate the navigation bar and would need to be adjusted separately."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ " I shift up when the #navbar is fixed to the browser window.
", + "" + ], + "tests": [ + "assert($('#navbar').css('position') == 'fixed', 'message: The#navbar
element should have a position
set to fixed
.');",
+ "assert($('#navbar').css('top') == '0px', 'message: Your code should use the top
CSS offset of 0 pixels on the #navbar
element.');",
+ "assert($('#navbar').css('left') == '0px', 'message: Your code should use the left
CSS offset of 0 pixels on the #navbar
element.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a3367417b2b2512ace",
+ "title": "Push Elements Left or Right with the Float Property",
+ "description": [
+ "The next positioning tool does not actually use position
, but sets the float
property of an element. Floating elements are removed from the normal flow of a document and pushed to either the left
or right
of their containing parent element. It's commonly used with the width
property to specify how much horizontal space the floated element requires.",
+ "section
and aside
elements next to each other. Give the #left
item a float
of left
and the #right
item a float
of right
."
+ ],
+ "challengeSeed": [
+ "",
+ " ",
+ "",
+ "",
+ " Good stuff
", + "left
should have a float
value of left
.');",
+ "assert($('#right').css('float') == 'right', 'message: The element with id right
should have a float
value of right
.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a3367417b2b2512acf",
+ "title": "Change the Position of Overlapping Elements with the Z-index Property",
+ "description": [
+ "When elements are positioned to overlap, the element coming later in the HTML markup will, by default, appear on the top of the other elements. However, the z-index
property can specify the order of how elements are stacked on top of one another. It must be an integer (i.e. a whole number and not a decimal), and higher values for the z-index
property of an element move it higher in the stack than those with lower values.",
+ "z-index
property to the element with the class name of first
(the red rectangle) and set it to a value of 2 so it covers the other element (blue rectangle)."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('.first').css('z-index') == '2', 'message: The element with class first
should have a z-index
value of 2.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a3367417b2b2512ad0",
+ "title": "Center an Element Horizontally Using Margin",
+ "description": [
+ "Another positioning technique is to center a block element horizontally. One way to do this is to set its margin
to a value of auto.",
+ "This method works for images, too. Images are inline elements by default, but can be changed to block elements when you set the display
property to block.",
+ "div
on the page by adding a margin
property with a value of auto."
+ ],
+ "challengeSeed": [
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/margin:\\s*?auto;/g), 'message: The div
should have a margin
set to auto.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a3367417b2b2512ad1",
+ "title": "Learn about Complementary Colors",
+ "description": [
+ "Color theory and its impact on design is a deep topic and only the basics are covered in the following challenges. On a website, color can draw attention to content, evoke emotions, or create visual harmony. Using different combinations of colors can really change the look of a website, and a lot of thought can go into picking a color palette that works with your content.",
+ "The color wheel is a useful tool to visualize how colors relate to each other - it's a circle where similar hues are neighbors and different hues are farther apart. When two colors are opposite each other on the wheel, they are called complementary colors. They have the characteristic that if they are combined, they \"cancel\" each other out and create a gray color. However, when placed side-by-side, these colors appear more vibrant and produce a strong visual contrast.",
+ "Some examples of complementary colors with their hex codes are:",
+ "red (#FF0000) and cyan (#00FFFF)", + "There are many color picking tools available online that have an option to find the complement of a color.", + "Note
green (#00FF00) and magenta (#FF00FF)
blue (#0000FF) and yellow (#FFFF00)
background-color
property of the blue
and yellow
classes to their respective colors. Notice how the colors look different next to each other than they do compared against the white background."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('.blue').css('background-color') == 'rgb(0, 0, 255)', 'message: The div
element with class blue
should have a background-color
of blue.');",
+ "assert($('.yellow').css('background-color') == 'rgb(255, 255, 0)', 'message: The div
element with class yellow
should have a background-color
of yellow.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a4367417b2b2512ad2",
+ "title": "Learn about Tertiary Colors",
+ "description": [
+ "Computer monitors and device screens create different colors by combining amounts of red, green, and blue light. This is known as the RGB additive color model in modern color theory. Red (R), green (G), and blue (B) are called primary colors. Mixing two primary colors creates the secondary colors cyan (G + B), magenta (R + B), and yellow (R + G). You saw in these colors in the Complementary Colors challenge. These secondary colors happen to be the complement to the primary color not used in their creation, and are opposite to that primary color on the color wheel. For example, magenta is made with red and blue, and is the complement to green.",
+ "Tertiary colors are the result of combining a primary color with one of its secondary color neighbors. For example, red (primary) and yellow (secondary) make orange. This adds six more colors to a simple color wheel for a total of twelve.",
+ "There are various methods of selecting different colors that result in a harmonious combination in design. One example that can use tertiary colors is called the split-complementary color scheme. It starts with a base color, then pairs it with the two colors that are adjacent to its complement. The three colors provide strong visual contrast in a design, but is more subtle than using two complementary colors.",
+ "Here are three colors using the split-complement scheme:",
+ "cyan (#00FFFF)", + "
orange (#FF7D00)
raspberry (#FF007D)
background-color
property of the orange
, cyan
, and raspberry
classes to their respective colors. Make sure to use the hex codes because the orange and raspberry in the example above are not browser-recognized color names."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('.orange').css('background-color') == 'rgb(255, 125, 0)', 'message: The div
element with class orange
should have a background-color
of orange.');",
+ "assert($('.cyan').css('background-color') == 'rgb(0, 255, 255)', 'message: The div
element with class cyan
should have a background-color
of cyan.');",
+ "assert($('.raspberry').css('background-color') == 'rgb(255, 0, 125)', 'message: The div
element with class raspberry
should have a background-color
of raspberry.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a4367417b2b2512ad3",
+ "title": "Adjusting the Color of Various Elements to Complementary Colors",
+ "description": [
+ "The complementary colors challenge showed that opposite colors on the color wheel can make each other appear more vibrant when placed side-by-side. However, the strong visual contrast can be jarring if it's overused on a website, and can sometimes make text harder to read if it's placed on a complementary-colored background. In practice, one of the colors is usually dominant and the complement is used to bring visual attention to certain content on the page.",
+ "#09A7A1
) as the dominant color, and its orange (#FF790E
) complement to visually highlight the sign-up buttons. Change the background-color
of both the header
and footer
from black to the teal color. Then change the h2
text color
to teal as well. Finally, change the background-color
of the button
to the orange color."
+ ],
+ "challengeSeed": [
+ "",
+ "Join this two day workshop that walks through how to implement cutting-edge snack-getting algorithms with a command line interface. Coding usually involves writing exact instructions, but sometimes you need your computer to execute flexible commands, like fetch Pringles
.
This week-long retreat will level-up your coding ninja skills to actual ninja skills. No longer is the humble bisection search limited to sorted arrays or coding interview questions, applying its concepts in the kitchen will have you chopping carrots in O(log n) time before you know it.
", + " ", + "header
element should have a background-color
of #09A7A1.');",
+ "assert($('footer').css('background-color') == 'rgb(9, 167, 161)', 'message: The footer
element should have a background-color
of #09A7A1.');",
+ "assert($('h2').css('color') == 'rgb(9, 167, 161)', 'message: The h2
element should have a color
of #09A7A1.');",
+ "assert($('button').css('background-color') == 'rgb(255, 121, 14)', 'message: The button
element should have a background-color
of #FF790E.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a4367417b2b2512ad4",
+ "title": "Adjust the Hue of a Color",
+ "description": [
+ "Colors have several characteristics including hue, saturation, and lightness. CSS3 introduced the hsl()
property as an alternative way to pick a color by directly stating these characteristics.",
+ "Hue is what people generally think of as 'color'. If you picture a spectrum of colors starting with red on the left, moving through green in the middle, and blue on right, the hue is where a color fits along this line. In hsl(), hue uses a color wheel concept instead of the spectrum, where the angle of the color on the circle is given as a value between 0 and 360.",
+ "Saturation is the amount of gray in a color. A fully saturated color has no gray in it, and a minimally saturated color is almost completely gray. This is given as a percentage with 100% being fully saturated.",
+ "Lightness is the amount of white or black in a color. A percentage is given ranging from 0% (black) to 100% (white), where 50% is the normal color.",
+ "Here are a few examples of using hsl()
with fully-saturated, normal lightness colors:",
+ "/* Red */", + "
hsl(0, 100%, 50%) (Red can also have a hue of 360)
/* Yellow */
hsl(60, 100%, 50%)
/* Green */
hsl(120, 100%, 50%)
/* Cyan */
hsl(180, 100%, 50%)
/* Blue */
hsl(240, 100%, 50%)
/* Magenta */
hsl(300, 100%, 50%)
background-color
of each div
element based on the class names (green
, cyan
, or blue
) using hsl()
. All three should have full saturation and normal lightness."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/\\.green\\s*?{\\s*?background-color:\\s*?hsl/gi), 'message: Your code should use the hsl()
property to declare the color green.');",
+ "assert(code.match(/\\.cyan\\s*?{\\s*?background-color:\\s*?hsl/gi), 'message: Your code should use the hsl()
property to declare the color cyan.');",
+ "assert(code.match(/\\.blue\\s*?{\\s*?background-color:\\s*?hsl/gi), 'message: Your code should use the hsl()
property to declare the color blue.');",
+ "assert($('.green').css('background-color') == 'rgb(0, 255, 0)', 'message: The div
element with class green
should have a background-color
of green.');",
+ "assert($('.cyan').css('background-color') == 'rgb(0, 255, 255)', 'message: The div
element with class cyan
should have a background-color
of cyan.');",
+ "assert($('.blue').css('background-color') == 'rgb(0, 0, 255)', 'message: The div
element with class blue
should have a background-color
blue.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a4367417b2b2512ad5",
+ "title": "Adjust the Tone of a Color",
+ "description": [
+ "The hsl()
option in CSS also makes it easy to adjust the tone of a color. Mixing white with a pure hue creates a tint of that color, and adding black will make a shade. Alternatively, a tone is produced by adding gray or by both tinting and shading. Recall that the 's' and 'l' of hsl()
stand for saturation and lightness, respectively. The saturation percent changes the amount of gray and the lightness percent determines how much white or black is in the color. This is useful when you have a base hue you like, but need different variations of it.",
+ "background-color
from the header
element. Starting with that color as a base, add a background-color
to the nav
element so it uses the same teal hue, but has 80% saturation and 25% lightness values to change its tone and shade."
+ ],
+ "challengeSeed": [
+ "",
+ "nav
element should have a background-color
of the adjusted teal and make sure to use the hsl()
property.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a5367417b2b2512ad6",
+ "title": "Create a Gradual CSS Linear Gradient",
+ "description": [
+ "Applying a color on HTML elements is not limited to one flat hue. CSS provides the ability to use color transitions, otherwise known as gradients, on elements. This is accessed through the background
property's linear-gradient()
function. Here is the general syntax:",
+ "background: linear-gradient(gradient_direction, color 1, color 2, color 3, ...);
",
+ "The fist argument specifies the direction from which color transition starts - it can be stated as a degree, where 90deg makes a vertical gradient and 45deg is angled like a backslash. The following arguments specify the order of colors used in the gradient.",
+ "Example:",
+ "background: linear-gradient(90deg, red, yellow, rgb(204, 204, 255));
",
+ "linear-gradient()
for the div
element's background
, and set it from a direction of 35 degrees to change the color from #CCFFFF
to #FFCCCC
."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/background:\\s*?linear-gradient\\(35deg,\\s*?#CCFFFF,\\s*?#FFCCCC\\);/gi), 'message: The div
element should have a linear-gradient
background
with the specified direction and colors.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a5367417b2b2512ad7",
+ "title": "Use a CSS Linear Gradient to Create a Striped Element",
+ "description": [
+ "The repeating-linear-gradient()
function is very similar to linear-gradient()
with the major difference that it repeats the specified gradient pattern. repeating-linear-gradient()
accepts a variety of values, but for simplicity, you'll work with an angle value and color stop values in this challenge.",
+ "The angle value is the direction of the gradient. Color stops are like width values that mark where a transition takes place, and are given with a percentage or a number of pixels.",
+ "In the example demonstrated in the code editor, the gradient starts with the color yellow
at 0 pixels which blends into the second color blue
at 40 pixels away from the start. Since the next color stop is also at 40 pixels, the gradient immediately changes to the third color green
, which itself blends into the fourth color value red
as that is 80 pixels away from the beginning of the gradient.",
+ "For this example, it helps to think about the color stops as pairs where every two colors blend together.",
+ "0px [yellow -- blend -- blue] 40px [green -- blend -- red] 80px
",
+ "If every two color stop values are the same color, the blending isn't noticeable because it's between the same color, followed by a hard transition to the next color, so you end up with stripes.",
+ "repeating-linear-gradient()
to use a gradient angle of 45deg
, then set the first two color stops to yellow
, and finally the second two color stops to black
."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/background:\\s*?repeating-linear-gradient\\(\\s*?45deg/gi), 'message: The angle of the repeating-linear-gradient()
should be 45deg.');",
+ "assert(!code.match(/90deg/gi), 'message: The angle of the repeating-linear-gradient()
should no longer be 90deg');",
+ "assert(code.match(/yellow\\s+?0px/gi), 'message: The color stop at 0 pixels should be yellow
.');",
+ "assert(code.match(/yellow\\s+?40px/gi), 'message: One color stop at 40 pixels should be yellow
.');",
+ "assert(code.match(/yellow\\s+?40px,\\s*?black\\s+?40px/gi), 'message: The second color stop at 40 pixels should be black
.');",
+ "assert(code.match(/black\\s+?80px/gi), 'message: The last color stop at 80 pixels should be black
.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a5367417b2b2512ad8",
+ "title": "Create Texture by Adding a Subtle Pattern as a Background Image",
+ "description": [
+ "One way to add texture and interest to a background and have it stand out more is to add a subtle pattern. The key is balance, as you don't want the background to stand out too much, and take away from the foreground. The background
property supports the url()
function in order to link to an image of the chosen texture or pattern. The link address is wrapped in quotes inside the parentheses.",
+ "https://i.imgur.com/MJAkxbh.png
, set the background
of the whole page with the body
selector."
+ ],
+ "challengeSeed": [
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/background:\\s*?url\\((\"|')https:\\/\\/i\\.imgur\\.com\\/MJAkxbh\\.png(\"|')\\)/gi), 'message: Your body
element should have a background
property set to a url()
with the given link.');"
+ ],
+ "solutions": [],
+ "hints": [
+ "Remember to wrap the address in quotes within the url() function."
+ ],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a5367417b2b2512ad9",
+ "title": "Use the CSS Transform Scale Property to Change the Size of an Element",
+ "description": [
+ "To change the scale of an element, CSS has the transform
property, along with its scale()
function. The following code example doubles the size of all the paragraph elements on the page:",
+ "p {", + "
transform:scale(2);
}
ball2
to 1.5 times its original size."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/#ball2\\s*?{\\s*?left:\\s*?65%;\\s*?transform:\\s*?scale\\(1\\.5\\);/gi), 'message: Set the transform
property for #ball2
to scale it 1.5 times its size.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a5367417b2b2512ada",
+ "title": "Use the CSS Transform Property to Scale an Element on Hover",
+ "description": [
+ "The transform
property has a verity of functions that lets you scale, move, rotate, skew, etc., your elements. When used with pseudo-classes such as :hover
that specify a certain state of an element, the transform
property can easily add interactivity to your elements.",
+ "Here's an example to scale the paragraph elements to 2.1 times their original size when a user hovers over them:",
+ "p:hover {", + "
transform: scale(2.1);}
}
hover
state of the div
and use the transform
property to scale the div
element to 1.1 times its original size when a user hovers over it."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/div:hover\\s*?{\\s*?transform:\\s*?scale\\(1\\.1\\);/gi), 'message: The size of the div
element should scale 1.1 times when the user hovers over it.');"
+ ],
+ "solutions": [],
+ "hints": [
+ "Make sure to apply the CSS rule to the hover state of the div, using div:hover"
+ ],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a6367417b2b2512adb",
+ "title": "Use the CSS Transform Property SkewX",
+ "description": [
+ "The next function of the transform
property is skewX()
, which skews the selected element along its X (horizontal) axis by a given degree.",
+ "The following code skews the paragraph element by -32 degrees along the X axis.",
+ "p {", + "
transform: skewX(-32deg);
}
bottom
by 24 degrees along the X axis by using the transform
property."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/#bottom\\s*?{\\s*?.*?\\s*?transform:\\s*?skewX\\(24deg\\);/g), 'message: The element with id bottom
should be skewed by 24 degrees along its X axis.');"
+ ],
+ "solutions": [],
+ "hints": [
+ "Notice that there is no space between the number and \"deg\" (-32deg) when declaring the degrees value."
+ ],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a6367417b2b2512adc",
+ "title": "Use the CSS Transform Property SkewY",
+ "description": [
+ "Given that the skewX()
function skews the selected element along the X axis by a given degree, it is no surprise that the skewY()
property skews an element along the Y (vertical) axis.",
+ "top
-10 degrees along the Y axis by using the transform
property."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/#top\\s*?{\\s*?.*?\\s*?transform:\\s*?skewY\\(-10deg\\);/g), 'message: The element with id top
should be skewed by -10 degrees along its Y axis.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a6367417b2b2512add",
+ "title": "Create a Graphic Using CSS",
+ "description": [
+ "By manipulating different selectors and properties, you can make interesting shapes. One of the easier ones to try is a crescent moon shape. For this challenge you need to work with the box-shadow
property that sets the shadow of an element, along with the border-radius
property that controls the roundness of the element's corners.",
+ "You will create a round, transparent object with a crisp shadow that is slightly offset to the side - the shadow is actually going to be the moon shape you see.",
+ "In order to create a round object, the border-radius
property should be set to a value of 50%.",
+ "You may recall from an earlier challenge that the box-shadow
property takes values for offset-x
, offset-y
, blur-radius
, spread-radius
and a color value in that order. The blur-radius
and spread-radius
values are optional.",
+ "background-color
to transparent, then set the border-radius
property to 50% to make the circular shape. Finally, change the box-shadow
property to set the offset-x
to 25px, the offset-y
to 10px, blur-radius
to 0, spread-radius
to 0, and color to blue."
+ ],
+ "challengeSeed": [
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/background-color:\\s*?transparent;/gi), 'message: The value of the background-color
property should be set to transparent
.');",
+ "assert(code.match(/border-radius:\\s*?50%;/gi), 'message: The value of the border-radius
property should be set to 50%
.');",
+ "assert(code.match(/box-shadow:\\s*?25px\\s+?10px\\s+?0(px)?\\s+?0(px)?\\s+?blue\\s*?;/gi), 'message: The value of the box-shadow
property should be set to 25px for offset-x
, 10px for offset-y
, 0 for blur-radius
, 0 for spread-radius
, and finally blue for the color.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a6367417b2b2512ade",
+ "title": "Create a More Complex Shape Using CSS and HTML",
+ "description": [
+ "One of the most popular shapes in the world is the heart shape and this challenge creates it with raw CSS. But first, you need to understand the :before
and :after
selectors. These selectors are used to add something before or after a selected element. In the following example, a :before
selector is used to add a rectangle to an element with the class heart
:",
+ ".heart:before {", + "For the
content: \"\";
background-color: yellow;
border-radius: 25%;
position: absolute;
height: 50px;
width: 70px;
top: -50px;
left: 5px;
}
:before
and :after
selectors to function properly, they must have a defined content
property. It usually has content such as a photo or text. When the :before
and :after
selectors add shapes, the content
property is still required, but it's set to an empty string.",
+ "In the above example, the element with the class of heart
has a :before
selector that produces a yellow rectangle with height
and width
of 50px and 70px, respectively. This rectangle has round corners due to its 25% border radius and is positioned absolutely at 5px from the left
and 50px above the top
of the element.",
+ "heart:after
selector, change the background-color
to pink and the border-radius
to 50%.",
+ "Next, target the element with the class heart
(just heart
) and fill in the transform
property. Use the rotate()
function with -45 degrees. (rotate()
works the same way that skewX()
and skewY()
do).",
+ "Finally, in the heart:before
selector, set its content
property to an empty string."
+ ],
+ "challengeSeed": [
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/\\.heart:after\\s*?{\\s*?background-color:\\s*?pink;/gi), 'message: The background-color
property of the heart:after
selector should be pink.');",
+ "assert(code.match(/border-radius:\\s*?50%/gi).length == 2, 'message: The border-radius
of the heart:after
selector should be 50%.');",
+ "assert(code.match(/transform:\\s*?rotate\\(-45deg\\)/gi), 'message: The transform
property for the heart
class should use a rotate()
function set to -45 degrees.');",
+ "assert(code.match(/\\.heart:before\\s*?{\\s*?content:\\s*?(\"|')\\1;/gi), 'message: The content
of the heart:before
selector should be an empty string.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a7367417b2b2512adf",
+ "title": "Learn How CSS Keyframes and Animation Properties Work",
+ "description": [
+ "To animate an element, you need to know about the animation properties and the @keyframes
rule. The animation properties control how the animation should behave and the @keyframes
rule controls what happens during that animation. There are eight animation properties in total, this challenge will keep it simple and cover the two most important ones first:",
+ "animation-name
sets the name of the animation, which is later used by @keyframes
to tell CSS which rules go with which animations.",
+ "animation-duration
sets the length of time for the animation.",
+ "@keyframes
is how to specify exactly what happens within the animation over the duration. This is done by giving CSS properties for specific \"frames\" during the animation, with percentages ranging from 0% to 100%. If you compare this to a movie, the CSS properties for 0% is how the element displays in the opening scene. The CSS properties for 100% is how the element appears at the end, right before the credits roll. Then CSS applies the magic to transition the element over the given duration to act out the scene. Here's an example to illustrate the usage of @keyframes
and the animate properties:",
+ "#anim {", + "For the element with the
animation-name: colorful;
animation-duration: 3s;
}
@keyframes colorful {
0% {
background-color: blue;
}
100% {
background-color: yellow;
}
}
anim
id, the code snippet above sets the animation-name
to colorful
and sets the animation-duration
to 3 seconds. Then the @keyframes
rule links to the animation properties with the name colorful
. It sets the color to blue at the beginning of the animation (0%) which will transition to yellow by the end of the animation (100%). You aren't limited to only beginning-end transitions, you can set properties for the element for any percentage between 0% and 100%.",
+ "rect
, by setting the animation-name
to rainbow and the animation-duration
to 4 seconds. Next, declare a @keyframes
rule, and set the background-color
at the beginning of the animation (0%
) to blue, the middle of the animation (50%
) to green, and the end of the animation (100%
) to yellow."
+ ],
+ "challengeSeed": [
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('#rect').css('animation-name') == 'rainbow', 'message: The element with id of rect
should have an animation-name
property with a value of rainbow.');",
+ "assert($('#rect').css('animation-duration') == '4s', 'message: The element with id of rect
should have an animation-duration
property with a value of 4s.');",
+ "assert(code.match(/@keyframes\\s+?rainbow\\s*?{/g), 'message: The @keyframes
rule should use the animation-name
of rainbow.');",
+ "assert(code.match(/0%\\s*?{\\s*?background-color:\\s*?blue;\\s*?}/gi), 'message: The @keyframes
rule for rainbow should use a background-color
of blue at 0%.');",
+ "assert(code.match(/50%\\s*?{\\s*?background-color:\\s*?green;\\s*?}/gi), 'message: The @keyframes
rule for rainbow should use a background-color
of green at 50%.');",
+ "assert(code.match(/100%\\s*?{\\s*?background-color:\\s*?yellow;\\s*?}/gi), 'message: The @keyframes
rule for rainbow should use a background-color
of yellow at 100%.');"
+ ],
+ "solutions": [],
+ "hints": [
+ "Make sure the @keyframes rule links to the animation-name."
+ ],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a7367417b2b2512ae0",
+ "title": "Use CSS Animation to Change the Hover State of a Button",
+ "description": [
+ "You can use CSS @keyframes
to change the color of a button in its hover state.",
+ "Here's an example of changing the height of an image on hover:",
+ "<style>", + "
img:hover {
animation-name: width;
animation-duration: 4s;
}
@keyframes width {
100% {
width: 40px;
}
}
</style>
<img src="https://bit.ly/smallgooglelogo" alt="Google's Logo" />
@keyframes
to change the background-color
of the button
element so it becomes #4791d0
when a user hovers over it. The @keyframes
rule should only have an entry for 100%
."
+ ],
+ "challengeSeed": [
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/@keyframes\\s+?background-color\\s*?{/g), 'message: The @keyframes rule should use the animation-name
background-color.');",
+ "assert(code.match(/100%\\s*?{\\s*?background-color:\\s*?#4791d0;\\s*?}/gi), 'message: There should be one rule under @keyframes
that changes the background-color
to #4791d0
at 100%.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a7367417b2b2512ae1",
+ "title": "Create Movement Using CSS Animation",
+ "description": [
+ "When elements have a specified position
, such as fixed
or relative
, the CSS offset properties right
, left
, top
, and bottom
can be used in animation rules to create movement.",
+ "As shown in the example below, you can push the item downwards then upwards by setting the top
property of the 50%
keyframe to 50px, but having it set to 0px for the first (0%
) and the last (100%
) keyframe.",
+ "@keyframes rainbow {", + "
0% {
background-color: blue;
top: 0px;
}
50% {
background-color: green;
top: 50px;
}
100% {
background-color: yellow;
top: 0px;
}
}
div
animation. Using the left
offset property, add to the @keyframes
rule so rainbow starts at 0 pixels at 0%
, moves to 25 pixels at 50%
, and ends at -25 pixels at 100%
."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/0%\\s*?{\\s*?background-color:\\s*?blue;\\s*?top:\\s*?0px;\\s*?left:\\s*?0px;\\s*?}/gi), 'message: The @keyframes
rule for 0%
should use the left
offset of 0px.');",
+ "assert(code.match(/50%\\s*?{\\s*?background-color:\\s*?green;\\s*?top:\\s*?50px;\\s*?left:\\s*?25px;\\s*?}/gi), 'message: The @keyframes
rule for 50%
should use the left
offset of 25px.');",
+ "assert(code.match(/100%\\s*?{\\s*?background-color:\\s*?yellow;\\s*?top:\\s*?0px;\\s*?left:\\s*?-25px;\\s*?}/gi), 'message: The @keyframes
rule for 100%
should use the left
offset of -25px.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a7367417b2b2512ae2",
+ "title": "Create Visual Direction by Fading an Element from Left to Right",
+ "description": [
+ "For this challenge, you'll change the opacity
of an animated element so it gradually fades as it reaches the right side of the screen.",
+ "In the displayed animation, the round element with the gradient background moves to the right by the 50% mark of the animation per the @keyframes
rule.",
+ "ball
and add the opacity
property set to 0.1 at 50%
so the element fades as it moves to the right."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/opacity:\\s*?0?\\.1;/gi), 'message: The keyframes
rule for fade should set the opacity
property to 0.1 at 50%.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a8367417b2b2512ae3",
+ "title": "Animate Elements Continually Using an Infinite Animation Count",
+ "description": [
+ "The previous challenges covered how to use some of the animation properties and the @keyframes
rule. Another animation property is the animation-iteration-count
, which allows you to control how many times you would like to loop through the animation. Here's an example:",
+ "animation-iteration-count: 3;
",
+ "The above animation will stop after running 3 times, but it's possible to make the animation run continuously by setting that value to infinite.",
+ "animation-iteration-count
property to infinite."
+ ],
+ "challengeSeed": [
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('#ball').css('animation-iteration-count') == 'infinite', 'message: The animation-iteration-count
property should have a value of infinite.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a8367417b2b2512ae4",
+ "title": "Make a CSS Heartbeat using an Infinite Animation Count",
+ "description": [
+ "Here's one more continuous animation example with the animation-iteration-count
property that uses the heart you designed in a previous challenge.",
+ "The one second long heartbeat animation consists of two animated pieces. The heart
elements (including the :before
and :after
pieces) are animated to change size using the transform
property, and the background div
is animated to change its color using the background
property.",
+ "animation-iteration-count
property for both the back
class and the heart
class and setting the value to infinite. The heart:before
and heart:after
selectors do not need any animation properties."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('.heart').css('animation-iteration-count') == 'infinite', 'message: The animation-iteration-count
property for the heart
class should have a value of infinite.');",
+ "assert($('.back').css('animation-iteration-count') == 'infinite', 'message: The animation-iteration-count
property for the back
class should have a value of infinite.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a8367417b2b2512ae5",
+ "title": "Animate Elements at Variable Rates",
+ "description": [
+ "There are a variety of ways to alter the animation rates of similarly animated elements. So far, this has been achieved by applying an animation-iteration-count
property and setting @keyframes
rules.",
+ "To illustrate, the animation on the right consists of two \"stars\" that each decrease in size and opacity at the 20% mark in the @keyframes
rule, which creates the twinkle animation. You can change the @keyframes
rule for one of the elements so the stars twinkle at different rates.",
+ "star-1
by changing its @keyframes
rule to 50%."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert(code.match(/twinkle-1\\s*?{\\s*?50%/g), 'message: The @keyframes
rule for the star-1
class should be 50%.');"
+ ],
+ "solutions": [],
+ "hints": [
+ "Check the animation-name declared in the star-1 class to find the right @keyframes rule to change."
+ ],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a8367417b2b2512ae6",
+ "title": "Animate Multiple Elements at Variable Rates",
+ "description": [
+ "In the previous challenge, you changed the animation rates for two similarly animated elements by altering their @keyframes
rules. You can achieve the same goal by manipulating the animation-duration
of multiple elements.",
+ "In the animation running in the code editor, there are three \"stars\" in the sky that twinkle at the same rate on a continuous loop. To make them twinkle at different rates, you can set the animation-duration
property to different values for each element.",
+ "animation-duration
of the elements with the classes star-1
, star-2
, and star-3
to 1s, 0.9s, and 1.1s, respectively."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('.star-1').css('animation-duration') == '1s', 'message: The animation-duration
property for the star with class star-1
should remain at 1s.');",
+ "assert($('.star-2').css('animation-duration') == '0.9s', 'message: The animation-duration
property for the star with class star-2
should be 0.9s.');",
+ "assert($('.star-3').css('animation-duration') == '1.1s', 'message: The animation-duration
property for the star with class star-3
should be 1.1s.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a8367417b2b2512ae7",
+ "title": "Change Animation Timing with Keywords",
+ "description": [
+ "In CSS animations, the animation-timing-function
property controls how quickly an animated element changes over the duration of the animation. If the animation is a car moving from point A to point B in a given time (your animation-duration
), the animation-timing-function
says how the car accelerates and decelerates over the course of the drive.",
+ "There are a number of predefined keywords available for popular options. For example, the default value is linear
, which applies a constant animation speed throughout. Other options include ease-out
, which is quick in the beginning then slows down, or ease-in
, which is slow in the beginning, then speeds up at the end.",
+ "ball1
and ball2
, add an animation-timing-function
property to each, and set #ball1
to linear
, and #ball2
to ease-out
. Notice the difference between how the elements move during the animation but end together, since they share the same animation-duration
of 2 seconds."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('#ball1').css('animation-timing-function') == 'linear', 'message: The value of the animation-timing-function
property for the element with the id ball1
should be linear.');",
+ "assert($('#ball2').css('animation-timing-function') == 'ease-out', 'message: The value of the animation-timing-function
property for the element with the id ball2
should be ease-out.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a9367417b2b2512ae8",
+ "title": "Learn How Bezier Curves Work",
+ "description": [
+ "The last challenge introduced the animation-timing-function
property and a few keywords that change the speed of an animation over its duration. CSS offers an option other than keywords that provides even finer control over how the animation plays out, through the use of Bezier curves.",
+ "In CSS animations, Bezier curves are used with the cubic-bezier
function. The shape of the curve represents how the animation plays out. The curve lives on a 1 by 1 coordinate system. The X axis of this coordinate system is the duration of the animation (think of it as a time scale), and the Y axis is the change in the animation.",
+ "The cubic-bezier
function consists of four main points that sit on this 1 by 1 grid: p0
, p1
, p2
, and p3
. p0
and p3
are set for you - they are the beginning and end points which are always located respectively at the origin (0, 0) and (1, 1). You set the x and y values for the other two points, and where you place them in the grid dictates the shape of the curve for the animation to follow. This is done in CSS by declaring the x and y values of the p1
and p2
\"anchor\" points in the form: (x1, y1, x2, y2)
. Pulling it all together, here's an example of a Bezier curve in CSS code:",
+ "animation-timing-function: cubic-bezier(0.25, 0.25, 0.75, 0.75);
",
+ "In the example above, the x and y values are equivalent for each point (x1 = 0.25 = y1 and x2 = 0.75 = y2), which if you remember from geometry class, results in a line that extends from the origin to point (1, 1). This animation is a linear change of an element during the length of an animation, and is the same as using the linear
keyword. In other words, it changes at a constant speed.",
+ "ball1
, change the value of the animation-timing-function
property from linear
to its equivalent cubic-bezier
function value. Use the point values given in the example above."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('#ball1').css('animation-timing-function') == 'cubic-bezier(0.25, 0.25, 0.75, 0.75)', 'message: The value of the animation-timing-function
property for the element with the id ball1
should be the linear-equivalent cubic-bezier function.');",
+ "assert($('#ball2').css('animation-timing-function') == 'ease-out', 'message: The value of the animation-timing-function
property for the element with the id ball2
should not change.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a9367417b2b2512ae9",
+ "title": "Use a Bezier Curve to Move a Graphic",
+ "description": [
+ "A previous challenge discussed the ease-out
keyword that describes an animation change that speeds up first and then slows down at the end of the animation. On the right, the difference between the ease-out
keyword (for the blue element) and linear
keyword (for the red element) are demonstrated. Similar animation progressions to the ease-out
keyword can be achieved by using a custom cubic Bezier curve function.",
+ "In general, changing the p1
and p2
anchor points drives the creation of different Bezier curves, which controls how the animation progresses through time. Here's an example of a Bezier curve using values to mimic the ease-out style:",
+ "animation-timing-function: cubic-bezier(0, 0, 0.58, 1);
",
+ "Remember that all cubic-bezier
functions start with p0
at (0, 0) and end with p3
at (1, 1). In this example, the curve moves faster through the Y axis (starts at 0, goes to p1
y value of 0, then goes to p2
y value of 1) than it moves through the X axis (0 to start, then 0 for p1
, up to 0.58 for p2
). As a result, the change in the animated element progresses faster than the time of the animation for that segment. Towards the end of the curve, the relationship between the change in x and y values reverses - the y value moves from 1 to 1 (no change), and the x values move from 0.58 to 1, making the animation changes progress slower compared to the animation duration.",
+ "animation-timing-function
of the element with id of red
to a cubic-bezier
function with x1, y1, x2, y2 values set respectively to 0, 0, 0.58, 1. This will make both elements progress through the animation similarly."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('#red').css('animation-timing-function') == 'cubic-bezier(0, 0, 0.58, 1)', 'message: The value of the animation-timing-function
property of the element with the id red
should be a cubic-bezier
function with x1, y1, x2, y2 values set respectively to 0, 0, 0.58, 1 .');",
+ "assert($('#red').css('animation-timing-function') !== 'linear', 'message: The element with the id red
should no longer have the animation-timing-function
property of linear.');",
+ "assert($('#blue').css('animation-timing-function') == 'ease-out', 'message: The value of the animation-timing-function
property for the element with the id blue
should not change.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ },
+ {
+ "id": "587d78a9367417b2b2512aea",
+ "title": "Make Motion More Natural Using a Bezier Curve",
+ "description": [
+ "This challenge animates an element to replicate the movement of a ball being juggled. Prior challenges covered the linear
and ease-out
cubic Bezier curves, however neither depicts the juggling movement accurately. You need to customize a Bezier curve for this.",
+ "The animation-timing-function
automatically loops at every keyframe when the animation-iteration-count
is set to infinite. Since there is a keyframe rule set in the middle of the animation duration (at 50%
), it results in two identical animation progressions at the upward and downward movement of the ball.",
+ "The following cubic Bezier curve simulates a juggling movement:",
+ "cubic-bezier(0.3, 0.4, 0.5, 1.6);
",
+ "Notice that the value of y2 is larger than 1. Although the cubic Bezier curve is mapped on an 1 by 1 coordinate system, and it can only accept x values from 0 to 1, the y value can be set to numbers larger than one. This results in a bouncing movement that is ideal for simulating the juggling ball.",
+ "animation-timing-function
of the element with the id of green
to a cubic-bezier
function with x1, y1, x2, y2 values set respectively to 0.311, 0.441, 0.444, 1.649."
+ ],
+ "challengeSeed": [
+ "",
+ "",
+ "",
+ ""
+ ],
+ "tests": [
+ "assert($('#green').css('animation-timing-function') == 'cubic-bezier(0.311, 0.441, 0.444, 1.649)', 'message: The value of the animation-timing-function
property for the element with the id green
should be a cubic-bezier
function with x1, y1, x2, y2 values as specified.');"
+ ],
+ "solutions": [],
+ "hints": [],
+ "type": "waypoint",
+ "challengeType": 0,
+ "translations": {
+ "de": {
+ "description": [],
+ "title": ""
+ },
+ "fr": {
+ "description": [],
+ "title": ""
+ },
+ "pt-br": {
+ "description": [],
+ "title": ""
+ },
+ "ru": {
+ "description": [],
+ "title": ""
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/seed/challenges/01-front-end-development-certification/html5-and-css.json b/seed/challenges/01-responsive-web-design/basic-css.json
similarity index 61%
rename from seed/challenges/01-front-end-development-certification/html5-and-css.json
rename to seed/challenges/01-responsive-web-design/basic-css.json
index 6d95ffd7ffee8d..13cc10b90cbf98 100644
--- a/seed/challenges/01-front-end-development-certification/html5-and-css.json
+++ b/seed/challenges/01-responsive-web-design/basic-css.json
@@ -1,460 +1,9 @@
{
- "name": "HTML5 and CSS",
- "order": 2,
+ "name": "Basic HTML and HTML5",
+ "order": 0,
"time": "5 hours",
"helpRoom": "Help",
"challenges": [
- {
- "id": "bd7123c8c441eddfaeb5bdef",
- "title": "Say Hello to HTML Elements",
- "description": [
- "Welcome to Free Code Camp's first coding challenge.",
- "You can edit code
in your text editor
, which we've embedded into this web page.",
- "Do you see the code in your text editor that says <h1>Hello</h1>
? That's an HTML element
.",
- "Most HTML elements have an opening tag
and a closing tag
.",
- "Opening tags look like this:",
- "<h1>
",
- "Closing tags look like this:",
- "</h1>
",
- "Note that the only difference between opening tags and closing tags is that closing tags have a slash after their opening angle bracket.",
- "Each challenge has tests that you can run at any time by clicking the \"Run tests\" button. Once you get all tests passing, you can advance to the next challenge.",
- "To pass the test on this challenge, change your h1
element's text to say \"Hello World\" instead of \"Hello\". Then click the \"Run tests\" button."
- ],
- "challengeSeed": [
- "h1
element should have the text \"Hello World\".",
- "testString": "assert.isTrue((/hello(\\s)+world/gi).test($('h1').text()), 'Your h1
element should have the text \"Hello World\".');"
- }
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "description": [
- "Willkommen bei der ersten Programmier-Challenge von Free Code Camp!",
- "Mithilfe des eingebauten text editor
kannst du den code
bearbeiten.",
- "Siehst du den Code <h1>Hallo</h1>
im Editor? Das ist ein HTML element
",
- "Die meisten HTML Elemente haben einen opening tag
und einen closing tag
.",
- "Öffnende Tags sehen so aus:",
- "<h1>
",
- "Schließende Tags so:",
- "</h1>
",
- "Beachte, dass der einzige Unterschied zwischen öffnenden und schließenden Tags ist, das schließende Tags ein Slash nach der sich öffnenden spitzen Klammer folgt.",
- "Jede Challenge hat Tests die du jederzeit starten kannst indem du den \"Run tests\" Button drückst. Wenn alle Tests bestehen kannst du mit der nächsten Challenge fortfahren.",
- "Um den Test dieser Challenge zu bestehen, ändere den Text deines h1
Elements von \"Hello\" zu \"Hello World\". Klicke dann den \"Run tests\" Button."
- ]
- },
- "fr": {
- "title": "Dites bonjour aux éléments HTML",
- "description": [
- "Bienvenue au premier défi de code de Free Code Camp.",
- "Vous pouvez modifier le code
dans votre éditeur texte
, lequel est disponible dans cette page.",
- "Voyez-vous le code dans l'éditeur texte qui dit <h1>Hello</h1>
? C'est un élément
HTML.",
- "La plupart des éléments HTML ont une balise ouvrante
et une balise fermante
",
- "Les balises ouvrantes ont cette apparence :",
- "<h1>
",
- "Les balises fermantes ont cette apparence :",
- "</h1>
",
- "Notez que la seule différence entre une balise ouvrante et fermante est que la balise fermante a une barre oblique après son chevron ouvrant.",
- "Chaque défi contient des tests que vous pouvez éxécuter en cliquant sur le bouton \"Run tests\". Lorsque tous les tests sont réussis, vous pouvez poursuivre avec le défi suivant.",
- "Pour réussir le test de ce défi, changez le texte de l'élément h1
pour \"Hello World\" plutôt que \"Hello\". Cliquez ensuite sur le bouton \"Run tests\"."
- ]
- },
- "pt-br": {
- "title": "Diga Olá aos Elementos HTML",
- "description": [
- "Seja bem vindo ao primeiro desafio de programação do Free Code Camp!",
- "Você pode editar o seu código
em seu editor de texto
, que embutimos aqui nesta página da web.",
- "Consegue ver o código que diz <h1>Hello</h1>
no seu editor de texto? Esse é um elemento HTML.",
- "A maioria dos elementos HTML tem uma tag de abertura
e uma tag de fechamento
.",
- "As tags de abertura são assim: <h1>
. E as tags de fechamento são assim: </h1>
.",
- "Note que a única diferença entre as tags de abertura e fechamento é que as de fechamento possuem uma barra (/) depois do sinal de abertura (<).",
- "Cada desafio possui testes que você pode executar a qualquer momento ao clicar no botão \"Executar testes\". Quando você conseguir passar em todos os testes, poderá avançar para o próximo desafio.",
- "Para passar nos testes deste desafio, mude o texto do elemento h1
para que diga \"Hello World\" no lugar de \"Hello\". Depois, clique no botão \"Executar testes\"."
- ]
- },
- "ru": {
- "title": "Скажи привет HTML-элементам",
- "description": [
- "Добро пожаловать на первое программное испытание Free Code Camp.",
- "Вы можете редактировать код
в вашем текстовом редакторе
, который мы встроили в эту web-страницу.",
- "Видите этот код в вашем текстовом редакторе: <h1>Hello</h1>
? Это HTML элемент
.",
- "Большинство HTML-элементов имеют открывающую метку
закрывающую метку
.",
- "Открывающие метки выглядят так:",
- "<h1>
",
- "Закрывающие метки выглядят следующим образом:",
- "</h1>
",
- "Обратите внимание, что единственная разница между открывающими и закрывающими метками заключается в наличии косой черты после открывающей треугольной скобки.",
- "Каждое испытание имеет функцию проверки решения, которую вы можете запустить в любой момент нажатием на кнопку \"Run tests\". Как только ваше решение будет удовлетворять всем требованиям, вы сможете перейти к следующему испытанию.",
- "Для прохождения этого испытания измените текст элемента h1
с \"Hello\" на \"Hello World\". Затем нажмите кнопку \"Run tests\"."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf0887a",
- "title": "Headline with the h2 Element",
- "description": [
- "Over the next few challenges, we'll build an HTML5 app that will look something like this:",
- "",
- "The h2
element you enter will create an h2
element on the website.",
- "This element tells the browser about the structure of your website. h1
elements are often used for main headings, while h2
elements are generally used for subheadings. There are also h3
, h4
, h5
and h6
elements to indicate different and new sections.",
- "Add an h2
tag that says \"CatPhotoApp\" to create a second HTML element
below your \"Hello World\" h1
element."
- ],
- "challengeSeed": [
- "h2
element.');",
- "assert(code.match(/<\\/h2>/g) && code.match(/<\\/h2>/g).length === code.match(/h2
element has a closing tag.');",
- "assert.isTrue((/cat(\\s)?photo(\\s)?app/gi).test($(\"h2\").text()), 'message: Your h2
element should have the text \"CatPhotoApp\".');",
- "assert.isTrue((/hello(\\s)+world/gi).test($(\"h1\").text()), 'message: Your h1
element should have the text \"Hello World\".');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "description": [
- "In den nächsten Challenges werden wir eine HTML5 App entwickeln die ungefähr so aussehen wird:",
- "",
- "Das eingetragene h2
Element wird ein h2
Element auf der Website erzeugen.",
- "Dieses Element sagt dem Browser, wie die Struktur deiner Website aufgebaut ist. h1
Elemente werden oft für Hauptüberschriften verwendet, während h2
Elemente üblicherweise für Zwischenüberschriften verwendet werden. Es gibt auch h3
, h4
, h5
und h6
Elemente die verschiedene und neue Bereiche kennzeichnen.",
- "Füge unter h1
\"Hello World\" ein zweites HTML Element h2
hinzu, in dem \"CatPhotoApp\" steht."
- ]
- },
- "fr": {
- "title": "Un titre avec l'élément h2",
- "description": [
- "Pour les quelques prochains défis, nous construirons une application HTML5 qui ressemblera à ceci :",
- "",
- "L'élément h2
que vous entrerez créera un élément h2
sur le site.",
- "Cet élément renseigne votre navigateur sur la structure de votre site. Les éléments h1
sont souvent utilisés comme titre, tandis que les éléments h2
sont généralement utilisés comme sous-titres. Il existe également les éléments h3
, h4
, h5
et h6
qui indiquent une nouvelle et différente section.",
- "Ajoutez une balise h2
contenant \"CatPhotoApp\" pour créer un second élément
HTML sous l'élément h1
contenant \"Hello World\"."
- ]
- },
- "pt-br": {
- "title": "Cabeçalho com o Elemento h2",
- "description": [
- "Durante os próximos desafios, construiremos um aplicativo em HTML que se parecerá como este:",
- "",
- "O elemento h2
que você criar gerará um elemento h2
na página da web.",
- "Este elemento indica ao navegador a forma de mostrar o texto que contém.",
- "Os elementos h2
são ligeiramente menores que os elementos h1
. Há também os elementos h3
, h4
, h5
e h6
.",
- "Adicione uma tag h2
que diga \"CatPhotoApp\" para criar um segundo elemento
HTML abaixo de seu elemento h1
chamado \"Hello World\"."
- ]
- },
- "ru": {
- "title": "Заголовок с применением элемента h2",
- "description": [
- "В результате прохождения нескольких следующих испытаний, мы построим HTML5 приложение, которое будет похоже на это:",
- "",
- "Вводимый вами элемент h2
создаст соответствующий элемент h2
на web-странице.",
- "Этот элемент сообщает браузеру о структуре вашего web-сайта. Элементы h1
часто применяют в качестве главных заголовков, в то время как элементы h2
обычно используют для обозначения позаголовков. Также существуют элементы h3
, h4
, h5
и h6
для обозначения отдельных секций.",
- "Добавьте метку h2
с текстом \"CatPhotoApp\" для создания второго HTML элемента
под вашим элементом h1
с текстом \"Hello World\"."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08801",
- "title": "Inform with the Paragraph Element",
- "description": [
- "p
elements are the preferred element for normal-sized paragraph text on websites. P is short for \"paragraph\".",
- "You can create a p
element like this:",
- "<p>I'm a p tag!</p>
",
- "Create a p
element below your h2
element, and give it the text \"Hello Paragraph\"."
- ],
- "challengeSeed": [
- "p
element.');",
- "assert.isTrue((/hello(\\s)+paragraph/gi).test($(\"p\").text()), 'message: Your p
element should have the text \"Hello Paragraph\".');",
- "assert(code.match(/<\\/p>/g) && code.match(/<\\/p>/g).length === code.match(/p element has a closing tag.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "description": [
- "p
Elemente sind das bevorzugte Element für normale Paragraphentexte auf einer Website. P ist die Abkürzung für \"Paragraph\".",
- "Du kannst ein p
Element so erzeugen:",
- "<p>Ich bin ein p Element!</p>
",
- "Erstelle ein p
Element unter deinem h2
Element und füge den Text \"Hello Paragraph\" ein."
- ]
- },
- "fr": {
- "title": "Informez avec l'élément paragraphe",
- "description": [
- "L'élément p
est le préféré pour les textes de paragraphes de taille normale. P est l'acronyme de \"paragraphe\",",
- "Vous pouvez créer un élément p
comme ceci :",
- "<p>Je suis une balise p!</p>
",
- "Créez un élément p
sous votre élément h2
et inscrivez-y le texte \"Hello Paragraph\"."
- ]
- },
- "pt-br": {
- "title": "Informe com o Elemento Parágrafo",
- "description": [
- "Os elementos p
são os preferenciais para criar parágrafos de texto com tamanho normal nas páginas da web. P significa a abreviatura de \"parágrafo\".",
- "Você pode criar um elemento p
assim:",
- "<p>Sou uma tag p!</p>
",
- "Crie um elemento p
abaixo de seu elemento h2
, e dê a ele o texto \"Hello Paragraph\"."
- ]
- },
- "ru": {
- "title": "Проинформируйте с применением элемента p",
- "description": [
- "Элементы p
предпочтительно использовать для обозначения параграфов с текстом нормального размера в web-сайтах. P - сокращение от \"paragraph\".",
- "Вы можете создать элемент p
следующим образом:",
- "<p>Я метка p!</p>
",
- "Создайте элемент p
под вашим элементом h2
и присвойте ему текст \"Hello Paragraph\"."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08802",
- "title": "Uncomment HTML",
- "description": [
- "Commenting is a way that you can leave comments within your code without affecting the code itself.",
- "Commenting is also a convenient way to make code inactive without having to delete it entirely.",
- "You can start a comment with <!--
and end a comment with -->
",
- "Uncomment your h1
, h2
and p
elements."
- ],
- "challengeSeed": [
- ""
- ],
- "tests": [
- "assert($(\"h1\").length > 0, 'message: Make your h1
element visible on your page by uncommenting it.');",
- "assert($(\"h2\").length > 0, 'message: Make your h2
element visible on your page by uncommenting it.');",
- "assert($(\"p\").length > 0, 'message: Make your p
element visible on your page by uncommenting it.');",
- "assert(!/[^fc]-->/gi.test(code.replace(/ *"
- ],
- "tests": [
- "assert(($(\"h1\").length === 0), 'message: Comment out your h1
element so that it is not visible on your page.');",
- "assert(($(\"h2\").length > 0), 'message: Leave your h2
element uncommented so that it is visible on your page.');",
- "assert(($(\"p\").length === 0), 'message: Comment out your p
element so that it is not visible on your page.');",
- "assert(code.match(/[^fc]-->/g).length > 1, 'message: Be sure to close each of your comments with -->
.');",
- "assert((code.match(/<([a-z0-9]){1,2}>/g)[0]===\"
\") , 'message: Do not change the order of the h1
h2
or p
in the code.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "description": [
- "Denk daran, dass du einen Kommentar mit <!--
anfangen und mit -->
wieder beenden werden.",
- "Hier wirst du deinen Kommentar vor dem h2
Element beenden müssen.",
- "Kommentiere die h1
und p
Elemente aus, aber lasse dein h2
Element unkommentiert."
- ]
- },
- "fr": {
- "title": "Commentez du HTML",
- "description": [
- "Souvenez-vous que pour débuter un commentaire, vous devez utiliser <!--
et que pour le terminer, vous devez utiliser -->
.",
- "Ici vous devrez terminer le commentaire juste avant que l'élément h2
commence.",
- "Commentez les éléments h1
et p
, mais laissez l'élément h2
tel quel."
- ]
- },
- "pt-br": {
- "title": "Comente o HTML",
- "description": [
- "Lembre-se que para iniciar um comentário você precisa utilizar <!--
, e para terminar um comentário é necessário usar -->
.",
- "Aqui, você deverá terminar o comentário antes que seu elemento h2
inicie.",
- "Comente o elemento h1
e o elemento p
, e deixe o elemento h2
sem nenhum comentário."
- ]
- },
- "ru": {
- "title": "Закомментируйте HTML",
- "description": [
- "Помните, что для начала комментария вам необходимо использовать <!--
, а для завершения комментария - -->
",
- "Тут вам необходимо завершить комментарий до начала вашего элемента h2
.",
- "Закомментируйте ваши элементы h1
и p
, но оставьте ваш элемент h2
раскомментированным."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08833",
- "title": "Fill in the Blank with Placeholder Text",
- "description": [
- "Web developers traditionally use lorem ipsum text
as placeholder text. The 'lorem ipsum' text is randomly scraped from a famous passage by Cicero of Ancient Rome.",
- "Lorem ipsum text has been used as placeholder text by typesetters since the 16th century, and this tradition continues on the web.",
- "Well, 5 centuries is long enough. Since we're building a CatPhotoApp, let's use something called kitty ipsum text
.",
- "Replace the text inside your p
element with the first few words of this kitty ipsum text: Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
"
- ],
- "challengeSeed": [
- "
Hello Paragraph
" - ], - "tests": [ - "assert.isTrue((/Kitty(\\s)+ipsum/gi).test($(\"p\").text()), 'message: Yourp
element should contain the first few words of the provided kitty ipsum text
.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "description": [
- "Webentwickler nutzen für gewöhnlich \"Lorem Ipsum Text\" als Platzhalter. Es heißt \"Lorem Ipsum\", weil es die ersten zwei Wörter aus einer bekannten Passage von Cicero des alten Roms sind.",
- "\"Lorem Ipsum\" Text wurde seit dem 16. Jahrhundert von Schriftsetzern als Platzhalter verwendet. Und diese Tradition setzt sich im Web fort.",
- "Nun gut, fünf Jahrhunderte sind lange genug. Da wir eine CatPhotoApp entwickeln, lass uns stattdessen lieber kitty ipsum text
nutzen.",
- "Ersetze den Text in deinem p
Element mit den ersten Wörtern des \"Kitty Ipsum\" Textes: Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
"
- ]
- },
- "fr": {
- "title": "Remplissez les blancs avec du faux-texte",
- "description": [
- "Les développeurs Web utilisent traditionnellement du lorem ipsum
comme texte de substitution. Le texte lorem ipsum provient d'un extrait de Cicero, de la Rome antique.",
- "Le texte lorem ipsum a été utilisé comme faux-texte par des typographes depuis le 16ème siècle et cette tradition se poursuit sur le Web.",
- "Enfin, 5 siècles est suffisament long. Étant donné que nous fabriquons une application de photos de chats, utilisons plutôt du texte Kitty ipsum
.",
- "Remplacez le texte à l'intérieur des éléments p
avec ces quelques mots du texte Kitty ipsum : Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
"
- ]
- },
- "pt-br": {
- "title": "Preencha Espaços com Texto de Espaço Reservado",
- "description": [
- "Desenvolvedores web tradicionalmente usam Lorem Ipsum
como texto de preenchimento. Lorem Ipsum é chamado assim pois essas são as duas primeiras palavras de uma passagem famosa de Cícero da Roma Antiga.",
- "O texto Lorem Ipsum tem sido utilizado como texto de espaço reservado por compositores desde o século 16, e esta tradição continua na web.",
- "Bem, 5 séculos é um tempo longo o bastante. Já que estamos desenvolvendo um aplicativo sobre fotos de gatos (CatPhotoApp), vamos usar algo chamado Kitty Ipsum
.",
- "Substitua o texto dentro do seu elemento p
pelas primeiras palavras deste texto Kitty Ipsum: Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
"
- ]
- },
- "ru": {
- "title": "Заполните пустоты замещающим текстом",
- "description": [
- "Традиционно web-разработчики используют текст lorem ipsum
в качестве замещающего текста. Он называется тектсом lorem ipsum
по первым двум словам известного пассажа Цицерона из Древнего Рима.",
- "Текст lorem ipsum
применяется в качестве замещающего текста наборщиками с 16-го века, и эта традиция продолжается в сети.",
- "5 веков довольно долгий период. Так как мы строим приложение CatPhotoApp, давайте используем нечто называемое текстом kitty ipsum
.",
- "Замените текст внутри вашего элемента p
первыми двумя словами текста kitty ipsum
: Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
"
- ]
- }
- }
- },
- {
- "id": "bad87fed1348bd9aedf08833",
- "title": "Delete HTML Elements",
- "description": [
- "Our phone doesn't have much vertical space.",
- "Let's remove the unnecessary elements so we can start building our CatPhotoApp.",
- "Delete your h1
element so we can simplify our view."
- ],
- "challengeSeed": [
- "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
" - ], - "tests": [ - "assert(($(\"h1\").length == 0), 'message: Delete yourh1
element.');",
- "assert(($(\"h2\").length > 0), 'message: Leave your h2
element on the page.');",
- "assert(($(\"p\").length > 0), 'message: Leave your p
element on the page.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "description": [
- "Unser Smartphone hat nicht sehr viel vertikalen Platz.",
- "Lass uns die unwichtigen Elemente entfernen, damit wir unsere CatPhotoApp entwickeln können.",
- "Lösche die Elemente h1
, damit wir etwas Ordnung schaffen."
- ]
- },
- "fr": {
- "title": "Supprimer des éléments HTML",
- "description": [
- "Notre téléphone n'a pas beaucoup d'espace vertical.",
- "Enlevons les éléments superflus pour débuter la construction de notre application de photos de chats.",
- "Supprimez l'élément h1
afin de simplifier l'affichage."
- ]
- },
- "pt-br": {
- "title": "Apague Elementos HTML",
- "description": [
- "Nosso celular não possui muito espaço vertical.",
- "Vamos eliminar os elementos desnecessários para começar a construir nosso CatPhotoApp.",
- "Apague o elemento h1
para simplificar o nosso espaço."
- ]
- },
- "ru": {
- "title": "Удалите HTML-элементы",
- "description": [
- "Наш телефон не очень большой по-вертикали.",
- "Давайте удалим некоторые ненужные элементы, чтобы мы могли приступить к созданию приложения CatPhotoApp.",
- "Удалите ваш h1
элемент, чтобы упростить общий вид."
- ]
- }
- }
- },
{
"id": "bad87fee1348bd9aedf08803",
"title": "Change the Color of Text",
@@ -1081,1604 +630,26 @@
]
},
"ru": {
- "title": "Укажите порядок деградации шрифтов",
- "description": [
- "Существует несколько стандартных шрифтов, которые доступны во всех браузерах. Среди них Monospace
, Serif
и Sans-Serif
",
- "Когда один шрифт недоступен, вы можете сообщить браузеру \"деградировать\" до другого шрифта.",
- "Например, если бы вы хотели, чтобы элемент использовал шрифт Helvetica
, но также деградировал до шрифта Sans-Serif
, когда Helvetica
недоступен, вы могли бы использовать этот CSS-стиль:",
- "p {", - "Теперь закомментируйте ваш запрос к Google Fonts, таким образом шрифт
font-family: Helvetica, Sans-Serif;
}
Lobster
становится недоступен. Обратите внимание как происходит деградация до шрифта Monospace
."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08812",
- "title": "Add Images to your Website",
- "description": [
- "You can add images to your website by using the img
element, and point to a specific image's URL using the src
attribute.",
- "An example of this would be:",
- "<img src=\"https://www.your-image-source.com/your-image.jpg\">
",
- "All img
elements must have an alt
attribute. The text inside an alt
attribute is used for screen readers to improve accessibility and is displayed if the image fails to load.",
- "Let's add an alt
attribute to our img
example above:",
- "<img src=\"https://www.your-image-source.com/your-image.jpg\" alt=\"Author standing on a beach with two thumbs up.\">
",
- "Note that in most cases, img
elements are self-closing.",
- "Try it with this image:",
- "https://bit.ly/fcc-relaxing-cat
"
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
", - "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
" - ], - "tests": [ - "assert($(\"img\").length > 0, 'message: Your page should have an image element.');", - "assert(new RegExp(\"\\/\\/bit.ly\\/fcc-relaxing-cat|\\/\\/s3.amazonaws.com\\/freecodecamp\\/relaxing-cat.jpg\", \"gi\").test($(\"img\").attr(\"src\")), 'message: Your image should have asrc
attribute that points to the kitten image.');",
- "assert(code.match(/alt\\s*?=\\s*?(\\\"|\\').*(\\\"|\\')/), 'message: Your image element must have an alt
attribute.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "description": [
- "Du kannst img
Elemente verwenden, um Bilder in deine Website einzubauen. Um zur URL des Bildes zu verweisen, benutzt du das src
Attribut.",
- "Ein Beispiel dafür wäre:",
- "<img src=\"https://www.deine-bild-quelle.com/dein-bild.jpg\">
",
- "Beachte dass in den meisten Fällen img Elemente selbstschließend sind.",
- "Versuche es mit diesem Bild:",
- "https://bit.ly/fcc-relaxing-cat
"
- ]
- },
- "fr": {
- "title": "Ajouter des images à votre site Web",
- "description": [
- "Vous pouvez ajouter des images à votre site Web en utilisant l'élément img
et pointer vers une URL d'image spécifique en utilisant l'attribut src
.",
- "Un exemple de cette procédure serait :",
- "<img src=\"https://www.your-image-source.com/your-image.jpg\">
",
- "Note that in most cases, img
elements are self-closing.",
- "Prenez note que dans la plupart des cas, les éléments img
sont auto-fermants.",
- "Essayez avec cette image :",
- "https://bit.ly/fcc-relaxing-cat
"
- ]
- },
- "pt-br": {
- "title": "Adicione Imagens em sua Página Web",
- "description": [
- "Você pode adicionar imagens à sua página da internet com o uso do elemento img
, e apontar para a URL específica de uma imagem utilizando o atributo src
.",
- "Um exemplo para isso seria:",
- "<img src=\"https://www.your-image-source.com/your-image.jpg\">
",
- "Observe que na maior parte dos casos, os elementos img
são de fechamento automático.",
- "Agora, tente fazer isso com essa imagem:",
- "https://bit.ly/fcc-relaxing-cat
"
- ]
- },
- "ru": {
- "title": "Добавьте изображения к вашему сайту",
- "description": [
- "Вы можете добавлять изображения к вашему сайту с помощью элемента img
и указывать ссылки определённых изображений с помощтю атрибута src
.",
- "Примером добавления мзображения может служить:",
- "<img src=\"https://www.your-image-source.com/your-image.jpg\">
",
- "Обратите внимание, что в большинстве случаев элементы img
являются самозакрывающимися.",
- "Попробуйте добавить изображение используя следующую ссылку:",
- "https://bit.ly/fcc-relaxing-cat
"
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9acdf08812",
- "title": "Size your Images",
- "description": [
- "CSS has a property called width
that controls an element's width. Just like with fonts, we'll use px
(pixels) to specify the image's width.",
- "For example, if we wanted to create a CSS class called larger-image
that gave HTML elements a width of 500 pixels, we'd use:",
- "<style>
.larger-image {
width: 500px;
}
</style>
",
- "Create a class called smaller-image
and use it to resize the image so that it's only 100 pixels wide.",
- "Note
Due to browser implementation differences, you may need to be at 100% zoom to pass the tests on this challenge."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "CatPhotoApp
",
- "",
- "",
- "",
- "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
",
- "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
"
- ],
- "tests": [
- "assert($(\"img[src='https://bit.ly/fcc-relaxing-cat']\").attr('class') === \"smaller-image\", 'message: Your img
element should have the class smaller-image
.');",
- "assert($(\"img\").width() === 100, 'message: Your image should be 100 pixels wide. Browser zoom should be at 100%.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "description": [
- "Die Breite eines Elements wird mit dem CSS Attribut width
kontrolliert. Wie bei Schriftarten verwenden wir Pixel px
um die Größe zu definieren.",
- "Wenn wir also die CSS Klasse larger-image
erstellen wollen, um HTML Elementen eine Breite von 500 Pixeln zu verleihen, verwenden wir:",
- "<style>
.larger-image {
width: 500px;
}
</style>
",
- "Erstelle eine Klasse mit dem Namen smaller-image
und verwende sie, um dein Bild auf 100 Pixel zu skalieren.",
- "Notiz
Aufgrund verschiedener Brower Implementierungen, könnte es sein dass du auf 100% Zoom sein musst um die Tests zu bestehen."
- ]
- },
- "fr": {
- "title": "Redimensionner vos images",
- "description": [
- "Le CSS a une propriété nommé width
qui contrôle la largeur d'un élément. Comme pour les polices, nous utiliserons px
(pixels) pour déterminer la largeur d'une image.",
- "Par exemple, si nous voulons créer une classe CSS nommée larger-image
qui donnne aux éléments une largeur de 500 pixels, nous utilisons :",
- "<style>
.larger-image {
width: 500px;
}
</style>
",
- "Créez une classe nommée smaller-image
et utilisez la pour redimensionner l'image pour qu'elle ai 100 pixels de large.",
- "Prenez note
Dû aux différences entre les navigateurs Web, votre niveau de zoom devrait être à 100% pour passer les tests de ce défi."
- ]
- },
- "pt-br": {
- "title": "Dê um Tamanho para suas Imagens",
- "description": [
- "O CSS possui uma propriedade chamada width
, que controla a largura de um elemento. Da mesma forma que com as fontes, vamos utilizar px
(pixels) como medida para especificar a largura de nossa imagem.",
- "Por exemplo, se queremos criar uma classe CSS chamada larger-image
que dê aos elementos HTML uma largura de 500px, vamos usar:",
- "<estilo>
",
- " .larger-image{
",
- " width: 500px;
",
- " }
",
- "</style>
",
- "Crie uma classe chamada smaller-image
e a utilize para mudar o tamanho da imagem para que ela tenha apenas 100 pixels de largura."
- ]
- },
- "ru": {
- "title": "Установите размер ваших изображений",
- "description": [
- "В CSS есть свойтсво, называемое width
, которе управляет шириной элемента. По аналогии со шрифтами, мы используем px
(пиксели) для указания ширины изображения.",
- "Например, если бы мы хотели создать CSS-класс larger-image
, который присваивал бы HTML-эементам ширину равную 500 пикселей, мы бы использовали:",
- "<style>
.larger-image {
width: 500px;
}
</style>
",
- "Создайте класс smaller-image
и используйте его для изменения размера изображений до 100 пикселей в ширину.",
- "Внимание
По причине разницы в реализации браузеров, вам может понадобиться установить 100% масштаб окна браузера для прохождения этого испытания."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9bedf08813",
- "title": "Add Borders Around your Elements",
- "description": [
- "CSS borders have properties like style
, color
and width
",
- "For example, if we wanted to create a red, 5 pixel border around an HTML element, we could use this class:",
- "<style>
.thin-red-border {
border-color: red;
border-width: 5px;
border-style: solid;
}
</style>
",
- "Create a class called thick-green-border
that puts a 10-pixel-wide green border with a style of solid
around an HTML element, and apply that class to your cat photo.",
- "Remember that you can apply multiple classes to an element by separating each class with a space within its class
attribute. For example:",
- "<img class=\"class1 class2\">
"
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "CatPhotoApp
",
- "",
- "",
- "",
- "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
",
- "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
"
- ],
- "tests": [
- "assert($(\"img\").hasClass(\"smaller-image\"), 'message: Your img
element should have the class smaller-image
.');",
- "assert($(\"img\").hasClass(\"thick-green-border\"), 'message: Your img
element should have the class thick-green-border
.');",
- "assert($(\"img\").hasClass(\"thick-green-border\") && parseInt($(\"img\").css(\"border-top-width\"), 10) >= 8 && parseInt($(\"img\").css(\"border-top-width\"), 10) <= 12, 'message: Give your image a border width of 10px
.');",
- "assert($(\"img\").css(\"border-right-style\") === \"solid\", 'message: Give your image a border style of solid
.');",
- "assert($(\"img\").css(\"border-left-color\") === \"rgb(0, 128, 0)\", 'message: The border around your img
element should be green.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "description": [
- "CSS Rahmen haben Attribute wie style
, color
und width
",
- "Wenn wir nun einen roten, 5 Pixel dicken Rahmen um ein HTML Element setzen wollen, könnten wir diese Klasse verwenden:",
- "<style>
.thin-red-border {
border-color: red;
border-width: 5px;
border-style: solid;
}
</style>
",
- "Erstelle die Klasse thick-green-border
, welche einen 10 Pixel dicken, grünen Rahmen mit dem Style solid
um ein HTML Element setzt. Füge diese Klasse deinem Katzenfoto hinzu.",
- "Vergiss nicht, dass du einem Element mehrere Klassen geben kannst indem du jede Klasse mit einem Leerzeichen im class
Attribut trennst. Zum Beispiel:",
- "<img class=\"class1 class2\">
"
- ]
- },
- "fr": {
- "title": "Ajouter des bordures autour de vos éléments",
- "description": [
- "Les bordures CSS ont des propriétés comme style
, color
et width
",
- "Par exemple, si nous voulons créer une bordure de 5 pixel rouge autour d'un élément HTML, nous pouvons utiliser cette classe :",
- "<style>
.thin-red-border {
border-color: red;
border-width: 5px;
border-style: solid;
}
</style>
",
- "Créer une classe nommée thick-green-border
qui ajoute une bordure verte de 10 pixel avec un style solid
autour d'un élément HTML. Appliquez ensuite cette classe sur votre photo de chat.",
- "Souvenez-vous que vous pouvez appliquer plus d'une classe sur un élément en les séparant par un espace, le tout dans l'attribut class
de l'élément. Par exemple :",
- "<img class=\"class1 class2\">
"
- ]
- },
- "pt-br": {
- "title": "Adicione Bordas ao Redor de seus Elementos",
- "description": [
- "As bordas em CSS possuem propriedades como style
, color
e width
",
- "Por exemplo, se queremos criar uma borda com tamanho de 5 pixels de cor vermelha ao redor de um elemento HTML, podemos utilizar esta classe:",
- "<style>
",
- " .thin-red-border {
",
- " border-color: red;
",
- " border-width: 5px;
",
- " border-style: solid;
",
- " }
",
- "</style>
",
- "Crie uma classe chamada thick-green-border
que insira uma borda verde de 10 pixels de largura com um estilo solid
ao redor de um elemento HTML, e então adicione essa classe em sua foto com o gato.",
- "Lembre que você pode aplicar diversas classes a um elemento separando cada uma das classes com um espaço, dentro do atributo class
. Por exemplo:",
- "<img class=\"clase1 clase2\">
"
- ]
- },
- "ru": {
- "title": "Дбавьте границы вокруг ваших элементов",
- "description": [
- "CSS-границы имеют свойства: style
, color
и width
",
- "Например, если бы мы хотели создать красную границу шириной в 5 пикселей вокруг HTML-элемента, мы могли бы использовать этот класс:",
- "<style>
.thin-red-border {
border-color: red;
border-width: 5px;
border-style: solid;
}
</style>
",
- "Создайте класс thick-green-border
, который добавляет зелёную границу шириной в 10 пикселей со стилем solid
вокруг HTML-элемента и примените этот класс к вашему фото кота.",
- "Помните, что вы можете может применить множество классов к одному элементу путём разделения их с помощью пробела внутри атрибута class
. Например:",
- "<img class=\"class1 class2\">
"
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08814",
- "title": "Add Rounded Corners with a Border Radius",
- "description": [
- "Your cat photo currently has sharp corners. We can round out those corners with a CSS property called border-radius
.",
- "You can specify a border-radius
with pixels. Give your cat photo a border-radius
of 10px
.",
- "Note: this waypoint allows for multiple possible solutions. For example, you may add border-radius
to either the .thick-green-border
class or .smaller-image
class."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "CatPhotoApp
",
- "",
- "",
- "",
- "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
",
- "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
"
- ],
- "tests": [
- "assert($(\"img\").hasClass(\"thick-green-border\"), 'message: Your image element should have the class \"thick-green-border\".');",
- "assert(parseInt($(\"img\").css(\"border-top-left-radius\")) > 8, 'message: Your image should have a border radius of 10px
');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Füge abgerundete Ecken mit Border Radius hinzu",
- "description": [
- "Dein Katzenfoto hat momentan spitze Ecken. Wir können diese Ecken mit dem CSS Attribut border-radius
abrunden.",
- "Du kannst einen border-radius
mit Pixeln deklarieren. Gib deinem Katzenfoto einen border-radius
von 10px
.",
- "Beachte dass es für diese Challenge verschiedene mögliche Lösungsansätze gibt. Zum Beispiel könntest du einen border-radius
zu der .thick-green-border
oder .smaller-image
Klasse hinzufügen."
- ]
- },
- "es": {
- "title": "Agrega esquinas redondeadas usando Border Radius",
- "description": [
- "Tu foto del gato tiene actualmente esquinas angulares. Podemos redondear esas esquinas con una propiedad CSS llamada border-radius
.",
- "Puedes especificar border-radius
usando pixeles. Dale a tu foto del gato un border-radius
de 10px
.",
- "Nota: este desafío acepta múltiples soluciones. Por ejemplo, puedes agregar border-radius
ya sea a la clase .thick-green-border
o a la clase .smaller-image
."
- ]
- },
- "pt-br": {
- "title": "Insira Bordas Arredondadas com o Border Radius",
- "description": [
- "Sua foto com o gato possui cantos pontiagudos. Podemos arredondar os cantos com uma propriedade CSS chamado border-radius
.",
- "Você pode especificar um border-radius
com pixels. Adicione um border-radius
de 10px
para a sua foto.",
- "Nota: Este desafio permite várias soluções possíveis. Por exemplo, você pode adicionar o border-radius
tanto para a classe .thick-green-border
como para a classe .smaller-image
."
- ]
- },
- "ru": {
- "title": "Добавьте скруглённые углы с помощью радиуса границы",
- "description": [
- "У вашего фото кота сейчас острые углы. Мы можем скруглить углы используя CSS-свойство border-radius
.",
- "Вы можете указать значения border-radius
в пикселях. Присвойте вашему фото кота свойство border-radius
со значением 10px
.",
- "Внимание: это задание подразумевает наличие нескольких возможных решений. Например, вы можете добавить border-radius
как к классу .thick-green-border
, так и к классу .smaller-image
."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08815",
- "title": "Make Circular Images with a Border Radius",
- "description": [
- "In addition to pixels, you can also specify a border-radius
using a percentage.",
- "Give your cat photo a border-radius
of 50%
."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "CatPhotoApp
",
- "",
- "",
- "",
- "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
",
- "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
"
- ],
- "tests": [
- "assert(parseInt($(\"img\").css(\"border-top-left-radius\")) > 48, 'message: Your image should have a border radius of 50%
, making it perfectly circular.');",
- "assert(code.match(/50%/g), 'message: Be sure to use a percentage value of 50%
.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Erstelle runde Bilder mit einem Border Radius",
- "description": [
- "Du kannst einem border-radius
neben Pixeln auch Prozentwerte zuweisen.",
- "Gib deinem Katzenfoto einen border-radius
von 50%
."
- ]
- },
- "es": {
- "title": "Crea imágenes circulares usando Border Radius",
- "description": [
- "Además de pixeles, puedes especificar un border-radius
usando porcentajes.",
- "Dale a tu foto del gato un border-radius
de 50%
."
- ]
- },
- "pt-br": {
- "title": "Deixe as Imagens Circulares com o Border Radius",
- "description": [
- "Assim como pixels, você também pode usar o border-radius
com porcentagens.",
- "Dê para a sua foto de gato um border-radius
de 50%
."
- ]
- },
- "ru": {
- "title": "Сделайте круглые изображения с помощью радиуса границы",
- "description": [
- "В дополнение к пикселям, вы также может использовать проценты для указания значения свойства border-radius
.",
- "Присвойте вашему фото кота свойство border-radius
со значением 50%
."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08816",
- "title": "Link to External Pages with Anchor Elements",
- "description": [
- "a
elements, also known as anchor
elements, are used to link to content outside of the current page.",
- "Here's a diagram of an a
element. In this case, the a
element is used in the middle of a paragraph element, which means the link will appear in the middle of a sentence.",
- "",
- "Here's an example:",
- "<p>Here's a <a href=\"http://freecodecamp.com\"> link to Free Code Camp</a> for you to follow.</p>
",
- "Create an a
element that links to http://freecatphotoapp.com
and has \"cat photos\" as its anchor text
."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "CatPhotoApp
",
- "",
- "",
- "",
- "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
",
- "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
"
- ],
- "tests": [
- "assert((/cat photos/gi).test($(\"a\").text()), 'message: Your a
element should have the anchor text
of \"cat photos\".');",
- "assert(/http:\\/\\/(www\\.)?freecatphotoapp\\.com/gi.test($(\"a\").attr(\"href\")), 'message: You need an a
element that links to http://freecatphotoapp.com
');",
- "assert(code.match(/<\\/a>/g) && code.match(/<\\/a>/g).length === code.match(/a
element has a closing tag.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Verlinke externe Seiten mit Anker Elementen",
- "description": [
- "a
Elemente, auch bekannt als anchor
(Anker) Elemente, werden verwendet um auf Inhalte außerhalb der aktuellen Seite zu verlinken.",
- "So sieht ein a
Element aus. In diesem Fall wird es innerhalb eines Paragraphen Elements verwendet. Das bedeutet dein Link wird innerhalb des Satzes erscheinen.",
- "",
- "Hier ist ein Beispiel:",
- "<p>Hier ist ein <a href=\"http://freecodecamp.com\"> Link zu Free Code Camp</a> dem du folgen kannst.</p>
",
- "Erstelle ein a
Element, das auf http://freecatphotoapp.com
verlinkt und den \"cat photos\" als anchor text
(Link-Text) beinhaltet."
- ]
- },
- "es": {
- "title": "Enlaza páginas externas con elementos ancla",
- "description": [
- "Los elementos a
, también conocidos como elementos ancla
, se utilizan para enlazar a contenido fuera de la página actual.",
- "Aquí está un diagrama de un elemento a
. En este caso, el elemento a
se utiliza en el medio de un elemento de párrafo, lo que significa que el enlace aparecerá en el medio de una frase. ",
- " ",
- "He aquí un ejemplo:",
- "<p>Aquí está un <a href=\"https://freecodecamp.com\"> enlace a Free Code Camp</a> para que lo sigas.</p>
",
- "Crea un elemento a
que se vincule a http://freecatphotoapp.com
y tenga como texto de ancla
\"fotos de gatos\"."
- ]
- },
- "pt-br": {
- "title": "Ligue Páginas Externas com o Elemento Âncora",
- "description": [
- "Os elementos a
, também conhecidos como elementos âncora
, são utilizados para ligar conteúdo fora da página atual.",
- "Aqui está um diagrama de um elemento a
. Neste caso, o elemento a
é utilizado no meio de um elemento de parágrafo, o que significa que o link externo aparecerá no meio de uma frase.",
- " ",
- "Veja um exemplo:",
- "<p>Aqui está um <a href=\"https://freecodecamp.com\"> link ligado ao Free Code Camp</a> para que você o siga.</p>
",
- "Crie um elemento a
que esteja ligado ao site http://freecatphotoapp.com
e tenha como texto de âncora
\"fotos de gatos\"."
- ]
- },
- "ru": {
- "title": "Присоедините внешние страницы с помощью якорных элементов",
- "description": [
- "Элементы a
, также известные как якорные
элементы, применяют для связи с содержимым вне текущей страницы.",
- "Вот диаграмма элемента a
. В этом случае, элемент a
использован в середине элемента параграфа, что значит, что ссылка появится в середине предложения.",
- "",
- "Вот пример:",
- "<p>Вот <a href=\"http://freecodecamp.com\"> ссылка на Free Code Camp</a> для перехода на ресурс.</p>
",
- "Создайте элемент a
, который присоединяет http://freecatphotoapp.com
и имеет значение \"cat photos\" в качестве текста якоря
."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aede08817",
- "title": "Nest an Anchor Element within a Paragraph",
- "description": [
- "Again, here's a diagram of an a
element for your reference:",
- "",
- "Here's an example:",
- "<p>Here's a <a href=\"https://freecodecamp.com\"> link to Free Code Camp</a> for you to follow.</p>
",
- "Nesting
just means putting one element inside of another element.",
- "Now nest your existing a
element within a new p
element (just after the existing h2
element) so that the surrounding paragraph says \"View more cat photos\", but where only \"cat photos\" is a link, and the rest of the text is plain text."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "CatPhotoApp
",
- "",
- "cat photos",
- "",
- "",
- "",
- "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
",
- "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
"
- ],
- "tests": [
- "assert(($(\"a[href=\\\"http://freecatphotoapp.com\\\"]\").length > 0 || $(\"a[href=\\\"http://www.freecatphotoapp.com\\\"]\").length > 0), 'message: You need an a
element that links to \"http://freecatphotoapp.com\".');",
- "assert($(\"a\").text().match(/cat\\sphotos/gi), 'message: Your a
element should have the anchor text of \"cat photos\"');",
- "assert($(\"p\") && $(\"p\").length > 2, 'message: Create a new p
element around your a
element.');",
- "assert(($(\"a[href=\\\"http://freecatphotoapp.com\\\"]\").parent().is(\"p\") || $(\"a[href=\\\"http://www.freecatphotoapp.com\\\"]\").parent().is(\"p\")), 'message: Your a
element should be nested within your new p
element.');",
- "assert(($(\"a[href=\\\"http://freecatphotoapp.com\\\"]\").parent().text().match(/View\\smore\\s/gi) || $(\"a[href=\\\"http://www.freecatphotoapp.com\\\"]\").parent().text().match(/View\\smore\\s/gi)), 'message: Your p
element should have the text \"View more \" (with a space after it).');",
- "assert(!$(\"a\").text().match(/View\\smore/gi), 'message: Your a
element should not have the text \"View more\".');",
- "assert(code.match(/<\\/p>/g) && code.match(//g).length === code.match(/
p
elements has a closing tag.');",
- "assert(code.match(/<\\/a>/g) && code.match(//g).length === code.match(/a elements has a closing tag.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Umschließe ein Anker Element mit einem Paragraphen",
- "description": [
- "Hier ist nochmal ein Beispiel für ein a
Element:",
- "",
- "Hier ist ein Beispiel:",
- "<p>Hier ist ein <a href=\"https://freecodecamp.com\"> Link zu Free Code Camp</a> dem du folgen kannst.</p>
",
- "Nesting
bedeuted ein Element innerhalb eines anderen Elements zu schreiben",
- "Jetzt umschließe dein a
Element mit einem neuen p
Element (direkt nach dem bereits existierenden h2
Element) indem steht \"View more cat photos\", wo allerdings nur \"cat photos\" ein Link ist und der Rest normaler Text."
- ]
- },
- "es": {
- "title": "Anida un elemento de ancla dentro de un párrafo",
- "description": [
- "Una vez más, aquí está un diagrama de un elemento a
para tu referencia:",
- "",
- "He aquí un ejemplo:",
- "<p>Aquí hay un <a href=\"https://freecodecamp.com\"> enlace a Free Code Camp</a> para que lo sigas.</p>
",
- "Anidamiento
simplemente significa poner un elemento dentro de otro elemento.",
- "Ahora anida el elemento a
existente dentro de un nuevo elemento p
(justo después del elemento h2
que ya tienes) de tal forma que el párrafo que lo rodee diga \"View more cat photos\", pero que sólo \"cat photos\" sea un enlace, y el resto sea texto plano ."
- ]
- },
- "pt-br": {
- "title": "Aninhe o Elemento Âncora no Interior de um Parágrafo",
- "description": [
- "Outra vez, aqui está um diagrama de um elemento a
para você usar como referência.",
- "",
- "Veja um exemplo:",
- "<p>Este é um <a href=\"https://freecodecamp.com\"> link ligado ao Free Code Camp</a> para que você o siga.</p>
",
- "Aninhamento
significa ter um elemento no interior de outro elemento.",
- "Agora, aninhe o elemento a
existente dentro de um novo elemento p
de forma que o parágrafo diga \"View more cat photos\", mas onde apenas \"cat photos\" seja um link, e o resto seja texto comum."
- ]
- },
- "ru": {
- "title": "Создайте вложенный якорный элемент внутри параграфа",
- "description": [
- "Вот диаграмма элемента a
:",
- "",
- "Вот пример:",
- "<p>Вот <a href=\"https://freecodecamp.com\"> ссылка на Free Code Camp</a> для перехода на ресурс.</p>
",
- "Вложенность
значит установку одного элемента внутрь друго элемента.",
- "Теперь вложите ваш существующий элемент a
внутрь нового элемента p
(сразу после существующего элемента h2
) таким образом, что добавляемый параграф сообщает: \"View more cat photos\", но где только \"cat photos\" является ссылкой, а остальной текст обычный."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08817",
- "title": "Make Dead Links using the Hash Symbol",
- "description": [
- "Sometimes you want to add a
elements to your website before you know where they will link.",
- "This is also handy when you're changing the behavior of a link using jQuery
, which we'll learn about later.",
- "The current value of the href
attribute is a link that points to \"http://freecatphotoapp.com\". Replace the href
attribute value with a #
, also known as a hash symbol, to create a dead link."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "Click here to view more cat photos.
", - "", - "", - "", - "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
", - "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
" - ], - "tests": [ - "assert($(\"a\").attr(\"href\") === \"#\", 'message: Youra
element should be a dead link with the value of the href
attribute set to \"#\".');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Erstelle tote Links mit dem Hash Symbol",
- "description": [
- "Manchmal wirst du a
Elemente zu deiner Website hinzufügen möchten, ohne dass du das Ziel des Links kennst.",
- "Das ist auch nützlich, wenn du die Funktion eines Links mit jQuery
verändern willst. Das werden wir später noch behandeln.",
- "Ersetze den Inhalt des href
Attributs deines a
Elements mit einem #
, auch bekannt als Hash Symbol, um einen toten Link zu erzeugen."
- ]
- },
- "es": {
- "title": "Haz vínculos muertos utilizando el símbolo de numero",
- "description": [
- "A veces quieres agregar elementos a
a tu sitio web antes de saber qué enlazarán.",
- "Esto también es útil cuando estás cambiando el comportamiento de un enlace usando jQuery
, lo cual aprenderemos más adelante.",
- "Reemplaza el atributo href
de tu elemento a
con un #
, también conocido como un símbolo de número o de hash, para convertirlo en un vínculo muerto."
- ]
- },
- "pt-br": {
- "title": "Crie Links Inativos com o Símbolo Cerquilha",
- "description": [
- "As vezes você pode querer adicionar elementos a
em sua página web antes de saber o link que as ligará.",
- "Isso também é útil quando você desejar mudar o comportamento de um link utilizando jQuery
, o que vamos aprender mais adiante.",
- "Substitua o atributo href
de seu elemento a
por um #
, também conhecido como símbolo de hash ou hashtag. Isso o transformará em um link inativo."
- ]
- },
- "ru": {
- "title": "Создайте мёртвые ссылки используя хэш-символ",
- "description": [
- "Иногда вам нужно добавить элементы a
к вашему сайту до того, как вы знаете куда будут вести ссылки.",
- "Также это может оказаться полезно, когда вы меняете поведение ссылки используя jQuery
, что мы изучим позже.",
- "Замените значение атрибута href
вашего элемента a
на #
, известное как хэш-символ, для превращения элемента в мёртвую ссылку."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08820",
- "title": "Turn an Image into a Link",
- "description": [
- "You can make elements into links by nesting them within an a
element.",
- "Nest your image within an a
element. Here's an example:",
- "<a href=\"#\"><img src=\"https://bit.ly/fcc-running-cats\" alt=\"Three kittens running towards the camera.\"></a>
",
- "Remember to use #
as your a
element's href
property in order to turn it into a dead link.",
- "Place the existing image element within an anchor element.",
- "Once you've done this, hover over your image with your cursor. Your cursor's normal pointer should become the link clicking pointer. The photo is now a link."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "Click here for cat photos.
", - "", - "", - "", - "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
", - "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
" - ], - "tests": [ - "assert($(\"a\").children(\"img.smaller-image\").length > 0, 'message: Nest the existingimg
element within an a
element.');",
- "assert(new RegExp(\"#\").test($(\"a\").children(\"img\").parent().attr(\"href\")), 'message: Your a
element should be a dead link with a href
attribute set to #
.');",
- "assert(code.match(/<\\/a>/g) && code.match(//g).length === code.match(/a elements has a closing tag.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Verlinke ein Bild",
- "description": [
- "Du kannst jedes Element in einen Link verwandeln, indem du es mit einem a
Element umschließt.",
- "Umschließe dein Bild mit einem a
Element. Hier ist ein Beispiel:",
- "<a href=\"#\"><img src=\"https://bit.ly/fcc-running-cats\"></a>
",
- "Vergewissere dich, dass du ein #
innerhalb des href
Attributs des a
Elements nutzt, um daraus einen toten Link zu machen.",
- "Sobald du das gemacht hast, kannst du mit der Maus über dein Bild fahren. Der normale Mauszeiger sollte nun zu einer Hand für Links werden. Das Bild ist jetzt ein Link."
- ]
- },
- "es": {
- "title": "Convierte una imagen en un vínculo",
- "description": [
- "Puedes convertir elementos en enlaces al anidarlos dentro de un elemento a
.",
- "Anida tu imagen dentro de un elemento a
. He aquí un ejemplo: ",
- "<a href=\"#\"><img src=\"https://bit.ly/fcc-running-cats\"/></a>
",
- "Recuerda usar #
como atributo href
de tu elemento a
con el fin de convertirlo en un vínculo muerto.",
- "Una vez hayas hecho esto, coloca el cursor sobre tu imagen. El puntero normal de tu cursor debería convertirse en el puntero de enlace. La foto es ahora un vínculo ."
- ]
- },
- "pt-br": {
- "title": "Transforme uma Imagem em um Link",
- "description": [
- "Você pode transformar elementos em links ao aninhá-los com um elemento a
.",
- "Aninhe sua imagem dentro de um elemento a
. Temos aqui um exemplo.",
- "<a href=\"#\"><img src=\"https://bit.ly/fcc-running-cats\"/></a>
",
- "Lembre de usar #
como atributo href
de seu elemento a
para tornar o link inativo."
- ]
- },
- "ru": {
- "title": "Превратите изображение в ссылку",
- "description": [
- "Вы можете превратить элементы в ссылки путём их вложения внутрь элементов a
.",
- "Вложите ваше изображение в элемент a
. Вот пример:",
- "<a href=\"#\"><img src=\"https://bit.ly/fcc-running-cats\"></a>
",
- "Не забывайте использовать #
в качестве значения атрибута href
вашего элемента a
для превращения ссылки в мёртвую.",
- "Как только вы это сделаете, наведите курсор мыши на ваше изображение. При этом курсор должен изменить вид с обычного на используемый при наведении на ссылки. Ваше фото теперь является ссылкой."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08827",
- "title": "Create a Bulleted Unordered List",
- "description": [
- "HTML has a special element for creating unordered lists
, or bullet point-style lists.",
- "Unordered lists start with a <ul>
element. Then they contain some number of <li>
elements.",
- "For example: ",
- "<ul>", - "would create a bullet point-style list of \"milk\" and \"cheese\".", - "Remove the last two
<li>milk</li>
<li>cheese</li>
</ul>
p
elements and create an unordered list of three things that cats love at the bottom of the page."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "Click here for cat photos.
", - "", - "", - "", - "Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.
", - "Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.
" - ], - "tests": [ - "assert($(\"ul\").length > 0, 'message: Create aul
element.');",
- "assert($(\"ul li\").length > 2, 'message: You should have three li
elements within your ul
element.');",
- "assert(code.match(/<\\/ul>/gi) && code.match(/li
elements have closing tags.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Erstelle eine ungeordnete Liste",
- "description": [
- "HTML hat ein spezielles Element zum Erstellen von unordered lists
(ungeordneten Listen).",
- "Ungeordnete Listen starten mit einem <ul>
Element. Dann beinhalten sie eine gewisse Anzahl an <li>
Elementen.",
- "Zum Beispiel:",
- "<ul>", - "würde eine ungeordnete Liste für \"Milch\" und \"Käse\" erstellen.", - "Entferne die letzten zwei
<li>Milch</li>
<li>Käse</li>
</ul>
p
Elemente und erstelle eine ungeordnete Liste von drei Dingen die Katzen lieben am Ende der Seite"
- ]
- },
- "es": {
- "title": "Crea una lista no ordenada con viñetas",
- "description": [
- "HTML tiene un elemento especial para la creación de listas no ordenadas
, o listas con estilo viñeta.",
- "Las listas no ordenadas comienzan con un elemento <ul>
. A continuación contienen una cantidad de elementos <li>.
",
- "Por ejemplo: ",
- "<ul>", - "creará una lista con viñetas y con elementos \"leche\" y \"queso\".", - "Elimina los dos últimos elementos
<li>leche</li>
<li>queso</li>
</ul>
p
y en la parte inferior de la página crea una lista no ordenada de tres cosas que los gatos aman."
- ]
- },
- "pt-br": {
- "title": "Crie uma Lista Não Ordenada com Marcadores",
- "description": [
- "O HTML possui um elemento especial para a criação de listas não ordenadas
, ou listas com marcadores.",
- "As listas não ordenadas iniciam com um elemento <ul>
. Logo após, possuem uma série de elementos <li>.
",
- "Por exemplo:",
- "<ul>
",
- " <li>leite</li>
",
- " <li>queijo</li>
",
- "</ul>
",
- "Isso criará uma lista com marcadores que tem como elementos \"leite\" e \"queijo\".",
- "Apague os dois últimos elementos p
e no final da página crie uma lista não ordenada com três coisas que os gatos adoram."
- ]
- },
- "ru": {
- "title": "Создайте ненумерованный неупорядоченный список",
- "description": [
- "В HTML есть специальный элемент для создания неупорядоченного списка
, или списка с точками в виде меток элементов.",
- "Неупорядоченные списки начинаются с элемента <ul>
. Затем они содержат некоторе количество элементов <li>
.",
- "Например: ",
- "<ul>", - "создаст ненумерованный список из \"milk\" и \"cheese\".", - "Удалите последние два элемента
<li>milk</li>
<li>cheese</li>
</ul>
p
и создайте неупорядоченный список из трёх вещей, которые любят кошки."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08828",
- "title": "Create an Ordered List",
- "description": [
- "HTML has a special element for creating ordered lists
, or numbered-style lists.",
- "Ordered lists start with a <ol>
element. Then they contain some number of <li>
elements.",
- "For example:",
- "<ol>", - "would create a numbered list of \"Garfield\" and \"Sylvester\".", - "Create an ordered list of the top 3 things cats hate the most." - ], - "challengeSeed": [ - "", - "", - "", - "
<li>Garfield</li>
<li>Sylvester</li>
</ol>
Click here for cat photos.
", - "", - "", - "", - "Things cats love:
", - "Top 3 things cats hate:
" - ], - "tests": [ - "assert((/Top 3 things cats hate:/i).test($(\"ol\").prev().text()), 'message: You should have an ordered list for \"Top 3 things cats hate:\"');", - "assert((/Things cats love:/i).test($(\"ul\").prev().text()), 'message: You should have an unordered list for \"Things cats love:\"');", - "assert.equal($(\"ul li\").length, 3, 'message: You should have threeli
elements within your ul
element.');",
- "assert.equal($(\"ol li\").length, 3, 'message: You should have three li
elements within your ol
element.');",
- "assert(code.match(/<\\/ul>/g) && code.match(/<\\/ul>/g).length === code.match(/ul
element has a closing tag.');",
- "assert(code.match(/<\\/ol>/g) && code.match(/<\\/ol>/g).length === code.match(/ol
element has a closing tag.');",
- "assert(code.match(/<\\/li>/g) && code.match(/li
element has a closing tag.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Erstelle eine geordnete Liste",
- "description": [
- "HTML beinhaltet ein spezielles Element für ordered lists
(geordnete Listen).",
- "Geordnete Listen starten mit einem <ol>
Element. Dann enthalten sie eine gewisse Anzahl an <li>
Elementen.",
- "Zum Beispiel:",
- "<ol>", - "würde eine nummerierte Liste mit \"Garfield\" und \"Sylvester\" erstellen.", - "Erstelle eine geordnete Liste von den drei Dingen, die Katzen am meisten hassen." - ] - }, - "es": { - "title": "Crear una lista ordenada", - "description": [ - "HTML tiene un elemento especial para la creación de
<li>Garfield</li>
<li>Sylvester</li>
</ol>
listas ordenadas
, o listas de estilo numerado.",
- "Las listas ordenadas comienzan con un elemento <ol>
. Luego contienen un número de elementos <li>.
",
- "Por ejemplo:",
- "<ol>", - "creará una lista numerada con \"Garfield\" y \"Sylvester\".", - "Crea una lista ordenada de los 3 cosas que más odian los gatos." - ] - }, - "pt-br": { - "title": "Crie uma Lista Ordenada", - "description": [ - "O HTML possui um elemento especial para a criação de
<li>Garfield</li>
<li>Sylvester</li>
</ol>
listas ordenadas
, ou listas numeradas.",
- "As listas ordenadas iniciam com um elemento <ol>
. Logo após, contém uma série de elementos <li>.
",
- "Por exemplo:",
- "<ol>
",
- " <li>Garfield</li>
",
- " <li>Sylvester</li>
",
- "</ol>
",
- "Isso criará uma lista numerada com \"Garfield\" e \"Sylvester\".",
- "Crie uma lista ordenada com as três coisas que os gatos mais odeiam."
- ]
- },
- "ru": {
- "title": "Создайте упорядоченный список",
- "description": [
- "В HTML есть специальный элемент для создания упорядоченных списков
, или списков с номерами в качестве меток элементов.",
- "Упорядоченные списки начинаются с элемента <ol>
. Далее они содержат некоторое количество элементов <li>
.",
- "Например:",
- "<ol>", - "создаст нумерованный список из \"Garfield\" и \"Sylvester\".", - "Создайте нумерованный список из 3-х вещей, который кошки больше всего ненавидят." - ] - } - } - }, - { - "id": "bad87fee1348bd9aedf08829", - "title": "Create a Text Field", - "description": [ - "Now let's create a web form.", - "Text inputs are a convenient way to get input from your user.", - "You can create one like this:", - "
<li>Garfield</li>
<li>Sylvester</li>
</ol>
<input type=\"text\">
",
- "Note that input
elements are self-closing.",
- "Create an input
element of type text
below your lists."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "Click here for cat photos.
", - "", - "", - "", - "Things cats love:
", - "Top 3 things cats hate:
", - "input
element of type text
.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Erstelle ein Textfeld",
- "description": [
- "Nun erstellen wir ein Web Formular.",
- "Eingabefelder sind eine bewährte Möglichkeit um Daten von Usern zu erhalten.",
- "So kannst du eines erstellen:",
- "<input type=\"text\">
",
- "Beachte, dass input
Elemente selbstschließend sind.",
- "Erstelle ein input
Element des Typ (\"type\") text
unter deinen Listen."
- ]
- },
- "es": {
- "title": "Crea un campo de texto",
- "description": [
- "Ahora vamos a crear un formulario web.",
- "Los campos de texto son una manera conveniente de obtener retroalimentación de tu usuario.",
- "Puedes crear uno como este:",
- "<input type=\"text\">
",
- "Ten en cuenta que los elementos input
son de cierre automático.",
- "Crea un elemento input
de tipo text
debajo de tus listas."
- ]
- },
- "pt-br": {
- "title": "Crie um Campo de Texto",
- "description": [
- "Agora vamos criar um formulário web.",
- "Os campos de texto são uma forma conveniente de obter uma resposta do usuário.",
- "Você pode criar um assim:",
- "<input type=\"text\">
",
- "Note que os elementos input
são de fechamento automático.",
- "Crie um elemento input
de tipo text
abaixo de suas listas."
- ]
- },
- "ru": {
- "title": "Создайте текстовое поле",
- "description": [
- "Теперь давайте создадим web-форму.",
- "Поля текстового ввода - удобный способ получения данных от пользователя.",
- "Вы можете создать текстовое поле следующим образом:",
- "<input type=\"text\">
",
- "Обратите внимание, что элементы input
самозакрывающиеся.",
- "Создайте элемент input
типа text
под вашими списками."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aedf08830",
- "title": "Add Placeholder Text to a Text Field",
- "description": [
- "Your placeholder text is what appears in your text input
before your user has input anything.",
- "You can create placeholder text like so:",
- "<input type=\"text\" placeholder=\"this is placeholder text\">
",
- "Set the placeholder
value of your text input
to \"cat photo URL\"."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "Click here for cat photos.
", - "", - "", - "", - "Things cats love:
", - "Top 3 things cats hate:
", - "placeholder
attribute to the existing text input
element.');",
- "assert($(\"input\") && $(\"input\").attr(\"placeholder\") && $(\"input\").attr(\"placeholder\").match(/cat\\s+photo\\s+URL/gi), 'message: Set the value of your placeholder attribute to \"cat photo URL\".');",
- "assert($(\"input[type=text]\").length > 0 && code.match(/\\s]+))?)+\\s*|\\s*)\\/?>/gi), 'message: The finished input
element should have valid syntax.');"
- ],
- "type": "waypoint",
- "challengeType": 0,
- "translations": {
- "de": {
- "title": "Füge Platzhalter zu einem Textfeld hinzu",
- "description": [
- "Platzhaltertexte erscheinen in deinen input
Feldern, bevor der Nutzer etwas eingibt.",
- "Du kannst Platzhalter auf folgende Weise erstellen:",
- "<input type=\"text\" placeholder=\"Das ist ein Platzhalter.\">
",
- "Setze bei deinem input
Element den Wert für placeholder
auf \"cat photo URL\"."
- ]
- },
- "es": {
- "title": "Agrega un texto de relleno a un campo de texto",
- "description": [
- "El texto de relleno es el que aparece en un campo de texto antes de que un usuario haya ingresado datos.",
- "Puedes crear un texto de relleno de esta manera:",
- "<input type=\"text\" placeholder=\"este es un texto de relleno\">
",
- "Establece el valor del texto de relleno
de tu campo de texto como \"cat photo URL\"."
- ]
- },
- "pt-br": {
- "title": "Adicione Texto Indicativo a um Campo de Texto",
- "description": [
- "O texto indicativo é o que aparece em um campo de texto antes que um usuário tenha escrito algo.",
- "Você pode criar um texto indicativo assim:",
- "<input type=\"text\" placeholder=\"isso é um texto indicativo\">
",
- "Estabeleça o valor do texto indicativo
do seu campo de texto como \"cat photo URL\"."
- ]
- },
- "ru": {
- "title": "Добавьте замещающий текст к текстовому полю",
- "description": [
- "Ваш замещающий текст - это то, что отображается в виде текста внутри input
пока пользователь не ввёл туда что-либо.",
- "Вы можете создать замещающий текст следующим образом:",
- "<input type=\"text\" placeholder=\"это замещающий текст\">
",
- "Установите значение атрибута placeholder
вашего текстового поля input
равными \"cat photo URL\"."
- ]
- }
- }
- },
- {
- "id": "bad87fee1348bd9aede08830",
- "title": "Create a Form Element",
- "description": [
- "You can build web forms that actually submit data to a server using nothing more than pure HTML. You can do this by specifying an action on your form
element.",
- "For example:",
- "<form action=\"/url-where-you-want-to-submit-form-data\"></form>
",
- "Nest your text field in a form
element. Add the action=\"/submit-cat-photo\"
attribute to this form element."
- ],
- "challengeSeed": [
- "",
- "",
- "",
- "Click here for cat photos.
", - "", - "", - "", - "Things cats love:
", - "Top 3 things cats hate:
", - "form
element.');",
- "assert($(\"form\").attr(\"action\") === \"/submit-cat-photo\", 'message: Make sure your form
has an action
attribute which is set to /submit-cat-photo
');",
- "assert(code.match(/<\\/form>/g) && code.match(/"
- ],
- "tests": [
- "assert($(\"form\").children(\"button\").length > 0, 'message: Your form should have a button inside it.');",
- "assert($(\"button\").attr(\"type\") === \"submit\", 'message: Your submit button should have the attribute type
set to submit
.');",
- "assert($(\"button\").text().match(/^\\s*submit\\s*$/gi), 'message: Your submit button should only have the text \"Submit\".');",
- "assert(code.match(/<\\/button>/g) && code.match(/