From abdf91c691b924b75d71db49fba296da9c8ddcac Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 20 Dec 2018 16:01:53 -0800 Subject: feat: move all @next files to non @next directory --- packages/website/ts/pages/about/jobs.tsx | 231 ++++++++++++++ packages/website/ts/pages/about/mission.tsx | 97 ++++++ packages/website/ts/pages/about/press.tsx | 94 ++++++ packages/website/ts/pages/about/team.tsx | 286 ++++++++++++++++++ packages/website/ts/pages/community.tsx | 289 ++++++++++++++++++ packages/website/ts/pages/ecosystem.tsx | 128 ++++++++ packages/website/ts/pages/instant.tsx | 261 ++++++++++++++++ packages/website/ts/pages/instant/code_demo.tsx | 30 +- .../website/ts/pages/instant/config_generator.tsx | 332 +++++++++++++++++++++ .../instant/config_generator_address_input.tsx | 55 +++- packages/website/ts/pages/instant/configurator.tsx | 104 +++++++ .../ts/pages/instant/fee_percentage_slider.tsx | 80 +++++ packages/website/ts/pages/instant/rc-slider.css | 295 ++++++++++++++++++ packages/website/ts/pages/instant/select.tsx | 74 +++++ packages/website/ts/pages/landing.tsx | 44 +++ packages/website/ts/pages/launch_kit.tsx | 125 ++++++++ packages/website/ts/pages/market_maker.tsx | 124 ++++++++ packages/website/ts/pages/why.tsx | 309 +++++++++++++++++++ 18 files changed, 2931 insertions(+), 27 deletions(-) create mode 100644 packages/website/ts/pages/about/jobs.tsx create mode 100644 packages/website/ts/pages/about/mission.tsx create mode 100644 packages/website/ts/pages/about/press.tsx create mode 100644 packages/website/ts/pages/about/team.tsx create mode 100644 packages/website/ts/pages/community.tsx create mode 100644 packages/website/ts/pages/ecosystem.tsx create mode 100644 packages/website/ts/pages/instant.tsx create mode 100644 packages/website/ts/pages/instant/config_generator.tsx create mode 100644 packages/website/ts/pages/instant/configurator.tsx create mode 100644 packages/website/ts/pages/instant/fee_percentage_slider.tsx create mode 100644 packages/website/ts/pages/instant/rc-slider.css create mode 100644 packages/website/ts/pages/instant/select.tsx create mode 100644 packages/website/ts/pages/landing.tsx create mode 100644 packages/website/ts/pages/launch_kit.tsx create mode 100644 packages/website/ts/pages/market_maker.tsx create mode 100644 packages/website/ts/pages/why.tsx (limited to 'packages/website/ts/pages') diff --git a/packages/website/ts/pages/about/jobs.tsx b/packages/website/ts/pages/about/jobs.tsx new file mode 100644 index 000000000..2fd2c7619 --- /dev/null +++ b/packages/website/ts/pages/about/jobs.tsx @@ -0,0 +1,231 @@ +import * as _ from 'lodash'; +import * as React from 'react'; +import DocumentTitle from 'react-document-title'; +import styled from 'styled-components'; + +import { AboutPageLayout } from 'ts/@next/components/aboutPageLayout'; +import { Column, FlexWrap, Section } from 'ts/@next/components/newLayout'; +import { Heading, Paragraph } from 'ts/@next/components/text'; +import { WebsiteBackendJobInfo } from 'ts/types'; +import { backendClient } from 'ts/utils/backend_client'; +import { constants } from 'ts/utils/constants'; + +const OPEN_POSITIONS_HASH = 'positions'; + +interface PositionProps { + title: string; + location: string; + href: string; +} + +interface PositionItemProps { + position: PositionProps; +} + +const Position: React.FunctionComponent = (props: PositionItemProps) => { + const { position } = props; + return ( + + + + + {position.title} + + + + + + + {position.location} + + + + + + + Apply + + + + + ); +}; + +export interface NextAboutJobsProps {} +interface NextAboutJobsState { + jobInfos: WebsiteBackendJobInfo[]; +} + +export class NextAboutJobs extends React.Component { + private _isUnmounted: boolean; + private static _convertJobInfoToPositionProps(jobInfo: WebsiteBackendJobInfo): PositionProps { + return { + title: jobInfo.title, + location: jobInfo.office, + href: jobInfo.url, + }; + } + constructor(props: NextAboutJobsProps) { + super(props); + this.state = { + jobInfos: [], + }; + } + + public componentWillMount(): void { + // tslint:disable-next-line:no-floating-promises + this._fetchJobInfosAsync(); + } + public componentWillUnmount(): void { + this._isUnmounted = true; + } + public render(): React.ReactNode { + const positions = this.state.jobInfos.map(jobInfo => NextAboutJobs._convertJobInfoToPositionProps(jobInfo)); + return ( + + + 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" + href={constants.URL_MISSION_AND_VALUES_BLOG_POST} + > + +
+ + + Powered by a Diverse, Global Community + + + + 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. + + + + + + Map of community + + +
+ +
+ + Benefits + + + + +
  • Comprehensive Insurance
  • +
  • Unlimited Vacation
  • +
  • Meals and snacks provided daily
  • +
  • Flexible hours and liberal work-from-home-policy
  • +
  • Supportive of remote working
  • +
  • Transportation, phone, and wellness expense
  • +
  • Relocation assistance
  • +
  • Optional team excursions
  • +
  • Competitive salary
  • +
  • Cryptocurrency based compensation
  • +
    +
    +
    + +
    + + + Current
    Openings +
    +
    + + + {_.map(positions, (position, index) => ( + + ))} + +
    +
    + ); + } + private async _fetchJobInfosAsync(): Promise { + try { + if (!this._isUnmounted) { + this.setState({ + jobInfos: [], + }); + } + const jobInfos = await backendClient.getJobInfosAsync(); + if (!this._isUnmounted) { + this.setState({ + jobInfos, + }); + } + } catch (error) { + if (!this._isUnmounted) { + this.setState({ + jobInfos: [], + }); + } + } + } +} + +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/pages/about/mission.tsx b/packages/website/ts/pages/about/mission.tsx new file mode 100644 index 000000000..2e6530edd --- /dev/null +++ b/packages/website/ts/pages/about/mission.tsx @@ -0,0 +1,97 @@ +import * as _ from 'lodash'; +import * as React from 'react'; +import DocumentTitle from 'react-document-title'; +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'; +import { constants } from 'ts/utils/constants'; + +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 = () => ( + + +
    + + 0x Offices + +
    + +
    + + + Core Values + + + + + + {_.map(values, (item, index) => ( + + ))} + + +
    +
    +); + +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/pages/about/press.tsx b/packages/website/ts/pages/about/press.tsx new file mode 100644 index 000000000..030ee4c14 --- /dev/null +++ b/packages/website/ts/pages/about/press.tsx @@ -0,0 +1,94 @@ +import * as _ from 'lodash'; +import * as React from 'react'; +import DocumentTitle from 'react-document-title'; +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: + 'https://www.forbes.com/sites/rebeccacampbell1/2018/12/06/0x-launches-instant-delivers-an-easy-and-flexible-way-to-buy-crypto-tokens/#bfb73a843561', + }, + { + 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: + 'https://venturebeat.com/2018/09/24/0x-leads-the-way-for-tokenization-of-the-world-and-collectible-game-items-are-next/', + }, + { + 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.', + href: 'http://fortune.com/2018/09/06/0x-harbor-blockchain/', + }, + { + 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: 'https://techcrunch.com/2018/07/16/0x/', + }, +]; + +export const NextAboutPress = () => ( + + + Want to write about 0x? Get in touch. + + + {_.map(highlights, (highlight, index) => ( + + ))} + + } + > + + +); + +export const Highlight: React.FunctionComponent = (props: HighlightItemProps) => { + const { highlight } = props; + return ( + + + {highlight.title} + + + + {highlight.text} + + + + ); +}; + +const HighlightWrap = styled(FlexWrap)` + border-top: 1px solid #eaeaea; + padding: 30px 0; +`; diff --git a/packages/website/ts/pages/about/team.tsx b/packages/website/ts/pages/about/team.tsx new file mode 100644 index 000000000..7177964be --- /dev/null +++ b/packages/website/ts/pages/about/team.tsx @@ -0,0 +1,286 @@ +import * as _ from 'lodash'; +import * as React from 'react'; +import DocumentTitle from 'react-document-title'; +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: 'ecosystem programs lead', + }, + { + 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: 'people operations associate', + }, + { + 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 = () => ( + + +
    + + 0x Team + + + + + {_.map(team, (info: TeamMember, index: number) => ( + + ))} + + +
    + +
    + + Advisors + + + + + {_.map(advisors, (info: TeamMember, index: number) => ( + + ))} + + +
    +
    +); + +const StyledGrid = styled.div` + &:after { + content: ''; + clear: both; + } +`; + +const Member = ({ name, title, imageUrl }: TeamMember) => ( + + {name} + {name} + + {title} + + +); + +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/pages/community.tsx b/packages/website/ts/pages/community.tsx new file mode 100644 index 000000000..a259e3438 --- /dev/null +++ b/packages/website/ts/pages/community.tsx @@ -0,0 +1,289 @@ +import * as _ from 'lodash'; +import * as React from 'react'; +import styled from 'styled-components'; + +import { colors } from 'ts/style/colors'; + +import { Banner } from 'ts/@next/components/banner'; +import { Button } from 'ts/@next/components/button'; +import { Icon } from 'ts/@next/components/icon'; +import { ModalContact } from 'ts/@next/components/modals/modal_contact'; +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 EventProps { + title: string; + date: string; + signupUrl: string; + imageUrl: string; +} + +interface CommunityLinkProps { + bgColor: string; + title?: string; + icon?: string; + url: string; +} + +const events: EventProps[] = [ + { + title: '0x London Meetup', + date: 'October 20th 2018', + imageUrl: '/images/@next/events/london.jpg', + signupUrl: '#', + }, + { + title: '0x Berlin Meetup', + date: 'October 20th 2018', + imageUrl: '/images/@next/events/berlin.jpg', + signupUrl: '#', + }, + { + title: '0x San Francisco Meetup', + date: 'October 20th 2018', + imageUrl: '/images/@next/events/sf.jpg', + signupUrl: '#', + }, +]; +const communityLinks: CommunityLinkProps[] = [ + { + bgColor: '#1DA1F2', + title: 'Twitter', + icon: 'social-twitter', + url: 'https://twitter.com/0xProject', + }, + { + bgColor: '#FF4500', + title: 'Reddit', + icon: 'social-reddit', + url: 'https://twitter.com/0xProject', + }, + { + bgColor: '#7289DA', + title: 'Twitter', + icon: 'social-discord', + url: 'https://twitter.com/0xProject', + }, + { + bgColor: '#3B5998', + title: 'Facebook', + icon: 'social-fb', + url: 'https://twitter.com/0xProject', + }, + { + bgColor: '#181717', + title: 'GitHub', + icon: 'social-github', + url: 'https://twitter.com/0xProject', + }, + { + bgColor: '#003831', + title: 'Newsletter', + icon: 'social-newsletter', + url: 'https://twitter.com/0xProject', + }, +]; + +export class NextCommunity extends React.Component { + public state = { + isContactModalOpen: false, + }; + public render(): React.ReactNode { + return ( + +
    + + + Community + + + The 0x community is a global, passionate group of crypto developers and enthusiasts. The + official channels below provide a great forum for connecting and engaging with the + community. + + + + + +
    + +
    + + {_.map(communityLinks, (link: CommunityLinkProps, index: number) => ( + + ))} + +
    + + + + + Upcoming Events + + + 0x meetups happen all over the world on a monthly basis and are hosted by devoted members of + the community. Want to host a meetup in your city? Reach out for help finding a venue, + connecting with local 0x mentors, and promoting your events. + + + + + + + + {_.map(events, (ev: EventProps, index: number) => ( + + ))} + + + + + +
    + ); + } + + public _onOpenContactModal = (): void => { + this.setState({ isContactModalOpen: true }); + }; + + public _onDismissContactModal = (): void => { + this.setState({ isContactModalOpen: false }); + }; +} + +const Event: React.FunctionComponent = (event: EventProps) => ( + + + + + + {event.title} + + + {event.date} + + + + +); + +const CommunityLink: React.FunctionComponent = (props: CommunityLinkProps) => ( + + + + {props.title} + + +); + +// Events +const EventsWrapper = styled(Section)` + display: flex; + align-items: center; + flex-direction: column; +`; + +// Event +const StyledEvent = styled.div` + background-color: ${colors.brandDark}; + width: calc((100% / 3) - 30px); + text-align: left; + height: 424px; + margin-top: 130px; + position: relative; +`; + +const EventIcon = styled(Icon)` + position: absolute; + top: 30px; + left: 30px; +`; + +const EventImage = styled.img` + width: 100%; + height: 260px; + object-fit: cover; +`; + +const EventContent = styled.div` + padding: 30px 30px; +`; + +interface StyledCommunityLinkProps { + bgColor: string; +} +const StyledCommunityLink = styled.a` + background-color: ${(props: StyledCommunityLinkProps) => props.bgColor}; + color: ${colors.white}; + width: 175px; + height: 175px; + text-align: center; + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +`; + +const CommunityTitle = styled(Paragraph)` + font-size: 20px; + font-weight: 400; +`; + +const CommunityIcon = styled(Icon)` + margin-bottom: 20px; +`; + +// Misc +const LinkWrap = styled.div` + display: inline-flex; + margin-top: 60px; + + a + a { + margin-left: 60px; + } +`; diff --git a/packages/website/ts/pages/ecosystem.tsx b/packages/website/ts/pages/ecosystem.tsx new file mode 100644 index 000000000..f78bd3bdc --- /dev/null +++ b/packages/website/ts/pages/ecosystem.tsx @@ -0,0 +1,128 @@ +import * as _ from 'lodash'; +import * as React from 'react'; +import DocumentTitle from 'react-document-title'; +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'; +import { constants } from 'ts/utils/constants'; + +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 = () => ( + + +
    + + + Jumpstart your Business on 0x + + + The Ecosystem Acceleration Program gives teams access to a variety of services including funding, + dedicated technical support, and recruiting assistance. We created the Ecosystem Acceleration + Program to bolster the expansion of both infrastructure projects and relayers building on 0x. + + + + + + +
    + +
    + + + Join a vibrant ecosystem of projects in the 0x Network. + + + + {_.map(benefits, (benefit: BenefitProps, index) => ( + + + + {benefit.title} + + + {benefit.description} + + + ))} + +
    +
    +); + +const LinkWrap = styled.div` + display: inline-flex; + margin-top: 60px; + + a + a { + margin-left: 60px; + } +`; diff --git a/packages/website/ts/pages/instant.tsx b/packages/website/ts/pages/instant.tsx new file mode 100644 index 000000000..d08fd566a --- /dev/null +++ b/packages/website/ts/pages/instant.tsx @@ -0,0 +1,261 @@ +import { utils as sharedUtils } from '@0x/react-shared'; +import * as _ from 'lodash'; +import * as React from 'react'; +import DocumentTitle from 'react-document-title'; +import styled, { keyframes } from 'styled-components'; + +import { Banner } from 'ts/@next/components/banner'; +import { Button } from 'ts/@next/components/button'; +import { Definition } from 'ts/@next/components/definition'; +import { Hero } from 'ts/@next/components/hero'; +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 { colors } from 'ts/style/colors'; +import { WebsitePaths } from 'ts/types'; +import { utils } from 'ts/utils/utils'; + +import { ModalContact } from '../components/modals/modal_contact'; + +const CONFIGURATOR_MIN_WIDTH_PX = 1050; + +export const getStartedClick = () => { + if (window.innerWidth < CONFIGURATOR_MIN_WIDTH_PX) { + utils.openUrl(`${WebsitePaths.Wiki}#Get-Started-With-Instant`); + } else { + sharedUtils.setUrlHash('configurator'); + sharedUtils.scrollToHash('configurator', ''); + } +}; + +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', + onClick: getStartedClick, + shouldUseAnchorTag: true, + }, + { + label: 'Explore the Docs', + url: `${WebsitePaths.Wiki}#Get-Started-With-Instant`, + }, + ], + }, + { + 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: `${WebsitePaths.Wiki}#Learn-About-Affiliate-Fees`, + }, + ], + }, + { + 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: `${WebsitePaths.Docs}/asset-buyer`, + }, + ], + }, +]; + +interface Props { + theme: { + bgColor: string; + textColor: string; + linkColor: string; + }; +} + +export class Next0xInstant extends React.Component { + public state = { + isContactModalOpen: false, + }; + public render(): React.ReactNode { + return ( + + + Get Started} + /> + +
    + +
    + {[...Array(18)].map((item, index) => ( + + + + ))} +
    +
    +
    + +
    + {_.map(featuresData, (item, index) => ( + + ))} +
    + + + 0x Instant Configurator + + + + + + +
    + + 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. + + + See the Apache License, Version 2.0 for the specific language governing all applicable + permissions and limitations. + +
    +
    + ); + } + + 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: ${CONFIGURATOR_MIN_WIDTH_PX}px) { + display: none; + } +`; + +// width = 370 * 12 +// mobile width = 300 +const MarqueeWrap = styled.div` + width: 100vw; + height: 514px; + padding-bottom: 60px; + + @media (max-width: 768px) { + width: calc(100% + 60px); + margin-left: -30px; + overflow: hidden; + } + + > 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/pages/instant/code_demo.tsx b/packages/website/ts/pages/instant/code_demo.tsx index a3b5fe847..4a3022df5 100644 --- a/packages/website/ts/pages/instant/code_demo.tsx +++ b/packages/website/ts/pages/instant/code_demo.tsx @@ -2,9 +2,8 @@ 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 { Button } from 'ts/@next/components/button'; import { Container } from 'ts/components/ui/container'; -import { colors } from 'ts/style/colors'; import { styled } from 'ts/style/theme'; import { zIndex } from 'ts/style/z_index'; @@ -12,7 +11,7 @@ const CustomPre = styled.pre` margin: 0px; line-height: 24px; overflow: scroll; - width: 600px; + width: 100%; height: 100%; max-height: 800px; border-radius: 4px; @@ -23,19 +22,21 @@ const CustomPre = styled.pre` border: none; } code:first-of-type { - background-color: #2a2a2a !important; + background-color: #060d0d !important; color: #999; - min-height: 98%; + min-height: 100%; text-align: center; - padding-right: 5px !important; - padding-left: 5px; margin-right: 15px; line-height: 25px; - padding-top: 10px; + padding: 10px 7px !important; } code:last-of-type { position: relative; top: 10px; + top: 0; + padding-top: 11px; + display: inline-block; + line-height: 25px; } `; @@ -130,7 +131,7 @@ const customStyle = { hljs: { display: 'block', overflowX: 'hidden', - background: colors.instantSecondaryBackground, + background: '#1B2625', color: 'white', fontSize: '12px', }, @@ -160,9 +161,7 @@ export class CodeDemo extends React.Component { - + {copyButtonText} @@ -175,3 +174,10 @@ export class CodeDemo extends React.Component { this.setState({ didCopyCode: true }); }; } + +const StyledButton = styled(Button)` + border-radius: 4px; + font-size: 15px; + font-weight: 400; + padding: 9px 21px 7px; +`; diff --git a/packages/website/ts/pages/instant/config_generator.tsx b/packages/website/ts/pages/instant/config_generator.tsx new file mode 100644 index 000000000..3f00e33e2 --- /dev/null +++ b/packages/website/ts/pages/instant/config_generator.tsx @@ -0,0 +1,332 @@ +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; +} + +const SRA_ENDPOINTS = ['https://api.radarrelay.com/0x/v2/', 'https://sra.bamboorelay.com/0x/v2/']; + +export class ConfigGenerator extends React.Component { + 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 ( + + + + - + {errMsg} - + ); @@ -57,3 +63,22 @@ export class ConfigGeneratorAddressInput extends React.Component< this.props.onChange(address, isValidAddress); }; } + +const PlainInput: React.StatelessComponent = ({ value, className, placeholder, onChange }) => ( + +); + +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/pages/instant/configurator.tsx b/packages/website/ts/pages/instant/configurator.tsx new file mode 100644 index 000000000..7c67e6333 --- /dev/null +++ b/packages/website/ts/pages/instant/configurator.tsx @@ -0,0 +1,104 @@ +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 ( + + + + + + + + Code Snippet + + + Explore the Docs + + + {codeToDisplay} + + + ); + } + private readonly _handleConfigChange = (config: ZeroExInstantBaseConfig) => { + this.setState({ + instantConfig: config, + }); + }; + private readonly _generateCodeDemoCode = (): string => { + const { instantConfig } = this.state; + return ` + + + + + + + + + `; + }; + 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; + + a { + transform: translateY(-8px); + } +`; diff --git a/packages/website/ts/pages/instant/fee_percentage_slider.tsx b/packages/website/ts/pages/instant/fee_percentage_slider.tsx new file mode 100644 index 000000000..5775d6dfb --- /dev/null +++ b/packages/website/ts/pages/instant/fee_percentage_slider.tsx @@ -0,0 +1,80 @@ +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 { + public render(): React.ReactNode { + return ( + + ); + } + private readonly _feePercentageSliderFormatter = (value: number): React.ReactNode => { + return {`${(value * 100).toFixed(2)}%`}; + }; +} + +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/pages/instant/rc-slider.css b/packages/website/ts/pages/instant/rc-slider.css new file mode 100644 index 000000000..63038324e --- /dev/null +++ b/packages/website/ts/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 { + opacity: 0.2; +} + +.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/pages/instant/select.tsx b/packages/website/ts/pages/instant/select.tsx new file mode 100644 index 000000000..d4146cfb0 --- /dev/null +++ b/packages/website/ts/pages/instant/select.tsx @@ -0,0 +1,74 @@ +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; + onChange?: (ev: React.ChangeEvent) => void; + shouldIncludeEmpty: boolean; +} + +export const Select: React.FunctionComponent = ({ + value, + id, + items, + shouldIncludeEmpty, + emptyText, + onChange, +}) => { + return ( + + + {shouldIncludeEmpty && } + {items.map((item, index) => ( + + ))} + + + + + + ); +}; + +Select.defaultProps = { + emptyText: 'Select...', + shouldIncludeEmpty: true, +}; + +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/pages/landing.tsx b/packages/website/ts/pages/landing.tsx new file mode 100644 index 000000000..4d47fefd9 --- /dev/null +++ b/packages/website/ts/pages/landing.tsx @@ -0,0 +1,44 @@ +import * as React from 'react'; +import DocumentTitle from 'react-document-title'; + +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 { SiteWrap } from 'ts/@next/components/siteWrap'; + +import { ModalContact } from 'ts/@next/components/modals/modal_contact'; + +interface Props { + theme: { + bgColor: string; + textColor: string; + linkColor: string; + }; +} + +export class NextLanding extends React.Component { + public state = { + isContactModalOpen: false, + }; + public render(): React.ReactNode { + return ( + + + + + + + + + ); + } + + public _onOpenContactModal = (): void => { + this.setState({ isContactModalOpen: true }); + }; + + public _onDismissContactModal = (): void => { + this.setState({ isContactModalOpen: false }); + }; +} diff --git a/packages/website/ts/pages/launch_kit.tsx b/packages/website/ts/pages/launch_kit.tsx new file mode 100644 index 000000000..605bce91c --- /dev/null +++ b/packages/website/ts/pages/launch_kit.tsx @@ -0,0 +1,125 @@ +import * as _ from 'lodash'; +import * as React from 'react'; +import DocumentTitle from 'react-document-title'; + +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 { constants } from 'ts/utils/constants'; + +import { ModalContact } from '../components/modals/modal_contact'; + +const offersData = [ + { + icon: 'supportForAllEthereumStandards', + title: 'Perfect for developers who need a simple drop-in marketplace', + description: ( +
      +
    • Quickly launch a market for your project’s token
    • +
    • Seamlessly create an in-game marketplace for digital items and collectables
    • +
    • Easily build a 0x relayer for your local market
    • +
    + ), + }, +]; + +export class NextLaunchKit extends React.Component { + public state = { + isContactModalOpen: false, + }; + public render(): React.ReactNode { + return ( + + + } + actions={} + /> + +
    + + + + + +
    + +
    + {_.map(offersData, (item, index) => ( + + ))} +
    + + + +
    + ); + } + + public _onOpenContactModal = (): void => { + this.setState({ isContactModalOpen: true }); + }; + + public _onDismissContactModal = (): void => { + this.setState({ isContactModalOpen: false }); + }; +} + +const HeroActions = () => ( + + + + + +); diff --git a/packages/website/ts/pages/market_maker.tsx b/packages/website/ts/pages/market_maker.tsx new file mode 100644 index 000000000..e2d3c75c4 --- /dev/null +++ b/packages/website/ts/pages/market_maker.tsx @@ -0,0 +1,124 @@ +import * as _ from 'lodash'; +import * as React from 'react'; + +import { Banner } from 'ts/@next/components/banner'; +import { Button } from 'ts/@next/components/button'; +import { Definition } from 'ts/@next/components/definition'; +import { Hero } from 'ts/@next/components/hero'; +import { ModalContact } from 'ts/@next/components/modals/modal_contact'; +import { Section } from 'ts/@next/components/newLayout'; +import { SiteWrap } from 'ts/@next/components/siteWrap'; + +const offersData = [ + { + icon: 'supportForAllEthereumStandards', + title: 'Comprehensive Tutorials', + description: + 'Stay on the bleeding edge of crypto by learning how to market make on decentralized exchanges. The network of 0x relayers provides market makers a first-mover advantage to capture larger spreads, arbitrage markets, and access a long-tail of new tokens not currently listed on centralized exchanges.', + }, + { + icon: 'generateRevenueForYourBusiness-large', + title: 'Market Making Compensation', + description: ( +
      +
    • Receive an infrastructure grant of $20,000+ for completing onboarding*
    • +
    • Earn an additional $5,000 by referring other market makers to the Program*
    • +
    + ), + }, + { + icon: 'getInTouch', + title: 'Personalized Support', + description: + 'The 0x MM Success Manager will walk you through how to read 0x order types, spin up an Ethereum node, set up your MM bot, and execute trades on the blockchain. We are more than happy to promptly answer your questions and give you complete onboarding assistance.', + }, +]; + +export class NextMarketMaker extends React.Component { + public state = { + isContactModalOpen: false, + }; + public render(): React.ReactNode { + return ( + + } + /> + +
    + + + + + +
    + +
    + {_.map(offersData, (item, index) => ( + + ))} +
    + + + +
    + ); + } + + public _onOpenContactModal = (): void => { + this.setState({ isContactModalOpen: true }); + }; + + public _onDismissContactModal = (): void => { + this.setState({ isContactModalOpen: false }); + }; +} + +const HeroActions = () => ( + <> + + +); diff --git a/packages/website/ts/pages/why.tsx b/packages/website/ts/pages/why.tsx new file mode 100644 index 000000000..cdf7960c2 --- /dev/null +++ b/packages/website/ts/pages/why.tsx @@ -0,0 +1,309 @@ +import * as _ from 'lodash'; +import * as React from 'react'; +import DocumentTitle from 'react-document-title'; +import ScrollableAnchor, { configureAnchors } from 'react-scrollable-anchor'; +import styled from 'styled-components'; + +import { Banner } from 'ts/@next/components/banner'; +import { Button } from 'ts/@next/components/button'; +import { Definition } from 'ts/@next/components/definition'; +import { Hero } from 'ts/@next/components/hero'; +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 { Heading } from 'ts/@next/components/text'; + +import { ModalContact } from '../components/modals/modal_contact'; + +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.', + }, +]; + +configureAnchors({ offset: -60 }); + +export class NextWhy extends React.Component { + public state = { + isContactModalOpen: false, + }; + public render(): React.ReactNode { + const buildAction = ( + + ); + return ( + + + + +
    + + + + + +
    + +
    + + + Benefits + Use Cases + Features + + + + + + + + + What 0x offers + + + {_.map(offersData, (item, index) => ( + + ))} + + + + + + + Use Cases + + + {_.map(useCaseSlides, (item, index) => ( + + ))} + + + + + + + + Exchange Functionality + + + {_.map(functionalityData, (item, index) => ( + + ))} + + + + +
    + + + +
    + ); + } + + 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%; + } + } +`; + +interface SectionTitleProps { + isNoBorder?: boolean; +} +const SectionTitle = + styled(Heading) < + SectionTitleProps > + ` + 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.a` + color: ${props => props.theme.textColor}; + font-size: 22px; + margin-bottom: 25px; + display: block; + opacity: 0.8; + + &:hover, + &:active { + opacity: 1; + } +`; -- cgit v1.2.3 From a67b34700e48cdf9a54c601af4ec9b9112fe4803 Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 20 Dec 2018 16:03:06 -0800 Subject: feat: remove @next directory from all imports --- packages/website/ts/pages/about/jobs.tsx | 8 +-- packages/website/ts/pages/about/mission.tsx | 12 ++-- packages/website/ts/pages/about/press.tsx | 16 ++--- packages/website/ts/pages/about/team.tsx | 68 +++++++++++----------- packages/website/ts/pages/community.tsx | 20 +++---- packages/website/ts/pages/ecosystem.tsx | 10 ++-- packages/website/ts/pages/instant.tsx | 18 +++--- packages/website/ts/pages/instant/code_demo.tsx | 2 +- .../website/ts/pages/instant/config_generator.tsx | 8 +-- .../instant/config_generator_address_input.tsx | 2 +- packages/website/ts/pages/instant/configurator.tsx | 10 ++-- .../ts/pages/instant/fee_percentage_slider.tsx | 2 +- packages/website/ts/pages/landing.tsx | 12 ++-- packages/website/ts/pages/launch_kit.tsx | 14 ++--- packages/website/ts/pages/market_maker.tsx | 14 ++--- packages/website/ts/pages/why.tsx | 16 ++--- 16 files changed, 116 insertions(+), 116 deletions(-) (limited to 'packages/website/ts/pages') diff --git a/packages/website/ts/pages/about/jobs.tsx b/packages/website/ts/pages/about/jobs.tsx index 2fd2c7619..648190380 100644 --- a/packages/website/ts/pages/about/jobs.tsx +++ b/packages/website/ts/pages/about/jobs.tsx @@ -3,9 +3,9 @@ import * as React from 'react'; import DocumentTitle from 'react-document-title'; import styled from 'styled-components'; -import { AboutPageLayout } from 'ts/@next/components/aboutPageLayout'; -import { Column, FlexWrap, Section } from 'ts/@next/components/newLayout'; -import { Heading, Paragraph } from 'ts/@next/components/text'; +import { AboutPageLayout } from 'ts/components/aboutPageLayout'; +import { Column, FlexWrap, Section } from 'ts/components/newLayout'; +import { Heading, Paragraph } from 'ts/components/text'; import { WebsiteBackendJobInfo } from 'ts/types'; import { backendClient } from 'ts/utils/backend_client'; import { constants } from 'ts/utils/constants'; @@ -117,7 +117,7 @@ export class NextAboutJobs extends React.Component - Map of community + Map of community diff --git a/packages/website/ts/pages/about/mission.tsx b/packages/website/ts/pages/about/mission.tsx index 2e6530edd..ab8949fae 100644 --- a/packages/website/ts/pages/about/mission.tsx +++ b/packages/website/ts/pages/about/mission.tsx @@ -3,11 +3,11 @@ import * as React from 'react'; import DocumentTitle from 'react-document-title'; 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'; +import { AboutPageLayout } from 'ts/components/aboutPageLayout'; +import { Definition } from 'ts/components/definition'; +import { Image } from 'ts/components/image'; +import { Column, Section } from 'ts/components/newLayout'; +import { Heading } from 'ts/components/text'; import { constants } from 'ts/utils/constants'; const values = [ @@ -41,7 +41,7 @@ export const NextAboutMission = () => (
    - 0x Offices + 0x Offices
    diff --git a/packages/website/ts/pages/about/press.tsx b/packages/website/ts/pages/about/press.tsx index 030ee4c14..03003d656 100644 --- a/packages/website/ts/pages/about/press.tsx +++ b/packages/website/ts/pages/about/press.tsx @@ -3,10 +3,10 @@ import * as React from 'react'; import DocumentTitle from 'react-document-title'; 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'; +import { AboutPageLayout } from 'ts/components/aboutPageLayout'; +import { Button } from 'ts/components/button'; +import { Column, FlexWrap } from 'ts/components/newLayout'; +import { Paragraph } from 'ts/components/text'; interface HighlightProps { logo: string; @@ -21,7 +21,7 @@ interface HighlightItemProps { const highlights: HighlightProps[] = [ { - logo: '/images/@next/press/logo-forbes.png', + logo: '/images/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.', @@ -29,21 +29,21 @@ const highlights: HighlightProps[] = [ 'https://www.forbes.com/sites/rebeccacampbell1/2018/12/06/0x-launches-instant-delivers-an-easy-and-flexible-way-to-buy-crypto-tokens/#bfb73a843561', }, { - logo: '/images/@next/press/logo-venturebeat.png', + logo: '/images/press/logo-venturebeat.png', title: 'VentureBeat', text: '0x leads the way for ‘tokenization’ of the world, and collectible game items are next', href: 'https://venturebeat.com/2018/09/24/0x-leads-the-way-for-tokenization-of-the-world-and-collectible-game-items-are-next/', }, { - logo: '/images/@next/press/logo-fortune.png', + logo: '/images/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.', href: 'http://fortune.com/2018/09/06/0x-harbor-blockchain/', }, { - logo: '/images/@next/press/logo-techcrunch.png', + logo: '/images/press/logo-techcrunch.png', title: 'TechCrunch', text: '0x allows any developer to quickly build their own decentralized cryptocurrency exchange and decide their own fees.', diff --git a/packages/website/ts/pages/about/team.tsx b/packages/website/ts/pages/about/team.tsx index 7177964be..41d6c2cf8 100644 --- a/packages/website/ts/pages/about/team.tsx +++ b/packages/website/ts/pages/about/team.tsx @@ -5,9 +5,9 @@ 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 { AboutPageLayout } from 'ts/components/aboutPageLayout'; +import { Column, Section } from 'ts/components/newLayout'; +import { Heading, Paragraph } from 'ts/components/text'; import { WebsitePaths } from 'ts/types'; interface TeamMember { @@ -18,132 +18,132 @@ interface TeamMember { const team: TeamMember[] = [ { - imageUrl: '/images/@next/team/willw.jpg', + imageUrl: '/images/team/willw.jpg', name: 'Will Warren', title: 'co-founder & CEO', }, { - imageUrl: '/images/@next/team/amirb.jpg', + imageUrl: '/images/team/amirb.jpg', name: 'Amir Bandeali', title: 'Co-founder & CTO', }, { - imageUrl: '/images/@next/team/fabiob.jpg', + imageUrl: '/images/team/fabiob.jpg', name: 'Fabio Berger', title: 'senior engineer', }, { - imageUrl: '/images/@next/team/alexv.jpg', + imageUrl: '/images/team/alexv.jpg', name: 'Alex Xu', title: 'Director of operations', }, { - imageUrl: '/images/@next/team/leonidL.jpg', + imageUrl: '/images/team/leonidL.jpg', name: 'Leonid Logvinov', title: 'engineer', }, { - imageUrl: '/images/@next/team/benb.jpg', + imageUrl: '/images/team/benb.jpg', name: 'Ben Burns', title: 'designer', }, { - imageUrl: '/images/@next/team/brandonm.jpg', + imageUrl: '/images/team/brandonm.jpg', name: 'Brandon Millman', title: 'senior engineer', }, { - imageUrl: '/images/@next/team/toms.jpg', + imageUrl: '/images/team/toms.jpg', name: 'Tom Schmidt', title: 'product manager', }, { - imageUrl: '/images/@next/team/jacobe.jpg', + imageUrl: '/images/team/jacobe.jpg', name: 'Jacob Evans', title: 'ecosystem engineer', }, { - imageUrl: '/images/@next/team/blake.jpg', + imageUrl: '/images/team/blake.jpg', name: 'Blake Henderson', title: 'ecosystem programs lead', }, { - imageUrl: '/images/@next/team/zack.jpg', + imageUrl: '/images/team/zack.jpg', name: 'Zack Skelly', title: 'lead recruiter', }, { - imageUrl: '/images/@next/team/greg.jpg', + imageUrl: '/images/team/greg.jpg', name: 'Greg Hysen', title: 'blockchain engineer', }, { - imageUrl: '/images/@next/team/remcoB.jpg', + imageUrl: '/images/team/remcoB.jpg', name: 'Remco Bloemen', title: 'technical fellow', }, { - imageUrl: '/images/@next/team/francesco.jpg', + imageUrl: '/images/team/francesco.jpg', name: 'Francesco Agosti', title: 'engineer', }, { - imageUrl: '/images/@next/team/melo.jpg', + imageUrl: '/images/team/melo.jpg', name: 'Mel Oberto', title: 'people operations associate', }, { - imageUrl: '/images/@next/team/alexb.jpg', + imageUrl: '/images/team/alexb.jpg', name: 'Alex Browne', title: 'engineer in residence', }, { - imageUrl: '/images/@next/team/peterz.jpg', + imageUrl: '/images/team/peterz.jpg', name: 'Peter Zeitz', title: 'research fellow', }, { - imageUrl: '/images/@next/team/chrisk.jpg', + imageUrl: '/images/team/chrisk.jpg', name: 'Chris Kalani', title: 'director of design', }, { - imageUrl: '/images/@next/team/clayr.jpg', + imageUrl: '/images/team/clayr.jpg', name: 'Clay Robbins', title: 'ecosystem development lead', }, { - imageUrl: '/images/@next/team/mattt.jpg', + imageUrl: '/images/team/mattt.jpg', name: 'Matt Taylor', title: 'marketing lead', }, { - imageUrl: '/images/@next/team/eugenea.jpg', + imageUrl: '/images/team/eugenea.jpg', name: 'Eugene Aumson', title: 'engineer', }, { - imageUrl: '/images/@next/team/weijew.jpg', + imageUrl: '/images/team/weijew.jpg', name: 'Weijie Wu', title: 'research fellow', }, { - imageUrl: '/images/@next/team/rahuls.jpg', + imageUrl: '/images/team/rahuls.jpg', name: 'Rahul Singireddy', title: 'relayer success manager', }, { - imageUrl: '/images/@next/team/jasons.jpg', + imageUrl: '/images/team/jasons.jpg', name: 'Jason Somensatto', title: 'strategic legal counsel', }, { - imageUrl: '/images/@next/team/steveK.jpg', + imageUrl: '/images/team/steveK.jpg', name: 'Steve Klebanoff', title: 'senior engineer', }, { - imageUrl: '/images/@next/team/xianny.jpg', + imageUrl: '/images/team/xianny.jpg', name: 'Xianny Ng', title: 'engineer', }, @@ -151,27 +151,27 @@ const team: TeamMember[] = [ const advisors: TeamMember[] = [ { - imageUrl: '/images/@next/team/advisors/frede.jpg', + imageUrl: '/images/team/advisors/frede.jpg', name: 'Fred Ehrsam', title: 'Advisor', }, { - imageUrl: '/images/@next/team/advisors/olafc.jpg', + imageUrl: '/images/team/advisors/olafc.jpg', name: 'Olaf Carlson-Wee', title: 'Advisor', }, { - imageUrl: '/images/@next/team/advisors/joeyk.jpg', + imageUrl: '/images/team/advisors/joeyk.jpg', name: 'Joey Krug', title: 'Advisor', }, { - imageUrl: '/images/@next/team/advisors/lindax.jpg', + imageUrl: '/images/team/advisors/lindax.jpg', name: 'Linda Xie', title: 'Advisor', }, { - imageUrl: '/images/@next/team/advisors/davids.jpg', + imageUrl: '/images/team/advisors/davids.jpg', name: 'David Sacks', title: 'Advisor', }, diff --git a/packages/website/ts/pages/community.tsx b/packages/website/ts/pages/community.tsx index a259e3438..7c02fed82 100644 --- a/packages/website/ts/pages/community.tsx +++ b/packages/website/ts/pages/community.tsx @@ -4,13 +4,13 @@ import styled from 'styled-components'; import { colors } from 'ts/style/colors'; -import { Banner } from 'ts/@next/components/banner'; -import { Button } from 'ts/@next/components/button'; -import { Icon } from 'ts/@next/components/icon'; -import { ModalContact } from 'ts/@next/components/modals/modal_contact'; -import { Column, Section, WrapGrid } from 'ts/@next/components/newLayout'; -import { SiteWrap } from 'ts/@next/components/siteWrap'; -import { Heading, Paragraph } from 'ts/@next/components/text'; +import { Banner } from 'ts/components/banner'; +import { Button } from 'ts/components/button'; +import { Icon } from 'ts/components/icon'; +import { ModalContact } from 'ts/components/modals/modal_contact'; +import { Column, Section, WrapGrid } from 'ts/components/newLayout'; +import { SiteWrap } from 'ts/components/siteWrap'; +import { Heading, Paragraph } from 'ts/components/text'; interface EventProps { title: string; @@ -30,19 +30,19 @@ const events: EventProps[] = [ { title: '0x London Meetup', date: 'October 20th 2018', - imageUrl: '/images/@next/events/london.jpg', + imageUrl: '/images/events/london.jpg', signupUrl: '#', }, { title: '0x Berlin Meetup', date: 'October 20th 2018', - imageUrl: '/images/@next/events/berlin.jpg', + imageUrl: '/images/events/berlin.jpg', signupUrl: '#', }, { title: '0x San Francisco Meetup', date: 'October 20th 2018', - imageUrl: '/images/@next/events/sf.jpg', + imageUrl: '/images/events/sf.jpg', signupUrl: '#', }, ]; diff --git a/packages/website/ts/pages/ecosystem.tsx b/packages/website/ts/pages/ecosystem.tsx index f78bd3bdc..8e367b21f 100644 --- a/packages/website/ts/pages/ecosystem.tsx +++ b/packages/website/ts/pages/ecosystem.tsx @@ -5,11 +5,11 @@ 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'; +import { Button } from 'ts/components/button'; +import { Icon } from 'ts/components/icon'; +import { Column, Section, WrapGrid } from 'ts/components/newLayout'; +import { SiteWrap } from 'ts/components/siteWrap'; +import { Heading, Paragraph } from 'ts/components/text'; import { constants } from 'ts/utils/constants'; interface BenefitProps { diff --git a/packages/website/ts/pages/instant.tsx b/packages/website/ts/pages/instant.tsx index d08fd566a..b97bb35a4 100644 --- a/packages/website/ts/pages/instant.tsx +++ b/packages/website/ts/pages/instant.tsx @@ -4,14 +4,14 @@ import * as React from 'react'; import DocumentTitle from 'react-document-title'; import styled, { keyframes } from 'styled-components'; -import { Banner } from 'ts/@next/components/banner'; -import { Button } from 'ts/@next/components/button'; -import { Definition } from 'ts/@next/components/definition'; -import { Hero } from 'ts/@next/components/hero'; -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 { Banner } from 'ts/components/banner'; +import { Button } from 'ts/components/button'; +import { Definition } from 'ts/components/definition'; +import { Hero } from 'ts/components/hero'; +import { Section, SectionProps } from 'ts/components/newLayout'; +import { SiteWrap } from 'ts/components/siteWrap'; +import { Heading, Paragraph } from 'ts/components/text'; +import { Configurator } from 'ts/pages/instant/configurator'; import { colors } from 'ts/style/colors'; import { WebsitePaths } from 'ts/types'; import { utils } from 'ts/utils/utils'; @@ -100,7 +100,7 @@ export class Next0xInstant extends React.Component {
    {[...Array(18)].map((item, index) => ( - + ))}
    diff --git a/packages/website/ts/pages/instant/code_demo.tsx b/packages/website/ts/pages/instant/code_demo.tsx index 4a3022df5..c59f148b8 100644 --- a/packages/website/ts/pages/instant/code_demo.tsx +++ b/packages/website/ts/pages/instant/code_demo.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import * as CopyToClipboard from 'react-copy-to-clipboard'; import SyntaxHighlighter from 'react-syntax-highlighter'; -import { Button } from 'ts/@next/components/button'; +import { Button } from 'ts/components/button'; import { Container } from 'ts/components/ui/container'; import { styled } from 'ts/style/theme'; import { zIndex } from 'ts/style/z_index'; diff --git a/packages/website/ts/pages/instant/config_generator.tsx b/packages/website/ts/pages/instant/config_generator.tsx index 3f00e33e2..024d37b51 100644 --- a/packages/website/ts/pages/instant/config_generator.tsx +++ b/packages/website/ts/pages/instant/config_generator.tsx @@ -6,8 +6,8 @@ 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 { ConfigGeneratorAddressInput } from 'ts/pages/instant/config_generator_address_input'; +import { FeePercentageSlider } from 'ts/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'; @@ -18,8 +18,8 @@ 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 { Heading } from 'ts/components/text'; +import { Select, SelectItemConfig } from 'ts/pages/instant/select'; import { assetMetaDataMap } from '../../../../../instant/src/data/asset_meta_data_map'; import { ERC20AssetMetaData, ZeroExInstantBaseConfig } from '../../../../../instant/src/types'; diff --git a/packages/website/ts/pages/instant/config_generator_address_input.tsx b/packages/website/ts/pages/instant/config_generator_address_input.tsx index 9b0e9b1d1..890e39da6 100644 --- a/packages/website/ts/pages/instant/config_generator_address_input.tsx +++ b/packages/website/ts/pages/instant/config_generator_address_input.tsx @@ -7,7 +7,7 @@ import { colors } from 'ts/style/colors'; import { Container } from 'ts/components/ui/container'; -import { Paragraph } from 'ts/@next/components/text'; +import { Paragraph } from 'ts/components/text'; export interface ConfigGeneratorAddressInputProps { value?: string; diff --git a/packages/website/ts/pages/instant/configurator.tsx b/packages/website/ts/pages/instant/configurator.tsx index 7c67e6333..c5f7b06a5 100644 --- a/packages/website/ts/pages/instant/configurator.tsx +++ b/packages/website/ts/pages/instant/configurator.tsx @@ -2,12 +2,12 @@ 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 { CodeDemo } from 'ts/pages/instant/code_demo'; +import { ConfigGenerator } from 'ts/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 { Link } from 'ts/components/link'; +import { Column, FlexWrap } from 'ts/components/newLayout'; +import { Heading } from 'ts/components/text'; import { WebsitePaths } from 'ts/types'; import { ZeroExInstantBaseConfig } from '../../../../../instant/src/types'; diff --git a/packages/website/ts/pages/instant/fee_percentage_slider.tsx b/packages/website/ts/pages/instant/fee_percentage_slider.tsx index 5775d6dfb..c4d9f908f 100644 --- a/packages/website/ts/pages/instant/fee_percentage_slider.tsx +++ b/packages/website/ts/pages/instant/fee_percentage_slider.tsx @@ -1,7 +1,7 @@ import Slider from 'rc-slider'; import * as React from 'react'; import styled from 'styled-components'; -import 'ts/@next/pages/instant/rc-slider.css'; +import 'ts/pages/instant/rc-slider.css'; import { colors } from 'ts/style/colors'; diff --git a/packages/website/ts/pages/landing.tsx b/packages/website/ts/pages/landing.tsx index 4d47fefd9..b47d34dce 100644 --- a/packages/website/ts/pages/landing.tsx +++ b/packages/website/ts/pages/landing.tsx @@ -1,13 +1,13 @@ import * as React from 'react'; import DocumentTitle from 'react-document-title'; -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 { SiteWrap } from 'ts/@next/components/siteWrap'; +import { SectionLandingAbout } from 'ts/components/sections/landing/about'; +import { SectionLandingClients } from 'ts/components/sections/landing/clients'; +import { SectionLandingCta } from 'ts/components/sections/landing/cta'; +import { SectionLandingHero } from 'ts/components/sections/landing/hero'; +import { SiteWrap } from 'ts/components/siteWrap'; -import { ModalContact } from 'ts/@next/components/modals/modal_contact'; +import { ModalContact } from 'ts/components/modals/modal_contact'; interface Props { theme: { diff --git a/packages/website/ts/pages/launch_kit.tsx b/packages/website/ts/pages/launch_kit.tsx index 605bce91c..dd4de4d99 100644 --- a/packages/website/ts/pages/launch_kit.tsx +++ b/packages/website/ts/pages/launch_kit.tsx @@ -2,15 +2,15 @@ import * as _ from 'lodash'; import * as React from 'react'; import DocumentTitle from 'react-document-title'; -import { Hero } from 'ts/@next/components/hero'; +import { Hero } from 'ts/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 { Banner } from 'ts/components/banner'; +import { Button } from 'ts/components/button'; +import { Definition } from 'ts/components/definition'; +import { Icon } from 'ts/components/icon'; +import { SiteWrap } from 'ts/components/siteWrap'; -import { Section } from 'ts/@next/components/newLayout'; +import { Section } from 'ts/components/newLayout'; import { constants } from 'ts/utils/constants'; import { ModalContact } from '../components/modals/modal_contact'; diff --git a/packages/website/ts/pages/market_maker.tsx b/packages/website/ts/pages/market_maker.tsx index e2d3c75c4..55566c798 100644 --- a/packages/website/ts/pages/market_maker.tsx +++ b/packages/website/ts/pages/market_maker.tsx @@ -1,13 +1,13 @@ import * as _ from 'lodash'; import * as React from 'react'; -import { Banner } from 'ts/@next/components/banner'; -import { Button } from 'ts/@next/components/button'; -import { Definition } from 'ts/@next/components/definition'; -import { Hero } from 'ts/@next/components/hero'; -import { ModalContact } from 'ts/@next/components/modals/modal_contact'; -import { Section } from 'ts/@next/components/newLayout'; -import { SiteWrap } from 'ts/@next/components/siteWrap'; +import { Banner } from 'ts/components/banner'; +import { Button } from 'ts/components/button'; +import { Definition } from 'ts/components/definition'; +import { Hero } from 'ts/components/hero'; +import { ModalContact } from 'ts/components/modals/modal_contact'; +import { Section } from 'ts/components/newLayout'; +import { SiteWrap } from 'ts/components/siteWrap'; const offersData = [ { diff --git a/packages/website/ts/pages/why.tsx b/packages/website/ts/pages/why.tsx index cdf7960c2..197ce5fc9 100644 --- a/packages/website/ts/pages/why.tsx +++ b/packages/website/ts/pages/why.tsx @@ -4,14 +4,14 @@ import DocumentTitle from 'react-document-title'; import ScrollableAnchor, { configureAnchors } from 'react-scrollable-anchor'; import styled from 'styled-components'; -import { Banner } from 'ts/@next/components/banner'; -import { Button } from 'ts/@next/components/button'; -import { Definition } from 'ts/@next/components/definition'; -import { Hero } from 'ts/@next/components/hero'; -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 { Heading } from 'ts/@next/components/text'; +import { Banner } from 'ts/components/banner'; +import { Button } from 'ts/components/button'; +import { Definition } from 'ts/components/definition'; +import { Hero } from 'ts/components/hero'; +import { Column, Section, WrapSticky } from 'ts/components/newLayout'; +import { SiteWrap } from 'ts/components/siteWrap'; +import { Slide, Slider } from 'ts/components/slider/slider'; +import { Heading } from 'ts/components/text'; import { ModalContact } from '../components/modals/modal_contact'; -- cgit v1.2.3 From ba7c8d924429a96f6d2b3280faa6b508b582f557 Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 20 Dec 2018 16:19:52 -0800 Subject: feat: make project build by adding back old footer component --- packages/website/ts/pages/about/about.tsx | 2 +- packages/website/ts/pages/faq/faq.tsx | 2 +- packages/website/ts/pages/instant/config_generator.tsx | 8 ++++---- packages/website/ts/pages/instant/configurator.tsx | 2 +- packages/website/ts/pages/jobs/jobs.tsx | 2 +- packages/website/ts/pages/landing/landing.tsx | 2 +- packages/website/ts/pages/launch_kit/launch_kit.tsx | 2 +- packages/website/ts/pages/not_found.tsx | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) (limited to 'packages/website/ts/pages') diff --git a/packages/website/ts/pages/about/about.tsx b/packages/website/ts/pages/about/about.tsx index 81a3f59e1..39bbc584f 100644 --- a/packages/website/ts/pages/about/about.tsx +++ b/packages/website/ts/pages/about/about.tsx @@ -2,7 +2,7 @@ import { colors, Link, Styles } from '@0x/react-shared'; import * as _ from 'lodash'; import * as React from 'react'; import * as DocumentTitle from 'react-document-title'; -import { Footer } from 'ts/components/footer'; +import { Footer } from 'ts/components/old_footer'; import { TopBar } from 'ts/components/top_bar/top_bar'; import { Profile } from 'ts/pages/about/profile'; import { Dispatcher } from 'ts/redux/dispatcher'; diff --git a/packages/website/ts/pages/faq/faq.tsx b/packages/website/ts/pages/faq/faq.tsx index c4965e61c..8cde7224e 100644 --- a/packages/website/ts/pages/faq/faq.tsx +++ b/packages/website/ts/pages/faq/faq.tsx @@ -2,7 +2,7 @@ import { colors, Styles } from '@0x/react-shared'; import * as _ from 'lodash'; import * as React from 'react'; import * as DocumentTitle from 'react-document-title'; -import { Footer } from 'ts/components/footer'; +import { Footer } from 'ts/components/old_footer'; import { TopBar } from 'ts/components/top_bar/top_bar'; import { Question } from 'ts/pages/faq/question'; import { Dispatcher } from 'ts/redux/dispatcher'; diff --git a/packages/website/ts/pages/instant/config_generator.tsx b/packages/website/ts/pages/instant/config_generator.tsx index 024d37b51..e43d47119 100644 --- a/packages/website/ts/pages/instant/config_generator.tsx +++ b/packages/website/ts/pages/instant/config_generator.tsx @@ -6,13 +6,13 @@ import * as _ from 'lodash'; import * as React from 'react'; import styled from 'styled-components'; -import { ConfigGeneratorAddressInput } from 'ts/pages/instant/config_generator_address_input'; -import { FeePercentageSlider } from 'ts/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 { ConfigGeneratorAddressInput } from 'ts/pages/instant/config_generator_address_input'; +import { FeePercentageSlider } from 'ts/pages/instant/fee_percentage_slider'; import { colors } from 'ts/style/colors'; import { WebsitePaths } from 'ts/types'; import { constants } from 'ts/utils/constants'; @@ -21,8 +21,8 @@ import { constants } from 'ts/utils/constants'; import { Heading } from 'ts/components/text'; import { Select, SelectItemConfig } from 'ts/pages/instant/select'; -import { assetMetaDataMap } from '../../../../../instant/src/data/asset_meta_data_map'; -import { ERC20AssetMetaData, ZeroExInstantBaseConfig } from '../../../../../instant/src/types'; +import { assetMetaDataMap } from '../../../../instant/src/data/asset_meta_data_map'; +import { ERC20AssetMetaData, ZeroExInstantBaseConfig } from '../../../../instant/src/types'; export interface ConfigGeneratorProps { value: ZeroExInstantBaseConfig; diff --git a/packages/website/ts/pages/instant/configurator.tsx b/packages/website/ts/pages/instant/configurator.tsx index c5f7b06a5..a63e1752e 100644 --- a/packages/website/ts/pages/instant/configurator.tsx +++ b/packages/website/ts/pages/instant/configurator.tsx @@ -10,7 +10,7 @@ import { Column, FlexWrap } from 'ts/components/newLayout'; import { Heading } from 'ts/components/text'; import { WebsitePaths } from 'ts/types'; -import { ZeroExInstantBaseConfig } from '../../../../../instant/src/types'; +import { ZeroExInstantBaseConfig } from '../../../../instant/src/types'; export interface ConfiguratorState { instantConfig: ZeroExInstantBaseConfig; diff --git a/packages/website/ts/pages/jobs/jobs.tsx b/packages/website/ts/pages/jobs/jobs.tsx index 728e17f9e..872dc6103 100644 --- a/packages/website/ts/pages/jobs/jobs.tsx +++ b/packages/website/ts/pages/jobs/jobs.tsx @@ -3,8 +3,8 @@ import * as _ from 'lodash'; import * as React from 'react'; import * as DocumentTitle from 'react-document-title'; -import { Footer } from 'ts/components/footer'; import { MetaTags } from 'ts/components/meta_tags'; +import { Footer } from 'ts/components/old_footer'; import { TopBar } from 'ts/components/top_bar/top_bar'; import { Container } from 'ts/components/ui/container'; import { Benefits } from 'ts/pages/jobs/benefits'; diff --git a/packages/website/ts/pages/landing/landing.tsx b/packages/website/ts/pages/landing/landing.tsx index b75b55edb..aac659fd5 100644 --- a/packages/website/ts/pages/landing/landing.tsx +++ b/packages/website/ts/pages/landing/landing.tsx @@ -2,8 +2,8 @@ import { colors, Link } from '@0x/react-shared'; import * as _ from 'lodash'; import * as React from 'react'; import DocumentTitle from 'react-document-title'; -import { Footer } from 'ts/components/footer'; import { SubscribeForm } from 'ts/components/forms/subscribe_form'; +import { Footer } from 'ts/components/old_footer'; import { TopBar } from 'ts/components/top_bar/top_bar'; import { CallToAction } from 'ts/components/ui/button'; import { Container } from 'ts/components/ui/container'; diff --git a/packages/website/ts/pages/launch_kit/launch_kit.tsx b/packages/website/ts/pages/launch_kit/launch_kit.tsx index 4ea56dbd4..37794e887 100644 --- a/packages/website/ts/pages/launch_kit/launch_kit.tsx +++ b/packages/website/ts/pages/launch_kit/launch_kit.tsx @@ -2,7 +2,7 @@ import { colors, Link } from '@0x/react-shared'; import * as _ from 'lodash'; import * as React from 'react'; import DocumentTitle from 'react-document-title'; -import { Footer } from 'ts/components/footer'; +import { Footer } from 'ts/components/old_footer'; import { TopBar } from 'ts/components/top_bar/top_bar'; import { Button } from 'ts/components/ui/button'; import { Container } from 'ts/components/ui/container'; diff --git a/packages/website/ts/pages/not_found.tsx b/packages/website/ts/pages/not_found.tsx index a7992a8fa..6abd8fc80 100644 --- a/packages/website/ts/pages/not_found.tsx +++ b/packages/website/ts/pages/not_found.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { Footer } from 'ts/components/footer'; +import { Footer } from 'ts/components/old_footer'; import { TopBar } from 'ts/components/top_bar/top_bar'; import { FullscreenMessage } from 'ts/pages/fullscreen_message'; import { Dispatcher } from 'ts/redux/dispatcher'; -- cgit v1.2.3 From ea781b8850cda274d24e4cc5f196dfb7e5b37732 Mon Sep 17 00:00:00 2001 From: fragosti Date: Thu, 20 Dec 2018 16:32:00 -0800 Subject: feat: remove unused files --- packages/website/ts/pages/about/about.tsx | 421 -------------- packages/website/ts/pages/about/profile.tsx | 80 --- .../ts/pages/instant/introducing_0x_instant.tsx | 57 -- packages/website/ts/pages/instant/need_more.tsx | 62 --- packages/website/ts/pages/instant/screenshots.tsx | 35 -- packages/website/ts/pages/jobs/benefits.tsx | 158 ------ packages/website/ts/pages/jobs/jobs.tsx | 71 --- packages/website/ts/pages/jobs/join_0x.tsx | 64 --- packages/website/ts/pages/jobs/mission.tsx | 47 -- packages/website/ts/pages/jobs/open_positions.tsx | 179 ------ packages/website/ts/pages/jobs/photo_rail.tsx | 22 - packages/website/ts/pages/landing/landing.tsx | 620 --------------------- .../website/ts/pages/launch_kit/launch_kit.tsx | 335 ----------- 13 files changed, 2151 deletions(-) delete mode 100644 packages/website/ts/pages/about/about.tsx delete mode 100644 packages/website/ts/pages/about/profile.tsx delete mode 100644 packages/website/ts/pages/instant/introducing_0x_instant.tsx delete mode 100644 packages/website/ts/pages/instant/need_more.tsx delete mode 100644 packages/website/ts/pages/instant/screenshots.tsx delete mode 100644 packages/website/ts/pages/jobs/benefits.tsx delete mode 100644 packages/website/ts/pages/jobs/jobs.tsx delete mode 100644 packages/website/ts/pages/jobs/join_0x.tsx delete mode 100644 packages/website/ts/pages/jobs/mission.tsx delete mode 100644 packages/website/ts/pages/jobs/open_positions.tsx delete mode 100644 packages/website/ts/pages/jobs/photo_rail.tsx delete mode 100644 packages/website/ts/pages/landing/landing.tsx delete mode 100644 packages/website/ts/pages/launch_kit/launch_kit.tsx (limited to 'packages/website/ts/pages') diff --git a/packages/website/ts/pages/about/about.tsx b/packages/website/ts/pages/about/about.tsx deleted file mode 100644 index 39bbc584f..000000000 --- a/packages/website/ts/pages/about/about.tsx +++ /dev/null @@ -1,421 +0,0 @@ -import { colors, Link, Styles } from '@0x/react-shared'; -import * as _ from 'lodash'; -import * as React from 'react'; -import * as DocumentTitle from 'react-document-title'; -import { Footer } from 'ts/components/old_footer'; -import { TopBar } from 'ts/components/top_bar/top_bar'; -import { Profile } from 'ts/pages/about/profile'; -import { Dispatcher } from 'ts/redux/dispatcher'; -import { ProfileInfo, WebsitePaths } from 'ts/types'; -import { Translate } from 'ts/utils/translate'; -import { utils } from 'ts/utils/utils'; - -const teamRow1: ProfileInfo[] = [ - { - name: 'Will Warren', - title: 'Co-founder & CEO', - description: `Smart contract R&D. Previously applied physics at Los Alamos \ - Nat Lab. Mechanical engineering at UC San Diego. PhD dropout.`, - image: '/images/team/will.jpg', - linkedIn: 'https://www.linkedin.com/in/will-warren-92aab62b/', - github: 'https://github.com/willwarren89', - medium: 'https://medium.com/@willwarren89', - }, - { - name: 'Amir Bandeali', - title: 'Co-founder & CTO', - description: `Smart contract R&D. Previously fixed income trader at DRW. \ - Finance at University of Illinois, Urbana-Champaign.`, - image: '/images/team/amir.png', - linkedIn: 'https://www.linkedin.com/in/abandeali1/', - github: 'https://github.com/abandeali1', - medium: 'https://medium.com/@abandeali1', - }, - { - name: 'Fabio Berger', - title: 'Senior Engineer', - description: `Full-stack blockchain engineer. Previously software engineer \ - at Airtable and founder of WealthLift. Computer Science at Duke.`, - image: '/images/team/fabio.jpg', - linkedIn: 'https://www.linkedin.com/in/fabio-berger-03ab261a/', - github: 'https://github.com/fabioberger', - medium: 'https://medium.com/@fabioberger', - }, -]; - -const teamRow2: ProfileInfo[] = [ - { - name: 'Alex Xu', - title: 'Director of Operations', - description: `Strategy and operations. Previously digital marketing at Google \ - and vendor management at Amazon. Economics at UC San Diego.`, - image: '/images/team/alex.jpg', - linkedIn: 'https://www.linkedin.com/in/alex-xu/', - github: '', - medium: 'https://medium.com/@aqxu', - }, - { - name: 'Leonid Logvinov', - title: 'Engineer', - description: `Full-stack blockchain engineer. Previously blockchain engineer \ - at Neufund. Computer Science at University of Warsaw.`, - image: '/images/team/leonid.png', - linkedIn: 'https://www.linkedin.com/in/leonidlogvinov/', - github: 'https://github.com/LogvinovLeon', - medium: 'https://medium.com/@Logvinov', - }, - { - name: 'Ben Burns', - title: 'Designer', - description: `Product, motion, and graphic designer. Previously designer \ - at Airtable and Apple. Digital Design at University of Cincinnati.`, - image: '/images/team/ben.jpg', - linkedIn: 'https://www.linkedin.com/in/ben-burns-30170478/', - github: '', - medium: '', - }, -]; - -const teamRow3: ProfileInfo[] = [ - { - name: 'Brandon Millman', - title: 'Senior Engineer', - description: `Full-stack engineer. Previously senior software engineer at \ - Twitter. Computer Science and Electrical Engineering at Duke.`, - image: '/images/team/brandon.png', - linkedIn: 'https://www.linkedin.com/in/brandon-millman-b093a022/', - github: 'https://github.com/BMillman19', - medium: 'https://medium.com/@bchillman', - }, - { - name: 'Tom Schmidt', - title: 'Product Manager', - description: `Previously engineering at Apple, product management at Facebook and Instagram. Computer Science at Stanford.`, - image: '/images/team/tom.jpg', - linkedIn: 'https://www.linkedin.com/in/tomhschmidt/', - github: 'https://github.com/tomhschmidt', - medium: '', - }, - { - name: 'Jacob Evans', - title: 'Ecosystem Engineer', - description: `Previously software engineer at Qantas and RSA Security.`, - image: '/images/team/jacob.jpg', - linkedIn: 'https://www.linkedin.com/in/dekzter/', - github: 'https://github.com/dekz', - medium: '', - }, -]; - -const teamRow4: ProfileInfo[] = [ - { - name: 'Blake Henderson', - title: 'Operations Associate', - description: `Operations and Analytics. Previously analytics at LinkedIn. Economics at UC San Diego.`, - image: '/images/team/blake.jpg', - linkedIn: 'https://www.linkedin.com/in/blakerhenderson/', - github: '', - medium: '', - }, - { - name: 'Zack Skelly', - title: 'Lead Recruiter', - description: `Talent. Previously first recruiter at Heap, recruiting at Dropbox and Google. English Rhetoric and Composition at Pepperdine.`, - image: '/images/team/zach.png', - linkedIn: 'https://www.linkedin.com/in/zackaryskelly/', - github: '', - medium: '', - }, - { - name: 'Greg Hysen', - title: 'Blockchain Engineer', - description: `Smart contract R&D. Previously lead distributed systems engineer at Hivemapper. Computer Science at University of Waterloo.`, - image: '/images/team/greg.jpeg', - linkedIn: 'https://www.linkedin.com/in/gregory-hysen-71741463/', - github: 'https://github.com/hysz', - medium: '', - }, -]; - -const teamRow5: ProfileInfo[] = [ - { - name: 'Remco Bloemen', - title: 'Technical Fellow', - description: `Previously cofounder at Neufund and Coblue. Part III at Cambridge. PhD dropout at Twente Business School.`, - image: '/images/team/remco.jpeg', - linkedIn: 'https://www.linkedin.com/in/remcobloemen/', - github: 'http://github.com/recmo', - medium: '', - }, - { - name: 'Francesco Agosti', - title: 'Engineer', - description: `Full-stack engineer. Previously senior software engineer at Yelp. Computer Science at Duke.`, - image: 'images/team/fragosti.png', - linkedIn: 'https://www.linkedin.com/in/fragosti/', - github: 'http://github.com/fragosti', - }, - { - name: 'Mel Oberto', - title: 'Office Ops / Executive Assistant', - description: `Daily Operations. Previously People Operations Associate at Heap. Marketing and MBA at Sacred Heart University.`, - image: 'images/team/mel.png', - linkedIn: 'https://www.linkedin.com/in/melanieoberto', - }, -]; - -const teamRow6: ProfileInfo[] = [ - { - name: 'Alex Browne', - title: 'Engineer in Residence', - description: `Full-stack blockchain engineer. Previously at Plaid. Open source guru and footgun dismantler. Computer Science and Electrical Engineering at Duke.`, - image: 'images/team/alexbrowne.png', - linkedIn: 'https://www.linkedin.com/in/stephenalexbrowne/', - github: 'http://github.com/albrow', - }, - { - name: 'Peter Zeitz', - title: 'Research Fellow', - description: `Researching decentralized governance. Previously Assistant Professor of Economics at National University of Singapore Business School. PhD in Economics at UCLA.`, - image: 'images/team/peter.jpg', - linkedIn: 'https://www.linkedin.com/in/peter-z-7b9595163/', - }, - { - name: 'Chris Kalani', - title: 'Director of Design', - description: `Previously founded Wake (acquired by InVision). Early Facebook product designer.`, - image: 'images/team/chris.png', - linkedIn: 'https://www.linkedin.com/in/chriskalani/', - github: 'https://github.com/chriskalani', - }, -]; - -const teamRow7: ProfileInfo[] = [ - { - name: 'Clay Robbins', - title: 'Ecosystem Development Lead', - description: `Growth & Business Development. Previously product and partnerships at Square. Economics at Dartmouth College.`, - image: 'images/team/clay.png', - linkedIn: 'https://www.linkedin.com/in/robbinsclay/', - }, - { - name: 'Matt Taylor', - title: 'Marketing Lead', - description: `Growth & Marketing. Previously marketing at Abra and Square. Economics and Philosophy at Claremont McKenna College.`, - image: 'images/team/matt.jpg', - linkedIn: 'https://www.linkedin.com/in/mattytay/', - }, - { - name: 'Eugene Aumson', - title: 'Engineer', - description: `Developer Experience. Previously senior software engineer in foreign exchange applications at Bloomberg LP.`, - image: 'images/team/gene.jpg', - linkedIn: 'https://www.linkedin.com/in/aumson/', - github: 'https://github.com/feuGeneA', - }, -]; - -const teamRow8: ProfileInfo[] = [ - { - name: 'Weijie Wu', - title: 'Research Fellow', - description: `Researching decentralized governance. Previously Researcher at Huawei and Assistant Professor at Shanghai Jiao Tong University. PhD in Computer Science at The Chinese University of Hong Kong.`, - image: 'images/team/weijie.png', - linkedIn: 'https://www.linkedin.com/in/weijiewu/', - }, - { - name: 'Rahul Singireddy', - title: 'Relayer Success Manager', - description: `Previously community at Zeppelin, growth at Dharma, and cryptocurrency contributor at Forbes. Symbolic Systems at Stanford.`, - image: 'images/team/rahul.png', - linkedIn: 'https://www.linkedin.com/in/rahul-singireddy-3037908a/', - }, - { - name: 'Jason Somensatto', - title: 'Strategic Legal Counsel', - description: `Legal. Previously head of blockchain and crypto practice at Orrick. JD from George Washington University and undergrad at UVA.`, - image: 'images/team/jason.png', - linkedIn: 'https://www.linkedin.com/in/jasonsomensatto/', - }, -]; - -const teamRow9: ProfileInfo[] = [ - { - name: 'Steve Klebanoff', - title: 'Senior Engineer', - description: ` Full-stack engineer. Previously Staff Software Engineer at AppFolio. Computer Science & Cognitive Psychology at Northeastern University.`, - image: 'images/team/steve.png', - linkedIn: 'https://www.linkedin.com/in/steveklebanoff/', - github: 'https://github.com/steveklebanoff', - }, - { - name: 'Xianny Ng', - title: 'Engineer', - description: `Developer Experience. Previously telemetry at Mapbox and platform engineering at Bench Accounting.`, - image: 'images/team/xianny.png', - linkedIn: 'https://www.linkedin.com/in/xianny/', - github: 'https://github.com/xianny', - }, -]; - -const advisors1: ProfileInfo[] = [ - { - name: 'Fred Ehrsam', - description: 'Co-founder of Coinbase. Previously FX trader at Goldman Sachs.', - image: '/images/advisors/fred.jpg', - linkedIn: 'https://www.linkedin.com/in/fredehrsam/', - medium: 'https://medium.com/@FEhrsam', - twitter: 'https://twitter.com/FEhrsam', - }, - { - name: 'Olaf Carlson-Wee', - image: '/images/advisors/olaf.png', - description: 'Founder of Polychain Capital. First hire at Coinbase. Angel investor.', - linkedIn: 'https://www.linkedin.com/in/olafcw/', - angellist: 'https://angel.co/olafcw', - }, - { - name: 'Joey Krug', - description: `Co-CIO at Pantera Capital. Founder of Augur. Thiel 20 Under 20 Fellow.`, - image: '/images/advisors/joey.jpg', - linkedIn: 'https://www.linkedin.com/in/joeykrug/', - github: 'https://github.com/joeykrug', - angellist: 'https://angel.co/joeykrug', - }, -]; - -const advisors2: ProfileInfo[] = [ - { - name: 'Linda Xie', - description: 'Co-founder of Scalar Capital. Previously PM at Coinbase.', - image: '/images/advisors/linda.jpg', - linkedIn: 'https://www.linkedin.com/in/lindaxie/', - medium: 'https://medium.com/@linda.xie', - twitter: 'https://twitter.com/ljxie', - }, - { - name: 'David Sacks', - description: 'General Partner at Craft Ventures. Original COO of PayPal. Founder of Yammer.', - image: '/images/advisors/david.png', - linkedIn: 'https://www.linkedin.com/in/davidoliversacks/', - medium: 'https://medium.com/@davidsacks', - twitter: 'https://twitter.com/DavidSacks', - }, -]; - -export interface AboutProps { - source: string; - location: Location; - translate: Translate; - dispatcher: Dispatcher; -} - -interface AboutState {} - -const styles: Styles = { - header: { - fontFamily: 'Roboto Mono', - fontSize: 36, - color: 'black', - paddingTop: 110, - }, - weAreHiring: { - fontSize: 30, - color: colors.darkestGrey, - fontFamily: 'Roboto Mono', - letterSpacing: 7.5, - }, -}; - -export class About extends React.Component { - public componentDidMount(): void { - window.scrollTo(0, 0); - } - public render(): React.ReactNode { - return ( -
    - - -
    -
    -
    About us:
    -
    - Our team is a globally distributed group with backgrounds in engineering, research, business - and design. We are passionate about decentralized technology and its potential to act as an - equalizing force in the world. -
    -
    -
    -
    {this._renderProfiles(teamRow1)}
    -
    {this._renderProfiles(teamRow2)}
    -
    {this._renderProfiles(teamRow3)}
    -
    {this._renderProfiles(teamRow4)}
    -
    {this._renderProfiles(teamRow5)}
    -
    {this._renderProfiles(teamRow6)}
    -
    {this._renderProfiles(teamRow7)}
    -
    {this._renderProfiles(teamRow8)}
    -
    {this._renderProfiles(teamRow9)}
    -
    -
    -
    - Advisors: -
    -
    {this._renderProfiles(advisors1)}
    -
    {this._renderProfiles(advisors2)}
    -
    -
    -
    - WE'RE HIRING -
    -
    - We are seeking outstanding candidates to{' '} - - join our team - - . We value passion, diversity and unique perspectives. -
    -
    -
    -
    -
    - ); - } - private _renderProfiles(profiles: ProfileInfo[]): React.ReactNode { - const numIndiv = profiles.length; - const colSize = utils.getColSize(numIndiv); - return _.map(profiles, profile => { - return ( -
    - -
    - ); - }); - } -} diff --git a/packages/website/ts/pages/about/profile.tsx b/packages/website/ts/pages/about/profile.tsx deleted file mode 100644 index 2361c6418..000000000 --- a/packages/website/ts/pages/about/profile.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { colors, Styles } from '@0x/react-shared'; -import * as _ from 'lodash'; -import * as React from 'react'; -import { ProfileInfo } from 'ts/types'; - -const IMAGE_DIMENSION = 149; -const styles: Styles = { - subheader: { - textTransform: 'uppercase', - fontSize: 32, - margin: 0, - }, - imageContainer: { - width: IMAGE_DIMENSION, - height: IMAGE_DIMENSION, - boxShadow: 'rgba(0, 0, 0, 0.19) 2px 5px 10px', - }, -}; - -interface ProfileProps { - colSize: number; - profileInfo: ProfileInfo; -} - -export const Profile = (props: ProfileProps) => { - return ( -
    -
    -
    - -
    -
    - {props.profileInfo.name} -
    - {!_.isUndefined(props.profileInfo.title) && ( -
    - {props.profileInfo.title.toUpperCase()} -
    - )} -
    - {props.profileInfo.description} -
    -
    - {renderSocialMediaIcons(props.profileInfo)} -
    -
    -
    - ); -}; - -function renderSocialMediaIcons(profileInfo: ProfileInfo): React.ReactNode { - const icons = [ - renderSocialMediaIcon('zmdi-github-box', profileInfo.github), - renderSocialMediaIcon('zmdi-linkedin-box', profileInfo.linkedIn), - renderSocialMediaIcon('zmdi-twitter-box', profileInfo.twitter), - ]; - return icons; -} - -function renderSocialMediaIcon(iconName: string, url: string): React.ReactNode { - if (_.isEmpty(url)) { - return null; - } - - return ( -
    - - - -
    - ); -} diff --git a/packages/website/ts/pages/instant/introducing_0x_instant.tsx b/packages/website/ts/pages/instant/introducing_0x_instant.tsx deleted file mode 100644 index da3f09faa..000000000 --- a/packages/website/ts/pages/instant/introducing_0x_instant.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import * as React from 'react'; - -import { Button } from 'ts/components/ui/button'; -import { Container } from 'ts/components/ui/container'; -import { Text } from 'ts/components/ui/text'; -import { colors } from 'ts/style/colors'; -import { ScreenWidths } from 'ts/types'; - -export interface Introducing0xInstantProps { - screenWidth: ScreenWidths; - onCTAClick: () => void; -} - -export const Introducing0xInstant = (props: Introducing0xInstantProps) => { - const isSmallScreen = props.screenWidth === ScreenWidths.Sm; - const zero = ( - - 0 - - ); - const title = isSmallScreen ? ( -
    - Introducing
    - {zero}x Instant -
    - ) : ( -
    Introducing {zero}x Instant
    - ); - return ( -
    -
    - - - {title} - - - - - A free and flexible way to offer simple crypto -
    purchasing in any app or website. -
    -
    -
    - -
    -
    -
    - ); -}; diff --git a/packages/website/ts/pages/instant/need_more.tsx b/packages/website/ts/pages/instant/need_more.tsx deleted file mode 100644 index 70aea7363..000000000 --- a/packages/website/ts/pages/instant/need_more.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import * as React from 'react'; - -import { Button } from 'ts/components/ui/button'; -import { Container } from 'ts/components/ui/container'; -import { Text } from 'ts/components/ui/text'; -import { colors } from 'ts/style/colors'; -import { ScreenWidths, WebsitePaths } from 'ts/types'; -import { constants } from 'ts/utils/constants'; -import { utils } from 'ts/utils/utils'; - -export interface NeedMoreProps { - screenWidth: ScreenWidths; -} -export const NeedMore = (props: NeedMoreProps) => { - const isSmallScreen = props.screenWidth === ScreenWidths.Sm; - const backgroundColor = isSmallScreen ? colors.instantTertiaryBackground : colors.instantSecondaryBackground; - const className = isSmallScreen ? 'flex flex-column items-center' : 'flex'; - const marginRight = isSmallScreen ? undefined : '200px'; - return ( - - - - - Need more flexibility? - - - View our full documentation or reach out if you have any questions. - - - - - - - - - - - ); -}; - -const onGetInTouchClick = () => { - utils.openUrl(constants.URL_ZEROEX_CHAT); -}; -const onDocsClick = () => { - utils.openUrl(`${WebsitePaths.Wiki}#Get-Started-With-Instant`); -}; diff --git a/packages/website/ts/pages/instant/screenshots.tsx b/packages/website/ts/pages/instant/screenshots.tsx deleted file mode 100644 index 7dcf17fd1..000000000 --- a/packages/website/ts/pages/instant/screenshots.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import * as _ from 'lodash'; -import * as React from 'react'; - -import { Container } from 'ts/components/ui/container'; -import { colors } from 'ts/style/colors'; -import { ScreenWidths } from 'ts/types'; - -export interface ScreenshotsProps { - screenWidth: ScreenWidths; -} - -export const Screenshots = (props: ScreenshotsProps) => { - const isSmallScreen = props.screenWidth === ScreenWidths.Sm; - const images = isSmallScreen - ? [ - 'images/instant/rep_screenshot.png', - 'images/instant/dai_screenshot.png', - 'images/instant/gods_screenshot.png', - ] - : [ - 'images/instant/nmr_screenshot.png', - 'images/instant/kitty_screenshot.png', - 'images/instant/rep_screenshot.png', - 'images/instant/dai_screenshot.png', - 'images/instant/gods_screenshot.png', - 'images/instant/gnt_screenshot.png', - ]; - return ( - - {_.map(images, image => { - return ; - })} - - ); -}; diff --git a/packages/website/ts/pages/jobs/benefits.tsx b/packages/website/ts/pages/jobs/benefits.tsx deleted file mode 100644 index 563b72e63..000000000 --- a/packages/website/ts/pages/jobs/benefits.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import * as _ from 'lodash'; -import * as React from 'react'; - -import { Circle } from 'ts/components/ui/circle'; -import { Container } from 'ts/components/ui/container'; -import { Image } from 'ts/components/ui/image'; -import { Text } from 'ts/components/ui/text'; -import { colors } from 'ts/style/colors'; -import { styled } from 'ts/style/theme'; -import { ScreenWidths } from 'ts/types'; -import { constants } from 'ts/utils/constants'; - -const BENEFITS = [ - 'Comprehensive insurance (medical, dental, and vision)', - 'Unlimited vacation (three weeks per year minimum)', - 'Meals and snacks provided in-office daily', - 'Flexible hours and liberal work-from-home-policy', - 'Supportive remote working environment', - 'Transportation, phone, and wellness expense', - 'Relocation assistance', - 'Optional team excursions (fully paid, often international)', - 'Competitive salary and cryptocurrency-based compensation', -]; - -interface Value { - iconSrc: string; - text: string; -} -const VALUES: Value[] = [ - { - iconSrc: 'images/jobs/heart-icon.svg', - text: 'Do the right thing', - }, - { - iconSrc: 'images/jobs/ship-icon.svg', - text: 'Consistently ship', - }, - { - iconSrc: 'images/jobs/calendar-icon.svg', - text: 'Focus on long term impact', - }, -]; - -export interface BenefitsProps { - screenWidth: ScreenWidths; -} - -export const Benefits = (props: BenefitsProps) => { - const isSmallScreen = props.screenWidth === ScreenWidths.Sm; - return ( - - {!isSmallScreen ? ( - - - - - - - ) : ( - - - - - - - )} - - ); -}; - -const Header: React.StatelessComponent = ({ children }) => ( - - - {children} - - -); - -interface BenefitsListProps { - className?: string; -} -const PlainBenefitsList: React.StatelessComponent = ({ className }) => { - return ( - -
    Benefits
    - {_.map(BENEFITS, benefit => )} -
    - ); -}; -const BenefitsList = styled(PlainBenefitsList)` - transform: translateY(30px); -`; - -interface BenefitItemProps { - description: string; -} - -const BenefitItem: React.StatelessComponent = ({ description }) => ( - -
    - -
    - - {description} - -
    -
    -
    -); - -interface ValuesListProps { - className?: string; -} -const PlainValuesList: React.StatelessComponent = ({ className }) => { - return ( - -
    Our Values
    - {_.map(VALUES, value => )} - - We care deeply about our culture and values, and encourage you to{' '} - - read more on our blog - . - -
    - ); -}; - -const ValuesList = styled(PlainValuesList)` - border-color: ${colors.beigeWhite}; - border-radius: 7px; - border-width: 1px; - border-style: solid; - padding-left: 38px; - padding-right: 38px; - padding-top: 28px; - padding-bottom: 28px; -`; - -type ValueItemProps = Value; -const ValueItem: React.StatelessComponent = ({ iconSrc, text }) => { - return ( - -
    - -
    - - {text} - -
    -
    -
    - ); -}; diff --git a/packages/website/ts/pages/jobs/jobs.tsx b/packages/website/ts/pages/jobs/jobs.tsx deleted file mode 100644 index 872dc6103..000000000 --- a/packages/website/ts/pages/jobs/jobs.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { colors, utils as sharedUtils } from '@0x/react-shared'; -import * as _ from 'lodash'; -import * as React from 'react'; -import * as DocumentTitle from 'react-document-title'; - -import { MetaTags } from 'ts/components/meta_tags'; -import { Footer } from 'ts/components/old_footer'; -import { TopBar } from 'ts/components/top_bar/top_bar'; -import { Container } from 'ts/components/ui/container'; -import { Benefits } from 'ts/pages/jobs/benefits'; -import { Join0x } from 'ts/pages/jobs/join_0x'; -import { Mission } from 'ts/pages/jobs/mission'; -import { OpenPositions } from 'ts/pages/jobs/open_positions'; -import { Dispatcher } from 'ts/redux/dispatcher'; -import { ScreenWidths } from 'ts/types'; -import { Translate } from 'ts/utils/translate'; -import { utils } from 'ts/utils/utils'; - -const OPEN_POSITIONS_HASH = 'positions'; -const THROTTLE_TIMEOUT = 100; -const DOCUMENT_TITLE = 'Careers at 0x'; -const DOCUMENT_DESCRIPTION = 'Join 0x in creating a tokenized world where all value can flow freely'; - -export interface JobsProps { - location: Location; - translate: Translate; - dispatcher: Dispatcher; - screenWidth: ScreenWidths; -} - -export interface JobsState {} - -export class Jobs extends React.Component { - // TODO: consolidate this small screen scaffolding into one place (its being used in portal and docs as well) - private readonly _throttledScreenWidthUpdate: () => void; - public constructor(props: JobsProps) { - super(props); - this._throttledScreenWidthUpdate = _.throttle(this._updateScreenWidth.bind(this), THROTTLE_TIMEOUT); - } - public componentDidMount(): void { - window.addEventListener('resize', this._throttledScreenWidthUpdate); - window.scrollTo(0, 0); - } - public render(): React.ReactNode { - return ( - - - - - - - - -