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\".
Note: If you already have a CodePen account, you can skip this step by clicking \"Open link in new tab\", closing the new tab that opens, then clicking \"go to my next step\". We removed our \"skip step\" button because many people would just click it repeatedly without doing these important steps.
", - "https://codepen.io/signup/free" - ], - [ - "//i.imgur.com/U4y9RJ1.gif", - "A gif showing that you can type \"hello world\" will output \"hello world\" in the preview window. You can also drag windows to resize them, and change their orientation.", - "In the HTML box, create an 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.
To disable automatic preview updating click the \"Settings\" button at the top of the page, then click the \"Behavior\" tab. At the bottom of the page, un-check \"AUTO UPDATE PREVIEW\". Now press \"Run\" at the top of the page to update the preview, and click \"Save\".
", - "" - ] - ], - "challengeSeed": [], - "tests": [], - "type": "Waypoint", - "isRequired": false, - "challengeType": 7, - "translations": { - "es": { - "title": "Prepárate para los Proyectos de Desarrollo de Interfaces", - "description": [ - [ - "//i.imgur.com/OAD6SJz.png", - "Una imagen del juego Simón, uno de nuestros proyectos de interfaz.", - "Nuestros proyectos de desarrollo de interfaces te darán oportunidad de aplicar las habilidades con interfaces que has desarrollado hasta este momento. Usaremos un editor de código basado en el navegador llamado CodePen.", - "" - ], - [ - "//i.imgur.com/WBetuBa.jpg", - "Un programador frustado golpeando la pantalla de su computador.", - "Nuestros desafíos sobre algoritmos son difíciles. Algunos pueden requerir muchas horas para resolverse. Podrás frustarte, pero no te rindas. Se vuelve fácil con práctica.", - "" - ], - [ - "//i.imgur.com/p2TpOQd.jpg", - "Un tierno perro que salta sobre un obstáculo, pica el ojo y te apunta con su pata.", - "Cuando te atasques, usa la metodología Leer-Buscar-Preguntar. No te preocupes - lo tienes resuelto.", - "" - ], - [ - "//i.imgur.com/G1saeDt.gif", - "Un gif que muestra cómo crear una cuenta en Codepen.", - "Para nuestros desafíos de interfaces, usaremos un editor de código basado en el navegador que es muy famoso llamado Codepen. Pulsa en el botón de abajo \"Open link in new tab\" para abrir la página de registro de CodePen. Rellena el formulario y pulsa \"Sign up\".
Nota: Si ya tienes una cuenta de CodePen, puedes omitir este paso pulsando \"Open link in new tab\", cierra la nueva pestaña que se abre, entonces pulsa \"go to my next step\". Eliminamos nuestro botón \"skip step\" porque mucha gente solamente pulsa el botón sin realizar estos importantes pasos.
", - "https://codepen.io/signup/free" - ], - [ - "//i.imgur.com/U4y9RJ1.gif", - "Un gif que muestra que puedes escribir \"hello world\" en el editor, lo cual escribirá \"hello world\" en la ventana de vista previa. También puedes mover las ventanas para cambiar su tamaño, y cambiar su orientación.", - "En la ventana de HTML, crea un elemento h1 con el texto \"Hola mundo\". Puedes arrastrar los bordes de las ventanas para cambiar su tamaño. También puedes pulsar el botón de \"Change View\" para cambiar la orientación de las ventanas.", - "" - ], - [ - "//i.imgur.com/G9KFQDL.gif", - "Un gif que muestra el proceso de agregar Bootstrap a tu proyecto.", - "Pulsa el engrane en la esquina superior izquierda de la ventana de CSS, luego ve hacia abajo hasta donde dice \"Quick add\" y elige Bootstrap. Ahora dale a tu elemento h1 la clase \"text-primary\" para cambiar su color y verificar que Bootstrap está activado.", - "" - ] - ] - }, - "pt-br": { - "title": "Prepare-se para nossos Projetos de Desenvolvimento Front End", - "description": [ - [ - "//i.imgur.com/OAD6SJz.png", - "A imagem de um jogo Simon, um de nossos projetos front end.", - "Nossos projetos de Desenvolvimento front end vão dar a você a chance de aplicar as habilidades front end que você desenvolveu até esse ponto. Nós vamos usar um editor popular chamado CodePen que funciona direto no navegador.", - "" - ], - [ - "//i.imgur.com/WBetuBa.jpg", - "Um programador atravessando a tela de seu laptop com um soco em frustração.", - "Esses projetos são difíceis. A maioria dos campistas leva alguns dias para contruir cada projeto. Você vai ficar frustrado. Mas não desista. Isso fica mais fácil com a prática.", - "" - ], - [ - "//i.imgur.com/p2TpOQd.jpg", - "Um cachorro fofo pulando sobre um obstáculo, piscando e apontando sua pata a você.", - "Quando ficar travado, use a metodologia Ler-Buscar-Perguntar. Não se preocupe - você consegue.", - "" - ], - [ - "//i.imgur.com/G1saeDt.gif", - "Um gif mostrando com criar uma conta CodePen.", - "Para nossos projetos front end, usaremos um popular editor de código baseado em navegador chamado CodePen. Clique no botão \"Open link in new tab\" abaixo para abrir a página de resgistro do CodePen. Preencha o formulário e clique em \"Sign up\".
Nota: Se você já tem uma conta CodePen, você pode pular esse passo clicando em \"Open link in new tab\", fechando a nova aba que abrir, e clicando em \"go to my next step\". Nós removemos nosso botão \"skip step\" pois muitas pessoas iam simplesmente clicar nele repetidamente sem passar por esses passos importantes.
", - "https://codepen.io/signup/free" - ], - [ - "//i.imgur.com/U4y9RJ1.gif", - "Um gif mostrando que você pode digitar \"hello world\" e será mostrado \"hello world\" na janela de visualização. Você também pode arrastar janelas para redimensioná-las e mudar a orientação das mesmas.", - "Na caixa do HTML, crie um elemento 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.
Para desativar o update automático da janela de visualização clique no botão \"Settings\" no topo da página, então clique na aba \"Behavior\". No final da página, desmarque \"AUTO UPDATE PREVIEW\". Agora clique em \"Run\" no topo da página para atualizar a janela de visualização e clique \"Save\".
", - "" - ] - ] - }, - "ru": { - "title": "Приготовьтесь к разработке фронтенд проектов", - "description": [ - [ - "//i.imgur.com/OAD6SJz.png", - "Игра Саймона - один из фронтенд проектов.", - "Наши фронтенд проекты дадут вам шанс применить полученные к этому моменту знания по фронтенд разработке. Мы будем использовать популярный браузерный редактор кода - CodePen.", - "" - ], - [ - "//i.imgur.com/WBetuBa.jpg", - "Программист от отчаяния кулаком пробивает экран своего ноутбука.", - "Это трудные проекты. Разработка каждого занимает у большинства кэмперов несколько дней. У вас может возникнуть чувство отчаяния. Несмотря на это не сдавайтесь. С практикой этот процесс станет проще.", - "" - ], - [ - "//i.imgur.com/p2TpOQd.jpg", - "Милый пес, прыгающий через препятствие, указывает на вас лапой и подмигивает.", - "Если что-то не получается, воспользуйтесь Read-Search-Ask. Не волнуйтесь - вы сможете это сделать.", - "" - ], - [ - "//i.imgur.com/G1saeDt.gif", - "Гифка показывающая как зарегистрироваться на CodePen.", - "Для заданий по фронтенд разработке, мы будем использовать популярный браузерный редактор кода под названием CodePen. Откройте страницу регистрации на сайте CodePen, нажав на расположенную чуть ниже кнопку \"Open link in new tab\". Заполните форму и нажмите \"Sign up\".
Замечание: Если у вас уже есть аккаунт CodePen, то этот шаг можно пропустить: нажмите на кнопку \"Open link in new tab\", закройте появившуюся вкладку и затем кликните \"go to my next step\". Мы убрали кнопку \"skip step\", ввиду того что большинство людей просто нажимали бы ее несколько раз подряд и пропускали бы эти важные инструкции.
", - "https://codepen.io/signup/free" - ], - [ - "//i.imgur.com/U4y9RJ1.gif", - "Гифка показывающая набор в редакторе заголовка с текстом \"hello world\", который затем отображается в окошке предпросмотра. А также указывающая как изменить размер окон редактора или поменять их расположение.", - "В окошке HTML создайте элемент h1 с текстом \"Hello World\". Ухватив края окон можно изменить их размер. А нажав на кнопку \"Change View\" поменять их расположение.", - "" - ], - [ - "//i.imgur.com/G9KFQDL.gif", - "Гифка показывающая как в CodePen добавить к проекту Bootstrap.", - "Нажмите на звездочку в левом верхнем углу окошка CSS, найдите внизу поле \"Quick add\" и выберите в нем Bootstrap. Добавьте к элементу h1 класс \"text-primary\", чтобы изменить его цвет и удостовериться, что Bootstrap подключен.", - "" - ] - ] - } - } - }, - { - "id": "bd7158d8c442eddfaeb5bd18", - "title": "Build a Tribute Page", - "description": [ - "Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/freeCodeCamp/full/NNvBQW/.", - "Fulfill the following user stories. Use whichever libraries you need. Give it your own personal style.", - "User Story: I can view a tribute page with an image and text.", - "User Story: I can click on a link that will take me to an external website with further information on the topic.", - "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." - ], - "releasedOn": "January 1, 2016", - "challengeSeed": [ - "qqrnzmqCGDw" - ], - "tests": [], - "type": "zipline", - "isRequired": true, - "challengeType": 3, - "translations": { - "es": { - "title": "Construye una página Tributo", - "description": [ - "Objetivo: Crea una aplicación con CodePen.io que funcionalmente sea similar a esta: https://codepen.io/freeCodeCamp/full/NNvBQW/", - "Regla #1: No veas el código del proyecto de ejemplo. Encuentra la forma de hacerlo por tu cuenta.", - "Regla #2: Satisface las siguientes historias de usuario. Usa cualquier librería que necesites. Dale tu estilo personal.", - "Historia de usuario: Puedo ver una página tributo con una imagen y texto.", - "Historia de usuario: Puedo pulsar en un enlace que me llevará a un sitio web externo con mayor información sobre el tema.", - "Recuerda utilizar Leer-Buscar-Preguntar si te sientes atascado.", - "Cuando hayas terminado, pulsa el botón \"I've completed this challenge\" e incluye un link 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 Página Tributo", - "description": [ - "Objetivo: Construa uma aplicação em CodePen.io cuja funcionalidade seja similar a esta: https://codepen.io/freeCodeCamp/full/NNvBQW/.", - "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 ver uma página tributo com uma imagem e um texto.", - "História de usuário: Eu posso clicar em um link que vai me levar a um site externo com mais informações sobre o tópico.", - "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." - ] - }, - "ru": { - "title": "Создайте страницу посвященную тому что вас вдохновляет", - "description": [ - "Задание: Создайте приложение CodePen.io которое функционально соответствует вот этому: https://codepen.io/freeCodeCamp/full/NNvBQW/.", - "Правило #1: Не подсматривайте код приведенного на CodePen примера. Напишите его самостоятельно.", - "Правило #2: Реализуйте следующие пользовательские истории. Используйте любые библиотеки, которые потребуются. Оформите приложение в вашем собственном стиле.", - "Пользовательская история: Я могу видеть на странице изображение и текст.", - "Пользовательская история: Я могу нажать на ссылку, которая ведет на внешнюю страницу с дополнительной информацией по теме.", - "Если что-то не получается, воспользуйтесь Read-Search-Ask.", - "Когда выполните задание кликните кнопку \"I've completed this challenge\" и добавьте ссылку на ваш CodePen.", - "Вы можете получить отзыв о вашем проекте от коллег, поделившись ссылкой на него в нашем чате для рассмотрения кода. Также вы можете поделиться ею через Twitter и на странице Free Code Camp вашего города на Facebook." - ] - } - } - }, - { - "id": "bd7158d8c242eddfaeb5bd13", - "title": "Build a Personal Portfolio Webpage", - "description": [ - "Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/freeCodeCamp/full/YqLyXB/.", - "Fulfill the following user stories. Use whichever libraries you need. Give it your own personal style.", - "User Story: I can access all of the portfolio webpage's content just by scrolling.", - "User Story: I can click different buttons that will take me to the portfolio creator's different social media pages.", - "User Story: I can see thumbnail images of different projects the portfolio creator has built (if you haven't built any websites before, use placeholders.)", - "User Story: I can navigate to different sections of the webpage by clicking buttons in the navigation.", - "Don't worry if you don't have anything to showcase on your portfolio yet - you will build several apps on the next few CodePen challenges, and can come back and update your portfolio later.", - "There are many great portfolio templates out there already. However, you should consider building your portfolio page as much as you can from the ground up. Using Bootstrap can help make this process much easier for you.", - "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": [ - "V72o34gY4Lw" - ], - "tests": [], - "type": "zipline", - "isRequired": true, - "challengeType": 3, - "translations": { - "es": { - "title": "Construye una página web para tu portafolio", - "description": [ - "Objetivo: Crea una aplicación con CodePen.io cuya funcionalidad sea similar a la de esta: https://codepen.io/freeCodeCamp/full/QNmvEL/.", - "Regla #1: No veas el código del proyecto de ejemplo. Encuentra la forma de hacerlo por tu cuenta.", - "Regla #2: Satisface las siguientes historias de usuario. Usa cualquier librería que necesites. Dale tu estilo personal.", - "Historia de usuario: Puedo acceder a todo el contenido de la página del portafolio con sólo desplazarme en la ventana.", - "Historia de usuario: Puedo pulsar diferentes botones que me llevarán a las páginas de las diferentes cuentas de redes sociales del creador del portafolio.", - "Historia de usuario: Puedo ver una imagenes en miniatura de los diferentes proyectos que el creador del portafolio ha construido (si no has construido ningún sitio web antes, usa marcadores de posición.)", - "Historia de usuario: Puedo navegar a las diferentes secciones de la página web pulsando botones de navegación.", - "No te preocupes si no tienes nada que mostrar en tu portafolio todavía - en los siguientes desafíos crearás varias aplicaciones en CodePen, así que puedes regresar luego para actualizar tu portafolio.", - "Hay varias plantillas buenas, pero para este desafío, tendrás que construir la página web de tu portafolio completamente por tu cuenta. Usar Bootstrap hará el trabajo mucho más fácil para ti.", - "Recuerda utilizar Leer-Buscar-Preguntar si te sientes atascado.", - "Cuando hayas terminado, pulsa el botón \"I've completed this challenge\" e incluye un link 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 Página de Portfólio Pessoal", - "description": [ - "Objetivo: Construa uma aplicação em CodePen.io cuja funcionalidade seja similar a esta: https://codepen.io/freeCodeCamp/full/YqLyXB/.", - "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 acessar todo o conteúdo da página somente rolando o scroll do mouse.", - "História de usuário: Eu posso clicar em diferentes botões que vão me levar a diferentes páginas de mídias sociais do criador do portfólio.", - "História de usuário: Eu posso ver pequenas imagens de diferentes projetos que o criador do portfólio construiu (se você não construiu nenhum site antes, use imagens genéricas.)", - "História de usuário: Eu navego para diferentes seções do site clicando em botões na seção de navegação.", - "Não se preocupe se você não tem nada para mostrar em seu portfólio ainda - você vai construir várias aplicações nos próximos desafios e depois é só voltar e atualizar seu portfólio.", - "Existem excelentes portfólios pela web. No entando, voce deve considerar construir sua página de portfólio do zero o máximo que você conseguir. Usar o Bootstrap pode tornar esse processo mais simples para você.", - "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." - ] - }, - "ru": { - "title": "Создайте сайт-портфолио", - "description": [ - "Задание: Создайте приложение CodePen.io которое функционально соответствует вот этому: https://codepen.io/freeCodeCamp/full/QNmvEL/.", - "Правило #1: Не подсматривайте код приведенного на CodePen примера. Напишите его самостоятельно.", - "Правило #2: Реализуйте следующие пользовательские истории. Используйте любые библиотеки, которые потребуются. Оформите приложение в вашем собственном стиле.", - "Пользовательская история: Я могу получить доступ ко всей информации на странице просто прокрутив ее сверху вниз.", - "Пользовательская история: Я могу нажать на различные кнопки и перейти к социальным страницам владельца портфолио.", - "Пользовательская история: Я могу увидеть эскизы проектов созданных владельцем портфолио (используйте временную картинку если у вас пока нет собственных веб-страниц).", - "Пользовательская история: Я могу перемещаться к различным частям страницы нажимая на соответствующие навигационные кнопки.", - "Не переживайте если вам пока нечего показать в портфолио - вы создадите несколько веб приложений в следующих заданиях, а затем вернетесь и обновите портфолио.", - "В сети существует много шаблонов для портфолио, но в этом задании вам необходимо создать собственную уникальную страницу. Используя Bootstrap, сделать это будет намного проще.", - "Если что-то не получается, воспользуйтесь Read-Search-Ask.", - "Когда выполните задание кликните кнопку \"I've completed this challenge\" и добавьте ссылку на ваш CodePen.", - "Вы можете получить отзыв о вашем проекте от коллег, поделившись ссылкой на него в нашем чате для рассмотрения кода. Также вы можете поделиться ею через Twitter и на странице Free Code Camp вашего города на Facebook." - ] - } - } - } - ] -} diff --git a/seed/challenges/01-front-end-development-certification/gear-up-for-success.json b/seed/challenges/01-front-end-development-certification/gear-up-for-success.json deleted file mode 100644 index d40dc9d295c1ee..00000000000000 --- a/seed/challenges/01-front-end-development-certification/gear-up-for-success.json +++ /dev/null @@ -1,261 +0,0 @@ -{ - "name": "Gear up for Success", - "order": 4, - "time": "20 minutes", - "challenges": [ - { - "id": "573c96eac9a6be092d7830c1", - "title": "Join our Forum", - "description": [ - [ - "//i.imgur.com/y0XxmxQ.gif", - "A gif showing how you can join Free Code Camp's forum by clicking the \"sign up\" button, authenticating using GitHub, and verifying your email address.", - "Our forum is the best place for deep discussions about various programming resources: books, online courses, coding events, and more. You can also get help with these resources from your fellow campers. Click the button below to open up our forum, then click the \"Sign up\" button. Once you've created an account using GitHub, you'll need to confirm your email address. Now you're able to join discussions on our forum!", - "http://forum.freecodecamp.com/" - ], - [ - "//i.imgur.com/GxCpl7x.gif", - "A gif showing how you can upload your profile picture.", - "We recommend that you also add a custom profile picture of your face. You can do this in the settings section of the forum.", - "" - ], - [ - "//i.imgur.com/Gop2PmJ.gif", - "A gif showing how you can introduce yourself on our self introduction forum thread.", - "You can make your first forum post right now by clicking the button below to go to the introduction thread. Reply in this post with: who you are, why you're learning to code, and how you've been learning to code so far. Then feel free to explore the various discussions and jump in with your own thoughts.", - "http://forum.freecodecamp.com/t/welcome-please-introduce-yourself-here/1082" - ] - ], - "releasedOn": "May 17, 2016", - "challengeSeed": [], - "tests": [], - "type": "Waypoint", - "challengeType": 7, - "translations": { - "de": { - "title": "Join our Forum", - "description": [ - [ - "//i.imgur.com/y0XxmxQ.gif", - "A gif showing how you can join Free Code Camp's forum by clicking the \"sign up\" button, authenticating using GitHub, and verifying your email address.", - "Our forum is the best place for deep discussions about various programming resources: books, online courses, coding events, and more. You can also get help with these resources from your fellow campers. Click the button below to open up our forum, then click the \"Sign up\" button. Once you've created an account using GitHub, you'll need to confirm your email address. Now you're able to join discussions on our forum!", - "http://forum.freecodecamp.com/" - ], - [ - "//i.imgur.com/GxCpl7x.gif", - "A gif showing how you can upload your profile picture.", - "We recommend that you also add a custom profile picture of your face. You can do this in the settings section of the forum.", - "" - ], - [ - "//i.imgur.com/Gop2PmJ.gif", - "A gif showing how you can introduce yourself on our self introduction forum thread.", - "You can make your first forum post right now by clicking the button below to go to the introduction thread. Reply in this post with: who you are, why you're learning to code, and how you've been learning to code so far. Then feel free to explore the various discussions and jump in with your own thoughts.", - "http://forum.freecodecamp.com/t/welcome-please-introduce-yourself-here/1082" - ] - ] - }, - "es": { - "title": "Join our Forum", - "description": [ - [ - "//i.imgur.com/y0XxmxQ.gif", - "A gif showing how you can join Free Code Camp's forum by clicking the \"sign up\" button, authenticating using GitHub, and verifying your email address.", - "Our forum is the best place for deep discussions about various programming resources: books, online courses, coding events, and more. You can also get help with these resources from your fellow campers. Click the button below to open up our forum, then click the \"Sign up\" button. Once you've created an account using GitHub, you'll need to confirm your email address. Now you're able to join discussions on our forum!", - "http://forum.freecodecamp.com/" - ], - [ - "//i.imgur.com/GxCpl7x.gif", - "A gif showing how you can upload your profile picture.", - "We recommend that you also add a custom profile picture of your face. You can do this in the settings section of the forum.", - "" - ], - [ - "//i.imgur.com/Gop2PmJ.gif", - "A gif showing how you can introduce yourself on our self introduction forum thread.", - "You can make your first forum post right now by clicking the button below to go to the introduction thread. Reply in this post with: who you are, why you're learning to code, and how you've been learning to code so far. Then feel free to explore the various discussions and jump in with your own thoughts.", - "http://forum.freecodecamp.com/t/welcome-please-introduce-yourself-here/1082" - ] - ] - }, - "fr": { - "title": "Join our Forum", - "description": [ - [ - "//i.imgur.com/y0XxmxQ.gif", - "A gif showing how you can join Free Code Camp's forum by clicking the \"sign up\" button, authenticating using GitHub, and verifying your email address.", - "Our forum is the best place for deep discussions about various programming resources: books, online courses, coding events, and more. You can also get help with these resources from your fellow campers. Click the button below to open up our forum, then click the \"Sign up\" button. Once you've created an account using GitHub, you'll need to confirm your email address. Now you're able to join discussions on our forum!", - "http://forum.freecodecamp.com/" - ], - [ - "//i.imgur.com/GxCpl7x.gif", - "A gif showing how you can upload your profile picture.", - "We recommend that you also add a custom profile picture of your face. You can do this in the settings section of the forum.", - "" - ], - [ - "//i.imgur.com/Gop2PmJ.gif", - "A gif showing how you can introduce yourself on our self introduction forum thread.", - "You can make your first forum post right now by clicking the button below to go to the introduction thread. Reply in this post with: who you are, why you're learning to code, and how you've been learning to code so far. Then feel free to explore the various discussions and jump in with your own thoughts.", - "http://forum.freecodecamp.com/t/welcome-please-introduce-yourself-here/1082" - ] - ] - } - } - }, - { - "id": "560ade65cb82ac38a17513c2", - "title": "Watch Coding Videos on our YouTube Channel", - "description": [ - [ - "//i.imgur.com/4jUhEsb.jpg", - "An image of Briana at the whiteboard teaching in a YouTube video.", - "Our community's YouTube channel features video tutorials and demos of projects that campers have built for nonprofits. We add new videos every week. The button below will take you to our YouTube channel, where you can subscribe for free.", - "https://www.youtube.com/channel/UC8butISFwT-Wl7EV0hUK0BQ?sub_confirmation=1" - ] - ], - "releasedOn": "April 15, 2016", - "challengeSeed": [], - "tests": [], - "type": "Waypoint", - "challengeType": 7, - "translations": { - "de": { - "title": "Schaue uns auf Twitch.tv Live beim Programmieren zu", - "description": [ - [ - "//i.imgur.com/8rtyRY1.gif", - "Ein GIF, das dir zeigt, wie du dich bei Twitch.tv anmelden und unserem Kanal folgen kannst.", - "Unsere Camper programmieren oft Live auf Twitch.tv, einer populären Streaming-Website. Du kannst in weniger als einer Minute einen Account anlegen und dann dem Kanal von Free Code Camp folgen. Wenn du dem Kanal folgst, hast du die Option E-Mail Benachrichtigungen zu bekommen, sobald einer unserer Camper live geht. Dann kannst du Dutzenden Campern folgen und ihnen beim Programmieren zusehen sowie in Chats interagieren. Das ist eine lustige und lockere Art und Weise, um von anderen Personen zu lernen, wie sie ihre Projekte umsetzen.", - "https://twitch.tv/freecodecamp" - ] - ] - }, - "es": { - "title": "Miranos programar en vivo por YouTube", - "description": [ - [ - "//i.imgur.com/4jUhEsb.jpg", - "An image of Briana at the whiteboard teaching in a YouTube video.", - "Our community's YouTube channel features video tutorials and demos of projects that campers have built for nonprofits. We add new videos every week. The button below will take you to our YouTube channel, where you can subscribe for free.", - "https://www.youtube.com/channel/UC8butISFwT-Wl7EV0hUK0BQ?sub_confirmation=1" - ] - ] - }, - "fr": { - "title": "Regarde nous coder en direct sur Twitch.tv", - "description": [ - [ - "//i.imgur.com/8rtyRY1.gif", - "Une gif montrant comment tu peux créer un compte sur Twitch.tv et suivre notre chaîne.", - "Nos campers codent fréquemment en direct sur Twitch.tv, un site de streaming populaire. Tu peux créer un compte en moins d’une minute, et suivre la chaîne de Free Code Camp. Une fois suivi, tu auras l’option de recevoir un email à chaque fois qu’un de nos campers est en direct. Et donc tu peux rejoindre plusieurs campers pour regarder et interagir sur le salon de chat. C’est une façon d’apprendre en regardant les autres coder.", - "https://twitch.tv/freecodecamp" - ] - ] - } - } - }, - { - "id": "570add8ccb82ac38a17513c3", - "title": "Join our LinkedIn Alumni Network", - "description": [ - [ - "//i.imgur.com/vJyiXzU.gif", - "A gif showing how you can click the link below and fill in the necessary fields to add your Free Code Camp studies to your LinkedIn profile.", - "LinkedIn recognizes Free Code Camp as a university. You can gain access to our large alumni network by adding Free Code Camp to your LinkedIn profile's education section. Set your graduation date as next year. For \"Degree\", type \"Full Stack Web Development Certification\". For \"Field of study\", type \"Computer Software Engineering\". Then click \"Save Changes\".", - "https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp" - ] - ], - "challengeSeed": [], - "tests": [], - "type": "Waypoint", - "challengeType": 7, - "translations": { - "de": { - "title": "Tritt unserem LinkedIn Alumni Netzwerk bei", - "description": [ - [ - "//i.imgur.com/vJyiXzU.gif", - "Ein GIF, das dir zeigt, wie du den unten stehenden Link anklicken kannst und welche Felder du ausfüllen musst, damit du Free Code Camp zu deinem LinkedIn Profil hinzufügst.", - "LinkedIn erkennt Free Code Camp als Universität an. Du bekommst auf unser großes Alumni Netzwerk zugriff, indem du Free Code Camp zum Ausbildungsbereich deines LinkedIn Profils hinzufügst. Setze deinen Abschlusszeitpunkt auf das nächste Jahr. In das Feld \"Abschluss\" schreibe \"Full Stack Web Development Certification\". In das Feld \"Studienfach\" schreibe \"Computer Software Engineering\". Dann klicke auf den \"Speichern\" Button.", - "https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp" - ] - ] - }, - "es": { - "title": "Únete a nuestra red de alumnos en LinkedIn", - "description": [ - [ - "//i.imgur.com/vJyiXzU.gif", - "Un gif mostrando como puedes pulsar el enlace de abajo y llenar todos los campos necesarios para agregar los estudios de Free Code Camp a tu perfil de LinkedIn", - "LinkedIn reconoce a Free Code Camp como una universidad. Puedes obtener acceso a nuestra larga red de alumnos agregando Free Code Camp a la sección de educación de tu LinkedIn. Define tu fecha de graduación para el siguiente año. En el campo \"Grado\", escribe \"Certificación de Desarrollo Web Full Stack\". En \"Campo de estudio\", escribe \"Ingeniería de Software\". Después pulsa \"Guardar Cambios\".", - "https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp" - ] - ] - }, - "fr": { - "title": "Rejoignez notre réseau de lauréats sur Linkedin", - "description": [ - [ - "//i.imgur.com/vJyiXzU.gif", - "Une gif qui montre comment tu peux cliquer sur le lien ci-dessous et remplir les champs nécessaires pour ajouter le certificat de Free Code Camp à votre profil LinkedIn.", - "LinkedIn reconnait Free Code Camp comme une université. Tu peux avoir accès à notre large réseau de lauréats en ajoutant Free Code Camp à la section éducation de ton profil LinkedIn. L’année d’obtention du diplôme est la prochaine année. Pour le \"Degré\", c’est \"Full Stack Web Development Certification\". Pour le \"Domaine d’études\", c’est \"Computer Software Engineering\". Puis sauvegardez les changements.", - "https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp" - ] - ] - } - } - }, - { - "id": "560add8ccb81ac38a17513c4", - "title": "Commit to a Goal and a Nonprofit", - "description": [ - [ - "//i.imgur.com/Og1ifsn.gif", - "A gif showing how you can commit to a goal for your Free Code Camp studies and pledge a monthly donation to a nonprofit to give you external motivation to reach that goal.", - "You can set a goal and pledge to donate to a nonprofit each month until you achieve that goal. This will give you external motivation in your quest to learn to code, as well as an opportunity to help nonprofits right away. Choose your goal, then choose a monthly donation. When you click \"commit\", the nonprofit's donation page will open in a new tab. This pledge is completely optional. It is entirely between you and the nonprofit, and no money goes to Free Code Camp. You can change your commitment or stop it at any time.", - "/commit" - ] - ], - "challengeSeed": [], - "tests": [], - "type": "Waypoint", - "challengeType": 7, - "translations": { - "de": { - "title": "Verpflichte dich zu einem Ziel und einer gemeinnützigen Organisation", - "description": [ - [ - "//i.imgur.com/Og1ifsn.gif", - "Ein GIF, das dir zeigt, wie du dich einem Ziel auf Free Code Camp verpflichten kannst und versprichst, eine monatliche Spende an eine gemeinnützige Organisation zu entrichten, um externe Motivation zur Erreichung deines Ziels zu haben.", - "Du kannst dir ein Ziel setzen und versprechen, einer gemeinnützigen Organisation eine monatliche Spende zu entrichten, bis du dieses Ziel erreicht hast. Das gibt dir externe Motivation in deinem Bestreben programmieren zu lernen - und eröffnet von Anfang an die Gelegenheit gemeinnützigen Organisationen zu helfen. Wähle dein Ziel und dann eine monatliche Spende. Wenn du auf \"verpflichten\" klickst, öffnet sich die Spendenseite der gemeinnützigen Organisation in einem neuen Tab. Dieser Schritt ist optional, du kannst deine Verpflichtung jederzeit ändern oder stoppen.", - "/verpflichten" - ] - ] - }, - "es": { - "title": "Comprométete con una meta y con una organización sin fines de lucro", - "description": [ - [ - "//i.imgur.com/Og1ifsn.gif", - "Un gif mostrando como te puedes comprometer con una meta para tus estudios de Free Code Camp y prometer una donación mensual a una organización sin fines de lucro para darte motivación externa de alcanzar esa meta.", - "Puedes poner una meta y prometer donar mensualmente a una organización sin fines de lucro hasta que alcances tu meta. Esto te dará motivación externa en tu aventura de aprender a programar, así como una oportunidad para ayudar inmediatamente a organizaciones sin fines de lucro. Elige tu meta, después elige tu donativo mensual. Cuando pulses \"commit\", la página de donación de la organización sin fines de lucro se abrirá en una nueva pestaña. Esto es completamente opcional, y puedes cambiar tu compromiso o detenerlo en cualquier momento.", - "/comprometerse" - ] - ] - }, - "fr": { - "title": "Engage-toi à un but et aide une association à but non lucratif", - "description": [ - [ - "//i.imgur.com/Og1ifsn.gif", - "Une gif montrant comment tu peux t’engager pour atteindre ton but sur Free Code Camp et verser une somme d’argent chaque mois pour une organisation à but non lucratif qui sera une motivation externe pour atteindre ton objectif.", - "Tu peux définir un but et t’engager à verser une somme d’argent pour aider une organisation à but non lucratif chaque mois jusqu’à atteindre ton objectif. Cela va te donner une motivation externe dans ta journée d’apprentissage, mais aussi une opportunité pour aider ces organisations. Choisi un but, et un montant à verser. Quand tu vas cliquer sur \"commit\", la page des dons de l’organisation va s’ouvrir. Cette étape est optionnel, et tu peux annuler ou arrêter ton engagement à n’importe quel instant.", - "/commit" - ] - ] - } - } - } - ] -} diff --git a/seed/challenges/01-front-end-development-certification/intermediate-ziplines.json b/seed/challenges/01-front-end-development-certification/intermediate-ziplines.json deleted file mode 100644 index 7cae76810ede63..00000000000000 --- a/seed/challenges/01-front-end-development-certification/intermediate-ziplines.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "name": "Intermediate Front End Development Projects", - "order": 11, - "time": "100 hours", - "helpRoom": "HelpFrontEnd", - "challenges": [ - { - "id": "bd7158d8c442eddfaeb5bd13", - "title": "Build a Random Quote Machine", - "description": [ - "Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/freeCodeCamp/full/ONjoLe/.", - "Fulfill the following user stories. Use whichever libraries or APIs you need. Give it your own personal style.", - "User Story: I can click a button to show me a new random quote.", - "User Story: I can press a button to tweet out a quote.", - "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": [ - "a5RknIzoDrs" - ], - "tests": [], - "type": "zipline", - "isRequired": true, - "challengeType": 3, - "translations": { - "es": { - "title": "Crea una máquina de frases aleatorias", - "description": [ - "Objetivo: Crea una aplicación con CodePen.io cuya funcionalidad sea similar a la de esta: https://codepen.io/freeCodeCamp/full/ONjoLe/.", - "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.", - "Historia de usuario: Puedo pulsar un botón que me mostrará una nueva frase aleatoria.", - "Bonus User Story: Puedo presionar un botón para twitear una frase.", - "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": "Создайте генератор случайных цитат", - "description": [ - "Задание: Создайте CodePen.io который успешно копирует вот этот: https://codepen.io/freeCodeCamp/full/ONjoLe/.", - "Правило #1: Не подсматривайте код приведенного на CodePen примера. Напишите его самостоятельно.", - "Правило #2: Можете использовать любые библиотеки или API, которые потребуются.", - "Правило #3: Воссоздайте функционал приведенного примера и не стесняйтесь добавить что-нибудь от себя.", - "Реализуйте следующие пользовательские истории, сделайте также бонусные по желанию:", - "Пользовательская история: В качестве пользователя, я могу нажать на кнопку и получить случайную цитату.", - "Бонусная пользовательская история: В качестве пользователя, я могу нажать на кнопку и опубликовать цитату в Twitter'e.", - "Цитаты можно добавить в массив и случайным образом выводить одну из них, либо можно воспользоваться соответствующим API, например http://forismatic.com/en/api/.", - "Если что-то не получается, воспользуйтесь Read-Search-Ask.", - "Когда выполните задание кликните кнопку \"I've completed this challenge\" и добавьте ссылку на ваш CodePen. Если вы программировали с кем-то в паре, также добавьте имя вашего напарника.", - "Если вы хотите получить немедленную оценку вашего проекта, нажмите эту кнопку и добавьте ссылку на ваш CodePen. В противном случае мы проверим его перед тем как вы приступите к проектам для некоммерческих организаций.

Click here then add your link to your tweet's text" - ] - } - } - }, - { - "id": "bd7158d8c442eddfaeb5bd10", - "title": "Show the Local Weather", - "description": [ - "Objective: Build a CodePen.io app that is functionally similar to this: http://codepen.io/freeCodeCamp/full/bELRjV.", - "Fulfill the following user stories. Use whichever libraries or APIs you need. Give it your own personal style.", - "User Story: I can see the weather in my current location.", - "User Story: I can see a different icon or background image (e.g. snowy mountain, hot desert) depending on the weather.", - "User Story: I can push a button to toggle between Fahrenheit and Celsius.", - "We recommend using the Dark Sky API or Weather Underground API. This will require creating a free API key. Normally you want to avoid exposing API keys on CodePen, but we haven't been able to find a keyless API for weather.", - "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": [ - "GCLiJU-vvVc" - ], - "tests": [], - "type": "zipline", - "challengeType": 3, - "isRequired": true, - "translations": { - "es": { - "title": "Muestra el clima local", - "description": [ - "Objetivo: Crea una aplicación con CodePen.io cuya funcionalidad sea similar a la de esta: http://codepen.io/freeCodeCamp/full/bELRjV.", - "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.", - "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.", - "Recomendamos utilizar Open Weather API. Al utilizarlo tendrás que crear una llave API gratuita. Normalmente debes evitar exponer llaves de API en CodePen, pero por el momento no hemos encontrado un API de clima que no requiera llave.", - "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": "Покажите местную погоду", - "description": [ - "Задание: Создайте CodePen.io который успешно копирует вот этот: http://codepen.io/freeCodeCamp/full/bELRjV.", - "Правило #1: Не подсматривайте код приведенного на CodePen примера. Напишите его самостоятельно.", - "Правило #2: Можете использовать любые библиотеки или API, которые потребуются.", - "Правило #3: Воссоздайте функционал приведенного примера и не стесняйтесь добавить что-нибудь от себя.", - "Реализуйте следующие пользовательские истории, сделайте также бонусные по желанию:", - "Пользовательская история: В качестве пользователя, я могу узнать погоду с учетом моего текущего местоположения.", - "Бонусная пользовательская история: В качестве пользователя, я могу в зависимости от погоды видеть различные температурные значки.", - "Бонусная пользовательская история: В качестве пользователя, я могу в зависимости от погоды видеть различные фоновые изображения (снежные горы, знойная пустыня).", - "Бонусная пользовательская история: В качестве пользователя, я могу нажать на кнопку чтобы переключится между градусами по Цельсию или по Фаренгейту.", - "Если что-то не получается, воспользуйтесь Read-Search-Ask.", - "Когда выполните задание кликните кнопку \"I've completed this challenge\" и добавьте ссылку на ваш CodePen. Если вы программировали с кем-то в паре, также добавьте имя вашего напарника.", - "Если вы хотите получить немедленную оценку вашего проекта, нажмите эту кнопку и добавьте ссылку на ваш CodePen. В противном случае мы проверим его перед тем как вы приступите к проектам для некоммерческих организаций.

Click here then add your link to your tweet's text" - ] - } - } - }, - { - "id": "bd7158d8c442eddfaeb5bd19", - "title": "Build a Wikipedia Viewer", - "description": [ - "Objective: Build a CodePen.io app that is functionally similar to this: https://codepen.io/freeCodeCamp/full/wGqEga/.", - "Fulfill the following user stories. Use whichever libraries or APIs you need. Give it your own personal style.", - "User Story: I can search Wikipedia entries in a search box and see the resulting Wikipedia entries.", - "User Story: I can click a button to see a random Wikipedia entry.", - "Hint #1: Here's a URL you can use to get a random Wikipedia article: 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. В противном случае мы проверим его перед тем как вы приступите к проектам для некоммерческих организаций.

Click here then add your link to your tweet's text" - ] - } - } - } - ] -} diff --git a/seed/challenges/01-front-end-development-certification/json-apis-and-ajax.json b/seed/challenges/01-front-end-development-certification/json-apis-and-ajax.json deleted file mode 100644 index aa5af9cedf83d0..00000000000000 --- a/seed/challenges/01-front-end-development-certification/json-apis-and-ajax.json +++ /dev/null @@ -1,539 +0,0 @@ -{ - "name": "JSON APIs and Ajax", - "order": 10, - "time": "2 hours", - "helpRoom": "Help", - "required": [ - { "link": "https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" } - ], - "challenges": [ - { - "id": "56bbb991ad1ed5201cd392d4", - "title": "Trigger Click Events with jQuery", - "description": [ - "In this section, we'll learn how to get data from APIs. APIs - or Application Programming Interfaces - are tools that computers use to communicate with one another.", - "We'll also learn how to update HTML with the data we get from these APIs using a technology called Ajax.", - "First, let's review what the $(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", - "", - "", - "
", - "
", - "

Cat Photo Finder

", - "
", - "
", - "
", - " The message will go here", - "
", - "
", - "
", - "
", - " ", - "
", - "
", - "
" - ], - "tests": [ - "assert(code.match(/\\$\\s*?\\(\\s*?(?:'|\")\\#getMessage(?:'|\")\\s*?\\)\\s*?\\.on\\s*?\\(\\s*?(?:'|\")click(?:'|\")\\s*?\\,\\s*?function\\s*?\\(\\s*?\\)\\s*?\\{/gi), 'message: Bind the click event to the button with the ID of 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", - "", - "", - "
", - "
", - "

Cat Photo Finder

", - "
", - "
", - "
", - " The message will go here", - "
", - "
", - "
", - "
", - " ", - "
", - "
", - "
" - ], - "tests": [ - "assert(code.match(/\\$\\s*?\\(\\s*?(?:'|\")\\.message(?:'|\")\\s*?\\)\\s*?(\\.html|\\.text)\\s*?\\(\\s*?(?:'|\")Here\\sis\\sthe\\smessage(?:'|\")\\s*?\\);/gi), 'message: Clicking the \"Get Message\" button should give the element with the class 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) {
$(\".message\").html(JSON.stringify(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", - "", - "
", - "
", - "

Cat Photo Finder

", - "
", - "
", - "
", - " The message will go here", - "
", - "
", - "
", - "
", - " ", - "
", - "
", - "
" - ], - "tests": [ - "assert(code.match(/\\$\\s*?\\(\\s*?(\\\"|\\')\\#getMessage(\\\"|\\')\\s*?\\)\\s*?\\.\\s*?on\\s*?\\(\\s*?(\\\"|\\')click(\\\"|\\')\\s*?\\,\\s*?function\\s*?\\(\\s*?\\)\\s*?\\{/g), 'message: You should have a click handler on the 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) {
$(\".message\").html(JSON.stringify(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 { 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) {
$(\".message\").html(JSON.stringify(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 .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", - "", - "
", - "
", - "

Cat Photo Finder

", - "
", - "
", - "
", - " The message will go here", - "
", - "
", - "
", - "
", - " ", - "
", - "
", - "
" - ], - "tests": [ - "assert(code.match(/json\\.forEach/gi), 'message: The message box should have something in it.');" - ], - "type": "waypoint", - "challengeType": 0, - "translations": { - "es": { - "title": "Convierte datos JSON a datos HTML", - "description": [ - "Ahora que estamos obteniendo datos de una API JSON, mostremóslos en nuestro HTML.", - "Podemos usar el método .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 += \"
\";", - "", - " // Only change code below this line.", - " ", - " ", - " ", - " // Only change code above this line.", - "", - " html += \"
\";", - "", - " });", - "", - "     $(\".message\").html(html);", - "", - " });", - " });", - " });", - "fcces", - "", - "
", - "
", - "

Cat Photo Finder

", - "
", - "
", - "
", - " The message will go here", - "
", - "
", - "
", - "
", - " ", - "
", - "
", - "
" - ], - "tests": [ - "assert(code.match(/val\\.imageLink/gi) || code.match(/val\\[\"imageLink\"\\]/gi), 'message: You should have used the 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 += \"
\"", - "", - " html += \"\"", - "", - " html += \"
\"", - "", - " });", - "", - "     $(\".message\").html(html);", - "", - "   });", - " });", - " });", - "fcces", - "", - "
", - "
", - "

Cat Photo Finder

", - "
", - "
", - "
", - " The message will go here", - "
", - "
", - "
", - "
", - " ", - "
", - "
", - "
" - ], - "tests": [ - "assert(code.match(/filter/gi), 'message: You should be making use of the .filter method.');" - ], - "type": "waypoint", - "challengeType": 0, - "translations": { - "es": { - "title": "Pre-filtra JSON", - "description": [ - "Si no queremos presentar cada foto de gato que obtengamos de la API JSON de fotos de gato de Free Code Camp, podemos pre-filtrar el json antes de iterar a través de este.", - "Vamos a filtrar el gato cuya llave \"id\" tiene un valor de 1.", - "Aquí está el código para hacer esto:", - "
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) {
navigator.geolocation.getCurrentPosition(function(position) {
$(\"#data\").html(\"latitude: \" + position.coords.latitude + \"<br>longitude: \" + position.coords.longitude);
});
}
", - "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", - "

You are here:

", - "
", - " ", - "
" - ], - "tests": [ - "assert(code.match(/navigator\\.geolocation\\.getCurrentPosition/gi), 'message: You should make use of 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() {
  this.wheels = 4;
  this.engines = 1;
  this.seats = 5;
};
", - "In a 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:", - "
{
  wheels: 4,
  engines: 1,
  seats: 5
}
", - "Note that it is important to use the 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();", - "miCarroes 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) {
  this.wheels = wheels;
  this.seats = seats;
  this.engines = engines;
};
", - "Now we can pass in 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:", - "
{
  wheels: 6,
  seats: 3,
  engines: 1
}
", - "Now give it a try yourself! Alter the 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ámetrosen 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 myCarpara 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úblicasdel 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 geary dosmétodos públicos llamados getGearysetGear 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];
var timesFour = oldArray.map(function(val){
  return val * 4;
});
console.log(timesFour); // returns [4, 8, 12]
console.log(oldArray); // returns [1, 2, 3]
", - "The 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(function(previousVal, currentVal) {
  return previousVal - currentVal;
}, 0);
", - "Use the 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) {
  return val !== 5;
});
", - "Use 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];
array.sort(function(a, b) {
  return a - b;
});
", - "Use 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,sorten 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];
myArray.reverse();
", - "returns [3, 2, 1]", - "Use 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\"];
var salad = veggies.join(\" and \");
console.log(salad); // \"Celery and Radish and Carrot and Potato\"
", - "Use the 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:


  1. have well-organized code that uses appropriate markup

  2. ensure text alternatives exist for non-text and visual content

  3. create an easily-navigated page that's keyboard-friendly



Having accessible web content is an ongoing challenge. A great resource for your projects going forward is the W3 Consortium's Web Content Accessibility Guidelines (WCAG). They set the international standard for accessibility and provide a number of criteria you can use to check your work.", + "" + ] + ], + "releasedOn": "", + "challengeSeed": [], + "tests": [], + "type": "Waypoint", + "challengeType": 7, + "isRequired": false, + "titleEs": "", + "descriptionEs": [ + [] + ], + "titleFr": "", + "descriptionFr": [ + [] + ], + "titleDe": "", + "descriptionDe": [ + [] + ] + }, + { + "id": "587d774c367417b2b2512a9c", + "title": "Add Alt Text to Images for Visually Impaired Accessibility", + "description": [ + "It's likely you've seen an 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.", + "

Instructions

", + "Camper Cat happens to be both a coding ninja and an actual ninja, and is building a website to share his knowledge. The profile picture he wants to use shows his skills, and should be appreciated by all site visitors. Add an 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.", + "Note
For images with a caption, you may still want to include alt text, since it helps search engines catalog the content of the image.", + "

Instructions

", + "Camper Cat has coded a skeleton page for the blog part of his website. He's planning to add a visual break between his two articles with a decorative image of a samurai sword. Add an 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": [ + "

Deep Thoughts with Master Camper Cat

", + "
", + "

Defeating your Foe: the Red Dot is Ours!

", + "

To Come...

", + "
", + "", + "", + "", + "
", + "

Is Chuck Norris a Cat Person?

", + "

To Come...

", + "
" + ], + "tests": [ + "assert(!($('img').attr('alt') == undefined), 'message: Your 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.", + "

Instructions

", + "Camper Cat wants a page on his site dedicated to becoming a ninja. Help him fix the headings so his markup gives semantic meaning to the content, and shows the proper parent-child relationships of his sections. Change all the h5 tags to the proper heading level to indicate they are subsections of the h2 ones." + ], + "challengeSeed": [ + "

How to Become a Ninja

", + "
", + "

Learn the Art of Moving Stealthily

", + "
How to Hide in Plain Sight
", + "
How to Climb a Wall
", + "", + "

Learn the Art of Battle

", + "
How to Strengthen your Body
", + "
How to Fight like a Ninja
", + "", + "

Learn the Art of Living with Honor

", + "
How to Breathe Properly
", + "
How to Simplify your Life
", + "
" + ], + "tests": [ + "assert($('h3').length === 6, 'message: Your code should have six 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.", + "

Instructions

", + "Camper Cat has some big ideas for his ninja weapons page. Help him set up his markup by adding opening and closing main tags between the header and footer (covered in other challenges). Keep the main tags empty for now." + ], + "challengeSeed": [ + "
", + "

Weapons of the Ninja

", + "
", + "", + "", + "", + "" + ], + "tests": [ + "assert($('main').length == 1, 'message: Your code should have one main tag.');", + "assert(code.match(/<\\/header>\\s*?
\\s*?<\\/main>/gi), 'message: The 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
The 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
", + "

Instructions

", + "Camper Cat used 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": [ + "

Deep Thoughts with Master Camper Cat

", + "
", + "
", + "

The Garfield Files: Lasagna as Training Fuel?

", + "

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...

", + "
", + "", + " \"\"", + "", + "
", + "

Defeating your Foe: the Red Dot is Ours!

", + "

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...

", + "
", + "", + " \"\"", + "", + "
", + "

Is Chuck Norris a Cat Person?

", + "

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?...

", + "
", + "
" + ], + "tests": [ + "assert($('article').length == 3, 'message: Your code should have three 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.", + "Note
Header 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.", + "

Instructions

", + "Camper Cat is writing some great articles about ninja training, and wants to add a page for them to his site. Change the top div that currently contains the h1 to a header tag instead." + ], + "challengeSeed": [ + "", + "", + "
", + "

Training with Camper Cat

", + "
", + "", + "", + "
", + "
", + "

Stealth & Agility Training

", + "

Climb foliage quickly using a minimum spanning tree approach

", + "

No training is NP-complete without parkour

", + "
", + "
", + "

Combat Training

", + "

Dispatch multiple enemies with multithreaded tactics

", + "

Goodbye world: 5 proven ways to knock out an opponent

", + "
", + "
", + "

Weapons Training

", + "

Swords: the best tool to literally divide and conquer

", + "

Breadth-first or depth-first in multi-weapon training?

", + "
", + "
", + "" + ], + "tests": [ + "assert($('header').length == 1, 'message: Your code should have one 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.", + "

Instructions

", + "Camper Cat included navigation links at the top of his training page, but wrapped them in a div. Change the div to a nav tag to improve the accessibility on his page." + ], + "challengeSeed": [ + "", + "
", + "

Training with Camper Cat

", + "", + "
", + " ", + "
", + "", + "
", + "
", + "
", + "

Stealth & Agility Training

", + "

Climb foliage quickly using a minimum spanning tree approach

", + "

No training is NP-complete without parkour

", + "
", + "
", + "

Combat Training

", + "

Dispatch multiple enemies with multithreaded tactics

", + "

Goodbye world: 5 proven ways to knock out an opponent

", + "
", + "
", + "

Weapons Training

", + "

Swords: the best tool to literally divide and conquer

", + "

Breadth-first or depth-first in multi-weapon training?

", + "
", + "
", + "" + ], + "tests": [ + "assert($('nav').length == 1, 'message: Your code should have one 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.", + "

Instructions

", + "Camper Cat's training page is making good progress. Change the div he used to wrap his copyright information at the bottom of the page to a footer element." + ], + "challengeSeed": [ + "", + "
", + "

Training

", + " ", + "
", + "
", + "
", + "

Stealth & Agility Training

", + "

Climb foliage quickly using a minimum spanning tree approach

", + "

No training is NP-complete without parkour

", + "
", + "
", + "

Combat Training

", + "

Dispatch multiple enemies with multithreaded tactics

", + "

Goodbye world: 5 proven ways to knock out an opponent

", + "
", + "
", + "

Weapons Training

", + "

Swords: the best tool to literally divide and conquer

", + "

Breadth-first or depth-first in multi-weapon training?

", + "
", + "
", + "", + "", + "
© 2016 Camper Cat
", + "", + "", + "" + ], + "tests": [ + "assert($('footer').length == 1, 'message: Your code should have one 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>
<source src="audio/meow.mp3" type="audio/mpeg" />
<source src="audio/meow.ogg" type="audio/ogg" />
</audio>
", + "Note
Multimedia content usually has both visual and auditory components. It needs synchronized captions and a transcript so users with visual and/or auditory impairments can access it. Generally, a web developer is not responsible for creating the captions or transcript, but needs to know to include them.", + "

Instructions

", + "Time to take a break from Camper Cat and meet fellow camper Zersiax (@zersiax), a champion of accessibility and a screen reader user. To hear a clip of his screen reader in action, add an 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": [ + "", + "
", + "

Real Coding Ninjas

", + "
", + "
", + "

A sound clip of Zersiax's screen reader in action.

", + " ", + " ", + " ", + "
", + "" + ], + "tests": [ + "assert($('audio').length === 1, 'message: Your code should have one 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>
", + "

Instructions

", + "Camper Cat is hard at work creating a stacked bar chart showing the amount of time per week to spend training in stealth, combat, and weapons. Help him structure his page better by changing the div tag he used to a figure tag, and the p tag that surrounds the caption to a figcaption tag." + ], + "challengeSeed": [ + "", + "
", + "

Training

", + " ", + "
", + "
", + "
", + " ", + " ", + "
", + " ", + "
", + "

Breakdown per week of time to spend training in stealth, combat, and weapons.

", + "
", + " ", + " ", + "
", + "
", + "

Stealth & Agility Training

", + "

Climb foliage quickly using a minimum spanning tree approach

", + "

No training is NP-complete without parkour

", + "
", + "
", + "

Combat Training

", + "

Dispatch multiple enemies with multithreaded tactics

", + "

Goodbye world: 5 proven ways to knock out an opponent

", + "
", + "
", + "

Weapons Training

", + "

Swords: the best tool to literally divide and conquer

", + "

Breadth-first or depth-first in multi-weapon training?

", + "
", + "
", + " ", + "" + ], + "tests": [ + "assert($('figure').length == 1, 'message: Your code should have one 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>
", + "

Instructions

", + "Camper Cat expects a lot of interest in his thoughtful blog posts, and wants to include an email sign up form. Add a for attribute on the email label that matches the id on its input field." + ], + "challengeSeed": [ + "", + "
", + "

Deep Thoughts with Master Camper Cat

", + "
", + "
", + "
", + "

Sign up to receive Camper Cat's blog posts by email here!

", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "
", + "
", + "
", + "

The Garfield Files: Lasagna as Training Fuel?

", + "

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...

", + "
", + " \"\"", + "
", + "

Defeating your Foe: the Red Dot is Ours!

", + "

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...

", + "
", + " \"\"", + "
", + "

Is Chuck Norris a Cat Person?

", + "

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?...

", + "
", + " ", + "" + ], + "tests": [ + "assert($('label').attr('for'), 'message: Your code should have a 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>
", + "

Instructions

", + "Camper Cat wants information about the ninja level of his users when they sign up for his email list. He's added a set of radio buttons, and learned from our last lesson to use label tags with 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": [ + "", + "
", + "

Deep Thoughts with Master Camper Cat

", + "
", + "
", + "
", + "

Sign up to receive Camper Cat's blog posts by email here!

", + " ", + " ", + " ", + " ", + " ", + "
", + "

What level ninja are you?

", + " ", + "
", + " ", + "
", + " ", + " ", + "
", + " ", + " ", + " ", + " ", + "
", + "
", + "
", + "

The Garfield Files: Lasagna as Training Fuel?

", + "

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...

", + "
", + " \"\"", + "
", + "

Defeating your Foe: the Red Dot is Ours!

", + "

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...

", + "
", + " \"\"", + "
", + "

Is Chuck Norris a Cat Person?

", + "

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?...

", + "
", + " ", + "" + ], + "tests": [ + "assert($('fieldset').length == 1, 'message: Your code should have a 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">
", + "

Instructions

", + "Camper Cat is setting up a mortal combat tournament and wants to ask his competitors to see what date works best. Add an input tag with a type attribute of \"date\", an id attribute of \"pickdate\", and a name attribute of \"date\"." + ], + "challengeSeed": [ + "", + "
", + "

Tournaments

", + "
", + "
", + "
", + "

Mortal Combat Tournament Survey

", + "
", + "

Tell us the best date for the competition

", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "
", + "
", + "
", + " ", + "" + ], + "tests": [ + "assert($('input').length == 2, 'message: Your code should add one 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>", + "

Instructions

", + "Camper Cat's mortal combat survey results are in! Wrap a time tag around the text \"Thursday, September 15<sup>th</sup>\" and add a datetime attribute to it set to \"2016-09-15\"." + ], + "challengeSeed": [ + "", + "
", + "

Tournaments

", + "
", + "
", + "

Mortal Combat Tournament Survey Results

", + " ", + " ", + " ", + "

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!

", + " ", + " ", + " ", + "
", + "

Comments:

", + "
", + "

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.

", + "
", + "
", + "
", + " ", + "" + ], + "tests": [ + "assert($('time').text().match(/Thursday, September 15th/g), 'message: Your 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 {
position: absolute;
left: -10000px;
width: 1px;
height: 1px;
top: auto;
overflow: hidden;
}
", + "Note
The following CSS approaches will NOT do the same thing:", + "", + "

Instructions

", + "Camper Cat created a really cool stacked bar chart for his training page, and put the data into a table for his visually impaired users. The table already has an sr-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": [ + "", + " ", + "", + "", + "
", + "

Training

", + " ", + "
", + "
", + "

Master Camper Cat's Beginner Three Week Training Program

", + "
", + " ", + "

[Stacked bar chart]

", + "
", + "
Breakdown per week of time to spend training in stealth, combat, and weapons.
", + "
", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "
Hours of Weekly Training in Stealth, Combat, and Weapons
Stealth & AgilityCombatWeaponsTotal
Week One35210
Week Two45312
Week Three46313
", + "
", + "
", + "

Stealth & Agility Training

", + "

Climb foliage quickly using a minimum spanning tree approach

", + "

No training is NP-complete without parkour

", + "
", + "
", + "

Combat Training

", + "

Dispatch multiple enemies with multithreaded tactics

", + "

Goodbye, world: 5 proven ways to knock out an opponent

", + "
", + "
", + "

Weapons Training

", + "

Swords: the best tool to literally divide and conquer

", + "

Breadth-first or depth-first in multi-weapon training?

", + "
", + " ", + "" + ], + "tests": [ + "assert($('.sr-only').css('position') == 'absolute', 'message: Your code should set the 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.", + "

Instructions

", + "Camper Cat's choice of light gray text on a white background for his recent blog post has a 1.5:1 contrast ratio, making it hard to read. Change the color of the text from the current gray (#D3D3D3) to a darker gray (#636363) to improve the contrast ratio to 6:1." + ], + "challengeSeed": [ + "", + " ", + "", + "", + "
", + "

Deep Thoughts with Master Camper Cat

", + "
", + "
", + "

A Word on the Recent Catnip Doping Scandal

", + "

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.

", + "
", + "" + ], + "tests": [ + "assert($('body').css('color') == 'rgb(99, 99, 99)', 'message: Your code should change the text 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.", + "

Instructions

", + "Camper Cat is experimenting with using color for his blog text and background, but his current combination of a greenish 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": [ + "", + " ", + "", + "", + "
", + "

Deep Thoughts with Master Camper Cat

", + "
", + "
", + "

A Word on the Recent Catnip Doping Scandal

", + "

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.

", + "
", + "" + ], + "tests": [ + "assert(code.match(/color:\\s*?hsl\\(0,\\s*?55%,\\s*?15%\\)/gi), 'message: Your code should only change the lightness value for the text 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
Some online color picking tools include visual simulations of how colors appear for different types of colorblindness. These are great resources in addition to online contrast checking calculators.", + "

Instructions

", + "Camper Cat is testing different styles for an important button, but the yellow (#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": [ + "", + " ", + "", + "", + "
", + "

Danger!

", + "
", + " ", + "" + ], + "tests": [ + "assert($('button').css('color') == 'rgb(0, 51, 102)', 'message: Your code should change the text 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.", + "

Instructions

", + "The link text that Camper Cat is using is not very descriptive without the surrounding context. Move the anchor (a) tags so they wrap around the text \"information about batteries\" instead of \"Click here\"." + ], + "challengeSeed": [ + "", + "
", + "

Deep Thoughts with Master Camper Cat

", + "
", + "
", + "

Defeating your Foe: the Red Dot is Ours!

", + "

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

", + "
", + "" + ], + "tests": [ + "assert($('a').text().match(/information about batteries/g), 'message: Your code should move the anchor 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>", + "

Instructions

", + "Camper Cat wants the links around the two blog article titles to have keyboard shortcuts so his site's users can quickly navigate to the full story. Add an accesskey attribute to both links and set the first one to \"g\" (for Garfield) and the second one to \"c\" (for Chuck Norris)." + ], + "challengeSeed": [ + "", + "
", + "

Deep Thoughts with Master Camper Cat

", + "
", + "
", + " ", + " ", + "

The Garfield Files: Lasagna as Training Fuel?

", + " ", + " ", + "

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...

", + "
", + "
", + " ", + " ", + "

Is Chuck Norris a Cat Person?

", + " ", + " ", + "

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?...

", + "
", + " ", + "" + ], + "tests": [ + "assert($('#first').attr('accesskey'), 'message: Your code should add an 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>", + "Note
A negative tabindex 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.", + "

Instructions

", + "Camper Cat created a new survey to collect information about his users. He knows input fields automatically get keyboard focus, but he wants to make sure his keyboard users pause at the instructions while tabbing through the items. Add a 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": [ + "", + " ", + "", + "", + "
", + "

Ninja Survey

", + "
", + "
", + "
", + " ", + " ", + "

Instructions: Fill in ALL your information then click Submit

", + " ", + " ", + " ", + "
", + "
", + " What level ninja are you?", + " ", + "
", + " ", + "
", + " ", + " ", + "
", + "
", + "
", + " Select your favorite weapons:", + " ", + "
", + " ", + "
", + " ", + "
", + " ", + " ", + "
", + "
", + " ", + "

", + "
", + " ", + "" + ], + "tests": [ + "assert($('p').attr('tabindex'), 'message: Your code should add a 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>", + "

Instructions

", + "Camper Cat has a search field on his Inspirational Quotes page that he plans to position in the upper right corner with CSS. He wants the search 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": [ + "", + "
", + "

Even Deeper Thoughts with Master Camper Cat

", + " ", + "
", + "
", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "
", + "

Inspirational Quotes

", + "
", + "

“There's no Theory of Evolution, just a list of creatures I've allowed to live.”
", + " - Chuck Norris

", + "
", + "
", + "

“Wise men say forgiveness is divine, but never pay full price for late pizza.”
", + " - TMNT

", + "
", + " ", + "" + ], + "tests": [ + "assert($('#search').attr('tabindex'), 'message: Your code should add a 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.

At a basic level, most web content provides a user with information. The visual design of the page can influence its presentation and a user's experience. In web development, HTML gives structure and semantics to a page's content, and CSS controls the layout and appearance of it.

This section covers some of the basic tools developers use to create their own visual designs.", + "" + ] + ], + "releasedOn": "", + "challengeSeed": [], + "tests": [], + "type": "Waypoint", + "challengeType": 7, + "isRequired": false, + "titleEs": "", + "descriptionEs": [ + [] + ], + "titleFr": "", + "descriptionFr": [ + [] + ], + "titleDe": "", + "descriptionDe": [ + [] + ] + }, + { + "id": "587d7791367417b2b2512ab3", + "title": "Create Visual Balance Using the Text-align Property", + "description": [ + "This section of the curriculum focuses on Applied Visual Design. The first group of challenges build on the given card layout to show a number of core principles.", + "Text is often a large part of web content. CSS has several options for how to align it with the text-align property.", + "

Instructions

", + "Align the 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.", + "Note
When you align the two anchor tags, you will see no difference. This is because text is aligned to the left by default." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Google

", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " Larry Page", + " Sergey Brin", + "
", + "
", + "
" + ], + "tests": [ + "assert($('h4').css('text-align') == 'center', 'message: Your code should use the text-align property on the 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;
}
", + "

Instructions

", + "Add a 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

", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " Larry Page", + " Sergey Brin", + "
", + "
", + "
" + ], + "tests": [ + "assert($('.fullCard').css('width') == '245px', 'message: Your code should change the 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;
}
", + "

Instructions

", + "Add a height property to the h4 tag and set it to 40px." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Google

", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " Larry Page", + " Sergey Brin", + "
", + "
", + "
" + ], + "tests": [ + "assert($('h4').css('height') == '40px', 'message: Your code should change the 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.", + "

Instructions

", + "Change the height of the h4 tag to 25px to make the card more compact and a little cleaner." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Google

", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
" + ], + "tests": [ + "assert($('h4').css('height') == '25px', 'message: Your code should change the 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.", + "

Instructions

", + "Wrap a strong tag around the entire h4 element and its contents." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Google

", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
" + ], + "tests": [ + "assert($('strong').length == 1, 'message: Your code should add one 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.", + "

Instructions

", + "Wrap the u tag around the two anchor tags. It should not include the parent div that has the class of cardLinks.", + "Note
Try to avoid using the u tag when it could be confused for a link. Anchor tags also have a default underlined formatting." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Google

", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
" + ], + "tests": [ + "assert($('u').length == 1, 'message: Your code should add a 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.", + "

Instructions

", + "Wrap an em tag around the paragraph tag to give it emphasis." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Google

", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " ", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
", + "
" + ], + "tests": [ + "assert($('em').length == 1, 'message: Your code should add an 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.", + "

Instructions

", + "Wrap the 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

", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " ", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
", + "
" + ], + "tests": [ + "assert($('del').length == 1, 'message: Your code should add one 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.", + "

Instructions

", + "Add an hr tag underneath the h4 which contains the card title.", + "Note
In HTML, hr is a self-closing tag, and therefore doesn't need a separate closing tag." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

GoogleAlphabet

", + " ", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " ", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
", + "
" + ], + "tests": [ + "assert($('hr').length == 1, 'message: Your code should add an hr tag to the markup.');", + "assert(code.match(/<\\/strong>\\s*?|\\s*?\\/>)\\s*?/gi), 'message: The 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:
r = red
g = green
b = blue
a = alpha/level of opacity
", + "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. 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.", + "

Instructions

", + "To make the text stand out more, adjust the 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": [ + "", + "
", + "
", + "
", + "

Alphabet

", + "
", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " ", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
", + "
" + ], + "tests": [ + "assert(code.match(/background-color:\\s*?rgba\\(\\s*?45\\s*?,\\s*?45\\s*?,\\s*?45\\s*?,\\s*?0?\\.1\\s*?\\)/gi), 'message: Your code should add a 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.", + "

Instructions

", + "To make the heading significantly larger than the paragraph, change the font-size of the h4 tag to 27 pixels." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Alphabet

", + "
", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " ", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
", + "
" + ], + "tests": [ + "assert($('h4').css('font-size') == '27px', 'message: Your code should add a 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);
", + "

Instructions

", + "Use the example CSS values above to place a 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": [ + "", + "
", + "
", + "
", + "

Alphabet

", + "
", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " ", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
", + "
" + ], + "tests": [ + "assert(code.match(/#thumbnail:hover\\s*?{\\s*?box-shadow/g), 'message: Your code should add a 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.
A value of 0.5 is half see-through.
A value of 0 is completely transparent.
", + "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.", + "

Instructions

", + "Set the opacity of the anchor tags to 0.7 using links class to select them." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Alphabet

", + "
", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " ", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
", + "
" + ], + "tests": [ + "assert($('.links').css('opacity') == '0.7', 'message: Your code should set the 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.", + "Note
Other values for this property are lowercase, capitalize (transforms the first letter of each word to uppercase), initial (sets the property to the default value), inherit (inherits the property from parent element) and none (the default).", + "

Instructions

", + "Set the text inside the h4 tag to be uppercase using the text-transform property." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Alphabet

", + "
", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " ", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
", + "
" + ], + "tests": [ + "assert($('h4').css('text-transform') == 'uppercase', 'message: The 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.", + "

Instructions

", + "Set the font-family of the body to \"Open Sans\"." + ], + "challengeSeed": [ + "", + "
", + "
", + "
", + "

Alphabet

", + "
", + "

Google was founded by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University.

", + "
", + "
", + " ", + " Larry Page

", + " Sergey Brin", + "
", + "
", + "
", + "
" + ], + "tests": [ + "assert($('body').css('font-family') == '\"Open Sans\", sans-serif', 'message: The 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.", + "

Instructions

", + "
    ", + "
  • Set the font-size of the h1 tag to 68px.
  • ", + "
  • Set the font-size of the h2 tag to 52px.
  • ", + "
  • Set the font-size of the h3 tag to 40px.
  • ", + "
  • Set the font-size of the h4 tag to 32px.
  • ", + "
  • Set the font-size of the h5 tag to 21px.
  • ", + "
  • Set the font-size of the h6 tag to 14px.
  • ", + "
" + ], + "challengeSeed": [ + "", + "

This is h1 text

", + "

This is h2 text

", + "

This is h3 text

", + "

This is h4 text

", + "
This is h5 text
", + "
This is h6 text
" + ], + "tests": [ + "assert($('h1').css('font-size') == '68px', 'message: Your code should set the 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.", + "

Instructions

", + "
    ", + "
  • Set the font-weight of the h1 tag to 800.
  • ", + "
  • Set the font-weight of the h2 tag to 600.
  • ", + "
  • Set the font-weight of the h3 tag to 500.
  • ", + "
  • Set the font-weight of the h4 tag to 400.
  • ", + "
  • Set the font-weight of the h5 tag to 300.
  • ", + "
  • Set the font-weight of the h6 tag to 200.
  • ", + "
" + ], + "challengeSeed": [ + "", + "

This is h1 text

", + "

This is h2 text

", + "

This is h3 text

", + "

This is h4 text

", + "
This is h5 text
", + "
This is h6 text
" + ], + "tests": [ + "assert($('h1').css('font-weight') == '800', 'message: Your code should set the 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.", + "

Instructions

", + "Change the value of the 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: Your p 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.", + "

Instructions

", + "Add a 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 the line-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.", + "

Instructions

", + "Change the 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.", + "

Instructions

", + "Change the a tag's CSS so when the user hovers over it, the color is blue and the underline is removed.", + "Note
You can remove underlining of anchor tags using the text-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 {
position: relative;
bottom: 10px;
}
", + "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
Positioning gives you a lot of flexibility and power over the visual layout of a page. It's good to remember that no matter the position of elements, the underlying HTML markup should be organized and make sense when read from top to bottom. This is how users with visual impairments (who rely on assistive devices like screen readers) access your content.", + "

Instructions

", + "Change the 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": [ + " ", + "", + "

On Being Well-Positioned

", + "

Move me!

", + "

I still think the h2 is where it normally sits.

", + "" + ], + "tests": [ + "assert($('h2').css('position') == 'relative', 'message: The h2 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.", + "

Instructions

", + "Use CSS offsets to move the h2 15 pixels to the right and 10 pixels up." + ], + "challengeSeed": [ + "", + " ", + "", + "", + "

On Being Well-Positioned

", + "

Move me!

", + "

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 the h2 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.", + "

Instructions

", + "Lock the #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": [ + "", + "", + "

Welcome!

", + "
", + "
", + " ", + " ", + " ", + "
", + "
", + "" + ], + "tests": [ + "assert($('#searchbar').css('position') == 'absolute', 'message: The #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.", + "

Instructions

", + "The navigation bar in the code is labeled with an id of 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": [ + "", + "", + "
", + "

Welcome!

", + " ", + "
", + "

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.", + "

Instructions

", + "The given markup would work well as a two-column layout, with the 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": [ + "", + " ", + "", + "", + "
", + "

Welcome!

", + "
", + "
", + "

Content

", + "

Good stuff

", + "
", + " ", + "" + ], + "tests": [ + "assert($('#left').css('float') == 'left', 'message: The element with id 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.", + "

Instructions

", + "Add a 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.", + "

Instructions

", + "Center the 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)
green (#00FF00) and magenta (#FF00FF)
blue (#0000FF) and yellow (#FFFF00)
", + "There are many color picking tools available online that have an option to find the complement of a color.", + "Note
For all color challenges: Using color can be a powerful way to add visual interest to a page. However, color alone should not be used as the only way to convey important information because users with visual impairments may not understand that content. This issue will be covered in more detail in the Applied Accessibility challenges.", + "

Instructions

", + "Change the 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)
", + "

Instructions

", + "Change the 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.", + "

Instructions

", + "This page will use a shade of teal (#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": [ + "", + "
", + "

Cooking with FCC!

", + "
", + "
", + "
", + "

Machine Learning in the Kitchen

", + "

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.

", + " ", + "
", + "
", + "

Bisection Vegetable Chopping

", + "

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.

", + " ", + "
", + "
", + "
", + "
©2016 FCC Kitchen
" + ], + "tests": [ + "assert($('header').css('background-color') == 'rgb(9, 167, 161)', 'message: The 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%)
", + "

Instructions

", + "Change the 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.", + "

Instructions

", + "The navigation bar on this site currently inherits its 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": [ + "", + "
", + "

Cooking with FCC!

", + " ", + "
" + ], + "tests": [ + "assert(code.match(/nav\\s*?{\\s*?background-color:\\s*?hsl\\(178,\\s*?80%,\\s*?25%\\)/gi), 'message: The 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));", + "

Instructions

", + "Use a 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.", + "

Instructions

", + "Make stripes by changing the 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.", + "

Instructions

", + "Using the url of 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);
}
", + "

Instructions

", + "Increase the size of the element with the id of 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);}
}
", + "

Instructions

", + "Add a CSS rule for the 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);
}
", + "

Instructions

", + "Skew the element with the id of 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.", + "

Instructions

", + "Skew the element with the id of 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.", + "

Instructions

", + "Manipulate the square element in the editor to create the moon shape. First, change the 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 {
content: \"\";
background-color: yellow;
border-radius: 25%;
position: absolute;
height: 50px;
width: 70px;
top: -50px;
left: 5px;
}
", + "For the :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.", + "

Instructions

", + "Transform the element on the screen to a heart. In the 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 {
animation-name: colorful;
animation-duration: 3s;
}
@keyframes colorful {
0% {
background-color: blue;
}
100% {
background-color: yellow;
}
}
", + "For the element with the 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%.", + "

Instructions

", + "Create an animation for the element with the id 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" />
", + "

Instructions

", + "Use CSS @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;
}
}
", + "

Instructions

", + "Add a horizontal motion to the 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.", + "

Instructions

", + "Target the element with the id of 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.", + "

Instructions

", + "To keep the ball bouncing on the right on a continuous loop, change the 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.", + "

Instructions

", + "Keep the heart beating by adding the 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.", + "

Instructions

", + "Alter the animation rate for the element with the class name of 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.", + "

Instructions

", + "Set the 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.", + "

Instructions

", + "For the elements with id of 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.", + "

Instructions

", + "For the element with the id of 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.", + "

Instructions

", + "To see the effect of this Bezier curve in action, change the 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.", + "

Instructions

", + "Change value of the 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": [ - "

Hello

" - ], - "tests": [ - { - "text": "Your 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:", - "\"A", - "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": [ - "

Hello World

" - ], - "tests": [ - "assert(($(\"h2\").length > 0), 'message: Create an h2 element.');", - "assert(code.match(/<\\/h2>/g) && code.match(/<\\/h2>/g).length === code.match(/

/g).length, 'message: Make sure your 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:", - "\"Ein", - "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 :", - "\"Une", - "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:", - "\"Imagem", - "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 приложение, которое будет похоже на это:", - "\"A", - "Вводимый вами элемент 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": [ - "

Hello World

", - "

CatPhotoApp

" - ], - "tests": [ - "assert(($(\"p\").length > 0), 'message: Create a 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]===\"

\" && code.match(/<([a-z0-9]){1,2}>/g)[1]===\"

\" && code.match(/<([a-z0-9]){1,2}>/g)[2]===\"

\") , '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 World

", - "", - "

CatPhotoApp

", - "", - "

Hello Paragraph

" - ], - "tests": [ - "assert.isTrue((/Kitty(\\s)+ipsum/gi).test($(\"p\").text()), 'message: Your p 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": [ - "

Hello World

", - "", - "

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.

" - ], - "tests": [ - "assert(($(\"h1\").length == 0), 'message: Delete your h1 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 {
  font-family: Helvetica, Sans-Serif;
}
", - "Теперь закомментируйте ваш запрос к Google Fonts, таким образом шрифт 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": [ - "", - "", - "", - "

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\").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 a src 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

", - "", - "\"A", - "", - "

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

", - "", - "\"A", - "", - "

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

", - "", - "\"A", - "", - "

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

", - "", - "\"A", - "", - "

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.", - "\"a", - "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

", - "", - "\"A", - "", - "

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.", - "\"Eine", - "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. ", - " \"un ", - "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.", - " \"diagrama", - "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 использован в середине элемента параграфа, что значит, что ссылка появится в середине предложения.", - "\"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:", - "\"a", - "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", - "", - "\"A", - "", - "

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:", - "\"Eine", - "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:", - "\"un", - "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.", - "\"diagrama", - "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:", - "\"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": [ - "", - "", - "", - "

CatPhotoApp

", - "", - "

Click here to view more cat photos.

", - "", - "\"A", - "", - "

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: Your a 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": [ - "", - "", - "", - "

CatPhotoApp

", - "", - "

Click here for cat photos.

", - "", - "\"A", - "", - "

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 existing img 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>
  <li>milk</li>
  <li>cheese</li>
</ul>
", - "would create a bullet point-style list of \"milk\" and \"cheese\".", - "Remove the last two p elements and create an unordered list of three things that cats love at the bottom of the page." - ], - "challengeSeed": [ - "", - "", - "", - "

CatPhotoApp

", - "", - "

Click here for cat photos.

", - "", - "\"A", - "", - "

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 a ul element.');", - "assert($(\"ul li\").length > 2, 'message: You should have three li elements within your ul element.');", - "assert(code.match(/<\\/ul>/gi) && code.match(/
    /gi).length === code.match(/
      ul element has a closing tag.');", - "assert(code.match(/<\\/li>/gi) && code.match(/]/gi) && code.match(/<\\/li>/gi).length === code.match(/]/gi).length, 'message: Make sure your 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>
        <li>Milch</li>
        <li>Käse</li>
      </ul>
      ", - "würde eine ungeordnete Liste für \"Milch\" und \"Käse\" erstellen.", - "Entferne die letzten zwei 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>
        <li>leche</li>
        <li>queso</li>
      </ul>
      ", - "creará una lista con viñetas y con elementos \"leche\" y \"queso\".", - "Elimina los dos últimos elementos 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>
        <li>milk</li>
        <li>cheese</li>
      </ul>
      ", - "создаст ненумерованный список из \"milk\" и \"cheese\".", - "Удалите последние два элемента 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>
        <li>Garfield</li>
        <li>Sylvester</li>
      </ol>
      ", - "would create a numbered list of \"Garfield\" and \"Sylvester\".", - "Create an ordered list of the top 3 things cats hate the most." - ], - "challengeSeed": [ - "", - "", - "", - "

      CatPhotoApp

      ", - "", - "

      Click here for cat photos.

      ", - "", - "\"A", - "", - "

      Things cats love:

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

      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 three li 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(/
        /g).length, 'message: Make sure your ul element has a closing tag.');", - "assert(code.match(/<\\/ol>/g) && code.match(/<\\/ol>/g).length === code.match(/
          /g).length, 'message: Make sure your ol element has a closing tag.');", - "assert(code.match(/<\\/li>/g) && code.match(/
        1. /g) && code.match(/<\\/li>/g).length === code.match(/
        2. /g).length, 'message: Make sure your 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>
            <li>Garfield</li>
            <li>Sylvester</li>
          </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 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>
            <li>Garfield</li>
            <li>Sylvester</li>
          </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 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>
            <li>Garfield</li>
            <li>Sylvester</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:", - "<input type=\"text\">", - "Note that input elements are self-closing.", - "Create an input element of type text below your lists." - ], - "challengeSeed": [ - "", - "", - "", - "

          CatPhotoApp

          ", - "", - "

          Click here for cat photos.

          ", - "", - "\"A", - "", - "

          Things cats love:

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

          Top 3 things cats hate:

          ", - "
            ", - "
          1. flea treatment
          2. ", - "
          3. thunder
          4. ", - "
          5. other cats
          6. ", - "
          " - ], - "tests": [ - "assert($(\"input[type=text]\").length > 0, 'message: Your app should have an 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": [ - "", - "", - "", - "

          CatPhotoApp

          ", - "", - "

          Click here for cat photos.

          ", - "", - "\"A", - "", - "

          Things cats love:

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

          Top 3 things cats hate:

          ", - "
            ", - "
          1. flea treatment
          2. ", - "
          3. thunder
          4. ", - "
          5. other cats
          6. ", - "
          ", - "" - ], - "tests": [ - "assert($(\"input[placeholder]\").length > 0, 'message: Add a 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": [ - "", - "", - "", - "

          CatPhotoApp

          ", - "", - "

          Click here for cat photos.

          ", - "", - "\"A", - "", - "

          Things cats love:

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

          Top 3 things cats hate:

          ", - "
            ", - "
          1. flea treatment
          2. ", - "
          3. thunder
          4. ", - "
          5. other cats
          6. ", - "
          ", - "" - ], - "tests": [ - "assert($(\"form\") && $(\"form\").children(\"input\") && $(\"form\").children(\"input\").length > 0, 'message: Nest your text input element within a 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(/
          /g) && code.match(/<\\/form>/g).length === code.match(//g).length, 'message: Make sure your form element has well-formed open and close tags.');" - ], - "type": "waypoint", - "challengeType": 0, - "translations": { - "de": { - "title": "Erstelle ein Formular", - "description": [ - "Du kannst Web Formulare bauen, die Daten zu einem Server übertragen – und das nur mit HTML. Das wird möglich, indem du eine Aktion für dein form Element bestimmst.", - "Zum Beispiel:", - "<form action=\"/url-wohin-du-deine-formular-daten-senden-willst\"></form>", - "Umschließe dein Textfeld mit einem form Element. Füge anschließend das Attribut action=\"/submit-cat-photo\" hinzu." - ] - }, - "es": { - "title": "Crea un elemento de formulario", - "description": [ - "Puedes construir formularios web que realmente envíen datos a un servidor usando nada más que HTML puro. Puedes hacerlo especificando una acción en tu elemento form.", - "Por ejemplo:", - "<form action=\"/url-al-que-quieres-enviar-los-datos-del-formulario\"></form>", - "Anida tu campo de texto en un elemento form. Agrega el atributo action=\"/submit-cat-photo\" a este elemento de formulario." - ] - }, - "pt-br": { - "title": "Crie um Elemento de Formulário", - "description": [ - "É possível construir formulários web que realmente enviem dados a um servidor utilizando nada além de HTML puro. Você pode fazer isso especificando uma ação em seu elemento form.", - "Por exemplo:", - "<form action=\"/url-para-onde-você-quer-enviar-os-dados-do-formulário\"></form>", - "Aninhe seu campo de texto em um elemento form. Adicione o atributo action=\"/submit-cat-photo\" para este elemento de formulário." - ] - }, - "ru": { - "title": "Создайте элемент типа форма", - "description": [ - "Вы можете строить web-формы, которые отправляют данные серверу, не ипользуя ничего кроме HTML. Вы можете достичь этого указанием действия в атрибутах элемента form.", - "Например:", - "<form action=\"/url-куда-вы-хотите-отправить-данные-формы\"></form>", - "Вложите ваше текстовое поле в элемент form. Добавьте атрибут action=\"/submit-cat-photo\" к этому элементу формы." - ] - } - } - }, - { - "id": "bad87fee1348bd9aedd08830", - "title": "Add a Submit Button to a Form", - "description": [ - "Let's add a submit button to your form. Clicking this button will send the data from your form to the URL you specified with your form's action attribute.", - "Here's an example submit button:", - "<button type=\"submit\">this button submits the form</button>", - "Add a submit button to your form element with type submit and \"Submit\" as its text." - ], - "challengeSeed": [ - "", - "", - "", - "

          CatPhotoApp

          ", - "", - "

          Click here for cat photos.

          ", - "", - "\"A", - "", - "

          Things cats love:

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

          Top 3 things cats hate:

          ", - "
            ", - "
          1. flea treatment
          2. ", - "
          3. thunder
          4. ", - "
          5. other cats
          6. ", - "
          ", - "", - " ", - "
          " - ], - "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(/", - "" - ], - "tests": [ - "assert($(\"input\").prop(\"required\"), 'message: Your text input element should have the required attribute.');" - ], - "type": "waypoint", - "challengeType": 0, - "translations": { - "de": { - "title": "Nutze HTML5 um ein Pflichtfeld zu erstellen", - "description": [ - "Du kannst bestimmte Felder eines Formulars zu Pflichtfeldern erklären. Damit ist es deinen Usern nicht mehr möglich, das Formular abzuschicken, ohne die Pflichtfelder auszufüllen.", - "Um zum Beispiel ein Textfeld zum Pflichtfeld zu erklären, kannst du einfach ein required innerhalb deines input Elements hinzufügen: <input type=\"text\" required>", - "Mache aus deinem input Feld ein Pflichtfeld – \"required\" – damit deine Nutzer das Formular nicht abschicken können, ohne dieses Feld auszufüllen.", - "Probier dann dein Formular ohne einen Text abzuschicken. Siehst du wie dein HTML5 Formular dich darauf hinweißt dass das Feld verpflichtend ist?", - "Beachte: dieses Feld funktioniert nicht in Safari." - ] - }, - "es": { - "title": "Utiliza HTML5 para especificar campos obligatorios", - "description": [ - "Puedes especificar un campo obligatorio en un formulario para que tu usuario no pueda enviar el formulario hasta que lo haya llenado.", - "Por ejemplo, si quieres requerir obligatoriamente un campo de texto, puedes agregar la palabra required dentro de tu elemento input, usarías: <input type=\"text\" required> ", - "Haz de tu campo de texto un campo obligatorio, de manera que tu usuario no pueda enviar el formulario sin completar este campo.", - "Luego, intenta enviar el formulario sin ingresar texto alguno. ¿Ves cómo tu formulario HTML5 te notifica que el campo es obligatorio?", - "Nota: Este campo no funciona en Safari." - ] - }, - "pt-br": { - "title": "Use HTML5 para Especificar Campos Obrigatórios", - "description": [ - "Você pode especificar um campo como obrigatório para que seu usuário não consiga enviar o formulário até que o tenha completado.", - "Por exemplo, se você quiser tornar obrigatório um campo de texto, basta adicionar a palavra required dentro de seu elemento input assim: <input type=\"text\" required>", - "Faça com que seu campo de texto seja obrigatório, de forma que o usuário não possa enviar o formulário sem ter completado esse campo.", - "Após isso, tente enviar o formulário sem digitar nenhum texto no campo. Percebe como seu formulário HTML5 mostra que o campo é obrigatório?" - ] - }, - "ru": { - "title": "Используйте HTML5, чтобы сделать заполнение поля обязательным", + "title": "Укажите порядок деградации шрифтов", "description": [ - "Вы можете требовать заполнения определённых полей формы, таким образом пользователь не сможет отправить данные формы до их заполнения.", - "Например, если бы вы хотели сделать заполнение текстового поля обязательным, вы могли бы добавить слово required внутрь вашего элемента input: <input type=\"text\" required>", - "Сделайте ваше текстовое поле input обязательным required для заполнения, чтобы пользователь не мог отправить данные формы без заполнения этого поля.", - "Далее попробуйте отправить данные формы без ввода какого-либо текста. Видите как ваша HTML5-форма уведомляет вас о том, что поле обязательное для заполнения?", - "Внимание: это поле не работает в Safari." + "Существует несколько стандартных шрифтов, которые доступны во всех браузерах. Среди них Monospace, Serif и Sans-Serif", + "Когда один шрифт недоступен, вы можете сообщить браузеру \"деградировать\" до другого шрифта.", + "Например, если бы вы хотели, чтобы элемент использовал шрифт Helvetica, но также деградировал до шрифта Sans-Serif, когда Helvetica недоступен, вы могли бы использовать этот CSS-стиль:", + "
          p {
            font-family: Helvetica, Sans-Serif;
          }
          ", + "Теперь закомментируйте ваш запрос к Google Fonts, таким образом шрифт Lobster становится недоступен. Обратите внимание как происходит деградация до шрифта Monospace." ] } } }, { - "id": "bad87fee1348bd9aedf08834", - "title": "Create a Set of Radio Buttons", + "id": "bad87fee1348bd9acdf08812", + "title": "Size your Images", "description": [ - "You can use radio buttons for questions where you want the user to only give you one answer.", - "Radio buttons are a type of input", - "Each of your radio buttons should be nested within its own label element.", - "All related radio buttons should have the same name attribute.", - "Here's an example of a radio button:", - "<label><input type=\"radio\" name=\"indoor-outdoor\"> Indoor</label>", - "Add a pair of radio buttons to your form. One should have the option of indoor and the other should have the option of outdoor." + "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": [ "", @@ -2695,114 +666,76 @@ " font-size: 16px;", " font-family: Monospace;", " }", - "", - " .thick-green-border {", - " border-color: green;", - " border-width: 10px;", - " border-style: solid;", - " border-radius: 50%;", - " }", - "", - " .smaller-image {", - " width: 100px;", - " }", "", "", "

          CatPhotoApp

          ", "", - "

          Click here for cat photos.

          ", - "", - "\"A", + "\"A", "", - "

          Things cats love:

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

          Top 3 things cats hate:

          ", - "
            ", - "
          1. flea treatment
          2. ", - "
          3. thunder
          4. ", - "
          5. other cats
          6. ", - "
          ", - "
          ", - " ", - " ", - "
          " + "

          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($('input[type=\"radio\"]').length > 1, 'message: Your page should have two radio button elements.');", - "assert($('label > input[type=\"radio\"]').filter(\"[name='indoor-outdoor']\").length > 1, 'message: Give your radio buttons the name attribute of indoor-outdoor.');", - "assert($('label > input[type=\"radio\"]:only-child').length > 1, 'message: Each of your two radio button elements should be nested in its own label element.');", - "assert((code.match(/<\\/label>/g) && code.match(/