We select styled-components for frontend

Login view is added
This commit is contained in:
Sukchan Lee 2017-05-24 21:19:23 +09:00
parent 4c62e54f8f
commit bd3ebc5c6f
15 changed files with 676 additions and 158 deletions

8
webui/.babelrc Normal file
View File

@ -0,0 +1,8 @@
{
"presets": [
"next/babel"
],
"plugins": [
["styled-components", { "ssr": true, "displayName": true, "preprocess": false } ]
]
}

View File

@ -1,5 +1,5 @@
export default ({ children }) => (
export default ({children}) => (
<main>
{ children }
{children}
</main>
)

View File

@ -0,0 +1,29 @@
import styled from 'styled-components';
import PropTypes from 'prop-types';
const Black = styled.div`
// Layout
position: fixed;
top: 0px;
left: 0px;
right: 0px;
bottom: 0px;
// Layer
z-index: 5;
// Color
background: rgba(0,0,0,0.3);
`;
const Dimmed = ({visible}) => (
<div>
{visible && <Black/>}
</div>
);
Dimmed.propTypes = {
visible: PropTypes.bool
};
export default Dimmed;

View File

@ -1,12 +1,13 @@
import Link from 'next/link';
import Head from 'next/head';
export default ({ title }) => (
export default ({title}) => (
<div>
<Head>
<title>{ title}</title>
<title>{title}</title>
<meta charSet='utf-8' />
<meta name='viewport' content='initial-scale=1.0, width=device-witdth' />
<link rel='stylesheet' type='text/css' href='/static/index.css' />
</Head>
</div>
)
)

38
webui/components/Input.js Normal file
View File

@ -0,0 +1,38 @@
import styled from 'styled-components';
import oc from 'open-color';
import PropTypes from 'prop-types';
const Input = styled.input`
// Layout
width: 100%;
padding: 0.5rem;
// Color
border: 1px solid ${oc.gray[2]};
// Misc
font-size: 1.5rem;
line-height: 2rem;
transition: all .25s;
// During keyboard input
&:focus {
outline: none;
border: 1px solid ${oc.pink[3]};
color: ${oc.pink[6]};
}
// Interval Between Component
& + & {
margin-top: 1rem;
}
`;
Input.propTypes = {
name: PropTypes.string,
value: PropTypes.string,
placeholder: PropTypes.string,
onChange: PropTypes.func
};
export default Input

View File

@ -1,10 +1,202 @@
import Link from 'next/link';
import Session from '../lib/session';
export default () => (
<div>
<h1>Unauthorized</h1>
<p>You are not authorized to view this page.</p>
<p><Link prefetch href='/login'><a>Please log in</a></Link></p>
<p><Link prefetch href='/'><a>Back to homepage</a></Link></p>
</div>
)
import { Component } from 'react';
import Link from 'next/link';
import Router from 'next/router';
import PropTypes from 'prop-types';
import styled from 'styled-components';
import oc from 'open-color';
import { media, transitions} from '../lib/style-utils';
import Header from './Header';
import Thumbnail from './Thumbnail';
import Input from './Input';
import Dimmed from './Dimmed';
const Wrapper = styled.div`
// Layout
position: fixed;
// Adjust screen
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
// Layer
z-index: 10;
// Width
width: ${ props => props.width };
${media.mobile`
width: calc(100% - 2rem);
`}
`;
Wrapper.propTypes = {
width: PropTypes.string
}
const ThumbnailWrapper = styled.div`
// Layout
padding-top: 3rem;
padding-bottom: 3rem;
display: flex;
justify-content: center;
// Color
background: white;
`;
const Form = styled.div`
// Layout
padding: 1rem;
// Color
background: ${oc.gray[0]};
`;
const ButtonWrapper = styled.div`
// Layout
display: flex;
`;
const Button = styled.div`
// Layout
padding-top: 1rem;
padding-bottom: 1rem;
flex: 1;
display: inline-block;
// Misc
cursor: pointer;
text-align: center;
font-weight: 500;
font-size: 1.2rem;
transition: all .3s;
// Color
color: white;
background: ${props => oc[props.color][7]};
// Mouse Over
&:hover {
background: ${props => oc[props.color][6]};
}
// Clicked
&:active {
background: ${props => oc[props.color][8]};
}
`;
Button.propTypes = {
color: PropTypes.string
};
class Login extends Component {
state = {
errors: {},
account: {
username: '',
password: ''
},
session: {}
};
static propTypes = {
width: PropTypes.string
}
static defaultProps = {
width: '400px'
}
static async getInitialProps({req}) {
const session = new Session({req})
return {session: await session.getSession(true)}
}
async componentDidMount() {
const session = new Session()
this.setState({
session: await session.getSession(true)
});
}
onAction = (e) => {
const {
username,
password
} = this.state.account;
const session = new Session()
session.signin(username, password)
.then(() => {
Router.push('/');
})
.catch(err => {
// @FIXME Handle error
console.log(err)
})
}
handleChange = (e) => {
this.setState({
account: {
...this.state.account,
[e.target.name]: e.target.value
}
});
}
render() {
const {
handleChange,
onAction
} = this;
const {
username,
password
} = this.state.account;
const {width} = this.props;
return (
<div>
<Header title='Login'>
</Header>
<Wrapper width={width}>
<ThumbnailWrapper>
<Thumbnail size='8rem' color={oc['blue'][6]} />
</ThumbnailWrapper>
<Form>
<Input
name="username"
placeholder="Username"
value={username}
onChange={handleChange}
/>
<Input
name="password"
placeholder="Password"
value={password}
onChange={handleChange}
/>
</Form>
<ButtonWrapper>
<Button color='teal'
onClick={onAction}>
Log In
</Button>
</ButtonWrapper>
</Wrapper>
<Dimmed visible={true} />
</div>
);
}
}
export default Login;

View File

@ -0,0 +1,45 @@
import PropTypes from 'prop-types';
import styled from 'styled-components';
import Person from 'react-icons/lib/md/person';
import oc from 'open-color';
const Wrapper = styled.div`
// Layout
width: ${props => props.size};
height: ${props => props.size};
display: flex;
align-items: center;
justify-content: center;
// Misc
border-radius: calc(${props => props.size} * 0.5 ); // to be circle, this value is more than 1/2
font-size: calc(${props => props.size} * 0.75);
background: ${props => props.color};
color: white;
`;
Wrapper.propTypes = {
size: PropTypes.string,
color: PropTypes.string
};
const Thumbnail = ({size, color}) => (
<Wrapper size={size} color={color}>
<Person />
</Wrapper>
)
Thumbnail.propTypes = {
size: PropTypes.string,
color: PropTypes.string
};
Thumbnail.defaultProps = {
size: '4rem',
color: '#000'
};
export default Thumbnail;

55
webui/lib/style-utils.js Normal file
View File

@ -0,0 +1,55 @@
import {css, keyframes} from 'styled-components';
export const media = {
mobile: (...args) => css`
@media (max-width: 768px) {
${css(...args)}
}
`
};
export const transitions = {
slideDown: keyframes`
0% {
opacity: 0;
transform: translateY(-100vh);
}
75% {
opacity: 1;
transform: translateY(50px);
}
100% {
transform: translateY(0px);
}
`,
slideUp: keyframes`
0% {
transform: translateY(0px);
opacity: 1;
}
25% {
opacity: 1;
transform: translateY(50px);
}
100% {
opacity: 0;
transform: translateY(-100vh);
}
`,
stretchOut: keyframes`
0% {
transform: scale(0,0);
}
100% {
transform: scale(1,1);
}
`,
shrinkIn: keyframes`
0% {
transform: scale(1, 1);
}
100% {
transform: scale(0,0);
}
`
}

View File

@ -3,11 +3,11 @@ import Session from './session';
export default (Component) => class extends React.Component {
static async getInitialProps (ctx) {
const session = new Session({ req: ctx.req });
const session = new Session({req: ctx.req});
let initialProps = {};
if (Component.getInitialProps) {
initialProps = Component.getInitialProps({ ...ctx, session });
initialProps = Component.getInitialProps({...ctx, session});
}
const sessionData = await session.getSession();
@ -16,10 +16,10 @@ export default (Component) => class extends React.Component {
isLoggedIn = true;
}
return { session: sessionData, isLoggedIn, ...initialProps };
return {session: sessionData, isLoggedIn, ...initialProps};
}
render () {
return <Component { ...this.props } />
return <Component {...this.props} />
}
}

View File

@ -7,19 +7,24 @@
"author": "NextEPC Group",
"license": "GPL-3.0",
"dependencies": {
"babel-plugin-styled-components": "^1.1.4",
"babel-preset-stage-0": "^6.24.1",
"body-parser": "^1.17.1",
"connect-session-sequelize": "^4.1.0",
"express": "^4.15.2",
"express-session": "^1.15.2",
"lusca": "^1.4.1",
"next": "^2.3.1",
"open-color": "^1.5.1",
"passport": "^0.3.2",
"passport-local": "^1.0.0",
"prop-types": "^15.5.10",
"react": "^15.5.4",
"react-dom": "^15.5.4",
"react-icons": "^2.2.5",
"sequelize": "^3.30.4",
"sqlite3": "^3.1.8"
"sqlite3": "^3.1.8",
"styled-components": "2.0.0-19"
},
"scripts": {
"dev": "node server/index.js",

24
webui/pages/_document.js Normal file
View File

@ -0,0 +1,24 @@
import Document, { Head, Main, NextScript } from 'next/document'
import { ServerStyleSheet } from 'styled-components'
export default class MyDocument extends Document {
render () {
const sheet = new ServerStyleSheet()
const main = sheet.collectStyles(<Main />)
const styleTags = sheet.getStyleElement()
return (
<html>
<Head>
<title>My page</title>
{styleTags}
</Head>
<body>
<div className='root'>
{main}
</div>
<NextScript />
</body>
</html>
)
}
}

View File

@ -1,3 +1,5 @@
import PropTypes from 'prop-types';
import Package from '../package';
import withSession from '../lib/with-session';
@ -8,18 +10,18 @@ import LogoutButton from '../components/logout-button';
const Restricted = (Component) => {
const checkAuth = (props) => {
return props.isLoggedIn ? <Component {...props} /> : <Login />
return props.isLoggedIn ? <Component {...props} /> : <Login/>
}
return withSession(checkAuth);
}
export default Restricted(({ session }) => {
const Index = Restricted(({session}) => {
const title = 'NextEPC ' + Package.version;
return (
<App>
<Header title={ title }>
<Header title={title}>
</Header>
<div>
<p>Welcome back {session.user.username}</p>
@ -29,26 +31,8 @@ export default Restricted(({ session }) => {
)
})
Index.propTypes = {
session: PropTypes.object.isRequired
};
/**
* The index page uses a layout page that pulls in header and footer components
import Link from 'next/link'
import React from 'react'
import Page from '../components/page'
import Layout from '../components/layout'
export default class extends Page {
render() {
return (
<Layout session={this.props.session}>
<h2>Under construction</h2>
<ul>
<li><Link prefetch href="/login"><a>Login</a></Link> - prefetch</li>
<li><Link prefetch href="/about"><a>About</a></Link> - About</li>
</ul>
</Layout>
)
}
}
*/
export default Index;

View File

@ -1,108 +0,0 @@
import React from 'react'
import Router from 'next/router'
import Session from '../lib/session'
export default class extends React.Component {
static async getInitialProps({req}) {
// On the sign in page we always force get the latest session data from the
// server by passing 'true' to getSession. This page is the destination
// page after logging or linking/unlinking accounts so avoids any weird
// edge cases.
const session = new Session({req})
return {session: await session.getSession(true)}
}
async componentDidMount() {
// Get latest session data after rendering on client
// Any page that is specified as the oauth callback should do this
const session = new Session()
this.state = {
username: this.state.username,
password: this.state.password,
session: await session.getSession(true)
}
}
constructor(props) {
super(props)
this.state = {
username: '',
password: '',
session: this.props.session
}
this.handleSubmit = this.handleSubmit.bind(this)
this.handleUsernameChange = this.handleUsernameChange.bind(this)
this.handlePasswordChange = this.handlePasswordChange.bind(this)
}
handleUsernameChange(event) {
this.setState({
username: event.target.value.trim(),
password: this.state.password,
session: this.state.session
})
}
handlePasswordChange(event) {
this.setState({
username: this.state.username,
password: event.target.value.trim(),
session: this.state.session
})
}
async handleSubmit(event) {
event.preventDefault()
const session = new Session()
session.signin(this.state.username, this.state.password)
.then(() => {
this.props.url.push('/');
})
.catch(err => {
// @FIXME Handle error
console.log(err)
})
}
render() {
let signinForm = <div/>
if (this.state.session.user) {
signinForm = (
<div>
<h3>You are signed in</h3>
<p>Name: <strong>{this.state.session.user.name}</strong></p>
</div>
)
} else {
signinForm = (
<div>
<form id="signin" method="post" action="/api/auth/login" onSubmit={this.handleSubmit}>
<input name="_csrf" type="hidden" value={this.state.session.csrfToken}/>
<h3>Sign in with email</h3>
<p>
<label htmlFor="username">Username</label><br/>
<input name="username" type="text" placeholder="j.smith@example.com" id="username" value={this.state.username} onChange={this.handleUsernameChange}/>
</p>
<p>
<label htmlFor="password">Password</label><br/>
<input name="password" type="text" id="password" value={this.state.password} onChange={this.handlePasswordChange}/>
</p>
<p>
<button id="submitButton" type="submit">Sign in</button>
</p>
</form>
</div>
)
}
return (
<div>
<h2>Authentication</h2>
{signinForm}
</div>
)
}
}

15
webui/static/index.css Normal file
View File

@ -0,0 +1,15 @@
body {
margin: 0;
padding: 0;
background: #f1f3f5;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
html {
box-sizing: border-box;
}

View File

@ -241,6 +241,14 @@ babel-generator@6.24.1, babel-generator@^6.24.0, babel-generator@^6.24.1:
source-map "^0.5.0"
trim-right "^1.0.1"
babel-helper-bindify-decorators@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330"
dependencies:
babel-runtime "^6.22.0"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
@ -283,6 +291,15 @@ babel-helper-explode-assignable-expression@^6.24.1:
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-helper-explode-class@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb"
dependencies:
babel-helper-bindify-decorators "^6.24.1"
babel-runtime "^6.22.0"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babel-helper-function-name@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
@ -382,22 +399,56 @@ babel-plugin-react-require@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/babel-plugin-react-require/-/babel-plugin-react-require-3.0.0.tgz#2e4e7b4496b93a654a1c80042276de4e4eeb20e3"
babel-plugin-styled-components@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.1.4.tgz#b0e6d5bb01059bc7ab9118d3d686f6472ee8e91f"
dependencies:
stylis "2.0.0"
babel-plugin-syntax-async-functions@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
babel-plugin-syntax-async-generators@^6.5.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
babel-plugin-syntax-class-constructor-call@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
babel-plugin-syntax-class-properties@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
babel-plugin-syntax-decorators@^6.13.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
babel-plugin-syntax-do-expressions@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d"
babel-plugin-syntax-dynamic-import@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
babel-plugin-syntax-exponentiation-operator@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
babel-plugin-syntax-export-extensions@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
babel-plugin-syntax-flow@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
babel-plugin-syntax-function-bind@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46"
babel-plugin-syntax-jsx@6.18.0, babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
@ -410,7 +461,15 @@ babel-plugin-syntax-trailing-function-commas@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
babel-plugin-transform-async-to-generator@^6.22.0:
babel-plugin-transform-async-generator-functions@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db"
dependencies:
babel-helper-remap-async-to-generator "^6.24.1"
babel-plugin-syntax-async-generators "^6.5.0"
babel-runtime "^6.22.0"
babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
dependencies:
@ -418,7 +477,15 @@ babel-plugin-transform-async-to-generator@^6.22.0:
babel-plugin-syntax-async-functions "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-class-properties@6.24.1:
babel-plugin-transform-class-constructor-call@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9"
dependencies:
babel-plugin-syntax-class-constructor-call "^6.18.0"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-plugin-transform-class-properties@6.24.1, babel-plugin-transform-class-properties@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
dependencies:
@ -427,6 +494,23 @@ babel-plugin-transform-class-properties@6.24.1:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-plugin-transform-decorators@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d"
dependencies:
babel-helper-explode-class "^6.24.1"
babel-plugin-syntax-decorators "^6.13.0"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-types "^6.24.1"
babel-plugin-transform-do-expressions@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb"
dependencies:
babel-plugin-syntax-do-expressions "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-es2015-arrow-functions@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
@ -595,7 +679,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0:
babel-runtime "^6.22.0"
regexpu-core "^2.0.0"
babel-plugin-transform-exponentiation-operator@^6.22.0:
babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
dependencies:
@ -603,6 +687,13 @@ babel-plugin-transform-exponentiation-operator@^6.22.0:
babel-plugin-syntax-exponentiation-operator "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-export-extensions@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
dependencies:
babel-plugin-syntax-export-extensions "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-flow-strip-types@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
@ -610,7 +701,14 @@ babel-plugin-transform-flow-strip-types@^6.22.0:
babel-plugin-syntax-flow "^6.18.0"
babel-runtime "^6.22.0"
babel-plugin-transform-object-rest-spread@6.22.0:
babel-plugin-transform-function-bind@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97"
dependencies:
babel-plugin-syntax-function-bind "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-object-rest-spread@6.22.0, babel-plugin-transform-object-rest-spread@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.22.0.tgz#1d419b55e68d2e4f64a5ff3373bd67d73c8e83bc"
dependencies:
@ -721,6 +819,41 @@ babel-preset-react@6.24.1:
babel-plugin-transform-react-jsx-source "^6.22.0"
babel-preset-flow "^6.23.0"
babel-preset-stage-0@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a"
dependencies:
babel-plugin-transform-do-expressions "^6.22.0"
babel-plugin-transform-function-bind "^6.22.0"
babel-preset-stage-1 "^6.24.1"
babel-preset-stage-1@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0"
dependencies:
babel-plugin-transform-class-constructor-call "^6.24.1"
babel-plugin-transform-export-extensions "^6.22.0"
babel-preset-stage-2 "^6.24.1"
babel-preset-stage-2@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1"
dependencies:
babel-plugin-syntax-dynamic-import "^6.18.0"
babel-plugin-transform-class-properties "^6.24.1"
babel-plugin-transform-decorators "^6.24.1"
babel-preset-stage-3 "^6.24.1"
babel-preset-stage-3@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395"
dependencies:
babel-plugin-syntax-trailing-function-commas "^6.22.0"
babel-plugin-transform-async-generator-functions "^6.24.1"
babel-plugin-transform-async-to-generator "^6.24.1"
babel-plugin-transform-exponentiation-operator "^6.24.1"
babel-plugin-transform-object-rest-spread "^6.22.0"
babel-register@^6.24.0, babel-register@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
@ -852,6 +985,10 @@ boom@2.x.x:
dependencies:
hoek "2.x.x"
bowser@^1.0.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.7.0.tgz#169de4018711f994242bff9a8009e77a1f35e003"
brace-expansion@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
@ -945,6 +1082,13 @@ buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
buffer@^5.0.3:
version "5.0.6"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.6.tgz#2ea669f7eec0b6eda05b08f8b5ff661b28573588"
dependencies:
base64-js "^1.0.2"
ieee754 "^1.1.4"
builtin-modules@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
@ -1177,6 +1321,18 @@ crypto-browserify@^3.11.0:
public-encrypt "^4.0.0"
randombytes "^2.0.0"
css-color-keywords@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
css-to-react-native@^2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.0.4.tgz#cf4cc407558b3474d4ba8be1a2cd3b6ce713101b"
dependencies:
css-color-keywords "^1.0.0"
fbjs "^0.8.5"
postcss-value-parser "^3.3.0"
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@ -1474,7 +1630,7 @@ extsprintf@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
fbjs@^0.8.9:
fbjs@^0.8.5, fbjs@^0.8.9:
version "0.8.12"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04"
dependencies:
@ -1773,6 +1929,10 @@ hoek@2.x.x:
version "2.16.3"
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
hoist-non-react-statics@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb"
home-or-tmp@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
@ -1824,6 +1984,10 @@ https-browserify@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
hyphenate-style-name@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b"
iconv-lite@0.4.15, iconv-lite@~0.4.13:
version "0.4.15"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
@ -1859,6 +2023,13 @@ ini@~1.3.0:
version "1.3.4"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
inline-style-prefixer@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz#c153c7e88fd84fef5c602e95a8168b2770671fe7"
dependencies:
bowser "^1.0.0"
hyphenate-style-name "^1.0.1"
interpret@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
@ -1935,6 +2106,10 @@ is-fullwidth-code-point@^1.0.0:
dependencies:
number-is-nan "^1.0.0"
is-function@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
is-glob@^2.0.0, is-glob@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@ -1963,6 +2138,12 @@ is-path-inside@^1.0.0:
dependencies:
path-is-inside "^1.0.1"
is-plain-object@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.1.tgz#4d7ca539bc9db9b737b8acb612f2318ef92f294f"
dependencies:
isobject "^1.0.0"
is-posix-bracket@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
@ -2013,6 +2194,10 @@ isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
isobject@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-1.0.2.tgz#f0f9b8ce92dd540fa0740882e3835a2e022ec78a"
isobject@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
@ -2518,6 +2703,10 @@ once@^1.3.0, once@^1.3.3:
dependencies:
wrappy "1"
open-color@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/open-color/-/open-color-1.5.1.tgz#f9ffb29add7e62f75577545fa8b38d265f347049"
os-browserify@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f"
@ -2698,6 +2887,10 @@ pkg-up@2.0.0:
dependencies:
find-up "^2.1.0"
postcss-value-parser@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
@ -2730,6 +2923,12 @@ prop-types@15.5.7:
dependencies:
fbjs "^0.8.9"
prop-types@15.5.8:
version "15.5.8"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.8.tgz#6b7b2e141083be38c8595aa51fc55775c7199394"
dependencies:
fbjs "^0.8.9"
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@~15.5.7:
version "15.5.10"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154"
@ -2842,6 +3041,18 @@ react-hot-loader@3.0.0-beta.6:
redbox-react "^1.2.5"
source-map "^0.4.4"
react-icon-base@2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/react-icon-base/-/react-icon-base-2.0.7.tgz#0bd18736bd6ce79ca6d69ce8387a07fb8d4ceffe"
dependencies:
prop-types "15.5.8"
react-icons@^2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-2.2.5.tgz#f942501c21a4cc0456ce2bbee5032c93f6051dcf"
dependencies:
react-icon-base "2.0.7"
react-proxy@^3.0.0-alpha.0:
version "3.0.0-alpha.1"
resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-3.0.0-alpha.1.tgz#4400426bcfa80caa6724c7755695315209fa4b07"
@ -3291,6 +3502,21 @@ strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
styled-components@2.0.0-19:
version "2.0.0-19"
resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-2.0.0-19.tgz#76f666dd40dd7c4194b76e176fd916b9aac96c94"
dependencies:
buffer "^5.0.3"
css-to-react-native "^2.0.3"
fbjs "^0.8.9"
hoist-non-react-statics "^1.2.0"
inline-style-prefixer "^2.0.5"
is-function "^1.0.1"
is-plain-object "^2.0.1"
prop-types "^15.5.4"
stylis "^2.0.0"
supports-color "^3.2.3"
styled-jsx@0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-0.5.7.tgz#2cb02263ffa719b1435a864fdd6c62802ae86669"
@ -3304,11 +3530,15 @@ styled-jsx@0.5.7:
source-map "0.5.6"
string-hash "1.1.1"
stylis@2.0.0, stylis@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/stylis/-/stylis-2.0.0.tgz#6785a6546bd73478799a67d49d67086953b50ad5"
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
supports-color@^3.1.0:
supports-color@^3.1.0, supports-color@^3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
dependencies: