Merge pull request #1114 from 0xProject/feature/instant/redux-styles-container
[instant] Add styles and redux to instant
This commit is contained in:
@@ -51,7 +51,7 @@
|
||||
},
|
||||
{
|
||||
"path": "packages/instant/public/main.bundle.js",
|
||||
"maxSize": "150kB"
|
||||
"maxSize": "350kB"
|
||||
}
|
||||
],
|
||||
"ci": {
|
||||
|
||||
@@ -43,15 +43,19 @@
|
||||
},
|
||||
"homepage": "https://github.com/0xProject/0x-monorepo/packages/instant/README.md",
|
||||
"dependencies": {
|
||||
"@0xproject/connect": "^2.0.4",
|
||||
"@0xproject/asset-buyer": "^2.0.0",
|
||||
"@0xproject/types": "^1.1.4",
|
||||
"@0xproject/typescript-typings": "^2.0.2",
|
||||
"@0xproject/utils": "^1.0.11",
|
||||
"@0xproject/utils": "^2.0.2",
|
||||
"@0xproject/web3-wrapper": "^3.0.3",
|
||||
"ethereum-types": "^1.0.11",
|
||||
"lodash": "^4.17.10",
|
||||
"polished": "^2.2.0",
|
||||
"react": "^16.5.2",
|
||||
"react-dom": "^16.5.2"
|
||||
"react-dom": "^16.5.2",
|
||||
"react-redux": "^5.0.7",
|
||||
"redux": "^4.0.0",
|
||||
"styled-components": "^3.4.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@0xproject/tslint-config": "^1.0.8",
|
||||
@@ -59,8 +63,10 @@
|
||||
"@types/enzyme-adapter-react-16": "^1.0.3",
|
||||
"@types/lodash": "^4.14.116",
|
||||
"@types/node": "*",
|
||||
"@types/react": "16.4.7",
|
||||
"@types/react": "^16.4.16",
|
||||
"@types/react-dom": "^16.0.8",
|
||||
"@types/react-redux": "^6.0.9",
|
||||
"@types/redux": "^3.6.0",
|
||||
"awesome-typescript-loader": "^5.2.1",
|
||||
"copyfiles": "^1.2.0",
|
||||
"enzyme": "^3.6.0",
|
||||
|
||||
@@ -6,6 +6,19 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>0x Instant Dev Environment</title>
|
||||
<script type="text/javascript" src="/main.bundle.js" charset="utf-8"></script>
|
||||
<style>
|
||||
#zeroExInstantContainer {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
47
packages/instant/src/components/amount_input.tsx
Normal file
47
packages/instant/src/components/amount_input.tsx
Normal file
@@ -0,0 +1,47 @@
|
||||
import { BigNumber } from '@0xproject/utils';
|
||||
import * as _ from 'lodash';
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption } from '../style/theme';
|
||||
|
||||
import { Container, Input } from './ui';
|
||||
|
||||
export interface AmountInputProps {
|
||||
fontColor?: ColorOption;
|
||||
fontSize?: string;
|
||||
value?: BigNumber;
|
||||
onChange?: (value?: BigNumber) => void;
|
||||
}
|
||||
|
||||
export class AmountInput extends React.Component<AmountInputProps> {
|
||||
public render(): React.ReactNode {
|
||||
const { fontColor, fontSize, value } = this.props;
|
||||
return (
|
||||
<Container borderBottom="1px solid rgba(255,255,255,0.3)" display="inline-block">
|
||||
<Input
|
||||
fontColor={fontColor}
|
||||
fontSize={fontSize}
|
||||
onChange={this._handleChange}
|
||||
value={!_.isUndefined(value) ? value.toString() : ''}
|
||||
placeholder="0.00"
|
||||
width="2em"
|
||||
/>
|
||||
</Container>
|
||||
);
|
||||
}
|
||||
private readonly _handleChange = (event: React.ChangeEvent<HTMLInputElement>): void => {
|
||||
const value = event.target.value;
|
||||
let bigNumberValue;
|
||||
if (!_.isEmpty(value)) {
|
||||
try {
|
||||
bigNumberValue = new BigNumber(event.target.value);
|
||||
} catch {
|
||||
// We don't want to allow values that can't be a BigNumber, so don't even call onChange.
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!_.isUndefined(this.props.onChange)) {
|
||||
this.props.onChange(bigNumberValue);
|
||||
}
|
||||
};
|
||||
}
|
||||
19
packages/instant/src/components/buy_button.tsx
Normal file
19
packages/instant/src/components/buy_button.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption } from '../style/theme';
|
||||
|
||||
import { Button, Container, Text } from './ui';
|
||||
|
||||
export interface BuyButtonProps {}
|
||||
|
||||
export const BuyButton: React.StatelessComponent<BuyButtonProps> = props => (
|
||||
<Container padding="20px" width="100%">
|
||||
<Button width="100%">
|
||||
<Text fontColor={ColorOption.white} fontWeight={600} fontSize="20px">
|
||||
Buy
|
||||
</Text>
|
||||
</Button>
|
||||
</Container>
|
||||
);
|
||||
|
||||
BuyButton.displayName = 'BuyButton';
|
||||
45
packages/instant/src/components/instant_heading.tsx
Normal file
45
packages/instant/src/components/instant_heading.tsx
Normal file
@@ -0,0 +1,45 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { SelectedAssetAmountInput } from '../containers/selected_asset_amount_input';
|
||||
import { ColorOption } from '../style/theme';
|
||||
|
||||
import { Container, Flex, Text } from './ui';
|
||||
|
||||
export interface InstantHeadingProps {}
|
||||
|
||||
export const InstantHeading: React.StatelessComponent<InstantHeadingProps> = props => (
|
||||
<Container backgroundColor={ColorOption.primaryColor} padding="20px" width="100%" borderRadius="3px 3px 0px 0px">
|
||||
<Container marginBottom="5px">
|
||||
<Text
|
||||
letterSpacing="1px"
|
||||
fontColor={ColorOption.white}
|
||||
opacity={0.7}
|
||||
fontWeight={500}
|
||||
textTransform="uppercase"
|
||||
fontSize="12px"
|
||||
>
|
||||
I want to buy
|
||||
</Text>
|
||||
</Container>
|
||||
<Flex direction="row" justify="space-between">
|
||||
<Container>
|
||||
<SelectedAssetAmountInput fontSize="45px" />
|
||||
<Container display="inline-block" marginLeft="10px">
|
||||
<Text fontSize="45px" fontColor={ColorOption.white} textTransform="uppercase">
|
||||
rep
|
||||
</Text>
|
||||
</Container>
|
||||
</Container>
|
||||
<Flex direction="column" justify="space-between">
|
||||
<Container marginBottom="5px">
|
||||
<Text fontSize="16px" fontColor={ColorOption.white} fontWeight={500}>
|
||||
0 ETH
|
||||
</Text>
|
||||
</Container>
|
||||
<Text fontSize="16px" fontColor={ColorOption.white} opacity={0.7}>
|
||||
$0.00
|
||||
</Text>
|
||||
</Flex>
|
||||
</Flex>
|
||||
</Container>
|
||||
);
|
||||
62
packages/instant/src/components/order_details.tsx
Normal file
62
packages/instant/src/components/order_details.tsx
Normal file
@@ -0,0 +1,62 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption } from '../style/theme';
|
||||
|
||||
import { Container, Flex, Text } from './ui';
|
||||
|
||||
export interface OrderDetailsProps {}
|
||||
|
||||
export const OrderDetails: React.StatelessComponent<OrderDetailsProps> = props => (
|
||||
<Container padding="20px" width="100%">
|
||||
<Container marginBottom="10px">
|
||||
<Text
|
||||
letterSpacing="1px"
|
||||
fontColor={ColorOption.primaryColor}
|
||||
fontWeight={600}
|
||||
textTransform="uppercase"
|
||||
fontSize="14px"
|
||||
>
|
||||
Order Details
|
||||
</Text>
|
||||
</Container>
|
||||
<OrderDetailsRow name="Token Price" primaryValue=".013 ETH" secondaryValue="$24.32" />
|
||||
<OrderDetailsRow name="Fee" primaryValue=".005 ETH" secondaryValue="$1.04" />
|
||||
<OrderDetailsRow name="Total Cost" primaryValue="1.66 ETH" secondaryValue="$589.56" shouldEmphasize={true} />
|
||||
</Container>
|
||||
);
|
||||
|
||||
OrderDetails.displayName = 'OrderDetails';
|
||||
|
||||
export interface OrderDetailsRowProps {
|
||||
name: string;
|
||||
primaryValue: string;
|
||||
secondaryValue: string;
|
||||
shouldEmphasize?: boolean;
|
||||
}
|
||||
|
||||
export const OrderDetailsRow: React.StatelessComponent<OrderDetailsRowProps> = props => {
|
||||
const fontWeight = props.shouldEmphasize ? 700 : 400;
|
||||
return (
|
||||
<Container padding="10px 0px" borderTop="1px dashed" borderColor={ColorOption.feintGrey}>
|
||||
<Flex justify="space-between">
|
||||
<Text fontWeight={fontWeight} fontColor={ColorOption.grey}>
|
||||
{props.name}
|
||||
</Text>
|
||||
<Container>
|
||||
<Container marginRight="3px" display="inline-block">
|
||||
<Text fontColor={ColorOption.lightGrey}>({props.secondaryValue}) </Text>
|
||||
</Container>
|
||||
<Text fontWeight={fontWeight} fontColor={ColorOption.grey}>
|
||||
{props.primaryValue}
|
||||
</Text>
|
||||
</Container>
|
||||
</Flex>
|
||||
</Container>
|
||||
);
|
||||
};
|
||||
|
||||
OrderDetailsRow.defaultProps = {
|
||||
shouldEmphasize: false,
|
||||
};
|
||||
|
||||
OrderDetailsRow.displayName = 'OrderDetailsRow';
|
||||
60
packages/instant/src/components/ui/button.tsx
Normal file
60
packages/instant/src/components/ui/button.tsx
Normal file
@@ -0,0 +1,60 @@
|
||||
import { darken, saturate } from 'polished';
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption, styled } from '../../style/theme';
|
||||
|
||||
export interface ButtonProps {
|
||||
backgroundColor?: ColorOption;
|
||||
borderColor?: ColorOption;
|
||||
width?: string;
|
||||
padding?: string;
|
||||
type?: string;
|
||||
isDisabled?: boolean;
|
||||
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
||||
className?: string;
|
||||
}
|
||||
|
||||
const PlainButton: React.StatelessComponent<ButtonProps> = ({ children, isDisabled, onClick, type, className }) => (
|
||||
<button type={type} className={className} onClick={isDisabled ? undefined : onClick} disabled={isDisabled}>
|
||||
{children}
|
||||
</button>
|
||||
);
|
||||
|
||||
const darkenOnHoverAmount = 0.1;
|
||||
const darkenOnActiveAmount = 0.2;
|
||||
const saturateOnFocusAmount = 0.2;
|
||||
export const Button = styled(PlainButton)`
|
||||
cursor: ${props => (props.isDisabled ? 'default' : 'pointer')};
|
||||
transition: background-color, opacity 0.5s ease;
|
||||
padding: ${props => props.padding};
|
||||
border-radius: 3px;
|
||||
outline: none;
|
||||
width: ${props => props.width};
|
||||
background-color: ${props => (props.backgroundColor ? props.theme[props.backgroundColor] : 'none')};
|
||||
border: ${props => (props.borderColor ? `1px solid ${props.theme[props.borderColor]}` : 'none')};
|
||||
&:hover {
|
||||
background-color: ${props =>
|
||||
!props.isDisabled
|
||||
? darken(darkenOnHoverAmount, props.theme[props.backgroundColor || 'white'])
|
||||
: ''} !important;
|
||||
}
|
||||
&:active {
|
||||
background-color: ${props =>
|
||||
!props.isDisabled ? darken(darkenOnActiveAmount, props.theme[props.backgroundColor || 'white']) : ''};
|
||||
}
|
||||
&:disabled {
|
||||
opacity: 0.5;
|
||||
}
|
||||
&:focus {
|
||||
background-color: ${props => saturate(saturateOnFocusAmount, props.theme[props.backgroundColor || 'white'])};
|
||||
}
|
||||
`;
|
||||
|
||||
Button.defaultProps = {
|
||||
backgroundColor: ColorOption.primaryColor,
|
||||
width: 'auto',
|
||||
isDisabled: false,
|
||||
padding: '1em 2.2em',
|
||||
};
|
||||
|
||||
Button.displayName = 'Button';
|
||||
64
packages/instant/src/components/ui/container.tsx
Normal file
64
packages/instant/src/components/ui/container.tsx
Normal file
@@ -0,0 +1,64 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption, styled } from '../../style/theme';
|
||||
import { cssRuleIfExists } from '../../style/util';
|
||||
|
||||
export interface ContainerProps {
|
||||
display?: string;
|
||||
position?: string;
|
||||
top?: string;
|
||||
right?: string;
|
||||
bottom?: string;
|
||||
left?: string;
|
||||
width?: string;
|
||||
maxWidth?: string;
|
||||
margin?: string;
|
||||
marginTop?: string;
|
||||
marginRight?: string;
|
||||
marginBottom?: string;
|
||||
marginLeft?: string;
|
||||
padding?: string;
|
||||
borderRadius?: string;
|
||||
border?: string;
|
||||
borderColor?: ColorOption;
|
||||
borderTop?: string;
|
||||
borderBottom?: string;
|
||||
className?: string;
|
||||
backgroundColor?: ColorOption;
|
||||
hasBoxShadow?: boolean;
|
||||
}
|
||||
|
||||
const PlainContainer: React.StatelessComponent<ContainerProps> = ({ children, className }) => (
|
||||
<div className={className}>{children}</div>
|
||||
);
|
||||
|
||||
export const Container = styled(PlainContainer)`
|
||||
box-sizing: border-box;
|
||||
${props => cssRuleIfExists(props, 'display')}
|
||||
${props => cssRuleIfExists(props, 'position')}
|
||||
${props => cssRuleIfExists(props, 'top')}
|
||||
${props => cssRuleIfExists(props, 'right')}
|
||||
${props => cssRuleIfExists(props, 'bottom')}
|
||||
${props => cssRuleIfExists(props, 'left')}
|
||||
${props => cssRuleIfExists(props, 'width')}
|
||||
${props => cssRuleIfExists(props, 'max-width')}
|
||||
${props => cssRuleIfExists(props, 'margin')}
|
||||
${props => cssRuleIfExists(props, 'margin-top')}
|
||||
${props => cssRuleIfExists(props, 'margin-right')}
|
||||
${props => cssRuleIfExists(props, 'margin-bottom')}
|
||||
${props => cssRuleIfExists(props, 'margin-left')}
|
||||
${props => cssRuleIfExists(props, 'padding')}
|
||||
${props => cssRuleIfExists(props, 'border-radius')}
|
||||
${props => cssRuleIfExists(props, 'border')}
|
||||
${props => cssRuleIfExists(props, 'border-top')}
|
||||
${props => cssRuleIfExists(props, 'border-bottom')}
|
||||
${props => (props.hasBoxShadow ? `box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1)` : '')};
|
||||
background-color: ${props => (props.backgroundColor ? props.theme[props.backgroundColor] : 'none')};
|
||||
border-color: ${props => (props.borderColor ? props.theme[props.borderColor] : 'none')};
|
||||
`;
|
||||
|
||||
Container.defaultProps = {
|
||||
display: 'block',
|
||||
};
|
||||
|
||||
Container.displayName = 'Container';
|
||||
37
packages/instant/src/components/ui/flex.tsx
Normal file
37
packages/instant/src/components/ui/flex.tsx
Normal file
@@ -0,0 +1,37 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption, styled } from '../../style/theme';
|
||||
import { cssRuleIfExists } from '../../style/util';
|
||||
|
||||
export interface FlexProps {
|
||||
direction?: 'row' | 'column';
|
||||
flexWrap?: 'wrap' | 'nowrap';
|
||||
justify?: 'flex-start' | 'center' | 'space-around' | 'space-between' | 'space-evenly' | 'flex-end';
|
||||
align?: 'flex-start' | 'center' | 'space-around' | 'space-between' | 'space-evenly' | 'flex-end';
|
||||
width?: string;
|
||||
backgroundColor?: ColorOption;
|
||||
className?: string;
|
||||
}
|
||||
|
||||
const PlainFlex: React.StatelessComponent<FlexProps> = ({ children, className }) => (
|
||||
<div className={className}>{children}</div>
|
||||
);
|
||||
|
||||
export const Flex = styled(PlainFlex)`
|
||||
display: flex;
|
||||
flex-direction: ${props => props.direction};
|
||||
flex-wrap: ${props => props.flexWrap};
|
||||
justify-content: ${props => props.justify};
|
||||
align-items: ${props => props.align};
|
||||
${props => cssRuleIfExists(props, 'width')}
|
||||
background-color: ${props => (props.backgroundColor ? props.theme[props.backgroundColor] : 'none')};
|
||||
`;
|
||||
|
||||
Flex.defaultProps = {
|
||||
direction: 'row',
|
||||
flexWrap: 'nowrap',
|
||||
justify: 'center',
|
||||
align: 'center',
|
||||
};
|
||||
|
||||
Flex.displayName = 'Flex';
|
||||
5
packages/instant/src/components/ui/index.ts
Normal file
5
packages/instant/src/components/ui/index.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export { Text, Title } from './text';
|
||||
export { Button } from './button';
|
||||
export { Flex } from './flex';
|
||||
export { Container } from './container';
|
||||
export { Input } from './input';
|
||||
40
packages/instant/src/components/ui/input.tsx
Normal file
40
packages/instant/src/components/ui/input.tsx
Normal file
@@ -0,0 +1,40 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption, styled } from '../../style/theme';
|
||||
|
||||
export interface InputProps {
|
||||
className?: string;
|
||||
value?: string;
|
||||
width?: string;
|
||||
fontSize?: string;
|
||||
fontColor?: ColorOption;
|
||||
placeholder?: string;
|
||||
onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
||||
}
|
||||
|
||||
const PlainInput: React.StatelessComponent<InputProps> = ({ value, className, placeholder, onChange }) => (
|
||||
<input className={className} value={value} onChange={onChange} placeholder={placeholder} />
|
||||
);
|
||||
|
||||
export const Input = styled(PlainInput)`
|
||||
font-size: ${props => props.fontSize};
|
||||
width: ${props => props.width};
|
||||
padding: 0.1em 0em;
|
||||
font-family: 'Inter UI';
|
||||
color: ${props => props.theme[props.fontColor || 'white']};
|
||||
background: transparent;
|
||||
outline: none;
|
||||
border: none;
|
||||
&::placeholder {
|
||||
color: ${props => props.theme[props.fontColor || 'white']};
|
||||
opacity: 0.5;
|
||||
}
|
||||
`;
|
||||
|
||||
Input.defaultProps = {
|
||||
width: 'auto',
|
||||
fontColor: ColorOption.white,
|
||||
fontSize: '12px',
|
||||
};
|
||||
|
||||
Input.displayName = 'Input';
|
||||
80
packages/instant/src/components/ui/text.tsx
Normal file
80
packages/instant/src/components/ui/text.tsx
Normal file
@@ -0,0 +1,80 @@
|
||||
import { darken } from 'polished';
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption, styled } from '../../style/theme';
|
||||
|
||||
export interface TextProps {
|
||||
fontColor?: ColorOption;
|
||||
fontFamily?: string;
|
||||
fontStyle?: string;
|
||||
fontSize?: string;
|
||||
opacity?: number;
|
||||
letterSpacing?: string;
|
||||
textTransform?: string;
|
||||
lineHeight?: string;
|
||||
className?: string;
|
||||
minHeight?: string;
|
||||
center?: boolean;
|
||||
fontWeight?: number | string;
|
||||
textDecorationLine?: string;
|
||||
onClick?: (event: React.MouseEvent<HTMLElement>) => void;
|
||||
hoverColor?: string;
|
||||
noWrap?: boolean;
|
||||
display?: string;
|
||||
}
|
||||
|
||||
const PlainText: React.StatelessComponent<TextProps> = ({ children, className, onClick }) => (
|
||||
<div className={className} onClick={onClick}>
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
|
||||
const darkenOnHoverAmount = 0.3;
|
||||
export const Text = styled(PlainText)`
|
||||
font-family: ${props => props.fontFamily};
|
||||
font-style: ${props => props.fontStyle};
|
||||
font-weight: ${props => props.fontWeight};
|
||||
font-size: ${props => props.fontSize};
|
||||
opacity: ${props => props.opacity};
|
||||
text-decoration-line: ${props => props.textDecorationLine};
|
||||
${props => (props.lineHeight ? `line-height: ${props.lineHeight}` : '')};
|
||||
${props => (props.center ? 'text-align: center' : '')};
|
||||
color: ${props => props.fontColor && props.theme[props.fontColor]};
|
||||
${props => (props.minHeight ? `min-height: ${props.minHeight}` : '')};
|
||||
${props => (props.onClick ? 'cursor: pointer' : '')};
|
||||
transition: color 0.5s ease;
|
||||
${props => (props.noWrap ? 'white-space: nowrap' : '')};
|
||||
${props => (props.display ? `display: ${props.display}` : '')};
|
||||
${props => (props.letterSpacing ? `letter-spacing: ${props.letterSpacing}` : '')};
|
||||
${props => (props.textTransform ? `text-transform: ${props.textTransform}` : '')};
|
||||
&:hover {
|
||||
${props =>
|
||||
props.onClick
|
||||
? `color: ${props.hoverColor || darken(darkenOnHoverAmount, props.theme[props.fontColor || 'white'])}`
|
||||
: ''};
|
||||
}
|
||||
`;
|
||||
|
||||
Text.defaultProps = {
|
||||
fontFamily: 'Inter UI',
|
||||
fontStyle: 'normal',
|
||||
fontWeight: 400,
|
||||
fontColor: ColorOption.black,
|
||||
fontSize: '15px',
|
||||
textDecorationLine: 'none',
|
||||
noWrap: false,
|
||||
display: 'inline-block',
|
||||
};
|
||||
|
||||
Text.displayName = 'Text';
|
||||
|
||||
export const Title: React.StatelessComponent<TextProps> = props => <Text {...props} />;
|
||||
|
||||
Title.defaultProps = {
|
||||
fontSize: '20px',
|
||||
fontWeight: 600,
|
||||
opacity: 1,
|
||||
fontColor: ColorOption.primaryColor,
|
||||
};
|
||||
|
||||
Title.displayName = 'Title';
|
||||
@@ -1,5 +1,20 @@
|
||||
import * as React from 'react';
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
import { store } from '../redux/store';
|
||||
import { fonts } from '../style/fonts';
|
||||
import { theme, ThemeProvider } from '../style/theme';
|
||||
|
||||
import { ZeroExInstantContainer } from './zero_ex_instant_container';
|
||||
|
||||
fonts.include();
|
||||
|
||||
export interface ZeroExInstantProps {}
|
||||
|
||||
export const ZeroExInstant: React.StatelessComponent<ZeroExInstantProps> = () => <div>ZeroExInstant</div>;
|
||||
export const ZeroExInstant: React.StatelessComponent<ZeroExInstantProps> = () => (
|
||||
<Provider store={store}>
|
||||
<ThemeProvider theme={theme}>
|
||||
<ZeroExInstantContainer />
|
||||
</ThemeProvider>
|
||||
</Provider>
|
||||
);
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
import * as React from 'react';
|
||||
|
||||
import { ColorOption } from '../style/theme';
|
||||
|
||||
import { BuyButton } from './buy_button';
|
||||
import { InstantHeading } from './instant_heading';
|
||||
import { OrderDetails } from './order_details';
|
||||
import { Container, Flex } from './ui';
|
||||
|
||||
export interface ZeroExInstantContainerProps {}
|
||||
|
||||
export const ZeroExInstantContainer: React.StatelessComponent<ZeroExInstantContainerProps> = props => (
|
||||
<Container hasBoxShadow={true} width="350px" backgroundColor={ColorOption.white} borderRadius="3px">
|
||||
<Flex direction="column" justify="flex-start">
|
||||
<InstantHeading />
|
||||
<OrderDetails />
|
||||
<BuyButton />
|
||||
</Flex>
|
||||
</Container>
|
||||
);
|
||||
@@ -0,0 +1,36 @@
|
||||
import { BigNumber } from '@0xproject/utils';
|
||||
import * as React from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { Dispatch } from 'redux';
|
||||
|
||||
import { State } from '../redux/reducer';
|
||||
import { ColorOption } from '../style/theme';
|
||||
import { Action, ActionTypes } from '../types';
|
||||
|
||||
import { AmountInput } from '../components/amount_input';
|
||||
|
||||
export interface SelectedAssetAmountInputProps {
|
||||
fontColor?: ColorOption;
|
||||
fontSize?: string;
|
||||
}
|
||||
|
||||
interface ConnectedState {
|
||||
value?: BigNumber;
|
||||
}
|
||||
|
||||
interface ConnectedDispatch {
|
||||
onChange?: (value?: BigNumber) => void;
|
||||
}
|
||||
|
||||
const mapStateToProps = (state: State, _ownProps: SelectedAssetAmountInputProps): ConnectedState => ({
|
||||
value: state.selectedAssetAmount,
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch: Dispatch<Action>): ConnectedDispatch => ({
|
||||
onChange: value => dispatch({ type: ActionTypes.UPDATE_SELECTED_ASSET_AMOUNT, data: value }),
|
||||
});
|
||||
|
||||
export const SelectedAssetAmountInput: React.ComponentClass<SelectedAssetAmountInputProps> = connect(
|
||||
mapStateToProps,
|
||||
mapDispatchToProps,
|
||||
)(AmountInput);
|
||||
31
packages/instant/src/redux/reducer.ts
Normal file
31
packages/instant/src/redux/reducer.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { BigNumber } from '@0xproject/utils';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
import { Action, ActionTypes } from '../types';
|
||||
|
||||
export interface State {
|
||||
ethUsdPrice?: string;
|
||||
selectedAssetAmount?: BigNumber;
|
||||
}
|
||||
|
||||
export const INITIAL_STATE: State = {
|
||||
ethUsdPrice: undefined,
|
||||
selectedAssetAmount: undefined,
|
||||
};
|
||||
|
||||
export const reducer = (state: State = INITIAL_STATE, action: Action): State => {
|
||||
switch (action.type) {
|
||||
case ActionTypes.UPDATE_ETH_USD_PRICE:
|
||||
return {
|
||||
...state,
|
||||
ethUsdPrice: action.data,
|
||||
};
|
||||
case ActionTypes.UPDATE_SELECTED_ASSET_AMOUNT:
|
||||
return {
|
||||
...state,
|
||||
selectedAssetAmount: action.data,
|
||||
};
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
};
|
||||
6
packages/instant/src/redux/store.ts
Normal file
6
packages/instant/src/redux/store.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import * as _ from 'lodash';
|
||||
import { createStore, Store as ReduxStore } from 'redux';
|
||||
|
||||
import { reducer, State } from './reducer';
|
||||
|
||||
export const store: ReduxStore<State> = createStore(reducer);
|
||||
10
packages/instant/src/style/fonts.ts
Normal file
10
packages/instant/src/style/fonts.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { injectGlobal } from './theme';
|
||||
|
||||
export const fonts = {
|
||||
include: () => {
|
||||
// Inject the inter-ui font into the page
|
||||
return injectGlobal`
|
||||
@import url('https://rsms.me/inter/inter-ui.css');
|
||||
`;
|
||||
},
|
||||
};
|
||||
27
packages/instant/src/style/theme.ts
Normal file
27
packages/instant/src/style/theme.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import * as styledComponents from 'styled-components';
|
||||
|
||||
const { default: styled, css, injectGlobal, keyframes, ThemeProvider } = styledComponents;
|
||||
|
||||
export type Theme = { [key in ColorOption]: string };
|
||||
|
||||
export enum ColorOption {
|
||||
primaryColor = 'primaryColor',
|
||||
black = 'black',
|
||||
lightGrey = 'lightGrey',
|
||||
grey = 'grey',
|
||||
feintGrey = 'feintGrey',
|
||||
darkGrey = 'darkGrey',
|
||||
white = 'white',
|
||||
}
|
||||
|
||||
export const theme: Theme = {
|
||||
primaryColor: '#512D80',
|
||||
black: 'black',
|
||||
lightGrey: '#999999',
|
||||
grey: '#666666',
|
||||
feintGrey: '#DEDEDE',
|
||||
darkGrey: '#333333',
|
||||
white: 'white',
|
||||
};
|
||||
|
||||
export { styled, css, injectGlobal, keyframes, ThemeProvider };
|
||||
11
packages/instant/src/style/util.ts
Normal file
11
packages/instant/src/style/util.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { ObjectMap } from '@0xproject/types';
|
||||
import * as _ from 'lodash';
|
||||
|
||||
export const cssRuleIfExists = (props: ObjectMap<any>, rule: string): string => {
|
||||
const camelCaseRule = _.camelCase(rule);
|
||||
const ruleValueIfExists = props[camelCaseRule];
|
||||
if (!_.isUndefined(ruleValueIfExists)) {
|
||||
return `${rule}: ${ruleValueIfExists};`;
|
||||
}
|
||||
return '';
|
||||
};
|
||||
9
packages/instant/src/types.ts
Normal file
9
packages/instant/src/types.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
export enum ActionTypes {
|
||||
UPDATE_ETH_USD_PRICE,
|
||||
UPDATE_SELECTED_ASSET_AMOUNT,
|
||||
}
|
||||
|
||||
export interface Action {
|
||||
type: ActionTypes;
|
||||
data?: any;
|
||||
}
|
||||
@@ -1,3 +1,7 @@
|
||||
{
|
||||
"extends": ["@0xproject/tslint-config"]
|
||||
"extends": ["@0xproject/tslint-config"],
|
||||
"rules": {
|
||||
"custom-no-magic-numbers": false,
|
||||
"semicolon": [true, "always", "ignore-bound-class-methods"]
|
||||
}
|
||||
}
|
||||
|
||||
156
yarn.lock
156
yarn.lock
@@ -528,22 +528,6 @@
|
||||
sinon "^4.0.0"
|
||||
websocket "^1.0.25"
|
||||
|
||||
"@0xproject/connect@^2.0.4":
|
||||
version "2.0.4"
|
||||
resolved "https://registry.npmjs.org/@0xproject/connect/-/connect-2.0.4.tgz#d61cd382edbb80120c8efce91dc85d2c668a5c5e"
|
||||
dependencies:
|
||||
"@0xproject/assert" "^1.0.11"
|
||||
"@0xproject/json-schemas" "^1.0.4"
|
||||
"@0xproject/order-utils" "^1.0.5"
|
||||
"@0xproject/types" "^1.1.1"
|
||||
"@0xproject/typescript-typings" "^2.0.2"
|
||||
"@0xproject/utils" "^1.0.11"
|
||||
lodash "^4.17.5"
|
||||
query-string "^5.0.1"
|
||||
sinon "^4.0.0"
|
||||
uuid "^3.3.2"
|
||||
websocket "^1.0.25"
|
||||
|
||||
"@0xproject/contract-wrappers@^0.1.1":
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@0xproject/contract-wrappers/-/contract-wrappers-0.1.1.tgz#8108d7ec051f202ef0cfa77c91c4ef994bf89881"
|
||||
@@ -716,7 +700,7 @@
|
||||
lodash "4.17.10"
|
||||
web3 "0.20.6"
|
||||
|
||||
"@0xproject/utils@^1.0.11", "@0xproject/utils@^1.0.4":
|
||||
"@0xproject/utils@^1.0.4":
|
||||
version "1.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@0xproject/utils/-/utils-1.0.11.tgz#5b53e7d9d4dbe68e219049218c9db04e97c37429"
|
||||
dependencies:
|
||||
@@ -1219,6 +1203,13 @@
|
||||
"@types/react" "*"
|
||||
redux "^3.6.0"
|
||||
|
||||
"@types/react-redux@^6.0.9":
|
||||
version "6.0.9"
|
||||
resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-6.0.9.tgz#96aa7f5b0716bcc3bfb36ceaa1223118d509f79a"
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
redux "^4.0.0"
|
||||
|
||||
"@types/react-router-dom@^4.0.4":
|
||||
version "4.2.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.2.6.tgz#9f7eb3c0e6661a9607d878ff8675cc4ea95cd276"
|
||||
@@ -1250,16 +1241,11 @@
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react@*":
|
||||
version "16.3.13"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.3.13.tgz#47d466462b774556c1174ea0eda22c0578643362"
|
||||
dependencies:
|
||||
csstype "^2.2.0"
|
||||
|
||||
"@types/react@16.4.7":
|
||||
version "16.4.7"
|
||||
resolved "https://registry.npmjs.org/@types/react/-/react-16.4.7.tgz#f33f6d759a7e1833befa15224d68942d178a5a3f"
|
||||
"@types/react@*", "@types/react@^16.4.16":
|
||||
version "16.4.16"
|
||||
resolved "https://registry.npmjs.org/@types/react/-/react-16.4.16.tgz#99f91b1200ae8c2062030402006d3b3c3a177043"
|
||||
dependencies:
|
||||
"@types/prop-types" "*"
|
||||
csstype "^2.2.0"
|
||||
|
||||
"@types/react@^16.4.2":
|
||||
@@ -1700,7 +1686,7 @@ ansi-styles@^2.2.1:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
|
||||
|
||||
ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1:
|
||||
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
|
||||
dependencies:
|
||||
@@ -2027,19 +2013,6 @@ aws4@^1.8.0:
|
||||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
|
||||
|
||||
axios@0.15.3:
|
||||
version "0.15.3"
|
||||
resolved "http://registry.npmjs.org/axios/-/axios-0.15.3.tgz#2c9d638b2e191a08ea1d6cc988eadd6ba5bdc053"
|
||||
dependencies:
|
||||
follow-redirects "1.0.0"
|
||||
|
||||
axios@^0.17.0:
|
||||
version "0.17.1"
|
||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d"
|
||||
dependencies:
|
||||
follow-redirects "^1.2.5"
|
||||
is-buffer "^1.1.5"
|
||||
|
||||
axios@^0.18.0:
|
||||
version "0.18.0"
|
||||
resolved "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102"
|
||||
@@ -2920,13 +2893,6 @@ brorand@^1.0.1:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
|
||||
|
||||
brotli-size@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/brotli-size/-/brotli-size-0.0.1.tgz#8c1aeea01cd22f359b048951185bd539ff0c829f"
|
||||
dependencies:
|
||||
duplexer "^0.1.1"
|
||||
iltorb "^1.0.9"
|
||||
|
||||
browser-process-hrtime@^0.1.2:
|
||||
version "0.1.3"
|
||||
resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4"
|
||||
@@ -3142,21 +3108,6 @@ builtins@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "http://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
|
||||
|
||||
bundlesize@^0.17.0:
|
||||
version "0.17.0"
|
||||
resolved "https://registry.yarnpkg.com/bundlesize/-/bundlesize-0.17.0.tgz#212ae5731ab0554d2acd509d23e1de18640b2008"
|
||||
dependencies:
|
||||
axios "^0.17.0"
|
||||
brotli-size "0.0.1"
|
||||
bytes "^3.0.0"
|
||||
ci-env "^1.4.0"
|
||||
commander "^2.11.0"
|
||||
github-build "^1.2.0"
|
||||
glob "^7.1.2"
|
||||
gzip-size "^4.0.0"
|
||||
prettycli "^1.4.3"
|
||||
read-pkg-up "^3.0.0"
|
||||
|
||||
bundlewatch@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/bundlewatch/-/bundlewatch-0.2.1.tgz#3bf5279f49c098c7b27c31f7c172397154eb2e65"
|
||||
@@ -3385,14 +3336,6 @@ chain-function@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
|
||||
|
||||
chalk@2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e"
|
||||
dependencies:
|
||||
ansi-styles "^3.1.0"
|
||||
escape-string-regexp "^1.0.5"
|
||||
supports-color "^4.0.0"
|
||||
|
||||
chalk@2.3.2:
|
||||
version "2.3.2"
|
||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
|
||||
@@ -3549,10 +3492,6 @@ chrome-trace-event@^1.0.0:
|
||||
dependencies:
|
||||
tslib "^1.9.0"
|
||||
|
||||
ci-env@^1.4.0:
|
||||
version "1.6.1"
|
||||
resolved "https://registry.yarnpkg.com/ci-env/-/ci-env-1.6.1.tgz#3e3ef4fc528a2825397f912cfa30cde17ec364cc"
|
||||
|
||||
ci-info@^1.0.0:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2"
|
||||
@@ -3829,10 +3768,6 @@ commander@2.15.1, commander@^2.12.1, commander@^2.8.1:
|
||||
version "2.15.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
||||
|
||||
commander@^2.11.0:
|
||||
version "2.18.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970"
|
||||
|
||||
commander@^2.15.1:
|
||||
version "2.19.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
|
||||
@@ -4762,10 +4697,6 @@ detect-indent@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "http://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
|
||||
|
||||
detect-libc@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-0.2.0.tgz#47fdf567348a17ec25fcbf0b9e446348a76f9fb5"
|
||||
|
||||
detect-libc@^1.0.2, detect-libc@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
|
||||
@@ -6238,13 +6169,7 @@ flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
|
||||
inherits "^2.0.1"
|
||||
readable-stream "^2.0.4"
|
||||
|
||||
follow-redirects@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "http://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz#8e34298cbd2e176f254effec75a1c78cc849fd37"
|
||||
dependencies:
|
||||
debug "^2.2.0"
|
||||
|
||||
follow-redirects@^1.2.5, follow-redirects@^1.3.0:
|
||||
follow-redirects@^1.3.0:
|
||||
version "1.5.8"
|
||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.8.tgz#1dbfe13e45ad969f813e86c00e5296f525c885a1"
|
||||
dependencies:
|
||||
@@ -6654,12 +6579,6 @@ gitconfiglocal@^1.0.0:
|
||||
dependencies:
|
||||
ini "^1.3.2"
|
||||
|
||||
github-build@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/github-build/-/github-build-1.2.0.tgz#b0bdb705ae4088218577e863c1a301030211051f"
|
||||
dependencies:
|
||||
axios "0.15.3"
|
||||
|
||||
github-from-package@0.0.0:
|
||||
version "0.0.0"
|
||||
resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
|
||||
@@ -7441,15 +7360,6 @@ ignore@^3.3.5:
|
||||
version "3.3.7"
|
||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
|
||||
|
||||
iltorb@^1.0.9:
|
||||
version "1.3.10"
|
||||
resolved "https://registry.yarnpkg.com/iltorb/-/iltorb-1.3.10.tgz#a0d9e4e7d52bf510741442236cbe0cc4230fc9f8"
|
||||
dependencies:
|
||||
detect-libc "^0.2.0"
|
||||
nan "^2.6.2"
|
||||
node-gyp "^3.6.2"
|
||||
prebuild-install "^2.3.0"
|
||||
|
||||
image-size@~0.5.0:
|
||||
version "0.5.5"
|
||||
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
|
||||
@@ -11295,6 +11205,12 @@ polished@^1.9.3:
|
||||
version "1.9.3"
|
||||
resolved "https://registry.npmjs.org/polished/-/polished-1.9.3.tgz#d61b8a0c4624efe31e2583ff24a358932b6b75e1"
|
||||
|
||||
polished@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.npmjs.org/polished/-/polished-2.2.0.tgz#5ca7e178cc5352bd7fd1efc45342f7c6d59cc982"
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.0.0"
|
||||
|
||||
popper.js@1.14.3, popper.js@^1.14.1:
|
||||
version "1.14.3"
|
||||
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095"
|
||||
@@ -11668,7 +11584,7 @@ postman-url-encoder@1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/postman-url-encoder/-/postman-url-encoder-1.0.1.tgz#a094a42e9415ff0bbfdce0eaa8e6011d449ee83c"
|
||||
|
||||
prebuild-install@^2.2.2, prebuild-install@^2.3.0:
|
||||
prebuild-install@^2.2.2:
|
||||
version "2.5.3"
|
||||
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.5.3.tgz#9f65f242782d370296353710e9bc843490c19f69"
|
||||
dependencies:
|
||||
@@ -11739,12 +11655,6 @@ pretty-ms@3.1.0:
|
||||
parse-ms "^1.0.0"
|
||||
plur "^2.1.2"
|
||||
|
||||
prettycli@^1.4.3:
|
||||
version "1.4.3"
|
||||
resolved "https://registry.yarnpkg.com/prettycli/-/prettycli-1.4.3.tgz#b28ec2aad9de07ae1fd75ef294fb54cbdee07ed5"
|
||||
dependencies:
|
||||
chalk "2.1.0"
|
||||
|
||||
prismjs@^1.15.0:
|
||||
version "1.15.0"
|
||||
resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9"
|
||||
@@ -12247,7 +12157,7 @@ react-popper@^1.0.0-beta.6:
|
||||
typed-styles "^0.0.5"
|
||||
warning "^3.0.0"
|
||||
|
||||
react-redux@^5.0.3:
|
||||
react-redux@^5.0.3, react-redux@^5.0.7:
|
||||
version "5.0.7"
|
||||
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8"
|
||||
dependencies:
|
||||
@@ -12600,7 +12510,7 @@ redux-devtools-extension@^2.13.2:
|
||||
version "2.13.2"
|
||||
resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.2.tgz#e0f9a8e8dfca7c17be92c7124958a3b94eb2911d"
|
||||
|
||||
redux@*:
|
||||
redux@*, redux@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.0.tgz#aa698a92b729315d22b34a0553d7e6533555cc03"
|
||||
dependencies:
|
||||
@@ -14170,6 +14080,20 @@ styled-components@^3.3.3:
|
||||
stylis-rule-sheet "^0.0.10"
|
||||
supports-color "^3.2.3"
|
||||
|
||||
styled-components@^3.4.9:
|
||||
version "3.4.10"
|
||||
resolved "https://registry.npmjs.org/styled-components/-/styled-components-3.4.10.tgz#9a654c50ea2b516c36ade57ddcfa296bf85c96e1"
|
||||
dependencies:
|
||||
buffer "^5.0.3"
|
||||
css-to-react-native "^2.0.3"
|
||||
fbjs "^0.8.16"
|
||||
hoist-non-react-statics "^2.5.0"
|
||||
prop-types "^15.5.4"
|
||||
react-is "^16.3.1"
|
||||
stylis "^3.5.0"
|
||||
stylis-rule-sheet "^0.0.10"
|
||||
supports-color "^3.2.3"
|
||||
|
||||
stylis-rule-sheet@^0.0.10:
|
||||
version "0.0.10"
|
||||
resolved "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430"
|
||||
@@ -14200,12 +14124,6 @@ supports-color@^3.1.0, supports-color@^3.1.2, supports-color@^3.2.3:
|
||||
dependencies:
|
||||
has-flag "^1.0.0"
|
||||
|
||||
supports-color@^4.0.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
|
||||
dependencies:
|
||||
has-flag "^2.0.0"
|
||||
|
||||
supports-color@^5.5.0:
|
||||
version "5.5.0"
|
||||
resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
|
||||
|
||||
Reference in New Issue
Block a user