Added banner
This commit is contained in:
		
							
								
								
									
										75
									
								
								packages/website/ts/@next/components/banner.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								packages/website/ts/@next/components/banner.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					import * as React from 'react';
 | 
				
			||||||
 | 
					import styled from 'styled-components';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {colors} from 'ts/style/colors';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {Button, ButtonWrap} from 'ts/@next/components/button';
 | 
				
			||||||
 | 
					import { Column, Section, Wrap, WrapCentered } from 'ts/@next/components/layout';
 | 
				
			||||||
 | 
					import {Paragraph, Heading} from 'ts/@next/components/text';
 | 
				
			||||||
 | 
					import { ThemeInterface } from 'ts/@next/components/siteWrap';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface Props {
 | 
				
			||||||
 | 
					    heading?: string;
 | 
				
			||||||
 | 
					    subline?: string;
 | 
				
			||||||
 | 
					    mainCta?: CTAButton;
 | 
				
			||||||
 | 
					    secondaryCta?: CTAButton;
 | 
				
			||||||
 | 
					    theme?: ThemeInterface;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface CTAButton {
 | 
				
			||||||
 | 
					    text: string;
 | 
				
			||||||
 | 
					    href: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface BorderProps {
 | 
				
			||||||
 | 
					    isBottom?: boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const Banner: React.StatelessComponent<Props> = (props: Props) => {
 | 
				
			||||||
 | 
					    const {
 | 
				
			||||||
 | 
					        heading,
 | 
				
			||||||
 | 
					        subline,
 | 
				
			||||||
 | 
					        mainCta,
 | 
				
			||||||
 | 
					        secondaryCta,
 | 
				
			||||||
 | 
					    } = props;
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Section bgColor={colors.brandDark} isRelative={true}>
 | 
				
			||||||
 | 
					            <Border/>
 | 
				
			||||||
 | 
					            <Wrap>
 | 
				
			||||||
 | 
					                <CustomColumn colWidth="1/2" isPadLarge={true}>
 | 
				
			||||||
 | 
					                    <WrapCentered>
 | 
				
			||||||
 | 
					                        <Heading isNoMargin={true}>{heading}</Heading>
 | 
				
			||||||
 | 
					                        {subline && <Paragraph isMuted={true} isNoMargin={true}>{subline}</Paragraph>}
 | 
				
			||||||
 | 
					                    </WrapCentered>
 | 
				
			||||||
 | 
					                </CustomColumn>
 | 
				
			||||||
 | 
					                <CustomColumn colWidth="1/2" isPadLarge={true}>
 | 
				
			||||||
 | 
					                    <WrapCentered>
 | 
				
			||||||
 | 
					                        <ButtonWrap>
 | 
				
			||||||
 | 
					                            {mainCta && <Button href={mainCta.href}>{mainCta.text}</Button>}
 | 
				
			||||||
 | 
					                            {secondaryCta && <Button href={secondaryCta.href} isTransparent={true}>{secondaryCta.text}</Button>}
 | 
				
			||||||
 | 
					                        </ButtonWrap>
 | 
				
			||||||
 | 
					                    </WrapCentered>
 | 
				
			||||||
 | 
					                </CustomColumn>
 | 
				
			||||||
 | 
					            </Wrap>
 | 
				
			||||||
 | 
					            <Border isBottom={true} />
 | 
				
			||||||
 | 
					        </Section>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const CustomColumn = styled(Column)`
 | 
				
			||||||
 | 
					    padding: 95px 30px;
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 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: url("data:image/svg+xml;utf8,<svg width='218' height='41' viewBox='0 0 218 41' fill='none' xmlns='http://www.w3.org/2000/svg'><path d='M109 39c59.094 0 107-47.906 107-107 0-59.095-47.906-107-107-107S2-127.095 2-68C2-8.907 49.906 39 109 39z' stroke='rgba(255, 255, 255, 0.1)' stroke-width='3' stroke-miterlimit='10'/><path d='M55 6.688L109-68l54 74.688-8.917 22.313H63.988L55 6.688zM109-68l22 97M109-68L87 29M164 6H55' stroke='rgba(255, 255, 255, 0.1)' stroke-width='3' stroke-miterlimit='10'/></svg>");
 | 
				
			||||||
 | 
					    left: 0;
 | 
				
			||||||
 | 
					    width: calc(100% + 214px);
 | 
				
			||||||
 | 
					    height: 40px;
 | 
				
			||||||
 | 
					    top: ${props => !props.isBottom && 0 };
 | 
				
			||||||
 | 
					    bottom: ${props => props.isBottom && 0 };
 | 
				
			||||||
 | 
					    transform: ${props => props.isBottom ? 'rotate(180deg) translate(112px)' : 'translate(-112px)' };
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
@@ -19,6 +19,7 @@ interface SectionProps {
 | 
				
			|||||||
    isNoMargin?: boolean;
 | 
					    isNoMargin?: boolean;
 | 
				
			||||||
    bgColor?: string;
 | 
					    bgColor?: string;
 | 
				
			||||||
    isFullWidth?: boolean;
 | 
					    isFullWidth?: boolean;
 | 
				
			||||||
 | 
					    isRelative?: boolean;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface WrapProps extends PaddingInterface {
 | 
					interface WrapProps extends PaddingInterface {
 | 
				
			||||||
@@ -85,6 +86,8 @@ export const Section = styled.section<SectionProps>`
 | 
				
			|||||||
    margin-bottom: ${props => !props.isNoMargin && `${GUTTER}px`};
 | 
					    margin-bottom: ${props => !props.isNoMargin && `${GUTTER}px`};
 | 
				
			||||||
    margin-left: ${props => props.isFullWidth && `-${GUTTER}px`};
 | 
					    margin-left: ${props => props.isFullWidth && `-${GUTTER}px`};
 | 
				
			||||||
    background-color: ${props => props.bgColor};
 | 
					    background-color: ${props => props.bgColor};
 | 
				
			||||||
 | 
					    position: ${props => props.isRelative && 'relative'};
 | 
				
			||||||
 | 
					    overflow: ${props => props.isRelative && 'hidden'};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @media (min-width: 1560px) {
 | 
					    @media (min-width: 1560px) {
 | 
				
			||||||
        width: ${props => props.isFullWidth && '100vw'};
 | 
					        width: ${props => props.isFullWidth && '100vw'};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ import styled from 'styled-components';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import { colors } from 'ts/style/colors';
 | 
					import { colors } from 'ts/style/colors';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { Banner } from 'ts/@next/components/banner';
 | 
				
			||||||
import { Column, Section, Wrap, WrapCentered } from 'ts/@next/components/layout';
 | 
					import { Column, Section, Wrap, WrapCentered } from 'ts/@next/components/layout';
 | 
				
			||||||
import { Link } from 'ts/@next/components/link';
 | 
					import { Link } from 'ts/@next/components/link';
 | 
				
			||||||
import { SiteWrap } from 'ts/@next/components/siteWrap';
 | 
					import { SiteWrap } from 'ts/@next/components/siteWrap';
 | 
				
			||||||
@@ -18,7 +19,7 @@ export const NextWhy = () => (
 | 
				
			|||||||
      <WrapCentered>
 | 
					      <WrapCentered>
 | 
				
			||||||
        <Column colWidth="2/3">
 | 
					        <Column colWidth="2/3">
 | 
				
			||||||
          <Heading size="medium" isCentered={true} style={{ '--desktopMaxWidth': '570px' }}>The exchange layer for the crypto economy</Heading>
 | 
					          <Heading size="medium" isCentered={true} style={{ '--desktopMaxWidth': '570px' }}>The exchange layer for the crypto economy</Heading>
 | 
				
			||||||
          <Paragraph size="medium" isCentered={true}>The world's assets are becoming tokenized on public blockchains. 0x Protocol is free, open-source infrastructure that allows anyone in the world to build products that enable the purchasing and trading of crypto tokens.</Paragraph>
 | 
					          <Paragraph size="medium" isMuted={true} isCentered={true}>The world's assets are becoming tokenized on public blockchains. 0x Protocol is free, open-source infrastructure that allows anyone in the world to build products that enable the purchasing and trading of crypto tokens.</Paragraph>
 | 
				
			||||||
          <Link href="/docs" isCentered={true}>Build on 0x</Link>
 | 
					          <Link href="/docs" isCentered={true}>Build on 0x</Link>
 | 
				
			||||||
        </Column>
 | 
					        </Column>
 | 
				
			||||||
      </WrapCentered>
 | 
					      </WrapCentered>
 | 
				
			||||||
@@ -95,6 +96,13 @@ export const NextWhy = () => (
 | 
				
			|||||||
        </Column>
 | 
					        </Column>
 | 
				
			||||||
      </Wrap>
 | 
					      </Wrap>
 | 
				
			||||||
    </Section>
 | 
					    </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', href: '/contact' }}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
  </SiteWrap>
 | 
					  </SiteWrap>
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user