Divides landing into section components, cleanup

This commit is contained in:
Ezekiel Aquino
2018-12-10 13:11:31 +01:00
parent c686c241c0
commit 7d9ab27b9d
8 changed files with 305 additions and 273 deletions

View File

@@ -11,6 +11,7 @@ interface ButtonInterface {
isNoBorder?: boolean;
isNoPadding?: boolean;
isWithArrow?: boolean;
isAccentColor?: boolean;
hasIcon?: boolean | string;
isInline?: boolean;
href?: string;
@@ -26,7 +27,7 @@ export const Button = styled.button<ButtonInterface>`
display: ${props => props.isInline && 'inline-block'};
background-color: ${props => !props.isTransparent ? colors.brandLight : 'transparent'};
border-color: ${props => (props.isTransparent && !props.isNoBorder && !props.isWithArrow) && '#6a6a6a'};
color: ${props => props.color || props.theme.textColor};
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'};
@@ -37,7 +38,7 @@ export const Button = styled.button<ButtonInterface>`
}
path {
fill: ${props => props.color || props.theme.textColor};
fill: ${props => props.isAccentColor ? props.theme.linkColor : (props.color || props.theme.textColor)};
}
`;

View File

@@ -10,7 +10,7 @@ interface IconProps extends PaddingInterface {
export const Icon: React.FunctionComponent<Props> = (props: Props) => {
const IconSVG = Loadable({
loader: () => import(`ts/@next/icons/illustrations/${props.name}.svg`),
loader: () => import(/* webpackChunkName: "icon" */`ts/@next/icons/illustrations/${props.name}.svg`),
loading: () => 'Loading',
});

View File

@@ -0,0 +1,106 @@
import * as React from 'react';
import {Button, ButtonWrap, Link} from 'ts/@next/components/button';
import {Icon, InlineIconWrap} from 'ts/@next/components/icon';
import {Column, Section, Wrap, WrapCentered, WrapGrid} from 'ts/@next/components/layout';
import {Heading, Paragraph} from 'ts/@next/components/text';
import {colors} from 'ts/style/colors';
export const SectionLandingAbout = () => (
<Section bgColor={colors.backgroundDark} isPadLarge={true}>
<WrapCentered width="narrow">
<InlineIconWrap>
<Icon name="coin" size="small" />
<Icon name="coin" size="small" />
<Icon name="coin" size="small" />
<Icon name="coin" size="small" />
</InlineIconWrap>
<Paragraph
size="large"
isCentered={true}
padding={['large', 0, 'default', 0]}
>
0x is an open protocol that enables the peer-to-peer exchange of Ethereum-based
tokens. 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>
<Link
href="#"
isTransparent={true}
isWithArrow={true}
isAccentColor={true}
>
Discover how developers use 0x
</Link>
<hr
style={{
width: '340px',
margin: '0 auto',
borderColor: '#3C4746',
marginTop: '60px auto 0 auto',
}}
/>
</WrapCentered>
{/* Note you can also pass in a string "large/default" or a number for custom margins */}
<Wrap padding={['large', 0, 0, 0]}>
{/* NOTE: this probably should be withComponent as part of a <dl> */}
<Column colWidth="1/3" isNoPadding={true}>
<Heading
size="medium"
isCentered={true}
isNoMargin={true}
>
873,435
</Heading>
<Paragraph
isMuted={0.4}
isCentered={true}
isNoMargin={true}
>
Number of transactions
</Paragraph>
</Column>
<Column colWidth="1/3" isNoPadding={true}>
<Heading
size="medium"
isCentered={true}
isNoMargin={true}
>
$203M
</Heading>
<Paragraph
isMuted={0.4}
isCentered={true}
isNoMargin={true}
>
Total volume
</Paragraph>
</Column>
<Column colWidth="1/3" isNoPadding={true}>
<Heading
size="medium"
isCentered={true}
isNoMargin={true}
>
227,372
</Heading>
<Paragraph
isMuted={0.4}
isCentered={true}
isNoMargin={true}
>
Number of relayers
</Paragraph>
</Column>
</Wrap>
</Section>
);

View File

@@ -0,0 +1,78 @@
import * as _ from 'lodash';
import * as React from 'react';
import styled from 'styled-components';
import {Section, Wrap, WrapCentered, WrapGrid} from 'ts/@next/components/layout';
import {Heading, Paragraph} from 'ts/@next/components/text';
interface ProjectLogo {
name: string;
imageUrl?: string;
}
const projects: ProjectLogo[] = [
{
name: 'Radar Relay',
imageUrl: '/images/@next/relayer-logos/logo_1.png',
},
{
name: 'Paradex',
imageUrl: '/images/@next/relayer-logos/logo_5.png',
},
{
name: 'Amadeus',
imageUrl: '/images/@next/relayer-logos/logo_3.png',
},
{
name: 'The Ocean X',
imageUrl: '/images/@next/relayer-logos/logo_4.png',
},
{
name: 'Paradex',
imageUrl: '/images/@next/relayer-logos/logo_5.png',
},
{
name: 'Decent EX',
imageUrl: '/images/@next/relayer-logos/logo_2.1.png',
},
{
name: 'dEX',
imageUrl: '/images/@next/relayer-logos/logo_2.2.png',
},
{
name: 'OpenRelay',
imageUrl: '/images/@next/relayer-logos/logo_2.3.png',
},
{
name: 'DDEX',
imageUrl: '/images/@next/relayer-logos/logo_2.png',
},
];
export const SectionLandingClients = () => (
<Section isPadLarge={true}>
<WrapCentered>
<Heading size="small">You're in good company</Heading>
</WrapCentered>
<WrapGrid width="narrow" isWrapped={true}>
{_.map(projects, (item: ProjectLogo, index) => (
<StyledProject key={`client-${index}`}>
<img src={item.imageUrl} alt={item.name} />
</StyledProject>
))}
</WrapGrid>
</Section>
);
const StyledProject = styled.div`
width: 90px;
height: 90px;
flex-shrink: 0;
margin: 30px;
img {
object-fit: contain;
width: 100%;
height: 100%;
}
`;

View File

@@ -0,0 +1,63 @@
import * as React from 'react';
import {Button, ButtonWrap, Link} from 'ts/@next/components/button';
import {Icon, InlineIconWrap} from 'ts/@next/components/icon';
import {Column, Section, Wrap, WrapCentered, WrapGrid} from 'ts/@next/components/layout';
import {Heading, Paragraph} from 'ts/@next/components/text';
export const SectionLandingCta = () => (
<Section>
<Wrap>
<Column
bgColor="#003831"
colWidth="1/2"
isPadLarge={true}
>
<WrapCentered>
<Icon
name="ready-to-build"
size="large"
margin={[0, 0, 'default', 0]}
/>
<Paragraph size="medium" color="#00AE99">
Ready to build on 0x?
</Paragraph>
<Link
href="#"
isTransparent={true}
isWithArrow={true}
>
Get Started
</Link>
</WrapCentered>
</Column>
<Column
bgColor="#003831"
colWidth="1/2"
isPadLarge={true}
>
<WrapCentered>
<Icon
name="ready-to-build"
size="large"
margin={[0, 0, 'default', 0]}
/>
<Paragraph size="medium" color="#00AE99">
Want help from the 0x team?
</Paragraph>
<Link
href="#"
isTransparent={true}
isWithArrow={true}
>
Get in Touch
</Link>
</WrapCentered>
</Column>
</Wrap>
</Section>
);

View File

@@ -0,0 +1,39 @@
import * as React from 'react';
import {Button, ButtonWrap} from 'ts/@next/components/button';
import {Column, Section, Wrap, WrapCentered, WrapGrid} from 'ts/@next/components/layout';
import {Heading, Paragraph} from 'ts/@next/components/text';
import LogoOutlined from 'ts/@next/icons/illustrations/logo-outlined.svg';
export const SectionLandingHero = () => (
<Section>
<Wrap>
<Column colWidth="1/2">
<Heading size="large">
Powering Decentralized Exchange
</Heading>
<Paragraph size="medium" isMuted={true}>
0x is the best solution for adding<br />
exchange functionality to your business.
</Paragraph>
<ButtonWrap>
<Button isInline={true}>
Get Started
</Button>
<Button isTransparent={true} isInline={true}>
Learn More
</Button>
</ButtonWrap>
</Column>
<Column colWidth="1/2">
<WrapCentered>
<LogoOutlined/>
</WrapCentered>
</Column>
</Wrap>
</Section>
);

View File

@@ -89,10 +89,6 @@ const GlobalStyles = withTheme(createGlobalStyle<GlobalStyle> `
overflow: hidden;
}
a {
color: ${props => props.theme.linkColor};
}
img, svg {
max-width: 100%;
object-fit: contain;
@@ -103,11 +99,6 @@ const GlobalStyles = withTheme(createGlobalStyle<GlobalStyle> `
line-height: 1.444444444em; // 26px
}
:root a {
color: inherit;
text-decoration: none;
}
svg + p,
img + p {
padding-top: 30px;

View File

@@ -1,270 +1,24 @@
import * as _ from 'lodash';
import * as React from 'react';
import styled from 'styled-components';
import {colors} from 'ts/style/colors';
import {Button, ButtonWrap, Link} from 'ts/@next/components/button';
import {Icon, InlineIconWrap} from 'ts/@next/components/icon';
import {Column, Section, Wrap, WrapCentered, WrapGrid} from 'ts/@next/components/layout';
import {SiteWrap} from 'ts/@next/components/siteWrap';
import {Heading, Paragraph} from 'ts/@next/components/text';
import LogoOutlined from 'ts/@next/icons/illustrations/logo-outlined.svg';
import ProtocolIcon from 'ts/@next/icons/illustrations/protocol.svg';
import ReadyToBuildIcon from 'ts/@next/icons/illustrations/ready-to-build.svg';
import SupportIcon from 'ts/@next/icons/illustrations/support.svg';
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';
interface ProjectLogo {
name: string;
imageUrl?: string;
interface Props {
theme: {
bgColor: string;
textColor: string;
linkColor: string;
};
}
const projects: ProjectLogo[] = [
{
name: 'Radar Relay',
imageUrl: '/images/@next/relayer-logos/logo_1.png',
},
{
name: 'Paradex',
imageUrl: '/images/@next/relayer-logos/logo_5.png',
},
{
name: 'Amadeus',
imageUrl: '/images/@next/relayer-logos/logo_3.png',
},
{
name: 'The Ocean X',
imageUrl: '/images/@next/relayer-logos/logo_4.png',
},
{
name: 'Paradex',
imageUrl: '/images/@next/relayer-logos/logo_5.png',
},
{
name: 'Decent EX',
imageUrl: '/images/@next/relayer-logos/logo_2.1.png',
},
{
name: 'dEX',
imageUrl: '/images/@next/relayer-logos/logo_2.2.png',
},
{
name: 'OpenRelay',
imageUrl: '/images/@next/relayer-logos/logo_2.3.png',
},
{
name: 'DDEX',
imageUrl: '/images/@next/relayer-logos/logo_2.png',
},
];
export const NextLanding: React.StatelessComponent<{}> = () => (
export const NextLanding: React.StatelessComponent<{}> = (props: Props) => (
<SiteWrap theme="dark">
<Section>
<Wrap>
<Column colWidth="1/2">
<Heading size="large">
Powering Decentralized Exchange
</Heading>
<Paragraph size="medium" isMuted={true}>
0x is the best solution for adding<br />
exchange functionality to your business.
</Paragraph>
<ButtonWrap>
<Button isInline={true}>
Get Started
</Button>
<Button isTransparent={true} isInline={true}>
Learn More
</Button>
</ButtonWrap>
</Column>
<Column colWidth="1/2">
<WrapCentered>
<LogoOutlined/>
</WrapCentered>
</Column>
</Wrap>
</Section>
<Section bgColor={colors.backgroundDark} isPadLarge={true}>
<WrapCentered width="narrow">
<InlineIconWrap>
<Icon name="coin" size="small" />
<Icon name="coin" size="small" />
<Icon name="coin" size="small" />
<Icon name="coin" size="small" />
</InlineIconWrap>
<Paragraph
size="large"
isCentered={true}
padding={['large', 0, 'default', 0]}
>
0x is an open protocol that enables the peer-to-peer exchange of Ethereum-based
tokens. 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="#" isTransparent={true}>
Discover how developers use 0x
</Button>
</WrapCentered>
{/* Note you can also pass in a string "large/default" or a number for custom margins */}
<Wrap padding={['large', 0, 0, 0]}>
{/* NOTE: this probably should be withComponent as part of a <dl> */}
<Column colWidth="1/3" isNoPadding={true}>
<Heading
size="medium"
isCentered={true}
isNoMargin={true}
>
873,435
</Heading>
<Paragraph
isMuted={0.4}
isCentered={true}
isNoMargin={true}
>
Number of transactions
</Paragraph>
</Column>
<Column colWidth="1/3" isNoPadding={true}>
<Heading
size="medium"
isCentered={true}
isNoMargin={true}
>
$203M
</Heading>
<Paragraph
isMuted={0.4}
isCentered={true}
isNoMargin={true}
>
Total volume
</Paragraph>
</Column>
<Column colWidth="1/3" isNoPadding={true}>
<Heading
size="medium"
isCentered={true}
isNoMargin={true}
>
227,372
</Heading>
<Paragraph
isMuted={0.4}
isCentered={true}
isNoMargin={true}
>
Number of relayers
</Paragraph>
</Column>
</Wrap>
</Section>
<Section isPadLarge={true}>
<WrapCentered>
<Heading size="small">You're in good company</Heading>
</WrapCentered>
<WrapGrid width="narrow" isWrapped={true}>
{_.map(projects, (item: ProjectLogo, index) => (
<Project
key={index}
name={item.name}
imageUrl={item.imageUrl}
/>
))}
</WrapGrid>
</Section>
<Section>
<Wrap>
<Column
bgColor="#003831"
colWidth="1/2"
isPadLarge={true}
>
<WrapCentered>
<Icon
name="ready-to-build"
size="large"
margin={[0, 0, 'default', 0]}
/>
<Paragraph size="medium" color="#00AE99">
Ready to build on 0x?
</Paragraph>
<Link
href="#"
isTransparent={true}
isWithArrow={true}
>
Get Started
</Link>
</WrapCentered>
</Column>
<Column
bgColor="#003831"
colWidth="1/2"
isPadLarge={true}
>
<WrapCentered>
<Icon
name="ready-to-build"
size="large"
margin={[0, 0, 'default', 0]}
/>
<Paragraph size="medium" color="#00AE99">
Want help from the 0x team?
</Paragraph>
<Link
href="#"
isTransparent={true}
isWithArrow={true}
>
Get in Touch
</Link>
</WrapCentered>
</Column>
</Wrap>
</Section>
<SectionLandingHero />
<SectionLandingAbout />
<SectionLandingClients />
<SectionLandingCta />
</SiteWrap>
);
const Project = ({ name, imageUrl }: ProjectLogo) => (
<StyledProject>
<img src={imageUrl} alt={name} />
</StyledProject>
);
const StyledProject = styled.div`
width: 90px;
height: 90px;
flex-shrink: 0;
margin: 30px;
img {
object-fit: contain;
width: 100%;
height: 100%;
}
`;