-
-
-
-
+const shortStepsData = [
+ {
+ title: 'Create or Join a Campaign',
+ icon:
,
+ content: [
+ {
+ div: (
+
+ Look up your address{' '}
+
+ {' '}
+ here{' '}
+ {' '}
+ to create a new recycling campaign for your building or join an existing one!
+
+ )
+ }
+ ]
+ },
+ {
+ title: 'Recruit Your Neighbors',
+ icon:
,
+ content: [
+ {
+ p: 'We provide you with the resources to gather the support of your building community.'
+ }
+ ]
+ },
+ {
+ title: 'Request Recyling From Your Landlord',
+ icon:
,
+ content: [
+ {
+ p: 'Submit your petition for recycling to your landlord and hope for the best!'
+ }
+ ]
+ },
+ {
+ title: 'Recycle!',
+ icon:
,
+ content: [
+ {
+ p:
+ "That's it! Hopefully your landlord agrees to provide recycling services for you and " +
+ 'your community. Enjoy your convenient recycling!'
+ }
+ ]
+ }
+];
+
+const HowItWorksVerticalStep = ({ title, icon, content, stepIndex }) => (
+
);
+HowItWorksVerticalStep.defaultProps = {
+ icon: null
+};
+
+HowItWorksVerticalStep.propTypes = {
+ title: PropTypes.string.isRequired,
+ icon: PropTypes.node,
+ content: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
+ stepIndex: PropTypes.number.isRequired
+};
+
+const StepByStep = () => {
+ const steps = shortStepsData.map((stepData, index) => {
+ const data = { ...stepData, stepIndex: index };
+ return {
+ content:
+ };
+ });
+ return (
+
+
+
+ HOW DOES THIS WORK?
+
+
+
+
+
+
+
+
+
+ );
+};
+
export default StepByStep;
diff --git a/client/src/components/TenantOrPMChoice.js b/client/src/components/TenantOrPMChoice.js
new file mode 100644
index 00000000..46a29327
--- /dev/null
+++ b/client/src/components/TenantOrPMChoice.js
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Grid, Row, Col } from 'react-bootstrap';
+import { Link } from 'react-router';
+
+const TenantOrPMChoice = () => (
+
+
+
+
+
Ready? Let's improve recycling together!
+
+
+
+
+
+
+
+ You deserve convenient recycling. Apartment or condo managers are not required to
+ provide recycling services for residents, but there is something you can do. Organize
+ your neighbors and request recycling from your buliding manager. Together we can make
+ Denver a sustainability leader!
+
+
+
+
+
+
+
+
+ I'm a tenant
+ I'm a property manager
+
+
+
+
+
+);
+
+export default TenantOrPMChoice;
diff --git a/client/src/containers/Home.js b/client/src/containers/Home.js
index 3d44af5c..6d220a6e 100644
--- a/client/src/containers/Home.js
+++ b/client/src/containers/Home.js
@@ -1,93 +1,31 @@
-import React, { Component } from 'react';
+import React from 'react';
import { Grid } from 'react-bootstrap';
import { connect } from 'react-redux';
-import PropTypes from 'prop-types';
import HeroCTA from '../components/HeroCTA';
-import CampaignsMap from '../components/CampaignsMap';
+// import CampaignsMap from '../components/CampaignsMap';
import StepByStep from '../components/StepByStep';
-import InfoAndLinks from '../components/Informational/InfoAndLinks';
+import TenantOrPMChoice from '../components/TenantOrPMChoice';
import Footer from '../components/Footer/Footer';
-import {
- firebaseSearchAddressFlow,
- clearInitialSearchResults
-} from '../redux/actions/firebaseInitialSearch';
-import { openMap, closeMap } from '../redux/actions/googleMap';
+import Banner from '../components/Banner';
-class Home extends Component {
- constructor(props) {
- super(props);
- this.state = {};
- }
- render() {
- /* eslint no-shadow: */
- const {
- firebaseCampaigns,
- firebaseSearchAddressFlow,
- googleMap: { isOpen },
- router
- } = this.props;
- const { campaigns } = firebaseCampaigns;
- return (
-
-
-
-
-
-
-
-
-
- );
- }
-}
-
-Home.defaultProps = {
- firebaseCampaigns: PropTypes.shape({
- campaigns: PropTypes.arrayOf()
- })
-};
-
-Home.propTypes = {
- firebaseSearchAddressFlow: PropTypes.func.isRequired,
- firebaseCampaigns: PropTypes.shape({
- loading: PropTypes.bool.isRequired,
- loaded: PropTypes.bool.isRequired,
- campaigns: PropTypes.arrayOf(
- PropTypes.shape({
- address: PropTypes.string.isRequired,
- campaignId: PropTypes.string.isRequired,
- createdAt: PropTypes.shape({}).isRequired,
- latLng: PropTypes.shape({
- _lat: PropTypes.number.isRequired,
- _long: PropTypes.number.isRequired
- }).isRequired
- }).isRequired
- )
- }).isRequired,
- googleMap: PropTypes.shape({
- isOpen: PropTypes.bool.isRequired
- }).isRequired,
- openMap: PropTypes.func.isRequired,
- closeMap: PropTypes.func.isRequired,
- router: PropTypes.shape({}).isRequired
-};
+const Home = () => (
+
+
+
+
+
+ Most Denver apartments don't have recycling on site.
+
+ We can help you get recycling at your building.
+
+
+
+
+
+
+);
export default connect(
- ({ initialSearch, googleMap, firebaseCampaigns }) => ({
- ...initialSearch,
- googleMap,
- firebaseCampaigns
- }),
- {
- firebaseSearchAddressFlow,
- clearInitialSearchResults,
- openMap,
- closeMap
- }
+ null,
+ null
)(Home);
diff --git a/client/src/images/guideline2.png b/client/src/images/guideline2.png
new file mode 100644
index 00000000..b85648fc
Binary files /dev/null and b/client/src/images/guideline2.png differ
diff --git a/client/src/images/guildline1.png b/client/src/images/guildline1.png
new file mode 100644
index 00000000..c707d795
Binary files /dev/null and b/client/src/images/guildline1.png differ
diff --git a/client/src/images/letter.png b/client/src/images/letter.png
new file mode 100644
index 00000000..6f093eea
Binary files /dev/null and b/client/src/images/letter.png differ
diff --git a/client/src/images/list.png b/client/src/images/list.png
new file mode 100644
index 00000000..241c45aa
Binary files /dev/null and b/client/src/images/list.png differ
diff --git a/client/src/images/screen-shot.png b/client/src/images/screen-shot.png
new file mode 100644
index 00000000..66b7c16d
Binary files /dev/null and b/client/src/images/screen-shot.png differ
diff --git a/client/src/images/small-list.png b/client/src/images/small-list.png
new file mode 100644
index 00000000..e26e7462
Binary files /dev/null and b/client/src/images/small-list.png differ
diff --git a/client/src/index.js b/client/src/index.js
index e85a5e6b..cfbcc3e0 100644
--- a/client/src/index.js
+++ b/client/src/index.js
@@ -34,7 +34,7 @@ export const history = syncHistoryWithStore(browserHistory, store);
render(
-
+ window.scrollTo(0, 0)} history={history} routes={routes} />
,
document.getElementById('root')
diff --git a/client/src/routes.js b/client/src/routes.js
index cf7da916..d71e1e56 100644
--- a/client/src/routes.js
+++ b/client/src/routes.js
@@ -7,12 +7,12 @@ import NewCampaign from './containers/NewCampaign';
import CreateCampaignStep1 from './components/CreateCampaignStep1';
import CreateCampaignStep2 from './components/CreateCampaignStep2';
import CreateCampaignStep3 from './components/CreateCampaignStep3';
+import HowItWorks from './components/HowItWorks/HowItWorks';
import CampaignContainer from './containers/CampaignContainer';
import RequestRecyclingTips from './components/Informational/RequestRecyclingTips';
import DenverInfo from './components/Informational/DenverInfo';
import ManagerResources from './components/Informational/ManagerResources';
import DenverLearnMore from './components/Informational/DenverLearnMore';
-import Instructions from './components/Instructions';
import Collaboration from './components/Informational/Collaboration';
import PrivacyPolicy from './components/Footer/PrivacyPolicy';
import NotFound from './components/UtilComponents/NotFound';
@@ -72,8 +72,8 @@ export default (
getComponent={(location, callback) => callback(null, PrivacyPolicy)}
/>
callback(null, Instructions)}
+ path="/how-does-this-work"
+ getComponent={(location, callback) => callback(null, HowItWorks)}
/>
callback(null, NotFound)} />
diff --git a/client/src/static/assets/crushed_can.png b/client/src/static/assets/crushed_can.png
new file mode 100644
index 00000000..9e38a1ef
Binary files /dev/null and b/client/src/static/assets/crushed_can.png differ
diff --git a/client/src/stylesheets/base/_colors.scss b/client/src/stylesheets/base/_colors.scss
index 3ef14228..b8ddf113 100644
--- a/client/src/stylesheets/base/_colors.scss
+++ b/client/src/stylesheets/base/_colors.scss
@@ -26,6 +26,7 @@ $step2_imgage: '../static/assets/people.png';
$step3_imgage: '../static/assets/request.png';
$step4_imgage: '../static/assets/recycle.png';
$link_arrow: '../static/assets/arrow_right.png';
+$crushed_can: '../static/assets/crushed_can.png';
//BUTTONS
$twitter-blue: #1da1f2;
diff --git a/client/src/stylesheets/base/_fonts.scss b/client/src/stylesheets/base/_fonts.scss
index 96c3d84e..1c27a5ef 100644
--- a/client/src/stylesheets/base/_fonts.scss
+++ b/client/src/stylesheets/base/_fonts.scss
@@ -11,11 +11,42 @@ $body_stack: "Open Sans", "Segoe UI", Tahoma, sans-serif;
color: $mainwhite;
}
+
+@mixin display-72-med () {
+ @include font($display_stack, 72px, 500);
+ line-height: normal;
+}
+
+@mixin display-48-med () {
+ @include font($display_stack, 48px, 500);
+ line-height: normal;
+}
+
+@mixin display-48-thin () {
+ @include font($display_stack, 48px, 300);
+ line-height: normal;
+}
+
+@mixin display-36-thin () {
+ @include font($display_stack, 36px, 300);
+ line-height: normal;
+}
+
@mixin display-36-med () {
@include font($display_stack, 36px, 500);
line-height: normal;
}
+@mixin display-32-thin () {
+ @include font($display_stack, 32px, 300);
+ line-height: normal;
+}
+
+@mixin display-28-med () {
+ @include font($display_stack, 28px, 500);
+ line-height: 1.25;
+}
+
@mixin display-24-med () {
@include font($display_stack, 24px, 500);
line-height: 1.25;
@@ -26,11 +57,21 @@ $body_stack: "Open Sans", "Segoe UI", Tahoma, sans-serif;
line-height: 1.25;
}
+@mixin display-24-thin () {
+ @include font($display_stack, 24px, 300);
+ line-height: 1.25;
+}
+
@mixin display-20-reg () {
@include font($display_stack, 20px, 400);
line-height: 1.33;
}
+@mixin display-20-thin () {
+ @include font($display_stack, 20px, 300);
+ line-height: 1.33;
+}
+
@mixin body-16-semibold-tt () {
@include font($body_stack, 16px, 600);
text-transform: uppercase;
diff --git a/client/src/stylesheets/components/_Banner.scss b/client/src/stylesheets/components/_Banner.scss
new file mode 100644
index 00000000..46f47c41
--- /dev/null
+++ b/client/src/stylesheets/components/_Banner.scss
@@ -0,0 +1,19 @@
+@import "../base/colors";
+
+.row.banner-row {
+ background-color: $light-blue-background;
+
+ .banner-content {
+ padding: 1rem 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ color: #164c5f;
+
+ strong {
+ font-weight: 600;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/client/src/stylesheets/components/_HeroCTA.scss b/client/src/stylesheets/components/_HeroCTA.scss
index 0226b6d5..02a21ab1 100644
--- a/client/src/stylesheets/components/_HeroCTA.scss
+++ b/client/src/stylesheets/components/_HeroCTA.scss
@@ -6,10 +6,10 @@
color: $mainwhite;
h1 {
- font-size: 70px;
+ font-size: 60px;
letter-spacing: 3px;
text-shadow: 30px 30px 30px 30px #000;
- margin: 10px 0;
+ margin: 15px 15px;
}
h2,
@@ -19,7 +19,7 @@
margin: 10px 0;
}
- h2 {
+ .font-italic {
@include font('Dancing Script', 50px, regular);
}
@@ -29,30 +29,29 @@
}
.hero-wrapper {
position: relative;
+ height: 100%;
background-image: url($desktop-hero-image);
+
background-position: center;
background-repeat: no-repeat;
background-size: cover;
- box-sizing: padding-box;
+ box-sizing: border-box;
+ background-attachment: fixed;
.opacity-div {
background-color: rgba(0, 0, 0, 0.35);
- padding: 2rem 150px;
+ padding: 5rem 12%;
width: 100vw;
+ height: 60vh;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
}
@media #{$information-phone} {
background-image: url($mobile-hero-image);
}
-
- .tinted {
- position: absolute;
- height: 100%;
- width: 100%;
- top: 0;
- right: 0;
- background-color: rgba(0, 0, 0, 0.25);
- }
}
.hero-search {
padding-top: 0px;
@@ -76,16 +75,30 @@
padding: 0 0 50px 0;
}
}
+
+ .hero-page-header {
+ h1 {
+ font-size: 48px;
+ }
+
+ .font-italic {
+ @include font('Dancing Script', 48px, regular);
+ }
+ }
}
@media screen and (max-width: 550px) {
.hero-page-header {
h1 {
- font-size: 40px;
+ font-size: 32px;
+ }
+
+ .font-italic {
+ @include font('Dancing Script', 32px, regular);
}
h2 {
- font-size: 30px;
+ font-size: 28px;
}
h3 {
diff --git a/client/src/stylesheets/components/_Home.scss b/client/src/stylesheets/components/_Home.scss
index 463e3ec8..15c21952 100644
--- a/client/src/stylesheets/components/_Home.scss
+++ b/client/src/stylesheets/components/_Home.scss
@@ -15,7 +15,7 @@
color: $mainwhite;
border-bottom: none;
margin-bottom: 5px;
-
+
h1 {
font-size: 24px;
font-weight: 300;
@@ -80,3 +80,26 @@
}
}
}
+
+.how-it-works-banner {
+ background: $light-gray;
+}
+
+.banner-content {
+ > div {
+ @include display-24-thin;
+ color: #164c5f;
+ text-align: center;
+ }
+
+ > div:first-child {
+ margin-bottom: 0.5rem;
+ @include display-24-reg;
+ color: #164c5f;
+ }
+}
+
+
+
+
+
diff --git a/client/src/stylesheets/components/_HowItWorks.scss b/client/src/stylesheets/components/_HowItWorks.scss
new file mode 100644
index 00000000..6293f28a
--- /dev/null
+++ b/client/src/stylesheets/components/_HowItWorks.scss
@@ -0,0 +1,29 @@
+@import "../utils/placeholders";
+@import "../base/colors";
+@import '../base/fonts';
+
+.how-it-works-banner {
+ background: $light-gray;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 1rem;
+}
+
+.blue-color {
+ color: $dark-blue;
+}
+
+.how-it-works-container {
+ .search-container {
+ padding-bottom: 4rem;
+ padding-top: 3.5rem;
+ margin-top: 4.5rem;
+ background: rgba(255,255,255,0.25);
+
+ .call-to-action {
+ text-align: center;
+ padding-bottom: 1rem;
+ }
+ }
+}
\ No newline at end of file
diff --git a/client/src/stylesheets/components/_HowItWorksStepContent.scss b/client/src/stylesheets/components/_HowItWorksStepContent.scss
new file mode 100644
index 00000000..51058445
--- /dev/null
+++ b/client/src/stylesheets/components/_HowItWorksStepContent.scss
@@ -0,0 +1,50 @@
+.how-it-works-step-content-wrapper {
+ h3 {
+ @include display-20-reg;
+ margin-top: 1.2rem;
+ }
+
+ p {
+ margin-top: 0.7rem;
+ opacity: 0.8;
+
+ em {
+ font-style: italic;
+ }
+ }
+
+ p:first-child {
+ margin-top: 1.2rem;
+ }
+
+ ul {
+ margin: 0.7rem 0 1rem 1.2rem;
+
+ > li {
+ opacity: 0.8;
+ list-style: initial;
+ }
+ }
+}
+
+@media only screen and (min-width: 480px) {
+ .how-it-works-step-content-wrapper {
+
+ h3 {
+ @include display-24-reg;
+ margin-top: 2.5rem;
+ }
+
+ p {
+ margin-top: 1rem;
+ }
+
+ p:first-child {
+ margin-top: 2.5rem;
+ }
+
+ ul {
+ margin: 1rem 0 1.5rem 1.2rem;
+ }
+ }
+}
\ No newline at end of file
diff --git a/client/src/stylesheets/components/_HowItWorksStepHeaderContent.scss b/client/src/stylesheets/components/_HowItWorksStepHeaderContent.scss
new file mode 100644
index 00000000..4ef1a590
--- /dev/null
+++ b/client/src/stylesheets/components/_HowItWorksStepHeaderContent.scss
@@ -0,0 +1,65 @@
+.step-header-content {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+
+ i.how-icon {
+ font-size: 2rem;
+ padding: 0 1rem;
+ }
+
+ h2 {
+ @include display-24-med;
+ text-align: center;
+ }
+
+ h3 {
+ @include display-20-thin;
+ text-align: left;
+ }
+
+ &.stacked {
+ flex-direction: column;
+ i.how-icon {
+ padding: 1rem;
+ }
+ }
+}
+
+@media only screen and (min-width: 480px) {
+ .step-header-content {
+ i.how-icon {
+ font-size: 3rem;
+ }
+
+ h2 {
+ @include display-36-thin;
+ }
+
+ h3 {
+ @include display-24-thin;
+ text-align: left;
+ }
+ }
+}
+
+@media only screen and (min-width: 720px) {
+ .step-header-content {
+ i.how-icon {
+ font-size: 4rem;
+ }
+
+ h3 {
+ @include display-32-thin;
+ }
+ }
+}
+
+@media only screen and (min-width: 820px) {
+ .step-header-content {
+ h3 {
+ @include display-36-thin;
+ }
+ }
+}
diff --git a/client/src/stylesheets/components/_RecyclingInfo.scss b/client/src/stylesheets/components/_RecyclingInfo.scss
new file mode 100644
index 00000000..958bbaee
--- /dev/null
+++ b/client/src/stylesheets/components/_RecyclingInfo.scss
@@ -0,0 +1,125 @@
+@import "../base/colors";
+
+.recycling-info {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin: 4rem 0 0 0;
+
+
+ .text-content {
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ flex: 1;
+ text-align: center;
+ max-width: 500px;
+
+ @include body-16;
+ font-style: italic;
+
+ > div:first-child {
+ margin-bottom: 2rem;
+ font-style: italic;
+ @include display-24-thin;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+
+ // align-self: center;
+
+ > div {
+ max-width: 400px;
+ display: flex;
+ flex-direction: column;
+ flex: 1
+ }
+
+ span {
+ align-self: flex-end;
+ }
+
+ span:first-child {
+ align-self: flex-start;
+ }
+
+ strong {
+ font-weight: 500;
+ }
+
+ span.large {
+ align-self: center;
+ @include display-72-med;
+ color: $maingreen;
+ }
+ }
+ }
+
+ .bar-graphs {
+ flex: 1;
+ margin-top: 2rem;
+ padding: 1rem 1rem;
+ background: rgba(0,0,0,0.2);//$main-blue;
+ max-width: 500px;
+ align-self: stretch;
+ // padding: 2rem 0 0 0;
+
+ }
+
+
+
+ .bar-and-label {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ margin-bottom: 1rem;
+
+ }
+
+ .bar-label {
+ color: white;
+ white-space: nowrap;
+ @include display-24-thin;
+ margin-right: 0;
+ margin-bottom: 0.5rem;
+ }
+
+ @media only screen and (min-width: 480px) {
+ // .bar-and-label {
+ // flex-direction: row;
+ // align-items: center;
+ // }
+
+ // .bar-label {
+ // margin-top: 0;
+ // margin-right: 1rem;
+ // }
+ }
+
+
+}
+
+@media only screen and (min-width: 992px) {
+ .recycling-info {
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+
+
+
+ .bar-graphs {
+ margin-top: 0;
+ margin-left: 3%;
+ align-self: center;
+ // padding: 2rem 0 0 0;
+
+ }
+
+ .text-content {
+ margin-right: 3%;
+ }
+ }
+
+}
+
diff --git a/client/src/stylesheets/components/_SingleGraphBar.scss b/client/src/stylesheets/components/_SingleGraphBar.scss
new file mode 100644
index 00000000..a363271b
--- /dev/null
+++ b/client/src/stylesheets/components/_SingleGraphBar.scss
@@ -0,0 +1,45 @@
+@import "../base/colors";
+
+.outer-bar {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: stretch;
+ border-radius: 4px;
+ overflow: hidden;
+
+ .percentage-text {
+ z-index: 1;
+ }
+
+ .main-bar {
+ position: relative;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ @include display-20-thin;
+
+ &.with-bg-img {
+ background-image: url($crushed_can);
+ background-repeat: repeat-x;
+ background-size: contain;
+ }
+
+ .fill {
+ position: absolute;
+ left: 0;
+ right: 0;
+ height: 100%;
+ }
+ }
+
+ .space {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ @include display-20-thin;
+ }
+
+}
\ No newline at end of file
diff --git a/client/src/stylesheets/components/_StepByStep.scss b/client/src/stylesheets/components/_StepByStep.scss
index 967aa60c..d73bc466 100644
--- a/client/src/stylesheets/components/_StepByStep.scss
+++ b/client/src/stylesheets/components/_StepByStep.scss
@@ -1,40 +1,113 @@
@import "../utils/placeholders";
@import "../base/colors";
-.info-graphic-header {
- padding-left: 55px;
-}
+.step-by-step-container {
+ margin-bottom: 6rem;
+
+ &.container-fluid {
+ padding-left: 15px;
+ padding-right: 15px;
+ }
+
+ h2.home-section-title {
+ padding: 0 0;
+ margin-top: 6rem;
+ text-align: center;
+ @include display-24-med;
+ }
-.info-graphic {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- align-items: center;
- justify-content: space-around;
- background-color: $light-blue-background;
+ .tinted {
+ background-color: rgba(255,255,255,0.25);
+ }
- &:hover {
- cursor: pointer;
+ .pad-bottom {
+ padding-bottom: 6rem;
}
- .box {
- color: $dark-blue;
+ .inner-content-container {
display: flex;
+ height: 100%;
flex-direction: column;
- align-items: center;
justify-content: center;
- margin: 20px;
+ align-items: center;
- i {
- font-size: 36px;
- margin-bottom: 7.5px;
+ > div:first-child {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ justify-content: center;
+ max-width: 800px;
+ padding: 0 0.5rem;
+ margin-top: 2rem;
+ }
+
+ a.more-step-details-link {
+ color: $maingreen;
+ opacity: 0.7;
+ align-self: center;
+ margin-bottom: 2rem;
+ }
+
+ a.more-step-details-link:hover {
+ color: $hovergreen;
+ opacity: 1;
}
p {
- font-size: 16px;
- font-weight: bold;
+ text-align: center;
+ }
+
+ p:first-child {
+ margin-top: 0.7rem;
+ }
+ }
+}
+
+@media only screen and (min-width: 480px) {
+ .step-by-step-container {
+
+ .inner-content-container {
+ padding: 0 1rem;
+
+ a.more-step-details-link {
+ align-self: flex-end;
+ }
+
+ p:first-child {
+ margin-top: 1rem;
+ }
+ }
+
+ h2.home-section-title {
+ text-align: left;
+ @include display-28-med;
+ margin-left: 1rem;
}
}
}
+@media only screen and (min-width: 750px) {
+ .step-by-step-container {
+ .inner-content-container {
+ p {
+ font-size: 1.2rem;
+ }
+ }
+ }
+}
+
+@media only screen and (min-width: 1200px) {
+ .step-by-step-container {
+ .inner-content-container {
+ padding: 0 1rem;
+
+ a.more-step-details-link {
+ align-self: flex-end;
+ }
+ p {
+ align-self: center;
+ }
+ }
+ }
+}
diff --git a/client/src/stylesheets/components/_StepHeaderNavButton.scss b/client/src/stylesheets/components/_StepHeaderNavButton.scss
new file mode 100644
index 00000000..e0640d14
--- /dev/null
+++ b/client/src/stylesheets/components/_StepHeaderNavButton.scss
@@ -0,0 +1,39 @@
+button.step-header-nav {
+ background: transparent;
+ border: none;
+ margin: 0 1rem;
+ color: $maingreen;
+ opacity: 0.8;
+ cursor: pointer;
+ user-select: none;
+
+ &:hover {
+ color: $hovergreen;
+ opacity: 1;
+ }
+
+ &:focus {
+ outline: none;
+ }
+
+ &.disabled {
+ opacity: 0.2;
+ cursor: default;
+ &:hover {
+ color: $maingreen;
+ opacity: 0.2;
+ }
+ }
+}
+
+@media only screen and (min-width: 480px) {
+ button.step-header-nav {
+ margin: 0 2rem;
+ }
+}
+
+@media only screen and (min-width: 900px) {
+ button.step-header-nav {
+ margin: 0 3rem;
+ }
+}
\ No newline at end of file
diff --git a/client/src/stylesheets/components/_StepSelectorButton.scss b/client/src/stylesheets/components/_StepSelectorButton.scss
new file mode 100644
index 00000000..92bdf93d
--- /dev/null
+++ b/client/src/stylesheets/components/_StepSelectorButton.scss
@@ -0,0 +1,115 @@
+button[class^='step-selector-btn-'],
+button[class*=' step-selector-btn-'] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin: 1.2rem 0;
+ padding: 0;
+ align-self: stretch;
+ cursor: pointer;
+ background: transparent;
+ border: none;
+
+ &:focus {
+ outline: none;
+ }
+
+ .circle {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 2rem;
+ width: 2rem;
+ border: 2px solid white;
+ border-radius: 2rem;
+ opacity: 0.7;
+ }
+
+ &.highlighted {
+ .circle {
+ color: $maingreen;
+ opacity: 0.7;
+ border: 2px solid $maingreen;
+ }
+ }
+
+ &.selected {
+ .circle {
+ color: $maingreen;
+ height: 2.5rem;
+ width: 2.5rem;
+ border-radius: 2.5rem;
+ border: 3px solid $maingreen;
+ opacity: 1;
+ font-weight: bold;
+ }
+ }
+
+ &.not-selected {
+ .circle {
+ &:hover {
+ opacity: 1 !important;
+ color: white !important;
+ border-color: white !important;
+ }
+ }
+
+ &.highlighted {
+ .circle {
+ &:hover {
+ color: $hovergreen;
+ border: 2px solid $hovergreen;
+ opacity: 1;
+ }
+ }
+ }
+ }
+
+ &.vertical {
+ margin: 0 0;
+ }
+
+ @media only screen and (min-width: 700px) {
+ &.vertical {
+ margin: 0 1rem;
+ }
+
+ .circle {
+ height: 3rem;
+ width: 3rem;
+ border-radius: 3rem;
+ border: 3px solid white;
+ }
+
+ &.highlighted {
+ .circle {
+ border: 3px solid $maingreen;
+ }
+ }
+
+ &.selected {
+ .circle {
+ height: 3.5rem;
+ width: 3.5rem;
+ border-radius: 3.5rem;
+ border: 4px solid $maingreen;
+ }
+ }
+
+ &.not-selected {
+ .circle {
+ &:hover {
+ border: 3px solid white;
+ }
+ }
+
+ &.highlighted {
+ .circle {
+ &:hover {
+ border: 3px solid $hovergreen;
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/client/src/stylesheets/components/_Steps.scss b/client/src/stylesheets/components/_Steps.scss
new file mode 100644
index 00000000..d64f406e
--- /dev/null
+++ b/client/src/stylesheets/components/_Steps.scss
@@ -0,0 +1,55 @@
+@import "../base/colors";
+
+.steps-container {
+ position: relative;
+ overflow: hidden;
+ margin-top: 1rem;
+
+ .steps-content-container {
+ width: 100%;
+ position: relative;
+ display: flex;
+ flex-direction: row;
+ align-items: flex-start;
+ flex-wrap: nowrap;
+
+ .single-step-content {
+ display: inline-block;
+ flex-shrink: 0;
+ flex-grow: 1;
+ width: 100%;
+
+ .step-header-wrapper {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ }
+ }
+ }
+
+ &.vertical {
+ display: flex;
+ flex-direction: row;
+
+ .steps-content-container {
+ flex-direction: column;
+ flex-wrap: nowrap;
+ flex: 10;
+ }
+
+ .centering-space {
+ flex: 0;
+ }
+
+ @media only screen and (min-width: 700px) {
+ .centering-space {
+ flex: 1;
+ }
+ }
+
+ .single-step-content {
+ height: 100%;
+ }
+ }
+}
\ No newline at end of file
diff --git a/client/src/stylesheets/components/_StepsMainNav.scss b/client/src/stylesheets/components/_StepsMainNav.scss
new file mode 100644
index 00000000..11f093dc
--- /dev/null
+++ b/client/src/stylesheets/components/_StepsMainNav.scss
@@ -0,0 +1,45 @@
+.step-selectors-container {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+
+ .half-spacer {
+ display: flex;
+ flex: 1;
+ }
+ .spacer-line {
+ display: flex;
+ flex: 2;
+ height: 2px;
+ background: white;
+ opacity: 0.7;
+
+ &.highlighted {
+ opacity: 0.7;
+ background: $maingreen;
+ }
+ }
+
+ &.vertical {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+
+ .spacer-line {
+ width: 2px;
+ }
+ }
+
+ @media only screen and (min-width: 700px) {
+ .spacer-line {
+ height: 3px;
+ }
+
+ &.vertical {
+ .spacer-line {
+ width: 3px;
+ height: auto;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/client/src/stylesheets/components/_TenantOrPMChoice.scss b/client/src/stylesheets/components/_TenantOrPMChoice.scss
new file mode 100644
index 00000000..db979f35
--- /dev/null
+++ b/client/src/stylesheets/components/_TenantOrPMChoice.scss
@@ -0,0 +1,79 @@
+.tenant-or-pm-section {
+ margin-top: 6rem;
+ margin-bottom: 6rem;
+
+ h2 {
+ text-transform: uppercase;
+ text-align: center;
+ @include display-24-med;
+ }
+
+ p {
+ margin: 2rem 0;
+ text-align: center;
+ }
+
+ .buttons-wrapper {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+
+ > div {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: stretch;
+ }
+
+ a {
+ background-color: rgba(0, 199, 138, 0.8);
+ cursor: pointer;
+ border: none;
+ padding: 0.5rem 1.5rem;
+ margin: 0.5rem 1rem;
+ border-radius: 0.3rem;
+ text-align: center;
+ white-space: nowrap;
+ color: white;
+ }
+
+ a:hover {
+ background-color: rgba(0, 199, 138, 1);
+ }
+
+ a:focus {
+ outline: none;
+ }
+
+ a:active {
+ background-color: rgba(0, 199, 138, 0.5);
+ }
+ }
+
+ @media only screen and (min-width: 480px) {
+ h2 {
+ text-align: left;
+ @include display-28-med;
+ }
+
+ p {
+ margin: 2rem 0;
+ text-align: left;
+ }
+ }
+
+ @media only screen and (min-width: 550px) {
+ .buttons-wrapper {
+ > div {
+ flex-direction: row;
+ align-items: center;
+ }
+
+ a {
+ min-width: 240px;
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/client/src/stylesheets/main.scss b/client/src/stylesheets/main.scss
index 0e3ad352..f771bfdd 100644
--- a/client/src/stylesheets/main.scss
+++ b/client/src/stylesheets/main.scss
@@ -33,6 +33,17 @@
'components/ToolList',
'components/Footer',
'components/UpdateCampaignModal',
+ 'components/HowItWorks',
+ 'components/Steps',
+ 'components/StepsMainNav',
+ 'components/StepSelectorButton',
+ 'components/StepHeaderNavButton',
+ 'components/HowItWorksStepHeaderContent',
+ 'components/HowItWorksStepContent',
+ 'components/SingleGraphBar',
+ 'components/Banner',
+ 'components/TenantOrPMChoice',
+ 'components/RecyclingInfo',
'components/AdminAddSigantureModal',
'components/NotFound';
diff --git a/client/yarn.lock b/client/yarn.lock
index 036aa611..294d2627 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -9,6 +9,12 @@
core-js "^2.5.7"
regenerator-runtime "^0.12.0"
+"@babel/runtime@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c"
+ dependencies:
+ regenerator-runtime "^0.12.0"
+
"@firebase/app-types@0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.3.2.tgz#a92dc544290e2893bd8c02a81e684dae3d8e7c85"
@@ -6301,6 +6307,12 @@ react-share@^2.0.0:
jsonp "^0.2.1"
prop-types "^15.5.8"
+react-spring@^5.8.0:
+ version "5.8.0"
+ resolved "https://registry.yarnpkg.com/react-spring/-/react-spring-5.8.0.tgz#52d8206487692b99c223377c252acea645d77307"
+ dependencies:
+ "@babel/runtime" "^7.0.0"
+
react-transition-group@^2.0.0, react-transition-group@^2.2.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.0.tgz#70bca0e3546102c4dc5cf3f5f57f73447cce6874"
diff --git a/cypress/integration/how_it_works_page_spec.js b/cypress/integration/how_it_works_page_spec.js
new file mode 100644
index 00000000..c631fdfe
--- /dev/null
+++ b/cypress/integration/how_it_works_page_spec.js
@@ -0,0 +1,56 @@
+describe('The how does it work page', () => {
+ beforeEach(function() {
+ cy.visit('http://localhost:3000/how-does-this-work');
+ });
+
+ it('Shows first step on page load', () => {
+ cy.get('.steps-content-container').then($el => {
+ expect($el).to.have.css('left', '0px');
+ });
+ });
+
+ describe('Clicking Step 1', () => {
+ it('Sets left position of steps-content-container to make 1st step visible', () => {
+ cy.get('.step-selector-btn-0').click();
+ cy.wait(700);
+ cy.get('.steps-content-container').then($el => {
+ expect($el).to.have.css('left', '0px');
+ });
+ });
+ });
+
+ describe('Clicking Step 2', () => {
+ it('Sets left position of steps-content-container to make 2nd step visible', () => {
+ cy.get('.step-selector-btn-1').click();
+ cy.wait(700);
+ cy.get('.steps-content-container').then($el => {
+ const width = $el.css('width');
+ expect($el).to.have.css('left', '-' + width);
+ });
+ });
+ });
+
+ describe('Clicking Step 3', () => {
+ it('Sets left position of steps-content-container to make 3rd step visible', () => {
+ cy.get('.step-selector-btn-2').click();
+ cy.wait(700);
+ cy.get('.steps-content-container').then($el => {
+ let width = $el.css('width');
+ width = parseInt(width) * 2;
+ expect($el).to.have.css('left', '-' + width + 'px');
+ });
+ });
+ });
+
+ describe('Clicking Step 4', () => {
+ it('Sets left position of steps-content-container to make 4th step visible', () => {
+ cy.get('.step-selector-btn-3').click();
+ cy.wait(700);
+ cy.get('.steps-content-container').then($el => {
+ let width = $el.css('width');
+ width = parseInt(width) * 3;
+ expect($el).to.have.css('left', '-' + width + 'px');
+ });
+ });
+ });
+});
diff --git a/cypress/integration/landing_page_spec.js b/cypress/integration/landing_page_spec.js
index 33a4fd22..04b16266 100644
--- a/cypress/integration/landing_page_spec.js
+++ b/cypress/integration/landing_page_spec.js
@@ -45,6 +45,14 @@ describe('The landing page', () => {
cy.url().should('include', '/tips-for-requesting');
});
});
+
+ // WHO WE ARE LINK
+ describe('Who Are We link', () => {
+ it('Navigates to Who Are We page', () => {
+ cy.contains('WHO WE ARE').click();
+ cy.url().should('include', '/who-are-we');
+ });
+ });
// WILL NEED TO ADDRESS CORS ISSUES TO TEST AUTH
describe('Check login navigation toggle', () => {
@@ -57,53 +65,6 @@ describe('The landing page', () => {
});
});
- // WHO WE ARE LINK
- describe('Who Are We link', () => {
- it('Navigates to Who Are We page', () => {
- cy.contains('WHO WE ARE').click();
- cy.url().should('include', '/who-are-we');
- });
- });
-
- // MAIN SEARCH FEATURES
- describe('Main Search Block', () => {
- // SEARCH ADDRESS BAR
- describe('When Searching an Address', () => {
- it('Should fill out search box and click search and visit choose campaign page', () => {
- cy.get('.search_input')
- .type('Denver')
- .should('have.value', 'Denver')
- .then(() => {
- cy.get('.search_button').click(() => {
- cy.visit('/choose-campaign');
- });
- });
- });
- });
- // MAP MODAL
- describe('Explore the Map Modal', () => {
- it('Opens the map modal', () => {
- cy.contains('Explore Nearby Campaigns').click({ isOpen: true });
- });
- });
- });
-
- //BOTTOM FEATURES
- describe('Bottom Features', () => {
- describe('Wait, But Why?', () => {
- it('Navigates to Learn More', () => {
- cy.contains('LEARN MORE').click();
- cy.url().should('include', '/denver-learn-more');
- });
- });
- describe('Tips and Resources', () => {
- it('Navigates to Manager Resources', () => {
- cy.contains('TIPS AND RESOURCES').click();
- cy.url().should('include', '/manager-resources');
- });
- });
- });
-
//FOOTER
describe('Footer', () => {
describe('Privacy Policy', () => {
diff --git a/cypress/integration/start_campaign_spec.js b/cypress/integration/start_campaign_spec.js
index a5f45c15..20c90d33 100644
--- a/cypress/integration/start_campaign_spec.js
+++ b/cypress/integration/start_campaign_spec.js
@@ -1,11 +1,9 @@
describe('Starting a new campaign', () => {
it('prompts the user with about recycling', () => {
- cy.visit('http://localhost:3000');
- cy.contains('NEED RECYCLING?');
+ cy.visit('http://localhost:3000/how-does-this-work');
+ cy.contains('NEED RECYCLING IN YOUR APARTMENT OR CONDO?');
cy.contains('Recruit, Request, Recycle');
- cy.contains(
- 'We have a mission to change Denver\'s low recycling rate by making it easy for you and your neighbors to petition your landlord for recyling for your building.'
- );
+ cy.contains('Follow these easy steps!');
});
describe('When Searching an Address', () => {