Merge pull request #6163 from FreeCodeCamp/neutral-redesign

Neutral redesign of site
This commit is contained in:
Quincy Larson
2016-01-15 05:08:57 -08:00
104 changed files with 2097 additions and 2678 deletions

View File

@ -86,7 +86,7 @@
} }
} }
.btn-social(@color-bg, @color: #fff) { .btn-social(@color-bg, @color: @color-bg) {
background-color: @color-bg; background-color: @color-bg;
.button-variant(@color, @color-bg, rgba(0,0,0,.2)); .button-variant(@color, @color-bg, rgba(0,0,0,.2));
} }

View File

@ -32,7 +32,7 @@
&:hover, &:hover,
&:focus, &:focus,
&.focus { &.focus {
color: @btn-default-color; color: @gray-lighter;
text-decoration: none; text-decoration: none;
} }

View File

@ -14,8 +14,8 @@
&:active, &:active,
&.active, &.active,
.open > .dropdown-toggle& { .open > .dropdown-toggle& {
color: @color; color: @gray-lighter;
background-color: darken(@background, 10%); background-color: @background;
border-color: darken(@border, 12%); border-color: darken(@border, 12%);
} }
&:active, &:active,

View File

@ -14,9 +14,9 @@
@gray-light: lighten(@gray-base, 46.7%); // #777 @gray-light: lighten(@gray-base, 46.7%); // #777
@gray-lighter: lighten(@gray-base, 93.5%); // #eee @gray-lighter: lighten(@gray-base, 93.5%); // #eee
@brand-primary: #215f1e; @brand-primary: forestgreen;
@brand-success: #457E86; @brand-success: #457e86;
@brand-info: #4A2B0F; @brand-info: #2b414f;
@brand-warning: #f0ad4e; @brand-warning: #f0ad4e;
@brand-danger: #d9534f; @brand-danger: #d9534f;
@ -26,12 +26,12 @@
//## Settings for some of the most global styles. //## Settings for some of the most global styles.
//** Background color for `<body>`. //** Background color for `<body>`.
@body-bg: #457E86; @body-bg: #ffffff;
//** Global text color on `<body>`. //** Global text color on `<body>`.
@text-color: @gray-dark; @text-color: @gray-dark;
//** Global textual link color. //** Global textual link color.
@link-color: #215f1e; @link-color: @brand-primary;
//** Link hover color set via `darken()` function. //** Link hover color set via `darken()` function.
@link-hover-color: darken(@link-color, 15%); @link-hover-color: darken(@link-color, 15%);
//** Link hover decoration. //** Link hover decoration.
@ -144,27 +144,27 @@
@btn-font-weight: normal; @btn-font-weight: normal;
@btn-default-color: #333; @btn-default-color: #000000;
@btn-default-bg: @gray-lighter; @btn-default-bg: @body-bg;
@btn-default-border: #ccc; @btn-default-border: #000000;
@btn-primary-color: @gray-lighter; @btn-primary-color: @brand-primary;
@btn-primary-bg: @brand-primary; @btn-primary-bg: @brand-primary;
@btn-primary-border: darken(@btn-primary-bg, 5%); @btn-primary-border: darken(@btn-primary-bg, 5%);
@btn-success-color: @gray-lighter; @btn-success-color: @brand-success;
@btn-success-bg: @brand-success; @btn-success-bg: @brand-success;
@btn-success-border: darken(@btn-success-bg, 5%); @btn-success-border: darken(@btn-success-bg, 5%);
@btn-info-color: @gray-lighter; @btn-info-color: @brand-info;
@btn-info-bg: @brand-info; @btn-info-bg: @brand-info;
@btn-info-border: darken(@btn-info-bg, 5%); @btn-info-border: darken(@btn-info-bg, 5%);
@btn-warning-color: @gray-lighter; @btn-warning-color: @brand-warning;
@btn-warning-bg: @brand-warning; @btn-warning-bg: @brand-warning;
@btn-warning-border: darken(@btn-warning-bg, 5%); @btn-warning-border: darken(@btn-warning-bg, 5%);
@btn-danger-color: @gray-lighter; @btn-danger-color: @brand-danger;
@btn-danger-bg: @brand-danger; @btn-danger-bg: @brand-danger;
@btn-danger-border: darken(@btn-danger-bg, 5%); @btn-danger-border: darken(@btn-danger-bg, 5%);
@ -662,7 +662,7 @@
//## //##
//** Background color on `.list-group-item` //** Background color on `.list-group-item`
@list-group-bg: @gray-lighter; @list-group-bg: @body-bg;
//** `.list-group-item` border color //** `.list-group-item` border color
@list-group-border: #ddd; @list-group-border: #ddd;
//** List group border radius //** List group border radius

View File

@ -6,7 +6,6 @@
html,body,div,span,a,li,td,th { html,body,div,span,a,li,td,th {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 300;
} }
bold { bold {
@ -42,17 +41,21 @@ html {
overflow-x: hidden; overflow-x: hidden;
} }
input[type=checkbox] { //input[type=checkbox] {
/* Double-sized Checkboxes */ // /* Double-sized Checkboxes */
-ms-transform: scale(2); /* IE */ // -ms-transform: scale(2); /* IE */
-moz-transform: scale(2); /* FF */ // -moz-transform: scale(2); /* FF */
-webkit-transform: scale(2); /* Safari and Chrome */ // -webkit-transform: scale(2); /* Safari and Chrome */
-o-transform: scale(2); /* Opera */ // -o-transform: scale(2); /* Opera */
padding: 10px; // padding: 10px;
//}
.btn-group {
border-color: @brand-primary;
} }
body.full-screen-body-background { body.full-screen-body-background {
background-color: @gray-lighter; background-color: @body-bg;
} }
@ -69,9 +72,6 @@ h1, h2 {
font-weight: 400; font-weight: 400;
} }
.btn {
font-weight: 400;
}
h1, h2, h3, h4, h5, h6, p, li { h1, h2, h3, h4, h5, h6, p, li {
padding-top: 5px; padding-top: 5px;
@ -113,14 +113,7 @@ h1, h2, h3, h4, h5, h6, p, li {
font-size: 40px; font-size: 40px;
} }
.btn, .shadow { .shadow {
white-space: normal;
-webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
}
.btn, .shadow {
white-space: normal; white-space: normal;
-webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3); -webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3); -moz-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);
@ -226,6 +219,10 @@ ul {
font-size: 24px; font-size: 24px;
} }
.small-p {
font-size: 14px;
}
.map-p { .map-p {
font-size: 20px; font-size: 20px;
} }
@ -242,7 +239,6 @@ ul {
@media (min-width: 767px) { @media (min-width: 767px) {
font-size: 24px; font-size: 24px;
} }
} }
.capitalize { .capitalize {
@ -250,7 +246,7 @@ ul {
} }
.text-success { .text-success {
color: @brand-success; color: @brand-primary;
} }
.fast-animation { .fast-animation {
@ -287,6 +283,8 @@ ul {
margin-right: 10px; margin-right: 10px;
white-space: nowrap; white-space: nowrap;
} }
background-color: @brand-primary;
text-align: center;
} }
.navbar { .navbar {
white-space: nowrap; white-space: nowrap;
@ -327,13 +325,25 @@ ul {
} }
.navbar { .navbar {
background-color: #4a2b0f; background-color: @brand-primary;
}
a {
font-weight: bold;
}
p {
font-size: 20px;
}
.map-aside-body p {
line-height: 1.8;
} }
.navbar-nav > li > a { .navbar-nav > li > a {
color: @gray-lighter; color: @body-bg;
&:hover { &:hover {
color: #4a2b0f; color: @brand-primary;
} }
} }
@ -376,6 +386,11 @@ ul {
} }
.btn-big { .btn-big {
font-size: 20px;
border-radius: 6px;
}
.btn-bigger {
font-size: 30px; font-size: 30px;
} }
@ -384,6 +399,10 @@ ul {
height: 57px; height: 57px;
} }
h4 {
font-size: 26px;
}
.btn-responsive { .btn-responsive {
@media (max-width: 768px) { @media (max-width: 768px) {
font-size: 15px; font-size: 15px;
@ -423,26 +442,14 @@ thead {
} }
} }
.signin-button-nav {
@media (min-width: 991px) and (max-width: 1010px) {
margin-left: -10px;
margin-right: -5px;
}
}
.navbar-nav a { .navbar-nav a {
color: @gray-lighter; color: @body-bg;
font-size: 20px; font-size: 20px;
margin-top: -5px; margin-top: -5px;
margin-bottom: -5px; margin-bottom: -5px;
} }
.navbar-toggle { .navbar-toggle {
color: @gray-lighter; color: @body-bg;
}
.navbar-right {
background-color: #4a2b0f;
text-align: center;
} }
.signup-btn-nav { .signup-btn-nav {
@ -450,6 +457,10 @@ thead {
padding-top: 10px !important; padding-top: 10px !important;
padding-bottom: 10px !important; padding-bottom: 10px !important;
margin-right: -12px; margin-right: -12px;
@media (min-width: 991px) and (max-width: 1010px) {
margin-left: -10px;
margin-right: -5px;
}
} }
.public-profile-img { .public-profile-img {
@ -478,7 +489,7 @@ thead {
} }
.points-on-top { .points-on-top {
color: @gray-lighter; color: @body-bg;
font-size: 35px; font-size: 35px;
z-index: 2; z-index: 2;
width: 60%; width: 60%;
@ -490,7 +501,7 @@ thead {
} }
.landing-skill-icon { .landing-skill-icon {
color: #215f1e; color: @brand-primary;
font-size: 150px; font-size: 150px;
} }
@ -567,7 +578,7 @@ thead {
} }
.challenge-list-header { .challenge-list-header {
background-color: #215f1e; background-color: @brand-primary;
color: @gray-lighter; color: @gray-lighter;
font-size: 36px; font-size: 36px;
text-align: center; text-align: center;
@ -586,7 +597,7 @@ thead {
width: 100%; width: 100%;
height: 50px; height: 50px;
text-align: center; text-align: center;
background-color: #4a2b0f; background-color: @brand-primary;
padding: 12px; padding: 12px;
bottom: 0; bottom: 0;
left: 0; left: 0;
@ -601,7 +612,7 @@ thead {
padding-top: 14px; padding-top: 14px;
padding-bottom: 12px; padding-bottom: 12px;
&:hover { &:hover {
color: #4a2b0f; color: @brand-primary;
background-color: @gray-lighter; background-color: @gray-lighter;
text-decoration: none; text-decoration: none;
} }
@ -727,23 +738,11 @@ iframe.iphone {
min-height: 650px; min-height: 650px;
} }
.btn-primary-ghost { .btn {
font-weight: 400;
white-space: normal;
background: transparent; background: transparent;
color: @brand-primary;
/* CSS Transition */
-webkit-transition: background .2s ease-in-out, border .2s ease-in-out;
-moz-transition: background .2s ease-in-out, border .2s ease-in-out;
-ms-transition: background .2s ease-in-out, border .2s ease-in-out;
-o-transition: background .2s ease-in-out, border .2s ease-in-out;
transition: background .2s ease-in-out, border .2s ease-in-out;
}
.btn-warning-ghost {
background: transparent;
color: @brand-warning;
/* CSS Transition */
-webkit-transition: background .2s ease-in-out, border .2s ease-in-out; -webkit-transition: background .2s ease-in-out, border .2s ease-in-out;
-moz-transition: background .2s ease-in-out, border .2s ease-in-out; -moz-transition: background .2s ease-in-out, border .2s ease-in-out;
-ms-transition: background .2s ease-in-out, border .2s ease-in-out; -ms-transition: background .2s ease-in-out, border .2s ease-in-out;
@ -926,7 +925,7 @@ hr {
} }
.cal-heatmap-container { .cal-heatmap-container {
background-color: @gray-lighter; background-color: @body-bg;
} }
.interested-camper-image { .interested-camper-image {
@ -1014,10 +1013,6 @@ code {
shape-rendering: crispEdges; shape-rendering: crispEdges;
} }
#submitButton {
font: normal normal normal 14px/1 FontAwesome !important;
}
#testSuite > div >.row { #testSuite > div >.row {
margin: 0!important; margin: 0!important;
} }
@ -1139,3 +1134,4 @@ code {
@import "jobs.less"; @import "jobs.less";
@import "challenge.less"; @import "challenge.less";
@import "toastr.less"; @import "toastr.less";
@import "map.less";

130
client/less/map.less Normal file
View File

@ -0,0 +1,130 @@
/*
* based off of https://github.com/gitterHQ/sidecar
* license: MIT
*/
.map-aside {
z-index: 20000;
position: fixed;
top: 0;
left: 60%;
bottom: 0;
right: 0;
display: flex;
flex-direction: row;
background-color: @body-bg;
border-left: 1px solid #333;
box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.3);
transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);
&.is-collapsed {
transform: translateX(110%);
}
/* Add some "extension" so that there isn't a gap
* when we translate(via animation) more than 100% */
&:after {
content: '';
z-index: -1;
position: absolute;
top: 0;
left: 100%;
bottom: 0;
right: -100%;
background-color: @body-bg;
}
@media (max-width: 1150px) {
left: 45%;
}
@media (max-width: 944px) {
left: 30%;
}
@media (max-width: 600px) {
left: 15%;
}
@media (max-width: 500px) {
left: 0;
border-left: none;
}
& > iframe {
flex: 1;
width: 100%;
height: 100%;
border: 0;
overflow: auto;
margin-top: 40px;
}
}
.map-aside-action-bar {
position: absolute;
top: 0;
left: 0;
right: 0;
display: flex;
justify-content: flex-end;
padding-bottom: 0.7em;
background: linear-gradient(to bottom, #ffffff 0%, #ffffff 50%, rgba(255, 255, 255, 0) 100%);
z-index: 100;
}
.map-aside-action-item {
display: flex;
/* main axis */
justify-content: center;
/* cross axis */
align-items: center;
width: 40px;
height: 40px;
padding-left: 0;
padding-right: 0;
opacity: 0.65;
background: none;
background-position: center center;
background-repeat: no-repeat;
background-size: 22px 22px;
border: 0;
outline: none;
cursor: pointer;
cursor: hand;
transition: all 0.2s ease;
&:hover,
&:focus {
opacity: 1;
}
&:active {
filter: hue-rotate(80deg) saturate(150);
}
}
.map-aside-body {
margin: 0 20px 40px 60px
}
.map-aside-action-pop-out {
margin-right: -4px;
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=)
}
.map-aside-action-collapse {
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=)
}

View File

@ -22,14 +22,17 @@ main = (function(main) {
main.chat.GitterChat = e.detail.Chat; main.chat.GitterChat = e.detail.Chat;
main.chat.createHelpChat = function(room, helpChatBtnClass, roomTitle) { main.chat.createHelpChat = function(room, helpChatBtnClass, roomTitle) {
roomTitle = roomTitle || 'Waypoint Help'; // room is always in PascalCase
roomTitle = room
.replace(/([A-Z])/g, ' $1')
.replace('Java Script', 'JavaScript');
$('body').append( $('body').append(
'<aside id="chat-embed-help" class="gitter-chat-embed is-collapsed" />' '<aside id="chat-embed-help" class="gitter-chat-embed is-collapsed" />'
); );
main.chat.helpChat = new main.chat.GitterChat({ main.chat.helpChat = new main.chat.GitterChat({
room: room, room: `freecodecamp/${room}`,
activationElement: false, activationElement: false,
targetElement: $('#chat-embed-help') targetElement: $('#chat-embed-help')
}); });
@ -259,4 +262,19 @@ $(document).ready(function() {
window.ga('send', 'event', 'FB_LINK', 'SHARE', 'Facebook map share'); window.ga('send', 'event', 'FB_LINK', 'SHARE', 'Facebook map share');
window.location.href = link; window.location.href = link;
}); });
// map
$('#nav-map-btn').on('click', () => {
if (!main.isMapAsideLoad) {
var mapAside = $('<iframe>');
mapAside.attr('src', '/map-aside');
$('.map-aside').append(mapAside);
main.isMapAsideLoad = true;
}
$('.map-aside').removeClass('is-collapsed');
});
$('.map-aside-action-collapse').on('click', () => {
$('.map-aside').addClass('is-collapsed');
});
}); });

View File

@ -11,7 +11,6 @@ import {
import navLinks from './links.json'; import navLinks from './links.json';
import FCCNavItem from './NavItem.jsx'; import FCCNavItem from './NavItem.jsx';
const win = typeof window !== 'undefined' ? window : {};
const fCClogo = 'https://s3.amazonaws.com/freecodecamp/freecodecamp_logo.svg'; const fCClogo = 'https://s3.amazonaws.com/freecodecamp/freecodecamp_logo.svg';
const logoElement = ( const logoElement = (
@ -29,16 +28,6 @@ const toggleButtonChild = (
</Col> </Col>
); );
function getDashedName() {
let challengeDashedName;
if (typeof win.localStorage !== 'undefined') {
challengeDashedName = win.localStorage.getItem('currentDashedName');
}
return challengeDashedName && challengeDashedName !== 'undefined' ?
challengeDashedName :
'';
}
export default React.createClass({ export default React.createClass({
displayName: 'Nav', displayName: 'Nav',
@ -76,22 +65,6 @@ export default React.createClass({
}); });
}, },
renderLearnBtn() {
return (
<NavItem
href='#'
onClick={ () => {
const challengeDashedName = getDashedName();
const goTo = challengeDashedName ?
'/challenges/' + challengeDashedName :
'/map';
win.location = goTo;
}}>
Learn
</NavItem>
);
},
renderPoints(username, points) { renderPoints(username, points) {
if (!username) { if (!username) {
return null; return null;
@ -120,12 +93,11 @@ export default React.createClass({
); );
} else { } else {
return ( return (
<FCCNavItem <NavItem
className='btn signup-btn signup-btn-nav signin-button-nav'
eventKey={ 2 } eventKey={ 2 }
href='/login'> href='/login'>
Sign In Sign In
</FCCNavItem> </NavItem>
); );
} }
}, },
@ -144,7 +116,6 @@ export default React.createClass({
className='hamburger-dropdown' className='hamburger-dropdown'
navbar={ true } navbar={ true }
pullRight={ true }> pullRight={ true }>
{ this.renderLearnBtn() }
{ this.renderLinks() } { this.renderLinks() }
{ this.renderPoints(username, points) } { this.renderPoints(username, points) }
{ this.renderSignin(username, picture) } { this.renderSignin(username, picture) }

View File

@ -18,6 +18,6 @@
"link": "/jobs", "link": "/jobs",
"react": true "react": true
},{ },{
"content": "Links", "content": "About",
"link": "/links" "link": "/about"
}] }]

View File

@ -1,10 +1,6 @@
import React, { PropTypes } from 'react'; import React, { PropTypes } from 'react';
import { contain } from 'thundercats-react'; import { contain } from 'thundercats-react';
import { import { Col, Row } from 'react-bootstrap';
Col,
Panel,
Row
} from 'react-bootstrap';
import Lecture from './Lecture.jsx'; import Lecture from './Lecture.jsx';
import Questions from './Questions.jsx'; import Questions from './Questions.jsx';
@ -46,17 +42,19 @@ export default contain(
showQuestions showQuestions
} = this.props; } = this.props;
const videoTitle = <h4>{ title }</h4>;
return ( return (
<Col xs={ 12 }> <Col xs={ 12 }>
<Row> <Row>
<Panel <header className='text-center'>
<h4>{ title }</h4>
</header>
<hr />
<div className='spacer' />
<section
className={ 'text-center' } className={ 'text-center' }
header={ videoTitle }
title={ title }> title={ title }>
{ this.renderBody(showQuestions) } { this.renderBody(showQuestions) }
</Panel> </section>
</Row> </Row>
</Col> </Col>
); );

View File

@ -77,10 +77,13 @@ export default contain(
videoId={ id } /> videoId={ id } />
</Row> </Row>
<Row> <Row>
<article>
{ this.renderTranscript(description, dashedName) } { this.renderTranscript(description, dashedName) }
</article>
<Button <Button
block={ true } block={ true }
bsSize='large' bsSize='large'
bsStyle='primary'
onClick={ () => this.handleFinish(hikesActions) }> onClick={ () => this.handleFinish(hikesActions) }>
Take me to the Questions Take me to the Questions
</Button> </Button>

View File

@ -1,6 +1,6 @@
import React, { PropTypes } from 'react'; import React, { PropTypes } from 'react';
import { Link } from 'react-router'; import { Link } from 'react-router';
import { ListGroup, ListGroupItem, Panel } from 'react-bootstrap'; import { ListGroup, ListGroupItem } from 'react-bootstrap';
export default React.createClass({ export default React.createClass({
displayName: 'HikesMap', displayName: 'HikesMap',
@ -26,9 +26,10 @@ export default React.createClass({
return ( return (
<div> <div>
<Panel> <div className='text-center'>
<h2>Welcome To Hikes!</h2> <h2>Welcome To Hikes!</h2>
</Panel> </div>
<hr />
<ListGroup> <ListGroup>
{ vidElements } { vidElements }
</ListGroup> </ListGroup>

View File

@ -1,7 +1,7 @@
import React, { PropTypes } from 'react'; import React, { PropTypes } from 'react';
import { spring, Motion } from 'react-motion'; import { spring, Motion } from 'react-motion';
import { contain } from 'thundercats-react'; import { contain } from 'thundercats-react';
import { Button, Col, Panel, Row } from 'react-bootstrap'; import { Button, Col, Row } from 'react-bootstrap';
const answerThreshold = 100; const answerThreshold = 100;
@ -107,11 +107,9 @@ export default contain(
WebkitTransform: `translate3d(${ x }px, 0, 0)`, WebkitTransform: `translate3d(${ x }px, 0, 0)`,
transform: `translate3d(${ x }px, 0, 0)` transform: `translate3d(${ x }px, 0, 0)`
}; };
const title = <h4>Question { number }</h4>;
return ( return (
<Panel <article
className={ shake ? 'animated swing shake' : '' } className={ shake ? 'animated swing shake' : '' }
header={ title }
onMouseDown={ hikesActions.grabQuestion } onMouseDown={ hikesActions.grabQuestion }
onMouseLeave={ mouseUp } onMouseLeave={ mouseUp }
onMouseMove={ this.handleMouseMove } onMouseMove={ this.handleMouseMove }
@ -120,8 +118,9 @@ export default contain(
onTouchMove={ this.handleMouseMove } onTouchMove={ this.handleMouseMove }
onTouchStart={ hikesActions.grabQuestion } onTouchStart={ hikesActions.grabQuestion }
style={ style }> style={ style }>
<h4>Question { number }</h4>
<p>{ question }</p> <p>{ question }</p>
</Panel> </article>
); );
}; };
}, },
@ -152,20 +151,24 @@ export default contain(
<Motion style={{ x: spring(x, [120, 10]) }}> <Motion style={{ x: spring(x, [120, 10]) }}>
{ questionElement } { questionElement }
</Motion> </Motion>
<Panel> <div className='spacer' />
<hr />
<div>
<Button <Button
bsSize='large' bsSize='large'
bsStyle='primary'
className='pull-left' className='pull-left'
onClick={ this.onAnswer(answer, false, info) }> onClick={ this.onAnswer(answer, false, info) }>
false false
</Button> </Button>
<Button <Button
bsSize='large' bsSize='large'
bsStyle='primary'
className='pull-right' className='pull-right'
onClick={ this.onAnswer(answer, true, info) }> onClick={ this.onAnswer(answer, true, info) }>
true true
</Button> </Button>
</Panel> </div>
</Row> </Row>
</Col> </Col>
); );

View File

@ -1,43 +0,0 @@
import React, { PropTypes } from 'react';
import { History } from 'react-router';
import { Button, Modal } from 'react-bootstrap';
export default React.createClass({
displayName: 'CreateJobsModal',
propTypes: {
onHide: PropTypes.func,
showModal: PropTypes.bool
},
mixins: [History],
goToNewJob(onHide) {
onHide();
this.history.pushState(null, '/jobs/new');
},
render() {
const {
showModal,
onHide
} = this.props;
return (
<Modal
onHide={ onHide }
show={ showModal }>
<Modal.Body>
<h4>Welcome to Free Code Camp's board</h4>
<p>We post jobs specifically target to our junior developers.</p>
<Button
block={ true }
className='signup-btn'
onClick={ () => this.goToNewJob(onHide) }>
Post a Job
</Button>
</Modal.Body>
</Modal>
);
}
});

View File

@ -1,5 +1,5 @@
import React, { PropTypes } from 'react'; import React, { PropTypes } from 'react';
import { Button, Input, Col, Panel, Row, Well } from 'react-bootstrap'; import { Button, Input, Col, Row, Well } from 'react-bootstrap';
import { contain } from 'thundercats-react'; import { contain } from 'thundercats-react';
// real paypal buttons // real paypal buttons
@ -177,7 +177,7 @@ export default contain(
sm={ 8 } sm={ 8 }
smOffset={ 2 } smOffset={ 2 }
xs={ 12 }> xs={ 12 }>
<Panel> <div>
<Row> <Row>
<Col <Col
md={ 6 } md={ 6 }
@ -262,7 +262,7 @@ export default contain(
</Col> </Col>
</Row> </Row>
<div className='spacer' /> <div className='spacer' />
</Panel> </div>
</Col> </Col>
</Row> </Row>
</div> </div>

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { LinkContainer } from 'react-router-bootstrap'; import { LinkContainer } from 'react-router-bootstrap';
import { Button, Row, Col, Panel } from 'react-bootstrap'; import { Button, Row, Col } from 'react-bootstrap';
export default React.createClass({ export default React.createClass({
displayName: 'NoJobFound', displayName: 'NoJobFound',
@ -12,7 +12,7 @@ export default React.createClass({
<Col <Col
md={ 6 } md={ 6 }
mdOffset={ 3 }> mdOffset={ 3 }>
<Panel> <div>
No job found... No job found...
<LinkContainer to='/jobs'> <LinkContainer to='/jobs'>
<Button <Button
@ -22,7 +22,7 @@ export default React.createClass({
Go to the job board Go to the job board
</Button> </Button>
</LinkContainer> </LinkContainer>
</Panel> </div>
</Col> </Col>
</Row> </Row>
</div> </div>

View File

@ -1,6 +1,6 @@
import React, { cloneElement, PropTypes } from 'react'; import React, { cloneElement, PropTypes } from 'react';
import { contain } from 'thundercats-react'; import { contain } from 'thundercats-react';
import { Button, Panel, Row, Col } from 'react-bootstrap'; import { Button, Row, Col } from 'react-bootstrap';
import ListJobs from './List.jsx'; import ListJobs from './List.jsx';
@ -65,7 +65,6 @@ export default contain(
} = this.props; } = this.props;
return ( return (
<Panel>
<Row> <Row>
<Col <Col
md={ 10 } md={ 10 }
@ -127,7 +126,6 @@ export default contain(
</Row> </Row>
</Col> </Col>
</Row> </Row>
</Panel>
); );
} }
}) })

View File

@ -17,9 +17,7 @@ import {
Button, Button,
Col, Col,
Input, Input,
Row, Row
Panel,
Well
} from 'react-bootstrap'; } from 'react-bootstrap';
import { import {
@ -277,7 +275,7 @@ export default contain({
<Col <Col
md={ 10 } md={ 10 }
mdOffset={ 1 }> mdOffset={ 1 }>
<Panel className='text-center'> <div className='text-center'>
<form <form
className='form-horizontal' className='form-horizontal'
onSubmit={ this.handleSubmit }> onSubmit={ this.handleSubmit }>
@ -292,6 +290,7 @@ export default contain({
xsOffset={ 3 }> xsOffset={ 3 }>
<Row> <Row>
<Button <Button
bsStyle='primary'
className={ isFrontEndCert ? 'active' : '' } className={ isFrontEndCert ? 'active' : '' }
onClick={ () => { onClick={ () => {
if (!isFrontEndCert) { if (!isFrontEndCert) {
@ -310,6 +309,7 @@ export default contain({
<div className='button-spacer' /> <div className='button-spacer' />
<Row> <Row>
<Button <Button
bsStyle='primary'
className={ isBackEndCert ? 'active' : ''} className={ isBackEndCert ? 'active' : ''}
onClick={ () => { onClick={ () => {
if (!isBackEndCert) { if (!isBackEndCert) {
@ -330,6 +330,7 @@ export default contain({
<div className='spacer'> <div className='spacer'>
<h2>Tell us about the position</h2> <h2>Tell us about the position</h2>
</div> </div>
<hr />
<Input <Input
bsStyle={ position.bsStyle } bsStyle={ position.bsStyle }
label='Job Title' label='Job Title'
@ -373,6 +374,8 @@ export default contain({
type='checkbox' type='checkbox'
wrapperClassName={ checkboxClass } /> wrapperClassName={ checkboxClass } />
<div className='spacer' /> <div className='spacer' />
<hr />
<Row> <Row>
<div> <div>
<h2>How should they apply?</h2> <h2>How should they apply?</h2>
@ -391,6 +394,7 @@ export default contain({
</Row> </Row>
<div className='spacer' /> <div className='spacer' />
<hr />
<div> <div>
<h2>Tell us about your organization</h2> <h2>Tell us about your organization</h2>
</div> </div>
@ -432,7 +436,8 @@ export default contain({
wrapperClassName={ inputClass } /> wrapperClassName={ inputClass } />
<div className='spacer' /> <div className='spacer' />
<Well> <hr />
<div>
<div> <div>
<h2>Make it stand out</h2> <h2>Make it stand out</h2>
</div> </div>
@ -463,7 +468,7 @@ export default contain({
checkboxClass.replace('text-left', '') checkboxClass.replace('text-left', '')
} /> } />
</Row> </Row>
</Well> </div>
<Row> <Row>
<Col <Col
@ -480,7 +485,7 @@ export default contain({
</Col> </Col>
</Row> </Row>
</form> </form>
</Panel> </div>
</Col> </Col>
</Row> </Row>
</div> </div>

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { LinkContainer } from 'react-router-bootstrap'; import { LinkContainer } from 'react-router-bootstrap';
import { Button, Panel, Col, Row } from 'react-bootstrap'; import { Button, Col, Row } from 'react-bootstrap';
export default React.createClass({ export default React.createClass({
displayName: 'NewJobCompleted', displayName: 'NewJobCompleted',
@ -8,7 +8,7 @@ export default React.createClass({
render() { render() {
return ( return (
<div className='text-center'> <div className='text-center'>
<Panel> <div>
<Row> <Row>
<h1> <h1>
Your Position has Been Submitted Your Position has Been Submitted
@ -32,7 +32,7 @@ export default React.createClass({
Go to the job board Go to the job board
</Button> </Button>
</LinkContainer> </LinkContainer>
</Panel> </div>
</div> </div>
); );
} }

View File

@ -1,6 +1,6 @@
import React, { PropTypes } from 'react'; import React, { PropTypes } from 'react';
import { Lifecycle } from 'react-router'; import { Lifecycle } from 'react-router';
import { Panel, Button, Row, Col } from 'react-bootstrap'; import { Button, Row, Col } from 'react-bootstrap';
import { contain } from 'thundercats-react'; import { contain } from 'thundercats-react';
import ShowJob from './ShowJob.jsx'; import ShowJob from './ShowJob.jsx';
@ -51,12 +51,14 @@ export default contain(
return ( return (
<div> <div>
<ShowJob job={ job } /> <ShowJob job={ job } />
<div className='spacer'></div>
<hr />
<Row> <Row>
<Col <Col
md={ 10 } md={ 10 }
mdOffset={ 1 } mdOffset={ 1 }
xs={ 12 }> xs={ 12 }>
<Panel> <div>
<Button <Button
block={ true } block={ true }
className='signup-btn' className='signup-btn'
@ -75,7 +77,7 @@ export default contain(
onClick={ () => appActions.goBack() } > onClick={ () => appActions.goBack() } >
Head back and make edits Head back and make edits
</Button> </Button>
</Panel> </div>
</Col> </Col>
</Row> </Row>
</div> </div>

View File

@ -1,5 +1,5 @@
import React, { PropTypes } from 'react'; import React, { PropTypes } from 'react';
import { Well, Row, Col, Thumbnail, Panel } from 'react-bootstrap'; import { Row, Col, Thumbnail } from 'react-bootstrap';
import urlRegexFactory from 'url-regex'; import urlRegexFactory from 'url-regex';
const urlRegex = urlRegexFactory(); const urlRegex = urlRegexFactory();
@ -56,17 +56,18 @@ export default React.createClass({
return ( return (
<Row> <Row>
<hr />
<Col <Col
md={ 6 } md={ 6 }
mdOffset={ 3 }> mdOffset={ 3 }>
<Well> <div>
<bold>{ preview ? 'How do I apply?' : message }</bold> <bold>{ preview ? 'How do I apply?' : message }</bold>
<br /> <br />
<br /> <br />
<span dangerouslySetInnerHTML={{ <span dangerouslySetInnerHTML={{
__html: addATags(howToApply) __html: addATags(howToApply)
}} /> }} />
</Well> </div>
</Col> </Col>
</Row> </Row>
); );
@ -98,7 +99,7 @@ export default React.createClass({
md={ 10 } md={ 10 }
mdOffset={ 1 } mdOffset={ 1 }
xs={ 12 }> xs={ 12 }>
<Panel> <div>
<Row> <Row>
<h2 className='text-center'> <h2 className='text-center'>
{ company } { company }
@ -123,6 +124,7 @@ export default React.createClass({
{ locale ? locale : `${city}, ${state}` } { locale ? locale : `${city}, ${state}` }
</Col> </Col>
</Row> </Row>
<hr />
<div className='spacer' /> <div className='spacer' />
<Row> <Row>
<Col <Col
@ -134,7 +136,7 @@ export default React.createClass({
</Col> </Col>
</Row> </Row>
{ this.renderHowToApply(showApply, preview, message, howToApply) } { this.renderHowToApply(showApply, preview, message, howToApply) }
</Panel> </div>
</Col> </Col>
</Row> </Row>
</div> </div>

View File

@ -1,33 +0,0 @@
import React, { PropTypes } from 'react';
import { Button } from 'react-bootstrap';
const followLink = 'https://twitter.com/intent/follow?' +
'ref_src=twsrc%5Etfw&amp;region=follow_link&amp;screen_name=CamperJobs&' +
'amp;tw_p=followbutton';
function commify(count) {
return Number(count).toLocaleString('en');
}
export default React.createClass({
displayName: 'FollowButton',
propTypes: {
count: PropTypes.number
},
render() {
const { count } = this.props;
return (
<Button
block={ true }
bsSize='large'
bsStyle='primary'
href={ followLink }
target='__blank'>
Join { commify(count) } followers who see our job postings on Twitter.
</Button>
);
}
});

View File

@ -70,6 +70,11 @@
"default": [], "default": [],
"description": "prepended to user code" "description": "prepended to user code"
}, },
"helpRoom": {
"type": "string",
"default": "Help",
"description": "Gitter help chatroom this challenge belongs too. Must be PascalCase"
},
"fileName": { "fileName": {
"type": "string", "type": "string",
"description": "filename challenge comes from. Used in dev mode" "description": "filename challenge comes from. Used in dev mode"

View File

@ -131,7 +131,7 @@ var paths = {
], ],
less: './client/less/main.less', less: './client/less/main.less',
lessFiles: './client/less/*.less', lessFiles: './client/less/**/*.less',
manifest: 'server/manifests/', manifest: 'server/manifests/',
@ -191,7 +191,7 @@ gulp.task('serve', ['build-manifest'], function(cb) {
ignore: paths.serverIgnore, ignore: paths.serverIgnore,
exec: path.join(__dirname, 'node_modules/.bin/babel-node'), exec: path.join(__dirname, 'node_modules/.bin/babel-node'),
env: { env: {
'NODE_ENV': 'development', 'NODE_ENV': process.env.NODE_ENV || 'development',
'DEBUG': process.env.DEBUG || 'freecc:*' 'DEBUG': process.env.DEBUG || 'freecc:*'
} }
}) })
@ -357,10 +357,15 @@ gulp.task('less', function() {
var dest = paths.css; var dest = paths.css;
return gulp.src(paths.less) return gulp.src(paths.less)
.pipe(plumber({ errorHandler: errorHandler })) .pipe(plumber({ errorHandler: errorHandler }))
.pipe(__DEV__ ? sourcemaps.init() : gutil.noop())
// compile // compile
.pipe(less({ .pipe(less({
paths: [ path.join(__dirname, 'less', 'includes') ] paths: [ path.join(__dirname, 'less', 'includes') ]
})) }))
.pipe(__DEV__ ?
sourcemaps.write({ sourceRoot: '/less' }) :
gutil.noop()
)
.pipe(gulp.dest(dest)) .pipe(gulp.dest(dest))
// add revision // add revision
.pipe(rev()) .pipe(rev())

View File

@ -6,7 +6,7 @@
"url": "https://github.com/freecodecamp/freecodecamp.git" "url": "https://github.com/freecodecamp/freecodecamp.git"
}, },
"scripts": { "scripts": {
"only-once": "npm run create-rev && echo '\n\nseeding database\n\n' && node seed && node seed/nonprofits && echo", "only-once": "npm run create-rev && echo '\n\nseeding database\n\n' && node seed && echo '\n\nSeeding Completed\n\n'",
"create-rev": "node -e \"console.log('\\n\\ncreating manifest\\n\\n'); require('fs').writeFileSync('server/rev-manifest.json', '{}');\"", "create-rev": "node -e \"console.log('\\n\\ncreating manifest\\n\\n'); require('fs').writeFileSync('server/rev-manifest.json', '{}');\"",
"build": "NODE_ENV=production gulp build -p", "build": "NODE_ENV=production gulp build -p",
"start": "babel-node server/server.js", "start": "babel-node server/server.js",
@ -14,12 +14,11 @@
"start-production": "node pm2Start", "start-production": "node pm2Start",
"lint": "npm run lint-js && npm run lint-json", "lint": "npm run lint-js && npm run lint-json",
"lint-challenges": "jsonlint -q seed/challenges/**/*.json", "lint-challenges": "jsonlint -q seed/challenges/**/*.json",
"lint-nonprofits": "jsonlint -q seed/nonprofits.json",
"lint-server": "jsonlint -q server/*.json", "lint-server": "jsonlint -q server/*.json",
"lint-resources": "jsonlint -q server/resources/*.json", "lint-resources": "jsonlint -q server/resources/*.json",
"lint-utils": "jsonlint -q server/utils/*.json", "lint-utils": "jsonlint -q server/utils/*.json",
"lint-js": "eslint --ext=.js,.jsx server/ common/ config/ client/", "lint-js": "eslint --ext=.js,.jsx server/ common/ config/ client/",
"lint-json": "npm run lint-server && npm run lint-nonprofits && npm run lint-challenges && npm run lint-resources && npm run lint-utils", "lint-json": "npm run lint-server && npm run && npm run lint-challenges && npm run lint-resources && npm run lint-utils",
"test-challenges": "babel-node seed/test-challenges.js | tap-spec", "test-challenges": "babel-node seed/test-challenges.js | tap-spec",
"pretest": "npm run lint", "pretest": "npm run lint",
"test": "npm run test-challenges" "test": "npm run test-challenges"

View File

@ -1,7 +1,8 @@
{ {
"name": "Getting Started", "name": "Getting Started",
"order": 1, "order": 1,
"time": "15m", "time": "15 minutes",
"helpRoom": "Help",
"challenges": [ "challenges": [
{ {
"id": "560add10cb82ac38a17513be", "id": "560add10cb82ac38a17513be",
@ -9,7 +10,7 @@
"challengeSeed": [], "challengeSeed": [],
"description": [ "description": [
[ [
"http://i.imgur.com/RlEk2IF.jpg", "http://i.imgur.com/4HK5ZFP.jpg",
"A picture of Free Code Camp's 4 benefits: Get connected, Learn JavaScript, Build your Portfolio, Help nonprofits", "A picture of Free Code Camp's 4 benefits: Get connected, Learn JavaScript, Build your Portfolio, Help nonprofits",
"Welcome to Free Code Camp. We're an open source community of busy people who learn to code and help nonprofits.", "Welcome to Free Code Camp. We're an open source community of busy people who learn to code and help nonprofits.",
"" ""
@ -33,27 +34,51 @@
"" ""
], ],
[ [
"http://i.imgur.com/dLx8nrg.jpg", "http://i.imgur.com/pR5le2g.jpg",
"An illustration showing that you will learn HTML5, CSS3, JavaScript, Databases, Git, Node.js, Angular.js and Agile.", "An illustration showing that you will learn HTML5, CSS3, JavaScript, Databases, Git, Node.js, React and D3.",
"During the first half of Free Code Camp, you'll learn technologies like HTML5, Node.js and databases.", "We have hundreds of optional coding challenges that will teach you fundamental web development technologies like HTML5, Node.js and databases.",
"" ""
], ],
[ [
"http://i.imgur.com/syJxavV.jpg", "http://i.imgur.com/fQCeZjk.jpg",
"An image of a camper at a cafe building projects on Free Code Camp.",
"We believe humans learn best by doing. So you'll spend most of your time actually building projects. We'll give you a list of specifications (agile user stories), and you'll figure out how to build apps that fulfill those specifications.",
""
],
[
"http://i.imgur.com/hTyj4f8.jpg",
"An image of showing our front end, back end, and data visualization certifications (400 hours each), our nonprofit projects (800 hours), and interview prep (80 hours) for a total of 2,080 hours of coding experience.",
"Our curriculum is divided into 4 certifications. These certifications are standardized, and instantly verifiable by your freelance clients and future employers. Like everything else at Free Code Camp, these certifications are free. We recommend doing them in order, but you are free to jump around. The first three certifications take 400 hours each, and the final certification takes 800 hours, and involves building real-life projects for nonprofits.",
""
],
[
"http://i.imgur.com/D0NI1mz.jpg",
"A screenshot of our Front End Development Certificate", "A screenshot of our Front End Development Certificate",
"About 400 hours into Free Code Camp, you'll earn your verified Front End Development Certification.", "To earn our verified Front End Development Certification, you'll build 10 projects using HTML, CSS, jQuery, and JavaScript.",
"" ""
], ],
[ [
"http://i.imgur.com/sKYQhdG.jpg", "http://i.imgur.com/V64y2Na.jpg",
"A screenshot of our Full Stack Development Certificate", "A screenshot of our Data Visualization Certificate",
"About 800 hours into Free Code Camp, you'll earn your verified Full Stack Development Certification.", "To earn our Data Visualization Certification, you'll build 10 projects using React, Sass and D3.js.",
""
],
[
"http://i.imgur.com/NeHZ02J.jpg",
"A screenshot of our Back End Development Certificate",
"To earn our Back End Development Certification, you'll build 10 projects using Node.js, Express, and MongoDB. You'll use Git and Heroku to deploy them to the cloud.",
"" ""
], ],
[ [
"http://i.imgur.com/yXyxbDd.jpg", "http://i.imgur.com/yXyxbDd.jpg",
"A screen shot of our nonprofit project directory.", "A screen shot of our nonprofit project directory.",
"Then you'll build several real-life projects for nonprofits. By the time you finish, you'll have a portfolio of real apps that people use every day.", "After you complete all three of these certificates, you'll team up with another camper and use agile software development methodologies to build two real-life projects for nonprofits. You'll also add functionality to two legacy code nonprofit projects. By the time you finish, you'll have a portfolio of real apps that people use every day.",
""
],
[
"http://i.imgur.com/BQYCcLW.jpg",
"An image of campers building projects together in a cafe in Seoul.",
"If you complete all 2,080 hours worth of challenges and projects, you'll earn our Full Stack Development Certification. We'll offer you free coding interview practice. We have a even offer a job board where employers specifically hire campers who've earned Free Code Camp certifications.",
"" ""
] ]
], ],
@ -140,7 +165,7 @@
[ [
"http://i.imgur.com/ALN6zPK.gif", "http://i.imgur.com/ALN6zPK.gif",
"A gif showing you how to click the profile image in the upper right hand corner of GitHub. Upload a photo of yourself or you will continue to use the automatically generated pixel art. Then fill in the remaining form fields and click submit.", "A gif showing you how to click the profile image in the upper right hand corner of GitHub. Upload a photo of yourself or you will continue to use the automatically generated pixel art. Then fill in the remaining form fields and click submit.",
"Click the pixel art in the upper right hand corner of GitHub, then choose settings. <br>Upload a picture of yourself. A picture of your face works best. This is how your fellow campers will see you in our chat rooms, so put your best foot forward. <br>You can add your city and your name if you want.", "Click the pixel art in the upper right hand corner of GitHub, then choose settings. Upload a picture of yourself. A picture of your face works best. This is how your fellow campers will see you in our chat rooms, so put your best foot forward. You can add your city and your name if you want.",
"https://github.com/settings/profile" "https://github.com/settings/profile"
], ],
[ [
@ -152,7 +177,7 @@
[ [
"http://i.imgur.com/zwYPeQT.gif", "http://i.imgur.com/zwYPeQT.gif",
"A gif showing you how to click the link below to go to our chat room and click the \"sign in with GitHub\" button. Then you can click into the text input field and type a message to your fellow campers.", "A gif showing you how to click the link below to go to our chat room and click the \"sign in with GitHub\" button. Then you can click into the text input field and type a message to your fellow campers.",
"Now that you have a GitHub account, you can join our main chat room by logging in with GitHub. Introduce yourself by saying \"Hello world!\". <br>Tell your fellow campers how you found Free Code Camp. Also tell us why you want to learn to code.", "Now that you have a GitHub account, you can join our main chat room by logging in with GitHub. Introduce yourself by saying \"Hello world!\". Tell your fellow campers how you found Free Code Camp. Also tell us why you want to learn to code.",
"https://gitter.im/FreeCodeCamp/FreeCodeCamp" "https://gitter.im/FreeCodeCamp/FreeCodeCamp"
], ],
[ [
@ -206,7 +231,7 @@
[ [
"http://i.imgur.com/ALN6zPK.gif", "http://i.imgur.com/ALN6zPK.gif",
"Un gif mostrandote como pulsar en la imagen de perfil en la esquina superior derecha de GitHub. Sube una foto tuya o continuaras usando la imagen de pixeles generada automáticamente. Entonces llena los campos restantes y haz clic en envíar.", "Un gif mostrandote como pulsar en la imagen de perfil en la esquina superior derecha de GitHub. Sube una foto tuya o continuaras usando la imagen de pixeles generada automáticamente. Entonces llena los campos restantes y haz clic en envíar.",
"En la esquina superior derecha pulsa sobre la imagen de pixeles, entonces selecciona configuraciones. <br>Sube una imagen tuya. Una foto de tu cara es mejor. Así es como tus compañeros campistas te verán en nuestras salas de chat, así que toma tu mejor ángulo. <br>Puedes añadir tu ciudad y tu nombre si lo deseas.", "En la esquina superior derecha pulsa sobre la imagen de pixeles, entonces selecciona configuraciones. Sube una imagen tuya. Una foto de tu cara es mejor. Así es como tus compañeros campistas te verán en nuestras salas de chat, así que toma tu mejor ángulo. Puedes añadir tu ciudad y tu nombre si lo deseas.",
"https://github.com/settings/profile" "https://github.com/settings/profile"
], ],
[ [
@ -218,7 +243,7 @@
[ [
"http://i.imgur.com/zwYPeQT.gif", "http://i.imgur.com/zwYPeQT.gif",
"Un gif mostrandote como pulsar en el enlace inferior para ir a nuestra sala de chat y pulsar en el botón de \"iniciar sesión con GitHub\". Entonces puedes pulsar en el próximo campo de texto y escribir un mensaje a tus compañeros campistas.", "Un gif mostrandote como pulsar en el enlace inferior para ir a nuestra sala de chat y pulsar en el botón de \"iniciar sesión con GitHub\". Entonces puedes pulsar en el próximo campo de texto y escribir un mensaje a tus compañeros campistas.",
"Ahora que tienes una cuenta de GitHub, puedes unirte a nuestro chat principal al iniciar sesión con GitHub. Presentate diciendo \"Hello world!\". <br>Cuéntales a los tus compañeros campistas como encontraste Free Code Camp. Además cuéntanos porque deseas aprender a programar.", "Ahora que tienes una cuenta de GitHub, puedes unirte a nuestro chat principal al iniciar sesión con GitHub. Presentate diciendo \"Hello world!\". Cuéntales a los tus compañeros campistas como encontraste Free Code Camp. Además cuéntanos porque deseas aprender a programar.",
"https://gitter.im/FreeCodeCamp/FreeCodeCamp" "https://gitter.im/FreeCodeCamp/FreeCodeCamp"
], ],
[ [
@ -257,7 +282,7 @@
[ [
"http://i.imgur.com/tP2ccTE.gif", "http://i.imgur.com/tP2ccTE.gif",
"A gif showing how you can click your profile image in your upper right hand corner to your code portfolio and connect GitHub.", "A gif showing how you can click your profile image in your upper right hand corner to your code portfolio and connect GitHub.",
"Check out your code portfolio. Click your picture in your upper right hand corner. To activate your code portfolio, you'll need to link your GitHub account with Free Code Camp. <br>Your code portfolio shows your progress and how many Brownie Points you have. You can get Brownie Points by completing challenges and by helping other campers in our chat rooms. If you get Brownie Points on several days in a row, you'll get a streak.", "Check out your code portfolio. Click your picture in your upper right hand corner. To activate your code portfolio, you'll need to link your GitHub account with Free Code Camp. Your code portfolio shows your progress and how many Brownie Points you have. You can get Brownie Points by completing challenges and by helping other campers in our chat rooms. If you get Brownie Points on several days in a row, you'll get a streak.",
"" ""
] ]
], ],
@ -275,7 +300,7 @@
[ [
"http://i.imgur.com/tP2ccTE.gif", "http://i.imgur.com/tP2ccTE.gif",
"Un gif mostrandore como puedes pulsar en tu imagen de perfil en la esquina superior derecha conectar tu portafolio y GitHub.", "Un gif mostrandore como puedes pulsar en tu imagen de perfil en la esquina superior derecha conectar tu portafolio y GitHub.",
"Dale un vistazo de tu portafolio de código. Da click en tu imagen en la esquina superior derecha. Para activar tu portafolio de código, necesitaras conectar tu cuenta de GitHub con Free Code Camp. <br>Tu portafolio de código muestra tu progreso y cuantos Brownie Points tienes. Puedes obtener Brownie Points completando desafíos y ayudando a otros campistas en nuestras salas de chat. Si obtienes Brownie Points varios días consecutivos, obtendrás una racha.", "Dale un vistazo de tu portafolio de código. Da click en tu imagen en la esquina superior derecha. Para activar tu portafolio de código, necesitaras conectar tu cuenta de GitHub con Free Code Camp. Tu portafolio de código muestra tu progreso y cuantos Brownie Points tienes. Puedes obtener Brownie Points completando desafíos y ayudando a otros campistas en nuestras salas de chat. Si obtienes Brownie Points varios días consecutivos, obtendrás una racha.",
"" ""
] ]
], ],
@ -296,7 +321,7 @@
[ [
"http://i.imgur.com/fTFMjwf.gif", "http://i.imgur.com/fTFMjwf.gif",
"A gif showing how you can click the link below, find your city on the list of Campsites, then click on the Facebook link for your city and join your city's Facebook group.", "A gif showing how you can click the link below, find your city on the list of Campsites, then click on the Facebook link for your city and join your city's Facebook group.",
"Find your city on this list and click it. This will take you to your city's Campsite's Facebook group. <br>Click the \"Join group\" button to apply to join your city's Facebook group. Someone from the campsite should approve you shortly. <br>If your city isn't on this list, scroll to the bottom of the wiki article for instructions for how you can create your city's Campsite.", "Find your city on this list and click it. This will take you to your city's Campsite's Facebook group. Click the \"Join group\" button to apply to join your city's Facebook group. Someone from the campsite should approve you shortly. If your city isn't on this list, scroll to the bottom of the wiki article for instructions for how you can create your city's Campsite.",
"https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites" "https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites"
] ]
], ],
@ -320,7 +345,7 @@
[ [
"http://i.imgur.com/fTFMjwf.gif", "http://i.imgur.com/fTFMjwf.gif",
"Un gif mostrandote como puedes pulsar en el enlace inferior, encontrar tu ciudad en la lista de Campamentos, entonces haz clic en el enlace de Facebook para tu ciudad y unirte al grupo de Facebook de tu ciudad.", "Un gif mostrandote como puedes pulsar en el enlace inferior, encontrar tu ciudad en la lista de Campamentos, entonces haz clic en el enlace de Facebook para tu ciudad y unirte al grupo de Facebook de tu ciudad.",
"Encuentra tu ciudad en esta lista y haz clic en esta. Esto te llevara al grupo de Facebook del Campamento de tu ciudad. <br>Da clic en el botón de \"Unirse al grupo\" para unirte a el grupo. Alguien del mismo campamento debería aprobarte en breve. <br>Si tu ciudad no esta en esta lista, ve al final del articulo de la wiki para ver instrucciones de como crear un campamento para tu ciudad.", "Encuentra tu ciudad en esta lista y haz clic en esta. Esto te llevara al grupo de Facebook del Campamento de tu ciudad. Da clic en el botón de \"Unirse al grupo\" para unirte a el grupo. Alguien del mismo campamento debería aprobarte en breve. Si tu ciudad no esta en esta lista, ve al final del articulo de la wiki para ver instrucciones de como crear un campamento para tu ciudad.",
"https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites" "https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites"
] ]
], ],
@ -377,7 +402,7 @@
[ [
"http://i.imgur.com/ZRgXraT.gif", "http://i.imgur.com/ZRgXraT.gif",
"A gif showing us scrolling through our challenge map.", "A gif showing us scrolling through our challenge map.",
"Now you're ready to start coding. <br>The \"Map\" button in your upper right hand corner will show you our challenge map. <br>We recommend that you complete these from top to bottom, at a sustainable pace. <br>Our open source community is constantly improving our challenges, so don't be surprised if they change or move around. Don't worry about going back - just keep moving forward. <br>You can always go to your most recent challenge by clicking the \"Learn\" button.", "Now you're ready to start coding. The \"Map\" button in your upper right hand corner will show you our challenge map. We recommend that you complete these from top to bottom, at a sustainable pace. Our open source community is constantly improving our challenges, so don't be surprised if they change or move around. Don't worry about going back - just keep moving forward. You can always go to your most recent challenge by clicking the \"Learn\" button.",
"" ""
] ]
], ],
@ -437,7 +462,7 @@
[ [
"http://i.imgur.com/ZRgXraT.gif", "http://i.imgur.com/ZRgXraT.gif",
"Un gif mostrandonos nuestro mapa de desafíos.", "Un gif mostrandonos nuestro mapa de desafíos.",
"Ahora estas listo para empezar a programar. <br>El botón de \"Mapa\" en tu esquina superior derecha te mostrará nuestro mapa de desafíos. <br>Te recomendaos que completes los desafíos de arriba hacía abajo, a un ritmo sostenible. <br>Nuestra comunidad de código abierto esta constantemente mejorando nuestros desafíos, así que no te sorprendas si cambian o se mueven alrededor. No te preocupes por volver hacia atrás - solo continúa avanzando. <br>Siempre puedes ir a tu desafío más reciente pulsando el botón de \"Aprender\".", "Ahora estas listo para empezar a programar. El botón de \"Mapa\" en tu esquina superior derecha te mostrará nuestro mapa de desafíos. Te recomendaos que completes los desafíos de arriba hacía abajo, a un ritmo sostenible. Nuestra comunidad de código abierto esta constantemente mejorando nuestros desafíos, así que no te sorprendas si cambian o se mueven alrededor. No te preocupes por volver hacia atrás - solo continúa avanzando. Siempre puedes ir a tu desafío más reciente pulsando el botón de \"Aprender\".",
"" ""
] ]
], ],

View File

@ -1,7 +1,8 @@
{ {
"name": "Advanced Algorithm Scripting", "name": "Advanced Algorithm Scripting",
"order": 12, "order": 12,
"time": "50h", "time": "50 hours",
"helpRoom": "HelpJavaScript",
"challenges": [ "challenges": [
{ {
"id": "aff0395860f5d3034dc0bfc9", "id": "aff0395860f5d3034dc0bfc9",

View File

@ -1,7 +1,8 @@
{ {
"name": "Basic Algorithm Scripting", "name": "Basic Algorithm Scripting",
"order": 8, "order": 8,
"time": "50h", "time": "50 hours",
"helpRoom": "HelpJavaScript",
"challenges": [ "challenges": [
{ {
"id": "bd7158d2c442eddfbeb5bd1f", "id": "bd7158d2c442eddfbeb5bd1f",

View File

@ -1,7 +1,8 @@
{ {
"name": "Basic JavaScript", "name": "Basic JavaScript",
"time": "10h", "time": "10 hours",
"order": 6, "order": 6,
"helpRoom": "HelpJavaScript",
"challenges": [ "challenges": [
{ {
"id": "bd7123c9c441eddfaeb4bdef", "id": "bd7123c9c441eddfaeb4bdef",

View File

@ -1,7 +1,8 @@
{ {
"name": "Basic Front End Development Projects", "name": "Basic Front End Development Projects",
"order": 9, "order": 9,
"time": "100h", "time": "100 hours",
"helpRoom": "HelpFrontEnd",
"challenges": [ "challenges": [
{ {
"id": "bd7158d8c442eddfbeb5bd1f", "id": "bd7158d8c442eddfbeb5bd1f",
@ -110,13 +111,13 @@
"133315782" "133315782"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/VemmoX/' target='_blank'>http://codepen.io/FreeCodeCamp/full/VemmoX/</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/VemmoX/' target='_blank'>http://codepen.io/FreeCodeCamp/full/VemmoX/</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I can access all of the portfolio webpage's content just by scrolling.", "<strong>User Story:</strong> I can access all of the portfolio webpage's content just by scrolling.",
"<span class='text-info'>User Story:</span> I can click different buttons that will take me to the portfolio creator's different social media pages.", "<strong>User Story:</strong> I can click different buttons that will take me to the portfolio creator's different social media pages.",
"<span class='text-info'>User Story:</span> I can see thumbnail images of different projects the portfolio creator has built (if you haven't built any websites before, use placeholders.)", "<strong>User Story:</strong> I can see thumbnail images of different projects the portfolio creator has built (if you haven't built any websites before, use placeholders.)",
"<span class='text-info'>User Story:</span> I navigate to different sections of the webpage by clicking buttons in the navigation.", "<strong>User Story:</strong> I 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.", "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, but for this challenge, you'll need to build a portfolio page yourself. Using Bootstrap will make this much easier for you.", "There are many great portfolio templates out there, but for this challenge, you'll need to build a portfolio page yourself. Using Bootstrap will make this much easier for you.",
"Note that CodePen.io overrides the Window.open() function, so if you want to open windows using jQuery, you will need to target invisible anchor elements like this one: <code>&lt;a target='_blank'&gt;</a></code>.", "Note that CodePen.io overrides the Window.open() function, so if you want to open windows using jQuery, you will need to target invisible anchor elements like this one: <code>&lt;a target='_blank'&gt;</a></code>.",
@ -180,11 +181,11 @@
"126415122" "126415122"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/yeVgBY' target='_blank'>http://codepen.io/FreeCodeCamp/full/yeVgBY</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/yeVgBY' target='_blank'>http://codepen.io/FreeCodeCamp/full/yeVgBY</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I can click a button to show me a new random quote.", "<strong>User Story:</strong> I can click a button to show me a new random quote.",
"<span class='text-info'>User Story:</span> I can press a button to tweet out a quote.", "<strong>User Story:</strong> I can press a button to tweet out a quote.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -234,12 +235,12 @@
"126411565" "126411565"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/EPNZYW' target='_blank'>http://codepen.io/FreeCodeCamp/full/EPNZYW</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/EPNZYW' target='_blank'>http://codepen.io/FreeCodeCamp/full/EPNZYW</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I can add, subtract, multiply and divide two numbers.", "<strong>User Story:</strong> I can add, subtract, multiply and divide two numbers.",
"<span class='text-info'>User Story:</span> I can clear the input field with a clear button.", "<strong>User Story:</strong> I can clear the input field with a clear button.",
"<span class='text-info'>User Story:</span> I can keep chaining mathematical operations together until I hit the equal button, and the calculator will tell me the correct output.", "<strong>User Story:</strong> 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 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -278,12 +279,12 @@
"126411567" "126411567"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/VemPZX' target='_blank'>http://codepen.io/FreeCodeCamp/full/VemPZX</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/VemPZX' target='_blank'>http://codepen.io/FreeCodeCamp/full/VemPZX</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I can start a 25 minute pomodoro, and the timer will go off once 25 minutes has elapsed.", "<strong>User Story:</strong> I can start a 25 minute pomodoro, and the timer will go off once 25 minutes has elapsed.",
"<span class='text-info'>User Story:</span> I can reset the clock for my next pomodoro.", "<strong>User Story:</strong> I can reset the clock for my next pomodoro.",
"<span class='text-info'>User Story:</span> I can customize the length of each pomodoro.", "<strong>User Story:</strong> I can customize the length of each pomodoro.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."

View File

@ -1,7 +1,8 @@
{ {
"name": "Responsive Design with Bootstrap", "name": "Responsive Design with Bootstrap",
"order": 3, "order": 3,
"time": "5h", "time": "5 hours",
"helpRoom": "Help",
"challenges": [ "challenges": [
{ {
"id": "bad87fee1348bd9acde08712", "id": "bad87fee1348bd9acde08712",

View File

@ -1,7 +1,7 @@
{ {
"name": "Claim Your Front End Development Certificate", "name": "Claim Your Front End Development Certificate",
"order": 13, "order": 13,
"time": "5m", "time": "5 minutes",
"challenges": [ "challenges": [
{ {
"id": "561add10cb82ac38a17513be", "id": "561add10cb82ac38a17513be",
@ -42,10 +42,6 @@
"type": "Waypoint", "type": "Waypoint",
"challengeType": 7, "challengeType": 7,
"tests": [ "tests": [
{
"id": "ad7123c8c441eddfaeb5bdef",
"title": "Meet Bonfire"
},
{ {
"id": "a202eed8fc186c8434cb6d61", "id": "a202eed8fc186c8434cb6d61",
"title": "Reverse a String" "title": "Reverse a String"

View File

@ -1,7 +1,7 @@
{ {
"name": "Gear up for Success", "name": "Gear up for Success",
"order": 4, "order": 4,
"time": "20m", "time": "20 minutes",
"challenges": [ "challenges": [
{ {
"id": "560add65cb82ac38a17513c2", "id": "560add65cb82ac38a17513c2",

View File

@ -1,7 +1,8 @@
{ {
"name": "HTML5 and CSS", "name": "HTML5 and CSS",
"order": 2, "order": 2,
"time": "5h", "time": "5 hours",
"helpRoom": "Help",
"challenges": [ "challenges": [
{ {
"id": "bd7123c8c441eddfaeb5bdef", "id": "bd7123c8c441eddfaeb5bdef",

View File

@ -1,7 +1,8 @@
{ {
"name": "Intermediate Algorithm Scripting", "name": "Intermediate Algorithm Scripting",
"order": 10, "order": 10,
"time": "50h", "time": "50 hours",
"helpRoom": "HelpJavaScript",
"challenges": [ "challenges": [
{ {
"id": "a3566b1109230028080c9345", "id": "a3566b1109230028080c9345",

View File

@ -1,7 +1,8 @@
{ {
"name": "Intermediate Front End Development Projects", "name": "Intermediate Front End Development Projects",
"order": 11, "order": 11,
"time": "200h", "time": "200 hours",
"helpRoom": "HelpFrontEnd",
"challenges": [ "challenges": [
{ {
"id": "bd7158d8c442eddfaeb5bd10", "id": "bd7158d8c442eddfaeb5bd10",
@ -10,12 +11,12 @@
"126415127" "126415127"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/avqvgJ' target='_blank'>http://codepen.io/FreeCodeCamp/full/avqvgJ</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/avqvgJ' target='_blank'>http://codepen.io/FreeCodeCamp/full/avqvgJ</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I can see the weather in my current location.", "<strong>User Story:</strong> I can see the weather in my current location.",
"<span class='text-info'>User Story:</span> I can see a different icon or background image (e.g. snowy mountain, hot desert) depending on the weather.", "<strong>User Story:</strong> I can see a different icon or background image (e.g. snowy mountain, hot desert) depending on the weather.",
"<span class='text-info'>User Story:</span> I can push a button to toggle between Fahrenheit and Celsius.", "<strong>User Story:</strong> I can push a button to toggle between Fahrenheit and Celsius.",
"We recommend using the <a href='http://openweathermap.org/current#geo' target='_blank'>Open Weather API</a>. 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.", "We recommend using the <a href='http://openweathermap.org/current#geo' target='_blank'>Open Weather API</a>. 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 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.", "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.",
@ -70,13 +71,13 @@
"126415129" "126415129"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/pgNRoJ' target='_blank'>http://codepen.io/FreeCodeCamp/full/pgNRoJ</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/pgNRoJ' target='_blank'>http://codepen.io/FreeCodeCamp/full/pgNRoJ</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I can browse recent posts from Camper News.", "<strong>User Story:</strong> I can browse recent posts from Camper News.",
"<span class='text-info'>User Story:</span> I can click on a post to be taken to the story's original URL.", "<strong>User Story:</strong> I can click on a post to be taken to the story's original URL.",
"<span class='text-info'>User Story:</span> I can see how many upvotes each story has.", "<strong>User Story:</strong> I can see how many upvotes each story has.",
"<span class='text-info'>Hint:</span> Here's the Camper News Hot Stories API endpoint: <code>http://www.freecodecamp.com/news/hot</code>.", "<strong>Hint:</strong> Here's the Camper News Hot Stories API endpoint: <code>http://www.freecodecamp.com/news/hot</code>.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -116,14 +117,14 @@
"126415131" "126415131"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/pgNRvJ' target='_blank'>http://codepen.io/FreeCodeCamp/full/pgNRvJ</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/pgNRvJ' target='_blank'>http://codepen.io/FreeCodeCamp/full/pgNRvJ</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I can search Wikipedia entries in a search box and see the resulting Wikipedia entries.", "<strong>User Story:</strong> I can search Wikipedia entries in a search box and see the resulting Wikipedia entries.",
"<span class='text-info'>User Story:</span> I can click a button to see a random Wikipedia entry.", "<strong>User Story:</strong> I can click a button to see a random Wikipedia entry.",
"<span class='text-info'>User Story:</span> When I type in the search box, I can see a dropdown menu with autocomplete options for matching Wikipedia entries.", "<span class='text-info'>Hint #1:</span> Here's a URL you can use to get a random Wikipedia article: <code>http://en.wikipedia.org/wiki/Special:Random</code>.",
"<span class='text-info'>Hint #1:</span> Here's an entry on using Wikipedia's API: <code>http://www.mediawiki.org/wiki/API:Main_page</code>.", "<span class='text-info'>Hint #2:</span> Here's an entry on using Wikipedia's API: <code>http://www.mediawiki.org/wiki/API:Main_page</code>.",
"<span class='text-info'>Hint #2:</span> Use this <a href='https://en.wikipedia.org/wiki/Special:ApiSandbox#action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=jsonfm' target='_blank'>link</a> to experiment with Wikipedia's API.", "<span class='text-info'>Hint #3:</span> Use this <a href='https://en.wikipedia.org/wiki/Special:ApiSandbox#action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=jsonfm' target='_blank'>link</a> to experiment with Wikipedia's API.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -163,16 +164,16 @@
"126411564" "126411564"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/adBpOw' target='_blank'>http://codepen.io/FreeCodeCamp/full/adBpOw</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/adBpOw' target='_blank'>http://codepen.io/FreeCodeCamp/full/adBpOw</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I can see whether Free Code Camp is currently streaming on Twitch.tv.", "<strong>User Story:</strong> I can see whether Free Code Camp is currently streaming on Twitch.tv.",
"<span class='text-info'>User Story:</span> I can click the status output and be sent directly to the Free Code Camp's Twitch.tv channel.", "<strong>User Story:</strong> I can click the status output and be sent directly to the Free Code Camp's Twitch.tv channel.",
"<span class='text-info'>User Story:</span> if a Twitch user is currently streaming, I can see additional details about what they are streaming.", "<strong>User Story:</strong> if a Twitch user is currently streaming, I can see additional details about what they are streaming.",
"<span class='text-info'>User Story:</span> 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.", "<strong>User Story:</strong> 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.",
"<span class='text-info'>Hint:</span> See an example call to Twitch.tv's JSONP API at <code>https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Zipline-Use-the-Twitchtv-JSON-API</code>.", "<strong>Hint:</strong> See an example call to Twitch.tv's JSONP API at <code>https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Zipline-Use-the-Twitchtv-JSON-API</code>.",
"<span class='text-info'>Hint:</span> The relevant documentation about this API call is here: <a href='https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel' target='_blank'>https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel</a>.", "<strong>Hint:</strong> The relevant documentation about this API call is here: <a href='https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel' target='_blank'>https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel</a>.",
"<span class='text-info'>Hint:</span> Here's an array of the Twitch.tv usernames of people who regularly stream coding: <code>[\"freecodecamp\", \"storbeck\", \"terakilobyte\", \"habathcx\",\"RobotCaleb\",\"thomasballinger\",\"noobs2ninjas\",\"beohoff\"]</code>", "<strong>Hint:</strong> Here's an array of the Twitch.tv usernames of people who regularly stream coding: <code>[\"freecodecamp\", \"storbeck\", \"terakilobyte\", \"habathcx\",\"RobotCaleb\",\"thomasballinger\",\"noobs2ninjas\",\"beohoff\"]</code>",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -233,13 +234,13 @@
"126415123" "126415123"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/adBpvw' target='_blank'>http://codepen.io/FreeCodeCamp/full/adBpvw</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/adBpvw' target='_blank'>http://codepen.io/FreeCodeCamp/full/adBpvw</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I can play a game of Tic Tac Toe with the computer.", "<strong>User Story:</strong> I can play a game of Tic Tac Toe with the computer.",
"<span class='text-info'>User Story:</span> I can never actually win against the computer - at best I can tie.", "<strong>User Story:</strong> I can never actually win against the computer - at best I can tie.",
"<span class='text-info'>User Story:</span> My game will reset as soon as it's over so I can play again.", "<strong>User Story:</strong> My game will reset as soon as it's over so I can play again.",
"<span class='text-info'>User Story:</span> I can choose whether I want to play as X or O.", "<strong>User Story:</strong> I can choose whether I want to play as X or O.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -279,19 +280,18 @@
"137213633" "137213633"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/Em-Ant/full/QbRyqq/' target='_blank'>http://codepen.io/FreeCodeCamp/full/obYBjE</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/Em-Ant/full/QbRyqq/' target='_blank'>http://codepen.io/FreeCodeCamp/full/obYBjE</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>User Story:</span> I am presented with a random series of button presses.", "<strong>User Story:</strong> I am presented with a random series of button presses.",
"<span class='text-info'>User Story:</span> each time I input a series of button presses correctly, I see the same series of button presses but with an additional step.", "<strong>User Story:</strong> Each time I input a series of button presses correctly, I see the same series of button presses but with an additional step.",
"<span class='text-info'>User Story:</span> I hear a sound that corresponds to each button both when the series of button presses plays, and when I personally press a button.", "<strong>User Story:</strong> I hear a sound that corresponds to each button both when the series of button presses plays, and when I personally press a button.",
"<span class='text-info'>User Story:</span> 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.", "<strong>User Story:</strong> 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.",
"<span class='text-info'>User Story:</span> I can see how many steps are in the current series of button presses.", "<strong>User Story:</strong> I can see how many steps are in the current series of button presses.",
"<span class='text-info'>User Story:</span> If I want to restart, I can hit a button to do so, and the game will return to a single step.", "<strong>User Story:</strong> If I want to restart, I can hit a button to do so, and the game will return to a single step.",
"<span class='text-info'>User Story:</span> 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.", "<strong>User Story:</strong> 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.",
"<span class='text-info'>User Story:</span> The tempo of the game speeds up incrementally on the 5th, 9th and 13th step.", "<strong>User Story:</strong> I can win the game by getting a series of 20 steps correct. I am notified of my victory, then the game starts over.",
"<span class='text-info'>User Story:</span> I can win the game by getting a series of 20 steps correct. I am notified of my victory, then the game starts over.", "<strong>Hint:</strong> Here are mp3s you can use for each button: <code>https://s3.amazonaws.com/freecodecamp/simonSound1.mp3</code>, <code>https://s3.amazonaws.com/freecodecamp/simonSound2.mp3</code>, <code>https://s3.amazonaws.com/freecodecamp/simonSound3.mp3</code>, <code>https://s3.amazonaws.com/freecodecamp/simonSound4.mp3</code>.",
"<span class='text-info'>Hint:</span> Here are mp3s you can use for each button: <code>https://s3.amazonaws.com/freecodecamp/simonSound1.mp3</code>, <code>https://s3.amazonaws.com/freecodecamp/simonSound2.mp3</code>, <code>https://s3.amazonaws.com/freecodecamp/simonSound3.mp3</code>, <code>https://s3.amazonaws.com/freecodecamp/simonSound4.mp3</code>.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."

View File

@ -1,7 +1,8 @@
{ {
"name": "jQuery", "name": "jQuery",
"order": 5, "order": 5,
"time": "3h", "time": "3 hours",
"helpRoom": "Help",
"challenges": [ "challenges": [
{ {
"id": "bad87fee1348bd9acdd08826", "id": "bad87fee1348bd9acdd08826",

View File

@ -1,7 +1,8 @@
{ {
"name": "JSON APIs and Ajax", "name": "JSON APIs and Ajax",
"order": 10.5, "order": 10.5,
"time": "2h", "time": "2 hours",
"helpRoom": "Help",
"challenges": [ "challenges": [
{ {
"id": "bb000000000000000000001", "id": "bb000000000000000000001",

View File

@ -1,7 +1,8 @@
{ {
"name": "Object Oriented and Functional Programming", "name": "Object Oriented and Functional Programming",
"order": 7, "order": 7,
"time": "2h", "time": "2 hours",
"helpRoom": "HelpJavaScript",
"note": [ "note": [
"Methods", "Methods",
"Closures", "Closures",

View File

@ -2,7 +2,8 @@
"name": "D3", "name": "D3",
"order": 16, "order": 16,
"isComingSoon": true, "isComingSoon": true,
"time": "5h", "time": "5 hours",
"helpRoom": "HelpDataViz",
"challenges": [ "challenges": [
{ {
"id": "bd7158d8c423ede2aab5bdee", "id": "bd7158d8c423ede2aab5bdee",

View File

@ -1,7 +1,7 @@
{ {
"name": "Claim Your Data Visualization Certificate", "name": "Claim Your Data Visualization Certificate",
"order": 18, "order": 18,
"time": "5m", "time": "5 minutes",
"challenges": [ "challenges": [
{ {
"id": "561add10cb82ac38a17513b3", "id": "561add10cb82ac38a17513b3",

View File

@ -1,7 +1,8 @@
{ {
"name": "Data Visualization Projects", "name": "Data Visualization Projects",
"order": 17, "order": 17,
"time": "200h", "time": "200 hours",
"helpRoom": "HelpDataViz",
"challenges": [ "challenges": [
{ {
"id": "bd7168d8c242eddfaeb5bd13", "id": "bd7168d8c242eddfaeb5bd13",
@ -10,13 +11,13 @@
"150324699" "150324699"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/adBBWd' target='_blank'>http://codepen.io/FreeCodeCamp/full/adBBWd</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/adBBWd' target='_blank'>http://codepen.io/FreeCodeCamp/full/adBBWd</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use D3.js to build this project.", "<strong>Rule #3:</strong> You must use D3.js to build this project.",
"<span class='text-info'>User Story:</span> I can see US Gross Domestic Product by quarter, over time.", "<strong>User Story:</strong> I can see US Gross Domestic Product by quarter, over time.",
"<span class='text-info'>User Story:</span> I can mouse over a bar and see a tooltip with the GDP amount and exact year and month that bar represents.", "<strong>User Story:</strong> I can mouse over a bar and see a tooltip with the GDP amount and exact year and month that bar represents.",
"<span class='text-info'>Hint:</span> Here's a dataset you can use to build this: <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json</a>", "<strong>Hint:</strong> Here's a dataset you can use to build this: <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json</a>",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -44,13 +45,13 @@
"150324700" "150324700"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/GoNNEy' target='_blank'>http://codepen.io/FreeCodeCamp/full/GoNNEy</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/GoNNEy' target='_blank'>http://codepen.io/FreeCodeCamp/full/GoNNEy</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use D3.js to build this project.", "<strong>Rule #3:</strong> You must use D3.js to build this project.",
"<span class='text-info'>User Story:</span> I can see performance time visualized in a scatterplot graph.", "<strong>User Story:</strong> I can see performance time visualized in a scatterplot graph.",
"<span class='text-info'>User Story:</span> I can mouse over a plot to see a tooltip with additional details.", "<strong>User Story:</strong> I can mouse over a plot to see a tooltip with additional details.",
"<span class='text-info'>Hint:</span> Here's a dataset you can use to build this: <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/cyclist-data.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/cyclist-data.json</a>", "<strong>Hint:</strong> Here's a dataset you can use to build this: <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/cyclist-data.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/cyclist-data.json</a>",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -78,14 +79,14 @@
"150324701" "150324701"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/rxWWGa' target='_blank'>http://codepen.io/FreeCodeCamp/full/rxWWGa</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/rxWWGa' target='_blank'>http://codepen.io/FreeCodeCamp/full/rxWWGa</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use D3.js to build this project.", "<strong>Rule #3:</strong> You must use D3.js to build this project.",
"<span class='text-info'>User Story:</span> I can view a heat map with data represented both on the Y and X axis.", "<strong>User Story:</strong> I can view a heat map with data represented both on the Y and X axis.",
"<span class='text-info'>User Story:</span> Each cell is colored based its relationship to other data.", "<strong>User Story:</strong> Each cell is colored based its relationship to other data.",
"<span class='text-info'>User Story:</span> I can mouse over a cell in the heat map to get more exact information.", "<strong>User Story:</strong> I can mouse over a cell in the heat map to get more exact information.",
"<span class='text-info'>Hint:</span> Here's a dataset you can use to build this: <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/global-temperature.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/global-temperature.json</a>", "<strong>Hint:</strong> Here's a dataset you can use to build this: <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/global-temperature.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/global-temperature.json</a>",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -113,16 +114,16 @@
"150324458" "150324458"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/KVNNXY' target='_blank'>http://codepen.io/FreeCodeCamp/full/KVNNXY</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/KVNNXY' target='_blank'>http://codepen.io/FreeCodeCamp/full/KVNNXY</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use D3.js to build this project.", "<strong>Rule #3:</strong> You must use D3.js to build this project.",
"<span class='text-info'>User Story:</span> I can see a Force-directed Graph that shows which campers are posting links on Camper News to which domains.", "<strong>User Story:</strong> I can see a Force-directed Graph that shows which campers are posting links on Camper News to which domains.",
"<span class='text-info'>User Story:</span> I can see each camper's icon on their node.", "<strong>User Story:</strong> I can see each camper's icon on their node.",
"<span class='text-info'>User Story:</span> I can see the relationship between the campers and the domains they're posting.", "<strong>User Story:</strong> I can see the relationship between the campers and the domains they're posting.",
"<span class='text-info'>User Story:</span> I can tell approximately many times campers have linked to a specific domain from it's node size.", "<strong>User Story:</strong> I can tell approximately many times campers have linked to a specific domain from it's node size.",
"<span class='text-info'>User Story:</span> I can tell approximately how many times a specific camper has posted a link from their node's size.", "<strong>User Story:</strong> I can tell approximately how many times a specific camper has posted a link from their node's size.",
"<span class='text-info'>Hint:</span> Here's the Camper News Hot Stories API endpoint: <code>http://www.freecodecamp.com/news/hot</code>.", "<strong>Hint:</strong> Here's the Camper News Hot Stories API endpoint: <code>http://www.freecodecamp.com/news/hot</code>.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -150,14 +151,14 @@
"150324698" "150324698"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/mVEJag' target='_blank'>http://codepen.io/FreeCodeCamp/full/mVEJag</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/mVEJag' target='_blank'>http://codepen.io/FreeCodeCamp/full/mVEJag</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use D3.js to build this project.", "<strong>Rule #3:</strong> You must use D3.js to build this project.",
"<span class='text-info'>User Story:</span> I can see where all Meteorites landed on a world map.", "<strong>User Story:</strong> I can see where all Meteorites landed on a world map.",
"<span class='text-info'>User Story:</span> I can tell the relative size of the meteorite, just by looking at the way it's represented on the map.", "<strong>User Story:</strong> I can tell the relative size of the meteorite, just by looking at the way it's represented on the map.",
"<span class='text-info'>User Story:</span> I can mouse over the meteorite's data point for additional data.", "<strong>User Story:</strong> I can mouse over the meteorite's data point for additional data.",
"<span class='text-info'>Hint:</span> Here's a dataset you can use to build this: <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/meteorite-strike-data.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/meteorite-strike-data.json</a>", "<strong>Hint:</strong> Here's a dataset you can use to build this: <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/meteorite-strike-data.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/meteorite-strike-data.json</a>",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."

View File

@ -1,7 +1,8 @@
{ {
"name": "React Projects", "name": "React Projects",
"order": 15, "order": 15,
"time": "200h", "time": "200 hours",
"helpRoom": "HelpDataViz",
"challenges": [ "challenges": [
{ {
"id": "bd7157d8c242eddfaeb5bd13", "id": "bd7157d8c242eddfaeb5bd13",
@ -10,14 +11,14 @@
"150324697" "150324697"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/obYYqW' target='_blank'>http://codepen.io/FreeCodeCamp/full/obYYqW</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/obYYqW' target='_blank'>http://codepen.io/FreeCodeCamp/full/obYYqW</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use both Sass and React to build this project.", "<strong>Rule #3:</strong> You must use both Sass and React to build this project.",
"<span class='text-info'>User Story:</span> I can type GitHub-flavored Markdown into a text area.", "<strong>User Story:</strong> I can type GitHub-flavored Markdown into a text area.",
"<span class='text-info'>User Story:</span> I can see a preview of the output of my markdown that is updated as I type.", "<strong>User Story:</strong> I can see a preview of the output of my markdown that is updated as I type.",
"<span class='text-info'>Hint:</span> You don't need to interperate Markdown yourself - you can import the Marked library for this: <a href='https://cdnjs.com/libraries/marked'>https://cdnjs.com/libraries/marked</a>", "<strong>Hint:</strong> You don't need to interperate Markdown yourself - you can import the Marked library for this: <a href='https://cdnjs.com/libraries/marked'>https://cdnjs.com/libraries/marked</a>",
"<span class='text-info'>Note:</span> If you want to use the React JSX syntax, you need to enable 'Babel' as a preprocessor", "<strong>Note:</strong> If you want to use the React JSX syntax, you need to enable 'Babel' as a preprocessor",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -45,15 +46,15 @@
"150324694" "150324694"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/qbqqJm/' target='_blank'>http://codepen.io/FreeCodeCamp/full/qbqqJm/</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/qbqqJm/' target='_blank'>http://codepen.io/FreeCodeCamp/full/qbqqJm/</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use both Sass and React to build this project.", "<strong>Rule #3:</strong> You must use both Sass and React to build this project.",
"<span class='text-info'>User Story:</span> I can see a table of the Free Code Camp campers who've earned the most brownie points in the past 30 days.", "<strong>User Story:</strong> I can see a table of the Free Code Camp campers who've earned the most brownie points in the past 30 days.",
"<span class='text-info'>User Story:</span> I can see how many brownie points they've earned in the past 30 days, and how many they've earned total.", "<strong>User Story:</strong> I can see how many brownie points they've earned in the past 30 days, and how many they've earned total.",
"<span class='text-info'>User Story:</span> I can toggle between sorting the list by how many bronwie points they've earned in the past 30 days and by how many brownie points they've earned total.", "<strong>User Story:</strong> I can toggle between sorting the list by how many bronwie points they've earned in the past 30 days and by how many brownie points they've earned total.",
"<span class='text-info'>Hint:</span> To get the top 100 campers for the last 30 days: <a href='http://fcctop100.herokuapp.com/api/fccusers/top/recent' target='_blank'>http://fcctop100.herokuapp.com/api/fccusers/top/recent</a>.", "<strong>Hint:</strong> To get the top 100 campers for the last 30 days: <a href='http://fcctop100.herokuapp.com/api/fccusers/top/recent' target='_blank'>http://fcctop100.herokuapp.com/api/fccusers/top/recent</a>.",
"<span class='text-info'>Hint:</span> To get the top 100 campers of all time: <a href='http://fcctop100.herokuapp.com/api/fccusers/top/alltime' target='_blank'>http://fcctop100.herokuapp.com/api/fccusers/top/alltime</a>.", "<strong>Hint:</strong> To get the top 100 campers of all time: <a href='http://fcctop100.herokuapp.com/api/fccusers/top/alltime' target='_blank'>http://fcctop100.herokuapp.com/api/fccusers/top/alltime</a>.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -81,16 +82,16 @@
"150324695" "150324695"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/LGbbqj' target='_blank'>http://codepen.io/FreeCodeCamp/full/LGbbqj</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/LGbbqj' target='_blank'>http://codepen.io/FreeCodeCamp/full/LGbbqj</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use both Sass and React to build this project.", "<strong>Rule #3:</strong> You must use both Sass and React to build this project.",
"<span class='text-info'>User Story:</span> I can create recipes that have names and ingredients.", "<strong>User Story:</strong> I can create recipes that have names and ingredients.",
"<span class='text-info'>User Story:</span> I can see an index view where the names of all the recipes are visible.", "<strong>User Story:</strong> I can see an index view where the names of all the recipes are visible.",
"<span class='text-info'>User Story:</span> I can click into any of those recipes to view it.", "<strong>User Story:</strong> I can click into any of those recipes to view it.",
"<span class='text-info'>User Story:</span> I can edit these recipes.", "<strong>User Story:</strong> I can edit these recipes.",
"<span class='text-info'>User Story:</span> I can delete these recipes.", "<strong>User Story:</strong> I can delete these recipes.",
"<span class='text-info'>User Story:</span> All new recipes I add are saved in my browser's local storage. If I refresh the page, these recipes will still be there.", "<strong>User Story:</strong> All new recipes I add are saved in my browser's local storage. If I refresh the page, these recipes will still be there.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen.", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -118,18 +119,18 @@
"150324459" "150324459"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/dGOOrZ' target='_blank'>http://codepen.io/FreeCodeCamp/full/dGOOrZ</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/dGOOrZ' target='_blank'>http://codepen.io/FreeCodeCamp/full/dGOOrZ</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use both Sass and React to build this project.", "<strong>Rule #3:</strong> You must use both Sass and React to build this project.",
"<span class='text-info'>User Story:</span> When I first arrive at the game, it will randomly generate a board and start playing.", "<strong>User Story:</strong> When I first arrive at the game, it will randomly generate a board and start playing.",
"<span class='text-info'>User Story:</span> I can start and stop the board.", "<strong>User Story:</strong> I can start and stop the board.",
"<span class='text-info'>User Story:</span> I can set up the board.", "<strong>User Story:</strong> I can set up the board.",
"<span class='text-info'>User Story:</span> I can clear the board.", "<strong>User Story:</strong> I can clear the board.",
"<span class='text-info'>User Story:</span> When I press start, the game will play out.", "<strong>User Story:</strong> When I press start, the game will play out.",
"<span class='text-info'>User Story:</span> Each time the board changes, I can see how many generations have gone by.", "<strong>User Story:</strong> Each time the board changes, I can see how many generations have gone by.",
"<span class='text-info'>Hint:</span> Here's an explanation of Conway's Game of Life from John Conway himself: <a href='https://www.youtube.com/watch?v=E8kUJL04ELA' target='_blank'>https://www.youtube.com/watch?v=E8kUJL04ELA</a>", "<strong>Hint:</strong> Here's an explanation of Conway's Game of Life from John Conway himself: <a href='https://www.youtube.com/watch?v=E8kUJL04ELA' target='_blank'>https://www.youtube.com/watch?v=E8kUJL04ELA</a>",
"<span class='text-info'>Hint:</span> Here's an overview of Conway's Game of Life with rules for your reference: <a href='https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life' target='_blank'>https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life</a>", "<strong>Hint:</strong> Here's an overview of Conway's Game of Life with rules for your reference: <a href='https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life' target='_blank'>https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life</a>",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
@ -157,19 +158,19 @@
"150324693" "150324693"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/dGOOEJ/' target='_blank'>http://codepen.io/FreeCodeCamp/full/dGOOEJ/</a>.", "<strong>Objective:</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/dGOOEJ/' target='_blank'>http://codepen.io/FreeCodeCamp/full/dGOOEJ/</a>.",
"<span class='text-info'>Rule #1:</span> Don't look at the example project's code. Figure it out for yourself.", "<strong>Rule #1:</strong> Don't look at the example project's code. Figure it out for yourself.",
"<span class='text-info'>Rule #2:</span> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.", "<strong>Rule #2:</strong> Fulfill the below <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a>. Use whichever libraries or APIs you need. Give it your own personal style.",
"<span class='text-info'>Rule #3:</span> You must use both Sass and React to build this project.", "<strong>Rule #3:</strong> You must use both Sass and React to build this project.",
"<span class='text-info'>User Story:</span> I have health, a level, and a weapon. I can pick up a better weapon. I can pick up health items.", "<strong>User Story:</strong> I have health, a level, and a weapon. I can pick up a better weapon. I can pick up health items.",
"<span class='text-info'>User Story:</span> All the items and enemies on the map are arranged at random.", "<strong>User Story:</strong> All the items and enemies on the map are arranged at random.",
"<span class='text-info'>User Story:</span> I can move throughout a map, discovering items.", "<strong>User Story:</strong> I can move throughout a map, discovering items.",
"<span class='text-info'>User Story:</span> I can move anywhere within the map's boundaries, but I can't move through an enemy until I've beaten it.", "<strong>User Story:</strong> I can move anywhere within the map's boundaries, but I can't move through an enemy until I've beaten it.",
"<span class='text-info'>User Story:</span> Much of the map is hidden. When I take a step, all spaces that are within a certain number of spaces from me are revealed.", "<strong>User Story:</strong> Much of the map is hidden. When I take a step, all spaces that are within a certain number of spaces from me are revealed.",
"<span class='text-info'>User Story:</span> When I beat an enemy, the enemy goes away and I get XP, which eventually increases my level.", "<strong>User Story:</strong> When I beat an enemy, the enemy goes away and I get XP, which eventually increases my level.",
"<span class='text-info'>User Story:</span> When I fight an enemy, we take turns damaging each other until one of us loses. I do damage based off of my level and my weapon. The enemy does damage based off of its level. Damage is somewhat random within a range.", "<strong>User Story:</strong> When I fight an enemy, we take turns damaging each other until one of us loses. I do damage based off of my level and my weapon. The enemy does damage based off of its level. Damage is somewhat random within a range.",
"<span class='text-info'>User Story:</span> When I find and beat the boss, I win.", "<strong>User Story:</strong> When I find and beat the boss, I win.",
"<span class='text-info'>User Story:</span> The game should be challenging, but theoretically winnable.", "<strong>User Story:</strong> The game should be challenging, but theoretically winnable.",
"Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.", "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> if you get stuck.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. ", "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 from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."

View File

@ -2,7 +2,8 @@
"name": "React", "name": "React",
"order": 14, "order": 14,
"isComingSoon": true, "isComingSoon": true,
"time": "5h", "time": "5 hours",
"helpRoom": "HelpDataViz",
"challenges": [ "challenges": [
{ {
"id": "bd7158d8c423ede3aeb5bdee", "id": "bd7158d8c423ede3aeb5bdee",

View File

@ -2,7 +2,8 @@
"name": "Sass", "name": "Sass",
"order": 13.5, "order": 13.5,
"isComingSoon": true, "isComingSoon": true,
"time": "5h", "time": "5 hours",
"helpRoom": "HelpDataViz",
"challenges": [ "challenges": [
{ {
"id": "bd7158d8c423ede2aeb5bdee", "id": "bd7158d8c423ede2aeb5bdee",

View File

@ -1,7 +1,8 @@
{ {
"name": "API Projects", "name": "API Projects",
"order": 26, "order": 26,
"time": "150h", "time": "150 hours",
"helpRoom": "HelpBackEnd",
"challenges": [ "challenges": [
{ {
"id": "bd7158d8c443eddfaeb5bcef", "id": "bd7158d8c443eddfaeb5bcef",
@ -199,12 +200,12 @@
"150324691" "150324691"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that is functionally similar to this: <a href='https://timestamp-ms.herokuapp.com/' target='_blank'>https://timestamp-ms.herokuapp.com/</a> and deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='https://timestamp-ms.herokuapp.com/' target='_blank'>https://timestamp-ms.herokuapp.com/</a> and deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.",
"Here are the specific user stories you should implement for this project:", "Here are the specific user stories you should implement for this project:",
"<span class='text-info'>User Story:</span> I can pass a string as a parameter, and it will check to see whether that string contains either a unix timestamp or a natural language date (example: January 1, 2016).", "<strong>User Story:</strong> I can pass a string as a parameter, and it will check to see whether that string contains either a unix timestamp or a natural language date (example: January 1, 2016).",
"<span class='text-info'>User Story:</span> If it does, it returns both the Unix timestamp and the natural language form of that date.", "<strong>User Story:</strong> If it does, it returns both the Unix timestamp and the natural language form of that date.",
"<span class='text-info'>User Story:</span> If it does not contain a date or Unix timestamp, it returns null for those properties.", "<strong>User Story:</strong> If it does not contain a date or Unix timestamp, it returns null for those properties.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],
@ -231,10 +232,10 @@
"150324460" "150324460"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that is functionally similar to this: <a href='https://cryptic-ridge-9197.herokuapp.com/api/whoami/' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/api/whoami/</a> and deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='https://cryptic-ridge-9197.herokuapp.com/api/whoami/' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/api/whoami/</a> and deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='//challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='//challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.",
"Here's the specific user story you should implement for this project:", "Here's the specific user story you should implement for this project:",
"<span class='text-info'>User Story:</span> I can get the IP address, language and operating system for my browser.", "<strong>User Story:</strong> I can get the IP address, language and operating system for my browser.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],
@ -261,12 +262,12 @@
"150324692" "150324692"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that is functionally similar to this: <a href='https://shurli.herokuapp.com/' target='_blank'>https://shurli.herokuapp.com/</a> and deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='https://shurli.herokuapp.com/' target='_blank'>https://shurli.herokuapp.com/</a> and deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='//challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='//challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.",
"Here are the specific user stories you should implement for this project:", "Here are the specific user stories you should implement for this project:",
"<span class='text-info'>User Story:</span> I can pass a URL as a parameter and I will receive a shortened URL in the JSON response.", "<strong>User Story:</strong> I can pass a URL as a parameter and I will receive a shortened URL in the JSON response.",
"<span class='text-info'>User Story:</span> If I pass an invalid URL that doesn't follow the valid http://www.example.com format, the JSON response will contain an error instead.", "<strong>User Story:</strong> If I pass an invalid URL that doesn't follow the valid http://www.example.com format, the JSON response will contain an error instead.",
"<span class='text-info'>User Story:</span> When I visit that shortened URL, it will redirect me to my original link.", "<strong>User Story:</strong> When I visit that shortened URL, it will redirect me to my original link.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],
@ -293,12 +294,12 @@
"150324461" "150324461"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that allows you to search for images like this: <a href='https://cryptic-ridge-9197.herokuapp.com/api/imagesearch/lolcats%20funny?offset=10' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/api/imagesearch/lolcats%20funny?offset=10</a> and browse recent search queries like this: <a href='https://cryptic-ridge-9197.herokuapp.com/api/latest/imagesearch/' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/api/latest/imagesearch/</a>. Then deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that allows you to search for images like this: <a href='https://cryptic-ridge-9197.herokuapp.com/api/imagesearch/lolcats%20funny?offset=10' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/api/imagesearch/lolcats%20funny?offset=10</a> and browse recent search queries like this: <a href='https://cryptic-ridge-9197.herokuapp.com/api/latest/imagesearch/' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/api/latest/imagesearch/</a>. Then deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='//challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='//challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.",
"Here are the specific user stories you should implement for this project:", "Here are the specific user stories you should implement for this project:",
"<span class='text-info'>User Story:</span> I can get the image URLs, alt text and page urls for a set of images relating to a given search string.", "<strong>User Story:</strong> I can get the image URLs, alt text and page urls for a set of images relating to a given search string.",
"<span class='text-info'>User Story:</span> I can paginate through the responses by adding a ?offset=2 parameter to the URL.", "<strong>User Story:</strong> I can paginate through the responses by adding a ?offset=2 parameter to the URL.",
"<span class='text-info'>User Story:</span> I can get a list of the most recently submitted search strings.", "<strong>User Story:</strong> I can get a list of the most recently submitted search strings.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],
@ -325,12 +326,12 @@
"150324457" "150324457"
], ],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that is functionally similar to this: <a href='https://cryptic-ridge-9197.herokuapp.com/' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/</a> and deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='https://cryptic-ridge-9197.herokuapp.com/' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/</a> and deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='//challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='//challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com//challenges/get-set-for-our-back-end-development-projects</a>.",
"Here are the specific user stories you should implement for this project:", "Here are the specific user stories you should implement for this project:",
"<span class='text-info'>User Story:</span> I can submit a FormData object that includes a file upload.", "<strong>User Story:</strong> I can submit a FormData object that includes a file upload.",
"<span class='text-info'>User Story:</span> When I submit something, I will receive the file size in bytes within the JSON response", "<strong>User Story:</strong> When I submit something, I will receive the file size in bytes within the JSON response",
"<span class='text-info'>Hint:</span> You may want to use this package: <a href='https://www.npmjs.com/package/multer' target='_blank'>https://www.npmjs.com/package/multer</a>", "<strong>Hint:</strong> You may want to use this package: <a href='https://www.npmjs.com/package/multer' target='_blank'>https://www.npmjs.com/package/multer</a>",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],

View File

@ -1,7 +1,8 @@
{ {
"name": "Automated Testing and Debugging", "name": "Automated Testing and Debugging",
"order": 20, "order": 20,
"time": "15m", "time": "15 minutes",
"helpRoom": "HelpBackEnd",
"challenges": [ "challenges": [
{ {
"id":"cf1111c1c16feddfaeb6bdef", "id":"cf1111c1c16feddfaeb6bdef",

View File

@ -1,7 +1,7 @@
{ {
"name": "Claim Your Back End Development Certificate", "name": "Claim Your Back End Development Certificate",
"order": 29, "order": 29,
"time": "5m", "time": "5 minutes",
"challenges": [ "challenges": [
{ {
"id": "660add10cb82ac38a17513be", "id": "660add10cb82ac38a17513be",

View File

@ -1,24 +1,25 @@
{ {
"name": "Dynamic Web Application Projects", "name": "Dynamic Web Application Projects",
"order": 27, "order": 27,
"time": "250h", "time": "250 hours",
"helpRoom": "HelpBackEnd",
"challenges": [ "challenges": [
{ {
"id": "bd7158d8c443eddfaeb5bdef", "id": "bd7158d8c443eddfaeb5bdef",
"title": "Build a Voting App", "title": "Build a Voting App",
"challengeSeed": ["133315786"], "challengeSeed": ["133315786"],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that is functionally similar to this: <a href='http://votingapp.herokuapp.com/' target='_blank'>http://votingapp.herokuapp.com/</a> and deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='http://votingapp.herokuapp.com/' target='_blank'>http://votingapp.herokuapp.com/</a> and deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.",
"Here are the specific user stories you should implement for this project:", "Here are the specific user stories you should implement for this project:",
"<span class='text-info'>User Story:</span> As an authenticated user, I can keep my polls and come back later to access them.", "<strong>User Story:</strong> As an authenticated user, I can keep my polls and come back later to access them.",
"<span class='text-info'>User Story:</span> As an authenticated user, I can share my polls with my friends.", "<strong>User Story:</strong> As an authenticated user, I can share my polls with my friends.",
"<span class='text-info'>User Story:</span> As an authenticated user, I can see the aggregate results of my polls.", "<strong>User Story:</strong> As an authenticated user, I can see the aggregate results of my polls.",
"<span class='text-info'>User Story:</span> As an authenticated user, I can delete polls that I decide I don't want anymore.", "<strong>User Story:</strong> As an authenticated user, I can delete polls that I decide I don't want anymore.",
"<span class='text-info'>User Story:</span> As an authenticated user, I can create a poll with any number of possible items.", "<strong>User Story:</strong> As an authenticated user, I can create a poll with any number of possible items.",
"<span class='text-info'>User Story:</span> As an unauthenticated or authenticated user, I can see and vote on everyone's polls.", "<strong>User Story:</strong> As an unauthenticated or authenticated user, I can see and vote on everyone's polls.",
"<span class='text-info'>User Story:</span> As an unauthenticated or authenticated user, I can see the results of polls in chart form. (This could be implemented using Chart.js or Google Charts.)", "<strong>User Story:</strong> As an unauthenticated or authenticated user, I can see the results of polls in chart form. (This could be implemented using Chart.js or Google Charts.)",
"<span class='text-info'>User Story:</span> As an authenticated user, if I don't like the options on a poll, I can create a new option.", "<strong>User Story:</strong> As an authenticated user, if I don't like the options on a poll, I can create a new option.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],
@ -58,14 +59,14 @@
"title": "Build a Nightlife Coordination App", "title": "Build a Nightlife Coordination App",
"challengeSeed": ["133315781"], "challengeSeed": ["133315781"],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that is functionally similar to this: <a href='http://whatsgoinontonight.herokuapp.com/' target='_blank'>http://whatsgoinontonight.herokuapp.com/</a> and deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='http://whatsgoinontonight.herokuapp.com/' target='_blank'>http://whatsgoinontonight.herokuapp.com/</a> and deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.",
"Here are the specific user stories you should implement for this project:", "Here are the specific user stories you should implement for this project:",
"<span class='text-info'>User Story:</span> As an unauthenticated user, I can view all bars in my area.", "<strong>User Story:</strong> As an unauthenticated user, I can view all bars in my area.",
"<span class='text-info'>User Story:</span> As an authenticated user, I can add myself to a bar to indicate I am going there tonight.", "<strong>User Story:</strong> As an authenticated user, I can add myself to a bar to indicate I am going there tonight.",
"<span class='text-info'>User Story:</span> As an authenticated user, I can remove myself from a bar if I no longer want to go there.", "<strong>User Story:</strong> As an authenticated user, I can remove myself from a bar if I no longer want to go there.",
"<span class='text-info'>User Story:</span> As an unauthenticated user, when I login I should not have to search again.", "<strong>User Story:</strong> As an unauthenticated user, when I login I should not have to search again.",
"<span class='text-info'>Hint:</span> Try using the <a href='https://www.yelp.com/developers/documentation/v2/overview' target='_blank'>Yelp API</a> to find venues in the cities your users search for. If you use Yelp's API, be sure to mention so in your app.", "<strong>Hint:</strong> Try using the <a href='https://www.yelp.com/developers/documentation/v2/overview' target='_blank'>Yelp API</a> to find venues in the cities your users search for. If you use Yelp's API, be sure to mention so in your app.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],
@ -102,13 +103,13 @@
"title": "Chart the Stock Market", "title": "Chart the Stock Market",
"challengeSeed": ["133315787"], "challengeSeed": ["133315787"],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that is functionally similar to this: <a href='http://stockstream.herokuapp.com/' target='_blank'>http://stockstream.herokuapp.com/</a> and deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='http://stockstream.herokuapp.com/' target='_blank'>http://stockstream.herokuapp.com/</a> and deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.",
"Here are the specific user stories you should implement for this project:", "Here are the specific user stories you should implement for this project:",
"<span class='text-info'>User Story:</span> I can view a graph displaying the recent trend lines for each added stock.", "<strong>User Story:</strong> I can view a graph displaying the recent trend lines for each added stock.",
"<span class='text-info'>User Story:</span> I can add new stocks by their symbol name.", "<strong>User Story:</strong> I can add new stocks by their symbol name.",
"<span class='text-info'>User Story:</span> I can remove stocks.", "<strong>User Story:</strong> I can remove stocks.",
"<span class='text-info'>User Story:</span> I can see changes in real-time when any other user adds or removes a stock. For this you will need to use Web Sockets.", "<strong>User Story:</strong> I can see changes in real-time when any other user adds or removes a stock. For this you will need to use Web Sockets.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],
@ -144,13 +145,13 @@
"title": "Manage a Book Trading Club", "title": "Manage a Book Trading Club",
"challengeSeed": ["133316032"], "challengeSeed": ["133316032"],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that is functionally similar to this: <a href='http://bookjump.herokuapp.com/' target='_blank'>http://bookjump.herokuapp.com/</a> and deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='http://bookjump.herokuapp.com/' target='_blank'>http://bookjump.herokuapp.com/</a> and deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.",
"Here are the specific user stories you should implement for this project:", "Here are the specific user stories you should implement for this project:",
"<span class='text-info'>User Story:</span> I can view all books posted by every user.", "<strong>User Story:</strong> I can view all books posted by every user.",
"<span class='text-info'>User Story:</span> I can add a new book.", "<strong>User Story:</strong> I can add a new book.",
"<span class='text-info'>User Story:</span> I can update my settings to store my full name, city, and state.", "<strong>User Story:</strong> I can update my settings to store my full name, city, and state.",
"<span class='text-info'>User Story:</span> I can propose a trade and wait for the other user to accept the trade.", "<strong>User Story:</strong> I can propose a trade and wait for the other user to accept the trade.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],
@ -186,16 +187,16 @@
"title": "Build a Pinterest Clone", "title": "Build a Pinterest Clone",
"challengeSeed": ["133315784"], "challengeSeed": ["133315784"],
"description": [ "description": [
"<span class='text-info'>Objective:</span> Build a full stack JavaScript app that is functionally similar to this: <a href='http://stark-lowlands-3680.herokuapp.com/' target='_blank'>http://stark-lowlands-3680.herokuapp.com/</a> and deploy it to Heroku.", "<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='http://stark-lowlands-3680.herokuapp.com/' target='_blank'>http://stark-lowlands-3680.herokuapp.com/</a> and deploy it to Heroku.",
"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.", "Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.com/challenges/get-set-for-our-back-end-development-projects</a>.",
"Here are the specific user stories you should implement for this project:", "Here are the specific user stories you should implement for this project:",
"<span class='text-info'>User Story:</span> As an unauthenticated user, I can login with Twitter.", "<strong>User Story:</strong> As an unauthenticated user, I can login with Twitter.",
"<span class='text-info'>User Story:</span> As an authenticated user, I can link to images.", "<strong>User Story:</strong> As an authenticated user, I can link to images.",
"<span class='text-info'>User Story:</span> As an authenticated user, I can delete images that I've linked to.", "<strong>User Story:</strong> As an authenticated user, I can delete images that I've linked to.",
"<span class='text-info'>User Story:</span> As an authenticated user, I can see a Pinterest-style wall of all the images I've linked to.", "<strong>User Story:</strong> As an authenticated user, I can see a Pinterest-style wall of all the images I've linked to.",
"<span class='text-info'>User Story:</span> As an unauthenticated user, I can browse other users' walls of images.", "<strong>User Story:</strong> As an unauthenticated user, I can browse other users' walls of images.",
"<span class='text-info'>User Story:</span> As an authenticated user, if I upload an image that is broken, it will be replaced by a placeholder image. (can use jQuery broken image detection)", "<strong>User Story:</strong> As an authenticated user, if I upload an image that is broken, it will be replaced by a placeholder image. (can use jQuery broken image detection)",
"<span class='text-info'>Hint:</span> <a href='http://masonry.desandro.com/' target='_blank'>Masonry.js</a> is a library that allows for Pinterest-style image grids.", "<strong>Hint:</strong> <a href='http://masonry.desandro.com/' target='_blank'>Masonry.js</a> is a library that allows for Pinterest-style image grids.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.", "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.",
"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)." "You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/codereview' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook)."
], ],

View File

@ -1,7 +1,8 @@
{ {
"name": "Git", "name": "Git",
"order" : 24, "order" : 24,
"time": "3h", "time": "3 hours",
"helpRoom": "HelpBackEnd",
"challenges": [ "challenges": [
{ {
"id": "bd7353d8c341eddeaeb5bd0f", "id": "bd7353d8c341eddeaeb5bd0f",

View File

@ -1,7 +1,8 @@
{ {
"name": "MongoDB", "name": "MongoDB",
"order" : 25, "order" : 25,
"time": "3h", "time": "3 hours",
"helpRoom": "HelpBackEnd",
"challenges": [ "challenges": [
{ {
"id": "bd7243d8c341eddeaeb5bd0f", "id": "bd7243d8c341eddeaeb5bd0f",

View File

@ -1,7 +1,8 @@
{ {
"name": "Node.js and Express.js", "name": "Node.js and Express.js",
"order" : 24, "order" : 24,
"time": "20h", "time": "20 hours",
"helpRoom": "HelpBackEnd",
"challenges": [ "challenges": [
{ {
"id": "bd7153d8c441eddfaeb5bd0f", "id": "bd7153d8c441eddfaeb5bd0f",

View File

@ -1,7 +1,7 @@
{ {
"name": "Computer Basics", "name": "Computer Basics",
"order": 0, "order": 0,
"time": "3h", "time": "3 hours",
"challenges": [ "challenges": [
{ {
"id": "bd7128d8c441eddfbeb5bddf", "id": "bd7128d8c441eddfbeb5bddf",

View File

@ -1,7 +1,7 @@
{ {
"name": "Programming", "name": "Programming",
"order": 0.050, "order": 0.050,
"time": "3h", "time": "3 hours",
"challenges": [ "challenges": [
{ {
"id": "bd712bd8c441eddfbeb5bddf", "id": "bd712bd8c441eddfbeb5bddf",

View File

@ -22,6 +22,8 @@ destroy()
var isBeta = !!challengeSpec.isBeta; var isBeta = !!challengeSpec.isBeta;
var isComingSoon = !!challengeSpec.isComingSoon; var isComingSoon = !!challengeSpec.isComingSoon;
var fileName = challengeSpec.fileName; var fileName = challengeSpec.fileName;
var helpRoom = challengeSpec.helpRoom || 'Help';
console.log('parsed %s successfully', block); console.log('parsed %s successfully', block);
// challenge file has no challenges... // challenge file has no challenges...
@ -31,11 +33,7 @@ destroy()
var challenges = challengeSpec.challenges var challenges = challengeSpec.challenges
.map(function(challenge, index) { .map(function(challenge, index) {
// NOTE(berks): add title for displaying in views challenge.name = challenge.title.replace(/[^a-zA-Z0-9\s]/g, '');
challenge.name =
_.capitalize(challenge.type) +
': ' +
challenge.title.replace(/[^a-zA-Z0-9\s]/g, '');
challenge.dashedName = challenge.name challenge.dashedName = challenge.name
.toLowerCase() .toLowerCase()
@ -43,6 +41,7 @@ destroy()
.replace(/\s/g, '-'); .replace(/\s/g, '-');
challenge.fileName = fileName; challenge.fileName = fileName;
challenge.helpRoom = helpRoom;
challenge.order = order; challenge.order = order;
challenge.suborder = index + 1; challenge.suborder = index + 1;
challenge.block = block; challenge.block = block;

View File

@ -1,29 +0,0 @@
/* eslint-disable no-process-exit */
require('babel/register');
require('dotenv').load();
var Rx = require('rx');
var app = require('../server/server');
var Nonprofits = app.models.Nonprofit;
var nonprofits = require('./nonprofits.json');
var destroy = Rx.Observable.fromNodeCallback(Nonprofits.destroyAll, Nonprofits);
var create = Rx.Observable.fromNodeCallback(Nonprofits.create, Nonprofits);
destroy()
.flatMap(function() {
if (!nonprofits) {
return Rx.Observable.throw(new Error('No nonprofits found'));
}
return create(nonprofits);
})
.subscribe(
function(nonprofits) {
console.log('successfully saved %d nonprofits', nonprofits.length);
},
function(err) { throw err; },
function() {
console.log('nonprofit seed completed');
process.exit(0);
}
);

View File

@ -1,329 +0,0 @@
[
{
"whatDoesNonprofitDo": "We help the many less-fortunate Jewish families in our community, by providing them with nutritious food and energy to grow, learn, work, and give them hope for a better and brighter future.",
"websiteLink": "http://chasdeikaduri.org/",
"name": "Chasdei Kaduri",
"endUser": "Clients, donors, and admin.",
"approvedDeliverables": [
"website",
"donor",
"inventory",
"volunteer",
"form"
],
"projectDescription": "Campers will create a system will integrate the food inventory, donor and delivery driver management systems as well as replace the current application system with a custom form solution. System will include a more streamlined operations management, with user printable lists of inventory, drivers, and deliveries.",
"logoUrl": "http://i.imgur.com/zQiM0P8.png",
"imageUrl": "http://i.imgur.com/xeRdA87.jpg",
"estimatedHours": 300,
"currentStatus": "completed",
"moneySaved": 60000
},
{
"whatDoesNonprofitDo": "We connect simple technology with last mile communities to reduce poverty.",
"websiteLink": "http://kopernik.info/",
"name": "Kopernik",
"endUser": "Women in rural Indonesia.",
"approvedDeliverables": [
"other"
],
"projectDescription": "Campers will create a Chrome browser extension to preserve sales data from a form, and upload in batches as the internet connection allows.",
"logoUrl": "http://i.imgur.com/xTqjIkC.png",
"imageUrl": "http://i.imgur.com/xBAUJSa.jpg",
"estimatedHours": 100,
"currentStatus": "completed",
"moneySaved": 20000
},
{
"whatDoesNonprofitDo": "We distribute biodegradable toothbrushes globally to children in need.",
"websiteLink": "http://www.operationbrush.org/",
"name": "Operation Brush",
"endUser": "Donors",
"approvedDeliverables": [
"website"
],
"projectDescription": "Campers will create a mobile responsive website for the organization, with donation capabilities.",
"logoUrl": "http://i.imgur.com/DEDhImE.png",
"imageUrl": "http://i.imgur.com/RuA9Rgy.jpg",
"estimatedHours": 100,
"currentStatus": "completed",
"moneySaved": 20000
},
{
"whatDoesNonprofitDo": "We are the largest roller derby league in the world with around 250 adults and 150 junior skater members plus 500+ volunteers.",
"websiteLink": "http://www.rosecityrollers.com/about/our-charities/",
"name": "Rose City Rollers",
"endUser": "Roller derby administrators, coaches, and volunteers",
"approvedDeliverables": [
"community"
],
"projectDescription": "Campers will create a volunteer management system with multi-user access and reporting capabilities.",
"logoUrl": "http://i.imgur.com/ZZAZSs4.jpg",
"imageUrl": "http://i.imgur.com/WKS4cZ8.jpg",
"estimatedHours": 200,
"currentStatus": "completed",
"moneySaved": 40000
},
{
"whatDoesNonprofitDo": "We provide urgently needed pediatric heart surgery and follow-up care for indigent children from developing countries",
"websiteLink": "http://www.saveachildsheart.com/global/young-leadership-program/",
"name": "Save a Child's Heart",
"endUser": "Donors",
"approvedDeliverables": [
"website"
],
"projectDescription": "Campers will create a single page fundraising website. In exchange for a donation, a user can customize a graphical 'heart' in someone's name or anonymously. The page will display all of the hearts on a 'wall of hearts.'",
"logoUrl": "http://i.imgur.com/t6tpiEW.jpg",
"imageUrl": "http://i.imgur.com/xqhvdn2.jpg",
"estimatedHours": 200,
"currentStatus": "completed",
"moneySaved": 40000
},
{
"whatDoesNonprofitDo": "We empower youth with technology by providing age appropriate resources and education.",
"websiteLink": "http://savvycyberkids.org/",
"name": "Savvy Cyber Kids",
"endUser": "Donors",
"approvedDeliverables": [
"website"
],
"projectDescription": "Campers will create a website where potential donors can view which schools already have the Savvy Cyber Kids books, and donate books to those schools that do not.",
"logoUrl": "http://i.imgur.com/JgxYVJ5.png",
"imageUrl": "http://i.imgur.com/ZTg12ao.jpg",
"estimatedHours": 200,
"currentStatus": "completed",
"moneySaved": 40000
},
{
"whatDoesNonprofitDo": "We bring a new edge to arts and medicine in the Bay Area through powerful live performances of new music to those who feel marginalized by their affliction.",
"websiteLink": "http://transcendentpathways.org/",
"name": "Transcendent Pathways",
"endUser": "Medical Facilities, Musicians",
"approvedDeliverables": [
"other"
],
"projectDescription": "Campers will build a website where medical facilities can list music therapy time slots, and musicians can sign up to fill these slots.",
"logoUrl": "http://i.imgur.com/JV4rcKX.png",
"imageUrl": "http://i.imgur.com/gyhrPee.jpg",
"estimatedHours": 200,
"currentStatus": "completed",
"moneySaved": 40000
},
{
"whatDoesNonprofitDo": "We have provide volunteer matching fairs and silent art auctions at events across Canada. Rather than bid money on artwork, participants bid volunteer hours.",
"websiteLink": "http://www.timeraiser.ca/",
"name": "Timeraiser",
"endUser": "Working professionals who want to donate their time and expertise",
"approvedDeliverables": [
"other"
],
"projectDescription": "Campers will build a mobile responsive web form to allow Timeraiser eventgoers to select which nonprofit organizations they're interested in volunteering with. System will have Salesforce integration and reporting capabilities.",
"logoUrl": "http://i.imgur.com/USK8ld7.png",
"imageUrl": "http://i.imgur.com/7apWppe.jpg",
"estimatedHours": 200,
"currentStatus": "completed",
"moneySaved": 40000
},
{
"whatDoesNonprofitDo": "We focus on raising funds to assist injured homeless animals.",
"websiteLink": "http://www.peoplesavinganimals.org/",
"name": "People Saving Animals",
"endUser": "Animal shelters in Central America and people adopting pets",
"approvedDeliverables": [
"website",
"inventory",
"form"
],
"projectDescription": "Campers will build an adoption database and all related web interfaces and forms to allow animal shelters to easily post animals, photos, and relevant medical information. They'll make it easy for locals to browse these animals and adopt them. Once completed, this project will be translated into Spanish.",
"logoUrl": "http://i.imgur.com/iKcKcpg.jpg",
"imageUrl": "http://i.imgur.com/b9ZeU7R.jpg",
"estimatedHours": 300,
"currentStatus": "completed",
"moneySaved": 60000
},
{
"whatDoesNonprofitDo": "We preserve Florida's health by regulating septic contractors and reviewing logs of sewage collection and disposal.",
"websiteLink": "http://www.floridahealth.gov/",
"name": "Florida Department of Health",
"endUser": "Government workers and independent contractors who must comply with regulations.",
"approvedDeliverables": [
"inventory",
"form",
"other"
],
"projectDescription": "Campers will build mobile responsive web forms to allow contractors to seamlessly log the chain of custody for potentially hazardous sewage. They'll also build a government-facing database that allows for easy monitoring and reporting of activity.",
"logoUrl": "http://i.imgur.com/J3Scbsp.png",
"imageUrl": "http://i.imgur.com/8LEFrKy.jpg",
"estimatedHours": 200,
"currentStatus": "completed",
"moneySaved": 40000
},
{
"whatDoesNonprofitDo": "We strengthen the value of songwriting and independent music in Columbus, Ohio.",
"websiteLink": "http://columbussongwritersassociation.com",
"name": "Columbus Songwriters Association",
"endUser": "Songwriters and their audiences in the Columbus, Ohio community.",
"approvedDeliverables": [
"website"
],
"projectDescription": "Build mobile responsive website that allows users to see browse our partners, their photos and information, and connect with them.",
"logoUrl": "http://i.imgur.com/UN85TI4.jpg",
"imageUrl": "http://i.imgur.com/NFxL1oS.jpg",
"estimatedHours": 100,
"currentStatus": "completed",
"moneySaved": 20000
},
{
"whatDoesNonprofitDo": "We leverage all the benefits of cycling to support and improve the lives of youth and teens in the Triangle region.",
"websiteLink": "http://www.trianglebikeworks.org",
"name": "Triangle Bike Works",
"endUser": "Youth and teens in the Triangle region.",
"approvedDeliverables": [
"website"
],
"projectDescription": "Campers will build a website with donation integration.",
"logoUrl": "http://i.imgur.com/T5OkXuT.png",
"imageUrl": "http://i.imgur.com/7bOaMPq.jpg",
"estimatedHours": 100,
"currentStatus": "open",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "We work to eradicate female genital mutilation in the US and Gambia. We work with survivors and communities.",
"websiteLink": "http://safehandsforgirls.org/",
"name": "Safe Hands for Girls",
"endUser": "Supporters",
"approvedDeliverables": [
"website"
],
"projectDescription": "Campers will build a website with donation management.",
"logoUrl": "http://i.imgur.com/QnAY6Ji.png",
"imageUrl": "http://i.imgur.com/s9E4oa9.jpg",
"estimatedHours": 100,
"currentStatus": "open",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "We're a part of the Department of Psychiatry at Mass General Hospital. We teach an innovative way for helping people that have challenging behaviors.",
"websiteLink": "http://www.thinkkids.org/",
"name": "Think Kids at Massachusetts General Hospital",
"endUser": "Volunteers, Administrators",
"approvedDeliverables": [
"volunteer"
],
"projectDescription": "We would like help developing a simple online based portal for both our trainees and trainers where we can store and share documents, track their progress, and incorporate a blackboard/chat forum.",
"logoUrl": "http://i.imgur.com/fu6dTmH.png",
"imageUrl": "http://i.imgur.com/hiGJms5.png",
"estimatedHours": 300,
"currentStatus": "started",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "We enable, educate, and empower students from rural backgrounds in Uttar Pradesh, India.",
"websiteLink": "http://www.milaan.in/",
"name": "Milaan",
"endUser": "Supporters",
"approvedDeliverables": [
"website"
],
"projectDescription": "Campers will build a basic website for the US operations of Milaan. ",
"logoUrl": "http://i.imgur.com/GLq1qqD.png",
"imageUrl": "http://i.imgur.com/PkMHQ8N.jpg",
"estimatedHours": 100,
"currentStatus": "open",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "We're committed to closing the opportunity gap for children in Baltimore City by providing high quality after school and in-school programs.",
"websiteLink": "http://childfirstauthority.org/",
"name": "Child First Authority",
"endUser": "School Coordinators",
"approvedDeliverables": [
"volunteer"
],
"projectDescription": "Campers will build a dynamic database that will allow 7 community school coordinators to (1) input student-level absenteeism data, (2) code and track outreach efforts, (3) code root causes for absenteeism, and (4) track trends in each area. Currently, Child First uses an unwieldy excel spreadsheet to do this.",
"logoUrl": "http://i.imgur.com/YlPsQmN.jpg",
"imageUrl": "http://i.imgur.com/Z2RfQku.gifv",
"estimatedHours": 200,
"currentStatus": "started",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "We are an interdisciplinary team that works towards harmony among humans and nature through three distinct branches: sustainable agriculture, environmental education and applied and appropriate technology; focused in Líbano, Tolima, Colombia.",
"websiteLink": "",
"name": "QET America",
"endUser": "Donors",
"approvedDeliverables": ["Website"],
"projectDescription": "Campers will build a multiple language website (English, Spanish) that accepts donations.",
"logoUrl": "http://i.imgur.com/jPuiPOy.jpg",
"imageUrl": "http://i.imgur.com/zaaL2pj.jpg",
"estimatedHours": 100,
"currentStatus": "open",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "1to1 Movement provides free environmental education in schools",
"websiteLink": "http://1to1movement.org/",
"name": "1 to 1 Movement",
"endUser": "Pledgers",
"approvedDeliverables": ["Web App"],
"projectDescription": "Campers will build a simple, social, data-driven application that allows people to see the impact of their actions. User can make a pledge and track the outcome. Will make use of the D3.js visualization library.",
"logoUrl": "http://i.imgur.com/jaqxg0O.png",
"imageUrl": "http://i.imgur.com/GXSWTZw.jpg",
"estimatedHours": 300,
"currentStatus": "open",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "Our missions is to elevate the national dialogue and engage the American people around climate change policy and the promotion of real clean energy solutions in the United States.",
"websiteLink": "http://www.usclimateplan.org/",
"name": "US Climate Plan",
"endUser": "Donors",
"approvedDeliverables": ["Website"],
"projectDescription": "Campers will build a basic website for sharing information, feeds from different campaigns websites.",
"logoUrl": "http://i.imgur.com/uAyUiMN.png",
"imageUrl": "http://i.imgur.com/2Og5tqy.jpg",
"estimatedHours": 100,
"currentStatus": "open",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "We empower the community through improved literacy.",
"websiteLink": "http://www.tleliteracy.com/",
"name": "The Learning Exchange",
"endUser": "Community members",
"approvedDeliverables": ["Website"],
"projectDescription": "Campers will build a simple website to replace essentialskillsquebec.com. Site will host many documents related to the Nine Essential Skills.",
"logoUrl": "http://i.imgur.com/jXQY01H.png",
"imageUrl": "http://i.imgur.com/iUXBpeL.jpg",
"estimatedHours": 100,
"currentStatus": "started",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "Options Inc. is an organization that was founded in 1979 to assist adults with disabilities in living and working in the community. We provide transportation to approximately 230 individuals.",
"websiteLink": "www.options-inc.org",
"name": "Options Inc.",
"endUser": "Administrators and Persons with Disabilities",
"approvedDeliverables": ["Web App"],
"projectDescription": "Campers will build a system to store all of Options Inc.'s clients addresses, optimize routes for our 23 vehicles, and schedule their staff for these routes.",
"logoUrl": "http://i.imgur.com/jGWRMuF.jpg",
"imageUrl": "http://i.imgur.com/VUuJJlM.jpg",
"estimatedHours": 300,
"currentStatus": "open",
"moneySaved": 0
},
{
"whatDoesNonprofitDo": "Our goal is to improve addiction treatment and recovery services through targeted outreach, policy development, and direct support services for addicts, their families and health professionals.",
"websiteLink": "http://www.taadas.org/",
"name": "Tennessee Association of Alcohol Drug and other Addiction Services",
"endUser": "Administrators and Persons with Disabilities",
"approvedDeliverables": ["Website"],
"projectDescription": "Campers will build a modern, mobile-responsive website.",
"logoUrl": "http://i.imgur.com/kYHgY0F.jpg",
"imageUrl": "http://i.imgur.com/W6L1sGV.jpg",
"estimatedHours": 100,
"currentStatus": "open",
"moneySaved": 0
}
]

37
server/boot/about.js Normal file
View File

@ -0,0 +1,37 @@
import dedent from 'dedent';
import moment from 'moment';
import { observeMethod } from '../utils/rx';
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
export default function about(app) {
const router = app.loopback.Router();
const User = app.models.User;
const userCount$ = observeMethod(User, 'count');
function showAbout(req, res, next) {
const daysRunning = moment().diff(new Date('10/15/2014'), 'days');
userCount$()
.map(camperCount => numberWithCommas(camperCount))
.doOnNext(camperCount => {
res.render('resources/about', {
camperCount,
daysRunning,
title: dedent`
About our Open Source Community, our social media presence,
and how to contact us`.split('\n').join(' '),
globalCompletedCount: numberWithCommas(
5612952 + (Math.floor((Date.now() - 1446268581061) / 2000))
)
});
})
.subscribe(() => {}, next);
}
router.get('/about', showAbout);
app.use(router);
}

View File

@ -31,15 +31,14 @@ const isDev = process.env.NODE_ENV !== 'production';
const isBeta = !!process.env.BETA; const isBeta = !!process.env.BETA;
const debug = debugFactory('freecc:challenges'); const debug = debugFactory('freecc:challenges');
const challengesRegex = /^(bonfire|waypoint|zipline|basejump|checkpoint)/i; const challengesRegex = /^(bonfire|waypoint|zipline|basejump|checkpoint)/i;
const firstChallenge = 'waypoint-learn-how-free-code-camp-works';
const challengeView = { const challengeView = {
0: 'coursewares/showHTML', 0: 'challenges/showHTML',
1: 'coursewares/showJS', 1: 'challenges/showJS',
2: 'coursewares/showVideo', 2: 'challenges/showVideo',
3: 'coursewares/showZiplineOrBasejump', 3: 'challenges/showZiplineOrBasejump',
4: 'coursewares/showZiplineOrBasejump', 4: 'challenges/showZiplineOrBasejump',
5: 'coursewares/showBonfire', 5: 'challenges/showBonfire',
7: 'coursewares/showStep' 7: 'challenges/showStep'
}; };
function isChallengeCompleted(user, challengeId) { function isChallengeCompleted(user, challengeId) {
@ -50,9 +49,11 @@ function isChallengeCompleted(user, challengeId) {
challenge.id === challengeId ); challenge.id === challengeId );
} }
/*
function numberWithCommas(x) { function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
} }
*/
function updateUserProgress(user, challengeId, completedChallenge) { function updateUserProgress(user, challengeId, completedChallenge) {
let { completedChallenges } = user; let { completedChallenges } = user;
@ -116,6 +117,213 @@ function shouldNotFilterComingSoon({ isComingSoon, isBeta: challengeIsBeta }) {
(isBeta && challengeIsBeta); (isBeta && challengeIsBeta);
} }
function getRenderData$(user, challenge$, origChallengeName, solution) {
const challengeName = unDasherize(origChallengeName)
.replace(challengesRegex, '');
const testChallengeName = new RegExp(challengeName, 'i');
debug('looking for %s', testChallengeName);
return challenge$
.map(challenge => challenge.toJSON())
.filter((challenge) => {
return testChallengeName.test(challenge.name) &&
shouldNotFilterComingSoon(challenge);
})
.last({ defaultValue: null })
.flatMap(challenge => {
if (challenge && isDev) {
return getFromDisk$(challenge);
}
return Observable.just(challenge);
})
.flatMap(challenge => {
// Handle not found
if (!challenge) {
debug('did not find challenge for ' + origChallengeName);
return Observable.just({
type: 'redirect',
redirectUrl: '/map',
message: dedent`
404: We couldn\'t find a challenge with the name ${origChallengeName}.
Please double check the name.
`
});
}
if (dasherize(challenge.name) !== origChallengeName) {
let redirectUrl = `/challenges/${dasherize(challenge.name)}`;
if (solution) {
redirectUrl += `?solution=${encodeURIComponent(solution)}`;
}
return Observable.just({
type: 'redirect',
redirectUrl
});
}
// save user does nothing if user does not exist
return Observable.just({
data: {
...challenge,
// identifies if a challenge is completed
isCompleted: isChallengeCompleted(user, challenge.id),
// video challenges
video: challenge.challengeSeed[0],
// bonfires specific
bonfires: challenge,
MDNkeys: challenge.MDNlinks,
MDNlinks: getMDNLinks(challenge.MDNlinks),
// htmls specific
verb: randomVerb(),
phrase: randomPhrase(),
compliment: randomCompliment()
}
});
});
}
function getCompletedChallengeIds(user = {}) {
// if user
// get the id's of all the users completed challenges
return !user.completedChallenges ?
[] :
_.uniq(user.completedChallenges)
.map(({ id, _id }) => id || _id);
}
// create a stream of an array of all the challenge blocks
function getSuperBlocks$(challenge$, completedChallenges) {
return challenge$
// mark challenge completed
.map(challengeModel => {
const challenge = challengeModel.toJSON();
if (completedChallenges.indexOf(challenge.id) !== -1) {
challenge.completed = true;
}
challenge.markNew = shouldShowNew(challenge);
return challenge;
})
// group challenges by block | returns a stream of observables
.groupBy(challenge => challenge.block)
// turn block group stream into an array
.flatMap(block$ => block$.toArray())
.map(blockArray => {
const completedCount = blockArray.reduce((sum, { completed }) => {
if (completed) {
return sum + 1;
}
return sum;
}, 0);
const isBeta = _.every(blockArray, 'isBeta');
const isComingSoon = _.every(blockArray, 'isComingSoon');
const isRequired = _.every(blockArray, 'isRequired');
return {
isBeta,
isComingSoon,
isRequired,
name: blockArray[0].block,
superBlock: blockArray[0].superBlock,
dashedName: dasherize(blockArray[0].block),
markNew: shouldShowNew(null, blockArray),
challenges: blockArray,
completed: completedCount / blockArray.length * 100,
time: blockArray[0] && blockArray[0].time || '???'
};
})
// filter out hikes
.filter(({ superBlock }) => {
return !(/hikes/i).test(superBlock);
})
// turn stream of blocks into a stream of an array
.toArray()
.flatMap(blocks => Observable.from(blocks, null, null, Scheduler.default))
.groupBy(block => block.superBlock)
.flatMap(blocks$ => blocks$.toArray())
.map(superBlockArray => ({
name: superBlockArray[0].superBlock,
blocks: superBlockArray
}))
.toArray();
}
function getChallengeById$(challenge$, challengeId) {
// return first challenge if no id is given
if (!challengeId) {
return challenge$
.map(challenge => challenge.toJSON())
.filter(shouldNotFilterComingSoon)
// filter out hikes
.filter(({ superBlock }) => !(/hikes/gi).test(superBlock))
.first();
}
return challenge$
.map(challenge => challenge.toJSON())
// filter out challenges coming soon
.filter(shouldNotFilterComingSoon)
// filter out hikes
.filter(({ superBlock }) => !(/hikes/gi).test(superBlock))
.filter(({ id }) => id === challengeId);
}
function getNextChallenge$(challenge$, blocks$, challengeId) {
return getChallengeById$(challenge$, challengeId)
// now lets find the block it belongs to
.flatMap(challenge => {
// find the index of the block this challenge resides in
const blockIndex$ = blocks$
.findIndex(({ name }) => name === challenge.block);
return blockIndex$
.flatMap(blockIndex => {
// could not find block?
if (blockIndex === -1) {
return Observable.throw(
'could not find challenge block for ' + challenge.block
);
}
const firstChallengeOfNextBlock$ = blocks$
.elementAt(blockIndex + 1, {})
.map(({ challenges = [] }) => challenges[0]);
return blocks$
.filter(shouldNotFilterComingSoon)
.elementAt(blockIndex)
.flatMap(block => {
// find where our challenge lies in the block
const challengeIndex$ = Observable.from(
block.challenges,
null,
null,
Scheduler.default
)
.findIndex(({ id }) => id === challengeId);
// grab next challenge in this block
return challengeIndex$
.map(index => {
return block.challenges[index + 1];
})
.flatMap(nextChallenge => {
if (!nextChallenge) {
return firstChallengeOfNextBlock$;
}
return Observable.just(nextChallenge);
});
});
});
})
.first();
}
module.exports = function(app) { module.exports = function(app) {
const router = app.loopback.Router(); const router = app.loopback.Router();
@ -166,9 +374,17 @@ module.exports = function(app) {
}) })
.shareReplay(); .shareReplay();
const User = app.models.User; const firstChallenge$ = challenge$
const userCount$ = observeMethod(User, 'count'); .first()
.map(challenge => challenge.toJSON())
.shareReplay();
const lastChallenge$ = challenge$
.last()
.map(challenge => challenge.toJSON())
.shareReplay();
const User = app.models.User;
const send200toNonUser = ifNoUserSend(true); const send200toNonUser = ifNoUserSend(true);
router.post( router.post(
@ -182,88 +398,60 @@ module.exports = function(app) {
completedZiplineOrBasejump completedZiplineOrBasejump
); );
router.get('/map', challengeMap); router.get('/map', showMap.bind(null, false));
router.get('/map-aside', showMap.bind(null, true));
router.get(
'/challenges/current-challenge',
redirectToCurrentChallenge
);
router.get( router.get(
'/challenges/next-challenge', '/challenges/next-challenge',
returnNextChallenge redirectToNextChallenge
); );
router.get('/challenges/:challengeName', returnIndividualChallenge); router.get('/challenges/:challengeName', showChallenge);
app.use(router); app.use(router);
function returnNextChallenge(req, res, next) { function redirectToCurrentChallenge(req, res, next) {
let nextChallengeName = firstChallenge; let challengeId = req.query.id || req.cookies.currentChallengeId;
// prevent serialized null/undefined from breaking things
const challengeId = req.query.id; if (challengeId === 'undefined' || challengeId === 'null') {
challengeId = null;
// find challenge }
return challenge$ getChallengeById$(challenge$, challengeId)
.map(challenge => challenge.toJSON()) .doOnNext(({ dashedName })=> {
// filter out challenges coming soon if (!dashedName) {
.filter(shouldNotFilterComingSoon) debug('no challenge found for %s', challengeId);
// filter out hikes req.flash('info', {
.filter(({ superBlock }) => !(/hikes/gi).test(superBlock)) msg: `We coudn't find a challenge with the id ${challengeId}`
.filter(({ id }) => id === challengeId) });
// now lets find the block it belongs to res.redirect('/map');
.flatMap(challenge => { }
// find the index of the block this challenge resides in res.redirect('/challenges/' + dashedName);
const blockIndex$ = blocks$ })
.findIndex(({ name }) => name === challenge.block); .subscribe(() => {}, next);
return blockIndex$
.flatMap(blockIndex => {
// could not find block?
if (blockIndex === -1) {
return Observable.throw(
'could not find challenge block for ' + challenge.block
);
} }
const firstChallengeOfNextBlock$ = blocks$
.elementAt(blockIndex + 1, {})
.map(({ challenges = [] }) => challenges[0]);
return blocks$ function redirectToNextChallenge(req, res, next) {
.filter(shouldNotFilterComingSoon) let challengeId = req.query.id || req.cookies.currentChallengeId;
.elementAt(blockIndex) if (challengeId === 'undefined' || challengeId === 'null') {
.flatMap(block => { challengeId = null;
// find where our challenge lies in the block }
const challengeIndex$ = Observable.from(
block.challenges, Observable.combineLatest(
null, firstChallenge$,
null, lastChallenge$
Scheduler.default
) )
.findIndex(({ id }) => id === challengeId); .flatMap(([firstChallenge, { id: lastChallengeId } ]) => {
// no id supplied, load first challenge
// grab next challenge in this block if (!challengeId) {
return challengeIndex$ return Observable.just(firstChallenge);
.map(index => {
return block.challenges[index + 1];
})
.flatMap(nextChallenge => {
if (!nextChallenge) {
return firstChallengeOfNextBlock$;
} }
return Observable.just(nextChallenge); // camper just completed last challenge
}); if (challengeId === lastChallengeId) {
}); return Observable.just()
}); .doOnCompleted(() => {
})
.map(nextChallenge => {
if (!nextChallenge) {
return null;
}
nextChallengeName = nextChallenge.dashedName;
return nextChallengeName;
})
.subscribe(
function() {},
next,
function() {
debug('next challengeName', nextChallengeName);
if (!nextChallengeName || nextChallengeName === firstChallenge) {
req.flash('info', { req.flash('info', {
msg: dedent` msg: dedent`
Once you have completed all of our challenges, you should Once you have completed all of our challenges, you should
@ -273,100 +461,40 @@ module.exports = function(app) {
`.split('\n').join(' ') `.split('\n').join(' ')
}); });
return res.redirect('/map'); return res.redirect('/map');
}
res.redirect('/challenges/' + nextChallengeName);
}
);
}
function returnIndividualChallenge(req, res, next) {
const origChallengeName = req.params.challengeName;
const solutionCode = req.query.solution;
const unDashedName = unDasherize(origChallengeName);
const challengeName = challengesRegex.test(unDashedName) ?
// remove first word if matches
unDashedName.split(' ').slice(1).join(' ') :
unDashedName;
const testChallengeName = new RegExp(challengeName, 'i');
debug('looking for %s', testChallengeName);
challenge$
.filter((challenge) => {
return testChallengeName.test(challenge.name) &&
shouldNotFilterComingSoon(challenge);
})
.last({ defaultValue: null })
.flatMap(challenge => {
if (challenge && isDev) {
return getFromDisk$(challenge);
}
return Observable.just(challenge);
})
.flatMap(challenge => {
// Handle not found
if (!challenge) {
debug('did not find challenge for ' + origChallengeName);
req.flash('errors', {
msg:
'404: We couldn\'t find a challenge with the name `' +
origChallengeName +
'` Please double check the name.'
}); });
return Observable.just('/map');
} }
if (dasherize(challenge.name) !== origChallengeName) { return getNextChallenge$(challenge$, blocks$, challengeId)
let redirectUrl = `/challenges/${dasherize(challenge.name)}`; .doOnNext(({ dashedName } = {}) => {
if (!dashedName) {
if (solutionCode) { debug('no challenge found for %s', challengeId);
redirectUrl += `?solution=${encodeURIComponent(solutionCode)}`; res.redirect('/map');
} }
res.redirect('/challenges/' + dashedName);
return Observable.just(redirectUrl);
}
// save user does nothing if user does not exist
return Observable.just({
title: challenge.name,
name: challenge.name,
details: challenge.description,
description: challenge.description,
challengeId: challenge.id,
challengeType: challenge.challengeType,
dashedName: origChallengeName,
challengeSeed: challenge.challengeSeed,
head: challenge.head,
tail: challenge.tail,
tests: challenge.tests,
// identifies if a challenge is completed
isCompleted: isChallengeCompleted(req.user, challenge.id),
// video challenges
video: challenge.challengeSeed[0],
// bonfires specific
bonfires: challenge,
MDNkeys: challenge.MDNlinks,
MDNlinks: getMDNLinks(challenge.MDNlinks),
// htmls specific
verb: randomVerb(),
phrase: randomPhrase(),
compliment: randomCompliment()
}); });
}) })
.subscribe(() => {}, next);
}
function showChallenge(req, res, next) {
const solution = req.query.solution;
getRenderData$(req.user, challenge$, req.params.challengeName, solution)
.subscribe( .subscribe(
function(data) { ({ type, redirectUrl, message, data }) => {
if (typeof data === 'string') { if (message) {
debug('redirecting to %s', data); req.flash('info', {
return res.redirect(data); msg: message
});
}
if (type === 'redirect') {
debug('redirecting to %s', redirectUrl);
return res.redirect(redirectUrl);
} }
var view = challengeView[data.challengeType]; var view = challengeView[data.challengeType];
if (data.id) {
res.cookie('currentChallengeId', data.id);
}
res.render(view, data); res.render(view, data);
}, },
next, next,
@ -500,94 +628,15 @@ module.exports = function(app) {
); );
} }
function challengeMap({ user = {} }, res, next) { function showMap(showAside, { user }, res, next) {
let lastCompleted; getSuperBlocks$(challenge$, getCompletedChallengeIds(user))
const daysRunning = moment().diff(new Date('10/15/2014'), 'days');
// if user
// get the id's of all the users completed challenges
const completedChallenges = !user.completedChallenges ?
[] :
_.uniq(user.completedChallenges).map(({ id, _id }) => id || _id);
const camperCount$ = userCount$()
.map(camperCount => numberWithCommas(camperCount));
// create a stream of an array of all the challenge blocks
const superBlocks$ = challenge$
// mark challenge completed
.map(challengeModel => {
const challenge = challengeModel.toJSON();
if (completedChallenges.indexOf(challenge.id) !== -1) {
challenge.completed = true;
}
challenge.markNew = shouldShowNew(challenge);
return challenge;
})
// group challenges by block | returns a stream of observables
.groupBy(challenge => challenge.block)
// turn block group stream into an array
.flatMap(block$ => block$.toArray())
.map(blockArray => {
const completedCount = blockArray.reduce((sum, { completed }) => {
if (completed) {
return sum + 1;
}
return sum;
}, 0);
const isBeta = _.every(blockArray, 'isBeta');
const isComingSoon = _.every(blockArray, 'isComingSoon');
return {
isBeta,
isComingSoon,
name: blockArray[0].block,
superBlock: blockArray[0].superBlock,
dashedName: dasherize(blockArray[0].block),
markNew: shouldShowNew(null, blockArray),
challenges: blockArray,
completed: completedCount / blockArray.length * 100,
time: blockArray[0] && blockArray[0].time || '???'
};
})
// filter out hikes
.filter(({ superBlock }) => {
return !(/hikes/i).test(superBlock);
})
// turn stream of blocks into a stream of an array
.toArray()
.doOnNext(blocks => {
const lastCompletedBlock = _.findLast(blocks, (block) => {
return block.completed === 100;
});
lastCompleted = lastCompletedBlock && lastCompletedBlock.name || null;
})
.flatMap(blocks => Observable.from(blocks, null, null, Scheduler.default))
.groupBy(block => block.superBlock)
.flatMap(blocks$ => blocks$.toArray())
.map(superBlockArray => ({
name: superBlockArray[0].superBlock,
blocks: superBlockArray
}))
.toArray();
Observable.combineLatest(
camperCount$,
superBlocks$,
(camperCount, superBlocks) => ({ camperCount, superBlocks })
)
.subscribe( .subscribe(
({ camperCount, superBlocks }) => { superBlocks => {
res.render('challengeMap/show', { res.render('map/show', {
superBlocks, superBlocks,
daysRunning, title: 'A Map to Learn to Code and Become a Software Engineer',
globalCompletedCount: numberWithCommas( showAside
5612952 + (Math.floor((Date.now() - 1446268581061) / 2000))
),
camperCount,
lastCompleted,
title: 'A Map to Learn to Code and Become a Software Engineer'
}); });
}, },
next next

View File

@ -22,7 +22,7 @@ module.exports = function(app) {
function index(req, res) { function index(req, res) {
if (req.user) { if (req.user) {
return res.redirect('/map'); return res.redirect('/challenges/current-challenge');
} }
res.render('home', { title: message }); res.render('home', { title: message });
} }

View File

@ -1,107 +0,0 @@
var Rx = require('rx');
var debug = require('debug')('freecc:nonprofits');
var observeMethod = require('../utils/rx').observeMethod;
var unDasherize = require('../utils').unDasherize;
var dasherize = require('../utils').dasherize;
module.exports = function(app) {
var router = app.loopback.Router();
var Nonprofit = app.models.Nonprofit;
var findNonprofits = observeMethod(Nonprofit, 'find');
var findOneNonprofit = observeMethod(Nonprofit, 'findOne');
router.get('/nonprofits/directory', nonprofitsDirectory);
router.get('/nonprofits/:nonprofitName', returnIndividualNonprofit);
app.use(router);
function nonprofitsDirectory(req, res, next) {
findNonprofits({
order: 'moneySaved DESC'
})
.flatMap(
(nonprofits = []) => {
// turn array of nonprofits into observable array
return Rx.Observable.from(nonprofits)
.pluck('moneySaved')
.reduce((sum, moneySaved = 0) => sum + moneySaved, 0);
},
(nonprofits = [], totalSavings) => ({ nonprofits, totalSavings })
)
.subscribe(({ nonprofits, totalSavings }) => {
res.render('nonprofits/directory', {
title: 'Nonprofits we help',
nonprofits: nonprofits,
totalSavings: totalSavings.toString().replace(/000$/, ',000')
});
},
next
);
}
function returnIndividualNonprofit(req, res, next) {
var dashedName = req.params.nonprofitName;
var nonprofitName = unDasherize(dashedName);
var query = { where: { name: {
like: nonprofitName,
options: 'i'
} } };
debug('looking for %s', nonprofitName);
debug('query', query);
findOneNonprofit(query).subscribe(
function(nonprofit) {
if (!nonprofit) {
req.flash('errors', {
msg: "404: We couldn't find a nonprofit with that name. " +
'Please double check the name.'
});
return res.redirect('/nonprofits');
}
var dashedNameFull = dasherize(nonprofit.name);
if (dashedNameFull !== dashedName) {
return res.redirect('../nonprofit/' + dashedNameFull);
}
res.render('nonprofits/show', {
dashedName: dashedNameFull,
title: nonprofit.name,
logoUrl: nonprofit.logoUrl,
estimatedHours: nonprofit.estimatedHours,
projectDescription: nonprofit.projectDescription,
approvedOther:
nonprofit.approvedDeliverables.indexOf('other') > -1,
approvedWebsite:
nonprofit.approvedDeliverables.indexOf('website') > -1,
approvedDonor:
nonprofit.approvedDeliverables.indexOf('donor') > -1,
approvedInventory:
nonprofit.approvedDeliverables.indexOf('inventory') > -1,
approvedVolunteer:
nonprofit.approvedDeliverables.indexOf('volunteer') > -1,
approvedForm:
nonprofit.approvedDeliverables.indexOf('form') > -1,
approvedCommunity:
nonprofit.approvedDeliverables.indexOf('community') > -1,
approvedELearning:
nonprofit.approvedDeliverables.indexOf('eLearning') > -1,
websiteLink: nonprofit.websiteLink,
imageUrl: nonprofit.imageUrl,
whatDoesNonprofitDo: nonprofit.whatDoesNonprofitDo,
interestedCampers: nonprofit.interestedCampers,
assignedCampers: nonprofit.assignedCampers,
buttonActive: false,
moneySaved: nonprofit.moneySaved,
currentStatus: nonprofit.currentStatus
});
},
next
);
}
};

View File

@ -35,8 +35,9 @@ module.exports = function(app) {
router.get('/labs', showLabs); router.get('/labs', showLabs);
router.get('/stories', showTestimonials); router.get('/stories', showTestimonials);
router.get('/all-stories', showAllTestimonials); router.get('/all-stories', showAllTestimonials);
router.get('/about', showAbout); router.get('/terms', terms);
router.get('/terms-and-privacy', termsAndPrivacy); router.get('/privacy', privacy);
router.get('/code-of-conduct', codeOfConduct);
router.get( router.get(
'/the-fastest-web-page-on-the-internet', '/the-fastest-web-page-on-the-internet',
theFastestWebPageOnTheInternet theFastestWebPageOnTheInternet
@ -196,16 +197,21 @@ module.exports = function(app) {
}); });
} }
function showAbout(req, res) { function terms(req, res) {
res.render('resources/about', { res.render('resources/terms-of-service', {
title: 'About our Open Source Community, our social media presence, ' + title: 'Terms of Service'
'and how to contact us'
}); });
} }
function termsAndPrivacy(req, res) { function privacy(req, res) {
res.render('resources/terms-and-privacy', { res.render('resources/privacy', {
title: 'Terms of Service, Privacy Policy, and Code of Conduct' title: 'Privacy'
});
}
function codeOfConduct(req, res) {
res.render('resources/code-of-conduct', {
title: 'Code of Conduct'
}); });
} }

View File

@ -178,6 +178,7 @@ module.exports = function(app) {
req.flash('errors', { req.flash('errors', {
msg: `404: We couldn't find path ${ path }` msg: `404: We couldn't find path ${ path }`
}); });
console.log('404');
return res.redirect('/'); return res.redirect('/');
} }
profileUser = profileUser.toJSON(); profileUser = profileUser.toJSON();
@ -290,7 +291,7 @@ module.exports = function(app) {
(user) => { (user) => {
if (!user) { if (!user) {
req.flash('errors', { req.flash('errors', {
msg: `404: We couldn't find the user with the username ${username}` msg: `We couldn't find the user with the username ${username}`
}); });
return res.redirect('/'); return res.redirect('/');
} }

View File

@ -29,7 +29,7 @@ export default function prodErrorHandler() {
msg: message msg: message
}); });
} }
return res.redirect('/'); return res.redirect('/map');
// json // json
} else if (type === 'json') { } else if (type === 'json') {
res.setHeader('Content-Type', 'application/json'); res.setHeader('Content-Type', 'application/json');

View File

@ -1,4 +1,3 @@
import _ from 'lodash';
import path from 'path'; import path from 'path';
import { Observable } from 'rx'; import { Observable } from 'rx';
@ -16,16 +15,17 @@ export default function getFromDisk$(challenge) {
)]; )];
return Observable.just(require(path.join(basePath, challenge.fileName))) return Observable.just(require(path.join(basePath, challenge.fileName)))
.map(challengeSpec => challengeSpec.challenges[challenge.suborder - 1]) .map(challengeSpec => {
const _challenge = challengeSpec.challenges[challenge.suborder - 1];
_challenge.helpRoom = challengeSpec.helpRoom || 'Help';
return _challenge;
})
.map(challenge => { .map(challenge => {
challenge.head = challenge.head || []; challenge.head = challenge.head || [];
challenge.tail = challenge.tail || []; challenge.tail = challenge.tail || [];
challenge.challengeType = '' + challenge.challengeType; challenge.challengeType = '' + challenge.challengeType;
challenge.name = challenge.name = challenge.title.replace(/[^a-zA-Z0-9\s]/g, '');
_.capitalize(challenge.type) +
': ' +
challenge.title.replace(/[^a-zA-Z0-9\s]/g, '');
challenge.dashedName = challenge.name challenge.dashedName = challenge.name
.toLowerCase() .toLowerCase()

View File

@ -1,13 +1,11 @@
var cheerio = require('cheerio'), var cheerio = require('cheerio'),
request = require('request'), request = require('request'),
MDNlinks = require('../../seed/bonfireMDNlinks'), MDNlinks = require('../../seed/bonfireMDNlinks'),
resources = require('./resources.json'), resources = require('./resources.json');
nonprofits = require('../../seed/nonprofits.json');
/** /**
* Cached values * Cached values
*/ */
var allNonprofitNames;
module.exports = { module.exports = {
dasherize: function dasherize(name) { dasherize: function dasherize(name) {
@ -44,17 +42,6 @@ module.exports = {
]; ];
}, },
allNonprofitNames: function() {
if (allNonprofitNames) {
return allNonprofitNames;
} else {
allNonprofitNames = nonprofits.map(function(elem) {
return {name: elem.name};
});
return allNonprofitNames;
}
},
whichEnvironment: function() { whichEnvironment: function() {
return process.env.NODE_ENV; return process.env.NODE_ENV;
}, },

View File

@ -1,9 +1,8 @@
extends ../layout extends ../layout
block content block content
.jumbotron.text-center
.row .row
.col-xs-12 .col-xs-12
h2 Sign in with an email address here: h2.text-center Sign in with an email address here:
.col-sm-6.col-sm-offset-3 .col-sm-6.col-sm-offset-3
form(method='POST', action='/api/users/login') form(method='POST', action='/api/users/login')
input(type='hidden', name='_csrf', value=_csrf) input(type='hidden', name='_csrf', value=_csrf)

View File

@ -2,8 +2,7 @@ extends ../layout
block content block content
script. script.
var challengeName = 'Email Signup' var challengeName = 'Email Signup'
.jumbotron.text-center h2.text-center Sign up with an email address here:
h2 Sign up with an email address here:
form.form-horizontal(method='POST', action='/api/users', name="signupForm") form.form-horizontal(method='POST', action='/api/users', name="signupForm")
.row .row
.col-sm-6.col-sm-offset-3 .col-sm-6.col-sm-offset-3
@ -13,6 +12,6 @@ block content
.form-group .form-group
input.input-lg.form-control(type='password', name='password', id='password', placeholder='password', required, pattern=".{8,50}", title="Must be at least 8 characters and no longer than 50 characters.") input.input-lg.form-control(type='password', name='password', id='password', placeholder='password', required, pattern=".{8,50}", title="Must be at least 8 characters and no longer than 50 characters.")
.form-group .form-group
button.btn.btn-lg.btn-success.btn-block(type='submit') button.btn.btn-lg.btn-primary.btn-block(type='submit')
span.ion-person-add span.ion-person-add
| Signup | Signup

View File

@ -1,12 +1,11 @@
extends ../layout extends ../layout
block content block content
.col-sm-8.col-sm-offset-2.jumbotron .col-sm-6.col-sm-offset-3
form(method='POST', action="/forgot") form(method='POST', action="/forgot")
h2.text-center Forgot Password Reset h2.text-center Forgot Password Reset
input(type='hidden', name='_csrf', value=_csrf) input(type='hidden', name='_csrf', value=_csrf)
.form-group .form-group
p Enter your email address. We'll send you password reset instructions. p.large-p Enter your email address. We'll send you password reset instructions.
input.form-control.input-lg(type='email', name='email', id='email', placeholder='Email', autofocus=true required) input.form-control.input-lg(type='email', name='email', id='email', placeholder='Email', autofocus=true required)
.form-group .form-group
button.btn.btn-primary.btn-lg.btn-block(type='submit') button.btn.btn-primary.btn-lg.btn-block(type='submit')

View File

@ -4,9 +4,7 @@ block content
script. script.
var challengeName = 'Profile View'; var challengeName = 'Profile View';
if (user && user.username === username) if (user && user.username === username)
.panel.panel-info h1.text-center Update your code portfolio
.panel-heading.text-center Update your code portfolio
.panel-body
.row .row
.col-xs-12 .col-xs-12
if (!user.isGithubCool) if (!user.isGithubCool)
@ -16,7 +14,7 @@ block content
else else
a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/link/github') a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/link/github')
i.fa.fa-github i.fa.fa-github
| Update my name, username, and location with data from my GitHub account | Update my portfolio from GitHub
if (!user.twitter) if (!user.twitter)
a.btn.btn-lg.btn-block.btn-twitter.btn-link-social(href='/link/twitter') a.btn.btn-lg.btn-block.btn-twitter.btn-link-social(href='/link/twitter')
i.fa.fa-twitter i.fa.fa-twitter
@ -33,11 +31,9 @@ block content
a.btn.btn-lg.btn-block.btn-google-plus.btn-link-social(href='/link/google') a.btn.btn-lg.btn-block.btn-google-plus.btn-link-social(href='/link/google')
i.fa.fa-google-plus i.fa.fa-google-plus
| Add my Google+ to my portfolio | Add my Google+ to my portfolio
.spacer
.panel.panel-info h1.text-center #{username}'s code portfolio
.panel-heading.text-center hr
h1 #{username}'s code portfolio
.panel-body
.row .row
.col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2.text-center .col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2.text-center
if picture if picture
@ -65,18 +61,16 @@ block content
a(href='#{pledge.donateUrl}?ref=freecodecamp.com' target='_blank') #{pledge.displayName} a(href='#{pledge.donateUrl}?ref=freecodecamp.com' target='_blank') #{pledge.displayName}
| each month until they have completed their #{pledge.goal}. | each month until they have completed their #{pledge.goal}.
.spacer .spacer
.row
.col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2
if isFrontEndCert if isFrontEndCert
a.btn.btn-primary(href='/' + username + '/front-end-certification') View My Front End Development Certification a.btn.btn-primary.btn-block(href='/' + username + '/front-end-certification') View My Front End Development Certification
if isDataVisCert if isDataVisCert
.button-spacer .button-spacer
a.btn.btn-success(href='/' + username + '/data-visualization-certification') View My Data Visualization Certification a.btn.btn-primary.btn-block(href='/' + username + '/data-visualization-certification') View My Data Visualization Certification
if isBackEndCert if isBackEndCert
.button-spacer .button-spacer
a.btn.btn-success(href='/' + username + '/back-end-certification') View My Back End Development Certification a.btn.btn-primary.btn-block(href='/' + username + '/back-end-certification') View My Back End Development Certification
//if (user && user.username !== username)
// a.btn.btn-lg.btn-block.btn-twitter.btn-link-social(href='/leaderboard/add?username=#{username}')
// i.fa.fa-plus-square
// | Add them to my personal leaderboard
.spacer .spacer
.col-md-12 .col-md-12
@ -182,39 +176,33 @@ block content
a(href='/challenges/' + challenge.name + '?solution=' + encodeURIComponent(encodeFcc(challenge.solution)), target='_blank')= challenge.name a(href='/challenges/' + challenge.name + '?solution=' + encodeURIComponent(encodeFcc(challenge.solution)), target='_blank')= challenge.name
else else
a(href='/challenges/' + challenge.name)= challenge.name a(href='/challenges/' + challenge.name)= challenge.name
if (user && user.username === username) if (user && user.username === username)
.panel.panel-info h1.text-center Manage your account
.panel-heading.text-center Manage your account hr
.panel-body
.col-xs-12 .col-xs-12
a.btn.btn-lg.btn-block.btn-warning.btn-link-social(href='/logout') a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='/logout')
span.ion-android-exit
| Sign me out of Free Code Camp | Sign me out of Free Code Camp
.col-xs-12 .col-xs-12
a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='mailto:team@freecodecamp.com') a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='mailto:team@freecodecamp.com')
span.ion-email
| Email us at team@freecodecamp.com | Email us at team@freecodecamp.com
if (!user.isLocked) if (!user.isLocked)
.col-xs-12 .col-xs-12
a.btn.btn-lg.btn-block.btn-info.btn-link-social(href='/toggle-lockdown-mode') a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='/toggle-lockdown-mode')
span.ion-locked
| Hide all my solutions from other people | Hide all my solutions from other people
br br
| (this will disable your certificates) | (this will disable your certificates)
else else
.col-xs-12 .col-xs-12
a.btn.btn-lg.btn-block.btn-info.btn-link-social(href='/toggle-lockdown-mode') a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='/toggle-lockdown-mode')
span.ion-unlocked
| Let other people see all my solutions | Let other people see all my solutions
br br
| (this will enable your certificates) | (this will enable your certificates)
.col-xs-12 .col-xs-12
a.btn.btn-lg.btn-block.btn-success.btn-link-social(href='/commit') a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='/commit')
span.ion-edit
| Edit my pledge | Edit my pledge
.col-xs-12 .col-xs-12
a.btn.btn-lg.btn-block.btn-danger.btn-link-social.confirm-deletion a.btn.btn-lg.btn-block.btn-danger.btn-link-social.confirm-deletion
span.ion-trash-b
| Delete my Free Code Camp account | Delete my Free Code Camp account
script. script.
$('.confirm-deletion').on("click", function () { $('.confirm-deletion').on("click", function () {
@ -234,11 +222,10 @@ block content
| . | .
.modal-footer .modal-footer
a.btn.btn-success.btn-block(href='#', data-dismiss='modal', aria-hidden='true') a.btn.btn-success.btn-block(href='#', data-dismiss='modal', aria-hidden='true')
span.ion-happy
| Nevermind, I don't want to delete all of my progress | Nevermind, I don't want to delete all of my progress
.spacer .spacer
form(action='/account/delete', method='POST') form(action='/account/delete', method='POST')
input(type='hidden', name='_csrf', value=_csrf) input(type='hidden', name='_csrf', value=_csrf)
button.btn.btn-danger.btn-block(type='submit') button.btn.btn-danger.btn-block(type='submit')
span.ion-trash-b
| I am 100% sure I want to delete my account and all of my progress | I am 100% sure I want to delete my account and all of my progress
>>>>>>> refactor map view and make buttons and text bigger

View File

@ -1,6 +1,6 @@
extends ../layout extends ../layout
block content block content
.jumbotron.text-center .text-center
h2 Sign in with one of these options: h2 Sign in with one of these options:
a.btn.btn-lg.btn-block.btn-github.btn-social(href='/auth/github') a.btn.btn-lg.btn-block.btn-github.btn-social(href='/auth/github')
i.fa.fa-github i.fa.fa-github

View File

@ -1,215 +0,0 @@
extends ../layout
block content
.panel.panel-info
.panel-heading.text-center
h1 Challenge Map
.panel-body
if (Math.random() > 0.999)
img.img-responsive.img-center.border-radius-5(src='https://s3.amazonaws.com/freecodecamp/wide-social-banner-dino.png')
audio(autoplay src='https://s3.amazonaws.com/freecodecamp/t-rex-roar.mp3')
else
img.img-responsive.img-center.border-radius-5(src='https://s3.amazonaws.com/freecodecamp/wide-social-banner.png')
.col-xs-12.col-md-8.col-md-offset-2
h2
table.population-table.img-center
tr
td Established:&thinsp;
td
span.text-primary #{daysRunning}&thinsp;
| days ago
tr
td Population:&thinsp;&thinsp;&thinsp;
td
span.text-primary #{camperCount}&thinsp;
| campers
tr
td Completed:&thinsp;&thinsp;&thinsp;
td
span.text-primary #{globalCompletedCount}&thinsp;
| challenges
.spacer
if (user && user.progressTimestamps.length > 100)
.row
#map-notice.col-xs-12.col-md-8.col-md-offset-2.hidden
h2.text-center Reddit or not, here we come
img.thumbnail.img-center.img-responsive(src="http://i.imgur.com/lyd0bfM.jpg")
h4.text-center Come ask questions and share your thoughts with our entire open source community on our subreddit.
a.button.btn.btn-block.btn-primary(href="https://reddit.com/r/freecodecamp" target="_blank") Check it out
.button-spacer
.text-center
a#hide-map-notice-button(href='#') Hide this forever
.spacer
ul
for superBlock in superBlocks
h2= superBlock.name
- var i = 0
for challengeBlock in superBlock.blocks
- i++
.row
if (user)
if (challengeBlock.completed === 100)
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-1.col-sm-1.col-md-1.map-row-numbers.negative-5
span.map-p.negative-10 #{i}.
.col-xs-11.col-sm-8.col-md-9
li.map-p.faded.negative-10
a(href='#' + challengeBlock.dashedName)= challengeBlock.name
if challengeBlock.markNew
span.text-info.small &thinsp; &thinsp;
strong
em NEW
if challengeBlock.isComingSoon
span.text-info.small &thinsp; &thinsp;
strong
em Coming Soon
else
.hidden-xs.col-sm-3.col-md-2
.progress.progress-bar-padding.text-center.thin-progress-bar
.progress-bar(role='progressbar', aria-valuenow=(challengeBlock.completed), aria-valuemin='0', aria-valuemax='100', style='width: ' + challengeBlock.completed + '%;')
.col-xs-1.col-sm-1.col-md-1.map-row-numbers.negative-5
span.map-p #{i}.
.col-xs-11.col-sm-8.col-md-9
li.map-p.negative-10
a(href='#' + challengeBlock.dashedName)= challengeBlock.name
if challengeBlock.markNew
span.text-info.small &thinsp; &thinsp;
strong
em NEW
if challengeBlock.isComingSoon
span.text-info.small &thinsp; &thinsp;
strong
em Coming Soon
else
.hidden-xs.col-sm-3.col-md-2
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
span.map-p.negative-10 #{i}.
.col-xs-10.col-sm-8.col-md-9
span.map-p.negative-10
a(href='#' + challengeBlock.dashedName)= challengeBlock.name
if challengeBlock.markNew
span.text-info.small &thinsp; &thinsp;
strong
em NEW
if challengeBlock.isComingSoon
span.text-info.small &thinsp; &thinsp;
strong
em Coming Soon
h2 Full Stack Development Certification
.row
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Greenfield Nonprofit Project 1
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Greenfield Nonprofit Project 2
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Legacy Nonprofit Project 1
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Legacy Nonprofit Project 2
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Claim your Full Stack Development Certification
h2 Coding Interview Preparation
.row
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Whiteboard Coding Interview Training
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Critical Thinking Interview Training
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Mock Interview 1
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Mock Interview 2
.hidden-xs.col-sm-3.col-md-2.ion-locked.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-12.col-sm-9.col-md-10
li.map-p.negative-10 Mock Interview 3
hr
for superBlock, index in superBlocks
for challengeBlock in superBlock.blocks
.row
a(href='#' name=challengeBlock.dashedName)
.spacer.negative-55
.row
.hidden-xs.col-sm-3.col-md-2
h3.text-primary.text-right.nowrap
i.fa.fa-clock-o
= challengeBlock.time
.col-xs-12.col-sm-9.col-md-10
h3 #{challengeBlock.name} &thinsp;
- var i = 0
for challenge in challengeBlock.challenges
- i++
.row
if challenge.completed
.hidden-xs.col-sm-3.col-md-2.text-primary.ion-checkmark-circled.padded-ionic-icon.text-center.map-p.negative-10
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
span.map-p.negative-10 #{i}.
.col-xs-10.col-sm-8.col-md-9
span.faded.map-p.negative-10
a(href="/challenges/#{challenge.dashedName}")
span.capitalize= challenge.type + ': '
span= challenge.title
span.sr-only= " Complete"
else
.hidden-xs.col-sm-3.col-md-2
span.negative-10
.col-xs-1.col-sm-1.col-md-1.map-row-numbers
span.map-p.negative-10 #{i}.
.col-xs-10.col-sm-8.col-md-9
span.map-p.negative-10
a(href="/challenges/#{challenge.dashedName}" class=challenge.isComingSoon ? 'disabled' : '')
span.capitalize= challenge.type + ': '
span= challenge.title
span.sr-only= " Incomplete"
if challenge.markNew
span.text-info.small &thinsp; &thinsp;
strong
em NEW
if challengeBlock.isComingSoon
span.text-info.small &thinsp; &thinsp;
strong
em Coming Soon
if (challengeBlock.completed === 100)
.button-spacer
.row
.col-xs-12.col-sm-8.col-md-6.col-sm-offset-3.col-md-offset-2.hidden
a.btn.btn-lg.btn-block.signup-btn.map-challenge-block-share Section complete. Share your code portfolio with your friends.
.hidden(id="#{challengeBlock.name}")
if (index < superBlocks.length - 1)
.spacer
hr
.spacer
script.
var username = !{JSON.stringify(user && user.username || '')};
var lastCompleted = !{JSON.stringify(lastCompleted || false)}
$(document).ready(function () {
if (!localStorage || !localStorage.hideRedditNotice) {
$("#map-notice").removeClass("hidden");
}
$("#hide-map-notice-button").on("click", function(e) {
e.preventDefault();
$("#map-notice").addClass('animated fadeOut');
setTimeout(function() {
$("#map-notice").hide();
}, 1000);
localStorage.hideRedditNotice = "true";
});
});

View File

@ -4,46 +4,40 @@ block content
link(rel='stylesheet', href='/bower_components/CodeMirror/addon/lint/lint.css') link(rel='stylesheet', href='/bower_components/CodeMirror/addon/lint/lint.css')
link(rel='stylesheet', href='/bower_components/CodeMirror/theme/monokai.css') link(rel='stylesheet', href='/bower_components/CodeMirror/theme/monokai.css')
link(rel='stylesheet', href='/css/ubuntu.css') link(rel='stylesheet', href='/css/ubuntu.css')
.row .row
.col-md-4.col-lg-3 .col-md-4.col-lg-3
.scroll-locker(id = "scroll-locker") .scroll-locker(id = "scroll-locker")
.innerMarginFix(style=' width: 99%') .innerMarginFix(style=' width: 99%')
#testCreatePanel.well #testCreatePanel
h3.text-center.negative-10= name h4.text-center= name
if (isCompleted) if (isCompleted)
| &nbsp; | &nbsp;
i.ion-checkmark-circled.text-primary(title="Completed") i.ion-checkmark-circled.text-primary(title="Completed")
hr
.row .row
.col-xs-12 .col-xs-12
.bonfire-instructions .bonfire-instructions
for sentence in details for sentence in description
if (/blockquote|h4|table/.test(sentence)) if (/blockquote|h4|table/.test(sentence))
!=sentence !=sentence
else else
p.wrappable.negative-10!= sentence p.wrappable!= sentence
if (MDNlinks.length) if (MDNlinks.length)
.negative-30-bottom
#MDN-links #MDN-links
p.negative-10 Here are some helpful links: p Here are some helpful links:
for link, index in MDNlinks for link, index in MDNlinks
.negative-10
ul: li: a(href=""+link, target="_blank") !{MDNkeys[index]} ul: li: a(href=""+link, target="_blank") !{MDNkeys[index]}
.button-spacer
if (user) if (user)
label.negative-10.btn.btn-primary.btn-block.btn-lg#submitButton label.btn.btn-primary.btn-block.btn-lg#submitButton
i.fa.fa-play | Run tests (ctrl + enter)
| &nbsp; Run tests (ctrl + enter)
.button-spacer .button-spacer
.btn-group.input-group.btn-group-justified .btn-group.input-group.btn-group-justified
label.btn.btn-success#trigger-reset-modal label.btn.btn-primary.btn-primary-ghost.btn-lg#trigger-reset-modal
i.fa.fa-refresh
| &nbsp; Reset | &nbsp; Reset
label.btn.btn-success#challenge-help-btn label.btn.btn-primary.btn-primary-ghost.btn-lg#challenge-help-btn
i.fa.fa-medkit
| &nbsp; Help | &nbsp; Help
label.btn.btn-success#trigger-issue-modal label.btn.btn-primary.btn-primary-ghost.btn-lg#trigger-issue-modal
i.fa.fa-bug
| &nbsp; Bug | &nbsp; Bug
if (!user) if (!user)
.button-spacer .button-spacer
@ -55,7 +49,7 @@ block content
.form-group.codeMirrorView .form-group.codeMirrorView
textarea#codeOutput(style='display: none;') textarea#codeOutput(style='display: none;')
br br
#testSuite.negative-10 #testSuite
br br
.col-md-8.col-lg-9 .col-md-8.col-lg-9
@ -84,7 +78,7 @@ block content
i.fa.fa-twitter &thinsp; i.fa.fa-twitter &thinsp;
= phrase = phrase
else else
a#next-challenge.btn.btn-lg.btn-primary.btn-block(href="/challenges/next-challenge?id="+challengeId) Go to my next challenge (ctrl + enter) a#next-challenge.btn.btn-lg.btn-primary.btn-block(href="/challenges/next-challenge?id="+id) Go to my next challenge (ctrl + enter)
include ../partials/challenge-modals include ../partials/challenge-modals
script(type="text/javascript"). script(type="text/javascript").
var common = window.common = window.common || { init: [] }; var common = window.common = window.common || { init: [] };
@ -93,7 +87,7 @@ block content
common.head = !{JSON.stringify(head)}; common.head = !{JSON.stringify(head)};
common.tail = !{JSON.stringify(tail)}; common.tail = !{JSON.stringify(tail)};
common.challengeId = !{JSON.stringify(challengeId)}; common.challengeId = !{JSON.stringify(id)};
common.challengeName = !{JSON.stringify(name)}; common.challengeName = !{JSON.stringify(name)};
common.challengeSeed = !{JSON.stringify(challengeSeed)}; common.challengeSeed = !{JSON.stringify(challengeSeed)};
common.challengeType = !{JSON.stringify(challengeType)}; common.challengeType = !{JSON.stringify(challengeType)};
@ -104,8 +98,6 @@ block content
include ../partials/challenge-footer include ../partials/challenge-footer
script. script.
document.addEventListener('gitter-sidecar-ready', function(e) { if (!!{JSON.stringify(MDNlinks.length)}) {
if (window.main) { $('#MDN-links').addClass('collapse');
window.main.chat.createHelpChat('freecodecamp/helpbonfires', '#challenge-help-btn', 'Bonfires Help');
} }
});

View File

@ -4,39 +4,31 @@ block content
link(rel='stylesheet', href='/bower_components/CodeMirror/addon/lint/lint.css') link(rel='stylesheet', href='/bower_components/CodeMirror/addon/lint/lint.css')
link(rel='stylesheet', href='/bower_components/CodeMirror/theme/monokai.css') link(rel='stylesheet', href='/bower_components/CodeMirror/theme/monokai.css')
link(rel='stylesheet', href='/css/ubuntu.css') link(rel='stylesheet', href='/css/ubuntu.css')
.row.courseware-height .row
.col-md-3.col-lg-3 .col-md-3.col-lg-3
.scroll-locker(id = "scroll-locker") .scroll-locker(id = "scroll-locker")
.innerMarginFix(style = "width: 99%;") .innerMarginFix(style = "width: 99%;")
.well
.row .row
.col-xs-12 .col-xs-12
h3.text-center.negative-10= name h4.text-center= name
if (isCompleted) if (isCompleted)
| &nbsp; | &nbsp;
i.ion-checkmark-circled.text-primary(title="Completed") i.ion-checkmark-circled.text-primary(title="Completed")
hr
.bonfire-instructions .bonfire-instructions
for sentence in details for sentence in description
p.wrappable.negative-10!= sentence p.wrappable!= sentence
.negative-bottom-margin-30 .negative-bottom-margin-30
label.negative-10.btn.btn-primary.btn-lg.btn-block#submitButton .button-spacer
i.fa.fa-play .btn-big.btn.btn-primary.btn-block#submitButton
| &nbsp; Run tests (ctrl + enter) | Run tests (ctrl + enter)
.button-spacer .button-spacer
.btn-group.input-group.btn-group-justified .btn-group.input-group.btn-group-justified
label.btn.btn-success#trigger-reset-modal label.btn.btn-primary.btn-primary-ghost.btn-lg#trigger-reset-modal Reset
i.fa.fa-refresh label.btn.btn-primary.btn-primary-ghost.hidden-sm.hidden-md.hidden-lg
| &nbsp; Reset a(href='//gitter.im/freecodecamp/help') Help
label.btn.btn-success.hidden-sm.hidden-md.hidden-lg label.btn.btn-primary.btn-primary-ghost.hidden-xs.btn-lg#challenge-help-btn Help
a(href='//gitter.im/freecodecamp/help') label.btn.btn-primary.btn-primary-ghost.btn-lg#trigger-issue-modal Bug
i.fa.fa-medkit
| &nbsp; Help
label.btn.btn-success.hidden-xs#challenge-help-btn
i.fa.fa-medkit
| &nbsp; Help
label.btn.btn-success#trigger-issue-modal
i.fa.fa-bug
| &nbsp; Bug
script. script.
var userLoggedIn = true; var userLoggedIn = true;
if (!user) if (!user)
@ -73,7 +65,7 @@ block content
if(user) if(user)
#submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge (ctrl + enter) #submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge (ctrl + enter)
else else
a#next-challenge.btn.btn-lg.btn-primary.btn-block(href="/challenges/next-challenge?id="+challengeId) Go to my next challenge (ctrl + enter) a#next-challenge.btn.btn-lg.btn-primary.btn-block(href="/challenges/next-challenge?id="+id) Go to my next challenge (ctrl + enter)
include ../partials/challenge-modals include ../partials/challenge-modals
script(type="text/javascript"). script(type="text/javascript").
$('#next-courseware-button').attr('disabled', 'disabled'); $('#next-courseware-button').attr('disabled', 'disabled');
@ -83,7 +75,7 @@ block content
common.head = !{JSON.stringify(head)}; common.head = !{JSON.stringify(head)};
common.tail = !{JSON.stringify(tail)}; common.tail = !{JSON.stringify(tail)};
common.challengeId = !{JSON.stringify(challengeId)}; common.challengeId = !{JSON.stringify(id)};
common.challengeName = !{JSON.stringify(name)}; common.challengeName = !{JSON.stringify(name)};
common.challengeSeed = !{JSON.stringify(challengeSeed)}; common.challengeSeed = !{JSON.stringify(challengeSeed)};
common.challengeType = !{JSON.stringify(challengeType)}; common.challengeType = !{JSON.stringify(challengeType)};
@ -96,9 +88,3 @@ block content
}); });
include ../partials/challenge-footer include ../partials/challenge-footer
script.
document.addEventListener('gitter-sidecar-ready', function(e) {
if (window.main) {
window.main.chat.createHelpChat('freecodecamp/help', '#challenge-help-btn');
}
});

View File

@ -8,45 +8,38 @@ block content
.col-md-4.col-lg-3 .col-md-4.col-lg-3
.scroll-locker(id = "scroll-locker") .scroll-locker(id = "scroll-locker")
.innerMarginFix(style = "width: 99%;") .innerMarginFix(style = "width: 99%;")
#testCreatePanel.well #testCreatePanel
h3.text-center.negative-10= name h4.text-center= name
if (isCompleted) if (isCompleted)
| &nbsp; | &nbsp;
i.ion-checkmark-circled.text-primary(title="Completed") i.ion-checkmark-circled.text-primary(title="Completed")
hr
.row .row
.col-xs-12 .col-xs-12
.bonfire-instructions .bonfire-instructions
for sentence in details for sentence in description
if (/blockquote|h4|table/.test(sentence)) if (/blockquote|h4|table/.test(sentence))
!=sentence !=sentence
else else
p.wrappable.negative-10!= sentence p.wrappable!= sentence
if (MDNlinks.length) if (MDNlinks.length)
.negative-bottom-margin-30 .negative-bottom-margin-30
#MDN-links #MDN-links
p.negative-10 Here are some helpful links: p Here are some helpful links:
for link, index in MDNlinks for link, index in MDNlinks
.negative-10
ul: li: a(href="" + link, target="_blank") !{MDNkeys[index]} ul: li: a(href="" + link, target="_blank") !{MDNkeys[index]}
.button-spacer
if (user) if (user)
form.form-horizontal(novalidate='novalidate', name='completedWithForm') form.form-horizontal(novalidate='novalidate', name='completedWithForm')
.form-group.text-center.negative-10 .form-group.text-center
.col-xs-12 .col-xs-12
// extra field to distract password tools like lastpass from injecting css into our username field // extra field to distract password tools like lastpass from injecting css into our username field
label.negative-10.btn.btn-primary.btn-lg.btn-block#submitButton label.btn.btn-primary.btn-big.btn-block#submitButton Run tests (ctrl + enter)
i.fa.fa-play
| &nbsp; Run tests (ctrl + enter)
.button-spacer .button-spacer
.btn-group.input-group.btn-group-justified .btn-group.input-group.btn-group-justified
label.btn.btn-success#trigger-reset-modal label.btn.btn-primary.btn-lg#trigger-reset-modal Reset
i.fa.fa-refresh label.btn.btn-primary.btn-lg#challenge-help-btn Help
| &nbsp; Reset label.btn.btn-primary.btn-lg#trigger-issue-modal Bug
label.btn.btn-success#challenge-help-btn
i.fa.fa-medkit
| &nbsp; Help
label.btn.btn-success#trigger-issue-modal
i.fa.fa-bug
| &nbsp; Bug
if (!user) if (!user)
.button-spacer .button-spacer
a.btn.signup-btn.btn-block.btn-block(href='/login') Sign in so you can save your progress a.btn.signup-btn.btn-block.btn-block(href='/login') Sign in so you can save your progress
@ -57,7 +50,7 @@ block content
.form-group.codeMirrorView .form-group.codeMirrorView
textarea#codeOutput(style='display: none;') textarea#codeOutput(style='display: none;')
br br
#testSuite.negative-10 #testSuite
br br
.col-md-8.col-lg-9 .col-md-8.col-lg-9
.editorScrollDiv(style = "overflow-y: auto; overflow-x: hidden;") .editorScrollDiv(style = "overflow-y: auto; overflow-x: hidden;")
@ -80,7 +73,7 @@ block content
if (user) if (user)
#submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge (ctrl + enter) #submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge (ctrl + enter)
else else
a#next-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href="/challenges/next-challenge?id="+challengeId) Go to my next challenge (ctrl + enter) a#next-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href="/challenges/next-challenge?id="+id) Go to my next challenge (ctrl + enter)
include ../partials/challenge-modals include ../partials/challenge-modals
script(type="text/javascript"). script(type="text/javascript").
var common = window.common = { init: [] }; var common = window.common = { init: [] };
@ -89,7 +82,7 @@ block content
common.head = !{JSON.stringify(head)}; common.head = !{JSON.stringify(head)};
common.tail = !{JSON.stringify(tail)}; common.tail = !{JSON.stringify(tail)};
common.challengeId = !{JSON.stringify(challengeId)}; common.challengeId = !{JSON.stringify(id)};
common.challengeName = !{JSON.stringify(name)}; common.challengeName = !{JSON.stringify(name)};
common.challengeSeed = !{JSON.stringify(challengeSeed)}; common.challengeSeed = !{JSON.stringify(challengeSeed)};
common.challengeType = !{JSON.stringify(challengeType)}; common.challengeType = !{JSON.stringify(challengeType)};
@ -98,11 +91,9 @@ block content
include ../partials/challenge-footer include ../partials/challenge-footer
script. script.
document.addEventListener('gitter-sidecar-ready', function(e) { if (!!{JSON.stringify(MDNlinks.length)}) {
if (window.main) { $('#MDN-links').addClass('collapse');
window.main.chat.createHelpChat('freecodecamp/help', '#challenge-help-btn');
} }
});
common.init.push(function() { common.init.push(function() {
common.editor.setOption('mode', 'javascript'); common.editor.setOption('mode', 'javascript');

View File

@ -3,25 +3,27 @@ block content
.row .row
.col-md-8.col-md-offset-2 .col-md-8.col-md-offset-2
for step, index in description for step, index in description
.thumbnail.challenge-step(class=index !== 0 ? 'hidden': '') .challenge-step(class=index !== 0 ? 'hidden': '')
a(href=step[0] data-lightbox='img-enlarge') a(href=step[0] data-lightbox='img-enlarge')
img.gif-block.img-center.img-responsive.thumbnail(src='#{step[0]}' alt='#{step[1]}') img.gif-block.img-center.img-responsive(src='#{step[0]}' alt='#{step[1]}')
.caption .row
p.large-p!= step[2] .col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2
p!= step[2]
.challenge-button-block .challenge-button-block
if step[3] if step[3]
a.btn.btn-block.btn-primary.challenge-step-btn-action(id='#{index}' href='#{step[3]}' target='_blank') Open link in new tab (this unlocks the next step) a.btn.btn-block.btn-primary.challenge-step-btn-action.btn-lg(id='#{index}' href='#{step[3]}' target='_blank') Open link in new tab (this unlocks the next step)
.button-spacer .button-spacer
if index === 0 if index === 0
.col-sm-5.hidden-xs &nbsp; .col-sm-5.hidden-xs &nbsp;
else else
.btn.btn-warning.col-sm-5.col-xs-12.challenge-step-btn-prev(id='#{index - 1}') Go to my previous step .btn.btn-primary.btn-primary-ghost.col-sm-5.col-xs-12.challenge-step-btn-prev.btn-lg(id='#{index - 1}') Go to my previous step
.challenge-step-counter.large-p.col-sm-2.col-xs-12.text-center (#{index + 1} / #{description.length}) .challenge-step-counter.large-p.col-sm-2.col-xs-12.text-center (#{index + 1} / #{description.length})
if index + 1 === description.length if index + 1 === description.length
.btn.btn-primary.col-sm-5.col-xs-12.challenge-step-btn-finish(id='last' class=step[3] && !isCompleted ? 'disabled' : '') Finish challenge .btn.btn-primary.col-sm-5.col-xs-12.challenge-step-btn-finish.btn-lg(id='last' class=step[3] && !isCompleted ? 'disabled' : '') Finish challenge
else else
.btn.btn-primary.col-sm-5.col-xs-12.challenge-step-btn-next(id='#{index}' class=step[3] && !isCompleted ? 'disabled' : '') Go to my next step .btn.btn-primary.col-sm-5.col-xs-12.challenge-step-btn-next.btn-lg(id='#{index}' class=step[3] && !isCompleted ? 'disabled' : '') Go to my next step
.clearfix .clearfix
.spacer
#challenge-step-modal.modal(tabindex='-1') #challenge-step-modal.modal(tabindex='-1')
.modal-dialog.animated.fadeIn.fast-animation .modal-dialog.animated.fadeIn.fast-animation
.modal-content .modal-content
@ -37,11 +39,11 @@ block content
if (user) if (user)
#challenge-step-btn-submit.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge #challenge-step-btn-submit.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge
else else
a.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge a.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) Go to my next challenge
script. script.
var common = window.common || { init: [] }; var common = window.common || { init: [] };
common.challengeId = !{JSON.stringify(challengeId)}; common.challengeId = !{JSON.stringify(id)};
common.challengeName = !{JSON.stringify(name)}; common.challengeName = !{JSON.stringify(name)};
common.challengeType = !{JSON.stringify(challengeType)}; common.challengeType = !{JSON.stringify(challengeType)};
common.dashedName = !{JSON.stringify(dashedName || '')}; common.dashedName = !{JSON.stringify(dashedName || '')};

View File

@ -2,11 +2,10 @@ extends ../layout-wide
block content block content
.row .row
.col-xs-12.col-sm-12.col-md-4.bonfire-top .col-xs-12.col-sm-12.col-md-4.bonfire-top
h1.text-center= name h4.text-center= name
.well hr
h4
ol ol
for step, index in details for step, index in description
.row.checklist-element(id="#{dashedName + index}") .row.checklist-element(id="#{dashedName + index}")
.col-xs-3.col-sm-1.col-md-2.padded-ionic-icon.text-center .col-xs-3.col-sm-1.col-md-2.padded-ionic-icon.text-center
input(type='checkbox' class='challenge-list-checkbox') input(type='checkbox' class='challenge-list-checkbox')
@ -19,17 +18,13 @@ block content
if (user) if (user)
a.btn.btn-primary.btn-big.btn-block#completed-courseware-editorless I've completed this challenge (ctrl + enter) a.btn.btn-primary.btn-big.btn-block#completed-courseware-editorless I've completed this challenge (ctrl + enter)
else else
a.btn.btn-big.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) I've completed this challenge (ctrl + enter) a.btn.btn-big.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) I've completed this challenge (ctrl + enter)
script. script.
var userLoggedIn = true; var userLoggedIn = true;
.button-spacer .button-spacer
.btn-group.input-group.btn-group-justified .btn-group.input-group.btn-group-justified
.btn.btn-success.btn-big#challenge-help-btn .btn.btn-primary.btn-big#challenge-help-btn Get help
i.fa.fa-medkit .btn.btn-primary.btn-big#trigger-issue-modal Report a bug
| &nbsp; Get help
.btn.btn-success.btn-big#trigger-issue-modal
i.fa.fa-bug
| &nbsp; Report a bug
if (!user) if (!user)
.button-spacer .button-spacer
a.btn.btn-big.signup-btn.btn-block(href='/login') Sign in so you can save your progress a.btn.btn-big.signup-btn.btn-block(href='/login') Sign in so you can save your progress
@ -51,13 +46,13 @@ block content
if (user) if (user)
a.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf) I've completed this challenge (ctrl + enter) a.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf) I've completed this challenge (ctrl + enter)
else else
a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) I've completed this challenge (ctrl + enter) a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) I've completed this challenge (ctrl + enter)
include ../partials/challenge-modals include ../partials/challenge-modals
script. script.
var common = window.common || { init: [] }; var common = window.common || { init: [] };
common.challengeId = !{JSON.stringify(challengeId)}; common.challengeId = !{JSON.stringify(id)};
common.challengeName = !{JSON.stringify(name)}; common.challengeName = !{JSON.stringify(name)};
common.challengeType = !{JSON.stringify(challengeType)}; common.challengeType = !{JSON.stringify(challengeType)};
common.dashedName = !{JSON.stringify(dashedName)}; common.dashedName = !{JSON.stringify(dashedName)};
@ -91,9 +86,4 @@ block content
}); });
}); });
document.addEventListener('gitter-sidecar-ready', function(e) {
if (window.main) {
window.main.chat.createHelpChat('freecodecamp/help', '#challenge-help-btn');
}
});
include ../partials/challenge-footer include ../partials/challenge-footer

View File

@ -2,17 +2,16 @@ extends ../layout-wide
block content block content
.row .row
.col-md-4.bonfire-top .col-md-4.bonfire-top
h1.text-center= name h4.text-center= name
.well hr
h4
ol ol
for step, index in details for step, index in description
.row.checklist-element(id="#{dashedName + index}") .row.checklist-element(id="#{dashedName + index}")
.col-xs-3.col-sm-1.col-md-2.padded-ionic-icon.text-center .col-xs-3.col-sm-1.col-md-2.padded-ionic-icon.text-center
input(type='checkbox' class='challenge-list-checkbox') input(type='checkbox' class='challenge-list-checkbox')
.col-xs-9.col-sm-11.col-md-10 .col-xs-9.col-sm-11.col-md-10
li.step-text.wrappable!= step li.step-text.wrappable!= step
.col-md-8 .col-xs-12.col-sm-12.col-md-8
.embed-responsive.embed-responsive-16by9 .embed-responsive.embed-responsive-16by9
iframe.embed-responsive-item(src='//player.vimeo.com/video/#{video}') iframe.embed-responsive-item(src='//player.vimeo.com/video/#{video}')
br br
@ -21,15 +20,11 @@ block content
script. script.
var userLoggedIn = true; var userLoggedIn = true;
else else
a.btn.btn-big.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge (ctrl + enter) a.btn.btn-big.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) Go to my next challenge (ctrl + enter)
.button-spacer .button-spacer
.btn-group.input-group.btn-group-justified .btn-group.input-group.btn-group-justified
.btn.btn-success.btn-big#challenge-help-btn .btn.btn-primary.btn-primary-ghost.btn-big#challenge-help-btn Help
i.fa.fa-medkit .btn.btn-primary.btn-primary-ghost.btn-big#trigger-issue-modal Bug
| &nbsp; Help
.btn.btn-success.btn-big#trigger-issue-modal
i.fa.fa-bug
| &nbsp; Bug
if (!user) if (!user)
.button-spacer .button-spacer
a.btn.btn-big.signup-btn.btn-block(href='/login') Sign in so you can save your progress a.btn.btn-big.signup-btn.btn-block(href='/login') Sign in so you can save your progress
@ -65,12 +60,12 @@ block content
a.btn.btn-lg.btn-block.btn-twitter(target="_blank", href="https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20PASTE_YOUR_CODEPEN_URL_HERE_USING_FULL_INSTEAD_OF_PEN%20%0A%20%23LearnToCode%20%23JavaScript", onclick="ga('send', 'event', 'twitter', 'share', 'challenge completion share');") a.btn.btn-lg.btn-block.btn-twitter(target="_blank", href="https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20PASTE_YOUR_CODEPEN_URL_HERE_USING_FULL_INSTEAD_OF_PEN%20%0A%20%23LearnToCode%20%23JavaScript", onclick="ga('send', 'event', 'twitter', 'share', 'challenge completion share');")
i.fa.fa-twitter &thinsp;Tweet this project i.fa.fa-twitter &thinsp;Tweet this project
else else
a.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge a.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) Go to my next challenge
include ../partials/challenge-modals include ../partials/challenge-modals
script. script.
var common = window.common || { init: [] }; var common = window.common || { init: [] };
common.challengeId = !{JSON.stringify(challengeId)}; common.challengeId = !{JSON.stringify(id)};
common.challengeName = !{JSON.stringify(name)}; common.challengeName = !{JSON.stringify(name)};
common.dashedName = !{JSON.stringify(dashedName)}; common.dashedName = !{JSON.stringify(dashedName)};
common.challengeType = !{JSON.stringify(challengeType)}; common.challengeType = !{JSON.stringify(challengeType)};
@ -110,25 +105,4 @@ block content
$('#complete-zipline-or-basejump-dialog').modal('show'); $('#complete-zipline-or-basejump-dialog').modal('show');
}); });
}); });
document.addEventListener('gitter-sidecar-ready', function(e) {
var room = 'freecodecamp/help';
var title;
if (common.challengeType === '4') {
room = 'freecodecamp/helpBasejumps';
title = 'Basejump Help';
}
if (common.challengeType === '3') {
room = 'freecodecamp/helpZiplines';
title = 'Zipline Help';
}
if (window.main) {
window.main.chat.createHelpChat(room, '#challenge-help-btn', title);
}
});
include ../partials/challenge-footer include ../partials/challenge-footer

View File

@ -1,8 +1,7 @@
extends ../layout extends ../layout
block content block content
.panel.panel-info h1.text-center Commit to one of these nonprofits
.panel-heading.text-center Commit to one of these nonprofits hr
.panel-body
.row .row
.col-xs-12.col-sm-10.col-sm-offset-1 .col-xs-12.col-sm-10.col-sm-offset-1
for nonprofit in nonprofits for nonprofit in nonprofits

View File

@ -1,7 +1,5 @@
extends ../layout extends ../layout
block content block content
.panel.panel-info
.panel-body
h2.text-center Commit to yourself. Commit to a nonprofit. h2.text-center Commit to yourself. Commit to a nonprofit.
.row .row
.col-xs-12.col-sm-6.col-sm-offset-3 .col-xs-12.col-sm-6.col-sm-offset-3
@ -15,6 +13,7 @@ block content
img.img-responsive(src='#{imgUrl}' alt='#{imgAlt}') img.img-responsive(src='#{imgUrl}' alt='#{imgAlt}')
p.large-p p.large-p
= description = description
p
a(href='/commit/directory') ...or see other nonprofits a(href='/commit/directory') ...or see other nonprofits
.spacer .spacer
form.form(name='commit') form.form(name='commit')
@ -41,16 +40,16 @@ block content
.col-xs-12.col-sm-6.col-sm-offset-3 .col-xs-12.col-sm-6.col-sm-offset-3
h3 Step 2: How much do you want to pledge monthly until you earn that certification? h3 Step 2: How much do you want to pledge monthly until you earn that certification?
.btn-group.btn-group-justified(data-toggle='buttons' role='group') .btn-group.btn-group-justified(data-toggle='buttons' role='group')
label.btn.btn-success label.btn.btn-primary
input(type='radio' id='5-dollar-pledge' value='5' name='amount') input(type='radio' id='5-dollar-pledge' value='5' name='amount')
| $5 per month | $5 per month
label.btn.btn-success.active label.btn.btn-primary.active
input(type='radio' id='10-dollar-pledge' value='10' name='amount' checked="checked") input(type='radio' id='10-dollar-pledge' value='10' name='amount' checked="checked")
| $10 per month | $10 per month
label.btn.btn-success label.btn.btn-primary
input(type='radio' id='25-dollar-pledge' value='25' name='amount') input(type='radio' id='25-dollar-pledge' value='25' name='amount')
| $25 per month | $25 per month
label.btn.btn-success label.btn.btn-primary
input(type='radio' id='50-dollar-pledge' value='50' name='amount') input(type='radio' id='50-dollar-pledge' value='50' name='amount')
| $50 per month | $50 per month
.spacer .spacer
@ -80,7 +79,6 @@ block content
.col-xs-12.col-sm-6.col-sm-offset-3.text-center .col-xs-12.col-sm-6.col-sm-offset-3.text-center
.button-spacer .button-spacer
a.btn.btn-block.btn-lg.btn-default(href='/map') Maybe later a.btn.btn-block.btn-lg.btn-default(href='/map') Maybe later
.spacer
script. script.
$(function() { $(function() {
$('#commit-btn-donate').click(function() { $('#commit-btn-donate').click(function() {

View File

View File

@ -1,26 +1,27 @@
extends layout extends layout
block content block content
.jumbotron
.text-center .text-center
h1.landing-heading Learn to code and help nonprofits. h1.landing-heading Learn to code and help nonprofits.
.spacer .spacer
.row .row
.big-break
.big-break
.big-break
.col-xs-12.col-sm-12.col-md-3 .col-xs-12.col-sm-12.col-md-3
h3.nowrap Get connected img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_connect.svg', alt='Get great references and connections to start your software engineer career')
img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_connect.svg.gz', alt='Get great references and connections to start your software engineer career') p.large-p Join a community of 100,000+ developers.
p.landing-p Join a community of 100,000+ motivated people.
.col-xs-12.col-sm-12.col-md-3 .col-xs-12.col-sm-12.col-md-3
h3.nowrap Learn JavaScript img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_learn.svg', alt='Learn to code and learn full stack JavaScript')
img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_learn.svg.gz', alt='Learn to code and learn full stack JavaScript') p.large-p Work together on coding challenges.
p.landing-p Work together on Full Stack JavaScript coding challenges.
.col-xs-12.col-sm-12.col-md-3 .col-xs-12.col-sm-12.col-md-3
h3.nowrap Build your portfolio img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_portfolio.svg', alt='Build a portfolio of apps for nonprofits')
img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_portfolio.svg.gz', alt='Build a portfolio of apps for nonprofits') p.large-p Build a portfolio of apps that solve real problems.
p.landing-p Build apps that solve real problems for real people.
.col-xs-12.col-sm-12.col-md-3 .col-xs-12.col-sm-12.col-md-3
h3.nowrap Help nonprofits img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_nonprofits.svg', alt='Help empower nonprofits with code')
img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_nonprofits.svg.gz', alt='Help empower nonprofits with code') p.large-p Empowering nonprofits with code.
p.landing-p Give nonprofits a boost by empowering them with code. .big-break
.big-break
.big-break
.big-break .big-break
.row .row
.col-xs-12.col-sm-8.col-sm-offset-2 .col-xs-12.col-sm-8.col-sm-offset-2
@ -89,8 +90,9 @@ block content
.spacer .spacer
hr hr
.spacer .spacer
.col-xs-offset-0.col-sm-offset-1.text-left .col-xs-offset-0.col-sm-offset-1.text-left.large-p
h2 Here's why you should join our open source community right now: h2 Here's why you should join our open source community right now:
.spacer
ul.large-li ul.large-li
li.ion-code &thinsp; You'll get help in real time from our community chat rooms. li.ion-code &thinsp; You'll get help in real time from our community chat rooms.
li.ion-code &thinsp; You'll meet up with other coders in your city. li.ion-code &thinsp; You'll meet up with other coders in your city.

View File

@ -3,6 +3,11 @@ html(lang='en')
head head
include partials/meta include partials/meta
include partials/stylesheets include partials/stylesheets
if showAside
body.map-aside-body
include partials/scripts
block content
else
body.no-top-and-bottom-margins.full-screen-body-background body.no-top-and-bottom-margins.full-screen-body-background
include partials/scripts include partials/scripts
include partials/navbar include partials/navbar

View File

@ -0,0 +1,69 @@
extends ../layout-wide
block content
.row
.col-xs-12.col-md-6.col-md-offset-3
for superBlock, index in superBlocks
if index > 0
.row
h2.text-center #{superBlock.name}
.text-center.small Requires completion of the below challenges marked with a *
hr
for challengeBlock in superBlock.blocks
.row
a(href='#' name=challengeBlock.dashedName)
.spacer.negative-55
.row
h3.bold #{challengeBlock.name} (#{challengeBlock.time})
for challenge in challengeBlock.challenges
.col-xs-12.col-sm-9.col-md-10
if challenge.completed
p.text-primary.ion-checkmark-circled.padded-ionic-icon.negative-15(name="#{challenge.dashedName}") &nbsp;
a(href="/challenges/#{challenge.dashedName}" target='_parent')
= challenge.title
span.sr-only= " Complete"
else if challenge.isRequired
p.ion-ios-circle-outline.padded-ionic-icon.negative-15(name="#{challenge.dashedName}") &nbsp;
a(name="#{challenge.dashedName}" target='_parent' href="/challenges/#{challenge.dashedName}" class=challenge.isComingSoon ? 'disabled' : '')
span= challenge.title
span.sr-only= " Incomplete"
if challenge.markNew
span.text-success.small &thinsp; &thinsp;
strong
em New
if challengeBlock.isComingSoon
span.text-success.small &thinsp; &thinsp;
strong
em Coming Soon
span.text-primary &thinsp; &thinsp;
strong *
else
p.ion-ios-circle-outline.padded-ionic-icon.negative-15(name="#{challenge.dashedName}") &nbsp;
a(name="#{challenge.dashedName}" target='_parent' href="/challenges/#{challenge.dashedName}" class=challenge.isComingSoon ? 'disabled' : '')
span= challenge.title
span.sr-only= " Incomplete"
if challenge.markNew
span.text-success.small &thinsp; &thinsp;
strong
em New
if challengeBlock.isComingSoon
span.text-success.small &thinsp; &thinsp;
strong
em Coming Soon
.row
h2.text-center Full Stack Development Certification
hr
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Greenfield Nonprofit Project 1
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Greenfield Nonprofit Project 2
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Legacy Nonprofit Project 1
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Legacy Nonprofit Project 2
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Claim your Full Stack Development Certification
.row
h2.text-center Coding Interview Preparation
hr
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Whiteboard Coding Interview Training
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Critical Thinking Interview Training
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Mock Interview 1
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Mock Interview 2
p.ion-locked.padded-ionic-icon.negative-15 &nbsp; Mock Interview 3
.spacer

View File

@ -1,27 +0,0 @@
extends ../layout
block content
script.
var challengeName = 'Nonprofits View';
.col-xs-12.col-sm-12.col-md-12
.panel.panel-info
.panel-heading.text-center Nonprofits We Help
.panel-body
.col-xs-12.col-sm-12.col-md-10.col-md-offset-1
h1.text-primary.text-center Our campers have saved nonprofits $#{totalSavings}.
.spacer
for nonprofit in nonprofits
.spacer
.row
.col-xs-12.col-sm-3
img.img-responsive.img-center(src=nonprofit.logoUrl)
.col-xs-12.col-sm-9
h2.negative-15= nonprofit.name
h3.negative-15= nonprofit.whatDoesNonprofitDo
if (nonprofit.moneySaved > 0)
h4.negative-15.text-primary Estimated Cost Savings for Nonprofit: $#{nonprofit.moneySaved.toString().replace(/000$/, ',000')}
a.text-center.btn.btn-primary.btn-lg(href='/nonprofits/' + nonprofit.name.toLowerCase().replace(/\s/g, '-')) Read more
.spacer
.col-xs-12.col-sm-8.col-sm-offset-2
if (!user)
a.btn.btn-cta.signup-btn.btn-block(href="/nonprofits-form") My nonprofit needs coding help
.spacer

View File

@ -1,78 +0,0 @@
extends ../layout
block content
script.
var challengeName = 'Nonprofits View';
.panel.panel-info
.panel-heading.text-center= title
.panel-body
.row
.col-xs-12.col-sm-10.col-sm-offset-1
.row
.col-xs-12
img.img-center.img-responsive(src=imageUrl)
.spacer
.row
.col-xs-12.col-sm-4
img.img-responsive(src=logoUrl)
.col-xs-12.col-sm-8
.col-xs-12
h4= whatDoesNonprofitDo
h4
a(href=websiteLink)= websiteLink
.spacer
h3 Project Description:
.col-xs-12
h4.negative-15 #{projectDescription} (About #{estimatedHours} hours per camper)
.spacer
h3 This project involves building:
h4.negative-15.col-xs-12
if (approvedWebsite)
.ion-android-globe &nbsp; Website
if (approvedDonor)
.ion-card &nbsp; Donor Management System
if (approvedInventory)
.ion-ios-box &nbsp; Inventory Management System
if (approvedVolunteer)
.ion-android-calendar &nbsp; Volunteer Management System
if (approvedForm)
.ion-ios-list &nbsp; Webform
if (approvedCommunity)
.ion-ios-people &nbsp; Community Management System
if (approvedELearning)
.ion-university &nbsp; E-learning Platform
if (approvedOther)
.ion-settings &nbsp; Other tools
h3 Project Status: #{currentStatus}
if (moneySaved > 0)
h3.text-primary Estimated Cost Savings for Nonprofit: $#{moneySaved.toString().replace(/000$/, ',000')}
if (interestedCampers && interestedCampers.length > 0)
h3 Interested campers:
.col-xs-12.text-left
for interestedCamper in interestedCampers
a(href='/' + interestedCamper.username class="interested-camper-image")
img.profile-picture.float-right(src=interestedCamper.picture)
if (assignedCampers && assignedCampers.length > 0)
h3 Assigned campers:
.col-xs-12.text-left
for assignedCamper in assignedCampers
a(href='/' + assignedCamper.username class="interested-camper-image")
img.profile-picture.float-right(src=assignedCamper.picture)
if (!buttonActive)
.col-xs-12.col-sm-8.col-sm-offset-2
.text-center
if !user
a.btn.btn-cta.signup-btn.btn-block(href="/login") Start learning to code (it's free)
.button-spacer
else
a.btn.btn-primary.btn-big.btn-block.disabled(href='/nonprofits/interested-in-nonprofit/#{dashedName}') I'm interested in building this project *
p * Complete all our Bonfires, Ziplines, and Basejumps to unlock this.
a.btn.btn-info.btn-big.btn-block(href='/nonprofits/directory') Show all Nonprofit Projects
.spacer
if (buttonActive)
.col-xs-12.col-sm-8.col-sm-offset-2
.text-center
a.btn.btn-primary.btn-big.btn-block(href='/nonprofits/interested-in-nonprofit/#{dashedName}') I'm interested in building this project
.button-spacer
a.btn.btn-info.btn-big.btn-block(href='/nonprofits/directory') Show all Nonprofit Projects
.spacer

View File

@ -5,3 +5,10 @@ script.
if (typeof localStorage !== 'undefined') { if (typeof localStorage !== 'undefined') {
localStorage.setItem('currentDashedName', typeof common !== 'undefined' && common.dashedName || ''); localStorage.setItem('currentDashedName', typeof common !== 'undefined' && common.dashedName || '');
} }
var common = window.common || { init: [] };
common.helpRoom = !{JSON.stringify(helpRoom)};
document.addEventListener('gitter-sidecar-ready', function(e) {
if (window.main) {
window.main.chat.createHelpChat(common.helpRoom, '#challenge-help-btn');
}
});

View File

@ -5,10 +5,10 @@
a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') × a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×
.modal-body.text-center .modal-body.text-center
h3 Before you submit a new issue, read "Help I've Found a Bug" and browse other issues with this challenge. h3 Before you submit a new issue, read "Help I've Found a Bug" and browse other issues with this challenge.
a.btn.btn-lg.btn-success.btn-block#help-ive-found-a-bug-wiki-article(name='_csrf', value=_csrf) Read "Help I've Found a Bug" a.btn.btn-lg.btn-primary.btn-block#help-ive-found-a-bug-wiki-article(name='_csrf', value=_csrf) Read "Help I've Found a Bug"
a.btn.btn-lg.btn-success.btn-block#search-issue(name='_csrf', value=_csrf) Browse other issues with this challenge a.btn.btn-lg.btn-primary.btn-block#search-issue(name='_csrf', value=_csrf) Browse other issues with this challenge
a.btn.btn-lg.btn-primary.btn-block#report-issue(name='_csrf', value=_csrf) Create my GitHub issue a.btn.btn-lg.btn-primary.btn-block#report-issue(name='_csrf', value=_csrf) Create my GitHub issue
a.btn.btn-lg.btn-info.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel a.btn.btn-lg.btn-primary.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel
#reset-modal.modal(tabindex='-1') #reset-modal.modal(tabindex='-1')
.modal-dialog.animated.fadeInUp.fast-animation .modal-dialog.animated.fadeInUp.fast-animation
@ -17,5 +17,5 @@
a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') × a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×
.modal-body .modal-body
h3 This will restore your code editor to its original state. h3 This will restore your code editor to its original state.
a.btn.btn-lg.btn-info.btn-block#reset-button(href='#', data-dismiss='modal', aria-hidden='true') Clear my code a.btn.btn-lg.btn-warning.btn-block#reset-button(href='#', data-dismiss='modal', aria-hidden='true') Clear my code
a.btn.btn-lg.btn-primary.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel a.btn.btn-lg.btn-primary.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel

View File

@ -1,2 +1,6 @@
// scripts should be moved here // scripts should be moved here
script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer) script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer)
aside.map-aside.is-collapsed
.map-aside-action-bar
a.map-aside-action-item.map-aside-action-pop-out(href='/map' target='_blank' aria-label='open map in new tap')
button.map-aside-action-item.map-aside-action-collapse(aria-label='close map aside')

View File

@ -7,9 +7,9 @@ nav.navbar.navbar-default.navbar-fixed-top.nav-height
img.img-responsive.nav-logo(src='https://s3.amazonaws.com/freecodecamp/freecodecamp_logo.svg', alt='learn to code javascript at Free Code Camp logo') img.img-responsive.nav-logo(src='https://s3.amazonaws.com/freecodecamp/freecodecamp_logo.svg', alt='learn to code javascript at Free Code Camp logo')
.collapse.navbar-collapse .collapse.navbar-collapse
ul.nav.navbar-nav.navbar-right.hamburger-dropdown ul.nav.navbar-nav.navbar-right.hamburger-dropdown
li li.hidden-xs
a.learn-btn(href='#') Learn a#nav-map-btn(href='#' onclick='return false') Map
li li.visible-xs
a(href='/map') Map a(href='/map') Map
li.hidden-xs li.hidden-xs
a#nav-chat-btn(href='#' onclick="return false") Chat a#nav-chat-btn(href='#' onclick="return false") Chat
@ -24,28 +24,11 @@ nav.navbar.navbar-default.navbar-fixed-top.nav-height
li li
a(href='/about') About a(href='/about') About
if !user if !user
li &thinsp; &thinsp; &thinsp;
li li
a.btn.signup-btn.signup-btn-nav.signin-button-nav(href='/login') Sign in a(href='/login') Sign in
else else
li.brownie-points-nav li.brownie-points-nav
a(href='/' + user.username) [&thinsp;#{user.progressTimestamps.length}&thinsp;] a(href='/' + user.username) [&thinsp;#{user.progressTimestamps.length}&thinsp;]
.hidden-xs.hidden-sm .hidden-xs.hidden-sm
a(href='/' + user.username) a(href='/' + user.username)
img.profile-picture.float-right(src='#{user.picture}') img.profile-picture.float-right(src='#{user.picture}')
script.
$(document).ready(function() {
$('.learn-btn').click(function(e) {
var challengeDashedName = null;
e.preventDefault();
if (typeof dashedName === "string") {
return location.reload();
}
if (typeof localStorage !== 'undefined') {
challengeDashedName = localStorage.getItem('currentDashedName');
}
window.location = challengeDashedName ?
'/challenges/' + challengeDashedName :
'/map';
});
});

File diff suppressed because one or more lines are too long

View File

@ -1,12 +1,30 @@
extends ../layout extends ../layout
block content block content
.col-xs-12 .col-xs-12
.panel.panel-info
.panel-body
h2.text-center We're an open source community of people h2.text-center We're an open source community of people
br br
| who learn to code and help nonprofits. | who learn to code and help nonprofits.
.spacer .spacer
.row
.col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3
h2
table.population-table.img-center
tr
td Established:&thinsp;
td
span.text-primary #{daysRunning}&thinsp;
| days ago
tr
td Population:&thinsp;&thinsp;&thinsp;
td
span.text-primary #{camperCount}&thinsp;
| campers
tr
td Completed:&thinsp;&thinsp;&thinsp;
td
span.text-primary #{globalCompletedCount}&thinsp;
| challenges
.row .row
.col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3 .col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3
h2 Free Code Camp around the web: h2 Free Code Camp around the web:
@ -50,21 +68,31 @@ block content
h2 Other useful links: h2 Other useful links:
table.table.link-table table.table.link-table
tr
td.text-right
.ion-locked
td
a(href="/terms-and-privacy") Our Privacy Policy, Terms of Service and Code of Conduct
tr tr
td.text-right td.text-right
.ion-erlenmeyer-flask .ion-erlenmeyer-flask
td td
a(href="/labs") Extra-curricular Apps Built by Campers a(href="/labs") Extra-curricular apps built by campers
tr tr
td.text-right td.text-right
.ion-chatbox .ion-chatbox
td td
a(href="/stories") Stories from campers who've become professional developers a(href="/stories") Stories from campers who've become professional developers
tr
td.text-right
.ion-locked
td
a(href="/privacy") Our privacy policy
tr
td.text-right
.ion-happy-outline
td
a(href="/code-of-conduct") Our code of conduct
tr
td.text-right
.ion-document-text
td
a(href="/terms") Our terms of service
.spacer .spacer
h2 Which camper to contact for: h2 Which camper to contact for:
table.table.table-stripe table.table.table-stripe
@ -109,7 +137,15 @@ block content
td td
a(href='https://gitter.im/CodeNonprofit' target='_blank') @CodeNonprofit a(href='https://gitter.im/CodeNonprofit' target='_blank') @CodeNonprofit
tr tr
td Hikes curriculum td Video challenge curriculum
td
a(href='https://gitter.im/BrianaMarie' target='_blank') @BrianaMarie
tr
td Twitch.tv channel
td
a(href='https://gitter.im/BrianaMarie' target='_blank') @BrianaMarie
tr
td Youtube channel
td td
a(href='https://gitter.im/BrianaMarie' target='_blank') @BrianaMarie a(href='https://gitter.im/BrianaMarie' target='_blank') @BrianaMarie
tr tr
@ -124,14 +160,6 @@ block content
td CamperBot td CamperBot
td td
a(href='https://gitter.im/LTegman' target='_blank') @LTegman a(href='https://gitter.im/LTegman' target='_blank') @LTegman
tr
td Twitch.tv channel
td
a(href='https://gitter.im/Septimus' target='_blank') @Septimus
tr
td Youtube channel
td
a(href='https://gitter.im/Septimus' target='_blank') @Septimus
tr tr
td Translation and Internationalization td Translation and Internationalization
td td

View File

@ -0,0 +1,30 @@
extends ../layout
block content
.col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3
h1.text-center Code of Conduct
hr
p
| Free Code Camp is friendly place to learn to code. Were committed to keeping it that way.
p
| All campers are required to agree with the following code of conduct. Well enforce this code. Were expecting cooperation from all campers in ensuring a friendly environment for everybody.
p In short: be nice to your fellow campers.
p Remember these 3 things and your fellow campers will like you:
ol
li Compliment your fellow campers when they do good work. Congratulate them when they accomplish something (like completing one of our certifications or getting a job).
li Critique the work, not the camper doing it.
li Only argue about something if its important to the greater discussion.
p
| Free Code Camp should be a harassment-free experience for everyone, regardless of gender, gender identity and expression, age, sexual orientation, disability, physical appearance, body size, race, national origin, or religion (or lack thereof).
p
| We do not tolerate harassment of campers in any form, anywhere on Free Code Camps online media (Gitter, Twitch, Facebook, etc.) or during pair programming. Harassment includes sexual language and imagery, deliberate intimidation, stalking, unwelcome sexual attention, libel, and any malicious hacking or social engineering.
p
| If a camper engages in harassing behavior, our team will take any action we deem appropriate, up to and including banning them from Free Code Camp.
p
| No bots are allowed in any of the Official Chat Rooms without prior explicit permission from the FCC Core Team.
p
| We want everyone to feel safe and respected. If you are being harassed or notice that someone else is being harassed, say something! Go to our &thinsp;
a(href='https://gitter.im/freecodecamp/admin' target='_blank') Admin room in Gitter
| &thinsp; and explain what has happened where (preferably with a screen shot of the offending language) so we can take fast action.
p
| If you have questions about this code of conduct, email us at&thinsp;
a(href='mailto:team@freecodecamp.com') team@freecodecamp.com

View File

@ -0,0 +1,54 @@
extends ../layout
block content
table.table.link-table
tr
td.text-right
.ion-erlenmeyer-flask
td
a(href="/labs") Cool Apps Built by Campers
tr
td.text-right
.ion-chatbox
td
a(href="/stories") Stories from Campers
tr
td.text-right
.ion-speakerphone
td
a(href='//medium.freecodecamp.com', target='_blank') Medium Publication
tr
td.text-right
.ion-social-github
td
a(href="//github.com/freecodecamp", target='_blank') GitHub Repository
tr
td.text-right
.ion-social-reddit
td
a(href="//www.reddit.com/r/freecodecamp", target='_blank') Subreddit
tr
td.text-right
.ion-social-linkedin
td
a(href="//www.linkedin.com/edu/school?id=166029", target='_blank') LinkedIn University Page
tr
td.text-right
.ion-social-twitter
td
a(href="//twitter.com/freecodecamp", target='_blank') Twitter Feed
tr
td.text-right
.ion-social-facebook
td
a(href="//facebook.com/freecodecamp") Facebook Page
tr
td.text-right
.ion-social-twitch-outline
td
a(href="//twitch.tv/freecodecamp", target='_blank') Twitch.tv Channel
tr
td.text-right
.ion-locked
td
a(href="//github.com/FreeCodeCamp/freecodecamp/wiki/Free-Code-Camp's-Privacy-Policy") Privacy Policy
.spacer

View File

@ -1,6 +1,5 @@
extends ../layout extends ../layout
block content block content
.jumbotron
.text-center .text-center
.row .row
.col-xs-12 .col-xs-12
@ -16,23 +15,22 @@ block content
hr hr
.spacer .spacer
h2 Our process: h2 Our process:
.spacer
.row .row
.col-xs-12.col-sm-12.col-md-4 .col-xs-12.col-sm-12.col-md-4
h3.nowrap Your idea
img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_portfolio.svg.gz', alt='Image of a briefcase') img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_portfolio.svg.gz', alt='Image of a briefcase')
p.landing-p You tell us how we can help you. p.large-p You tell us how we can help you.
.col-xs-12.col-sm-12.col-md-4 .col-xs-12.col-sm-12.col-md-4
h3.nowrap Our team
img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_nonprofits.svg.gz', alt='Image of people putting their hands together in a huddle') img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_nonprofits.svg.gz', alt='Image of people putting their hands together in a huddle')
p.landing-p We'll hand pick developers and a project manager. p.large-p We'll hand pick developers and a project manager.
.col-xs-12.col-sm-12.col-md-4 .col-xs-12.col-sm-12.col-md-4
h3.nowrap Your solution
img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_connect.svg.gz', alt='image of two people high-fiving') img.img-responsive.landing-icon.img-center(src= 'https://s3.amazonaws.com/freecodecamp/landingIcons_connect.svg.gz', alt='image of two people high-fiving')
p.landing-p Together we'll set milestones and complete your project. p.large-p Together we'll set milestones and complete your project.
.spacer .spacer
hr hr
.spacer .spacer
h2 Solutions we can help you build: h2 Solutions we can help you build:
.spacer
.text-center.negative-35 .text-center.negative-35
.col-xs-12.col-sm-12.col-md-3 .col-xs-12.col-sm-12.col-md-3
.landing-skill-icon.ion-android-globe .landing-skill-icon.ion-android-globe
@ -61,8 +59,9 @@ block content
.spacer .spacer
hr hr
.spacer .spacer
.large-p.text-left.col-xs-offset-0.col-sm-offset-1 .col-xs-offset-0.col-sm-offset-1.text-left.large-p
h2 Our developers build projects for nonprofits who: h2 Our developers build projects for nonprofits who:
.spacer
ul.large-li ul.large-li
li.ion-code &thinsp; already have people who benefit from their services. li.ion-code &thinsp; already have people who benefit from their services.
li.ion-code &thinsp; are registered with their government and have tax-exempt status. li.ion-code &thinsp; are registered with their government and have tax-exempt status.
@ -73,5 +72,3 @@ block content
.row .row
.col-xs-12.col-sm-8.col-sm-offset-2 .col-xs-12.col-sm-8.col-sm-offset-2
a.btn.btn-cta.signup-btn.btn-block(href="/nonprofits-form") My nonprofit needs coding help a.btn.btn-cta.signup-btn.btn-block(href="/nonprofits-form") My nonprofit needs coding help
.button-spacer
a.btn.btn-lg.btn-primary.btn-primary-ghost.btn-block(href="/nonprofits/directory") Browse our directory of nonprofits we've helped

View File

@ -0,0 +1,34 @@
extends ../layout
block content
.col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3
html.
<h2 class='text-center'><a id="Privacy_Policy_5"></a>Privacy Policy</h2>
<hr>
<p>Your privacy is critically important to us. At Free Code Camp we have a few fundamental principles:</p>
<ol>
<li>We dont ask you for personal information unless we truly need it. (We cant stand services that ask you for things like your gender or income level for no apparent reason.)</li>
<li>We dont share your personal information with anyone except to comply with the law, develop our products, or protect our rights.</li>
<li>Unless you ask us not to (by clicking the button that says "hide all my solutions from other people" located on your code portfolio), we will share your solutions and progress with the public as part of our open data initiative. This is intended for academics and researchers to better understand Free Code Camp as an educational model.</li>
<li>We dont store personal information on our servers unless required for the on-going operation of one of our services.</li>
<li>We aim to make it as simple as possible for you to control whats visible to the public, seen by search engines, kept private, and permanently deleted. Below is our privacy policy which incorporates these goals</li>
</ol>
<p>If you have questions about deleting or correcting your personal data please email us at <a mailto="team@freecodecamp.com">team@freecodecamp.com</a></p>
<p>Free Code Camp Inc. (“<strong>Free Code Camp</strong>”) operates several websites including <a href="http://FreeCodeCamp.com/">FreeCodeCamp.com</a>. It is Free Code Camps policy to respect your privacy regarding any information we may collect while operating our websites.</p>
<h3><a id="Website_Visitors_19"></a>Website Visitors</h3>
<p>Like most website operators, Free Code Camp collects non-personally-identifying information of the sort that web browsers and servers typically make available, such as the browser type, language preference, referring site, and the date and time of each visitor request. Free Code Camps purpose in collecting non-personally identifying information is to better understand how Free Code Camps visitors use its website. From time to time, Free Code Camp may release non-personally-identifying information in the aggregate, e.g., by publishing a report on trends in the usage of its website.</p>
<p>Free Code Camp also collects potentially personally-identifying information like Internet Protocol (IP) addresses for logged in users and for users leaving comments on <a href="http://FreeCodeCamp.com">FreeCodeCamp.com</a> blogs. Free Code Camp only discloses logged in user and commenter IP addresses under the same circumstances that it uses and discloses personally-identifying information as described below, except that blog commenter IP addresses and email addresses are visible and disclosed to the administrators of the blog where the comment was left.</p>
<h3><a id="Gathering_of_PersonallyIdentifying_Information_25"></a>Gathering of Personally-Identifying Information</h3>
<p>Many visitors to Free Code Camps websites choose to interact with Free Code Camp in ways that require Free Code Camp to gather personally-identifying information. The amount and type of information that Free Code Camp gathers depends on the nature of the interaction. For example, we ask visitors who create an account for tracking their progress at <a href="http://FreeCodeCamp.com/">FreeCodeCamp.com</a> to provide either an email address or sign in with a social media oauth service like GitHub. Those who engage in transactions with Free Code Camp by placing job ads, for example are asked to provide additional information, including as necessary the personal and financial information required to process those transactions. In each case, Free Code Camp collects such information only insofar as is necessary or appropriate to fulfill the purpose of the visitors interaction with Free Code Camp. Free Code Camp does not disclose personally-identifying information other than as described below. And visitors can always refuse to supply personally-identifying information, with the caveat that it may prevent them from engaging in certain website-related activities.</p>
<h3><a id="Aggregated_Statistics_29"></a>Aggregated Statistics</h3>
<p>Free Code Camp may collect statistics about the behavior of visitors to its websites. For instance, Free Code Camp may monitor the accounts to try and identify spammers. Free Code Camp may display this information publicly or provide it to others. However, Free Code Camp does not disclose personally-identifying information other than as described below.</p>
<h3><a id="Protection_of_Certain_PersonallyIdentifying_Information_33"></a>Protection of Certain Personally-Identifying Information</h3>
<p>Free Code Camp discloses potentially personally-identifying and personally-identifying information only to those of its employees, contractors and affiliated organizations that (i) need to know that information in order to process it on Free Code Camps behalf or to provide services available at Free Code Camps websites, and (ii) that have agreed not to disclose it to others. Some of those employees, contractors and affiliated organizations may be located outside of your home country; by using Free Code Camps websites, you consent to the transfer of such information to them. Free Code Camp will not rent or sell potentially personally-identifying and personally-identifying information to anyone. Other than to its employees, contractors and affiliated organizations, as described above, Free Code Camp discloses potentially personally-identifying and personally-identifying information only in response to a subpoena, court order or other governmental request, or when Free Code Camp believes in good faith that disclosure is reasonably necessary to protect the property or rights of Free Code Camp, third parties or the public at large. If you are a registered user of an Free Code Camp website and have supplied your email address, Free Code Camp may occasionally send you an email to tell you about new features, solicit your feedback, or just keep you up to date with whats going on with Free Code Camp and our products. We primarily use our various product blogs to communicate this type of information, so we expect to keep this type of email to a minimum. If you send us a request (for example via a support email or via one of our feedback mechanisms), we reserve the right to publish it in order to help us clarify or respond to your request or to help us support other users. Free Code Camp takes all measures reasonably necessary to protect against the unauthorized access, use, alteration or destruction of potentially personally-identifying and personally-identifying information.</p>
<h3><a id="Cookies_37"></a>Cookies</h3>
<p>A cookie is a string of information that a website stores on a visitors computer, and that the visitors browser provides to the website each time the visitor returns. Free Code Camp uses cookies to help Free Code Camp identify and track visitors, their usage of Free Code Camp website, and their website access preferences. Free Code Camp visitors who do not wish to have cookies placed on their computers should set their browsers to refuse cookies before using Free Code Camps websites, with the drawback that certain features of Free Code Camps websites may not function properly without the aid of cookies.</p>
<h3><a id="Business_Transfers_41"></a>Business Transfers</h3>
<p>If Free Code Camp, or substantially all of its assets, were acquired, or in the unlikely event that Free Code Camp goes out of business or enters bankruptcy, user information would be one of the assets that is transferred or acquired by a third party. You acknowledge that such transfers may occur, and that any acquirer of Free Code Camp may continue to use your personal information as set forth in this policy.</p>
<h3><a id="Ads_45"></a>Ads</h3>
<p>If in the future we show ads, ads appearing on any of our websites may be delivered to users by advertising partners, who may set cookies. These cookies allow the ad server to recognize your computer each time they send you an online advertisement to compile information about you or others who use your computer. This information allows ad networks to, among other things, deliver targeted advertisements that they believe will be of most interest to you. This Privacy Policy covers the use of cookies by Free Code Camp and does not cover the use of cookies by any advertisers.</p>
<h3><a id="Privacy_Policy_Changes_53"></a>Privacy Policy Changes</h3>
<p>Although most changes are likely to be minor, Free Code Camp may change its Privacy Policy from time to time, and in Free Code Camps sole discretion. Free Code Camp encourages visitors to frequently check this page for any changes to its Privacy Policy. If you have a <a href="http://FreeCodeCamp.com">FreeCodeCamp.com</a> account, you should also check your blogs dashboard for alerts to these changes. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.</p>
<p>This privacy policy is adopted from the Automattic (Free Code Camp) <a href='https://github.com/Free Code Camp/legalmattic'>open source terms</a> and are subject to the <a href='http://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International license</a>. We thank them for making this available.</p>

View File

@ -37,12 +37,6 @@ urlset(xmlns="http://www.sitemaps.org/schemas/sitemap/0.9")
lastmod= now lastmod= now
priority= 0.9 priority= 0.9
url
loc http://www.freecodecamp.com/twitch
changefreq weekly
lastmod= now
priority= 0.9
url url
loc http://www.freecodecamp.com/jobs loc http://www.freecodecamp.com/jobs
changefreq weekly changefreq weekly
@ -76,10 +70,3 @@ urlset(xmlns="http://www.sitemaps.org/schemas/sitemap/0.9")
lastmod= now lastmod= now
changefreq weekly changefreq weekly
priority= 0.5 priority= 0.5
each nonprofit in nonprofits
url
loc #{appUrl}/nonprofits/#{nonprofit.replace(/\s/g, '-')}
lastmod= now
changefreq weekly
priority= 0.9

View File

@ -1,8 +1,7 @@
extends ../layout extends ../layout
block content block content
.panel.panel-info h1.text-center Stories from happy campers
.panel-heading.text-center Stories from happy campers hr
.panel-body.text-left
.row .row
.col-xs-12.col-sm-10.col-sm-offset-1 .col-xs-12.col-sm-10.col-sm-offset-1
.row .row
@ -14,7 +13,7 @@ block content
h3.text-center= story.camper h3.text-center= story.camper
| &nbsp; | &nbsp;
a.fa.fa-linkedin-square.text-primary(alt="#{story.camper}'s LinkedIn Profile", href=story.linkedin, target='_blank') a.fa.fa-linkedin-square.text-primary(alt="#{story.camper}'s LinkedIn Profile", href=story.linkedin, target='_blank')
p.text-justify= story.quote p.small-p.text-justify= story.quote
.col-xs-12.col-sm-10.col-sm-offset-1 .col-xs-12.col-sm-10.col-sm-offset-1
if moreStories if moreStories
.text-center .text-center
@ -24,4 +23,3 @@ block content
if !user if !user
.text-center .text-center
a.btn.btn-cta.signup-btn.btn-block(href="/login") Start learning to code (it's free) a.btn.btn-cta.signup-btn.btn-block(href="/login") Start learning to code (it's free)
.spacer

View File

@ -1,143 +0,0 @@
extends ../layout
block content
.col-xs-12
.panel.panel-info
.panel-body
h1 Privacy Policy
p
| Free Code Camp is committed to respecting the privacy of visitors to our web sites and web applications. The guidelines below explain how we protect the privacy of visitors to
a(href='http://FreeCodeCamp.com') FreeCodeCamp.com
| and its features.
h3
a#Personally_Identifiable_Information_2
| Personally Identifiable Information
p
| Free Code Camp protects the identity of visitors to
a(href='http://FreeCodeCamp.com') FreeCodeCamp.com
| by limiting the collection of personally identifiable information.
p
| Free Code Camp does not knowingly collect or solicit personally identifiable information from or about children under 13, except as permitted by law. If we discover we have received any information from a child under 13 in violation of this policy, we will delete that information immediately. If you believe Free Code Camp has any information from or about anyone under 13, please email us at
okies and software logs
a(href='mailto:team@freecodecamp.com') team@freecodecamp.com
| .
p
| All personally identifiable information you provide to us is used by Free Code Camp and its team to process and manage your account, analyze the demographic of our users, or to deliver services through the site.
p
| If you choose to provide personally identifiable information to us, you may receive occasional emails from us that are relevant to Free Code Camp, getting a job, or learning to code in general.
| Free Code Camp may also use other third-party providers to facilitate the delivery of the services described above, and these third-party providers may be supplied with or have access to personally identifiable information for the sole purpose of providing these services, to you on behalf of Free Code Camp.
p
| Free Code Camp may also disclose personally identifiable information in special legal circumstances. For instance, such information may be used where it is necessary to protect our copyright or intellectual property rights, or if the law requires us to do so.
h3
a#Anonymous_Information_15
| Anonymous Information
p
| Anonymous aggregated data may be provided to other organizations we associate with for statistical purposes. For example, we may report to an organization that a certain percentage of our sites visitors are adults between the ages of 25 and 35.
h3
a#Cookies_and_BeaconsUse_by_Free_Code_Camp_Opting_Out_18
| Cookies and Beacons—Use by Free Code Camp; Opting Out
p
| We use cookies and software logs to monitor the use of
a(href='http://FreeCodeCamp.com') FreeCodeCamp.com
| and to gather non-personal information about visitors to the site. Cookies are small files that Free Code Camp transfers to the hard drives of visitors for record-keeping purposes. These monitoring systems allow us to track general information about our visitors, such as the type of browsers (for example, Firefox or Internet Explorer), the operating systems (for instance, Windows or Macintosh), or the Internet providers (for instance, Comcast) they use. This information is used for statistical and market research purposes to tailor content to usage patterns and to provide services requested by our customers. To delete these cookies, please see your browsers privacy settings.
p
| A beacon is an electronic file object (typically a transparent image) placed in the code of a Web page. We use third party beacons to monitor the traffic patterns of visitors from one
a(href='http://FreeCodeCamp.com') Free Code Camp.com
| page to another and to improve site performance.
| None of the information we gather in this way can be used to identify any individual who visits our site.
h3
a#Security_24
| Security
p
| Any personally identifiable information collected through this site is stored on limited-access servers. We will maintain safeguards to protect these servers and the information they store.
h3
a#Surveys_28
| Surveys
p
| We may occasionally conduct on-line surveys. All surveys are voluntary and you may decline to participate.
h3
a#Copyright_31
| Copyright
p
| All of the content on
a(href='http://FreeCodeCamp.com') FreeCodeCamp.com
| is copyrighted by Free Code Camp. If youd like to redistribute it beyond simply sharing it through social media, please contact us at
a(href='mailto:team@freecodecamp.com') team@freecodecamp.com
| .
h3
a#Contacting_Us_34
| Contacting Us
p
| If you have questions about Free Code Camp, or to correct, update, or remove personally identifiable information, please email us at
a(href='mailto:team@freecodecamp.com') team@freecodecamp.com
| .
h3
a#Links_to_Other_Web_sites_37
| Links to Other Web sites
p
| Free Code Camps sites each contain links to other Web sites. Free Code Camp is not responsible for the privacy practices or content of these third-party Web sites. We urge all
a(href='http://FreeCodeCamp.com') FreeCodeCamp.com
| visitors to follow safe Internet practices: Do not supply Personally Identifiable Information to these Web sites unless you have verified their security and privacy policies.
h3
a#Data_Retention_40
| Data Retention
p
| We retain your information for as long as necessary to permit us to use it for the purposes that we have communicated to you and comply with applicable law or regulations.
h3
a#Business_Transfers_43
| Business Transfers
p
| As we continue to develop our business, we might sell or buy subsidiaries, or business units. In such transactions, customer information generally is one of the transferred business assets but remains subject to the promises made in any pre-existing Privacy Policy (unless, of course, the customer consents otherwise). Also, in the unlikely event that Free Code Camp, or substantially all of its assets are acquired, customer information will be one of the transferred assets, and will remain subject to our Privacy Policy.
h3
a#Your_California_Privacy_Rights_46
| Your California Privacy Rights
p
| If you are a California resident, you are entitled to prevent sharing of your personal information with third parties for their own marketing purposes through a cost-free means. If you send a request to the address above, Free Code Camp will provide you with a California Customer Choice Notice that you may use to opt-out of such information sharing. To receive this notice, submit a written request to
a(target='_blank' href='mailto:href=%22mailto:team@freecodecamp.com') team@freecodecamp.com,
| specifying that you seek your “California Customer Choice Notice.” Please allow at least thirty (30) days for a response.
h3
a#Acceptance_of_Privacy_Policy_Terms_and_Conditions_49
| Acceptance of Privacy Policy Terms and Conditions
p
| By using this site, you signify your agreement to the terms and conditions of this
a(href='http://FreeCodeCamp.com') FreeCodeCamp.com
| Privacy Policy. If you do not agree to these terms, please do not use this site. We reserve the right, at our sole discretion, to change, modify, add, or remove portions of this policy at any time. All amended terms automatically take effect 30 days after they are initially posted on the site. Please check this page periodically for any modifications. Your continued use of
a(href='http://FreeCodeCamp.com') FreeCodeCamp.com
| following the posting of any changes to these terms shall mean that you have accepted those changes.
p
| If you have any questions or concerns, please send an email to
a(href='mailto:team@freecodecamp.com') team@freecodecamp.com
| .
.spacer
hr
.spacer
h1 Terms of Service
p Coming soon
.spacer
hr
.spacer
h1 Code of Conduct
p
| Free Code Camp is friendly place to learn to code. Were committed to keeping it that way.
p
| All campers are required to agree with the following code of conduct. Well enforce this code. Were expecting cooperation from all campers in ensuring a friendly environment for everybody.
p In short: be nice to your fellow campers.
p Remember these 3 things and your fellow campers will like you:
ul
li
| Compliment your fellow campers when they do good work. Congratulate them when they accomplish something (like completing one of our certifications or getting a job).
li Critique the work, not the camper doing it.
li Only argue about something if its important to the greater discussion.
p
| Free Code Camp should be a harassment-free experience for everyone, regardless of gender, gender identity and expression, age, sexual orientation, disability, physical appearance, body size, race, national origin, or religion (or lack thereof).
p
| We do not tolerate harassment of campers in any form, anywhere on Free Code Camps online media (Gitter, Twitch, Facebook, etc.) or during pair programming. Harassment includes sexual language and imagery, deliberate intimidation, stalking, unwelcome sexual attention, libel, and any malicious hacking or social engineering.
p
| If a camper engages in harassing behavior, our team will take any action we deem appropriate, up to and including banning them from Free Code Camp.
p
| No bots are allowed in any of the Official Chat Rooms without prior explicit permission from the FCC Core Team.
p
| We want everyone to feel safe and respected. If you are being harassed or notice that someone else is being harassed, say something! Message @quincylarson, @berkeleytrue, @brianamarie and @codenonprofit in Gitter (preferably with a screen shot of the offending language) so we can take fast action.
p
| If you have questions about this code of conduct, email us at
a(href='mailto:team@freecodecamp.com') team@freecodecamp.com
| .

Some files were not shown because too many files have changed in this diff Show More