diff --git a/backend/api/hub/models/Hub.settings.json b/backend/api/hub/models/Hub.settings.json index 170b2d3f..341c52b0 100644 --- a/backend/api/hub/models/Hub.settings.json +++ b/backend/api/hub/models/Hub.settings.json @@ -13,6 +13,10 @@ "default": "", "type": "string" }, + "country": { + "default": "", + "type": "string" + }, "latitude": { "default": "", "type": "decimal" @@ -21,6 +25,14 @@ "default": "", "type": "decimal" }, + "timezone": { + "default": "", + "type": "decimal" + }, + "contact": { + "default": "", + "type": "string" + }, "desc": { "default": "", "type": "richtext" diff --git a/frontend/app/package-lock.json b/frontend/app/package-lock.json index f0fe814d..73a87694 100644 --- a/frontend/app/package-lock.json +++ b/frontend/app/package-lock.json @@ -9361,9 +9361,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash-es": { "version": "4.17.15", @@ -9911,9 +9911,9 @@ } }, "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "move-concurrently": { "version": "1.0.1", @@ -10022,9 +10022,9 @@ } }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "node-gyp": { "version": "3.8.0", @@ -10154,9 +10154,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" } } }, @@ -13849,11 +13849,11 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { diff --git a/frontend/app/package.json b/frontend/app/package.json index 9ba67206..4fff047e 100644 --- a/frontend/app/package.json +++ b/frontend/app/package.json @@ -15,7 +15,7 @@ "cloudinary-react": "^1.5.0", "history": "^4.10.1", "lodash-es": "^4.17.15", - "moment": "^2.27.0", + "moment": "^2.29.1", "node-sass": "^4.14.1", "react": "^16.13.1", "react-animate-height": "^2.0.21", diff --git a/frontend/app/src/App.scss b/frontend/app/src/App.scss index 879074c4..c86bcf16 100755 --- a/frontend/app/src/App.scss +++ b/frontend/app/src/App.scss @@ -1,88 +1,77 @@ -@import "./styles/main"; +@import './styles/main'; .Page { - height: 100%; - min-height: 900px; - display: flex; - flex-direction: row; - align-items: stretch; + height: 100%; + min-height: 900px; + display: flex; + flex-direction: row; + align-items: stretch; } html, body { - margin: 0px; - font-family: $montserrat; + margin: 0px; + font-family: $montserrat; } .App { - height: 100%; - display: flex; - flex-direction: column; - font-family: Montserrat; + height: 100%; + display: flex; + flex-direction: column; + font-family: Montserrat; } .App--Main { - height: 100%; - flex-direction: column; - overflow-x: hidden; - background: $connected-peach; - @include bp-med { - flex-direction: row; - } + height: 100%; + flex-direction: column; + overflow-x: hidden; + background: $connected-peach; + @include bp-med { + flex-direction: row; + } } .App--Content { - position: absolute; - //if mobile - top: 10vh; - overflow-y: scroll; - // if not - @include bp-med { - top: 0; - } - align-items: stretch; - z-index: 1; - @include bp-med { - flex-basis: 85%; - left: 15%; - width: 85%; - } - .leave-margin { - margin-left: auto; - margin-right: auto; - width: 90%; - } -} + //if mobile + margin-top: 8vh; + overflow-y: scroll; + align-items: stretch; + z-index: 1; + // if not + @include bp-med { + margin-top: 0; + position: absolute; // this would destroy the mobile layout + top: 0; + flex-basis: 85%; + left: 15%; + width: 85%; + } -.Button-row { - width: 100%; - display: flex; - flex-wrap: wrap; - justify-content: space-around; + @include bp-full { + overflow-y: unset; + -webkit-overflow-scrolling: touch; + height: 100vh; + } + .leave-margin { + margin-left: auto; + margin-right: auto; + width: 90%; + } } -.ScrollSnap { - @include bp-full { - scroll-snap-type: y proximity; - overflow-y: unset; - -webkit-overflow-scrolling: touch; - height: 100vh; - } -} - -.ScrollSnapElem { - @include bp-med { - scroll-snap-stop: normal; - scroll-snap-align: start; - } +.Button-row { + width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: space-around; } .MobileLink { - position: relative; - top: -10vh; - @include bp-med { - top: 0; - } + position: relative; + top: -10vh; + @include bp-med { + top: 0; + } } /* diff --git a/frontend/app/src/assets/images/2part-chain.svg b/frontend/app/src/assets/images/2part-chain.svg new file mode 100644 index 00000000..08057f8e --- /dev/null +++ b/frontend/app/src/assets/images/2part-chain.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app/src/assets/images/bigchain-1.svg b/frontend/app/src/assets/images/bigchain-1.svg new file mode 100644 index 00000000..a67613af --- /dev/null +++ b/frontend/app/src/assets/images/bigchain-1.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app/src/assets/images/bigchain-2.svg b/frontend/app/src/assets/images/bigchain-2.svg new file mode 100644 index 00000000..a7a5eed1 --- /dev/null +++ b/frontend/app/src/assets/images/bigchain-2.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app/src/assets/images/chain-left.svg b/frontend/app/src/assets/images/chain-left.svg new file mode 100644 index 00000000..001787a3 --- /dev/null +++ b/frontend/app/src/assets/images/chain-left.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/app/src/assets/images/chain-right.svg b/frontend/app/src/assets/images/chain-right.svg new file mode 100644 index 00000000..f38b1917 --- /dev/null +++ b/frontend/app/src/assets/images/chain-right.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/app/src/assets/images/chainoutlines.svg b/frontend/app/src/assets/images/chainoutlines.svg new file mode 100644 index 00000000..a84a4f17 --- /dev/null +++ b/frontend/app/src/assets/images/chainoutlines.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/app/src/assets/images/challenges_frontpage.png b/frontend/app/src/assets/images/challenges_frontpage.png new file mode 100644 index 00000000..aa0933ef Binary files /dev/null and b/frontend/app/src/assets/images/challenges_frontpage.png differ diff --git a/frontend/app/src/assets/images/computer.svg b/frontend/app/src/assets/images/computer.svg new file mode 100644 index 00000000..06a26135 --- /dev/null +++ b/frontend/app/src/assets/images/computer.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app/src/assets/images/hackthefuture.svg b/frontend/app/src/assets/images/hackthefuture.svg new file mode 100644 index 00000000..eb45ff2f --- /dev/null +++ b/frontend/app/src/assets/images/hackthefuture.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app/src/assets/images/hub_map.svg b/frontend/app/src/assets/images/hub_map.svg new file mode 100644 index 00000000..7c325ef5 --- /dev/null +++ b/frontend/app/src/assets/images/hub_map.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/frontend/app/src/assets/images/hubs_illustration.svg b/frontend/app/src/assets/images/hubs_illustration.svg new file mode 100644 index 00000000..cc813ddb --- /dev/null +++ b/frontend/app/src/assets/images/hubs_illustration.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app/src/assets/images/hubs_illustration_mobile.svg b/frontend/app/src/assets/images/hubs_illustration_mobile.svg new file mode 100644 index 00000000..8fc74c8f --- /dev/null +++ b/frontend/app/src/assets/images/hubs_illustration_mobile.svg @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app/src/assets/images/junction-heads-petrus.png b/frontend/app/src/assets/images/junction-heads-petrus.png deleted file mode 100644 index 595690f7..00000000 Binary files a/frontend/app/src/assets/images/junction-heads-petrus.png and /dev/null differ diff --git a/frontend/app/src/assets/images/smallchain-1.svg b/frontend/app/src/assets/images/smallchain-1.svg new file mode 100644 index 00000000..c0cce528 --- /dev/null +++ b/frontend/app/src/assets/images/smallchain-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/frontend/app/src/assets/images/smallchain-2.svg b/frontend/app/src/assets/images/smallchain-2.svg new file mode 100644 index 00000000..4516978b --- /dev/null +++ b/frontend/app/src/assets/images/smallchain-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/app/src/components/Header/NavMenu/index.js b/frontend/app/src/components/Header/NavMenu/index.js index e8993455..9672fdb1 100644 --- a/frontend/app/src/components/Header/NavMenu/index.js +++ b/frontend/app/src/components/Header/NavMenu/index.js @@ -211,8 +211,8 @@ const NavMenu = ({ isSidebarOpen, toggleSidebar, connected }) => { onClick={() => toggleSidebar(isSidebarOpen ? false : true)} type="button" > - - + + diff --git a/frontend/app/src/components/Header/style.scss b/frontend/app/src/components/Header/style.scss index 25e3e923..c6f1f688 100644 --- a/frontend/app/src/components/Header/style.scss +++ b/frontend/app/src/components/Header/style.scss @@ -1,100 +1,100 @@ -@import "../../styles/main"; +@import '../../styles/main'; .Header { + position: fixed; + top: 0; + left: 0; + display: none; + pointer-events: none; + width: 15%; + height: 100%; + z-index: 10; + outline-style: solid; + outline-width: normal; + transition: all 0.2s ease; + @include bp-med { + display: flex; + } + &--emblem { + pointer-events: all; + width: 20px; + cursor: pointer; position: fixed; - top: 0; - left: 0; - display: none; - pointer-events: none; - width: 15%; - height: 100%; - z-index: 10; - outline-style: solid; - outline-width: normal; - transition: all 0.2s ease; - @include bp-med { - display: flex; + &__image { + width: 80px; } - &--emblem { - pointer-events: all; - width: 20px; - cursor: pointer; - position: fixed; - &__image { - width: 80px; - } + } + &--connected { + display: none; + pointer-events: all; + width: 100%; + cursor: pointer; + align-items: center; + justify-content: center; + margin: 1em auto; + position: relative; + @include bp-full { + display: flex; } - &--connected { - display: none; - pointer-events: all; - width: 100%; - cursor: pointer; - align-items: center; - justify-content: center; - margin: 1em auto; - position: relative; - @include bp-full { - display: flex; - } - &__image { - width: 80%; - margin: auto; - } + &__image { + width: 80%; + margin: auto; } + } } .HeaderMobile { - display: flex; - position: fixed; - right: 0; - left: 0; - width: 100%; - z-index: 10; - flex-direction: column; - &--open { - height: 100%; - overflow: hidden; - } - padding: 10px; - height: 10vh; - background: $junction-black; + display: flex; + position: fixed; + right: 0; + left: 0; + width: 100%; + z-index: 10; + flex-direction: column; + &--open { + height: 100%; + overflow: hidden; + } + padding: 10px; + height: auto; + background: $junction-black; - .HeaderMobileRow { - display: flex; - flex-direction: row; - justify-content: space-between; - > a { - display: flex; - align-items: center; - justify-content: center; - } + .HeaderMobileRow { + display: flex; + flex-direction: row; + justify-content: space-between; + > a { + display: flex; + align-items: center; + justify-content: center; } + } - &--emblem { - pointer-events: all; - cursor: pointer; + &--emblem { + pointer-events: all; + cursor: pointer; - &__image { - margin-left: 10%; - width: 50px; - } + &__image { + margin-left: 10%; + width: 50px; } - &--icon { - margin: 2%; - &:hover { - cursor: pointer; - } + } + &--icon { + margin: 2%; + &:hover { + cursor: pointer; } + } - &--connected { - width: 50%; - margin-left: 25%; - &__image { - width: 100%; - } - } - @include bp-med { - display: none; + &--connected { + width: 50%; + margin-left: 25%; + &__image { + width: 100%; } + } + @include bp-med { + display: none; + } } diff --git a/frontend/app/src/components/JobItem/index.js b/frontend/app/src/components/JobItem/index.js index 2cd4aa23..005ee6a6 100644 --- a/frontend/app/src/components/JobItem/index.js +++ b/frontend/app/src/components/JobItem/index.js @@ -15,8 +15,7 @@ export default (props) => { onClick={() => setOpen(!open)} >
- - +
{title} {location} diff --git a/frontend/app/src/components/LogoSpinner/index.js b/frontend/app/src/components/LogoSpinner/index.js index c36a5a22..3f74cadc 100644 --- a/frontend/app/src/components/LogoSpinner/index.js +++ b/frontend/app/src/components/LogoSpinner/index.js @@ -2,24 +2,27 @@ import React, { useState, useEffect } from 'react' import './style.scss' const LogoSpinner = () => { + const [loaded, setLoaded] = useState(false) - const [loaded, setLoaded] = useState(false) + useEffect(() => { + const timeout = setTimeout(() => { + setLoaded(true) + }, 500) - useEffect(() => { - const timeout = setTimeout(() => { - setLoaded(true) - }, 500) + return () => { + clearTimeout(timeout) + } + }) - return () => { - clearTimeout(timeout) - } - }) - - return ( -
- Loading -
- ) + return ( +
+ +
+ ) } -export default LogoSpinner \ No newline at end of file +export default LogoSpinner diff --git a/frontend/app/src/components/TeamCard/index.js b/frontend/app/src/components/TeamCard/index.js index de477253..dcf46c34 100644 --- a/frontend/app/src/components/TeamCard/index.js +++ b/frontend/app/src/components/TeamCard/index.js @@ -1,17 +1,15 @@ -import "./style.scss"; -import React from "react"; +import './style.scss' +import React from 'react' export default ({ name, title, mail, img }) => { - return ( -
-
- -

{name}

-

{title}

-

{mail}

-
-
- ); -}; + return ( +
+
+ +

{name}

+

{title}

+

{mail}

+
+
+ ) +} diff --git a/frontend/app/src/pages/Connected/Challenges/index.js b/frontend/app/src/pages/Connected/Challenges/index.js index 09b0d1c4..c4e083db 100644 --- a/frontend/app/src/pages/Connected/Challenges/index.js +++ b/frontend/app/src/pages/Connected/Challenges/index.js @@ -248,7 +248,7 @@ class Challenges extends PureComponent { Tracks - + */} @@ -263,7 +263,7 @@ class Challenges extends PureComponent { Here are the challenges for Junction 2020 Connected. Click the cards to read more about each challenge. - + ) diff --git a/frontend/app/src/pages/Connected/Components/HubSelector/index.js b/frontend/app/src/pages/Connected/Components/HubSelector/index.js new file mode 100644 index 00000000..1196da1c --- /dev/null +++ b/frontend/app/src/pages/Connected/Components/HubSelector/index.js @@ -0,0 +1,43 @@ +import React, { useState } from 'react' +import moment from 'moment' +import { connect } from 'react-redux' + +import { mapHubs } from '../../../../redux/hubs/selectors' + +const HubSelector = ({ hubs }) => { + console.log(hubs) + const [selectedHub, changeHub] = useState(hubs?.[0]?.id) + + return ( +
+ {hubs?.map((hub) => ( +
+
changeHub(hub.id)}> + {hub.name} +
+
+ {moment(moment(), 'h:mm a').utcOffset(hub.timezone)} +
+
+

{hub.country}

+

+ {hub.address} +
+ {hub.contact} +

+
+
+ ))} +
+ ) +} + +const mapStateToProps = (state) => ({ + hubs: mapHubs(state), +}) + +export default connect(mapStateToProps)(HubSelector) diff --git a/frontend/app/src/pages/Connected/EventInfo/index.js b/frontend/app/src/pages/Connected/EventInfo/index.js index 0a864bf2..0b1b3aee 100644 --- a/frontend/app/src/pages/Connected/EventInfo/index.js +++ b/frontend/app/src/pages/Connected/EventInfo/index.js @@ -103,12 +103,12 @@ const EventInfo = (props) => { alt="Junction Journey" /> - + } > {/*

The Junction Journey

@@ -141,14 +141,13 @@ const EventInfo = (props) => { alt="FAQ" /> - +
diff --git a/frontend/app/src/pages/Connected/Home/index.js b/frontend/app/src/pages/Connected/Home/index.js index 4ab3d211..089f1402 100644 --- a/frontend/app/src/pages/Connected/Home/index.js +++ b/frontend/app/src/pages/Connected/Home/index.js @@ -1,19 +1,13 @@ -import React, { useEffect } from 'react' +import React, { useEffect, useState } from 'react' import './style.scss' -import KEYS from '../../../redux/staticcontent/keys' -import MEDIA_KEYS from '../../../redux/staticmedia/keys' import { updateEvents } from '../../../redux/events/actions' import SectionImage from '../../../components/SectionImage' import NewsLetterForm from '../../../components/NewsLetterForm' import BlockSection from '../../../components/BlockSection' - -import DividerLine from '../../../components/DividerLine' +import { Grid } from '@material-ui/core' import HeaderSection from '../../../components/HeaderSection' -import Grid from '@material-ui/core/Grid' - -import HeaderVideo from '../../../components/HeaderVideo' import { content as selectContent } from '../../../redux/staticcontent/selectors' import { connect } from 'react-redux' @@ -27,8 +21,34 @@ import Button from '../../../components/Button' //HELMET import { Helmet } from 'react-helmet' +import HubSelector from '../Components/HubSelector' + const textsJSON = require('./texts.json') +const hubs = [ + { + name: 'Chengdu', + country: 'China', + address: 'Chengduroad 1', + contact: 'Eero Kere', + timezone: '+0800', + }, + { + name: 'Budapest', + country: 'Hungary', + address: 'Budapestalley 1', + contact: 'Mari Rautanen', + timezone: '+0200', + }, + { + name: 'Moscow', + country: 'Russia', + address: 'Moscowstreet 1', + contact: 'Virva Brax', + timezone: '+0300', + }, +] + const ConnectedHome = (props) => { useEffect(() => { props.updateEvents() @@ -39,8 +59,8 @@ const ConnectedHome = (props) => { // metaDescKey={KEYS.whoAreWeBody} className="Connected ConnectedContent ConnectedHome" pageTitle="Junction 2020 Connected" - // metaDescKey={KEYS.whoAreWeBody} - // ogImageKey={MEDIA_KEYS.homePageHeaderImage} + // metaDescKey={KEYS.whoAreWeBody} + // ogImageKey={MEDIA_KEYS.homePageHeaderImage} >
@@ -76,330 +96,365 @@ const ConnectedHome = (props) => { content={require('../../../assets/images/photo-hub-visualisation.svg')} /> - -

Apply now!

- - - + + Big Chain +
+ Connected logo +

+ ALL OVER THE WORLD +

+

+ NOVEMBER 6-8 +

+ computer + +

+ HACK THE FUTURE +

+
+ Big Chain 2 + Small Chain + Small Chain 2
- - - +
+ + +

{props.HeaderBody}

- - - - - - + chain-left + chain-left - } - > + chain-right +
+ +

{props.Section1Title}

+

{props.Section1Body}

+