diff --git a/src/views/splash/hoc/hoc-banner.scss b/src/views/splash/hoc/hoc-banner.scss
new file mode 100644
index 000000000..b64534e47
--- /dev/null
+++ b/src/views/splash/hoc/hoc-banner.scss
@@ -0,0 +1,113 @@
+@import "../../../colors";
+@import "../../../frameless";
+
+$tile-height: 244px;
+
+.hoc-banner {
+ display: flex;
+ position: relative;
+ background-color: $ui-aqua;
+ background-image: url("/images/hoc/bg-pattern.png");
+ background-size: cover;
+ padding: 0;
+ height: 25rem;
+ overflow: hidden;
+ justify-content: center;
+
+ &.mod-middle-banner {
+ background-color: $ui-purple;
+ }
+
+ .hoc-container {
+ margin: auto;
+ width: $desktop;
+ height: 25rem;
+ justify-content: flex-start;
+
+ .hoc-title-container {
+ margin: 1.5rem 0;
+ width: 100%;
+ justify-content: space-between;
+ }
+ }
+
+ .hoc-banner-images {
+ display: flex;
+ width: $desktop;
+ justify-content: space-between;
+ }
+
+ .hoc-banner-image {
+ border: 2px solid $ui-aqua;
+ border-radius: 16px;
+ background-color: $ui-white;
+ width: $cols4;
+ height: $tile-height;
+ overflow: hidden;
+ box-sizing: border-box;
+ justify-content: flex-start;
+
+ &.mod-middle-image {
+ border: 2px solid $ui-purple;
+ }
+
+ img {
+ width: $cols4;
+ height: auto;
+ }
+
+ .hoc-image-text {
+ margin: auto auto;
+ color: $ui-blue;
+ font-size: 1rem;
+ font-weight: bold;
+ }
+ }
+
+ .hoc-header{
+ color: $ui-white;
+ }
+
+ .hoc-header {
+ font-size: 2rem;
+ }
+
+ .hoc-more-activities {
+ border-radius: 10px;
+ background-color: $ui-white;
+ padding: .5rem 1rem;
+ color: $ui-blue;
+ font-size: .75rem;
+ font-weight: bold;
+
+ img {
+ margin-right: .25rem;
+ width: 20px;
+ height: 20px;
+ vertical-align: text-bottom;
+ }
+ }
+}
+
+@media only screen and (min-width: $tablet) and (max-width: $desktop) {
+ .hoc-banner {
+ height: 23.5rem;
+
+ .hoc-container {
+ bottom: 4rem;
+ width: $tablet;
+ }
+
+ .hoc-banner-images {
+ width: $tablet;
+ }
+
+ .hoc-banner-image {
+ width: $cols4;
+ }
+ }
+
+ .hoc-hideable {
+ display: none;
+ }
+}
diff --git a/src/views/splash/hoc/middle-banner.jsx b/src/views/splash/hoc/middle-banner.jsx
new file mode 100644
index 000000000..69a751c35
--- /dev/null
+++ b/src/views/splash/hoc/middle-banner.jsx
@@ -0,0 +1,63 @@
+const FormattedMessage = require('react-intl').FormattedMessage;
+const injectIntl = require('react-intl').injectIntl;
+const React = require('react');
+const MediaQuery = require('react-responsive').default;
+const frameless = require('../../../lib/frameless');
+
+const FlexRow = require('../../../components/flex-row/flex-row.jsx');
+const TitleBanner = require('../../../components/title-banner/title-banner.jsx');
+
+require('./hoc-banner.scss');
+
+const MiddleBanner = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+module.exports = injectIntl(MiddleBanner);
diff --git a/src/views/splash/hoc/top-banner.jsx b/src/views/splash/hoc/top-banner.jsx
new file mode 100644
index 000000000..267290cc5
--- /dev/null
+++ b/src/views/splash/hoc/top-banner.jsx
@@ -0,0 +1,63 @@
+const FormattedMessage = require('react-intl').FormattedMessage;
+const injectIntl = require('react-intl').injectIntl;
+const React = require('react');
+
+const MediaQuery = require('react-responsive').default;
+const frameless = require('../../../lib/frameless');
+
+const FlexRow = require('../../../components/flex-row/flex-row.jsx');
+const TitleBanner = require('../../../components/title-banner/title-banner.jsx');
+
+require('./hoc-banner.scss');
+
+const TopBanner = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+module.exports = injectIntl(TopBanner);
diff --git a/src/views/splash/presentation.jsx b/src/views/splash/presentation.jsx
index 1771a3f33..5c20540cb 100644
--- a/src/views/splash/presentation.jsx
+++ b/src/views/splash/presentation.jsx
@@ -32,13 +32,20 @@ const RemixProjectMessage = require('./activity-rows/remix-project.jsx');
const ShareProjectMessage = require('./activity-rows/share-project.jsx');
// Beta Banner Components
-const TopBanner = require('./beta/top-banner.jsx');
+// const TopBanner = require('./beta/top-banner.jsx');
const SmallTopBanner = require('./beta/small-top-banner.jsx');
-const MiddleBanner = require('./beta/middle-banner.jsx');
+// const MiddleBanner = require('./beta/middle-banner.jsx');
const BETA_LAUNCH_TIME = 1533128400000; // August 1 at 9am ET
const SMALL_BANNER_TIME = 1534942800000; // August 22 at 9am ET
+// Hour of Code Banner Components
+const TopBanner = require('./hoc/top-banner.jsx');
+const MiddleBanner = require('./hoc/middle-banner.jsx');
+
+const HOC_START_TIME = 1543813201000; // 12:01 am Dec 3rd
+const HOC_END_TIME = 1544806799000; // 11:59 Dec 14th
+
require('./splash.scss');
class ActivityList extends React.Component {
@@ -279,21 +286,6 @@ class SplashPresentation extends React.Component { // eslint-disable-line react/
);
}
- if (
- this.props.sessionStatus === sessionActions.Status.FETCHED &&
- Object.keys(this.props.user).length === 0 &&
- Date.now() >= BETA_LAUNCH_TIME // Show middle banner on and after August 1
- ) {
- rows.push(
-
-
-
- );
- }
-
if (this.props.featuredGlobal.scratch_design_studio &&
this.props.featuredGlobal.scratch_design_studio.length > 4) {
@@ -439,6 +431,18 @@ class SplashPresentation extends React.Component { // eslint-disable-line react/
messages={messages}
/>
] : []}
+ {
+ this.props.sessionStatus === sessionActions.Status.FETCHED &&
+ Object.keys(this.props.user).length === 0 && // Only show top banner if user is not logged in
+ Date.now() >= HOC_START_TIME &&
+ Date.now() < HOC_END_TIME &&
+
+
+
+ }
{
this.props.sessionStatus === sessionActions.Status.FETCHED &&
Object.keys(this.props.user).length !== 0 && // Only show top banner if user is logged in
@@ -487,14 +491,42 @@ class SplashPresentation extends React.Component { // eslint-disable-line react/
key="frameless-desktop"
minWidth={frameless.desktop}
>
-
+ {
+ (Date.now() < HOC_START_TIME && // Hide intro if HoC banner is showing
+ Date.now() > HOC_END_TIME) ?
+ [
+
+ ] :
+ []
+ }
+
]) : []
}
+ {featured.shift()}
+ {featured.shift()}
+
+ {
+ this.props.sessionStatus === sessionActions.Status.FETCHED &&
+ Object.keys(this.props.user).length !== 0 && // Only show if user is logged in
+ Date.now() >= HOC_START_TIME && // Show middle banner on and after Dec 3
+ Date.now() < HOC_END_TIME && // Hide middle banner after Dec 14
+
+
+
+ }
+
+
{featured}
{this.props.isAdmin ? [
diff --git a/static/images/hoc/bg-pattern.png b/static/images/hoc/bg-pattern.png
new file mode 100644
index 000000000..83e6766e1
Binary files /dev/null and b/static/images/hoc/bg-pattern.png differ
diff --git a/static/images/hoc/create-an-adventure-game.jpg b/static/images/hoc/create-an-adventure-game.jpg
new file mode 100644
index 000000000..9d822e98c
Binary files /dev/null and b/static/images/hoc/create-an-adventure-game.jpg differ
diff --git a/static/images/hoc/create-animations-that-talk.png b/static/images/hoc/create-animations-that-talk.png
new file mode 100644
index 000000000..2098fa3ad
Binary files /dev/null and b/static/images/hoc/create-animations-that-talk.png differ
diff --git a/static/images/hoc/getting-started.jpg b/static/images/hoc/getting-started.jpg
new file mode 100644
index 000000000..553e881d9
Binary files /dev/null and b/static/images/hoc/getting-started.jpg differ
diff --git a/static/svgs/tutorials.svg b/static/svgs/tutorials.svg
new file mode 100644
index 000000000..6028966a4
--- /dev/null
+++ b/static/svgs/tutorials.svg
@@ -0,0 +1,22 @@
+
+
\ No newline at end of file