diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..a43990a5 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,16 @@ +{ + "env": { + "browser": true, + "node": true, + "jest": true, + }, + "extends": "airbnb", + "rules": { + "react/jsx-filename-extension": 0, + "react/no-array-index-key": 0, + # TODO: get these rules working + "import/no-extraneous-dependencies": 0, + "import/no-unresolved": 0, + "import/extensions": 0 + } +} diff --git a/config.js b/config.js new file mode 100644 index 00000000..efd4d96c --- /dev/null +++ b/config.js @@ -0,0 +1,25 @@ +import palx from 'palx'; + +export const COLORS = palx('#4990e2'); +export const SPACE = [0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 56, 64, 72]; +export const FONT_SIZES = [11, 13, 14, 15, 17, 20, 24, 28, 36, 40]; + +export const BREAKPOINTS = { + sm: 40, + md: 52, + lg: 64, +}; + +export const FONT_FAMILIES = { + mono: '"Space Mono", monospace, sans-serif', + sans: '"Avenir Next", sans-serif', +}; + +export const BORDER_RADIUS = { + base: '4px', + pill: '1000px', +}; + +export const BOX_SHADOWS = { + base: '0 1px 2px rgba(0, 0, 0, 0.25)', +}; diff --git a/package.json b/package.json index 012e882c..ccc7fbad 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,14 @@ "private": true, "dependencies": { "flat": "^2.0.1", + "glamor": "^2.20.25", "grid-styled": "^2.0.0-4", "hidden-styled": "^1.0.0-0", + "lodash": "^4.17.4", "normalize.css": "^7.0.0", "palx": "^1.0.2", "polished": "^1.2.1", + "prop-types": "^15.5.10", "react": "^15.6.1", "react-create-component-from-tag-prop": "^1.2.1", "react-dom": "^15.6.1", @@ -16,13 +19,19 @@ "react-intl": "^2.3.0", "react-responsive": "^1.3.0", "react-router-dom": "^4.1.1", + "react-snapshot": "^1.1.0", "styled-components": "^2.1.0", "styled-system": "^1.0.0-4" }, "devDependencies": { + "eslint": "^3.19.0", + "eslint-config-airbnb": "^15.0.1", + "eslint-config-airbnb-base": "^11.2.0", + "eslint-plugin-import": "^2.2.0", + "eslint-plugin-jsx-a11y": "^5.0.1", + "eslint-plugin-react": "^7.0.1", "gh-pages": "^1.0.0", - "react-scripts": "1.0.7", - "react-snapshot": "^1.1.0" + "react-scripts": "1.0.7" }, "scripts": { "start": "react-scripts start", diff --git a/src/components/App/App.js b/src/components/App/App.js index 04cf06a9..85656c20 100644 --- a/src/components/App/App.js +++ b/src/components/App/App.js @@ -1,16 +1,13 @@ import React from 'react'; -import { Helmet } from "react-helmet"; +import PropTypes from 'prop-types'; import flatten from 'flat'; import values from 'lodash/values'; +import { Helmet } from 'react-helmet'; import { ThemeProvider } from 'styled-components'; +import { BrowserRouter as Router, Switch, Route } from 'react-router-dom'; import { IntlProvider, addLocaleData } from 'react-intl'; import zh from 'react-intl/locale-data/zh'; import ru from 'react-intl/locale-data/ru'; -import { - BrowserRouter as Router, - Switch, - Route, -} from 'react-router-dom'; import { COLORS, BREAKPOINTS, SPACE, FONT_SIZES } from 'config'; import * as locales from 'locales'; @@ -49,6 +46,10 @@ const Root = ({ locale, ...props }) => ( ); +Root.propTypes = { + locale: PropTypes.string.isRequired, +}; + export default () => ( diff --git a/src/components/Button/Button.js b/src/components/Button/Button.js index 117b77b7..240de35d 100644 --- a/src/components/Button/Button.js +++ b/src/components/Button/Button.js @@ -12,7 +12,7 @@ export default styled.a` line-height: 1; font-weight: 700; - border-radius: ${props => props.pill ? BORDER_RADIUS.pill : BORDER_RADIUS.base}; + border-radius: ${props => (props.pill ? BORDER_RADIUS.pill : BORDER_RADIUS.base)}; box-shadow: ${BOX_SHADOWS.base}; font-family: ${FONT_FAMILIES.mono}; font-size: ${rem(FONT_SIZES[3])}; diff --git a/src/components/Buy/Buy.js b/src/components/Buy/Buy.js index 5d4fae85..ba30ecf6 100644 --- a/src/components/Buy/Buy.js +++ b/src/components/Buy/Buy.js @@ -1,10 +1,16 @@ import React from 'react'; -import { FormattedMessage } from 'react-intl'; +import PropTypes from 'prop-types'; import Button from '../Button'; -export default (props) => ( +const Buy = ({ children, ...props }) => ( ); + +Buy.propTypes = { + children: PropTypes.element.isRequired, +}; + +export default Buy; diff --git a/src/components/Divider/Divider.js b/src/components/Divider/Divider.js new file mode 100644 index 00000000..3fc21a55 --- /dev/null +++ b/src/components/Divider/Divider.js @@ -0,0 +1,17 @@ +import styled from 'styled-components'; +import { rem } from 'polished'; + +import media from 'utils/media'; +import { COLORS, SPACE } from 'config'; + +export default styled.div` + width: ${rem(150)}; + height: 4px; + background-color: ${COLORS.gray[1]}; + + margin: ${rem(SPACE[5])} 0; + + ${media.md.css` + margin: ${rem(SPACE[9])} 0; + `} +`; diff --git a/src/components/Divider/index.js b/src/components/Divider/index.js new file mode 100644 index 00000000..b6de1e2b --- /dev/null +++ b/src/components/Divider/index.js @@ -0,0 +1 @@ +export { default } from './Divider'; diff --git a/src/components/Footer/Footer.js b/src/components/Footer/Footer.js index 5c866cad..cd7cbd9e 100644 --- a/src/components/Footer/Footer.js +++ b/src/components/Footer/Footer.js @@ -1,125 +1,37 @@ import React from 'react'; -import styled from 'styled-components'; import { Flex, Box } from 'grid-styled'; -import { rem } from 'polished'; -import { Link } from 'react-router-dom'; -import { SPACE } from 'config'; -import Container from '../Container'; -import Heading from '../Heading'; -import Text from '../Text'; -import Logo from '../Logo'; +import Container from 'components/Container'; +import Text from 'components/Text'; +import Logo from 'components/Logo'; -const Footer = styled.div` - -`; - -const List = styled.ul` - list-style: none; - margin: 0; -`; - -const ListItem = styled.li` - a { - color: inherit; - text-decoration: none; - - &:hover { - text-decoration: underline; - } - } -` - -const Languages = styled.div` - list-style: none; - margin: 0; - - -`; - -const Language = styled.span` - &:not(:first-of-type):before { - content: ' · ' - } - - a { - color: inherit; - text-decoration: none; - - &:hover { - text-decoration: underline; - } - } -`; - - -const Email = styled.a` - color: inherit; - text-decoration: none; - - &:hover { - text-decoration: underline; - } -`; +import Languages from './components/Languages'; +import List from './components/List'; +import Email from './components/Email'; +import content from './content'; export default () => ( -
+
- + - - contact@skycoin.net - + - - English - 中文 - Ру́сский - - - - - - Get started - - - Download wallet - Buy Skycoin - How it works - Quickstart guide - + - - Explore - - - Distribution - Whitepapers - Blockchain explorer - Roadmap - - - - - - Community - - - Blog - Github - Telegram - Slack - - - + {content.map(({ heading, links }, sectionIndex) => ( + + + + ))} -
+ ); diff --git a/src/components/Footer/components/Email/Email.js b/src/components/Footer/components/Email/Email.js new file mode 100644 index 00000000..9ae1da6e --- /dev/null +++ b/src/components/Footer/components/Email/Email.js @@ -0,0 +1,19 @@ +import React from 'react'; +import styled from 'styled-components'; + +const CONTACT_EMAIL = 'contact@skycoin.net'; + +const Email = styled.a` + color: inherit; + text-decoration: none; + + &:hover { + text-decoration: underline; + } +`; + +export default () => ( + + {CONTACT_EMAIL} + +); diff --git a/src/components/Footer/components/Email/index.js b/src/components/Footer/components/Email/index.js new file mode 100644 index 00000000..ce789223 --- /dev/null +++ b/src/components/Footer/components/Email/index.js @@ -0,0 +1 @@ +export { default } from './Email'; diff --git a/src/components/Footer/components/Languages/Languages.js b/src/components/Footer/components/Languages/Languages.js new file mode 100644 index 00000000..6453da6b --- /dev/null +++ b/src/components/Footer/components/Languages/Languages.js @@ -0,0 +1,30 @@ +import React from 'react'; +import styled from 'styled-components'; +import { Link } from 'react-router-dom'; + +const Languages = styled.div` + list-style: none; + margin: 0; +`; + +const Language = styled.span` + &:not(:first-of-type):before { + content: ' · ' + } +`; + +const StyledLink = styled(Link)` + text-decoration: none; + + &:hover { + text-decoration: underline; + } +`; + +export default () => ( + + English + 中文 + Ру́сский + +); diff --git a/src/components/Footer/components/Languages/index.js b/src/components/Footer/components/Languages/index.js new file mode 100644 index 00000000..af2dab5b --- /dev/null +++ b/src/components/Footer/components/Languages/index.js @@ -0,0 +1 @@ +export { default } from './Languages'; diff --git a/src/components/Footer/components/List/List.js b/src/components/Footer/components/List/List.js new file mode 100644 index 00000000..1762ca9e --- /dev/null +++ b/src/components/Footer/components/List/List.js @@ -0,0 +1,51 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; +import { Link } from 'react-router-dom'; +import { FormattedMessage } from 'react-intl'; + +import Heading from 'components/Heading'; +import Text from 'components/Text'; + +const LinkList = styled.ul` + list-style: none; + margin: 0; +`; + +const StyledLink = styled(Link)` + text-decoration: none; + + &:hover { + text-decoration: underline; + } +`; + +const List = ({ heading, links }) => ( +
+ + + + + + + {links.map(({ label, to }, linkIndex) => ( +
  • + + + +
  • + ))} +
    +
    +
    +); + +List.propTypes = { + heading: PropTypes.string.isRequired, + links: PropTypes.shape({ + to: PropTypes.string.isRequired, + label: PropTypes.string.isRequired, + }).isRequired, +}; + +export default List; diff --git a/src/components/Footer/components/List/index.js b/src/components/Footer/components/List/index.js new file mode 100644 index 00000000..f4550745 --- /dev/null +++ b/src/components/Footer/components/List/index.js @@ -0,0 +1 @@ +export { default } from './List'; diff --git a/src/components/Footer/content.js b/src/components/Footer/content.js new file mode 100644 index 00000000..12c81b88 --- /dev/null +++ b/src/components/Footer/content.js @@ -0,0 +1,46 @@ +export default [{ + heading: 'footer.getStarted.heading', + links: [{ + label: 'footer.getStarted.wallet', + to: '/', + }, { + label: 'footer.getStarted.buy', + to: '/', + }, { + label: 'footer.getStarted.howItWorks', + to: '/', + }, { + label: 'footer.getStarted.quickStart', + to: '/', + }], +}, { + heading: 'footer.explore.heading', + links: [{ + label: 'footer.explore.distribution', + to: '/', + }, { + label: 'footer.explore.whitepapers', + to: '/', + }, { + label: 'footer.explore.blockchain', + to: '/', + }, { + label: 'footer.explore.roadmap', + to: '/', + }], +}, { + heading: 'footer.community.heading', + links: [{ + label: 'footer.community.community', + to: '/', + }, { + label: 'footer.community.github', + to: '/', + }, { + label: 'footer.community.telegram', + to: '/', + }, { + label: 'footer.community.slack', + to: '/', + }], +}]; diff --git a/src/components/GetStarted/GetStarted.js b/src/components/GetStarted/GetStarted.js index 7936fad5..350f209a 100644 --- a/src/components/GetStarted/GetStarted.js +++ b/src/components/GetStarted/GetStarted.js @@ -1,11 +1,13 @@ import React from 'react'; import styled from 'styled-components'; +import { FormattedMessage } from 'react-intl'; import { Flex, Box } from 'grid-styled'; import { COLORS } from 'config'; -import Heading from 'components/Heading'; import Button from 'components/Button'; +import Buy from 'components/Buy'; import Container from 'components/Container'; +import Heading from 'components/Heading'; import media from 'utils/media'; const GetStarted = styled.div` @@ -27,20 +29,20 @@ export default () => ( - + - Get started with Skycoin + - + - + + + diff --git a/src/components/Header/Header.js b/src/components/Header/Header.js index ff76e2a6..16578c34 100644 --- a/src/components/Header/Header.js +++ b/src/components/Header/Header.js @@ -17,11 +17,11 @@ export default () => (
    - + - + diff --git a/src/components/Header/components/Navigation/Navigation.js b/src/components/Header/components/Navigation/Navigation.js index 2066b5a5..c4ca8537 100644 --- a/src/components/Header/components/Navigation/Navigation.js +++ b/src/components/Header/components/Navigation/Navigation.js @@ -3,11 +3,11 @@ import styled from 'styled-components'; import { Link } from 'react-router-dom'; import { FormattedMessage } from 'react-intl'; import { rem } from 'polished'; -import Hide from 'hidden-styled' +import Hide from 'hidden-styled'; -import media from 'utils/media'; import { SPACE, FONT_SIZES, FONT_FAMILIES } from 'config'; import Buy from 'components/Buy'; +import media from 'utils/media'; const Navigation = styled.div` font-size: ${rem(FONT_SIZES[1])}; @@ -41,12 +41,11 @@ const StyledLink = styled(Link)` const InlineHide = Hide.extend` display: inline; - color: red; `; export default () => ( - + @@ -59,7 +58,9 @@ export default () => ( - + + + ); diff --git a/src/components/Heading/Heading.js b/src/components/Heading/Heading.js index 86d92da9..2769f5e7 100644 --- a/src/components/Heading/Heading.js +++ b/src/components/Heading/Heading.js @@ -1,4 +1,4 @@ -import styled, { css } from 'styled-components'; +import styled from 'styled-components'; import { space, width, fontSize, color } from 'styled-system'; import createComponentFromTagProp from 'react-create-component-from-tag-prop'; @@ -16,6 +16,6 @@ export default styled(Heading)` ${width} font-family: ${FONT_FAMILIES.mono}; - font-weight: ${props => props.heavy ? 'bold' : 'normal'}; + font-weight: ${props => (props.heavy ? 'bold' : 'normal')}; line-height: 1.5; `; diff --git a/src/components/Home/Home.js b/src/components/Home/Home.js index 172174fa..2ff7f4a3 100644 --- a/src/components/Home/Home.js +++ b/src/components/Home/Home.js @@ -1,14 +1,15 @@ import React from 'react'; +import PropTypes from 'prop-types'; import { Helmet } from 'react-helmet'; import { injectIntl } from 'react-intl'; +import GetStarted from 'components/GetStarted'; +import Footer from 'components/Footer'; import Hero from './components/Hero'; import About from './components/About'; import Network from './components/Network'; import Distribution from './components/Distribution'; import Roadmap from './components/Roadmap'; -import GetStarted from 'components/GetStarted'; -import Footer from 'components/Footer'; const Home = ({ intl }) => (
    @@ -30,4 +31,10 @@ const Home = ({ intl }) => (
    ); +Home.propTypes = { + intl: PropTypes.shape({ + formatMessage: PropTypes.func.isRequired, + }).isRequired, +}; + export default injectIntl(Home); diff --git a/src/components/Home/components/About/About.js b/src/components/Home/components/About/About.js index bfd50071..215a06a2 100644 --- a/src/components/Home/components/About/About.js +++ b/src/components/Home/components/About/About.js @@ -2,48 +2,28 @@ import React from 'react'; import styled from 'styled-components'; import { Flex, Box } from 'grid-styled'; import { FormattedMessage } from 'react-intl'; +import { rem } from 'polished'; import { COLORS } from 'config'; -import Heading from 'components/Heading'; -import Text from 'components/Text'; import Button from 'components/Button'; import Container from 'components/Container'; -import * as icons from './icons'; +import Heading from 'components/Heading'; +import Text from 'components/Text'; + +import Feature from './components/Feature'; +import features from './content'; import background from './background.png'; +// TODO: update background image to use global colors const About = styled.div` - background: url(${background}) repeat-x top center / 48px #f7f7f7; + background: url(${background}) repeat-x top center / ${rem(48)} #f7f7f7; border-bottom: 2px solid ${COLORS.gray[2]}; `; -const FEATURES = [{ - heading: 'Speed', - body: 'We built Skycoin to compete with credit cards and services like AliPay/Apple Pay. Transactions happen in seconds, not minutes.', - icon: 'rabbit', -}, { - heading: 'Privacy', - body: 'Skycoin makes it impossible to trace transactions by mixing transactions from multiple wallets to increase privacy using the CoinJoin protocol.', - icon: 'fingerprint', -}, { - heading: 'Security', - body: 'Skycoin is more secure because it does not rely upon the good will of miners, it cannot be 51% attacked.', - icon: 'lock', -}, { - heading: 'Ecosystem', - body: 'We’re building a rich ecosystem of real world applications on top of Skycoin starting with messaging, social media, and VPN.', - icon: 'list', -}]; - -const Icon = styled.img` - height: 60px; - width: 100%; - object-fit: contain; -`; - export default () => ( - + @@ -53,28 +33,14 @@ export default () => ( - {FEATURES.map(({ heading, body, icon }) => ( - - - - - - - - - {heading} - - - - {body} - - - + {features.map(({ heading, body, icon }) => ( + + ))} diff --git a/src/components/Home/components/About/components/Feature/Feature.js b/src/components/Home/components/About/components/Feature/Feature.js new file mode 100644 index 00000000..cf327a57 --- /dev/null +++ b/src/components/Home/components/About/components/Feature/Feature.js @@ -0,0 +1,43 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; +import { Flex, Box } from 'grid-styled'; +import { FormattedMessage } from 'react-intl'; +import { rem } from 'polished'; + +import Heading from 'components/Heading'; +import Text from 'components/Text'; + +import * as icons from './icons'; + +const Icon = styled.img` + height: ${rem(60)}; + width: 100%; + object-fit: contain; +`; + +const Feature = ({ heading, icon, body }) => ( + + + + + + + + + + + + + + + +); + +Feature.propTypes = { + heading: PropTypes.string.isRequired, + icon: PropTypes.string.isRequired, + body: PropTypes.string.isRequired, +}; + +export default Feature; diff --git a/src/components/Home/components/About/icons/fingerprint.png b/src/components/Home/components/About/components/Feature/icons/fingerprint.png similarity index 100% rename from src/components/Home/components/About/icons/fingerprint.png rename to src/components/Home/components/About/components/Feature/icons/fingerprint.png diff --git a/src/components/Home/components/About/icons/index.js b/src/components/Home/components/About/components/Feature/icons/index.js similarity index 100% rename from src/components/Home/components/About/icons/index.js rename to src/components/Home/components/About/components/Feature/icons/index.js diff --git a/src/components/Home/components/About/icons/list.png b/src/components/Home/components/About/components/Feature/icons/list.png similarity index 100% rename from src/components/Home/components/About/icons/list.png rename to src/components/Home/components/About/components/Feature/icons/list.png diff --git a/src/components/Home/components/About/icons/lock.png b/src/components/Home/components/About/components/Feature/icons/lock.png similarity index 100% rename from src/components/Home/components/About/icons/lock.png rename to src/components/Home/components/About/components/Feature/icons/lock.png diff --git a/src/components/Home/components/About/icons/rabbit.png b/src/components/Home/components/About/components/Feature/icons/rabbit.png similarity index 100% rename from src/components/Home/components/About/icons/rabbit.png rename to src/components/Home/components/About/components/Feature/icons/rabbit.png diff --git a/src/components/Home/components/About/components/Feature/index.js b/src/components/Home/components/About/components/Feature/index.js new file mode 100644 index 00000000..54f62d09 --- /dev/null +++ b/src/components/Home/components/About/components/Feature/index.js @@ -0,0 +1 @@ +export { default } from './Feature'; diff --git a/src/components/Home/components/About/content.js b/src/components/Home/components/About/content.js new file mode 100644 index 00000000..6bb56967 --- /dev/null +++ b/src/components/Home/components/About/content.js @@ -0,0 +1,17 @@ +export default [{ + heading: 'home.about.speed.heading', + body: 'home.about.speed.body', + icon: 'rabbit', +}, { + heading: 'home.about.privacy.heading', + body: 'home.about.privacy.body', + icon: 'fingerprint', +}, { + heading: 'home.about.security.heading', + body: 'home.about.security.body', + icon: 'lock', +}, { + heading: 'home.about.ecosystem.heading', + body: 'home.about.ecosystem.body', + icon: 'list', +}]; diff --git a/src/components/Home/components/Distribution/Distribution.js b/src/components/Home/components/Distribution/Distribution.js index 40876a20..25b0dd19 100644 --- a/src/components/Home/components/Distribution/Distribution.js +++ b/src/components/Home/components/Distribution/Distribution.js @@ -2,16 +2,16 @@ import React from 'react'; import styled from 'styled-components'; import { Flex, Box } from 'grid-styled'; import { Link } from 'react-router-dom'; -import Hide from 'hidden-styled' +import { FormattedMessage } from 'react-intl'; -import { COLORS } from 'config'; -import Heading from 'components/Heading'; -import Text from 'components/Text'; -import Button from 'components/Button'; import Container from 'components/Container'; +import Heading from 'components/Heading'; import Label from 'components/Label'; +import Text from 'components/Text'; + import distribution from './distribution.png'; +// TODO: update gradient to use global colors const Distribution = styled.div` background-image: linear-gradient(-155deg, #686e96 0%, #373b5c 100%); `; @@ -27,24 +27,26 @@ export default () => ( - + - - + + - Distribution + - As coins aren’t mined, Skycoin distribution is unlike that of a standard token or asset. To ensure continued development, coins are awarded and distributed to contributors, developers and investors and sold on exchanges like C2CX and Cryptopia. In the coming months, 20% of coins will be auctioned/ICO’ed. + - Learn about distribution + diff --git a/src/components/Home/components/Hero/Hero.js b/src/components/Home/components/Hero/Hero.js index 7e6cd733..d2bcaa7e 100644 --- a/src/components/Home/components/Hero/Hero.js +++ b/src/components/Home/components/Hero/Hero.js @@ -13,7 +13,6 @@ const Hero = styled.div` background-image: linear-gradient(-110deg, ${COLORS.base}, ${COLORS.violet[4]}); position: relative; height: 33rem; - z-index: -1; ${media.sm.css` height: 40rem; @@ -26,6 +25,7 @@ const Hero = styled.div` const StyledFlex = styled(Flex)` height: 100%; + z-index: 1; `; export default () => ( diff --git a/src/components/Home/components/Hero/components/Announcement/Announcement.js b/src/components/Home/components/Hero/components/Announcement/Announcement.js index cb0b4f39..6a062b4b 100644 --- a/src/components/Home/components/Hero/components/Announcement/Announcement.js +++ b/src/components/Home/components/Hero/components/Announcement/Announcement.js @@ -1,6 +1,5 @@ import React from 'react'; import styled from 'styled-components'; -import { Link } from 'react-router-dom'; import { Flex, Box } from 'grid-styled'; import { rem } from 'polished'; import { FormattedMessage } from 'react-intl'; @@ -14,10 +13,6 @@ const Announcement = styled.div` width: 100%; `; -const StyledLink = styled(Link)` - color: white; -`; - const Icon = styled.img.attrs({ src: megaphone, })` @@ -40,4 +35,4 @@ export default () => ( -) +); diff --git a/src/components/Home/components/Hero/components/Introduction/Introduction.js b/src/components/Home/components/Hero/components/Introduction/Introduction.js index f988ad14..4c9323cb 100644 --- a/src/components/Home/components/Hero/components/Introduction/Introduction.js +++ b/src/components/Home/components/Hero/components/Introduction/Introduction.js @@ -9,7 +9,7 @@ import Text from 'components/Text'; export default () => ( - }} /> + }} /> - }} /> + }} /> ); diff --git a/src/components/Home/components/Hero/components/Map/Map.js b/src/components/Home/components/Hero/components/Map/Map.js index e2144c4c..647d1069 100644 --- a/src/components/Home/components/Hero/components/Map/Map.js +++ b/src/components/Home/components/Hero/components/Map/Map.js @@ -13,7 +13,6 @@ export default styled.div` width: 100%; top: 12.5%; pointer-events: none; - z-index: -1; ${media.md.css` background-size: contain; diff --git a/src/components/Home/components/Network/Network.js b/src/components/Home/components/Network/Network.js index ed686cd5..39f9851d 100644 --- a/src/components/Home/components/Network/Network.js +++ b/src/components/Home/components/Network/Network.js @@ -2,52 +2,49 @@ import React from 'react'; import styled from 'styled-components'; import { Flex, Box } from 'grid-styled'; import { Link } from 'react-router-dom'; -import Hide from 'hidden-styled' -import { rem } from 'polished'; +import { FormattedMessage } from 'react-intl'; -import { COLORS } from 'config'; -import Heading from 'components/Heading'; -import Text from 'components/Text'; -import Button from 'components/Button'; import Container from 'components/Container'; +import Heading from 'components/Heading'; import Label from 'components/Label'; -import network from './network.png'; +import Text from 'components/Text'; -const Network = styled.div` -`; +import network from './network.png'; const Graphic = styled.img.attrs({ - src: network + src: network, })` max-width: 100%; `; export default () => ( - +
    - - + + - Network concensus + - Mining represents one of the biggest flaws to crypto assets by centralising large amounts of power into a handful of mining pools. Mining costs cryptocurrency networks tens of millions of dollars every month in electricity costs, processing just seven transactions a second. Skycoin uses a new consensus algorithm, Network Consensus, which requires no mining. + - Learn about distribution + - + - +
    ); diff --git a/src/components/Home/components/Roadmap/Roadmap.js b/src/components/Home/components/Roadmap/Roadmap.js index ce43d9aa..80da256b 100644 --- a/src/components/Home/components/Roadmap/Roadmap.js +++ b/src/components/Home/components/Roadmap/Roadmap.js @@ -3,178 +3,57 @@ import styled from 'styled-components'; import { Flex, Box } from 'grid-styled'; import { Link } from 'react-router-dom'; import { rem } from 'polished'; +import { FormattedMessage } from 'react-intl'; -import { SPACE } from 'config'; -import media from 'utils/media'; import Text from 'components/Text'; import Heading from 'components/Heading'; import Button from 'components/Button'; import Container from 'components/Container'; -import community from './community.png'; - -const Timeline = styled.div` - overflow: hidden; - border-left: 2px solid #E6E6E6; - height: 100%; - - &:before { - content: ''; - display: block; - height: 2px; - width: 100%; - background-color: #E6E6E6; - position: absolute; - left: 0; - - ${media.sm.css` - display: none; - `} - } -`; - -const TimelineItem = styled.div` - overflow: hidden; - - margin: ${rem(SPACE[5])} 0; - - ${media.md.css` - margin: ${rem(SPACE[7])} 0; - `} -`; - -const Divider = styled.div` - width: 150px; - height: 4px; - background-color: #E6E6E6; +import Divider from 'components/Divider'; - margin: ${rem(SPACE[5])} 0; - - ${media.md.css` - margin: ${rem(SPACE[9])} 0; - `} -`; +import Timeline from './components/Timeline'; +import community from './community.png'; const Icon = styled.img.attrs({ src: community, })` - width: 60px; -`; - -const Marker = styled.span` - display: inline-block; - margin-right: 10px; - height: 40px; - width: 40px; - line-height: 40px; - text-align: center; - border-radius: 1000px; - border: 2px solid #E6E6E6; - background-color: white; - - ${media.md.css` - height: 50px; - width: 50px; - line-height: 50px; - `} + width: ${rem(60)}; `; -const Line = styled.div` - width: 100%; - height: 2px; - background-color: #E6E6E6; - margin-top: 25px; -` - export default () => ( - - + + - Roadmap + + - Development can be followed and contributed to on GitHub. We will be opening bounties for bug fixes, design and development in the coming months. + - See the full roadmap - + + + + + + + - Join Skycoin on Telegram to start contributing, and keep up-to-date with the latest developments. + + - - - - - - - - - - Q3 - - - - FY17 - - - - Coin distribution sale: 20% of coins to be distributed by auction and ICO. - - - - - - - - - - - - - Q4 - - - - FY17 - - - - Launch of the first downloadable network node, users will be able to earn coins for powering the network. - - - - - - - - - - - - - Q1 - - - - FY18 - - - - The launch of our first applications on the Skywire Network: a decentralised, Redditesque, social media platform and VPN service. - - - - - + + diff --git a/src/components/Home/components/Roadmap/components/Timeline/Timeline.js b/src/components/Home/components/Roadmap/components/Timeline/Timeline.js new file mode 100644 index 00000000..cc1d5ef1 --- /dev/null +++ b/src/components/Home/components/Roadmap/components/Timeline/Timeline.js @@ -0,0 +1,34 @@ +import React from 'react'; +import styled from 'styled-components'; + +import media from 'utils/media'; +import { COLORS } from 'config'; + +import TimelineItem from '../TimelineItem'; +import content from './content'; + +const Timeline = styled.div` + overflow: hidden; + border-left: 2px solid ${COLORS.gray[1]}; + height: 100%; + + &:before { + content: ''; + display: block; + height: 2px; + width: 100%; + background-color: ${COLORS.gray[1]}; + position: absolute; + left: 0; + + ${media.sm.css` + display: none; + `} + } +`; + +export default () => ( + + {content.map(props => )} + +); diff --git a/src/components/Home/components/Roadmap/components/Timeline/content.js b/src/components/Home/components/Roadmap/components/Timeline/content.js new file mode 100644 index 00000000..552e87f1 --- /dev/null +++ b/src/components/Home/components/Roadmap/components/Timeline/content.js @@ -0,0 +1,13 @@ +export default [{ + quarter: 'home.roadmap.timeline.distribution.quarter', + year: 'home.roadmap.timeline.distribution.year', + content: 'home.roadmap.timeline.distribution.content', +}, { + quarter: 'home.roadmap.timeline.network.quarter', + year: 'home.roadmap.timeline.network.year', + content: 'home.roadmap.timeline.network.content', +}, { + quarter: 'home.roadmap.timeline.applications.quarter', + year: 'home.roadmap.timeline.applications.year', + content: 'home.roadmap.timeline.applications.content', +}]; diff --git a/src/components/Home/components/Roadmap/components/Timeline/index.js b/src/components/Home/components/Roadmap/components/Timeline/index.js new file mode 100644 index 00000000..1f0b63e0 --- /dev/null +++ b/src/components/Home/components/Roadmap/components/Timeline/index.js @@ -0,0 +1 @@ +export { default } from './Timeline'; diff --git a/src/components/Home/components/Roadmap/components/TimelineItem/TimelineItem.js b/src/components/Home/components/Roadmap/components/TimelineItem/TimelineItem.js new file mode 100644 index 00000000..22d2729f --- /dev/null +++ b/src/components/Home/components/Roadmap/components/TimelineItem/TimelineItem.js @@ -0,0 +1,81 @@ +import React from 'react'; +import styled from 'styled-components'; +import PropTypes from 'prop-types'; +import { Flex, Box } from 'grid-styled'; +import { rem } from 'polished'; +import { FormattedMessage } from 'react-intl'; + +import Text from 'components/Text'; +import Heading from 'components/Heading'; +import media from 'utils/media'; +import { SPACE, COLORS, BORDER_RADIUS } from 'config'; + +const Wrapper = styled.div` + overflow: hidden; + margin: ${rem(SPACE[5])} 0; + + ${media.md.css` + margin: ${rem(SPACE[7])} 0; + `} +`; + +const Marker = styled.span` + display: inline-block; + margin-right: ${rem(SPACE[3])}; + height: ${rem(40)}; + width: ${rem(40)}; + line-height: ${rem(40)}; + text-align: center; + border-radius: ${BORDER_RADIUS.pill}; + border: 2px solid ${COLORS.gray[1]}; + background-color: white; + + ${media.md.css` + height: ${rem(50)}; + width: ${rem(50)}; + line-height: ${rem(50)}; + `} +`; + +const Line = styled.div` + width: 100%; + height: 2px; + background-color: ${COLORS.gray[1]}; + margin-top: ${rem(20)}; + + ${media.md.css` + margin-top: ${rem(25)}; + `} +`; + +const TimelineItem = ({ quarter, year, content }) => ( + + + + + + + + + + + + + + + + + + + + + +); + +TimelineItem.propTypes = { + quarter: PropTypes.string.isRequired, + year: PropTypes.string.isRequired, + content: PropTypes.string.isRequired, +}; + +export default TimelineItem; diff --git a/src/components/Home/components/Roadmap/components/TimelineItem/index.js b/src/components/Home/components/Roadmap/components/TimelineItem/index.js new file mode 100644 index 00000000..1e467b07 --- /dev/null +++ b/src/components/Home/components/Roadmap/components/TimelineItem/index.js @@ -0,0 +1 @@ +export { default } from './TimelineItem'; diff --git a/src/components/Logo/Logo.js b/src/components/Logo/Logo.js index cd612f49..236558d8 100644 --- a/src/components/Logo/Logo.js +++ b/src/components/Logo/Logo.js @@ -1,4 +1,5 @@ import React from 'react'; +import PropTypes from 'prop-types'; import styled from 'styled-components'; import { Link } from 'react-router-dom'; import { rem } from 'polished'; @@ -10,7 +11,7 @@ const StyledLink = styled(Link)` display: block; `; -const Logo = styled.img.attrs({ +const Img = styled.img.attrs({ alt: 'Skycoin', })` display: block; @@ -18,8 +19,18 @@ const Logo = styled.img.attrs({ max-width: 100%; `; -export default (props) => ( +const Logo = props => ( - + ); + +Logo.propTypes = { + white: PropTypes.bool, +}; + +Logo.defaultProps = { + white: false, +}; + +export default Logo; diff --git a/src/components/NotFound/NotFound.js b/src/components/NotFound/NotFound.js new file mode 100644 index 00000000..cbe12ab5 --- /dev/null +++ b/src/components/NotFound/NotFound.js @@ -0,0 +1,42 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { injectIntl, FormattedMessage } from 'react-intl'; +import styled from 'styled-components'; +import { Helmet } from 'react-helmet'; + +import Heading from 'components/Heading'; +import Button from 'components/Button'; + +const Wrapper = styled.div` + text-align: center; + display: flex; + align-items: center; + justify-content: center; + height: 100vh; +`; + +const NotFound = ({ intl }) => ( + + + {intl.formatMessage({ id: 'notFound.title' })} + + +
    + + + + + +
    +
    +); + +NotFound.propTypes = { + intl: PropTypes.shape({ + formatMessage: PropTypes.func.isRequired, + }).isRequired, +}; + +export default injectIntl(NotFound); diff --git a/src/components/NotFound/index.js b/src/components/NotFound/index.js new file mode 100644 index 00000000..106131be --- /dev/null +++ b/src/components/NotFound/index.js @@ -0,0 +1 @@ +export { default } from './NotFound'; diff --git a/src/components/Routes/Routes.js b/src/components/Routes/Routes.js index 06b56d1a..9ed88c5c 100644 --- a/src/components/Routes/Routes.js +++ b/src/components/Routes/Routes.js @@ -1,16 +1,24 @@ -import React from 'react' -import { - Switch, - Route, -} from 'react-router-dom'; +import React from 'react'; +import PropTypes from 'prop-types'; +import { Switch, Route } from 'react-router-dom'; import { resolve } from 'path'; import Home from '../Home'; import Distribution from '../Distribution'; +import NotFound from '../NotFound'; -export default ({ match }) => ( +const Routes = ({ match }) => ( + ); + +Routes.propTypes = { + match: PropTypes.shape({ + url: PropTypes.string.isRequired, + }).isRequired, +}; + +export default Routes; diff --git a/src/components/Text/Text.js b/src/components/Text/Text.js index 87580f00..7ba1665c 100644 --- a/src/components/Text/Text.js +++ b/src/components/Text/Text.js @@ -1,4 +1,4 @@ -import styled, { css } from 'styled-components'; +import styled from 'styled-components'; import { rem } from 'polished'; import { space, width, fontSize, color } from 'styled-system'; @@ -12,7 +12,7 @@ export default styled.p` ${width} font-family: ${FONT_FAMILIES.sans}; - font-weight: ${props => props.heavy ? 500 : 400}; + font-weight: ${props => (props.heavy ? 500 : 400)}; line-height: ${rem(24)}; ${media.sm.css` diff --git a/src/index.js b/src/index.js index 52c9a3b6..dce008e7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,11 +1,11 @@ import React from 'react'; import { render } from 'react-snapshot'; -import App from './components/App'; -import registerServiceWorker from './registerServiceWorker'; - import 'normalize.css/normalize.css'; import './index.css'; +import App from './components/App'; +import registerServiceWorker from './registerServiceWorker'; + render(, document.getElementById('root')); registerServiceWorker(); diff --git a/src/locales/en.js b/src/locales/en.js index 37bde56e..01618ca1 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -1,12 +1,45 @@ export default { - buy: 'Buy Skycoin', header: { navigation: { distribution: 'Distribution', downloads: 'Downloads', blog: 'Blog', + buy: 'Buy Skycoin', }, }, + footer: { + getStarted: { + heading: 'Get started', + wallet: 'Wallet', + buy: 'Buy', + howItWorks: 'How it works', + quickStart: 'Quick start', + }, + explore: { + heading: 'Explore', + distribution: 'Distribution', + whitepapers: 'Whitepapers', + blockchain: 'Blockchain', + roadmap: 'Roadmap', + }, + community: { + heading: 'Community', + community: 'Community', + github: 'Github', + telegram: 'Telegram', + slack: 'Slack', + }, + }, + getStarted: { + heading: 'Get started with Skycoin', + buy: 'Buy Skycoin', + wallet: 'Get Wallet', + }, + notFound: { + title: 'Page not found', + heading: 'Page not found', + home: 'Skycoin homepage', + }, home: { title: 'Foundations for the next internet', description: 'Skycoin is a third-generation crypto asset, designed and developed to solve Bitcoin’s speed and security issues.', @@ -22,6 +55,59 @@ export default { about: { heading: 'What is Skycoin?', lead: 'Skycoin is a third-generation crypto asset, designed and developed to solve Bitcoin’s speed and security issues. With transactions in mere seconds, native support for CoinJoin and a new consensus algorithm that eliminates centralization and 51% attacks, Skycoin aims to alleviate any concerns over crypto, making it accessible anyone wishing to invest in the future of money.', + whitepaper: 'Read the whitepaper', + speed: { + heading: 'Speed', + body: 'We built Skycoin to compete with credit cards and services like AliPay/Apple Pay. Transactions happen in seconds, not minutes.', + }, + privacy: { + heading: 'Privacy', + body: 'Skycoin makes it impossible to trace transactions by mixing transactions from multiple wallets to increase privacy using the CoinJoin protocol. ', + }, + security: { + heading: 'Security', + body: 'Skycoin is more secure because it does not rely upon the good will of miners, it cannot be 51% attacked.', + }, + ecosystem: { + heading: 'Ecosystem', + body: 'We’re building a rich ecosystem of real world applications on top of Skycoin starting with messaging, social media, and VPN.', + }, + }, + network: { + label: 'Digging deeper', + heading: 'Network Consensus', + body: 'Mining represents one of the biggest flaws to crypto assets by centralising large amounts of power into a handful of mining pools. Mining costs cryptocurrency networks tens of millions of dollars every month in electricity costs, processing just seven transactions a second. Skycoin uses a new consensus algorithm, Network Consensus, which requires no mining. ', + link: 'Learn about Network Consensus', }, - } + distribution: { + label: 'Digging deeper', + heading: 'Distribution', + body: 'As coins aren’t mined, Skycoin distribution is unlike that of a standard token or asset. To ensure continued development, coins are awarded and distributed to contributors, developers and investors and sold on exchanges like C2CX and Cryptopia. In the coming months, 20% of coins will be auctioned/ICO’ed.', + link: 'Learn about distribution', + }, + roadmap: { + heading: 'Roadmap', + blurb: 'Development can be followed and contributed to on GitHub. We will be opening bounties for bug fixes, design and development in the coming months.', + roadmapLink: 'See the full roadmap', + community: 'Join Skycoin on Telegram to start contributing, and keep up-to-date with the latest developments.', + communityLink: 'Join the community', + timeline: { + distribution: { + quarter: 'Q3', + year: 'FY17', + content: 'Coin distribution sale: 20% of coins to be distributed by auction and ICO.', + }, + network: { + quarter: 'Q4', + year: 'FY17', + content: 'Launch of the first downloadable network node, users will be able to earn coins for powering the network.', + }, + applications: { + quarter: 'Q1', + year: 'FY18', + content: 'The launch of our first applications on the Skywire Network: a decentralised, Redditesque, social media platform and VPN service.', + }, + }, + }, + }, }; diff --git a/src/locales/ru.js b/src/locales/ru.js index 4a469174..8d9f3c56 100644 --- a/src/locales/ru.js +++ b/src/locales/ru.js @@ -1,25 +1,113 @@ export default { - buy: 'Купить Skycoin', header: { navigation: { - distribution: 'распределение', - downloads: 'Загрузки', - blog: 'Блог', + distribution: 'Distribution', + downloads: 'Downloads', + blog: 'Blog', + buy: 'Buy Skycoin', }, }, + footer: { + getStarted: { + heading: 'Get started', + wallet: 'Wallet', + buy: 'Buy', + howItWorks: 'How it works', + quickStart: 'Quick start', + }, + explore: { + heading: 'Explore', + distribution: 'Distribution', + whitepapers: 'Whitepapers', + blockchain: 'Blockchain', + roadmap: 'Roadmap', + }, + community: { + heading: 'Community', + community: 'Community', + github: 'Github', + telegram: 'Telegram', + slack: 'Slack', + }, + }, + notFound: { + title: 'Страница не найдена', + heading: 'Страница не найдена', + home: 'Skycoin домашняя страница', + }, + getStarted: { + heading: 'Get started with Skycoin', + buy: 'Buy Skycoin', + wallet: 'Get Wallet', + }, home: { + title: 'Основы для следующего интернета', + description: 'Skycoin is a third-generation crypto asset, designed and developed to solve Bitcoin’s speed and security issues.', hero: { heading: 'Основы для{break}следующего интернета.', - buy: 'Купить Skycoin', + buy: 'Buy Skycoin', wallet: { - get: 'Получить кошелек', - blurb: 'Кошелек позволяет удерживать и защищать Skycoin.{break}Это быстро, безопасно и бесплатно.', + get: 'Get Wallet', + blurb: 'Wallet allows you to hold and secure Skycoin.{break}It\'s fast, secure, and free.', }, - announcement: 'Следующее мероприятие по распространению начнется 31 мая 2017 года. Будет распространено 100 монет.', + announcement: 'The next distribution event will begin on 31st May 2017. 100 coins will be distributed.', }, about: { - heading: 'Что такое Skycoin?', - lead: 'Skycoin - криптоактивный продукт третьего поколения, разработанный и разработанный для решения проблем скорости и безопасности Bitcoin. С транзакциями за считанные секунды, встроенная поддержка CoinJoin и новый консенсусный алгоритм, который устраняет централизацию и 51% нападений, Skycoin стремится смягчить любые опасения по поводу криптографии, сделав ее доступной для всех желающих инвестировать в будущее денег.', + heading: 'What is Skycoin?', + lead: 'Skycoin is a third-generation crypto asset, designed and developed to solve Bitcoin’s speed and security issues. With transactions in mere seconds, native support for CoinJoin and a new consensus algorithm that eliminates centralization and 51% attacks, Skycoin aims to alleviate any concerns over crypto, making it accessible anyone wishing to invest in the future of money.', + whitepaper: 'Read the whitepaper', + speed: { + heading: 'Speed', + body: 'We built Skycoin to compete with credit cards and services like AliPay/Apple Pay. Transactions happen in seconds, not minutes.', + }, + privacy: { + heading: 'Privacy', + body: 'Skycoin makes it impossible to trace transactions by mixing transactions from multiple wallets to increase privacy using the CoinJoin protocol. ', + }, + security: { + heading: 'Security', + body: 'Skycoin is more secure because it does not rely upon the good will of miners, it cannot be 51% attacked.', + }, + ecosystem: { + heading: 'Ecosystem', + body: 'We’re building a rich ecosystem of real world applications on top of Skycoin starting with messaging, social media, and VPN.', + }, + }, + network: { + label: 'Digging deeper', + heading: 'Network Consensus', + body: 'Mining represents one of the biggest flaws to crypto assets by centralising large amounts of power into a handful of mining pools. Mining costs cryptocurrency networks tens of millions of dollars every month in electricity costs, processing just seven transactions a second. Skycoin uses a new consensus algorithm, Network Consensus, which requires no mining. ', + link: 'Learn about Network Consensus', + }, + distribution: { + label: 'Digging deeper', + heading: 'Distribution', + body: 'As coins aren’t mined, Skycoin distribution is unlike that of a standard token or asset. To ensure continued development, coins are awarded and distributed to contributors, developers and investors and sold on exchanges like C2CX and Cryptopia. In the coming months, 20% of coins will be auctioned/ICO’ed.', + link: 'Learn about distribution', }, - } + roadmap: { + heading: 'Roadmap', + blurb: 'Development can be followed and contributed to on GitHub. We will be opening bounties for bug fixes, design and development in the coming months.', + roadmapLink: 'See the full roadmap', + community: 'Join Skycoin on Telegram to start contributing, and keep up-to-date with the latest developments.', + communityLink: 'Join the community', + timeline: { + distribution: { + quarter: 'Q3', + year: 'FY17', + content: 'Coin distribution sale: 20% of coins to be distributed by auction and ICO.', + }, + network: { + quarter: 'Q4', + year: 'FY17', + content: 'Launch of the first downloadable network node, users will be able to earn coins for powering the network.', + }, + applications: { + quarter: 'Q1', + year: 'FY18', + content: 'The launch of our first applications on the Skywire Network: a decentralised, Redditesque, social media platform and VPN service.', + }, + }, + }, + }, }; diff --git a/src/locales/zh.js b/src/locales/zh.js index 9bd2ebc0..08776f59 100644 --- a/src/locales/zh.js +++ b/src/locales/zh.js @@ -1,25 +1,113 @@ export default { - buy: '购买Skycoin', header: { navigation: { - distribution: '分配', - downloads: '下载', - blog: '博客', + distribution: 'Distribution', + downloads: 'Downloads', + blog: 'Blog', + buy: 'Buy Skycoin', }, }, + footer: { + getStarted: { + heading: 'Get started', + wallet: 'Wallet', + buy: 'Buy', + howItWorks: 'How it works', + quickStart: 'Quick start', + }, + explore: { + heading: 'Explore', + distribution: 'Distribution', + whitepapers: 'Whitepapers', + blockchain: 'Blockchain', + roadmap: 'Roadmap', + }, + community: { + heading: 'Community', + community: 'Community', + github: 'Github', + telegram: 'Telegram', + slack: 'Slack', + }, + }, + getStarted: { + heading: 'Get started with Skycoin', + buy: 'Buy Skycoin', + wallet: 'Get Wallet', + }, + notFound: { + title: '找不到网页', + heading: '找不到网页', + home: 'Skycoin 主页', + }, home: { + title: '下一个互联网的基础', + description: 'Skycoin is a third-generation crypto asset, designed and developed to solve Bitcoin’s speed and security issues.', hero: { heading: '下一个互联网的基础。', - buy: '购买Skycoin', + buy: 'Buy Skycoin', wallet: { - get: '获取电子钱包', - blurb: '电子钱包允许您握住并固定Skycoin{break}它是快速,安全和免费的', + get: 'Get Wallet', + blurb: 'Wallet allows you to hold and secure Skycoin.{break}It\'s fast, secure, and free.', }, - announcement: '下一个发行活动将于2017年5月31日开始。将分发100枚硬币。', + announcement: 'The next distribution event will begin on 31st May 2017. 100 coins will be distributed.', }, about: { - heading: '什么是Skycoin', - lead: 'Skycoin是第三代加密资产,设计和开发解决比特币的速度和安全性问题。随着几秒钟,对CoinJoin原生支持,并消除集中化和51%攻击的新共识的算法交易,Skycoin旨在减轻任何担忧加密,使其有兴趣投资的钱将来访问的任何人。', + heading: 'What is Skycoin?', + lead: 'Skycoin is a third-generation crypto asset, designed and developed to solve Bitcoin’s speed and security issues. With transactions in mere seconds, native support for CoinJoin and a new consensus algorithm that eliminates centralization and 51% attacks, Skycoin aims to alleviate any concerns over crypto, making it accessible anyone wishing to invest in the future of money.', + whitepaper: 'Read the whitepaper', + speed: { + heading: 'Speed', + body: 'We built Skycoin to compete with credit cards and services like AliPay/Apple Pay. Transactions happen in seconds, not minutes.', + }, + privacy: { + heading: 'Privacy', + body: 'Skycoin makes it impossible to trace transactions by mixing transactions from multiple wallets to increase privacy using the CoinJoin protocol. ', + }, + security: { + heading: 'Security', + body: 'Skycoin is more secure because it does not rely upon the good will of miners, it cannot be 51% attacked.', + }, + ecosystem: { + heading: 'Ecosystem', + body: 'We’re building a rich ecosystem of real world applications on top of Skycoin starting with messaging, social media, and VPN.', + }, + }, + network: { + label: 'Digging deeper', + heading: 'Network Consensus', + body: 'Mining represents one of the biggest flaws to crypto assets by centralising large amounts of power into a handful of mining pools. Mining costs cryptocurrency networks tens of millions of dollars every month in electricity costs, processing just seven transactions a second. Skycoin uses a new consensus algorithm, Network Consensus, which requires no mining. ', + link: 'Learn about Network Consensus', + }, + distribution: { + label: 'Digging deeper', + heading: 'Distribution', + body: 'As coins aren’t mined, Skycoin distribution is unlike that of a standard token or asset. To ensure continued development, coins are awarded and distributed to contributors, developers and investors and sold on exchanges like C2CX and Cryptopia. In the coming months, 20% of coins will be auctioned/ICO’ed.', + link: 'Learn about distribution', }, - } + roadmap: { + heading: 'Roadmap', + blurb: 'Development can be followed and contributed to on GitHub. We will be opening bounties for bug fixes, design and development in the coming months.', + roadmapLink: 'See the full roadmap', + community: 'Join Skycoin on Telegram to start contributing, and keep up-to-date with the latest developments.', + communityLink: 'Join the community', + timeline: { + distribution: { + quarter: 'Q3', + year: 'FY17', + content: 'Coin distribution sale: 20% of coins to be distributed by auction and ICO.', + }, + network: { + quarter: 'Q4', + year: 'FY17', + content: 'Launch of the first downloadable network node, users will be able to earn coins for powering the network.', + }, + applications: { + quarter: 'Q1', + year: 'FY18', + content: 'The launch of our first applications on the Skywire Network: a decentralised, Redditesque, social media platform and VPN service.', + }, + }, + }, + }, }; diff --git a/src/registerServiceWorker.js b/src/registerServiceWorker.js index 9966897d..00f4adcf 100644 --- a/src/registerServiceWorker.js +++ b/src/registerServiceWorker.js @@ -1,3 +1,5 @@ +/* eslint-disable no-console, no-param-reassign */ + // In production, we register a service worker to serve assets from local cache. // This lets the app load faster on subsequent visits in production, and gives @@ -14,7 +16,7 @@ export default function register() { const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; navigator.serviceWorker .register(swUrl) - .then(registration => { + .then((registration) => { registration.onupdatefound = () => { const installingWorker = registration.installing; installingWorker.onstatechange = () => { @@ -35,7 +37,7 @@ export default function register() { }; }; }) - .catch(error => { + .catch((error) => { console.error('Error during service worker registration:', error); }); }); @@ -44,7 +46,7 @@ export default function register() { export function unregister() { if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready.then(registration => { + navigator.serviceWorker.ready.then((registration) => { registration.unregister(); }); } diff --git a/yarn.lock b/yarn.lock index 05e627ff..0a767396 100644 --- a/yarn.lock +++ b/yarn.lock @@ -120,6 +120,10 @@ ansi-regex@^2.0.0, ansi-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -949,7 +953,7 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24 lodash "^4.2.0" to-fast-properties "^1.0.1" -babylon@^6.11.0, babylon@^6.13.0, babylon@^6.14.0, babylon@^6.17.0, babylon@^6.17.2: +babylon@^6.11.0, babylon@^6.14.0, babylon@^6.17.0, babylon@^6.17.2, babylon@^6.17.4: version "6.17.4" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" @@ -962,8 +966,8 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" base64-js@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" base64url@^2.0.0: version "2.0.0" @@ -1216,12 +1220,12 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000692" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000692.tgz#3da9a99353adbcea1e142b99f60ecc6216df47a5" + version "1.0.30000696" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000696.tgz#e71f5c61e1f96c7a3af4e791ac5db55e11737604" caniuse-lite@^1.0.30000669, caniuse-lite@^1.0.30000684: - version "1.0.30000692" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000692.tgz#34600fd7152352d85a47f4662a3b51b02d8b646f" + version "1.0.30000696" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000696.tgz#30f2695d2a01a0dfd779a26ab83f4d134b3da5cc" capture-stack-trace@^1.0.0: version "1.0.0" @@ -1728,12 +1732,6 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@2.2.0, debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - debug@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" @@ -1746,6 +1744,12 @@ debug@2.6.8, debug@^2.1.1, debug@^2.2.0, debug@^2.6.0, debug@^2.6.3, debug@^2.6. dependencies: ms "2.0.0" +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2090,6 +2094,16 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-config-airbnb-base@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.2.0.tgz#19a9dc4481a26f70904545ec040116876018f853" + +eslint-config-airbnb@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-15.0.1.tgz#7b5188e5b7c74b9b2ce639fd5e1daba8fd761aed" + dependencies: + eslint-config-airbnb-base "^11.2.0" + eslint-config-react-app@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-1.0.4.tgz#c0178f535a922236c53daafea4f397203db7d9af" @@ -2114,10 +2128,10 @@ eslint-loader@1.7.1: rimraf "^2.6.1" eslint-module-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" + version "2.1.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" dependencies: - debug "2.2.0" + debug "^2.6.8" pkg-dir "^1.0.0" eslint-plugin-flowtype@2.33.0: @@ -2126,7 +2140,7 @@ eslint-plugin-flowtype@2.33.0: dependencies: lodash "^4.15.0" -eslint-plugin-import@2.2.0: +eslint-plugin-import@2.2.0, eslint-plugin-import@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" dependencies: @@ -2141,7 +2155,7 @@ eslint-plugin-import@2.2.0: minimatch "^3.0.3" pkg-up "^1.0.0" -eslint-plugin-jsx-a11y@5.0.3: +eslint-plugin-jsx-a11y@5.0.3, eslint-plugin-jsx-a11y@^5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.0.3.tgz#4a939f76ec125010528823331bf948cc573380b6" dependencies: @@ -2153,7 +2167,7 @@ eslint-plugin-jsx-a11y@5.0.3: emoji-regex "^6.1.0" jsx-ast-utils "^1.4.0" -eslint-plugin-react@7.0.1: +eslint-plugin-react@7.0.1, eslint-plugin-react@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.0.1.tgz#e78107e1e559c6e2b17786bb67c2e2a010ad0d2f" dependencies: @@ -2161,7 +2175,7 @@ eslint-plugin-react@7.0.1: has "^1.0.1" jsx-ast-utils "^1.3.4" -eslint@3.19.0: +eslint@3.19.0, eslint@^3.19.0: version "3.19.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" dependencies: @@ -2402,7 +2416,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@^0.8.5, fbjs@^0.8.9: +fbjs@^0.8.5, fbjs@^0.8.8, fbjs@^0.8.9: version "0.8.12" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" dependencies: @@ -2654,6 +2668,15 @@ gh-pages@^1.0.0: graceful-fs "4.1.11" rimraf "^2.5.4" +glamor@^2.20.25: + version "2.20.25" + resolved "https://registry.yarnpkg.com/glamor/-/glamor-2.20.25.tgz#71b84b82b67a9327771ac59de53ee915d148a4a3" + dependencies: + babel-runtime "^6.18.0" + fbjs "^0.8.8" + object-assign "^4.1.0" + prop-types "^15.5.8" + glamorous@^3.23.2: version "3.23.4" resolved "https://registry.yarnpkg.com/glamorous/-/glamorous-3.23.4.tgz#a1e5f8045c332850105777dea4d3b21c5bdc4796" @@ -2797,6 +2820,10 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -2814,8 +2841,8 @@ hash-base@^2.0.0: inherits "^2.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.1.tgz#5cb2e796499224e69fd0b00ed01d2d4a16e7a323" + version "1.1.2" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.2.tgz#bf5c887825cfe40b9efde7bf11bd2db26e6bf01b" dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.0" @@ -2873,8 +2900,8 @@ home-or-tmp@^2.0.0: os-tmpdir "^1.0.1" hosted-git-info@^2.1.4: - version "2.4.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" hpack.js@^2.1.6: version "2.1.6" @@ -2890,8 +2917,8 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" html-element-attributes@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/html-element-attributes/-/html-element-attributes-1.2.0.tgz#8b1c7aaf94353fd9b455c27ec7ebaf1583e29fd0" + version "1.3.0" + resolved "https://registry.yarnpkg.com/html-element-attributes/-/html-element-attributes-1.3.0.tgz#f06ebdfce22de979db82020265cac541fb17d4fc" html-encoding-sniffer@^1.0.1: version "1.0.1" @@ -2917,8 +2944,8 @@ html-minifier@^3.2.3: uglify-js "3.0.x" html-tag-names@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-tag-names/-/html-tag-names-1.1.1.tgz#f8a076113f16e393518937f6b3b5d22296755d4a" + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-tag-names/-/html-tag-names-1.1.2.tgz#f65168964c5a9c82675efda882875dcb2a875c22" html-webpack-plugin@2.28.0: version "2.28.0" @@ -3371,14 +3398,14 @@ isstream@0.1.2, isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" istanbul-api@^1.1.1: - version "1.1.9" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8" + version "1.1.10" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.10.tgz#f27e5e7125c8de13f6a80661af78f512e5439b2b" dependencies: async "^2.1.4" fileset "^2.0.2" istanbul-lib-coverage "^1.1.1" istanbul-lib-hook "^1.0.7" - istanbul-lib-instrument "^1.7.2" + istanbul-lib-instrument "^1.7.3" istanbul-lib-report "^1.1.1" istanbul-lib-source-maps "^1.2.1" istanbul-reports "^1.1.1" @@ -3396,15 +3423,15 @@ istanbul-lib-hook@^1.0.7: dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56" +istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.2, istanbul-lib-instrument@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.3.tgz#925b239163eabdd68cc4048f52c2fa4f899ecfa7" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" - babylon "^6.13.0" + babylon "^6.17.4" istanbul-lib-coverage "^1.1.1" semver "^5.3.0" @@ -3711,8 +3738,8 @@ json-loader@^0.5.4: resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" json-schema-traverse@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.0.tgz#0016c0b1ca1efe46d44d37541bcdfc19dcfae0db" + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" json-schema@0.2.3: version "0.2.3" @@ -3904,7 +3931,7 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.2.0, lodash@^4.3.0: +"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -4044,11 +4071,7 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.27.0 < 2": - version "1.28.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.28.0.tgz#fedd349be06d2865b7fc57d837c6de4f17d7ac3c" - -mime-db@~1.27.0: +"mime-db@>= 1.27.0 < 2", mime-db@~1.27.0: version "1.27.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" @@ -4218,8 +4241,8 @@ nopt@^4.0.1: osenv "^0.1.4" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.8" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -4250,8 +4273,8 @@ normalize.css@^7.0.0: resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-7.0.0.tgz#abfb1dd82470674e0322b53ceb1aaf412938e4bf" npmlog@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -4841,12 +4864,12 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 supports-color "^3.2.3" postcss@^6.0.1, postcss@^6.x: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.2.tgz#5c4fea589f0ac3b00caa75b1cbc3a284195b7e5d" + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.3.tgz#b7f565b3d956fbb8565ca7c1e239d0506e427d8b" dependencies: chalk "^1.1.3" source-map "^0.5.6" - supports-color "^3.2.3" + supports-color "^4.0.0" prelude-ls@~1.1.2: version "1.1.2" @@ -4900,7 +4923,7 @@ promise@7.1.1, promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7: +prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.5.8: version "15.5.10" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154" dependencies: @@ -5212,8 +5235,8 @@ readable-stream@1.0: string_decoder "~0.10.x" readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.2.9: - version "2.3.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.0.tgz#640f5dcda88c91a8dc60787145629170813a1ed2" + version "2.3.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.2.tgz#5a04df05e4f57fe3f0dc68fdd11dc5c97c7e6f4d" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5489,12 +5512,8 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.0.tgz#fe4c8460397f9eaaaa58e73be46273408a45e223" - -safe-buffer@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" sane@~1.6.0: version "1.6.0" @@ -5509,8 +5528,8 @@ sane@~1.6.0: watch "~0.10.0" sax@^1.2.1, sax@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" schema-utils@^0.x: version "0.3.0" @@ -5808,21 +5827,21 @@ string-width@^1.0.1, string-width@^1.0.2: strip-ansi "^3.0.0" string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + version "2.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.0.tgz#030664561fc146c9423ec7d978fe2457437fe6d0" dependencies: is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" + strip-ansi "^4.0.0" string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" string_decoder@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.2.tgz#b29e1f4e1125fa97a10382b8a533737b7491e179" + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" dependencies: - safe-buffer "~5.0.1" + safe-buffer "~5.1.0" stringstream@~0.0.4: version "0.0.5" @@ -5834,6 +5853,12 @@ strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -5895,9 +5920,15 @@ supports-color@^3.1.0, supports-color@^3.1.1, supports-color@^3.1.2, supports-co dependencies: has-flag "^1.0.0" +supports-color@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.0.0.tgz#33a7c680aa512c9d03ef929cacbb974d203d2790" + dependencies: + has-flag "^2.0.0" + svg-tag-names@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/svg-tag-names/-/svg-tag-names-1.1.0.tgz#24c04db37f2ee2ee28bc619f4e8a25ee21fc0203" + version "1.1.1" + resolved "https://registry.yarnpkg.com/svg-tag-names/-/svg-tag-names-1.1.1.tgz#9641b29ef71025ee094c7043f7cdde7d99fbd50a" svgo@^0.7.0: version "0.7.2" @@ -6089,12 +6120,12 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" ua-parser-js@^0.7.9: - version "0.7.12" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" + version "0.7.13" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.13.tgz#cd9dd2f86493b3f44dbeeef3780fda74c5ee14be" uglify-js@3.0.x: - version "3.0.18" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.18.tgz#d67a3e5a0a08356b787fb1c9bddf3a807630902e" + version "3.0.20" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.20.tgz#cb35b2bcfe478051b6f3282be8db4e4add49a1e5" dependencies: commander "~2.9.0" source-map "~0.5.1" @@ -6307,8 +6338,8 @@ webidl-conversions@^4.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" webpack-dev-middleware@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz#2e252ce1dfb020dbda1ccb37df26f30ab014dbd1" + version "1.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.11.0.tgz#09691d0973a30ad1f82ac73a12e2087f0a4754f9" dependencies: memory-fs "~0.4.1" mime "^1.3.4"