aboutsummaryrefslogtreecommitdiffstats
path: root/packages/website/ts
diff options
context:
space:
mode:
authorBrandon Millman <brandon@0xproject.com>2018-12-15 06:42:55 +0800
committerGitHub <noreply@github.com>2018-12-15 06:42:55 +0800
commite3dcb7107bdd7bd8197818a05b163985026f7ca2 (patch)
treeee8e5617762c49ab9bdb6bde676f49c91eb2f012 /packages/website/ts
parent6d45beccad44e86ddd692d0cf54c09c29c5d9daf (diff)
parentf7ceb4cf582debf2521ef4797674e31a86ff6a38 (diff)
downloaddexon-sol-tools-e3dcb7107bdd7bd8197818a05b163985026f7ca2.tar
dexon-sol-tools-e3dcb7107bdd7bd8197818a05b163985026f7ca2.tar.gz
dexon-sol-tools-e3dcb7107bdd7bd8197818a05b163985026f7ca2.tar.bz2
dexon-sol-tools-e3dcb7107bdd7bd8197818a05b163985026f7ca2.tar.lz
dexon-sol-tools-e3dcb7107bdd7bd8197818a05b163985026f7ca2.tar.xz
dexon-sol-tools-e3dcb7107bdd7bd8197818a05b163985026f7ca2.tar.zst
dexon-sol-tools-e3dcb7107bdd7bd8197818a05b163985026f7ca2.zip
Merge pull request #1375 from bakkenbaeck/website
[WIP] Website
Diffstat (limited to 'packages/website/ts')
-rw-r--r--packages/website/ts/@next/components/aboutPageLayout.tsx68
-rw-r--r--packages/website/ts/@next/components/animatedChatIcon.tsx62
-rw-r--r--packages/website/ts/@next/components/animatedCompassIcon.tsx49
-rw-r--r--packages/website/ts/@next/components/banner.tsx140
-rw-r--r--packages/website/ts/@next/components/blockIconLink.tsx102
-rw-r--r--packages/website/ts/@next/components/button.tsx90
-rw-r--r--packages/website/ts/@next/components/chapter_link.tsx15
-rw-r--r--packages/website/ts/@next/components/definition.tsx125
-rw-r--r--packages/website/ts/@next/components/dropdowns/dropdown_developers.tsx186
-rw-r--r--packages/website/ts/@next/components/dropdowns/dropdown_products.tsx58
-rw-r--r--packages/website/ts/@next/components/footer.tsx169
-rw-r--r--packages/website/ts/@next/components/hamburger.tsx68
-rw-r--r--packages/website/ts/@next/components/header.tsx230
-rw-r--r--packages/website/ts/@next/components/hero.tsx120
-rw-r--r--packages/website/ts/@next/components/heroAnimation.tsx90
-rw-r--r--packages/website/ts/@next/components/heroImage.tsx31
-rw-r--r--packages/website/ts/@next/components/icon.tsx70
-rw-r--r--packages/website/ts/@next/components/image.tsx19
-rw-r--r--packages/website/ts/@next/components/layout.tsx162
-rw-r--r--packages/website/ts/@next/components/link.tsx56
-rw-r--r--packages/website/ts/@next/components/logo.tsx38
-rw-r--r--packages/website/ts/@next/components/mobileNav.tsx116
-rw-r--r--packages/website/ts/@next/components/modals/input.tsx70
-rw-r--r--packages/website/ts/@next/components/modals/modal_contact.tsx219
-rw-r--r--packages/website/ts/@next/components/newLayout.tsx136
-rw-r--r--packages/website/ts/@next/components/newsletter_form.tsx156
-rw-r--r--packages/website/ts/@next/components/sections/landing/about.tsx91
-rw-r--r--packages/website/ts/@next/components/sections/landing/clients.tsx98
-rw-r--r--packages/website/ts/@next/components/sections/landing/cta.tsx34
-rw-r--r--packages/website/ts/@next/components/sections/landing/hero.tsx31
-rw-r--r--packages/website/ts/@next/components/separator.tsx7
-rw-r--r--packages/website/ts/@next/components/siteWrap.tsx153
-rw-r--r--packages/website/ts/@next/components/slider/slider.tsx175
-rw-r--r--packages/website/ts/@next/components/text.tsx85
-rw-r--r--packages/website/ts/@next/constants/.gitkeep0
-rw-r--r--packages/website/ts/@next/constants/animations.tsx18
-rw-r--r--packages/website/ts/@next/constants/cssReset.js50
-rw-r--r--packages/website/ts/@next/constants/globalStyle.tsx119
-rw-r--r--packages/website/ts/@next/constants/utilities.tsx22
-rw-r--r--packages/website/ts/@next/icons/form-arrow.svg1
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/0x.svg14
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/buildBusiness.svg6
-rw-r--r--packages/website/ts/@next/icons/illustrations/checkmark.svg1
-rw-r--r--packages/website/ts/@next/icons/illustrations/code-repo.svg7
-rw-r--r--packages/website/ts/@next/icons/illustrations/coin.svg1
-rw-r--r--packages/website/ts/@next/icons/illustrations/consistently-ship.svg6
-rw-r--r--packages/website/ts/@next/icons/illustrations/customize.svg1
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/decentralisedLoans.svg13
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/description.svg21
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/descriptionBolt.svg4
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/descriptionCoin.svg9
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/descriptionCopy.svg7
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/descriptionFlask.svg7
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/eficientDesign.svg11
-rw-r--r--packages/website/ts/@next/icons/illustrations/eth-based-tokens.svg6
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/extensibleArchitecture.svg11
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/flexibleIntegration.svg12
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/flexibleIntegration0xInstant.svg17
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/flexibleOrders.svg4
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/gamingAndCollectibles.svg18
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/generateRevenueForYourBusiness-large.svg28
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/getInTouch.svg13
-rw-r--r--packages/website/ts/@next/icons/illustrations/getStarted.svg13
-rw-r--r--packages/website/ts/@next/icons/illustrations/launchKit.svg18
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/launchKit_versionB.svg7
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/legalResources.svg4
-rw-r--r--packages/website/ts/@next/icons/illustrations/logo-outlined.svg14
-rw-r--r--packages/website/ts/@next/icons/illustrations/long-term-impact.svg9
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/marketingDesignHelp.svg11
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/milestoneGrants.svg7
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/networkedLiquidity-small.svg20
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/networkedLiquidity.svg28
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/orderBooks.svg8
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/predictionMarkets.svg7
-rw-r--r--packages/website/ts/@next/icons/illustrations/protocol.svg1
-rw-r--r--packages/website/ts/@next/icons/illustrations/ready-to-build.svg1
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/recruitingSupport.svg7
-rw-r--r--packages/website/ts/@next/icons/illustrations/right-thing.svg1
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/robustSmartContracts.svg6
-rw-r--r--packages/website/ts/@next/icons/illustrations/rocketship.svg9
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/secureTrading.svg15
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/stableTokens.svg10
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/standardForExchange.svg12
-rw-r--r--packages/website/ts/@next/icons/illustrations/support.svg1
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/supportForAllEthereumStandards-large.svg28
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/supportForAllEthereumStandards.svg21
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/techSupport.svg13
-rw-r--r--packages/website/ts/@next/icons/illustrations/tokens.svg1
-rwxr-xr-xpackages/website/ts/@next/icons/illustrations/vcIntroductions.svg11
-rw-r--r--packages/website/ts/@next/icons/logo-with-type.svg1
-rw-r--r--packages/website/ts/@next/pages/about/jobs.tsx169
-rw-r--r--packages/website/ts/@next/pages/about/mission.tsx95
-rw-r--r--packages/website/ts/@next/pages/about/press.tsx84
-rw-r--r--packages/website/ts/@next/pages/about/team.tsx298
-rw-r--r--packages/website/ts/@next/pages/ecosystem.tsx112
-rw-r--r--packages/website/ts/@next/pages/instant.tsx219
-rw-r--r--packages/website/ts/@next/pages/instant/code_demo.tsx178
-rw-r--r--packages/website/ts/@next/pages/instant/config_generator.tsx329
-rw-r--r--packages/website/ts/@next/pages/instant/config_generator_address_input.tsx88
-rw-r--r--packages/website/ts/@next/pages/instant/configurator.tsx103
-rw-r--r--packages/website/ts/@next/pages/instant/fee_percentage_slider.tsx79
-rw-r--r--packages/website/ts/@next/pages/instant/rc-slider.css295
-rw-r--r--packages/website/ts/@next/pages/instant/select.tsx53
-rw-r--r--packages/website/ts/@next/pages/landing.tsx42
-rw-r--r--packages/website/ts/@next/pages/launch_kit.tsx129
-rw-r--r--packages/website/ts/@next/pages/why.tsx284
-rw-r--r--packages/website/ts/components/ui/text.tsx1
-rw-r--r--packages/website/ts/globals.d.ts12
-rw-r--r--packages/website/ts/index.tsx33
-rw-r--r--packages/website/ts/style/colors.ts8
-rw-r--r--packages/website/ts/style/theme.ts4
-rw-r--r--packages/website/ts/types.ts6
112 files changed, 6643 insertions, 8 deletions
diff --git a/packages/website/ts/@next/components/aboutPageLayout.tsx b/packages/website/ts/@next/components/aboutPageLayout.tsx
new file mode 100644
index 000000000..7d98804bb
--- /dev/null
+++ b/packages/website/ts/@next/components/aboutPageLayout.tsx
@@ -0,0 +1,68 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { Button } from 'ts/@next/components/button';
+import { ChapterLink } from 'ts/@next/components/chapter_link';
+import { Column, Section } from 'ts/@next/components/newLayout';
+import { SiteWrap } from 'ts/@next/components/siteWrap';
+import { Heading, Paragraph } from 'ts/@next/components/text';
+
+import { addFadeInAnimation } from 'ts/@next/constants/animations';
+import { WebsitePaths } from 'ts/types';
+
+interface Props {
+ title: string;
+ description: React.ReactNode | string;
+ linkLabel?: string;
+ linkUrl?: string;
+ children?: React.ReactNode;
+}
+
+export const AboutPageLayout = (props: Props) => (
+ <SiteWrap theme="light">
+ <Section isFlex={true} maxWidth="1170px" wrapWidth="100%">
+ <Column>
+ <ChapterLink to={WebsitePaths.AboutMission}>Mission</ChapterLink>
+ <ChapterLink to={WebsitePaths.AboutTeam}>Team</ChapterLink>
+ <ChapterLink to={WebsitePaths.AboutPress}>Press</ChapterLink>
+ <ChapterLink to={WebsitePaths.AboutJobs}>Jobs</ChapterLink>
+ </Column>
+
+ <Column width="70%" maxWidth="800px">
+ <Column width="100%" maxWidth="680px">
+ <AnimatedHeading size="medium">
+ {props.title}
+ </AnimatedHeading>
+
+ <AnimatedParagraph size="medium" marginBottom="60px" isMuted={0.65}>
+ {props.description}
+ </AnimatedParagraph>
+
+ {(props.linkLabel && props.linkUrl) &&
+ <AnimatedLink
+ to={props.linkUrl}
+ isWithArrow={true}
+ isAccentColor={true}
+ >
+ {props.linkLabel}
+ </AnimatedLink>
+ }
+ </Column>
+ </Column>
+ </Section>
+
+ {props.children}
+ </SiteWrap>
+);
+
+const AnimatedHeading = styled(Heading)`
+ ${addFadeInAnimation('0.5s')}
+`;
+
+const AnimatedParagraph = styled(Paragraph)`
+ ${addFadeInAnimation('0.5s', '0.15s')}
+`;
+
+const AnimatedLink = styled(Button)`
+ ${addFadeInAnimation('0.6s', '0.3s')}
+`;
diff --git a/packages/website/ts/@next/components/animatedChatIcon.tsx b/packages/website/ts/@next/components/animatedChatIcon.tsx
new file mode 100644
index 000000000..feaa0631f
--- /dev/null
+++ b/packages/website/ts/@next/components/animatedChatIcon.tsx
@@ -0,0 +1,62 @@
+import * as React from 'react';
+import styled, { keyframes } from 'styled-components';
+
+export const AnimatedChatIcon = () => (
+ <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <mask id="mask30" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="150" height="150">
+ <circle cx="75" cy="75" r="73" fill="#00AE99" stroke="#00AE99" stroke-width="3"/>
+ </mask>
+
+ <g mask="url(#mask30)">
+ <circle cx="75" cy="75" r="73" stroke="#00AE99" stroke-width="3"/>
+
+ <Rays>
+ <path vector-effect="non-scaling-stroke" d="M76 37H137.5" stroke="#00AE99" stroke-width="3"/>
+ <path vector-effect="non-scaling-stroke" d="M37 73.5L37 12M113 137.5L113 75" stroke="#00AE99" stroke-width="3"/>
+ <path vector-effect="non-scaling-stroke" d="M13 113H71.5" stroke="#00AE99" stroke-width="3"/>
+ <path vector-effect="non-scaling-stroke" d="M49.087 47.5264L92.574 4.03932" stroke="#00AE99" stroke-width="3"/>
+ <path vector-effect="non-scaling-stroke" d="M47.3192 100.913L3.8321 57.4259M146.314 92.4277L102.12 48.2335" stroke="#00AE99" stroke-width="3"/>
+ <path vector-effect="non-scaling-stroke" d="M58.2793 145.814L101.766 102.327" stroke="#00AE99" stroke-width="3"/>
+ </Rays>
+
+ <Bubble>
+ <path vector-effect="non-scaling-stroke" d="M113 75C113 85.3064 108.897 94.6546 102.235 101.5C98.4048 105.436 71 132.5 71 132.5V112.792C51.8933 110.793 37 94.6359 37 75C37 54.0132 54.0132 37 75 37C95.9868 37 113 54.0132 113 75Z" stroke="#00AE99" strokeWidth="3"/>
+ </Bubble>
+
+ <Dot delay={0} vector-effect="non-scaling-stroke" cx="75" cy="75" r="4" stroke="#00AE99" strokeWidth="3"/>
+ <Dot delay={4.4} vector-effect="non-scaling-stroke" cx="91" cy="75" r="4" stroke="#00AE99" strokeWidth="3"/>
+ <Dot delay={-4.6} vector-effect="non-scaling-stroke" cx="59" cy="75" r="4" stroke="#00AE99" strokeWidth="3"/>
+ </g>
+ </svg>
+);
+
+const scale = keyframes`
+ 0% { transform: scale(1.2) }
+ 15% { transform: scale(1) }
+ 85% { transform: scale(1) }
+ 100% { transform: scale(1.2) }
+`;
+
+const fadeInOut = keyframes`
+ 0%, 30%, 50%, 100% {
+ transform: initial;
+ }
+
+ 40% {
+ transform: translateY(-5px);
+ }
+`;
+
+const Bubble = styled.g`
+ animation: ${scale} 4s infinite cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ transform-origin: 50% 50%;
+`;
+
+const Rays = styled.g`
+ animation: ${scale} 4s infinite cubic-bezier(0.175, 0.885, 0.32, 1.275);
+ transform-origin: 50% 50%;
+`;
+
+const Dot = styled.circle<{ delay: number }>`
+ animation: ${fadeInOut} 4s ${props => `${props.delay}s`} infinite;
+`;
diff --git a/packages/website/ts/@next/components/animatedCompassIcon.tsx b/packages/website/ts/@next/components/animatedCompassIcon.tsx
new file mode 100644
index 000000000..aa0cfd099
--- /dev/null
+++ b/packages/website/ts/@next/components/animatedCompassIcon.tsx
@@ -0,0 +1,49 @@
+import * as React from 'react';
+import styled, { keyframes } from 'styled-components';
+
+export const AnimatedCompassIcon = () => (
+ <svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <g>
+ <circle cx="75" cy="75" r="73" stroke="#00AE99" stroke-width="3"/>
+ <circle cx="75" cy="75" r="58" stroke="#00AE99" stroke-width="3"/>
+ <Needle d="M62.9792 62.9792L36.6447 113.355L87.0208 87.0208M62.9792 62.9792L113.355 36.6447L87.0208 87.0208M62.9792 62.9792L87.0208 87.0208" stroke="#00AE99" strokeWidth="3"/>
+
+ <Dial>
+ <path d="M75 2V17M75 133V148" stroke="#00AE99" stroke-width="3"/>
+ <path d="M2 75L17 75M133 75L148 75" stroke="#00AE99" stroke-width="3"/>
+ <path d="M11.7801 38.5L24.7705 46M125.229 104L138.22 111.5" stroke="#00AE99" stroke-width="3"/>
+ <path d="M38.5001 11.7801L46.0001 24.7705M104 125.229L111.5 138.22" stroke="#00AE99" stroke-width="3"/>
+ <path d="M111.5 11.7801L104 24.7705M46 125.229L38.5 138.22" stroke="#00AE99" stroke-width="3"/>
+ <path d="M138.22 38.5L125.229 46M24.7705 104L11.7801 111.5" stroke="#00AE99" stroke-width="3"/>
+ </Dial>
+ </g>
+ </svg>
+);
+
+const point = keyframes`
+ 0% { transform: rotate(0deg) }
+ 20% { transform: rotate(10deg) }
+ 30% { transform: rotate(30deg) }
+ 60% { transform: rotate(-20deg) }
+ 80% { transform: rotate(-20deg) }
+ 100% { transform: rotate(0deg) }
+`;
+
+const rotate = keyframes`
+ 0% { transform: rotate(0deg) }
+ 20% { transform: rotate(-10deg) }
+ 30% { transform: rotate(-30deg) }
+ 60% { transform: rotate(20deg) }
+ 80% { transform: rotate(20deg) }
+ 100% { transform: rotate(0deg) }
+`;
+
+const Needle = styled.path`
+ animation: ${point} 5s infinite;
+ transform-origin: 50% 50%;
+`;
+
+const Dial = styled.g`
+ animation: ${rotate} 5s infinite;
+ transform-origin: 50% 50%;
+`;
diff --git a/packages/website/ts/@next/components/banner.tsx b/packages/website/ts/@next/components/banner.tsx
new file mode 100644
index 000000000..e779c5889
--- /dev/null
+++ b/packages/website/ts/@next/components/banner.tsx
@@ -0,0 +1,140 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+import {Button} from 'ts/@next/components/button';
+import {ThemeInterface} from 'ts/@next/components/siteWrap';
+import {Paragraph} from 'ts/@next/components/text';
+
+import {Column, Section} from 'ts/@next/components/newLayout';
+
+interface Props {
+ heading?: string;
+ subline?: string;
+ mainCta?: CTAButton;
+ secondaryCta?: CTAButton;
+ theme?: ThemeInterface;
+}
+
+interface CTAButton {
+ text: string;
+ href?: string;
+ onClick?: () => void;
+}
+
+interface BorderProps {
+ isBottom?: boolean;
+}
+
+export const Banner: React.StatelessComponent<Props> = (props: Props) => {
+ const {
+ heading,
+ subline,
+ mainCta,
+ secondaryCta,
+ } = props;
+ return (
+ <CustomSection
+ bgColor="light"
+ isFlex={true}
+ flexBreakpoint="900px"
+ paddingMobile="120px 0"
+ >
+ <Border/>
+ <Border isBottom={true} />
+
+ <Column>
+ <CustomHeading>{heading}</CustomHeading>
+
+ {subline &&
+ <Paragraph isMuted={0.5} isNoMargin={true}>
+ {subline}
+ </Paragraph>
+ }
+ </Column>
+ <Column>
+ <ButtonWrap>
+ {mainCta &&
+ <Button
+ isTransparent={false}
+ href={mainCta.href}
+ >
+ {mainCta.text}
+ </Button>
+ }
+
+ {secondaryCta &&
+ <Button
+ href={secondaryCta.href}
+ onClick={secondaryCta.onClick}
+ isTransparent={true}
+ >
+ {secondaryCta.text}
+ </Button>
+ }
+ </ButtonWrap>
+ </Column>
+ </CustomSection>
+ );
+};
+
+const CustomSection = styled(Section)`
+ margin-top: 30px;
+
+ @media (max-width: 900px) {
+ text-align: center;
+
+ p {
+ margin-bottom: 30px;
+ }
+
+ div:last-child {
+ margin-bottom: 0;
+ }
+ }
+`;
+
+const CustomHeading = styled.h2`
+ font-size: 34px;
+ font-weight: 400;
+ margin-bottom: 10px
+
+ @media (max-width: 768px) {
+ font-size: 30px;
+ }
+`;
+
+const ButtonWrap = styled.div`
+ display: inline-block;
+
+ @media (min-width: 768px) {
+ * + * {
+ margin-left: 15px;
+ }
+ }
+
+ @media (max-width: 768px) {
+ a, button {
+ display: block;
+ width: 220px;
+ }
+
+ * + * {
+ margin-top: 15px;
+ }
+ }
+`;
+
+// Note let's refactor this
+// is it absolutely necessary to have a stateless component
+// to pass props down into the styled icon?
+const Border = styled.div<BorderProps>`
+ position: absolute;
+ background-image: ${props => props.isBottom ? 'url(/images/@next/banner/bottomofcta.png);' : 'url(/images/@next/banner/topofcta.png);' };
+ background-position: ${props => props.isBottom ? 'left top' : 'left bottom' };
+ left: 0;
+ width: calc(100% + 214px);
+ height: 40px;
+ top: ${props => !props.isBottom && 0 };
+ bottom: ${props => props.isBottom && 0 };
+ transform: translate(-112px);
+`;
diff --git a/packages/website/ts/@next/components/blockIconLink.tsx b/packages/website/ts/@next/components/blockIconLink.tsx
new file mode 100644
index 000000000..46a267889
--- /dev/null
+++ b/packages/website/ts/@next/components/blockIconLink.tsx
@@ -0,0 +1,102 @@
+import * as React from 'react';
+import {withRouter} from 'react-router-dom';
+import styled from 'styled-components';
+
+import {Button} from 'ts/@next/components/button';
+import {Icon} from 'ts/@next/components/icon';
+
+interface Props {
+ icon?: string;
+ iconComponent?: React.ReactNode;
+ title: string;
+ linkLabel: string;
+ linkUrl?: string;
+ linkAction?: () => void;
+}
+
+class BaseComponent extends React.PureComponent<Props> {
+ public onClick = (): void => {
+ const {
+ linkAction,
+ linkUrl,
+ } = this.props;
+
+ if (linkAction) {
+ linkAction();
+ } else {
+ this.props.history.push(linkUrl);
+ }
+ }
+
+ public render(): React.ReactNode {
+ const {
+ icon,
+ iconComponent,
+ linkUrl,
+ linkAction,
+ title,
+ linkLabel,
+ } = this.props;
+
+ return (
+ <Wrap onClick={this.onClick}>
+ <div>
+ <Icon
+ name={icon}
+ component={iconComponent}
+ size="large"
+ margin={[0, 0, 'default', 0]}
+ />
+
+ <Title>
+ {title}
+ </Title>
+
+ <Button
+ isWithArrow={true}
+ isTransparent={true}
+ href={linkUrl}
+ onClick={linkAction}
+ >
+ {linkLabel}
+ </Button>
+ </div>
+ </Wrap>
+ );
+ }
+}
+
+export const BlockIconLink = withRouter(BaseComponent);
+
+const Wrap = styled.div`
+ width: calc(50% - 15px);
+ height: 400px;
+ padding: 40px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+ transition: background-color 0.25s;
+ background-color: ${props => props.theme.lightBgColor};
+ cursor: pointer;
+
+ a,
+ button {
+ pointer-events: none;
+ }
+
+ @media (max-width: 900px) {
+ width: 100%;
+ margin-top: 30px;
+ }
+
+ &:hover {
+ background-color: #002d28;
+ }
+`;
+
+const Title = styled.h2`
+ font-size: 20px;
+ margin-bottom: 30px;
+ color: ${props => props.theme.linkColor};
+`;
diff --git a/packages/website/ts/@next/components/button.tsx b/packages/website/ts/@next/components/button.tsx
new file mode 100644
index 000000000..05afa3534
--- /dev/null
+++ b/packages/website/ts/@next/components/button.tsx
@@ -0,0 +1,90 @@
+import * as React from 'react';
+import { Link as ReactRouterLink } from 'react-router-dom';
+import styled from 'styled-components';
+
+import { ThemeInterface } from 'ts/@next/components/siteWrap';
+
+import { colors } from 'ts/style/colors';
+
+interface ButtonInterface {
+ bgColor?: string;
+ color?: string;
+ children?: React.ReactNode | string;
+ isTransparent?: boolean;
+ isNoBorder?: boolean;
+ isNoPadding?: boolean;
+ isWithArrow?: boolean;
+ isAccentColor?: boolean;
+ hasIcon?: boolean | string;
+ isInline?: boolean;
+ href?: string;
+ type?: string;
+ to?: string;
+ onClick?: () => any;
+ theme?: ThemeInterface;
+}
+
+export const Button = (props: ButtonInterface) => {
+ const {
+ children,
+ href,
+ isWithArrow,
+ to,
+ } = props;
+ let linkElem;
+
+ if (href) { linkElem = 'a'; }
+ if (to) { linkElem = ReactRouterLink; }
+
+ const Component = linkElem ? ButtonBase.withComponent(linkElem) : ButtonBase;
+
+ return (
+ <Component {...props}>
+ {children}
+
+ { isWithArrow &&
+ <svg width="16" height="15" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path
+ d="M4.484.246l.024 1.411 8.146.053L.817 13.547l.996.996L13.65 2.706l.052 8.146 1.412.024L15.045.315 4.484.246z"
+ />
+ </svg>
+ }
+ </Component>
+ );
+};
+
+const ButtonBase = styled.button<ButtonInterface>`
+ appearance: none;
+ border: 1px solid transparent;
+ display: inline-block;
+ background-color: ${props => props.bgColor || colors.brandLight};
+ background-color: ${props => (props.isTransparent || props.isWithArrow) && 'transparent'};
+ border-color: ${props => (props.isTransparent && !props.isWithArrow) && 'rgba(255, 255, 255, .4)'};
+ color: ${props => props.isAccentColor ? props.theme.linkColor : (props.color || props.theme.textColor)};
+ padding: ${props => (!props.isNoPadding && !props.isWithArrow) && '18px 30px'};
+ text-align: center;
+ font-size: ${props => props.isWithArrow ? '20px' : '18px'};
+ text-decoration: none;
+ cursor: pointer;
+ outline: none;
+ transition: background-color 0.35s, border-color 0.35s;
+
+ svg {
+ margin-left: 9px;
+ transition: transform 0.5s;
+ transform: translate3d(-2px, 2px, 0);
+ }
+
+ path {
+ fill: ${props => props.isAccentColor ? props.theme.linkColor : (props.color || props.theme.textColor)};
+ }
+
+ &:hover {
+ background-color: ${props => (!props.isTransparent && !props.isWithArrow) && '#04BEA8'};
+ border-color: ${props => (props.isTransparent && !props.isNoBorder && !props.isWithArrow) && '#00AE99'};
+
+ svg {
+ transform: translate3d(2px, -2px, 0);
+ }
+ }
+`;
diff --git a/packages/website/ts/@next/components/chapter_link.tsx b/packages/website/ts/@next/components/chapter_link.tsx
new file mode 100644
index 000000000..fd974cec1
--- /dev/null
+++ b/packages/website/ts/@next/components/chapter_link.tsx
@@ -0,0 +1,15 @@
+import { NavLink as ReactRouterLink } from 'react-router-dom';
+import styled from 'styled-components';
+
+export const ChapterLink = styled(ReactRouterLink).attrs({
+ activeStyle: { opacity: 1 },
+})`
+ font-size: 1.222222222rem;
+ display: block;
+ opacity: 0.5;
+ margin-bottom: 1.666666667rem;
+
+ &:hover {
+ opacity: 1;
+ }
+`;
diff --git a/packages/website/ts/@next/components/definition.tsx b/packages/website/ts/@next/components/definition.tsx
new file mode 100644
index 000000000..d556bc647
--- /dev/null
+++ b/packages/website/ts/@next/components/definition.tsx
@@ -0,0 +1,125 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { Button } from 'ts/@next/components/button';
+import { Icon } from 'ts/@next/components/icon';
+import { Heading, Paragraph } from 'ts/@next/components/text';
+
+interface Action {
+ label: string;
+ url: string;
+}
+
+interface Props {
+ isInline?: boolean;
+ isInlineIcon?: boolean;
+ isCentered?: boolean;
+ isWithMargin?: boolean;
+ icon: string;
+ iconSize?: 'medium' | 'large' | number;
+ title: string;
+ titleSize?: 'small' | 'default' | number;
+ description: React.ReactNode | string;
+ actions?: Action[];
+}
+
+export const Definition = (props: Props) => (
+ <Wrap {...props}>
+ <Icon
+ name={props.icon}
+ size={props.iconSize || 'medium'}
+ margin={[0, 0, 'default', 0]}
+ />
+
+ <TextWrap {...props}>
+ <Heading
+ asElement="h2"
+ fontWeight="400"
+ marginBottom={props.titleSize === 'small' ? '7px' : '15px'}
+ size={props.titleSize || 'default'}
+ >
+ {props.title}
+ </Heading>
+
+ {typeof props.description === 'string' ? (
+ <Paragraph isMuted={true}>
+ {props.description}
+ </Paragraph>
+ ) : (
+ <>
+ {props.description}
+ </>
+ )}
+
+ {props.actions &&
+ <LinkWrap>
+ {props.actions.map((item, index) => (
+ <Button
+ key={`dlink-${index}`}
+ href={item.url}
+ isWithArrow={true}
+ isAccentColor={true}
+ >
+ {item.label}
+ </Button>
+ ))}
+ </LinkWrap>
+ }
+ </TextWrap>
+ </Wrap>
+);
+
+const Wrap = styled.div<Props>`
+ max-width: ${props => props.isInline && '354px'};
+
+ & + & {
+ margin-top: ${props => props.isInlineIcon && '120px'};
+ margin-top: ${props => props.isWithMargin && '60px'};
+ }
+
+ @media (min-width: 768px) {
+ width: ${props => props.isInline ? 'calc(33.3333% - 30px)' : '100%'};
+ display: ${props => props.isInlineIcon && 'flex'};
+ justify-content: ${props => props.isInlineIcon && 'space-between'};
+ align-items: ${props => props.isInlineIcon && 'center'};
+ text-align: ${props => (props.isInlineIcon || !props.isCentered) && 'left'};
+ }
+
+ @media (max-width: 768px) {
+ margin: 0 auto;
+
+ & + & {
+ margin-top: ${props => props.isInline && '60px'};
+ }
+ }
+`;
+
+const TextWrap = styled.div<Props>`
+ width: 100%;
+ max-width: 560px;
+
+ ul {
+ padding-top: 10px;
+ padding-left: 1rem;
+ }
+
+ li {
+ list-style: disc;
+ opacity: 0.75;
+ line-height: 1.444444444;
+ margin-bottom: 1rem;
+ }
+
+ @media (min-width: 768px) {
+ margin-left: ${props => props.isInlineIcon && '60px'};
+ }
+`;
+
+const LinkWrap = styled.div`
+ display: inline-flex;
+ margin-top: 60px;
+
+ a + a {
+ margin-left: 60px;
+ }
+`;
diff --git a/packages/website/ts/@next/components/dropdowns/dropdown_developers.tsx b/packages/website/ts/@next/components/dropdowns/dropdown_developers.tsx
new file mode 100644
index 000000000..791eae242
--- /dev/null
+++ b/packages/website/ts/@next/components/dropdowns/dropdown_developers.tsx
@@ -0,0 +1,186 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import {Link as RouterLink} from 'react-router-dom';
+import styled, {withTheme} from 'styled-components';
+
+import {Button} from 'ts/@next/components/button';
+import {Column, FlexWrap, WrapGrid} from 'ts/@next/components/newLayout';
+import {ThemeValuesInterface} from 'ts/@next/components/siteWrap';
+import {Heading} from 'ts/@next/components/text';
+
+interface Props {
+ theme: ThemeValuesInterface;
+}
+
+const introData = [
+ {
+ label: 'Build a relayer',
+ url: 'https://0xproject.com/wiki#Build-A-Relayer',
+ },
+ {
+ label: 'Develop on Ethereum',
+ url: 'https://0xproject.com/wiki#Ethereum-Development',
+ },
+ {
+ label: 'Make & take orders',
+ url: 'https://0xproject.com/wiki#Create,-Validate,-Fill-Order',
+ },
+ {
+ label: 'Use networked liquidity',
+ url: 'https://0xproject.com/wiki#Find,-Submit,-Fill-Order-From-Relayer',
+ },
+];
+
+const docsData = [
+ {
+ label: '0x.js',
+ url: 'https://0xproject.com/docs/0x.js',
+ },
+ {
+ label: '0x Connect',
+ url: 'https://0xproject.com/docs/connect',
+ },
+ {
+ label: 'Smart Contract',
+ url: 'https://0xproject.com/docs/contracts',
+ },
+];
+
+const linksData = [
+ {
+ label: 'Wiki',
+ url: 'https://0xproject.com/wiki',
+ },
+ {
+ label: 'Github',
+ url: 'https://github.com/0xProject',
+ },
+ {
+ label: 'Whitepaper',
+ url: 'https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md',
+ },
+];
+
+export const DropdownDevelopers: React.FunctionComponent<Props> = withTheme((props: Props) => (
+ <>
+ <DropdownWrap>
+ <div>
+ <Heading
+ asElement="h4"
+ size={14}
+ color="inherit"
+ marginBottom="15px"
+ isMuted={0.35}
+ >
+ Getting Started
+ </Heading>
+
+ <StyledGrid isCentered={false} isWrapped={true}>
+ {_.map(introData, (item, index) => (
+ <li>
+ <RouterLink
+ key={`introLink-${index}`}
+ to={item.url}
+ >
+ {item.label}
+ </RouterLink>
+ </li>
+ ))}
+ </StyledGrid>
+ </div>
+
+ <StyledWrap>
+ <Column width="calc(100% - 15px)">
+ <Heading
+ asElement="h4"
+ size={14}
+ color="inherit"
+ marginBottom="15px"
+ isMuted={0.35}
+ >
+ Popular Docs
+ </Heading>
+
+ <ul>
+ {_.map(docsData, (item, index) => (
+ <li key={`docsLink-${index}`}>
+ <RouterLink to={item.url}>
+ {item.label}
+ </RouterLink>
+ </li>
+ ))}
+ </ul>
+ </Column>
+
+ <Column width="calc(100% - 15px)">
+ <Heading
+ asElement="h4"
+ size={14}
+ color="inherit"
+ marginBottom="15px"
+ isMuted={0.35}
+ >
+ Useful Links
+ </Heading>
+
+ <ul>
+ {_.map(linksData, (item, index) => (
+ <li key={`usefulLink-${index}`}>
+ <RouterLink to={item.url}>
+ {item.label}
+ </RouterLink>
+ </li>
+ ))}
+ </ul>
+ </Column>
+ </StyledWrap>
+
+ <StyledLink to="https://0xproject.com/docs" bgColor={props.theme.dropdownButtonBg} isAccentColor={true} isNoBorder={true}>
+ View All Documentation
+ </StyledLink>
+ </DropdownWrap>
+ </>
+));
+
+const DropdownWrap = styled.div`
+ padding: 15px 30px 75px 30px;
+
+ a {
+ color: inherit;
+ }
+
+ li {
+ margin: 8px 0;
+ }
+`;
+
+const StyledGrid = styled(WrapGrid.withComponent('ul'))`
+ li {
+ width: 50%;
+ flex-shrink: 0;
+ }
+`;
+
+const StyledWrap = styled(FlexWrap)`
+ padding-top: 20px;
+ margin-top: 30px;
+ position: relative;
+
+ &:before {
+ content: '';
+ width: 100%;
+ height: 1px;
+ background-color: ${props => props.theme.dropdownColor};
+ opacity: 0.15;
+ position: absolute;
+ top: 0;
+ left:0;
+ }
+`;
+
+const StyledLink = styled(Button)`
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+`;
diff --git a/packages/website/ts/@next/components/dropdowns/dropdown_products.tsx b/packages/website/ts/@next/components/dropdowns/dropdown_products.tsx
new file mode 100644
index 000000000..1677d3c08
--- /dev/null
+++ b/packages/website/ts/@next/components/dropdowns/dropdown_products.tsx
@@ -0,0 +1,58 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+
+import {Link} from 'react-router-dom';
+import styled from 'styled-components';
+import {Heading, Paragraph} from 'ts/@next/components/text';
+import { WebsitePaths } from 'ts/types';
+
+const navData = [
+ {
+ title: '0x Instant',
+ description: 'Simple crypto purchasing',
+ url: WebsitePaths.Instant,
+ },
+ {
+ title: '0x Launch kit',
+ description: 'Build on the 0x protocol',
+ url: WebsitePaths.LaunchKit,
+ },
+];
+
+export const DropdownProducts: React.FunctionComponent<{}> = () => (
+ <List>
+ {_.map(navData, (item, index) => (
+ <li key={`productLink-${index}`}>
+ <Link to={item.url}>
+ <Heading
+ asElement="h3"
+ color="inherit"
+ isNoMargin={true}
+ size="small"
+ >
+ {item.title}
+ </Heading>
+
+ {item.description &&
+ <Paragraph
+ color="inherit"
+ isNoMargin={true}
+ size="small"
+ isMuted={0.5}
+ >
+ {item.description}
+ </Paragraph>
+ }
+ </Link>
+ </li>
+ ))}
+ </List>
+);
+
+const List = styled.ul`
+ a {
+ padding: 15px 30px;
+ display: block;
+ color: inherit;
+ }
+`;
diff --git a/packages/website/ts/@next/components/footer.tsx b/packages/website/ts/@next/components/footer.tsx
new file mode 100644
index 000000000..5e5106ff3
--- /dev/null
+++ b/packages/website/ts/@next/components/footer.tsx
@@ -0,0 +1,169 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import MediaQuery from 'react-responsive';
+import { Link as ReactRouterLink } from 'react-router-dom';
+import styled from 'styled-components';
+
+import { Logo } from 'ts/@next/components/logo';
+import { Column, FlexWrap, WrapGrid } from 'ts/@next/components/newLayout';
+import { NewsletterForm } from 'ts/@next/components/newsletter_form';
+import { WebsitePaths } from 'ts/types';
+
+interface LinkInterface {
+ text: string;
+ url: string;
+ newWindow?: boolean;
+}
+
+interface LinkRows {
+ heading: string;
+ isOnMobile?: boolean;
+ links: LinkInterface[];
+}
+
+interface LinkListProps {
+ links: LinkInterface[];
+}
+
+const linkRows: LinkRows[] = [
+ {
+ heading: 'Products',
+ isOnMobile: true,
+ links: [
+ { url: WebsitePaths.Instant, text: '0x Instant' },
+ { url: WebsitePaths.LaunchKit, text: '0x Launch Kit' },
+ ],
+ },
+ {
+ heading: 'Developers',
+ links: [
+ { url: '#', text: 'Documentation' },
+ { url: '#', text: 'GitHub' },
+ { url: '#', text: 'Whitepaper' },
+ ],
+ },
+ {
+ heading: 'About',
+ isOnMobile: true,
+ links: [
+ { url: WebsitePaths.AboutMission, text: 'Mission' },
+ { url: WebsitePaths.AboutTeam, text: 'Team' },
+ { url: WebsitePaths.AboutJobs, text: 'Jobs' },
+ { url: WebsitePaths.AboutPress, text: 'Press Kit' },
+ { url: WebsitePaths.Ecosystem, text: 'Grant Program' },
+ ],
+ },
+ {
+ heading: 'Community',
+ isOnMobile: true,
+ links: [
+ { url: '#', text: 'Twitter' },
+ { url: '#', text: 'Rocket Chat' },
+ { url: '#', text: 'Facebook' },
+ { url: '#', text: 'Reddit' },
+ ],
+ },
+];
+
+export const Footer: React.StatelessComponent = () => (
+ <FooterWrap>
+ <FlexWrap>
+ <FooterColumn width="35%">
+ <Logo />
+ <NewsletterForm />
+ </FooterColumn>
+
+ <FooterColumn width="55%">
+ <WrapGrid isCentered={false} isWrapped={true}>
+ {_.map(linkRows, (row: LinkRows, index) => (
+ <MediaQuery minWidth={row.isOnMobile ? 0 : 768} key={`fc-${index}`}>
+ <FooterSectionWrap>
+ <RowHeading>
+ {row.heading}
+ </RowHeading>
+
+ <LinkList links={row.links} />
+ </FooterSectionWrap>
+ </MediaQuery>
+ ))}
+ </WrapGrid>
+ </FooterColumn>
+ </FlexWrap>
+ </FooterWrap>
+);
+
+const LinkList = (props: LinkListProps) => (
+ <List>
+ {_.map(props.links, (link, index) => (
+ <li key={`fl-${index}`}>
+ <Link to={link.url}>
+ {link.text}
+ </Link>
+ </li>
+ ))}
+ </List>
+);
+
+const FooterWrap = styled.footer`
+ padding: 40px 30px 30px 30px;
+ margin-top: 30px;
+ background-color: ${props => props.theme.footerBg};
+ color: ${props => props.theme.footerColor};
+
+ path {
+ fill: ${props => props.theme.footerColor};
+ }
+
+ @media (min-width: 768px) {
+ height: 350px;
+ }
+`;
+
+const FooterColumn = styled(Column)`
+ @media (min-width: 768px) {
+ width: ${props => props.width};
+ }
+
+ @media (max-width: 768px) {
+ text-align: left;
+ }
+`;
+
+const FooterSectionWrap = styled(FooterColumn)`
+ @media (max-width: 768px) {
+ width: 50%;
+
+ & + & {
+ margin-top: 0;
+ margin-bottom: 30px;
+ }
+ }
+`;
+
+const RowHeading = styled.h3`
+ color: inherit;
+ font-weight: 700;
+ font-size: 16px;
+ margin-bottom: 1.25em;
+ opacity: 0.75;
+`;
+
+const List = styled.ul`
+ li + li {
+ margin-top: 8px;
+ }
+`;
+
+const Link = styled(ReactRouterLink)`
+ color: inherit;
+ opacity: 0.5;
+ display: block;
+ font-size: 16px;
+ line-height: 20px;
+ transition: color 0.25s ease-in-out;
+ text-decoration: none;
+
+ &:hover {
+ color: rgba(255, 255, 255, 1);
+ }
+`;
diff --git a/packages/website/ts/@next/components/hamburger.tsx b/packages/website/ts/@next/components/hamburger.tsx
new file mode 100644
index 000000000..3ca276705
--- /dev/null
+++ b/packages/website/ts/@next/components/hamburger.tsx
@@ -0,0 +1,68 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+interface Props {
+ isOpen: boolean;
+ onClick?: () => void;
+}
+
+export const Hamburger: React.FunctionComponent<Props> = (props: Props) => {
+ return (
+ <StyledHamburger isOpen={props.isOpen} onClick={props.onClick}>
+ <span />
+ <span />
+ <span />
+ </StyledHamburger>
+ );
+};
+
+const StyledHamburger = styled.button<Props>`
+ background: none;
+ border: 0;
+ width: 22px;
+ height: 16px;
+ position: relative;
+ z-index: 25;
+ padding: 0;
+ outline: none;
+ user-select: none;
+
+ @media (min-width: 800px) {
+ display: none;
+ }
+
+ span {
+ display: block;
+ background-color: ${props => props.theme.textColor};
+ width: 100%;
+ height: 2px;
+ margin-bottom: 5px;
+ transform-origin: 4px 0px;
+ transition: transform 0.5s cubic-bezier(0.77,0.2,0.05,1.0),
+ background-color 0.5s cubic-bezier(0.77,0.2,0.05,1.0),
+ opacity 0.55s ease;
+
+ &:first-child {
+ //transform-origin: 0% 0%;
+ }
+
+ &:last-child {
+ //transform-origin: 0% 100%;
+ }
+
+ ${props => props.isOpen && `
+ opacity: 1;
+ transform: rotate(45deg) translate(0, 1px);
+ background-color: #fff;
+
+ &:nth-child(2) {
+ opacity: 0;
+ transform: rotate(0deg) scale(0.2, 0.2);
+ }
+
+ &:last-child {
+ transform: rotate(-45deg) translate(1px, -4px);
+ }
+ `}
+ }
+`;
diff --git a/packages/website/ts/@next/components/header.tsx b/packages/website/ts/@next/components/header.tsx
new file mode 100644
index 000000000..568c279bd
--- /dev/null
+++ b/packages/website/ts/@next/components/header.tsx
@@ -0,0 +1,230 @@
+import _ from 'lodash';
+import * as React from 'react';
+import MediaQuery from 'react-responsive';
+import { NavLink as ReactRouterLink } from 'react-router-dom';
+import styled, { withTheme } from 'styled-components';
+
+import { Button } from 'ts/@next/components/button';
+import { DropdownDevelopers } from 'ts/@next/components/dropdowns/dropdown_developers';
+import { DropdownProducts } from 'ts/@next/components/dropdowns/dropdown_products';
+import { Hamburger } from 'ts/@next/components/hamburger';
+import { Logo } from 'ts/@next/components/logo';
+import { MobileNav } from 'ts/@next/components/mobileNav';
+import { FlexWrap } from 'ts/@next/components/newLayout';
+import { ThemeValuesInterface } from 'ts/@next/components/siteWrap';
+import { WebsitePaths } from 'ts/types';
+
+interface HeaderProps {
+ location?: Location;
+ isNavToggled?: boolean;
+ toggleMobileNav?: () => void;
+ theme: ThemeValuesInterface;
+}
+
+interface NavItemProps {
+ url?: string;
+ id?: string;
+ text?: string;
+ dropdownWidth?: number;
+ dropdownComponent?: React.ReactNode;
+}
+
+interface DropdownWrapInterface {
+ width?: number;
+}
+
+const navItems: NavItemProps[] = [
+ {
+ id: 'why',
+ url: WebsitePaths.Why,
+ text: 'Why 0x',
+ },
+ {
+ id: 'products',
+ url: '#',
+ text: 'Products',
+ dropdownComponent: DropdownProducts,
+ dropdownWidth: 280,
+ },
+ {
+ id: 'developers',
+ url: '#',
+ text: 'Developers',
+ dropdownComponent: DropdownDevelopers,
+ dropdownWidth: 480,
+ },
+ {
+ id: 'about',
+ url: WebsitePaths.AboutMission,
+ text: 'About',
+ },
+ {
+ id: 'blog',
+ url: 'https://blog.0xproject.com/latest',
+ text: 'Blog',
+ },
+];
+
+class HeaderBase extends React.Component<HeaderProps> {
+ public render(): React.ReactNode {
+ const { isNavToggled, toggleMobileNav, theme } = this.props;
+
+ return (
+ <StyledHeader>
+ <HeaderWrap>
+ <ReactRouterLink to={WebsitePaths.Home}>
+ <Logo />
+ </ReactRouterLink>
+
+ <NavLinks>
+ {_.map(navItems, (link, index) => (
+ <NavItem
+ key={`navlink-${index}`}
+ link={link}
+ />
+ ))}
+ </NavLinks>
+
+ <MediaQuery minWidth={990}>
+ <TradeButton
+ bgColor={theme.headerButtonBg}
+ color="#ffffff"
+ href="https://0xproject.com/portal"
+ >
+ Trade on 0x
+ </TradeButton>
+ </MediaQuery>
+
+ <Hamburger isOpen={isNavToggled} onClick={toggleMobileNav} />
+ <MobileNav isToggled={isNavToggled} toggleMobileNav={toggleMobileNav} />
+ </HeaderWrap>
+ </StyledHeader>
+ );
+ }
+}
+
+export const Header = withTheme(HeaderBase);
+
+const NavItem = (props: { link: NavItemProps; key: string }) => {
+ const { link } = props;
+ const Subnav = link.dropdownComponent;
+
+ return (
+ <LinkWrap>
+ <StyledNavLink to={link.url}>
+ {link.text}
+ </StyledNavLink>
+
+ {link.dropdownComponent &&
+ <DropdownWrap width={link.dropdownWidth}>
+ <Subnav />
+ </DropdownWrap>
+ }
+ </LinkWrap>
+ );
+};
+
+const StyledHeader = styled.header<HeaderProps>`
+ padding: 30px;
+`;
+
+const LinkWrap = styled.li`
+ position: relative;
+
+ a {
+ display: block;
+ }
+
+ @media (min-width: 800px) {
+ &:hover > div {
+ display: block;
+ visibility: visible;
+ opacity: 1;
+ transform: translate3d(0, 0, 0);
+ transition: opacity 0.35s, transform 0.35s, visibility 0s;
+ }
+ }
+`;
+
+const StyledNavLink = styled(ReactRouterLink).attrs({
+ activeStyle: { opacity: 1 },
+})`
+ color: ${props => props.theme.textColor};
+ opacity: 0.5;
+ transition: opacity 0.35s;
+ padding: 15px 0;
+ margin: 0 30px;
+
+ &:hover {
+ opacity: 1;
+ }
+`;
+
+const HeaderWrap = styled(FlexWrap)`
+ justify-content: space-between;
+ align-items: center;
+
+ @media (max-width: 800px) {
+ padding-top: 0;
+ display: flex;
+ padding-bottom: 0;
+ }
+`;
+
+const NavLinks = styled.ul`
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ @media (max-width: 800px) {
+ display: none;
+ }
+`;
+
+const DropdownWrap = styled.div<DropdownWrapInterface>`
+ width: ${props => props.width || 280}px;
+ padding: 15px 0;
+ border: 1px solid transparent;
+ border-color: ${props => props.theme.dropdownBorderColor};
+ background-color: ${props => props.theme.dropdownBg};
+ color: ${props => props.theme.dropdownColor};
+ position: absolute;
+ top: 100%;
+ left: calc(50% - ${props => (props.width || 280) / 2}px);
+ visibility: hidden;
+ opacity: 0;
+ transform: translate3d(0, -10px, 0);
+ transition: opacity 0.35s, transform 0.35s, visibility 0s 0.35s;
+ z-index: 20;
+
+ &:after, &:before {
+ bottom: 100%;
+ left: 50%;
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+ }
+ &:after {
+ border-color: rgba(255, 255, 255, 0);
+ border-bottom-color: ${props => props.theme.dropdownBg};
+ border-width: 10px;
+ margin-left: -10px;
+ }
+ &:before {
+ border-color: rgba(255, 0, 0, 0);
+ border-bottom-color: ${props => props.theme.dropdownBorderColor};
+ border-width: 11px;
+ margin-left: -11px;
+ }
+
+ @media (max-width: 768px) {
+ display: none;
+ }
+`;
+
+const TradeButton = styled(Button)`
+ padding: 14px 22px !important;
+`;
diff --git a/packages/website/ts/@next/components/hero.tsx b/packages/website/ts/@next/components/hero.tsx
new file mode 100644
index 000000000..46e2ca6d9
--- /dev/null
+++ b/packages/website/ts/@next/components/hero.tsx
@@ -0,0 +1,120 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+import {addFadeInAnimation} from 'ts/@next/constants/animations';
+
+interface Props {
+ title: string;
+ isLargeTitle?: boolean;
+ isFullWidth?: boolean;
+ description: string;
+ figure?: React.ReactNode;
+ actions?: React.ReactNode;
+}
+
+export const Hero = (props: Props) => (
+ <Section>
+ <Wrap isCentered={!props.figure} isFullWidth={props.isFullWidth}>
+ {props.figure &&
+ <Content width="400px">
+ {props.figure}
+ </Content>
+ }
+
+ <Content width={props.figure ? '546px' : '678px'}>
+ <Title isLarge={props.isLargeTitle}>
+ {props.title}
+ </Title>
+
+ <Description>
+ {props.description}
+ </Description>
+
+ {props.actions &&
+ <ButtonWrap>
+ {props.actions}
+ </ButtonWrap>
+ }
+ </Content>
+ </Wrap>
+ </Section>
+);
+
+const Section = styled.section`
+ padding: 120px 0;
+
+ @media (max-width: 768px) {
+ padding: 60px 0;
+ }
+`;
+
+const Wrap = styled.div<{ isCentered?: boolean; isFullWidth?: boolean }>`
+ width: calc(100% - 60px);
+ margin: 0 auto;
+
+ @media (min-width: 768px) {
+ max-width: ${props => !props.isFullWidth ? '895px' : '1136px'};
+ flex-direction: row-reverse;
+ display: flex;
+ align-items: center;
+ text-align: ${props => props.isCentered && 'center'};
+ justify-content: ${props => props.isCentered ? 'center' : 'space-between'};
+ }
+
+ @media (max-width: 768px) {
+ text-align: center;
+ }
+`;
+
+const Title = styled.h1<{ isLarge?: any }>`
+ font-size: ${props => props.isLarge ? '80px' : '50px'};
+ font-weight: 300;
+ line-height: 1.1;
+ margin-bottom: 30px;
+ ${addFadeInAnimation('0.5s')}
+
+ @media (max-width: 1024px) {
+ font-size: 60px;
+ }
+
+ @media (max-width: 768px) {
+ font-size: 46px;
+ }
+`;
+
+const Description = styled.p`
+ font-size: 22px;
+ line-height: 31px;
+ padding: 0;
+ margin-bottom: 50px;
+ color: rgba(255, 255, 255, 0.75);
+ ${addFadeInAnimation('0.5s', '0.15s')}
+
+ @media (max-width: 1024px) {
+ margin-bottom: 30px;
+ }
+`;
+
+const Content = styled.div<{ width: string }>`
+ width: 100%;
+
+ @media (min-width: 768px) {
+ max-width: ${props => props.width};
+ }
+`;
+
+const ButtonWrap = styled.div`
+ display: inline-flex;
+ align-items: center;
+
+ * + * {
+ margin-left: 12px;
+ }
+
+ > *:nth-child(1) {
+ ${addFadeInAnimation('0.6s', '0.3s')}
+ }
+ > *:nth-child(2) {
+ ${addFadeInAnimation('0.6s', '0.4s')}
+ }
+`;
diff --git a/packages/website/ts/@next/components/heroAnimation.tsx b/packages/website/ts/@next/components/heroAnimation.tsx
new file mode 100644
index 000000000..32117c1f8
--- /dev/null
+++ b/packages/website/ts/@next/components/heroAnimation.tsx
@@ -0,0 +1,90 @@
+import * as React from 'react';
+import styled, { keyframes } from 'styled-components';
+
+export const HeroAnimation = () => (
+ <Image width="404" height="404" viewBox="0 0 404 404" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="404" height="404">
+ <circle cx="202" cy="202" r="200" fill="#00AE99" stroke="#00AE99" stroke-width="3"/>
+ </mask>
+ <g mask="url(#mask0)">
+ <circle cx="202" cy="202" r="200" stroke="#00AE99" strokeWidth="3" />
+ <TopCircle vector-effect="non-scaling-stroke" cx="201.667" cy="68.6667" r="66.6667" stroke="#00AE99" strokeWidth="3"/>
+ <LeftCircle vector-effect="non-scaling-stroke" cx="68.6667" cy="202.667" r="66.6667" stroke="#00AE99" strokeWidth="3"/>
+ <Logo vector-effect="non-scaling-stroke" d="M168.17 260.29L167.271 259.089L165.46 260.444L167.413 261.585L168.17 260.29ZM197.32 269.2L197.219 270.696L197.226 270.697L197.32 269.2ZM237.414 258.856L238.22 260.12L238.225 260.117L237.414 258.856ZM252.653 245.439L253.801 246.405L254.55 245.515L253.874 244.568L252.653 245.439ZM241.096 229.872L242.285 228.958L242.281 228.952L242.276 228.946L241.096 229.872ZM237.72 225.571L238.901 224.645L237.582 222.965L236.449 224.775L237.72 225.571ZM219.719 241.445L218.672 242.519L219.418 243.246L220.36 242.801L219.719 241.445ZM208.264 230.282L209.311 229.207L208.392 228.312L207.365 229.081L208.264 230.282ZM143.827 169.549L145.02 168.64L143.647 166.838L142.524 168.806L143.827 169.549ZM135.133 198.43L133.637 198.329L133.636 198.337L135.133 198.43ZM145.464 238.577L144.201 239.388L145.464 238.577ZM158.862 253.837L157.895 254.984L158.786 255.736L159.735 255.057L158.862 253.837ZM174.409 242.264L175.324 243.453L175.33 243.448L175.336 243.443L174.409 242.264ZM178.705 238.885L179.632 240.064L181.287 238.761L179.516 237.623L178.705 238.885ZM162.851 220.757L161.78 219.707L161.049 220.452L161.495 221.397L162.851 220.757ZM174.102 209.286L175.173 210.337L176.082 209.41L175.295 208.377L174.102 209.286ZM235.163 145.072L236.036 146.292L237.92 144.945L235.92 143.777L235.163 145.072ZM206.014 136.162L205.91 137.658L205.913 137.658L206.014 136.162ZM165.817 146.506L166.629 147.767L166.632 147.765L165.817 146.506ZM150.578 159.922L149.43 158.956L148.681 159.846L149.357 160.793L150.578 159.922ZM162.135 175.489L160.946 176.403L160.951 176.409L160.955 176.415L162.135 175.489ZM165.511 179.791L164.331 180.717L165.634 182.378L166.773 180.6L165.511 179.791ZM183.614 163.916L184.655 162.836L183.913 162.122L182.98 162.557L183.614 163.916ZM194.354 174.26L193.313 175.341L194.212 176.206L195.226 175.48L194.354 174.26ZM259.608 235.505L258.411 236.409L259.789 238.233L260.914 236.243L259.608 235.505ZM268.2 206.931L269.696 207.033L269.697 207.024L268.2 206.931ZM257.87 166.784L259.135 165.979L259.132 165.974L257.87 166.784ZM244.471 151.524L245.439 150.378L244.547 149.625L243.598 150.304L244.471 151.524ZM228.924 163.097L228.009 161.909L228.003 161.913L227.997 161.918L228.924 163.097ZM224.629 166.477L223.701 165.298L222.034 166.609L223.826 167.744L224.629 166.477ZM240.584 184.604L239.228 185.244L239.235 185.259L239.242 185.274L240.584 184.604ZM240.687 184.809L241.767 185.849L242.502 185.086L242.029 184.139L240.687 184.809ZM229.845 196.075L228.764 195.035L227.877 195.957L228.648 196.979L229.845 196.075ZM167.413 261.585C176.201 266.718 186.346 269.964 197.219 270.696L197.421 267.703C187.019 267.002 177.321 263.898 168.926 258.994L167.413 261.585ZM197.226 270.697C212.283 271.639 226.405 267.659 238.22 260.12L236.607 257.591C225.307 264.8 211.813 268.604 197.413 267.703L197.226 270.697ZM238.225 260.117C244.08 256.348 249.307 251.742 253.801 246.405L251.506 244.473C247.204 249.583 242.203 253.989 236.602 257.594L238.225 260.117ZM253.874 244.568C250.283 239.533 246.385 234.295 242.285 228.958L239.906 230.786C243.989 236.1 247.864 241.309 251.432 246.31L253.874 244.568ZM242.276 228.946C241.713 228.229 241.151 227.512 240.588 226.795C240.026 226.078 239.463 225.362 238.901 224.645L236.54 226.497C237.103 227.213 237.665 227.93 238.228 228.647C238.791 229.364 239.353 230.081 239.916 230.798L242.276 228.946ZM236.449 224.775C232.311 231.384 226.193 236.725 219.078 240.089L220.36 242.801C227.974 239.201 234.538 233.481 238.992 226.367L236.449 224.775ZM220.766 240.371L209.311 229.207L207.217 231.356L218.672 242.519L220.766 240.371ZM207.365 229.081L167.271 259.089L169.069 261.49L209.163 231.483L207.365 229.081ZM142.524 168.806C137.505 177.601 134.368 187.549 133.637 198.329L136.63 198.532C137.33 188.214 140.33 178.703 145.13 170.293L142.524 168.806ZM133.636 198.337C132.696 213.409 136.668 227.654 144.201 239.388L146.726 237.767C139.531 226.56 135.73 212.947 136.63 198.524L133.636 198.337ZM144.201 239.388C147.965 245.25 152.565 250.484 157.895 254.984L159.83 252.691C154.727 248.383 150.327 243.376 146.726 237.767L144.201 239.388ZM159.735 255.057C164.764 251.461 169.994 247.558 175.324 243.453L173.494 241.076C168.187 245.164 162.985 249.045 157.99 252.617L159.735 255.057ZM175.336 243.443C176.768 242.317 178.2 241.19 179.632 240.064L177.777 237.706C176.345 238.832 174.913 239.959 173.481 241.086L175.336 243.443ZM179.516 237.623C172.904 233.374 167.568 227.241 164.208 220.117L161.495 221.397C165.09 229.021 170.8 235.588 177.894 240.147L179.516 237.623ZM163.922 221.807L175.173 210.337L173.031 208.236L161.78 219.707L163.922 221.807ZM175.295 208.377L145.02 168.64L142.634 170.458L172.909 210.196L175.295 208.377ZM235.92 143.777C227.132 138.643 216.987 135.398 206.114 134.665L205.913 137.658C216.315 138.359 226.012 141.463 234.407 146.367L235.92 143.777ZM206.118 134.665C191.055 133.618 176.824 137.599 165.003 145.246L166.632 147.765C177.926 140.459 191.515 136.657 205.91 137.658L206.118 134.665ZM165.006 145.244C159.151 149.013 153.924 153.619 149.43 158.956L151.725 160.888C156.027 155.779 161.028 151.372 166.629 147.767L165.006 145.244ZM149.357 160.793C152.948 165.828 156.846 171.066 160.946 176.403L163.325 174.575C159.242 169.261 155.367 164.052 151.799 159.051L149.357 160.793ZM160.955 176.415C161.518 177.132 162.08 177.849 162.643 178.566C163.205 179.283 163.768 180 164.331 180.717L166.691 178.865C166.128 178.148 165.566 177.431 165.003 176.714C164.441 175.997 163.878 175.28 163.315 174.563L160.955 176.415ZM166.773 180.6C171.021 173.973 177.044 168.635 184.248 165.276L182.98 162.557C175.251 166.161 168.796 171.885 164.248 178.981L166.773 180.6ZM182.574 164.997L193.313 175.341L195.394 173.18L184.655 162.836L182.574 164.997ZM195.226 175.48L236.036 146.292L234.291 143.852L193.481 173.04L195.226 175.48ZM260.914 236.243C265.827 227.556 268.964 217.713 269.696 207.033L266.703 206.828C266.003 217.042 263.004 226.453 258.303 234.767L260.914 236.243ZM269.697 207.024C270.638 191.949 266.663 177.81 259.135 165.979L256.604 167.589C263.804 178.904 267.603 192.417 266.703 206.837L269.697 207.024ZM259.132 165.974C255.368 160.111 250.769 154.878 245.439 150.378L243.503 152.67C248.606 156.978 253.007 161.986 256.607 167.594L259.132 165.974ZM243.598 150.304C238.57 153.901 233.339 157.803 228.009 161.909L229.84 164.285C235.147 160.197 240.349 156.316 245.344 152.744L243.598 150.304ZM227.997 161.918C227.281 162.481 226.565 163.045 225.849 163.608C225.133 164.171 224.417 164.734 223.701 165.298L225.556 167.656C226.272 167.092 226.988 166.529 227.704 165.966C228.42 165.402 229.136 164.839 229.852 164.276L227.997 161.918ZM223.826 167.744C230.535 171.992 235.869 178.121 239.228 185.244L241.941 183.964C238.345 176.339 232.632 169.769 225.431 165.209L223.826 167.744ZM239.242 185.274L239.345 185.479L242.029 184.139L241.926 183.934L239.242 185.274ZM239.606 183.769L228.764 195.035L230.926 197.115L241.767 185.849L239.606 183.769ZM228.648 196.979L258.411 236.409L260.806 234.601L231.042 195.171L228.648 196.979Z" fill="#00AE99"/>
+ <Rectangle vector-effect="non-scaling-stroke" d="M269 135V268.333H442V135H269Z" stroke="#00AE99" strokeWidth="3"/>
+ <Square vector-effect="non-scaling-stroke" d="M339.64 269.64L270 339.281L343.913 413.194L413.554 343.554L339.64 269.64Z" stroke="#00AE99" strokeWidth="3"/>
+ <Oblong vector-effect="non-scaling-stroke" d="M202.5 269C202.5 269 269 269 269 335.5C269 402 202.5 402 202.5 402H-6.5C-6.5 402 -77 402 -77 335.5C-77 269 -6.5 269 -6.5 269H202.5Z" stroke="#00AE99" strokeWidth="3"/>
+ </g>
+ </Image>
+);
+
+const moveUp = keyframes`
+ 0% { transform: translate3d(0, 0, 0) }
+ 45% { transform: translate3d(0, 0, 0) }
+ 55% { transform: translate3d(0, -7%, 0) }
+ 85% { transform: translate3d(0, -7%, 0) }
+ 100% { transform: translate3d(0, 0, 0) }
+`;
+
+const moveLeft = keyframes`
+ 0% { transform: translate3d(0, 0, 0) }
+ 45% { transform: translate3d(0, 0, 0) }
+ 55% { transform: translate3d(-7%, 0, 0) }
+ 85% { transform: translate3d(-7%, 0, 0) }
+ 100% { transform: translate3d(0, 0, 0) }
+`;
+
+const moveDiag = keyframes`
+ 0% { transform: translate3d(0, 0, 0) }
+ 45% { transform: translate3d(0, 0, 0) }
+ 55% { transform: translate3d(5%, 5%, 0) }
+ 85% { transform: translate3d(5%, 5%, 0) }
+ 100% { transform: translate3d(0, 0, 0) }
+`;
+
+const moveRight = keyframes`
+ 0% { transform: translate3d(0, 0, 0) }
+ 45% { transform: translate3d(0, 0, 0) }
+ 55% { transform: translate3d(7%, 0, 0) }
+ 85% { transform: translate3d(7%, 0, 0) }
+ 100% { transform: translate3d(0, 0, 0) }
+`;
+
+const spin = keyframes`
+ 0% { transform: rotate(0deg) }
+ 65% { transform: rotate(0deg) }
+ 85% { transform: rotate(90deg) }
+ 100% { transform: rotate(90deg) }
+`;
+
+const moveIn = keyframes`
+ 0% { opacity: 0; transform: scale(1.7) rotate(-30deg) }
+ 100% { opacity: 1; transform: scale(1) rotate(0deg) }
+`;
+
+const Image = styled.svg`
+ opacity: 0;
+ transform: scale(1.5) rotate(-30deg);
+ animation: ${moveIn} 2s forwards;
+`;
+
+const TopCircle = styled.circle`
+ animation: ${moveUp} 4s -2.85s infinite;
+`;
+const LeftCircle = styled.circle`
+ animation: ${moveLeft} 4s -2.85s infinite;
+`;
+const Oblong = styled.path`
+ animation: ${moveLeft} 4s -2.85s infinite;
+`;
+const Square = styled.path`
+ animation: ${moveDiag} 4s -2.85s infinite;
+`;
+const Rectangle = styled.path`
+ animation: ${moveRight} 4s -2.85s infinite;
+`;
+
+const Logo = styled.path`
+ animation: ${spin} 4s -2.8s infinite;
+ transform-origin: 202px 202.7px;
+`;
diff --git a/packages/website/ts/@next/components/heroImage.tsx b/packages/website/ts/@next/components/heroImage.tsx
new file mode 100644
index 000000000..956218083
--- /dev/null
+++ b/packages/website/ts/@next/components/heroImage.tsx
@@ -0,0 +1,31 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+interface Props {
+ image: React.ReactNode;
+}
+
+export const LandingAnimation = (props: Props) => (
+ <Wrap>
+ {props.image}
+ </Wrap>
+);
+
+const Wrap = styled.figure`
+ display: inline-block;
+
+ svg {
+ width: 100%;
+ height: auto;
+ }
+
+ @media (min-width: 768px) {
+ width: 100%;
+ max-width: 400px;
+ }
+
+ @media (max-width: 768px) {
+ width: 180px;
+ margin-bottom: 40px;
+ }
+`;
diff --git a/packages/website/ts/@next/components/icon.tsx b/packages/website/ts/@next/components/icon.tsx
new file mode 100644
index 000000000..d9632a3c7
--- /dev/null
+++ b/packages/website/ts/@next/components/icon.tsx
@@ -0,0 +1,70 @@
+import * as React from 'react';
+import Loadable from 'react-loadable';
+import styled from 'styled-components';
+
+import {Paragraph} from 'ts/@next/components/text';
+import {getCSSPadding, PaddingInterface} from 'ts/@next/constants/utilities';
+
+interface IconProps extends PaddingInterface {
+ name?: string;
+ component?: React.ReactNode;
+ size?: 'small' | 'medium' | 'large' | 'hero' | number;
+}
+
+export const Icon: React.FunctionComponent<IconProps> = (props: IconProps) => {
+ if (props.name && !props.component) {
+ const IconSVG = Loadable({
+ loader: async () => import(/* webpackChunkName: "icon" */`ts/@next/icons/illustrations/${props.name}.svg`),
+ loading: () => <Paragraph>Loading</Paragraph>,
+ });
+
+ return (
+ <StyledIcon {...props}>
+ <IconSVG />
+ </StyledIcon>
+ );
+ }
+
+ if (props.component) {
+ return (
+ <StyledIcon {...props}>
+ {props.component}
+ </StyledIcon>
+ );
+ }
+
+ return null;
+};
+
+export const InlineIconWrap = styled.div<PaddingInterface>`
+ margin: ${props => getCSSPadding(props.margin)};
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ > figure {
+ margin: 0 5px;
+ }
+`;
+
+const _getSize = (size: string | number = 'small'): string => {
+ if (typeof size === 'string') {
+ return `var(--${size}Icon)`;
+ }
+
+ return `${size}px`;
+};
+
+const StyledIcon = styled.figure<IconProps>`
+ width: ${props => _getSize(props.size)};
+ height: ${props => _getSize(props.size)};
+ margin: ${props => getCSSPadding(props.margin)};
+ display: inline-block;
+ flex-shrink: 0;
+
+ svg {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ }
+`;
diff --git a/packages/website/ts/@next/components/image.tsx b/packages/website/ts/@next/components/image.tsx
new file mode 100644
index 000000000..34520b619
--- /dev/null
+++ b/packages/website/ts/@next/components/image.tsx
@@ -0,0 +1,19 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+interface Props {
+ alt?: string;
+ src?: any;
+ srcset?: any;
+ isCentered?: boolean;
+}
+
+const ImageClass: React.FunctionComponent<Props> = (props: Props) => {
+ return (
+ <img {...props} />
+ );
+};
+
+export const Image = styled(ImageClass)<Props>`
+ margin: ${props => props.isCentered && `0 auto`};
+`;
diff --git a/packages/website/ts/@next/components/layout.tsx b/packages/website/ts/@next/components/layout.tsx
new file mode 100644
index 000000000..358120adc
--- /dev/null
+++ b/packages/website/ts/@next/components/layout.tsx
@@ -0,0 +1,162 @@
+import styled from 'styled-components';
+import {getCSSPadding, PADDING_SIZES, PaddingInterface} from 'ts/@next/constants/utilities';
+
+interface WrapWidths {
+ default: string;
+ full: string;
+ medium: string;
+ narrow: string;
+ [key: string]: string;
+}
+
+interface ColumnWidths {
+ [key: string]: string;
+}
+
+interface SectionProps {
+ isNoPadding?: boolean;
+ isPadLarge?: boolean;
+ isNoMargin?: boolean;
+ bgColor?: string;
+ isFullWidth?: boolean;
+ isRelative?: boolean;
+}
+
+interface WrapProps extends PaddingInterface {
+ width?: 'default' | 'full' | 'medium' | 'narrow';
+ bgColor?: string;
+ isWrapped?: boolean;
+ isCentered?: boolean;
+ isReversed?: boolean;
+}
+
+interface ColumnProps {
+ colWidth?: '1/4' | '1/3' | '1/2' | '2/3';
+ isNoPadding?: boolean;
+ isNoMargin?: boolean;
+ isPadLarge?: boolean;
+ isFlexGrow?: boolean;
+ isMobileCentered?: boolean;
+ bgColor?: string;
+}
+
+interface GetColWidthArgs {
+ span?: number;
+ columns: number;
+}
+
+export interface WrapStickyInterface {
+ offsetTop?: string;
+}
+
+const _getColumnWidth = (args: GetColWidthArgs): string => {
+ const { span = 1, columns } = args;
+ const percentWidth = (span / columns) * 100;
+ const gutterDiff = (GUTTER * (columns - 1)) / columns;
+ return `calc(${percentWidth}% - ${gutterDiff}px)`;
+};
+
+const GUTTER = 30 as number;
+const MAX_WIDTH = 1500;
+export const BREAKPOINTS = {
+ mobile: '768px',
+};
+const WRAPPER_WIDTHS: WrapWidths = {
+ default: `${MAX_WIDTH}px`, // tbd
+ full: '100%',
+ medium: '1136px',
+ narrow: '930px',
+};
+const COLUMN_WIDTHS: ColumnWidths = {
+ '1/4': _getColumnWidth({ columns: 4 }),
+ '1/3': _getColumnWidth({ columns: 3 }),
+ '1/2': _getColumnWidth({ columns: 2 }),
+ '2/3': _getColumnWidth({ span: 2, columns: 3 }),
+};
+
+export const Main = styled.main`
+ max-width: ${MAX_WIDTH}px;
+ margin: 0 auto;
+
+ @media (min-width: ${BREAKPOINTS.mobile}) {
+ width: calc(100% - 60px);
+ }
+`;
+
+// We can also turn Section into a stateless comp,
+// passing a asElement (same patter nas Heading) so we dont have to
+// make a const on every route to withComponent-size it.
+// just <Section asElement?="div/section/footer/header/whatever" /> ?
+export const Section = styled.section<SectionProps>`
+ width: ${props => props.isFullWidth ? `calc(100% + ${GUTTER * 2}px)` : '100%'};
+ padding: ${props => !props.isNoPadding && (props.isPadLarge ? `${PADDING_SIZES.large}` : PADDING_SIZES.default)};
+ background-color: ${props => props.bgColor};
+ position: ${props => props.isRelative && 'relative'};
+ overflow: ${props => props.isRelative && 'hidden'};
+ margin-bottom: ${props => !props.isNoMargin && `${GUTTER}px`};
+
+ @media (min-width: 1560px) {
+ width: ${props => props.isFullWidth && '100vw'};
+ margin-left: ${props => props.isFullWidth && `calc(750px - 50vw)`};
+ }
+
+ @media (max-width: ${BREAKPOINTS.mobile}) {
+ margin-bottom: ${props => !props.isNoMargin && `${GUTTER / 2}px`};
+ padding: ${props => props.isPadLarge ? `${PADDING_SIZES.large} ${PADDING_SIZES.default}` : PADDING_SIZES.default};
+ }
+`;
+
+const WrapBase = styled.div<WrapProps>`
+ max-width: ${props => WRAPPER_WIDTHS[props.width || 'default']};
+ padding: ${props => props.padding && getCSSPadding(props.padding)};
+ background-color: ${props => props.bgColor};
+ margin: 0 auto;
+`;
+
+export const Wrap = styled(WrapBase)`
+ @media (min-width: ${BREAKPOINTS.mobile}) {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ flex-direction: ${props => props.isReversed && 'row-reverse'};
+ }
+`;
+
+export const WrapCentered = styled(WrapBase)`
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
+`;
+
+export const WrapSticky = styled.div<WrapStickyInterface>`
+ position: sticky;
+ top: ${props => props.offsetTop || '60px'};
+`;
+
+export const WrapGrid = styled(WrapBase)`
+ display: flex;
+ flex-wrap: ${props => props.isWrapped && `wrap`};
+ justify-content: ${props => props.isCentered ? `center` : 'space-between'};
+`;
+
+export const Column = styled.div<ColumnProps>`
+ background-color: ${props => props.bgColor};
+ flex-grow: ${props => props.isFlexGrow && 1};
+
+ @media (min-width: ${BREAKPOINTS.mobile}) {
+ padding: ${props => !props.isNoPadding && (props.isPadLarge ? `${PADDING_SIZES.large} ${PADDING_SIZES.default}` : PADDING_SIZES.default)};
+ width: ${props => props.colWidth ? COLUMN_WIDTHS[props.colWidth] : '100%'};
+ }
+
+ @media (max-width: ${BREAKPOINTS.mobile}) {
+ padding: ${props => !props.isNoPadding && (props.isPadLarge ? '40px 30px' : 0)};
+ margin-bottom: 20px;
+ text-align: ${props => props.isMobileCentered && 'center'};
+ }
+`;
+
+WrapGrid.defaultProps = {
+ isCentered: true,
+};
diff --git a/packages/website/ts/@next/components/link.tsx b/packages/website/ts/@next/components/link.tsx
new file mode 100644
index 000000000..c3633987a
--- /dev/null
+++ b/packages/website/ts/@next/components/link.tsx
@@ -0,0 +1,56 @@
+import * as React from 'react';
+import { Link as ReactRouterLink } from 'react-router-dom';
+import styled from 'styled-components';
+
+interface LinkInterface {
+ color?: string;
+ children?: React.ReactNode | string;
+ isNoArrow?: boolean;
+ hasIcon?: boolean | string;
+ isBlock?: boolean;
+ isCentered?: boolean;
+ href?: string;
+ theme?: {
+ textColor: string;
+ };
+}
+
+export const Link = (props: LinkInterface) => {
+ const {
+ children,
+ isNoArrow,
+ href,
+ } = props;
+
+ return (
+ <StyledLink to={href} {...props}>
+ {children}
+ {!isNoArrow && <svg width="25" height="25" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.484 5.246l.023 1.411 8.147.053L4.817 18.547l.996.996L17.65 7.706l.052 8.146 1.411.024-.068-10.561-10.561-.069z" fill="currentColor"/></svg>}
+ </StyledLink>
+ );
+};
+
+// Added this, & + & doesnt really work since we switch with element types...
+export const LinkWrap = styled.div`
+ a + a,
+ a + button,
+ button + a {
+ margin-left: 20px;
+ }
+`;
+
+const StyledLink = styled(ReactRouterLink)<LinkInterface>`
+ display: ${props => !props.isBlock && 'inline-flex'};
+ color: ${props => props.color || props.theme.linkColor};
+ text-align: center;
+ font-size: 18px;
+ text-decoration: none;
+ align-items: center;
+
+ @media (max-width: 768px) {
+ }
+
+ svg {
+ margin-left: 3px;
+ }
+`;
diff --git a/packages/website/ts/@next/components/logo.tsx b/packages/website/ts/@next/components/logo.tsx
new file mode 100644
index 000000000..2423f07b5
--- /dev/null
+++ b/packages/website/ts/@next/components/logo.tsx
@@ -0,0 +1,38 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { ThemeInterface } from 'ts/@next/components/siteWrap';
+import LogoIcon from 'ts/@next/icons/logo-with-type.svg';
+
+interface LogoInterface {
+ theme?: ThemeInterface;
+}
+
+// Note let's refactor this
+// is it absolutely necessary to have a stateless component
+// to pass props down into the styled icon?
+const StyledLogo = styled.div`
+ text-align: left;
+ position: relative;
+ z-index: 25;
+
+ @media (max-width: 800px) {
+ svg {
+ width: 60px;
+ }
+ }
+`;
+
+const Icon = styled(LogoIcon)<LogoInterface>`
+ flex-shrink: 0;
+
+ path {
+ fill: ${props => props.theme.textColor};
+ }
+`;
+
+export const Logo: React.StatelessComponent<LogoInterface> = (props: LogoInterface) => (
+ <StyledLogo>
+ <Icon {...props} />
+ </StyledLogo>
+);
diff --git a/packages/website/ts/@next/components/mobileNav.tsx b/packages/website/ts/@next/components/mobileNav.tsx
new file mode 100644
index 000000000..35b4353e1
--- /dev/null
+++ b/packages/website/ts/@next/components/mobileNav.tsx
@@ -0,0 +1,116 @@
+import * as React from 'react';
+import MediaQuery from 'react-responsive';
+import styled from 'styled-components';
+
+import {Link} from 'react-router-dom';
+
+import {WrapGrid, WrapProps} from 'ts/@next/components/newLayout';
+import { WebsitePaths } from 'ts/types';
+
+interface Props {
+ isToggled: boolean;
+ toggleMobileNav: () => void;
+}
+
+export class MobileNav extends React.PureComponent<Props> {
+ public render(): React.ReactNode {
+ const { isToggled, toggleMobileNav } = this.props;
+
+ return (
+ <MediaQuery maxWidth={800}>
+ <Wrap isToggled={isToggled}>
+ <Section>
+ <h4>Products</h4>
+
+ <ul>
+ <li>
+ <Link to="#">
+ 0x instant
+ </Link>
+ </li>
+ <li>
+ <Link to="#">
+ 0x Launch Kit
+ </Link>
+ </li>
+ </ul>
+ </Section>
+
+ <Section isDark={true}>
+ <Grid as="ul" isFullWidth={true} isWrapped={true}>
+ <li>
+ <Link to={WebsitePaths.Why}>
+ Why 0x
+ </Link>
+ </li>
+ <li>
+ <Link to={WebsitePaths.AboutMission}>
+ About
+ </Link>
+ </li>
+ <li>
+ <Link to="https://blog.0xproject.com/latest">
+ Blog
+ </Link>
+ </li>
+ </Grid>
+ </Section>
+
+ {isToggled &&
+ <Overlay onClick={toggleMobileNav} />
+ }
+ </Wrap>
+ </MediaQuery>
+ );
+ }
+}
+
+const Wrap = styled.nav<{ isToggled: boolean }>`
+ width: 100%;
+ height: 357px;
+ background-color: ${props => props.theme.mobileNavBgUpper};
+ color: ${props => props.theme.mobileNavColor};
+ transition: transform 0.5s;
+ transform: translate3d(0, ${props => props.isToggled ? 0 : '-100%'}, 0);
+ position: fixed;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-end;
+ z-index: 20;
+ top: 0;
+ left: 0;
+ font-size: 20px;
+
+ a {
+ padding: 15px 0;
+ display: block;
+ color: inherit;
+ }
+
+ h4 {
+ font-size: 14px;
+ opacity: 0.5;
+ }
+`;
+
+const Overlay = styled.div`
+ position: absolute;
+ width: 100vw;
+ height: 100vh;
+ top: 100%;
+ background: transparent;
+ cursor: pointer;
+`;
+
+const Section = styled.div<{ isDark?: boolean }>`
+ width: 100%;
+ padding: 15px 30px;
+ background-color: ${props => props.isDark && props.theme.mobileNavBgLower};
+`;
+
+const Grid = styled(WrapGrid)<WrapProps>`
+ li {
+ width: 50%;
+ flex-shrink: 0;
+ }
+`;
diff --git a/packages/website/ts/@next/components/modals/input.tsx b/packages/website/ts/@next/components/modals/input.tsx
new file mode 100644
index 000000000..61663d906
--- /dev/null
+++ b/packages/website/ts/@next/components/modals/input.tsx
@@ -0,0 +1,70 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+export enum InputWidth {
+ Half,
+ Full,
+}
+
+interface InputProps {
+ name: string;
+ width?: InputWidth;
+ label: string;
+ type?: string;
+}
+
+interface LabelProps {
+ string: boolean;
+}
+
+export const Input = React.forwardRef((props: InputProps, ref?: React.Ref<HTMLInputElement>) => {
+ const { name, label, type } = props;
+ const id = `input-${name}`;
+ const componentType = type === 'textarea' ? 'textarea' : 'input';
+
+ return (
+ <InputWrapper {...props}>
+ <Label htmlFor={id}>{label}</Label>
+ <StyledInput as={componentType} ref={ref} id={id} placeholder={label} {...props} />
+ </InputWrapper>
+ );
+});
+
+Input.defaultProps = {
+ width: InputWidth.Full,
+};
+
+const StyledInput = styled.input`
+ appearance: none;
+ background-color: #fff;
+ border: 1px solid #D5D5D5;
+ color: #000;
+ font-size: 1.294117647rem;
+ padding: 16px 15px 14px;
+ outline: none;
+ width: 100%;
+ min-height: ${props => props.type === 'textarea' && `120px`};
+
+ &::placeholder {
+ color: #C3C3C3;
+ }
+`;
+
+const InputWrapper = styled.div<InputProps>`
+ position: relative;
+ flex-grow: ${props => props.width === InputWidth.Full && 1};
+ width: ${props => props.width === InputWidth.Half && `calc(50% - 15px)`};
+
+ @media (max-width: 768px) {
+ width: 100%;
+ margin-bottom: 30px;
+ }
+`;
+
+const Label = styled.label`
+ color: #000;
+ font-size: 1.111111111rem;
+ line-height: 1.4em;
+ margin-bottom: 10px;
+ display: inline-block;
+`;
diff --git a/packages/website/ts/@next/components/modals/modal_contact.tsx b/packages/website/ts/@next/components/modals/modal_contact.tsx
new file mode 100644
index 000000000..1a78cb7ce
--- /dev/null
+++ b/packages/website/ts/@next/components/modals/modal_contact.tsx
@@ -0,0 +1,219 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { colors } from 'ts/style/colors';
+
+import { DialogContent, DialogOverlay } from '@reach/dialog';
+import '@reach/dialog/styles.css';
+
+import {Button} from 'ts/@next/components/button';
+import { Icon } from 'ts/@next/components/icon';
+import {Input, InputWidth} from 'ts/@next/components/modals/input';
+import {Heading, Paragraph} from 'ts/@next/components/text';
+import {GlobalStyle} from 'ts/@next/constants/globalStyle';
+
+interface Props {
+ theme?: GlobalStyle;
+ isOpen?: boolean;
+ onDismiss?: () => void;
+}
+
+interface FormProps {
+ isSuccessful?: boolean;
+ isSubmitting?: boolean;
+}
+
+export class ModalContact extends React.Component<Props> {
+ public state = {
+ isSubmitting: false,
+ isSuccessful: false,
+ errors: {},
+ };
+ public nameRef: React.RefObject<HTMLInputElement> = React.createRef();
+ public emailRef: React.RefObject<HTMLInputElement> = React.createRef();
+ public companyProjectRef: React.RefObject<HTMLInputElement> = React.createRef();
+ public linkRef: React.RefObject<HTMLInputElement> = React.createRef();
+ public commentsRef: React.RefObject<HTMLInputElement> = React.createRef();
+ public constructor(props: Props) {
+ super(props);
+ }
+ public render(): React.ReactNode {
+ const {isOpen, onDismiss} = this.props;
+ const {isSuccessful} = this.state;
+
+ return (
+ <>
+ <DialogOverlay
+ style={{ background: 'rgba(0, 0, 0, 0.75)', zIndex: 30 }}
+ isOpen={isOpen}
+ onDismiss={onDismiss}
+ >
+ <StyledDialogContent>
+ <Form onSubmit={this._onSubmitAsync.bind(this)} isSuccessful={isSuccessful}>
+ <Heading color={colors.textDarkPrimary} size={34} asElement="h2">Contact the 0x Core Team</Heading>
+ <Paragraph isMuted={true} color={colors.textDarkPrimary}>If you're considering building on 0x, we're happy to answer your questions. Fill out the form so we can connect you with the right person to help you get started.</Paragraph>
+ <InputRow>
+ <Input
+ name="name"
+ label="Your name"
+ type="text"
+ width={InputWidth.Half}
+ ref={this.nameRef}
+ required={true}
+ />
+ <Input
+ name="email"
+ label="Your email"
+ type="email"
+ ref={this.emailRef}
+ required={true}
+ width={InputWidth.Half}
+ />
+ </InputRow>
+ <InputRow>
+ <Input
+ name="companyOrProject"
+ label="Name of your project / company"
+ type="text"
+ ref={this.companyProjectRef}
+ required={true}
+ />
+ </InputRow>
+ <InputRow>
+ <Input
+ name="link"
+ label="Do you have any documentation or a website?"
+ type="text"
+ ref={this.linkRef}
+ />
+ </InputRow>
+ <InputRow>
+ <Input
+ name="comments"
+ label="Anything else?"
+ type="textarea"
+ ref={this.commentsRef}
+ />
+ </InputRow>
+ <ButtonRow>
+ <Button
+ color="#5C5C5C"
+ isNoBorder={true}
+ isTransparent={true}
+ type="button"
+ onClick={this.props.onDismiss}
+ >
+ Back
+ </Button>
+ <Button>Submit</Button>
+ </ButtonRow>
+ </Form>
+ <Confirmation isSuccessful={isSuccessful}>
+ <Icon name="rocketship" size="large" margin={[0, 0, 'default', 0]} />
+ <Heading color={colors.textDarkPrimary} size={34} asElement="h2">Thanks for contacting us.</Heading>
+ <Paragraph isMuted={true} color={colors.textDarkPrimary}>We'll get back to you soon. If you need quick support in the meantime, reach out to the 0x team on Discord.</Paragraph>
+ <Button onClick={this.props.onDismiss}>Done</Button>
+ </Confirmation>
+ </StyledDialogContent>
+ </DialogOverlay>
+ </>
+ );
+ }
+ private async _onSubmitAsync(e: Event): Promise<void> {
+ e.preventDefault();
+
+ const name = this.nameRef.current.value;
+ const email = this.emailRef.current.value;
+ const projectOrCompany = this.companyProjectRef.current.value;
+ const link = this.linkRef.current.value;
+ const comments = this.commentsRef.current.value;
+
+ this.setState({ ...this.state, isSubmitting: true });
+
+ try {
+ await fetch('https://website-api.0xproject.com/leads', {
+ method: 'post',
+ mode: 'cors',
+ credentials: 'same-origin',
+ headers: {
+ 'content-type': 'application/json; charset=utf-8',
+ },
+ body: JSON.stringify({ name, email, projectOrCompany, link, comments }),
+ });
+
+ this.setState({ ...this.state, isSuccessful: true });
+ } catch (e) {
+ this.setState({ ...this.state, errors: [] });
+ }
+ }
+}
+// Handle errors: {"errors":[{"location":"body","param":"name","msg":"Invalid value"},{"location":"body","param":"email","msg":"Invalid value"}]}
+
+const InputRow = styled.div`
+ width: 100%;
+ flex: 0 0 auto;
+
+ @media (min-width: 768px) {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 30px;
+ }
+`;
+
+const ButtonRow = styled(InputRow)`
+ @media (max-width: 768px) {
+ display: flex;
+ flex-direction: column;
+
+ button:nth-child(1) {
+ order: 2;
+ }
+
+ button:nth-child(2) {
+ order: 1;
+ margin-bottom: 10px;
+ }
+ }
+`;
+
+const StyledDialogContent = styled(DialogContent)`
+ position: relative;
+ max-width: 800px;
+ background-color: #F6F6F6 !important;
+ padding: 60px 60px !important;
+
+ @media (max-width: 768px) {
+ width: calc(100vw - 40px) !important;
+ margin: 40px auto !important;
+ padding: 30px 30px !important;
+ }
+`;
+
+const Form = styled.form<FormProps>`
+ position: relative;
+ transition: opacity 0.30s ease-in-out, visibility 0.30s ease-in-out;
+
+ opacity: ${props => props.isSuccessful && `0`};
+ visibility: ${props => props.isSuccessful && `hidden`};
+`;
+
+const Confirmation = styled.div<FormProps>`
+ position: absolute;
+ top: 50%;
+ text-align: center;
+ width: 100%;
+ left: 0;
+ transition: opacity 0.30s ease-in-out, visibility 0.30s ease-in-out;
+ transition-delay: 0.40s;
+ padding: 60px 60px;
+ transform: translateY(-50%);
+ opacity: ${props => props.isSuccessful ? `1` : `0`};
+ visibility: ${props => props.isSuccessful ? 'visible' : `hidden`};
+
+ p {
+ max-width: 492px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+`;
diff --git a/packages/website/ts/@next/components/newLayout.tsx b/packages/website/ts/@next/components/newLayout.tsx
new file mode 100644
index 000000000..edb236576
--- /dev/null
+++ b/packages/website/ts/@next/components/newLayout.tsx
@@ -0,0 +1,136 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+export interface WrapProps {
+ bgColor?: string;
+ id?: string;
+ offsetTop?: string;
+ maxWidth?: string;
+ wrapWidth?: string;
+ isFullWidth?: boolean;
+ isTextCentered?: boolean;
+ isCentered?: boolean;
+ isWrapped?: boolean;
+}
+
+export interface WrapGridProps {
+ isWrapped?: boolean;
+ isCentered?: boolean;
+}
+
+export interface WrapStickyProps {
+ offsetTop?: string;
+}
+
+export interface SectionProps extends WrapProps {
+ isPadded?: boolean;
+ isFullWidth?: boolean;
+ isFlex?: boolean;
+ padding?: string;
+ paddingMobile?: string;
+ flexBreakpoint?: string;
+ maxWidth?: string;
+ bgColor?: 'dark' | 'light' | string;
+ children: any;
+}
+
+export interface FlexProps {
+ padding?: string;
+ isFlex?: boolean;
+ flexBreakpoint?: string;
+}
+
+export interface ColumnProps {
+ padding?: string;
+ width?: string;
+ maxWidth?: string;
+}
+
+export const Section: React.FunctionComponent<SectionProps> = (props: SectionProps) => {
+ return (
+ <SectionBase {...props}>
+ <Wrap {...props}>
+ {props.children}
+ </Wrap>
+ </SectionBase>
+ );
+};
+
+export const Column = styled.div<ColumnProps>`
+ width: ${props => props.width};
+ max-width: ${props => props.maxWidth};
+ padding: ${props => props.padding};
+
+ @media (max-width: 768px) {
+ width: 100%;
+
+ & + & {
+ margin-top: 60px;
+ }
+ }
+`;
+
+export const FlexWrap = styled.div<FlexProps>`
+ max-width: 1500px;
+ margin: 0 auto;
+ padding: ${props => props.padding};
+
+ @media (min-width: ${props => props.flexBreakpoint || '768px'}) {
+ display: ${props => props.isFlex && 'flex'};
+ justify-content: ${props => props.isFlex && 'space-between'};
+ }
+`;
+
+export const WrapSticky = styled.div<WrapProps>`
+ position: sticky;
+ top: ${props => props.offsetTop || '60px'};
+`;
+
+const SectionBase = styled.section<SectionProps>`
+ width: ${props => !props.isFullWidth && 'calc(100% - 60px)'};
+ max-width: 1500px;
+ margin: 0 auto;
+ padding: ${props => props.isPadded && '120px 0'};
+ background-color: ${props => props.theme[`${props.bgColor}BgColor`] || props.bgColor};
+ position: relative;
+ overflow: ${props => !props.isFullWidth && 'hidden'};
+
+ @media (max-width: 768px) {
+ padding: ${props => props.isPadded && (props.paddingMobile || '40px 0')};
+ }
+`;
+
+const Wrap = styled(FlexWrap)<WrapProps>`
+ width: ${props => props.wrapWidth || 'calc(100% - 60px)'};
+ width: ${props => props.bgColor && 'calc(100% - 60px)'};
+ max-width: ${props => !props.isFullWidth && (props.maxWidth || '895px')};
+ text-align: ${props => props.isTextCentered && 'center'};
+ margin: 0 auto;
+`;
+
+export const WrapGrid = styled(Wrap)<WrapProps>`
+ display: flex;
+ flex-wrap: ${props => props.isWrapped && `wrap`};
+ justify-content: ${props => props.isCentered ? `center` : 'space-between'};
+
+ @media (max-width: 768px) {
+ width: 100%;
+ }
+`;
+
+Section.defaultProps = {
+ isPadded: true,
+};
+
+FlexWrap.defaultProps = {
+ isFlex: true,
+};
+
+WrapGrid.defaultProps = {
+ isCentered: true,
+ isFullWidth: true,
+};
+
+Wrap.defaultProps = {
+ isFlex: false,
+};
diff --git a/packages/website/ts/@next/components/newsletter_form.tsx b/packages/website/ts/@next/components/newsletter_form.tsx
new file mode 100644
index 000000000..00770bb7d
--- /dev/null
+++ b/packages/website/ts/@next/components/newsletter_form.tsx
@@ -0,0 +1,156 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { colors } from 'ts/style/colors';
+
+interface InputProps {
+ isSubmitted: boolean;
+ name: string;
+ type: string;
+ label: string;
+}
+
+interface ArrowProps {
+ isSubmitted: boolean;
+}
+
+const Input = React.forwardRef((props: InputProps, ref: React.Ref<HTMLInputElement>) => {
+ const { name, label, type } = props;
+ const id = `input-${name}`;
+
+ return (
+ <InnerInputWrapper {...props}>
+ <label className="visuallyHidden" htmlFor={id}>{label}</label>
+ <StyledInput ref={ref} id={id} placeholder={label} type={type || 'text'} {...props} />
+ </InnerInputWrapper>
+ );
+});
+
+export class NewsletterForm extends React.Component {
+ public emailInput = React.createRef<HTMLInputElement>();
+ public state = {
+ isSubmitted: false,
+ };
+ public render(): React.ReactNode {
+ const {isSubmitted} = this.state;
+
+ return (
+ <StyledForm onSubmit={this._onSubmitAsync.bind(this)}>
+ <InputWrapper>
+ <Input isSubmitted={isSubmitted} name="email" type="email" label="Email Address" ref={this.emailInput} required={true} />
+
+ <SubmitButton>
+ <Arrow isSubmitted={isSubmitted} width="22" height="17" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M13.066 0l-1.068 1.147 6.232 6.557H0v1.592h18.23l-6.232 6.557L13.066 17l8.08-8.5-8.08-8.5z" fill="#CBCBCB"/>
+ </Arrow>
+ </SubmitButton>
+ <SuccessText isSubmitted={isSubmitted}>🎉 Thank you for signing up!</SuccessText>
+ </InputWrapper>
+ <Text>Subscribe to our newsletter for updates in the 0x ecosystem</Text>
+ </StyledForm>
+ );
+ }
+
+ private async _onSubmitAsync(e: Event): Promise<void> {
+ e.preventDefault();
+
+ const email = this.emailInput.current.value;
+ const referrer = 'https://0xproject.com/';
+
+ this.setState({ isSubmitted: true });
+
+ try {
+ const response = await fetch('https://website-api.0xproject.com/newsletter_subscriber/substack', {
+ method: 'post',
+ mode: 'cors',
+ headers: {
+ 'content-type': 'application/json; charset=utf-8',
+ },
+ body: JSON.stringify({ email, referrer }),
+ });
+ } catch (e) {
+ // dosomething
+ }
+ }
+}
+
+const StyledForm = styled.form`
+ appearance: none;
+ border: 0;
+ color: ${colors.white};
+ padding: 13px 0 14px;
+ margin-top: 27px;
+`;
+
+const StyledInput = styled.input`
+ appearance: none;
+ background-color: transparent;
+ border: 0;
+ border-bottom: 1px solid #393939;
+ color: #fff;
+ font-size: 1.294117647rem;
+ padding: 15px 0;
+ outline: none;
+ width: 100%;
+
+ &::placeholder {
+ color: #B1B1B1; // #9D9D9D on light theme
+ }
+`;
+
+const InputWrapper = styled.div`
+ position: relative;
+`;
+
+const InnerInputWrapper = styled.div<ArrowProps>`
+ opacity: ${props => props.isSubmitted && 0};
+ visibility: ${props => props.isSubmitted && 'hidden'};
+ transition: opacity 0.25s ease-in-out, visibility 0.25s ease-in-out;
+ transition-delay: 0.30s;
+`;
+
+const SubmitButton = styled.button`
+ width: 44px;
+ height: 44px;
+ background-color: transparent;
+ border: 0;
+ position: absolute;
+ right: 0;
+ top: calc(50% - 22px);
+ overflow: hidden;
+ outline: 0;
+
+ &:focus-within {
+ //background-color: #eee;
+ }
+`;
+
+const Text = styled.p`
+ color: #656565;
+ font-size: 0.833333333rem;
+ font-weight: 300;
+ line-height: 1.2em;
+ margin-top: 15px;
+`;
+
+const SuccessText = styled.p<ArrowProps>`
+ color: #B1B1B1;
+ font-size: 1rem;
+ font-weight: 300;
+ line-height: 1.2em;
+ padding-top: 25px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ text-align: left;
+ right: 50px;
+ opacity: ${props => props.isSubmitted ? 1 : 0};
+ visibility: ${props => props.isSubmitted ? 'visible' : 'hidden'};
+ transition: opacity 0.25s ease-in-out, visibility 0.25s ease-in-out;
+ transition-delay: 0.55s;
+`;
+
+const Arrow = styled.svg<ArrowProps>`
+ transform: ${props => props.isSubmitted && `translateX(44px)`};
+ transition: transform 0.25s ease-in-out;
+`;
diff --git a/packages/website/ts/@next/components/sections/landing/about.tsx b/packages/website/ts/@next/components/sections/landing/about.tsx
new file mode 100644
index 000000000..700d5e7d2
--- /dev/null
+++ b/packages/website/ts/@next/components/sections/landing/about.tsx
@@ -0,0 +1,91 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+import {Button} from 'ts/@next/components/button';
+import {Icon, InlineIconWrap} from 'ts/@next/components/icon';
+import {Column, FlexWrap, Section} from 'ts/@next/components/newLayout';
+import {Paragraph} from 'ts/@next/components/text';
+
+interface FigureProps {
+ value: string;
+ description: string;
+}
+
+export const SectionLandingAbout = () => (
+ <Section bgColor="dark" isTextCentered={true}>
+ <InlineIconWrap>
+ <Icon name="descriptionCoin" size="small" />
+ <Icon name="descriptionCopy" size="small" />
+ <Icon name="descriptionFlask" size="small" />
+ <Icon name="descriptionBolt" size="small" />
+ </InlineIconWrap>
+
+ <Paragraph
+ size="large"
+ isCentered={true}
+ isMuted={1}
+ padding={['large', 0, 'default', 0]}
+ >
+ Anyone in the world can use 0x to service a wide variety of markets ranging from gaming items to financial instruments to assets that could have near existed before.
+ </Paragraph>
+
+ <Button
+ href="#"
+ isWithArrow={true}
+ isAccentColor={true}
+ >
+ Discover how developers use 0x
+ </Button>
+
+ <hr
+ style={{
+ width: '340px',
+ borderColor: '#3C4746',
+ margin: '60px auto',
+ }}
+ />
+
+ <FlexWrap as="dl">
+ <Figure
+ value="873,435"
+ description="Number of Transactions"
+ />
+
+ <Figure
+ value="$203M"
+ description="Total Volume"
+ />
+
+ <Figure
+ value="227,372"
+ description="Number of Relayers"
+ />
+ </FlexWrap>
+ </Section>
+);
+
+const Figure = (props: FigureProps) => (
+ <Column padding="0 30px">
+ <FigureValue>
+ {props.value}
+ </FigureValue>
+ <FigureDescription>
+ {props.description}
+ </FigureDescription>
+ </Column>
+);
+
+const FigureValue = styled.dt`
+ font-size: 50px;
+ font-weight: 300;
+ margin-bottom: 15px;
+
+ @media (max-width: 768px) {
+ font-size: 40px;
+ }
+`;
+
+const FigureDescription = styled.dd`
+ font-size: 18px;
+ color: #999999;
+`;
diff --git a/packages/website/ts/@next/components/sections/landing/clients.tsx b/packages/website/ts/@next/components/sections/landing/clients.tsx
new file mode 100644
index 000000000..8e2347d02
--- /dev/null
+++ b/packages/website/ts/@next/components/sections/landing/clients.tsx
@@ -0,0 +1,98 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+import {Heading} from 'ts/@next/components/text';
+
+import {Section, WrapGrid} from 'ts/@next/components/newLayout';
+
+interface ProjectLogo {
+ name: string;
+ imageUrl?: string;
+ persistOnMobile?: boolean;
+}
+
+interface StyledProjectInterface {
+ isOnMobile?: boolean;
+}
+
+const projects: ProjectLogo[] = [
+ {
+ name: 'Radar Relay',
+ imageUrl: 'images/@next/clients/client-radar.png',
+ persistOnMobile: true,
+ },
+ {
+ name: 'Paradex',
+ imageUrl: 'images/@next/clients/client-paradex.png',
+ persistOnMobile: true,
+ },
+ {
+ name: 'The Ocean X',
+ imageUrl: 'images/@next/clients/client-oceanx.png',
+ },
+ {
+ name: 'Decent EX',
+ imageUrl: 'images/@next/clients/client-decent.png',
+ },
+ {
+ name: 'dEX',
+ imageUrl: 'images/@next/clients/client-dex.png',
+ },
+ {
+ name: 'OpenRelay',
+ imageUrl: 'images/@next/clients/client-openrelay.png',
+ persistOnMobile: true,
+ },
+ {
+ name: 'Amadeus',
+ imageUrl: 'images/@next/clients/client-amadeus.png',
+ persistOnMobile: true,
+ },
+ {
+ name: 'DDEX',
+ imageUrl: 'images/@next/clients/client-ddex.png',
+ persistOnMobile: true,
+ },
+];
+
+export const SectionLandingClients = () => (
+ <Section isTextCentered={true}>
+ <Heading size="small">
+ Join the growing number of projects developing on 0x
+ </Heading>
+
+ <WrapGrid isWrapped={true}>
+ {_.map(projects, (item: ProjectLogo, index) => (
+ <StyledProject
+ key={`client-${index}`}
+ isOnMobile={item.persistOnMobile}
+ >
+ <img src={item.imageUrl} alt={item.name} />
+ </StyledProject>
+ ))}
+ </WrapGrid>
+ </Section>
+);
+
+const StyledProject = styled.div<StyledProjectInterface>`
+ flex-shrink: 0;
+
+ img {
+ object-fit: contain;
+ width: 100%;
+ height: 100%;
+ }
+
+ @media (min-width: 768px) {
+ width: auto;
+ height: 50px;
+ margin: 30px;
+ }
+
+ @media (max-width: 768px) {
+ width: auto;
+ height: 42px;
+ margin: 15px;
+ display: ${props => !props.isOnMobile && 'none'};
+ }
+`;
diff --git a/packages/website/ts/@next/components/sections/landing/cta.tsx b/packages/website/ts/@next/components/sections/landing/cta.tsx
new file mode 100644
index 000000000..1a959a6e9
--- /dev/null
+++ b/packages/website/ts/@next/components/sections/landing/cta.tsx
@@ -0,0 +1,34 @@
+import * as React from 'react';
+
+import {BlockIconLink} from 'ts/@next/components/blockIconLink';
+import {Section} from 'ts/@next/components/newLayout';
+
+import {AnimatedChatIcon} from 'ts/@next/components/animatedChatIcon';
+import {AnimatedCompassIcon} from 'ts/@next/components/animatedCompassIcon';
+
+interface Props {
+ onContactClick?: () => void;
+}
+
+export const SectionLandingCta = (props: Props) => (
+ <Section
+ isPadded={false}
+ isFlex={true}
+ maxWidth="auto"
+ wrapWidth="100%"
+ flexBreakpoint="900px"
+ >
+ <BlockIconLink
+ iconComponent={<AnimatedCompassIcon />}
+ title="Ready to build on 0x?"
+ linkLabel="Get Started"
+ linkUrl="https://0xproject.com/docs"
+ />
+ <BlockIconLink
+ iconComponent={<AnimatedChatIcon />}
+ title="Want help from the 0x team?"
+ linkLabel="Get in Touch"
+ linkAction={props.onContactClick}
+ />
+ </Section>
+);
diff --git a/packages/website/ts/@next/components/sections/landing/hero.tsx b/packages/website/ts/@next/components/sections/landing/hero.tsx
new file mode 100644
index 000000000..6bd34c46d
--- /dev/null
+++ b/packages/website/ts/@next/components/sections/landing/hero.tsx
@@ -0,0 +1,31 @@
+import * as React from 'react';
+
+import {Button} from 'ts/@next/components/button';
+import {Hero} from 'ts/@next/components/hero';
+import {LandingAnimation} from 'ts/@next/components/heroImage';
+
+import {HeroAnimation} from 'ts/@next/components/heroAnimation';
+import { WebsitePaths } from 'ts/types';
+
+export const SectionLandingHero = () => (
+ <Hero
+ title="Powering Decentralized Exchange"
+ isLargeTitle={true}
+ isFullWidth={true}
+ description="0x is an open protocol that enables the peer-to-peer exchange of assets on the Ethereum blockchain."
+ figure={<LandingAnimation image={<HeroAnimation />} />}
+ actions={<HeroActions />}
+ />
+);
+
+const HeroActions = () => (
+ <>
+ <Button href="https://0xproject.com/docs" isInline={true}>
+ Get Started
+ </Button>
+
+ <Button to={WebsitePaths.Why} isTransparent={true} isInline={true}>
+ Learn More
+ </Button>
+ </>
+);
diff --git a/packages/website/ts/@next/components/separator.tsx b/packages/website/ts/@next/components/separator.tsx
new file mode 100644
index 000000000..ccc79aedf
--- /dev/null
+++ b/packages/website/ts/@next/components/separator.tsx
@@ -0,0 +1,7 @@
+import styled from 'styled-components';
+
+export const Separator = styled.hr`
+ background: #EAEAEA;
+ height: 1px;
+ border: 0;
+`;
diff --git a/packages/website/ts/@next/components/siteWrap.tsx b/packages/website/ts/@next/components/siteWrap.tsx
new file mode 100644
index 000000000..c1513c647
--- /dev/null
+++ b/packages/website/ts/@next/components/siteWrap.tsx
@@ -0,0 +1,153 @@
+import * as React from 'react';
+import styled, { ThemeProvider } from 'styled-components';
+
+import { colors } from 'ts/style/colors';
+
+import { Footer } from 'ts/@next/components/footer';
+import { Header } from 'ts/@next/components/header';
+import { GlobalStyles } from 'ts/@next/constants/globalStyle';
+
+interface Props {
+ theme?: 'dark' | 'light' | 'gray';
+ children: any;
+}
+
+interface State {
+ isMobileNavOpen: boolean;
+}
+
+interface MainProps {
+ isNavToggled: boolean;
+}
+
+export interface ThemeValuesInterface {
+ bgColor: string;
+ darkBgColor?: string;
+ lightBgColor: string;
+ textColor: string;
+ paragraphColor: string;
+ linkColor: string;
+ mobileNavBgUpper: string;
+ mobileNavBgLower: string;
+ mobileNavColor: string;
+ dropdownBg: string;
+ dropdownButtonBg: string;
+ dropdownBorderColor?: string;
+ dropdownColor: string;
+ headerButtonBg: string;
+ footerBg: string;
+ footerColor: string;
+}
+
+export interface ThemeInterface {
+ [key: string]: ThemeValuesInterface;
+}
+
+const GLOBAL_THEMES: ThemeInterface = {
+ dark: {
+ bgColor: '#000000',
+ darkBgColor: '#111A19',
+ lightBgColor: '#003831',
+ textColor: '#FFFFFF',
+ paragraphColor: '#FFFFFF',
+ linkColor: colors.brandLight,
+ mobileNavBgUpper: '#003831',
+ mobileNavBgLower: '#022924',
+ mobileNavColor: '#FFFFFF',
+ dropdownBg: '#111A19',
+ dropdownButtonBg: '#003831',
+ dropdownColor: '#FFFFFF',
+ headerButtonBg: '#00AE99',
+ footerBg: '#181818',
+ footerColor: '#FFFFFF',
+ },
+ light: {
+ bgColor: '#FFFFFF',
+ lightBgColor: '#003831',
+ textColor: '#000000',
+ paragraphColor: '#474747',
+ linkColor: colors.brandDark,
+ mobileNavBgUpper: '#FFFFFF',
+ mobileNavBgLower: '#F3F6F4',
+ mobileNavColor: '#000000',
+ dropdownBg: '#FBFBFB',
+ dropdownButtonBg: '#F3F6F4',
+ dropdownColor: '#003831',
+ dropdownBorderColor: '#E4E4E4',
+ headerButtonBg: '#003831',
+ footerBg: '#F2F2F2',
+ footerColor: '#000000',
+ },
+ gray: {
+ bgColor: '#e0e0e0',
+ lightBgColor: '#003831',
+ textColor: '#000000',
+ paragraphColor: '#777777',
+ linkColor: colors.brandDark,
+ mobileNavBgUpper: '#FFFFFF',
+ mobileNavBgLower: '#F3F6F4',
+ mobileNavColor: '#000000',
+ dropdownBg: '#FFFFFF',
+ dropdownButtonBg: '#F3F6F4',
+ dropdownColor: '#003831',
+ headerButtonBg: '#003831',
+ footerBg: '#181818',
+ footerColor: '#FFFFFF',
+ },
+};
+
+export class SiteWrap extends React.Component<Props, State> {
+ public state = {
+ isMobileNavOpen: false,
+ };
+
+ public componentDidMount(): void {
+ document.documentElement.style.overflowY = 'auto';
+ window.scrollTo(0, 0);
+ }
+
+ public toggleMobileNav = () => {
+ this.setState({
+ isMobileNavOpen: !this.state.isMobileNavOpen,
+ }, () => {
+ const overflow = this.state.isMobileNavOpen ? 'hidden' : 'auto';
+ document.documentElement.style.overflowY = overflow;
+ });
+ }
+
+ public render(): React.ReactNode {
+ const {
+ children,
+ theme = 'dark',
+ } = this.props;
+ const { isMobileNavOpen } = this.state;
+ const currentTheme = GLOBAL_THEMES[theme];
+
+ return (
+ <>
+ <ThemeProvider theme={currentTheme}>
+ <>
+ <GlobalStyles />
+
+ <Header
+ isNavToggled={isMobileNavOpen}
+ toggleMobileNav={this.toggleMobileNav}
+ />
+
+ <Main isNavToggled={isMobileNavOpen}>
+ {children}
+ </Main>
+
+ <Footer/>
+ </>
+ </ThemeProvider>
+ </>
+ );
+ }
+}
+
+const Main = styled.main<MainProps>`
+ transition: transform 0.5s, opacity 0.5s;
+ transform: translate3d(0, ${props => props.isNavToggled ? '357px' : 0}, 0);
+ opacity: ${props => props.isNavToggled && '0.5'};
+`;
diff --git a/packages/website/ts/@next/components/slider/slider.tsx b/packages/website/ts/@next/components/slider/slider.tsx
new file mode 100644
index 000000000..10bbbf609
--- /dev/null
+++ b/packages/website/ts/@next/components/slider/slider.tsx
@@ -0,0 +1,175 @@
+import * as React from 'react';
+import Flickity from 'react-flickity-component';
+import styled from 'styled-components';
+
+import { colors } from 'ts/style/colors';
+
+import { Icon } from 'ts/@next/components/icon';
+import { Heading, Paragraph } from 'ts/@next/components/text';
+
+interface SliderProps {
+}
+
+interface SlideProps {
+ icon: string;
+ heading: string;
+ text: string;
+ href?: string;
+}
+
+const flickityOptions = {
+ initialIndex: 0,
+ cellAlign: 'left',
+ arrowShape: 'M0 50.766L42.467 93.58l5.791-5.839-32.346-32.61H100V46.84H15.48L50.2 11.838 44.409 6 5.794 44.93l-.003-.003z',
+ prevNextButtons: true,
+};
+
+export const Slide: React.StatelessComponent<SlideProps> = (props: SlideProps) => {
+ const { heading, text, icon } = props;
+
+ return (
+ <StyledSlide>
+ <SlideHead>
+ <Icon name={icon} size="large" />
+ </SlideHead>
+ <SlideContent>
+ <Heading asElement="h4" size="small" marginBottom="15px">{heading}</Heading>
+ <Paragraph isMuted={true}>{text}</Paragraph>
+ </SlideContent>
+ </StyledSlide>
+ );
+};
+
+export const Slider: React.StatelessComponent<SliderProps> = props => {
+ return (
+ <StyledSlider>
+ <Flickity
+ className={'carousel'} // default ''
+ elementType={'div'} // default 'div'
+ options={flickityOptions} // takes flickity options {}
+ disableImagesLoaded={false} // default false
+ >
+ {props.children}
+ </Flickity>
+ </StyledSlider>
+ );
+};
+
+const StyledSlider = styled.div`
+ //overflow: hidden;
+ width: 100%;
+ height: 520px;
+
+ @media (max-width: 500px) {
+ height: 450px;
+ }
+
+ .carousel {
+ display: block;
+ user-select: none;
+ touch-action: pan-y;
+ -webkit-tap-highlight-color: transparent;
+ outline: none;
+
+ @media (max-width: 500px) {
+ overflow: hidden;
+ margin-left: -20px;
+ width: calc(100vw - 20px);
+ }
+ }
+
+ .flickity-viewport {
+ outline: none;
+ }
+
+ .flickity-button {
+ cursor: pointer;
+ position: absolute;
+ width: 74px;
+ height: 74px;
+ background-color: #000;
+ display: flex;
+ outline: 0;
+ top: calc(50% - 37px);
+ border: 0;
+ padding: 0;
+ transition: background-color .40s ease-in-out, visibility .40s ease-in-out, opacity .40s ease-in-out;
+
+ &:disabled {
+ opacity: 0;
+ visibility: hidden;
+ }
+
+ &:hover {
+ background-color: hsla(0, 0%, 10%, 1);
+ }
+
+ &.previous {
+ left: 0;
+ }
+
+ &.next {
+ right: 0;
+ }
+
+ svg {
+ margin: auto;
+ width: 28px;
+ height: auto;
+ }
+
+ path {
+ fill: #fff;
+ }
+ }
+`;
+
+const StyledSlide = styled.div`
+ background-color: ${colors.backgroundDark};
+ width: 560px;
+ height: 520px;
+ flex: 0 0 auto;
+ opacity: 0.3;
+ transition: opacity .40s ease-in-out;
+
+ & + & {
+ margin-left: 30px;
+ }
+
+ @media (max-width: 1200px) {
+ width: 100%;
+ }
+
+ @media (max-width: 500px) {
+ width: calc(100vw - 10px - 30px);
+ height: 450px;
+
+ & + & {
+ margin-left: 10px;
+ }
+ }
+
+ &.is-selected {
+ opacity: 1;
+ }
+`;
+
+const SlideHead = styled.div`
+ background-color: ${colors.brandDark};
+ height: 300px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ @media (max-width: 500px) {
+ height: 240px;
+ }
+`;
+
+const SlideContent = styled.div`
+ padding: 30px;
+
+ @media (max-width: 500px) {
+ padding: 20px;
+ }
+`;
diff --git a/packages/website/ts/@next/components/text.tsx b/packages/website/ts/@next/components/text.tsx
new file mode 100644
index 000000000..a687bca38
--- /dev/null
+++ b/packages/website/ts/@next/components/text.tsx
@@ -0,0 +1,85 @@
+import * as React from 'react';
+import styled from 'styled-components';
+import {getCSSPadding, PaddingInterface} from 'ts/@next/constants/utilities';
+
+interface BaseTextInterface extends PaddingInterface {
+ size?: 'default' | 'medium' | 'large' | 'small' | number;
+ isCentered?: boolean;
+ textAlign?: string;
+}
+
+interface HeadingProps extends BaseTextInterface {
+ asElement?: 'h1'| 'h2'| 'h3'| 'h4';
+ maxWidth?: string;
+ fontWeight?: string;
+ isCentered?: boolean;
+ isFlex?: boolean;
+ isNoMargin?: boolean;
+ isMuted?: boolean | number;
+ marginBottom?: string;
+ color?: string;
+}
+
+interface ParagraphProps extends BaseTextInterface {
+ isNoMargin?: boolean;
+ marginBottom?: string; // maybe we should remove isNoMargin
+ isMuted?: boolean | number;
+ fontWeight?: string | number;
+}
+
+const StyledHeading = styled.h1<HeadingProps>`
+ max-width: ${props => props.maxWidth};
+ color: ${props => props.color || props.theme.textColor};
+ display: ${props => props.isFlex && `inline-flex`};
+ align-items: center;
+ justify-content: ${props => props.isFlex && `space-between`};
+ font-size: ${props => typeof props.size === 'string' ? `var(--${props.size || 'default'}Heading)` : `${props.size}px`};
+ line-height: ${props => `var(--${props.size || 'default'}HeadingHeight)`};
+ text-align: ${props => props.isCentered && 'center'};
+ padding: ${props => props.padding && getCSSPadding(props.padding)};
+ margin-left: ${props => props.isCentered && 'auto'};
+ margin-right: ${props => props.isCentered && 'auto'};
+ margin-bottom: ${props => !props.isNoMargin && (props.marginBottom || '30px')};
+ opacity: ${props => typeof props.isMuted === 'boolean' ? 0.75 : props.isMuted};
+ font-weight: ${props => props.fontWeight ? props.fontWeight : (['h4'].includes(props.asElement) ? 400 : 300)};
+ width: ${props => props.isFlex && `100%`};
+`;
+
+export const Heading: React.StatelessComponent<HeadingProps> = props => {
+ const {
+ asElement = 'h1',
+ children,
+ } = props;
+ const Component = StyledHeading.withComponent(asElement);
+
+ return (
+ <Component
+ {...props}
+ >
+ {children}
+ </Component>
+ );
+};
+
+Heading.defaultProps = {
+ size: 'default',
+};
+
+// No need to declare it twice as Styled then rewrap as a stateless comp
+// Note: this would be useful to be implemented the same way was "Heading"
+// and be more generic. e.g. <Text /> with a props asElement so we can use it
+// for literally anything =
+export const Paragraph = styled.p<ParagraphProps>`
+ font-size: ${props => `var(--${props.size || 'default'}Paragraph)`};
+ font-weight: ${props => props.fontWeight || 300};
+ margin-bottom: ${props => !props.isNoMargin && (props.marginBottom || '30px')};
+ padding: ${props => props.padding && getCSSPadding(props.padding)};
+ color: ${props => props.color || props.theme.paragraphColor};
+ opacity: ${props => typeof props.isMuted === 'boolean' ? 0.75 : props.isMuted};
+ text-align: ${props => props.textAlign ? props.textAlign : props.isCentered && 'center'};
+ line-height: 1.4;
+`;
+
+Paragraph.defaultProps = {
+ isMuted: true,
+};
diff --git a/packages/website/ts/@next/constants/.gitkeep b/packages/website/ts/@next/constants/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/website/ts/@next/constants/.gitkeep
diff --git a/packages/website/ts/@next/constants/animations.tsx b/packages/website/ts/@next/constants/animations.tsx
new file mode 100644
index 000000000..6a58c4b40
--- /dev/null
+++ b/packages/website/ts/@next/constants/animations.tsx
@@ -0,0 +1,18 @@
+import { css, keyframes } from 'styled-components';
+
+export const fadeIn = keyframes`
+ 0% {
+ transform: translateY(10px);
+ opacity: 0;
+ }
+ 100% {
+ transform: translateY(0);
+ opacity: 1;
+ }
+`;
+
+export const addFadeInAnimation = (duration: string = '0.5s', delay: string = '0s') => css`
+ opacity: 0;
+ transform: translateY(10px);
+ animation: ${fadeIn} ${duration} ${delay} forwards;
+`;
diff --git a/packages/website/ts/@next/constants/cssReset.js b/packages/website/ts/@next/constants/cssReset.js
new file mode 100644
index 000000000..4c5105b50
--- /dev/null
+++ b/packages/website/ts/@next/constants/cssReset.js
@@ -0,0 +1,50 @@
+export const cssReset = `
+ *,
+ *:before,
+ *:after {
+ box-sizing: border-box;
+ }
+ html, body, div, span, applet, object, iframe,
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+ a, abbr, acronym, address, big, cite, code,
+ del, dfn, em, img, ins, kbd, q, s, samp,
+ small, strike, strong, sub, sup, tt, var,
+ b, u, i, center,
+ dl, dt, dd, ol, ul, li,
+ fieldset, form, label, legend,
+ table, caption, tbody, tfoot, thead, tr, th, td,
+ article, aside, canvas, details, embed,
+ figure, figcaption, footer, header, hgroup,
+ menu, nav, output, ruby, section, summary,
+ time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+ }
+ /* HTML5 display-role reset for older browsers */
+ article, aside, details, figcaption, figure,
+ footer, header, hgroup, menu, nav, section {
+ display: block;
+ }
+ body {
+ line-height: 1;
+ }
+ ol, ul {
+ list-style: none;
+ }
+ blockquote, q {
+ quotes: none;
+ }
+ blockquote:before, blockquote:after,
+ q:before, q:after {
+ content: '';
+ content: none;
+ }
+ table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ }
+`;
diff --git a/packages/website/ts/@next/constants/globalStyle.tsx b/packages/website/ts/@next/constants/globalStyle.tsx
new file mode 100644
index 000000000..6844381c9
--- /dev/null
+++ b/packages/website/ts/@next/constants/globalStyle.tsx
@@ -0,0 +1,119 @@
+import {createGlobalStyle, withTheme} from 'styled-components';
+import {cssReset} from 'ts/@next/constants/cssReset';
+
+export interface GlobalStyle {
+ theme: {
+ bgColor: string;
+ textColor: string;
+ linkColor: string;
+ dropdownButtonBg: string;
+ };
+}
+
+const GlobalStyles = withTheme(createGlobalStyle<GlobalStyle> `
+ ${cssReset};
+
+ @font-face {
+ font-family: "Formular";
+ src: url("/fonts/Formular-Light.woff2") format("woff2"), url("/fonts/Formular-Light.woff") format("woff");
+ font-weight: 300;
+ font-display: swap;
+ }
+
+ @font-face {
+ font-family: "Formular";
+ src: url("/fonts/Formular-Regular.woff2") format("woff2"), url("/fonts/Formular-Regular.woff") format("woff");
+ font-weight: 400;
+ font-display: swap;
+ }
+
+ html {
+ font-size: 18px;
+ background-color: ${props => props.theme.bgColor};
+ overflow-x: hidden;
+ }
+
+ @media (min-width: 768px) {
+ :root {
+ --smallHeading: 20px;
+ --defaultHeading: 28px;
+ --mediumHeading: 50px;
+ --largeHeading: 80px;
+ --smallHeadingHeight: 1.4em;
+ --defaultHeadingHeight: 1.357142857em;
+ --mediumHeadingHeight: 1.16em;
+ --largeHeadingHeight: 1em;
+ --smallParagraph: 14px;
+ --defaultParagraph: 18px;
+ --mediumParagraph: 22px;
+ --largeParagraph: 28px;
+ --smallIcon: 75px;
+ --mediumIcon: 85px;
+ --largeIcon: 145px;
+ --heroIcon: 282px;
+ }
+ }
+
+ @media (max-width: 1170px) {
+ :root {
+ --largeHeading: 60px;
+ }
+ }
+
+ @media (max-width: 768px) {
+ :root {
+ --smallHeading: 18px;
+ --defaultHeading: 18px;
+ --mediumHeading: 40px;
+ --largeHeading: 46px;
+ --smallHeadingHeight: 1.4em; // TO DO
+ --defaultHeadingHeight: 1.357142857em; // TO DO
+ --mediumHeadingHeight: 1.16em; // TO DO
+ --largeHeadingHeight: 1.108695652em; // TO DO
+ --smallParagraph: 14px; // TO DO
+ --defaultParagraph: 16px; // TO DO
+ --mediumParagraph: 20px; // TO DO
+ --largeParagraph: 20px; // TO DO
+ --smallIcon: 55px;
+ --mediumIcon: 85px;
+ --largeIcon: 115px;
+ }
+ }
+
+ body {
+ font-family: 'Formular', sans-serif !important;
+ -webkit-font-smoothing: antialiased;
+ color: ${props => props.theme.textColor};
+ font-feature-settings: "zero";
+ scroll-behavior: smooth;
+ }
+
+ .visuallyHidden {
+ position: absolute !important;
+ clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
+ clip: rect(1px, 1px, 1px, 1px);
+ padding:0 !important;
+ border:0 !important;
+ height: 1px !important;
+ width: 1px !important;
+ overflow: hidden;
+ }
+
+ img, svg {
+ max-width: 100%;
+ object-fit: contain;
+ }
+
+ a, button {
+ text-decoration: none;
+ font-family: inherit;
+ outline: none;
+ }
+
+ svg + p,
+ img + p {
+ padding-top: 30px;
+ }
+`);
+
+export { GlobalStyles };
diff --git a/packages/website/ts/@next/constants/utilities.tsx b/packages/website/ts/@next/constants/utilities.tsx
new file mode 100644
index 000000000..685b9e6f9
--- /dev/null
+++ b/packages/website/ts/@next/constants/utilities.tsx
@@ -0,0 +1,22 @@
+export interface PaddingInterface {
+ padding?: number | Array<'large' | 'default' | 'small' | number>;
+ margin?: number | Array<'large' | 'default' | 'small' | number>;
+}
+
+interface PaddingSizes {
+ [key: string]: string;
+}
+
+export const PADDING_SIZES: PaddingSizes = {
+ 'default': '30px',
+ 'large': '60px',
+ 'small': '15px',
+};
+
+export const getCSSPadding = (value: number | Array<string | number>): string => {
+ if (Array.isArray(value)) {
+ return value.map(val => PADDING_SIZES[val] || `${val}px`).join(' ');
+ } else {
+ return `${value}px`;
+ }
+};
diff --git a/packages/website/ts/@next/icons/form-arrow.svg b/packages/website/ts/@next/icons/form-arrow.svg
new file mode 100644
index 000000000..2070a6d48
--- /dev/null
+++ b/packages/website/ts/@next/icons/form-arrow.svg
@@ -0,0 +1 @@
+<svg width="22" height="17" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M13.066 0l-1.068 1.147 6.232 6.557H0v1.592h18.23l-6.232 6.557L13.066 17l8.08-8.5-8.08-8.5z" fill="#CBCBCB"/></svg> \ No newline at end of file
diff --git a/packages/website/ts/@next/icons/illustrations/0x.svg b/packages/website/ts/@next/icons/illustrations/0x.svg
new file mode 100755
index 000000000..b0810f751
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/0x.svg
@@ -0,0 +1,14 @@
+<svg width="404" height="404" viewBox="0 0 404 404" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="404" height="404">
+<circle cx="202" cy="202" r="200" fill="#00AE99" stroke="#00AE99" stroke-width="3"/>
+</mask>
+<g mask="url(#mask0)">
+<circle cx="202" cy="202" r="200" stroke="#00AE99" stroke-width="3"/>
+<circle cx="201.667" cy="68.6667" r="66.6667" stroke="#00AE99" stroke-width="3"/>
+<circle cx="68.6667" cy="202.667" r="66.6667" stroke="#00AE99" stroke-width="3"/>
+<path d="M168.17 260.29L167.271 259.089L165.46 260.444L167.413 261.585L168.17 260.29ZM197.32 269.2L197.219 270.696L197.226 270.697L197.32 269.2ZM237.414 258.856L238.22 260.12L238.225 260.117L237.414 258.856ZM252.653 245.439L253.801 246.405L254.55 245.515L253.874 244.568L252.653 245.439ZM241.096 229.872L242.285 228.958L242.281 228.952L242.276 228.946L241.096 229.872ZM237.72 225.571L238.901 224.645L237.582 222.965L236.449 224.775L237.72 225.571ZM219.719 241.445L218.672 242.519L219.418 243.246L220.36 242.801L219.719 241.445ZM208.264 230.282L209.311 229.207L208.392 228.312L207.365 229.081L208.264 230.282ZM143.827 169.549L145.02 168.64L143.647 166.838L142.524 168.806L143.827 169.549ZM135.133 198.43L133.637 198.329L133.636 198.337L135.133 198.43ZM145.464 238.577L144.201 239.388L145.464 238.577ZM158.862 253.837L157.895 254.984L158.786 255.736L159.735 255.057L158.862 253.837ZM174.409 242.264L175.324 243.453L175.33 243.448L175.336 243.443L174.409 242.264ZM178.705 238.885L179.632 240.064L181.287 238.761L179.516 237.623L178.705 238.885ZM162.851 220.757L161.78 219.707L161.049 220.452L161.495 221.397L162.851 220.757ZM174.102 209.286L175.173 210.337L176.082 209.41L175.295 208.377L174.102 209.286ZM235.163 145.072L236.036 146.292L237.92 144.945L235.92 143.777L235.163 145.072ZM206.014 136.162L205.91 137.658L205.913 137.658L206.014 136.162ZM165.817 146.506L166.629 147.767L166.632 147.765L165.817 146.506ZM150.578 159.922L149.43 158.956L148.681 159.846L149.357 160.793L150.578 159.922ZM162.135 175.489L160.946 176.403L160.951 176.409L160.955 176.415L162.135 175.489ZM165.511 179.791L164.331 180.717L165.634 182.378L166.773 180.6L165.511 179.791ZM183.614 163.916L184.655 162.836L183.913 162.122L182.98 162.557L183.614 163.916ZM194.354 174.26L193.313 175.341L194.212 176.206L195.226 175.48L194.354 174.26ZM259.608 235.505L258.411 236.409L259.789 238.233L260.914 236.243L259.608 235.505ZM268.2 206.931L269.696 207.033L269.697 207.024L268.2 206.931ZM257.87 166.784L259.135 165.979L259.132 165.974L257.87 166.784ZM244.471 151.524L245.439 150.378L244.547 149.625L243.598 150.304L244.471 151.524ZM228.924 163.097L228.009 161.909L228.003 161.913L227.997 161.918L228.924 163.097ZM224.629 166.477L223.701 165.298L222.034 166.609L223.826 167.744L224.629 166.477ZM240.584 184.604L239.228 185.244L239.235 185.259L239.242 185.274L240.584 184.604ZM240.687 184.809L241.767 185.849L242.502 185.086L242.029 184.139L240.687 184.809ZM229.845 196.075L228.764 195.035L227.877 195.957L228.648 196.979L229.845 196.075ZM167.413 261.585C176.201 266.718 186.346 269.964 197.219 270.696L197.421 267.703C187.019 267.002 177.321 263.898 168.926 258.994L167.413 261.585ZM197.226 270.697C212.283 271.639 226.405 267.659 238.22 260.12L236.607 257.591C225.307 264.8 211.813 268.604 197.413 267.703L197.226 270.697ZM238.225 260.117C244.08 256.348 249.307 251.742 253.801 246.405L251.506 244.473C247.204 249.583 242.203 253.989 236.602 257.594L238.225 260.117ZM253.874 244.568C250.283 239.533 246.385 234.295 242.285 228.958L239.906 230.786C243.989 236.1 247.864 241.309 251.432 246.31L253.874 244.568ZM242.276 228.946C241.713 228.229 241.151 227.512 240.588 226.795C240.026 226.078 239.463 225.362 238.901 224.645L236.54 226.497C237.103 227.213 237.665 227.93 238.228 228.647C238.791 229.364 239.353 230.081 239.916 230.798L242.276 228.946ZM236.449 224.775C232.311 231.384 226.193 236.725 219.078 240.089L220.36 242.801C227.974 239.201 234.538 233.481 238.992 226.367L236.449 224.775ZM220.766 240.371L209.311 229.207L207.217 231.356L218.672 242.519L220.766 240.371ZM207.365 229.081L167.271 259.089L169.069 261.49L209.163 231.483L207.365 229.081ZM142.524 168.806C137.505 177.601 134.368 187.549 133.637 198.329L136.63 198.532C137.33 188.214 140.33 178.703 145.13 170.293L142.524 168.806ZM133.636 198.337C132.696 213.409 136.668 227.654 144.201 239.388L146.726 237.767C139.531 226.56 135.73 212.947 136.63 198.524L133.636 198.337ZM144.201 239.388C147.965 245.25 152.565 250.484 157.895 254.984L159.83 252.691C154.727 248.383 150.327 243.376 146.726 237.767L144.201 239.388ZM159.735 255.057C164.764 251.461 169.994 247.558 175.324 243.453L173.494 241.076C168.187 245.164 162.985 249.045 157.99 252.617L159.735 255.057ZM175.336 243.443C176.768 242.317 178.2 241.19 179.632 240.064L177.777 237.706C176.345 238.832 174.913 239.959 173.481 241.086L175.336 243.443ZM179.516 237.623C172.904 233.374 167.568 227.241 164.208 220.117L161.495 221.397C165.09 229.021 170.8 235.588 177.894 240.147L179.516 237.623ZM163.922 221.807L175.173 210.337L173.031 208.236L161.78 219.707L163.922 221.807ZM175.295 208.377L145.02 168.64L142.634 170.458L172.909 210.196L175.295 208.377ZM235.92 143.777C227.132 138.643 216.987 135.398 206.114 134.665L205.913 137.658C216.315 138.359 226.012 141.463 234.407 146.367L235.92 143.777ZM206.118 134.665C191.055 133.618 176.824 137.599 165.003 145.246L166.632 147.765C177.926 140.459 191.515 136.657 205.91 137.658L206.118 134.665ZM165.006 145.244C159.151 149.013 153.924 153.619 149.43 158.956L151.725 160.888C156.027 155.779 161.028 151.372 166.629 147.767L165.006 145.244ZM149.357 160.793C152.948 165.828 156.846 171.066 160.946 176.403L163.325 174.575C159.242 169.261 155.367 164.052 151.799 159.051L149.357 160.793ZM160.955 176.415C161.518 177.132 162.08 177.849 162.643 178.566C163.205 179.283 163.768 180 164.331 180.717L166.691 178.865C166.128 178.148 165.566 177.431 165.003 176.714C164.441 175.997 163.878 175.28 163.315 174.563L160.955 176.415ZM166.773 180.6C171.021 173.973 177.044 168.635 184.248 165.276L182.98 162.557C175.251 166.161 168.796 171.885 164.248 178.981L166.773 180.6ZM182.574 164.997L193.313 175.341L195.394 173.18L184.655 162.836L182.574 164.997ZM195.226 175.48L236.036 146.292L234.291 143.852L193.481 173.04L195.226 175.48ZM260.914 236.243C265.827 227.556 268.964 217.713 269.696 207.033L266.703 206.828C266.003 217.042 263.004 226.453 258.303 234.767L260.914 236.243ZM269.697 207.024C270.638 191.949 266.663 177.81 259.135 165.979L256.604 167.589C263.804 178.904 267.603 192.417 266.703 206.837L269.697 207.024ZM259.132 165.974C255.368 160.111 250.769 154.878 245.439 150.378L243.503 152.67C248.606 156.978 253.007 161.986 256.607 167.594L259.132 165.974ZM243.598 150.304C238.57 153.901 233.339 157.803 228.009 161.909L229.84 164.285C235.147 160.197 240.349 156.316 245.344 152.744L243.598 150.304ZM227.997 161.918C227.281 162.481 226.565 163.045 225.849 163.608C225.133 164.171 224.417 164.734 223.701 165.298L225.556 167.656C226.272 167.092 226.988 166.529 227.704 165.966C228.42 165.402 229.136 164.839 229.852 164.276L227.997 161.918ZM223.826 167.744C230.535 171.992 235.869 178.121 239.228 185.244L241.941 183.964C238.345 176.339 232.632 169.769 225.431 165.209L223.826 167.744ZM239.242 185.274L239.345 185.479L242.029 184.139L241.926 183.934L239.242 185.274ZM239.606 183.769L228.764 195.035L230.926 197.115L241.767 185.849L239.606 183.769ZM228.648 196.979L258.411 236.409L260.806 234.601L231.042 195.171L228.648 196.979Z" fill="#00AE99"/>
+<path d="M269 135V268.333H442V135H269Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M339.64 269.64L270 339.281L343.913 413.194L413.554 343.554L339.64 269.64Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M202.5 269C202.5 269 269 269 269 335.5C269 402 202.5 402 202.5 402H-6.5C-6.5 402 -77 402 -77 335.5C-77 269 -6.5 269 -6.5 269H202.5Z" stroke="#00AE99" stroke-width="3"/>
+</g>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/buildBusiness.svg b/packages/website/ts/@next/icons/illustrations/buildBusiness.svg
new file mode 100755
index 000000000..48e5b3b1c
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/buildBusiness.svg
@@ -0,0 +1,6 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 45C2 68.7579 21.2421 88 45 88C68.7579 88 88 68.7579 88 45C88 21.6448 69.3906 2.63278 46.1793 2.02876C45.7478 2.02876 45.3452 2 44.9137 2C21.2134 2.02876 2 21.2709 2 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M78.8765 52.5843V69.7753H12.1349V52.5843M78.8765 52.5843V21.236H12.1349V52.5843M78.8765 52.5843H51.5731H39.4383H12.1349" stroke="#00AE99" stroke-width="3"/>
+<path d="M56.6293 11.1236H34.3821V21.236H56.6293V11.1236Z" stroke="#00AE99" stroke-width="3"/>
+<rect width="22.2472" height="6.06742" transform="matrix(1 0 0 -1 34.3821 58.6517)" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/checkmark.svg b/packages/website/ts/@next/icons/illustrations/checkmark.svg
new file mode 100644
index 000000000..e17a7ab8b
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/checkmark.svg
@@ -0,0 +1 @@
+<svg width="124" height="124" viewBox="0 0 124 124" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M61.878.5h.002c.327 0 .64.01.924.02l.01.001a23.966 23.966 0 0 0 .87.02C96.885 1.405 123.5 28.597 123.5 62c0 33.979-27.521 61.5-61.5 61.5S.5 95.979.5 62C.5 28.063 27.979.541 61.878.5zm.002 3C29.64 3.54 3.5 29.717 3.5 62c0 32.322 26.178 58.5 58.5 58.5s58.5-26.178 58.5-58.5c0-31.768-25.308-57.628-56.875-58.46-.32 0-.625-.01-.904-.02h-.01c-.294-.011-.56-.02-.83-.02z" fill="#00AE99"/><path fill-rule="evenodd" clip-rule="evenodd" d="M47.502 98.561l55.419-55.419L88.779 29 47.495 70.284 34.142 56.932 20 71.074l16.573 16.573.008-.007L47.502 98.56zM36.573 83.405l.008-.008 10.921 10.921L98.68 43.142l-9.9-9.9-41.284 41.285-13.353-13.352-9.9 9.9 12.331 12.33z" fill="#00AE99"/></svg> \ No newline at end of file
diff --git a/packages/website/ts/@next/icons/illustrations/code-repo.svg b/packages/website/ts/@next/icons/illustrations/code-repo.svg
new file mode 100644
index 000000000..43e412198
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/code-repo.svg
@@ -0,0 +1,7 @@
+<svg width="82" height="82" viewBox="0 0 82 82" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M40.9185 1.43051e-06L40.9197 0C41.1377 7.15256e-07 41.3462 0.00719154 41.5359 0.0137337L41.5428 0.0139726C41.7392 0.0207458 41.9163 0.0267566 42.097 0.0267566C42.1057 0.0267566 42.1143 0.0268694 42.123 0.027095C64.2563 0.603056 82 18.7315 82 41C82 63.6526 63.6526 82 41 82C18.3474 82 0 63.6526 0 41C0 18.3752 18.3193 0.0274277 40.9185 1.43051e-06ZM40.9203 2C19.4262 2.02641 2 19.4778 2 41C2 62.548 19.452 80 41 80C62.548 80 80 62.548 80 41C80 19.8212 63.1283 2.58105 42.0835 2.02675C41.8704 2.02646 41.6666 2.01943 41.4808 2.01302L41.4739 2.01278C41.2777 2.00602 41.1008 2.00001 40.9203 2Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.7026 14.378C10.7026 13.8257 11.1504 13.378 11.7026 13.378H33.7762C34.3284 13.378 34.7762 13.8257 34.7762 14.378V36.4516C34.7762 37.0039 34.3284 37.4516 33.7762 37.4516H11.7026C11.1504 37.4516 10.7026 37.0039 10.7026 36.4516V14.378ZM12.7026 15.378V35.4516H32.7762V15.378H12.7026Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M38.6621 20.6785L33.0687 15.0851L34.4829 13.6709L40.3692 19.5572C40.5567 19.7447 40.6621 19.9991 40.6621 20.2643V42.3379C40.6621 42.8902 40.2143 43.3379 39.6621 43.3379H17.5885C17.3233 43.3379 17.0689 43.2325 16.8814 43.045L10.9951 37.1587L12.4093 35.7445L18.0027 41.3379H38.6621V20.6785Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M38.6621 42.338C38.6621 41.7857 39.1098 41.338 39.6621 41.338H61.7357C62.288 41.338 62.7357 41.7857 62.7357 42.338V64.4116C62.7357 64.9638 62.288 65.4116 61.7357 65.4116H39.6621C39.1098 65.4116 38.6621 64.9638 38.6621 64.4116V42.338ZM40.6621 43.338V63.4116H60.7357V43.338H40.6621Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M66.622 48.6385L61.0286 43.0451L62.4429 41.6309L68.3291 47.5172C68.5167 47.7047 68.622 47.9591 68.622 48.2243V70.2979C68.622 70.8501 68.1743 71.2979 67.622 71.2979H45.5485C45.2833 71.2979 45.0289 71.1925 44.8414 71.005L38.9551 65.1187L40.3693 63.7045L45.9627 69.2979H66.622V48.6385Z" fill="#00AE99"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/coin.svg b/packages/website/ts/@next/icons/illustrations/coin.svg
new file mode 100644
index 000000000..a1fb123a4
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/coin.svg
@@ -0,0 +1 @@
+<svg width="88" height="88" viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M44 87c23.748 0 43-19.252 43-43S67.748 1 44 1 1 20.252 1 44s19.252 43 43 43z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M43.999 78.4c18.998 0 34.4-15.401 34.4-34.4 0-18.998-15.401-34.4-34.4-34.4S9.599 25.002 9.599 44C9.599 63 25 78.4 43.999 78.4z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M35.1 57.76v1h20.529v-7.395h-6.098V26.738H42.36l-.254.173-6.568 4.456-.438.298v8.906l1.561-1.06 5.006-3.397v15.251H35.1v6.395z" stroke="#00AE99" stroke-width="2"/><path d="M9.597 43.766c7.115-1.173 12.588-7.271 12.588-14.777 0-3.362-1.095-6.41-2.971-8.913-5.864 6.177-9.538 14.542-9.617 23.69zM9.597 44.234c.079 9.226 3.753 17.513 9.617 23.69a14.719 14.719 0 0 0 2.97-8.913c0-7.506-5.472-13.682-12.587-14.777zM78.399 43.766c-7.115-1.173-12.587-7.271-12.587-14.777 0-3.362 1.094-6.41 2.97-8.913 5.864 6.177 9.539 14.542 9.617 23.69zM78.399 44.235c-.079 9.225-3.753 17.512-9.617 23.689a14.718 14.718 0 0 1-2.97-8.913c0-7.506 5.472-13.682 12.587-14.776z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/></svg>
diff --git a/packages/website/ts/@next/icons/illustrations/consistently-ship.svg b/packages/website/ts/@next/icons/illustrations/consistently-ship.svg
new file mode 100644
index 000000000..b7b0110be
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/consistently-ship.svg
@@ -0,0 +1,6 @@
+<svg width="104" height="104" viewBox="0 0 104 104" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.84985 78.8087L36.7242 61.1239L37.9881 63.0445L38.1969 62.8389L40.3021 64.9762L17.1691 87.7629L15.0638 85.6256L35.4224 65.5718L11.499 81.3147L9.84985 78.8087Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M30.5626 97.04L44.5116 68.1307L42.2297 67.0297L42.4954 66.6708L40.0844 64.8856L20.6933 91.0738L23.1043 92.8591L40.7433 69.0371L27.8606 95.7363L30.5626 97.04Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M77.0274 21.945L77.7817 22.597L77.9176 22.9305C78.4037 24.1238 78.4331 25.4595 78.2991 26.6101C78.163 27.7797 77.841 28.9043 77.4856 29.7663C77.111 30.6749 76.1177 32.2645 75.1401 33.7277C74.1583 35.1972 73.0749 36.711 72.3583 37.6171C72.3108 37.6936 72.2613 37.7744 72.2099 37.8592L72.2154 37.8639L72.1874 37.8963C70.7572 40.2611 67.9041 45.6532 66.4461 50.8115C64.8495 56.46 65.5015 61.0514 65.9556 64.2492C66.0373 64.8248 66.1127 65.3553 66.1673 65.8386C66.2974 66.9893 65.9903 68.1889 65.5872 69.2248C65.1736 70.2879 64.5976 71.3318 64.0302 72.2257C63.4471 73.1444 62.8475 73.9446 62.387 74.4938L61.4071 75.6622L50.0298 65.7966L48.5502 67.5084L48.5056 67.552C48.1953 67.8559 47.618 68.2291 46.8939 68.3763C46.4862 68.4592 46.0304 68.4687 45.5642 68.359L45.5313 68.3971L45.3992 68.4954C44.8377 68.9128 43.4689 69.4006 42.2387 68.3372L36.9111 63.732C35.6809 62.6686 35.9656 61.2437 36.2974 60.6277L36.3755 60.4828L36.4085 60.4446C36.2324 59.9993 36.1759 59.5468 36.1989 59.1315C36.2398 58.3937 36.5256 57.7685 36.7814 57.4174L36.8181 57.367L38.2977 55.6553L26.8899 45.8252L27.9042 44.6866C28.3809 44.1514 29.086 43.4424 29.9106 42.7324C30.713 42.0417 31.6626 41.3207 32.6547 40.7576C33.6213 40.2089 34.764 39.7315 35.9213 39.6937C36.4075 39.6779 36.9432 39.6756 37.5246 39.6732C40.7544 39.6599 45.3919 39.6406 50.75 37.2437C55.6431 35.0547 60.5656 31.4513 62.6986 29.6941L62.7266 29.6617L62.7321 29.6665C62.8085 29.6033 62.8812 29.5426 62.9501 29.4846C63.743 28.6445 65.0842 27.3534 66.3961 26.1693C67.7024 24.9903 69.1316 23.7775 69.9764 23.2754C70.778 22.799 71.8441 22.3176 72.9817 22.0137C74.1009 21.7147 75.4267 21.5505 76.6778 21.8589L77.0274 21.945ZM55.203 38.3654C54.147 38.9466 53.0625 39.4956 51.9751 39.9821C45.9873 42.6608 40.6767 42.6707 37.4612 42.6766C36.9186 42.6776 36.4356 42.6785 36.0192 42.6921C35.5706 42.7068 34.9295 42.916 34.1355 43.3666C33.367 43.8029 32.579 44.3938 31.8679 45.006C31.6377 45.2042 31.4191 45.4015 31.2155 45.5925L40.2596 53.3857L40.9605 52.5749C41.9509 51.429 43.2047 50.9183 44.4009 50.8619L55.203 38.3654ZM47.4939 51.8712L64.806 31.8436C64.8574 31.8005 64.9071 31.7587 64.9549 31.7181L65.0206 31.6623L65.0795 31.5994C65.7829 30.8478 67.0916 29.5828 68.4061 28.3964C69.7605 27.1739 70.9671 26.1765 71.5092 25.8543C72.0946 25.5064 72.9071 25.1388 73.7561 24.912C74.3265 24.7596 74.8542 24.6865 75.3101 24.694C75.3835 25.1441 75.3875 25.6768 75.3193 26.2632C75.2177 27.1361 74.9716 27.9933 74.712 28.6228C74.4717 29.2059 73.6592 30.544 72.6456 32.061C71.6619 33.5334 70.5996 35.0114 69.9577 35.8161L69.9039 35.8835L69.8582 35.9566C69.825 36.0098 69.7908 36.0649 69.7556 36.1221L52.4435 56.1497C51.943 55.696 51.0966 54.9401 50.1455 54.1125C50.0948 54.0686 50.0447 54.0244 49.9942 53.981C49.944 53.9373 49.8935 53.8935 49.8427 53.8496C48.8862 53.0284 48.0152 52.3008 47.4939 51.8712ZM48.0324 56.2506C47.0025 55.3641 46.0577 54.5744 45.535 54.1444L45.5208 54.1327L45.507 54.1207C45.1484 53.8107 44.0456 53.5933 43.2301 54.5367L42.5307 55.3458L49.7236 61.5634L50.423 60.7543C51.2385 59.811 50.8638 58.7512 50.5052 58.4412L50.4913 58.4292L50.4777 58.4169C49.9766 57.9619 49.0585 57.1414 48.0324 56.2506ZM47.7618 63.833L40.5688 57.6154L39.222 59.1735C39.2059 59.2171 39.1963 59.2619 39.1943 59.2975C39.1934 59.3136 39.1943 59.3242 39.1951 59.33C39.1959 59.3352 39.1967 59.3374 39.1971 59.3385C39.1974 59.3394 39.1997 59.3452 39.2078 59.3564C39.2161 59.3681 39.2351 59.3918 39.273 59.4245L46.1591 65.377C46.197 65.4097 46.2232 65.4251 46.236 65.4317C46.2483 65.438 46.2543 65.4394 46.2552 65.4396C46.2563 65.4399 46.2587 65.4404 46.2639 65.4404C46.2669 65.4404 46.271 65.4402 46.2764 65.4396C46.2818 65.439 46.2884 65.4381 46.2963 65.4365C46.3312 65.4293 46.3742 65.4133 46.4149 65.3911L47.7618 63.833ZM39.2383 59.1353C39.2391 59.1338 39.2394 59.1333 39.2392 59.1338ZM53.8897 59.0642C54.007 60.2559 53.683 61.5704 52.6926 62.7162L51.9917 63.527L61.0115 71.3484C61.171 71.1193 61.3346 70.8745 61.4974 70.618C62.0002 69.8258 62.471 68.9606 62.7914 68.1371C63.1224 67.2862 63.2367 66.6216 63.1863 66.1756C63.1395 65.7616 63.0705 65.2836 62.993 64.7465C62.5336 61.564 61.775 56.3079 63.5592 49.9955C63.8832 48.8491 64.2695 47.6966 64.6918 46.5676L53.8897 59.0642Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M52 3.5C25.2142 3.5 3.5 25.2142 3.5 52C3.5 78.7858 25.2142 100.5 52 100.5C78.7858 100.5 100.5 78.7858 100.5 52C100.5 25.2142 78.7858 3.5 52 3.5ZM0.5 52C0.5 23.5573 23.5573 0.5 52 0.5C80.4427 0.5 103.5 23.5573 103.5 52C103.5 80.4427 80.4427 103.5 52 103.5C23.5573 103.5 0.5 80.4427 0.5 52Z" fill="#00AE99"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/customize.svg b/packages/website/ts/@next/icons/illustrations/customize.svg
new file mode 100644
index 000000000..1f018ee7a
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/customize.svg
@@ -0,0 +1 @@
+<svg width="152" height="152" viewBox="0 0 152 152" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M76 151c41.421 0 75-33.579 75-75S117.421 1 76 1 1 34.579 1 76s33.579 75 75 75z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M120.5 122.906H31.503c-12.943 0-23.478-10.485-23.478-23.478 0-12.993 10.485-23.478 23.478-23.478H120.5" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M120.499 122.906c12.967 0 23.478-10.511 23.478-23.478 0-12.967-10.511-23.478-23.478-23.478-12.967 0-23.478 10.511-23.478 23.478 0 12.967 10.511 23.478 23.478 23.478z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M120.5 122.906H31.503c-12.943 0-23.478-10.485-23.478-23.478 0-12.993 10.485-23.478 23.478-23.478H120.5" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M120.499 122.906c12.967 0 23.478-10.511 23.478-23.478 0-12.967-10.511-23.478-23.478-23.478-12.967 0-23.478 10.511-23.478 23.478 0 12.967 10.511 23.478 23.478 23.478z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M31.5 29.093h88.996c12.943 0 23.478 10.485 23.478 23.478 0 12.993-10.485 23.478-23.478 23.478H31.499" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M31.503 76.052c12.967 0 23.478-10.512 23.478-23.478 0-12.967-10.511-23.479-23.478-23.479-12.966 0-23.478 10.512-23.478 23.479 0 12.966 10.512 23.478 23.478 23.478z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/></svg> \ No newline at end of file
diff --git a/packages/website/ts/@next/icons/illustrations/decentralisedLoans.svg b/packages/website/ts/@next/icons/illustrations/decentralisedLoans.svg
new file mode 100755
index 000000000..72d0de7fc
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/decentralisedLoans.svg
@@ -0,0 +1,13 @@
+<svg width="151" height="150" viewBox="0 0 151 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="76" cy="75" r="73" stroke="#00AE99" stroke-width="3"/>
+<rect x="3" y="75" width="45.9619" height="45.9619" transform="rotate(-45 3 75)" stroke="#00AE99" stroke-width="3"/>
+<rect x="85" y="75" width="45" height="45" transform="rotate(-45 85 75)" stroke="#00AE99" stroke-width="3"/>
+<path d="M89 79L76 92M100 115L85 100L71.5 113.5L63 105L76 92M100 115L113 102M100 115L106 121C97.6605 129.494 89.3395 138.006 81 146.5L38.5 104M76 92L63 79" stroke="#00AE99" stroke-width="3"/>
+<path d="M63.5 71.5L76.5 58.5M52.5 35.5L67.5 50.5L81 37L89.5 45.5L76.5 58.5M52.5 35.5L39.5 48.5M52.5 35.5L46.5 29.5C54.8395 21.0061 63.1605 12.4939 71.5 4L114 46.5M76.5 58.5L89.5 71.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M93 134.5L87 128.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M99 128L93.5 122.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M87 140L81.5 134.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M60.5 16.5L66.5 22.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M54.5 23L60 28.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M66.5 11L72 16.5" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/description.svg b/packages/website/ts/@next/icons/illustrations/description.svg
new file mode 100755
index 000000000..1887b182e
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/description.svg
@@ -0,0 +1,21 @@
+<svg width="353" height="80" viewBox="0 0 353 80" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M130.818 77C151.253 77 167.818 60.4345 167.818 40C167.818 19.5655 151.253 3 130.818 3C110.384 3 93.8181 19.5655 93.8181 40C93.8181 60.4345 110.384 77 130.818 77Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M140.505 11.9474V21.0965H149.654" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M149.655 21.0964V49.351H124.562V11.9473H140.506L149.655 21.0964Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M121.131 68.0529V58.9038H111.982" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M111.982 58.9039V30.6494H137.075V68.053H121.131L111.982 58.9039Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M40 77C60.4345 77 77 60.4345 77 40C77 19.5655 60.4345 3 40 3C19.5655 3 3.00001 19.5655 3.00001 40C3.00001 60.4345 19.5655 77 40 77Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M40.0037 76.9359C60.4007 76.9359 76.9357 60.4009 76.9357 40.0038C76.9357 19.6068 60.4007 3.07178 40.0037 3.07178C19.6066 3.07178 3.07159 19.6068 3.07159 40.0038C3.07159 60.4009 19.6066 76.9359 40.0037 76.9359Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M30.0225 54.7728V56.2728H31.5225H51.4155H52.9155V54.7728V48.9811V47.4811H51.4155H46.3684V22.5411V21.0411H44.8684H38.5732H38.1123L37.7309 21.2999L30.6803 26.0843L30.0225 26.5306V27.3255V34.2922V37.1228L32.3648 35.5335L37.0732 32.3385V47.4811H31.5225H30.0225V48.9811V54.7728Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M3.06793 39.7483C10.7062 38.4893 16.5817 31.9422 16.5817 23.8843C16.5817 20.275 15.4066 17.0015 13.3921 14.3156C7.09688 20.9465 3.15187 29.9277 3.06793 39.7483Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M3.06793 40.2518C3.15187 50.1563 7.09688 59.0535 13.3921 65.6845C15.4066 62.9986 16.5817 59.725 16.5817 56.1158C16.5817 48.0579 10.7062 41.4269 3.06793 40.2518Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M76.9322 39.7483C69.294 38.4893 63.4184 31.9422 63.4184 23.8843C63.4184 20.275 64.5936 17.0015 66.608 14.3156C72.9033 20.9465 76.8483 29.9277 76.9322 39.7483Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M76.9321 40.2518C76.8482 50.1563 72.9031 59.0536 66.6079 65.6846C64.5934 62.9986 63.4183 59.7251 63.4183 56.1158C63.4183 48.0579 69.2939 41.4269 76.9321 40.2518Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M221.987 77C242.421 77 258.987 60.4345 258.987 40C258.987 19.5655 242.421 3 221.987 3C201.552 3 184.987 19.5655 184.987 40C184.987 60.4345 201.552 77 221.987 77Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M221.987 77C242.421 77 258.987 60.4345 258.987 40C258.987 19.5655 242.421 3 221.987 3C201.552 3 184.987 19.5655 184.987 40C184.987 60.4345 201.552 77 221.987 77Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M225.754 38.1178V16.3887H228.848V10.2668H215.125V16.3887H218.219V38.1178C211.156 39.7996 205.908 46.1905 205.908 53.725C205.908 62.605 213.106 69.8032 221.986 69.8032C230.866 69.8032 238.065 62.605 238.065 53.725C238.065 46.1232 232.817 39.7996 225.754 38.1178Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M228.848 10.1979H215.124V16.3197H228.848V10.1979Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M208.6 44.7092H235.307" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M312.805 77C333.239 77 349.805 60.4345 349.805 40C349.805 19.5655 333.239 3 312.805 3C292.37 3 275.805 19.5655 275.805 40C275.805 60.4345 292.37 77 312.805 77Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M312.607 15.2613L290.287 45.3102H312.607L312.668 64.4778L334.926 34.3678H312.607V15.2613Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/descriptionBolt.svg b/packages/website/ts/@next/icons/illustrations/descriptionBolt.svg
new file mode 100755
index 000000000..45e51240f
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/descriptionBolt.svg
@@ -0,0 +1,4 @@
+<svg width="78" height="78" viewBox="0 0 78 78" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M38.8049 76C59.2395 76 75.8049 59.4345 75.8049 39C75.8049 18.5655 59.2395 2 38.8049 2C18.3704 2 1.80493 18.5655 1.80493 39C1.80493 59.4345 18.3704 76 38.8049 76Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M38.6065 14.2613L16.2874 44.3102H38.6065L38.6679 63.4778L60.9257 33.3678H38.6065V14.2613Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/descriptionCoin.svg b/packages/website/ts/@next/icons/illustrations/descriptionCoin.svg
new file mode 100755
index 000000000..d1015b98d
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/descriptionCoin.svg
@@ -0,0 +1,9 @@
+<svg width="78" height="78" viewBox="0 0 78 78" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M39 76C59.4345 76 76 59.4345 76 39C76 18.5655 59.4345 2 39 2C18.5655 2 2.00001 18.5655 2.00001 39C2.00001 59.4345 18.5655 76 39 76Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M39.0037 75.9359C59.4007 75.9359 75.9357 59.4009 75.9357 39.0038C75.9357 18.6068 59.4007 2.07178 39.0037 2.07178C18.6066 2.07178 2.07159 18.6068 2.07159 39.0038C2.07159 59.4009 18.6066 75.9359 39.0037 75.9359Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M29.0225 53.7728V55.2728H30.5225H50.4155H51.9155V53.7728V47.9811V46.4811H50.4155H45.3684V21.5411V20.0411H43.8684H37.5732H37.1123L36.7309 20.2999L29.6803 25.0843L29.0225 25.5306V26.3255V33.2922V36.1228L31.3648 34.5335L36.0732 31.3385V46.4811H30.5225H29.0225V47.9811V53.7728Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M2.06793 38.7483C9.70615 37.4893 15.5817 30.9422 15.5817 22.8843C15.5817 19.275 14.4066 16.0015 12.3921 13.3156C6.09688 19.9465 2.15187 28.9277 2.06793 38.7483Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M2.06793 39.2518C2.15187 49.1563 6.09688 58.0535 12.3921 64.6845C14.4066 61.9986 15.5817 58.725 15.5817 55.1158C15.5817 47.0579 9.70615 40.4269 2.06793 39.2518Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M75.9322 38.7483C68.294 37.4893 62.4184 30.9422 62.4184 22.8843C62.4184 19.275 63.5936 16.0015 65.608 13.3156C71.9033 19.9465 75.8483 28.9277 75.9322 38.7483Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M75.9321 39.2518C75.8482 49.1563 71.9031 58.0536 65.6079 64.6846C63.5934 61.9986 62.4183 58.7251 62.4183 55.1158C62.4183 47.0579 68.2939 40.4269 75.9321 39.2518Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/descriptionCopy.svg b/packages/website/ts/@next/icons/illustrations/descriptionCopy.svg
new file mode 100755
index 000000000..a8e454ffd
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/descriptionCopy.svg
@@ -0,0 +1,7 @@
+<svg width="78" height="78" viewBox="0 0 78 78" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M38.8181 76C59.2526 76 75.8181 59.4345 75.8181 39C75.8181 18.5655 59.2526 2 38.8181 2C18.3836 2 1.8181 18.5655 1.8181 39C1.8181 59.4345 18.3836 76 38.8181 76Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M48.5054 10.9474V20.0965H57.6545" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M57.6546 20.0964V48.351H32.5619V10.9473H48.5055L57.6546 20.0964Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M29.1309 67.0529V57.9038H19.9818" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M19.9818 57.9039V29.6494H45.0745V67.053H29.1309L19.9818 57.9039Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/descriptionFlask.svg b/packages/website/ts/@next/icons/illustrations/descriptionFlask.svg
new file mode 100755
index 000000000..703b069d5
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/descriptionFlask.svg
@@ -0,0 +1,7 @@
+<svg width="78" height="78" viewBox="0 0 78 78" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M38.9868 76C59.4213 76 75.9868 59.4345 75.9868 39C75.9868 18.5655 59.4213 2 38.9868 2C18.5523 2 1.9868 18.5655 1.9868 39C1.9868 59.4345 18.5523 76 38.9868 76Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M38.9868 76C59.4213 76 75.9868 59.4345 75.9868 39C75.9868 18.5655 59.4213 2 38.9868 2C18.5523 2 1.9868 18.5655 1.9868 39C1.9868 59.4345 18.5523 76 38.9868 76Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M42.7537 37.1178V15.3887H45.8483V9.26685H32.1246V15.3887H35.2192V37.1178C28.1555 38.7996 22.9083 45.1905 22.9083 52.725C22.9083 61.605 30.1064 68.8032 38.9864 68.8032C47.8664 68.8032 55.0646 61.605 55.0646 52.725C55.0646 45.1232 49.8174 38.7996 42.7537 37.1178Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M45.848 9.19794H32.1243V15.3197H45.848V9.19794Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M25.5996 43.7092H52.3069" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/eficientDesign.svg b/packages/website/ts/@next/icons/illustrations/eficientDesign.svg
new file mode 100755
index 000000000..6b8f852c3
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/eficientDesign.svg
@@ -0,0 +1,11 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M45 88C68.7482 88 88 68.7482 88 45C88 21.2518 68.7482 2 45 2C21.2518 2 2 21.2518 2 45C2 68.7482 21.2518 88 45 88Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M70.2962 31.8956L57.4584 19.3542L44.833 32.1067L57.6708 44.6481L70.2962 31.8956Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M74.8267 14.5717L57.4829 19.3431L70.311 31.8859L74.8267 14.5717Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M32.184 19.5506L19.5587 32.3031L32.3965 44.8445L45.0218 32.092L32.184 19.5506Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M14.7418 15.0572L19.5451 32.2857L32.1719 19.5429L14.7418 15.0572Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M19.698 57.5441L32.5358 70.0856L45.1612 57.3331L32.3234 44.7916L19.698 57.5441Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M15.1732 74.8574L32.517 70.086L19.6889 57.5432L15.1732 74.8574Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M57.8244 69.8803L70.4497 57.1278L57.6119 44.5863L44.9865 57.3389L57.8244 69.8803Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M75.2582 74.3715L70.4548 57.1429L57.8281 69.8858L75.2582 74.3715Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/eth-based-tokens.svg b/packages/website/ts/@next/icons/illustrations/eth-based-tokens.svg
new file mode 100644
index 000000000..b0370d234
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/eth-based-tokens.svg
@@ -0,0 +1,6 @@
+<svg width="84" height="84" viewBox="0 0 84 84" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M42.1187 1.19995L42.1199 1.19995C42.3379 1.19995 42.5464 1.20714 42.7361 1.21368L42.743 1.21392C42.9394 1.2207 43.1165 1.22671 43.2972 1.22671C43.3058 1.22671 43.3145 1.22682 43.3232 1.22705C65.4565 1.80301 83.2002 19.9314 83.2002 42.1999C83.2002 64.8526 64.8528 83.1999 42.2002 83.1999C19.5476 83.1999 1.2002 64.8526 1.2002 42.1999C1.2002 19.5752 19.5195 1.22738 42.1187 1.19995ZM42.1205 3.19995C20.6264 3.22636 3.2002 20.6778 3.2002 42.1999C3.2002 63.748 20.6521 81.1999 42.2002 81.1999C63.7482 81.1999 81.2002 63.748 81.2002 42.1999C81.2002 21.0212 64.3285 3.781 43.2837 3.2267C43.0706 3.22641 42.8668 3.21938 42.681 3.21297L42.6741 3.21274C42.4779 3.20597 42.301 3.19997 42.1205 3.19995Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M68.0979 42.2001C68.0979 42.5434 67.9218 42.8627 67.6314 43.0459L42.7337 58.7489C42.4077 58.9544 41.9927 58.9544 41.6667 58.7489L16.769 43.0459C16.4786 42.8628 16.3025 42.5434 16.3025 42.2001C16.3025 41.8567 16.4786 41.5374 16.769 41.3543L41.6667 25.6513C41.9927 25.4457 42.4077 25.4457 42.7337 25.6513L67.6314 41.3543C67.9218 41.5374 68.0979 41.8567 68.0979 42.2001ZM42.2002 27.6794L19.177 42.2001L42.2002 56.7208L65.2234 42.2001L42.2002 27.6794Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M66.1803 49.8738C66.5224 50.2245 66.5601 50.7714 66.2693 51.1656L43.005 82.7131C42.8165 82.9687 42.5178 83.1196 42.2002 83.1196C41.8826 83.1196 41.5838 82.9687 41.3953 82.7131L18.1311 51.1656C17.8403 50.7714 17.878 50.2245 18.2201 49.8739C18.5621 49.5232 19.1079 49.4719 19.5092 49.7528L42.2002 65.6307L64.8912 49.7528C65.2925 49.4719 65.8383 49.5232 66.1803 49.8738ZM61.0375 54.8904L42.7735 67.6705C42.4292 67.9114 41.9711 67.9114 41.6268 67.6705L23.3628 54.8904L42.2002 80.4347L61.0375 54.8904Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M42.2002 1.28039C42.5439 1.28039 42.8635 1.45687 43.0465 1.74773L68.1713 41.6673L66.4786 42.7326L42.2002 4.15775L17.9218 42.7327L16.2291 41.6673L41.3539 1.74773C41.5369 1.45687 41.8565 1.28039 42.2002 1.28039Z" fill="#00AE99"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/extensibleArchitecture.svg b/packages/website/ts/@next/icons/illustrations/extensibleArchitecture.svg
new file mode 100755
index 000000000..7674b3289
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/extensibleArchitecture.svg
@@ -0,0 +1,11 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M45.0089 45.022L80.128 45.022L80.128 68.6648L68.5 68.6648" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M44.9968 45.0043L69.8295 69.837L53.1116 86.5548L44.9968 78.4399" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M45 44.9999V80.119H21.3572V69" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M44.9932 44.9767L20.1605 69.8094L3.44264 53.0916L11.5575 44.9767" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M45.0066 44.9802L9.88753 44.9802L9.88753 21.3373L21 21.3373" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M45.0057 44.9928L20.173 20.1601L36.8908 3.44228L45.0057 11.5571" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M45.0133 44.9977L45.0133 9.87867L68.6561 9.87867L68.6561 21" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M45.0249 45.006H62H78.4605L86.5754 36.8911L69.8575 20.1733L45.0249 45.006Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M45 88C68.7482 88 88 68.7482 88 45C88 21.2518 68.7482 2 45 2C21.2518 2 2 21.2518 2 45C2 68.7482 21.2518 88 45 88Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/flexibleIntegration.svg b/packages/website/ts/@next/icons/illustrations/flexibleIntegration.svg
new file mode 100755
index 000000000..dee44d4c0
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/flexibleIntegration.svg
@@ -0,0 +1,12 @@
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M75 148C115.317 148 148 115.317 148 75C148 34.6832 115.317 2 75 2C34.6832 2 2 34.6832 2 75C2 115.317 34.6832 148 75 148Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<rect x="45" y="4" width="30" height="71" rx="15" stroke="#00AE99" stroke-width="3"/>
+<rect x="45" y="4" width="30" height="30" rx="15" stroke="#00AE99" stroke-width="3"/>
+<rect x="116" y="45" width="30" height="30" rx="15" stroke="#00AE99" stroke-width="3"/>
+<rect x="75" y="116" width="30" height="30" rx="15" stroke="#00AE99" stroke-width="3"/>
+<rect x="4" y="75" width="30" height="30" rx="15" stroke="#00AE99" stroke-width="3"/>
+<rect x="75" y="75" width="30" height="71" rx="15" stroke="#00AE99" stroke-width="3"/>
+<rect x="75" y="45" width="71" height="30" rx="15" stroke="#00AE99" stroke-width="3"/>
+<rect x="4" y="75" width="71" height="30" rx="15" stroke="#00AE99" stroke-width="3"/>
+<path d="M43.5 19V60H46.5V19H43.5ZM30 73.5C22.5442 73.5 16.5 67.4558 16.5 60H13.5C13.5 69.1127 20.8873 76.5 30 76.5V73.5ZM43.5 60C43.5 67.4558 37.4558 73.5 30 73.5V76.5C39.1127 76.5 46.5 69.1127 46.5 60H43.5ZM106.5 131V90H103.5V131H106.5ZM120 76.5C127.456 76.5 133.5 82.5442 133.5 90H136.5C136.5 80.8873 129.113 73.5 120 73.5V76.5ZM120 73.5C110.887 73.5 103.5 80.8873 103.5 90H106.5C106.5 82.5442 112.544 76.5 120 76.5V73.5ZM131 43.5H90V46.5H131V43.5ZM90 43.5C82.5442 43.5 76.5 37.4558 76.5 30H73.5C73.5 39.1127 80.8873 46.5 90 46.5V43.5ZM90 13.5C80.8873 13.5 73.5 20.8873 73.5 30H76.5C76.5 22.5442 82.5442 16.5 90 16.5V13.5ZM19 106.5H60V103.5H19V106.5ZM73.5 120C73.5 127.456 67.4558 133.5 60 133.5V136.5C69.1127 136.5 76.5 129.113 76.5 120H73.5ZM60 106.5C67.4558 106.5 73.5 112.544 73.5 120H76.5C76.5 110.887 69.1127 103.5 60 103.5V106.5ZM139.099 40.8017C136.843 42.4964 134.041 43.5 131 43.5V46.5C134.713 46.5 138.143 45.2719 140.901 43.2004L139.099 40.8017ZM90 16.5H116.5V13.5H90V16.5ZM16.5 60V33H13.5V60H16.5ZM40.8008 10.8995C42.496 13.1559 43.5 15.9585 43.5 19H46.5C46.5 15.2865 45.2714 11.8556 43.1992 9.09752L40.8008 10.8995ZM19 103.5C15.2865 103.5 11.8556 104.729 9.09752 106.801L10.8995 109.199C13.1559 107.504 15.9585 106.5 19 106.5V103.5ZM60 133.5H33V136.5H60V133.5ZM109.199 139.1C107.504 136.844 106.5 134.041 106.5 131H103.5C103.5 134.714 104.729 138.144 106.801 140.902L109.199 139.1ZM133.5 90V116.5H136.5V90H133.5Z" fill="#00AE99"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/flexibleIntegration0xInstant.svg b/packages/website/ts/@next/icons/illustrations/flexibleIntegration0xInstant.svg
new file mode 100755
index 000000000..bb5116b8b
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/flexibleIntegration0xInstant.svg
@@ -0,0 +1,17 @@
+<svg width="250" height="250" viewBox="0 0 250 250" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M125 247C192.379 247 247 192.379 247 125C247 57.6213 192.379 3 125 3C57.6213 3 3 57.6213 3 125C3 192.379 57.6213 247 125 247Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M125 2V49.5839C125 63.4281 113.777 74.651 99.9329 74.651V74.651C86.0887 74.651 74.8658 63.4281 74.8658 49.5839V13" stroke="#00AE99" stroke-width="3"/>
+<rect x="25" y="75" width="50.1342" height="50.1342" rx="25.0671" stroke="#00AE99" stroke-width="3"/>
+<rect x="125" y="25" width="50.1342" height="50.1342" rx="25.0671" stroke="#00AE99" stroke-width="3"/>
+<rect x="108" y="88" width="34" height="34" rx="17" stroke="#00AE99" stroke-width="3"/>
+<rect x="175" y="125" width="50.1342" height="50.1342" rx="25.0671" stroke="#00AE99" stroke-width="3"/>
+<rect x="75" y="175" width="50.1342" height="50.1342" rx="25.0671" stroke="#00AE99" stroke-width="3"/>
+<path d="M125 248V200.067C125 186.223 136.223 175 150.067 175V175C163.911 175 175.134 186.223 175.134 200.067V236.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M246.5 125H200.067C186.223 125 175 113.777 175 99.9328V99.9328C175 86.0886 186.223 74.8657 200.067 74.8657H235.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M200 73.5001H150V76.5001H200V73.5001ZM150 73.5001C137.021 73.5001 126.5 62.9788 126.5 50.0001H123.5C123.5 64.6356 135.364 76.5001 150 76.5001V73.5001ZM150 23.5001C135.364 23.5001 123.5 35.3645 123.5 50.0001H126.5C126.5 37.0214 137.021 26.5001 150 26.5001V23.5001ZM223.12 54.2318C221.128 65.1907 211.533 73.5001 200 73.5001V76.5001C213.009 76.5001 223.825 67.1282 226.072 54.7682L223.12 54.2318ZM150 26.5001H195V23.5001H150V26.5001Z" fill="#00AE99"/>
+<path d="M3 125H49.5839C63.4281 125 74.651 136.223 74.651 150.067V150.067C74.651 163.911 63.4281 175.134 49.5839 175.134H14" stroke="#00AE99" stroke-width="3"/>
+<path d="M73.5 50V100H76.5V50H73.5ZM50 123.5C37.0213 123.5 26.5 112.979 26.5 100H23.5C23.5 114.636 35.3645 126.5 50 126.5V123.5ZM73.5 100C73.5 112.979 62.9787 123.5 50 123.5V126.5C64.6355 126.5 76.5 114.636 76.5 100H73.5ZM223.5 150V194H226.5V150H223.5ZM176.5 200V150H173.5V200H176.5ZM200 126.5C212.979 126.5 223.5 137.021 223.5 150H226.5C226.5 135.364 214.636 123.5 200 123.5V126.5ZM200 123.5C185.364 123.5 173.5 135.364 173.5 150H176.5C176.5 137.021 187.021 126.5 200 126.5V123.5ZM50 176.5H100V173.5H50V176.5ZM123.5 200C123.5 212.979 112.979 223.5 100 223.5V226.5C114.636 226.5 126.5 214.636 126.5 200H123.5ZM100 176.5C112.979 176.5 123.5 187.021 123.5 200H126.5C126.5 185.364 114.636 173.5 100 173.5V176.5ZM54.7016 26.9701C65.4275 29.1474 73.5 38.6326 73.5 50H76.5C76.5 37.1778 67.3949 26.4855 55.2984 24.0301L54.7016 26.9701ZM26.5 100V55H23.5V100H26.5ZM100 223.5H55V226.5H100V223.5ZM50 173.5C37.1778 173.5 26.4855 182.605 24.0301 194.702L26.9701 195.298C29.1474 184.572 38.6326 176.5 50 176.5V173.5ZM195.768 223.12C184.809 221.128 176.5 211.533 176.5 200H173.5C173.5 213.009 182.872 223.825 195.232 226.072L195.768 223.12Z" fill="#00AE99"/>
+<rect x="75" y="75" width="100" height="100" stroke="#00AE99" stroke-width="3"/>
+<rect x="86" y="144" width="78" height="19" stroke="#00AE99" stroke-width="3"/>
+<path d="M88 134H162" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/flexibleOrders.svg b/packages/website/ts/@next/icons/illustrations/flexibleOrders.svg
new file mode 100755
index 000000000..f4545ae38
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/flexibleOrders.svg
@@ -0,0 +1,4 @@
+<svg width="91" height="90" viewBox="0 0 91 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 45C2 68.7579 21.2421 88 45 88C68.7579 88 88 68.7579 88 45C88 21.6448 69.3906 2.63278 46.1793 2.02876C45.7478 2.02876 45.3452 2 44.9137 2C21.2134 2.02876 2 21.2709 2 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M67.7548 20.2253V59.6647C67.7548 65.8083 62.7745 70.7886 56.6309 70.7886V70.7886C50.4873 70.7886 45.507 65.8083 45.507 59.6647V31.3492C45.507 25.2057 40.5266 20.2253 34.383 20.2253V20.2253C28.2395 20.2253 23.2591 25.2057 23.2591 31.3492V70.7886M67.7548 20.2253L60.676 27.3042M67.7548 20.2253L74.8337 27.3042M23.2591 70.7886L15.6746 63.2041M23.2591 70.7886L30.8436 63.2041" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/gamingAndCollectibles.svg b/packages/website/ts/@next/icons/illustrations/gamingAndCollectibles.svg
new file mode 100755
index 000000000..c66af5088
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/gamingAndCollectibles.svg
@@ -0,0 +1,18 @@
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="116" cy="34" r="32" stroke="#00AE99" stroke-width="3"/>
+<circle cx="116" cy="34" r="14" stroke="#00AE99" stroke-width="3"/>
+<path d="M116 5L121.216 17.9481L133.046 10.5385L129.655 24.0794L143.581 25.0385L132.878 34L143.581 42.9615L129.655 43.9206L133.046 57.4615L121.216 50.0519L116 63L110.784 50.0519L98.9542 57.4615L102.345 43.9206L88.4194 42.9615L99.122 34L88.4194 25.0385L102.345 24.0794L98.9542 10.5385L110.784 17.9481L116 5Z" stroke="#00AE99" stroke-width="3"/>
+<circle cx="34" cy="34" r="32" stroke="#00AE99" stroke-width="3"/>
+<path d="M66 34H45M2 34H23" stroke="#00AE99" stroke-width="3"/>
+<circle cx="34" cy="34" r="11" stroke="#00AE99" stroke-width="3"/>
+<circle cx="34" cy="34" r="4" stroke="#00AE99" stroke-width="3"/>
+<circle cx="116" cy="116" r="32" stroke="#00AE99" stroke-width="3"/>
+<circle cx="116" cy="116" r="6" stroke="#00AE99" stroke-width="3"/>
+<path d="M103 114C103 110.686 100.314 108 97 108C93.6863 108 91 110.686 91 114" stroke="#00AE99" stroke-width="3"/>
+<path d="M141 114C141 110.686 138.314 108 135 108C131.686 108 129 110.686 129 114" stroke="#00AE99" stroke-width="3"/>
+<path d="M116 122V125C116 128.866 112.866 132 109 132V132C105.134 132 102 128.866 102 125V124" stroke="#00AE99" stroke-width="3"/>
+<path d="M123 133V134C123 137.866 119.866 141 116 141V141C112.134 141 109 137.866 109 134V133" stroke="#00AE99" stroke-width="3"/>
+<path d="M116 122V125C116 128.866 119.134 132 123 132V132C126.866 132 130 128.866 130 125V124" stroke="#00AE99" stroke-width="3"/>
+<circle cx="34" cy="116" r="32" stroke="#00AE99" stroke-width="3"/>
+<path d="M33.5556 142L7 113.1M33.5556 142L61 113.1M33.5556 142L22 113.1M33.5556 142L46.4444 113.1M7 113.1L16.8889 98H33.5556M7 113.1H22M61 113.1L51.1111 98H33.5556M61 113.1H46.4444M22 113.1H46.4444M22 113.1L33.5556 98M46.4444 113.1L33.5556 98" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/generateRevenueForYourBusiness-large.svg b/packages/website/ts/@next/icons/illustrations/generateRevenueForYourBusiness-large.svg
new file mode 100755
index 000000000..681b8c41e
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/generateRevenueForYourBusiness-large.svg
@@ -0,0 +1,28 @@
+<svg width="250" height="250" viewBox="0 0 250 250" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M177.423 216C176.501 218.606 176 221.411 176 224.333C176 227.953 176.769 231.394 178.154 234.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M177.423 199.333C176.501 201.94 176 204.745 176 207.667C176 216.712 180.804 224.636 188 229.025" stroke="#00AE99" stroke-width="3"/>
+<path d="M224.577 182.667C225.499 185.273 226 188.078 226 191C226 191.504 225.985 192.004 225.956 192.5M177.423 182.667C176.501 185.273 176 188.078 176 191C176 204.807 187.193 216 201 216C202.712 216 204.384 215.828 206 215.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M224.577 166C225.499 168.606 226 171.411 226 174.333C226 188.14 214.807 199.333 201 199.333C187.193 199.333 176 188.14 176 174.333C176 171.411 176.501 168.606 177.423 166" stroke="#00AE99" stroke-width="3"/>
+<path d="M224.577 149.333C225.499 151.94 226 154.745 226 157.667C226 171.474 214.807 182.667 201 182.667C187.193 182.667 176 171.474 176 157.667C176 154.745 176.501 151.94 177.423 149.333" stroke="#00AE99" stroke-width="3"/>
+<path d="M224.577 132.667C225.499 135.273 226 138.078 226 141C226 154.807 214.807 166 201 166C187.193 166 176 154.807 176 141C176 138.078 176.501 135.273 177.423 132.667" stroke="#00AE99" stroke-width="3"/>
+<path d="M224.577 116C225.499 118.606 226 121.411 226 124.333C226 138.14 214.807 149.333 201 149.333C187.193 149.333 176 138.14 176 124.333C176 121.411 176.501 118.606 177.423 116" stroke="#00AE99" stroke-width="3"/>
+<path d="M224.577 99.3333C225.499 101.94 226 104.745 226 107.667C226 121.474 214.807 132.667 201 132.667C187.193 132.667 176 121.474 176 107.667C176 104.745 176.501 101.94 177.423 99.3333" stroke="#00AE99" stroke-width="3"/>
+<ellipse cx="201" cy="91" rx="25" ry="25" stroke="#00AE99" stroke-width="3"/>
+<path d="M193.5 101V102.5H195H207H208.5V101V97.2266V95.7266H207H204.551V80V78.5H203.051H199.253H198.762L198.366 78.7901L194.113 81.9073L193.5 82.3568V83.1172V87.6563V90.6153L195.887 88.8661L197.753 87.4982V95.7266H195H193.5V97.2266V101Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M148.577 216.667C149.499 219.273 150 222.078 150 225C150 233.805 145.449 241.546 138.57 246M101.423 216.667C100.501 219.273 100 222.078 100 225C100 233.805 104.551 241.546 111.43 246" stroke="#00AE99" stroke-width="3"/>
+<path d="M148.577 234.667C149.499 237.273 150 240.078 150 243C150 243.335 149.993 243.668 149.98 244M101.423 234.667C100.501 237.273 100 240.078 100 243C100 243.335 100.007 243.668 100.02 244" stroke="#00AE99" stroke-width="3"/>
+<path d="M148.577 200C149.499 202.606 150 205.411 150 208.333C150 222.14 138.807 233.333 125 233.333C111.193 233.333 100 222.14 100 208.333C100 205.411 100.501 202.606 101.423 200" stroke="#00AE99" stroke-width="3"/>
+<path d="M148.577 183.333C149.499 185.94 150 188.745 150 191.667C150 205.474 138.807 216.667 125 216.667C111.193 216.667 100 205.474 100 191.667C100 188.745 100.501 185.94 101.423 183.333" stroke="#00AE99" stroke-width="3"/>
+<path d="M148.577 166.667C149.499 169.273 150 172.078 150 175C150 188.807 138.807 200 125 200C111.193 200 100 188.807 100 175C100 172.078 100.501 169.273 101.423 166.667" stroke="#00AE99" stroke-width="3"/>
+<path d="M148.577 150C149.499 152.606 150 155.411 150 158.333C150 172.14 138.807 183.333 125 183.333C111.193 183.333 100 172.14 100 158.333C100 155.411 100.501 152.606 101.423 150" stroke="#00AE99" stroke-width="3"/>
+<path d="M148.577 133.333C149.499 135.94 150 138.745 150 141.667C150 155.474 138.807 166.667 125 166.667C111.193 166.667 100 155.474 100 141.667C100 138.745 100.501 135.94 101.423 133.333" stroke="#00AE99" stroke-width="3"/>
+<circle cx="125" cy="125" r="25" stroke="#00AE99" stroke-width="3"/>
+<path d="M117.5 135V136.5H119H131H132.5V135V131.227V129.727H131H128.551V114V112.5H127.051H123.253H122.762L122.366 112.79L118.113 115.907L117.5 116.357V117.117V121.656V124.615L119.887 122.866L121.753 121.498V129.727H119H117.5V131.227V135Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M71.5775 216.333C72.4987 218.94 73 221.745 73 224.667C73 227.966 72.3608 231.116 71.1996 234" stroke="#00AE99" stroke-width="3"/>
+<path d="M71.5774 199.667C72.4987 202.273 73 205.078 73 208C73 216.834 68.4176 224.599 61.5 229.045" stroke="#00AE99" stroke-width="3"/>
+<path d="M23 191.333C23 188.411 23.5013 185.606 24.4225 183M71.5774 183C72.4987 185.606 73 188.411 73 191.333C73 205.14 61.8071 216.333 48 216.333C46.8122 216.333 45.6437 216.25 44.5 216.09" stroke="#00AE99" stroke-width="3"/>
+<path d="M71.5774 166.333C72.4987 168.94 73 171.745 73 174.667C73 188.474 61.8071 199.667 48 199.667C34.1929 199.667 23 188.474 23 174.667C23 171.745 23.5013 168.94 24.4225 166.333" stroke="#00AE99" stroke-width="3"/>
+<ellipse cx="48" cy="158" rx="25" ry="25" stroke="#00AE99" stroke-width="3"/>
+<path d="M40.5 168V169.5H42H54H55.5V168V164.227V162.727H54H51.5506V147V145.5H50.0506H46.2532H45.7623L45.3665 145.79L41.1133 148.907L40.5 149.357V150.117V154.656V157.615L42.8867 155.866L44.7532 154.498V162.727H42H40.5V164.227V168Z" stroke="#00AE99" stroke-width="3"/>
+<circle cx="125" cy="125" r="121.667" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/getInTouch.svg b/packages/website/ts/@next/icons/illustrations/getInTouch.svg
new file mode 100755
index 000000000..f44365351
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/getInTouch.svg
@@ -0,0 +1,13 @@
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="75" cy="75" r="73" stroke="#00AE99" stroke-width="3"/>
+<path d="M113 75C113 85.3064 108.897 94.6546 102.235 101.5C98.4048 105.436 71 132.5 71 132.5V112.792C51.8933 110.793 37 94.6359 37 75C37 54.0132 54.0132 37 75 37C95.9868 37 113 54.0132 113 75Z" stroke="#00AE99" stroke-width="3"/>
+<circle cx="75" cy="75" r="4" stroke="#00AE99" stroke-width="3"/>
+<circle cx="91" cy="75" r="4" stroke="#00AE99" stroke-width="3"/>
+<circle cx="59" cy="75" r="4" stroke="#00AE99" stroke-width="3"/>
+<path d="M76 37H137.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M37 73.5L37 12M113 137.5L113 75" stroke="#00AE99" stroke-width="3"/>
+<path d="M13 113H71.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M49.087 47.5264L92.574 4.03932" stroke="#00AE99" stroke-width="3"/>
+<path d="M47.3192 100.913L3.8321 57.4259M146.314 92.4277L102.12 48.2335" stroke="#00AE99" stroke-width="3"/>
+<path d="M58.2793 145.814L101.766 102.327" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/getStarted.svg b/packages/website/ts/@next/icons/illustrations/getStarted.svg
new file mode 100644
index 000000000..627e1810b
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/getStarted.svg
@@ -0,0 +1,13 @@
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g>
+<circle cx="75" cy="75" r="73" stroke="#00AE99" stroke-width="3"/>
+<circle cx="75" cy="75" r="58" stroke="#00AE99" stroke-width="3"/>
+<path d="M62.9792 62.9792L36.6447 113.355L87.0208 87.0208M62.9792 62.9792L113.355 36.6447L87.0208 87.0208M62.9792 62.9792L87.0208 87.0208" stroke="#00AE99" stroke-width="3"/>
+<path d="M75 2V17M75 133V148" stroke="#00AE99" stroke-width="3"/>
+<path d="M2 75L17 75M133 75L148 75" stroke="#00AE99" stroke-width="3"/>
+<path d="M11.7801 38.5L24.7705 46M125.229 104L138.22 111.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M38.5001 11.7801L46.0001 24.7705M104 125.229L111.5 138.22" stroke="#00AE99" stroke-width="3"/>
+<path d="M111.5 11.7801L104 24.7705M46 125.229L38.5 138.22" stroke="#00AE99" stroke-width="3"/>
+<path d="M138.22 38.5L125.229 46M24.7705 104L11.7801 111.5" stroke="#00AE99" stroke-width="3"/>
+</g>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/launchKit.svg b/packages/website/ts/@next/icons/illustrations/launchKit.svg
new file mode 100644
index 000000000..fa11584af
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/launchKit.svg
@@ -0,0 +1,18 @@
+<svg width="404" height="404" viewBox="0 0 404 404" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="202" cy="202" r="200" stroke="#00AE99" stroke-width="3"/>
+<rect x="61" y="251" width="39" height="92" rx="19.5" stroke="#00AE99" stroke-width="3"/>
+<rect x="100" y="251" width="39" height="92" rx="19.5" stroke="#00AE99" stroke-width="3"/>
+<rect x="139" y="251" width="39" height="92" rx="19.5" stroke="#00AE99" stroke-width="3"/>
+<rect x="61" y="251" width="39" height="39" rx="19.5" stroke="#00AE99" stroke-width="3"/>
+<rect x="100" y="251" width="39" height="39" rx="19.5" stroke="#00AE99" stroke-width="3"/>
+<rect x="139" y="304" width="39" height="39" rx="19.5" stroke="#00AE99" stroke-width="3"/>
+<rect x="178" y="304" width="39" height="39" rx="19.5" stroke="#00AE99" stroke-width="3"/>
+<rect x="178" y="251" width="39" height="92" rx="19.5" stroke="#00AE99" stroke-width="3"/>
+<circle cx="100" cy="212" r="39" stroke="#00AE99" stroke-width="3"/>
+<circle cx="178" cy="212" r="39" stroke="#00AE99" stroke-width="3"/>
+<rect x="61" y="79" width="156" height="94" stroke="#00AE99" stroke-width="3"/>
+<rect width="39" height="18" transform="matrix(1 0 0 -1 84 79)" stroke="#00AE99" stroke-width="3"/>
+<rect width="39" height="18" transform="matrix(1 0 0 -1 155 79)" stroke="#00AE99" stroke-width="3"/>
+<path d="M217 94V61H250M217 94L250 61M217 94H250V61M217 94V241.125M250 61H333M333 61H343V251H217V241.125M333 61V241.125H217" stroke="#00AE99" stroke-width="3"/>
+<path d="M275.825 252L218 343H341L275.825 252Z" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/launchKit_versionB.svg b/packages/website/ts/@next/icons/illustrations/launchKit_versionB.svg
new file mode 100755
index 000000000..45f9ecc75
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/launchKit_versionB.svg
@@ -0,0 +1,7 @@
+<svg width="404" height="404" viewBox="0 0 404 404" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="202" cy="202" r="200" stroke="#00AE99" stroke-width="3"/>
+<path d="M111.093 201.667L201.622 292.195M111.093 201.667L24.7433 115.316L115.098 24.6137L188.958 98.4738M111.093 201.667L24.7432 288.017L114.053 379.764L201.622 292.195M111.093 201.667L167.107 145.653M292.151 201.667L201.622 292.195M292.151 201.667L379.546 289.062L289.191 379.764L201.622 292.195M292.151 201.667L380.59 113.227L290.236 22.5243L214.983 97.7774M292.151 201.667L236.137 145.653M201.622 292.195L201.622 400.137M201.622 400.137L254.81 346.95M201.622 400.137L148.435 346.95" stroke="#00AE99" stroke-width="3"/>
+<path d="M202 85L262 145H142L202 85Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M202 146L262 205H142L202 146Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M245 249L202 206L159 249" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/legalResources.svg b/packages/website/ts/@next/icons/illustrations/legalResources.svg
new file mode 100755
index 000000000..a8ba7fceb
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/legalResources.svg
@@ -0,0 +1,4 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2.00001 45C2.00001 68.7578 21.2421 88 45 88C68.7579 88 88 68.7578 88 45C88 21.6448 69.3906 2.63278 46.1793 2.02876C45.7478 2.02876 45.3452 2 44.9137 2C21.2134 2.02876 2.00001 21.2709 2.00001 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M45 76V11M45 76H15H75H45ZM45 11H24M45 11H66M24 11L4 47M24 11L44 47M66 11L46 47M66 11L86 47M4 47H44M4 47C4 47 4 65 24 65C44 65 44 47 44 47M46 47H86M46 47C46 47 46 65 66 65C85.25 65 86 47 86 47" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/logo-outlined.svg b/packages/website/ts/@next/icons/illustrations/logo-outlined.svg
new file mode 100644
index 000000000..a09d2355f
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/logo-outlined.svg
@@ -0,0 +1,14 @@
+<svg width="400" height="406" viewBox="0 0 400 406" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="400" height="406">
+<ellipse cx="200" cy="202.967" rx="200" ry="202.744" fill="#C4C4C4"/>
+</mask>
+<g mask="url(#mask0)">
+<path d="M162.629 260.116L161.587 258.71L159.447 260.297L161.753 261.631L162.629 260.116ZM193.062 269.329L192.945 271.075L192.953 271.076L193.062 269.329ZM234.92 258.634L235.854 260.113L235.86 260.109L234.92 258.634ZM250.83 244.761L252.163 245.895L253.051 244.85L252.25 243.738L250.83 244.761ZM238.764 228.665L240.146 227.592L240.141 227.585L240.135 227.578L238.764 228.665ZM235.24 224.217L236.612 223.13L235.079 221.196L233.761 223.282L235.24 224.217ZM216.446 240.631L215.231 241.89L216.098 242.727L217.189 242.216L216.446 240.631ZM204.487 229.088L205.702 227.829L204.636 226.8L203.445 227.682L204.487 229.088ZM137.215 166.291L138.602 165.224L137.006 163.149L135.699 165.418L137.215 166.291ZM128.139 196.154L126.393 196.035L126.392 196.044L128.139 196.154ZM138.924 237.666L137.455 238.618H137.455L138.924 237.666ZM152.912 253.445L151.79 254.787L152.824 255.652L153.924 254.873L152.912 253.445ZM169.143 241.478L170.204 242.87L170.211 242.864L170.218 242.859L169.143 241.478ZM173.628 237.984L174.703 239.364L176.66 237.839L174.567 236.507L173.628 237.984ZM157.077 219.24L155.833 218.008L154.968 218.882L155.497 219.992L157.077 219.24ZM168.822 207.379L170.066 208.611L171.142 207.524L170.209 206.312L168.822 207.379ZM232.57 140.982L233.582 142.41L235.808 140.833L233.447 139.467L232.57 140.982ZM202.138 131.769L202.018 133.515L202.021 133.515L202.138 131.769ZM160.173 142.464L161.114 143.94L161.117 143.938L160.173 142.464ZM144.263 156.337L142.93 155.203L142.042 156.248L142.843 157.36L144.263 156.337ZM156.329 172.433L154.946 173.506L154.952 173.513L154.957 173.52L156.329 172.433ZM159.853 176.881L158.481 177.968L159.996 179.88L161.322 177.832L159.853 176.881ZM178.753 160.467L179.961 159.201L179.1 158.379L178.019 158.878L178.753 160.467ZM189.965 171.163L188.757 172.429L189.8 173.424L190.976 172.591L189.965 171.163ZM258.091 234.489L256.699 235.55L258.301 237.651L259.611 235.357L258.091 234.489ZM267.06 204.944L268.806 205.065L268.807 205.054L267.06 204.944ZM256.276 163.432L257.748 162.486L257.744 162.48L256.276 163.432ZM242.287 147.653L243.41 146.311L242.376 145.446L241.276 146.225L242.287 147.653ZM226.057 159.62L224.995 158.228L224.988 158.234L224.981 158.239L226.057 159.62ZM221.572 163.114L220.496 161.734L218.526 163.27L220.642 164.597L221.572 163.114ZM238.23 181.858L236.65 182.61L236.658 182.628L236.667 182.646L238.23 181.858ZM238.336 182.07L239.592 183.289L240.46 182.395L239.899 181.282L238.336 182.07ZM227.018 193.719L225.763 192.499L224.712 193.58L225.626 194.779L227.018 193.719ZM161.753 261.631C170.951 266.952 181.568 270.316 192.945 271.075L193.178 267.583C182.345 266.86 172.246 263.658 163.505 258.601L161.753 261.631ZM192.953 271.076C208.709 272.053 223.488 267.928 235.854 260.113L233.985 257.154C222.219 264.589 208.167 268.512 193.17 267.583L192.953 271.076ZM235.86 260.109C241.988 256.203 247.459 251.428 252.163 245.895L249.497 243.628C245.018 248.896 239.811 253.44 233.979 257.158L235.86 260.109ZM252.25 243.738C248.498 238.53 244.428 233.112 240.146 227.592L237.381 229.737C241.642 235.231 245.687 240.615 249.41 245.784L252.25 243.738ZM240.135 227.578C239.548 226.837 238.961 226.095 238.373 225.354C237.786 224.613 237.199 223.872 236.612 223.13L233.868 225.304C234.455 226.045 235.043 226.786 235.63 227.528C236.217 228.269 236.805 229.01 237.392 229.751L240.135 227.578ZM233.761 223.282C229.462 230.082 223.103 235.581 215.704 239.046L217.189 242.216C225.166 238.48 232.048 232.542 236.719 225.152L233.761 223.282ZM217.662 239.372L205.702 227.829L203.272 230.347L215.231 241.89L217.662 239.372ZM203.445 227.682L161.587 258.71L163.671 261.522L205.529 230.494L203.445 227.682ZM135.699 165.418C130.444 174.538 127.159 184.855 126.393 196.035L129.885 196.274C130.614 185.639 133.736 175.836 138.732 167.165L135.699 165.418ZM126.392 196.044C125.407 211.676 129.568 226.449 137.455 238.618L140.392 236.714C132.904 225.162 128.949 211.131 129.886 196.264L126.392 196.044ZM137.455 238.618C141.395 244.696 146.211 250.122 151.79 254.787L154.035 252.102C148.722 247.66 144.14 242.496 140.392 236.714L137.455 238.618ZM153.924 254.873C159.176 251.152 164.638 247.116 170.204 242.87L168.081 240.087C162.542 244.313 157.113 248.324 151.901 252.017L153.924 254.873ZM170.218 242.859C171.713 241.694 173.208 240.529 174.703 239.364L172.552 236.603C171.057 237.768 169.562 238.933 168.067 240.098L170.218 242.859ZM174.567 236.507C167.693 232.132 162.147 225.819 158.657 218.488L155.497 219.992C159.267 227.91 165.253 234.728 172.688 239.46L174.567 236.507ZM158.32 220.471L170.066 208.611L167.579 206.148L155.833 218.008L158.32 220.471ZM170.209 206.312L138.602 165.224L135.828 167.358L167.435 208.446L170.209 206.312ZM233.447 139.467C224.248 134.146 213.631 130.782 202.254 130.023L202.021 133.515C212.855 134.238 222.953 137.44 231.694 142.497L233.447 139.467ZM202.258 130.023C186.496 128.937 171.602 133.064 159.229 140.991L161.117 143.938C172.876 136.404 187.027 132.482 202.018 133.515L202.258 130.023ZM159.232 140.989C153.105 144.895 147.634 149.67 142.93 155.203L145.596 157.47C150.075 152.202 155.282 147.658 161.114 143.94L159.232 140.989ZM142.843 157.36C146.594 162.568 150.665 167.986 154.946 173.506L157.712 171.361C153.451 165.867 149.406 160.483 145.683 155.314L142.843 157.36ZM154.957 173.52C155.545 174.261 156.132 175.003 156.719 175.744C157.307 176.485 157.894 177.226 158.481 177.968L161.225 175.794C160.637 175.053 160.05 174.312 159.463 173.57C158.875 172.829 158.288 172.088 157.701 171.347L154.957 173.52ZM161.322 177.832C165.736 171.011 171.997 165.515 179.487 162.056L178.019 158.878C169.919 162.619 163.152 168.561 158.384 175.93L161.322 177.832ZM177.545 161.733L188.757 172.429L191.173 169.896L179.961 159.201L177.545 161.733ZM190.976 172.591L233.582 142.41L231.559 139.554L188.953 169.735L190.976 172.591ZM259.611 235.357C264.754 226.349 268.04 216.141 268.806 205.065L265.315 204.823C264.586 215.35 261.465 225.05 256.571 233.621L259.611 235.357ZM268.807 205.054C269.792 189.418 265.63 174.754 257.748 162.486L254.803 164.378C262.298 176.043 266.251 189.971 265.314 204.834L268.807 205.054ZM257.744 162.48C253.804 156.402 248.989 150.976 243.41 146.311L241.165 148.996C246.478 153.438 251.059 158.602 254.807 164.384L257.744 162.48ZM241.276 146.225C236.024 149.946 230.561 153.982 224.995 158.228L227.118 161.011C232.657 156.785 238.086 152.774 243.299 149.081L241.276 146.225ZM224.981 158.239C224.234 158.822 223.486 159.404 222.739 159.987C221.991 160.569 221.244 161.151 220.496 161.734L222.648 164.495C223.395 163.912 224.143 163.33 224.89 162.747C225.637 162.165 226.385 161.583 227.132 161L224.981 158.239ZM220.642 164.597C227.616 168.971 233.159 175.281 236.65 182.61L239.81 181.106C236.039 173.186 230.05 166.365 222.502 161.632L220.642 164.597ZM236.667 182.646L236.774 182.858L239.899 181.282L239.792 181.07L236.667 182.646ZM237.081 180.85L225.763 192.499L228.273 194.938L239.592 183.289L237.081 180.85ZM225.626 194.779L256.699 235.55L259.483 233.428L228.41 192.658L225.626 194.779Z" fill="#00AE99"/>
+<ellipse cx="60.0003" cy="200.535" rx="68" ry="68.9328" stroke="#00AE99" stroke-width="3.5"/>
+<ellipse cx="201.6" cy="61.8583" rx="68.8" ry="69.7438" stroke="#00AE99" stroke-width="3.5"/>
+<rect x="267.2" y="133.224" width="137.6" height="137.866" stroke="#00AE99" stroke-width="3.5"/>
+<rect width="99.6242" height="99.6242" transform="matrix(0.702274 -0.711907 0.702274 0.711907 271.273 342.124)" stroke="#00AE99" stroke-width="3.5"/>
+<path d="M267.2 340.833C267.2 301.418 235.248 269.467 195.834 269.467H-11.2003V412.198H195.834C235.248 412.198 267.2 380.247 267.2 340.833V340.833Z" stroke="#00AE99" stroke-width="3.5"/>
+</g>
+<path d="M398.25 202.967C398.25 313.996 309.468 403.961 200 403.961C90.532 403.961 1.75 313.996 1.75 202.967C1.75 91.939 90.532 1.97368 200 1.97368C309.468 1.97368 398.25 91.939 398.25 202.967Z" stroke="#00AE99" stroke-width="3.5"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/long-term-impact.svg b/packages/website/ts/@next/icons/illustrations/long-term-impact.svg
new file mode 100644
index 000000000..6e5478b7c
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/long-term-impact.svg
@@ -0,0 +1,9 @@
+<svg width="104" height="104" viewBox="0 0 104 104" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M52 3.5C25.2142 3.5 3.5 25.2142 3.5 52C3.5 78.7858 25.2142 100.5 52 100.5C78.7858 100.5 100.5 78.7858 100.5 52C100.5 25.2142 78.7858 3.5 52 3.5ZM0.5 52C0.5 23.5573 23.5573 0.5 52 0.5C80.4427 0.5 103.5 23.5573 103.5 52C103.5 80.4427 80.4427 103.5 52 103.5C23.5573 103.5 0.5 80.4427 0.5 52Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M51.864 13.2959C30.6011 13.2959 13.364 30.5329 13.364 51.7959C13.364 73.0589 30.6011 90.2959 51.864 90.2959C73.127 90.2959 90.364 73.0589 90.364 51.7959C90.364 30.5329 73.127 13.2959 51.864 13.2959ZM10.364 51.7959C10.364 28.8761 28.9442 10.2959 51.864 10.2959C74.7838 10.2959 93.364 28.8761 93.364 51.7959C93.364 74.7157 74.7838 93.2959 51.864 93.2959C28.9442 93.2959 10.364 74.7157 10.364 51.7959Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M36.2372 24.2815C32.0699 31.2502 29.4438 40.9744 29.4438 51.7959C29.4438 62.6173 32.0699 72.3416 36.2372 79.3103C40.4227 86.3097 45.9947 90.2959 51.8636 90.2959C57.7325 90.2959 63.3044 86.3097 67.49 79.3103C71.6573 72.3416 74.2833 62.6173 74.2833 51.7959C74.2833 40.9744 71.6573 31.2502 67.49 24.2815C63.3044 17.2821 57.7325 13.2959 51.8636 13.2959C45.9947 13.2959 40.4227 17.2821 36.2372 24.2815ZM33.6624 22.7418C38.1341 15.264 44.5219 10.2959 51.8636 10.2959C59.2052 10.2959 65.5931 15.264 70.0648 22.7418C74.5548 30.2502 77.2833 40.526 77.2833 51.7959C77.2833 63.0658 74.5548 73.3416 70.0648 80.85C65.5931 88.3278 59.2052 93.2959 51.8636 93.2959C44.5219 93.2959 38.1341 88.3278 33.6624 80.85C29.1724 73.3416 26.4438 63.0658 26.4438 51.7959C26.4438 40.526 29.1724 30.2502 33.6624 22.7418Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M50.364 91.7959V11.7959H53.364V91.7959H50.364Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M11.864 50.2959H91.864V53.2959H11.864V50.2959Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.1084 70.2825H86.6201V73.2825H17.1084V70.2825Z" fill="#00AE99"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.1084 30.2822H86.6201V33.2822H17.1084V30.2822Z" fill="#00AE99"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/marketingDesignHelp.svg b/packages/website/ts/@next/icons/illustrations/marketingDesignHelp.svg
new file mode 100755
index 000000000..1e65bd54f
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/marketingDesignHelp.svg
@@ -0,0 +1,11 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M45 88C68.7482 88 88 68.7482 88 45C88 21.2518 68.7482 2 45 2C21.2518 2 2 21.2518 2 45C2 68.7482 21.2518 88 45 88Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M70.2962 31.8956L57.4583 19.3541L44.833 32.1066L57.6708 44.6481L70.2962 31.8956Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M74.8267 14.5717L57.4829 19.3431L70.311 31.8859L74.8267 14.5717Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M32.184 19.5506L19.5587 32.3031L32.3965 44.8446L45.0218 32.092L32.184 19.5506Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M14.7418 15.0572L19.5451 32.2858L32.1719 19.5429L14.7418 15.0572Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M19.698 57.5441L32.5358 70.0856L45.1612 57.3331L32.3234 44.7916L19.698 57.5441Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M15.1732 74.8574L32.517 70.086L19.6889 57.5432L15.1732 74.8574Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M57.8243 69.8803L70.4497 57.1277L57.6119 44.5863L44.9865 57.3388L57.8243 69.8803Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+<path d="M75.2581 74.3715L70.4548 57.1429L57.828 69.8857L75.2581 74.3715Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="bevel"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/milestoneGrants.svg b/packages/website/ts/@next/icons/illustrations/milestoneGrants.svg
new file mode 100755
index 000000000..2c581864f
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/milestoneGrants.svg
@@ -0,0 +1,7 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 45C2 68.7578 21.2421 88 45 88C68.7579 88 88 68.7578 88 45C88 21.6448 69.3906 2.63278 46.1793 2.02876C45.7478 2.02876 45.3452 2 44.9137 2C21.2134 2.02876 2 21.2709 2 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M86.5 55.5L45 14L3.5 55.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M45 14C41.1667 18.8333 35.8 30.8 45 40C56.5 51.5 52 59.5 45 67C38.5223 73.9404 40.1798 83.4498 44.0292 88" stroke="#00AE99" stroke-width="3"/>
+<path d="M78 73L45 40L12 73" stroke="#00AE99" stroke-width="3"/>
+<path d="M62.5 84.5L45 67L27.5 84.5" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/networkedLiquidity-small.svg b/packages/website/ts/@next/icons/illustrations/networkedLiquidity-small.svg
new file mode 100755
index 000000000..4b65a5353
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/networkedLiquidity-small.svg
@@ -0,0 +1,20 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M39 8.48029C33.2192 9.42014 27.8875 11.702 23.335 14.9961M50.9349 8.48029C56.7423 9.41185 62.0964 11.6963 66.6651 15M75 23.3344C78.2924 27.8864 80.574 33.2182 81.5163 39M81.5163 51.0017C80.574 56.7845 78.2925 62.1161 75 66.6678M66.6651 75.002C62.0964 78.306 56.7423 80.5917 50.9349 81.5271M39 81.5165C33.2177 80.5746 27.8865 78.2936 23.335 75.002M15 66.6678C11.7076 62.1161 9.42602 56.7845 8.48376 51.0017M8.48376 39.0004C9.42608 33.2186 11.7078 27.8868 14.9996 23.3344" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M42.163 47.837C40.6123 46.2863 40.6123 43.7489 42.163 42.163C43.7137 40.6123 46.2511 40.6123 47.837 42.163C49.3877 43.7137 49.3877 46.2511 47.837 47.837C46.2511 49.3877 43.7137 49.3877 42.163 47.837Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M42.163 30.837C40.6123 29.2863 40.6123 26.7489 42.163 25.163C43.7137 23.6123 46.2511 23.6123 47.837 25.163C49.3877 26.7137 49.3877 29.2511 47.837 30.837C46.2511 32.3877 43.7137 32.3877 42.163 30.837Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M42.163 64.837C40.6123 63.2863 40.6123 60.7489 42.163 59.163C43.7137 57.6123 46.2511 57.6123 47.837 59.163C49.3877 60.7137 49.3877 63.2511 47.837 64.837C46.2511 66.3877 43.7137 66.3877 42.163 64.837Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M40.7445 12.2555C38.4185 9.92952 38.4185 6.12335 40.7445 3.74449C43.0705 1.4185 46.8766 1.4185 49.2555 3.74449C51.5815 6.07048 51.5815 9.87665 49.2555 12.2555C46.8766 14.5815 43.0705 14.5815 40.7445 12.2555Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M40.7445 86.2555C38.4185 83.9295 38.4185 80.1233 40.7445 77.7445C43.0705 75.4185 46.8766 75.4185 49.2555 77.7445C51.5815 80.0705 51.5815 83.8767 49.2555 86.2555C46.8766 88.5815 43.0705 88.5815 40.7445 86.2555Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M30.837 47.837C29.2863 49.3877 26.7489 49.3877 25.163 47.837C23.6123 46.2863 23.6123 43.7489 25.163 42.163C26.7137 40.6123 29.2511 40.6123 30.837 42.163C32.3877 43.7489 32.3877 46.2863 30.837 47.837Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M64.837 47.837C63.2863 49.3877 60.7489 49.3877 59.163 47.837C57.6123 46.2863 57.6123 43.7489 59.163 42.163C60.7137 40.6123 63.2511 40.6123 64.837 42.163C66.3877 43.7489 66.3877 46.2863 64.837 47.837Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M12.2555 49.2555C9.92952 51.5815 6.12335 51.5815 3.74449 49.2555C1.4185 46.9295 1.4185 43.1234 3.74449 40.7445C6.07048 38.4185 9.87665 38.4185 12.2555 40.7445C14.5815 43.1233 14.5815 46.9295 12.2555 49.2555Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M86.2555 49.2555C83.9295 51.5815 80.1233 51.5815 77.7445 49.2555C75.4185 46.9295 75.4185 43.1234 77.7445 40.7445C80.0705 38.4185 83.8767 38.4185 86.2555 40.7445C88.5815 43.1233 88.5815 46.9295 86.2555 49.2555Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M32.9792 36.9913C30.7863 36.9913 28.992 35.1971 28.9671 32.9792C28.9671 30.7862 30.7614 28.992 32.9792 28.9671C35.1722 28.9671 36.9665 30.7613 36.9914 32.9792C36.9665 35.1971 35.1722 36.9913 32.9792 36.9913Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M57.0209 61.0329C54.8279 61.0329 53.0337 59.2387 53.0087 57.0208C53.0087 54.8278 54.803 53.0336 57.0209 53.0087C59.2138 53.0087 61.0081 54.8029 61.033 57.0208C61.0081 59.2387 59.2138 61.0329 57.0209 61.0329Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M18.8371 24.8552C15.5476 24.8552 12.8563 22.1639 12.8189 18.837C12.8189 15.5476 15.5103 12.8562 18.8371 12.8188C22.1265 12.8188 24.8179 15.5102 24.8553 18.837C24.8179 22.1639 22.1265 24.8552 18.8371 24.8552Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M71.163 77.1812C67.8736 77.1812 65.1822 74.4898 65.1448 71.163C65.1448 67.8735 67.8362 65.1822 71.163 65.1448C74.4525 65.1448 77.1438 67.8361 77.1812 71.163C77.1438 74.4898 74.4525 77.1812 71.163 77.1812Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M36.9913 57.0209C36.9913 59.2138 35.197 61.0081 32.9791 61.033C30.7862 61.033 28.9919 59.2388 28.967 57.0209C28.967 54.8279 30.7612 53.0337 32.9791 53.0088C35.197 53.0337 36.9913 54.8279 36.9913 57.0209Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M61.0329 32.9793C61.0329 35.1722 59.2386 36.9665 57.0208 36.9914C54.8278 36.9914 53.0335 35.1971 53.0086 32.9793C53.0086 30.7863 54.8029 28.992 57.0208 28.9671C59.2386 28.992 61.0329 30.7863 61.0329 32.9793Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M24.8552 71.163C24.8552 74.4525 22.1639 77.1438 18.837 77.1812C15.5476 77.1812 12.8562 74.4899 12.8188 71.163C12.8188 67.8736 15.5102 65.1822 18.837 65.1448C22.1639 65.1822 24.8552 67.8736 24.8552 71.163Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M77.1812 18.8371C77.1812 22.1266 74.4898 24.8179 71.163 24.8553C67.8735 24.8553 65.1822 22.1639 65.1448 18.8371C65.1448 15.5477 67.8361 12.8563 71.163 12.8189C74.4898 12.8563 77.1812 15.5477 77.1812 18.8371Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/networkedLiquidity.svg b/packages/website/ts/@next/icons/illustrations/networkedLiquidity.svg
new file mode 100755
index 000000000..c50ba7e7c
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/networkedLiquidity.svg
@@ -0,0 +1,28 @@
+<svg width="151" height="150" viewBox="0 0 151 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M138.211 65C136.62 55.0255 132.688 45.8318 126.996 38M138.211 85C136.62 94.9746 132.688 104.168 126.996 112M112.994 126C105.164 131.69 95.972 135.62 86 137.211M66 137.211C56.0279 135.62 46.8364 131.69 39.0059 126M25.0043 112C19.3121 104.168 15.3801 94.9746 13.7892 85M13.7892 65C15.3801 55.0255 19.3121 45.8318 25.0043 38M39.0059 24C46.8364 18.3101 56.0279 14.3797 66 12.7893M86 12.7893C95.9721 14.3797 105.164 18.3101 112.994 24" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M75.9998 21.882C81.4901 21.882 85.9408 17.4313 85.9408 11.941C85.9408 6.45074 81.4901 2 75.9998 2C70.5096 2 66.0588 6.45074 66.0588 11.941C66.0588 17.4313 70.5096 21.882 75.9998 21.882Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M75.9998 148C81.4901 148 85.9408 143.549 85.9408 138.059C85.9408 132.569 81.4901 128.118 75.9998 128.118C70.5096 128.118 66.0588 132.569 66.0588 138.059C66.0588 143.549 70.5096 148 75.9998 148Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M129.118 75.0001C129.118 80.4903 133.569 84.9411 139.059 84.9411C144.549 84.9411 149 80.4903 149 75.0001C149 69.5098 144.549 65.0591 139.059 65.0591C133.569 65.0591 129.118 69.5098 129.118 75.0001Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M2.99982 75.0001C2.99982 80.4903 7.45056 84.9411 12.9408 84.9411C18.4311 84.9411 22.8818 80.4903 22.8818 75.0001C22.8818 69.5098 18.4311 65.0591 12.9408 65.0591C7.45056 65.0591 2.99982 69.5098 2.99982 75.0001Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M113.56 37.4399C117.442 41.3221 123.737 41.3221 127.619 37.4399C131.501 33.5577 131.501 27.2634 127.619 23.3812C123.737 19.499 117.442 19.499 113.56 23.3812C109.678 27.2634 109.678 33.5577 113.56 37.4399Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M24.381 126.619C28.2632 130.501 34.5575 130.501 38.4397 126.619C42.322 122.737 42.322 116.442 38.4398 112.56C34.5576 108.678 28.2632 108.678 24.381 112.56C20.4988 116.442 20.4988 122.737 24.381 126.619Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M38.4397 37.4399C42.3219 33.5577 42.3219 27.2634 38.4397 23.3812C34.5575 19.499 28.2632 19.499 24.381 23.3812C20.4988 27.2634 20.4988 33.5577 24.381 37.4399C28.2632 41.3221 34.5575 41.3221 38.4397 37.4399Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M127.619 126.619C131.501 122.737 131.501 116.442 127.619 112.56C123.736 108.678 117.442 108.678 113.56 112.56C109.678 116.442 109.678 122.737 113.56 126.619C117.442 130.501 123.737 130.501 127.619 126.619Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M71.8365 79.1636C69.5464 76.8735 69.5464 73.1261 71.8365 70.784C74.1265 68.4939 77.8739 68.4939 80.216 70.784C82.5061 73.074 82.5061 76.8214 80.216 79.1636C77.8739 81.4537 74.1265 81.4537 71.8365 79.1636Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M51.7456 79.1636C49.4556 76.8735 49.4556 73.1261 51.7456 70.784C54.0357 68.4939 57.7831 68.4939 60.1252 70.784C62.4153 73.074 62.4153 76.8214 60.1252 79.1636C57.7831 81.4537 54.0878 81.4537 51.7456 79.1636Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M31.7071 79.1636C29.417 76.8735 29.417 73.1261 31.7071 70.784C33.9971 68.4939 37.7445 68.4939 40.0867 70.784C42.3767 73.074 42.3767 76.8214 40.0867 79.1636C37.7445 81.4537 33.9971 81.4537 31.7071 79.1636Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M91.8748 79.1636C89.5847 76.8736 89.5847 73.1262 91.8748 70.784C94.1649 68.4939 97.9123 68.4939 100.254 70.784C102.544 73.0741 102.544 76.8215 100.254 79.1636C97.9123 81.4537 94.1649 81.4537 91.8748 79.1636Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M111.912 79.1636C109.622 76.8736 109.622 73.1262 111.912 70.784C114.202 68.4939 117.95 68.4939 120.292 70.784C122.582 73.0741 122.582 76.8215 120.292 79.1636C117.95 81.4537 114.202 81.4537 111.912 79.1636Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M55.9113 60.7908C55.9113 57.5118 58.5657 54.9094 61.7926 54.9094C65.0716 54.9094 67.6739 57.5638 67.6739 60.7908C67.6739 64.0697 65.0195 66.6721 61.7926 66.6721C58.5657 66.7241 55.9113 64.0697 55.9113 60.7908Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M41.7526 46.6344C41.7526 43.3554 44.407 40.7531 47.6339 40.7531C50.9129 40.7531 53.5152 43.4075 53.5152 46.6344C53.5152 49.9134 50.8608 52.5157 47.6339 52.5157C44.3549 52.5157 41.7526 49.9134 41.7526 46.6344Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M84.2758 89.1566C84.2758 85.8776 86.9302 83.2753 90.1571 83.2753C93.4361 83.2753 96.0384 85.9297 96.0384 89.1566C96.0384 92.4356 93.384 95.0379 90.1571 95.0379C86.8781 95.09 84.2758 92.4356 84.2758 89.1566Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M98.4327 103.365C98.4327 100.086 101.087 97.4841 104.314 97.4841C107.593 97.4841 110.195 100.139 110.195 103.365C110.195 106.644 107.541 109.247 104.314 109.247C101.087 109.247 98.4327 106.592 98.4327 103.365Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M90.1579 54.9094C93.4369 54.9094 96.0392 57.5638 96.0392 60.7907C96.0392 64.0697 93.3848 66.672 90.1579 66.672C86.8789 66.672 84.2766 64.0176 84.2766 60.7907C84.2766 57.5638 86.8789 54.9094 90.1579 54.9094Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M104.366 40.7531C107.645 40.7531 110.248 43.4075 110.248 46.6344C110.248 49.9134 107.593 52.5157 104.366 52.5157C101.087 52.5157 98.4851 49.8613 98.4851 46.6344C98.4331 43.3554 101.087 40.7531 104.366 40.7531Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M61.7933 83.2753C65.0722 83.2753 67.6746 85.9297 67.6746 89.1566C67.6746 92.4356 65.0202 95.0379 61.7933 95.0379C58.5143 95.0379 55.9119 92.3835 55.9119 89.1566C55.9119 85.8776 58.5663 83.2753 61.7933 83.2753Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M47.6344 97.4323C50.9134 97.4323 53.5158 100.087 53.5158 103.314C53.5158 106.593 50.8614 109.195 47.6344 109.195C44.3555 109.195 41.7531 106.541 41.7531 103.314C41.7531 100.087 44.3555 97.4323 47.6344 97.4323Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M71.836 50.7461C74.1261 48.456 77.8735 48.456 80.2156 50.7461C82.5057 53.0362 82.5057 56.7836 80.2156 59.1257C77.9255 61.4158 74.1781 61.4158 71.836 59.1257C69.4939 56.7836 69.4939 53.0882 71.836 50.7461Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M71.836 30.7078C74.1261 28.4177 77.8735 28.4177 80.2156 30.7078C82.5057 32.9979 82.5057 36.7453 80.2156 39.0874C77.9255 41.3775 74.1781 41.3775 71.836 39.0874C69.4939 36.7453 69.4939 32.9979 71.836 30.7078Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M71.836 90.8745C74.1261 88.5844 77.8735 88.5844 80.2156 90.8745C82.5057 93.1646 82.5057 96.912 80.2156 99.2541C77.9255 101.544 74.1781 101.544 71.836 99.2541C69.4939 96.912 69.4939 93.1646 71.836 90.8745Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M71.836 110.913C74.1261 108.622 77.8735 108.622 80.2156 110.913C82.5057 113.203 82.5057 116.95 80.2156 119.292C77.9255 121.582 74.1781 121.582 71.836 119.292C69.4939 116.95 69.4939 113.203 71.836 110.913Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/orderBooks.svg b/packages/website/ts/@next/icons/illustrations/orderBooks.svg
new file mode 100755
index 000000000..44e001ff0
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/orderBooks.svg
@@ -0,0 +1,8 @@
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="75" cy="75" r="73" stroke="#00AE99" stroke-width="3"/>
+<path d="M75 64V75M75 75H69V128H75M75 75H81V128H75M75 128V139" stroke="#00AE99" stroke-width="3"/>
+<path d="M98 16V27M98 27H92V75H98M98 27H104V75H98M98 75V86" stroke="#00AE99" stroke-width="3"/>
+<path d="M52 16V27M52 27H46V75H52M52 27H58V75H52M52 75V86" stroke="#00AE99" stroke-width="3"/>
+<path d="M29 64V75M29 75H23V100H29M29 75H35V100H29M29 100V111" stroke="#00AE99" stroke-width="3"/>
+<path d="M121 64V75M121 75H115V100H121M121 75H127V100H121M121 100V111" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/predictionMarkets.svg b/packages/website/ts/@next/icons/illustrations/predictionMarkets.svg
new file mode 100755
index 000000000..820b79416
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/predictionMarkets.svg
@@ -0,0 +1,7 @@
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M126.5 126.737C139.78 113.518 148 95.2188 148 75C148 34.6832 115.317 2 75 2C34.6832 2 2 34.6832 2 75C2 94.9638 10.0138 113.056 23 126.235" stroke="#00AE99" stroke-width="3"/>
+<path d="M127 4V22M127 40V22M127 22H109H145" stroke="#00AE99" stroke-width="3"/>
+<path d="M104 37V45M104 53V45M104 45H96H112" stroke="#00AE99" stroke-width="3"/>
+<rect x="19" y="137" width="112" height="11" stroke="#00AE99" stroke-width="3"/>
+<rect x="23" y="126" width="104" height="11" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/protocol.svg b/packages/website/ts/@next/icons/illustrations/protocol.svg
new file mode 100644
index 000000000..5c9c1531a
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/protocol.svg
@@ -0,0 +1 @@
+<svg width="144" height="144" viewBox="0 0 144 144" fill="none" xmlns="http://www.w3.org/2000/svg"><g style="mix-blend-mode:screen" stroke="#00AE99" stroke-width="2.5" stroke-miterlimit="10"><path d="M72 132.722c33.536 0 60.722-27.186 60.722-60.722S105.536 11.278 72 11.278 11.278 38.464 11.278 72 38.464 132.722 72 132.722z"/><path d="M72 20.557A9.278 9.278 0 1 0 72 2a9.278 9.278 0 0 0 0 18.557zM114.942 38.336a9.278 9.278 0 1 0-9.278-9.278 9.278 9.278 0 0 0 9.278 9.278zM132.722 81.278A9.278 9.278 0 0 0 142 72a9.278 9.278 0 0 0-9.278-9.278 9.278 9.278 0 1 0 0 18.556zM114.942 124.221a9.279 9.279 0 1 0 0-18.557 9.279 9.279 0 0 0 0 18.557zM72 142a9.278 9.278 0 0 0 9.278-9.278 9.278 9.278 0 1 0-18.556 0A9.278 9.278 0 0 0 72 142zM29.058 124.221a9.278 9.278 0 0 0 9.278-9.279 9.278 9.278 0 0 0-9.278-9.278 9.278 9.278 0 0 0-9.279 9.278 9.278 9.278 0 0 0 9.279 9.279zM11.278 81.278a9.278 9.278 0 1 0 0-18.556 9.278 9.278 0 0 0 0 18.556zM29.058 38.336a9.278 9.278 0 1 0 0-18.557 9.278 9.278 0 0 0 0 18.557zM68.114 75.886c-2.138-2.137-2.138-5.635 0-7.82 2.137-2.138 5.635-2.138 7.82 0 2.138 2.137 2.138 5.634 0 7.82-2.185 2.138-5.683 2.138-7.82 0zM49.363 75.886c-2.137-2.137-2.137-5.635 0-7.82 2.137-2.138 5.635-2.138 7.821 0 2.137 2.137 2.137 5.634 0 7.82a5.571 5.571 0 0 1-7.821 0zM30.66 75.886c-2.137-2.137-2.137-5.635 0-7.82 2.138-2.138 5.636-2.138 7.822 0 2.137 2.137 2.137 5.634 0 7.82-2.186 2.138-5.684 2.138-7.821 0zM86.816 75.886c-2.137-2.137-2.137-5.635 0-7.82 2.138-2.138 5.635-2.138 7.821 0 2.138 2.137 2.138 5.634 0 7.82-2.186 2.138-5.683 2.138-7.82 0zM105.518 75.886c-2.137-2.137-2.137-5.635 0-7.82 2.138-2.138 5.635-2.138 7.821 0 2.138 2.137 2.138 5.634 0 7.82-2.186 2.138-5.683 2.138-7.821 0zM53.25 58.738c0-3.06 2.477-5.489 5.489-5.489 3.06 0 5.489 2.477 5.489 5.49 0 3.06-2.478 5.489-5.49 5.489-3.011.048-5.489-2.43-5.489-5.49zM40.036 45.525c0-3.06 2.478-5.489 5.49-5.489 3.06 0 5.489 2.477 5.489 5.49 0 3.06-2.478 5.489-5.49 5.489a5.453 5.453 0 0 1-5.489-5.49zM79.724 85.213c0-3.06 2.477-5.49 5.49-5.49 3.06 0 5.488 2.478 5.488 5.49 0 3.06-2.477 5.49-5.489 5.49-3.06.048-5.49-2.43-5.49-5.49zM92.937 98.475c0-3.06 2.477-5.49 5.49-5.49a5.483 5.483 0 0 1 5.488 5.49c0 3.06-2.477 5.489-5.489 5.489s-5.49-2.478-5.49-5.49zM85.213 53.25c3.06 0 5.49 2.477 5.49 5.488 0 3.06-2.478 5.49-5.49 5.49a5.483 5.483 0 0 1-5.49-5.49 5.483 5.483 0 0 1 5.49-5.489zM98.475 40.036c3.06 0 5.489 2.477 5.489 5.49 0 3.06-2.477 5.489-5.49 5.489a5.484 5.484 0 0 1-5.489-5.49c-.048-3.06 2.43-5.489 5.49-5.489zM58.739 79.724c3.06 0 5.489 2.477 5.489 5.489 0 3.06-2.478 5.49-5.49 5.49a5.483 5.483 0 0 1-5.489-5.49c0-3.06 2.478-5.49 5.49-5.49zM45.525 92.937c3.06 0 5.49 2.477 5.49 5.49a5.483 5.483 0 0 1-5.49 5.488 5.483 5.483 0 0 1-5.489-5.489 5.484 5.484 0 0 1 5.49-5.49zM68.114 49.363c2.137-2.138 5.635-2.138 7.82 0 2.138 2.137 2.138 5.635 0 7.82-2.137 2.138-5.634 2.138-7.82 0a5.483 5.483 0 0 1 0-7.82zM68.114 30.66c2.137-2.137 5.635-2.137 7.82 0 2.138 2.138 2.138 5.636 0 7.822-2.137 2.137-5.634 2.137-7.82 0-2.186-2.186-2.186-5.684 0-7.821zM68.114 86.816c2.137-2.137 5.635-2.137 7.82 0 2.138 2.138 2.138 5.635 0 7.821-2.137 2.137-5.634 2.137-7.82 0-2.186-2.186-2.186-5.683 0-7.82zM68.114 105.518c2.137-2.137 5.635-2.137 7.82 0 2.138 2.138 2.138 5.635 0 7.821-2.137 2.138-5.634 2.138-7.82 0-2.186-2.186-2.186-5.683 0-7.821z"/></g></svg> \ No newline at end of file
diff --git a/packages/website/ts/@next/icons/illustrations/ready-to-build.svg b/packages/website/ts/@next/icons/illustrations/ready-to-build.svg
new file mode 100644
index 000000000..a26a4e236
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/ready-to-build.svg
@@ -0,0 +1 @@
+<svg width="152" height="152" viewBox="0 0 152 152" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M76 151c41.421 0 75-33.579 75-75S117.421 1 76 1 1 34.579 1 76s33.579 75 75 75z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M76 1.502l-30.852 44.8H76L76.05 76l30.803-44.9H76.001V1.502zM76 75.997l-30.853 44.799H76l.05 29.699 30.803-44.899H76V75.997z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M1.502 75.998l44.8 30.852V75.998L76 75.948 31.1 45.144v30.853H1.503zM76 76l45.101 31.522V76L151 75.95l-45.202-31.47V76H76z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10" stroke-linejoin="round"/></svg> \ No newline at end of file
diff --git a/packages/website/ts/@next/icons/illustrations/recruitingSupport.svg b/packages/website/ts/@next/icons/illustrations/recruitingSupport.svg
new file mode 100755
index 000000000..d630b23d7
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/recruitingSupport.svg
@@ -0,0 +1,7 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 45C2 68.7578 21.2421 88 45 88C68.7579 88 88 68.7578 88 45C88 21.6448 69.3906 2.63278 46.1793 2.02876C45.7478 2.02876 45.3452 2 44.9137 2C21.2134 2.02876 2 21.2709 2 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M30 45C30 53.2876 36.7124 60 45 60C53.2876 60 60 53.2876 60 45C60 36.8528 53.5084 30.2207 45.4114 30.01C45.2609 30.01 45.1204 30 44.9699 30C36.7023 30.01 30 36.7224 30 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M21 45C21 58.2602 31.7398 69 45 69C58.2602 69 69 58.2602 69 45C69 31.9645 58.6134 21.3532 45.6582 21.0161C45.4174 21.0161 45.1926 21 44.9518 21C31.7237 21.0161 21 31.7559 21 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M56.5 56L76 75.5" stroke="#00AE99" stroke-width="3"/>
+<path d="M45 70.5C54.0057 70.5 62.1515 74.8777 67.8311 81.94L70.1689 80.06C63.9926 72.3798 55.0243 67.5 45 67.5V70.5ZM45 67.5C34.9757 67.5 26.0074 72.3798 19.8311 80.06L22.1689 81.94C27.8485 74.8777 35.9943 70.5 45 70.5V67.5Z" fill="#00AE99"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/right-thing.svg b/packages/website/ts/@next/icons/illustrations/right-thing.svg
new file mode 100644
index 000000000..4e360c0b4
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/right-thing.svg
@@ -0,0 +1 @@
+<svg width="104" height="104" viewBox="0 0 104 104" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M52 102c27.614 0 50-22.386 50-50S79.614 2 52 2 2 24.386 2 52s22.386 50 50 50z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M92.061 24.613c-10.138-10.137-26.574-10.137-36.711 0l-3.67 3.673-3.672-3.673c-10.138-10.137-26.574-10.137-36.711 0-10.138 10.138-10.138 26.574 0 36.712l3.672 3.672 36.711 36.709 36.712-36.712 3.672-3.672c10.135-10.135 10.135-26.57-.003-36.709z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M81.293 45.17c-7.435-7.434-19.489-7.434-26.92 0l-2.693 2.694-2.694-2.694c-7.434-7.434-19.488-7.434-26.922 0-7.435 7.435-7.435 19.488 0 26.923l2.693 2.693 26.92 26.923 26.922-26.923 2.694-2.693c7.434-7.435 7.434-19.488 0-26.923z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M70.525 65.73c-4.732-4.731-12.403-4.731-17.13 0l-1.715 1.715-1.715-1.715c-4.731-4.731-12.403-4.731-17.13 0-4.732 4.731-4.732 12.402 0 17.13l1.714 1.715 17.13 17.131 17.131-17.13 1.715-1.715c4.731-4.732 4.731-12.4 0-17.131z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/></svg> \ No newline at end of file
diff --git a/packages/website/ts/@next/icons/illustrations/robustSmartContracts.svg b/packages/website/ts/@next/icons/illustrations/robustSmartContracts.svg
new file mode 100755
index 000000000..060f2d00c
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/robustSmartContracts.svg
@@ -0,0 +1,6 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M45 88C68.7482 88 88 68.7482 88 45C88 21.2518 68.7482 2 45 2C21.2518 2 2 21.2518 2 45C2 68.7482 21.2518 88 45 88Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M70 29V79H20V11H52M70 29L52 11M70 29V11H52" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M30 45H60M30 55H60M30 65H60" stroke="#00AE99" stroke-width="3"/>
+<path d="M52 11V29H70" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/rocketship.svg b/packages/website/ts/@next/icons/illustrations/rocketship.svg
new file mode 100644
index 000000000..e9b4b83ab
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/rocketship.svg
@@ -0,0 +1,9 @@
+<svg width="124" height="124" viewBox="0 0 124 124" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M44.6582 74.4521L12.4089 95.6738M18.9394 103.633L46.699 76.2888" stroke="#00AE99" stroke-width="2.5"/>
+<path d="M51.3926 80.5745L34.6538 115.266M25.8784 109.96L49.1477 78.5338" stroke="#00AE99" stroke-width="2.5"/>
+<path d="M77.212 78.8086L75.9699 78.949L75.9699 78.949L77.212 78.8086ZM77.603 60.0842L76.4001 59.7443L77.603 60.0842ZM84.9562 43.7018L83.979 42.9223L83.9342 42.9785L83.8961 43.0394L84.9562 43.7018ZM73.085 87.8359L72.2661 88.7803L73.2262 89.6128L74.0428 88.6391L73.085 87.8359ZM56.5473 79.3763L57.4218 80.2694L57.459 80.2331L57.493 80.1937L56.5473 79.3763ZM53.8137 79.4142L54.6312 78.4685L54.6311 78.4685L53.8137 79.4142ZM53.0049 80.3499L53.7507 81.3531L53.8608 81.2712L53.9505 81.1674L53.0049 80.3499ZM51.4635 80.243L52.2809 79.2973L52.2809 79.2973L51.4635 80.243ZM61.3832 68.3677L60.5429 69.2931L60.5542 69.3034L60.5658 69.3134L61.3832 68.3677ZM74.9165 85.3062L75.9718 85.9761L75.9718 85.9761L74.9165 85.3062ZM91.434 27.7957L92.5916 27.3241L92.4784 27.0462L92.2514 26.85L91.434 27.7957ZM42.7642 49.0315L42.8049 50.2809L42.8049 50.2809L42.7642 49.0315ZM61.2349 45.9355L61.7453 47.0765L61.2349 45.9355ZM76.3811 36.2894L77.1898 37.2424L77.2446 37.1959L77.2937 37.1435L76.3811 36.2894ZM34.429 54.4212L33.4956 53.5898L32.6503 54.5386L33.613 55.3682L34.429 54.4212ZM45.1923 69.5609L44.2467 68.7435L44.2127 68.7828L44.182 68.8248L45.1923 69.5609ZM45.5503 72.2712L46.3678 71.3256L46.3678 71.3256L45.5503 72.2712ZM44.7415 73.207L43.7958 72.3895L43.7061 72.4933L43.641 72.6141L44.7415 73.207ZM45.0703 74.7167L45.8878 73.771L45.8878 73.771L45.0703 74.7167ZM55.3854 63.1831L54.5679 64.1288L54.5795 64.1388L54.5913 64.1485L55.3854 63.1831ZM36.667 52.2431L35.8515 51.2958L35.8515 51.2958L36.667 52.2431ZM91.1826 27.5784L92 26.6327L91.773 26.4365L91.4817 26.3647L91.1826 27.5784ZM83.9509 43.0422L61.4101 69.1188L63.3014 70.7536L85.8422 44.6771L83.9509 43.0422ZM78.4541 78.6681C78.0305 74.9211 76.5083 68.5531 78.8059 60.4242L76.4001 59.7443C73.9348 68.4667 75.5746 75.4525 75.9699 78.949L78.4541 78.6681ZM78.8059 60.4242C80.6674 53.8382 84.3943 46.96 86.0163 44.3642L83.8961 43.0394C82.2037 45.748 78.349 52.8492 76.4001 59.7443L78.8059 60.4242ZM85.9334 44.4813C86.7782 43.4222 88.106 41.5706 89.3107 39.7677C90.4904 38.002 91.6492 36.1406 92.0741 35.11L89.7628 34.1571C89.4497 34.9164 88.4417 36.5683 87.232 38.3788C86.0471 40.1522 84.7628 41.9398 83.979 42.9223L85.9334 44.4813ZM73.904 86.8915L60.2718 75.0706L58.634 76.9594L72.2661 88.7803L73.904 86.8915ZM58.5072 75.1976L55.6017 78.5589L57.493 80.1937L60.3985 76.8324L58.5072 75.1976ZM55.6728 78.4831C55.6952 78.4612 55.6589 78.4988 55.5624 78.5515C55.474 78.5998 55.3704 78.6413 55.265 78.6627C55.163 78.6835 55.0696 78.6837 54.9818 78.6633C54.8989 78.6441 54.7803 78.5974 54.6312 78.4685L52.9963 80.3599C53.9198 81.1581 54.9373 81.2805 55.7629 81.1126C56.5187 80.959 57.1181 80.5669 57.4218 80.2694L55.6728 78.4831ZM52.8681 78.5968L52.0592 79.5325L53.9505 81.1674L54.7594 80.2317L52.8681 78.5968ZM52.2591 79.3468C52.279 79.332 52.2917 79.3249 52.2958 79.3226C52.3006 79.32 52.302 79.3197 52.3006 79.3202C52.2965 79.3217 52.2938 79.3219 52.2957 79.3217C52.2974 79.3216 52.3007 79.3216 52.3054 79.3221C52.3102 79.3227 52.3147 79.3237 52.3182 79.3249C52.3218 79.326 52.3213 79.3263 52.3164 79.3236C52.3115 79.3208 52.2994 79.3133 52.2809 79.2973L50.646 81.1886C51.8617 82.2394 53.2052 81.7587 53.7507 81.3531L52.2591 79.3468ZM60.5658 69.3134C61.2107 69.8709 61.7136 71.4882 60.5236 72.8649L62.4149 74.4998C64.5664 72.0109 63.8212 68.8229 62.2006 67.422L60.5658 69.3134ZM60.5236 72.8649L58.5072 75.1976L60.3985 76.8324L62.4149 74.4998L60.5236 72.8649ZM74.0428 88.6391C74.5796 87.999 75.2848 87.0584 75.9718 85.9761L73.8611 84.6363C73.2323 85.627 72.5921 86.4784 72.1273 87.0326L74.0428 88.6391ZM75.9718 85.9761C76.6408 84.9221 77.3127 83.7022 77.792 82.4704C78.2624 81.2613 78.5956 79.9197 78.4541 78.6681L75.9699 78.949C76.045 79.6133 75.8726 80.509 75.4621 81.5639C75.0605 82.5961 74.4763 83.6671 73.8611 84.6363L75.9718 85.9761ZM75.7339 84.3606L62.2867 72.7367L60.6518 74.628L74.099 86.2519L75.7339 84.3606ZM60.2703 75.0693L54.4097 70.0034L52.7748 71.8947L58.6354 76.9607L60.2703 75.0693ZM57.4148 66.5254C58.723 67.6581 59.9087 68.7173 60.5429 69.2931L62.2235 67.4423C61.5753 66.8537 60.3749 65.7815 59.0512 64.6354L57.4148 66.5254ZM48.6813 76.6305L52.9964 80.3599L54.6311 78.4685L50.316 74.739L48.6813 76.6305ZM47.2951 78.2921L50.646 81.1886L52.2809 79.2973L48.9299 76.4007L47.2951 78.2921ZM92.0741 35.11C92.483 34.1181 92.8555 32.8177 93.0125 31.4685C93.1677 30.1352 93.1262 28.6366 92.5916 27.3241L90.2763 28.2672C90.5897 29.0365 90.6594 30.0618 90.5293 31.1795C90.4011 32.2814 90.0918 33.359 89.7628 34.1571L92.0741 35.11ZM75.2878 35.5538L52.747 61.6303L54.6383 63.2652L77.1792 37.1886L75.2878 35.5538ZM42.8049 50.2809C46.3218 50.1661 53.4713 50.778 61.7453 47.0765L60.7244 44.7945C53.0135 48.244 46.4923 47.6592 42.7234 47.7822L42.8049 50.2809ZM61.7453 47.0765C68.2859 44.1505 74.7546 39.309 77.1898 37.2424L75.5723 35.3363C73.2384 37.3168 66.9718 41.9996 60.7244 44.7945L61.7453 47.0765ZM77.2937 37.1435C78.1525 36.2258 79.7355 34.6963 81.3187 33.2674C82.9352 31.8084 84.4239 30.572 85.1299 30.1523L83.8526 28.0033C82.8943 28.5728 81.2201 29.9887 79.6437 31.4115C78.034 32.8643 76.3941 34.446 75.4684 35.4352L77.2937 37.1435ZM33.613 55.3682L47.2819 67.1466L48.9138 65.2527L35.2449 53.4743L33.613 55.3682ZM47.1522 65.3822L44.2467 68.7435L46.138 70.3784L49.0435 67.0171L47.1522 65.3822ZM44.182 68.8248C43.9317 69.1684 43.6304 69.8183 43.5877 70.5883C43.5411 71.4295 43.8094 72.4187 44.7329 73.2169L46.3678 71.3256C46.2187 71.1967 46.1553 71.0861 46.1243 71.0068C46.0914 70.9229 46.0781 70.8305 46.0839 70.7266C46.0899 70.6192 46.1159 70.5106 46.1509 70.4161C46.1892 70.3131 46.221 70.2717 46.2026 70.297L44.182 68.8248ZM44.6047 71.4538L43.7958 72.3895L45.6871 74.0244L46.496 73.0887L44.6047 71.4538ZM43.641 72.6141C43.3186 73.2126 43.0373 74.6115 44.2529 75.6624L45.8878 73.771C45.8693 73.755 45.8601 73.7441 45.8566 73.7397C45.8532 73.7353 45.8534 73.7348 45.8551 73.7381C45.8567 73.7414 45.8584 73.7457 45.8597 73.7504C45.8609 73.7549 45.8613 73.7583 45.8614 73.7599C45.8616 73.7618 45.8613 73.7592 45.8623 73.7549C45.8626 73.7534 45.8624 73.7548 45.8606 73.76C45.8589 73.7644 45.8537 73.7779 45.8419 73.7998L43.641 72.6141ZM56.2028 62.2375C54.5822 60.8366 51.32 60.5606 49.1686 63.0495L51.0599 64.6844C52.25 63.3077 53.9229 63.5713 54.5679 64.1288L56.2028 62.2375ZM49.1686 63.0495L47.1522 65.3822L49.0435 67.0171L51.0599 64.6844L49.1686 63.0495ZM35.3623 55.2527C35.8435 54.7125 36.5933 53.9559 37.4825 53.1904L35.8515 51.2958C34.88 52.1321 34.0513 52.966 33.4956 53.5898L35.3623 55.2527ZM37.4825 53.1904C38.3526 52.4414 39.3278 51.7084 40.291 51.1617C41.2754 50.6029 42.1367 50.3027 42.8049 50.2809L42.7234 47.7822C41.4645 47.8233 40.1853 48.347 39.057 48.9875C37.9074 49.6399 36.7976 50.4813 35.8515 51.2958L37.4825 53.1904ZM35.8496 53.1887L49.2968 64.8126L50.9317 62.9213L37.4845 51.2974L35.8496 53.1887ZM47.2804 67.1453L53.141 72.2113L54.7759 70.3199L48.9153 65.254L47.2804 67.1453ZM59.4158 64.9506C58.0903 63.8066 56.8557 62.774 56.1795 62.2178L54.5913 64.1485C55.2529 64.6927 56.4724 65.7127 57.7825 66.8433L59.4158 64.9506ZM50.6824 75.0557L46.3678 71.3256L44.7328 73.2168L49.0474 76.9469L50.6824 75.0557ZM49.2387 76.6676L45.8878 73.771L44.2529 75.6624L47.6038 78.559L49.2387 76.6676ZM85.1299 30.1523C85.872 29.7113 86.8935 29.2494 87.9652 28.9631C89.0523 28.6726 90.0769 28.5933 90.8835 28.792L91.4817 26.3647C90.1056 26.0255 88.6168 26.2013 87.3199 26.5478C86.0077 26.8984 84.7749 27.4551 83.8526 28.0033L85.1299 30.1523ZM92.2514 26.85L92 26.6327L90.3651 28.524L90.6165 28.7413L92.2514 26.85Z" fill="#00AE99"/>
+<path d="M66.0818 13.4286V16.2857M66.0818 19.1428V16.2857M66.0818 16.2857H63.2246H68.9389" stroke="#00AE99" stroke-width="2.5"/>
+<path d="M108.122 62V64.8571M108.122 67.7143V64.8571M108.122 64.8571H105.265H110.979" stroke="#00AE99" stroke-width="2.5"/>
+<path d="M37.9182 25.6735V28.5307M37.9182 31.3878V28.5307M37.9182 28.5307H35.061H40.7753" stroke="#00AE99" stroke-width="2.5"/>
+<path d="M62 122C95.1371 122 122 95.1371 122 62C122 28.8629 95.1371 2 62 2C28.8629 2 2 28.8629 2 62C2 95.1371 28.8629 122 62 122Z" stroke="#00AE99" stroke-width="2.5" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/secureTrading.svg b/packages/website/ts/@next/icons/illustrations/secureTrading.svg
new file mode 100755
index 000000000..21912961d
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/secureTrading.svg
@@ -0,0 +1,15 @@
+<svg width="91" height="90" viewBox="0 0 91 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 45C2 68.7579 21.2421 88 45 88C68.7579 88 88 68.7579 88 45C88 21.6448 69.3906 2.63278 46.1793 2.02876C45.7478 2.02876 45.3452 2 44.9137 2C21.2134 2.02876 2 21.2709 2 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M15 15H75V75H62.8125H26.25H15V15Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M68.2435 21.7253H21.7253V68.2436H30.4475H58.7945H68.2435V21.7253Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M14.6464 44.9844H21.7253" stroke="#00AE99" stroke-width="3"/>
+<path d="M14.6464 34.8718H21.7253" stroke="#00AE99" stroke-width="3"/>
+<path d="M14.6464 55.0971H21.7253" stroke="#00AE99" stroke-width="3"/>
+<circle cx="44.9844" cy="44.9844" r="14.1577" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M44.9844 30.8267V38.9168" stroke="#00AE99" stroke-width="3"/>
+<path d="M32.1647 38.9766L39.4902 42.4097" stroke="#00AE99" stroke-width="3"/>
+<path d="M35.2801 55.2932L40.8255 49.4026" stroke="#00AE99" stroke-width="3"/>
+<path d="M54.7349 55.2497L49.1632 49.3839" stroke="#00AE99" stroke-width="3"/>
+<path d="M57.8132 38.996L50.4825 42.4181" stroke="#00AE99" stroke-width="3"/>
+<ellipse cx="44.9844" cy="44.9844" rx="5.05633" ry="5.05633" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/stableTokens.svg b/packages/website/ts/@next/icons/illustrations/stableTokens.svg
new file mode 100755
index 000000000..9e854b0e6
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/stableTokens.svg
@@ -0,0 +1,10 @@
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="75" cy="75" r="73" stroke="#00AE99" stroke-width="3"/>
+<path d="M32 96H119M32 96V85H119V96M32 96H36V106.5H48M103 142V106.5M48 142V106.5M119 96H115V106.5H103M103 106.5H92.25M48 106.5H58.75M75.5 106.5V148M75.5 106.5H58.75M75.5 106.5H92.25M58.75 106.5V146M92.25 106.5V146" stroke="#00AE99" stroke-width="3"/>
+<path d="M75.3265 76.5343C93.1472 76.5343 107.594 62.0878 107.594 44.2672C107.594 26.4465 93.1472 12 75.3265 12C57.5058 12 43.0593 26.4465 43.0593 44.2672C43.0593 62.0878 57.5058 76.5343 75.3265 76.5343Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M66.4197 57.1739V58.6739H67.9197H85.2999H86.7999V57.1739V52.1138V50.6138H85.2999H81.0799V29.0134V27.5134H79.5799H74.0798H73.6189L73.2375 27.7722L67.0774 31.9523L66.4197 32.3986V33.1935V39.2803V42.1109L68.7619 40.5215L72.5798 37.9308V50.6138H67.9197H66.4197V52.1138V57.1739Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M43.0593 44.0473C49.7328 42.9472 54.8662 37.2271 54.8662 30.187C54.8662 27.0337 53.8395 24.1736 52.0795 21.8269C46.5794 27.6203 43.1327 35.4671 43.0593 44.0473Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M43.0593 44.4871C43.1327 53.1405 46.5794 60.914 52.0795 66.7074C53.8395 64.3607 54.8662 61.5007 54.8662 58.3473C54.8662 51.3072 49.7328 45.5137 43.0593 44.4871Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M107.594 44.0473C100.92 42.9472 95.7869 37.2271 95.7869 30.187C95.7869 27.0337 96.8135 24.1736 98.5736 21.8269C104.074 27.6203 107.52 35.4671 107.594 44.0473Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M107.594 44.4871C107.52 53.1405 104.074 60.914 98.5736 66.7074C96.8135 64.3607 95.7869 61.5007 95.7869 58.3473C95.7869 51.3072 100.92 45.5137 107.594 44.4871Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/standardForExchange.svg b/packages/website/ts/@next/icons/illustrations/standardForExchange.svg
new file mode 100755
index 000000000..f8075ed6d
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/standardForExchange.svg
@@ -0,0 +1,12 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0)">
+<path d="M2 45C2 68.7579 21.2421 88 45 88C68.7579 88 88 68.7579 88 45C88 21.6448 69.3906 2.63278 46.1793 2.02876C45.7478 2.02876 45.3452 2 44.9137 2C21.2134 2.02876 2 21.2709 2 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M30 21L2 45L30 69V56.5H59.5V69L88 45L59.5 21V34H30V21Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M45 1V89" stroke="#00AE99" stroke-width="3"/>
+</g>
+<defs>
+<clipPath id="clip0">
+<rect width="90" height="90" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/support.svg b/packages/website/ts/@next/icons/illustrations/support.svg
new file mode 100644
index 000000000..368e7cc02
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/support.svg
@@ -0,0 +1 @@
+<svg width="152" height="152" viewBox="0 0 152 152" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M76 151c41.421 0 75-33.579 75-75S117.421 1 76 1 1 34.579 1 76s33.579 75 75 75z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M114.869 14.138H38.226v124.818h76.643V14.138z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M101.73 26.189H51.365v100.73h50.365V26.189z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/><path d="M76.547 76.554c13.908 0 25.183-11.275 25.183-25.183 0-13.907-11.275-25.182-25.183-25.182-13.907 0-25.182 11.275-25.182 25.182 0 13.908 11.275 25.183 25.182 25.183zM76.547 126.919c13.908 0 25.183-11.274 25.183-25.182S90.455 76.554 76.547 76.554c-13.907 0-25.182 11.275-25.182 25.183s11.275 25.182 25.182 25.182z" stroke="#00AE99" stroke-width="2" stroke-miterlimit="10"/></svg> \ No newline at end of file
diff --git a/packages/website/ts/@next/icons/illustrations/supportForAllEthereumStandards-large.svg b/packages/website/ts/@next/icons/illustrations/supportForAllEthereumStandards-large.svg
new file mode 100755
index 000000000..1f840204a
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/supportForAllEthereumStandards-large.svg
@@ -0,0 +1,28 @@
+<svg width="250" height="250" viewBox="0 0 250 250" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0)">
+<path d="M192.122 112.755C221.878 112.755 246 88.6333 246 58.8776C246 29.1218 221.878 5 192.122 5C162.367 5 138.245 29.1218 138.245 58.8776C138.245 88.6333 162.367 112.755 192.122 112.755Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M206.229 18.0288V31.3513H219.551" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M219.551 31.3511V72.494H183.012V18.0287H206.229L219.551 31.3511Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M178.016 99.7268V86.4043H164.694" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M164.694 86.4045V45.2616H201.233V99.7269H178.016L164.694 86.4045Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M59.8776 114.323C89.6333 114.323 113.755 90.2008 113.755 60.445C113.755 30.6893 89.6333 6.56747 59.8776 6.56747C30.1218 6.56747 6 30.6893 6 60.445C6 90.2008 30.1218 114.323 59.8776 114.323Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M59.8775 114.224C89.5786 114.224 113.656 90.1464 113.656 60.4453C113.656 30.7442 89.5786 6.66666 59.8775 6.66666C30.1764 6.66666 6.09888 30.7442 6.09888 60.4453C6.09888 90.1464 30.1764 114.224 59.8775 114.224Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M46.0329 81.9563V83.4563H47.5329H76.5H78V81.9563V73.5229V72.0229H76.5H68.4665V35.0223V33.5223H66.9665H57.7997H57.3388L56.9574 33.7811L46.6906 40.7478L46.0329 41.1942V41.9891V52.1337V54.9643L48.3751 53.3749L56.2997 47.9975V72.0229H47.5329H46.0329V73.5229V81.9563Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M6.09889 60.0786C17.2213 58.2452 25.777 48.7118 25.777 36.9782C25.777 31.7226 24.0658 26.9559 21.1325 23.0447C11.9656 32.7004 6.22112 45.7784 6.09889 60.0786Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M6.09889 60.8116C6.22112 75.2341 11.9656 88.1898 21.1325 97.8456C24.0658 93.9344 25.777 89.1676 25.777 83.912C25.777 72.1785 17.2213 62.5228 6.09889 60.8116Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M113.656 60.0786C102.534 58.2452 93.9781 48.7118 93.9781 36.9782C93.9781 31.7226 95.6892 26.9559 98.6226 23.0447C107.789 32.7004 113.534 45.7784 113.656 60.0786Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M113.656 60.8117C113.534 75.2342 107.789 88.1899 98.6226 97.8456C95.6892 93.9345 93.9781 89.1677 93.9781 83.9121C93.9781 72.1786 102.534 62.5229 113.656 60.8117Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M59.8776 246.567C89.6333 246.567 113.755 222.446 113.755 192.69C113.755 162.934 89.6333 138.812 59.8776 138.812C30.1218 138.812 6 162.934 6 192.69C6 222.446 30.1218 246.567 59.8776 246.567Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M59.8776 246.567C89.6333 246.567 113.755 222.446 113.755 192.69C113.755 162.934 89.6333 138.812 59.8776 138.812C30.1218 138.812 6 162.934 6 192.69C6 222.446 30.1218 246.567 59.8776 246.567Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M65.3633 189.944V158.303H69.8695V149.389H49.8858V158.303H54.3919V189.944C44.1062 192.393 36.4654 201.699 36.4654 212.67C36.4654 225.601 46.947 236.083 59.8776 236.083C72.8082 236.083 83.2899 225.601 83.2899 212.67C83.2899 201.601 75.6491 192.393 65.3633 189.944Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M69.8694 149.294H49.8857V158.208H69.8694V149.294Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M40.3837 199.547H79.2735" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M192.122 246.567C221.878 246.567 246 222.446 246 192.69C246 162.934 221.878 138.812 192.122 138.812C162.367 138.812 138.245 162.934 138.245 192.69C138.245 222.446 162.367 246.567 192.122 246.567Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M191.833 156.667L159.333 200.422H191.833L191.923 228.333L224.333 184.489H191.833V156.667Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</g>
+<defs>
+<clipPath id="clip0">
+<rect width="250" height="250" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/supportForAllEthereumStandards.svg b/packages/website/ts/@next/icons/illustrations/supportForAllEthereumStandards.svg
new file mode 100755
index 000000000..d75302da6
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/supportForAllEthereumStandards.svg
@@ -0,0 +1,21 @@
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M114.673 67.6531C132.527 67.6531 147 53.18 147 35.3265C147 17.4731 132.527 3 114.673 3C96.82 3 82.3469 17.4731 82.3469 35.3265C82.3469 53.18 96.82 67.6531 114.673 67.6531Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M123.137 10.8173V18.8107H131.131" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M131.131 18.8107V43.4964H109.207V10.8172H123.137L131.131 18.8107Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M106.21 59.8361V51.8426H98.2163" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M98.2163 51.8427V27.157H120.14V59.8362H106.21L98.2163 51.8427Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M35.3265 68.5936C53.18 68.5936 67.6531 54.1205 67.6531 36.267C67.6531 18.4136 53.18 3.94049 35.3265 3.94049C17.4731 3.94049 3 18.4136 3 36.267C3 54.1205 17.4731 68.5936 35.3265 68.5936Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M35.3265 68.5343C53.1472 68.5343 67.5937 54.0878 67.5937 36.2672C67.5937 18.4465 53.1472 4 35.3265 4C17.5058 4 3.05933 18.4465 3.05933 36.2672C3.05933 54.0878 17.5058 68.5343 35.3265 68.5343Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M26.4197 49.1738V50.6738H27.9197H45.3H46.8V49.1738V44.1137V42.6137H45.3H41.0799V21.0134V19.5134H39.5799H34.0798H33.6189L33.2376 19.7722L27.0775 23.9522L26.4197 24.3986V25.1934V31.2802V34.1108L28.762 32.5214L32.5798 29.9307V42.6137H27.9197H26.4197V44.1137V49.1738Z" stroke="#00AE99" stroke-width="3"/>
+<path d="M3.05933 36.0472C9.73276 34.9471 14.8662 29.2271 14.8662 22.1869C14.8662 19.0336 13.8395 16.1735 12.0795 13.8268C6.57938 19.6202 3.13266 27.467 3.05933 36.0472Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M3.05933 36.487C3.13266 45.1405 6.57938 52.9139 12.0795 58.7074C13.8395 56.3606 14.8662 53.5006 14.8662 50.3472C14.8662 43.3071 9.73276 37.5137 3.05933 36.487Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M67.5937 36.0472C60.9202 34.9471 55.7868 29.2271 55.7868 22.1869C55.7868 19.0336 56.8135 16.1735 58.5735 13.8268C64.0736 19.6202 67.5203 27.467 67.5937 36.0472Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M67.5937 36.4871C67.5203 45.1405 64.0736 52.914 58.5735 58.7074C56.8135 56.3607 55.7868 53.5007 55.7868 50.3473C55.7868 43.3072 60.9202 37.5137 67.5937 36.4871Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M35.3265 147.94C53.18 147.94 67.6531 133.467 67.6531 115.614C67.6531 97.7605 53.18 83.2874 35.3265 83.2874C17.4731 83.2874 3 97.7605 3 115.614C3 133.467 17.4731 147.94 35.3265 147.94Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M35.3265 147.94C53.18 147.94 67.6531 133.467 67.6531 115.614C67.6531 97.7605 53.18 83.2874 35.3265 83.2874C17.4731 83.2874 3 97.7605 3 115.614C3 133.467 17.4731 147.94 35.3265 147.94Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M38.618 113.966V94.9818H41.3217V89.6333H29.3315V94.9818H32.0352V113.966C25.8637 115.436 21.2792 121.019 21.2792 127.602C21.2792 135.361 27.5682 141.65 35.3266 141.65C43.085 141.65 49.3739 135.361 49.3739 127.602C49.3739 120.961 44.7894 115.436 38.618 113.966Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M41.3216 89.5762H29.3314V94.9247H41.3216V89.5762Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M23.6302 119.728H46.9641" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M114.673 147.94C132.527 147.94 147 133.467 147 115.614C147 97.7605 132.527 83.2874 114.673 83.2874C96.82 83.2874 82.3469 97.7605 82.3469 115.614C82.3469 133.467 96.82 147.94 114.673 147.94Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M114.5 94L95 120.253H114.5L114.554 137L134 110.693H114.5V94Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/techSupport.svg b/packages/website/ts/@next/icons/illustrations/techSupport.svg
new file mode 100755
index 000000000..e52084f67
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/techSupport.svg
@@ -0,0 +1,13 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="45" cy="45" r="43" stroke="#00AE99" stroke-width="3"/>
+<circle cx="45" cy="45" r="26.5068" stroke="#00AE99" stroke-width="3"/>
+<circle cx="45" cy="45" r="10.0137" stroke="#00AE99" stroke-width="3"/>
+<path d="M88 45C88 49.5545 84.3079 53.2466 79.7534 53.2466C75.199 53.2466 71.5068 49.5545 71.5068 45" stroke="#00AE99" stroke-width="3"/>
+<path d="M18.4932 45C18.4932 40.4455 14.801 36.7534 10.2466 36.7534C5.69212 36.7534 2 40.4455 2 45" stroke="#00AE99" stroke-width="3"/>
+<path d="M37.9193 37.9193C34.6988 41.1397 29.4773 41.1397 26.2568 37.9193C23.0363 34.6988 23.0363 29.4773 26.2568 26.2568" stroke="#00AE99" stroke-width="3"/>
+<path d="M63.7432 63.743C66.9637 60.5225 66.9637 55.3011 63.7432 52.0806C60.5227 48.8601 55.3013 48.8601 52.0808 52.0806" stroke="#00AE99" stroke-width="3"/>
+<path d="M45 18.4932C49.5545 18.4932 53.2466 14.801 53.2466 10.2466C53.2466 5.69212 49.5545 2 45 2" stroke="#00AE99" stroke-width="3"/>
+<path d="M45 88C40.4455 88 36.7534 84.3079 36.7534 79.7534C36.7534 75.199 40.4455 71.5068 45 71.5068" stroke="#00AE99" stroke-width="3"/>
+<path d="M26.2568 63.7433C29.4773 66.9638 34.6988 66.9638 37.9193 63.7433C41.1397 60.5228 41.1397 55.3014 37.9193 52.0809" stroke="#00AE99" stroke-width="3"/>
+<path d="M52.0808 37.9193C48.8603 34.6988 48.8603 29.4774 52.0808 26.2569C55.3013 23.0364 60.5227 23.0364 63.7432 26.2569" stroke="#00AE99" stroke-width="3"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/illustrations/tokens.svg b/packages/website/ts/@next/icons/illustrations/tokens.svg
new file mode 100644
index 000000000..966615265
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/tokens.svg
@@ -0,0 +1 @@
+<svg width="249" height="251" viewBox="0 0 152 152" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M192 112c30.376 0 55-24.624 55-55S222.376 2 192 2s-55 24.624-55 55 24.624 55 55 55z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M206.4 15.3v13.6H220" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M220 28.9v42h-37.3V15.3h23.7L220 28.9zM177.6 98.7V85.1H164" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M164 85.1v-42h37.3v55.6h-23.7L164 85.1zM57 113.6c30.376 0 55-24.624 55-55s-24.624-55-55-55-55 24.624-55 55 24.624 55 55 55z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M57 102.6c24.3 0 44-19.7 44-44s-19.7-44-44-44-44 19.7-44 44 19.7 44 44 44z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M45.4 76.2v1.5h26.7v-9.9h-7.8V36.3h-9.461l-.381.259-8.4 5.7-.658.446V54.63l2.342-1.589 6.058-4.11V67.8h-8.4V76.2z" stroke="#00AE99" stroke-width="3"/><path d="M13 58.3c9.1-1.5 16.1-9.3 16.1-18.9 0-4.3-1.4-8.2-3.8-11.4-7.5 7.9-12.2 18.6-12.3 30.3zM13 58.9c.1 11.8 4.8 22.4 12.3 30.3 2.4-3.2 3.8-7.1 3.8-11.4 0-9.6-7-17.5-16.1-18.9zM101 58.3c-9.1-1.5-16.1-9.3-16.1-18.9 0-4.3 1.4-8.2 3.8-11.4 7.5 7.9 12.2 18.6 12.3 30.3zM101 58.9c-.1 11.8-4.8 22.4-12.3 30.3-2.4-3.2-3.8-7.1-3.8-11.4 0-9.6 7-17.5 16.1-18.9zM57 248.6c30.376 0 55-24.624 55-55s-24.624-55-55-55-55 24.624-55 55 24.624 55 55 55z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M57 248.6c30.376 0 55-24.624 55-55s-24.624-55-55-55-55 24.624-55 55 24.624 55 55 55z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M62.6 190.8v-32.3h4.6v-9.1H46.8v9.1h4.6v32.3c-10.5 2.5-18.3 12-18.3 23.2 0 13.2 10.7 23.9 23.9 23.9s23.9-10.7 23.9-23.9c0-11.3-7.8-20.7-18.3-23.2z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M67.2 149.3H46.8v9.1h20.4v-9.1zM37.1 200.6h39.7M192 248.6c30.376 0 55-24.624 55-55s-24.624-55-55-55-55 24.624-55 55 24.624 55 55 55z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/><path d="M192 149.6l-36.4 52.9H192l.1 35.1 36.3-53H192v-35z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/></svg> \ No newline at end of file
diff --git a/packages/website/ts/@next/icons/illustrations/vcIntroductions.svg b/packages/website/ts/@next/icons/illustrations/vcIntroductions.svg
new file mode 100755
index 000000000..024cadab3
--- /dev/null
+++ b/packages/website/ts/@next/icons/illustrations/vcIntroductions.svg
@@ -0,0 +1,11 @@
+<svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2 45C2 68.7578 21.2421 88 45 88C68.7579 88 88 68.7578 88 45C88 21.6448 69.3906 2.63278 46.1793 2.02876C45.7478 2.02876 45.3452 2 44.9137 2C21.2134 2.02876 2 21.2709 2 45Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/>
+<path d="M45 4L9 28H81L45 4Z" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M40 28L40 70" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M26 28L26 70" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M63 28L63 70" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M17 28L17 70" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M50 28L50 70" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M73 28L73 70" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+<path d="M12 72.5V71H78V72.5M71.5 79H18.5" stroke="#00AE99" stroke-width="3" stroke-miterlimit="10"/>
+</svg>
diff --git a/packages/website/ts/@next/icons/logo-with-type.svg b/packages/website/ts/@next/icons/logo-with-type.svg
new file mode 100644
index 000000000..25abf149e
--- /dev/null
+++ b/packages/website/ts/@next/icons/logo-with-type.svg
@@ -0,0 +1 @@
+<svg width="81" height="40" viewBox="0 0 81 40" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.402 25.28l3.105-3.212-3.86-5.209-4.915-6.954A19.904 19.904 0 0 0 0 20c0 6.1 2.732 11.562 7.04 15.23l6.239-4.408a12.796 12.796 0 0 1-4.877-5.541zM14.72 8.402l3.212 3.105 5.209-3.86 6.954-4.915A19.904 19.904 0 0 0 20 0C13.9 0 8.438 2.732 4.77 7.04l4.408 6.239a12.795 12.795 0 0 1 5.541-4.877zM28.493 17.932l3.86 5.209 4.915 6.954A19.904 19.904 0 0 0 40 20c0-6.1-2.732-11.562-7.04-15.23L26.72 9.178a12.796 12.796 0 0 1 4.877 5.541l-3.105 3.213zM35.23 32.96l-4.408-6.239a12.795 12.795 0 0 1-5.541 4.877l-3.213-3.105-5.209 3.86-6.954 4.915A19.904 19.904 0 0 0 20 40c6.1 0 11.562-2.732 15.23-7.04z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M51.726 19.689c0-6.471 2.704-9.689 6.912-9.689 4.19 0 6.947 3.27 6.947 9.689 0 6.418-2.758 9.671-6.947 9.671-4.19 0-6.912-3.253-6.912-9.671zm6.894-7.59c-3.04 0-4.543 2.815-4.543 7.607 0 2.256.336 4.005.972 5.282l5.975-12.085c-.69-.542-1.485-.804-2.404-.804zm-2.351 14.428c.672.507 1.45.77 2.369.77 3.04 0 4.578-2.834 4.578-7.59 0-2.204-.318-3.936-.972-5.247l-5.975 12.067zm24.377-10.93l-3.853 6.47L81 29.027h-2.581l-3.377-5.63h-.954l-3.447 5.63h-2.51l4.224-6.872-3.8-6.559h2.44l3.11 5.334h.973l3.182-5.334h2.386z" fill="#fff"/></svg> \ No newline at end of file
diff --git a/packages/website/ts/@next/pages/about/jobs.tsx b/packages/website/ts/@next/pages/about/jobs.tsx
new file mode 100644
index 000000000..3e117f528
--- /dev/null
+++ b/packages/website/ts/@next/pages/about/jobs.tsx
@@ -0,0 +1,169 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { AboutPageLayout } from 'ts/@next/components/aboutPageLayout';
+import { Link } from 'ts/@next/components/link';
+import { Column, FlexWrap, Section } from 'ts/@next/components/newLayout';
+import { Heading, Paragraph } from 'ts/@next/components/text';
+
+interface PositionProps {
+ title: string;
+ location: string;
+ href: string;
+}
+
+interface PositionItemProps {
+ position: PositionProps;
+}
+
+const positions: PositionProps[] = [
+ {
+ title: 'Product Designer',
+ location: 'San Francisco, Remote',
+ href: '#',
+ },
+ {
+ title: 'Product Designer',
+ location: 'San Francisco, Remote',
+ href: '#',
+ },
+ {
+ title: 'Product Designer',
+ location: 'San Francisco, Remote',
+ href: '#',
+ },
+ {
+ title: 'Open Positition',
+ location: "We're always interested in talking to talented people. Send us an application if you think you're the right fit.",
+ href: '#',
+ },
+];
+
+export const NextAboutJobs = () => (
+ <AboutPageLayout
+ title="Join Us in Our Mission"
+ description="To create a tokenized world where all value can flow freely. We are growing an ecosystem of businesses and projects by solving difficult challenges to make our technology intuitive, flexible, and accessible to all. Join us in building infrastructure upon which the exchange of all assets will take place."
+ linkLabel="Our mission and values"
+ linkUrl="/mission"
+ >
+ <Section bgColor="#F3F6F4" isFlex={true} maxWidth="1170px" wrapWidth="100%">
+ <Column maxWidth="442px">
+ <Heading size="medium" marginBottom="30px">
+ Powered by a Diverse, Global Community
+ </Heading>
+
+ <Paragraph>
+ We're a highly technical team with varied backgrounds in engineering, science, business, finance, and research. While the Core Team is headquartered in San Francisco, there are 30+ teams building on 0x and hundreds of thousands of participants behind our efforts worldwide. We're passionate about open-source software and decentralized technology's potential to act as an equalizing force in the world.
+ </Paragraph>
+ </Column>
+
+ <Column maxWidth="600px">
+ <ImageWrap>
+ <img src="/images/@next/jobs/map@2x.png" height="365" alt="Map of community"/>
+ </ImageWrap>
+ </Column>
+ </Section>
+
+ <Section isFlex={true} maxWidth="1170px" wrapWidth="100%">
+ <Column>
+ <Heading size="medium">Benefits</Heading>
+ </Column>
+
+ <Column maxWidth="826px">
+ <BenefitsList>
+ <li>Comprehensive Insurance</li>
+ <li>Unlimited Vacation</li>
+ <li>Meals and snacks provided daily</li>
+ <li>Flexible hours and liberal work-from-home-policy</li>
+ <li>Supportive of remote working</li>
+ <li>Transportation, phone, and wellness expense</li>
+ <li>Relocation assistance</li>
+ <li>Optional team excursions</li>
+ <li>Competitive salary</li>
+ <li>Cryptocurrency based compensation</li>
+ </BenefitsList>
+ </Column>
+ </Section>
+
+ <Section isFlex={true} maxWidth="1170px" wrapWidth="100%">
+ <Column>
+ <Heading size="medium">Current<br/>Openings</Heading>
+ </Column>
+
+ <Column maxWidth="826px">
+
+ {_.map(positions, (position, index) => (
+ <Position key={`position-${index}`} position={position} />
+ ))}
+ </Column>
+ </Section>
+ </AboutPageLayout>
+);
+
+export const Position: React.FunctionComponent<PositionItemProps> = (props: PositionItemProps) => {
+ const { position } = props;
+ return (
+ <PositionWrap>
+ <StyledColumn width="30%">
+ <Heading asElement="h3" size="small" fontWeight="400" marginBottom="0"><a href={position.href}>{position.title}</a></Heading>
+ </StyledColumn>
+
+ <StyledColumn width="50%" padding="0 40px 0 0">
+ <Paragraph isMuted={true} marginBottom="0">{position.location}</Paragraph>
+ </StyledColumn>
+
+ <StyledColumn width="20%">
+ <Paragraph marginBottom="0" textAlign="right"><Link href={position.href}>Apply</Link></Paragraph>
+ </StyledColumn>
+ </PositionWrap>
+ );
+};
+
+const BenefitsList = styled.ul`
+ color: #000;
+ font-weight: 300;
+ line-height: 1.444444444;
+ list-style: disc;
+ columns: auto 2;
+ column-gap: 80px;
+
+ li {
+ margin-bottom: 1em;
+ }
+`;
+
+const ImageWrap = styled.figure`
+ @media (min-width: 768px) {
+ height: 600px;
+ padding-left: 60px;
+ display: flex;
+ align-items: flex-end;
+ }
+`;
+
+const StyledColumn = styled(Column)`
+ flex-shrink: 0;
+
+ @media (max-width: 768px) {
+ & + & {
+ margin-top: 15px;
+ }
+ }
+`;
+
+const PositionWrap = styled(FlexWrap)`
+ margin-bottom: 40px;
+ padding-bottom: 30px;
+ position: relative;
+
+ &:after {
+ content: '';
+ width: 100%;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 1px;
+ background-color: #E3E3E3;
+ }
+`;
diff --git a/packages/website/ts/@next/pages/about/mission.tsx b/packages/website/ts/@next/pages/about/mission.tsx
new file mode 100644
index 000000000..78602f8ad
--- /dev/null
+++ b/packages/website/ts/@next/pages/about/mission.tsx
@@ -0,0 +1,95 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { AboutPageLayout } from 'ts/@next/components/aboutPageLayout';
+import { Definition } from 'ts/@next/components/definition';
+import { Image } from 'ts/@next/components/image';
+import { Column, Section } from 'ts/@next/components/newLayout';
+import { Heading } from 'ts/@next/components/text';
+
+const values = [
+ {
+ title: 'Do The Right Thing',
+ description: 'We acknowledge the broad subjectivity behind doing “the right thing,” and are committed to rigorously exploring its nuance in our decision making. We believe this responsibility drives our decision making above all else, and pledge to act in the best interest of our peers, community, and society as a whole.',
+ icon: 'right-thing',
+ },
+ {
+ title: 'Consistently Ship',
+ description: 'Achieving our mission requires dedication and diligence. We aspire to be an organization that consistently ships. We set high-impact goals that are rooted in data and pride ourselves in consistently outputting outstanding results across the organization.',
+ icon: 'consistently-ship',
+ },
+ {
+ title: 'Focus on Long-term Impact',
+ description: 'We anticipate that over time, awareness of the fundamentally disruptive nature of frictionless global exchange will cause some to see this technology as a threat. There will be setbacks, some will claim that this technology is too disruptive, and we will face adversity. Persistence and a healthy long-term focus will see us through these battles.',
+ icon: 'long-term-impact',
+ },
+];
+
+export const NextAboutMission = () => (
+ <AboutPageLayout
+ title="Creating a tokenized world where all value can flow freely."
+ description="0x is important infrastructure for the emerging crypto economy and enables markets to be created that couldn't have existed before. As more assets become tokenized, public blockchains provide the opportunity to establish a new financial stack that is more efficient, transparent, and equitable than any system in the past."
+ linkLabel="Our mission and values"
+ linkUrl="#"
+ >
+ <Section isFullWidth={true} isPadded={false}>
+ <FullWidthImage>
+ <Image
+ src="/images/@next/about/about-office.png"
+ alt="0x Offices"
+ isCentered={true}
+ />
+ </FullWidthImage>
+ </Section>
+
+ <Section isFlex={true} maxWidth="1170px" wrapWidth="100%">
+ <Column>
+ <Heading size="medium" maxWidth="226px">
+ Core Values
+ </Heading>
+ </Column>
+
+ <Column width="70%" maxWidth="826px">
+ <Column width="100%" maxWidth="800px">
+ {_.map(values, (item, index) => (
+ <StyledDefinition
+ icon={item.icon}
+ title={item.title}
+ description={item.description}
+ isInlineIcon={true}
+ iconSize="large"
+ />
+ ))}
+ </Column>
+ </Column>
+ </Section>
+ </AboutPageLayout>
+);
+
+const StyledDefinition = styled(Definition)`
+ & + & {
+ margin-top: 30px;
+ padding-top: 30px;
+ border-top: 1px solid #eaeaea;
+ }
+`;
+
+const FullWidthImage = styled.figure`
+ width: 100vw;
+ margin-left: calc(50% - 50vw);
+
+ img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ }
+
+ @media (min-width: 768px) {
+ height: 500px;
+ }
+
+ @media (max-width: 768px) {
+ height: 400px;
+ }
+`;
diff --git a/packages/website/ts/@next/pages/about/press.tsx b/packages/website/ts/@next/pages/about/press.tsx
new file mode 100644
index 000000000..4ef043e80
--- /dev/null
+++ b/packages/website/ts/@next/pages/about/press.tsx
@@ -0,0 +1,84 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { AboutPageLayout } from 'ts/@next/components/aboutPageLayout';
+import { Button } from 'ts/@next/components/button';
+import { Column, FlexWrap } from 'ts/@next/components/newLayout';
+import { Paragraph } from 'ts/@next/components/text';
+
+interface HighlightProps {
+ logo: string;
+ title?: string;
+ text: string;
+ href: string;
+}
+
+interface HighlightItemProps {
+ highlight: HighlightProps;
+}
+
+const highlights: HighlightProps[] = [
+ {
+ logo: '/images/@next/press/logo-forbes.png',
+ title: 'Forbes',
+ text: '0x Instant is aiming to aid businesses and developers such as news sites, crypto wallets, dApps or price trackers to monetize or add a new revenue stream to their existing pipeline.',
+ href: '#',
+ },
+ {
+ logo: '/images/@next/press/logo-venturebeat.png',
+ title: 'VentureBeat',
+ text: '0x leads the way for ‘tokenization’ of the world, and collectible game items are next',
+ href: '#',
+ },
+ {
+ logo: '/images/@next/press/logo-fortune.png',
+ title: 'Fortune',
+ text: 'In the future, many traditional investments like real estate and corporate shares will come in the form of digital tokens that are bought and transferred on a <blockchain className=""></blockchain>',
+ href: '#',
+ },
+ {
+ logo: '/images/@next/press/logo-techcrunch.png',
+ title: 'TechCrunch',
+ text: '0x allows any developer to quickly build their own decentralized cryptocurrency exchange and decide their own fees.',
+ href: '#',
+ },
+];
+
+export const NextAboutPress = () => (
+ <AboutPageLayout
+ title="Press Highlights"
+ description={
+ <>
+ <Paragraph marginBottom="60px">
+ Want to write about 0x? <a href="#">Get in touch</a>, or <a href="#">download our press kit</a>.
+ </Paragraph>
+
+ {_.map(highlights, (highlight, index) => (
+ <Highlight key={`highlight-${index}`} highlight={highlight} />
+ ))}
+ </>
+ }
+ />
+);
+
+export const Highlight: React.FunctionComponent<HighlightItemProps> = (props: HighlightItemProps) => {
+ const { highlight } = props;
+ return (
+ <HighlightWrap>
+ <Column>
+ <img src={highlight.logo} alt={highlight.title} />
+ </Column>
+
+ <Column width="60%" maxWidth="560px">
+ <Paragraph isMuted={false}>{highlight.text}</Paragraph>
+ <Button href={highlight.href} isWithArrow={true} isNoBorder={true}>Read Article</Button>
+ </Column>
+ </HighlightWrap>
+ );
+};
+
+const HighlightWrap = styled(FlexWrap)`
+ border-top: 1px solid #eaeaea;
+ padding: 30px 0;
+`;
diff --git a/packages/website/ts/@next/pages/about/team.tsx b/packages/website/ts/@next/pages/about/team.tsx
new file mode 100644
index 000000000..bf8d02095
--- /dev/null
+++ b/packages/website/ts/@next/pages/about/team.tsx
@@ -0,0 +1,298 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { colors } from 'ts/style/colors';
+
+import { AboutPageLayout } from 'ts/@next/components/aboutPageLayout';
+import { Column, Section } from 'ts/@next/components/newLayout';
+import { Heading, Paragraph } from 'ts/@next/components/text';
+import { WebsitePaths } from 'ts/types';
+
+interface TeamMember {
+ name: string;
+ title: string;
+ imageUrl?: string;
+}
+
+const team: TeamMember[] = [
+ {
+ imageUrl: '/images/@next/team/willw.jpg',
+ name: 'Will Warren',
+ title: 'co-founder & CEO',
+ },
+ {
+ imageUrl: '/images/@next/team/amirb.jpg',
+ name: 'Amir Bandeali',
+ title: 'Co-founder & CTO',
+ },
+ {
+ imageUrl: '/images/@next/team/fabiob.jpg',
+ name: 'Fabio Berger',
+ title: 'senior engineer',
+ },
+ {
+ imageUrl: '/images/@next/team/alexv.jpg',
+ name: 'Alex Xu',
+ title: 'Director of operations',
+ },
+ {
+ imageUrl: '/images/@next/team/leonidL.jpg',
+ name: 'Leonid Logvinov',
+ title: 'engineer',
+ },
+ {
+ imageUrl: '/images/@next/team/benb.jpg',
+ name: 'Ben Burns',
+ title: 'designer',
+ },
+ {
+ imageUrl: '/images/@next/team/brandonm.jpg',
+ name: 'Brandon Millman',
+ title: 'senior engineer',
+ },
+ {
+ imageUrl: '/images/@next/team/toms.jpg',
+ name: 'Tom Schmidt',
+ title: 'product manager',
+ },
+ {
+ imageUrl: '/images/@next/team/jacobe.jpg',
+ name: 'Jacob Evans',
+ title: 'ecosystem engineer',
+ },
+ {
+ imageUrl: '/images/@next/team/blake.jpg',
+ name: 'Blake Henderson',
+ title: 'operations associate',
+ },
+ {
+ imageUrl: '/images/@next/team/zack.jpg',
+ name: 'Zack Skelly',
+ title: 'lead recruiter',
+ },
+ {
+ imageUrl: '/images/@next/team/greg.jpg',
+ name: 'Greg Hysen',
+ title: 'blockchain engineer',
+ },
+ {
+ imageUrl: '/images/@next/team/remcoB.jpg',
+ name: 'Remco Bloemen',
+ title: 'technical fellow',
+ },
+ {
+ imageUrl: '/images/@next/team/francesco.jpg',
+ name: 'Francesco Agosti',
+ title: 'engineer',
+ },
+ {
+ imageUrl: '/images/@next/team/melo.jpg',
+ name: 'Mel Oberto',
+ title: 'office ops / executive assistant',
+ },
+ {
+ imageUrl: '/images/@next/team/alexb.jpg',
+ name: 'Alex Browne',
+ title: 'engineer in residence',
+ },
+ {
+ imageUrl: '/images/@next/team/peterz.jpg',
+ name: 'Peter Zeitz',
+ title: 'research fellow',
+ },
+ {
+ imageUrl: '/images/@next/team/chrisk.jpg',
+ name: 'Chris Kalani',
+ title: 'director of design',
+ },
+ {
+ imageUrl: '/images/@next/team/clayr.jpg',
+ name: 'Clay Robbins',
+ title: 'ecosystem development lead',
+ },
+ {
+ imageUrl: '/images/@next/team/mattt.jpg',
+ name: 'Matt Taylor',
+ title: 'marketing lead',
+ },
+ {
+ imageUrl: '/images/@next/team/eugenea.jpg',
+ name: 'Eugene Aumson',
+ title: 'engineer',
+ },
+ {
+ imageUrl: '/images/@next/team/weijew.jpg',
+ name: 'Weijie Wu',
+ title: 'research fellow',
+ },
+ {
+ imageUrl: '/images/@next/team/rahuls.jpg',
+ name: 'Rahul Singireddy',
+ title: 'relayer success manager',
+ },
+ {
+ imageUrl: '/images/@next/team/jasons.jpg',
+ name: 'Jason Somensatto',
+ title: 'strategic legal counsel',
+ },
+ {
+ imageUrl: '/images/@next/team/steveK.jpg',
+ name: 'Steve Klebanoff',
+ title: 'senior engineer',
+ },
+ {
+ imageUrl: '/images/@next/team/xianny.jpg',
+ name: 'Xianny Ng',
+ title: 'engineer',
+ },
+];
+
+const advisors: TeamMember[] = [
+ {
+ imageUrl: '/images/@next/team/advisors/frede.jpg',
+ name: 'Fred Ehrsam',
+ title: 'Advisor',
+ },
+ {
+ imageUrl: '/images/@next/team/advisors/olafc.jpg',
+ name: 'Olaf Carlson-Wee',
+ title: 'Advisor',
+ },
+ {
+ imageUrl: '/images/@next/team/advisors/joeyk.jpg',
+ name: 'Joey Krug',
+ title: 'Advisor',
+ },
+ {
+ imageUrl: '/images/@next/team/advisors/lindax.jpg',
+ name: 'Linda Xie',
+ title: 'Advisor',
+ },
+ {
+ imageUrl: '/images/@next/team/advisors/davids.jpg',
+ name: 'David Sacks',
+ title: 'Advisor',
+ },
+];
+
+export const NextAboutTeam = () => (
+ <AboutPageLayout
+ title="We are a global, growing team"
+ description="We are a distributed team with backgrounds in engineering, academic research, business, and design. The 0x Core Team is passionate about accelerating the adoption decentralized technology and believe in its potential to be an equalizing force in the world. Join us and do the most impactful work of your life."
+ linkLabel="Join the team"
+ linkUrl={WebsitePaths.AboutJobs}
+ >
+ <Section
+ maxWidth="1170px"
+ wrapWidth="100%"
+ isFlex={true}
+ flexBreakpoint="900px"
+ >
+ <Column>
+ <Heading size="medium">0x Team</Heading>
+ </Column>
+
+ <Column
+ width="70%"
+ maxWidth="800px"
+ >
+ <StyledGrid>
+ {_.map(team, (info: TeamMember, index: number) => (
+ <Member key={`team-${index}`} name={info.name} title={info.title} imageUrl={info.imageUrl} />
+ ))}
+ </StyledGrid>
+ </Column>
+ </Section>
+
+ <Section
+ bgColor="#F3F6F4"
+ maxWidth="1170px"
+ wrapWidth="100%"
+ flexBreakpoint="900px"
+ isFlex={true}
+ >
+ <Column>
+ <Heading size="medium">Advisors</Heading>
+ </Column>
+
+ <Column
+ width="70%"
+ maxWidth="800px"
+ >
+ <StyledGrid>
+ {_.map(advisors, (info: TeamMember, index: number) => (
+ <Member key={`advisor-${index}`} name={info.name} title={info.title} imageUrl={info.imageUrl} />
+ ))}
+ </StyledGrid>
+ </Column>
+ </Section>
+ </AboutPageLayout>
+);
+
+const StyledGrid = styled.div`
+ &:after {
+ content: '';
+ clear: both;
+ }
+`;
+
+const Member = ({ name, title, imageUrl }: TeamMember) => (
+ <StyledMember>
+ <img src={imageUrl} alt={name}/>
+ <Name>{name}</Name>
+ <MemberTitle isMuted={0.5} size={14} style={{ textTransform: 'capitalize' }}>{title}</MemberTitle>
+ </StyledMember>
+);
+
+const StyledMember = styled.div`
+ margin-bottom: 10px;
+ float: left;
+ width: calc(50% - 15px);
+ margin-right: 15px;
+
+ @media (max-width: 600px) {
+ &:nth-child(2n+1) {
+ clear: left;
+ }
+ }
+
+ img, svg {
+ width: 100%;
+ height: auto;
+ object-fit: contain;
+ margin-bottom: 10px;
+ }
+
+ @media (min-width: 600px) {
+ width: calc(33.3333% - 30px);
+ margin-right: 20px;
+
+ &:nth-child(3n+1) {
+ clear: left;
+ }
+ }
+
+ @media (min-width: 900px) {
+ width: calc(25% - 30px);
+
+ &:nth-child(3n+1) {
+ clear: none;
+ }
+
+ &:nth-child(4n+1) {
+ clear: left;
+ }
+ }
+`;
+
+const Name = styled.h3`
+ color: ${colors.textDarkPrimary};
+ font-size: 14px;
+ line-height: 1;
+ margin: 0;
+`;
+
+const MemberTitle = styled(Paragraph)`
+ font-size: 14px;
+`;
diff --git a/packages/website/ts/@next/pages/ecosystem.tsx b/packages/website/ts/@next/pages/ecosystem.tsx
new file mode 100644
index 000000000..2f996d3e4
--- /dev/null
+++ b/packages/website/ts/@next/pages/ecosystem.tsx
@@ -0,0 +1,112 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { colors } from 'ts/style/colors';
+
+import {Button} from 'ts/@next/components/button';
+import { Icon } from 'ts/@next/components/icon';
+import { Column, Section, WrapGrid } from 'ts/@next/components/newLayout';
+import { SiteWrap } from 'ts/@next/components/siteWrap';
+import { Heading, Paragraph } from 'ts/@next/components/text';
+
+interface BenefitProps {
+ title: string;
+ icon: string;
+ description: string;
+}
+
+const benefits: BenefitProps[] = [
+ {
+ icon: 'milestoneGrants',
+ title: 'Milestone Grants',
+ description: 'Receive non-dilutive capital ranging from $10,000 to $100,000, with grant sizes awarded based on the quality of your team, vision, execution, and community involvement.',
+ },
+ {
+ icon: 'vcIntroductions',
+ title: 'VC Introductions',
+ description: 'Connect with leading venture capital firms that could participate in your next funding round.',
+ },
+ {
+ icon: 'techSupport',
+ title: 'Technical Support',
+ description: 'Receive ongoing technical assistance from knowledgeable and responsive 0x developers.',
+ },
+ {
+ icon: 'recruitingSupport',
+ title: 'Recruiting Assistance',
+ description: 'Grow your team by accessing an exclusive pool of top engineering and business operations talent.',
+ },
+ {
+ icon: 'eficientDesign',
+ title: 'Marketing and Design Help',
+ description: 'Get strategic advice on product positioning, customer acquisition, and UI/UX design that can impact the growth of your business.',
+ },
+ {
+ icon: 'legalResources',
+ title: 'Legal Resources',
+ description: 'Access important legal resources that will help you navigate the regulatory landscape.',
+ },
+];
+
+export const NextEcosystem = () => (
+ <SiteWrap theme="light">
+ <Section isTextCentered={true}>
+ <Column>
+ <Heading size="medium" isCentered={true}>
+ Jumpstart your Business on 0x
+ </Heading>
+ <Paragraph size="medium" isCentered={true} isMuted={true} marginBottom="0">
+ The Ecosystem Acceleration Program gives teams access to a variety of services including funding, personalized technical support, and recruiting assistance. We created the Ecosystem Acceleration Program to bolster the expansion of both infrastructure projects and relayers building on 0x.
+ </Paragraph>
+ <LinkWrap>
+ <Button
+ to="#"
+ isWithArrow={true}
+ isAccentColor={true}
+ >
+ Apply now
+ </Button>
+ <Button
+ to="#"
+ isWithArrow={true}
+ isAccentColor={true}
+ >
+ Learn More
+ </Button>
+ </LinkWrap>
+ </Column>
+ </Section>
+
+ <Section bgColor={colors.backgroundLight} isFullWidth={true}>
+ <Column>
+ <Heading size={34} fontWeight="400" asElement="h2" isCentered={true} maxWidth="507px" marginBottom="70px">
+ Join a vibrant ecosystem of projects in the 0x Network.
+ </Heading>
+ </Column>
+ <WrapGrid isTextCentered={true} isWrapped={true} isFullWidth={true}>
+ {_.map(benefits, (benefit: BenefitProps, index) => (
+ <Column key={`benefit-${index}`} width="33%" padding="0 45px 30px">
+ <Icon name={benefit.icon} size="medium" margin={[0, 0, 'small', 0]} />
+ <Heading color={colors.textDarkPrimary} size="small" marginBottom="10px" isCentered={true}>
+ {benefit.title}
+ </Heading>
+ <Paragraph isMuted={true} isCentered={true}>
+ {benefit.description}
+ </Paragraph>
+ </Column>
+ ))}
+ </WrapGrid>
+ </Section>
+
+ </SiteWrap>
+);
+
+const LinkWrap = styled.div`
+ display: inline-flex;
+ margin-top: 60px;
+
+ a + a {
+ margin-left: 60px;
+ }
+`;
diff --git a/packages/website/ts/@next/pages/instant.tsx b/packages/website/ts/@next/pages/instant.tsx
new file mode 100644
index 000000000..d86fa2203
--- /dev/null
+++ b/packages/website/ts/@next/pages/instant.tsx
@@ -0,0 +1,219 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled, { keyframes } from 'styled-components';
+
+import {colors} from 'ts/style/colors';
+
+import {Banner} from 'ts/@next/components/banner';
+import {Hero} from 'ts/@next/components/hero';
+
+import {Button} from 'ts/@next/components/button';
+import {Definition} from 'ts/@next/components/definition';
+import {Section, SectionProps} from 'ts/@next/components/newLayout';
+import {SiteWrap} from 'ts/@next/components/siteWrap';
+import {Heading, Paragraph} from 'ts/@next/components/text';
+import { Configurator } from 'ts/@next/pages/instant/configurator';
+import { ModalContact } from '../components/modals/modal_contact';
+
+const featuresData = [
+ {
+ title: 'Support ERC-20 and ERC-721 tokens',
+ icon: 'supportForAllEthereumStandards-large',
+ description: 'Seamlessly integrate token purchasing into your product experience by offering digital assets ranging from in-game items to stablecoins.',
+ links: [
+ {
+ label: 'Get Started',
+ url: '#',
+ },
+ {
+ label: 'Explore the Docs',
+ url: '#',
+ },
+ ],
+ },
+ {
+ title: 'Generate revenue for your business',
+ icon: 'generateRevenueForYourBusiness-large',
+ description: 'With just a few lines of code, you can earn up to 5% in affiliate fees on every transaction from your crypto wallet or dApp.',
+ links: [
+ {
+ label: 'Learn about affiliate fees',
+ url: '#',
+ },
+ ],
+ },
+ {
+ title: 'Easy and flexible integration',
+ icon: 'flexibleIntegration0xInstant',
+ description: 'Use our out-of-the-box design or customize the user interface by integrating via the AssetBuyer engine.. You can also tap into 0x networked liquidity or choose your own liquidity pool.',
+ links: [
+ {
+ label: 'Explore AssetBuyer',
+ url: '#',
+ },
+ {
+ label: 'Learn about liquidity',
+ url: '#',
+ },
+ ],
+ },
+];
+
+interface Props {
+ theme: {
+ bgColor: string;
+ textColor: string;
+ linkColor: string;
+ };
+}
+
+export class Next0xInstant extends React.Component<Props> {
+ public state = {
+ isContactModalOpen: false,
+ };
+ public render(): React.ReactNode {
+ return (
+ <SiteWrap>
+ <Hero
+ title="Introducing 0x Instant"
+ description="A free and flexible way to offer simple crypto purchasing in any app or website"
+ actions={<Button href="#configurator">Get Started</Button>}
+ />
+
+ <Section isFullWidth={true} isPadded={false} padding="30px 0">
+ <MarqueeWrap>
+ <div>
+ {[...Array(18)].map((item, index) => (
+ <Card key={`card-${index}`} index={index}>
+ <img src={`/images/@next/0x-instant/widget-${(index % 6) + 1}.png`} />
+ </Card>
+ ))}
+ </div>
+ </MarqueeWrap>
+ </Section>
+
+ <Section>
+ {_.map(featuresData, (item, index) => (
+ <Definition
+ key={`definition-${index}`}
+ icon={item.icon}
+ title={item.title}
+ description={item.description}
+ isInlineIcon={true}
+ iconSize={240}
+ actions={item.links}
+ />
+ ))}
+ </Section>
+
+ <ConfiguratorSection id="configurator" maxWidth="1386px" padding="0 58px 70px" bgColor={colors.backgroundDark}>
+ <Heading>0x Instant Configurator</Heading>
+ <Configurator />
+ </ConfiguratorSection>
+
+ <Banner
+ heading="Need more flexibility?"
+ subline="Dive into our docs, or contact us if needed"
+ mainCta={{ text: 'Explore the Docs', href: '/docs' }}
+ secondaryCta={{ text: 'Get in Touch', onClick: this._onOpenContactModal.bind(this) }}
+ />
+ <ModalContact isOpen={this.state.isContactModalOpen} onDismiss={this._onDismissContactModal} />
+
+ <Section maxWidth="1170px" isPadded={false} padding="60px 0">
+ <Paragraph size="small" isMuted={0.5}>Disclaimer: The laws and regulations applicable to the use and exchange of digital assets and blockchain-native tokens, including through any software developed using the licensed work created by ZeroEx Intl. (the “Work”), vary by jurisdiction. As set forth in the Apache License, Version 2.0 applicable to the Work, developers are “solely responsible for determining the appropriateness of using or redistributing the Work,” which includes responsibility for ensuring compliance with any such applicable laws and regulations.</Paragraph>
+ <Paragraph size="small" isMuted={0.5}>See the Apache License, Version 2.0 for the specific language governing all applicable permissions and limitations.</Paragraph>
+ </Section>
+ </SiteWrap>
+ );
+ }
+
+ public _onOpenContactModal = (): void => {
+ this.setState({ isContactModalOpen: true });
+ }
+
+ public _onDismissContactModal = (): void => {
+ this.setState({ isContactModalOpen: false });
+ }
+}
+
+// scroll animation calc is simply (imageWidth * totalRepetitions) / 2
+// img width is 370px
+const scroll = keyframes`
+ 0% { transform: translate3d(-2220px, 0, 0) }
+ 100% { transform: translate3d(-4440px, 0, 0) }
+`;
+
+const scrollMobile = keyframes`
+ 0% { transform: translate3d(0, 0, 0) }
+ 100% { transform: translate3d(-1800px, 0, 0) }
+`;
+
+const fadeUp = keyframes`
+ 0% {
+ opacity: 0;
+ transform: translateY(50px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0px);
+ }
+`;
+
+const ConfiguratorSection = styled(Section)<SectionProps>`
+ @media (max-width: 1050px) {
+ display: none;
+ }
+`;
+
+// width = 370 * 12
+// mobile width = 300
+const MarqueeWrap = styled.div`
+ width: 100vw;
+ height: 514px;
+ padding-bottom: 60px;
+
+ > div {
+ height: auto;
+ display: flex;
+ will-change: transform;
+ transform: translate3d(-2220px, 0, 0);
+ }
+
+ @media (min-width: 768px) {
+ > div {
+ width: 6660px;
+ animation: ${scroll} 70s linear infinite;
+ }
+ }
+
+ @media (max-width: 768px) {
+ > div {
+ width: 5400px;
+ animation: ${scrollMobile} 70s linear infinite;
+ }
+ }
+`;
+
+const Card = styled.div<{index: number}>`
+ opacity: 0;
+ flex-shrink: 0;
+ transform: translateY(10px);
+ will-change: opacity, transform;
+ animation: ${fadeUp} 0.75s ${props => `${props.index * 0.05}s`} forwards;
+
+ img {
+ height: auto;
+ }
+
+ @media (min-width: 768px) {
+ img {
+ width: 370px;
+ }
+ }
+
+ @media (max-width: 768px) {
+ img {
+ width: 300px;
+ }
+ }
+`;
diff --git a/packages/website/ts/@next/pages/instant/code_demo.tsx b/packages/website/ts/@next/pages/instant/code_demo.tsx
new file mode 100644
index 000000000..35eaf6b2a
--- /dev/null
+++ b/packages/website/ts/@next/pages/instant/code_demo.tsx
@@ -0,0 +1,178 @@
+import * as React from 'react';
+import * as CopyToClipboard from 'react-copy-to-clipboard';
+import SyntaxHighlighter from 'react-syntax-highlighter';
+
+import { Button } from 'ts/components/ui/button';
+import { Container } from 'ts/components/ui/container';
+import { styled } from 'ts/style/theme';
+import { zIndex } from 'ts/style/z_index';
+
+const CustomPre = styled.pre`
+ margin: 0px;
+ line-height: 24px;
+ overflow: scroll;
+ width: 100%;
+ height: 100%;
+ max-height: 800px;
+ border-radius: 4px;
+ code {
+ background-color: inherit !important;
+ border-radius: 0px;
+ font-family: 'Roboto Mono', sans-serif;
+ border: none;
+ }
+ code:first-of-type {
+ background-color: #060D0D !important;
+ color: #999;
+ min-height: 100%;
+ text-align: center;
+ margin-right: 15px;
+ line-height: 25px;
+ padding: 10px 7px !important;
+ }
+ code:last-of-type {
+ position: relative;
+ top: 10px;
+ top: 0;
+ padding-top: 11px;
+ display: inline-block;
+ line-height: 25px;
+ }
+`;
+
+const customStyle = {
+ 'hljs-comment': {
+ color: '#7e7887',
+ },
+ 'hljs-quote': {
+ color: '#7e7887',
+ },
+ 'hljs-variable': {
+ color: '#be4678',
+ },
+ 'hljs-template-variable': {
+ color: '#be4678',
+ },
+ 'hljs-attribute': {
+ color: '#be4678',
+ },
+ 'hljs-regexp': {
+ color: '#be4678',
+ },
+ 'hljs-link': {
+ color: '#be4678',
+ },
+ 'hljs-tag': {
+ color: '#61f5ff',
+ },
+ 'hljs-name': {
+ color: '#61f5ff',
+ },
+ 'hljs-selector-id': {
+ color: '#be4678',
+ },
+ 'hljs-selector-class': {
+ color: '#be4678',
+ },
+ 'hljs-number': {
+ color: '#c994ff',
+ },
+ 'hljs-meta': {
+ color: '#61f5ff',
+ },
+ 'hljs-built_in': {
+ color: '#aa573c',
+ },
+ 'hljs-builtin-name': {
+ color: '#aa573c',
+ },
+ 'hljs-literal': {
+ color: '#aa573c',
+ },
+ 'hljs-type': {
+ color: '#aa573c',
+ },
+ 'hljs-params': {
+ color: '#aa573c',
+ },
+ 'hljs-string': {
+ color: '#bcff88',
+ },
+ 'hljs-symbol': {
+ color: '#2a9292',
+ },
+ 'hljs-bullet': {
+ color: '#2a9292',
+ },
+ 'hljs-title': {
+ color: '#576ddb',
+ },
+ 'hljs-section': {
+ color: '#576ddb',
+ },
+ 'hljs-keyword': {
+ color: '#955ae7',
+ },
+ 'hljs-selector-tag': {
+ color: '#955ae7',
+ },
+ 'hljs-deletion': {
+ color: '#19171c',
+ display: 'inline-block',
+ width: '100%',
+ backgroundColor: '#be4678',
+ },
+ 'hljs-addition': {
+ color: '#19171c',
+ display: 'inline-block',
+ width: '100%',
+ backgroundColor: '#2a9292',
+ },
+ hljs: {
+ display: 'block',
+ overflowX: 'hidden',
+ background: '#1B2625',
+ color: 'white',
+ fontSize: '12px',
+ },
+ 'hljs-emphasis': {
+ fontStyle: 'italic',
+ },
+ 'hljs-strong': {
+ fontWeight: 'bold',
+ },
+};
+
+export interface CodeDemoProps {
+ children: string;
+}
+
+export interface CodeDemoState {
+ didCopyCode: boolean;
+}
+
+export class CodeDemo extends React.Component<CodeDemoProps, CodeDemoState> {
+ public state: CodeDemoState = {
+ didCopyCode: false,
+ };
+ public render(): React.ReactNode {
+ const copyButtonText = this.state.didCopyCode ? 'Copied!' : 'Copy';
+ return (
+ <Container position="relative" height="100%">
+ <Container position="absolute" top="10px" right="10px" zIndex={zIndex.overlay - 1}>
+ <CopyToClipboard text={this.props.children} onCopy={this._handleCopyClick}>
+ <Button fontSize="14px">
+ <b>{copyButtonText}</b>
+ </Button>
+ </CopyToClipboard>
+ </Container>
+ <SyntaxHighlighter language="html" style={customStyle} showLineNumbers={true} PreTag={CustomPre}>
+ {this.props.children}
+ </SyntaxHighlighter>
+ </Container>
+ );
+ }
+ private readonly _handleCopyClick = () => {
+ this.setState({ didCopyCode: true });
+ };
+}
diff --git a/packages/website/ts/@next/pages/instant/config_generator.tsx b/packages/website/ts/@next/pages/instant/config_generator.tsx
new file mode 100644
index 000000000..8857e4fea
--- /dev/null
+++ b/packages/website/ts/@next/pages/instant/config_generator.tsx
@@ -0,0 +1,329 @@
+import { StandardRelayerAPIOrderProvider } from '@0x/asset-buyer';
+import { getContractAddressesForNetworkOrThrow } from '@0x/contract-addresses';
+import { assetDataUtils } from '@0x/order-utils';
+import { ObjectMap } from '@0x/types';
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { ConfigGeneratorAddressInput } from 'ts/@next/pages/instant/config_generator_address_input';
+import { FeePercentageSlider } from 'ts/@next/pages/instant/fee_percentage_slider';
+import { CheckMark } from 'ts/components/ui/check_mark';
+import { Container } from 'ts/components/ui/container';
+import { MultiSelect } from 'ts/components/ui/multi_select';
+import { Spinner } from 'ts/components/ui/spinner';
+import { Text } from 'ts/components/ui/text';
+import { colors } from 'ts/style/colors';
+import { WebsitePaths } from 'ts/types';
+import { constants } from 'ts/utils/constants';
+
+// New components
+import { Heading } from 'ts/@next/components/text';
+import { Select, SelectItemConfig } from 'ts/@next/pages/instant/select';
+
+import { assetMetaDataMap } from '../../../../../instant/src/data/asset_meta_data_map';
+import { ERC20AssetMetaData, ZeroExInstantBaseConfig } from '../../../../../instant/src/types';
+
+export interface ConfigGeneratorProps {
+ value: ZeroExInstantBaseConfig;
+ onConfigChange: (config: ZeroExInstantBaseConfig) => void;
+}
+
+export interface ConfigGeneratorState {
+ isLoadingAvailableTokens: boolean;
+ // Address to token info
+ availableTokens?: ObjectMap<ERC20AssetMetaData>;
+}
+
+const SRA_ENDPOINTS = ['https://api.radarrelay.com/0x/v2/', 'https://sra.bamboorelay.com/0x/v2/'];
+
+export class ConfigGenerator extends React.Component<ConfigGeneratorProps, ConfigGeneratorState> {
+ public state: ConfigGeneratorState = {
+ isLoadingAvailableTokens: true,
+ };
+ public componentDidMount(): void {
+ // tslint:disable-next-line:no-floating-promises
+ this._setAvailableAssetsFromOrderProvider();
+ }
+ public componentDidUpdate(prevProps: ConfigGeneratorProps): void {
+ if (prevProps.value.orderSource !== this.props.value.orderSource) {
+ // tslint:disable-next-line:no-floating-promises
+ this._setAvailableAssetsFromOrderProvider();
+ const newConfig: ZeroExInstantBaseConfig = {
+ ...this.props.value,
+ availableAssetDatas: undefined,
+ };
+ this.props.onConfigChange(newConfig);
+ }
+ }
+ public render(): React.ReactNode {
+ const { value } = this.props;
+ if (!_.isString(value.orderSource)) {
+ throw new Error('ConfigGenerator component only supports string values as an orderSource.');
+ }
+ return (
+ <Container minWidth="350px">
+ <ConfigGeneratorSection title="Liquidity Source">
+ <Select id="" value={value.orderSource} items={this._generateItems()} />
+ </ConfigGeneratorSection>
+ <ConfigGeneratorSection {...this._getTokenSelectorProps()}>
+ {this._renderTokenMultiSelectOrSpinner()}
+ </ConfigGeneratorSection>
+ <ConfigGeneratorSection title="Transaction fee ETH address" marginBottom="10px" isOptional={true}>
+ <ConfigGeneratorAddressInput
+ value={value.affiliateInfo ? value.affiliateInfo.feeRecipient : ''}
+ onChange={this._handleAffiliateAddressChange}
+ />
+ </ConfigGeneratorSection>
+ <ConfigGeneratorSection
+ title="Fee percentage"
+ actionText="Learn more"
+ onActionTextClick={this._handleAffiliatePercentageLearnMoreClick}
+ >
+ <FeePercentageSlider
+ value={value.affiliateInfo.feePercentage}
+ onChange={this._handleAffiliatePercentageChange}
+ isDisabled={
+ _.isUndefined(value.affiliateInfo) ||
+ _.isUndefined(value.affiliateInfo.feeRecipient) ||
+ _.isEmpty(value.affiliateInfo.feeRecipient)
+ }
+ />
+ </ConfigGeneratorSection>
+ </Container>
+ );
+ }
+ private readonly _getTokenSelectorProps = (): ConfigGeneratorSectionProps => {
+ if (_.isEmpty(this.state.availableTokens)) {
+ return {
+ title: 'What tokens can users buy?',
+ };
+ }
+ if (_.isUndefined(this.props.value.availableAssetDatas)) {
+ return {
+ title: 'What tokens can users buy?',
+ actionText: 'Unselect All',
+ onActionTextClick: this._handleUnselectAllClick,
+ };
+ }
+ return {
+ title: 'What tokens can users buy?',
+ actionText: 'Select All',
+ onActionTextClick: this._handleSelectAllClick,
+ };
+ };
+ private readonly _generateItems = (): SelectItemConfig[] => {
+ return _.map(SRA_ENDPOINTS, endpoint => ({
+ label: endpoint,
+ value: endpoint,
+ onClick: this._handleSRASelection.bind(this, endpoint),
+ }));
+ };
+ private readonly _handleAffiliatePercentageLearnMoreClick = (): void => {
+ window.open(`${WebsitePaths.Wiki}#Learn-About-Affiliate-Fees`, '_blank');
+ };
+ private readonly _handleSRASelection = (sraEndpoint: string) => {
+ const newConfig: ZeroExInstantBaseConfig = {
+ ...this.props.value,
+ orderSource: sraEndpoint,
+ };
+ this.props.onConfigChange(newConfig);
+ };
+ private readonly _handleAffiliateAddressChange = (address: string, isValid: boolean) => {
+ const oldConfig: ZeroExInstantBaseConfig = this.props.value;
+ const newConfig: ZeroExInstantBaseConfig = {
+ ...oldConfig,
+ affiliateInfo: {
+ feeRecipient: address,
+ feePercentage: oldConfig.affiliateInfo.feePercentage,
+ },
+ };
+ this.props.onConfigChange(newConfig);
+ };
+ private readonly _handleAffiliatePercentageChange = (value: number) => {
+ const oldConfig: ZeroExInstantBaseConfig = this.props.value;
+ const newConfig: ZeroExInstantBaseConfig = {
+ ...oldConfig,
+ affiliateInfo: {
+ feeRecipient: oldConfig.affiliateInfo.feeRecipient,
+ feePercentage: value,
+ },
+ };
+ this.props.onConfigChange(newConfig);
+ };
+ private readonly _handleSelectAllClick = () => {
+ const newConfig: ZeroExInstantBaseConfig = {
+ ...this.props.value,
+ availableAssetDatas: undefined,
+ };
+ this.props.onConfigChange(newConfig);
+ };
+ private readonly _handleUnselectAllClick = () => {
+ const newConfig: ZeroExInstantBaseConfig = {
+ ...this.props.value,
+ availableAssetDatas: [],
+ };
+ this.props.onConfigChange(newConfig);
+ };
+ private readonly _handleTokenClick = (assetData: string) => {
+ const { value } = this.props;
+ let newAvailableAssetDatas: string[] = [];
+ const allKnownAssetDatas = _.keys(this.state.availableTokens);
+ const availableAssetDatas = value.availableAssetDatas;
+ if (_.isUndefined(availableAssetDatas)) {
+ // It being undefined means it's all tokens.
+ newAvailableAssetDatas = _.pull(allKnownAssetDatas, assetData);
+ } else if (!_.includes(availableAssetDatas, assetData)) {
+ // Add it
+ newAvailableAssetDatas = [...availableAssetDatas, assetData];
+ if (newAvailableAssetDatas.length === allKnownAssetDatas.length) {
+ // If all tokens are manually selected, just show none.
+ newAvailableAssetDatas = undefined;
+ }
+ } else {
+ // Remove it
+ newAvailableAssetDatas = _.pull(availableAssetDatas, assetData);
+ }
+ const newConfig: ZeroExInstantBaseConfig = {
+ ...this.props.value,
+ availableAssetDatas: newAvailableAssetDatas,
+ };
+ this.props.onConfigChange(newConfig);
+ };
+ private readonly _setAvailableAssetsFromOrderProvider = async (): Promise<void> => {
+ const { value } = this.props;
+ if (!_.isUndefined(value.orderSource) && _.isString(value.orderSource)) {
+ this.setState({ isLoadingAvailableTokens: true });
+ const networkId = constants.NETWORK_ID_MAINNET;
+ const sraOrderProvider = new StandardRelayerAPIOrderProvider(value.orderSource, networkId);
+ const etherTokenAddress = getContractAddressesForNetworkOrThrow(networkId).etherToken;
+ const etherTokenAssetData = assetDataUtils.encodeERC20AssetData(etherTokenAddress);
+ const assetDatas = await sraOrderProvider.getAvailableMakerAssetDatasAsync(etherTokenAssetData);
+ const availableTokens = _.reduce(
+ assetDatas,
+ (acc, assetData) => {
+ const metaDataIfExists = assetMetaDataMap[assetData] as ERC20AssetMetaData;
+ if (metaDataIfExists) {
+ acc[assetData] = metaDataIfExists;
+ }
+ return acc;
+ },
+ {} as ObjectMap<ERC20AssetMetaData>,
+ );
+ this.setState({ availableTokens, isLoadingAvailableTokens: false });
+ }
+ };
+ private readonly _renderTokenMultiSelectOrSpinner = (): React.ReactNode => {
+ const { value } = this.props;
+ const { availableTokens, isLoadingAvailableTokens } = this.state;
+ const multiSelectHeight = '200px';
+ if (isLoadingAvailableTokens) {
+ return (
+ <Container
+ className="flex flex-column items-center justify-center"
+ height={multiSelectHeight}
+ backgroundColor={colors.white}
+ borderRadius="4px"
+ width="100%"
+ >
+ <Container position="relative" left="12px" marginBottom="20px">
+ <Spinner />
+ </Container>
+ <Text fontSize="16px">Loading...</Text>
+ </Container>
+ );
+ }
+ const availableAssetDatas = _.keys(availableTokens);
+ if (availableAssetDatas.length === 0) {
+ return (
+ <Container
+ className="flex flex-column items-center justify-center"
+ height={multiSelectHeight}
+ backgroundColor={colors.white}
+ borderRadius="4px"
+ width="100%"
+ >
+ <Text fontSize="16px">No tokens available. Try another endpoint?</Text>
+ </Container>
+ );
+ }
+ const items = _.map(_.keys(availableTokens), assetData => {
+ const metaData = availableTokens[assetData];
+ return {
+ value: assetData,
+ renderItemContent: (isSelected: boolean) => (
+ <Container className="flex items-center">
+ <Container marginRight="10px">
+ <CheckMark isChecked={isSelected} color={colors.brandLight} />
+ </Container>
+ <CheckboxText isSelected={isSelected}>{metaData.symbol.toUpperCase()} — {metaData.name}</CheckboxText>
+ </Container>
+ ),
+ onClick: this._handleTokenClick.bind(this, assetData),
+ };
+ });
+ return <MultiSelect items={items} selectedValues={value.availableAssetDatas} height={multiSelectHeight} />;
+ };
+}
+
+export interface ConfigGeneratorSectionProps {
+ title: string;
+ actionText?: string;
+ onActionTextClick?: () => void;
+ isOptional?: boolean;
+ marginBottom?: string;
+}
+
+export const ConfigGeneratorSection: React.StatelessComponent<ConfigGeneratorSectionProps> = ({
+ title,
+ actionText,
+ onActionTextClick,
+ isOptional,
+ marginBottom,
+ children,
+}) => (
+ <Container marginBottom={marginBottom}>
+ <Container marginBottom="10px" className="flex justify-between items-center">
+ <Heading size="small" marginBottom="0" isFlex={true}>
+ <span>{title}</span>
+ {isOptional && (
+ <OptionalText>
+ {' '}
+ Optional
+ </OptionalText>
+ )}
+ </Heading>
+ {actionText && (
+ <OptionalAction onClick={onActionTextClick}>
+ {actionText}
+ </OptionalAction>
+ )}
+ </Container>
+ {children}
+ </Container>
+);
+
+ConfigGeneratorSection.defaultProps = {
+ marginBottom: '30px',
+};
+
+const OptionalText = styled.span`
+ display: inline;
+ font-size: 14px;
+ color: #999999;
+ flex-shrink: 0;
+`;
+
+interface CheckboxTextProps {
+ isSelected?: boolean;
+}
+
+const CheckboxText = styled.span<CheckboxTextProps>`
+ font-size: 14px;
+ line-height: 18px;
+ color: ${props => props.isSelected ? colors.brandDark : '#666666'}
+`;
+
+const OptionalAction = styled(OptionalText)`
+ cursor: pointer;
+`;
diff --git a/packages/website/ts/@next/pages/instant/config_generator_address_input.tsx b/packages/website/ts/@next/pages/instant/config_generator_address_input.tsx
new file mode 100644
index 000000000..23cdfcf7f
--- /dev/null
+++ b/packages/website/ts/@next/pages/instant/config_generator_address_input.tsx
@@ -0,0 +1,88 @@
+import { addressUtils } from '@0x/utils';
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { colors } from 'ts/style/colors';
+
+import { Container } from 'ts/components/ui/container';
+
+import { Paragraph } from 'ts/@next/components/text';
+
+export interface ConfigGeneratorAddressInputProps {
+ value?: string;
+ onChange?: (address: string, isValid: boolean) => void;
+}
+
+export interface ConfigGeneratorAddressInputState {
+ errMsg: string;
+}
+
+export interface InputProps {
+ className?: string;
+ value?: string;
+ width?: string;
+ fontSize?: string;
+ fontColor?: string;
+ padding?: string;
+ placeholderColor?: string;
+ placeholder?: string;
+ backgroundColor?: string;
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
+}
+
+export class ConfigGeneratorAddressInput extends React.Component<
+ ConfigGeneratorAddressInputProps,
+ ConfigGeneratorAddressInputState
+> {
+ public state = {
+ errMsg: '',
+ };
+ public render(): React.ReactNode {
+ const { errMsg } = this.state;
+ const hasError = !_.isEmpty(errMsg);
+ return (
+ <Container height="80px">
+ <Input
+ value={this.props.value}
+ onChange={this._handleChange}
+ placeholder="0xe99...aa8da4"
+ />
+ <Container marginTop="5px" isHidden={!hasError} height="25px">
+ <Paragraph size="small" isNoMargin={true}>
+ {errMsg}
+ </Paragraph>
+ </Container>
+ </Container>
+ );
+ }
+
+ private readonly _handleChange = (event: React.ChangeEvent<HTMLInputElement>): void => {
+ const address = event.target.value;
+ const isValidAddress = addressUtils.isAddress(address.toLowerCase()) || address === '';
+ const errMsg = isValidAddress ? '' : 'Please enter a valid Ethereum address';
+ this.setState({
+ errMsg,
+ });
+ this.props.onChange(address, isValidAddress);
+ };
+}
+
+const PlainInput: React.StatelessComponent<InputProps> = ({ value, className, placeholder, onChange }) => (
+ <input className={className} value={value} onChange={onChange} placeholder={placeholder} />
+);
+
+export const Input = styled(PlainInput)`
+ background-color: ${colors.white};
+ color: ${colors.textDarkSecondary};
+ font-size: 1rem;
+ width: 100%;
+ padding: 16px 20px 18px;
+ border-radius: 4px;
+ border: 1px solid transparent;
+ outline: none;
+ &::placeholder {
+ color: #333333;
+ opacity: 0.5;
+ }
+`;
diff --git a/packages/website/ts/@next/pages/instant/configurator.tsx b/packages/website/ts/@next/pages/instant/configurator.tsx
new file mode 100644
index 000000000..15c9ba2ca
--- /dev/null
+++ b/packages/website/ts/@next/pages/instant/configurator.tsx
@@ -0,0 +1,103 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import styled from 'styled-components';
+
+import { CodeDemo } from 'ts/@next/pages/instant/code_demo';
+import { ConfigGenerator } from 'ts/@next/pages/instant/config_generator';
+
+import { Link } from 'ts/@next/components/link';
+import { Column, FlexWrap } from 'ts/@next/components/newLayout';
+import { Heading } from 'ts/@next/components/text';
+import { WebsitePaths } from 'ts/types';
+
+import { ZeroExInstantBaseConfig } from '../../../../../instant/src/types';
+
+export interface ConfiguratorState {
+ instantConfig: ZeroExInstantBaseConfig;
+}
+
+export class Configurator extends React.Component {
+ public state: ConfiguratorState = {
+ instantConfig: {
+ orderSource: 'https://api.radarrelay.com/0x/v2/',
+ availableAssetDatas: undefined,
+ affiliateInfo: {
+ feeRecipient: '',
+ feePercentage: 0,
+ },
+ },
+ };
+ public render(): React.ReactNode {
+ const codeToDisplay = this._generateCodeDemoCode();
+ return (
+ <FlexWrap
+ isFlex={true}
+ >
+ <Column width="442px" padding="0 70px 0 0">
+ <ConfigGenerator value={this.state.instantConfig} onConfigChange={this._handleConfigChange} />
+ </Column>
+ <Column width="100%">
+ <HeadingWrapper>
+ <Heading size="small" marginBottom="15px">Code Snippet</Heading>
+ <Link
+ href={`${WebsitePaths.Wiki}#Get-Started-With-Instant`}
+ isBlock={true}
+ >
+ Explore the Docs
+ </Link>
+ </HeadingWrapper>
+ <CodeDemo key={codeToDisplay}>{codeToDisplay}</CodeDemo>
+ </Column>
+ </FlexWrap>
+ );
+ }
+ private readonly _handleConfigChange = (config: ZeroExInstantBaseConfig) => {
+ this.setState({
+ instantConfig: config,
+ });
+ };
+ private readonly _generateCodeDemoCode = (): string => {
+ const { instantConfig } = this.state;
+ return `<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <script src="https://instant.0xproject.com/instant.js"></script>
+ </head>
+ <body>
+ <script>
+ zeroExInstant.render({
+ orderSource: '${instantConfig.orderSource}',${
+ !_.isUndefined(instantConfig.affiliateInfo) && instantConfig.affiliateInfo.feeRecipient
+ ? `\n affiliateInfo: {
+ feeRecipient: '${instantConfig.affiliateInfo.feeRecipient.toLowerCase()}',
+ feePercentage: ${instantConfig.affiliateInfo.feePercentage}
+ },`
+ : ''
+ }${
+ !_.isUndefined(instantConfig.availableAssetDatas)
+ ? `\n availableAssetDatas: ${this._renderAvailableAssetDatasString(
+ instantConfig.availableAssetDatas,
+ )}`
+ : ''
+ }
+ }, 'body');
+ </script>
+ </body>
+ </html>`;
+ };
+ private readonly _renderAvailableAssetDatasString = (availableAssetDatas: string[]): string => {
+ const stringAvailableAssetDatas = availableAssetDatas.map(assetData => `'${assetData}'`);
+ if (availableAssetDatas.length < 2) {
+ return `[${stringAvailableAssetDatas.join(', ')}]`;
+ }
+ return `[\n ${stringAvailableAssetDatas.join(
+ ', \n ',
+ )}\n ]`;
+ };
+}
+
+const HeadingWrapper = styled.div`
+ display: flex;
+ justify-content: space-between;
+`;
diff --git a/packages/website/ts/@next/pages/instant/fee_percentage_slider.tsx b/packages/website/ts/@next/pages/instant/fee_percentage_slider.tsx
new file mode 100644
index 000000000..512ae06b4
--- /dev/null
+++ b/packages/website/ts/@next/pages/instant/fee_percentage_slider.tsx
@@ -0,0 +1,79 @@
+import Slider from 'rc-slider';
+import * as React from 'react';
+import styled from 'styled-components';
+import 'ts/@next/pages/instant/rc-slider.css';
+
+import { colors } from 'ts/style/colors';
+
+const SliderWithTooltip = (Slider as any).createSliderWithTooltip(Slider);
+// tslint:disable-next-line:no-unused-expression
+
+export interface FeePercentageSliderProps {
+ value: number;
+ isDisabled?: boolean;
+ onChange: (value: number) => void;
+}
+
+export class FeePercentageSlider extends React.Component<FeePercentageSliderProps> {
+ public render(): React.ReactNode {
+ return (
+ <StyledSlider
+ min={0}
+ max={0.05}
+ step={0.0025}
+ value={this.props.value}
+ onChange={this.props.onChange}
+ tipFormatter={this._feePercentageSliderFormatter}
+ tipProps={{ placement: 'bottom', overlayStyle: { backgroundColor: '#fff', borderRadius: '4px' } }}
+ trackStyle={{
+ backgroundColor: colors.brandLight,
+ }}
+ railStyle={{
+ backgroundColor: 'rgba(255, 255, 255, 0.2)',
+ }}
+ handleStyle={{
+ border: 'none',
+ boxShadow: 'none',
+ }}
+ activeDotStyle={{
+ boxShadow: 'none',
+ border: 'none',
+ }}
+ />
+ );
+ }
+ private readonly _feePercentageSliderFormatter = (value: number): React.ReactNode => {
+ return <Text>{`${(value * 100).toFixed(2)}%`}</Text>;
+ };
+}
+
+const StyledSlider = styled(SliderWithTooltip)`
+ .rc-slider-tooltip__inner {
+ box-shadow: none !important;
+ background-color: ${colors.white} !important;
+ border-radius: 4px !important;
+ padding: 3px 12px !important;
+ height: auto !important;
+ position: relative;
+ top: 7px;
+ &:after {
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+ border-width: 6px;
+ bottom: 100%;
+ left: 100%;
+ border-bottom-color: ${colors.white};
+ margin-left: -60%;
+ }
+ }
+`;
+
+const Text = styled.span`
+ color: #000000;
+ font-size: 12px;
+ line-height: 18px;
+`;
diff --git a/packages/website/ts/@next/pages/instant/rc-slider.css b/packages/website/ts/@next/pages/instant/rc-slider.css
new file mode 100644
index 000000000..a4a521d54
--- /dev/null
+++ b/packages/website/ts/@next/pages/instant/rc-slider.css
@@ -0,0 +1,295 @@
+.rc-slider {
+ position: relative;
+ height: 14px;
+ padding: 5px 0;
+ width: 100%;
+ border-radius: 6px;
+ -ms-touch-action: none;
+ touch-action: none;
+ box-sizing: border-box;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+.rc-slider * {
+ box-sizing: border-box;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+.rc-slider-rail {
+ position: absolute;
+ width: 100%;
+ background-color: #e9e9e9;
+ height: 4px;
+ border-radius: 6px;
+}
+
+.rc-slider-track {
+ position: absolute;
+ left: 0;
+ height: 4px;
+ border-radius: 6px;
+ background-color: #abe2fb;
+}
+
+.rc-slider-handle {
+ position: absolute;
+ margin-left: -7px;
+ margin-top: -5px;
+ width: 14px;
+ height: 14px;
+ cursor: pointer;
+ cursor: -webkit-grab;
+ cursor: grab;
+ border-radius: 50%;
+ border: solid 2px #96dbfa;
+ background-color: #fff;
+ -ms-touch-action: pan-x;
+ touch-action: pan-x;
+}
+
+.rc-slider-handle:focus {
+ border-color: #57c5f7;
+ box-shadow: 0 0 0 5px #96dbfa;
+ outline: none;
+}
+
+.rc-slider-handle-click-focused:focus {
+ border-color: #96dbfa;
+ box-shadow: unset;
+}
+
+.rc-slider-handle:hover {
+ border-color: #57c5f7;
+}
+
+.rc-slider-handle:active {
+ border-color: #57c5f7;
+ box-shadow: 0 0 5px #57c5f7;
+ cursor: -webkit-grabbing;
+ cursor: grabbing;
+}
+
+.rc-slider-mark {
+ position: absolute;
+ top: 18px;
+ left: 0;
+ width: 100%;
+ font-size: 12px;
+}
+
+.rc-slider-mark-text {
+ position: absolute;
+ display: inline-block;
+ vertical-align: middle;
+ text-align: center;
+ cursor: pointer;
+ color: #999;
+}
+
+.rc-slider-mark-text-active {
+ color: #666;
+}
+
+.rc-slider-step {
+ position: absolute;
+ width: 100%;
+ height: 4px;
+ background: transparent;
+}
+
+.rc-slider-dot {
+ position: absolute;
+ bottom: -2px;
+ margin-left: -4px;
+ width: 8px;
+ height: 8px;
+ border: 2px solid #e9e9e9;
+ background-color: #fff;
+ cursor: pointer;
+ border-radius: 50%;
+ vertical-align: middle;
+}
+
+.rc-slider-dot-active {
+ border-color: #96dbfa;
+}
+
+.rc-slider-disabled {
+ background-color: #e9e9e9;
+}
+
+.rc-slider-disabled .rc-slider-track {
+ background-color: #ccc;
+}
+
+.rc-slider-disabled .rc-slider-handle,
+.rc-slider-disabled .rc-slider-dot {
+ border-color: #ccc;
+ box-shadow: none;
+ background-color: #fff;
+ cursor: not-allowed;
+}
+
+.rc-slider-disabled .rc-slider-mark-text,
+.rc-slider-disabled .rc-slider-dot {
+ cursor: not-allowed !important;
+}
+
+.rc-slider-vertical {
+ width: 14px;
+ height: 100%;
+ padding: 0 5px;
+}
+
+.rc-slider-vertical .rc-slider-rail {
+ height: 100%;
+ width: 4px;
+}
+
+.rc-slider-vertical .rc-slider-track {
+ left: 5px;
+ bottom: 0;
+ width: 4px;
+}
+
+.rc-slider-vertical .rc-slider-handle {
+ margin-left: -5px;
+ margin-bottom: -7px;
+ -ms-touch-action: pan-y;
+ touch-action: pan-y;
+}
+
+.rc-slider-vertical .rc-slider-mark {
+ top: 0;
+ left: 18px;
+ height: 100%;
+}
+
+.rc-slider-vertical .rc-slider-step {
+ height: 100%;
+ width: 4px;
+}
+
+.rc-slider-vertical .rc-slider-dot {
+ left: 2px;
+ margin-bottom: -4px;
+}
+
+.rc-slider-vertical .rc-slider-dot:first-child {
+ margin-bottom: -4px;
+}
+
+.rc-slider-vertical .rc-slider-dot:last-child {
+ margin-bottom: -4px;
+}
+
+.rc-slider-tooltip-zoom-down-enter,
+.rc-slider-tooltip-zoom-down-appear {
+ animation-duration: .3s;
+ animation-fill-mode: both;
+ display: block !important;
+ animation-play-state: paused;
+}
+
+.rc-slider-tooltip-zoom-down-leave {
+ animation-duration: .3s;
+ animation-fill-mode: both;
+ display: block !important;
+ animation-play-state: paused;
+}
+
+.rc-slider-tooltip-zoom-down-enter.rc-slider-tooltip-zoom-down-enter-active,
+.rc-slider-tooltip-zoom-down-appear.rc-slider-tooltip-zoom-down-appear-active {
+ animation-name: rcSliderTooltipZoomDownIn;
+ animation-play-state: running;
+}
+
+.rc-slider-tooltip-zoom-down-leave.rc-slider-tooltip-zoom-down-leave-active {
+ animation-name: rcSliderTooltipZoomDownOut;
+ animation-play-state: running;
+}
+
+.rc-slider-tooltip-zoom-down-enter,
+.rc-slider-tooltip-zoom-down-appear {
+ transform: scale(0, 0);
+ animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+
+.rc-slider-tooltip-zoom-down-leave {
+ animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+
+@keyframes rcSliderTooltipZoomDownIn {
+ 0% {
+ opacity: 0;
+ transform-origin: 50% 100%;
+ transform: scale(0, 0);
+ }
+
+ 100% {
+ transform-origin: 50% 100%;
+ transform: scale(1, 1);
+ }
+}
+
+@keyframes rcSliderTooltipZoomDownOut {
+ 0% {
+ transform-origin: 50% 100%;
+ transform: scale(1, 1);
+ }
+
+ 100% {
+ opacity: 0;
+ transform-origin: 50% 100%;
+ transform: scale(0, 0);
+ }
+}
+
+.rc-slider-tooltip {
+ position: absolute;
+ left: -9999px;
+ top: -9999px;
+ visibility: visible;
+ box-sizing: border-box;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+.rc-slider-tooltip * {
+ box-sizing: border-box;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+.rc-slider-tooltip-hidden {
+ display: none;
+}
+
+.rc-slider-tooltip-placement-top {
+ padding: 4px 0 8px 0;
+}
+
+.rc-slider-tooltip-inner {
+ padding: 4px 6px 4px;
+ min-width: 24px;
+ height: 24px;
+ font-size: 12px;
+ line-height: 1;
+ color: #000;
+ text-align: center;
+ text-decoration: none;
+}
+
+.rc-slider-tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.rc-slider-tooltip-placement-top .rc-slider-tooltip-arrow {
+ bottom: 4px;
+ left: 50%;
+ margin-left: -4px;
+ border-width: 4px 4px 0;
+ border-top-color: #6c6c6c;
+}
diff --git a/packages/website/ts/@next/pages/instant/select.tsx b/packages/website/ts/@next/pages/instant/select.tsx
new file mode 100644
index 000000000..ae2a07b3d
--- /dev/null
+++ b/packages/website/ts/@next/pages/instant/select.tsx
@@ -0,0 +1,53 @@
+import * as React from 'react';
+import styled from 'styled-components';
+
+export interface SelectItemConfig {
+ label: string;
+ value?: string;
+ onClick?: () => void;
+}
+
+interface SelectProps {
+ value?: string;
+ id: string;
+ items: SelectItemConfig[];
+ emptyText?: string;
+}
+
+export const Select: React.FunctionComponent<SelectProps> = ({ value, id, items, emptyText }) => {
+ return (
+ <Container>
+ <StyledSelect id={id}>
+ <option value="">{emptyText}</option>
+ {items.map((item, index) => <option key={`${id}-item-${index}`} value={item.value} selected={item.value === value} onClick={item.onClick}>{item.label}</option>)}
+ </StyledSelect>
+ <Caret width="12" height="7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11 1L6 6 1 1" stroke="#666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></Caret>
+ </Container>
+ );
+};
+
+Select.defaultProps = {
+ emptyText: 'Select...',
+};
+
+const Container = styled.div`
+ background-color: #fff;
+ border-radius: 4px;
+ display: flex;
+ width: 100%;
+ position: relative;
+`;
+
+const StyledSelect = styled.select`
+ appearance: none;
+ border: 0;
+ font-size: 1rem;
+ width: 100%;
+ padding: 20px 20px 20px 20px;
+`;
+
+const Caret = styled.svg`
+ position: absolute;
+ right: 20px;
+ top: calc(50% - 4px);
+`;
diff --git a/packages/website/ts/@next/pages/landing.tsx b/packages/website/ts/@next/pages/landing.tsx
new file mode 100644
index 000000000..8696cf022
--- /dev/null
+++ b/packages/website/ts/@next/pages/landing.tsx
@@ -0,0 +1,42 @@
+import * as React from 'react';
+import {SiteWrap} from 'ts/@next/components/siteWrap';
+
+import {SectionLandingAbout} from 'ts/@next/components/sections/landing/about';
+import {SectionLandingClients} from 'ts/@next/components/sections/landing/clients';
+import {SectionLandingCta} from 'ts/@next/components/sections/landing/cta';
+import {SectionLandingHero} from 'ts/@next/components/sections/landing/hero';
+
+import { ModalContact } from 'ts/@next/components/modals/modal_contact';
+
+interface Props {
+ theme: {
+ bgColor: string;
+ textColor: string;
+ linkColor: string;
+ };
+}
+
+export class NextLanding extends React.Component<Props> {
+ public state = {
+ isContactModalOpen: false,
+ };
+ public render(): React.ReactNode {
+ return (
+ <SiteWrap theme="dark">
+ <SectionLandingHero />
+ <SectionLandingAbout />
+ <SectionLandingClients />
+ <SectionLandingCta onContactClick={this._onOpenContactModal} />
+ <ModalContact isOpen={this.state.isContactModalOpen} onDismiss={this._onDismissContactModal} />
+ </SiteWrap>
+ );
+ }
+
+ public _onOpenContactModal = (): void => {
+ this.setState({ isContactModalOpen: true });
+ }
+
+ public _onDismissContactModal = (): void => {
+ this.setState({ isContactModalOpen: false });
+ }
+}
diff --git a/packages/website/ts/@next/pages/launch_kit.tsx b/packages/website/ts/@next/pages/launch_kit.tsx
new file mode 100644
index 000000000..30fedba1b
--- /dev/null
+++ b/packages/website/ts/@next/pages/launch_kit.tsx
@@ -0,0 +1,129 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+
+import {Hero} from 'ts/@next/components/hero';
+
+import { Banner } from 'ts/@next/components/banner';
+import { Button } from 'ts/@next/components/button';
+import { Definition } from 'ts/@next/components/definition';
+import { Icon } from 'ts/@next/components/icon';
+import { SiteWrap } from 'ts/@next/components/siteWrap';
+
+import {Section} from 'ts/@next/components/newLayout';
+import { ModalContact } from '../components/modals/modal_contact';
+
+import { WebsitePaths } from 'ts/types';
+
+const offersData = [
+ {
+ icon: 'supportForAllEthereumStandards',
+ title: 'Perfect for developers who need a simple drop-in marketplace',
+ description: (
+ <ul>
+ <li>
+ Quickly launch a market for your project’s token
+ </li>
+ <li>
+ Seamlessly create an in-game marketplace for digital items and collectables
+ </li>
+ <li>
+ Easily build a 0x relayer for your local market
+ </li>
+ </ul>
+ ),
+ },
+];
+
+export class NextLaunchKit extends React.Component {
+ public state = {
+ isContactModalOpen: false,
+ };
+ public render(): React.ReactNode {
+ return (
+ <SiteWrap theme="dark">
+ <Hero
+ isLargeTitle={false}
+ isFullWidth={false}
+ title="0x Launch Kit"
+ description="Launch a relayer in under a minute"
+ figure={<Icon name="launchKit" size="hero" margin={['small', 0, 'small', 0]} />}
+ actions={<HeroActions/>}
+ />
+
+ <Section
+ bgColor="dark"
+ isFlex={true}
+ maxWidth="1170px"
+ >
+ <Definition
+ title="Networked Liquidity Pool"
+ titleSize="small"
+ description="Tap into and share liquidity with other relayers"
+ icon="supportForAllEthereumStandards"
+ iconSize="medium"
+ isInline={true}
+ />
+
+ <Definition
+ title="Extensible Code Repo"
+ titleSize="small"
+ description="Fork and extend to support modes of exchange"
+ icon="code-repo"
+ iconSize="medium"
+ isInline={true}
+ />
+
+ <Definition
+ title="Exchange Ethereum based Tokens"
+ titleSize="small"
+ description="Enable trading for any ERC-20 or ERC-721 asset"
+ icon="eth-based-tokens"
+ iconSize="medium"
+ isInline={true}
+ />
+ </Section>
+
+ <Section>
+ {_.map(offersData, (item, index) => (
+ <Definition
+ key={`offers-${index}`}
+ icon={item.icon}
+ title={item.title}
+ description={item.description}
+ isInlineIcon={true}
+ iconSize={240}
+ />
+ ))}
+ </Section>
+
+ <Banner
+ heading="Need more flexibility?"
+ subline="Dive into our docs, or contact us if needed"
+ mainCta={{ text: 'Get Started', href: '/docs' }}
+ secondaryCta={{ text: 'Get in Touch', href: this._onOpenContactModal.bind(this) }}
+ />
+ <ModalContact isOpen={this.state.isContactModalOpen} onDismiss={this._onDismissContactModal} />
+ </SiteWrap>
+ );
+ }
+
+ public _onOpenContactModal = (): void => {
+ this.setState({ isContactModalOpen: true });
+ }
+
+ public _onDismissContactModal = (): void => {
+ this.setState({ isContactModalOpen: false });
+ }
+}
+
+const HeroActions = () => (
+ <>
+ <Button href="https://0xproject.com/docs" isInline={true}>
+ Get Started
+ </Button>
+
+ <Button to={WebsitePaths.Why} isTransparent={true} isInline={true}>
+ Learn More
+ </Button>
+ </>
+);
diff --git a/packages/website/ts/@next/pages/why.tsx b/packages/website/ts/@next/pages/why.tsx
new file mode 100644
index 000000000..a267bd09e
--- /dev/null
+++ b/packages/website/ts/@next/pages/why.tsx
@@ -0,0 +1,284 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import AnchorLink from 'react-anchor-link-smooth-scroll';
+import styled from 'styled-components';
+
+import {Hero} from 'ts/@next/components/hero';
+
+import { Banner } from 'ts/@next/components/banner';
+import { Button } from 'ts/@next/components/button';
+import {Definition} from 'ts/@next/components/definition';
+import {Column, Section, WrapSticky} from 'ts/@next/components/newLayout';
+import { SiteWrap } from 'ts/@next/components/siteWrap';
+import { Slide, Slider } from 'ts/@next/components/slider/slider';
+
+import { ModalContact } from '../components/modals/modal_contact';
+import { Heading } from 'ts/@next/components/text';
+
+const offersData = [
+ {
+ icon: 'robustSmartContracts',
+ title: 'Robust Smart Contracts',
+ description: `0x Protocol's smart contracts have been put through two rounds of rigorous security audits.`,
+ },
+ {
+ icon: 'extensibleArchitecture',
+ title: 'Extensible Architecture',
+ description: `0x's modular pipeline enables you to plug in your own smart contracts through an extensible API.`,
+ },
+ {
+ icon: 'eficientDesign',
+ title: 'Efficient Design',
+ description: `0x’s off-chain order relay with on-chain settlement is a gas efficient approach to p2p exchange, reducing blockchain bloat.`,
+ },
+];
+
+const functionalityData = [
+ {
+ icon: 'secureTrading',
+ title: 'Secure Non-custodial Trading',
+ description: 'Enable tokens to be traded wallet-to-wallet with no deposits or withdrawals.',
+ },
+ {
+ icon: 'flexibleOrders',
+ title: 'Flexible Order Types',
+ description: 'Choose to sell assets at a specific “buy it now” price or allow potential buyers to submit bids.',
+ },
+ {
+ icon: 'buildBusiness',
+ title: 'Build a Business',
+ description: 'Monetize your product by taking fees on each transaction and join a growing number of relayers in the 0x ecosystem.',
+ },
+];
+
+const useCaseSlides = [
+ {
+ icon: 'gamingAndCollectibles',
+ title: 'Games & Collectibles',
+ description: 'Artists and game makers are tokenizing digital art and in-game items known as non-fungible tokens (NFTs). 0x enables these creators to add exchange functionality by providing the ability to build marketplaces for NFT trading.',
+ },
+ {
+ icon: 'predictionMarkets',
+ title: 'Prediction Markets',
+ description: 'Decentralized prediction markets and cryptodervivative platforms generate sets of tokens that represent a financial stake in the outcomes of events. 0x allows these tokens to be instantly tradable in liquid markets.',
+ },
+ {
+ icon: 'orderBooks',
+ title: 'Order Books',
+ description: 'There are thousands of decentralized apps and protocols that have native utility tokens. 0x provides professional exchanges with the ability to host order books and facilitates the exchange of these assets.',
+ },
+ {
+ icon: 'decentralisedLoans',
+ title: 'Decentralized Loans',
+ description: 'Efficient lending requires liquid markets where investors can buy and re-sell loans. 0x enables an ecosystem of lenders to self-organize and efficiently determine market prices for all outstanding loans.',
+ },
+ {
+ icon: 'stableTokens',
+ title: 'Stable Tokens',
+ description: 'Novel economic constructs such as stable coins require efficient, liquid markets to succeed. 0x will facilitate the underlying economic mechanisms that allow these tokens to remain stable.',
+ },
+];
+
+export class NextWhy extends React.Component {
+ public state = {
+ isContactModalOpen: false,
+ };
+ public render(): React.ReactNode {
+ return (
+ <SiteWrap theme="dark">
+ <Hero
+ title="The exchange layer for the crypto economy"
+ description="The world's assets are becoming tokenized on public blockchains. 0x Protocol is free, open-source infrastracture that developers and businesses utilize to build products that enable the purchasing and trading of crypto tokens."
+ actions={
+ <Button
+ href="/docs"
+ isWithArrow={true}
+ isAccentColor={true}
+ >
+ Build on 0x
+ </Button>
+ }
+ />
+
+ <Section
+ bgColor="dark"
+ isFlex={true}
+ maxWidth="1170px"
+ >
+ <Definition
+ title="Support for all Ethereum Standards"
+ titleSize="small"
+ description="0x Protocol facitilites the decentralized exchange of a growing number of Ethereum-based tokens, including all ERC-20 and ERC-721 assets."
+ icon="supportForAllEthereumStandards"
+ iconSize="large"
+ isInline={true}
+ />
+
+ <Definition
+ title="Networked Liquidity"
+ titleSize="small"
+ description="0x is lowering the barrier to entry by building a layer of networked liquidity that allows businesses to tap into a shared pool of digital assets."
+ icon="networkedLiquidity"
+ iconSize="large"
+ isInline={true}
+ />
+
+ <Definition
+ title="Flexible Integration"
+ titleSize="small"
+ description="0x is a modular system that enables businesses and projects, known as relayers, to easily add exchange functionality to any product experience."
+ icon="flexibleIntegration"
+ iconSize="large"
+ isInline={true}
+ />
+ </Section>
+
+ <Section maxWidth="1170px" isFlex={true} isFullWidth={true}>
+ <Column>
+ <NavStickyWrap offsetTop="130px">
+ <ChapterLink offset="60" href="#benefits">Benefits</ChapterLink>
+ <ChapterLink offset="60" href="#cases">Use Cases</ChapterLink>
+ <ChapterLink offset="60" href="#functionality">Features</ChapterLink>
+ </NavStickyWrap>
+ </Column>
+
+ <Column width="55%" maxWidth="826px">
+ <Column width="100%" maxWidth="560px" padding="0 30px 0 0">
+ <SectionWrap id="benefits">
+ <SectionTitle size="medium" marginBottom="60px" isNoBorder={true}>What 0x offers</SectionTitle>
+
+ {_.map(offersData, (item, index) => (
+ <Definition
+ key={`offers-${index}`}
+ icon={item.icon}
+ title={item.title}
+ titleSize="small"
+ description={item.description}
+ isWithMargin={true}
+ />
+ ))}
+ </SectionWrap>
+
+ <SectionWrap id="cases" isNotRelative={true}>
+ <SectionTitle size="medium" marginBottom="60px">Use Cases</SectionTitle>
+ <Slider>
+ {_.map(useCaseSlides, (item, index) => (
+ <Slide
+ key={`useCaseSlide-${index}`}
+ heading={item.title}
+ text={item.description}
+ icon={item.icon}
+ />
+ ))}
+ </Slider>
+ </SectionWrap>
+
+ <SectionWrap id="functionality">
+ <SectionTitle size="medium" marginBottom="60px">Exchange Functionality</SectionTitle>
+
+ {_.map(functionalityData, (item, index) => (
+ <Definition
+ key={`functionality-${index}`}
+ icon={item.icon}
+ title={item.title}
+ titleSize="small"
+ description={item.description}
+ isWithMargin={true}
+ />
+ ))}
+ </SectionWrap>
+ </Column>
+ </Column>
+ </Section>
+
+ <Banner
+ heading="Ready to get started?"
+ subline="Dive into our docs, or contact us if needed"
+ mainCta={{ text: 'Get Started', href: '/docs' }}
+ secondaryCta={{ text: 'Get in Touch', onClick: this._onOpenContactModal.bind(this) }}
+ />
+ <ModalContact isOpen={this.state.isContactModalOpen} onDismiss={this._onDismissContactModal} />
+ </SiteWrap>
+ );
+ }
+
+ public _onOpenContactModal = (): void => {
+ this.setState({ isContactModalOpen: true });
+ }
+
+ public _onDismissContactModal = (): void => {
+ this.setState({ isContactModalOpen: false });
+ }
+}
+
+interface SectionProps {
+ isNotRelative?: boolean;
+}
+
+const SectionWrap = styled.div<SectionProps>`
+ position: ${props => !props.isNotRelative && 'relative'};
+
+ & + & {
+ padding-top: 60px;
+ margin-top: 60px;
+ }
+
+ @media (min-width: 768px) {
+ & + &:before {
+ width: 100vw;
+ }
+ }
+
+ @media (max-width: 768px) {
+ text-align: left;
+
+ & + &:before {
+ width: 100%;
+ }
+ }
+`;
+
+const SectionTitle = styled(Heading)<{ isNoBorder?: boolean }>`
+ position: relative;
+
+ ${props => !props.isNoBorder && `
+ &:before {
+ content: '';
+ width: 100vw;
+ position: absolute;
+ top: -53px;
+ left: 0;
+ height: 1px;
+ background-color: #3d3d3d;
+ }
+ `}
+
+
+ @media (max-width: 768px) {
+ &:before {
+ width: calc(100vw - 60px);
+ }
+ }
+`;
+
+const NavStickyWrap = styled(WrapSticky)`
+ padding-left: 60px;
+ z-index: 15;
+
+ @media (max-width: 768px) {
+ display: none;
+ }
+`;
+
+const ChapterLink = styled(AnchorLink)`
+ color: ${props => props.theme.textColor};
+ font-size: 22px;
+ margin-bottom: 25px;
+ display: block;
+ opacity: 0.8;
+
+ &:hover,
+ &:active {
+ opacity: 1;
+ }
+`;
diff --git a/packages/website/ts/components/ui/text.tsx b/packages/website/ts/components/ui/text.tsx
index 87239a021..046442ee5 100644
--- a/packages/website/ts/components/ui/text.tsx
+++ b/packages/website/ts/components/ui/text.tsx
@@ -7,6 +7,7 @@ export type TextTag = 'p' | 'div' | 'span' | 'label' | 'h1' | 'h2' | 'h3' | 'h4'
export interface TextProps {
className?: string;
+ children?: any;
Tag?: TextTag;
fontSize?: string;
fontFamily?: string;
diff --git a/packages/website/ts/globals.d.ts b/packages/website/ts/globals.d.ts
index eb8892aea..c5de8a3e5 100644
--- a/packages/website/ts/globals.d.ts
+++ b/packages/website/ts/globals.d.ts
@@ -3,6 +3,10 @@ declare module 'whatwg-fetch';
declare module 'thenby';
declare module 'react-document-title';
declare module 'react-ga';
+declare module 'reach__dialog';
+declare module 'react-flickity-component';
+declare module 'react-anchor-link-smooth-scroll';
+declare module 'react-responsive';
declare module '*.json' {
const json: any;
@@ -10,6 +14,14 @@ declare module '*.json' {
export default json;
/* tslint:enable */
}
+
+declare module '*.svg' {
+ //const svg: any;
+ //export default svg;
+ import {PureComponent, SVGProps} from "react";
+ export default class extends PureComponent<SVGProps<SVGSVGElement>> {}
+}
+
declare module 'web3-provider-engine/subproviders/filters';
// This will be defined by default in TS 2.4
diff --git a/packages/website/ts/index.tsx b/packages/website/ts/index.tsx
index 050c201a3..e9f629c09 100644
--- a/packages/website/ts/index.tsx
+++ b/packages/website/ts/index.tsx
@@ -9,7 +9,7 @@ import { DocsHome } from 'ts/containers/docs_home';
import { FAQ } from 'ts/containers/faq';
import { Instant } from 'ts/containers/instant';
import { Jobs } from 'ts/containers/jobs';
-import { Landing } from 'ts/containers/landing';
+import { Landing } from 'ts/containers/landing'; // Note(ez): When we're done we omit all old site imports
import { LaunchKit } from 'ts/containers/launch_kit';
import { NotFound } from 'ts/containers/not_found';
import { Wiki } from 'ts/containers/wiki';
@@ -20,6 +20,17 @@ import { store } from 'ts/redux/store';
import { WebsiteLegacyPaths, WebsitePaths } from 'ts/types';
import { muiTheme } from 'ts/utils/mui_theme';
+// Next (new website) routes. We should rename them later
+import { NextAboutJobs } from 'ts/@next/pages/about/jobs';
+import { NextAboutMission } from 'ts/@next/pages/about/mission';
+import { NextAboutPress } from 'ts/@next/pages/about/press';
+import { NextAboutTeam } from 'ts/@next/pages/about/team';
+import { NextEcosystem } from 'ts/@next/pages/ecosystem';
+import { Next0xInstant } from 'ts/@next/pages/instant';
+import { NextLanding } from 'ts/@next/pages/landing';
+import { NextLaunchKit } from 'ts/@next/pages/launch_kit';
+import { NextWhy } from 'ts/@next/pages/why';
+
// Check if we've introduced an update that requires us to clear the tradeHistory local storage entries
tradeHistoryStorage.clearIfRequired();
trackedTokenStorage.clearIfRequired();
@@ -90,15 +101,25 @@ render(
<Provider store={store}>
<div>
<Switch>
- <Route exact={true} path="/" component={Landing as any} />
+ {/* Next (new site) routes */}
+ <Route exact path="/" component={NextLanding as any} />
+ <Route exact path={WebsitePaths.Why} component={NextWhy as any} />
+ <Route exact path={WebsitePaths.Instant} component={Next0xInstant as any} />
+ <Route exact path={WebsitePaths.LaunchKit} component={NextLaunchKit as any} />
+ <Route exact path={WebsitePaths.Ecosystem} component={NextEcosystem as any} />
+ <Route exact path={WebsitePaths.AboutMission} component={NextAboutMission as any} />
+ <Route exact path={WebsitePaths.AboutTeam} component={NextAboutTeam as any} />
+ <Route exact path={WebsitePaths.AboutPress} component={NextAboutPress as any} />
+ <Route exact path={WebsitePaths.AboutJobs} component={NextAboutJobs as any} />
+ {/*
+ Note(ez): We remove/replace all old routes with next routes
+ once we're ready to put a ring on it. for now let's keep em there for reference
+ */}
<Redirect from="/otc" to={`${WebsitePaths.Portal}`} />
- <Route path={WebsitePaths.LaunchKit} component={LaunchKit as any} />
- <Route path={WebsitePaths.Instant} component={Instant as any} />
- <Route path={WebsitePaths.Careers} component={Jobs as any} />
<Route path={WebsitePaths.Portal} component={LazyPortal} />
<Route path={WebsitePaths.FAQ} component={FAQ as any} />
- <Route path={WebsitePaths.About} component={About as any} />
<Route path={WebsitePaths.Wiki} component={Wiki as any} />
+
<Route
path={`${WebsitePaths.ZeroExJs}/:version?`}
component={LazyZeroExJSDocumentation}
diff --git a/packages/website/ts/style/colors.ts b/packages/website/ts/style/colors.ts
index f89dfc86e..356d72f7e 100644
--- a/packages/website/ts/style/colors.ts
+++ b/packages/website/ts/style/colors.ts
@@ -13,6 +13,14 @@ const appColors = {
jobsPageOpenPositionRow: sharedColors.grey100,
metaMaskOrange: '#f68c24',
metaMaskTransparentOrange: 'rgba(255, 248, 242, 0.8)',
+ brandLight: '#00AE99',
+ brandDark: '#003831',
+ backgroundDark: '#111A19',
+ backgroundBlack: '#000000',
+ backgroundLight: '#F3F6F4',
+ textDarkPrimary: '#000000',
+ textDarkSecondary: '#5C5C5C',
+ white: '#fff',
instantPrimaryBackground: '#222222',
instantSecondaryBackground: '#333333',
instantTertiaryBackground: '#444444',
diff --git a/packages/website/ts/style/theme.ts b/packages/website/ts/style/theme.ts
index ce7d6975d..94bd0169a 100644
--- a/packages/website/ts/style/theme.ts
+++ b/packages/website/ts/style/theme.ts
@@ -4,7 +4,7 @@ import * as styledComponents from 'styled-components';
const {
default: styled,
css,
- injectGlobal,
+ createGlobalStyle,
keyframes,
ThemeProvider,
} = styledComponents as styledComponents.ThemedStyledComponentsModule<IThemeInterface>;
@@ -14,4 +14,4 @@ export interface IThemeInterface {}
export const theme = {};
-export { styled, css, injectGlobal, keyframes, ThemeProvider };
+export { styled, css, createGlobalStyle, keyframes, ThemeProvider };
diff --git a/packages/website/ts/types.ts b/packages/website/ts/types.ts
index 2967fdac5..73e248713 100644
--- a/packages/website/ts/types.ts
+++ b/packages/website/ts/types.ts
@@ -352,8 +352,14 @@ export enum WebsitePaths {
Home = '/',
FAQ = '/faq',
About = '/about',
+ AboutMission = '/about/mission',
+ AboutTeam = '/about/team',
+ AboutPress = '/about/press',
+ AboutJobs = '/about/jobs',
LaunchKit = '/launch-kit',
Instant = '/instant',
+ Ecosystem = '/ecosystem',
+ Why = '/why',
Whitepaper = '/pdfs/0x_white_paper.pdf',
SmartContracts = '/docs/contracts',
Connect = '/docs/connect',