Merge pull request #2026 from 0xProject/feature/what_is_0x_video_embed

Add sandwich video to landing page
This commit is contained in:
Francesco Agosti
2019-08-01 14:27:30 -07:00
committed by GitHub
10 changed files with 724 additions and 62 deletions

View File

@@ -46,13 +46,13 @@
"ethereumjs-util": "^5.1.1",
"find-versions": "^2.0.0",
"is-mobile": "^0.2.2",
"valid-url": "^1.0.9",
"jsonschema": "^1.2.0",
"less": "^2.7.2",
"lodash": "^4.17.11",
"material-ui": "^0.20.0",
"moment": "2.21.0",
"moment-precise-range-plugin": "^1.3.0",
"node-sass": "^4.12.0",
"numeral": "^2.0.6",
"polished": "^1.9.2",
"query-string": "^6.0.0",
@@ -75,15 +75,18 @@
"react-scrollable-anchor": "^0.6.1",
"react-syntax-highlighter": "^10.1.1",
"react-tooltip": "^3.2.7",
"react-transition-group": "^4.2.1",
"react-typist": "^2.0.4",
"redux": "^3.6.0",
"redux-devtools-extension": "^2.13.2",
"rollbar": "^2.4.7",
"semver-sort": "0.0.4",
"sass-loader": "^7.1.0",
"semver": "5.5.0",
"semver-sort": "0.0.4",
"styled-components": "^4.1.1",
"thenby": "^1.2.3",
"truffle-contract": "2.0.1",
"valid-url": "^1.0.9",
"web3-provider-engine": "14.0.6",
"xml-js": "^1.6.4"
},
@@ -94,7 +97,6 @@
"@types/deep-equal": "^1.0.0",
"@types/find-versions": "^2.0.0",
"@types/is-mobile": "0.3.0",
"@types/valid-url": "^1.0.2",
"@types/jsonschema": "^1.1.1",
"@types/lodash": "4.14.104",
"@types/material-ui": "^0.20.0",
@@ -110,7 +112,9 @@
"@types/react-scroll": "1.5.3",
"@types/react-syntax-highlighter": "^0.0.8",
"@types/react-tap-event-plugin": "0.0.30",
"@types/react-transition-group": "^4.2.0",
"@types/redux": "^3.6.0",
"@types/valid-url": "^1.0.2",
"@types/web3-provider-engine": "^14.0.0",
"awesome-typescript-loader": "^5.2.1",
"css-loader": "0.23.x",

View File

@@ -0,0 +1,134 @@
$animation-speed: 0.3s;
$animation-function: ease-out;
$backdrop-color: rgba(0, 0, 0, 0.5);
@keyframes modal-video {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes modal-video-inner {
from {
transform: translate(0, 100px);
}
to {
transform: translate(0, 0);
}
}
.modal-video {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: $backdrop-color;
z-index: 1000000;
cursor: pointer;
opacity: 1;
animation-timing-function: $animation-function;
animation-duration: $animation-speed;
animation-name: modal-video;
-webkit-transition: opacity $animation-speed $animation-function;
-moz-transition: opacity $animation-speed $animation-function;
-ms-transition: opacity $animation-speed $animation-function;
-o-transition: opacity $animation-speed $animation-function;
transition: opacity $animation-speed $animation-function;
}
.modal-video-effect-exit {
opacity: 0;
& .modal-video-movie-wrap {
-webkit-transform: translate(0, 100px);
-moz-transform: translate(0, 100px);
-ms-transform: translate(0, 100px);
-o-transform: translate(0, 100px);
transform: translate(0, 100px);
}
}
.modal-video-body {
max-width: 1300px;
width: 100%;
height: 100%;
margin: 0 auto;
display: table;
}
.modal-video-inner {
display: table-cell;
vertical-align: middle;
width: 100%;
height: 100%;
}
.modal-video-movie-wrap {
width: 100%;
height: 0;
position: relative;
padding-bottom: 56.25%;
background-color: #333;
animation-timing-function: $animation-function;
animation-duration: $animation-speed;
animation-name: modal-video-inner;
-webkit-transform: translate(0, 0);
-moz-transform: translate(0, 0);
-ms-transform: translate(0, 0);
-o-transform: translate(0, 0);
transform: translate(0, 0);
-webkit-transition: -webkit-transform $animation-speed $animation-function;
-moz-transition: -moz-transform $animation-speed $animation-function;
-ms-transition: -ms-transform $animation-speed $animation-function;
-o-transition: -o-transform $animation-speed $animation-function;
transition: transform $animation-speed $animation-function;
& iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
}
.modal-video-close-btn {
position: absolute;
z-index: 2;
top: -35px;
right: -35px;
display: inline-block;
width: 35px;
height: 35px;
overflow: hidden;
border: none;
background: transparent;
&:before {
transform: rotate(45deg);
}
&:after {
transform: rotate(-45deg);
}
&:before,
&:after {
content: '';
position: absolute;
height: 2px;
width: 100%;
top: 50%;
left: 0;
margin-top: -1px;
background: #fff;
border-radius: 5px;
margin-top: -6px;
}
}

View File

@@ -108,7 +108,7 @@ const ButtonBase = styled.button<ButtonInterface>`
border-color: ${props => props.isTransparent && !props.isNoBorder && !props.isWithArrow && '#00AE99'};
svg {
transform: translate3d(2px, -2px, 0);
transform: ${props => (props.isWithArrow ? 'translate3d(2px, -2px, 0)' : '')};
}
}
`;

View File

@@ -117,7 +117,7 @@ const ButtonWrap = styled.div`
flex-direction: column;
justify-content: center;
* {
> * {
padding-left: 20px;
padding-right: 20px;
}
@@ -138,26 +138,39 @@ const BackgroundWrap = styled.div`
top: 0;
`;
export const Hero: React.StatelessComponent<Props> = (props: Props) => (
<Section padding={props.sectionPadding} isAnnouncement={!!props.announcement}>
{!!props.background && <BackgroundWrap>{props.background}</BackgroundWrap>}
<Wrap isCentered={!props.figure} isFullWidth={props.isFullWidth} isCenteredMobile={props.isCenteredMobile}>
{props.figure && <Content width="400px">{props.figure}</Content>}
export class Hero extends React.Component<Props> {
public static defaultProps = {
isCenteredMobile: true,
};
public shouldComponentUpdate(): boolean {
// The hero is a static component with animations.
// We do not want state changes in parent components to re-trigger animations.
return false;
}
public render(): React.ReactNode {
const props = this.props;
return (
<Section padding={props.sectionPadding} isAnnouncement={!!props.announcement}>
{!!props.background && <BackgroundWrap>{props.background}</BackgroundWrap>}
<Wrap
isCentered={!props.figure}
isFullWidth={props.isFullWidth}
isCenteredMobile={props.isCenteredMobile}
>
{props.figure && <Content width="400px">{props.figure}</Content>}
<Content width={props.maxWidth ? props.maxWidth : props.figure ? '546px' : '678px'}>
{!!props.announcement && <Announcement {...props.announcement} />}
<Title isLarge={props.isLargeTitle} maxWidth={props.maxWidthHeading}>
{props.title}
</Title>
<Content width={props.maxWidth ? props.maxWidth : props.figure ? '546px' : '678px'}>
{!!props.announcement && <Announcement {...props.announcement} />}
<Title isLarge={props.isLargeTitle} maxWidth={props.maxWidthHeading}>
{props.title}
</Title>
<Description>{props.description}</Description>
<Description>{props.description}</Description>
{props.actions && <ButtonWrap>{props.actions}</ButtonWrap>}
</Content>
</Wrap>
</Section>
);
Hero.defaultProps = {
isCenteredMobile: true,
};
{props.actions && <ButtonWrap>{props.actions}</ButtonWrap>}
</Content>
</Wrap>
</Section>
);
}
}

View File

@@ -0,0 +1,257 @@
import React from 'react';
import CSSTransition from 'react-transition-group/CSSTransition';
interface ModalVideoClassnames {
modalVideoEffect: string;
modalVideo: string;
modalVideoClose: string;
modalVideoBody: string;
modalVideoInner: string;
modalVideoIframeWrap: string;
modalVideoCloseBtn: string;
}
interface Aria {
openMessage: string;
dismissBtnMessage: string;
}
export interface ModalVideoProps {
onClose?: () => void;
isOpen: boolean;
classNames?: ModalVideoClassnames;
ratio?: string;
animationSpeed?: number;
allowFullScreen?: boolean;
aria?: Aria;
videoId?: string;
channel?: string;
youtube?: any;
vimeo?: any;
youku?: any;
}
export interface ModalVideoState {
isOpen: boolean;
}
export class ModalVideo extends React.Component<ModalVideoProps, ModalVideoState> {
public static defaultProps: ModalVideoProps = {
channel: 'youtube',
isOpen: false,
youtube: {
autoplay: 1,
cc_load_policy: 1,
color: null,
controls: 1,
disablekb: 0,
enablejsapi: 0,
end: null,
fs: 1,
h1: null,
iv_load_policy: 1,
list: null,
listType: null,
loop: 0,
modestbranding: null,
origin: null,
playlist: null,
playsinline: null,
rel: 0,
showinfo: 1,
start: 0,
wmode: 'transparent',
theme: 'dark',
},
ratio: '16:9',
vimeo: {
api: false,
autopause: true,
autoplay: true,
byline: true,
callback: null,
color: null,
height: null,
loop: false,
maxheight: null,
maxwidth: null,
player_id: null,
portrait: true,
title: true,
width: null,
xhtml: false,
},
youku: {
autoplay: 1,
show_related: 0,
},
allowFullScreen: true,
animationSpeed: 300,
classNames: {
modalVideoEffect: 'modal-video-effect',
modalVideo: 'modal-video',
modalVideoClose: 'modal-video-close',
modalVideoBody: 'modal-video-body',
modalVideoInner: 'modal-video-inner',
modalVideoIframeWrap: 'modal-video-movie-wrap',
modalVideoCloseBtn: 'modal-video-close-btn',
},
aria: {
openMessage: 'You just openned the modal video',
dismissBtnMessage: 'Close the modal by clicking here',
},
};
public modal: any;
public modalbtn: any;
constructor(props: ModalVideoProps) {
super(props);
this.state = {
isOpen: false,
};
}
public openModal = (): void => {
this.setState({ isOpen: true });
};
public closeModal = (): void => {
this.setState({ isOpen: false });
if (typeof this.props.onClose === 'function') {
this.props.onClose();
}
};
public keydownHandler(e: any): void {
if (e.keyCode === 27) {
this.closeModal();
}
}
public componentDidMount(): void {
document.addEventListener('keydown', this.keydownHandler.bind(this));
}
public componentWillUnmount(): void {
document.removeEventListener('keydown', this.keydownHandler.bind(this));
}
public componentWillReceiveProps(nextProps: ModalVideoProps): void {
this.setState({ isOpen: nextProps.isOpen });
}
public componentDidUpdate(): void {
if (this.state.isOpen && this.modal) {
this.modal.focus();
}
}
public updateFocus = (e: any): void => {
if (e.keyCode === 9) {
e.preventDefault();
e.stopPropagation();
if (this.modal === document.activeElement) {
this.modalbtn.focus();
} else {
this.modal.focus();
}
}
};
public getQueryString(obj: any): string {
let url = '';
for (const key of Object.keys(obj)) {
if (obj.hasOwnProperty(key)) {
if (obj[key] !== null) {
url += `${key}=${obj[key]}&`;
}
}
}
return url.substr(0, url.length - 1);
}
public getYoutubeUrl(youtube: any, videoId: string): string {
const query = this.getQueryString(youtube);
return `//www.youtube.com/embed/${videoId}?${query}`;
}
public getVimeoUrl(vimeo: any, videoId: string): string {
const query = this.getQueryString(vimeo);
return `//play.vimeo.com/video/${videoId}?${query}`;
}
public getYoukuUrl(youku: any, videoId: string): string {
const query = this.getQueryString(youku);
return `//player.youku.com/embed/${videoId}?${query}`;
}
public getVideoUrl(opt: any, videoId: string): string {
if (opt.channel === 'youtube') {
return this.getYoutubeUrl(opt.youtube, videoId);
} else if (opt.channel === 'vimeo') {
return this.getVimeoUrl(opt.vimeo, videoId);
} else if (opt.channel === 'youku') {
return this.getYoukuUrl(opt.youku, videoId);
}
return '';
}
public getPadding(ratio: string): string {
const arr = ratio.split(':');
const width = Number(arr[0]);
const height = Number(arr[1]);
const padding = (height * 100) / width;
return `${padding}%`;
}
public render(): React.ReactNode {
const style = {
paddingBottom: this.getPadding(this.props.ratio),
};
return (
<CSSTransition classNames={this.props.classNames.modalVideoEffect} timeout={this.props.animationSpeed}>
{() => {
if (!this.state.isOpen) {
return null;
}
return (
<div
className={this.props.classNames.modalVideo}
tabIndex={-1}
role="dialog"
aria-label={this.props.aria.openMessage}
onClick={this.closeModal}
ref={node => {
this.modal = node;
}}
onKeyDown={this.updateFocus}
>
<div className={this.props.classNames.modalVideoBody}>
<div className={this.props.classNames.modalVideoInner}>
<div className={this.props.classNames.modalVideoIframeWrap} style={style}>
<button
className={this.props.classNames.modalVideoCloseBtn}
aria-label={this.props.aria.dismissBtnMessage}
ref={node => {
this.modalbtn = node;
}}
onKeyDown={this.updateFocus}
/>
<iframe
width="920"
height="460"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
src={this.getVideoUrl(this.props, this.props.videoId)}
frameBorder="0"
allowFullScreen={this.props.allowFullScreen}
tabIndex={-1}
/>
</div>
</div>
</div>
</div>
);
}}
</CSSTransition>
);
}
}

View File

@@ -3,9 +3,10 @@ import * as React from 'react';
import { Button } from 'ts/components/button';
import { Hero } from 'ts/components/hero';
import { LandingAnimation } from 'ts/components/heroImage';
import { Icon } from 'ts/components/icon';
import { HeroAnimation } from 'ts/components/heroAnimation';
import { WebsitePaths } from 'ts/types';
import { ModalVideo } from 'ts/components/modals/modal_video';
// const announcement = {
// headline: 'Vote on ZEIP-24 & ZEIP-39',
@@ -13,26 +14,68 @@ import { WebsitePaths } from 'ts/types';
// shouldOpenInNewTab: false,
// };
export const SectionLandingHero = () => (
<Hero
title="Powering Decentralized Exchange"
isLargeTitle={true}
isFullWidth={true}
description="0x is an open protocol that enables the peer-to-peer exchange of assets on the Ethereum blockchain."
figure={<LandingAnimation image={<HeroAnimation />} />}
actions={<HeroActions />}
// announcement={announcement}
/>
);
export interface SectionlandingHeroProps {}
export interface SectionLandingHeroState {
isVideoOpen: boolean;
}
const HeroActions = () => (
export class SectionLandingHero extends React.Component<SectionlandingHeroProps, SectionLandingHeroState> {
public state: SectionLandingHeroState = {
isVideoOpen: false,
};
public render(): React.ReactNode {
const { isVideoOpen } = this.state;
return (
<>
<Hero
title="Powering Decentralized Exchange"
isLargeTitle={true}
isFullWidth={true}
description="0x is an open protocol that enables the peer-to-peer exchange of assets on the Ethereum blockchain."
figure={<LandingAnimation image={<HeroAnimation />} />}
actions={<HeroActions onPlayVideoClick={this._openModalVideo} />}
// announcement={announcement}
/>
<ModalVideo
channel="youtube"
isOpen={isVideoOpen}
videoId="c04eIt3FQ5I"
onClose={this._closeModalVideo}
youtube={{
autoplay: 1,
controls: 0,
showinfo: 0,
modestbranding: 1,
}}
ratio="21:9"
/>
</>
);
}
private readonly _closeModalVideo = (): void => {
this.setState({ isVideoOpen: false });
};
private readonly _openModalVideo = (): void => {
this.setState({ isVideoOpen: true });
};
}
interface HeroActionsProps {
onPlayVideoClick: () => void;
}
const HeroActions: React.FC<HeroActionsProps> = props => (
<>
<Button href="https://0x.org/docs" isInline={true}>
Get Started
</Button>
<Button to={WebsitePaths.Why} isTransparent={true} isInline={true}>
Learn More
<Button shouldUseAnchorTag={true} onClick={props.onPlayVideoClick} isTransparent={true} isInline={true}>
<Icon name="play" size={16} margin={[0, 16, 0, -16]} />
Play Video
</Button>
</>
);

View File

@@ -0,0 +1,3 @@
<svg width="14" height="16" viewBox="0 0 14 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 16V0L13.3333 7.56757L0 16Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 158 B

View File

@@ -38,6 +38,7 @@ tradeHistoryStorage.clearIfRequired();
trackedTokenStorage.clearIfRequired();
import 'less/all.less';
import 'sass/modal_video.scss';
// We pass modulePromise returning lambda instead of module promise,
// cause we only want to import the module when the user navigates to the page.

View File

@@ -19,7 +19,7 @@ const config = {
publicPath: '/',
},
externals: {
zeroExInstant: 'zeroExInstant'
zeroExInstant: 'zeroExInstant',
},
devtool: 'source-map',
resolve: {
@@ -28,6 +28,7 @@ const config = {
alias: {
ts: path.join(__dirname, '/ts'),
less: path.join(__dirname, '/less'),
sass: path.join(__dirname, '/sass'),
md: path.join(__dirname, '/md'),
},
},
@@ -55,6 +56,10 @@ const config = {
loader: 'style-loader!css-loader!less-loader',
exclude: /node_modules/,
},
{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
},
{
test: /\.css$/,
loaders: ['style-loader', 'css-loader'],
@@ -63,16 +68,14 @@ const config = {
test: /\.svg$/,
use: [
{
loader: "react-svg-loader",
loader: 'react-svg-loader',
options: {
svgo: {
plugins: [
{ removeViewBox: false }
],
}
}
}
]
plugins: [{ removeViewBox: false }],
},
},
},
],
},
],
},
@@ -109,8 +112,8 @@ const config = {
// Source: https://github.com/webpack/webpack-dev-server/issues/1491
https: {
spdy: {
protocols: ['http/1.1']
}
protocols: ['http/1.1'],
},
},
},
};
@@ -119,9 +122,7 @@ module.exports = (_env, argv) => {
let plugins = [];
if (argv.mode === 'development') {
config.mode = 'development';
plugins.concat([
new BundleAnalyzerPlugin(),
]);
plugins.concat([new BundleAnalyzerPlugin()]);
} else {
config.mode = 'production';
plugins = plugins.concat([

222
yarn.lock
View File

@@ -931,6 +931,13 @@
dependencies:
regenerator-runtime "^0.12.0"
"@babel/runtime@^7.4.5":
version "7.5.5"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
dependencies:
regenerator-runtime "^0.13.2"
"@babel/types@^7.0.0":
version "7.1.3"
resolved "https://registry.npmjs.org/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d"
@@ -2095,6 +2102,13 @@
version "0.0.30"
resolved "https://registry.yarnpkg.com/@types/react-tap-event-plugin/-/react-tap-event-plugin-0.0.30.tgz#123f35080412f489b6770c5a65c159ff96654cb5"
"@types/react-transition-group@^4.2.0":
version "4.2.0"
resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.0.tgz#86ddb509ce3de27341c7cb7797abb99b1c4676bf"
integrity sha512-8KkpFRwqS9U1dtVVw1kt/MmWgLmbd5iK5TgqsaeC7fAm74J4j/HiBiRC8eETvwjGGju48RAwyZ3l5iv1H1x93Q==
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@16.4.16":
version "16.4.16"
resolved "https://registry.npmjs.org/@types/react/-/react-16.4.16.tgz#99f91b1200ae8c2062030402006d3b3c3a177043"
@@ -2890,6 +2904,11 @@ async-eventemitter@ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a
dependencies:
async "^2.4.0"
async-foreach@^0.1.3:
version "0.1.3"
resolved "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
async-limiter@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
@@ -4947,6 +4966,16 @@ clone-buffer@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
clone-deep@^2.0.1:
version "2.0.2"
resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==
dependencies:
for-own "^1.0.0"
is-plain-object "^2.0.4"
kind-of "^6.0.0"
shallow-clone "^1.0.0"
clone-stats@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
@@ -5592,6 +5621,14 @@ cross-fetch@^2.1.0:
node-fetch "2.1.1"
whatwg-fetch "2.0.3"
cross-spawn@^3.0.0:
version "3.0.1"
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI=
dependencies:
lru-cache "^4.0.1"
which "^1.2.9"
cross-spawn@^4, cross-spawn@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
@@ -6324,6 +6361,13 @@ dom-helpers@^3.2.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
dom-helpers@^3.4.0:
version "3.4.0"
resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"
integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==
dependencies:
"@babel/runtime" "^7.1.2"
dom-serializer@0, dom-serializer@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -8089,6 +8133,11 @@ for-each@^0.3.2, for-each@~0.3.2:
dependencies:
is-function "~1.0.0"
for-in@^0.1.3:
version "0.1.8"
resolved "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=
for-in@^1.0.1, for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@@ -8415,6 +8464,13 @@ gaze@^0.5.1:
dependencies:
globule "~0.1.0"
gaze@^1.0.0:
version "1.1.3"
resolved "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
dependencies:
globule "^1.0.0"
genfun@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1"
@@ -8683,7 +8739,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, gl
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.1.4:
glob@^7.1.4, glob@~7.1.1:
version "7.1.4"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
dependencies:
@@ -8802,6 +8858,15 @@ globby@^9.2.0:
pify "^4.0.1"
slash "^2.0.0"
globule@^1.0.0:
version "1.2.1"
resolved "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==
dependencies:
glob "~7.1.1"
lodash "~4.17.10"
minimatch "~3.0.2"
globule@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
@@ -9564,6 +9629,11 @@ imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
in-publish@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
integrity sha1-4g/146KvwmkDILbcVSaCqcf631E=
indent-string@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
@@ -10641,6 +10711,11 @@ jmespath@0.15.0:
version "0.15.0"
resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217"
js-base64@^2.1.8:
version "2.5.1"
resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121"
integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==
js-base64@^2.1.9:
version "2.4.3"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582"
@@ -10669,7 +10744,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
js-tokens@^4.0.0:
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -11341,7 +11416,7 @@ loader-utils@^0.2.16, loader-utils@~0.2.2:
json5 "^0.5.0"
object-assign "^4.0.1"
loader-utils@^1.0.2:
loader-utils@^1.0.1, loader-utils@^1.0.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
dependencies:
@@ -11541,6 +11616,11 @@ lodash.sortby@^4.7.0:
version "4.7.0"
resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
lodash.tail@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=
lodash.template@^3.0.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
@@ -11615,7 +11695,7 @@ lodash@=4.17.4:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=
lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1:
lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.10:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -11677,6 +11757,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3
dependencies:
js-tokens "^3.0.0"
loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
lottie-web@^5.1.3:
version "5.4.1"
resolved "https://registry.yarnpkg.com/lottie-web/-/lottie-web-5.4.1.tgz#98465741d4907293656cab31e395d79d0546ef26"
@@ -12290,6 +12377,14 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
mixin-object@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=
dependencies:
for-in "^0.1.3"
is-extendable "^0.1.1"
mkdirp-promise@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
@@ -12444,7 +12539,7 @@ nan@^2.11.0:
version "2.12.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552"
nan@^2.12.1:
nan@^2.12.1, nan@^2.13.2:
version "2.14.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
@@ -12614,6 +12709,24 @@ node-gyp@^3.6.2:
tar "^2.0.0"
which "1"
node-gyp@^3.8.0:
version "3.8.0"
resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
dependencies:
fstream "^1.0.0"
glob "^7.0.3"
graceful-fs "^4.1.2"
mkdirp "^0.5.0"
nopt "2 || 3"
npmlog "0 || 1 || 2 || 3 || 4"
osenv "0"
request "^2.87.0"
rimraf "2"
semver "~5.3.0"
tar "^2.0.0"
which "1"
node-gyp@^5.0.2:
version "5.0.3"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.0.3.tgz#80d64c23790244991b6d44532f0a351bedd3dd45"
@@ -12709,6 +12822,29 @@ node-pre-gyp@^0.12.0:
semver "^5.3.0"
tar "^4"
node-sass@^4.12.0:
version "4.12.0"
resolved "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017"
integrity sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==
dependencies:
async-foreach "^0.1.3"
chalk "^1.1.1"
cross-spawn "^3.0.0"
gaze "^1.0.0"
get-stdin "^4.0.1"
glob "^7.0.3"
in-publish "^2.0.0"
lodash "^4.17.11"
meow "^3.7.0"
mkdirp "^0.5.1"
nan "^2.13.2"
node-gyp "^3.8.0"
npmlog "^4.0.0"
request "^2.88.0"
sass-graph "^2.2.4"
stdout-stream "^1.4.0"
"true-case-path" "^1.0.2"
nodemon@^1.11.0:
version "1.17.3"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.17.3.tgz#3b0bbc2ee05ccb43b1aef15ba05c63c7bc9b8530"
@@ -12944,7 +13080,7 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
dependencies:
@@ -15029,6 +15165,16 @@ react-transition-group@^1.2.1:
prop-types "^15.5.6"
warning "^3.0.0"
react-transition-group@^4.2.1:
version "4.2.1"
resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.2.1.tgz#61fc9e36568bff9a1fe4e60fae323c8a6dbc0680"
integrity sha512-IXrPr93VzCPupwm2O6n6C2kJIofJ/Rp5Ltihhm9UfE8lkuVX2ng/SUUl/oWjblybK9Fq2Io7LGa6maVqPB762Q==
dependencies:
"@babel/runtime" "^7.4.5"
dom-helpers "^3.4.0"
loose-envify "^1.4.0"
prop-types "^15.6.2"
react-typist@^2.0.4:
version "2.0.4"
resolved "https://registry.npmjs.org/react-typist/-/react-typist-2.0.4.tgz#e7ee4de53ead913d363d38f07b700c00ce271be0"
@@ -15553,7 +15699,7 @@ request@2.81.0, "request@>=2.9.0 <2.82.0":
tunnel-agent "^0.6.0"
uuid "^3.0.0"
request@^2.47.0, request@^2.87.0:
request@^2.47.0, request@^2.87.0, request@^2.88.0:
version "2.88.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
dependencies:
@@ -15935,6 +16081,28 @@ sane@^2.0.0:
optionalDependencies:
fsevents "^1.2.3"
sass-graph@^2.2.4:
version "2.2.4"
resolved "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=
dependencies:
glob "^7.0.0"
lodash "^4.0.0"
scss-tokenizer "^0.2.3"
yargs "^7.0.0"
sass-loader@^7.1.0:
version "7.1.0"
resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d"
integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==
dependencies:
clone-deep "^2.0.1"
loader-utils "^1.0.1"
lodash.tail "^4.1.1"
neo-async "^2.5.0"
pify "^3.0.0"
semver "^5.5.0"
sax@1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
@@ -16008,6 +16176,14 @@ scryptsy@^1.2.1:
dependencies:
pbkdf2 "^3.0.3"
scss-tokenizer@^0.2.3:
version "0.2.3"
resolved "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE=
dependencies:
js-base64 "^2.1.8"
source-map "^0.4.2"
secp256k1@^3.0.1:
version "3.5.0"
resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.5.0.tgz#677d3b8a8e04e1a5fa381a1ae437c54207b738d0"
@@ -16233,6 +16409,15 @@ sha3@^1.1.0:
dependencies:
nan "2.10.0"
shallow-clone@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==
dependencies:
is-extendable "^0.1.1"
kind-of "^5.0.0"
mixin-object "^2.0.1"
shallowequal@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-0.2.2.tgz#1e32fd5bcab6ad688a4812cb0cc04efc75c7014e"
@@ -16591,6 +16776,13 @@ source-map@>=0.5.0:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
source-map@^0.4.2:
version "0.4.4"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
dependencies:
amdefine ">=0.0.4"
source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
@@ -16768,6 +16960,13 @@ statuses@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
stdout-stream@^1.4.0:
version "1.4.1"
resolved "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de"
integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
dependencies:
readable-stream "^2.0.1"
stealthy-require@^1.1.0:
version "1.1.1"
resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
@@ -17624,6 +17823,13 @@ trough@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.2.tgz#7f1663ec55c480139e2de5e486c6aef6cc24a535"
"true-case-path@^1.0.2":
version "1.0.3"
resolved "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
dependencies:
glob "^7.1.2"
truffle-blockchain-utils@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/truffle-blockchain-utils/-/truffle-blockchain-utils-0.0.1.tgz#07a58e55bb0555a64208c9119c0b04ffe1464aa4"
@@ -19671,7 +19877,7 @@ yargs@^4.7.1:
y18n "^3.2.1"
yargs-parser "^2.4.1"
yargs@^7.1.0:
yargs@^7.0.0, yargs@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=