From caeb464bb2a7ec1bc14ca7d279d22135ecab6d56 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 15 Oct 2019 14:46:26 +0700 Subject: [PATCH 01/99] comments highlight --- src/components/media/AudioPlayer/styles.scss | 5 ++ src/components/node/Comment/index.tsx | 72 +++++------------ src/components/node/Comment/styles.scss | 48 +---------- src/components/node/CommentContent/index.tsx | 79 +++++++++++++++++++ .../node/CommentContent/styles.scss | 65 +++++++++++++++ src/components/node/NodeComments/index.tsx | 29 ++++--- src/containers/node/NodeLayout/index.tsx | 4 +- src/redux/node/constants.ts | 1 + src/redux/node/sagas.ts | 2 +- src/redux/types.ts | 7 ++ src/styles/global.scss | 4 + src/utils/dom.ts | 4 + src/utils/fn.ts | 34 ++++++++ 13 files changed, 239 insertions(+), 115 deletions(-) create mode 100644 src/components/node/CommentContent/index.tsx create mode 100644 src/components/node/CommentContent/styles.scss diff --git a/src/components/media/AudioPlayer/styles.scss b/src/components/media/AudioPlayer/styles.scss index e65bcc5f..f4cd63bf 100644 --- a/src/components/media/AudioPlayer/styles.scss +++ b/src/components/media/AudioPlayer/styles.scss @@ -1,6 +1,11 @@ .wrap { display: flex; flex-direction: row; + height: $comment_height; + position: relative; + align-items: center; + justify-content: stretch; + flex: 1; &:global(.playing) { .progress { diff --git a/src/components/node/Comment/index.tsx b/src/components/node/Comment/index.tsx index c66dda99..5fd8b9f6 100644 --- a/src/components/node/Comment/index.tsx +++ b/src/components/node/Comment/index.tsx @@ -1,73 +1,39 @@ -import React, { FC, HTMLAttributes, useMemo } from 'react'; +import React, { FC, HTMLAttributes } from 'react'; import { CommentWrapper } from '~/components/containers/CommentWrapper'; -import { IComment, IFile } from '~/redux/types'; +import { ICommentGroup } from '~/redux/types'; +import { getURL } from '~/utils/dom'; +import { CommentContent } from '~/components/node/CommentContent'; import * as styles from './styles.scss'; -import { formatCommentText, getURL, getPrettyDate } from '~/utils/dom'; -import { Group } from '~/components/containers/Group'; -import assocPath from 'ramda/es/assocPath'; -import append from 'ramda/es/append'; -import reduce from 'ramda/es/reduce'; -import { UPLOAD_TYPES } from '~/redux/uploads/constants'; -import { AudioPlayer } from '~/components/media/AudioPlayer'; type IProps = HTMLAttributes<HTMLDivElement> & { is_empty?: boolean; is_loading?: boolean; - comment?: IComment; + comment_group?: ICommentGroup; is_same?: boolean; }; -const Comment: FC<IProps> = ({ comment, is_empty, is_same, is_loading, className, ...props }) => { - const groupped = useMemo<Record<keyof typeof UPLOAD_TYPES, IFile[]>>( - () => - reduce( - (group, file) => assocPath([file.type], append(file, group[file.type]), group), - {}, - comment.files - ), - [comment] - ); - +const Comment: FC<IProps> = ({ + comment_group, + is_empty, + is_same, + is_loading, + className, + ...props +}) => { return ( <CommentWrapper className={className} is_empty={is_empty} is_loading={is_loading} - photo={getURL(comment.user.photo)} + photo={getURL(comment_group.user.photo)} is_same={is_same} {...props} > - {comment.text && ( - <Group - className={styles.text} - dangerouslySetInnerHTML={{ - __html: formatCommentText( - !is_same && comment.user && comment.user.username, - comment.text - ), - }} - /> - )} - - <div className={styles.date}>{getPrettyDate(comment.created_at)}</div> - - {groupped.image && ( - <div className={styles.images}> - {groupped.image.map(file => ( - <div key={file.id}> - <img src={getURL(file)} alt={file.name} /> - </div> - ))} - </div> - )} - - {groupped.audio && ( - <div className={styles.audios}> - {groupped.audio.map(file => ( - <AudioPlayer key={file.id} file={file} /> - ))} - </div> - )} + <div className={styles.wrap}> + {comment_group.comments.map(comment => ( + <CommentContent comment={comment} key={comment.id} /> + ))} + </div> </CommentWrapper> ); }; diff --git a/src/components/node/Comment/styles.scss b/src/components/node/Comment/styles.scss index 723535b9..1afb844d 100644 --- a/src/components/node/Comment/styles.scss +++ b/src/components/node/Comment/styles.scss @@ -1,48 +1,2 @@ -@import 'flexbin/flexbin.scss'; - -.text { - // @include outer_shadow(); - - padding: $gap; - font-weight: 300; - font: $font_16_medium; - min-height: $comment_height; - box-sizing: border-box; - position: relative; - color: #cccccc; - - b { - font-weight: 600; - } -} - -.date { - position: absolute; - bottom: 0; - right: 0; - font: $font_12_regular; - color: transparentize($color: white, $amount: 0.8); - padding: 2px 4px; - border-radius: 0 0 $radius 0; -} - -.images { - @include flexbin(240px, 5px); - - img { - border-radius: $radius; - } -} - -.audios { - & > div { - @include outer_shadow(); - - height: $comment_height; - border-radius: $radius; - display: flex; - justify-content: center; - align-items: center; - text-align: center; - } +.wrap { } diff --git a/src/components/node/CommentContent/index.tsx b/src/components/node/CommentContent/index.tsx new file mode 100644 index 00000000..916e1113 --- /dev/null +++ b/src/components/node/CommentContent/index.tsx @@ -0,0 +1,79 @@ +import React, { FC, useMemo } from 'react'; +import { IComment, IFile } from '~/redux/types'; +import path from 'ramda/es/path'; +import { formatCommentText, getURL } from '~/utils/dom'; +import { Group } from '~/components/containers/Group'; +import * as styles from './styles.scss'; +import { UPLOAD_TYPES } from '~/redux/uploads/constants'; +import assocPath from 'ramda/es/assocPath'; +import append from 'ramda/es/append'; +import reduce from 'ramda/es/reduce'; +import { AudioPlayer } from '~/components/media/AudioPlayer'; +import classnames from 'classnames'; + +interface IProps { + comment: IComment; +} + +const CommentContent: FC<IProps> = ({ comment }) => { + const groupped = useMemo<Record<keyof typeof UPLOAD_TYPES, IFile[]>>( + () => + reduce( + (group, file) => assocPath([file.type], append(file, group[file.type]), group), + {}, + comment.files + ), + [comment] + ); + + return ( + <> + {comment.text && ( + <div className={styles.block}> + <Group + className={styles.text} + dangerouslySetInnerHTML={{ + __html: formatCommentText(path(['user', 'username'], comment), comment.text), + }} + /> + </div> + )} + + {groupped.image && groupped.image.length > 0 && ( + <div className={styles.block}> + <div className={styles.images}> + {groupped.image.map(file => ( + <div key={file.id}> + <img src={getURL(file)} alt={file.name} /> + </div> + ))} + </div> + </div> + )} + + {groupped.audio && groupped.audio.length > 0 && ( + <> + {groupped.audio.map(file => ( + <div className={classnames(styles.block, styles.audio_block)} key={file.id}> + <AudioPlayer file={file} /> + </div> + ))} + </> + )} + </> + ); +}; + +export { CommentContent }; + +/* +{comment.text && ( + + )} + + <div className={styles.date}>{getPrettyDate(comment.created_at)}</div> + + + + + */ diff --git a/src/components/node/CommentContent/styles.scss b/src/components/node/CommentContent/styles.scss new file mode 100644 index 00000000..ccfb4e3d --- /dev/null +++ b/src/components/node/CommentContent/styles.scss @@ -0,0 +1,65 @@ +@import 'flexbin/flexbin.scss'; + +.block { + min-height: $comment_height; + box-shadow: inset rgba(255, 255, 255, 0.05) 1px 1px, inset rgba(0, 0, 0, 0.1) -1px -1px; + display: flex; + align-items: flex-start; + justify-content: flex-start; + + &:first-child { + border-top-right-radius: $radius; + } + + &:last-child { + border-bottom-right-radius: $radius; + } +} + +.block_audio { + align-items: center; + justify-content: center; +} + +.text { + padding: $gap; + font-weight: 300; + font: $font_16_medium; + line-height: 20px; + box-sizing: border-box; + position: relative; + color: #cccccc; + + b { + font-weight: 600; + } +} + +.date { + position: absolute; + bottom: 0; + right: 0; + font: $font_12_regular; + color: transparentize($color: white, $amount: 0.8); + padding: 2px 4px; + border-radius: 0 0 $radius 0; +} + +.images { + @include flexbin(240px, 5px); + + img { + border-radius: $radius; + } +} + +.audios { + & > div { + height: $comment_height; + border-radius: $radius; + display: flex; + justify-content: center; + align-items: center; + text-align: center; + } +} diff --git a/src/components/node/NodeComments/index.tsx b/src/components/node/NodeComments/index.tsx index 339a4a67..ab9982ba 100644 --- a/src/components/node/NodeComments/index.tsx +++ b/src/components/node/NodeComments/index.tsx @@ -1,24 +1,29 @@ -import React, { FC } from 'react'; +import React, { FC, useMemo } from 'react'; import { Comment } from '../Comment'; import { Filler } from '~/components/containers/Filler'; import * as styles from './styles.scss'; +import { ICommentGroup, IComment } from '~/redux/types'; +import { groupCommentsByUser } from '~/utils/fn'; interface IProps { - comments?: any; + comments?: IComment[]; } -const isSameComment = (comments, index) => - comments[index - 1] && comments[index - 1].user.id === comments[index].user.id; +const NodeComments: FC<IProps> = ({ comments }) => { + const groupped: ICommentGroup[] = useMemo(() => comments.reduce(groupCommentsByUser, []), [ + comments, + ]); -const NodeComments: FC<IProps> = ({ comments }) => ( - <div className={styles.wrap}> - {comments.map((comment, index) => ( - <Comment key={comment.id} comment={comment} is_same={isSameComment(comments, index)} /> - ))} + return ( + <div className={styles.wrap}> + {groupped.map(group => ( + <Comment key={group.ids.join()} comment_group={group} /> + ))} - <Filler /> - </div> -); + <Filler /> + </div> + ); +}; export { NodeComments }; diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index cd629d04..02d7b10b 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -68,13 +68,13 @@ const NodeLayoutUnconnected: FC<IProps> = ({ <Padder> <Group horizontal className={styles.content}> <Group className={styles.comments}> - {is_user && <CommentForm id={0} />} - {is_loading_comments || !comments.length ? ( <NodeNoComments is_loading={is_loading_comments} /> ) : ( <NodeComments comments={comments} /> )} + + {is_user && <CommentForm id={0} />} </Group> <div className={styles.panel}> diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index cd13c326..f61dad63 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -67,6 +67,7 @@ export const NODE_COMPONENTS: INodeComponents = { }; export const EMPTY_COMMENT: IComment = { + id: null, text: '', files: [], temp_ids: [], diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index 98fe0693..927b7e87 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -100,7 +100,7 @@ function* onPostComment({ id }: ReturnType<typeof nodePostComment>) { if (current_node && current_node.id === current.id) { // if user still browsing that node const { comments } = yield select(selectNode); - yield put(nodeSetComments([comment, ...comments])); + yield put(nodeSetComments([...comments, comment])); yield put(nodeSetCommentData(0, { ...EMPTY_COMMENT })); } } diff --git a/src/redux/types.ts b/src/redux/types.ts index ea6e9a70..a8523790 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -133,6 +133,7 @@ export interface INode { } export interface IComment { + id: number; text: string; temp_ids?: string[]; files: IFile[]; @@ -143,6 +144,12 @@ export interface IComment { update_at?: string; } +export interface ICommentGroup { + user: IUser; + comments: IComment[]; + ids: IComment['id'][]; +} + export type IUploadProgressHandler = (progress: ProgressEvent) => void; export type IError = ValueOf<typeof ERRORS>; export type IValidationErrors = Record<string, IError>; diff --git a/src/styles/global.scss b/src/styles/global.scss index 3ab58dc1..76ede1f3 100644 --- a/src/styles/global.scss +++ b/src/styles/global.scss @@ -76,6 +76,10 @@ body { height: 40px; } +:global(.grey) { + color: #555555; +} + :global(h2) { font: $font_24_bold; } diff --git a/src/utils/dom.ts b/src/utils/dom.ts index b1bb0baa..62649a81 100644 --- a/src/utils/dom.ts +++ b/src/utils/dom.ts @@ -72,11 +72,15 @@ export const formatCommentText = (author, text: string) => .replace(/(\n{2,})/gi, '\n') .replace(/</g, '<') .replace(/>/g, '>') + .replace(/:\/\//gim, ':|--|') + .replace(/(\/\/[^\n]+)/gim, '<span class="grey">$1</span>') + .replace(/:\|--\|/gim, '://') .split('\n') .map((el, index) => index === 0 ? `${author ? `<p><b>${author}</b>: ` : ''}${el}</p>` : `<p>${el}</p>` ) .join(''); +// .replace(/\/\*(\*(?!\/)|[^*])*\*\//igm, ''); export const getPrettyDate = (date: string): string => formatDistanceToNow(new Date(date), { locale: ru, includeSeconds: true, addSuffix: true }); diff --git a/src/utils/fn.ts b/src/utils/fn.ts index dd239fae..d05c8786 100644 --- a/src/utils/fn.ts +++ b/src/utils/fn.ts @@ -2,7 +2,41 @@ import curry from 'ramda/es/curry'; import insert from 'ramda/es/insert'; import nth from 'ramda/es/nth'; import remove from 'ramda/es/remove'; +import { ICommentGroup, IComment } from '~/redux/types'; +import path from 'ramda/es/path'; export const moveArrItem = curry((at, to, list) => insert(to, nth(at, list), remove(at, 1, list))); export const objFromArray = (array: any[], key: string) => array.reduce((obj, el) => (key && el[key] ? { ...obj, [el[key]]: el } : obj), {}); + +export const groupCommentsByUser = ( + result: ICommentGroup[], + comment: IComment +): ICommentGroup[] => { + const last: ICommentGroup = path([result.length - 1], result) || null; + + return [ + ...(!last || path(['user', 'id'], last) !== path(['user', 'id'], comment) + ? [ + // add new group + ...result, + { + user: comment.user, + comments: [comment], + ids: [comment.id], + }, + ] + : [ + // append to last group + ...result.slice(0, result.length - 1), + { + ...last, + comments: [...last.comments, comment], + ids: [...last.ids, comment.id], + }, + ]), + ]; +}; + +// const isSameComment = (comments, index) => +// comments[index - 1] && comments[index - 1].user.id === comments[index].user.id; From 6ebdd62f67f9aed2921551dfda29d3f6c6a95d3f Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 15 Oct 2019 14:49:06 +0700 Subject: [PATCH 02/99] comment date --- src/components/node/CommentContent/index.tsx | 9 +++++++-- src/components/node/CommentContent/styles.scss | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/node/CommentContent/index.tsx b/src/components/node/CommentContent/index.tsx index 916e1113..ae8b702f 100644 --- a/src/components/node/CommentContent/index.tsx +++ b/src/components/node/CommentContent/index.tsx @@ -1,7 +1,7 @@ import React, { FC, useMemo } from 'react'; import { IComment, IFile } from '~/redux/types'; import path from 'ramda/es/path'; -import { formatCommentText, getURL } from '~/utils/dom'; +import { formatCommentText, getURL, getPrettyDate } from '~/utils/dom'; import { Group } from '~/components/containers/Group'; import * as styles from './styles.scss'; import { UPLOAD_TYPES } from '~/redux/uploads/constants'; @@ -36,6 +36,8 @@ const CommentContent: FC<IProps> = ({ comment }) => { __html: formatCommentText(path(['user', 'username'], comment), comment.text), }} /> + + <div className={styles.date}>{getPrettyDate(comment.created_at)}</div> </div> )} @@ -48,6 +50,8 @@ const CommentContent: FC<IProps> = ({ comment }) => { </div> ))} </div> + + <div className={styles.date}>{getPrettyDate(comment.created_at)}</div> </div> )} @@ -56,6 +60,8 @@ const CommentContent: FC<IProps> = ({ comment }) => { {groupped.audio.map(file => ( <div className={classnames(styles.block, styles.audio_block)} key={file.id}> <AudioPlayer file={file} /> + + <div className={styles.date}>{getPrettyDate(comment.created_at)}</div> </div> ))} </> @@ -71,7 +77,6 @@ export { CommentContent }; )} - <div className={styles.date}>{getPrettyDate(comment.created_at)}</div> diff --git a/src/components/node/CommentContent/styles.scss b/src/components/node/CommentContent/styles.scss index ccfb4e3d..6ac33fc5 100644 --- a/src/components/node/CommentContent/styles.scss +++ b/src/components/node/CommentContent/styles.scss @@ -6,6 +6,9 @@ display: flex; align-items: flex-start; justify-content: flex-start; + position: relative; + padding-bottom: 10px; + box-sizing: border-box; &:first-child { border-top-right-radius: $radius; @@ -41,7 +44,7 @@ right: 0; font: $font_12_regular; color: transparentize($color: white, $amount: 0.8); - padding: 2px 4px; + padding: 4px 6px 4px 4px; border-radius: 0 0 $radius 0; } From 794318ed805012a6c233e3fbd655016bf6245066 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 15 Oct 2019 16:01:27 +0700 Subject: [PATCH 03/99] fixes for audio and image block --- src/components/node/CommentContent/index.tsx | 4 +-- .../node/CommentContent/styles.scss | 13 +++++++- src/components/node/CommentForm/index.tsx | 32 +++++++++---------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/components/node/CommentContent/index.tsx b/src/components/node/CommentContent/index.tsx index ae8b702f..ed4503cc 100644 --- a/src/components/node/CommentContent/index.tsx +++ b/src/components/node/CommentContent/index.tsx @@ -42,7 +42,7 @@ const CommentContent: FC<IProps> = ({ comment }) => { )} {groupped.image && groupped.image.length > 0 && ( - <div className={styles.block}> + <div className={classnames(styles.block, styles.block_image)}> <div className={styles.images}> {groupped.image.map(file => ( <div key={file.id}> @@ -58,7 +58,7 @@ const CommentContent: FC<IProps> = ({ comment }) => { {groupped.audio && groupped.audio.length > 0 && ( <> {groupped.audio.map(file => ( - <div className={classnames(styles.block, styles.audio_block)} key={file.id}> + <div className={classnames(styles.block, styles.block_audio)} key={file.id}> <AudioPlayer file={file} /> <div className={styles.date}>{getPrettyDate(comment.created_at)}</div> diff --git a/src/components/node/CommentContent/styles.scss b/src/components/node/CommentContent/styles.scss index 6ac33fc5..a2462771 100644 --- a/src/components/node/CommentContent/styles.scss +++ b/src/components/node/CommentContent/styles.scss @@ -22,6 +22,17 @@ .block_audio { align-items: center; justify-content: center; + padding-bottom: 0 !important; +} + +.block_image { + padding-bottom: 0 !important; + + .date { + background: transparentize($color: $content_bg, $amount: 0.2); + border-radius: $radius 0 $radius 0; + color: transparentize(white, 0.2); + } } .text { @@ -44,7 +55,7 @@ right: 0; font: $font_12_regular; color: transparentize($color: white, $amount: 0.8); - padding: 4px 6px 4px 4px; + padding: 4px 6px 4px 6px; border-radius: 0 0 $radius 0; } diff --git a/src/components/node/CommentForm/index.tsx b/src/components/node/CommentForm/index.tsx index 642942f8..a096ea7e 100644 --- a/src/components/node/CommentForm/index.tsx +++ b/src/components/node/CommentForm/index.tsx @@ -134,6 +134,22 @@ const CommentFormUnconnected: FC<IProps> = ({ /> </div> + {comment.temp_ids.map( + temp_id => + statuses[temp_id] && + statuses[temp_id].is_uploading && ( + <div key={statuses[temp_id].temp_id}>{statuses[temp_id].progress}</div> + ) + )} + + {comment.files.map(file => { + if (file.type === UPLOAD_TYPES.AUDIO) { + return <AudioPlayer file={file} />; + } + + return <div>file.name</div>; + })} + <Group horizontal className={styles.buttons}> <ButtonGroup> <Button iconLeft="image" size="small" grey iconOnly> @@ -154,22 +170,6 @@ const CommentFormUnconnected: FC<IProps> = ({ </Button> </Group> </form> - - {comment.temp_ids.map( - temp_id => - statuses[temp_id] && - statuses[temp_id].is_uploading && ( - <div key={statuses[temp_id].temp_id}>{statuses[temp_id].progress}</div> - ) - )} - - {comment.files.map(file => { - if (file.type === UPLOAD_TYPES.AUDIO) { - return <AudioPlayer file={file} />; - } - - return <div>file.name</div>; - })} </CommentWrapper> ); }; From 87b9b5f51433c5a86fa2a273630e788334dcea74 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 15 Oct 2019 16:29:49 +0700 Subject: [PATCH 04/99] player bar appearance --- src/components/bars/PlayerBar/index.tsx | 64 +++++++++++++++++-- src/components/bars/PlayerBar/styles.scss | 60 +++++++++++++++-- src/components/media/AudioPlayer/index.tsx | 3 +- .../main/BottomContainer/styles.scss | 4 +- src/containers/main/MainLayout/styles.scss | 2 +- src/containers/node/NodeLayout/index.tsx | 1 + 6 files changed, 118 insertions(+), 16 deletions(-) diff --git a/src/components/bars/PlayerBar/index.tsx b/src/components/bars/PlayerBar/index.tsx index 1a6656eb..166a4724 100644 --- a/src/components/bars/PlayerBar/index.tsx +++ b/src/components/bars/PlayerBar/index.tsx @@ -1,4 +1,4 @@ -import React, { FC } from 'react'; +import React, { FC, useCallback, useState, useEffect } from 'react'; import * as styles from './styles.scss'; import { Icon } from '~/components/input/Icon'; import { Filler } from '~/components/containers/Filler'; @@ -7,27 +7,79 @@ import { connect } from 'react-redux'; import pick from 'ramda/es/pick'; import { selectPlayer } from '~/redux/player/selectors'; import * as PLAYER_ACTIONS from '~/redux/player/actions'; +import { IPlayerProgress, Player } from '~/utils/player'; -const mapStateToProps = state => pick(['status'], selectPlayer(state)); +const mapStateToProps = state => pick(['status', 'file'], selectPlayer(state)); const mapDispatchToProps = { playerPlay: PLAYER_ACTIONS.playerPlay, playerPause: PLAYER_ACTIONS.playerPause, + playerSeek: PLAYER_ACTIONS.playerSeek, }; type IProps = ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & {}; -const PlayerBarUnconnected: FC<IProps> = ({ status }) => { +const PlayerBarUnconnected: FC<IProps> = ({ + status, + playerPlay, + playerPause, + playerSeek, + file, +}) => { + const [progress, setProgress] = useState<IPlayerProgress>({ progress: 0, current: 0, total: 0 }); + + const onClick = useCallback(() => { + if (status === PLAYER_STATES.PLAYING) return playerPause(); + return playerPlay(); + }, [playerPlay, playerPause, status]); + + const onProgress = useCallback( + ({ detail }: { detail: IPlayerProgress }) => { + if (!detail || !detail.total) return; + setProgress(detail); + }, + [setProgress] + ); + + const onSeek = useCallback( + event => { + event.stopPropagation(); + const { clientX, target } = event; + const { left, width } = target.getBoundingClientRect(); + playerSeek((clientX - left) / width); + }, + [playerSeek] + ); + + useEffect(() => { + Player.on('playprogress', onProgress); + + return () => { + Player.off('playprogress', onProgress); + }; + }, [onProgress]); + if (status === PLAYER_STATES.UNSET) return null; + const title = + file.metadata && + (file.metadata.title || + [file.metadata.id3artist, file.metadata.id3title].filter(el => !!el).join(' - ')); + return ( <div className={styles.place}> <div className={styles.wrap}> <div className={styles.status}> - <div className={styles.playpause}> - <Icon icon="play" /> + <div className={styles.playpause} onClick={onClick}> + {status === PLAYER_STATES.PLAYING ? <Icon icon="pause" /> : <Icon icon="play" />} </div> - <Filler /> + <div className={styles.info}> + <div className={styles.title}>{title}</div> + + <div className={styles.progress} onClick={onSeek}> + <div className={styles.bar} style={{ width: `${progress.progress}%` }} /> + </div> + </div> <div className={styles.close}> <Icon icon="close" /> diff --git a/src/components/bars/PlayerBar/styles.scss b/src/components/bars/PlayerBar/styles.scss index 9e428b87..5f8d460f 100644 --- a/src/components/bars/PlayerBar/styles.scss +++ b/src/components/bars/PlayerBar/styles.scss @@ -1,6 +1,6 @@ .place { position: relative; - height: 54px; + height: 64px; flex: 0 1 500px; display: flex; @@ -13,29 +13,30 @@ .wrap { display: flex; - border-radius: 27px; + border-radius: $radius $radius 0 0; background: $green_gradient; align-items: center; - box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px, inset rgba(255, 255, 255, 0.3) 0 1px, + box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px, inset rgba(255, 255, 255, 0.3) 1px 1px, inset rgba(0, 0, 0, 0.3) 0 -1px; position: absolute; top: 0; left: 0; width: 100%; - height: 54px; + height: 64px; flex-direction: column; transform: translate(0, 0); z-index: 3; + min-width: 0; } .status { - flex: 0 0 54px; + flex: 0 0 64px; display: flex; flex-direction: row; width: 100%; position: absolute; z-index: 1; - height: 54px; + height: 64px; } .playpause, @@ -60,3 +61,50 @@ height: 24px; } } + +.info { + display: flex; + min-width: 0; + align-items: center; + justify-content: center; + padding: 10px; + flex-direction: column; +} + +.title { + color: #222222; + font: $font_14_semibold; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 100%; +} + +.progress { + position: relative; + height: 20px; + width: 100%; + cursor: pointer; + + &::after { + content: ' '; + top: 9px; + left: 0; + width: 100%; + height: 2px; + background: #222222; + position: absolute; + border-radius: 2px; + opacity: 0.5; + } +} + +.bar { + top: 7px; + left: 0; + width: 100%; + height: 6px; + background: #222222; + position: absolute; + border-radius: 2px; +} diff --git a/src/components/media/AudioPlayer/index.tsx b/src/components/media/AudioPlayer/index.tsx index 7078d4db..8494333e 100644 --- a/src/components/media/AudioPlayer/index.tsx +++ b/src/components/media/AudioPlayer/index.tsx @@ -86,10 +86,11 @@ const AudioPlayerUnconnected = ({ {playing && status === PLAYER_STATES.PLAYING ? <Icon icon="pause" /> : <Icon icon="play" />} </div> <div className={styles.content}> + <div className={styles.title}>{title || 'Unknown'}</div> + <div className={styles.progress} onClick={onSeek}> <div className={styles.bar} style={{ width: `${progress.progress}%` }} /> </div> - <div className={styles.title}>{title || 'Unknown'}</div> </div> </div> ); diff --git a/src/containers/main/BottomContainer/styles.scss b/src/containers/main/BottomContainer/styles.scss index 9354d2f4..f7582455 100644 --- a/src/containers/main/BottomContainer/styles.scss +++ b/src/containers/main/BottomContainer/styles.scss @@ -1,10 +1,10 @@ .wrap { position: fixed; transform: translateZ(0); - bottom: $gap; + bottom: 0; pointer-events: none; touch-action: none; - height: 54px; + height: 64px; display: flex; z-index: 10; width: 100%; diff --git a/src/containers/main/MainLayout/styles.scss b/src/containers/main/MainLayout/styles.scss index 5909cbb7..d98cb981 100644 --- a/src/containers/main/MainLayout/styles.scss +++ b/src/containers/main/MainLayout/styles.scss @@ -14,6 +14,6 @@ width: 100%; max-width: $content_width; display: flex; - padding-bottom: 10px; + padding-bottom: 64px; flex-direction: column; } diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index 02d7b10b..4153147b 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -56,6 +56,7 @@ const NodeLayoutUnconnected: FC<IProps> = ({ }, [node, nodeUpdateTags] ); + const block = node && node.type && NODE_COMPONENTS[node.type] && NODE_COMPONENTS[node.type]; return ( From c84dfdd2ab91aea7f992984f90f3d285e37426e5 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 15 Oct 2019 17:30:31 +0700 Subject: [PATCH 05/99] better audio player --- src/components/bars/PlayerBar/index.tsx | 12 ++++++++---- src/components/bars/PlayerBar/styles.scss | 1 + src/components/media/AudioPlayer/index.tsx | 8 ++++---- src/redux/player/actions.ts | 13 +++++++++++++ src/redux/player/constants.ts | 3 +++ src/redux/player/sagas.ts | 22 +++++++++++++++++----- src/utils/player.ts | 9 ++++++++- 7 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/components/bars/PlayerBar/index.tsx b/src/components/bars/PlayerBar/index.tsx index 166a4724..3770ebd3 100644 --- a/src/components/bars/PlayerBar/index.tsx +++ b/src/components/bars/PlayerBar/index.tsx @@ -8,12 +8,15 @@ import pick from 'ramda/es/pick'; import { selectPlayer } from '~/redux/player/selectors'; import * as PLAYER_ACTIONS from '~/redux/player/actions'; import { IPlayerProgress, Player } from '~/utils/player'; +import path from 'ramda/es/path'; +import { IFile } from '~/redux/types'; const mapStateToProps = state => pick(['status', 'file'], selectPlayer(state)); const mapDispatchToProps = { playerPlay: PLAYER_ACTIONS.playerPlay, playerPause: PLAYER_ACTIONS.playerPause, playerSeek: PLAYER_ACTIONS.playerSeek, + playerStop: PLAYER_ACTIONS.playerStop, }; type IProps = ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & {}; @@ -23,6 +26,7 @@ const PlayerBarUnconnected: FC<IProps> = ({ playerPlay, playerPause, playerSeek, + playerStop, file, }) => { const [progress, setProgress] = useState<IPlayerProgress>({ progress: 0, current: 0, total: 0 }); @@ -60,10 +64,10 @@ const PlayerBarUnconnected: FC<IProps> = ({ if (status === PLAYER_STATES.UNSET) return null; + const metadata: IFile['metadata'] = path(['metadata'], file); const title = - file.metadata && - (file.metadata.title || - [file.metadata.id3artist, file.metadata.id3title].filter(el => !!el).join(' - ')); + metadata && + (metadata.title || [metadata.id3artist, metadata.id3title].filter(el => !!el).join(' - ')); return ( <div className={styles.place}> @@ -81,7 +85,7 @@ const PlayerBarUnconnected: FC<IProps> = ({ </div> </div> - <div className={styles.close}> + <div className={styles.close} onClick={playerStop}> <Icon icon="close" /> </div> </div> diff --git a/src/components/bars/PlayerBar/styles.scss b/src/components/bars/PlayerBar/styles.scss index 5f8d460f..9d9356f7 100644 --- a/src/components/bars/PlayerBar/styles.scss +++ b/src/components/bars/PlayerBar/styles.scss @@ -63,6 +63,7 @@ } .info { + flex: 1; display: flex; min-width: 0; align-items: center; diff --git a/src/components/media/AudioPlayer/index.tsx b/src/components/media/AudioPlayer/index.tsx index 8494333e..5dcbf462 100644 --- a/src/components/media/AudioPlayer/index.tsx +++ b/src/components/media/AudioPlayer/index.tsx @@ -14,7 +14,7 @@ const mapStateToProps = state => ({ }); const mapDispatchToProps = { - playerSetFile: PLAYER_ACTIONS.playerSetFile, + playerSetFileAndPlay: PLAYER_ACTIONS.playerSetFileAndPlay, playerPlay: PLAYER_ACTIONS.playerPlay, playerPause: PLAYER_ACTIONS.playerPause, playerSeek: PLAYER_ACTIONS.playerSeek, @@ -29,7 +29,7 @@ const AudioPlayerUnconnected = ({ file, player: { file: current, status }, - playerSetFile, + playerSetFileAndPlay, playerPlay, playerPause, playerSeek, @@ -43,8 +43,8 @@ const AudioPlayerUnconnected = ({ return playerPlay(); } - playerSetFile(file); - }, [file, current, status, playerPlay, playerPause, playerSetFile]); + playerSetFileAndPlay(file); + }, [file, current, status, playerPlay, playerPause, playerSetFileAndPlay]); const onProgress = useCallback( ({ detail }: { detail: IPlayerProgress }) => { diff --git a/src/redux/player/actions.ts b/src/redux/player/actions.ts index b2232d3d..fc242e2b 100644 --- a/src/redux/player/actions.ts +++ b/src/redux/player/actions.ts @@ -6,6 +6,11 @@ export const playerSetFile = (file: IPlayerState['file']) => ({ file, }); +export const playerSetFileAndPlay = (file: IPlayerState['file']) => ({ + type: PLAYER_ACTIONS.SET_FILE_AND_PLAY, + file, +}); + export const playerSetStatus = (status: IPlayerState['status']) => ({ type: PLAYER_ACTIONS.SET_STATUS, status, @@ -19,6 +24,14 @@ export const playerPause = () => ({ type: PLAYER_ACTIONS.PAUSE, }); +export const playerStop = () => ({ + type: PLAYER_ACTIONS.STOP, +}); + +export const playerStopped = () => ({ + type: PLAYER_ACTIONS.STOPPED, +}); + export const playerSeek = (seek: number) => ({ type: PLAYER_ACTIONS.SEEK, seek, diff --git a/src/redux/player/constants.ts b/src/redux/player/constants.ts index 83909cfe..ab36ee61 100644 --- a/src/redux/player/constants.ts +++ b/src/redux/player/constants.ts @@ -2,11 +2,14 @@ const prefix = 'PLAYER.'; export const PLAYER_ACTIONS = { SET_FILE: `${prefix}SET_FILE`, + SET_FILE_AND_PLAY: `${prefix}SET_FILE_AND_PLAY`, SET_STATUS: `${prefix}SET_STATUS`, PLAY: `${prefix}PLAY`, PAUSE: `${prefix}PAUSE`, SEEK: `${prefix}SEEK`, + STOP: `${prefix}STOP`, + STOPPED: `${prefix}STOPPED`, }; export const PLAYER_STATES = { diff --git a/src/redux/player/sagas.ts b/src/redux/player/sagas.ts index fd3ba811..28b24354 100644 --- a/src/redux/player/sagas.ts +++ b/src/redux/player/sagas.ts @@ -1,10 +1,11 @@ -import { takeLatest } from 'redux-saga/effects'; -import { PLAYER_ACTIONS } from './constants'; -import { playerSetFile, playerSeek } from './actions'; +import { takeLatest, put } from 'redux-saga/effects'; +import { PLAYER_ACTIONS, PLAYER_STATES } from './constants'; +import { playerSetFile, playerSeek, playerSetStatus } from './actions'; import { Player } from '~/utils/player'; import { getURL } from '~/utils/dom'; -function setFileSaga({ file }: ReturnType<typeof playerSetFile>) { +function* setFileAndPlaySaga({ file }: ReturnType<typeof playerSetFile>) { + yield put(playerSetFile(file)); Player.set(getURL(file)); Player.play(); } @@ -17,13 +18,24 @@ function pauseSaga() { Player.pause(); } +function stopSaga() { + Player.stop(); +} + function seekSaga({ seek }: ReturnType<typeof playerSeek>) { Player.jumpToPercent(seek * 100); } +function* stoppedSaga() { + yield put(playerSetStatus(PLAYER_STATES.UNSET)); + yield put(playerSetFile(null)); +} + export default function* playerSaga() { - yield takeLatest(PLAYER_ACTIONS.SET_FILE, setFileSaga); + yield takeLatest(PLAYER_ACTIONS.SET_FILE_AND_PLAY, setFileAndPlaySaga); yield takeLatest(PLAYER_ACTIONS.PAUSE, pauseSaga); yield takeLatest(PLAYER_ACTIONS.PLAY, playSaga); yield takeLatest(PLAYER_ACTIONS.SEEK, seekSaga); + yield takeLatest(PLAYER_ACTIONS.STOP, stopSaga); + yield takeLatest(PLAYER_ACTIONS.STOPPED, stoppedSaga); } diff --git a/src/utils/player.ts b/src/utils/player.ts index f467bcf5..23e5d501 100644 --- a/src/utils/player.ts +++ b/src/utils/player.ts @@ -1,5 +1,5 @@ import { store } from '~/redux/store'; -import { playerSetStatus } from '~/redux/player/actions'; +import { playerSetStatus, playerStopped } from '~/redux/player/actions'; import { PLAYER_STATES } from '~/redux/player/constants'; type PlayerEventType = keyof HTMLMediaElementEventMap; @@ -64,6 +64,11 @@ export class PlayerClass { this.element.pause(); }; + public stop = () => { + this.element.src = ''; + this.element.dispatchEvent(new CustomEvent('stop')); + }; + public getDuration = () => { return this.element.currentTime; }; @@ -83,5 +88,7 @@ const Player = new PlayerClass(); Player.on('play', () => store.dispatch(playerSetStatus(PLAYER_STATES.PLAYING))); Player.on('pause', () => store.dispatch(playerSetStatus(PLAYER_STATES.PAUSED))); +Player.on('stop', () => store.dispatch(playerStopped())); +Player.on('error', () => store.dispatch(playerStopped())); export { Player }; From fe90fc16acfe3b22d6aa728ac8038e1f7f2217f6 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 15 Oct 2019 17:50:27 +0700 Subject: [PATCH 06/99] fixed comments appearance --- .../containers/CommentWrapper/index.tsx | 17 ++++++--- .../containers/CommentWrapper/styles.scss | 36 +++++++++++++++++++ src/components/node/Comment/index.tsx | 2 +- src/components/node/CommentForm/index.tsx | 4 +-- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/components/containers/CommentWrapper/index.tsx b/src/components/containers/CommentWrapper/index.tsx index 4847ae2a..e93b61dc 100644 --- a/src/components/containers/CommentWrapper/index.tsx +++ b/src/components/containers/CommentWrapper/index.tsx @@ -3,21 +3,26 @@ import classNames from 'classnames'; import * as styles from './styles.scss'; import { Card } from '../Card'; +import { IUser } from '~/redux/auth/types'; +import { getURL } from '~/utils/dom'; +import path from 'ramda/es/path'; type IProps = HTMLAttributes<HTMLDivElement> & { - photo?: string; + // photo?: string; + user: IUser; is_empty?: boolean; is_loading?: boolean; is_same?: boolean; }; const CommentWrapper: FC<IProps> = ({ - photo, + // photo, children, is_empty, is_loading, className, is_same, + user, ...props }) => ( <Card @@ -26,9 +31,11 @@ const CommentWrapper: FC<IProps> = ({ {...props} > <div className={styles.thumb}> - {!is_same && photo && ( - <div className={styles.thumb_image} style={{ backgroundImage: `url("${photo}")` }} /> - )} + <div + className={styles.thumb_image} + style={{ backgroundImage: `url("${getURL(path(['photo'], user))}")` }} + /> + <div className={styles.thumb_user}>~{path(['username'], user)}</div> </div> <div className={styles.text}>{children}</div> diff --git a/src/components/containers/CommentWrapper/styles.scss b/src/components/containers/CommentWrapper/styles.scss index 05a9b126..23988d3f 100644 --- a/src/components/containers/CommentWrapper/styles.scss +++ b/src/components/containers/CommentWrapper/styles.scss @@ -14,6 +14,10 @@ margin: 0 !important; border-radius: 0; } + + @include tablet { + flex-direction: column; + } } .text { @@ -25,6 +29,17 @@ flex: 0 0 $comment_height; border-radius: $panel_radius 0 0 $panel_radius; background-color: transparentize(black, 0.9); + display: flex; + flex-direction: column; + box-sizing: border-box; + + @include tablet { + flex-direction: row; + flex: 0 0 40px; + padding: 8px; + box-shadow: inset rgba(255, 255, 255, 0.05) 1px 1px, inset rgba(0, 0, 0, 0.1) -1px -1px; + border-radius: $panel_radius $panel_radius 0 0; + } } .thumb_image { @@ -32,4 +47,25 @@ background: transparentize(white, 0.97) no-repeat 50% 50%; border-radius: $panel_radius 0 0 $panel_radius; background-size: cover; + flex: 0 0 $comment_height; + + @include tablet { + height: 32px; + flex: 0 0 32px; + border-radius: $panel_radius; + } +} + +.thumb_user { + display: none; + flex: 1; + align-items: center; + justify-content: flex-start; + box-sizing: border-box; + padding: 0 $gap; + font: $font_14_medium; + + @include tablet { + display: flex; + } } diff --git a/src/components/node/Comment/index.tsx b/src/components/node/Comment/index.tsx index 5fd8b9f6..e3b1f3b0 100644 --- a/src/components/node/Comment/index.tsx +++ b/src/components/node/Comment/index.tsx @@ -25,7 +25,7 @@ const Comment: FC<IProps> = ({ className={className} is_empty={is_empty} is_loading={is_loading} - photo={getURL(comment_group.user.photo)} + user={comment_group.user} is_same={is_same} {...props} > diff --git a/src/components/node/CommentForm/index.tsx b/src/components/node/CommentForm/index.tsx index a096ea7e..c66dae7c 100644 --- a/src/components/node/CommentForm/index.tsx +++ b/src/components/node/CommentForm/index.tsx @@ -42,7 +42,7 @@ type IProps = ReturnType<typeof mapStateToProps> & const CommentFormUnconnected: FC<IProps> = ({ node: { comment_data, is_sending_comment }, uploads: { statuses, files }, - user: { photo }, + user, id, nodePostComment, nodeSetCommentData, @@ -122,7 +122,7 @@ const CommentFormUnconnected: FC<IProps> = ({ const comment = comment_data[id]; return ( - <CommentWrapper photo={getURL(photo)}> + <CommentWrapper user={user}> <form onSubmit={onSubmit} className={styles.wrap}> <div className={styles.input}> <Textarea From 6bb24fc86946ebf46d58c7b635d0895aed9081f5 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 15 Oct 2019 17:58:14 +0700 Subject: [PATCH 07/99] hiding comment author on mobile --- src/components/containers/CommentWrapper/styles.scss | 7 +++++++ src/utils/dom.ts | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/containers/CommentWrapper/styles.scss b/src/components/containers/CommentWrapper/styles.scss index 23988d3f..42897f16 100644 --- a/src/components/containers/CommentWrapper/styles.scss +++ b/src/components/containers/CommentWrapper/styles.scss @@ -23,6 +23,13 @@ .text { flex: 1; min-width: 0; + + @include tablet { + :global(.comment-author) { + display: none !important; + color: red; + } + } } .thumb { diff --git a/src/utils/dom.ts b/src/utils/dom.ts index 62649a81..00ed1461 100644 --- a/src/utils/dom.ts +++ b/src/utils/dom.ts @@ -77,7 +77,9 @@ export const formatCommentText = (author, text: string) => .replace(/:\|--\|/gim, '://') .split('\n') .map((el, index) => - index === 0 ? `${author ? `<p><b>${author}</b>: ` : ''}${el}</p>` : `<p>${el}</p>` + index === 0 + ? `${author ? `<p><b class="comment-author">${author}: </b>` : ''}${el}</p>` + : `<p>${el}</p>` ) .join(''); // .replace(/\/\*(\*(?!\/)|[^*])*\*\//igm, ''); From 3fdf14d68026383a8bcea2dcde79bc6fb5b659d3 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 10:10:27 +0700 Subject: [PATCH 08/99] submit bar --- src/components/bars/PlayerBar/styles.scss | 16 ++--- src/components/bars/SubmitBar/index.tsx | 39 +++++++++++ src/components/bars/SubmitBar/styles.scss | 65 +++++++++++++++++++ src/components/main/Header/index.tsx | 4 -- src/containers/main/BottomContainer/index.tsx | 13 +++- .../main/BottomContainer/styles.scss | 4 +- src/containers/main/MainLayout/styles.scss | 4 ++ src/redux/modal/constants.ts | 5 +- src/redux/modal/reducer.ts | 2 +- src/styles/variables.scss | 3 +- 10 files changed, 131 insertions(+), 24 deletions(-) create mode 100644 src/components/bars/SubmitBar/index.tsx create mode 100644 src/components/bars/SubmitBar/styles.scss diff --git a/src/components/bars/PlayerBar/styles.scss b/src/components/bars/PlayerBar/styles.scss index 9d9356f7..937b2b83 100644 --- a/src/components/bars/PlayerBar/styles.scss +++ b/src/components/bars/PlayerBar/styles.scss @@ -1,14 +1,8 @@ .place { position: relative; - height: 64px; + height: $bar_height; flex: 0 1 500px; display: flex; - - &:hover { - .seeker { - transform: translate(0, -64px); - } - } } .wrap { @@ -22,7 +16,7 @@ top: 0; left: 0; width: 100%; - height: 64px; + height: $bar_height; flex-direction: column; transform: translate(0, 0); z-index: 3; @@ -30,18 +24,18 @@ } .status { - flex: 0 0 64px; + flex: 0 0 $bar_height; display: flex; flex-direction: row; width: 100%; position: absolute; z-index: 1; - height: 64px; + height: $bar_height; } .playpause, .close { - flex: 0 0 48px; + flex: 0 0 $bar_height; display: flex; align-items: center; justify-content: center; diff --git a/src/components/bars/SubmitBar/index.tsx b/src/components/bars/SubmitBar/index.tsx new file mode 100644 index 00000000..0450787f --- /dev/null +++ b/src/components/bars/SubmitBar/index.tsx @@ -0,0 +1,39 @@ +import React, { FC, useCallback } from 'react'; +import { connect } from 'react-redux'; +import { Icon } from '~/components/input/Icon'; +import * as MODAL_ACTIONS from '~/redux/modal/actions'; +import { DIALOGS } from '~/redux/modal/constants'; + +import * as styles from './styles.scss'; + +const mapStateToProps = null; +const mapDispatchToProps = { + showDialog: MODAL_ACTIONS.modalShowDialog, +}; + +type IProps = typeof mapDispatchToProps & {}; + +const SubmitBarUnconnected: FC<IProps> = ({ showDialog }) => { + const onOpenImageEditor = useCallback(() => showDialog(DIALOGS.EDITOR_IMAGE), [showDialog]); + + return ( + <div className={styles.wrap}> + <div className={styles.panel}> + <div onClick={onOpenImageEditor}> + <Icon icon="image" /> + </div> + </div> + + <div className={styles.button}> + <Icon icon="plus" /> + </div> + </div> + ); +}; + +const SubmitBar = connect( + mapStateToProps, + mapDispatchToProps +)(SubmitBarUnconnected); + +export { SubmitBar }; diff --git a/src/components/bars/SubmitBar/styles.scss b/src/components/bars/SubmitBar/styles.scss new file mode 100644 index 00000000..a2dc219f --- /dev/null +++ b/src/components/bars/SubmitBar/styles.scss @@ -0,0 +1,65 @@ +.wrap { + position: absolute; + right: -($bar_height + $gap); + + &:hover { + .panel { + transform: translate(0, 0); + } + } + + @include tablet { + position: relative; + right: 0; + margin-left: $gap; + } +} + +.button { + background: $red_gradient; + width: $bar_height; + height: $bar_height; + border-radius: $bar_height / 2; + display: flex; + align-items: center; + justify-content: center; + border-radius: $radius $radius 0 0; + cursor: pointer; + position: relative; + z-index: 2; + + svg { + width: 32px; + height: 32px; + } +} + +.panel { + background: lighten($content_bg, 4%); + position: absolute; + bottom: 0; + z-index: 1; + padding-bottom: $bar_height; + border-radius: $radius $radius 0 0; + transform: translate(0, 100%); + transition: transform 250ms; + + div { + @include outer_shadow; + height: $bar_height; + width: $bar_height; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + + svg { + width: 32px; + height: 32px; + } + + &:first-child { + border-radius: $radius $radius 0 0; + } + } +} diff --git a/src/components/main/Header/index.tsx b/src/components/main/Header/index.tsx index 22acda4f..7f1476c7 100644 --- a/src/components/main/Header/index.tsx +++ b/src/components/main/Header/index.tsx @@ -12,9 +12,7 @@ import * as MODAL_ACTIONS from '~/redux/modal/actions'; import { DIALOGS } from '~/redux/modal/constants'; import { pick } from 'ramda'; import { Icon } from '~/components/input/Icon'; -import { url } from 'inspector'; import { getURL } from '~/utils/dom'; -import path from 'ramda/es/path'; const mapStateToProps = state => ({ user: pick(['username', 'is_user', 'photo'])(selectUser(state)), @@ -29,7 +27,6 @@ type IProps = ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & { const HeaderUnconnected: FC<IProps> = ({ user: { username, is_user, photo }, showDialog }) => { const onLogin = useCallback(() => showDialog(DIALOGS.LOGIN), [showDialog]); - const onOpenEditor = useCallback(() => showDialog(DIALOGS.EDITOR), [showDialog]); return ( <div className={style.container}> @@ -38,7 +35,6 @@ const HeaderUnconnected: FC<IProps> = ({ user: { username, is_user, photo }, sho <Filler /> <div className={style.plugs}> - <div onClick={onOpenEditor}>editor</div> <Link to="/">flow</Link> </div> diff --git a/src/containers/main/BottomContainer/index.tsx b/src/containers/main/BottomContainer/index.tsx index 86eee480..1c551ade 100644 --- a/src/containers/main/BottomContainer/index.tsx +++ b/src/containers/main/BottomContainer/index.tsx @@ -1,15 +1,24 @@ import React, { FC } from 'react'; import * as styles from './styles.scss'; import { PlayerBar } from '~/components/bars/PlayerBar'; +import { SubmitBar } from '~/components/bars/SubmitBar'; +import { selectUser } from '~/redux/auth/selectors'; +import pick from 'ramda/es/pick'; +import { connect } from 'react-redux'; -interface IProps {} +const mapStateToProps = state => pick(['is_user'], selectUser(state)); -const BottomContainer: FC<IProps> = ({}) => ( +type IProps = ReturnType<typeof mapStateToProps> & {}; + +const BottomContainerUnconnected: FC<IProps> = ({ is_user }) => ( <div className={styles.wrap}> <div className={styles.content}> <PlayerBar /> + + {is_user && <SubmitBar />} </div> </div> ); +const BottomContainer = connect(mapStateToProps)(BottomContainerUnconnected); export { BottomContainer }; diff --git a/src/containers/main/BottomContainer/styles.scss b/src/containers/main/BottomContainer/styles.scss index f7582455..9e5ae555 100644 --- a/src/containers/main/BottomContainer/styles.scss +++ b/src/containers/main/BottomContainer/styles.scss @@ -4,7 +4,7 @@ bottom: 0; pointer-events: none; touch-action: none; - height: 64px; + height: $bar_height; display: flex; z-index: 10; width: 100%; @@ -18,7 +18,7 @@ .content { position: relative; flex: 0 1 $content_width; - height: 48px; + height: $bar_height; display: flex; align-items: center; justify-content: flex-end; diff --git a/src/containers/main/MainLayout/styles.scss b/src/containers/main/MainLayout/styles.scss index d98cb981..4ba29c90 100644 --- a/src/containers/main/MainLayout/styles.scss +++ b/src/containers/main/MainLayout/styles.scss @@ -6,6 +6,10 @@ box-sizing: border-box; align-items: center; justify-content: flex-start; + + @include tablet { + padding: 0; + } } .content { diff --git a/src/redux/modal/constants.ts b/src/redux/modal/constants.ts index bc98fb46..08ee7acb 100644 --- a/src/redux/modal/constants.ts +++ b/src/redux/modal/constants.ts @@ -1,5 +1,4 @@ import { ValueOf } from '~/redux/types'; -import { HorizontalExample } from '~/containers/examples/HorizontalExample'; import { EditorDialog } from '~/containers/dialogs/EditorDialog'; import { LoginDialog } from '~/containers/dialogs/LoginDialog'; @@ -10,12 +9,12 @@ export const MODAL_ACTIONS = { }; export const DIALOGS = { - EDITOR: 'EDITOR', + EDITOR_IMAGE: 'EDITOR_IMAGE', LOGIN: 'LOGIN', }; export const DIALOG_CONTENT = { - [DIALOGS.EDITOR]: EditorDialog, + [DIALOGS.EDITOR_IMAGE]: EditorDialog, [DIALOGS.LOGIN]: LoginDialog, }; diff --git a/src/redux/modal/reducer.ts b/src/redux/modal/reducer.ts index 8d2c95ec..be90b850 100644 --- a/src/redux/modal/reducer.ts +++ b/src/redux/modal/reducer.ts @@ -10,7 +10,7 @@ export interface IModalState { const INITIAL_STATE: IModalState = { is_shown: false, - dialog: DIALOGS.EDITOR, + dialog: null, }; export default createReducer(INITIAL_STATE, MODAL_HANDLERS); diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 1d7584f0..cd9a6404 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -6,6 +6,7 @@ $content_width: $cell * 4 + $grid_line * 3; $gap: 10px; $spc: $gap * 2; $comment_height: 72px; +$bar_height: 64px; $radius: 8px; $cell_radius: $radius; @@ -67,7 +68,7 @@ $input_shadow_error: inset $red 0 0 0 1px; $input_shadow_filled: $input_shadow; @mixin outer_shadow() { - box-shadow: inset transparentize(white, 0.95) 0 1px, transparentize(black, 0.8) 0 3px; + box-shadow: inset transparentize(white, 0.95) 1px 1px, transparentize(black, 0.8) -1px -1px; } @mixin inner_shadow() { From 1f9c6ac8f736153bca68ecc4b2d44c30c5f8bd74 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 11:00:33 +0700 Subject: [PATCH 09/99] refactored upload component --- src/components/editors/EditorPanel/index.tsx | 9 +- .../editors/EditorUploadButton/index.tsx | 132 ++++++++++++++++-- src/components/editors/ImageEditor/index.tsx | 20 +-- src/components/editors/ImageGrid/index.tsx | 38 +++-- src/containers/dialogs/EditorDialog/index.tsx | 99 +------------ 5 files changed, 151 insertions(+), 147 deletions(-) diff --git a/src/components/editors/EditorPanel/index.tsx b/src/components/editors/EditorPanel/index.tsx index 6932ef1d..475b0bb2 100644 --- a/src/components/editors/EditorPanel/index.tsx +++ b/src/components/editors/EditorPanel/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, ChangeEventHandler } from 'react'; +import React, { FC } from 'react'; import * as styles from './styles.scss'; import { INode } from '~/redux/types'; import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; @@ -6,12 +6,13 @@ import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; interface IProps { data: INode; setData: (val: INode) => void; - onUpload: ChangeEventHandler<HTMLInputElement>; + temp: string[]; + setTemp: (val: string[]) => void; } -const EditorPanel: FC<IProps> = ({ onUpload }) => ( +const EditorPanel: FC<IProps> = ({ data, setData, temp, setTemp }) => ( <div className={styles.panel}> - <EditorUploadButton onUpload={onUpload} /> + <EditorUploadButton data={data} setData={setData} temp={temp} setTemp={setTemp} /> </div> ); diff --git a/src/components/editors/EditorUploadButton/index.tsx b/src/components/editors/EditorUploadButton/index.tsx index 358e938e..e29115d2 100644 --- a/src/components/editors/EditorUploadButton/index.tsx +++ b/src/components/editors/EditorUploadButton/index.tsx @@ -1,21 +1,127 @@ -import React, { FC, ChangeEventHandler } from 'react'; +import React, { FC, useCallback, useEffect, useState } from 'react'; import * as styles from './styles.scss'; import { Icon } from '~/components/input/Icon'; +import { IFileWithUUID, INode, IFile } from '~/redux/types'; +import uuid from 'uuid4'; +import { UPLOAD_SUBJECTS, UPLOAD_TARGETS, UPLOAD_TYPES } from '~/redux/uploads/constants'; +import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; +import assocPath from 'ramda/es/assocPath'; +import append from 'ramda/es/append'; +import { selectUploads } from '~/redux/uploads/selectors'; +import { connect } from 'react-redux'; -interface IProps { - onUpload?: ChangeEventHandler<HTMLInputElement>; -} +const mapStateToProps = state => { + const { statuses, files } = selectUploads(state); -const EditorUploadButton: FC<IProps> = ({ - onUpload, -}) => ( - <div className={styles.wrap}> - <input type="file" onChange={onUpload} accept="image/*" multiple /> + return { statuses, files }; +}; - <div className={styles.icon}> - <Icon size={32} icon="plus" /> +const mapDispatchToProps = { + uploadUploadFiles: UPLOAD_ACTIONS.uploadUploadFiles, +}; + +type IProps = ReturnType<typeof mapStateToProps> & + typeof mapDispatchToProps & { + data: INode; + setData: (val: INode) => void; + temp: string[]; + setTemp: (val: string[]) => void; + }; + +const EditorUploadButtonUnconnected: FC<IProps> = ({ + data, + setData, + temp, + setTemp, + statuses, + files, + uploadUploadFiles, +}) => { + const eventPreventer = useCallback(event => event.preventDefault(), []); + + const onUpload = useCallback( + (uploads: File[]) => { + const items: IFileWithUUID[] = Array.from(uploads).map( + (file: File): IFileWithUUID => ({ + file, + temp_id: uuid(), + subject: UPLOAD_SUBJECTS.EDITOR, + target: UPLOAD_TARGETS.NODES, + type: UPLOAD_TYPES.IMAGE, + }) + ); + + const temps = items.map(file => file.temp_id); + + setTemp([...temp, ...temps]); + uploadUploadFiles(items); + }, + [setTemp, uploadUploadFiles, temp] + ); + + const onFileAdd = useCallback( + (file: IFile) => { + setData(assocPath(['files'], append(file, data.files), data)); + }, + [data, setData] + ); + + // const onDrop = useCallback( + // (event: React.DragEvent<HTMLDivElement>) => { + // event.preventDefault(); + + // if (!event.dataTransfer || !event.dataTransfer.files || !event.dataTransfer.files.length) + // return; + + // onUpload(Array.from(event.dataTransfer.files)); + // }, + // [onUpload] + // ); + + useEffect(() => { + window.addEventListener('dragover', eventPreventer, false); + window.addEventListener('drop', eventPreventer, false); + + return () => { + window.removeEventListener('dragover', eventPreventer, false); + window.removeEventListener('drop', eventPreventer, false); + }; + }, [eventPreventer]); + + useEffect(() => { + Object.entries(statuses).forEach(([id, status]) => { + if (temp.includes(id) && !!status.uuid && files[status.uuid]) { + onFileAdd(files[status.uuid]); + setTemp(temp.filter(el => el !== id)); + } + }); + }, [statuses, files, temp, onFileAdd]); + + const onInputChange = useCallback( + event => { + event.preventDefault(); + + if (!event.target.files || !event.target.files.length) return; + + onUpload(Array.from(event.target.files)); + }, + [onUpload] + ); + + return ( + <div className={styles.wrap}> + <input type="file" onChange={onInputChange} accept="image/*" multiple /> + + <div className={styles.icon}> + <Icon size={32} icon="plus" /> + </div> </div> - </div> -); + ); +}; + +const EditorUploadButton = connect( + mapStateToProps, + mapDispatchToProps +)(EditorUploadButtonUnconnected); export { EditorUploadButton }; diff --git a/src/components/editors/ImageEditor/index.tsx b/src/components/editors/ImageEditor/index.tsx index 5eb13eed..aecf0a90 100644 --- a/src/components/editors/ImageEditor/index.tsx +++ b/src/components/editors/ImageEditor/index.tsx @@ -1,10 +1,12 @@ -import React, { FC, ChangeEventHandler, DragEventHandler } from 'react'; +import React, { FC, ChangeEventHandler, DragEventHandler, useCallback } from 'react'; import { connect } from 'react-redux'; import { INode } from '~/redux/types'; import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; import { selectUploads } from '~/redux/uploads/selectors'; import { ImageGrid } from '~/components/editors/ImageGrid'; import { IUploadStatus } from '~/redux/uploads/reducer'; +import { moveArrItem } from '~/utils/fn'; +import assocPath from 'ramda/es/assocPath'; const mapStateToProps = selectUploads; const mapDispatchToProps = { @@ -21,19 +23,9 @@ type IProps = ReturnType<typeof mapStateToProps> & onInputChange: ChangeEventHandler<HTMLInputElement>; }; -const ImageEditorUnconnected: FC<IProps> = ({ - data, - onFileMove, - onInputChange, - pending_files, -}) => ( - <ImageGrid - onFileMove={onFileMove} - items={data.files} - locked={pending_files} - onUpload={onInputChange} - /> -); +const ImageEditorUnconnected: FC<IProps> = ({ data, setData, pending_files }) => { + return <ImageGrid data={data} setData={setData} locked={pending_files} />; +}; const ImageEditor = connect( mapStateToProps, diff --git a/src/components/editors/ImageGrid/index.tsx b/src/components/editors/ImageGrid/index.tsx index 8b7f5052..7a2ef947 100644 --- a/src/components/editors/ImageGrid/index.tsx +++ b/src/components/editors/ImageGrid/index.tsx @@ -1,16 +1,19 @@ -import React, { FC, useCallback, ChangeEventHandler, DragEventHandler } from 'react'; -import { SortableContainer, SortableElement } from 'react-sortable-hoc'; +import React, { FC, useCallback } from 'react'; +import { SortableContainer, SortableElement, SortEvent, SortEnd } from 'react-sortable-hoc'; import * as styles from './styles.scss'; import { ImageUpload } from '~/components/upload/ImageUpload'; -import { IFile } from '~/redux/types'; +import { IFile, INode } from '~/redux/types'; import { IUploadStatus } from '~/redux/uploads/reducer'; import { getURL } from '~/utils/dom'; +import assocPath from 'ramda/es/assocPath'; +import { moveArrItem } from '~/utils/fn'; interface IProps { - items: IFile[]; + data: INode; + setData: (val: INode) => void; locked: IUploadStatus[]; - onFileMove: (o: number, n: number) => void; - onUpload?: ChangeEventHandler<HTMLInputElement>; + // items: IFile[]; + // onFileMove: (o: number, n: number) => void; } const SortableItem = SortableElement(({ children }) => ( @@ -18,14 +21,7 @@ const SortableItem = SortableElement(({ children }) => ( )); const SortableList = SortableContainer( - ({ - items, - locked, - }: { - items: IFile[]; - locked: IUploadStatus[]; - onUpload: ChangeEventHandler<HTMLInputElement>; - }) => ( + ({ items, locked }: { items: IFile[]; locked: IUploadStatus[] }) => ( <div className={styles.grid}> {items.map((file, index) => ( <SortableItem key={file.id} index={index} collection={0}> @@ -42,18 +38,20 @@ const SortableList = SortableContainer( ) ); -const ImageGrid: FC<IProps> = ({ items, locked, onFileMove, onUpload }) => { - const onMove = useCallback(({ oldIndex, newIndex }) => onFileMove(oldIndex, newIndex), [ - onFileMove, - ]); +const ImageGrid: FC<IProps> = ({ data, setData, locked }) => { + const onMove = useCallback( + ({ oldIndex, newIndex }: SortEnd) => { + setData(assocPath(['files'], moveArrItem(oldIndex, newIndex, data.files), data)); + }, + [data, setData] + ); return ( <SortableList onSortEnd={onMove} axis="xy" - items={items} + items={data.files} locked={locked} - onUpload={onUpload} pressDelay={window.innerWidth < 768 ? 200 : 0} helperClass={styles.helper} /> diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx index c9332066..8b0a8a53 100644 --- a/src/containers/dialogs/EditorDialog/index.tsx +++ b/src/containers/dialogs/EditorDialog/index.tsx @@ -14,12 +14,8 @@ import * as styles from './styles.scss'; import { selectNode } from '~/redux/node/selectors'; import { ImageEditor } from '~/components/editors/ImageEditor'; import { EditorPanel } from '~/components/editors/EditorPanel'; -import { moveArrItem } from '~/utils/fn'; -import { IFile, IFileWithUUID } from '~/redux/types'; -import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; import * as NODE_ACTIONS from '~/redux/node/actions'; import { selectUploads } from '~/redux/uploads/selectors'; -import { UPLOAD_TARGETS, UPLOAD_TYPES, UPLOAD_SUBJECTS } from '~/redux/uploads/constants'; const mapStateToProps = state => { const { editor } = selectNode(state); @@ -29,101 +25,15 @@ const mapStateToProps = state => { }; const mapDispatchToProps = { - uploadUploadFiles: UPLOAD_ACTIONS.uploadUploadFiles, nodeSave: NODE_ACTIONS.nodeSave, }; type IProps = IDialogProps & ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & {}; -const EditorDialogUnconnected: FC<IProps> = ({ - onRequestClose, - editor, - files, - statuses, - - uploadUploadFiles, - nodeSave, -}) => { +const EditorDialogUnconnected: FC<IProps> = ({ onRequestClose, editor, statuses, nodeSave }) => { const [data, setData] = useState(editor); - const eventPreventer = useCallback(event => event.preventDefault(), []); const [temp, setTemp] = useState([]); - const onUpload = useCallback( - (uploads: File[]) => { - const items: IFileWithUUID[] = Array.from(uploads).map( - (file: File): IFileWithUUID => ({ - file, - temp_id: uuid(), - subject: UPLOAD_SUBJECTS.EDITOR, - target: UPLOAD_TARGETS.NODES, - type: UPLOAD_TYPES.IMAGE, - }) - ); - - const temps = items.map(file => file.temp_id); - - setTemp([...temp, ...temps]); - uploadUploadFiles(items); - }, - [setTemp, uploadUploadFiles, temp] - ); - - const onFileMove = useCallback( - (old_index: number, new_index: number) => { - setData(assocPath(['files'], moveArrItem(old_index, new_index, data.files), data)); - }, - [data, setData] - ); - - const onFileAdd = useCallback( - (file: IFile) => { - setData(assocPath(['files'], append(file, data.files), data)); - }, - [data, setData] - ); - - const onDrop = useCallback( - (event: React.DragEvent<HTMLDivElement>) => { - event.preventDefault(); - - if (!event.dataTransfer || !event.dataTransfer.files || !event.dataTransfer.files.length) - return; - - onUpload(Array.from(event.dataTransfer.files)); - }, - [onUpload] - ); - - const onInputChange = useCallback( - event => { - event.preventDefault(); - - if (!event.target.files || !event.target.files.length) return; - - onUpload(Array.from(event.target.files)); - }, - [onUpload] - ); - - useEffect(() => { - window.addEventListener('dragover', eventPreventer, false); - window.addEventListener('drop', eventPreventer, false); - - return () => { - window.removeEventListener('dragover', eventPreventer, false); - window.removeEventListener('drop', eventPreventer, false); - }; - }, [eventPreventer]); - - useEffect(() => { - Object.entries(statuses).forEach(([id, status]) => { - if (temp.includes(id) && !!status.uuid && files[status.uuid]) { - onFileAdd(files[status.uuid]); - setTemp(temp.filter(el => el !== id)); - } - }); - }, [statuses, files, temp, onFileAdd]); - const setTitle = useCallback( title => { setData({ ...data, title }); @@ -141,7 +51,7 @@ const EditorDialogUnconnected: FC<IProps> = ({ const buttons = ( <Padder style={{ position: 'relative' }}> - <EditorPanel data={data} setData={setData} onUpload={onInputChange} /> + <EditorPanel data={data} setData={setData} temp={temp} setTemp={setTemp} /> <Group horizontal> <InputText title="Название" value={data.title} handler={setTitle} autoFocus /> @@ -156,14 +66,11 @@ const EditorDialogUnconnected: FC<IProps> = ({ return ( <form onSubmit={onSubmit} className={styles.form}> <ScrollDialog buttons={buttons} width={860} onClose={onRequestClose}> - <div className={styles.editor} onDrop={onDrop}> + <div className={styles.editor}> <ImageEditor data={data} pending_files={temp.filter(id => !!statuses[id]).map(id => statuses[id])} setData={setData} - onUpload={onInputChange} - onFileMove={onFileMove} - onInputChange={onInputChange} /> </div> </ScrollDialog> From bd5122f3655026809d7e90ad348a0ba7430920a5 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 11:11:35 +0700 Subject: [PATCH 10/99] editor refactoring --- src/components/containers/Scroll/index.tsx | 9 ++--- src/components/editors/ImageEditor/index.tsx | 17 +++++----- src/components/editors/ImageGrid/index.tsx | 2 -- src/components/input/InputText/index.tsx | 34 ++++++++----------- src/containers/dialogs/EditorDialog/index.tsx | 6 +--- 5 files changed, 28 insertions(+), 40 deletions(-) diff --git a/src/components/containers/Scroll/index.tsx b/src/components/containers/Scroll/index.tsx index 36be053d..07ea0dfd 100644 --- a/src/components/containers/Scroll/index.tsx +++ b/src/components/containers/Scroll/index.tsx @@ -14,12 +14,7 @@ interface IProps { onScrollStop?: MouseEventHandler; } -export const Scroll = ({ - children, - className = '', - onRef = null, - ...props -}: IProps) => { +const Scroll = ({ children, className = '', onRef = null, ...props }: IProps) => { const [ref, setRef] = useState(null); useEffect(() => { @@ -43,3 +38,5 @@ export const Scroll = ({ </Scrollbars> ); }; + +export { Scroll }; diff --git a/src/components/editors/ImageEditor/index.tsx b/src/components/editors/ImageEditor/index.tsx index aecf0a90..77762732 100644 --- a/src/components/editors/ImageEditor/index.tsx +++ b/src/components/editors/ImageEditor/index.tsx @@ -1,12 +1,10 @@ -import React, { FC, ChangeEventHandler, DragEventHandler, useCallback } from 'react'; +import React, { FC, ChangeEventHandler, DragEventHandler, useCallback, useMemo } from 'react'; import { connect } from 'react-redux'; import { INode } from '~/redux/types'; import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; import { selectUploads } from '~/redux/uploads/selectors'; import { ImageGrid } from '~/components/editors/ImageGrid'; import { IUploadStatus } from '~/redux/uploads/reducer'; -import { moveArrItem } from '~/utils/fn'; -import assocPath from 'ramda/es/assocPath'; const mapStateToProps = selectUploads; const mapDispatchToProps = { @@ -16,14 +14,17 @@ const mapDispatchToProps = { type IProps = ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & { data: INode; - pending_files: IUploadStatus[]; - setData: (val: INode) => void; - onFileMove: (from: number, to: number) => void; - onInputChange: ChangeEventHandler<HTMLInputElement>; + temp: string[]; + setTemp: (val: string[]) => void; }; -const ImageEditorUnconnected: FC<IProps> = ({ data, setData, pending_files }) => { +const ImageEditorUnconnected: FC<IProps> = ({ data, setData, temp, statuses }) => { + const pending_files = useMemo(() => temp.filter(id => !!statuses[id]).map(id => statuses[id]), [ + temp, + statuses, + ]); + return <ImageGrid data={data} setData={setData} locked={pending_files} />; }; diff --git a/src/components/editors/ImageGrid/index.tsx b/src/components/editors/ImageGrid/index.tsx index 7a2ef947..beb7f2b9 100644 --- a/src/components/editors/ImageGrid/index.tsx +++ b/src/components/editors/ImageGrid/index.tsx @@ -12,8 +12,6 @@ interface IProps { data: INode; setData: (val: INode) => void; locked: IUploadStatus[]; - // items: IFile[]; - // onFileMove: (o: number, n: number) => void; } const SortableItem = SortableElement(({ children }) => ( diff --git a/src/components/input/InputText/index.tsx b/src/components/input/InputText/index.tsx index 434df389..524d0182 100644 --- a/src/components/input/InputText/index.tsx +++ b/src/components/input/InputText/index.tsx @@ -1,9 +1,4 @@ -import React, { - FC, - ChangeEvent, - useCallback, - useState, useEffect, -} from 'react'; +import React, { FC, ChangeEvent, useCallback, useState, useEffect } from 'react'; import classNames from 'classnames'; import * as styles from '~/styles/inputs.scss'; import { Icon } from '~/components/input/Icon'; @@ -28,7 +23,7 @@ const InputText: FC<IInputTextProps> = ({ const onInput = useCallback( ({ target }: ChangeEvent<HTMLInputElement>) => handler(target.value), - [handler], + [handler] ); const onFocus = useCallback(() => setFocused(true), []); @@ -39,18 +34,15 @@ const InputText: FC<IInputTextProps> = ({ }, [inner_ref, onRef]); return ( - <div className={classNames( - styles.input_text_wrapper, - wrapperClassName, - { + <div + className={classNames(styles.input_text_wrapper, wrapperClassName, { [styles.required]: required, [styles.focused]: focused, [styles.has_status]: !!status || !!error, [styles.has_value]: !!value, [styles.has_error]: !!error, [styles.has_loader]: is_loading, - }, - )} + })} > <div className={styles.input}> <input @@ -79,12 +71,16 @@ const InputText: FC<IInputTextProps> = ({ <LoaderCircle size={20} /> </div> </div> - { - title && <div className={styles.title}><span>{title}</span></div> - } - { - error && <div className={styles.error}><span>{error}</span></div> - } + {title && ( + <div className={styles.title}> + <span>{title}</span> + </div> + )} + {error && ( + <div className={styles.error}> + <span>{error}</span> + </div> + )} </div> ); }; diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx index 8b0a8a53..965702c3 100644 --- a/src/containers/dialogs/EditorDialog/index.tsx +++ b/src/containers/dialogs/EditorDialog/index.tsx @@ -67,11 +67,7 @@ const EditorDialogUnconnected: FC<IProps> = ({ onRequestClose, editor, statuses, <form onSubmit={onSubmit} className={styles.form}> <ScrollDialog buttons={buttons} width={860} onClose={onRequestClose}> <div className={styles.editor}> - <ImageEditor - data={data} - pending_files={temp.filter(id => !!statuses[id]).map(id => statuses[id])} - setData={setData} - /> + <ImageEditor data={data} setData={setData} temp={temp} setTemp={setTemp} /> </div> </ScrollDialog> </form> From 09b68c19d2f3196a7b494b32f3762afbc0014c31 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 11:35:25 +0700 Subject: [PATCH 11/99] fixed appearance for editor --- package-lock.json | 56 +++++++++++--------- package.json | 10 ++-- src/components/bars/SubmitBar/styles.scss | 2 +- src/components/editors/ImageEditor/index.tsx | 3 +- src/components/input/Button/index.tsx | 4 +- 5 files changed, 42 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4cffdd1e..480e97d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@babel/cli": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.6.3.tgz", - "integrity": "sha512-kWKOEeuylpa781yCeA5//eEx1u3WtLZqbi2VWXLKmb3QDPb5T2f7Yk311MK7bvvjR70dluAeiu4VXXsG1WwJsw==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.6.4.tgz", + "integrity": "sha512-tqrDyvPryBM6xjIyKKUwr3s8CzmmYidwgdswd7Uc/Cv0ogZcuS1TYQTLx/eWKP3UbJ6JxZAiYlBZabXm/rtRsQ==", "dev": true, "requires": { "chokidar": "2.1.8", @@ -19,7 +19,15 @@ "mkdirp": "0.5.1", "output-file-sync": "2.0.1", "slash": "2.0.0", - "source-map": "0.6.1" + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/code-frame": { @@ -996,11 +1004,11 @@ "dev": true }, "@types/ramda": { - "version": "0.26.29", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.26.29.tgz", - "integrity": "sha512-j0rrDm19024J0X5wHl8ZK0mQas9TVvL7KQPocDEZU0nq/OUtmh0mBBBrfSIKGJZF1VLhtW6MGw+YRojUSY+5kg==", + "version": "0.26.33", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.26.33.tgz", + "integrity": "sha512-sUCQmKfAWmlbb6PpFqvndbGgTf0bCcmHLJqMYw8ErVS0UoZTTiz952aFedJhV+JERiVH7poh33358c7p0AAN8A==", "requires": { - "ts-toolbelt": "4.8.8" + "ts-toolbelt": "4.8.16" } }, "@types/react": { @@ -1013,9 +1021,9 @@ } }, "@types/react-router": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.1.tgz", - "integrity": "sha512-S7SlFAPb7ZKr6HHMW0kLHGcz8pyJSL0UdM+JtlWthDqKUWwr7E6oPXuHgkofDI8dKCm16slg8K8VCf5pZJquaA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.2.tgz", + "integrity": "sha512-euC3SiwDg3NcjFdNmFL8uVuAFTpZJm0WMFUw+4eXMUnxa7M9RGFEG0szt0z+/Zgk4G2k9JBFhaEnY64RBiFmuw==", "dev": true, "requires": { "@types/history": "4.7.3", @@ -5169,9 +5177,9 @@ } }, "dotenv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", - "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, "dotenv-defaults": { "version": "1.0.2", @@ -12945,9 +12953,9 @@ } }, "terser": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.8.tgz", - "integrity": "sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz", + "integrity": "sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA==", "dev": true, "requires": { "commander": "2.20.1", @@ -12967,7 +12975,7 @@ "schema-utils": "1.0.0", "serialize-javascript": "1.9.1", "source-map": "0.6.1", - "terser": "4.3.8", + "terser": "4.3.9", "webpack-sources": "1.4.3", "worker-farm": "1.7.0" }, @@ -13355,9 +13363,9 @@ } }, "ts-toolbelt": { - "version": "4.8.8", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-4.8.8.tgz", - "integrity": "sha512-5QLdemct/ssqyVgmEIK1KKY7Y39fX05kanAdnp+O529Jk7dFct+4kgasvMGXagBIvLCUviksDCZs2Lo2/fp6BQ==" + "version": "4.8.16", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-4.8.16.tgz", + "integrity": "sha512-4xLaT2ENZ39jD+zVYgsuETHfFFnXk8unVOesBcmp0gLd57CHKIiLLtavzT+Ij1U5Z8041m1yfISDMBFG5y1zJw==" }, "tsconfig-paths": { "version": "3.9.0", @@ -13987,9 +13995,9 @@ } }, "webpack": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.0.tgz", - "integrity": "sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g==", + "version": "4.41.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", + "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", diff --git a/package.json b/package.json index 76600f7f..a055da27 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,10 @@ "url": "https://github.com/muerwre/my-empty-react-project" }, "devDependencies": { - "@babel/cli": "^7.6.3", + "@babel/cli": "^7.6.4", "@babel/preset-env": "^7.6.3", "@babel/types": "7.5.5", - "@types/react-router": "^5.0.3", + "@types/react-router": "^5.1.2", "autoresponsive-react": "^1.1.31", "awesome-typescript-loader": "^5.2.1", "babel-core": "^6.26.3", @@ -42,7 +42,7 @@ "ts-node": "^8.4.1", "typescript": "^3.6.4", "uglifyjs-webpack-plugin": "^1.3.0", - "webpack": "^4.41.0", + "webpack": "^4.41.2", "webpack-cli": "^3.3.9", "webpack-dev-server": "^3.8.2" }, @@ -51,7 +51,7 @@ "@hot-loader/react-dom": "^16.10.2", "@types/classnames": "^2.2.7", "@types/node": "^11.13.22", - "@types/ramda": "^0.26.29", + "@types/ramda": "^0.26.33", "@types/react": "16.8.23", "@typescript-eslint/eslint-plugin": "^1.13.0", "@typescript-eslint/parser": "^1.13.0", @@ -61,7 +61,7 @@ "clean-webpack-plugin": "^0.1.9", "connected-react-router": "^6.3.2", "date-fns": "^2.4.1", - "dotenv": "^8.1.0", + "dotenv": "^8.2.0", "dotenv-webpack": "^1.7.0", "eslint": "^5.16.0", "eslint-config-airbnb": "^17.1.1", diff --git a/src/components/bars/SubmitBar/styles.scss b/src/components/bars/SubmitBar/styles.scss index a2dc219f..83b9ce01 100644 --- a/src/components/bars/SubmitBar/styles.scss +++ b/src/components/bars/SubmitBar/styles.scss @@ -8,7 +8,7 @@ } } - @include tablet { + @media (max-width: $content_width + ($bar_height + $gap) * 2) { position: relative; right: 0; margin-left: $gap; diff --git a/src/components/editors/ImageEditor/index.tsx b/src/components/editors/ImageEditor/index.tsx index 77762732..45ff0bd5 100644 --- a/src/components/editors/ImageEditor/index.tsx +++ b/src/components/editors/ImageEditor/index.tsx @@ -1,10 +1,9 @@ -import React, { FC, ChangeEventHandler, DragEventHandler, useCallback, useMemo } from 'react'; +import React, { FC, useMemo } from 'react'; import { connect } from 'react-redux'; import { INode } from '~/redux/types'; import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; import { selectUploads } from '~/redux/uploads/selectors'; import { ImageGrid } from '~/components/editors/ImageGrid'; -import { IUploadStatus } from '~/redux/uploads/reducer'; const mapStateToProps = selectUploads; const mapDispatchToProps = { diff --git a/src/components/input/Button/index.tsx b/src/components/input/Button/index.tsx index 85deb8f5..af33a097 100644 --- a/src/components/input/Button/index.tsx +++ b/src/components/input/Button/index.tsx @@ -22,7 +22,7 @@ type IButtonProps = DetailedHTMLProps< iconOnly?: boolean; }; -export const Button: FC<IButtonProps> = ({ +const Button: FC<IButtonProps> = ({ className = '', size = 'normal', iconLeft, @@ -63,3 +63,5 @@ export const Button: FC<IButtonProps> = ({ iconRight && <Icon icon={iconRight} size={20} key={2} />, ] ); + +export { Button }; From 38a4c8e6a6c7269655925030a6026a9c03dc5c49 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 11:54:41 +0700 Subject: [PATCH 12/99] editor displaying errors --- src/constants/errors.ts | 5 +++ src/containers/dialogs/EditorDialog/index.tsx | 33 ++++++++++++++----- src/redux/modal/reducer.ts | 4 +-- src/redux/node/api.ts | 1 + src/redux/node/handlers.ts | 2 +- src/redux/node/selectors.ts | 6 ++++ 6 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/constants/errors.ts b/src/constants/errors.ts index f1e1cf59..15fffbf7 100644 --- a/src/constants/errors.ts +++ b/src/constants/errors.ts @@ -3,8 +3,13 @@ export const ERRORS = { TOO_SHIRT: 'Is_Too_Shirt', EMPTY_RESPONSE: 'Empty_Response', NO_COMMENTS: 'No_Comments', + FILES_REQUIRED: 'Files_Required', }; export const ERROR_LITERAL = { + [ERRORS.NOT_AN_EMAIL]: 'Введите правильный e-mail', + [ERRORS.TOO_SHIRT]: 'Слишком короткий', [ERRORS.NO_COMMENTS]: 'Комментариев пока нет', + [ERRORS.EMPTY_RESPONSE]: 'Пустой ответ сервера', + [ERRORS.FILES_REQUIRED]: 'Добавьте файлы', }; diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx index 965702c3..c018aaaa 100644 --- a/src/containers/dialogs/EditorDialog/index.tsx +++ b/src/containers/dialogs/EditorDialog/index.tsx @@ -1,8 +1,5 @@ -import React, { FC, useState, useCallback, useEffect, FormEvent } from 'react'; +import React, { FC, useState, useCallback, FormEvent, useEffect } from 'react'; import { connect } from 'react-redux'; -import assocPath from 'ramda/es/assocPath'; -import append from 'ramda/es/append'; -import uuid from 'uuid4'; import { ScrollDialog } from '../ScrollDialog'; import { IDialogProps } from '~/redux/modal/constants'; import { useCloseOnEscape } from '~/utils/hooks'; @@ -16,21 +13,29 @@ import { ImageEditor } from '~/components/editors/ImageEditor'; import { EditorPanel } from '~/components/editors/EditorPanel'; import * as NODE_ACTIONS from '~/redux/node/actions'; import { selectUploads } from '~/redux/uploads/selectors'; +import { ERROR_LITERAL } from '~/constants/errors'; const mapStateToProps = state => { - const { editor } = selectNode(state); + const { editor, errors } = selectNode(state); const { statuses, files } = selectUploads(state); - return { editor, statuses, files }; + return { editor, statuses, files, errors }; }; const mapDispatchToProps = { nodeSave: NODE_ACTIONS.nodeSave, + nodeSetSaveErrors: NODE_ACTIONS.nodeSetSaveErrors, }; type IProps = IDialogProps & ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & {}; -const EditorDialogUnconnected: FC<IProps> = ({ onRequestClose, editor, statuses, nodeSave }) => { +const EditorDialogUnconnected: FC<IProps> = ({ + onRequestClose, + editor, + errors, + nodeSave, + nodeSetSaveErrors, +}) => { const [data, setData] = useState(editor); const [temp, setTemp] = useState([]); @@ -49,6 +54,11 @@ const EditorDialogUnconnected: FC<IProps> = ({ onRequestClose, editor, statuses, [data, nodeSave] ); + useEffect(() => { + if (!Object.keys(errors).length) return; + nodeSetSaveErrors({}); + }, [data]); + const buttons = ( <Padder style={{ position: 'relative' }}> <EditorPanel data={data} setData={setData} temp={temp} setTemp={setTemp} /> @@ -63,9 +73,16 @@ const EditorDialogUnconnected: FC<IProps> = ({ onRequestClose, editor, statuses, useCloseOnEscape(onRequestClose); + const error = errors && Object.values(errors)[0]; + return ( <form onSubmit={onSubmit} className={styles.form}> - <ScrollDialog buttons={buttons} width={860} onClose={onRequestClose}> + <ScrollDialog + buttons={buttons} + width={860} + error={error && ERROR_LITERAL[error]} + onClose={onRequestClose} + > <div className={styles.editor}> <ImageEditor data={data} setData={setData} temp={temp} setTemp={setTemp} /> </div> diff --git a/src/redux/modal/reducer.ts b/src/redux/modal/reducer.ts index be90b850..764ce9c6 100644 --- a/src/redux/modal/reducer.ts +++ b/src/redux/modal/reducer.ts @@ -9,8 +9,8 @@ export interface IModalState { } const INITIAL_STATE: IModalState = { - is_shown: false, - dialog: null, + is_shown: true, + dialog: DIALOGS.EDITOR_IMAGE, }; export default createReducer(INITIAL_STATE, MODAL_HANDLERS); diff --git a/src/redux/node/api.ts b/src/redux/node/api.ts index 2e0d37fe..b7c2e7cd 100644 --- a/src/redux/node/api.ts +++ b/src/redux/node/api.ts @@ -14,6 +14,7 @@ export const postNode = ({ .post(API.NODE.SAVE, { node }, configWithToken(access)) .then(resultMiddleware) .catch(errorMiddleware); +// .then(console.log); export const getNodes = ({ skip = 0, diff --git a/src/redux/node/handlers.ts b/src/redux/node/handlers.ts index 813d53c7..4c6341df 100644 --- a/src/redux/node/handlers.ts +++ b/src/redux/node/handlers.ts @@ -43,7 +43,7 @@ const setTags = (state: INodeState, { tags }: ReturnType<typeof nodeSetTags>) => assocPath(['current', 'tags'], tags, state); export const NODE_HANDLERS = { - [NODE_ACTIONS.SAVE]: setSaveErrors, + [NODE_ACTIONS.SET_SAVE_ERRORS]: setSaveErrors, [NODE_ACTIONS.SET_LOADING]: setLoading, [NODE_ACTIONS.SET_LOADING_COMMENTS]: setLoadingComments, [NODE_ACTIONS.SET_CURRENT]: setCurrent, diff --git a/src/redux/node/selectors.ts b/src/redux/node/selectors.ts index f5b591c0..fb33213c 100644 --- a/src/redux/node/selectors.ts +++ b/src/redux/node/selectors.ts @@ -1,4 +1,10 @@ import { IState } from '../store'; import { INodeState } from './reducer'; +import { IResultWithStatus, INode } from '../types'; export const selectNode = (state: IState): INodeState => state.node; + +// export const catchNodeErrors = (data: IResultWithStatus<INode>): IResultWithStatus<INode> => ({ +// data, +// errors: data.errors, +// }) From 770f3cb2aadfd50a3dee014f09652c7fcfadd8ac Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 12:46:52 +0700 Subject: [PATCH 13/99] removing uploaded files --- .../editors/EditorUploadButton/index.tsx | 10 ++++- src/components/editors/ImageGrid/index.tsx | 35 ++++++++++++++--- src/components/upload/ImageUpload/index.tsx | 38 +++++++++++++------ src/components/upload/ImageUpload/styles.scss | 26 +++++++++++++ src/containers/dialogs/EditorDialog/index.tsx | 26 ++++++++++--- src/containers/dialogs/Modal/index.tsx | 8 ++-- .../editors/EditorDialogImage/index.tsx | 10 +++++ src/redux/modal/constants.ts | 4 +- src/redux/node/constants.ts | 7 ++++ src/redux/types.ts | 2 +- src/redux/uploads/reducer.ts | 2 +- 11 files changed, 137 insertions(+), 31 deletions(-) create mode 100644 src/containers/editors/EditorDialogImage/index.tsx diff --git a/src/components/editors/EditorUploadButton/index.tsx b/src/components/editors/EditorUploadButton/index.tsx index e29115d2..eb183634 100644 --- a/src/components/editors/EditorUploadButton/index.tsx +++ b/src/components/editors/EditorUploadButton/index.tsx @@ -9,6 +9,7 @@ import assocPath from 'ramda/es/assocPath'; import append from 'ramda/es/append'; import { selectUploads } from '~/redux/uploads/selectors'; import { connect } from 'react-redux'; +import { MAX_NODE_FILES } from '~/redux/node/constants'; const mapStateToProps = state => { const { statuses, files } = selectUploads(state); @@ -41,6 +42,11 @@ const EditorUploadButtonUnconnected: FC<IProps> = ({ const onUpload = useCallback( (uploads: File[]) => { + const current = temp.length + data.files.length; + const limit = MAX_NODE_FILES - current; + + if (current >= MAX_NODE_FILES) return; + const items: IFileWithUUID[] = Array.from(uploads).map( (file: File): IFileWithUUID => ({ file, @@ -51,12 +57,12 @@ const EditorUploadButtonUnconnected: FC<IProps> = ({ }) ); - const temps = items.map(file => file.temp_id); + const temps = items.map(file => file.temp_id).slice(0, limit); setTemp([...temp, ...temps]); uploadUploadFiles(items); }, - [setTemp, uploadUploadFiles, temp] + [setTemp, uploadUploadFiles, temp, data] ); const onFileAdd = useCallback( diff --git a/src/components/editors/ImageGrid/index.tsx b/src/components/editors/ImageGrid/index.tsx index beb7f2b9..2310acd3 100644 --- a/src/components/editors/ImageGrid/index.tsx +++ b/src/components/editors/ImageGrid/index.tsx @@ -7,6 +7,9 @@ import { IUploadStatus } from '~/redux/uploads/reducer'; import { getURL } from '~/utils/dom'; import assocPath from 'ramda/es/assocPath'; import { moveArrItem } from '~/utils/fn'; +import omit from 'ramda/es/omit'; +import remove from 'ramda/es/remove'; +import reject from 'ramda/es/reject'; interface IProps { data: INode; @@ -19,13 +22,23 @@ const SortableItem = SortableElement(({ children }) => ( )); const SortableList = SortableContainer( - ({ items, locked }: { items: IFile[]; locked: IUploadStatus[] }) => ( + ({ + items, + locked, + onDrop, + }: { + items: IFile[]; + locked: IUploadStatus[]; + onDrop: (file_id: IFile['id']) => void; + }) => ( <div className={styles.grid}> - {items.map((file, index) => ( - <SortableItem key={file.id} index={index} collection={0}> - <ImageUpload id={file.id} thumb={getURL(file)} /> - </SortableItem> - ))} + {items + .filter(file => file && file.id) + .map((file, index) => ( + <SortableItem key={file.id} index={index} collection={0}> + <ImageUpload id={file.id} thumb={getURL(file)} onDrop={onDrop} /> + </SortableItem> + ))} {locked.map((item, index) => ( <SortableItem key={item.temp_id} index={index} collection={1} disabled> @@ -44,8 +57,18 @@ const ImageGrid: FC<IProps> = ({ data, setData, locked }) => { [data, setData] ); + const onDrop = useCallback( + (file_id: IFile['id']) => { + setData( + assocPath(['files'], reject(el => !el || !el.id || el.id === file_id, data.files), data) + ); + }, + [setData, data] + ); + return ( <SortableList + onDrop={onDrop} onSortEnd={onMove} axis="xy" items={data.files} diff --git a/src/components/upload/ImageUpload/index.tsx b/src/components/upload/ImageUpload/index.tsx index f90f6156..81d010bd 100644 --- a/src/components/upload/ImageUpload/index.tsx +++ b/src/components/upload/ImageUpload/index.tsx @@ -1,27 +1,43 @@ -import React, { FC } from 'react'; +import React, { FC, useCallback } from 'react'; import classNames from 'classnames'; import * as styles from './styles.scss'; import { ArcProgress } from '~/components/input/ArcProgress'; +import { IFile } from '~/redux/types'; +import { Icon } from '~/components/input/Icon'; interface IProps { - id?: string; + id?: IFile['id']; thumb?: string; progress?: number; + onDrop?: (file_id: IFile['id']) => void; is_uploading?: boolean; } -const ImageUpload: FC<IProps> = ({ thumb, progress, is_uploading }) => ( - <div className={styles.wrap}> - <div className={classNames(styles.thumb_wrap, { is_uploading })}> - {thumb && <div className={styles.thumb} style={{ backgroundImage: `url("${thumb}")` }} />} - {is_uploading && ( - <div className={styles.progress}> - <ArcProgress size={72} progress={progress} /> +const ImageUpload: FC<IProps> = ({ thumb, progress, is_uploading, id, onDrop }) => { + const onDropFile = useCallback(() => { + if (!id || !onDrop) return; + onDrop(id); + }, [id, onDrop]); + + return ( + <div className={styles.wrap}> + {id && onDrop && ( + <div className={styles.drop} onMouseDown={onDropFile}> + <Icon icon="close" /> </div> )} + + <div className={classNames(styles.thumb_wrap, { is_uploading })}> + {thumb && <div className={styles.thumb} style={{ backgroundImage: `url("${thumb}")` }} />} + {is_uploading && ( + <div className={styles.progress}> + <ArcProgress size={72} progress={progress} /> + </div> + )} + </div> </div> - </div> -); + ); +}; export { ImageUpload }; diff --git a/src/components/upload/ImageUpload/styles.scss b/src/components/upload/ImageUpload/styles.scss index 52bd0d22..f8f6baf6 100644 --- a/src/components/upload/ImageUpload/styles.scss +++ b/src/components/upload/ImageUpload/styles.scss @@ -57,3 +57,29 @@ .helper { opacity: 0.3; } + +.drop { + width: 24px; + height: 24px; + background: #222222; + position: absolute; + right: $gap; + top: $gap; + border-radius: 12px; + z-index: 2; + transition: background-color 250ms, opacity 0.25s; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + + svg { + width: 20px; + height: 20px; + } + + &:hover { + opacity: 1; + background-color: $red; + } +} diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx index c018aaaa..02d5a53e 100644 --- a/src/containers/dialogs/EditorDialog/index.tsx +++ b/src/containers/dialogs/EditorDialog/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useState, useCallback, FormEvent, useEffect } from 'react'; +import React, { FC, useState, useCallback, FormEvent, useEffect, createElement } from 'react'; import { connect } from 'react-redux'; import { ScrollDialog } from '../ScrollDialog'; import { IDialogProps } from '~/redux/modal/constants'; @@ -9,11 +9,11 @@ import { Button } from '~/components/input/Button'; import { Padder } from '~/components/containers/Padder'; import * as styles from './styles.scss'; import { selectNode } from '~/redux/node/selectors'; -import { ImageEditor } from '~/components/editors/ImageEditor'; import { EditorPanel } from '~/components/editors/EditorPanel'; import * as NODE_ACTIONS from '~/redux/node/actions'; import { selectUploads } from '~/redux/uploads/selectors'; import { ERROR_LITERAL } from '~/constants/errors'; +import { NODE_EDITORS } from '~/redux/node/constants'; const mapStateToProps = state => { const { editor, errors } = selectNode(state); @@ -27,14 +27,19 @@ const mapDispatchToProps = { nodeSetSaveErrors: NODE_ACTIONS.nodeSetSaveErrors, }; -type IProps = IDialogProps & ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & {}; +type IProps = IDialogProps & + ReturnType<typeof mapStateToProps> & + typeof mapDispatchToProps & { + type: typeof NODE_EDITORS[keyof typeof NODE_EDITORS]; + }; const EditorDialogUnconnected: FC<IProps> = ({ - onRequestClose, editor, errors, nodeSave, nodeSetSaveErrors, + onRequestClose, + type, }) => { const [data, setData] = useState(editor); const [temp, setTemp] = useState([]); @@ -54,6 +59,10 @@ const EditorDialogUnconnected: FC<IProps> = ({ [data, nodeSave] ); + useEffect(() => { + if (!NODE_EDITORS[type] && onRequestClose) onRequestClose(); + }, [type]); + useEffect(() => { if (!Object.keys(errors).length) return; nodeSetSaveErrors({}); @@ -75,6 +84,8 @@ const EditorDialogUnconnected: FC<IProps> = ({ const error = errors && Object.values(errors)[0]; + if (!NODE_EDITORS[type]) return null; + return ( <form onSubmit={onSubmit} className={styles.form}> <ScrollDialog @@ -84,7 +95,12 @@ const EditorDialogUnconnected: FC<IProps> = ({ onClose={onRequestClose} > <div className={styles.editor}> - <ImageEditor data={data} setData={setData} temp={temp} setTemp={setTemp} /> + {createElement(NODE_EDITORS[type], { + data, + setData, + temp, + setTemp, + })} </div> </ScrollDialog> </form> diff --git a/src/containers/dialogs/Modal/index.tsx b/src/containers/dialogs/Modal/index.tsx index 13b1a2d6..d3c6362d 100644 --- a/src/containers/dialogs/Modal/index.tsx +++ b/src/containers/dialogs/Modal/index.tsx @@ -29,6 +29,8 @@ const ModalUnconnected: FC<IProps> = ({ if (!dialog || !DIALOG_CONTENT[dialog] || !is_shown) return null; + console.log({ onRequestClose }); + return ReactDOM.createPortal( <div className={styles.fixed}> <div className={styles.overlay} onClick={onRequestClose} /> @@ -38,18 +40,18 @@ const ModalUnconnected: FC<IProps> = ({ {React.createElement(DIALOG_CONTENT[dialog], { onRequestClose, onDialogChange: modalShowDialog, - } as IDialogProps)} + })} </div> </div> </div> </div>, - document.body, + document.body ); }; const Modal = connect( mapStateToProps, - mapDispatchToProps, + mapDispatchToProps )(ModalUnconnected); export { ModalUnconnected, Modal }; diff --git a/src/containers/editors/EditorDialogImage/index.tsx b/src/containers/editors/EditorDialogImage/index.tsx new file mode 100644 index 00000000..9d2b8f41 --- /dev/null +++ b/src/containers/editors/EditorDialogImage/index.tsx @@ -0,0 +1,10 @@ +import React, { FC } from 'react'; +import { EditorDialog } from '~/containers/dialogs/EditorDialog'; +import { IDialogProps } from '~/redux/types'; +import { NODE_TYPES } from '~/redux/node/constants'; + +type IProps = IDialogProps & {}; + +const EditorDialogImage: FC<IProps> = props => <EditorDialog type={NODE_TYPES.IMAGE} {...props} />; + +export { EditorDialogImage }; diff --git a/src/redux/modal/constants.ts b/src/redux/modal/constants.ts index 08ee7acb..fd43d538 100644 --- a/src/redux/modal/constants.ts +++ b/src/redux/modal/constants.ts @@ -1,5 +1,5 @@ import { ValueOf } from '~/redux/types'; -import { EditorDialog } from '~/containers/dialogs/EditorDialog'; +import { EditorDialogImage } from '~/containers/editors/EditorDialogImage'; import { LoginDialog } from '~/containers/dialogs/LoginDialog'; export const MODAL_ACTIONS = { @@ -14,7 +14,7 @@ export const DIALOGS = { }; export const DIALOG_CONTENT = { - [DIALOGS.EDITOR_IMAGE]: EditorDialog, + [DIALOGS.EDITOR_IMAGE]: EditorDialogImage, [DIALOGS.LOGIN]: LoginDialog, }; diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index f61dad63..22c1930e 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -1,6 +1,7 @@ import { FC } from 'react'; import { IBlock, INode, ValueOf, IComment } from '../types'; import { NodeImageBlock } from '~/components/node/NodeImageBlock'; +import { ImageEditor } from '~/components/editors/ImageEditor'; const prefix = 'NODE.'; export const NODE_ACTIONS = { @@ -74,3 +75,9 @@ export const EMPTY_COMMENT: IComment = { is_private: false, user: null, }; + +export const NODE_EDITORS = { + [NODE_TYPES.IMAGE]: ImageEditor, +}; + +export const MAX_NODE_FILES = 16; diff --git a/src/redux/types.ts b/src/redux/types.ts index a8523790..ff43f361 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -58,7 +58,7 @@ export type UUID = string; export type IUploadType = 'image' | 'text' | 'audio' | 'video' | 'other'; export interface IFile { - id?: UUID; + id?: number; temp_id?: UUID; user_id?: UUID; node_id?: UUID; diff --git a/src/redux/uploads/reducer.ts b/src/redux/uploads/reducer.ts index 43f3f205..98915b38 100644 --- a/src/redux/uploads/reducer.ts +++ b/src/redux/uploads/reducer.ts @@ -6,7 +6,7 @@ export interface IUploadStatus { is_uploading: boolean; error: string; preview: string; - uuid: UUID; + uuid: IFile['id']; url: string; type: string; thumbnail_url: string; From a957281d01d7716893215c3599a4ff01b0056f1f Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 12:51:38 +0700 Subject: [PATCH 14/99] dropping items --- src/components/editors/ImageGrid/index.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/editors/ImageGrid/index.tsx b/src/components/editors/ImageGrid/index.tsx index 2310acd3..2c976763 100644 --- a/src/components/editors/ImageGrid/index.tsx +++ b/src/components/editors/ImageGrid/index.tsx @@ -17,11 +17,11 @@ interface IProps { locked: IUploadStatus[]; } -const SortableItem = SortableElement(({ children }) => ( +const SortableImageGridItem = SortableElement(({ children }) => ( <div className={styles.item}>{children}</div> )); -const SortableList = SortableContainer( +const SortableImageGrid = SortableContainer( ({ items, locked, @@ -35,15 +35,15 @@ const SortableList = SortableContainer( {items .filter(file => file && file.id) .map((file, index) => ( - <SortableItem key={file.id} index={index} collection={0}> + <SortableImageGridItem key={file.id} index={index} collection={0}> <ImageUpload id={file.id} thumb={getURL(file)} onDrop={onDrop} /> - </SortableItem> + </SortableImageGridItem> ))} {locked.map((item, index) => ( - <SortableItem key={item.temp_id} index={index} collection={1} disabled> + <SortableImageGridItem key={item.temp_id} index={index} collection={1} disabled> <ImageUpload thumb={item.preview} progress={item.progress} is_uploading /> - </SortableItem> + </SortableImageGridItem> ))} </div> ) @@ -67,7 +67,7 @@ const ImageGrid: FC<IProps> = ({ data, setData, locked }) => { ); return ( - <SortableList + <SortableImageGrid onDrop={onDrop} onSortEnd={onMove} axis="xy" From 5872e7a4574d460ffb4ada9e7d24a207c24b76f7 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 15:40:39 +0700 Subject: [PATCH 15/99] moved out image grid components --- src/components/editors/ImageGrid/index.tsx | 39 +------------------ src/components/editors/ImageGrid/styles.scss | 28 +------------ .../editors/SortableImageGrid/index.tsx | 38 ++++++++++++++++++ .../editors/SortableImageGrid/styles.scss | 14 +++++++ .../editors/SortableImageGridItem/index.tsx | 10 +++++ .../editors/SortableImageGridItem/styles.scss | 4 ++ 6 files changed, 69 insertions(+), 64 deletions(-) create mode 100644 src/components/editors/SortableImageGrid/index.tsx create mode 100644 src/components/editors/SortableImageGrid/styles.scss create mode 100644 src/components/editors/SortableImageGridItem/index.tsx create mode 100644 src/components/editors/SortableImageGridItem/styles.scss diff --git a/src/components/editors/ImageGrid/index.tsx b/src/components/editors/ImageGrid/index.tsx index 2c976763..0ead0f6c 100644 --- a/src/components/editors/ImageGrid/index.tsx +++ b/src/components/editors/ImageGrid/index.tsx @@ -1,15 +1,12 @@ import React, { FC, useCallback } from 'react'; -import { SortableContainer, SortableElement, SortEvent, SortEnd } from 'react-sortable-hoc'; +import { SortEnd } from 'react-sortable-hoc'; import * as styles from './styles.scss'; -import { ImageUpload } from '~/components/upload/ImageUpload'; import { IFile, INode } from '~/redux/types'; import { IUploadStatus } from '~/redux/uploads/reducer'; -import { getURL } from '~/utils/dom'; import assocPath from 'ramda/es/assocPath'; import { moveArrItem } from '~/utils/fn'; -import omit from 'ramda/es/omit'; -import remove from 'ramda/es/remove'; import reject from 'ramda/es/reject'; +import { SortableImageGrid } from '~/components/editors/SortableImageGrid'; interface IProps { data: INode; @@ -17,38 +14,6 @@ interface IProps { locked: IUploadStatus[]; } -const SortableImageGridItem = SortableElement(({ children }) => ( - <div className={styles.item}>{children}</div> -)); - -const SortableImageGrid = SortableContainer( - ({ - items, - locked, - onDrop, - }: { - items: IFile[]; - locked: IUploadStatus[]; - onDrop: (file_id: IFile['id']) => void; - }) => ( - <div className={styles.grid}> - {items - .filter(file => file && file.id) - .map((file, index) => ( - <SortableImageGridItem key={file.id} index={index} collection={0}> - <ImageUpload id={file.id} thumb={getURL(file)} onDrop={onDrop} /> - </SortableImageGridItem> - ))} - - {locked.map((item, index) => ( - <SortableImageGridItem key={item.temp_id} index={index} collection={1} disabled> - <ImageUpload thumb={item.preview} progress={item.progress} is_uploading /> - </SortableImageGridItem> - ))} - </div> - ) -); - const ImageGrid: FC<IProps> = ({ data, setData, locked }) => { const onMove = useCallback( ({ oldIndex, newIndex }: SortEnd) => { diff --git a/src/components/editors/ImageGrid/styles.scss b/src/components/editors/ImageGrid/styles.scss index 18c1d269..7ab40804 100644 --- a/src/components/editors/ImageGrid/styles.scss +++ b/src/components/editors/ImageGrid/styles.scss @@ -1,30 +1,4 @@ -.grid { - min-height: 200px; - padding-bottom: 62px; - box-sizing: border-box; - - display: grid; - grid-column-gap: $gap; - grid-row-gap: $gap; - grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - - // display: flex; - // flex-wrap: wrap; - @media (max-width: 600px) { - grid-template-columns: repeat(auto-fill, minmax(30vw, 1fr)); - } -} - -.item { - // flex: 0 4 25%; - // width: 25%; - // float: left; - // padding: $gap / 2; - z-index: 1; - box-sizing: border-box; -} - .helper { opacity: 0.5; - z-index: 10; + z-index: 10 !important; } diff --git a/src/components/editors/SortableImageGrid/index.tsx b/src/components/editors/SortableImageGrid/index.tsx new file mode 100644 index 00000000..26fdd309 --- /dev/null +++ b/src/components/editors/SortableImageGrid/index.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { SortableContainer } from 'react-sortable-hoc'; +import { ImageUpload } from '~/components/upload/ImageUpload'; +import * as styles from './styles.scss'; +import { SortableImageGridItem } from '~/components/editors/SortableImageGridItem'; +import { IFile } from '~/redux/types'; +import { IUploadStatus } from '~/redux/uploads/reducer'; +import { getURL } from '~/utils/dom'; + +const SortableImageGrid = SortableContainer( + ({ + items, + locked, + onDrop, + }: { + items: IFile[]; + locked: IUploadStatus[]; + onDrop: (file_id: IFile['id']) => void; + }) => ( + <div className={styles.grid}> + {items + .filter(file => file && file.id) + .map((file, index) => ( + <SortableImageGridItem key={file.id} index={index} collection={0}> + <ImageUpload id={file.id} thumb={getURL(file)} onDrop={onDrop} /> + </SortableImageGridItem> + ))} + + {locked.map((item, index) => ( + <SortableImageGridItem key={item.temp_id} index={index} collection={1} disabled> + <ImageUpload thumb={item.preview} progress={item.progress} is_uploading /> + </SortableImageGridItem> + ))} + </div> + ) +); + +export { SortableImageGrid }; diff --git a/src/components/editors/SortableImageGrid/styles.scss b/src/components/editors/SortableImageGrid/styles.scss new file mode 100644 index 00000000..c525238b --- /dev/null +++ b/src/components/editors/SortableImageGrid/styles.scss @@ -0,0 +1,14 @@ +.grid { + min-height: 200px; + padding-bottom: 62px; + box-sizing: border-box; + + display: grid; + grid-column-gap: $gap; + grid-row-gap: $gap; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + + @media (max-width: 600px) { + grid-template-columns: repeat(auto-fill, minmax(30vw, 1fr)); + } +} diff --git a/src/components/editors/SortableImageGridItem/index.tsx b/src/components/editors/SortableImageGridItem/index.tsx new file mode 100644 index 00000000..6fb94e6e --- /dev/null +++ b/src/components/editors/SortableImageGridItem/index.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { SortableElement } from 'react-sortable-hoc'; + +import * as styles from './styles.scss'; + +const SortableImageGridItem = SortableElement(({ children }) => ( + <div className={styles.item}>{children}</div> +)); + +export { SortableImageGridItem }; diff --git a/src/components/editors/SortableImageGridItem/styles.scss b/src/components/editors/SortableImageGridItem/styles.scss new file mode 100644 index 00000000..81fd01cb --- /dev/null +++ b/src/components/editors/SortableImageGridItem/styles.scss @@ -0,0 +1,4 @@ +.item { + z-index: 1; + box-sizing: border-box; +} From 265b075ddce4f296b7c3fd175e2b760d5a994818 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 15:47:52 +0700 Subject: [PATCH 16/99] refactored code --- src/components/editors/ImageEditor/index.tsx | 8 +++++--- src/components/editors/ImageGrid/index.tsx | 20 +++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/editors/ImageEditor/index.tsx b/src/components/editors/ImageEditor/index.tsx index 45ff0bd5..decfacb6 100644 --- a/src/components/editors/ImageEditor/index.tsx +++ b/src/components/editors/ImageEditor/index.tsx @@ -1,6 +1,6 @@ -import React, { FC, useMemo } from 'react'; +import React, { FC, useMemo, useCallback } from 'react'; import { connect } from 'react-redux'; -import { INode } from '~/redux/types'; +import { INode, IFile } from '~/redux/types'; import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; import { selectUploads } from '~/redux/uploads/selectors'; import { ImageGrid } from '~/components/editors/ImageGrid'; @@ -24,7 +24,9 @@ const ImageEditorUnconnected: FC<IProps> = ({ data, setData, temp, statuses }) = statuses, ]); - return <ImageGrid data={data} setData={setData} locked={pending_files} />; + const setFiles = useCallback((files: IFile[]) => setData({ ...data, files }), [data, setData]); + + return <ImageGrid files={data.files} setFiles={setFiles} locked={pending_files} />; }; const ImageEditor = connect( diff --git a/src/components/editors/ImageGrid/index.tsx b/src/components/editors/ImageGrid/index.tsx index 0ead0f6c..c4a2eb50 100644 --- a/src/components/editors/ImageGrid/index.tsx +++ b/src/components/editors/ImageGrid/index.tsx @@ -9,26 +9,24 @@ import reject from 'ramda/es/reject'; import { SortableImageGrid } from '~/components/editors/SortableImageGrid'; interface IProps { - data: INode; - setData: (val: INode) => void; + files: IFile[]; + setFiles: (val: IFile[]) => void; locked: IUploadStatus[]; } -const ImageGrid: FC<IProps> = ({ data, setData, locked }) => { +const ImageGrid: FC<IProps> = ({ files, setFiles, locked }) => { const onMove = useCallback( ({ oldIndex, newIndex }: SortEnd) => { - setData(assocPath(['files'], moveArrItem(oldIndex, newIndex, data.files), data)); + setFiles(moveArrItem(oldIndex, newIndex, files) as IFile[]); }, - [data, setData] + [setFiles, files] ); const onDrop = useCallback( - (file_id: IFile['id']) => { - setData( - assocPath(['files'], reject(el => !el || !el.id || el.id === file_id, data.files), data) - ); + (remove_id: IFile['id']) => { + setFiles(files.filter(file => file.id === remove_id)); }, - [setData, data] + [setFiles, files] ); return ( @@ -36,7 +34,7 @@ const ImageGrid: FC<IProps> = ({ data, setData, locked }) => { onDrop={onDrop} onSortEnd={onMove} axis="xy" - items={data.files} + items={files} locked={locked} pressDelay={window.innerWidth < 768 ? 200 : 0} helperClass={styles.helper} From 1b6a81d27cbbb1e8299d16ea46c3c0a7d9f9ab94 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 16:22:01 +0700 Subject: [PATCH 17/99] sagas for node creation dialog --- src/components/bars/SubmitBar/index.tsx | 10 ++++--- src/components/editors/TextEditor/index.tsx | 27 +++++++++++++++++++ src/components/editors/TextEditor/styles.scss | 3 +++ .../editors/EditorDialogText/index.tsx | 10 +++++++ src/redux/modal/constants.ts | 11 +++++++- src/redux/modal/reducer.ts | 4 +-- src/redux/node/actions.ts | 17 +++++++++++- src/redux/node/constants.ts | 23 +++++++++++----- src/redux/node/handlers.ts | 5 ++++ src/redux/node/sagas.ts | 15 +++++++++-- src/redux/types.ts | 16 +++++++---- 11 files changed, 119 insertions(+), 22 deletions(-) create mode 100644 src/components/editors/TextEditor/index.tsx create mode 100644 src/components/editors/TextEditor/styles.scss create mode 100644 src/containers/editors/EditorDialogText/index.tsx diff --git a/src/components/bars/SubmitBar/index.tsx b/src/components/bars/SubmitBar/index.tsx index 0450787f..da44ab82 100644 --- a/src/components/bars/SubmitBar/index.tsx +++ b/src/components/bars/SubmitBar/index.tsx @@ -1,20 +1,22 @@ import React, { FC, useCallback } from 'react'; import { connect } from 'react-redux'; import { Icon } from '~/components/input/Icon'; -import * as MODAL_ACTIONS from '~/redux/modal/actions'; +import * as NODE_ACTIONS from '~/redux/node/actions'; import { DIALOGS } from '~/redux/modal/constants'; import * as styles from './styles.scss'; +import { NODE_TYPES } from '~/redux/node/constants'; const mapStateToProps = null; const mapDispatchToProps = { - showDialog: MODAL_ACTIONS.modalShowDialog, + nodeCreate: NODE_ACTIONS.nodeCreate, + // showDialog: MODAL_ACTIONS.modalShowDialog, }; type IProps = typeof mapDispatchToProps & {}; -const SubmitBarUnconnected: FC<IProps> = ({ showDialog }) => { - const onOpenImageEditor = useCallback(() => showDialog(DIALOGS.EDITOR_IMAGE), [showDialog]); +const SubmitBarUnconnected: FC<IProps> = ({ nodeCreate }) => { + const onOpenImageEditor = useCallback(() => nodeCreate(NODE_TYPES.IMAGE), [nodeCreate]); return ( <div className={styles.wrap}> diff --git a/src/components/editors/TextEditor/index.tsx b/src/components/editors/TextEditor/index.tsx new file mode 100644 index 00000000..539045f1 --- /dev/null +++ b/src/components/editors/TextEditor/index.tsx @@ -0,0 +1,27 @@ +import React, { FC, useCallback } from 'react'; +import { INode } from '~/redux/types'; +import * as styles from './styles.scss'; +import { Textarea } from '~/components/input/Textarea'; +import path from 'ramda/es/path'; + +interface IProps { + data: INode; + setData: (val: INode) => void; +} + +const TextEditor: FC<IProps> = ({ data, setData }) => { + const setText = useCallback( + (text: string) => setData({ ...data, blocks: [{ type: 'text', text }] }), + [data, setData] + ); + + const text = (path(['blocks', 0, 'text'], data) as string) || ''; + + return ( + <div className={styles.wrap}> + <Textarea value={text} handler={setText} minRows={6} /> + </div> + ); +}; + +export { TextEditor }; diff --git a/src/components/editors/TextEditor/styles.scss b/src/components/editors/TextEditor/styles.scss new file mode 100644 index 00000000..4d3618e6 --- /dev/null +++ b/src/components/editors/TextEditor/styles.scss @@ -0,0 +1,3 @@ +.wrap { + padding-bottom: 60px; +} diff --git a/src/containers/editors/EditorDialogText/index.tsx b/src/containers/editors/EditorDialogText/index.tsx new file mode 100644 index 00000000..311df8ed --- /dev/null +++ b/src/containers/editors/EditorDialogText/index.tsx @@ -0,0 +1,10 @@ +import React, { FC } from 'react'; +import { EditorDialog } from '~/containers/dialogs/EditorDialog'; +import { IDialogProps } from '~/redux/types'; +import { NODE_TYPES } from '~/redux/node/constants'; + +type IProps = IDialogProps & {}; + +const EditorDialogText: FC<IProps> = props => <EditorDialog type={NODE_TYPES.TEXT} {...props} />; + +export { EditorDialogText }; diff --git a/src/redux/modal/constants.ts b/src/redux/modal/constants.ts index fd43d538..2bde90a2 100644 --- a/src/redux/modal/constants.ts +++ b/src/redux/modal/constants.ts @@ -1,6 +1,8 @@ import { ValueOf } from '~/redux/types'; -import { EditorDialogImage } from '~/containers/editors/EditorDialogImage'; import { LoginDialog } from '~/containers/dialogs/LoginDialog'; +import { EditorDialogImage } from '~/containers/editors/EditorDialogImage'; +import { EditorDialogText } from '~/containers/editors/EditorDialogText'; +import { NODE_TYPES } from '../node/constants'; export const MODAL_ACTIONS = { SET_SHOWN: 'MODAL.SET_SHOWN', @@ -10,14 +12,21 @@ export const MODAL_ACTIONS = { export const DIALOGS = { EDITOR_IMAGE: 'EDITOR_IMAGE', + EDITOR_TEXT: 'EDITOR_TEXT', LOGIN: 'LOGIN', }; export const DIALOG_CONTENT = { [DIALOGS.EDITOR_IMAGE]: EditorDialogImage, + [DIALOGS.EDITOR_TEXT]: EditorDialogText, [DIALOGS.LOGIN]: LoginDialog, }; +export const NODE_EDITOR_DIALOGS = { + [NODE_TYPES.IMAGE]: DIALOGS.EDITOR_IMAGE, + [NODE_TYPES.TEXT]: DIALOGS.EDITOR_TEXT, +}; + export interface IDialogProps { onRequestClose: () => void; onDialogChange: (dialog: ValueOf<typeof DIALOGS>) => void; diff --git a/src/redux/modal/reducer.ts b/src/redux/modal/reducer.ts index 764ce9c6..2a7e472a 100644 --- a/src/redux/modal/reducer.ts +++ b/src/redux/modal/reducer.ts @@ -9,8 +9,8 @@ export interface IModalState { } const INITIAL_STATE: IModalState = { - is_shown: true, - dialog: DIALOGS.EDITOR_IMAGE, + is_shown: false, + dialog: DIALOGS.EDITOR_TEXT, }; export default createReducer(INITIAL_STATE, MODAL_HANDLERS); diff --git a/src/redux/node/actions.ts b/src/redux/node/actions.ts index 2e7e29f7..e34e9fee 100644 --- a/src/redux/node/actions.ts +++ b/src/redux/node/actions.ts @@ -1,5 +1,5 @@ import { INode, IValidationErrors, IComment, ITag } from '../types'; -import { NODE_ACTIONS } from './constants'; +import { NODE_ACTIONS, NODE_TYPES } from './constants'; import { INodeState } from './reducer'; export const nodeSave = (node: INode) => ({ @@ -64,3 +64,18 @@ export const nodeSetTags = (tags: ITag[]) => ({ type: NODE_ACTIONS.SET_TAGS, tags, }); + +export const nodeCreate = (node_type: INode['type']) => ({ + type: NODE_ACTIONS.CREATE, + node_type, +}); + +export const nodeEdit = (id: INode['id']) => ({ + type: NODE_ACTIONS.CREATE, + id, +}); + +export const nodeSetEditor = (editor: INode) => ({ + type: NODE_ACTIONS.SET_EDITOR, + editor, +}); diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 22c1930e..5f34723a 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -2,18 +2,24 @@ import { FC } from 'react'; import { IBlock, INode, ValueOf, IComment } from '../types'; import { NodeImageBlock } from '~/components/node/NodeImageBlock'; import { ImageEditor } from '~/components/editors/ImageEditor'; +import { TextEditor } from '~/components/editors/TextEditor'; +import { DIALOGS } from '../modal/constants'; const prefix = 'NODE.'; export const NODE_ACTIONS = { SAVE: `${prefix}SAVE`, LOAD_NODE: `${prefix}LOAD_NODE`, + EDIT: `${prefix}EDIT`, + CREATE: `${prefix}CREATE`, + SET_SAVE_ERRORS: `${prefix}SET_SAVE_ERRORS`, SET_LOADING: `${prefix}SET_LOADING`, SET_LOADING_COMMENTS: `${prefix}SET_LOADING_COMMENTS`, SET_SENDING_COMMENT: `${prefix}SET_SENDING_COMMENT`, SET_CURRENT: `${prefix}SET_CURRENT`, SET_COMMENT_DATA: `${prefix}SET_COMMENT_DATA`, + SET_EDITOR: `${prefix}SET_EDITOR`, POST_COMMENT: `${prefix}POST_COMMENT`, SET_COMMENTS: `${prefix}SET_COMMENTS`, @@ -22,13 +28,6 @@ export const NODE_ACTIONS = { SET_TAGS: `${prefix}SET_TAGS`, }; -export const EMPTY_BLOCK: IBlock = { - type: null, - files: [], - content: null, - embeds: [], -}; - export const EMPTY_NODE: INode = { id: null, @@ -78,6 +77,16 @@ export const EMPTY_COMMENT: IComment = { export const NODE_EDITORS = { [NODE_TYPES.IMAGE]: ImageEditor, + [NODE_TYPES.TEXT]: TextEditor, }; export const MAX_NODE_FILES = 16; + +export const NODE_EDITOR_DATA: Record< + typeof NODE_TYPES[keyof typeof NODE_TYPES], + Partial<INode> +> = { + [NODE_TYPES.TEXT]: { + blocks: [{ text: '', type: 'text' }], + }, +}; diff --git a/src/redux/node/handlers.ts b/src/redux/node/handlers.ts index 4c6341df..8600f9b2 100644 --- a/src/redux/node/handlers.ts +++ b/src/redux/node/handlers.ts @@ -9,6 +9,7 @@ import { nodeSetComments, nodeSetCommentData, nodeSetTags, + nodeSetEditor, } from './actions'; import { INodeState } from './reducer'; @@ -42,6 +43,9 @@ const setCommentData = ( const setTags = (state: INodeState, { tags }: ReturnType<typeof nodeSetTags>) => assocPath(['current', 'tags'], tags, state); +const setEditor = (state: INodeState, { editor }: ReturnType<typeof nodeSetEditor>) => + assocPath(['current', 'editor'], editor, state); + export const NODE_HANDLERS = { [NODE_ACTIONS.SET_SAVE_ERRORS]: setSaveErrors, [NODE_ACTIONS.SET_LOADING]: setLoading, @@ -51,4 +55,5 @@ export const NODE_HANDLERS = { [NODE_ACTIONS.SET_COMMENTS]: setComments, [NODE_ACTIONS.SET_COMMENT_DATA]: setCommentData, [NODE_ACTIONS.SET_TAGS]: setTags, + [NODE_ACTIONS.SET_EDITOR]: setEditor, }; diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index 927b7e87..7889b02b 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -1,7 +1,7 @@ import { takeLatest, call, put, select, delay } from 'redux-saga/effects'; import { push } from 'connected-react-router'; -import { NODE_ACTIONS, EMPTY_NODE, EMPTY_COMMENT } from './constants'; +import { NODE_ACTIONS, EMPTY_NODE, EMPTY_COMMENT, NODE_EDITOR_DATA } from './constants'; import { nodeSave, nodeSetSaveErrors, @@ -15,16 +15,19 @@ import { nodeSetCommentData, nodeUpdateTags, nodeSetTags, + nodeCreate, + nodeSetEditor, } from './actions'; import { postNode, getNode, postNodeComment, getNodeComments, updateNodeTags } from './api'; import { reqWrapper } from '../auth/sagas'; import { flowSetNodes } from '../flow/actions'; import { ERRORS } from '~/constants/errors'; -import { modalSetShown } from '../modal/actions'; +import { modalSetShown, modalShowDialog } from '../modal/actions'; import { selectFlowNodes } from '../flow/selectors'; import { URLS } from '~/constants/urls'; import { selectNode } from './selectors'; import { IResultWithStatus, INode } from '../types'; +import { NODE_EDITOR_DIALOGS } from '../modal/constants'; function* onNodeSave({ node }: ReturnType<typeof nodeSave>) { yield put(nodeSetSaveErrors({})); @@ -118,9 +121,17 @@ function* onUpdateTags({ id, tags }: ReturnType<typeof nodeUpdateTags>) { yield put(nodeSetTags(node.tags)); } +function* onCreateSaga({ node_type: type }: ReturnType<typeof nodeCreate>) { + if (!NODE_EDITOR_DIALOGS[type]) return; + + yield put(nodeSetEditor({ ...EMPTY_NODE, ...(NODE_EDITOR_DATA[type] || {}), type })); + yield put(modalShowDialog(NODE_EDITOR_DIALOGS[type])); +} + export default function* nodeSaga() { yield takeLatest(NODE_ACTIONS.SAVE, onNodeSave); yield takeLatest(NODE_ACTIONS.LOAD_NODE, onNodeLoad); yield takeLatest(NODE_ACTIONS.POST_COMMENT, onPostComment); yield takeLatest(NODE_ACTIONS.UPDATE_TAGS, onUpdateTags); + yield takeLatest(NODE_ACTIONS.CREATE, onCreateSaga); } diff --git a/src/redux/types.ts b/src/redux/types.ts index ff43f361..7c05e93d 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -2,6 +2,7 @@ import { DetailedHTMLProps, InputHTMLAttributes } from 'react'; import { DIALOGS } from '~/redux/modal/constants'; import { ERRORS } from '~/constants/errors'; import { IUser } from './auth/types'; +import { string } from 'prop-types'; export interface ITag { id: number; @@ -93,13 +94,18 @@ export interface IFileWithUUID { type: string; } -export interface IBlock { - type: 'image' | 'text' | 'media' | 'youtube' | 'video'; - files: UUID[]; - content: string; - embeds: string[]; +export interface IBlockText { + type: 'text'; + text: string; } +export interface IBlockEmbed { + type: 'embed'; + url: string; +} + +export type IBlock = IBlockText | IBlockEmbed; + export interface INode { id?: number; user: Partial<IUser>; From f42953b46065fafac9fc1505f40aa23e55a727b7 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 16 Oct 2019 17:18:39 +0700 Subject: [PATCH 18/99] simple drag --- .../node/NodeImageSlideBlock/index.tsx | 150 ++++++++++++++++++ .../node/NodeImageSlideBlock/styles.scss | 56 +++++++ src/redux/node/constants.ts | 4 +- 3 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 src/components/node/NodeImageSlideBlock/index.tsx create mode 100644 src/components/node/NodeImageSlideBlock/styles.scss diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx new file mode 100644 index 00000000..c2efff13 --- /dev/null +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -0,0 +1,150 @@ +import React, { + FC, + useMemo, + useState, + useEffect, + RefObject, + LegacyRef, + useRef, + useCallback, + MouseEventHandler, +} from 'react'; +import { ImageSwitcher } from '../ImageSwitcher'; +import * as styles from './styles.scss'; +import { INode } from '~/redux/types'; +import classNames from 'classnames'; +import { getImageSize } from '~/utils/dom'; +import { UPLOAD_TYPES } from '~/redux/uploads/constants'; + +interface IProps { + is_loading: boolean; + node: INode; + layout: {}; + updateLayout: () => void; +} + +const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => { + const [is_animated, setIsAnimated] = useState(false); + const [current, setCurrent] = useState(0); + const [height, setHeight] = useState(320); + const [loaded, setLoaded] = useState<Record<number, boolean>>({}); + const refs = useRef<Record<number, HTMLDivElement>>({}); + const [heights, setHeights] = useState({}); + + const [initial_offset, setInitialOffset] = useState(0); + const [initial_x, setInitialX] = useState(0); + const [offset, setOffset] = useState(0); + const [is_dragging, setIsDragging] = useState(false); + const slide = useRef(); + + const images = useMemo( + () => + (node && node.files && node.files.filter(({ type }) => type === UPLOAD_TYPES.IMAGE)) || [], + [node] + ); + + // console.log({ heights }); + + const updateSizes = useCallback(() => { + const values = Object.keys(refs.current).map(key => { + const ref = refs.current[key]; + if (!ref || !ref.getBoundingClientRect) return 0; + return ref.getBoundingClientRect().height; + }); + }, [refs]); + + const setRef = useCallback( + index => el => { + refs.current[index] = el; + }, + [refs, heights, setHeights] + ); + + const onImageLoad = useCallback(index => () => setLoaded({ ...loaded, [index]: true }), [ + setLoaded, + loaded, + ]); + + // update outside hooks + useEffect(() => updateLayout(), [loaded]); + + useEffect(() => { + updateSizes(); + // + // if (!refs || !refs.current[current] || !loaded[current]) return setHeight(320); + // + // const el = refs.current[current]; + // + // const element_height = el.getBoundingClientRect && el.getBoundingClientRect().height; + // + // setHeight(element_height); + }, [refs, current, loaded]); + + // useEffect(() => { + // const timer = setTimeout(() => setIsAnimated(true), 250); + // + // return () => clearTimeout(timer); + // }, []); + + const stopDragging = useCallback(() => { + window.removeEventListener('mouseup', stopDragging); + setIsDragging(false); + }, [setIsDragging]); + + const startDragging: MouseEventHandler<HTMLDivElement> = useCallback( + event => { + window.addEventListener('mouseup', stopDragging); + setIsDragging(true); + setInitialX(event.clientX); + setInitialOffset(offset); + }, + [setIsDragging, stopDragging, setInitialX, offset, setInitialOffset] + ); + + const onDrag = useCallback( + event => { + if (!is_dragging) return; + + setOffset(initial_offset + event.clientX - initial_x); + }, + [is_dragging, initial_x, setOffset, initial_offset] + ); + + return ( + <div className={classNames(styles.wrap, { is_loading, is_animated })}> + <div + className={styles.image_container} + style={{ + height, + transform: `translate(${offset}px, 0)`, + width: `${images.length * 100}%`, + }} + onMouseDown={startDragging} + onMouseMove={onDrag} + ref={slide} + > + {(is_loading || !loaded[0] || !images.length) && <div className={styles.placeholder} />} + + {images.map((file, index) => ( + <div + className={classNames(styles.image_wrap, { + is_active: index === current && loaded[index], + })} + ref={setRef(index)} + key={file.id} + > + <img + className={styles.image} + src={getImageSize(file, 'node')} + alt="" + key={file.id} + onLoad={onImageLoad(index)} + /> + </div> + ))} + </div> + </div> + ); +}; + +export { NodeImageSlideBlock }; diff --git a/src/components/node/NodeImageSlideBlock/styles.scss b/src/components/node/NodeImageSlideBlock/styles.scss new file mode 100644 index 00000000..c36ee620 --- /dev/null +++ b/src/components/node/NodeImageSlideBlock/styles.scss @@ -0,0 +1,56 @@ +.wrap { + overflow: hidden; + position: relative; + min-width: 0; + width: 100%; + + &:global(.is_animated) { + .image_container { + transition: height 0.5s; + } + + .image_wrap { + transition: opacity 0.5s; + } + } +} + +.image_container { + background: $node_image_bg; + border-radius: $panel_radius 0 0 $panel_radius; + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; + user-select: none; + + .image { + max-height: 960px; + max-width: 100%; + opacity: 1; + border-radius: $radius $radius 0 0; + } +} + +.image_wrap { + width: 100%; + // top: 0; + // left: 0; + // opacity: 0; + pointer-events: none; + touch-action: none; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + + &:global(.is_active) { + opacity: 1; + } +} + +.placeholder { + background: red; + height: 320px; +} diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 5f34723a..64bd54c8 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -1,6 +1,6 @@ import { FC } from 'react'; import { IBlock, INode, ValueOf, IComment } from '../types'; -import { NodeImageBlock } from '~/components/node/NodeImageBlock'; +import { NodeImageSlideBlock } from '~/components/node/NodeImageSlideBlock'; import { ImageEditor } from '~/components/editors/ImageEditor'; import { TextEditor } from '~/components/editors/TextEditor'; import { DIALOGS } from '../modal/constants'; @@ -63,7 +63,7 @@ type INodeComponents = Record< >; export const NODE_COMPONENTS: INodeComponents = { - [NODE_TYPES.IMAGE]: NodeImageBlock, + [NODE_TYPES.IMAGE]: NodeImageSlideBlock, }; export const EMPTY_COMMENT: IComment = { From b2b21f5b9ad74a9e59e1a791888ec5f8a324b77a Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 11:09:42 +0700 Subject: [PATCH 19/99] moving slider --- .../node/NodeImageSlideBlock/index.tsx | 67 +++++++++++++------ 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index c2efff13..7fc60160 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -35,7 +35,8 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => const [initial_x, setInitialX] = useState(0); const [offset, setOffset] = useState(0); const [is_dragging, setIsDragging] = useState(false); - const slide = useRef(); + const slide = useRef<HTMLDivElement>(); + const wrap = useRef<HTMLDivElement>(); const images = useMemo( () => @@ -46,11 +47,14 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => // console.log({ heights }); const updateSizes = useCallback(() => { - const values = Object.keys(refs.current).map(key => { + const values = Object.keys(refs.current).reduce((obj, key) => { const ref = refs.current[key]; if (!ref || !ref.getBoundingClientRect) return 0; - return ref.getBoundingClientRect().height; - }); + return { ...obj, [key]: ref.getBoundingClientRect().height }; + }, {}); + + setHeights(values); + console.log({ values }); }, [refs]); const setRef = useCallback( @@ -80,38 +84,58 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => // setHeight(element_height); }, [refs, current, loaded]); + useEffect(() => { + if (!wrap || !wrap.current) return; + + const { width } = wrap.current.getBoundingClientRect(); + const selected = Math.abs(-offset / width); + const prev = heights[Math.floor(selected)] || 320; + const next = heights[Math.ceil(selected)] || 320; + const now = prev - (prev - next) * (selected % 1); + + setHeight(now); + console.log({ offset, prev, next, now, selected }); + }, [offset, heights]); // useEffect(() => { // const timer = setTimeout(() => setIsAnimated(true), 250); // // return () => clearTimeout(timer); // }, []); - const stopDragging = useCallback(() => { - window.removeEventListener('mouseup', stopDragging); - setIsDragging(false); - }, [setIsDragging]); - - const startDragging: MouseEventHandler<HTMLDivElement> = useCallback( - event => { - window.addEventListener('mouseup', stopDragging); - setIsDragging(true); - setInitialX(event.clientX); - setInitialOffset(offset); - }, - [setIsDragging, stopDragging, setInitialX, offset, setInitialOffset] - ); - const onDrag = useCallback( event => { if (!is_dragging) return; - setOffset(initial_offset + event.clientX - initial_x); }, [is_dragging, initial_x, setOffset, initial_offset] ); + const stopDragging = useCallback(() => { + window.removeEventListener('mouseup', stopDragging); + setIsDragging(false); + }, [setIsDragging, onDrag]); + + const startDragging: MouseEventHandler<HTMLDivElement> = useCallback( + event => { + setIsDragging(true); + setInitialX(event.clientX); + setInitialOffset(offset); + + window.addEventListener('mouseup', stopDragging); + }, + [setIsDragging, stopDragging, setInitialX, offset, setInitialOffset, onDrag] + ); + + useEffect(() => { + window.addEventListener('mousemove', onDrag); + + return () => { + window.removeEventListener('mousemove', onDrag); + }; + }, [onDrag]); + return ( - <div className={classNames(styles.wrap, { is_loading, is_animated })}> + <div className={classNames(styles.wrap, { is_loading, is_animated })} ref={wrap}> <div className={styles.image_container} style={{ @@ -120,7 +144,6 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => width: `${images.length * 100}%`, }} onMouseDown={startDragging} - onMouseMove={onDrag} ref={slide} > {(is_loading || !loaded[0] || !images.length) && <div className={styles.placeholder} />} From 31093d42c3773e4f69d013da1c76bec6c77d135a Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 11:24:23 +0700 Subject: [PATCH 20/99] minimal slide height --- .../node/NodeImageSlideBlock/index.tsx | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index 7fc60160..acc33248 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -89,13 +89,13 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => const { width } = wrap.current.getBoundingClientRect(); const selected = Math.abs(-offset / width); - const prev = heights[Math.floor(selected)] || 320; - const next = heights[Math.ceil(selected)] || 320; + const prev = Math.max(heights[Math.floor(selected)] || 320, 320); + const next = Math.max(heights[Math.ceil(selected)] || 320, 320); const now = prev - (prev - next) * (selected % 1); setHeight(now); - console.log({ offset, prev, next, now, selected }); }, [offset, heights]); + // useEffect(() => { // const timer = setTimeout(() => setIsAnimated(true), 250); // @@ -104,8 +104,16 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => const onDrag = useCallback( event => { - if (!is_dragging) return; - setOffset(initial_offset + event.clientX - initial_x); + if (!is_dragging || !slide.current || !wrap.current) return; + + const { width: slide_width } = slide.current.getBoundingClientRect(); + const { width: wrap_width } = wrap.current.getBoundingClientRect(); + + console.log(wrap_width - slide_width, initial_offset + event.clientX - initial_x); + + setOffset( + Math.min(Math.max(initial_offset + event.clientX - initial_x, wrap_width - slide_width), 0) + ); }, [is_dragging, initial_x, setOffset, initial_offset] ); From 4236ef9824ad96af017a0e48bcd59a2a5ced2db7 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 12:33:52 +0700 Subject: [PATCH 21/99] sliding with mouse --- .../node/NodeImageSlideBlock/index.tsx | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index acc33248..30066358 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -8,6 +8,7 @@ import React, { useRef, useCallback, MouseEventHandler, + TouchEventHandler, } from 'react'; import { ImageSwitcher } from '../ImageSwitcher'; import * as styles from './styles.scss'; @@ -23,6 +24,8 @@ interface IProps { updateLayout: () => void; } +const getX = event => (event.touches ? event.touches[0].clientX : event.clientX); + const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => { const [is_animated, setIsAnimated] = useState(false); const [current, setCurrent] = useState(0); @@ -54,7 +57,6 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => }, {}); setHeights(values); - console.log({ values }); }, [refs]); const setRef = useCallback( @@ -104,54 +106,74 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => const onDrag = useCallback( event => { - if (!is_dragging || !slide.current || !wrap.current) return; + if ( + !is_dragging || + !slide.current || + !wrap.current || + (event.touches && event.clientY > event.clientX) + ) + return; const { width: slide_width } = slide.current.getBoundingClientRect(); const { width: wrap_width } = wrap.current.getBoundingClientRect(); - console.log(wrap_width - slide_width, initial_offset + event.clientX - initial_x); - setOffset( - Math.min(Math.max(initial_offset + event.clientX - initial_x, wrap_width - slide_width), 0) + Math.min(Math.max(initial_offset + getX(event) - initial_x, wrap_width - slide_width), 0) ); }, [is_dragging, initial_x, setOffset, initial_offset] ); const stopDragging = useCallback(() => { - window.removeEventListener('mouseup', stopDragging); - setIsDragging(false); - }, [setIsDragging, onDrag]); + if (!is_dragging) return; - const startDragging: MouseEventHandler<HTMLDivElement> = useCallback( + const { width: wrap_width } = wrap.current.getBoundingClientRect(); + + setIsDragging(false); + setOffset(Math.round(offset / wrap_width) * wrap_width); + }, [setIsDragging, offset, setOffset, is_dragging, wrap]); + + const startDragging = useCallback( event => { setIsDragging(true); - setInitialX(event.clientX); + setInitialX(getX(event)); setInitialOffset(offset); - - window.addEventListener('mouseup', stopDragging); }, - [setIsDragging, stopDragging, setInitialX, offset, setInitialOffset, onDrag] + [setIsDragging, setInitialX, offset, setInitialOffset] ); useEffect(() => { + window.addEventListener('resize', updateSizes); + window.addEventListener('mousemove', onDrag); + window.addEventListener('touchmove', onDrag); + + window.addEventListener('mouseup', stopDragging); + window.addEventListener('touchend', stopDragging); return () => { + window.removeEventListener('resize', updateSizes); + window.removeEventListener('mousemove', onDrag); + window.removeEventListener('touchmove', onDrag); + + window.removeEventListener('mouseup', stopDragging); + window.removeEventListener('touchend', stopDragging); }; - }, [onDrag]); + }, [onDrag, stopDragging]); return ( <div className={classNames(styles.wrap, { is_loading, is_animated })} ref={wrap}> <div className={styles.image_container} style={{ + transition: is_dragging ? 'none' : 'transform 500ms', height, transform: `translate(${offset}px, 0)`, width: `${images.length * 100}%`, }} onMouseDown={startDragging} + onTouchStart={startDragging} ref={slide} > {(is_loading || !loaded[0] || !images.length) && <div className={styles.placeholder} />} From a37bc7696555467fbdc5c06a106c7ff948ac5192 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 12:55:27 +0700 Subject: [PATCH 22/99] finished slider --- .../node/NodeImageSlideBlock/index.tsx | 41 ++++++++++--------- .../node/NodeImageSlideBlock/styles.scss | 11 +---- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index 30066358..40c4f71c 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -27,7 +27,7 @@ interface IProps { const getX = event => (event.touches ? event.touches[0].clientX : event.clientX); const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => { - const [is_animated, setIsAnimated] = useState(false); + // const [is_animated, setIsAnimated] = useState(false); const [current, setCurrent] = useState(0); const [height, setHeight] = useState(320); const [loaded, setLoaded] = useState<Record<number, boolean>>({}); @@ -72,19 +72,9 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => ]); // update outside hooks - useEffect(() => updateLayout(), [loaded]); + useEffect(() => updateLayout(), [loaded, height]); - useEffect(() => { - updateSizes(); - // - // if (!refs || !refs.current[current] || !loaded[current]) return setHeight(320); - // - // const el = refs.current[current]; - // - // const element_height = el.getBoundingClientRect && el.getBoundingClientRect().height; - // - // setHeight(element_height); - }, [refs, current, loaded]); + useEffect(() => updateSizes(), [refs, current, loaded]); useEffect(() => { if (!wrap || !wrap.current) return; @@ -95,15 +85,11 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => const next = Math.max(heights[Math.ceil(selected)] || 320, 320); const now = prev - (prev - next) * (selected % 1); + if (current !== Math.round(selected)) setCurrent(Math.round(selected)); + setHeight(now); }, [offset, heights]); - // useEffect(() => { - // const timer = setTimeout(() => setIsAnimated(true), 250); - // - // return () => clearTimeout(timer); - // }, []); - const onDrag = useCallback( event => { if ( @@ -162,8 +148,23 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => }; }, [onDrag, stopDragging]); + const changeCurrent = useCallback( + (item: number) => { + const { width } = wrap.current.getBoundingClientRect(); + setOffset(-1 * item * width); + }, + [wrap] + ); + return ( - <div className={classNames(styles.wrap, { is_loading, is_animated })} ref={wrap}> + <div className={classNames(styles.wrap, { is_loading })} ref={wrap}> + <ImageSwitcher + total={images.length} + current={current} + onChange={changeCurrent} + loaded={loaded} + /> + <div className={styles.image_container} style={{ diff --git a/src/components/node/NodeImageSlideBlock/styles.scss b/src/components/node/NodeImageSlideBlock/styles.scss index c36ee620..2feef7be 100644 --- a/src/components/node/NodeImageSlideBlock/styles.scss +++ b/src/components/node/NodeImageSlideBlock/styles.scss @@ -3,16 +3,7 @@ position: relative; min-width: 0; width: 100%; - - &:global(.is_animated) { - .image_container { - transition: height 0.5s; - } - - .image_wrap { - transition: opacity 0.5s; - } - } + transition: height 0.25s; } .image_container { From 57f90ee46bbde409a6792d97e52bd8f191a49562 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 13:17:34 +0700 Subject: [PATCH 23/99] fixed text editor appearance --- src/components/bars/SubmitBar/index.tsx | 5 +++++ src/components/editors/TextEditor/styles.scss | 4 +++- src/containers/dialogs/EditorDialog/index.tsx | 12 +++++++++--- src/redux/node/handlers.ts | 2 +- src/styles/inputs.scss | 2 +- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/components/bars/SubmitBar/index.tsx b/src/components/bars/SubmitBar/index.tsx index da44ab82..d5952c43 100644 --- a/src/components/bars/SubmitBar/index.tsx +++ b/src/components/bars/SubmitBar/index.tsx @@ -17,6 +17,7 @@ type IProps = typeof mapDispatchToProps & {}; const SubmitBarUnconnected: FC<IProps> = ({ nodeCreate }) => { const onOpenImageEditor = useCallback(() => nodeCreate(NODE_TYPES.IMAGE), [nodeCreate]); + const onOpenTextEditor = useCallback(() => nodeCreate(NODE_TYPES.TEXT), [nodeCreate]); return ( <div className={styles.wrap}> @@ -24,6 +25,10 @@ const SubmitBarUnconnected: FC<IProps> = ({ nodeCreate }) => { <div onClick={onOpenImageEditor}> <Icon icon="image" /> </div> + + <div onClick={onOpenTextEditor}> + <Icon icon="image" /> + </div> </div> <div className={styles.button}> diff --git a/src/components/editors/TextEditor/styles.scss b/src/components/editors/TextEditor/styles.scss index 4d3618e6..86245f67 100644 --- a/src/components/editors/TextEditor/styles.scss +++ b/src/components/editors/TextEditor/styles.scss @@ -1,3 +1,5 @@ .wrap { - padding-bottom: 60px; + & > div { + padding-bottom: 64px; + } } diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx index 02d5a53e..8257e08d 100644 --- a/src/containers/dialogs/EditorDialog/index.tsx +++ b/src/containers/dialogs/EditorDialog/index.tsx @@ -13,12 +13,14 @@ import { EditorPanel } from '~/components/editors/EditorPanel'; import * as NODE_ACTIONS from '~/redux/node/actions'; import { selectUploads } from '~/redux/uploads/selectors'; import { ERROR_LITERAL } from '~/constants/errors'; -import { NODE_EDITORS } from '~/redux/node/constants'; +import { NODE_EDITORS, EMPTY_NODE } from '~/redux/node/constants'; const mapStateToProps = state => { const { editor, errors } = selectNode(state); const { statuses, files } = selectUploads(state); + console.log('mss', { editor }); + return { editor, statuses, files, errors }; }; @@ -41,9 +43,11 @@ const EditorDialogUnconnected: FC<IProps> = ({ onRequestClose, type, }) => { - const [data, setData] = useState(editor); + const [data, setData] = useState(EMPTY_NODE); const [temp, setTemp] = useState([]); + useEffect(() => setData(editor), [editor]); + const setTitle = useCallback( title => { setData({ ...data, title }); @@ -53,10 +57,12 @@ const EditorDialogUnconnected: FC<IProps> = ({ const onSubmit = useCallback( (event: FormEvent) => { + console.log({ data, editor }); event.preventDefault(); + return; nodeSave(data); }, - [data, nodeSave] + [data, nodeSave, editor] ); useEffect(() => { diff --git a/src/redux/node/handlers.ts b/src/redux/node/handlers.ts index 8600f9b2..3ed37d47 100644 --- a/src/redux/node/handlers.ts +++ b/src/redux/node/handlers.ts @@ -44,7 +44,7 @@ const setTags = (state: INodeState, { tags }: ReturnType<typeof nodeSetTags>) => assocPath(['current', 'tags'], tags, state); const setEditor = (state: INodeState, { editor }: ReturnType<typeof nodeSetEditor>) => - assocPath(['current', 'editor'], editor, state); + assocPath(['editor'], editor, state); export const NODE_HANDLERS = { [NODE_ACTIONS.SET_SAVE_ERRORS]: setSaveErrors, diff --git a/src/styles/inputs.scss b/src/styles/inputs.scss index 960b61cb..a605a81d 100644 --- a/src/styles/inputs.scss +++ b/src/styles/inputs.scss @@ -38,7 +38,7 @@ &.focused { opacity: 1; - z-index: 999; + // z-index: 999; &.has_status .status { flex-basis: 0; From 54ce8db210bf5b620beb8013908328c86d4d71c3 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 14:44:13 +0700 Subject: [PATCH 24/99] displaying text --- .../node/NodeImageSlideBlock/index.tsx | 13 +----------- src/components/node/NodeTextBlock/index.tsx | 20 +++++++++++++++++++ src/components/node/NodeTextBlock/styles.scss | 11 ++++++++++ src/constants/errors.ts | 2 ++ src/containers/dialogs/EditorDialog/index.tsx | 6 +----- src/containers/node/NodeLayout/index.tsx | 11 ++++++++-- src/redux/modal/reducer.ts | 2 +- src/redux/node/constants.ts | 8 ++++++-- 8 files changed, 51 insertions(+), 22 deletions(-) create mode 100644 src/components/node/NodeTextBlock/index.tsx create mode 100644 src/components/node/NodeTextBlock/styles.scss diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index 40c4f71c..fe80da69 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -1,15 +1,4 @@ -import React, { - FC, - useMemo, - useState, - useEffect, - RefObject, - LegacyRef, - useRef, - useCallback, - MouseEventHandler, - TouchEventHandler, -} from 'react'; +import React, { FC, useMemo, useState, useEffect, useRef, useCallback } from 'react'; import { ImageSwitcher } from '../ImageSwitcher'; import * as styles from './styles.scss'; import { INode } from '~/redux/types'; diff --git a/src/components/node/NodeTextBlock/index.tsx b/src/components/node/NodeTextBlock/index.tsx new file mode 100644 index 00000000..8b053775 --- /dev/null +++ b/src/components/node/NodeTextBlock/index.tsx @@ -0,0 +1,20 @@ +import React, { FC } from 'react'; +import { INode } from '~/redux/types'; +import path from 'ramda/es/path'; +import { formatCommentText } from '~/utils/dom'; +import * as styles from './styles.scss'; + +interface IProps { + node: INode; +} + +const NodeTextBlock: FC<IProps> = ({ node }) => ( + <div + className={styles.text} + dangerouslySetInnerHTML={{ + __html: formatCommentText(null, path(['blocks', 0, 'text'], node)), + }} + /> +); + +export { NodeTextBlock }; diff --git a/src/components/node/NodeTextBlock/styles.scss b/src/components/node/NodeTextBlock/styles.scss new file mode 100644 index 00000000..d075cd73 --- /dev/null +++ b/src/components/node/NodeTextBlock/styles.scss @@ -0,0 +1,11 @@ +.text { + @include outer_shadow(); + + background: $content_bg; + padding: $gap; + border-radius: $radius; + + p { + margin: $gap / 2 0; + } +} diff --git a/src/constants/errors.ts b/src/constants/errors.ts index 15fffbf7..4070a22c 100644 --- a/src/constants/errors.ts +++ b/src/constants/errors.ts @@ -4,6 +4,7 @@ export const ERRORS = { EMPTY_RESPONSE: 'Empty_Response', NO_COMMENTS: 'No_Comments', FILES_REQUIRED: 'Files_Required', + TEXT_REQUIRED: 'Text_Required', }; export const ERROR_LITERAL = { @@ -12,4 +13,5 @@ export const ERROR_LITERAL = { [ERRORS.NO_COMMENTS]: 'Комментариев пока нет', [ERRORS.EMPTY_RESPONSE]: 'Пустой ответ сервера', [ERRORS.FILES_REQUIRED]: 'Добавьте файлы', + [ERRORS.TEXT_REQUIRED]: 'Нужно немного текста', }; diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx index 8257e08d..5430e4ca 100644 --- a/src/containers/dialogs/EditorDialog/index.tsx +++ b/src/containers/dialogs/EditorDialog/index.tsx @@ -19,8 +19,6 @@ const mapStateToProps = state => { const { editor, errors } = selectNode(state); const { statuses, files } = selectUploads(state); - console.log('mss', { editor }); - return { editor, statuses, files, errors }; }; @@ -57,12 +55,10 @@ const EditorDialogUnconnected: FC<IProps> = ({ const onSubmit = useCallback( (event: FormEvent) => { - console.log({ data, editor }); event.preventDefault(); - return; nodeSave(data); }, - [data, nodeSave, editor] + [data, nodeSave] ); useEffect(() => { diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index 4153147b..cde602c5 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -13,7 +13,7 @@ import { NodeRelated } from '~/components/node/NodeRelated'; import * as styles from './styles.scss'; import { NodeComments } from '~/components/node/NodeComments'; import { NodeTags } from '~/components/node/NodeTags'; -import { NODE_COMPONENTS } from '~/redux/node/constants'; +import { NODE_COMPONENTS, NODE_INLINES } from '~/redux/node/constants'; import * as NODE_ACTIONS from '~/redux/node/actions'; import { CommentForm } from '~/components/node/CommentForm'; import { selectUser } from '~/redux/auth/selectors'; @@ -57,7 +57,8 @@ const NodeLayoutUnconnected: FC<IProps> = ({ [node, nodeUpdateTags] ); - const block = node && node.type && NODE_COMPONENTS[node.type] && NODE_COMPONENTS[node.type]; + const block = node && node.type && NODE_COMPONENTS[node.type]; + const inline_block = node && node.type && NODE_INLINES[node.type]; return ( <Card className={styles.node} seamless> @@ -69,6 +70,12 @@ const NodeLayoutUnconnected: FC<IProps> = ({ <Padder> <Group horizontal className={styles.content}> <Group className={styles.comments}> + {inline_block && ( + <div className={styles.inline_block}> + {createElement(inline_block, { node, is_loading, updateLayout, layout })} + </div> + )} + {is_loading_comments || !comments.length ? ( <NodeNoComments is_loading={is_loading_comments} /> ) : ( diff --git a/src/redux/modal/reducer.ts b/src/redux/modal/reducer.ts index 2a7e472a..a8d4ca97 100644 --- a/src/redux/modal/reducer.ts +++ b/src/redux/modal/reducer.ts @@ -9,7 +9,7 @@ export interface IModalState { } const INITIAL_STATE: IModalState = { - is_shown: false, + is_shown: true, dialog: DIALOGS.EDITOR_TEXT, }; diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 64bd54c8..04afa40a 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -1,9 +1,9 @@ import { FC } from 'react'; -import { IBlock, INode, ValueOf, IComment } from '../types'; +import { INode, ValueOf, IComment } from '../types'; import { NodeImageSlideBlock } from '~/components/node/NodeImageSlideBlock'; +import { NodeTextBlock } from '~/components/node/NodeTextBlock'; import { ImageEditor } from '~/components/editors/ImageEditor'; import { TextEditor } from '~/components/editors/TextEditor'; -import { DIALOGS } from '../modal/constants'; const prefix = 'NODE.'; export const NODE_ACTIONS = { @@ -66,6 +66,10 @@ export const NODE_COMPONENTS: INodeComponents = { [NODE_TYPES.IMAGE]: NodeImageSlideBlock, }; +export const NODE_INLINES: INodeComponents = { + [NODE_TYPES.TEXT]: NodeTextBlock, +}; + export const EMPTY_COMMENT: IComment = { id: null, text: '', From 1552e88ddd7aeeef8c823107b78e089a9577d0f7 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 14:46:07 +0700 Subject: [PATCH 25/99] showing text nodes --- src/components/node/NodeTextBlock/styles.scss | 4 ++-- src/utils/dom.ts | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/node/NodeTextBlock/styles.scss b/src/components/node/NodeTextBlock/styles.scss index d075cd73..8bcd3b80 100644 --- a/src/components/node/NodeTextBlock/styles.scss +++ b/src/components/node/NodeTextBlock/styles.scss @@ -2,10 +2,10 @@ @include outer_shadow(); background: $content_bg; - padding: $gap; + padding: $gap * 4; border-radius: $radius; p { - margin: $gap / 2 0; + margin: $gap 0; } } diff --git a/src/utils/dom.ts b/src/utils/dom.ts index 00ed1461..15d122f2 100644 --- a/src/utils/dom.ts +++ b/src/utils/dom.ts @@ -67,8 +67,10 @@ export const getURL = (file: Partial<IFile>) => { export const getImageSize = (file: IFile, size?: string): string => getURL(file); // `${process.env.API_HOST}${image}`.replace('{size}', size); -export const formatCommentText = (author, text: string) => - text +export const formatCommentText = (author, text: string) => { + if (!text) return ''; + + return text .replace(/(\n{2,})/gi, '\n') .replace(/</g, '<') .replace(/>/g, '>') @@ -82,6 +84,8 @@ export const formatCommentText = (author, text: string) => : `<p>${el}</p>` ) .join(''); +}; + // .replace(/\/\*(\*(?!\/)|[^*])*\*\//igm, ''); export const getPrettyDate = (date: string): string => From de8e5b2d9e8cbb428f02bf759e5ab18f13cb24e4 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 14:56:32 +0700 Subject: [PATCH 26/99] hide the dialog! --- src/redux/modal/reducer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/redux/modal/reducer.ts b/src/redux/modal/reducer.ts index a8d4ca97..2a7e472a 100644 --- a/src/redux/modal/reducer.ts +++ b/src/redux/modal/reducer.ts @@ -9,7 +9,7 @@ export interface IModalState { } const INITIAL_STATE: IModalState = { - is_shown: true, + is_shown: false, dialog: DIALOGS.EDITOR_TEXT, }; From 6d0a22707cf802c01049b69d9b89df59c1def5fc Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 16:34:41 +0700 Subject: [PATCH 27/99] better text formatting --- src/components/node/NodeTextBlock/index.tsx | 4 +-- src/components/node/NodeTextBlock/styles.scss | 2 ++ src/utils/dom.ts | 26 +++++++++++-------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/components/node/NodeTextBlock/index.tsx b/src/components/node/NodeTextBlock/index.tsx index 8b053775..adb38d73 100644 --- a/src/components/node/NodeTextBlock/index.tsx +++ b/src/components/node/NodeTextBlock/index.tsx @@ -1,7 +1,7 @@ import React, { FC } from 'react'; import { INode } from '~/redux/types'; import path from 'ramda/es/path'; -import { formatCommentText } from '~/utils/dom'; +import { formatText } from '~/utils/dom'; import * as styles from './styles.scss'; interface IProps { @@ -12,7 +12,7 @@ const NodeTextBlock: FC<IProps> = ({ node }) => ( <div className={styles.text} dangerouslySetInnerHTML={{ - __html: formatCommentText(null, path(['blocks', 0, 'text'], node)), + __html: formatText(path(['blocks', 0, 'text'], node)), }} /> ); diff --git a/src/components/node/NodeTextBlock/styles.scss b/src/components/node/NodeTextBlock/styles.scss index 8bcd3b80..9acebdf6 100644 --- a/src/components/node/NodeTextBlock/styles.scss +++ b/src/components/node/NodeTextBlock/styles.scss @@ -7,5 +7,7 @@ p { margin: $gap 0; + font-size: 18px; + line-height: 24px; } } diff --git a/src/utils/dom.ts b/src/utils/dom.ts index 15d122f2..155bdb66 100644 --- a/src/utils/dom.ts +++ b/src/utils/dom.ts @@ -67,10 +67,8 @@ export const getURL = (file: Partial<IFile>) => { export const getImageSize = (file: IFile, size?: string): string => getURL(file); // `${process.env.API_HOST}${image}`.replace('{size}', size); -export const formatCommentText = (author, text: string) => { - if (!text) return ''; - - return text +export const formatText = (text: string): string => + text .replace(/(\n{2,})/gi, '\n') .replace(/</g, '<') .replace(/>/g, '>') @@ -78,15 +76,21 @@ export const formatCommentText = (author, text: string) => { .replace(/(\/\/[^\n]+)/gim, '<span class="grey">$1</span>') .replace(/:\|--\|/gim, '://') .split('\n') - .map((el, index) => - index === 0 - ? `${author ? `<p><b class="comment-author">${author}: </b>` : ''}${el}</p>` - : `<p>${el}</p>` - ) + .map(el => `<p>${el}</p>`) + // .map((el, index) => + // index === 0 + // ? `${author ? `<p><b class="comment-author">${author}: </b>` : ''}${el}</p>` + // : `<p>${el}</p>` + // ) .join(''); -}; -// .replace(/\/\*(\*(?!\/)|[^*])*\*\//igm, ''); +export const formatCommentText = (author: string, text: string): string => + text + ? formatText(text).replace( + /^<p>/, + author ? `<p><b class="comment-author">${author}: </b></p>` : '<p>' + ) + : ''; export const getPrettyDate = (date: string): string => formatDistanceToNow(new Date(date), { locale: ru, includeSeconds: true, addSuffix: true }); From 6476e60c816cf128e6364af0971850288b9fd782 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 16:53:52 +0700 Subject: [PATCH 28/99] better text nodes appearance --- src/components/flow/Cell/index.tsx | 27 ++++++++++++++--------- src/components/flow/Cell/styles.scss | 19 ++++++----------- src/styles/variables.scss | 2 +- src/utils/dom.ts | 32 +++++++++++++++------------- 4 files changed, 42 insertions(+), 38 deletions(-) diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index e85c2576..c88bf53b 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -1,23 +1,18 @@ import React, { FC, useState, useCallback } from 'react'; import { INode } from '~/redux/types'; -import { URLS } from '~/constants/urls'; -import { getImageSize, getURL } from '~/utils/dom'; -import classNames = require('classnames'); +import { getURL } from '~/utils/dom'; +import classNames from 'classnames'; import * as styles from './styles.scss'; +import path from 'ramda/es/path'; interface IProps { node: INode; - // height?: number; - // width?: number; - // title?: string; - // is_hero?: boolean; - // is_stamp?: boolean; onSelect: (id: INode['id'], type: INode['type']) => void; is_text?: boolean; } -const Cell: FC<IProps> = ({ node: { id, title, brief, type }, onSelect, is_text = false }) => { +const Cell: FC<IProps> = ({ node: { id, title, brief, type, blocks }, onSelect }) => { const [is_loaded, setIsLoaded] = useState(false); const onImageLoad = useCallback(() => { @@ -26,12 +21,17 @@ const Cell: FC<IProps> = ({ node: { id, title, brief, type }, onSelect, is_text const onClick = useCallback(() => onSelect(id, type), [onSelect, id]); + const text = path([0, 'text'], blocks); + return ( <div className={classNames(styles.cell, 'vert-1', 'hor-1', { is_text: false })} onClick={onClick} > - <div className={styles.face}>{title && <div className={styles.title}>{title}</div>}</div> + <div className={styles.face}> + {title && <div className={styles.title}>{title}</div>} + {text && <div className={styles.text}>{text}</div>} + </div> {brief && brief.thumbnail && ( <div @@ -49,3 +49,10 @@ const Cell: FC<IProps> = ({ node: { id, title, brief, type }, onSelect, is_text }; export { Cell }; + +/* + {type === NODE_TYPES.TEXT && ( + <div className={styles.text}>{path(['blocks', 0, 'text'], blocks)}</div> + )} + } +*/ diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 4b020662..539ab88c 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -26,16 +26,10 @@ } .text { - font: $font_16_regular; - line-height: 1.3em; + font: $font_18_regular; + line-height: 23px; + margin-top: $gap; letter-spacing: 0.5px; - position: absolute; - top: 0; - left: 0; - padding: $gap; - background: darken($content_bg, 4%); - height: 100%; - overflow: hidden; &::after { content: ' '; @@ -43,10 +37,10 @@ bottom: 0; left: 0; width: 100%; - height: 100px; + height: 160px; pointer-events: none; touch-action: none; - background: linear-gradient(transparentize($content_bg, 1), $content_bg 70px); + background: linear-gradient(transparentize($content_bg, 1), $content_bg 95%); z-index: 1; border-radius: 0 0 $radius $radius; } @@ -55,6 +49,7 @@ .title, .text_title { font: $font_cell_title; + line-height: 1.1em; text-transform: uppercase; overflow: hidden; @@ -63,7 +58,7 @@ } .title { - max-height: 2.6em; + // max-height: 3.3em; } .text_title { diff --git a/src/styles/variables.scss b/src/styles/variables.scss index cd9a6404..e86b5b2f 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -52,7 +52,7 @@ $font_10_semibold: $semibold 10px $font; $font_8_regular: $regular 8px $font; $font_8_semibold: $semibold 8px $font; -$font_cell_title: $font_24_bold; +$font_cell_title: $bold 30px $font; $font_hero_title: $font_48_semibold; $shadow_depth_1: transparentize(black, 0.8) 0 1px, inset transparentize(white, 0.98) 0 1px; diff --git a/src/utils/dom.ts b/src/utils/dom.ts index 155bdb66..e52f98cc 100644 --- a/src/utils/dom.ts +++ b/src/utils/dom.ts @@ -68,21 +68,23 @@ export const getImageSize = (file: IFile, size?: string): string => getURL(file) // `${process.env.API_HOST}${image}`.replace('{size}', size); export const formatText = (text: string): string => - text - .replace(/(\n{2,})/gi, '\n') - .replace(/</g, '<') - .replace(/>/g, '>') - .replace(/:\/\//gim, ':|--|') - .replace(/(\/\/[^\n]+)/gim, '<span class="grey">$1</span>') - .replace(/:\|--\|/gim, '://') - .split('\n') - .map(el => `<p>${el}</p>`) - // .map((el, index) => - // index === 0 - // ? `${author ? `<p><b class="comment-author">${author}: </b>` : ''}${el}</p>` - // : `<p>${el}</p>` - // ) - .join(''); + !text + ? '' + : text + .replace(/(\n{2,})/gi, '\n') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/:\/\//gim, ':|--|') + .replace(/(\/\/[^\n]+)/gim, '<span class="grey">$1</span>') + .replace(/:\|--\|/gim, '://') + .split('\n') + .map(el => `<p>${el}</p>`) + // .map((el, index) => + // index === 0 + // ? `${author ? `<p><b class="comment-author">${author}: </b>` : ''}${el}</p>` + // : `<p>${el}</p>` + // ) + .join(''); export const formatCommentText = (author: string, text: string): string => text From 1249389691c7abd2538b4aee82e6283988ba770b Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 17 Oct 2019 17:59:29 +0700 Subject: [PATCH 29/99] fixed text appearance --- src/components/flow/Cell/styles.scss | 1 + src/utils/dom.ts | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 539ab88c..b57eef2b 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -55,6 +55,7 @@ overflow: hidden; box-sizing: border-box; + word-break: break-word; } .title { diff --git a/src/utils/dom.ts b/src/utils/dom.ts index e52f98cc..62a4a020 100644 --- a/src/utils/dom.ts +++ b/src/utils/dom.ts @@ -1,6 +1,7 @@ import { IFile } from '~/redux/types'; import formatDistanceToNow from 'date-fns/formatDistanceToNow'; import { ru } from 'date-fns/locale'; +import Axios from 'axios'; export const getStyle = (oElm: any, strCssRule: string) => { if (document.defaultView && document.defaultView.getComputedStyle) { @@ -90,9 +91,15 @@ export const formatCommentText = (author: string, text: string): string => text ? formatText(text).replace( /^<p>/, - author ? `<p><b class="comment-author">${author}: </b></p>` : '<p>' + author ? `<p><b class="comment-author">${author}: </b>` : '<p>' ) : ''; export const getPrettyDate = (date: string): string => formatDistanceToNow(new Date(date), { locale: ru, includeSeconds: true, addSuffix: true }); + +export const getYoutubeTitle = async (id: string) => { + Axios.get(`http://youtube.com/get_video_info?video_id=${id}`).then(console.log); +}; + +(<any>window).getYoutubeTitle = getYoutubeTitle; From 1c92f9a3b80cce7dd18a7ad0b71cb9779e850be1 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Fri, 18 Oct 2019 09:35:32 +0700 Subject: [PATCH 30/99] changing max image height to its container --- .../editors/EditorUploadButton/index.tsx | 8 ++--- .../node/NodeImageSlideBlock/index.tsx | 34 ++++++++++++++----- src/redux/node/constants.ts | 7 ++-- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/components/editors/EditorUploadButton/index.tsx b/src/components/editors/EditorUploadButton/index.tsx index eb183634..47660d5b 100644 --- a/src/components/editors/EditorUploadButton/index.tsx +++ b/src/components/editors/EditorUploadButton/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useCallback, useEffect, useState } from 'react'; +import React, { FC, useCallback, useEffect } from 'react'; import * as styles from './styles.scss'; import { Icon } from '~/components/input/Icon'; import { IFileWithUUID, INode, IFile } from '~/redux/types'; @@ -9,7 +9,7 @@ import assocPath from 'ramda/es/assocPath'; import append from 'ramda/es/append'; import { selectUploads } from '~/redux/uploads/selectors'; import { connect } from 'react-redux'; -import { MAX_NODE_FILES } from '~/redux/node/constants'; +import { NODE_SETTINGS } from '~/redux/node/constants'; const mapStateToProps = state => { const { statuses, files } = selectUploads(state); @@ -43,9 +43,9 @@ const EditorUploadButtonUnconnected: FC<IProps> = ({ const onUpload = useCallback( (uploads: File[]) => { const current = temp.length + data.files.length; - const limit = MAX_NODE_FILES - current; + const limit = NODE_SETTINGS.MAX_FILES - current; - if (current >= MAX_NODE_FILES) return; + if (current >= NODE_SETTINGS.MAX_FILES) return; const items: IFileWithUUID[] = Array.from(uploads).map( (file: File): IFileWithUUID => ({ diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index fe80da69..690453fa 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -5,6 +5,7 @@ import { INode } from '~/redux/types'; import classNames from 'classnames'; import { getImageSize } from '~/utils/dom'; import { UPLOAD_TYPES } from '~/redux/uploads/constants'; +import { NODE_SETTINGS } from '~/redux/node/constants'; interface IProps { is_loading: boolean; @@ -19,6 +20,7 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => // const [is_animated, setIsAnimated] = useState(false); const [current, setCurrent] = useState(0); const [height, setHeight] = useState(320); + const [max_height, setMaxHeight] = useState(960); const [loaded, setLoaded] = useState<Record<number, boolean>>({}); const refs = useRef<Record<number, HTMLDivElement>>({}); const [heights, setHeights] = useState({}); @@ -36,12 +38,12 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => [node] ); - // console.log({ heights }); - const updateSizes = useCallback(() => { const values = Object.keys(refs.current).reduce((obj, key) => { const ref = refs.current[key]; + if (!ref || !ref.getBoundingClientRect) return 0; + return { ...obj, [key]: ref.getBoundingClientRect().height }; }, {}); @@ -62,7 +64,6 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => // update outside hooks useEffect(() => updateLayout(), [loaded, height]); - useEffect(() => updateSizes(), [refs, current, loaded]); useEffect(() => { @@ -77,7 +78,7 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => if (current !== Math.round(selected)) setCurrent(Math.round(selected)); setHeight(now); - }, [offset, heights]); + }, [offset, heights, max_height]); const onDrag = useCallback( event => { @@ -99,14 +100,24 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => [is_dragging, initial_x, setOffset, initial_offset] ); + const normalizeOffset = useCallback(() => { + const { width: wrap_width } = wrap.current.getBoundingClientRect(); + setOffset(Math.round(offset / wrap_width) * wrap_width); + }, [wrap, offset]); + + const updateMaxHeight = useCallback(() => { + if (!wrap.current) return; + const { width } = wrap.current.getBoundingClientRect(); + setMaxHeight(width * NODE_SETTINGS.MAX_IMAGE_ASPECT); + normalizeOffset(); + }, [wrap, setMaxHeight, normalizeOffset]); + const stopDragging = useCallback(() => { if (!is_dragging) return; - const { width: wrap_width } = wrap.current.getBoundingClientRect(); - + normalizeOffset(); setIsDragging(false); - setOffset(Math.round(offset / wrap_width) * wrap_width); - }, [setIsDragging, offset, setOffset, is_dragging, wrap]); + }, [setIsDragging, is_dragging, normalizeOffset]); const startDragging = useCallback( event => { @@ -117,8 +128,11 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => [setIsDragging, setInitialX, offset, setInitialOffset] ); + useEffect(() => updateMaxHeight(), []); + useEffect(() => { window.addEventListener('resize', updateSizes); + window.addEventListener('resize', updateMaxHeight); window.addEventListener('mousemove', onDrag); window.addEventListener('touchmove', onDrag); @@ -128,6 +142,7 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => return () => { window.removeEventListener('resize', updateSizes); + window.removeEventListener('resize', updateMaxHeight); window.removeEventListener('mousemove', onDrag); window.removeEventListener('touchmove', onDrag); @@ -135,7 +150,7 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => window.removeEventListener('mouseup', stopDragging); window.removeEventListener('touchend', stopDragging); }; - }, [onDrag, stopDragging]); + }, [onDrag, stopDragging, updateMaxHeight, updateSizes]); const changeCurrent = useCallback( (item: number) => { @@ -182,6 +197,7 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => alt="" key={file.id} onLoad={onImageLoad(index)} + style={{ maxHeight: max_height }} /> </div> ))} diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 04afa40a..8f08cce4 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -84,8 +84,6 @@ export const NODE_EDITORS = { [NODE_TYPES.TEXT]: TextEditor, }; -export const MAX_NODE_FILES = 16; - export const NODE_EDITOR_DATA: Record< typeof NODE_TYPES[keyof typeof NODE_TYPES], Partial<INode> @@ -94,3 +92,8 @@ export const NODE_EDITOR_DATA: Record< blocks: [{ text: '', type: 'text' }], }, }; + +export const NODE_SETTINGS = { + MAX_FILES: 16, + MAX_IMAGE_ASPECT: 1.2, +}; From 12e366fce93850948079e627e1b2a9ce33e493d2 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Fri, 18 Oct 2019 09:36:07 +0700 Subject: [PATCH 31/99] c;eanup --- src/components/node/NodeImageSlideBlock/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index 690453fa..24092867 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -17,7 +17,6 @@ interface IProps { const getX = event => (event.touches ? event.touches[0].clientX : event.clientX); const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => { - // const [is_animated, setIsAnimated] = useState(false); const [current, setCurrent] = useState(0); const [height, setHeight] = useState(320); const [max_height, setMaxHeight] = useState(960); From 8612cc5ce7d1b54c173faa7f757a42bac81b218a Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Sat, 19 Oct 2019 19:42:39 +0700 Subject: [PATCH 32/99] video node editor --- src/components/bars/SubmitBar/index.tsx | 7 +++- src/components/editors/VideoEditor/index.tsx | 40 +++++++++++++++++++ .../editors/VideoEditor/styles.scss | 30 ++++++++++++++ .../editors/EditorDialogVideo/index.tsx | 10 +++++ .../editors/EditorDialogVideo/styles.scss | 0 src/redux/flow/sagas.ts | 6 +-- src/redux/modal/constants.ts | 4 ++ src/redux/node/constants.ts | 2 + src/redux/types.ts | 2 +- src/sprites/Sprites.tsx | 10 +++++ 10 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 src/components/editors/VideoEditor/index.tsx create mode 100644 src/components/editors/VideoEditor/styles.scss create mode 100644 src/containers/editors/EditorDialogVideo/index.tsx create mode 100644 src/containers/editors/EditorDialogVideo/styles.scss diff --git a/src/components/bars/SubmitBar/index.tsx b/src/components/bars/SubmitBar/index.tsx index d5952c43..d9ae30f1 100644 --- a/src/components/bars/SubmitBar/index.tsx +++ b/src/components/bars/SubmitBar/index.tsx @@ -18,6 +18,7 @@ type IProps = typeof mapDispatchToProps & {}; const SubmitBarUnconnected: FC<IProps> = ({ nodeCreate }) => { const onOpenImageEditor = useCallback(() => nodeCreate(NODE_TYPES.IMAGE), [nodeCreate]); const onOpenTextEditor = useCallback(() => nodeCreate(NODE_TYPES.TEXT), [nodeCreate]); + const onOpenVideoEditor = useCallback(() => nodeCreate(NODE_TYPES.VIDEO), [nodeCreate]); return ( <div className={styles.wrap}> @@ -27,7 +28,11 @@ const SubmitBarUnconnected: FC<IProps> = ({ nodeCreate }) => { </div> <div onClick={onOpenTextEditor}> - <Icon icon="image" /> + <Icon icon="text" /> + </div> + + <div onClick={onOpenVideoEditor}> + <Icon icon="video" /> </div> </div> diff --git a/src/components/editors/VideoEditor/index.tsx b/src/components/editors/VideoEditor/index.tsx new file mode 100644 index 00000000..7409b1d9 --- /dev/null +++ b/src/components/editors/VideoEditor/index.tsx @@ -0,0 +1,40 @@ +import React, { FC, useCallback, useMemo } from 'react'; +import { INode } from '~/redux/types'; +import * as styles from './styles.scss'; +import path from 'ramda/es/path'; +import { InputText } from '~/components/input/InputText'; + +interface IProps { + data: INode; + setData: (val: INode) => void; +} + +const VideoEditor: FC<IProps> = ({ data, setData }) => { + const setUrl = useCallback( + (url: string) => setData({ ...data, blocks: [{ type: 'video', url }] }), + [data, setData] + ); + + const url = (path(['blocks', 0, 'url'], data) as string) || ''; + const preview = useMemo(() => { + const match = + url && + url.match( + /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?/ + ); + + return match && match[1] ? `http://img.youtube.com/vi/${match[1]}/maxresdefault.jpg` : null; + }, [url]); + + return ( + <div className={styles.preview} style={{ backgroundImage: preview && `url("${preview}")` }}> + <div className={styles.input_wrap}> + <div className={styles.input}> + <InputText value={url} handler={setUrl} placeholder="Адрес видео" /> + </div> + </div> + </div> + ); +}; + +export { VideoEditor }; diff --git a/src/components/editors/VideoEditor/styles.scss b/src/components/editors/VideoEditor/styles.scss new file mode 100644 index 00000000..ce800aa2 --- /dev/null +++ b/src/components/editors/VideoEditor/styles.scss @@ -0,0 +1,30 @@ +.preview { + padding-top: 56.25%; + position: relative; + // background: darken($color: $content_bg, $amount: 2%); +} + +.input_wrap { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.input { + // @include outer_shadow(); + + flex: 1 0 50%; + padding: $gap * 2 $gap $gap * 2 $gap; + // border-radius: $radius; + background: $content_bg; + // margin: 20px; + + input { + text-align: center; + } +} diff --git a/src/containers/editors/EditorDialogVideo/index.tsx b/src/containers/editors/EditorDialogVideo/index.tsx new file mode 100644 index 00000000..092c688f --- /dev/null +++ b/src/containers/editors/EditorDialogVideo/index.tsx @@ -0,0 +1,10 @@ +import React, { FC } from 'react'; +import { EditorDialog } from '~/containers/dialogs/EditorDialog'; +import { IDialogProps } from '~/redux/types'; +import { NODE_TYPES } from '~/redux/node/constants'; + +type IProps = IDialogProps & {}; + +const EditorDialogVideo: FC<IProps> = props => <EditorDialog type={NODE_TYPES.VIDEO} {...props} />; + +export { EditorDialogVideo }; diff --git a/src/containers/editors/EditorDialogVideo/styles.scss b/src/containers/editors/EditorDialogVideo/styles.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/redux/flow/sagas.ts b/src/redux/flow/sagas.ts index cb621c23..a52cb975 100644 --- a/src/redux/flow/sagas.ts +++ b/src/redux/flow/sagas.ts @@ -13,13 +13,11 @@ function* onGetFlow() { }: IResultWithStatus<{ nodes: INode[] }> = yield call(getNodes, {}); if (!nodes || !nodes.length) { - // todo: set error empty response + yield put(flowSetNodes([])); + return; } - // todo: write nodes yield put(flowSetNodes(nodes)); - - // console.log('flow', { nodes, error }); } export default function* nodeSaga() { diff --git a/src/redux/modal/constants.ts b/src/redux/modal/constants.ts index 2bde90a2..fa3b53c5 100644 --- a/src/redux/modal/constants.ts +++ b/src/redux/modal/constants.ts @@ -2,6 +2,7 @@ import { ValueOf } from '~/redux/types'; import { LoginDialog } from '~/containers/dialogs/LoginDialog'; import { EditorDialogImage } from '~/containers/editors/EditorDialogImage'; import { EditorDialogText } from '~/containers/editors/EditorDialogText'; +import { EditorDialogVideo } from '~/containers/editors/EditorDialogVideo'; import { NODE_TYPES } from '../node/constants'; export const MODAL_ACTIONS = { @@ -13,18 +14,21 @@ export const MODAL_ACTIONS = { export const DIALOGS = { EDITOR_IMAGE: 'EDITOR_IMAGE', EDITOR_TEXT: 'EDITOR_TEXT', + EDITOR_VIDEO: 'EDITOR_VIDEO', LOGIN: 'LOGIN', }; export const DIALOG_CONTENT = { [DIALOGS.EDITOR_IMAGE]: EditorDialogImage, [DIALOGS.EDITOR_TEXT]: EditorDialogText, + [DIALOGS.EDITOR_VIDEO]: EditorDialogVideo, [DIALOGS.LOGIN]: LoginDialog, }; export const NODE_EDITOR_DIALOGS = { [NODE_TYPES.IMAGE]: DIALOGS.EDITOR_IMAGE, [NODE_TYPES.TEXT]: DIALOGS.EDITOR_TEXT, + [NODE_TYPES.VIDEO]: DIALOGS.EDITOR_VIDEO, }; export interface IDialogProps { diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 8f08cce4..4278f0a2 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -4,6 +4,7 @@ import { NodeImageSlideBlock } from '~/components/node/NodeImageSlideBlock'; import { NodeTextBlock } from '~/components/node/NodeTextBlock'; import { ImageEditor } from '~/components/editors/ImageEditor'; import { TextEditor } from '~/components/editors/TextEditor'; +import { VideoEditor } from '~/components/editors/VideoEditor'; const prefix = 'NODE.'; export const NODE_ACTIONS = { @@ -82,6 +83,7 @@ export const EMPTY_COMMENT: IComment = { export const NODE_EDITORS = { [NODE_TYPES.IMAGE]: ImageEditor, [NODE_TYPES.TEXT]: TextEditor, + [NODE_TYPES.VIDEO]: VideoEditor, }; export const NODE_EDITOR_DATA: Record< diff --git a/src/redux/types.ts b/src/redux/types.ts index 7c05e93d..65cc711f 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -100,7 +100,7 @@ export interface IBlockText { } export interface IBlockEmbed { - type: 'embed'; + type: 'video'; url: string; } diff --git a/src/sprites/Sprites.tsx b/src/sprites/Sprites.tsx index bba02120..6c97ebdd 100644 --- a/src/sprites/Sprites.tsx +++ b/src/sprites/Sprites.tsx @@ -98,6 +98,16 @@ const Sprites: FC<{}> = () => ( <path fill="none" d="M0 0h24v24H0V0z" /> <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" /> </g> + + <g id="text" stroke="none"> + <path fill="none" d="M0 0h24v24H0V0z" /> + <path d="M14 17H4v2h10v-2zm6-8H4v2h16V9zM4 15h16v-2H4v2zM4 5v2h16V5H4z" /> + </g> + + <g id="video" stroke="none"> + <path fill="none" d="M0 0h24v24H0V0z" /> + <path d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z" /> + </g> </svg> ); From f7c2f0e90fb219b505da9c42875dbb0f68b0e656 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Sat, 19 Oct 2019 19:53:53 +0700 Subject: [PATCH 33/99] creating youtube node --- src/components/editors/EditorPanel/index.tsx | 5 ++++- src/components/editors/VideoEditor/index.tsx | 3 ++- src/components/editors/VideoEditor/styles.scss | 11 ++++++++--- src/constants/errors.ts | 2 ++ src/containers/dialogs/ScrollDialog/styles.scss | 2 +- src/redux/node/constants.ts | 5 +++++ 6 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/components/editors/EditorPanel/index.tsx b/src/components/editors/EditorPanel/index.tsx index 475b0bb2..78e60097 100644 --- a/src/components/editors/EditorPanel/index.tsx +++ b/src/components/editors/EditorPanel/index.tsx @@ -2,6 +2,7 @@ import React, { FC } from 'react'; import * as styles from './styles.scss'; import { INode } from '~/redux/types'; import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; +import { NODE_UPLOAD_TYPES } from '~/redux/node/constants'; interface IProps { data: INode; @@ -12,7 +13,9 @@ interface IProps { const EditorPanel: FC<IProps> = ({ data, setData, temp, setTemp }) => ( <div className={styles.panel}> - <EditorUploadButton data={data} setData={setData} temp={temp} setTemp={setTemp} /> + {data.type && NODE_UPLOAD_TYPES[data.type] && ( + <EditorUploadButton data={data} setData={setData} temp={temp} setTemp={setTemp} /> + )} </div> ); diff --git a/src/components/editors/VideoEditor/index.tsx b/src/components/editors/VideoEditor/index.tsx index 7409b1d9..282e53c1 100644 --- a/src/components/editors/VideoEditor/index.tsx +++ b/src/components/editors/VideoEditor/index.tsx @@ -3,6 +3,7 @@ import { INode } from '~/redux/types'; import * as styles from './styles.scss'; import path from 'ramda/es/path'; import { InputText } from '~/components/input/InputText'; +import classnames from 'classnames'; interface IProps { data: INode; @@ -29,7 +30,7 @@ const VideoEditor: FC<IProps> = ({ data, setData }) => { return ( <div className={styles.preview} style={{ backgroundImage: preview && `url("${preview}")` }}> <div className={styles.input_wrap}> - <div className={styles.input}> + <div className={classnames(styles.input, { active: !!preview })}> <InputText value={url} handler={setUrl} placeholder="Адрес видео" /> </div> </div> diff --git a/src/components/editors/VideoEditor/styles.scss b/src/components/editors/VideoEditor/styles.scss index ce800aa2..5184851c 100644 --- a/src/components/editors/VideoEditor/styles.scss +++ b/src/components/editors/VideoEditor/styles.scss @@ -1,6 +1,7 @@ .preview { padding-top: 56.25%; position: relative; + border-radius: $radius; // background: darken($color: $content_bg, $amount: 2%); } @@ -19,12 +20,16 @@ // @include outer_shadow(); flex: 1 0 50%; - padding: $gap * 2 $gap $gap * 2 $gap; - // border-radius: $radius; + padding: $gap * 2; + border-radius: $radius; background: $content_bg; - // margin: 20px; + margin: 20px; input { text-align: center; } + + &:global(.active) { + background: $red; + } } diff --git a/src/constants/errors.ts b/src/constants/errors.ts index 4070a22c..910b4dbb 100644 --- a/src/constants/errors.ts +++ b/src/constants/errors.ts @@ -5,6 +5,7 @@ export const ERRORS = { NO_COMMENTS: 'No_Comments', FILES_REQUIRED: 'Files_Required', TEXT_REQUIRED: 'Text_Required', + UNKNOWN_NODE_TYPE: 'Unknown_Node_Type', }; export const ERROR_LITERAL = { @@ -14,4 +15,5 @@ export const ERROR_LITERAL = { [ERRORS.EMPTY_RESPONSE]: 'Пустой ответ сервера', [ERRORS.FILES_REQUIRED]: 'Добавьте файлы', [ERRORS.TEXT_REQUIRED]: 'Нужно немного текста', + [ERRORS.UNKNOWN_NODE_TYPE]: 'Неизвестный тип поста', }; diff --git a/src/containers/dialogs/ScrollDialog/styles.scss b/src/containers/dialogs/ScrollDialog/styles.scss index 2d5740a2..0d0b1856 100644 --- a/src/containers/dialogs/ScrollDialog/styles.scss +++ b/src/containers/dialogs/ScrollDialog/styles.scss @@ -133,7 +133,7 @@ } .error { - background: linear-gradient(transparentize($orange, 1), $red); + background: linear-gradient(transparentize($orange, 1), $red 90%); position: absolute; width: 100%; height: auto; diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 4278f0a2..89034de1 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -5,6 +5,7 @@ import { NodeTextBlock } from '~/components/node/NodeTextBlock'; import { ImageEditor } from '~/components/editors/ImageEditor'; import { TextEditor } from '~/components/editors/TextEditor'; import { VideoEditor } from '~/components/editors/VideoEditor'; +import { UPLOAD_TYPES } from '../uploads/constants'; const prefix = 'NODE.'; export const NODE_ACTIONS = { @@ -86,6 +87,10 @@ export const NODE_EDITORS = { [NODE_TYPES.VIDEO]: VideoEditor, }; +export const NODE_UPLOAD_TYPES = { + [NODE_TYPES.IMAGE]: [UPLOAD_TYPES.IMAGE], +}; + export const NODE_EDITOR_DATA: Record< typeof NODE_TYPES[keyof typeof NODE_TYPES], Partial<INode> From 6917c465f3a3b51e2b37c4ace1f722fd22e11cf8 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Sat, 19 Oct 2019 20:06:48 +0700 Subject: [PATCH 34/99] displaying node videos --- src/components/node/NodeVideoBlock/index.tsx | 36 +++++++++++++++++++ .../node/NodeVideoBlock/styles.scss | 12 +++++++ src/constants/errors.ts | 2 ++ src/redux/node/constants.ts | 2 ++ 4 files changed, 52 insertions(+) create mode 100644 src/components/node/NodeVideoBlock/index.tsx create mode 100644 src/components/node/NodeVideoBlock/styles.scss diff --git a/src/components/node/NodeVideoBlock/index.tsx b/src/components/node/NodeVideoBlock/index.tsx new file mode 100644 index 00000000..0c250b4c --- /dev/null +++ b/src/components/node/NodeVideoBlock/index.tsx @@ -0,0 +1,36 @@ +import React, { FC, useMemo } from 'react'; +import { INode } from '~/redux/types'; +import * as styles from './styles.scss'; +import path from 'ramda/es/path'; + +interface IProps { + node: INode; +} + +const NodeVideoBlock: FC<IProps> = ({ node }) => { + const video = useMemo(() => { + const url: string = path(['blocks', 0, 'url'], node); + const match = + url && + url.match( + /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?/ + ); + + return match && match[1]; + }, [node]); + + return ( + <div className={styles.wrap}> + <iframe + width="560" + height="315" + src={`https://www.youtube.com/embed/${video}`} + frameBorder="0" + allowFullScreen + title="video" + /> + </div> + ); +}; + +export { NodeVideoBlock }; diff --git a/src/components/node/NodeVideoBlock/styles.scss b/src/components/node/NodeVideoBlock/styles.scss new file mode 100644 index 00000000..d6c742c6 --- /dev/null +++ b/src/components/node/NodeVideoBlock/styles.scss @@ -0,0 +1,12 @@ +.wrap { + padding-bottom: 56.25%; + position: relative; + + iframe { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + } +} diff --git a/src/constants/errors.ts b/src/constants/errors.ts index 910b4dbb..70a8ee47 100644 --- a/src/constants/errors.ts +++ b/src/constants/errors.ts @@ -6,6 +6,7 @@ export const ERRORS = { FILES_REQUIRED: 'Files_Required', TEXT_REQUIRED: 'Text_Required', UNKNOWN_NODE_TYPE: 'Unknown_Node_Type', + URL_INVALID: 'Url_Invalid', }; export const ERROR_LITERAL = { @@ -16,4 +17,5 @@ export const ERROR_LITERAL = { [ERRORS.FILES_REQUIRED]: 'Добавьте файлы', [ERRORS.TEXT_REQUIRED]: 'Нужно немного текста', [ERRORS.UNKNOWN_NODE_TYPE]: 'Неизвестный тип поста', + [ERRORS.URL_INVALID]: 'Неизвестный адрес', }; diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 89034de1..44f85a85 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -2,6 +2,7 @@ import { FC } from 'react'; import { INode, ValueOf, IComment } from '../types'; import { NodeImageSlideBlock } from '~/components/node/NodeImageSlideBlock'; import { NodeTextBlock } from '~/components/node/NodeTextBlock'; +import { NodeVideoBlock } from '~/components/node/NodeVideoBlock'; import { ImageEditor } from '~/components/editors/ImageEditor'; import { TextEditor } from '~/components/editors/TextEditor'; import { VideoEditor } from '~/components/editors/VideoEditor'; @@ -66,6 +67,7 @@ type INodeComponents = Record< export const NODE_COMPONENTS: INodeComponents = { [NODE_TYPES.IMAGE]: NodeImageSlideBlock, + [NODE_TYPES.VIDEO]: NodeVideoBlock, }; export const NODE_INLINES: INodeComponents = { From 5d7b76f0032051fc7357e018c5f97c2d151a0143 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Sat, 19 Oct 2019 21:39:23 +0700 Subject: [PATCH 35/99] flow appearance --- src/components/flow/FlowGrid/styles.scss | 18 +++++++++++++++++- src/styles/variables.scss | 9 ++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/components/flow/FlowGrid/styles.scss b/src/components/flow/FlowGrid/styles.scss index bfc6dc1f..bda06973 100644 --- a/src/components/flow/FlowGrid/styles.scss +++ b/src/components/flow/FlowGrid/styles.scss @@ -8,11 +8,27 @@ $cols: $content_width / $cell; .grid_test { display: grid; grid-template-columns: repeat(auto-fit, minmax($cell, 1fr)); - grid-template-rows: $cell; + grid-template-rows: 40vh $cell; grid-auto-rows: $cell; grid-auto-flow: row dense; grid-column-gap: $grid_line; grid-row-gap: $grid_line; + + @media (max-width: $cell * 5) { + grid-template-columns: repeat(4, 1fr); + } + + @media (max-width: $cell * 4) { + grid-template-columns: repeat(3, 1fr); + } + + @media (max-width: $cell * 3) { + grid-template-columns: repeat(2, 1fr); + } + + @media (max-width: $cell * 2) { + grid-template-columns: repeat(1, 1fr); + } } .pad_last { diff --git a/src/styles/variables.scss b/src/styles/variables.scss index e86b5b2f..e05cd282 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -106,7 +106,9 @@ $input_shadow_filled: $input_shadow; } @mixin phone { - @content; + @media (max-width: 320px) { + @content; + } } @mixin tablet { @@ -114,6 +116,11 @@ $input_shadow_filled: $input_shadow; @content; } } +@mixin desktop { + @media (max-width: $content_width) { + @content; + } +} @mixin vertical_at_tablet { @media (max-width: 599px) { From 23a38fed6087e2ffa675cac7586db37a40a440d8 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Sun, 20 Oct 2019 18:13:09 +0700 Subject: [PATCH 36/99] changed node structure --- src/components/flow/Cell/index.tsx | 8 ++++---- src/redux/types.ts | 9 ++------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index c88bf53b..46148fb0 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -12,7 +12,7 @@ interface IProps { is_text?: boolean; } -const Cell: FC<IProps> = ({ node: { id, title, brief, type, blocks }, onSelect }) => { +const Cell: FC<IProps> = ({ node: { id, title, thumbnail, type, blocks }, onSelect }) => { const [is_loaded, setIsLoaded] = useState(false); const onImageLoad = useCallback(() => { @@ -33,15 +33,15 @@ const Cell: FC<IProps> = ({ node: { id, title, brief, type, blocks }, onSelect } {text && <div className={styles.text}>{text}</div>} </div> - {brief && brief.thumbnail && ( + {thumbnail && ( <div className={styles.thumbnail} style={{ - backgroundImage: `url("${getURL({ url: brief.thumbnail })}")`, + backgroundImage: `url("${getURL({ url: thumbnail })}")`, opacity: is_loaded ? 1 : 0, }} > - <img src={getURL({ url: brief.thumbnail })} onLoad={onImageLoad} alt="" /> + <img src={getURL({ url: thumbnail })} onLoad={onImageLoad} alt="" /> </div> )} </div> diff --git a/src/redux/types.ts b/src/redux/types.ts index 65cc711f..c8cb11f8 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -117,13 +117,8 @@ export interface INode { type: string; blocks: IBlock[]; - - brief?: { - thumbnail?: string; - description?: string; - owner?: string; - comments?: number; - }; + thumbnail?: string; + description?: string; options: { flow: { From f38865b01e94cd3ff2a318fbc82cbb6f04aa034b Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Sun, 20 Oct 2019 18:13:41 +0700 Subject: [PATCH 37/99] cleanup --- src/components/flow/Cell/index.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index 46148fb0..49941986 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -49,10 +49,3 @@ const Cell: FC<IProps> = ({ node: { id, title, thumbnail, type, blocks }, onSele }; export { Cell }; - -/* - {type === NODE_TYPES.TEXT && ( - <div className={styles.text}>{path(['blocks', 0, 'text'], blocks)}</div> - )} - } -*/ From 554a2ccfa7730fe107cb3819690cebb609241187 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Sun, 20 Oct 2019 18:46:55 +0700 Subject: [PATCH 38/99] changed flow cell types --- src/redux/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/redux/types.ts b/src/redux/types.ts index c8cb11f8..a849deab 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -122,7 +122,7 @@ export interface INode { options: { flow: { - display: 'single' | 'double' | 'quadro'; + display: 'single' | 'vertical' | 'horizontal' | 'quadro'; show_description: boolean; }; }; From 2ca9e9bdeff74bd5e3fb0d85272274b1bafec5f4 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 13:27:28 +0700 Subject: [PATCH 39/99] fixed file dropping and panel buttons --- .../editors/EditorImageUploadButton/index.tsx | 23 +++++++++++++++++++ src/components/editors/EditorPanel/index.tsx | 12 +++++----- .../editors/EditorUploadButton/index.tsx | 9 ++++++-- src/components/editors/ImageGrid/index.tsx | 4 ++-- src/containers/dialogs/Modal/index.tsx | 2 -- src/redux/node/constants.ts | 5 ++-- 6 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 src/components/editors/EditorImageUploadButton/index.tsx diff --git a/src/components/editors/EditorImageUploadButton/index.tsx b/src/components/editors/EditorImageUploadButton/index.tsx new file mode 100644 index 00000000..410667f4 --- /dev/null +++ b/src/components/editors/EditorImageUploadButton/index.tsx @@ -0,0 +1,23 @@ +import React, { FC } from 'react'; +import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; +import { INode } from '~/redux/types'; + +interface IProps { + data: INode; + setData: (val: INode) => void; + temp: string[]; + setTemp: (val: string[]) => void; +} + +const EditorImageUploadButton: FC<IProps> = ({ data, setData, temp, setTemp }) => ( + <EditorUploadButton + data={data} + setData={setData} + temp={temp} + setTemp={setTemp} + accept="image/*" + icon="image" + /> +); + +export { EditorImageUploadButton }; diff --git a/src/components/editors/EditorPanel/index.tsx b/src/components/editors/EditorPanel/index.tsx index 78e60097..bbcec349 100644 --- a/src/components/editors/EditorPanel/index.tsx +++ b/src/components/editors/EditorPanel/index.tsx @@ -1,8 +1,7 @@ -import React, { FC } from 'react'; +import React, { FC, createElement } from 'react'; import * as styles from './styles.scss'; import { INode } from '~/redux/types'; -import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; -import { NODE_UPLOAD_TYPES } from '~/redux/node/constants'; +import { NODE_PANEL_COMPONENTS } from '~/redux/node/constants'; interface IProps { data: INode; @@ -13,9 +12,10 @@ interface IProps { const EditorPanel: FC<IProps> = ({ data, setData, temp, setTemp }) => ( <div className={styles.panel}> - {data.type && NODE_UPLOAD_TYPES[data.type] && ( - <EditorUploadButton data={data} setData={setData} temp={temp} setTemp={setTemp} /> - )} + {NODE_PANEL_COMPONENTS[data.type] && + NODE_PANEL_COMPONENTS[data.type].map((el, key) => + createElement(el, { key, data, setData, temp, setTemp }) + )} </div> ); diff --git a/src/components/editors/EditorUploadButton/index.tsx b/src/components/editors/EditorUploadButton/index.tsx index 47660d5b..a4b2aee1 100644 --- a/src/components/editors/EditorUploadButton/index.tsx +++ b/src/components/editors/EditorUploadButton/index.tsx @@ -27,6 +27,9 @@ type IProps = ReturnType<typeof mapStateToProps> & setData: (val: INode) => void; temp: string[]; setTemp: (val: string[]) => void; + + accept?: string; + icon?: string; }; const EditorUploadButtonUnconnected: FC<IProps> = ({ @@ -37,6 +40,8 @@ const EditorUploadButtonUnconnected: FC<IProps> = ({ statuses, files, uploadUploadFiles, + accept = 'image/*', + icon = 'plus', }) => { const eventPreventer = useCallback(event => event.preventDefault(), []); @@ -116,10 +121,10 @@ const EditorUploadButtonUnconnected: FC<IProps> = ({ return ( <div className={styles.wrap}> - <input type="file" onChange={onInputChange} accept="image/*" multiple /> + <input type="file" onChange={onInputChange} accept={accept} multiple /> <div className={styles.icon}> - <Icon size={32} icon="plus" /> + <Icon size={32} icon={icon} /> </div> </div> ); diff --git a/src/components/editors/ImageGrid/index.tsx b/src/components/editors/ImageGrid/index.tsx index c4a2eb50..55350dbf 100644 --- a/src/components/editors/ImageGrid/index.tsx +++ b/src/components/editors/ImageGrid/index.tsx @@ -17,14 +17,14 @@ interface IProps { const ImageGrid: FC<IProps> = ({ files, setFiles, locked }) => { const onMove = useCallback( ({ oldIndex, newIndex }: SortEnd) => { - setFiles(moveArrItem(oldIndex, newIndex, files) as IFile[]); + setFiles(moveArrItem(oldIndex, newIndex, files.filter(file => !!file)) as IFile[]); }, [setFiles, files] ); const onDrop = useCallback( (remove_id: IFile['id']) => { - setFiles(files.filter(file => file.id === remove_id)); + setFiles(files.filter(file => file && file.id !== remove_id)); }, [setFiles, files] ); diff --git a/src/containers/dialogs/Modal/index.tsx b/src/containers/dialogs/Modal/index.tsx index d3c6362d..d0470af1 100644 --- a/src/containers/dialogs/Modal/index.tsx +++ b/src/containers/dialogs/Modal/index.tsx @@ -29,8 +29,6 @@ const ModalUnconnected: FC<IProps> = ({ if (!dialog || !DIALOG_CONTENT[dialog] || !is_shown) return null; - console.log({ onRequestClose }); - return ReactDOM.createPortal( <div className={styles.fixed}> <div className={styles.overlay} onClick={onRequestClose} /> diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 44f85a85..8ec40fd8 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -7,6 +7,7 @@ import { ImageEditor } from '~/components/editors/ImageEditor'; import { TextEditor } from '~/components/editors/TextEditor'; import { VideoEditor } from '~/components/editors/VideoEditor'; import { UPLOAD_TYPES } from '../uploads/constants'; +import { EditorImageUploadButton } from '~/components/editors/EditorImageUploadButton'; const prefix = 'NODE.'; export const NODE_ACTIONS = { @@ -89,8 +90,8 @@ export const NODE_EDITORS = { [NODE_TYPES.VIDEO]: VideoEditor, }; -export const NODE_UPLOAD_TYPES = { - [NODE_TYPES.IMAGE]: [UPLOAD_TYPES.IMAGE], +export const NODE_PANEL_COMPONENTS = { + [NODE_TYPES.IMAGE]: [EditorImageUploadButton], }; export const NODE_EDITOR_DATA: Record< From d676ff88e4b9920f17d288b63b9af99b37b5c7f9 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 13:28:24 +0700 Subject: [PATCH 40/99] cleanup --- src/components/editors/ImageGrid/index.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/editors/ImageGrid/index.tsx b/src/components/editors/ImageGrid/index.tsx index 55350dbf..3b97b7af 100644 --- a/src/components/editors/ImageGrid/index.tsx +++ b/src/components/editors/ImageGrid/index.tsx @@ -1,11 +1,9 @@ import React, { FC, useCallback } from 'react'; import { SortEnd } from 'react-sortable-hoc'; import * as styles from './styles.scss'; -import { IFile, INode } from '~/redux/types'; +import { IFile } from '~/redux/types'; import { IUploadStatus } from '~/redux/uploads/reducer'; -import assocPath from 'ramda/es/assocPath'; import { moveArrItem } from '~/utils/fn'; -import reject from 'ramda/es/reject'; import { SortableImageGrid } from '~/components/editors/SortableImageGrid'; interface IProps { From 5e9b6e1819354a751dab65b06ab21630aa27c49c Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 13:42:00 +0700 Subject: [PATCH 41/99] audio upload buttin --- src/components/bars/SubmitBar/index.tsx | 5 ++++ src/components/editors/AudioEditor/index.tsx | 14 +++++++++++ .../editors/EditorAudioUploadButton/index.tsx | 25 +++++++++++++++++++ .../editors/EditorImageUploadButton/index.tsx | 2 ++ .../editors/EditorPanel/styles.scss | 15 ++++++++++- .../editors/EditorUploadButton/index.tsx | 8 ++++-- .../editors/EditorDialogAudio/index.tsx | 10 ++++++++ src/redux/modal/constants.ts | 4 +++ src/redux/node/constants.ts | 5 +++- src/sprites/Sprites.tsx | 7 ++++-- 10 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 src/components/editors/AudioEditor/index.tsx create mode 100644 src/components/editors/EditorAudioUploadButton/index.tsx create mode 100644 src/containers/editors/EditorDialogAudio/index.tsx diff --git a/src/components/bars/SubmitBar/index.tsx b/src/components/bars/SubmitBar/index.tsx index d9ae30f1..6ed41060 100644 --- a/src/components/bars/SubmitBar/index.tsx +++ b/src/components/bars/SubmitBar/index.tsx @@ -19,6 +19,7 @@ const SubmitBarUnconnected: FC<IProps> = ({ nodeCreate }) => { const onOpenImageEditor = useCallback(() => nodeCreate(NODE_TYPES.IMAGE), [nodeCreate]); const onOpenTextEditor = useCallback(() => nodeCreate(NODE_TYPES.TEXT), [nodeCreate]); const onOpenVideoEditor = useCallback(() => nodeCreate(NODE_TYPES.VIDEO), [nodeCreate]); + const onOpenAudioEditor = useCallback(() => nodeCreate(NODE_TYPES.AUDIO), [nodeCreate]); return ( <div className={styles.wrap}> @@ -34,6 +35,10 @@ const SubmitBarUnconnected: FC<IProps> = ({ nodeCreate }) => { <div onClick={onOpenVideoEditor}> <Icon icon="video" /> </div> + + <div onClick={onOpenAudioEditor}> + <Icon icon="audio" /> + </div> </div> <div className={styles.button}> diff --git a/src/components/editors/AudioEditor/index.tsx b/src/components/editors/AudioEditor/index.tsx new file mode 100644 index 00000000..b3ef026f --- /dev/null +++ b/src/components/editors/AudioEditor/index.tsx @@ -0,0 +1,14 @@ +import React, { FC, useCallback } from 'react'; +import { INode } from '~/redux/types'; +import path from 'ramda/es/path'; + +interface IProps { + data: INode; + setData: (val: INode) => void; +} + +const AudioEditor: FC<IProps> = ({ data, setData }) => { + return <div>something!</div>; +}; + +export { AudioEditor }; diff --git a/src/components/editors/EditorAudioUploadButton/index.tsx b/src/components/editors/EditorAudioUploadButton/index.tsx new file mode 100644 index 00000000..3f35eb7e --- /dev/null +++ b/src/components/editors/EditorAudioUploadButton/index.tsx @@ -0,0 +1,25 @@ +import React, { FC } from 'react'; +import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; +import { INode } from '~/redux/types'; +import { UPLOAD_TYPES } from '~/redux/uploads/constants'; + +interface IProps { + data: INode; + setData: (val: INode) => void; + temp: string[]; + setTemp: (val: string[]) => void; +} + +const EditorAudioUploadButton: FC<IProps> = ({ data, setData, temp, setTemp }) => ( + <EditorUploadButton + data={data} + setData={setData} + temp={temp} + setTemp={setTemp} + accept="audio/*" + icon="audio" + type={UPLOAD_TYPES.AUDIO} + /> +); + +export { EditorAudioUploadButton }; diff --git a/src/components/editors/EditorImageUploadButton/index.tsx b/src/components/editors/EditorImageUploadButton/index.tsx index 410667f4..3ca8006d 100644 --- a/src/components/editors/EditorImageUploadButton/index.tsx +++ b/src/components/editors/EditorImageUploadButton/index.tsx @@ -1,6 +1,7 @@ import React, { FC } from 'react'; import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; import { INode } from '~/redux/types'; +import { UPLOAD_TYPES } from '~/redux/uploads/constants'; interface IProps { data: INode; @@ -17,6 +18,7 @@ const EditorImageUploadButton: FC<IProps> = ({ data, setData, temp, setTemp }) = setTemp={setTemp} accept="image/*" icon="image" + type={UPLOAD_TYPES.IMAGE} /> ); diff --git a/src/components/editors/EditorPanel/styles.scss b/src/components/editors/EditorPanel/styles.scss index 36902205..0c3178d2 100644 --- a/src/components/editors/EditorPanel/styles.scss +++ b/src/components/editors/EditorPanel/styles.scss @@ -7,4 +7,17 @@ box-sizing: border-box; padding: $gap; z-index: 10; -} \ No newline at end of file + display: flex; + flex-direction: row; + + & > * { + margin: 0 $gap; + + &:first-child { + margin-left: 0; + } + &:last-child { + margin-right: 0; + } + } +} diff --git a/src/components/editors/EditorUploadButton/index.tsx b/src/components/editors/EditorUploadButton/index.tsx index a4b2aee1..c69dc3cf 100644 --- a/src/components/editors/EditorUploadButton/index.tsx +++ b/src/components/editors/EditorUploadButton/index.tsx @@ -30,6 +30,7 @@ type IProps = ReturnType<typeof mapStateToProps> & accept?: string; icon?: string; + type?: typeof UPLOAD_TYPES[keyof typeof UPLOAD_TYPES]; }; const EditorUploadButtonUnconnected: FC<IProps> = ({ @@ -42,6 +43,7 @@ const EditorUploadButtonUnconnected: FC<IProps> = ({ uploadUploadFiles, accept = 'image/*', icon = 'plus', + type = UPLOAD_TYPES.IMAGE, }) => { const eventPreventer = useCallback(event => event.preventDefault(), []); @@ -52,13 +54,15 @@ const EditorUploadButtonUnconnected: FC<IProps> = ({ if (current >= NODE_SETTINGS.MAX_FILES) return; + console.log({ type }); + const items: IFileWithUUID[] = Array.from(uploads).map( (file: File): IFileWithUUID => ({ file, temp_id: uuid(), subject: UPLOAD_SUBJECTS.EDITOR, target: UPLOAD_TARGETS.NODES, - type: UPLOAD_TYPES.IMAGE, + type, }) ); @@ -67,7 +71,7 @@ const EditorUploadButtonUnconnected: FC<IProps> = ({ setTemp([...temp, ...temps]); uploadUploadFiles(items); }, - [setTemp, uploadUploadFiles, temp, data] + [setTemp, uploadUploadFiles, temp, data, type] ); const onFileAdd = useCallback( diff --git a/src/containers/editors/EditorDialogAudio/index.tsx b/src/containers/editors/EditorDialogAudio/index.tsx new file mode 100644 index 00000000..27b306f9 --- /dev/null +++ b/src/containers/editors/EditorDialogAudio/index.tsx @@ -0,0 +1,10 @@ +import React, { FC } from 'react'; +import { EditorDialog } from '~/containers/dialogs/EditorDialog'; +import { IDialogProps } from '~/redux/types'; +import { NODE_TYPES } from '~/redux/node/constants'; + +type IProps = IDialogProps & {}; + +const EditorDialogAudio: FC<IProps> = props => <EditorDialog type={NODE_TYPES.AUDIO} {...props} />; + +export { EditorDialogAudio }; diff --git a/src/redux/modal/constants.ts b/src/redux/modal/constants.ts index fa3b53c5..8426320d 100644 --- a/src/redux/modal/constants.ts +++ b/src/redux/modal/constants.ts @@ -3,6 +3,7 @@ import { LoginDialog } from '~/containers/dialogs/LoginDialog'; import { EditorDialogImage } from '~/containers/editors/EditorDialogImage'; import { EditorDialogText } from '~/containers/editors/EditorDialogText'; import { EditorDialogVideo } from '~/containers/editors/EditorDialogVideo'; +import { EditorDialogAudio } from '~/containers/editors/EditorDialogAudio'; import { NODE_TYPES } from '../node/constants'; export const MODAL_ACTIONS = { @@ -15,6 +16,7 @@ export const DIALOGS = { EDITOR_IMAGE: 'EDITOR_IMAGE', EDITOR_TEXT: 'EDITOR_TEXT', EDITOR_VIDEO: 'EDITOR_VIDEO', + EDITOR_AUDIO: 'EDITOR_AUDIO', LOGIN: 'LOGIN', }; @@ -22,6 +24,7 @@ export const DIALOG_CONTENT = { [DIALOGS.EDITOR_IMAGE]: EditorDialogImage, [DIALOGS.EDITOR_TEXT]: EditorDialogText, [DIALOGS.EDITOR_VIDEO]: EditorDialogVideo, + [DIALOGS.EDITOR_AUDIO]: EditorDialogAudio, [DIALOGS.LOGIN]: LoginDialog, }; @@ -29,6 +32,7 @@ export const NODE_EDITOR_DIALOGS = { [NODE_TYPES.IMAGE]: DIALOGS.EDITOR_IMAGE, [NODE_TYPES.TEXT]: DIALOGS.EDITOR_TEXT, [NODE_TYPES.VIDEO]: DIALOGS.EDITOR_VIDEO, + [NODE_TYPES.AUDIO]: DIALOGS.EDITOR_AUDIO, }; export interface IDialogProps { diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 8ec40fd8..b3b8b56d 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -6,8 +6,9 @@ import { NodeVideoBlock } from '~/components/node/NodeVideoBlock'; import { ImageEditor } from '~/components/editors/ImageEditor'; import { TextEditor } from '~/components/editors/TextEditor'; import { VideoEditor } from '~/components/editors/VideoEditor'; -import { UPLOAD_TYPES } from '../uploads/constants'; +import { AudioEditor } from '~/components/editors/AudioEditor'; import { EditorImageUploadButton } from '~/components/editors/EditorImageUploadButton'; +import { EditorAudioUploadButton } from '~/components/editors/EditorAudioUploadButton'; const prefix = 'NODE.'; export const NODE_ACTIONS = { @@ -88,10 +89,12 @@ export const NODE_EDITORS = { [NODE_TYPES.IMAGE]: ImageEditor, [NODE_TYPES.TEXT]: TextEditor, [NODE_TYPES.VIDEO]: VideoEditor, + [NODE_TYPES.AUDIO]: AudioEditor, }; export const NODE_PANEL_COMPONENTS = { [NODE_TYPES.IMAGE]: [EditorImageUploadButton], + [NODE_TYPES.AUDIO]: [EditorAudioUploadButton, EditorImageUploadButton], }; export const NODE_EDITOR_DATA: Record< diff --git a/src/sprites/Sprites.tsx b/src/sprites/Sprites.tsx index 6c97ebdd..c4631a4f 100644 --- a/src/sprites/Sprites.tsx +++ b/src/sprites/Sprites.tsx @@ -108,9 +108,12 @@ const Sprites: FC<{}> = () => ( <path fill="none" d="M0 0h24v24H0V0z" /> <path d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z" /> </g> + + <g id="audio" stroke="none"> + <path fill="none" d="M0 0h24v24H0V0z" /> + <path d="M12 3v9.28c-.47-.17-.97-.28-1.5-.28C8.01 12 6 14.01 6 16.5S8.01 21 10.5 21c2.31 0 4.2-1.75 4.45-4H15V6h4V3h-7z" /> + </g> </svg> ); export { Sprites }; - -// <path d="M0 0H8V8H-8V-8Z" fillRule="evenodd" /> From a9d4be064e546dd2badfeb9e026ed0f60c034ea3 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 17:13:58 +0700 Subject: [PATCH 42/99] audio editor images --- src/components/editors/AudioEditor/index.tsx | 56 ++++++++++++++++---- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/src/components/editors/AudioEditor/index.tsx b/src/components/editors/AudioEditor/index.tsx index b3ef026f..a22ea0d1 100644 --- a/src/components/editors/AudioEditor/index.tsx +++ b/src/components/editors/AudioEditor/index.tsx @@ -1,14 +1,52 @@ -import React, { FC, useCallback } from 'react'; +import React, { FC, useCallback, useMemo } from 'react'; import { INode } from '~/redux/types'; -import path from 'ramda/es/path'; +import { connect } from 'react-redux'; +import { UPLOAD_TYPES } from '~/redux/uploads/constants'; +import { ImageGrid } from '../ImageGrid'; +import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; +import { selectUploads } from '~/redux/uploads/selectors'; -interface IProps { - data: INode; - setData: (val: INode) => void; -} - -const AudioEditor: FC<IProps> = ({ data, setData }) => { - return <div>something!</div>; +const mapStateToProps = selectUploads; +const mapDispatchToProps = { + uploadUploadFiles: UPLOAD_ACTIONS.uploadUploadFiles, }; +type IProps = ReturnType<typeof mapStateToProps> & + typeof mapDispatchToProps & { + data: INode; + setData: (val: INode) => void; + temp: string[]; + setTemp: (val: string[]) => void; + }; + +const AudioEditorUnconnected: FC<IProps> = ({ data, setData, temp, statuses }) => { + const images = useMemo( + () => data.files.filter(file => file && file.type === UPLOAD_TYPES.IMAGE), + [data.files] + ); + + const pending_images = useMemo(() => temp.filter(id => !!statuses[id]).map(id => statuses[id]), [ + temp, + statuses, + ]); + + const audios = useMemo( + () => data.files.filter(file => file && file.type === UPLOAD_TYPES.AUDIO), + [data.files] + ); + + const setImages = useCallback(files => setData({ ...data, files: [...files, ...audios] }), [ + setData, + data, + audios, + ]); + + return <ImageGrid files={images} setFiles={setImages} locked={pending_images} />; +}; + +const AudioEditor = connect( + mapStateToProps, + mapDispatchToProps +)(AudioEditorUnconnected); + export { AudioEditor }; From 645ea8e29e0632f89751e52bea2f79c70ebc9de6 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 17:51:52 +0700 Subject: [PATCH 43/99] audio editor --- src/components/editors/AudioEditor/index.tsx | 34 +++++++-- .../editors/AudioEditor/styles.scss | 4 + src/components/editors/AudioGrid/index.tsx | 43 +++++++++++ src/components/editors/AudioGrid/styles.scss | 4 + .../editors/SortableAudioGrid/index.tsx | 38 ++++++++++ .../editors/SortableAudioGrid/styles.scss | 13 ++++ .../editors/SortableAudioGridItem/index.tsx | 10 +++ .../editors/SortableAudioGridItem/styles.scss | 4 + .../editors/SortableImageGrid/styles.scss | 2 - src/components/upload/AudioUpload/index.tsx | 43 +++++++++++ src/components/upload/AudioUpload/styles.scss | 75 +++++++++++++++++++ src/constants/errors.ts | 2 + src/redux/uploads/constants.ts | 1 + src/redux/uploads/reducer.ts | 1 + src/redux/uploads/sagas.ts | 8 +- 15 files changed, 273 insertions(+), 9 deletions(-) create mode 100644 src/components/editors/AudioEditor/styles.scss create mode 100644 src/components/editors/AudioGrid/index.tsx create mode 100644 src/components/editors/AudioGrid/styles.scss create mode 100644 src/components/editors/SortableAudioGrid/index.tsx create mode 100644 src/components/editors/SortableAudioGrid/styles.scss create mode 100644 src/components/editors/SortableAudioGridItem/index.tsx create mode 100644 src/components/editors/SortableAudioGridItem/styles.scss create mode 100644 src/components/upload/AudioUpload/index.tsx create mode 100644 src/components/upload/AudioUpload/styles.scss diff --git a/src/components/editors/AudioEditor/index.tsx b/src/components/editors/AudioEditor/index.tsx index a22ea0d1..9826c74c 100644 --- a/src/components/editors/AudioEditor/index.tsx +++ b/src/components/editors/AudioEditor/index.tsx @@ -3,8 +3,10 @@ import { INode } from '~/redux/types'; import { connect } from 'react-redux'; import { UPLOAD_TYPES } from '~/redux/uploads/constants'; import { ImageGrid } from '../ImageGrid'; +import { AudioGrid } from '../AudioGrid'; import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; import { selectUploads } from '~/redux/uploads/selectors'; +import * as styles from './styles.scss'; const mapStateToProps = selectUploads; const mapDispatchToProps = { @@ -25,23 +27,45 @@ const AudioEditorUnconnected: FC<IProps> = ({ data, setData, temp, statuses }) = [data.files] ); - const pending_images = useMemo(() => temp.filter(id => !!statuses[id]).map(id => statuses[id]), [ - temp, - statuses, - ]); + const pending_images = useMemo( + () => + temp + .filter(id => !!statuses[id] && statuses[id].type === UPLOAD_TYPES.IMAGE) + .map(id => statuses[id]), + [temp, statuses] + ); const audios = useMemo( () => data.files.filter(file => file && file.type === UPLOAD_TYPES.AUDIO), [data.files] ); + const pending_audios = useMemo( + () => + temp + .filter(id => !!statuses[id] && statuses[id].type === UPLOAD_TYPES.AUDIO) + .map(id => statuses[id]), + [temp, statuses] + ); + const setImages = useCallback(files => setData({ ...data, files: [...files, ...audios] }), [ setData, data, audios, ]); - return <ImageGrid files={images} setFiles={setImages} locked={pending_images} />; + const setAudios = useCallback(files => setData({ ...data, files: [...files, ...images] }), [ + setData, + data, + images, + ]); + + return ( + <div className={styles.wrap}> + <ImageGrid files={images} setFiles={setImages} locked={pending_images} /> + <AudioGrid files={audios} setFiles={setAudios} locked={pending_audios} /> + </div> + ); }; const AudioEditor = connect( diff --git a/src/components/editors/AudioEditor/styles.scss b/src/components/editors/AudioEditor/styles.scss new file mode 100644 index 00000000..4909ae19 --- /dev/null +++ b/src/components/editors/AudioEditor/styles.scss @@ -0,0 +1,4 @@ +.wrap { + padding-bottom: 64px; + min-height: 200px; +} diff --git a/src/components/editors/AudioGrid/index.tsx b/src/components/editors/AudioGrid/index.tsx new file mode 100644 index 00000000..8dd8556d --- /dev/null +++ b/src/components/editors/AudioGrid/index.tsx @@ -0,0 +1,43 @@ +import React, { FC, useCallback } from 'react'; +import { SortEnd } from 'react-sortable-hoc'; +import * as styles from './styles.scss'; +import { IFile } from '~/redux/types'; +import { IUploadStatus } from '~/redux/uploads/reducer'; +import { moveArrItem } from '~/utils/fn'; +import { SortableAudioGrid } from '~/components/editors/SortableAudioGrid'; + +interface IProps { + files: IFile[]; + setFiles: (val: IFile[]) => void; + locked: IUploadStatus[]; +} + +const AudioGrid: FC<IProps> = ({ files, setFiles, locked }) => { + const onMove = useCallback( + ({ oldIndex, newIndex }: SortEnd) => { + setFiles(moveArrItem(oldIndex, newIndex, files.filter(file => !!file)) as IFile[]); + }, + [setFiles, files] + ); + + const onDrop = useCallback( + (remove_id: IFile['id']) => { + setFiles(files.filter(file => file && file.id !== remove_id)); + }, + [setFiles, files] + ); + + return ( + <SortableAudioGrid + onDrop={onDrop} + onSortEnd={onMove} + axis="xy" + items={files} + locked={locked} + pressDelay={window.innerWidth < 768 ? 200 : 0} + helperClass={styles.helper} + /> + ); +}; + +export { AudioGrid }; diff --git a/src/components/editors/AudioGrid/styles.scss b/src/components/editors/AudioGrid/styles.scss new file mode 100644 index 00000000..7ab40804 --- /dev/null +++ b/src/components/editors/AudioGrid/styles.scss @@ -0,0 +1,4 @@ +.helper { + opacity: 0.5; + z-index: 10 !important; +} diff --git a/src/components/editors/SortableAudioGrid/index.tsx b/src/components/editors/SortableAudioGrid/index.tsx new file mode 100644 index 00000000..5aa4c293 --- /dev/null +++ b/src/components/editors/SortableAudioGrid/index.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { SortableContainer } from 'react-sortable-hoc'; +import { AudioUpload } from '~/components/upload/AudioUpload'; +import * as styles from './styles.scss'; +import { SortableImageGridItem } from '~/components/editors/SortableImageGridItem'; +import { IFile } from '~/redux/types'; +import { IUploadStatus } from '~/redux/uploads/reducer'; +import { AudioPlayer } from '~/components/media/AudioPlayer'; + +const SortableAudioGrid = SortableContainer( + ({ + items, + locked, + onDrop, + }: { + items: IFile[]; + locked: IUploadStatus[]; + onDrop: (file_id: IFile['id']) => void; + }) => ( + <div className={styles.grid}> + {items + .filter(file => file && file.id) + .map((file, index) => ( + <SortableImageGridItem key={file.id} index={index} collection={0}> + <AudioPlayer file={file} onDrop={onDrop} /> + </SortableImageGridItem> + ))} + + {locked.map((item, index) => ( + <SortableImageGridItem key={item.temp_id} index={index} collection={1} disabled> + <AudioUpload title={item.name} progress={item.progress} is_uploading /> + </SortableImageGridItem> + ))} + </div> + ) +); + +export { SortableAudioGrid }; diff --git a/src/components/editors/SortableAudioGrid/styles.scss b/src/components/editors/SortableAudioGrid/styles.scss new file mode 100644 index 00000000..7dc895db --- /dev/null +++ b/src/components/editors/SortableAudioGrid/styles.scss @@ -0,0 +1,13 @@ +.grid { + box-sizing: border-box; + + display: grid; + grid-column-gap: $gap; + grid-row-gap: $gap; + grid-template-columns: auto; + grid-template-rows: $comment_height; + + @media (max-width: 600px) { + grid-template-columns: repeat(auto-fill, minmax(30vw, 1fr)); + } +} diff --git a/src/components/editors/SortableAudioGridItem/index.tsx b/src/components/editors/SortableAudioGridItem/index.tsx new file mode 100644 index 00000000..2b7ff3d0 --- /dev/null +++ b/src/components/editors/SortableAudioGridItem/index.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { SortableElement } from 'react-sortable-hoc'; + +import * as styles from './styles.scss'; + +const SortableAudioGridItem = SortableElement(({ children }) => ( + <div className={styles.item}>{children}</div> +)); + +export { SortableAudioGridItem }; diff --git a/src/components/editors/SortableAudioGridItem/styles.scss b/src/components/editors/SortableAudioGridItem/styles.scss new file mode 100644 index 00000000..81fd01cb --- /dev/null +++ b/src/components/editors/SortableAudioGridItem/styles.scss @@ -0,0 +1,4 @@ +.item { + z-index: 1; + box-sizing: border-box; +} diff --git a/src/components/editors/SortableImageGrid/styles.scss b/src/components/editors/SortableImageGrid/styles.scss index c525238b..cbd34386 100644 --- a/src/components/editors/SortableImageGrid/styles.scss +++ b/src/components/editors/SortableImageGrid/styles.scss @@ -1,6 +1,4 @@ .grid { - min-height: 200px; - padding-bottom: 62px; box-sizing: border-box; display: grid; diff --git a/src/components/upload/AudioUpload/index.tsx b/src/components/upload/AudioUpload/index.tsx new file mode 100644 index 00000000..fd150593 --- /dev/null +++ b/src/components/upload/AudioUpload/index.tsx @@ -0,0 +1,43 @@ +import React, { FC, useCallback } from 'react'; +import classNames from 'classnames'; +import * as styles from './styles.scss'; +import { ArcProgress } from '~/components/input/ArcProgress'; +import { IFile } from '~/redux/types'; +import { Icon } from '~/components/input/Icon'; + +interface IProps { + id?: IFile['id']; + title?: string; + progress?: number; + onDrop?: (file_id: IFile['id']) => void; + + is_uploading?: boolean; +} + +const AudioUpload: FC<IProps> = ({ title, progress, is_uploading, id, onDrop }) => { + const onDropFile = useCallback(() => { + if (!id || !onDrop) return; + onDrop(id); + }, [id, onDrop]); + + return ( + <div className={styles.wrap}> + {id && onDrop && ( + <div className={styles.drop} onMouseDown={onDropFile}> + <Icon icon="close" /> + </div> + )} + + <div className={classNames(styles.thumb_wrap, { is_uploading })}> + {is_uploading && ( + <div className={styles.progress}> + <ArcProgress size={40} progress={progress} /> + </div> + )} + {title && <div className={styles.title}>{title}</div>} + </div> + </div> + ); +}; + +export { AudioUpload }; diff --git a/src/components/upload/AudioUpload/styles.scss b/src/components/upload/AudioUpload/styles.scss new file mode 100644 index 00000000..17882875 --- /dev/null +++ b/src/components/upload/AudioUpload/styles.scss @@ -0,0 +1,75 @@ +.wrap { + background: lighten($content_bg, 4%); + // padding-bottom: 100%; + border-radius: $radius; + position: relative; + user-select: none; + height: $comment_height; +} + +.thumb_wrap { + // position: absolute; + // width: 100%; + // height: 100%; + z-index: 1; + border-radius: $radius; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + flex-direction: row; + height: 100%; +} + +.title { + flex: 1; + border-radius: $radius; + display: flex; + align-items: center; + padding: 10px; + box-sizing: border-box; +} + +.progress { + flex: 0 0 $comment_height; + display: flex; + align-items: center; + justify-content: center; + + svg { + width: 40px; + height: 40px; + fill: none; + fill: white; + } +} + +.helper { + opacity: 0.3; +} + +.drop { + width: 24px; + height: 24px; + background: #222222; + position: absolute; + right: $gap; + top: $gap; + border-radius: 12px; + z-index: 2; + transition: background-color 250ms, opacity 0.25s; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + + svg { + width: 20px; + height: 20px; + } + + &:hover { + opacity: 1; + background-color: $red; + } +} diff --git a/src/constants/errors.ts b/src/constants/errors.ts index 70a8ee47..92aea57b 100644 --- a/src/constants/errors.ts +++ b/src/constants/errors.ts @@ -7,6 +7,7 @@ export const ERRORS = { TEXT_REQUIRED: 'Text_Required', UNKNOWN_NODE_TYPE: 'Unknown_Node_Type', URL_INVALID: 'Url_Invalid', + FILES_AUDIO_REQUIRED: 'Files_Audio_Required', }; export const ERROR_LITERAL = { @@ -18,4 +19,5 @@ export const ERROR_LITERAL = { [ERRORS.TEXT_REQUIRED]: 'Нужно немного текста', [ERRORS.UNKNOWN_NODE_TYPE]: 'Неизвестный тип поста', [ERRORS.URL_INVALID]: 'Неизвестный адрес', + [ERRORS.FILES_AUDIO_REQUIRED]: 'Нужна хотя бы одна песня', }; diff --git a/src/redux/uploads/constants.ts b/src/redux/uploads/constants.ts index 74a1528b..21a03c8a 100644 --- a/src/redux/uploads/constants.ts +++ b/src/redux/uploads/constants.ts @@ -38,6 +38,7 @@ export const EMPTY_UPLOAD_STATUS: IUploadStatus = { thumbnail_url: null, type: null, temp_id: null, + name: null, }; // for targeted cancellation diff --git a/src/redux/uploads/reducer.ts b/src/redux/uploads/reducer.ts index 98915b38..38a5d310 100644 --- a/src/redux/uploads/reducer.ts +++ b/src/redux/uploads/reducer.ts @@ -12,6 +12,7 @@ export interface IUploadStatus { thumbnail_url: string; progress: number; temp_id: UUID; + name: string; } export interface IUploadState { diff --git a/src/redux/uploads/sagas.ts b/src/redux/uploads/sagas.ts index 357852e8..94868079 100644 --- a/src/redux/uploads/sagas.ts +++ b/src/redux/uploads/sagas.ts @@ -78,8 +78,10 @@ function* uploadFile({ file, temp_id, type, target }: IFileWithUUID) { { preview, is_uploading: true, - type: file.type, + // type: file.type, temp_id, + type, + name: file.name, } ) ); @@ -106,7 +108,7 @@ function* uploadFile({ file, temp_id, type, target }: IFileWithUUID) { if (error) { return yield put( - uploadSetStatus(temp_id, { is_uploading: false, error: data.detail || error }) + uploadSetStatus(temp_id, { is_uploading: false, error: data.detail || error, type }) ); } @@ -116,8 +118,10 @@ function* uploadFile({ file, temp_id, type, target }: IFileWithUUID) { error: null, uuid: data.id, url: data.full_path, + type, thumbnail_url: data.full_path, progress: 1, + name: file.name, }) ); From 88333e36b7ce3076dd94584fe1f84db85657fcbc Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 17:58:51 +0700 Subject: [PATCH 44/99] adding audio post and view it --- src/components/node/NodeAudioBlock/index.tsx | 26 +++++++++++++++++++ .../node/NodeAudioBlock/styles.scss | 17 ++++++++++++ src/redux/node/constants.ts | 2 ++ 3 files changed, 45 insertions(+) create mode 100644 src/components/node/NodeAudioBlock/index.tsx create mode 100644 src/components/node/NodeAudioBlock/styles.scss diff --git a/src/components/node/NodeAudioBlock/index.tsx b/src/components/node/NodeAudioBlock/index.tsx new file mode 100644 index 00000000..7a4bde45 --- /dev/null +++ b/src/components/node/NodeAudioBlock/index.tsx @@ -0,0 +1,26 @@ +import React, { FC, useMemo } from 'react'; +import { INode } from '~/redux/types'; +import { UPLOAD_TYPES } from '~/redux/uploads/constants'; +import { AudioPlayer } from '~/components/media/AudioPlayer'; +import * as styles from './styles.scss'; + +interface IProps { + node: INode; +} + +const NodeAudioBlock: FC<IProps> = ({ node }) => { + const audios = useMemo( + () => node.files.filter(file => file && file.type === UPLOAD_TYPES.AUDIO), + [node.files] + ); + + return ( + <div className={styles.wrap}> + {audios.map(file => ( + <AudioPlayer key={file.id} file={file} /> + ))} + </div> + ); +}; + +export { NodeAudioBlock }; diff --git a/src/components/node/NodeAudioBlock/styles.scss b/src/components/node/NodeAudioBlock/styles.scss new file mode 100644 index 00000000..5df8c201 --- /dev/null +++ b/src/components/node/NodeAudioBlock/styles.scss @@ -0,0 +1,17 @@ +.wrap { + background: $content_bg; + border-radius: $radius; + + & > div { + @include outer_shadow(); + + &:first-child { + border-top-left-radius: $radius; + border-top-right-radius: $radius; + } + &:last-child { + border-bottom-left-radius: $radius; + border-bottom-right-radius: $radius; + } + } +} diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index b3b8b56d..6c9f5655 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -2,6 +2,7 @@ import { FC } from 'react'; import { INode, ValueOf, IComment } from '../types'; import { NodeImageSlideBlock } from '~/components/node/NodeImageSlideBlock'; import { NodeTextBlock } from '~/components/node/NodeTextBlock'; +import { NodeAudioBlock } from '~/components/node/NodeAudioBlock'; import { NodeVideoBlock } from '~/components/node/NodeVideoBlock'; import { ImageEditor } from '~/components/editors/ImageEditor'; import { TextEditor } from '~/components/editors/TextEditor'; @@ -74,6 +75,7 @@ export const NODE_COMPONENTS: INodeComponents = { export const NODE_INLINES: INodeComponents = { [NODE_TYPES.TEXT]: NodeTextBlock, + [NODE_TYPES.AUDIO]: NodeAudioBlock, }; export const EMPTY_COMMENT: IComment = { From d22c1f64d097a3bfcd2b45004884ec63b7bb109f Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 19:42:11 +0700 Subject: [PATCH 45/99] fixed textures --- src/components/bars/PlayerBar/styles.scss | 2 +- src/components/node/NodePanelInner/styles.scss | 2 +- src/sprites/noise.png | Bin 0 -> 180542 bytes src/sprites/noise_top.png | Bin 0 -> 171602 bytes src/styles/colors.scss | 9 ++++++--- src/styles/global.scss | 9 ++++++--- 6 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 src/sprites/noise.png create mode 100644 src/sprites/noise_top.png diff --git a/src/components/bars/PlayerBar/styles.scss b/src/components/bars/PlayerBar/styles.scss index 937b2b83..389cbc42 100644 --- a/src/components/bars/PlayerBar/styles.scss +++ b/src/components/bars/PlayerBar/styles.scss @@ -8,7 +8,7 @@ .wrap { display: flex; border-radius: $radius $radius 0 0; - background: $green_gradient; + background: $main_gradient; align-items: center; box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px, inset rgba(255, 255, 255, 0.3) 1px 1px, inset rgba(0, 0, 0, 0.3) 0 -1px; diff --git a/src/components/node/NodePanelInner/styles.scss b/src/components/node/NodePanelInner/styles.scss index 830ee740..054e0829 100644 --- a/src/components/node/NodePanelInner/styles.scss +++ b/src/components/node/NodePanelInner/styles.scss @@ -94,7 +94,7 @@ right: 4px; width: 24px; height: 52px; - background: $green_gradient; + background: $main_gradient; box-shadow: transparentize(black, 0.8) 4px 2px; border-radius: 2px; } diff --git a/src/sprites/noise.png b/src/sprites/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..b854243521987f05ebe5d033e8ce9c7442106967 GIT binary patch literal 180542 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Ⓢmo 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 GLSTZZU-29O literal 0 HcmV?d00001 diff --git a/src/sprites/noise_top.png b/src/sprites/noise_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d620eede7707144d0fd7e6629913d83f5ebc0ecc GIT binary patch literal 171602 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	)w8-VfMR?*gKKUXcBQQ@5z)>~ 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 KMNUMnLSTZxJw-$S literal 0 HcmV?d00001 diff --git a/src/styles/colors.scss b/src/styles/colors.scss index be1dfce9..99ba2c95 100644 --- a/src/styles/colors.scss +++ b/src/styles/colors.scss @@ -15,10 +15,13 @@ $green_gradient: linear-gradient(170deg, adjust_hue($wisegreen, 15deg) 0%, $wise $purple_gradient: linear-gradient(170deg, $red, $dark_blue); $cyan_gradient: linear-gradient(260deg, #3c75ff -50%, #7b2653 150%); -$main_bg_color: #2c2b2b; +$main_gradient: $green_gradient; + +// $main_bg_color: darken(#2c2b2b, 4%); +$main_bg_color: darken(#2c2d2d, 6%); $main_text_color: white; -$content_bg: darken($main_bg_color, 6%); +$content_bg: darken($main_bg_color, 0%); $content_bg_secondary: darken($content_bg, 2%); $cell_bg: lighten($main_bg_color, 0%); @@ -34,7 +37,7 @@ $button_bg_color: $red_gradient; $comment_bg: lighten($content_bg, 2%); $panel_bg: transparent; -$node_bg: darken($content_bg, 4%); +$node_bg: darken($content_bg, 2%); $node_image_bg: darken($main_bg_color, 7%); $node_title_background: darken($main_bg_color, 8%); diff --git a/src/styles/global.scss b/src/styles/global.scss index 76ede1f3..9733167f 100644 --- a/src/styles/global.scss +++ b/src/styles/global.scss @@ -7,7 +7,8 @@ html { body { background: darken($main_bg_color, 12%); min-height: 100vh; - background: url('http://vault48.org/pixmaps/texture.jpg'); + // background: url('http://vault48.org/pixmaps/texture.jpg'); + background: url('../../src/sprites/noise.png') $main_bg_color; color: $main_text_color; font: $font_16_regular; -webkit-font-smoothing: antialiased; @@ -18,12 +19,14 @@ body { &::before { content: ''; position: absolute; - height: 400px; + height: 600px; width: 100%; top: 0; left: 0; z-index: -1; - background: url('http://vault48.org/pixmaps/texture_alt.jpg'); + // background: url('http://vault48.org/pixmaps/texture_alt.jpg'); + background: url('../../src/sprites/noise_top.png') 0% 0%; + background-size: 600px 600px; pointer-events: none; } } From 4971c85132c25a124b9f5e9de4f0c87a140b5032 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 20:01:59 +0700 Subject: [PATCH 46/99] fixed gradients --- src/components/media/AudioPlayer/styles.scss | 3 ++- src/styles/colors.scss | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/media/AudioPlayer/styles.scss b/src/components/media/AudioPlayer/styles.scss index f4cd63bf..5603da44 100644 --- a/src/components/media/AudioPlayer/styles.scss +++ b/src/components/media/AudioPlayer/styles.scss @@ -98,7 +98,8 @@ } .bar { - background: linear-gradient(270deg, $green, $wisegreen); + // background: linear-gradient(270deg, $green, $wisegreen); + background: $main_gradient; position: absolute; height: 10px; left: 0; diff --git a/src/styles/colors.scss b/src/styles/colors.scss index 99ba2c95..abe26770 100644 --- a/src/styles/colors.scss +++ b/src/styles/colors.scss @@ -11,10 +11,17 @@ $wisegreen: #007962; $red_gradient: linear-gradient(165deg, $orange -50%, $red 150%); $blue_gradient: linear-gradient(170deg, $green, $dark_blue); -$green_gradient: linear-gradient(170deg, adjust_hue($wisegreen, 15deg) 0%, $wisegreen 100%); +$green_gradient: linear-gradient( + 170deg, + lighten(adjust_hue($wisegreen, 15deg), 10%) 0%, + $wisegreen 100% +); $purple_gradient: linear-gradient(170deg, $red, $dark_blue); $cyan_gradient: linear-gradient(260deg, #3c75ff -50%, #7b2653 150%); +$red_gradient_alt: linear-gradient(270deg, #d2004c, #ff4545); +$purple_gradient_alt: linear-gradient(90deg, #442294, #ff4545); + $main_gradient: $green_gradient; // $main_bg_color: darken(#2c2b2b, 4%); From 8daa08d61bab0a61d424c713f92a85ddc2b8a4f2 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 20:03:47 +0700 Subject: [PATCH 47/99] comment appearance animation --- src/components/node/Comment/styles.scss | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/node/Comment/styles.scss b/src/components/node/Comment/styles.scss index 1afb844d..c56bbe59 100644 --- a/src/components/node/Comment/styles.scss +++ b/src/components/node/Comment/styles.scss @@ -1,2 +1,11 @@ -.wrap { +@keyframes appear { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +.wrap { + animation: appear 1s; } From f40aad7b7ac932091a79423b82cf399a5d4ec660 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 20:16:34 +0700 Subject: [PATCH 48/99] bigger tags --- src/components/node/Tag/styles.scss | 12 +++++++----- src/styles/colors.scss | 5 +++-- src/styles/variables.scss | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/components/node/Tag/styles.scss b/src/components/node/Tag/styles.scss index 34f20e30..238aff8c 100644 --- a/src/components/node/Tag/styles.scss +++ b/src/components/node/Tag/styles.scss @@ -1,4 +1,6 @@ .tag { + @include outer_shadow(); + height: $tag_height; background: $tag_bg; display: flex; @@ -9,8 +11,8 @@ font: $font_14_semibold; align-self: flex-start; padding: 0 8px 0 0; - box-shadow: $shadow_depth_2; - margin: ($gap / 2) $gap ($gap / 2) 0; + // box-shadow: $shadow_depth_2; + margin: 0 $gap $gap 0; position: relative; &:global(.is_hoverable) { @@ -64,7 +66,7 @@ top: 0; bottom: 0; width: 100%; - padding-left: 23px; + padding-left: $tag_height; padding-right: 5px; box-sizing: border-box; } @@ -74,10 +76,10 @@ width: $tag_height; height: $tag_height; display: flex; - margin-right: 3px; + // padding-right: 0px; align-items: center; justify-content: center; - flex: 0 0 22px; + flex: 0 0 $tag_height; &::after { content: ' '; diff --git a/src/styles/colors.scss b/src/styles/colors.scss index abe26770..bffd8115 100644 --- a/src/styles/colors.scss +++ b/src/styles/colors.scss @@ -1,4 +1,5 @@ -$red: #ff3344; +// $red: #ff3344; +$red: #da6972; $yellow: #ffd60f; $dark_blue: #3c75ff; $blue: #3ca1ff; @@ -9,7 +10,7 @@ $orange: #ff7549; $grass: #41800d; $wisegreen: #007962; -$red_gradient: linear-gradient(165deg, $orange -50%, $red 150%); +$red_gradient: linear-gradient(165deg, $red, #ea057c 100%); $blue_gradient: linear-gradient(170deg, $green, $dark_blue); $green_gradient: linear-gradient( 170deg, diff --git a/src/styles/variables.scss b/src/styles/variables.scss index e05cd282..3803c192 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -61,7 +61,7 @@ $shadow_depth_2: transparentize(black, 0.8) 0 2px, inset transparentize(white, 0 $comment_shadow: $shadow_depth_2; $node_shadow: transparentize(black, 0.8) 0 2px, transparentize(black, 0.8) 0 2px 4px; -$tag_height: 22px; +$tag_height: 26px; $input_shadow: inset transparentize(white, 0.9) 0 0 0 1px; $input_shadow_error: inset $red 0 0 0 1px; From e5c50890674064754fdad5d71cfe47b3cf36797a Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 20:32:24 +0700 Subject: [PATCH 49/99] fixed grey button color --- src/components/input/Button/styles.scss | 1 + src/components/node/CommentContent/styles.scss | 3 ++- src/components/node/NodePanelInner/styles.scss | 1 + src/styles/colors.scss | 2 +- src/styles/variables.scss | 2 +- 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/input/Button/styles.scss b/src/components/input/Button/styles.scss index 19eaeb6a..91a0af24 100644 --- a/src/components/input/Button/styles.scss +++ b/src/components/input/Button/styles.scss @@ -108,6 +108,7 @@ &:global(.disabled), &:global(.grey) { background: transparentize(white, 0.9); + color: white; // background: lighten(white, 0.5); // filter: grayscale(100%); } diff --git a/src/components/node/CommentContent/styles.scss b/src/components/node/CommentContent/styles.scss index a2462771..3b5141cc 100644 --- a/src/components/node/CommentContent/styles.scss +++ b/src/components/node/CommentContent/styles.scss @@ -1,8 +1,9 @@ @import 'flexbin/flexbin.scss'; .block { + @include outer_shadow(); min-height: $comment_height; - box-shadow: inset rgba(255, 255, 255, 0.05) 1px 1px, inset rgba(0, 0, 0, 0.1) -1px -1px; + // box-shadow: inset rgba(255, 255, 255, 0.05) 1px 1px, inset rgba(0, 0, 0, 0.1) -1px -1px; display: flex; align-items: flex-start; justify-content: flex-start; diff --git a/src/components/node/NodePanelInner/styles.scss b/src/components/node/NodePanelInner/styles.scss index 054e0829..cdbbcfd0 100644 --- a/src/components/node/NodePanelInner/styles.scss +++ b/src/components/node/NodePanelInner/styles.scss @@ -27,6 +27,7 @@ padding: $gap; background: $node_bg; height: 72px; + @include outer_shadow(); } .title { diff --git a/src/styles/colors.scss b/src/styles/colors.scss index bffd8115..9c79d31a 100644 --- a/src/styles/colors.scss +++ b/src/styles/colors.scss @@ -26,7 +26,7 @@ $purple_gradient_alt: linear-gradient(90deg, #442294, #ff4545); $main_gradient: $green_gradient; // $main_bg_color: darken(#2c2b2b, 4%); -$main_bg_color: darken(#2c2d2d, 6%); +$main_bg_color: darken(#332f2d, 6%); $main_text_color: white; $content_bg: darken($main_bg_color, 0%); diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 3803c192..66e8f78a 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -68,7 +68,7 @@ $input_shadow_error: inset $red 0 0 0 1px; $input_shadow_filled: $input_shadow; @mixin outer_shadow() { - box-shadow: inset transparentize(white, 0.95) 1px 1px, transparentize(black, 0.8) -1px -1px; + box-shadow: inset transparentize(white, 0.95) 0 1px, transparentize(black, 0.8) -1px -1px; } @mixin inner_shadow() { From 42139b0dde5b7682c424a2f391bb85ac37cce02a Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 21:17:05 +0700 Subject: [PATCH 50/99] cells shadow --- src/components/flow/Cell/styles.scss | 2 + .../node/NodeImageSlideBlock/styles.scss | 1 + src/sprites/favicon.ico | Bin 0 -> 719 bytes src/styles/colors.scss | 2 +- webpack.config.js | 56 ++++++++---------- 5 files changed, 30 insertions(+), 31 deletions(-) create mode 100644 src/sprites/favicon.ico diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index b57eef2b..d225b1b5 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -111,6 +111,8 @@ } .face { + @include outer_shadow(); + box-sizing: border-box; position: absolute; top: 0; diff --git a/src/components/node/NodeImageSlideBlock/styles.scss b/src/components/node/NodeImageSlideBlock/styles.scss index 2feef7be..4824443b 100644 --- a/src/components/node/NodeImageSlideBlock/styles.scss +++ b/src/components/node/NodeImageSlideBlock/styles.scss @@ -4,6 +4,7 @@ min-width: 0; width: 100%; transition: height 0.25s; + border-radius: $radius $radius 0 0; } .image_container { diff --git a/src/sprites/favicon.ico b/src/sprites/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3059b281001a27cba9392e4a77037fcfe57bfd99 GIT binary patch literal 719 zcmV;=0x<oFP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS00009a7bBm000fw000fw0YWI7cmMzZ8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10!&FnK~y-6m6I`R+fWpRKZ^%O8ibw|NSwiA1}%bEWXxs{p|inR zGi9+`LJH{*D8>-l=0~J|pp?Xc5Q4$W^Pok94j!^N9-=%n*n^E<huX$zA<zRC?r`qm z-ov>$V+`vk6bd`QAy8fvKz~t}X`238=jWCJg+d_*G=a~SW!bLlBBf+J9y1z^mi!6u z3HX+#saXjuhJOGD#bS{tikQu27-M*Rd?ZN{_V@R(ZJX=sYk;4?yEILWwNP#X2Vocz zh9SLPkE^RIj4@c&AIj6y6Gul!oSvQn94ux)O1UGY90x&Q>h-$W*w`?&TFoe>%>Dhn z+1uMQQc5GGG~3(T=I-v!)M_;&r5sBscLZ=~S(Y6|5xriIYPHJo@iEP2lO#!A89bRx zI6FJTaU1{}s0*O%x-PTX46QYdMuU@+6P}-+saC51#Bsbb^5NlOT{E(Pvgdhdt=Zbz zVmh6YBne>{k|fEh2dGpk?C$Oo1Oc0yn*e2NT`r%`^LH-R(P%VqU6)d+v^)a~=xeR< zJdeR(fa5p>K|mbG1VQks7edhOcFE;(yu7>s^ev#DWf?*UeBY<tZqsVD@O__7r$eXH z!S{Vytriy-7kHkB5P~er0F(eO=kxhTrIZ~-5jQtC2q8E>KW93fVvNCY9NO(Rx3{-c zDixGc%;)n7@O_!Y_rRAh3@H|iD5X}W=JR<5g8{zp6Gaij;gC3v0Y0Q@`t{8yYpnrR zYb&J~4u`Lz{N^)xo(F)|nk>tfYybO9>-gVy{tef=Avq%?htvQ7002ovPDHLkV1lb- BID`NI literal 0 HcmV?d00001 diff --git a/src/styles/colors.scss b/src/styles/colors.scss index 9c79d31a..6fc6b561 100644 --- a/src/styles/colors.scss +++ b/src/styles/colors.scss @@ -46,7 +46,7 @@ $button_bg_color: $red_gradient; $comment_bg: lighten($content_bg, 2%); $panel_bg: transparent; $node_bg: darken($content_bg, 2%); -$node_image_bg: darken($main_bg_color, 7%); +$node_image_bg: darken($main_bg_color, 4%); $node_title_background: darken($main_bg_color, 8%); $editor_bg: $content_bg; diff --git a/webpack.config.js b/webpack.config.js index 5c184b40..2dc6a614 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -11,7 +11,7 @@ const htmlPlugin = new HtmlWebPackPlugin({ filename: './index.html', title: 'VAULT', hash: false, - // favicon: 'src/sprites/favicon.png', + favicon: 'src/sprites/favicon.ico', }); const isDevelopment = process.env.NODE_ENV !== 'production'; @@ -22,7 +22,7 @@ const resolve = { 'react-dom': '@hot-loader/react-dom', '~': join(__dirname, 'src'), }, - extensions: ['*', '.ts', '.tsx', '.js', '.jsx', '.json', '.scss'] + extensions: ['*', '.ts', '.tsx', '.js', '.jsx', '.json', '.scss'], }; /* Configuration */ @@ -45,10 +45,7 @@ module.exports = () => { rules: [ { test: /\.css$/, - use: [ - { loader: 'style-loader' }, - { loader: 'css-loader' } - ], + use: [{ loader: 'style-loader' }, { loader: 'css-loader' }], }, { test: /\.less$/, @@ -62,11 +59,11 @@ module.exports = () => { modules: true, sourceMap: true, importLoaders: 2, - localIdentName: '[folder]__[local]__[hash:base64:5]' - } + localIdentName: '[folder]__[local]__[hash:base64:5]', + }, }, - { loader: 'less-loader' } - ] + { loader: 'less-loader' }, + ], }, { test: /\.scss$/, @@ -79,16 +76,16 @@ module.exports = () => { modules: true, sourceMap: true, importLoaders: 2, - localIdentName: '[folder]__[local]__[hash:base64:5]' - } + localIdentName: '[folder]__[local]__[hash:base64:5]', + }, }, { loader: 'resolve-url-loader' }, { loader: 'sass-loader', options: { sourceMap: true, - sourceMapContents: false - } + sourceMapContents: false, + }, }, { loader: 'sass-resources-loader', @@ -96,14 +93,14 @@ module.exports = () => { resources: ['src/styles/variables.scss'], }, }, - ] + ], }, { test: /\.(ts|tsx|js|jsx)$/, exclude: /node_modules/, use: { - loader: 'babel-loader' - } + loader: 'babel-loader', + }, }, { test: /\.(ts|tsx)?$/, loader: 'awesome-typescript-loader' }, { @@ -113,17 +110,17 @@ module.exports = () => { options: { name: '[name].[ext]', // outputPath: '/font' - } - } + }, + }, }, { test: /\.(png|svg)$/, use: { loader: 'file-loader', - options: {} - } - } - ] + options: {}, + }, + }, + ], }, devtool, resolve, @@ -151,18 +148,18 @@ module.exports = () => { minChunks: 2, minSize: 0, reuseExistingChunk: true, - } - } + }, + }, }, minimizer: [ new UglifyJsPlugin({ cache: true, parallel: true, - sourceMap: true // set to true if you want JS source maps + sourceMap: true, // set to true if you want JS source maps }), - new OptimizeCSSAssetsPlugin({}) + new OptimizeCSSAssetsPlugin({}), ], - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + occurrenceOrder: true, // To keep filename consistent between different modes (for example building only) }, devServer: { historyApiFallback: true, @@ -171,7 +168,6 @@ module.exports = () => { contentBase: 'dist', publicPath: '/', hot: true, - } + }, }; }; - From e35371e3aa46802b451439d14cfc4e3ad3e80552 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 21:28:35 +0700 Subject: [PATCH 51/99] fixed player colors --- src/components/bars/PlayerBar/styles.scss | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/components/bars/PlayerBar/styles.scss b/src/components/bars/PlayerBar/styles.scss index 389cbc42..fb1af0ef 100644 --- a/src/components/bars/PlayerBar/styles.scss +++ b/src/components/bars/PlayerBar/styles.scss @@ -6,12 +6,14 @@ } .wrap { + @include outer_shadow(); display: flex; border-radius: $radius $radius 0 0; - background: $main_gradient; + // background: $main_gradient; align-items: center; - box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px, inset rgba(255, 255, 255, 0.3) 1px 1px, - inset rgba(0, 0, 0, 0.3) 0 -1px; + background: lighten($content_bg, 6%); + // box-shadow: rgba(0, 0, 0, 0.5) 0 2px 5px, inset rgba(255, 255, 255, 0.3) 1px 1px, + // inset rgba(0, 0, 0, 0.3) 0 -1px; position: absolute; top: 0; left: 0; @@ -44,7 +46,7 @@ svg { width: 32px; height: 32px; - fill: $content_bg; + fill: darken(white, 50%); stroke: none; } } @@ -67,7 +69,7 @@ } .title { - color: #222222; + color: darken(white, 50%); font: $font_14_semibold; white-space: nowrap; overflow: hidden; @@ -87,7 +89,7 @@ left: 0; width: 100%; height: 2px; - background: #222222; + background: darken(white, 50%); position: absolute; border-radius: 2px; opacity: 0.5; @@ -99,7 +101,7 @@ left: 0; width: 100%; height: 6px; - background: #222222; + background: darken(white, 50%); position: absolute; border-radius: 2px; } From 353cadb09f4bb5d8eb1a52331ecb489b60f75176 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Mon, 21 Oct 2019 21:37:55 +0700 Subject: [PATCH 52/99] cell menu --- src/components/flow/Cell/index.tsx | 2 ++ src/components/flow/Cell/styles.scss | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index 49941986..28bc34b9 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -28,6 +28,8 @@ const Cell: FC<IProps> = ({ node: { id, title, thumbnail, type, blocks }, onSele className={classNames(styles.cell, 'vert-1', 'hor-1', { is_text: false })} onClick={onClick} > + <div className={styles.menu}>MENU</div> + <div className={styles.face}> {title && <div className={styles.title}>{title}</div>} {text && <div className={styles.text}>{text}</div>} diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index d225b1b5..547fb927 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -22,6 +22,14 @@ } } + &:hover { + .menu { + opacity: 1; + pointer-events: all; + touch-action: auto; + } + } + @include outer_shadow(); } @@ -124,3 +132,18 @@ border-radius: $cell_radius; padding: $gap; } + +.menu { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 60px; + background: $content_bg; + z-index: 4; + border-radius: $radius; + opacity: 0; + pointer-events: none; + touch-action: none; + transition: opacity 0.5s; +} From 4fd5142e8b6e602233f5756581787c4051073fc8 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 11:16:17 +0700 Subject: [PATCH 53/99] audio image block --- src/components/flow/Cell/styles.scss | 1 + .../node/NodeAudioImageBlock/index.tsx | 28 ++++++++++++++++ .../node/NodeAudioImageBlock/styles.scss | 32 +++++++++++++++++++ src/redux/node/constants.ts | 2 ++ 4 files changed, 63 insertions(+) create mode 100644 src/components/node/NodeAudioImageBlock/index.tsx create mode 100644 src/components/node/NodeAudioImageBlock/styles.scss diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 547fb927..f9b20df7 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -146,4 +146,5 @@ pointer-events: none; touch-action: none; transition: opacity 0.5s; + display: none; } diff --git a/src/components/node/NodeAudioImageBlock/index.tsx b/src/components/node/NodeAudioImageBlock/index.tsx new file mode 100644 index 00000000..c3883c4e --- /dev/null +++ b/src/components/node/NodeAudioImageBlock/index.tsx @@ -0,0 +1,28 @@ +import React, { FC, useMemo } from 'react'; +import { INode } from '~/redux/types'; +import * as styles from './styles.scss'; +import { UPLOAD_TYPES } from '~/redux/uploads/constants'; +import path from 'ramda/es/path'; +import { getURL } from '~/utils/dom'; + +interface IProps { + node: INode; +} + +const NodeAudioImageBlock: FC<IProps> = ({ node }) => { + const images = useMemo( + () => node.files.filter(file => file && file.type === UPLOAD_TYPES.IMAGE), + [node.files] + ); + + return ( + <div className={styles.wrap}> + <div + className={styles.slide} + style={{ backgroundImage: `url("${getURL(path([0], images))}")` }} + /> + </div> + ); +}; + +export { NodeAudioImageBlock }; diff --git a/src/components/node/NodeAudioImageBlock/styles.scss b/src/components/node/NodeAudioImageBlock/styles.scss new file mode 100644 index 00000000..035a0634 --- /dev/null +++ b/src/components/node/NodeAudioImageBlock/styles.scss @@ -0,0 +1,32 @@ +.wrap { + @include outer_shadow(); + padding-bottom: 33vh; + position: relative; + border-radius: $radius $radius 0 0; + + &::after { + border-radius: $radius $radius 0 0; + content: ' ADD PATTERN HERE '; + z-index: 3; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + } +} + +.slide { + @include outer_shadow(); + + border-radius: $radius $radius 0 0; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background: no-repeat 50% 30%; + background-size: cover; + z-index: 1; +} diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 6c9f5655..6aee481c 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -4,6 +4,7 @@ import { NodeImageSlideBlock } from '~/components/node/NodeImageSlideBlock'; import { NodeTextBlock } from '~/components/node/NodeTextBlock'; import { NodeAudioBlock } from '~/components/node/NodeAudioBlock'; import { NodeVideoBlock } from '~/components/node/NodeVideoBlock'; +import { NodeAudioImageBlock } from '~/components/node/NodeAudioImageBlock'; import { ImageEditor } from '~/components/editors/ImageEditor'; import { TextEditor } from '~/components/editors/TextEditor'; import { VideoEditor } from '~/components/editors/VideoEditor'; @@ -71,6 +72,7 @@ type INodeComponents = Record< export const NODE_COMPONENTS: INodeComponents = { [NODE_TYPES.IMAGE]: NodeImageSlideBlock, [NODE_TYPES.VIDEO]: NodeVideoBlock, + [NODE_TYPES.AUDIO]: NodeAudioImageBlock, }; export const NODE_INLINES: INodeComponents = { From 5d257fa2d4c495ea483b4e6857f875b7a2720eff Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 11:21:53 +0700 Subject: [PATCH 54/99] audio post dots --- .../node/NodeAudioImageBlock/styles.scss | 4 +- src/sprites/dots.svg | 81 ++----------------- 2 files changed, 8 insertions(+), 77 deletions(-) diff --git a/src/components/node/NodeAudioImageBlock/styles.scss b/src/components/node/NodeAudioImageBlock/styles.scss index 035a0634..8d235c9e 100644 --- a/src/components/node/NodeAudioImageBlock/styles.scss +++ b/src/components/node/NodeAudioImageBlock/styles.scss @@ -6,14 +6,14 @@ &::after { border-radius: $radius $radius 0 0; - content: ' ADD PATTERN HERE '; + content: ' '; z-index: 3; position: absolute; top: 0; left: 0; width: 100%; height: 100%; - background: rgba(0, 0, 0, 0.5); + background: rgba(0, 0, 0, 0.5) url('~/sprites/dots.svg'); } } diff --git a/src/sprites/dots.svg b/src/sprites/dots.svg index 94a266e4..8a77a7a1 100644 --- a/src/sprites/dots.svg +++ b/src/sprites/dots.svg @@ -1,6 +1,3 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" @@ -9,76 +6,10 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="30" - height="30" - viewBox="0 0 7.9374998 7.9375004" + width="3" + height="3" + viewBox="0 0 3 3" version="1.1" - id="svg8" - inkscape:version="0.92.2 5c3e80d, 2017-08-06" - sodipodi:docname="dots.svg"> - <defs - id="defs2" /> - <sodipodi:namedview - id="base" - pagecolor="#111111" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:zoom="19.909475" - inkscape:cx="16.741834" - inkscape:cy="10.63598" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:showpageshadow="false" - units="px" - inkscape:window-width="1920" - inkscape:window-height="1036" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1"> - <inkscape:grid - type="xygrid" - id="grid815" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(0,-289.06249)"> - <rect - style="opacity:0.051;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.52916664;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect5700" - width="0.52916664" - height="0.52916664" - x="0" - y="296.47083" /> - <rect - y="296.47083" - x="7.9375" - height="0.52916664" - width="0.52916664" - id="rect5733" - style="opacity:0.051;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.52916664;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> - <rect - style="opacity:0.102;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.52916664;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect5735" - width="0.52916664" - height="0.52916664" - x="3.7041667" - y="292.50208" /> - </g> -</svg> +> + <rect fill="black" width="1" height="2" x="0" y="0" /> +</svg> \ No newline at end of file From f4c337b2558c9b0c838ee664db77551cd7f95b39 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 11:53:53 +0700 Subject: [PATCH 55/99] =?UTF-8?q?=D1=81=D0=B4=D1=83=D1=84=D1=82=D0=B3?= =?UTF-8?q?=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/bars/SubmitBar/styles.scss | 2 +- src/components/node/NodeComments/styles.scss | 21 +++++--------------- src/styles/colors.scss | 2 +- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/components/bars/SubmitBar/styles.scss b/src/components/bars/SubmitBar/styles.scss index 83b9ce01..9d6cd3dd 100644 --- a/src/components/bars/SubmitBar/styles.scss +++ b/src/components/bars/SubmitBar/styles.scss @@ -16,7 +16,7 @@ } .button { - background: $red_gradient; + background: $red; width: $bar_height; height: $bar_height; border-radius: $bar_height / 2; diff --git a/src/components/node/NodeComments/styles.scss b/src/components/node/NodeComments/styles.scss index 2aa67d98..401c1465 100644 --- a/src/components/node/NodeComments/styles.scss +++ b/src/components/node/NodeComments/styles.scss @@ -1,20 +1,9 @@ .wrap { & > div { - margin: $gap 0 0 0; + margin: 0 0 $gap 0; + + &:last-child { + margin: 0; + } } - - // display: flex; - // flex-direction: column !important; - - // & > div { - // margin: ($gap / 2) 0; - - // &:last-child { - // margin-top: 0; - // } - - // &:first-child { - // margin-bottom: 0; - // } - // } } diff --git a/src/styles/colors.scss b/src/styles/colors.scss index 6fc6b561..588e0d1a 100644 --- a/src/styles/colors.scss +++ b/src/styles/colors.scss @@ -1,5 +1,5 @@ // $red: #ff3344; -$red: #da6972; +$red: #ff6553; $yellow: #ffd60f; $dark_blue: #3c75ff; $blue: #3ca1ff; From 249a9b368c4ad193e0ba4dbf60f410c6f1ac0190 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 12:17:45 +0700 Subject: [PATCH 56/99] node edit and like buttons + actions --- src/components/node/NodePanel/index.tsx | 27 ++++++++++-- src/components/node/NodePanelInner/index.tsx | 31 ++++++++++---- .../node/NodePanelInner/styles.scss | 42 +++++++++++++------ src/containers/node/NodeLayout/index.tsx | 26 ++++++++++-- src/redux/node/actions.ts | 7 +++- src/redux/node/constants.ts | 1 + src/utils/node.ts | 11 +++++ 7 files changed, 117 insertions(+), 28 deletions(-) create mode 100644 src/utils/node.ts diff --git a/src/components/node/NodePanel/index.tsx b/src/components/node/NodePanel/index.tsx index 9d93e8a9..e3494792 100644 --- a/src/components/node/NodePanel/index.tsx +++ b/src/components/node/NodePanel/index.tsx @@ -7,9 +7,14 @@ import { NodePanelInner } from '~/components/node/NodePanelInner'; interface IProps { node: INode; layout: {}; + + can_edit: boolean; + can_like: boolean; + onEdit: () => void; + onLike: () => void; } -const NodePanel: FC<IProps> = ({ node, layout }) => { +const NodePanel: FC<IProps> = ({ node, layout, can_edit, can_like, onEdit, onLike }) => { const [stack, setStack] = useState(false); const ref = useRef(null); @@ -37,9 +42,25 @@ const NodePanel: FC<IProps> = ({ node, layout }) => { return ( <div className={styles.place} ref={ref}> {stack ? ( - createPortal(<NodePanelInner node={node} stack />, document.body) + createPortal( + <NodePanelInner + node={node} + stack + onEdit={onEdit} + onLike={onLike} + can_edit={can_edit} + can_like={can_like} + />, + document.body + ) ) : ( - <NodePanelInner node={node} /> + <NodePanelInner + node={node} + onEdit={onEdit} + onLike={onLike} + can_edit={can_edit} + can_like={can_like} + /> )} </div> ); diff --git a/src/components/node/NodePanelInner/index.tsx b/src/components/node/NodePanelInner/index.tsx index 49d56bcd..3364f0f8 100644 --- a/src/components/node/NodePanelInner/index.tsx +++ b/src/components/node/NodePanelInner/index.tsx @@ -9,25 +9,42 @@ import classNames from 'classnames'; interface IProps { node: INode; stack?: boolean; + + can_edit: boolean; + can_like: boolean; + onEdit: () => void; + onLike: () => void; } -const NodePanelInner: FC<IProps> = ({ node: { title, user }, stack }) => { +const NodePanelInner: FC<IProps> = ({ + node: { title, user }, + stack, + can_edit, + can_like, + onEdit, + onLike, +}) => { return ( <div className={classNames(styles.wrap, { stack })}> <div className={styles.content}> <Group horizontal className={styles.panel}> <Filler> <div className={styles.title}>{title || '...'}</div> - {user && user.username && <div className={styles.name}>~ {user.username}</div>} + {user && user.username && <div className={styles.name}>~{user.username}</div>} </Filler> </Group> <div className={styles.buttons}> - <Icon icon="edit" size={24} /> - - <div className={styles.sep} /> - - <Icon icon="heart" size={24} /> + {can_edit && ( + <div> + <Icon icon="edit" size={24} onClick={onEdit} /> + </div> + )} + {can_like && ( + <div> + <Icon icon="heart" size={24} onClick={onLike} /> + </div> + )} </div> </div> </div> diff --git a/src/components/node/NodePanelInner/styles.scss b/src/components/node/NodePanelInner/styles.scss index cdbbcfd0..133cb699 100644 --- a/src/components/node/NodePanelInner/styles.scss +++ b/src/components/node/NodePanelInner/styles.scss @@ -66,22 +66,43 @@ & > * { margin: 0 $gap; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + + svg { + fill: darken(white, 50%); + transition: fill 0.25s; + } + + &:hover { + svg { + fill: $red; + } + } + + &::after { + content: ' '; + flex: 0 0 6px; + height: $gap; + width: 6px; + border-radius: 4px; + background: transparentize(black, 0.7); + margin-left: $gap * 2; + } &:first-child { margin-left: 0; } + &:last-child { margin-right: 0; + &::after { + display: none; + } } } - //height: 54px; - //border-radius: $radius $radius 0 0; - //background: linear-gradient(176deg, #f42a00, #5c1085); - //position: absolute; - //bottom: 0; - //right: 10px; - //width: 270px; - //display: flex; } .mark { @@ -102,9 +123,4 @@ } .sep { - flex: 0 0 6px; - height: 6px; - width: 6px; - border-radius: 4px; - background: transparentize(black, 0.7); } diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index cde602c5..9aa29fb9 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, createElement, useEffect, useCallback, useState } from 'react'; +import React, { FC, createElement, useEffect, useCallback, useState, useMemo } from 'react'; import { RouteComponentProps } from 'react-router'; import { connect } from 'react-redux'; - +import { canEditNode, canLikeNode } from '~/utils/node'; import { selectNode } from '~/redux/node/selectors'; import { Card } from '~/components/containers/Card'; @@ -26,6 +26,8 @@ const mapStateToProps = state => ({ const mapDispatchToProps = { nodeLoadNode: NODE_ACTIONS.nodeLoadNode, nodeUpdateTags: NODE_ACTIONS.nodeUpdateTags, + nodeEdit: NODE_ACTIONS.nodeEdit, + nodeLike: NODE_ACTIONS.nodeLike, }; type IProps = ReturnType<typeof mapStateToProps> & @@ -37,9 +39,12 @@ const NodeLayoutUnconnected: FC<IProps> = ({ params: { id }, }, node: { is_loading, is_loading_comments, comments = [], current: node }, - user: { is_user }, + user, + user: { is_user, role }, nodeLoadNode, nodeUpdateTags, + nodeEdit, + nodeLike, }) => { const [layout, setLayout] = useState({}); @@ -57,14 +62,27 @@ const NodeLayoutUnconnected: FC<IProps> = ({ [node, nodeUpdateTags] ); + const can_edit = useMemo(() => canEditNode(node, user), [node, user]); + const can_like = useMemo(() => canLikeNode(node, user), [node, user]); + const block = node && node.type && NODE_COMPONENTS[node.type]; const inline_block = node && node.type && NODE_INLINES[node.type]; + const onEdit = useCallback(() => nodeEdit(node.id), [nodeEdit, node]); + const onLike = useCallback(() => nodeLike(node.id), [nodeLike, node]); + return ( <Card className={styles.node} seamless> {block && createElement(block, { node, is_loading, updateLayout, layout })} - <NodePanel node={node} layout={layout} /> + <NodePanel + node={node} + layout={layout} + can_edit={can_edit} + can_like={can_like} + onEdit={onEdit} + onLike={onLike} + /> <Group> <Padder> diff --git a/src/redux/node/actions.ts b/src/redux/node/actions.ts index e34e9fee..4d3dd3d7 100644 --- a/src/redux/node/actions.ts +++ b/src/redux/node/actions.ts @@ -71,7 +71,12 @@ export const nodeCreate = (node_type: INode['type']) => ({ }); export const nodeEdit = (id: INode['id']) => ({ - type: NODE_ACTIONS.CREATE, + type: NODE_ACTIONS.EDIT, + id, +}); + +export const nodeLike = (id: INode['id']) => ({ + type: NODE_ACTIONS.LIKE, id, }); diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 6aee481c..c5900ebb 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -18,6 +18,7 @@ export const NODE_ACTIONS = { LOAD_NODE: `${prefix}LOAD_NODE`, EDIT: `${prefix}EDIT`, + LIKE: `${prefix}LIKE`, CREATE: `${prefix}CREATE`, SET_SAVE_ERRORS: `${prefix}SET_SAVE_ERRORS`, diff --git a/src/utils/node.ts b/src/utils/node.ts new file mode 100644 index 00000000..2b81e9e8 --- /dev/null +++ b/src/utils/node.ts @@ -0,0 +1,11 @@ +import { USER_ROLES } from '~/redux/auth/constants'; +import { INode } from '~/redux/types'; +import { IUser } from '~/redux/auth/types'; +import path from 'ramda/es/path'; + +export const canEditNode = (node: Partial<INode>, user: Partial<IUser>): boolean => + path(['role'], user) === USER_ROLES.ADMIN || + (path(['user', 'id'], node) && path(['user', 'id'], node) === path(['id'], user)); + +export const canLikeNode = (node: Partial<INode>, user: Partial<IUser>): boolean => + path(['role'], user) && path(['role'], user) !== USER_ROLES.GUEST; From f71be36520a86fdf0a8076c8d8ba2c594628d07f Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 12:31:59 +0700 Subject: [PATCH 57/99] node editing saga --- src/components/editors/ImageEditor/index.tsx | 7 ++++++- .../editors/ImageEditor/styles.scss | 12 +----------- .../dialogs/LoadingDialog/index.tsx | 11 +++++++++++ .../dialogs/LoadingDialog/styles.scss | 11 +++++++++++ src/redux/modal/constants.ts | 3 +++ src/redux/node/sagas.ts | 19 ++++++++++++++++++- 6 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 src/containers/dialogs/LoadingDialog/index.tsx create mode 100644 src/containers/dialogs/LoadingDialog/styles.scss diff --git a/src/components/editors/ImageEditor/index.tsx b/src/components/editors/ImageEditor/index.tsx index decfacb6..0e9ead80 100644 --- a/src/components/editors/ImageEditor/index.tsx +++ b/src/components/editors/ImageEditor/index.tsx @@ -4,6 +4,7 @@ import { INode, IFile } from '~/redux/types'; import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; import { selectUploads } from '~/redux/uploads/selectors'; import { ImageGrid } from '~/components/editors/ImageGrid'; +import * as styles from './styles.scss'; const mapStateToProps = selectUploads; const mapDispatchToProps = { @@ -26,7 +27,11 @@ const ImageEditorUnconnected: FC<IProps> = ({ data, setData, temp, statuses }) = const setFiles = useCallback((files: IFile[]) => setData({ ...data, files }), [data, setData]); - return <ImageGrid files={data.files} setFiles={setFiles} locked={pending_files} />; + return ( + <div className={styles.wrap}> + <ImageGrid files={data.files} setFiles={setFiles} locked={pending_files} /> + </div> + ); }; const ImageEditor = connect( diff --git a/src/components/editors/ImageEditor/styles.scss b/src/components/editors/ImageEditor/styles.scss index 79d3ce9a..6ca09dc5 100644 --- a/src/components/editors/ImageEditor/styles.scss +++ b/src/components/editors/ImageEditor/styles.scss @@ -1,14 +1,4 @@ -.uploads { +.wrap { min-height: 200px; padding-bottom: 60px; - box-sizing: border-box; - - display: grid; - grid-column-gap: $gap; - grid-row-gap: $gap; - grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - - @media (max-width: 600px) { - grid-template-columns: repeat(auto-fill, minmax(30vw, 1fr)); - } } diff --git a/src/containers/dialogs/LoadingDialog/index.tsx b/src/containers/dialogs/LoadingDialog/index.tsx new file mode 100644 index 00000000..abead2d4 --- /dev/null +++ b/src/containers/dialogs/LoadingDialog/index.tsx @@ -0,0 +1,11 @@ +import React, { FC } from 'react'; +import { LoaderCircle } from '~/components/input/LoaderCircle'; +import * as styles from './styles.scss'; + +const LoadingDialog: FC<{}> = () => ( + <div className={styles.wrap}> + <LoaderCircle size={64} /> + </div> +); + +export { LoadingDialog }; diff --git a/src/containers/dialogs/LoadingDialog/styles.scss b/src/containers/dialogs/LoadingDialog/styles.scss new file mode 100644 index 00000000..b0eb90de --- /dev/null +++ b/src/containers/dialogs/LoadingDialog/styles.scss @@ -0,0 +1,11 @@ +.wrap { + height: 200px; + display: flex; + align-items: center; + justify-content: center; + + svg { + fill: white; + opacity: 0.5; + } +} diff --git a/src/redux/modal/constants.ts b/src/redux/modal/constants.ts index 8426320d..0d12834b 100644 --- a/src/redux/modal/constants.ts +++ b/src/redux/modal/constants.ts @@ -1,5 +1,6 @@ import { ValueOf } from '~/redux/types'; import { LoginDialog } from '~/containers/dialogs/LoginDialog'; +import { LoadingDialog } from '~/containers/dialogs/LoadingDialog'; import { EditorDialogImage } from '~/containers/editors/EditorDialogImage'; import { EditorDialogText } from '~/containers/editors/EditorDialogText'; import { EditorDialogVideo } from '~/containers/editors/EditorDialogVideo'; @@ -18,6 +19,7 @@ export const DIALOGS = { EDITOR_VIDEO: 'EDITOR_VIDEO', EDITOR_AUDIO: 'EDITOR_AUDIO', LOGIN: 'LOGIN', + LOADING: 'LOADING', }; export const DIALOG_CONTENT = { @@ -26,6 +28,7 @@ export const DIALOG_CONTENT = { [DIALOGS.EDITOR_VIDEO]: EditorDialogVideo, [DIALOGS.EDITOR_AUDIO]: EditorDialogAudio, [DIALOGS.LOGIN]: LoginDialog, + [DIALOGS.LOADING]: LoadingDialog, }; export const NODE_EDITOR_DIALOGS = { diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index 7889b02b..aa6525c1 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -17,6 +17,7 @@ import { nodeSetTags, nodeCreate, nodeSetEditor, + nodeEdit, } from './actions'; import { postNode, getNode, postNodeComment, getNodeComments, updateNodeTags } from './api'; import { reqWrapper } from '../auth/sagas'; @@ -27,7 +28,7 @@ import { selectFlowNodes } from '../flow/selectors'; import { URLS } from '~/constants/urls'; import { selectNode } from './selectors'; import { IResultWithStatus, INode } from '../types'; -import { NODE_EDITOR_DIALOGS } from '../modal/constants'; +import { NODE_EDITOR_DIALOGS, DIALOGS } from '../modal/constants'; function* onNodeSave({ node }: ReturnType<typeof nodeSave>) { yield put(nodeSetSaveErrors({})); @@ -128,10 +129,26 @@ function* onCreateSaga({ node_type: type }: ReturnType<typeof nodeCreate>) { yield put(modalShowDialog(NODE_EDITOR_DIALOGS[type])); } +function* onEditSaga({ id }: ReturnType<typeof nodeEdit>) { + yield put(modalShowDialog(DIALOGS.LOADING)); + + const { + data: { node }, + error, + } = yield call(reqWrapper, getNode, { id }); + + if (error || !node || !node.type || !NODE_EDITOR_DIALOGS[node.type]) + return yield put(modalSetShown(false)); + + yield put(nodeSetEditor(node)); + yield put(modalShowDialog(NODE_EDITOR_DIALOGS[node.type])); +} + export default function* nodeSaga() { yield takeLatest(NODE_ACTIONS.SAVE, onNodeSave); yield takeLatest(NODE_ACTIONS.LOAD_NODE, onNodeLoad); yield takeLatest(NODE_ACTIONS.POST_COMMENT, onPostComment); yield takeLatest(NODE_ACTIONS.UPDATE_TAGS, onUpdateTags); yield takeLatest(NODE_ACTIONS.CREATE, onCreateSaga); + yield takeLatest(NODE_ACTIONS.EDIT, onEditSaga); } From fbd64dec4ce0a7a08d3bb535dd92d5e82c41f100 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 13:01:31 +0700 Subject: [PATCH 58/99] posting node updates flow --- src/constants/errors.ts | 2 ++ src/redux/node/sagas.ts | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/constants/errors.ts b/src/constants/errors.ts index 92aea57b..efcb7ca1 100644 --- a/src/constants/errors.ts +++ b/src/constants/errors.ts @@ -8,6 +8,7 @@ export const ERRORS = { UNKNOWN_NODE_TYPE: 'Unknown_Node_Type', URL_INVALID: 'Url_Invalid', FILES_AUDIO_REQUIRED: 'Files_Audio_Required', + NOT_ENOUGH_RIGHTS: 'Not_Enough_Rights', }; export const ERROR_LITERAL = { @@ -20,4 +21,5 @@ export const ERROR_LITERAL = { [ERRORS.UNKNOWN_NODE_TYPE]: 'Неизвестный тип поста', [ERRORS.URL_INVALID]: 'Неизвестный адрес', [ERRORS.FILES_AUDIO_REQUIRED]: 'Нужна хотя бы одна песня', + [ERRORS.NOT_ENOUGH_RIGHTS]: 'У вас недостаточно прав', }; diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index aa6525c1..7200a9d8 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -46,7 +46,18 @@ function* onNodeSave({ node }: ReturnType<typeof nodeSave>) { } const nodes = yield select(selectFlowNodes); - yield put(flowSetNodes([result, ...nodes])); + const updated_flow_nodes = node.id + ? nodes.map(item => (item.id === result.id ? result : item)) + : [result, ...nodes]; + + yield put(flowSetNodes(updated_flow_nodes)); + + const { current } = yield select(selectNode); + + if (node.id && current.id === result.id) { + yield put(nodeSetCurrent(result)); + } + return yield put(modalSetShown(false)); } From 2df87f9ab9861956c79568332668f53337825002 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 14:20:57 +0700 Subject: [PATCH 59/99] fixed image slider normalizer --- src/components/node/NodeImageSlideBlock/index.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index 24092867..d26a4d57 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -101,8 +101,17 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => const normalizeOffset = useCallback(() => { const { width: wrap_width } = wrap.current.getBoundingClientRect(); - setOffset(Math.round(offset / wrap_width) * wrap_width); - }, [wrap, offset]); + const { width: slide_width } = slide.current.getBoundingClientRect(); + + const shift = (initial_offset - offset) / wrap_width; // percent / 100 + const diff = initial_offset - (shift > 0 ? Math.ceil(shift) : Math.floor(shift)) * wrap_width; + const new_offset = + Math.abs(shift) > 0.33 + ? Math.min(Math.max(diff, wrap_width - slide_width), 0) // next or prev slide + : Math.round(offset / wrap_width) * wrap_width; // back to this one + + setOffset(new_offset); + }, [wrap, offset, initial_offset]); const updateMaxHeight = useCallback(() => { if (!wrap.current) return; From f9a269137a10e4f6d75948babb76422fa10ea05c Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 14:21:28 +0700 Subject: [PATCH 60/99] fixed normalizer to 25% --- src/components/node/NodeImageSlideBlock/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/node/NodeImageSlideBlock/index.tsx b/src/components/node/NodeImageSlideBlock/index.tsx index d26a4d57..6060f3d2 100644 --- a/src/components/node/NodeImageSlideBlock/index.tsx +++ b/src/components/node/NodeImageSlideBlock/index.tsx @@ -106,7 +106,7 @@ const NodeImageSlideBlock: FC<IProps> = ({ node, is_loading, updateLayout }) => const shift = (initial_offset - offset) / wrap_width; // percent / 100 const diff = initial_offset - (shift > 0 ? Math.ceil(shift) : Math.floor(shift)) * wrap_width; const new_offset = - Math.abs(shift) > 0.33 + Math.abs(shift) > 0.25 ? Math.min(Math.max(diff, wrap_width - slide_width), 0) // next or prev slide : Math.round(offset / wrap_width) * wrap_width; // back to this one From c8593b7e7a5c8a9527a76072a10dd862fb088455 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 15:14:58 +0700 Subject: [PATCH 61/99] adding cover to node --- .../editors/AudioEditor/styles.scss | 2 +- .../editors/EditorUploadButton/index.tsx | 2 - .../editors/EditorUploadButton/styles.scss | 12 +- .../editors/EditorUploadCoverButton/index.tsx | 111 ++++++++++++++++++ .../EditorUploadCoverButton/styles.scss | 80 +++++++++++++ .../editors/ImageEditor/styles.scss | 2 +- src/redux/node/constants.ts | 3 +- src/styles/variables.scss | 2 + 8 files changed, 204 insertions(+), 10 deletions(-) create mode 100644 src/components/editors/EditorUploadCoverButton/index.tsx create mode 100644 src/components/editors/EditorUploadCoverButton/styles.scss diff --git a/src/components/editors/AudioEditor/styles.scss b/src/components/editors/AudioEditor/styles.scss index 4909ae19..c32787d8 100644 --- a/src/components/editors/AudioEditor/styles.scss +++ b/src/components/editors/AudioEditor/styles.scss @@ -1,4 +1,4 @@ .wrap { - padding-bottom: 64px; + padding-bottom: $upload_button_height + $gap; min-height: 200px; } diff --git a/src/components/editors/EditorUploadButton/index.tsx b/src/components/editors/EditorUploadButton/index.tsx index c69dc3cf..c25acf68 100644 --- a/src/components/editors/EditorUploadButton/index.tsx +++ b/src/components/editors/EditorUploadButton/index.tsx @@ -54,8 +54,6 @@ const EditorUploadButtonUnconnected: FC<IProps> = ({ if (current >= NODE_SETTINGS.MAX_FILES) return; - console.log({ type }); - const items: IFileWithUUID[] = Array.from(uploads).map( (file: File): IFileWithUUID => ({ file, diff --git a/src/components/editors/EditorUploadButton/styles.scss b/src/components/editors/EditorUploadButton/styles.scss index 629c551b..c793e1c6 100644 --- a/src/components/editors/EditorUploadButton/styles.scss +++ b/src/components/editors/EditorUploadButton/styles.scss @@ -1,14 +1,16 @@ .wrap { - width: 52px; - height: 52px; - border-radius: 32px !important; + @include outer_shadow(); + + width: $upload_button_height; + height: $upload_button_height; + border-radius: ($upload_button_height / 2) !important; position: relative; border-radius: $radius; cursor: pointer; // opacity: 0.7; transition: opacity 0.5s; background: $red_gradient; - box-shadow: $content_bg 0 0 5px 10px; + // box-shadow: $content_bg 0 0 5px 10px; &:hover { opacity: 1; @@ -35,4 +37,4 @@ display: flex; align-items: center; justify-content: center; -} \ No newline at end of file +} diff --git a/src/components/editors/EditorUploadCoverButton/index.tsx b/src/components/editors/EditorUploadCoverButton/index.tsx new file mode 100644 index 00000000..dc8fc43c --- /dev/null +++ b/src/components/editors/EditorUploadCoverButton/index.tsx @@ -0,0 +1,111 @@ +import React, { FC, useState, useCallback, useEffect } from 'react'; +import { INode, IFileWithUUID } from '~/redux/types'; +import uuid from 'uuid4'; +import * as styles from './styles.scss'; +import { UPLOAD_SUBJECTS, UPLOAD_TARGETS, UPLOAD_TYPES } from '~/redux/uploads/constants'; +import path from 'ramda/es/path'; +import { connect } from 'react-redux'; +import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; +import { selectUploads } from '~/redux/uploads/selectors'; +import { getURL } from '~/utils/dom'; +import { Icon } from '~/components/input/Icon'; + +const mapStateToProps = state => { + const { statuses, files } = selectUploads(state); + + return { statuses, files }; +}; + +const mapDispatchToProps = { + uploadUploadFiles: UPLOAD_ACTIONS.uploadUploadFiles, +}; + +type IProps = ReturnType<typeof mapStateToProps> & + typeof mapDispatchToProps & { + data: INode; + setData: (data: INode) => void; + temp: string[]; + setTemp: (val: string[]) => void; + }; + +const EditorUploadCoverButtonUnconnected: FC<IProps> = ({ + data, + setData, + files, + statuses, + uploadUploadFiles, +}) => { + const [cover_temp, setCoverTemp] = useState<string>(null); + + useEffect(() => { + Object.entries(statuses).forEach(([id, status]) => { + if (cover_temp === id && !!status.uuid && files[status.uuid]) { + setData({ ...data, cover: files[status.uuid] }); + setCoverTemp(null); + } + }); + }, [statuses, files, cover_temp, setData, data]); + + const onUpload = useCallback( + (uploads: File[]) => { + const items: IFileWithUUID[] = Array.from(uploads).map( + (file: File): IFileWithUUID => ({ + file, + temp_id: uuid(), + subject: UPLOAD_SUBJECTS.EDITOR, + target: UPLOAD_TARGETS.NODES, + type: UPLOAD_TYPES.IMAGE, + }) + ); + + setCoverTemp(path([0, 'temp_id'], items)); + uploadUploadFiles(items); + }, + [uploadUploadFiles, setCoverTemp] + ); + + const onInputChange = useCallback( + event => { + event.preventDefault(); + + if (!event.target.files || !event.target.files.length) return; + + onUpload(Array.from(event.target.files)); + }, + [onUpload] + ); + const onDropCover = useCallback(() => { + setData({ ...data, cover: null }); + }, [setData, data]); + + const background = data.cover ? getURL(data.cover) : null; + const status = cover_temp && path([cover_temp], statuses); + const preview = status && path(['preview'], status); + + return ( + <div className={styles.wrap}> + <div + className={styles.preview} + style={{ backgroundImage: `url("${preview || background}")` }} + > + <div className={styles.input}> + {!data.cover && <span>ОБЛОЖКА</span>} + <input type="file" accept="image/*" onChange={onInputChange} /> + </div> + + {data.cover && ( + <div className={styles.button} onClick={onDropCover}> + <Icon icon="close" /> + </div> + )} + </div> + </div> + ); +}; + +const EditorUploadCoverButton = connect( + mapStateToProps, + mapDispatchToProps +)(EditorUploadCoverButtonUnconnected); + +export { EditorUploadCoverButton }; diff --git a/src/components/editors/EditorUploadCoverButton/styles.scss b/src/components/editors/EditorUploadCoverButton/styles.scss new file mode 100644 index 00000000..ccb396ec --- /dev/null +++ b/src/components/editors/EditorUploadCoverButton/styles.scss @@ -0,0 +1,80 @@ +.wrap { + @include outer_shadow(); + + height: $upload_button_height; + border-radius: ($upload_button_height / 2) !important; + position: relative; + border-radius: $radius; + cursor: pointer; + transition: opacity 0.5s; + background: lighten($content_bg, 4%); + flex: 0 1 $upload_button_height * 4; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + opacity: 1; + } + + input { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + opacity: 0; + z-index: 2; + cursor: pointer; + } +} + +.input { + position: relative; + height: 100%; + flex: 1; + display: flex; + align-items: center; + justify-content: center; + font: $font_16_medium; + text-shadow: rgba(0, 0, 0, 0.5) 0 1px; +} + +.preview { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + z-index: 1; + border-radius: ($upload_button_height / 2) !important; + background: 50% 50% no-repeat; + background-size: cover; + display: flex; + align-items: center; + flex-direction: row; + justify-content: flex-end; +} + +.button { + width: $upload_button_height; + flex: 0 0 $upload_button_height; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + box-shadow: inset rgba(255, 255, 255, 0.05) 1px 1px, rgba(0, 0, 0, 0.3) -1px 0; + border-radius: $upload_button_height; + background: transparentize($color: lighten($content_bg, 4%), $amount: 0); + + &:hover { + svg { + fill: $red; + } + } + + svg { + width: 32px; + height: 32px; + } +} diff --git a/src/components/editors/ImageEditor/styles.scss b/src/components/editors/ImageEditor/styles.scss index 6ca09dc5..e5bcef09 100644 --- a/src/components/editors/ImageEditor/styles.scss +++ b/src/components/editors/ImageEditor/styles.scss @@ -1,4 +1,4 @@ .wrap { min-height: 200px; - padding-bottom: 60px; + padding-bottom: $upload_button_height + $gap; } diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index c5900ebb..e5c79811 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -11,6 +11,7 @@ import { VideoEditor } from '~/components/editors/VideoEditor'; import { AudioEditor } from '~/components/editors/AudioEditor'; import { EditorImageUploadButton } from '~/components/editors/EditorImageUploadButton'; import { EditorAudioUploadButton } from '~/components/editors/EditorAudioUploadButton'; +import { EditorUploadCoverButton } from '~/components/editors/EditorUploadCoverButton'; const prefix = 'NODE.'; export const NODE_ACTIONS = { @@ -98,7 +99,7 @@ export const NODE_EDITORS = { }; export const NODE_PANEL_COMPONENTS = { - [NODE_TYPES.IMAGE]: [EditorImageUploadButton], + [NODE_TYPES.IMAGE]: [EditorImageUploadButton, EditorUploadCoverButton], [NODE_TYPES.AUDIO]: [EditorAudioUploadButton, EditorImageUploadButton], }; diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 66e8f78a..6af3bd4e 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -26,6 +26,8 @@ $medium: 500; $light: 300; $extra_light: 200; +$upload_button_height: 52px; + $font: Montserrat, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; From ad0b9e6a28a3ec3129cbc07e07f993774f2ca48e Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 15:49:04 +0700 Subject: [PATCH 62/99] node cover display --- .../containers/BlurWrapper/styles.scss | 3 ++ src/components/containers/PageCover/index.tsx | 25 ++++++++++++++++ .../containers/PageCover/styles.scss | 30 +++++++++++++++++++ src/containers/App.tsx | 8 +++-- src/containers/node/NodeLayout/index.tsx | 12 ++++++-- src/redux/node/actions.ts | 7 ++++- src/redux/node/constants.ts | 5 +++- src/redux/node/handlers.ts | 7 +++++ src/redux/node/reducer.ts | 4 ++- 9 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 src/components/containers/PageCover/index.tsx create mode 100644 src/components/containers/PageCover/styles.scss diff --git a/src/components/containers/BlurWrapper/styles.scss b/src/components/containers/BlurWrapper/styles.scss index e9fb9aec..253b89c5 100644 --- a/src/components/containers/BlurWrapper/styles.scss +++ b/src/components/containers/BlurWrapper/styles.scss @@ -1,4 +1,7 @@ .blur { filter: blur(0); transition: filter 0.25s; + max-height: 100vh; + width: 100vw; + overflow: visible auto; } diff --git a/src/components/containers/PageCover/index.tsx b/src/components/containers/PageCover/index.tsx new file mode 100644 index 00000000..c461a2a8 --- /dev/null +++ b/src/components/containers/PageCover/index.tsx @@ -0,0 +1,25 @@ +import React, { FC } from 'react'; +import * as styles from './styles.scss'; +import { createPortal } from 'react-dom'; +import { selectNode } from '~/redux/node/selectors'; +import { connect } from 'react-redux'; +import pick from 'ramda/es/pick'; +import { getURL } from '~/utils/dom'; + +const mapStateToProps = state => pick(['current_cover_image'], selectNode(state)); + +type IProps = ReturnType<typeof mapStateToProps> & {}; + +const PageCoverUnconnected: FC<IProps> = ({ current_cover_image }) => + current_cover_image + ? createPortal( + <div + className={styles.wrap} + style={{ backgroundImage: `url("${getURL(current_cover_image)}")` }} + />, + document.body + ) + : null; + +const PageCover = connect(mapStateToProps)(PageCoverUnconnected); +export { PageCover }; diff --git a/src/components/containers/PageCover/styles.scss b/src/components/containers/PageCover/styles.scss new file mode 100644 index 00000000..4ad4866e --- /dev/null +++ b/src/components/containers/PageCover/styles.scss @@ -0,0 +1,30 @@ +@keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +.wrap { + position: absolute; + top: 0; + left: 0; + z-index: -1; + background: 50% 50% no-repeat; + background-size: cover; + width: 100%; + height: 100%; + animation: fadeIn 2s; + + &::after { + content: ' '; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url(~/sprites/dots.svg) rgba(0, 0, 0, 0.5); + } +} diff --git a/src/containers/App.tsx b/src/containers/App.tsx index 1b988ac6..fb02ef7b 100644 --- a/src/containers/App.tsx +++ b/src/containers/App.tsx @@ -14,18 +14,22 @@ import { URLS } from '~/constants/urls'; import { Modal } from '~/containers/dialogs/Modal'; import { selectModal } from '~/redux/modal/selectors'; import { BlurWrapper } from '~/components/containers/BlurWrapper'; +import { PageCover } from '~/components/containers/PageCover'; import { NodeLayout } from './node/NodeLayout'; import { BottomContainer } from '~/containers/main/BottomContainer'; -const mapStateToProps = selectModal; +const mapStateToProps = state => ({ + modal: selectModal(state), +}); const mapDispatchToProps = {}; type IProps = typeof mapDispatchToProps & ReturnType<typeof mapStateToProps> & {}; -const Component: FC<IProps> = ({ is_shown }) => ( +const Component: FC<IProps> = ({ modal: { is_shown } }) => ( <ConnectedRouter history={history}> <div> <BlurWrapper is_blurred={is_shown}> + <PageCover /> <MainLayout> <Modal /> <Sprites /> diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index 9aa29fb9..43da34de 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -26,6 +26,7 @@ const mapStateToProps = state => ({ const mapDispatchToProps = { nodeLoadNode: NODE_ACTIONS.nodeLoadNode, nodeUpdateTags: NODE_ACTIONS.nodeUpdateTags, + nodeSetCoverImage: NODE_ACTIONS.nodeSetCoverImage, nodeEdit: NODE_ACTIONS.nodeEdit, nodeLike: NODE_ACTIONS.nodeLike, }; @@ -38,13 +39,14 @@ const NodeLayoutUnconnected: FC<IProps> = ({ match: { params: { id }, }, - node: { is_loading, is_loading_comments, comments = [], current: node }, + node: { is_loading, is_loading_comments, comments = [], current: node, current_cover_image }, user, - user: { is_user, role }, + user: { is_user }, nodeLoadNode, nodeUpdateTags, nodeEdit, nodeLike, + nodeSetCoverImage, }) => { const [layout, setLayout] = useState({}); @@ -71,6 +73,12 @@ const NodeLayoutUnconnected: FC<IProps> = ({ const onEdit = useCallback(() => nodeEdit(node.id), [nodeEdit, node]); const onLike = useCallback(() => nodeLike(node.id), [nodeLike, node]); + useEffect(() => { + if (!node.cover) return; + nodeSetCoverImage(node.cover); + return () => nodeSetCoverImage(null); + }, [nodeSetCoverImage, node.cover]); + return ( <Card className={styles.node} seamless> {block && createElement(block, { node, is_loading, updateLayout, layout })} diff --git a/src/redux/node/actions.ts b/src/redux/node/actions.ts index 4d3dd3d7..56dd72a3 100644 --- a/src/redux/node/actions.ts +++ b/src/redux/node/actions.ts @@ -1,4 +1,4 @@ -import { INode, IValidationErrors, IComment, ITag } from '../types'; +import { INode, IValidationErrors, IComment, ITag, IFile } from '../types'; import { NODE_ACTIONS, NODE_TYPES } from './constants'; import { INodeState } from './reducer'; @@ -84,3 +84,8 @@ export const nodeSetEditor = (editor: INode) => ({ type: NODE_ACTIONS.SET_EDITOR, editor, }); + +export const nodeSetCoverImage = (current_cover_image: IFile) => ({ + type: NODE_ACTIONS.SET_COVER_IMAGE, + current_cover_image, +}); diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index e5c79811..74026ed5 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -35,6 +35,7 @@ export const NODE_ACTIONS = { UPDATE_TAGS: `${prefix}UPDATE_TAGS`, SET_TAGS: `${prefix}SET_TAGS`, + SET_COVER_IMAGE: `${prefix}SET_COVER_IMAGE`, }; export const EMPTY_NODE: INode = { @@ -99,8 +100,10 @@ export const NODE_EDITORS = { }; export const NODE_PANEL_COMPONENTS = { + [NODE_TYPES.TEXT]: [EditorUploadCoverButton], + [NODE_TYPES.VIDEO]: [EditorUploadCoverButton], [NODE_TYPES.IMAGE]: [EditorImageUploadButton, EditorUploadCoverButton], - [NODE_TYPES.AUDIO]: [EditorAudioUploadButton, EditorImageUploadButton], + [NODE_TYPES.AUDIO]: [EditorAudioUploadButton, EditorImageUploadButton, EditorUploadCoverButton], }; export const NODE_EDITOR_DATA: Record< diff --git a/src/redux/node/handlers.ts b/src/redux/node/handlers.ts index 3ed37d47..ef7d677c 100644 --- a/src/redux/node/handlers.ts +++ b/src/redux/node/handlers.ts @@ -10,6 +10,7 @@ import { nodeSetCommentData, nodeSetTags, nodeSetEditor, + nodeSetCoverImage, } from './actions'; import { INodeState } from './reducer'; @@ -46,6 +47,11 @@ const setTags = (state: INodeState, { tags }: ReturnType<typeof nodeSetTags>) => const setEditor = (state: INodeState, { editor }: ReturnType<typeof nodeSetEditor>) => assocPath(['editor'], editor, state); +const setCoverImage = ( + state: INodeState, + { current_cover_image }: ReturnType<typeof nodeSetCoverImage> +) => assocPath(['current_cover_image'], current_cover_image, state); + export const NODE_HANDLERS = { [NODE_ACTIONS.SET_SAVE_ERRORS]: setSaveErrors, [NODE_ACTIONS.SET_LOADING]: setLoading, @@ -56,4 +62,5 @@ export const NODE_HANDLERS = { [NODE_ACTIONS.SET_COMMENT_DATA]: setCommentData, [NODE_ACTIONS.SET_TAGS]: setTags, [NODE_ACTIONS.SET_EDITOR]: setEditor, + [NODE_ACTIONS.SET_COVER_IMAGE]: setCoverImage, }; diff --git a/src/redux/node/reducer.ts b/src/redux/node/reducer.ts index 5f05586d..fa15f16e 100644 --- a/src/redux/node/reducer.ts +++ b/src/redux/node/reducer.ts @@ -1,5 +1,5 @@ import { createReducer } from '~/utils/reducer'; -import { INode, IComment } from '../types'; +import { INode, IComment, IFile } from '../types'; import { EMPTY_NODE, EMPTY_COMMENT } from './constants'; import { NODE_HANDLERS } from './handlers'; @@ -8,6 +8,7 @@ export type INodeState = Readonly<{ current: INode; comments: IComment[]; comment_data: Record<number, IComment>; + current_cover_image: IFile; error: string; errors: Record<string, string>; @@ -27,6 +28,7 @@ const INITIAL_STATE: INodeState = { current: { ...EMPTY_NODE }, comment_data: { 0: { ...EMPTY_COMMENT } }, comments: [], + current_cover_image: null, is_loading: false, is_loading_comments: false, From 53abb3853eb59b4af1a47e7df2528f44d96c0727 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 16:58:39 +0700 Subject: [PATCH 63/99] removed page cover on tablets --- src/components/bars/SubmitBar/styles.scss | 2 +- src/components/containers/PageCover/styles.scss | 4 ++++ src/styles/colors.scss | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/bars/SubmitBar/styles.scss b/src/components/bars/SubmitBar/styles.scss index 9d6cd3dd..83b9ce01 100644 --- a/src/components/bars/SubmitBar/styles.scss +++ b/src/components/bars/SubmitBar/styles.scss @@ -16,7 +16,7 @@ } .button { - background: $red; + background: $red_gradient; width: $bar_height; height: $bar_height; border-radius: $bar_height / 2; diff --git a/src/components/containers/PageCover/styles.scss b/src/components/containers/PageCover/styles.scss index 4ad4866e..2816ba7b 100644 --- a/src/components/containers/PageCover/styles.scss +++ b/src/components/containers/PageCover/styles.scss @@ -27,4 +27,8 @@ height: 100%; background: url(~/sprites/dots.svg) rgba(0, 0, 0, 0.5); } + + @include tablet { + display: none; + } } diff --git a/src/styles/colors.scss b/src/styles/colors.scss index 588e0d1a..e10897b8 100644 --- a/src/styles/colors.scss +++ b/src/styles/colors.scss @@ -1,5 +1,5 @@ // $red: #ff3344; -$red: #ff6553; +$red: #ff3344; $yellow: #ffd60f; $dark_blue: #3c75ff; $blue: #3ca1ff; @@ -10,7 +10,7 @@ $orange: #ff7549; $grass: #41800d; $wisegreen: #007962; -$red_gradient: linear-gradient(165deg, $red, #ea057c 100%); +$red_gradient: linear-gradient(165deg, $orange -50%, $red 150%); $blue_gradient: linear-gradient(170deg, $green, $dark_blue); $green_gradient: linear-gradient( 170deg, From 16af90fd50d2a57cceb6894cf30a319100412e91 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Tue, 22 Oct 2019 17:58:37 +0700 Subject: [PATCH 64/99] fetching node liked --- src/redux/node/api.ts | 4 +++- src/redux/node/sagas.ts | 2 +- src/redux/types.ts | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/redux/node/api.ts b/src/redux/node/api.ts index b7c2e7cd..e8f6da65 100644 --- a/src/redux/node/api.ts +++ b/src/redux/node/api.ts @@ -28,11 +28,13 @@ export const getNodes = ({ export const getNode = ({ id, + access, }: { id: string | number; + access: string; }): Promise<IResultWithStatus<{ nodes: INode[] }>> => api - .get(API.NODE.GET_NODE(id)) + .get(API.NODE.GET_NODE(id), configWithToken(access)) .then(resultMiddleware) .catch(errorMiddleware); diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index 7200a9d8..2749d7fc 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -73,7 +73,7 @@ function* onNodeLoad({ id, node_type }: ReturnType<typeof nodeLoadNode>) { const { data: { node, error }, - } = yield call(getNode, { id }); + } = yield call(reqWrapper, getNode, { id }); yield put(nodeSetLoading(false)); diff --git a/src/redux/types.ts b/src/redux/types.ts index a849deab..cd9e592a 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -119,6 +119,7 @@ export interface INode { blocks: IBlock[]; thumbnail?: string; description?: string; + is_liked?: boolean; options: { flow: { From 948817e8fce3ebdceb89f977a67f2fc359bd815c Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 10:18:41 +0700 Subject: [PATCH 65/99] optimized node layout rerenders --- package-lock.json | 5624 ++++++++++---------- package.json | 1 + src/components/input/Button/index.tsx | 86 +- src/components/node/NodeComments/index.tsx | 6 +- src/components/node/NodePanel/index.tsx | 6 +- src/components/node/NodeTags/index.tsx | 6 +- src/containers/node/NodeLayout/index.tsx | 158 +- 7 files changed, 2954 insertions(+), 2933 deletions(-) diff --git a/package-lock.json b/package-lock.json index 480e97d9..ce268ac4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,16 +10,16 @@ "integrity": "sha512-tqrDyvPryBM6xjIyKKUwr3s8CzmmYidwgdswd7Uc/Cv0ogZcuS1TYQTLx/eWKP3UbJ6JxZAiYlBZabXm/rtRsQ==", "dev": true, "requires": { - "chokidar": "2.1.8", - "commander": "2.20.1", - "convert-source-map": "1.6.0", - "fs-readdir-recursive": "1.1.0", - "glob": "7.1.4", - "lodash": "4.17.15", - "mkdirp": "0.5.1", - "output-file-sync": "2.0.1", - "slash": "2.0.0", - "source-map": "0.5.7" + "chokidar": "^2.1.8", + "commander": "^2.8.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.13", + "mkdirp": "^0.5.1", + "output-file-sync": "^2.0.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" }, "dependencies": { "source-map": { @@ -35,7 +35,7 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "requires": { - "@babel/highlight": "7.5.0" + "@babel/highlight": "^7.0.0" } }, "@babel/generator": { @@ -44,10 +44,10 @@ "integrity": "sha512-hLhYbAb3pHwxjlijC4AQ7mqZdcoujiNaW7izCT04CIowHK8psN0IN8QjDv0iyFtycF5FowUOTwDloIheI25aMw==", "dev": true, "requires": { - "@babel/types": "7.6.3", - "jsesc": "2.5.2", - "lodash": "4.17.15", - "source-map": "0.6.1" + "@babel/types": "^7.6.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.6.1" }, "dependencies": { "@babel/types": { @@ -56,9 +56,9 @@ "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", "dev": true, "requires": { - "esutils": "2.0.3", - "lodash": "4.17.15", - "to-fast-properties": "2.0.0" + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } } } @@ -69,7 +69,7 @@ "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", "dev": true, "requires": { - "@babel/types": "7.5.5" + "@babel/types": "^7.0.0" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -78,8 +78,8 @@ "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "7.1.0", - "@babel/types": "7.5.5" + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-call-delegate": { @@ -88,9 +88,9 @@ "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "7.4.4", - "@babel/traverse": "7.6.3", - "@babel/types": "7.5.5" + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/helper-define-map": { @@ -99,9 +99,9 @@ "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/types": "7.5.5", - "lodash": "4.17.15" + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { @@ -110,8 +110,8 @@ "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", "dev": true, "requires": { - "@babel/traverse": "7.6.3", - "@babel/types": "7.5.5" + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-function-name": { @@ -120,9 +120,9 @@ "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "7.0.0", - "@babel/template": "7.6.0", - "@babel/types": "7.5.5" + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-get-function-arity": { @@ -131,7 +131,7 @@ "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, "requires": { - "@babel/types": "7.5.5" + "@babel/types": "^7.0.0" } }, "@babel/helper-hoist-variables": { @@ -140,7 +140,7 @@ "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", "dev": true, "requires": { - "@babel/types": "7.5.5" + "@babel/types": "^7.4.4" } }, "@babel/helper-member-expression-to-functions": { @@ -149,7 +149,7 @@ "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", "dev": true, "requires": { - "@babel/types": "7.5.5" + "@babel/types": "^7.5.5" } }, "@babel/helper-module-imports": { @@ -158,7 +158,7 @@ "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", "dev": true, "requires": { - "@babel/types": "7.5.5" + "@babel/types": "^7.0.0" } }, "@babel/helper-module-transforms": { @@ -167,12 +167,12 @@ "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", "dev": true, "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-simple-access": "7.1.0", - "@babel/helper-split-export-declaration": "7.4.4", - "@babel/template": "7.6.0", - "@babel/types": "7.5.5", - "lodash": "4.17.15" + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { @@ -181,7 +181,7 @@ "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", "dev": true, "requires": { - "@babel/types": "7.5.5" + "@babel/types": "^7.0.0" } }, "@babel/helper-plugin-utils": { @@ -196,7 +196,7 @@ "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", "dev": true, "requires": { - "lodash": "4.17.15" + "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { @@ -205,11 +205,11 @@ "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-wrap-function": "7.2.0", - "@babel/template": "7.6.0", - "@babel/traverse": "7.6.3", - "@babel/types": "7.5.5" + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-replace-supers": { @@ -218,10 +218,10 @@ "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "7.5.5", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/traverse": "7.6.3", - "@babel/types": "7.5.5" + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, "@babel/helper-simple-access": { @@ -230,8 +230,8 @@ "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", "dev": true, "requires": { - "@babel/template": "7.6.0", - "@babel/types": "7.5.5" + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-split-export-declaration": { @@ -240,7 +240,7 @@ "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, "requires": { - "@babel/types": "7.5.5" + "@babel/types": "^7.4.4" } }, "@babel/helper-wrap-function": { @@ -249,10 +249,10 @@ "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/template": "7.6.0", - "@babel/traverse": "7.6.3", - "@babel/types": "7.5.5" + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" } }, "@babel/highlight": { @@ -260,9 +260,9 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "requires": { - "chalk": "2.4.2", - "esutils": "2.0.3", - "js-tokens": "4.0.0" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { @@ -277,9 +277,9 @@ "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0", - "@babel/plugin-syntax-async-generators": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" } }, "@babel/plugin-proposal-dynamic-import": { @@ -288,8 +288,8 @@ "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-dynamic-import": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" } }, "@babel/plugin-proposal-json-strings": { @@ -298,8 +298,8 @@ "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-json-strings": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" } }, "@babel/plugin-proposal-object-rest-spread": { @@ -308,8 +308,8 @@ "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-object-rest-spread": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -318,8 +318,8 @@ "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "7.2.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" } }, "@babel/plugin-proposal-unicode-property-regex": { @@ -328,9 +328,9 @@ "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.5.5", - "regexpu-core": "4.6.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" } }, "@babel/plugin-syntax-async-generators": { @@ -339,7 +339,7 @@ "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-dynamic-import": { @@ -348,7 +348,7 @@ "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-json-strings": { @@ -357,7 +357,7 @@ "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-object-rest-spread": { @@ -366,7 +366,7 @@ "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-optional-catch-binding": { @@ -375,7 +375,7 @@ "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-arrow-functions": { @@ -384,7 +384,7 @@ "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-async-to-generator": { @@ -393,9 +393,9 @@ "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", "dev": true, "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0" + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" } }, "@babel/plugin-transform-block-scoped-functions": { @@ -404,7 +404,7 @@ "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-block-scoping": { @@ -413,8 +413,8 @@ "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "lodash": "4.17.15" + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { @@ -423,14 +423,14 @@ "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-define-map": "7.5.5", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.5.5", - "@babel/helper-split-export-declaration": "7.4.4", - "globals": "11.12.0" + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { @@ -439,7 +439,7 @@ "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-destructuring": { @@ -448,7 +448,7 @@ "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { @@ -457,9 +457,9 @@ "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.5.5", - "regexpu-core": "4.6.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" } }, "@babel/plugin-transform-duplicate-keys": { @@ -468,7 +468,7 @@ "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -477,8 +477,8 @@ "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-for-of": { @@ -487,7 +487,7 @@ "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-function-name": { @@ -496,8 +496,8 @@ "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-literals": { @@ -506,7 +506,7 @@ "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-member-expression-literals": { @@ -515,7 +515,7 @@ "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-amd": { @@ -524,9 +524,9 @@ "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "7.5.5", - "@babel/helper-plugin-utils": "7.0.0", - "babel-plugin-dynamic-import-node": "2.3.0" + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { @@ -535,10 +535,10 @@ "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "7.5.5", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-simple-access": "7.1.0", - "babel-plugin-dynamic-import-node": "2.3.0" + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { @@ -547,9 +547,9 @@ "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "7.4.4", - "@babel/helper-plugin-utils": "7.0.0", - "babel-plugin-dynamic-import-node": "2.3.0" + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { @@ -558,8 +558,8 @@ "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "7.5.5", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { @@ -568,7 +568,7 @@ "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==", "dev": true, "requires": { - "regexpu-core": "4.6.0" + "regexpu-core": "^4.6.0" } }, "@babel/plugin-transform-new-target": { @@ -577,7 +577,7 @@ "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-object-super": { @@ -586,8 +586,8 @@ "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.5.5" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" } }, "@babel/plugin-transform-parameters": { @@ -596,9 +596,9 @@ "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", "dev": true, "requires": { - "@babel/helper-call-delegate": "7.4.4", - "@babel/helper-get-function-arity": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-property-literals": { @@ -607,7 +607,7 @@ "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-regenerator": { @@ -616,7 +616,7 @@ "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", "dev": true, "requires": { - "regenerator-transform": "0.14.1" + "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { @@ -625,7 +625,7 @@ "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-shorthand-properties": { @@ -634,7 +634,7 @@ "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-spread": { @@ -643,7 +643,7 @@ "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-sticky-regex": { @@ -652,8 +652,8 @@ "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.5.5" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" } }, "@babel/plugin-transform-template-literals": { @@ -662,8 +662,8 @@ "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-typeof-symbol": { @@ -672,7 +672,7 @@ "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-unicode-regex": { @@ -681,9 +681,9 @@ "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.5.5", - "regexpu-core": "4.6.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" } }, "@babel/preset-env": { @@ -692,56 +692,56 @@ "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-proposal-async-generator-functions": "7.2.0", - "@babel/plugin-proposal-dynamic-import": "7.5.0", - "@babel/plugin-proposal-json-strings": "7.2.0", - "@babel/plugin-proposal-object-rest-spread": "7.6.2", - "@babel/plugin-proposal-optional-catch-binding": "7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "7.6.2", - "@babel/plugin-syntax-async-generators": "7.2.0", - "@babel/plugin-syntax-dynamic-import": "7.2.0", - "@babel/plugin-syntax-json-strings": "7.2.0", - "@babel/plugin-syntax-object-rest-spread": "7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "7.2.0", - "@babel/plugin-transform-arrow-functions": "7.2.0", - "@babel/plugin-transform-async-to-generator": "7.5.0", - "@babel/plugin-transform-block-scoped-functions": "7.2.0", - "@babel/plugin-transform-block-scoping": "7.6.3", - "@babel/plugin-transform-classes": "7.5.5", - "@babel/plugin-transform-computed-properties": "7.2.0", - "@babel/plugin-transform-destructuring": "7.6.0", - "@babel/plugin-transform-dotall-regex": "7.6.2", - "@babel/plugin-transform-duplicate-keys": "7.5.0", - "@babel/plugin-transform-exponentiation-operator": "7.2.0", - "@babel/plugin-transform-for-of": "7.4.4", - "@babel/plugin-transform-function-name": "7.4.4", - "@babel/plugin-transform-literals": "7.2.0", - "@babel/plugin-transform-member-expression-literals": "7.2.0", - "@babel/plugin-transform-modules-amd": "7.5.0", - "@babel/plugin-transform-modules-commonjs": "7.6.0", - "@babel/plugin-transform-modules-systemjs": "7.5.0", - "@babel/plugin-transform-modules-umd": "7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "7.6.3", - "@babel/plugin-transform-new-target": "7.4.4", - "@babel/plugin-transform-object-super": "7.5.5", - "@babel/plugin-transform-parameters": "7.4.4", - "@babel/plugin-transform-property-literals": "7.2.0", - "@babel/plugin-transform-regenerator": "7.4.5", - "@babel/plugin-transform-reserved-words": "7.2.0", - "@babel/plugin-transform-shorthand-properties": "7.2.0", - "@babel/plugin-transform-spread": "7.6.2", - "@babel/plugin-transform-sticky-regex": "7.2.0", - "@babel/plugin-transform-template-literals": "7.4.4", - "@babel/plugin-transform-typeof-symbol": "7.2.0", - "@babel/plugin-transform-unicode-regex": "7.6.2", - "@babel/types": "7.6.3", - "browserslist": "4.7.0", - "core-js-compat": "3.2.1", - "invariant": "2.2.4", - "js-levenshtein": "1.1.6", - "semver": "5.5.0" + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.3", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.6.2", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.3", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.6.2", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.6.2", + "@babel/types": "^7.6.3", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" }, "dependencies": { "@babel/types": { @@ -750,9 +750,9 @@ "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", "dev": true, "requires": { - "esutils": "2.0.3", - "lodash": "4.17.15", - "to-fast-properties": "2.0.0" + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } } } @@ -762,7 +762,7 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", "requires": { - "regenerator-runtime": "0.13.3" + "regenerator-runtime": "^0.13.2" }, "dependencies": { "regenerator-runtime": { @@ -778,9 +778,9 @@ "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", "dev": true, "requires": { - "@babel/code-frame": "7.5.5", - "@babel/parser": "7.6.3", - "@babel/types": "7.6.3" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" }, "dependencies": { "@babel/types": { @@ -789,9 +789,9 @@ "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", "dev": true, "requires": { - "esutils": "2.0.3", - "lodash": "4.17.15", - "to-fast-properties": "2.0.0" + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } } } @@ -802,15 +802,15 @@ "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", "dev": true, "requires": { - "@babel/code-frame": "7.5.5", - "@babel/generator": "7.6.3", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-split-export-declaration": "7.4.4", - "@babel/parser": "7.6.3", - "@babel/types": "7.6.3", - "debug": "4.1.1", - "globals": "11.12.0", - "lodash": "4.17.15" + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.3", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.3", + "@babel/types": "^7.6.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" }, "dependencies": { "@babel/types": { @@ -819,9 +819,9 @@ "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", "dev": true, "requires": { - "esutils": "2.0.3", - "lodash": "4.17.15", - "to-fast-properties": "2.0.0" + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, "debug": { @@ -830,7 +830,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -847,9 +847,9 @@ "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, "requires": { - "esutils": "2.0.3", - "lodash": "4.17.15", - "to-fast-properties": "2.0.0" + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, "@fimbul/bifrost": { @@ -857,10 +857,10 @@ "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.21.0.tgz", "integrity": "sha512-ou8VU+nTmOW1jeg+FT+sn+an/M0Xb9G16RucrfhjXGWv1Q97kCoM5CG9Qj7GYOSdu7km72k7nY83Eyr53Bkakg==", "requires": { - "@fimbul/ymir": "0.21.0", - "get-caller-file": "2.0.5", - "tslib": "1.10.0", - "tsutils": "3.17.1" + "@fimbul/ymir": "^0.21.0", + "get-caller-file": "^2.0.0", + "tslib": "^1.8.1", + "tsutils": "^3.5.0" }, "dependencies": { "get-caller-file": { @@ -875,9 +875,9 @@ "resolved": "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.21.0.tgz", "integrity": "sha512-T/y7WqPsm4n3zhT08EpB5sfdm2Kvw3gurAxr2Lr5dQeLi8ZsMlNT/Jby+ZmuuAAd1PnXYzKp+2SXgIkQIIMCUg==", "requires": { - "inversify": "5.0.1", - "reflect-metadata": "0.1.13", - "tslib": "1.10.0" + "inversify": "^5.0.0", + "reflect-metadata": "^0.1.12", + "tslib": "^1.8.1" } }, "@hot-loader/react-dom": { @@ -885,10 +885,10 @@ "resolved": "https://registry.npmjs.org/@hot-loader/react-dom/-/react-dom-16.10.2.tgz", "integrity": "sha512-vbrSDuZMoE1TXiDNAVCSAcIS6UX55Fa9KF0MD0wQgOaOIPZs/C6CtEDUcnNFEwTQ5ciIULcp+96lQlSuANNagA==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "prop-types": "15.7.2", - "scheduler": "0.16.2" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.16.2" } }, "@redux-saga/core": { @@ -896,14 +896,14 @@ "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.1.1.tgz", "integrity": "sha512-WKXfj2cYkP0eh74dE1ueMjVDoGJIkppXiMFgx0buVRkXENeZmRxIjM4lh9LEWWFqay7I/Qkw7+cMossa7xXoAQ==", "requires": { - "@babel/runtime": "7.6.3", - "@redux-saga/deferred": "1.1.0", - "@redux-saga/delay-p": "1.1.0", - "@redux-saga/is": "1.1.0", - "@redux-saga/symbols": "1.1.0", - "@redux-saga/types": "1.1.0", - "redux": "4.0.4", - "typescript-tuple": "2.2.1" + "@babel/runtime": "^7.6.0", + "@redux-saga/deferred": "^1.1.0", + "@redux-saga/delay-p": "^1.1.0", + "@redux-saga/is": "^1.1.0", + "@redux-saga/symbols": "^1.1.0", + "@redux-saga/types": "^1.1.0", + "redux": "^4.0.4", + "typescript-tuple": "^2.2.1" } }, "@redux-saga/deferred": { @@ -916,7 +916,7 @@ "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.1.0.tgz", "integrity": "sha512-BcRwXs20kKjgiYEwZARkpVoRIe/hHftW3iwPhdeW4/jPyR9gLv/vG8VsJMF5NDEch+/w/mJtdgSubq+wtOS47g==", "requires": { - "@redux-saga/symbols": "1.1.0" + "@redux-saga/symbols": "^1.1.0" } }, "@redux-saga/is": { @@ -924,8 +924,8 @@ "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.0.tgz", "integrity": "sha512-0uFXWGSvDCfNBdROHwEVixNhFbI3S+UGBQfcPXQiYL+CjIjyR3DTg2Z+NFH9xzP+H4Oh/yGtTHDhC0GxYp7HQQ==", "requires": { - "@redux-saga/symbols": "1.1.0", - "@redux-saga/types": "1.1.0" + "@redux-saga/symbols": "^1.1.0", + "@redux-saga/types": "^1.1.0" } }, "@redux-saga/symbols": { @@ -960,9 +960,9 @@ "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "dev": true, "requires": { - "@types/events": "3.0.0", - "@types/minimatch": "3.0.3", - "@types/node": "11.13.22" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" } }, "@types/history": { @@ -1008,7 +1008,7 @@ "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.26.33.tgz", "integrity": "sha512-sUCQmKfAWmlbb6PpFqvndbGgTf0bCcmHLJqMYw8ErVS0UoZTTiz952aFedJhV+JERiVH7poh33358c7p0AAN8A==", "requires": { - "ts-toolbelt": "4.8.16" + "ts-toolbelt": "^4.7.7" } }, "@types/react": { @@ -1016,8 +1016,8 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.23.tgz", "integrity": "sha512-abkEOIeljniUN9qB5onp++g0EY38h7atnDHxwKUFz1r3VH1+yG1OKi2sNPTyObL40goBmfKFpdii2lEzwLX1cA==", "requires": { - "@types/prop-types": "15.7.3", - "csstype": "2.6.7" + "@types/prop-types": "*", + "csstype": "^2.2.0" } }, "@types/react-router": { @@ -1026,8 +1026,8 @@ "integrity": "sha512-euC3SiwDg3NcjFdNmFL8uVuAFTpZJm0WMFUw+4eXMUnxa7M9RGFEG0szt0z+/Zgk4G2k9JBFhaEnY64RBiFmuw==", "dev": true, "requires": { - "@types/history": "4.7.3", - "@types/react": "16.8.23" + "@types/history": "*", + "@types/react": "*" } }, "@typescript-eslint/eslint-plugin": { @@ -1036,10 +1036,10 @@ "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", "requires": { "@typescript-eslint/experimental-utils": "1.13.0", - "eslint-utils": "1.4.2", - "functional-red-black-tree": "1.0.1", - "regexpp": "2.0.1", - "tsutils": "3.17.1" + "eslint-utils": "^1.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.7.0" } }, "@typescript-eslint/experimental-utils": { @@ -1047,9 +1047,9 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", "requires": { - "@types/json-schema": "7.0.3", + "@types/json-schema": "^7.0.3", "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-scope": "4.0.3" + "eslint-scope": "^4.0.0" } }, "@typescript-eslint/parser": { @@ -1057,10 +1057,10 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", "requires": { - "@types/eslint-visitor-keys": "1.0.0", + "@types/eslint-visitor-keys": "^1.0.0", "@typescript-eslint/experimental-utils": "1.13.0", "@typescript-eslint/typescript-estree": "1.13.0", - "eslint-visitor-keys": "1.1.0" + "eslint-visitor-keys": "^1.0.0" } }, "@typescript-eslint/typescript-estree": { @@ -1123,7 +1123,7 @@ "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", - "mamacro": "0.0.3" + "mamacro": "^0.0.3" } }, "@webassemblyjs/helper-wasm-bytecode": { @@ -1150,7 +1150,7 @@ "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { - "@xtuc/ieee754": "1.2.0" + "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { @@ -1271,7 +1271,7 @@ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "mime-types": "2.1.24", + "mime-types": "~2.1.24", "negotiator": "0.6.2" } }, @@ -1340,10 +1340,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-errors": { @@ -1396,7 +1396,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "anymatch": { @@ -1405,8 +1405,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" }, "dependencies": { "normalize-path": { @@ -1415,7 +1415,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } } } @@ -1430,8 +1430,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "arg": { @@ -1445,7 +1445,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "aria-query": { @@ -1454,7 +1454,7 @@ "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", "requires": { "ast-types-flow": "0.0.7", - "commander": "2.20.1" + "commander": "^2.11.0" } }, "arity-n": { @@ -1502,8 +1502,8 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.15.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "array-union": { @@ -1512,7 +1512,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -1538,7 +1538,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "~2.1.0" } }, "asn1.js": { @@ -1546,9 +1546,9 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -1556,7 +1556,7 @@ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "requires": { - "object-assign": "4.1.1", + "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -1601,7 +1601,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { - "lodash": "4.17.15" + "lodash": "^4.17.14" } }, "async-each": { @@ -1638,12 +1638,12 @@ "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000999", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" }, "dependencies": { "browserslist": { @@ -1652,8 +1652,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000999", - "electron-to-chromium": "1.3.280" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } } } @@ -1670,8 +1670,8 @@ "integrity": "sha512-aHzbT8Zr5Aaj0uQ6Zbf5552ojwTrfc3smOr8QW2ng9iAB6UxGRyYBg3jAvsezICzvLlmFk0g+n3i0px8SUS3Vw==", "dev": true, "requires": { - "autoresponsive-core": "1.0.1", - "exenv": "1.2.2" + "autoresponsive-core": "^1.0.1", + "exenv": "^1.2.0" } }, "awesome-typescript-loader": { @@ -1680,14 +1680,14 @@ "integrity": "sha512-slv66OAJB8orL+UUaTI3pKlLorwIvS4ARZzYR9iJJyGsEgOqueMfOMdKySWzZ73vIkEe3fcwFgsKMg4d8zyb1g==", "dev": true, "requires": { - "chalk": "2.4.2", - "enhanced-resolve": "4.1.1", - "loader-utils": "1.2.3", - "lodash": "4.17.15", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "source-map-support": "0.5.13", - "webpack-log": "1.2.0" + "chalk": "^2.4.1", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.1.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.3", + "webpack-log": "^1.2.0" }, "dependencies": { "enhanced-resolve": { @@ -1696,9 +1696,9 @@ "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "memory-fs": "0.5.0", - "tapable": "1.1.3" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" } }, "memory-fs": { @@ -1707,8 +1707,8 @@ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "tapable": { @@ -1735,7 +1735,7 @@ "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", "requires": { "follow-redirects": "1.5.10", - "is-buffer": "2.0.4" + "is-buffer": "^2.0.2" } }, "axobject-query": { @@ -1752,9 +1752,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.3", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "ansi-regex": { @@ -1775,11 +1775,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "js-tokens": { @@ -1794,7 +1794,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -1811,25 +1811,25 @@ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.6.0", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.15", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" }, "dependencies": { "debug": { @@ -1867,12 +1867,12 @@ "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", "dev": true, "requires": { - "@babel/code-frame": "7.5.5", - "@babel/parser": "7.6.3", - "@babel/traverse": "7.6.3", - "@babel/types": "7.5.5", - "eslint-visitor-keys": "1.1.0", - "resolve": "1.12.0" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" } }, "babel-generator": { @@ -1881,14 +1881,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.15", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" }, "dependencies": { "jsesc": { @@ -1911,9 +1911,9 @@ "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -1922,9 +1922,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-builder-react-jsx": { @@ -1933,9 +1933,9 @@ "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.3" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" } }, "babel-helper-call-delegate": { @@ -1944,10 +1944,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -1956,10 +1956,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.15" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -1968,9 +1968,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-explode-class": { @@ -1979,10 +1979,10 @@ "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", "dev": true, "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "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": { @@ -1991,11 +1991,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -2004,8 +2004,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -2014,8 +2014,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -2024,8 +2024,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -2034,9 +2034,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.15" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -2045,11 +2045,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -2058,12 +2058,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -2072,8 +2072,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-loader": { @@ -2082,9 +2082,9 @@ "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", "dev": true, "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.2.3", - "mkdirp": "0.5.1" + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" }, "dependencies": { "find-cache-dir": { @@ -2093,9 +2093,9 @@ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, "pkg-dir": { @@ -2104,7 +2104,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } } } @@ -2115,7 +2115,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -2124,7 +2124,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-dynamic-import-node": { @@ -2133,7 +2133,7 @@ "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", "dev": true, "requires": { - "object.assign": "4.1.0" + "object.assign": "^4.1.0" } }, "babel-plugin-lodash": { @@ -2142,11 +2142,11 @@ "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", "dev": true, "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/types": "7.5.5", - "glob": "7.1.4", - "lodash": "4.17.15", - "require-package-name": "2.0.1" + "@babel/helper-module-imports": "^7.0.0-beta.49", + "@babel/types": "^7.0.0-beta.49", + "glob": "^7.1.1", + "lodash": "^4.17.10", + "require-package-name": "^2.0.1" } }, "babel-plugin-syntax-async-functions": { @@ -2215,9 +2215,9 @@ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" + "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": { @@ -2226,9 +2226,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-properties": { @@ -2237,10 +2237,10 @@ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-decorators": { @@ -2249,11 +2249,11 @@ "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", "dev": true, "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "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-es2015-arrow-functions": { @@ -2262,7 +2262,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -2271,7 +2271,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -2280,11 +2280,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.15" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -2293,15 +2293,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -2310,8 +2310,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -2320,7 +2320,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -2329,8 +2329,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -2339,7 +2339,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -2348,9 +2348,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -2359,7 +2359,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -2368,9 +2368,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -2379,10 +2379,10 @@ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -2391,9 +2391,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -2402,9 +2402,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -2413,8 +2413,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -2423,12 +2423,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -2437,8 +2437,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -2447,7 +2447,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -2456,9 +2456,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -2467,7 +2467,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -2476,7 +2476,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -2485,9 +2485,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" }, "dependencies": { "jsesc": { @@ -2502,9 +2502,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -2519,7 +2519,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } } } @@ -2530,9 +2530,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -2541,8 +2541,8 @@ "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "dev": true, "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -2551,8 +2551,8 @@ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-react-display-name": { @@ -2561,7 +2561,7 @@ "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx": { @@ -2570,9 +2570,9 @@ "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "dev": true, "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-self": { @@ -2581,8 +2581,8 @@ "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-source": { @@ -2591,8 +2591,8 @@ "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-regenerator": { @@ -2601,7 +2601,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" }, "dependencies": { "regenerator-transform": { @@ -2610,9 +2610,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } } } @@ -2623,7 +2623,7 @@ "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-strict-mode": { @@ -2632,8 +2632,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-preset-env": { @@ -2642,36 +2642,36 @@ "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "3.2.8", - "invariant": "2.2.4", - "semver": "5.5.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" }, "dependencies": { "browserslist": { @@ -2680,8 +2680,8 @@ "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000999", - "electron-to-chromium": "1.3.280" + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" } } } @@ -2692,7 +2692,7 @@ "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "dev": true, "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" + "babel-plugin-transform-flow-strip-types": "^6.22.0" } }, "babel-preset-react": { @@ -2701,12 +2701,12 @@ "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "dev": true, "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" } }, "babel-preset-stage-2": { @@ -2715,10 +2715,10 @@ "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", "dev": true, "requires": { - "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-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": { @@ -2727,11 +2727,11 @@ "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", "dev": true, "requires": { - "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.26.0" + "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": { @@ -2740,13 +2740,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.6.9", - "home-or-tmp": "2.0.0", - "lodash": "4.17.15", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" }, "dependencies": { "source-map": { @@ -2761,7 +2761,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } } } @@ -2771,8 +2771,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.6.9", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -2781,11 +2781,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.15" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -2794,15 +2794,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.15" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" }, "dependencies": { "debug": { @@ -2828,10 +2828,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.3", - "lodash": "4.17.15", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" }, "dependencies": { "to-fast-properties": { @@ -2859,13 +2859,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.3.0", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.2", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -2874,7 +2874,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -2883,7 +2883,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2892,7 +2892,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2901,9 +2901,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -2929,7 +2929,7 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "big.js": { @@ -2948,7 +2948,7 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { - "inherits": "2.0.4" + "inherits": "~2.0.0" } }, "bluebird": { @@ -2969,15 +2969,15 @@ "dev": true, "requires": { "bytes": "3.1.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", + "depd": "~1.1.2", "http-errors": "1.7.2", "iconv-lite": "0.4.24", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.7.0", "raw-body": "2.4.0", - "type-is": "1.6.18" + "type-is": "~1.6.17" }, "dependencies": { "bytes": { @@ -3001,10 +3001,10 @@ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", - "statuses": "1.5.0", + "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } }, @@ -3034,12 +3034,12 @@ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "requires": { - "array-flatten": "2.1.2", - "deep-equal": "1.1.0", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" } }, "boolbase": { @@ -3053,7 +3053,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "bowser": { @@ -3066,7 +3066,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -3076,16 +3076,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -3094,7 +3094,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3109,12 +3109,12 @@ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -3122,9 +3122,9 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -3132,10 +3132,10 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -3143,8 +3143,8 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "4.11.8", - "randombytes": "2.1.0" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -3152,13 +3152,13 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.5.1", - "inherits": "2.0.4", - "parse-asn1": "5.1.5" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -3166,7 +3166,7 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { - "pako": "1.0.10" + "pako": "~1.0.5" } }, "browserslist": { @@ -3175,9 +3175,9 @@ "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000999", - "electron-to-chromium": "1.3.280", - "node-releases": "1.1.35" + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" } }, "buffer": { @@ -3185,9 +3185,9 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "1.3.1", - "ieee754": "1.1.13", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-from": { @@ -3229,19 +3229,19 @@ "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, "requires": { - "bluebird": "3.7.0", - "chownr": "1.1.3", - "glob": "7.1.4", - "graceful-fs": "4.2.2", - "lru-cache": "4.1.5", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.7.1", - "ssri": "5.3.0", - "unique-filename": "1.1.1", - "y18n": "4.0.0" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" }, "dependencies": { "y18n": { @@ -3258,15 +3258,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.3.0", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.1", - "to-object-path": "0.3.0", - "union-value": "1.0.1", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "caller-callsite": { @@ -3275,7 +3275,7 @@ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "callsites": "2.0.0" + "callsites": "^2.0.0" }, "dependencies": { "callsites": { @@ -3292,7 +3292,7 @@ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { - "caller-callsite": "2.0.0" + "caller-callsite": "^2.0.0" } }, "callsites": { @@ -3306,8 +3306,8 @@ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "dev": true, "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { @@ -3320,8 +3320,8 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "caniuse-api": { @@ -3330,10 +3330,10 @@ "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000999", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" }, "dependencies": { "browserslist": { @@ -3342,8 +3342,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000999", - "electron-to-chromium": "1.3.280" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } } } @@ -3375,9 +3375,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chardet": { @@ -3391,18 +3391,18 @@ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.3", - "braces": "2.3.2", - "fsevents": "1.2.9", - "glob-parent": "3.1.0", - "inherits": "2.0.4", - "is-binary-path": "1.0.1", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.2.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "chownr": { @@ -3417,7 +3417,7 @@ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "dev": true, "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "cipher-base": { @@ -3425,8 +3425,8 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "clap": { @@ -3435,7 +3435,7 @@ "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.1.3" }, "dependencies": { "ansi-regex": { @@ -3456,11 +3456,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -3469,7 +3469,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -3486,10 +3486,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -3498,13 +3498,14 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } }, "classie": { - "version": "github:eiriklv/classie#da1d3019904433872a8656d3cd69fc41d69c477a" + "version": "github:eiriklv/classie#da1d3019904433872a8656d3cd69fc41d69c477a", + "from": "github:eiriklv/classie" }, "classnames": { "version": "2.2.6", @@ -3517,7 +3518,7 @@ "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { - "source-map": "0.6.1" + "source-map": "~0.6.0" } }, "clean-webpack-plugin": { @@ -3525,7 +3526,7 @@ "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz", "integrity": "sha512-M1Li5yLHECcN2MahoreuODul5LkjohJGFxLPTjl3j1ttKrF5rgjZET1SJduuqxLAuT1gAPOdkhg03qcaaU1KeA==", "requires": { - "rimraf": "2.7.1" + "rimraf": "^2.6.1" } }, "cli-cursor": { @@ -3533,7 +3534,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -3546,9 +3547,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -3561,7 +3562,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -3569,9 +3570,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -3579,7 +3580,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -3594,9 +3595,9 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "requires": { - "is-plain-object": "2.0.4", - "kind-of": "6.0.2", - "shallow-clone": "3.0.1" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, "co": { @@ -3611,7 +3612,7 @@ "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.1.2" } }, "code-point-at": { @@ -3625,8 +3626,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color": { @@ -3635,9 +3636,9 @@ "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "dev": true, "requires": { - "clone": "1.0.4", - "color-convert": "1.9.3", - "color-string": "0.3.0" + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" }, "dependencies": { "clone": { @@ -3667,7 +3668,7 @@ "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.0.0" } }, "colormin": { @@ -3676,9 +3677,9 @@ "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "dev": true, "requires": { - "color": "0.11.4", + "color": "^0.11.0", "css-color-names": "0.0.4", - "has": "1.0.3" + "has": "^1.0.1" } }, "colors": { @@ -3692,7 +3693,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -3717,7 +3718,7 @@ "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", "dev": true, "requires": { - "arity-n": "1.0.4" + "arity-n": "^1.0.4" } }, "compressible": { @@ -3726,7 +3727,7 @@ "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": ">= 1.40.0 < 2" } }, "compression": { @@ -3735,13 +3736,13 @@ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "requires": { - "accepts": "1.3.7", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "2.0.17", + "compressible": "~2.0.16", "debug": "2.6.9", - "on-headers": "1.0.2", + "on-headers": "~1.0.2", "safe-buffer": "5.1.2", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "debug": { @@ -3777,10 +3778,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "config": { @@ -3788,7 +3789,7 @@ "resolved": "https://registry.npmjs.org/config/-/config-1.31.0.tgz", "integrity": "sha512-Ep/l9Rd1J9IPueztJfpbOqVzuKHQh4ZODMNt9xqTYdBBNRXbV4oTu34kCkkfdRVcDq0ohtpaeXGgb+c0LQxFRA==", "requires": { - "json5": "1.0.1" + "json5": "^1.0.1" } }, "confusing-browser-globals": { @@ -3807,9 +3808,9 @@ "resolved": "https://registry.npmjs.org/connected-react-router/-/connected-react-router-6.5.2.tgz", "integrity": "sha512-qzsLPZCofSI80fwy+HgxtEgSGS4ndYUUZAWaw1dqaOGPLKX/FVwIOEb7q+hjHdnZ4v5pKZcNv5GG4urjujIoyA==", "requires": { - "immutable": "3.8.2", - "prop-types": "15.7.2", - "seamless-immutable": "7.1.4" + "immutable": "^3.8.1", + "prop-types": "^15.7.2", + "seamless-immutable": "^7.1.3" } }, "console-browserify": { @@ -3817,7 +3818,7 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "console-control-strings": { @@ -3864,7 +3865,7 @@ "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.1" }, "dependencies": { "safe-buffer": { @@ -3893,12 +3894,12 @@ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.7.1", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, "copy-descriptor": { @@ -3918,8 +3919,8 @@ "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", "dev": true, "requires": { - "browserslist": "4.7.0", - "semver": "6.3.0" + "browserslist": "^4.6.6", + "semver": "^6.3.0" }, "dependencies": { "semver": { @@ -3941,10 +3942,10 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "import-fresh": "2.0.0", - "is-directory": "0.3.1", - "js-yaml": "3.13.1", - "parse-json": "4.0.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "dependencies": { "import-fresh": { @@ -3953,8 +3954,8 @@ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "caller-path": "2.0.0", - "resolve-from": "3.0.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, "parse-json": { @@ -3963,8 +3964,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "resolve-from": { @@ -3980,8 +3981,8 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { - "bn.js": "4.11.8", - "elliptic": "6.5.1" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -3989,11 +3990,11 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.4", - "md5.js": "1.3.5", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -4001,12 +4002,12 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.4", - "ripemd160": "2.0.2", - "safe-buffer": "5.2.0", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -4014,11 +4015,11 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.3.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cryptiles": { @@ -4027,7 +4028,7 @@ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "optional": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "crypto-browserify": { @@ -4035,17 +4036,17 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.4", - "pbkdf2": "3.0.17", - "public-encrypt": "4.0.3", - "randombytes": "2.1.0", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "css": { @@ -4054,10 +4055,10 @@ "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "dev": true, "requires": { - "inherits": "2.0.4", - "source-map": "0.6.1", - "source-map-resolve": "0.5.2", - "urix": "0.1.0" + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" } }, "css-color-names": { @@ -4072,8 +4073,8 @@ "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "requires": { - "postcss": "7.0.18", - "timsort": "0.3.0" + "postcss": "^7.0.1", + "timsort": "^0.3.0" }, "dependencies": { "postcss": { @@ -4082,9 +4083,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -4093,7 +4094,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4103,8 +4104,8 @@ "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", "requires": { - "hyphenate-style-name": "1.0.3", - "isobject": "3.0.1" + "hyphenate-style-name": "^1.0.2", + "isobject": "^3.0.1" } }, "css-loader": { @@ -4113,20 +4114,20 @@ "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.1", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.2.3", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.2.1", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.1", - "source-list-map": "2.0.1" + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": "^3.10.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.1.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" } }, "css-select": { @@ -4135,10 +4136,10 @@ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.3", + "boolbase": "~1.0.0", + "css-what": "2.1", "domutils": "1.5.1", - "nth-check": "1.0.2" + "nth-check": "~1.0.1" } }, "css-select-base-adapter": { @@ -4153,9 +4154,9 @@ "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", "dev": true, "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.2", - "regexpu-core": "1.0.0" + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" }, "dependencies": { "jsesc": { @@ -4170,9 +4171,9 @@ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -4187,7 +4188,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } } } @@ -4199,7 +4200,7 @@ "dev": true, "requires": { "mdn-data": "2.0.4", - "source-map": "0.5.7" + "source-map": "^0.5.3" }, "dependencies": { "source-map": { @@ -4234,38 +4235,38 @@ "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "dev": true, "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.3", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.3", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.1", - "postcss-zindex": "2.2.0" + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" } }, "cssnano-preset-default": { @@ -4274,36 +4275,36 @@ "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "dev": true, "requires": { - "css-declaration-sorter": "4.0.1", - "cssnano-util-raw-cache": "4.0.1", - "postcss": "7.0.18", - "postcss-calc": "7.0.1", - "postcss-colormin": "4.0.3", - "postcss-convert-values": "4.0.1", - "postcss-discard-comments": "4.0.2", - "postcss-discard-duplicates": "4.0.2", - "postcss-discard-empty": "4.0.1", - "postcss-discard-overridden": "4.0.1", - "postcss-merge-longhand": "4.0.11", - "postcss-merge-rules": "4.0.3", - "postcss-minify-font-values": "4.0.2", - "postcss-minify-gradients": "4.0.2", - "postcss-minify-params": "4.0.2", - "postcss-minify-selectors": "4.0.2", - "postcss-normalize-charset": "4.0.1", - "postcss-normalize-display-values": "4.0.2", - "postcss-normalize-positions": "4.0.2", - "postcss-normalize-repeat-style": "4.0.2", - "postcss-normalize-string": "4.0.2", - "postcss-normalize-timing-functions": "4.0.2", - "postcss-normalize-unicode": "4.0.1", - "postcss-normalize-url": "4.0.1", - "postcss-normalize-whitespace": "4.0.2", - "postcss-ordered-values": "4.1.2", - "postcss-reduce-initial": "4.0.3", - "postcss-reduce-transforms": "4.0.2", - "postcss-svgo": "4.0.2", - "postcss-unique-selectors": "4.0.1" + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" }, "dependencies": { "caniuse-api": { @@ -4312,10 +4313,10 @@ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "requires": { - "browserslist": "4.7.0", - "caniuse-lite": "1.0.30000999", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, "coa": { @@ -4324,9 +4325,9 @@ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, "requires": { - "@types/q": "1.5.2", - "chalk": "2.4.2", - "q": "1.5.1" + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" } }, "color": { @@ -4335,8 +4336,8 @@ "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "dev": true, "requires": { - "color-convert": "1.9.3", - "color-string": "1.5.3" + "color-convert": "^1.9.1", + "color-string": "^1.5.2" } }, "color-string": { @@ -4345,8 +4346,8 @@ "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", "dev": true, "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, "css-select": { @@ -4355,10 +4356,10 @@ "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", "dev": true, "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.3", - "domutils": "1.7.0", - "nth-check": "1.0.2" + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, "cssesc": { @@ -4382,8 +4383,8 @@ "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", "dev": true, "requires": { - "mdn-data": "1.1.4", - "source-map": "0.5.7" + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" } }, "source-map": { @@ -4400,8 +4401,8 @@ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { - "dom-serializer": "0.2.1", - "domelementtype": "1.3.1" + "dom-serializer": "0", + "domelementtype": "1" } }, "is-svg": { @@ -4410,7 +4411,7 @@ "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", "dev": true, "requires": { - "html-comment-regex": "1.1.2" + "html-comment-regex": "^1.1.0" } }, "mdn-data": { @@ -4431,9 +4432,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "postcss-calc": { @@ -4442,10 +4443,10 @@ "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", "dev": true, "requires": { - "css-unit-converter": "1.1.1", - "postcss": "7.0.18", - "postcss-selector-parser": "5.0.0", - "postcss-value-parser": "3.3.1" + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" } }, "postcss-colormin": { @@ -4454,11 +4455,11 @@ "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { - "browserslist": "4.7.0", - "color": "3.1.2", - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-convert-values": { @@ -4467,8 +4468,8 @@ "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-discard-comments": { @@ -4477,7 +4478,7 @@ "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-discard-duplicates": { @@ -4486,7 +4487,7 @@ "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-discard-empty": { @@ -4495,7 +4496,7 @@ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-discard-overridden": { @@ -4504,7 +4505,7 @@ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-merge-longhand": { @@ -4514,9 +4515,9 @@ "dev": true, "requires": { "css-color-names": "0.0.4", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1", - "stylehacks": "4.0.3" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" } }, "postcss-merge-rules": { @@ -4525,12 +4526,12 @@ "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { - "browserslist": "4.7.0", - "caniuse-api": "3.0.0", - "cssnano-util-same-parent": "4.0.1", - "postcss": "7.0.18", - "postcss-selector-parser": "3.1.1", - "vendors": "1.0.3" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" }, "dependencies": { "postcss-selector-parser": { @@ -4539,9 +4540,9 @@ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "dev": true, "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } @@ -4552,8 +4553,8 @@ "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-minify-gradients": { @@ -4562,10 +4563,10 @@ "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { - "cssnano-util-get-arguments": "4.0.0", - "is-color-stop": "1.1.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-minify-params": { @@ -4574,12 +4575,12 @@ "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "browserslist": "4.7.0", - "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" } }, "postcss-minify-selectors": { @@ -4588,10 +4589,10 @@ "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-selector-parser": "3.1.1" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { "postcss-selector-parser": { @@ -4600,9 +4601,9 @@ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "dev": true, "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } @@ -4613,7 +4614,7 @@ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-normalize-url": { @@ -4622,10 +4623,10 @@ "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "dev": true, "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "3.3.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-ordered-values": { @@ -4634,9 +4635,9 @@ "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "requires": { - "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-reduce-initial": { @@ -4645,10 +4646,10 @@ "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "requires": { - "browserslist": "4.7.0", - "caniuse-api": "3.0.0", - "has": "1.0.3", - "postcss": "7.0.18" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" } }, "postcss-reduce-transforms": { @@ -4657,10 +4658,10 @@ "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "dev": true, "requires": { - "cssnano-util-get-match": "4.0.0", - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-selector-parser": { @@ -4669,9 +4670,9 @@ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "cssesc": "2.0.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { @@ -4680,10 +4681,10 @@ "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "dev": true, "requires": { - "is-svg": "3.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1", - "svgo": "1.3.0" + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" } }, "postcss-unique-selectors": { @@ -4692,9 +4693,9 @@ "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "7.0.18", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" } }, "supports-color": { @@ -4703,7 +4704,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "svgo": { @@ -4712,19 +4713,19 @@ "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", "dev": true, "requires": { - "chalk": "2.4.2", - "coa": "2.0.2", - "css-select": "2.0.2", - "css-select-base-adapter": "0.1.1", + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", "css-tree": "1.0.0-alpha.33", - "csso": "3.5.1", - "js-yaml": "3.13.1", - "mkdirp": "0.5.1", - "object.values": "1.1.0", - "sax": "1.2.4", - "stable": "0.1.8", - "unquote": "1.1.1", - "util.promisify": "1.0.0" + "csso": "^3.5.1", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" } } } @@ -4747,7 +4748,7 @@ "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" }, "dependencies": { "postcss": { @@ -4756,9 +4757,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -4767,7 +4768,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4784,8 +4785,8 @@ "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "dev": true, "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" + "clap": "^1.0.9", + "source-map": "^0.5.3" }, "dependencies": { "source-map": { @@ -4806,7 +4807,7 @@ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "cyclist": { @@ -4821,8 +4822,8 @@ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "es5-ext": "0.10.51", - "type": "1.2.0" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, "damerau-levenshtein": { @@ -4835,7 +4836,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "date-fns": { @@ -4873,12 +4874,12 @@ "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", "dev": true, "requires": { - "is-arguments": "1.0.4", - "is-date-object": "1.0.1", - "is-regex": "1.0.4", - "object-is": "1.0.1", - "object-keys": "1.1.1", - "regexp.prototype.flags": "1.2.0" + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" } }, "deep-is": { @@ -4892,8 +4893,8 @@ "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dev": true, "requires": { - "execa": "1.0.0", - "ip-regex": "2.1.0" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" } }, "define-properties": { @@ -4901,7 +4902,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { - "object-keys": "1.1.1" + "object-keys": "^1.0.12" } }, "define-property": { @@ -4910,8 +4911,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -4920,7 +4921,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -4929,7 +4930,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -4938,9 +4939,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -4957,13 +4958,13 @@ "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dev": true, "requires": { - "@types/glob": "7.1.1", - "globby": "6.1.0", - "is-path-cwd": "2.2.0", - "is-path-in-cwd": "2.1.0", - "p-map": "2.1.0", - "pify": "4.0.1", - "rimraf": "2.7.1" + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" }, "dependencies": { "pify": { @@ -4994,12 +4995,13 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "desandro-get-style-property": { - "version": "github:eiriklv/get-style-property#a5a74ad48d96c7d5ddcf652e9fa5d4283af37823" + "version": "github:eiriklv/get-style-property#a5a74ad48d96c7d5ddcf652e9fa5d4283af37823", + "from": "github:eiriklv/get-style-property" }, "destroy": { "version": "1.0.4", @@ -5019,7 +5021,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detect-node": { @@ -5038,9 +5040,9 @@ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.1.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dns-equal": { @@ -5055,8 +5057,8 @@ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { - "ip": "1.1.5", - "safe-buffer": "5.2.0" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, "dns-txt": { @@ -5065,17 +5067,19 @@ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { - "buffer-indexof": "1.1.1" + "buffer-indexof": "^1.0.0" } }, "doc-ready": { "version": "github:eiriklv/doc-ready#31c2481101af5dab33311fea4c7fc684b58fa8ad", + "from": "github:eiriklv/doc-ready", "requires": { "eventie": "github:eiriklv/eventie#c9d290c6aa57712257dc8c0b6bf21c9374190a3c" }, "dependencies": { "eventie": { - "version": "github:eiriklv/eventie#c9d290c6aa57712257dc8c0b6bf21c9374190a3c" + "version": "github:eiriklv/eventie#c9d290c6aa57712257dc8c0b6bf21c9374190a3c", + "from": "github:eiriklv/eventie" } } }, @@ -5084,7 +5088,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "requires": { - "esutils": "2.0.3" + "esutils": "^2.0.2" } }, "dom-converter": { @@ -5093,7 +5097,7 @@ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { - "utila": "0.4.0" + "utila": "~0.4" } }, "dom-css": { @@ -5111,7 +5115,7 @@ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", "requires": { - "@babel/runtime": "7.6.3" + "@babel/runtime": "^7.1.2" } }, "dom-serializer": { @@ -5120,8 +5124,8 @@ "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", "dev": true, "requires": { - "domelementtype": "2.0.1", - "entities": "2.0.0" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, "dependencies": { "domelementtype": { @@ -5154,7 +5158,7 @@ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "domelementtype": "1.3.1" + "domelementtype": "1" } }, "domutils": { @@ -5163,8 +5167,8 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0.2.1", - "domelementtype": "1.3.1" + "dom-serializer": "0", + "domelementtype": "1" } }, "dot-prop": { @@ -5173,7 +5177,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "dotenv": { @@ -5186,7 +5190,7 @@ "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-1.0.2.tgz", "integrity": "sha512-iXFvHtXl/hZPiFj++1hBg4lbKwGM+t/GlvELDnRtOFdjXyWP7mubkVr+eZGWG62kdsbulXAef6v/j6kiWc/xGA==", "requires": { - "dotenv": "6.2.0" + "dotenv": "^6.2.0" }, "dependencies": { "dotenv": { @@ -5201,7 +5205,7 @@ "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.7.0.tgz", "integrity": "sha512-wwNtOBW/6gLQSkb8p43y0Wts970A3xtNiG/mpwj9MLUhtPCQG6i+/DSXXoNN7fbPCU/vQ7JjwGmgOeGZSSZnsw==", "requires": { - "dotenv-defaults": "1.0.2" + "dotenv-defaults": "^1.0.2" } }, "duplexify": { @@ -5210,10 +5214,10 @@ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "end-of-stream": "1.4.4", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "easy-css-transform-builder": { @@ -5221,7 +5225,7 @@ "resolved": "https://registry.npmjs.org/easy-css-transform-builder/-/easy-css-transform-builder-0.0.2.tgz", "integrity": "sha1-pUFmenkZ4X9n2CsR08tV/dVDMCI=", "requires": { - "invariant": "2.2.4" + "invariant": "^2.2.2" } }, "ecc-jsbn": { @@ -5229,8 +5233,8 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ee-first": { @@ -5250,7 +5254,7 @@ "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.1.15.tgz", "integrity": "sha512-16/5avDegXlUxytGgaumhjyQoM6hpp5j3+L79sYq5hlXfTNRy5WMMuTVWkZU3egp/CokCmTmvf18P3KeB57Iog==", "requires": { - "batch-processor": "1.0.0" + "batch-processor": "^1.0.0" } }, "elliptic": { @@ -5258,13 +5262,13 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.7", - "hmac-drbg": "1.0.1", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emoji-regex": { @@ -5289,7 +5293,7 @@ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "enhanced-resolve": { @@ -5297,9 +5301,9 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "requires": { - "graceful-fs": "4.2.2", - "memory-fs": "0.2.0", - "tapable": "0.1.10" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" } }, "entities": { @@ -5313,7 +5317,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { @@ -5321,7 +5325,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -5329,16 +5333,16 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", "requires": { - "es-to-primitive": "1.2.0", - "function-bind": "1.1.1", - "has": "1.0.3", - "has-symbols": "1.0.0", - "is-callable": "1.1.4", - "is-regex": "1.0.4", - "object-inspect": "1.6.0", - "object-keys": "1.1.1", - "string.prototype.trimleft": "2.1.0", - "string.prototype.trimright": "2.1.0" + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" } }, "es-to-primitive": { @@ -5346,9 +5350,9 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.2" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es5-ext": { @@ -5357,9 +5361,9 @@ "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.2", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" } }, "es6-iterator": { @@ -5368,9 +5372,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51", - "es6-symbol": "3.1.2" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-symbol": { @@ -5379,8 +5383,8 @@ "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51" + "d": "^1.0.1", + "es5-ext": "^0.10.51" } }, "escape-html": { @@ -5399,42 +5403,42 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", "requires": { - "@babel/code-frame": "7.5.5", - "ajv": "6.10.2", - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "debug": "4.1.1", - "doctrine": "3.0.0", - "eslint-scope": "4.0.3", - "eslint-utils": "1.4.2", - "eslint-visitor-keys": "1.1.0", - "espree": "5.0.1", - "esquery": "1.0.1", - "esutils": "2.0.3", - "file-entry-cache": "5.0.1", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.4", - "globals": "11.12.0", - "ignore": "4.0.6", - "import-fresh": "3.1.0", - "imurmurhash": "0.1.4", - "inquirer": "6.5.2", - "js-yaml": "3.13.1", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.15", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "progress": "2.0.3", - "regexpp": "2.0.1", - "semver": "5.7.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "5.4.6", - "text-table": "0.2.0" + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" }, "dependencies": { "debug": { @@ -5442,7 +5446,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -5462,9 +5466,9 @@ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-17.1.1.tgz", "integrity": "sha512-xCu//8a/aWqagKljt+1/qAM62BYZeNq04HmdevG5yUGWpja0I/xhqd6GdLRch5oetEGFiJAnvtGuTEAese53Qg==", "requires": { - "eslint-config-airbnb-base": "13.2.0", - "object.assign": "4.1.0", - "object.entries": "1.1.0" + "eslint-config-airbnb-base": "^13.2.0", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" } }, "eslint-config-airbnb-base": { @@ -5472,9 +5476,9 @@ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz", "integrity": "sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w==", "requires": { - "confusing-browser-globals": "1.0.9", - "object.assign": "4.1.0", - "object.entries": "1.1.0" + "confusing-browser-globals": "^1.0.5", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0" } }, "eslint-config-prettier": { @@ -5482,7 +5486,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.4.0.tgz", "integrity": "sha512-YrKucoFdc7SEko5Sxe4r6ixqXPDP1tunGw91POeZTTRKItf/AMFYt/YLEQtZMkR2LVpAVhcAcZgcWpm1oGPW7w==", "requires": { - "get-stdin": "6.0.0" + "get-stdin": "^6.0.0" } }, "eslint-import-resolver-babel-module": { @@ -5490,8 +5494,8 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-babel-module/-/eslint-import-resolver-babel-module-4.0.0.tgz", "integrity": "sha512-aPj0+pG0H3HCaMD9eRDYEzPdMyKrLE2oNhAzTXd2w86ZBe3s7drSrrPwVTfzO1CBp13FGk8S84oRmZHZvSo0mA==", "requires": { - "pkg-up": "2.0.0", - "resolve": "1.12.0" + "pkg-up": "^2.0.0", + "resolve": "^1.4.0" } }, "eslint-import-resolver-node": { @@ -5499,8 +5503,8 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "requires": { - "debug": "2.6.9", - "resolve": "1.12.0" + "debug": "^2.6.9", + "resolve": "^1.5.0" }, "dependencies": { "debug": { @@ -5518,9 +5522,9 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-1.1.1.tgz", "integrity": "sha512-jqSfumQ+H5y3FUJ6NjRkbOQSUOlbBucGTN3ELymOtcDBbPjVdm/luvJuCfCaIXGh8sEF26ma1qVdtDgl9ndhUg==", "requires": { - "debug": "4.1.1", - "resolve": "1.12.0", - "tsconfig-paths": "3.9.0" + "debug": "^4.0.1", + "resolve": "^1.4.0", + "tsconfig-paths": "^3.6.0" }, "dependencies": { "debug": { @@ -5528,7 +5532,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -5543,17 +5547,17 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.9.0.tgz", "integrity": "sha1-IxzhV4rVEk2leZ8Cm9M9KBN2I+M=", "requires": { - "array-find": "1.0.0", - "debug": "2.6.9", - "enhanced-resolve": "0.9.1", - "find-root": "1.1.0", - "has": "1.0.3", - "interpret": "1.2.0", - "is-absolute": "0.2.6", - "lodash.get": "4.4.2", - "node-libs-browser": "2.2.1", - "resolve": "1.12.0", - "semver": "5.5.0" + "array-find": "^1.0.0", + "debug": "^2.6.8", + "enhanced-resolve": "~0.9.0", + "find-root": "^1.1.0", + "has": "^1.0.1", + "interpret": "^1.0.0", + "is-absolute": "^0.2.3", + "lodash.get": "^4.4.2", + "node-libs-browser": "^1.0.0 || ^2.0.0", + "resolve": "^1.4.0", + "semver": "^5.3.0" }, "dependencies": { "debug": { @@ -5571,11 +5575,11 @@ "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", "requires": { - "loader-fs-cache": "1.0.2", - "loader-utils": "1.2.3", - "object-assign": "4.1.1", - "object-hash": "1.3.1", - "rimraf": "2.7.1" + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" } }, "eslint-module-utils": { @@ -5583,8 +5587,8 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "requires": { - "debug": "2.6.9", - "pkg-dir": "2.0.0" + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { @@ -5600,7 +5604,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } } } @@ -5610,7 +5614,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.0.tgz", "integrity": "sha512-HPuNzSPE75O+SnxHIafbW5QB45r2w78fxqwK3HmjqIUoPfPzVrq6rD+CINU3yzoDSzEhUkX07VUphbF73Lth/w==", "requires": { - "eslint-rule-composer": "0.3.0" + "eslint-rule-composer": "^0.3.0" } }, "eslint-plugin-import": { @@ -5618,17 +5622,17 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", "requires": { - "array-includes": "3.0.3", - "contains-path": "0.1.0", - "debug": "2.6.9", + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.4.1", - "has": "1.0.3", - "minimatch": "3.0.4", - "object.values": "1.1.0", - "read-pkg-up": "2.0.0", - "resolve": "1.12.0" + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" }, "dependencies": { "debug": { @@ -5644,8 +5648,8 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { - "esutils": "2.0.3", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } } } @@ -5655,15 +5659,15 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", "requires": { - "@babel/runtime": "7.6.3", - "aria-query": "3.0.0", - "array-includes": "3.0.3", - "ast-types-flow": "0.0.7", - "axobject-query": "2.0.2", - "damerau-levenshtein": "1.0.5", - "emoji-regex": "7.0.3", - "has": "1.0.3", - "jsx-ast-utils": "2.2.1" + "@babel/runtime": "^7.4.5", + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1" } }, "eslint-plugin-prettier": { @@ -5671,7 +5675,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.1.tgz", "integrity": "sha512-A+TZuHZ0KU0cnn56/9mfR7/KjUJ9QNVXUhwvRFSR7PGPe0zQR6PTkmyqg1AtUUEOzTqeRsUwyKFh0oVZKVCrtA==", "requires": { - "prettier-linter-helpers": "1.0.0" + "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-react": { @@ -5679,15 +5683,15 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==", "requires": { - "array-includes": "3.0.3", - "doctrine": "2.1.0", - "has": "1.0.3", - "jsx-ast-utils": "2.2.1", - "object.entries": "1.1.0", - "object.fromentries": "2.0.1", - "object.values": "1.1.0", - "prop-types": "15.7.2", - "resolve": "1.12.0" + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.12.0" }, "dependencies": { "doctrine": { @@ -5695,7 +5699,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { - "esutils": "2.0.3" + "esutils": "^2.0.2" } } } @@ -5715,8 +5719,8 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.3.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-utils": { @@ -5724,7 +5728,7 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", "requires": { - "eslint-visitor-keys": "1.1.0" + "eslint-visitor-keys": "^1.0.0" } }, "eslint-visitor-keys": { @@ -5737,9 +5741,9 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "requires": { - "acorn": "6.3.0", - "acorn-jsx": "5.0.2", - "eslint-visitor-keys": "1.1.0" + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { @@ -5752,7 +5756,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "requires": { - "estraverse": "4.3.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -5760,7 +5764,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "estraverse": "4.3.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -5785,7 +5789,8 @@ "integrity": "sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q==" }, "eventemitter": { - "version": "github:braznaavtrav/EventEmitter#7169056a2f8b3b55d78ab1b85bad39277e7e88b2" + "version": "github:braznaavtrav/EventEmitter#7169056a2f8b3b55d78ab1b85bad39277e7e88b2", + "from": "github:braznaavtrav/EventEmitter" }, "eventemitter3": { "version": "4.0.0", @@ -5809,7 +5814,7 @@ "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "dev": true, "requires": { - "original": "1.0.2" + "original": "^1.0.0" } }, "evp_bytestokey": { @@ -5817,8 +5822,8 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { - "md5.js": "1.3.5", - "safe-buffer": "5.2.0" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -5827,13 +5832,13 @@ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "6.0.5", - "get-stream": "4.1.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "exenv": { @@ -5847,13 +5852,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "debug": { @@ -5871,7 +5876,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -5880,7 +5885,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -5891,7 +5896,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.3" + "homedir-polyfill": "^1.0.1" } }, "express": { @@ -5900,36 +5905,36 @@ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "dev": true, "requires": { - "accepts": "1.3.7", + "accepts": "~1.3.7", "array-flatten": "1.1.1", "body-parser": "1.19.0", "content-disposition": "0.5.3", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.2", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.3", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.5", + "proxy-addr": "~2.0.5", "qs": "6.7.0", - "range-parser": "1.2.1", + "range-parser": "~1.2.1", "safe-buffer": "5.1.2", "send": "0.17.1", "serve-static": "1.14.1", "setprototypeof": "1.1.1", - "statuses": "1.5.0", - "type-is": "1.6.18", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "array-flatten": { @@ -5984,8 +5989,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -5994,7 +5999,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -6004,9 +6009,9 @@ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "requires": { - "chardet": "0.7.0", - "iconv-lite": "0.4.24", - "tmp": "0.0.33" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" } }, "extglob": { @@ -6015,14 +6020,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -6031,7 +6036,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -6040,7 +6045,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -6049,7 +6054,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -6058,7 +6063,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -6067,9 +6072,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -6111,7 +6116,7 @@ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "websocket-driver": "0.7.3" + "websocket-driver": ">=0.5.1" } }, "figgy-pudding": { @@ -6125,7 +6130,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -6133,7 +6138,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "requires": { - "flat-cache": "2.0.1" + "flat-cache": "^2.0.1" } }, "file-loader": { @@ -6142,8 +6147,8 @@ "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "dev": true, "requires": { - "loader-utils": "1.2.3", - "schema-utils": "0.4.7" + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" } }, "fill-range": { @@ -6152,10 +6157,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -6164,7 +6169,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6176,12 +6181,12 @@ "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.3", - "statuses": "1.5.0", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "dependencies": { "debug": { @@ -6200,9 +6205,9 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" } }, "find-root": { @@ -6215,7 +6220,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "findup-sync": { @@ -6224,10 +6229,10 @@ "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { - "detect-file": "1.0.0", - "is-glob": "4.0.1", - "micromatch": "3.1.10", - "resolve-dir": "1.0.1" + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" } }, "flat-cache": { @@ -6235,7 +6240,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "requires": { - "flatted": "2.0.1", + "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" }, @@ -6245,7 +6250,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { - "glob": "7.1.4" + "glob": "^7.1.3" } } } @@ -6272,8 +6277,8 @@ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "follow-redirects": { @@ -6281,7 +6286,7 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", "requires": { - "debug": "3.1.0" + "debug": "=3.1.0" } }, "for-in": { @@ -6300,9 +6305,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.8", - "mime-types": "2.1.24" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "forwarded": { @@ -6317,7 +6322,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fresh": { @@ -6332,8 +6337,8 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, "fs-readdir-recursive": { @@ -6348,10 +6353,10 @@ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, "fs.realpath": { @@ -6366,8 +6371,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.14.0", - "node-pre-gyp": "0.12.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -6393,8 +6398,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { @@ -6407,7 +6412,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -6444,7 +6449,7 @@ "dev": true, "optional": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } }, "deep-extend": { @@ -6471,7 +6476,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.3.5" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -6486,14 +6491,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { @@ -6502,12 +6507,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -6522,7 +6527,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -6531,7 +6536,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -6540,8 +6545,8 @@ "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -6560,7 +6565,7 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -6574,7 +6579,7 @@ "bundled": true, "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -6587,8 +6592,8 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.3" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, "minizlib": { @@ -6597,7 +6602,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.3.5" + "minipass": "^2.2.1" } }, "mkdirp": { @@ -6620,9 +6625,9 @@ "dev": true, "optional": true, "requires": { - "debug": "4.1.1", - "iconv-lite": "0.4.24", - "sax": "1.2.4" + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { @@ -6631,16 +6636,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.3.0", - "nopt": "4.0.1", - "npm-packlist": "1.4.1", - "npmlog": "4.1.2", - "rc": "1.2.8", - "rimraf": "2.6.3", - "semver": "5.7.0", - "tar": "4.4.8" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -6649,8 +6654,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { @@ -6665,8 +6670,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.6" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -6675,10 +6680,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -6697,7 +6702,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -6718,8 +6723,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -6740,10 +6745,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -6760,13 +6765,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -6775,7 +6780,7 @@ "dev": true, "optional": true, "requires": { - "glob": "7.1.3" + "glob": "^7.1.3" } }, "safe-buffer": { @@ -6818,9 +6823,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -6829,7 +6834,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -6837,7 +6842,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -6852,13 +6857,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "1.1.1", - "fs-minipass": "1.2.5", - "minipass": "2.3.5", - "minizlib": "1.2.1", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.0.3" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" } }, "util-deprecate": { @@ -6873,7 +6878,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -6893,10 +6898,10 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", "requires": { - "graceful-fs": "4.2.2", - "inherits": "2.0.4", - "mkdirp": "0.5.1", - "rimraf": "2.7.1" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "function-bind": { @@ -6914,14 +6919,14 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" }, "dependencies": { "ansi-regex": { @@ -6934,7 +6939,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -6942,9 +6947,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -6952,7 +6957,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -6962,7 +6967,7 @@ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "requires": { - "globule": "1.2.1" + "globule": "^1.0.0" } }, "get-caller-file": { @@ -6972,6 +6977,7 @@ }, "get-size": { "version": "github:eiriklv/get-size#c1ebd019815fc6247c094c17a41b61d0e8191b08", + "from": "github:eiriklv/get-size", "requires": { "desandro-get-style-property": "github:eiriklv/get-style-property#a5a74ad48d96c7d5ddcf652e9fa5d4283af37823" } @@ -6987,7 +6993,7 @@ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "pump": "3.0.0" + "pump": "^3.0.0" }, "dependencies": { "pump": { @@ -6996,8 +7002,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "1.4.4", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -7013,7 +7019,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -7021,12 +7027,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-parent": { @@ -7035,8 +7041,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -7045,7 +7051,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -7055,8 +7061,8 @@ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "requires": { - "min-document": "2.19.0", - "process": "0.11.10" + "min-document": "^2.19.0", + "process": "^0.11.10" } }, "global-modules": { @@ -7065,7 +7071,7 @@ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "requires": { - "global-prefix": "3.0.0" + "global-prefix": "^3.0.0" }, "dependencies": { "global-prefix": { @@ -7074,9 +7080,9 @@ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, "requires": { - "ini": "1.3.5", - "kind-of": "6.0.2", - "which": "1.3.1" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" } } } @@ -7087,11 +7093,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.3", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.1" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" }, "dependencies": { "is-windows": { @@ -7113,11 +7119,11 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "1.0.2", - "glob": "7.1.4", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "globule": { @@ -7125,9 +7131,9 @@ "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", "requires": { - "glob": "7.1.4", - "lodash": "4.17.15", - "minimatch": "3.0.4" + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" } }, "graceful-fs": { @@ -7151,8 +7157,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "requires": { - "ajv": "6.10.2", - "har-schema": "2.0.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, "harmony-reflect": { @@ -7166,7 +7172,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -7174,7 +7180,7 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -7205,9 +7211,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -7216,8 +7222,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-buffer": { @@ -7232,7 +7238,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7242,8 +7248,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -7251,8 +7257,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "hawk": { @@ -7261,10 +7267,10 @@ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "he": { @@ -7284,12 +7290,12 @@ "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "requires": { - "@babel/runtime": "7.6.3", - "loose-envify": "1.4.0", - "resolve-pathname": "3.0.0", - "tiny-invariant": "1.0.6", - "tiny-warning": "1.0.3", - "value-equal": "1.0.1" + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" } }, "hmac-drbg": { @@ -7297,9 +7303,9 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "1.1.7", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -7312,7 +7318,7 @@ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", "requires": { - "react-is": "16.10.2" + "react-is": "^16.7.0" } }, "home-or-tmp": { @@ -7321,8 +7327,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "homedir-polyfill": { @@ -7331,7 +7337,7 @@ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -7345,10 +7351,10 @@ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, "requires": { - "inherits": "2.0.4", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "wbuf": "1.7.3" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, "hsl-regex": { @@ -7381,13 +7387,13 @@ "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "dev": true, "requires": { - "camel-case": "3.0.0", - "clean-css": "4.2.1", - "commander": "2.17.1", - "he": "1.2.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.4.10" + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" }, "dependencies": { "commander": { @@ -7404,12 +7410,12 @@ "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", "dev": true, "requires": { - "html-minifier": "3.5.21", - "loader-utils": "0.2.17", - "lodash": "4.17.15", - "pretty-error": "2.1.1", - "tapable": "1.1.3", - "toposort": "1.0.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", "util.promisify": "1.0.0" }, "dependencies": { @@ -7431,10 +7437,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } }, "tapable": { @@ -7451,12 +7457,12 @@ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "domelementtype": "1.3.1", - "domhandler": "2.4.2", - "domutils": "1.5.1", - "entities": "1.1.2", - "inherits": "2.0.4", - "readable-stream": "3.4.0" + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" }, "dependencies": { "entities": { @@ -7471,9 +7477,9 @@ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, "requires": { - "inherits": "2.0.4", - "string_decoder": "1.3.0", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } @@ -7489,10 +7495,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "statuses": ">= 1.4.0 < 2" }, "dependencies": { "inherits": { @@ -7514,9 +7520,9 @@ "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", "dev": true, "requires": { - "eventemitter3": "4.0.0", - "follow-redirects": "1.5.10", - "requires-port": "1.0.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, "http-proxy-middleware": { @@ -7525,10 +7531,10 @@ "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { - "http-proxy": "1.18.0", - "is-glob": "4.0.1", - "lodash": "4.17.15", - "micromatch": "3.1.10" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" } }, "http-signature": { @@ -7536,9 +7542,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.16.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -7556,7 +7562,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "icss-replace-symbols": { @@ -7571,7 +7577,7 @@ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "dev": true, "requires": { - "postcss": "6.0.23" + "postcss": "^6.0.1" }, "dependencies": { "postcss": { @@ -7580,9 +7586,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } } } @@ -7593,7 +7599,7 @@ "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", "dev": true, "requires": { - "harmony-reflect": "1.6.1" + "harmony-reflect": "^1.4.6" } }, "ieee754": { @@ -7620,9 +7626,10 @@ }, "imagesloaded": { "version": "github:eiriklv/imagesloaded#04535a148206e58790927e133f24ca199163b995", + "from": "github:eiriklv/imagesloaded", "requires": { - "eventie": "1.0.6", - "wolfy87-eventemitter": "4.3.0" + "eventie": ">=1.0.4 <2", + "wolfy87-eventemitter": "4.x" } }, "immutable": { @@ -7635,8 +7642,8 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", "requires": { - "parent-module": "1.0.1", - "resolve-from": "4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, "import-local": { @@ -7645,8 +7652,8 @@ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { - "pkg-dir": "3.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" }, "dependencies": { "find-up": { @@ -7655,7 +7662,7 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, "locate-path": { @@ -7664,8 +7671,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "p-limit": { @@ -7674,7 +7681,7 @@ "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "p-try": "2.2.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -7683,7 +7690,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.2.1" + "p-limit": "^2.0.0" } }, "p-try": { @@ -7698,7 +7705,7 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "3.0.0" + "find-up": "^3.0.0" } } } @@ -7718,7 +7725,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexes-of": { @@ -7738,8 +7745,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -7758,8 +7765,8 @@ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz", "integrity": "sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=", "requires": { - "bowser": "1.9.4", - "css-in-js-utils": "2.0.1" + "bowser": "^1.7.3", + "css-in-js-utils": "^2.0.0" } }, "inquirer": { @@ -7767,19 +7774,19 @@ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "requires": { - "ansi-escapes": "3.2.0", - "chalk": "2.4.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "3.1.0", - "figures": "2.0.0", - "lodash": "4.17.15", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "6.5.3", - "string-width": "2.1.1", - "strip-ansi": "5.2.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { @@ -7792,7 +7799,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } } } @@ -7803,8 +7810,8 @@ "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "dev": true, "requires": { - "default-gateway": "4.2.0", - "ipaddr.js": "1.9.0" + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" } }, "interpret": { @@ -7817,7 +7824,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } }, "inversify": { @@ -7858,8 +7865,8 @@ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" } }, "is-absolute-url": { @@ -7874,7 +7881,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "is-buffer": { @@ -7889,7 +7896,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7911,7 +7918,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.13.1" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -7930,12 +7937,12 @@ "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "dev": true, "requires": { - "css-color-names": "0.0.4", - "hex-color-regex": "1.1.0", - "hsl-regex": "1.0.0", - "hsla-regex": "1.0.0", - "rgb-regex": "1.0.1", - "rgba-regex": "1.0.0" + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" } }, "is-data-descriptor": { @@ -7944,7 +7951,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "is-buffer": { @@ -7959,7 +7966,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7975,9 +7982,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -8011,7 +8018,7 @@ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -8025,7 +8032,7 @@ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -8034,7 +8041,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "is-buffer": { @@ -8049,7 +8056,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -8072,7 +8079,7 @@ "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, "requires": { - "is-path-inside": "2.1.0" + "is-path-inside": "^2.1.0" } }, "is-path-inside": { @@ -8081,7 +8088,7 @@ "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.2" } }, "is-plain-obj": { @@ -8095,7 +8102,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-promise": { @@ -8108,7 +8115,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { - "has": "1.0.3" + "has": "^1.0.1" } }, "is-relative": { @@ -8116,7 +8123,7 @@ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", "requires": { - "is-unc-path": "0.1.2" + "is-unc-path": "^0.1.1" } }, "is-resolvable": { @@ -8137,7 +8144,7 @@ "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "dev": true, "requires": { - "html-comment-regex": "1.1.2" + "html-comment-regex": "^1.1.0" } }, "is-symbol": { @@ -8145,7 +8152,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "requires": { - "has-symbols": "1.0.0" + "has-symbols": "^1.0.0" } }, "is-typedarray": { @@ -8158,7 +8165,7 @@ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.0" } }, "is-utf8": { @@ -8218,8 +8225,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -8255,7 +8262,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stable-stringify-without-jsonify": { @@ -8279,7 +8286,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.0" }, "dependencies": { "minimist": { @@ -8311,8 +8318,8 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", "requires": { - "array-includes": "3.0.3", - "object.assign": "4.1.0" + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" } }, "killable": { @@ -8332,8 +8339,8 @@ "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", "dev": true, "requires": { - "lodash": "4.17.15", - "webpack-sources": "1.4.3" + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" } }, "lcid": { @@ -8341,7 +8348,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "less": { @@ -8349,15 +8356,15 @@ "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz", "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==", "requires": { - "clone": "2.1.2", - "errno": "0.1.7", - "graceful-fs": "4.2.2", - "image-size": "0.5.5", - "mime": "1.6.0", - "mkdirp": "0.5.1", - "promise": "7.3.1", - "request": "2.88.0", - "source-map": "0.6.1" + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" } }, "less-loader": { @@ -8366,9 +8373,9 @@ "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", "dev": true, "requires": { - "clone": "2.1.2", - "loader-utils": "1.2.3", - "pify": "3.0.0" + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -8384,9 +8391,9 @@ "resolved": "https://registry.npmjs.org/less-middleware/-/less-middleware-2.2.1.tgz", "integrity": "sha512-1fDsyifwRGObMmqaZhkTDAmVnvgpZmdf6ZTSCbVv9vt+xhlzOz5TDNlLCbITsusEB3d0OKOEadwN9ic3PyOWCg==", "requires": { - "less": "2.7.3", - "mkdirp": "0.5.1", - "node.extend": "2.0.2" + "less": "~2.7.1", + "mkdirp": "~0.5.1", + "node.extend": "~2.0.0" }, "dependencies": { "ajv": { @@ -8395,8 +8402,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "assert-plus": { @@ -8417,9 +8424,9 @@ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.8", - "mime-types": "2.1.24" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "har-schema": { @@ -8434,8 +8441,8 @@ "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "http-signature": { @@ -8444,9 +8451,9 @@ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.16.1" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "less": { @@ -8454,14 +8461,14 @@ "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", "requires": { - "errno": "0.1.7", - "graceful-fs": "4.2.2", - "image-size": "0.5.5", - "mime": "1.6.0", - "mkdirp": "0.5.1", - "promise": "7.3.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", "request": "2.81.0", - "source-map": "0.5.7" + "source-map": "^0.5.3" } }, "oauth-sign": { @@ -8494,28 +8501,28 @@ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.8", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.24", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.2.0", - "stringstream": "0.0.6", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.3" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "source-map": { @@ -8530,7 +8537,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "optional": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } } } @@ -8540,8 +8547,8 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "line-height": { @@ -8549,7 +8556,7 @@ "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.1.1.tgz", "integrity": "sha1-6GcF+/Cm9QYHrtZVANadstnbN+I=", "requires": { - "computed-style": "0.1.4" + "computed-style": "~0.1.3" } }, "load-json-file": { @@ -8557,10 +8564,10 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "4.2.2", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "loader-fs-cache": { @@ -8568,7 +8575,7 @@ "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", "requires": { - "find-cache-dir": "0.1.1", + "find-cache-dir": "^0.1.1", "mkdirp": "0.5.1" } }, @@ -8583,9 +8590,9 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" } }, "locate-path": { @@ -8593,8 +8600,8 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -8641,7 +8648,7 @@ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "2.4.2" + "chalk": "^2.0.1" } }, "loglevel": { @@ -8656,8 +8663,8 @@ "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", "dev": true, "requires": { - "es6-symbol": "3.1.2", - "object.assign": "4.1.0" + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" } }, "loose-envify": { @@ -8665,7 +8672,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { - "js-tokens": "4.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "loud-rejection": { @@ -8673,8 +8680,8 @@ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lower-case": { @@ -8688,8 +8695,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -8698,7 +8705,7 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -8727,7 +8734,7 @@ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { - "p-defer": "1.0.0" + "p-defer": "^1.0.0" } }, "map-cache": { @@ -8747,11 +8754,12 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "matches-selector": { - "version": "github:desandro/matches-selector#082376f4bbe7ff8c5c6bb258ec43259c9a80a7c3" + "version": "github:desandro/matches-selector#082376f4bbe7ff8c5c6bb258ec43259c9a80a7c3", + "from": "github:desandro/matches-selector#v1.0.3" }, "math-expression-evaluator": { "version": "1.2.17", @@ -8764,9 +8772,9 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "mdn-data": { @@ -8787,9 +8795,9 @@ "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "2.1.0", - "p-is-promise": "2.1.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" }, "dependencies": { "mimic-fn": { @@ -8810,16 +8818,16 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.5.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { "find-up": { @@ -8827,8 +8835,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "load-json-file": { @@ -8836,11 +8844,11 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { - "graceful-fs": "4.2.2", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "minimist": { @@ -8853,7 +8861,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-type": { @@ -8861,9 +8869,9 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "4.2.2", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "read-pkg": { @@ -8871,9 +8879,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.5.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -8881,8 +8889,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "strip-bom": { @@ -8890,7 +8898,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -8913,19 +8921,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "miller-rabin": { @@ -8933,8 +8941,8 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { @@ -8965,7 +8973,7 @@ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", "requires": { - "dom-walk": "0.1.1" + "dom-walk": "^0.1.0" } }, "mini-css-extract-plugin": { @@ -8974,9 +8982,9 @@ "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==", "dev": true, "requires": { - "loader-utils": "1.2.3", - "schema-utils": "1.0.0", - "webpack-sources": "1.4.3" + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" }, "dependencies": { "schema-utils": { @@ -8985,9 +8993,9 @@ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "ajv": "6.10.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } @@ -9007,7 +9015,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -9021,16 +9029,16 @@ "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.7.1", - "end-of-stream": "1.4.4", - "flush-write-stream": "1.1.1", - "from2": "2.3.0", - "parallel-transform": "1.2.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, "mixin-deep": { @@ -9039,8 +9047,8 @@ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -9049,7 +9057,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -9068,12 +9076,12 @@ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.7.1", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "ms": { @@ -9087,8 +9095,8 @@ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { - "dns-packet": "1.3.1", - "thunky": "1.0.3" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, "multicast-dns-service-types": { @@ -9113,17 +9121,17 @@ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "is-windows": { @@ -9167,7 +9175,7 @@ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { - "lower-case": "1.1.4" + "lower-case": "^1.1.1" } }, "node-forge": { @@ -9181,18 +9189,18 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "requires": { - "fstream": "1.0.12", - "glob": "7.1.4", - "graceful-fs": "4.2.2", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.88.0", - "rimraf": "2.7.1", - "semver": "5.3.0", - "tar": "2.2.2", - "which": "1.3.1" + "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" }, "dependencies": { "semver": { @@ -9207,29 +9215,29 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { - "assert": "1.5.0", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "3.0.0", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.1", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.2", - "stream-http": "2.8.3", - "string_decoder": "1.3.0", - "timers-browserify": "2.0.11", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.11.1", - "vm-browserify": "1.1.0" + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" }, "dependencies": { "punycode": { @@ -9245,7 +9253,7 @@ "integrity": "sha512-JGcM/wndCN/2elJlU0IGdVEJQQnJwsLbgPCFd2pY7V0mxf17bZ0Gb/lgOtL29ZQhvEX5shnVhxQyZz3ex94N8w==", "dev": true, "requires": { - "semver": "6.3.0" + "semver": "^6.3.0" }, "dependencies": { "semver": { @@ -9261,23 +9269,23 @@ "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.3", - "get-stdin": "4.0.1", - "glob": "7.1.4", - "in-publish": "2.0.0", - "lodash": "4.17.15", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.14.0", - "node-gyp": "3.8.0", - "npmlog": "4.1.2", - "request": "2.88.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.1", - "true-case-path": "1.0.3" + "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" }, "dependencies": { "ansi-regex": { @@ -9295,11 +9303,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "cross-spawn": { @@ -9307,8 +9315,8 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "requires": { - "lru-cache": "4.1.5", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, "get-stdin": { @@ -9321,7 +9329,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -9336,8 +9344,8 @@ "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", "requires": { - "has": "1.0.3", - "is": "3.3.0" + "has": "^1.0.3", + "is": "^3.2.1" } }, "nopt": { @@ -9345,7 +9353,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { - "abbrev": "1.1.1" + "abbrev": "1" } }, "normalize-package-data": { @@ -9353,10 +9361,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "requires": { - "hosted-git-info": "2.8.5", - "resolve": "1.12.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.4" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -9377,10 +9385,10 @@ "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" } }, "npm-run-path": { @@ -9389,7 +9397,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npmlog": { @@ -9397,10 +9405,10 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "nth-check": { @@ -9409,7 +9417,7 @@ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "num2fraction": { @@ -9439,9 +9447,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -9450,7 +9458,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "is-buffer": { @@ -9465,7 +9473,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -9503,7 +9511,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.assign": { @@ -9511,10 +9519,10 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1", - "has-symbols": "1.0.0", - "object-keys": "1.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "object.entries": { @@ -9522,10 +9530,10 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.15.0", - "function-bind": "1.1.1", - "has": "1.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "object.fromentries": { @@ -9533,10 +9541,10 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.15.0", - "function-bind": "1.1.1", - "has": "1.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.15.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "object.getownpropertydescriptors": { @@ -9545,8 +9553,8 @@ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.15.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, "object.pick": { @@ -9555,7 +9563,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "object.values": { @@ -9563,10 +9571,10 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.15.0", - "function-bind": "1.1.1", - "has": "1.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "obuf": { @@ -9595,7 +9603,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -9603,7 +9611,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "opn": { @@ -9612,7 +9620,7 @@ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, "requires": { - "is-wsl": "1.1.0" + "is-wsl": "^1.1.0" } }, "optimize-css-assets-webpack-plugin": { @@ -9621,8 +9629,8 @@ "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", "dev": true, "requires": { - "cssnano": "4.1.10", - "last-call-webpack-plugin": "3.0.0" + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" }, "dependencies": { "cssnano": { @@ -9631,10 +9639,10 @@ "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", "dev": true, "requires": { - "cosmiconfig": "5.2.1", - "cssnano-preset-default": "4.0.7", - "is-resolvable": "1.1.0", - "postcss": "7.0.18" + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" } }, "postcss": { @@ -9643,9 +9651,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -9654,7 +9662,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -9664,12 +9672,12 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "original": { @@ -9678,7 +9686,7 @@ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "dev": true, "requires": { - "url-parse": "1.4.7" + "url-parse": "^1.4.3" } }, "os-browserify": { @@ -9696,7 +9704,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -9709,12 +9717,13 @@ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "outlayer": { "version": "github:eiriklv/outlayer#aea1c8239d30ccc1d3664ca3fff2f6d4b20fb812", + "from": "github:eiriklv/outlayer", "requires": { "desandro-get-style-property": "github:eiriklv/get-style-property#a5a74ad48d96c7d5ddcf652e9fa5d4283af37823", "doc-ready": "github:eiriklv/doc-ready#31c2481101af5dab33311fea4c7fc684b58fa8ad", @@ -9725,7 +9734,8 @@ }, "dependencies": { "eventie": { - "version": "github:eiriklv/eventie#c9d290c6aa57712257dc8c0b6bf21c9374190a3c" + "version": "github:eiriklv/eventie#c9d290c6aa57712257dc8c0b6bf21c9374190a3c", + "from": "github:eiriklv/eventie" } } }, @@ -9735,9 +9745,9 @@ "integrity": "sha512-mDho4qm7WgIXIGf4eYU1RHN2UU5tPfVYVSRwDJw0uTmj35DQUt/eNp19N7v6T3SrR0ESTEf2up2CGO73qI35zQ==", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "is-plain-obj": "1.1.0", - "mkdirp": "0.5.1" + "graceful-fs": "^4.1.11", + "is-plain-obj": "^1.1.0", + "mkdirp": "^0.5.1" } }, "p-defer": { @@ -9763,7 +9773,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -9771,7 +9781,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "1.3.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -9786,7 +9796,7 @@ "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "dev": true, "requires": { - "retry": "0.12.0" + "retry": "^0.12.0" } }, "p-try": { @@ -9796,6 +9806,7 @@ }, "packery": { "version": "github:eiriklv/packery#8e812a0a16575ef923f5e72efcea85aadc6fea67", + "from": "github:eiriklv/packery", "requires": { "classie": "github:eiriklv/classie#da1d3019904433872a8656d3cd69fc41d69c477a", "desandro-get-style-property": "github:eiriklv/get-style-property#a5a74ad48d96c7d5ddcf652e9fa5d4283af37823", @@ -9814,9 +9825,9 @@ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "1.0.1", - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, "param-case": { @@ -9825,7 +9836,7 @@ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, "parent-module": { @@ -9833,7 +9844,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { - "callsites": "3.1.0" + "callsites": "^3.0.0" } }, "parse-asn1": { @@ -9841,12 +9852,12 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17", - "safe-buffer": "5.2.0" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-json": { @@ -9854,7 +9865,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "1.3.2" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -9881,8 +9892,8 @@ "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", "dev": true, "requires": { - "process": "0.11.10", - "util": "0.10.4" + "process": "^0.11.1", + "util": "^0.10.3" }, "dependencies": { "inherits": { @@ -9958,7 +9969,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "pbkdf2": { @@ -9966,11 +9977,11 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.2.0", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "performance-now": { @@ -9993,7 +10004,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -10001,7 +10012,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" }, "dependencies": { "find-up": { @@ -10009,8 +10020,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "path-exists": { @@ -10018,7 +10029,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } } } @@ -10028,7 +10039,7 @@ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } }, "portfinder": { @@ -10037,9 +10048,9 @@ "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==", "dev": true, "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" }, "dependencies": { "async": { @@ -10071,10 +10082,10 @@ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { - "chalk": "1.1.3", - "js-base64": "2.5.1", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" }, "dependencies": { "ansi-regex": { @@ -10095,11 +10106,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "supports-color": { @@ -10128,7 +10139,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -10137,7 +10148,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -10148,9 +10159,9 @@ "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" } }, "postcss-colormin": { @@ -10159,9 +10170,9 @@ "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "dev": true, "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" } }, "postcss-convert-values": { @@ -10170,8 +10181,8 @@ "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" } }, "postcss-discard-comments": { @@ -10180,7 +10191,7 @@ "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" } }, "postcss-discard-duplicates": { @@ -10189,7 +10200,7 @@ "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-discard-empty": { @@ -10198,7 +10209,7 @@ "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" } }, "postcss-discard-overridden": { @@ -10207,7 +10218,7 @@ "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.16" } }, "postcss-discard-unused": { @@ -10216,8 +10227,8 @@ "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "dev": true, "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" + "postcss": "^5.0.14", + "uniqs": "^2.0.0" } }, "postcss-filter-plugins": { @@ -10226,7 +10237,7 @@ "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-merge-idents": { @@ -10235,9 +10246,9 @@ "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "dev": true, "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" } }, "postcss-merge-longhand": { @@ -10246,7 +10257,7 @@ "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-merge-rules": { @@ -10255,11 +10266,11 @@ "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.3" + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" }, "dependencies": { "browserslist": { @@ -10268,8 +10279,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000999", - "electron-to-chromium": "1.3.280" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } } } @@ -10286,9 +10297,9 @@ "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "dev": true, "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" } }, "postcss-minify-gradients": { @@ -10297,8 +10308,8 @@ "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" } }, "postcss-minify-params": { @@ -10307,10 +10318,10 @@ "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" } }, "postcss-minify-selectors": { @@ -10319,10 +10330,10 @@ "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" } }, "postcss-modules-extract-imports": { @@ -10331,7 +10342,7 @@ "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", "dev": true, "requires": { - "postcss": "6.0.23" + "postcss": "^6.0.1" }, "dependencies": { "postcss": { @@ -10340,9 +10351,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } } } @@ -10353,8 +10364,8 @@ "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.1", - "postcss": "6.0.23" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" }, "dependencies": { "postcss": { @@ -10363,9 +10374,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } } } @@ -10376,8 +10387,8 @@ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.1", - "postcss": "6.0.23" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" }, "dependencies": { "postcss": { @@ -10386,9 +10397,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } } } @@ -10399,8 +10410,8 @@ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "dev": true, "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.23" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" }, "dependencies": { "postcss": { @@ -10409,9 +10420,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } } } @@ -10422,7 +10433,7 @@ "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.5" } }, "postcss-normalize-display-values": { @@ -10431,9 +10442,9 @@ "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "dev": true, "requires": { - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss": { @@ -10442,9 +10453,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -10453,7 +10464,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10464,10 +10475,10 @@ "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "requires": { - "cssnano-util-get-arguments": "4.0.0", - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss": { @@ -10476,9 +10487,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -10487,7 +10498,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10498,10 +10509,10 @@ "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "requires": { - "cssnano-util-get-arguments": "4.0.0", - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss": { @@ -10510,9 +10521,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -10521,7 +10532,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10532,9 +10543,9 @@ "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss": { @@ -10543,9 +10554,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -10554,7 +10565,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10565,9 +10576,9 @@ "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "dev": true, "requires": { - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss": { @@ -10576,9 +10587,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -10587,7 +10598,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10598,9 +10609,9 @@ "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, "requires": { - "browserslist": "4.7.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss": { @@ -10609,9 +10620,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -10620,7 +10631,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10631,10 +10642,10 @@ "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "dev": true, "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" } }, "postcss-normalize-whitespace": { @@ -10643,8 +10654,8 @@ "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "dev": true, "requires": { - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss": { @@ -10653,9 +10664,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -10664,7 +10675,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10675,8 +10686,8 @@ "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" } }, "postcss-reduce-idents": { @@ -10685,8 +10696,8 @@ "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" } }, "postcss-reduce-initial": { @@ -10695,7 +10706,7 @@ "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-reduce-transforms": { @@ -10704,9 +10715,9 @@ "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "dev": true, "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" } }, "postcss-selector-parser": { @@ -10715,9 +10726,9 @@ "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "dev": true, "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { @@ -10726,10 +10737,10 @@ "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "dev": true, "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1", - "svgo": "0.7.2" + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" } }, "postcss-unique-selectors": { @@ -10738,9 +10749,9 @@ "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" } }, "postcss-value-parser": { @@ -10755,9 +10766,9 @@ "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "dev": true, "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" } }, "prefix-style": { @@ -10787,7 +10798,7 @@ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "requires": { - "fast-diff": "1.2.0" + "fast-diff": "^1.1.2" } }, "pretty-error": { @@ -10796,8 +10807,8 @@ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "dev": true, "requires": { - "renderkid": "2.0.3", - "utila": "0.4.0" + "renderkid": "^2.0.1", + "utila": "~0.4" } }, "private": { @@ -10827,7 +10838,7 @@ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "optional": true, "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "promise-inflight": { @@ -10841,9 +10852,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "react-is": "16.10.2" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" } }, "proxy-addr": { @@ -10852,7 +10863,7 @@ "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", "dev": true, "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.9.0" } }, @@ -10876,12 +10887,12 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.5", - "randombytes": "2.1.0", - "safe-buffer": "5.2.0" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "pump": { @@ -10890,8 +10901,8 @@ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "end-of-stream": "1.4.4", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -10900,9 +10911,9 @@ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "3.7.1", - "inherits": "2.0.4", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "punycode": { @@ -10927,8 +10938,8 @@ "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "querystring": { @@ -10952,7 +10963,7 @@ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "requires": { - "performance-now": "2.1.0" + "performance-now": "^2.1.0" } }, "raleway-cyrillic": { @@ -10970,7 +10981,7 @@ "resolved": "https://registry.npmjs.org/ramdasauce/-/ramdasauce-2.1.3.tgz", "integrity": "sha512-Ml3CPim4SKwmg5g9UI77lnRSeKr/kQw7YhQ6rfdMcBYy6DMlwmkEwQqjygJ3OhxPR+NfFfpjKl3Tf8GXckaqqg==", "requires": { - "ramda": "0.24.1" + "ramda": "^0.24.1" }, "dependencies": { "ramda": { @@ -10985,7 +10996,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { - "safe-buffer": "5.2.0" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -10993,8 +11004,8 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { - "randombytes": "2.1.0", - "safe-buffer": "5.2.0" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "range-parser": { @@ -11027,10 +11038,10 @@ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", - "statuses": "1.5.0", + "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } }, @@ -11053,10 +11064,10 @@ "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "prop-types": "15.7.2", - "scheduler": "0.13.6" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.6" }, "dependencies": { "scheduler": { @@ -11064,8 +11075,8 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } } } @@ -11075,10 +11086,10 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.10.2.tgz", "integrity": "sha512-kWGDcH3ItJK4+6Pl9DZB16BXYAZyrYQItU4OMy0jAkv5aNqc+mAKb4TpFtAteI6TJZu+9ZlNhaeNQSVQDHJzkw==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "prop-types": "15.7.2", - "scheduler": "0.16.2" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.16.2" } }, "react-draggable": { @@ -11086,8 +11097,8 @@ "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.3.2.tgz", "integrity": "sha512-oaz8a6enjbPtx5qb0oDWxtDNuybOylvto1QLydsXgKmwT7e3GXC2eMVDwEMIUYJIFqVG72XpOv673UuuAq6LhA==", "requires": { - "classnames": "2.2.6", - "prop-types": "15.7.2" + "classnames": "^2.2.5", + "prop-types": "^15.6.0" } }, "react-grid-layout": { @@ -11095,11 +11106,11 @@ "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-0.16.6.tgz", "integrity": "sha512-h2EsYgsqcESLJeevQSJsEKp8hhh+phOlXDJoMhlV2e7T3VWQL+S6iCF3iD/LK19r4oyRyOMDEir0KV+eLXrAyw==", "requires": { - "classnames": "2.2.6", - "lodash.isequal": "4.5.0", - "prop-types": "15.7.2", - "react-draggable": "3.3.2", - "react-resizable": "1.8.0" + "classnames": "2.x", + "lodash.isequal": "^4.0.0", + "prop-types": "15.x", + "react-draggable": "3.x", + "react-resizable": "1.x" } }, "react-hot-loader": { @@ -11107,14 +11118,14 @@ "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.15.tgz", "integrity": "sha512-sgkN6g+tgPE6xZzD0Ysqll7KUFYJbMX0DrczT5OxD6S7hZlSnmqSC3ceudwCkiDd65ZTtm+Ayk4Y9k5xxCvpOw==", "requires": { - "fast-levenshtein": "2.0.6", - "global": "4.4.0", - "hoist-non-react-statics": "3.3.0", - "loader-utils": "1.2.3", - "prop-types": "15.7.2", - "react-lifecycles-compat": "3.0.4", - "shallowequal": "1.1.0", - "source-map": "0.7.3" + "fast-levenshtein": "^2.0.6", + "global": "^4.3.0", + "hoist-non-react-statics": "^3.3.0", + "loader-utils": "^1.1.0", + "prop-types": "^15.6.1", + "react-lifecycles-compat": "^3.0.4", + "shallowequal": "^1.1.0", + "source-map": "^0.7.3" }, "dependencies": { "source-map": { @@ -11134,7 +11145,7 @@ "resolved": "https://registry.npmjs.org/react-layout-pack/-/react-layout-pack-0.2.3.tgz", "integrity": "sha1-/Bw/1EsX8u55l9xzrJuKRRvf3bQ=", "requires": { - "in-publish": "2.0.0" + "in-publish": "^2.0.0" } }, "react-lifecycles-compat": { @@ -11147,9 +11158,9 @@ "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", "requires": { - "performance-now": "0.2.0", - "prop-types": "15.7.2", - "raf": "3.4.1" + "performance-now": "^0.2.0", + "prop-types": "^15.5.8", + "raf": "^3.1.0" }, "dependencies": { "performance-now": { @@ -11173,12 +11184,12 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-6.0.1.tgz", "integrity": "sha512-T52I52Kxhbqy/6TEfBv85rQSDz6+Y28V/pf52vDWs1YRXG19mcFOGfHnY2HsNFHyhP+ST34Aih98fvt6tqwVcQ==", "requires": { - "@babel/runtime": "7.6.3", - "hoist-non-react-statics": "3.3.0", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "prop-types": "15.7.2", - "react-is": "16.10.2" + "@babel/runtime": "^7.3.1", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.8.2" } }, "react-resizable": { @@ -11186,8 +11197,8 @@ "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-1.8.0.tgz", "integrity": "sha512-lfYlCelPyUL8GLYd4SgFtZOrFY8XpxpDwXjgGHLiLM2aMv7mEkBT8Jn5MUV1TCinF5mIro4CMezfnniAZEkGvg==", "requires": { - "prop-types": "15.7.2", - "react-draggable": "3.3.2" + "prop-types": "15.x", + "react-draggable": "^3.0.3" } }, "react-router": { @@ -11195,13 +11206,13 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", "requires": { - "history": "4.10.1", - "hoist-non-react-statics": "2.5.5", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "path-to-regexp": "1.7.0", - "prop-types": "15.7.2", - "warning": "4.0.3" + "history": "^4.7.2", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.1", + "warning": "^4.0.1" }, "dependencies": { "hoist-non-react-statics": { @@ -11216,12 +11227,12 @@ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", "requires": { - "history": "4.10.1", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "prop-types": "15.7.2", - "react-router": "4.3.1", - "warning": "4.0.3" + "history": "^4.7.2", + "invariant": "^2.2.4", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1", + "react-router": "^4.3.1", + "warning": "^4.0.1" } }, "react-scrollbar": { @@ -11229,9 +11240,9 @@ "resolved": "https://registry.npmjs.org/react-scrollbar/-/react-scrollbar-0.5.6.tgz", "integrity": "sha512-TsSLsuovOlxmfTxY9bRjRUfQjycvfs73L4gz7yE+2D8Qs7U3zhwbGS0lj0JScCDipcyn7EX66LsaI00cU3aRSQ==", "requires": { - "config": "1.31.0", - "line-height": "0.1.1", - "react-motion": "0.5.2" + "config": "^1.24.0", + "line-height": "^0.1.1", + "react-motion": "^0.5.2" } }, "react-sizeme": { @@ -11239,10 +11250,10 @@ "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-2.6.7.tgz", "integrity": "sha512-xCjPoBP5jmeW58TxIkcviMZqabZis7tTvDFWf0/Wa5XCgVWQTIe74NQBes2N1Kmp64GRLkpm60BaP0kk+v8aCQ==", "requires": { - "element-resize-detector": "1.1.15", - "invariant": "2.2.4", - "shallowequal": "1.1.0", - "throttle-debounce": "2.1.0" + "element-resize-detector": "^1.1.15", + "invariant": "^2.2.4", + "shallowequal": "^1.1.0", + "throttle-debounce": "^2.1.0" } }, "react-sortable-hoc": { @@ -11250,9 +11261,9 @@ "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-1.10.1.tgz", "integrity": "sha512-eVyv5rrK6qY9bG60bboRY78In7OpdRRg+hxp4QMLIjC/UJaFSU7exTYd0764GtXvBqh+b+faYGzren5/ffRYKw==", "requires": { - "@babel/runtime": "7.6.3", - "invariant": "2.2.4", - "prop-types": "15.7.2" + "@babel/runtime": "^7.2.0", + "invariant": "^2.2.4", + "prop-types": "^15.5.7" } }, "react-stack-grid": { @@ -11260,15 +11271,15 @@ "resolved": "https://registry.npmjs.org/react-stack-grid/-/react-stack-grid-0.7.1.tgz", "integrity": "sha512-Fw7qMt5Rd9wQpNCnvK4Gi+ry/nL5rKfzP2hGsw5/DZxArEMk60VoDLy68Uskq09l6wk7qb2w7P2+lNzSd9mYEw==", "requires": { - "easy-css-transform-builder": "0.0.2", - "exenv": "1.2.2", - "imagesloaded": "4.1.4", - "inline-style-prefixer": "3.0.8", - "invariant": "2.2.4", - "prop-types": "15.7.2", - "react-sizeme": "2.6.7", - "react-transition-group": "1.2.1", - "shallowequal": "1.1.0" + "easy-css-transform-builder": "^0.0.2", + "exenv": "^1.2.1", + "imagesloaded": "^4.1.1", + "inline-style-prefixer": "^3.0.6", + "invariant": "^2.2.2", + "prop-types": "^15.5.10", + "react-sizeme": "^2.2.0", + "react-transition-group": "^1.2.0", + "shallowequal": "^1.0.1" }, "dependencies": { "imagesloaded": { @@ -11276,7 +11287,7 @@ "resolved": "https://registry.npmjs.org/imagesloaded/-/imagesloaded-4.1.4.tgz", "integrity": "sha512-ltiBVcYpc/TYTF5nolkMNsnREHW+ICvfQ3Yla2Sgr71YFwQ86bDwV9hgpFhFtrGPuwEx5+LqOHIrdXBdoWwwsA==", "requires": { - "ev-emitter": "1.1.1" + "ev-emitter": "^1.0.0" } } } @@ -11286,11 +11297,11 @@ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-1.2.1.tgz", "integrity": "sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q==", "requires": { - "chain-function": "1.0.1", - "dom-helpers": "3.4.0", - "loose-envify": "1.4.0", - "prop-types": "15.7.2", - "warning": "3.0.0" + "chain-function": "^1.0.0", + "dom-helpers": "^3.2.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.5.6", + "warning": "^3.0.0" }, "dependencies": { "warning": { @@ -11298,7 +11309,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } } } @@ -11308,9 +11319,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.5.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -11318,8 +11329,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "readable-stream": { @@ -11327,13 +11338,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" }, "dependencies": { "safe-buffer": { @@ -11346,7 +11357,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -11357,9 +11368,9 @@ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, "redent": { @@ -11367,8 +11378,8 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "reduce-css-calc": { @@ -11377,9 +11388,9 @@ "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "dev": true, "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.3" + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" }, "dependencies": { "balanced-match": { @@ -11396,7 +11407,7 @@ "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", "dev": true, "requires": { - "balanced-match": "1.0.0" + "balanced-match": "^1.0.0" } }, "redux": { @@ -11404,8 +11415,8 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", "requires": { - "loose-envify": "1.4.0", - "symbol-observable": "1.2.0" + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" } }, "redux-persist": { @@ -11418,7 +11429,7 @@ "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.1.1.tgz", "integrity": "sha512-guSnGJ/uEF8yL8Mn4aNa7HxRGCpVUALCkec9iTTD0fOhQqkF6bRQkBLeS+7/cAH3nFnr299bi/DOurTi1apcCA==", "requires": { - "@redux-saga/core": "1.1.1" + "@redux-saga/core": "^1.1.1" } }, "reduxsauce": { @@ -11426,8 +11437,8 @@ "resolved": "https://registry.npmjs.org/reduxsauce/-/reduxsauce-1.1.0.tgz", "integrity": "sha512-INjuCTmDntZqUfJFPy6qRAdSYnR16d1jH7H0TDqZW+0RA3QqOo3YK05TG07Ssh7zlxHT+eeZPojHkb2R/O6moQ==", "requires": { - "ramda": "0.24.1", - "ramdasauce": "2.1.3" + "ramda": "^0.24.1", + "ramdasauce": "^2.0.0" }, "dependencies": { "ramda": { @@ -11454,7 +11465,7 @@ "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", "dev": true, "requires": { - "regenerate": "1.4.0" + "regenerate": "^1.4.0" } }, "regenerator-runtime": { @@ -11468,7 +11479,7 @@ "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", "dev": true, "requires": { - "private": "0.1.8" + "private": "^0.1.6" } }, "regex-not": { @@ -11477,8 +11488,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regex-parser": { @@ -11493,7 +11504,7 @@ "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", "dev": true, "requires": { - "define-properties": "1.1.3" + "define-properties": "^1.1.2" } }, "regexpp": { @@ -11507,12 +11518,12 @@ "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", "dev": true, "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "8.1.0", - "regjsgen": "0.5.0", - "regjsparser": "0.6.0", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.1.0" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" } }, "regjsgen": { @@ -11527,7 +11538,7 @@ "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -11556,11 +11567,11 @@ "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", "dev": true, "requires": { - "css-select": "1.2.0", - "dom-converter": "0.2.0", - "htmlparser2": "3.10.1", - "strip-ansi": "3.0.1", - "utila": "0.4.0" + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" }, "dependencies": { "ansi-regex": { @@ -11575,7 +11586,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -11597,7 +11608,7 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -11605,26 +11616,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.8", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.3", - "har-validator": "5.1.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.24", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.2.0", - "tough-cookie": "2.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.3" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "require-directory": { @@ -11654,7 +11665,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "requires": { - "path-parse": "1.0.6" + "path-parse": "^1.0.6" } }, "resolve-cwd": { @@ -11663,7 +11674,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" }, "dependencies": { "resolve-from": { @@ -11680,8 +11691,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" }, "dependencies": { "global-modules": { @@ -11690,9 +11701,9 @@ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "is-windows": { @@ -11749,9 +11760,9 @@ "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "supports-color": { @@ -11760,7 +11771,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -11770,8 +11781,8 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -11792,8 +11803,8 @@ "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", "dev": true, "requires": { - "convert-source-map": "0.3.5", - "css": "2.2.4" + "convert-source-map": "^0.3.3", + "css": "^2.0.0" }, "dependencies": { "convert-source-map": { @@ -11827,7 +11838,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { - "glob": "7.1.4" + "glob": "^7.1.3" } }, "ripemd160": { @@ -11835,8 +11846,8 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.4" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-async": { @@ -11844,7 +11855,7 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "run-queue": { @@ -11853,7 +11864,7 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "1.2.0" + "aproba": "^1.1.1" } }, "rxjs": { @@ -11861,7 +11872,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.9.0" } }, "safe-buffer": { @@ -11875,7 +11886,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -11888,10 +11899,10 @@ "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", "requires": { - "glob": "7.1.4", - "lodash": "4.17.15", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" } }, "sass-loader": { @@ -11899,11 +11910,11 @@ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", "requires": { - "clone-deep": "4.0.1", - "loader-utils": "1.2.3", - "neo-async": "2.6.1", - "pify": "4.0.1", - "semver": "6.3.0" + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^6.3.0" }, "dependencies": { "pify": { @@ -11923,10 +11934,10 @@ "resolved": "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-2.0.1.tgz", "integrity": "sha512-UsjQWm01xglINC1kPidYwKOBBzOElVupm9RwtOkRlY0hPA4GKi2KFsn4BZypRD1kudaXgUnGnfbiVOE7c+ybAg==", "requires": { - "async": "2.6.3", - "chalk": "1.1.3", - "glob": "7.1.4", - "loader-utils": "1.2.3" + "async": "^2.1.4", + "chalk": "^1.1.3", + "glob": "^7.1.1", + "loader-utils": "^1.0.4" }, "dependencies": { "ansi-regex": { @@ -11944,11 +11955,11 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -11956,7 +11967,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -11977,8 +11988,8 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg==", "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "schema-utils": { @@ -11987,8 +11998,8 @@ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "ajv": "6.10.2", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } }, "scrypt": { @@ -11996,7 +12007,7 @@ "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", "requires": { - "nan": "2.14.0" + "nan": "^2.0.8" } }, "scss-tokenizer": { @@ -12004,8 +12015,8 @@ "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "requires": { - "js-base64": "2.5.1", - "source-map": "0.4.4" + "js-base64": "^2.1.8", + "source-map": "^0.4.2" }, "dependencies": { "source-map": { @@ -12013,7 +12024,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -12050,18 +12061,18 @@ "dev": true, "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.7.3", + "http-errors": "~1.7.2", "mime": "1.6.0", "ms": "2.1.1", - "on-finished": "2.3.0", - "range-parser": "1.2.1", - "statuses": "1.5.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { "debug": { @@ -12087,10 +12098,10 @@ "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", "dev": true, "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.1.1", - "statuses": "1.5.0", + "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" } }, @@ -12120,13 +12131,13 @@ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, "requires": { - "accepts": "1.3.7", + "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.24", - "parseurl": "1.3.3" + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" }, "dependencies": { "debug": { @@ -12146,9 +12157,9 @@ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "dev": true, "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.3", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", "send": "0.17.1" } }, @@ -12163,10 +12174,10 @@ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -12175,7 +12186,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -12195,8 +12206,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shallow-clone": { @@ -12204,7 +12215,7 @@ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" } }, "shallowequal": { @@ -12217,7 +12228,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -12236,7 +12247,7 @@ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "dev": true, "requires": { - "is-arrayish": "0.3.2" + "is-arrayish": "^0.3.1" }, "dependencies": { "is-arrayish": { @@ -12258,9 +12269,9 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "requires": { - "ansi-styles": "3.2.1", - "astral-regex": "1.0.0", - "is-fullwidth-code-point": "2.0.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" } }, "snapdragon": { @@ -12269,14 +12280,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "debug": { @@ -12294,7 +12305,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -12303,7 +12314,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "source-map": { @@ -12320,9 +12331,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -12331,7 +12342,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -12340,7 +12351,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -12349,7 +12360,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -12358,9 +12369,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -12371,7 +12382,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" }, "dependencies": { "is-buffer": { @@ -12386,7 +12397,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -12397,7 +12408,7 @@ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sockjs": { @@ -12406,8 +12417,8 @@ "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "dev": true, "requires": { - "faye-websocket": "0.10.0", - "uuid": "3.3.3" + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" } }, "sockjs-client": { @@ -12416,12 +12427,12 @@ "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "dev": true, "requires": { - "debug": "3.2.6", - "eventsource": "1.0.7", - "faye-websocket": "0.11.3", - "inherits": "2.0.4", - "json3": "3.3.3", - "url-parse": "1.4.7" + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" }, "dependencies": { "debug": { @@ -12430,7 +12441,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "faye-websocket": { @@ -12439,7 +12450,7 @@ "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dev": true, "requires": { - "websocket-driver": "0.7.3" + "websocket-driver": ">=0.5.1" } }, "ms": { @@ -12456,7 +12467,7 @@ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -12476,11 +12487,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -12489,8 +12500,8 @@ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "source-map-url": { @@ -12504,8 +12515,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.5" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -12518,8 +12529,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "2.2.0", - "spdx-license-ids": "3.0.5" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -12533,11 +12544,11 @@ "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", "dev": true, "requires": { - "debug": "4.1.1", - "handle-thing": "2.0.0", - "http-deceiver": "1.2.7", - "select-hose": "2.0.0", - "spdy-transport": "3.0.0" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "dependencies": { "debug": { @@ -12546,7 +12557,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -12563,12 +12574,12 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { - "debug": "4.1.1", - "detect-node": "2.0.4", - "hpack.js": "2.1.6", - "obuf": "1.1.2", - "readable-stream": "3.4.0", - "wbuf": "1.7.3" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" }, "dependencies": { "debug": { @@ -12577,7 +12588,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "ms": { @@ -12592,9 +12603,9 @@ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, "requires": { - "inherits": "2.0.4", - "string_decoder": "1.3.0", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } @@ -12605,7 +12616,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -12618,15 +12629,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "ssri": { @@ -12635,7 +12646,7 @@ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "dev": true, "requires": { - "safe-buffer": "5.2.0" + "safe-buffer": "^5.1.1" } }, "stable": { @@ -12650,8 +12661,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -12660,7 +12671,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -12675,16 +12686,21 @@ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.1" } }, + "sticky-sidebar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/sticky-sidebar/-/sticky-sidebar-3.3.1.tgz", + "integrity": "sha1-FCv2tkwrQW5LcH6/jwm4taUEOHc=" + }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-each": { @@ -12693,8 +12709,8 @@ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "end-of-stream": "1.4.4", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { @@ -12702,11 +12718,11 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.2" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "stream-shift": { @@ -12726,8 +12742,8 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "string.prototype.trimleft": { @@ -12735,8 +12751,8 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, "string.prototype.trimright": { @@ -12744,8 +12760,8 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, "string_decoder": { @@ -12753,7 +12769,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "5.2.0" + "safe-buffer": "~5.2.0" } }, "stringstream": { @@ -12767,7 +12783,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "strip-bom": { @@ -12786,7 +12802,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" }, "dependencies": { "get-stdin": { @@ -12807,8 +12823,8 @@ "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", "dev": true, "requires": { - "loader-utils": "1.2.3", - "schema-utils": "0.4.7" + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" } }, "stylehacks": { @@ -12817,9 +12833,9 @@ "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, "requires": { - "browserslist": "4.7.0", - "postcss": "7.0.18", - "postcss-selector-parser": "3.1.1" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { "postcss": { @@ -12828,9 +12844,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "postcss-selector-parser": { @@ -12839,9 +12855,9 @@ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "dev": true, "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "supports-color": { @@ -12850,7 +12866,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -12860,7 +12876,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "svgo": { @@ -12869,13 +12885,13 @@ "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "dev": true, "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" }, "dependencies": { "esprima": { @@ -12890,8 +12906,8 @@ "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } } } @@ -12906,10 +12922,10 @@ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "requires": { - "ajv": "6.10.2", - "lodash": "4.17.15", - "slice-ansi": "2.1.0", - "string-width": "3.1.0" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -12922,9 +12938,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "strip-ansi": { @@ -12932,7 +12948,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } } } @@ -12947,9 +12963,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.12", - "inherits": "2.0.4" + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" } }, "terser": { @@ -12958,9 +12974,9 @@ "integrity": "sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA==", "dev": true, "requires": { - "commander": "2.20.1", - "source-map": "0.6.1", - "source-map-support": "0.5.13" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" } }, "terser-webpack-plugin": { @@ -12969,15 +12985,15 @@ "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", "dev": true, "requires": { - "cacache": "12.0.3", - "find-cache-dir": "2.1.0", - "is-wsl": "1.1.0", - "schema-utils": "1.0.0", - "serialize-javascript": "1.9.1", - "source-map": "0.6.1", - "terser": "4.3.9", - "webpack-sources": "1.4.3", - "worker-farm": "1.7.0" + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { "cacache": { @@ -12986,21 +13002,21 @@ "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", "dev": true, "requires": { - "bluebird": "3.7.0", - "chownr": "1.1.3", - "figgy-pudding": "3.5.1", - "glob": "7.1.4", - "graceful-fs": "4.2.2", - "infer-owner": "1.0.4", - "lru-cache": "5.1.1", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.7.1", - "ssri": "6.0.1", - "unique-filename": "1.1.1", - "y18n": "4.0.0" + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, "find-cache-dir": { @@ -13009,9 +13025,9 @@ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "2.1.0", - "pkg-dir": "3.0.0" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, "find-up": { @@ -13020,7 +13036,7 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, "locate-path": { @@ -13029,8 +13045,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lru-cache": { @@ -13039,7 +13055,7 @@ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "yallist": "3.1.1" + "yallist": "^3.0.2" } }, "make-dir": { @@ -13048,8 +13064,8 @@ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "pify": "4.0.1", - "semver": "5.7.1" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, "mississippi": { @@ -13058,16 +13074,16 @@ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.7.1", - "end-of-stream": "1.4.4", - "flush-write-stream": "1.1.1", - "from2": "2.3.0", - "parallel-transform": "1.2.0", - "pump": "3.0.0", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, "p-limit": { @@ -13076,7 +13092,7 @@ "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "p-try": "2.2.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -13085,7 +13101,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.2.1" + "p-limit": "^2.0.0" } }, "p-try": { @@ -13106,7 +13122,7 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "3.0.0" + "find-up": "^3.0.0" } }, "pump": { @@ -13115,8 +13131,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "1.4.4", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "schema-utils": { @@ -13125,9 +13141,9 @@ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "ajv": "6.10.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, "semver": { @@ -13142,7 +13158,7 @@ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "figgy-pudding": "3.5.1" + "figgy-pudding": "^3.5.1" } }, "y18n": { @@ -13180,8 +13196,8 @@ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.2" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "thunky": { @@ -13195,7 +13211,7 @@ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "timsort": { @@ -13219,7 +13235,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-arraybuffer": { @@ -13232,7 +13248,7 @@ "resolved": "https://registry.npmjs.org/to-camel-case/-/to-camel-case-1.0.0.tgz", "integrity": "sha1-GlYFSy+daWKYzmamCJcyK29CPkY=", "requires": { - "to-space-case": "1.0.0" + "to-space-case": "^1.0.0" } }, "to-fast-properties": { @@ -13252,7 +13268,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "is-buffer": { @@ -13267,7 +13283,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -13278,10 +13294,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -13290,8 +13306,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "to-space-case": { @@ -13299,7 +13315,7 @@ "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", "requires": { - "to-no-case": "1.0.2" + "to-no-case": "^1.0.0" } }, "toidentifier": { @@ -13319,8 +13335,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "psl": "1.4.0", - "punycode": "1.4.1" + "psl": "^1.1.24", + "punycode": "^1.4.1" }, "dependencies": { "punycode": { @@ -13346,7 +13362,7 @@ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "requires": { - "glob": "7.1.4" + "glob": "^7.1.2" } }, "ts-node": { @@ -13355,11 +13371,11 @@ "integrity": "sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==", "dev": true, "requires": { - "arg": "4.1.1", - "diff": "4.0.1", - "make-error": "1.3.5", - "source-map-support": "0.5.13", - "yn": "3.1.1" + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" } }, "ts-toolbelt": { @@ -13372,10 +13388,10 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", "requires": { - "@types/json5": "0.0.29", - "json5": "1.0.1", - "minimist": "1.2.0", - "strip-bom": "3.0.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" }, "dependencies": { "minimist": { @@ -13395,19 +13411,19 @@ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.0.tgz", "integrity": "sha512-2vqIvkMHbnx8acMogAERQ/IuINOq6DFqgF8/VDvhEkBqQh/x6SP0Y+OHnKth9/ZcHQSroOZwUQSN18v8KKF0/g==", "requires": { - "@babel/code-frame": "7.5.5", - "builtin-modules": "1.1.1", - "chalk": "2.4.2", - "commander": "2.20.1", - "diff": "4.0.1", - "glob": "7.1.4", - "js-yaml": "3.13.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "resolve": "1.12.0", - "semver": "5.5.0", - "tslib": "1.10.0", - "tsutils": "2.29.0" + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" }, "dependencies": { "tsutils": { @@ -13415,7 +13431,7 @@ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.8.1" } } } @@ -13425,9 +13441,9 @@ "resolved": "https://registry.npmjs.org/tslint-config-airbnb/-/tslint-config-airbnb-5.11.2.tgz", "integrity": "sha512-mUpHPTeeCFx8XARGG/kzYP4dPSOgoCqNiYbGHh09qTH8q+Y1ghsOgaeZKYYQT7IyxMos523z/QBaiv2zKNBcow==", "requires": { - "tslint-consistent-codestyle": "1.16.0", - "tslint-eslint-rules": "5.4.0", - "tslint-microsoft-contrib": "5.2.1" + "tslint-consistent-codestyle": "^1.14.1", + "tslint-eslint-rules": "^5.4.0", + "tslint-microsoft-contrib": "~5.2.1" } }, "tslint-consistent-codestyle": { @@ -13435,9 +13451,9 @@ "resolved": "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.16.0.tgz", "integrity": "sha512-ebR/xHyMEuU36hGNOgCfjGBNYxBPixf0yU1Yoo6s3BrpBRFccjPOmIVaVvQsWAUAMdmfzHOCihVkcaMfimqvHw==", "requires": { - "@fimbul/bifrost": "0.21.0", - "tslib": "1.10.0", - "tsutils": "2.29.0" + "@fimbul/bifrost": "^0.21.0", + "tslib": "^1.7.1", + "tsutils": "^2.29.0" }, "dependencies": { "tsutils": { @@ -13445,7 +13461,7 @@ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.8.1" } } } @@ -13457,7 +13473,7 @@ "requires": { "doctrine": "0.7.2", "tslib": "1.9.0", - "tsutils": "3.17.1" + "tsutils": "^3.0.0" }, "dependencies": { "doctrine": { @@ -13465,7 +13481,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", "requires": { - "esutils": "1.1.6", + "esutils": "^1.1.6", "isarray": "0.0.1" } }, @@ -13491,7 +13507,7 @@ "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", "requires": { - "tsutils": "2.28.0" + "tsutils": "^2.27.2 <2.29.0" }, "dependencies": { "tsutils": { @@ -13499,7 +13515,7 @@ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.8.1" } } } @@ -13509,7 +13525,7 @@ "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-4.1.0.tgz", "integrity": "sha512-Y7CbFn09X7Mpg6rc7t/WPbmjx9xPI8p1RsQyiGCLWgDR6sh3+IBSlT+bEkc0PSZcWwClOkqq2wPsID8Vep6szQ==", "requires": { - "tsutils": "3.17.1" + "tsutils": "^3.9.1" } }, "tslint-react-hooks": { @@ -13522,7 +13538,7 @@ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "requires": { - "tslib": "1.10.0" + "tslib": "^1.8.1" } }, "tt-react-custom-scrollbars": { @@ -13530,9 +13546,9 @@ "resolved": "https://registry.npmjs.org/tt-react-custom-scrollbars/-/tt-react-custom-scrollbars-4.2.1-tt2.tgz", "integrity": "sha512-gMEVHHOClNJXM1d/p4PrLdXtCU2JzWRtcZdzUkXgck8sgzkxwFwSDNc3scnTk21sSKG2GSgf7G54sboXwsMVlg==", "requires": { - "dom-css": "2.1.0", - "prop-types": "15.7.2", - "raf": "3.4.1" + "dom-css": "^2.0.0", + "prop-types": "^15.5.10", + "raf": "^3.1.0" } }, "tty-browserify": { @@ -13545,7 +13561,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.2.0" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -13564,7 +13580,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-is": { @@ -13574,7 +13590,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.24" + "mime-types": "~2.1.24" } }, "typedarray": { @@ -13594,7 +13610,7 @@ "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", "requires": { - "typescript-logic": "0.0.0" + "typescript-logic": "^0.0.0" } }, "typescript-logic": { @@ -13607,7 +13623,7 @@ "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", "requires": { - "typescript-compare": "0.0.2" + "typescript-compare": "^0.0.2" } }, "uglify-js": { @@ -13616,8 +13632,8 @@ "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, "requires": { - "commander": "2.19.0", - "source-map": "0.6.1" + "commander": "~2.19.0", + "source-map": "~0.6.1" }, "dependencies": { "commander": { @@ -13634,14 +13650,14 @@ "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", "dev": true, "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.7", - "serialize-javascript": "1.9.1", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.4.3", - "worker-farm": "1.7.0" + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" }, "dependencies": { "commander": { @@ -13656,9 +13672,9 @@ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, "pkg-dir": { @@ -13667,7 +13683,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } }, "uglify-es": { @@ -13676,8 +13692,8 @@ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "dev": true, "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" + "commander": "~2.13.0", + "source-map": "~0.6.1" } } } @@ -13699,8 +13715,8 @@ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "1.0.4", - "unicode-property-aliases-ecmascript": "1.0.5" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, "unicode-match-property-value-ecmascript": { @@ -13721,10 +13737,10 @@ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "2.0.1" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" } }, "uniq": { @@ -13745,7 +13761,7 @@ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "unique-slug": "2.0.2" + "unique-slug": "^2.0.0" } }, "unique-slug": { @@ -13754,7 +13770,7 @@ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "unpipe": { @@ -13775,8 +13791,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -13785,9 +13801,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -13826,7 +13842,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "urix": { @@ -13857,8 +13873,8 @@ "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "dev": true, "requires": { - "querystringify": "2.1.1", - "requires-port": "1.0.0" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, "use": { @@ -13893,8 +13909,8 @@ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, "requires": { - "define-properties": "1.1.3", - "object.getownpropertydescriptors": "2.0.3" + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" } }, "utila": { @@ -13930,8 +13946,8 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "requires": { - "spdx-correct": "3.1.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "value-equal": { @@ -13956,9 +13972,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "vm-browserify": { @@ -13971,7 +13987,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "requires": { - "loose-envify": "1.4.0" + "loose-envify": "^1.0.0" } }, "watchpack": { @@ -13980,9 +13996,9 @@ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "2.1.8", - "graceful-fs": "4.2.2", - "neo-async": "2.6.1" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "wbuf": { @@ -13991,7 +14007,7 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { - "minimalistic-assert": "1.0.1" + "minimalistic-assert": "^1.0.0" } }, "webpack": { @@ -14004,25 +14020,25 @@ "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/wasm-edit": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "6.3.0", - "ajv": "6.10.2", - "ajv-keywords": "3.4.1", - "chrome-trace-event": "1.0.2", - "enhanced-resolve": "4.1.1", - "eslint-scope": "4.0.3", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.4.0", - "loader-utils": "1.2.3", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.6.1", - "node-libs-browser": "2.2.1", - "schema-utils": "1.0.0", - "tapable": "1.1.3", - "terser-webpack-plugin": "1.4.1", - "watchpack": "1.6.0", - "webpack-sources": "1.4.3" + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" }, "dependencies": { "enhanced-resolve": { @@ -14031,9 +14047,9 @@ "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "memory-fs": "0.5.0", - "tapable": "1.1.3" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" }, "dependencies": { "memory-fs": { @@ -14042,8 +14058,8 @@ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } } } @@ -14054,8 +14070,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "schema-utils": { @@ -14064,9 +14080,9 @@ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "ajv": "6.10.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, "tapable": { @@ -14114,9 +14130,9 @@ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "3.1.0", - "strip-ansi": "5.2.0", - "wrap-ansi": "5.1.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "enhanced-resolve": { @@ -14125,9 +14141,9 @@ "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "memory-fs": "0.4.1", - "tapable": "1.1.3" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, "find-up": { @@ -14136,7 +14152,7 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, "get-caller-file": { @@ -14157,7 +14173,7 @@ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "2.0.0" + "invert-kv": "^2.0.0" } }, "locate-path": { @@ -14166,8 +14182,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "memory-fs": { @@ -14176,8 +14192,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "os-locale": { @@ -14186,9 +14202,9 @@ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.3.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "p-limit": { @@ -14197,7 +14213,7 @@ "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "p-try": "2.2.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -14206,7 +14222,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.2.1" + "p-limit": "^2.0.0" } }, "p-try": { @@ -14227,9 +14243,9 @@ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "strip-ansi": { @@ -14238,7 +14254,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } }, "supports-color": { @@ -14247,7 +14263,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "tapable": { @@ -14268,9 +14284,9 @@ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "string-width": "3.1.0", - "strip-ansi": "5.2.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, "y18n": { @@ -14285,17 +14301,17 @@ "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", "dev": true, "requires": { - "cliui": "5.0.0", - "find-up": "3.0.0", - "get-caller-file": "2.0.5", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "2.0.0", - "set-blocking": "2.0.0", - "string-width": "3.1.0", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "13.1.1" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" } }, "yargs-parser": { @@ -14304,8 +14320,8 @@ "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { - "camelcase": "5.3.1", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -14316,11 +14332,11 @@ "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", "dev": true, "requires": { - "memory-fs": "0.4.1", - "mime": "2.4.4", - "mkdirp": "0.5.1", - "range-parser": "1.2.1", - "webpack-log": "2.0.0" + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" }, "dependencies": { "memory-fs": { @@ -14329,8 +14345,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "mime": { @@ -14345,8 +14361,8 @@ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "dev": true, "requires": { - "ansi-colors": "3.2.4", - "uuid": "3.3.3" + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" } } } @@ -14358,37 +14374,37 @@ "dev": true, "requires": { "ansi-html": "0.0.7", - "bonjour": "3.5.0", - "chokidar": "2.1.8", - "compression": "1.7.4", - "connect-history-api-fallback": "1.6.0", - "debug": "4.1.1", - "del": "4.1.1", - "express": "4.17.1", - "html-entities": "1.2.1", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", "http-proxy-middleware": "0.19.1", - "import-local": "2.0.0", - "internal-ip": "4.3.0", - "ip": "1.1.5", - "is-absolute-url": "3.0.3", - "killable": "1.0.1", - "loglevel": "1.6.4", - "opn": "5.5.0", - "p-retry": "3.0.1", - "portfinder": "1.0.24", - "schema-utils": "1.0.0", - "selfsigned": "1.10.7", - "semver": "6.3.0", - "serve-index": "1.9.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.4", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.24", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", "sockjs": "0.3.19", "sockjs-client": "1.4.0", - "spdy": "4.0.1", - "strip-ansi": "3.0.1", - "supports-color": "6.1.0", - "url": "0.11.0", - "webpack-dev-middleware": "3.7.2", - "webpack-log": "2.0.0", - "ws": "6.2.1", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", "yargs": "12.0.5" }, "dependencies": { @@ -14410,9 +14426,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -14427,7 +14443,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -14438,7 +14454,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.1" } }, "find-up": { @@ -14447,7 +14463,7 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, "invert-kv": { @@ -14468,7 +14484,7 @@ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "2.0.0" + "invert-kv": "^2.0.0" } }, "locate-path": { @@ -14477,8 +14493,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "ms": { @@ -14493,9 +14509,9 @@ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.3.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "p-limit": { @@ -14504,7 +14520,7 @@ "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "p-try": "2.2.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -14513,7 +14529,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.2.1" + "p-limit": "^2.0.0" } }, "p-try": { @@ -14528,9 +14544,9 @@ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "ajv": "6.10.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, "semver": { @@ -14545,7 +14561,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "supports-color": { @@ -14554,7 +14570,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "webpack-log": { @@ -14563,8 +14579,8 @@ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "dev": true, "requires": { - "ansi-colors": "3.2.4", - "uuid": "3.3.3" + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" } }, "which-module": { @@ -14579,18 +14595,18 @@ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "11.1.1" + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" } }, "yargs-parser": { @@ -14599,8 +14615,8 @@ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { - "camelcase": "5.3.1", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -14611,10 +14627,10 @@ "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", "dev": true, "requires": { - "chalk": "2.4.2", - "log-symbols": "2.2.0", - "loglevelnext": "1.0.5", - "uuid": "3.3.3" + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" } }, "webpack-sources": { @@ -14623,8 +14639,8 @@ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { - "source-list-map": "2.0.1", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, "websocket-driver": { @@ -14633,9 +14649,9 @@ "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", "dev": true, "requires": { - "http-parser-js": "0.4.10", - "safe-buffer": "5.2.0", - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { @@ -14655,7 +14671,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -14668,7 +14684,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "requires": { - "string-width": "2.1.1" + "string-width": "^1.0.2 || 2" } }, "wolfy87-eventemitter": { @@ -14687,7 +14703,7 @@ "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -14695,8 +14711,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { @@ -14709,7 +14725,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -14717,9 +14733,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -14727,7 +14743,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -14742,7 +14758,7 @@ "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "ws": { @@ -14751,7 +14767,7 @@ "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { - "async-limiter": "1.0.1" + "async-limiter": "~1.0.0" } }, "xtend": { @@ -14774,19 +14790,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" }, "dependencies": { "ansi-regex": { @@ -14804,8 +14820,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "is-fullwidth-code-point": { @@ -14813,7 +14829,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "load-json-file": { @@ -14821,11 +14837,11 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { - "graceful-fs": "4.2.2", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "path-exists": { @@ -14833,7 +14849,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-type": { @@ -14841,9 +14857,9 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "4.2.2", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "read-pkg": { @@ -14851,9 +14867,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.5.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -14861,8 +14877,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "string-width": { @@ -14870,9 +14886,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -14880,7 +14896,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -14888,7 +14904,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -14898,7 +14914,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" }, "dependencies": { "camelcase": { diff --git a/package.json b/package.json index a055da27..9d36ae1e 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,7 @@ "sass-loader": "^7.3.1", "sass-resources-loader": "^2.0.0", "scrypt": "^6.0.3", + "sticky-sidebar": "^3.3.1", "throttle-debounce": "^2.1.0", "tslint": "^5.20.0", "tslint-config-airbnb": "^5.11.2", diff --git a/src/components/input/Button/index.tsx b/src/components/input/Button/index.tsx index af33a097..6020680f 100644 --- a/src/components/input/Button/index.tsx +++ b/src/components/input/Button/index.tsx @@ -1,5 +1,5 @@ import classnames from 'classnames'; -import React, { ButtonHTMLAttributes, DetailedHTMLProps, FC, createElement } from 'react'; +import React, { ButtonHTMLAttributes, DetailedHTMLProps, FC, createElement, memo } from 'react'; import * as styles from './styles.scss'; import { Icon } from '~/components/input/Icon'; import { IIcon } from '~/redux/types'; @@ -22,46 +22,48 @@ type IButtonProps = DetailedHTMLProps< iconOnly?: boolean; }; -const Button: FC<IButtonProps> = ({ - className = '', - size = 'normal', - iconLeft, - iconRight, - children, - seamless = false, - transparent = false, - non_submitting = false, - red = false, - grey = false, - is_loading, - title, - stretchy, - disabled, - iconOnly, - ...props -}) => - createElement( - seamless || non_submitting ? 'div' : 'button', - { - className: classnames(styles.button, className, styles[size], { - red, - grey, - seamless, - transparent, - disabled, - is_loading, - stretchy, - icon: ((iconLeft || iconRight) && !title && !children) || iconOnly, - has_icon_left: !!iconLeft, - has_icon_right: !!iconRight, - }), - ...props, - }, - [ - iconLeft && <Icon icon={iconLeft} size={20} key={0} />, - title ? <span>{title}</span> : children || null, - iconRight && <Icon icon={iconRight} size={20} key={2} />, - ] - ); +const Button: FC<IButtonProps> = memo( + ({ + className = '', + size = 'normal', + iconLeft, + iconRight, + children, + seamless = false, + transparent = false, + non_submitting = false, + red = false, + grey = false, + is_loading, + title, + stretchy, + disabled, + iconOnly, + ...props + }) => + createElement( + seamless || non_submitting ? 'div' : 'button', + { + className: classnames(styles.button, className, styles[size], { + red, + grey, + seamless, + transparent, + disabled, + is_loading, + stretchy, + icon: ((iconLeft || iconRight) && !title && !children) || iconOnly, + has_icon_left: !!iconLeft, + has_icon_right: !!iconRight, + }), + ...props, + }, + [ + iconLeft && <Icon icon={iconLeft} size={20} key={0} />, + title ? <span>{title}</span> : children || null, + iconRight && <Icon icon={iconRight} size={20} key={2} />, + ] + ) +); export { Button }; diff --git a/src/components/node/NodeComments/index.tsx b/src/components/node/NodeComments/index.tsx index ab9982ba..c038a405 100644 --- a/src/components/node/NodeComments/index.tsx +++ b/src/components/node/NodeComments/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useMemo } from 'react'; +import React, { FC, useMemo, memo } from 'react'; import { Comment } from '../Comment'; import { Filler } from '~/components/containers/Filler'; @@ -10,7 +10,7 @@ interface IProps { comments?: IComment[]; } -const NodeComments: FC<IProps> = ({ comments }) => { +const NodeComments: FC<IProps> = memo(({ comments }) => { const groupped: ICommentGroup[] = useMemo(() => comments.reduce(groupCommentsByUser, []), [ comments, ]); @@ -24,6 +24,6 @@ const NodeComments: FC<IProps> = ({ comments }) => { <Filler /> </div> ); -}; +}); export { NodeComments }; diff --git a/src/components/node/NodePanel/index.tsx b/src/components/node/NodePanel/index.tsx index e3494792..ff862110 100644 --- a/src/components/node/NodePanel/index.tsx +++ b/src/components/node/NodePanel/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; +import React, { FC, useCallback, useEffect, useRef, useState, memo } from 'react'; import * as styles from './styles.scss'; import { INode } from '~/redux/types'; import { createPortal } from 'react-dom'; @@ -14,7 +14,7 @@ interface IProps { onLike: () => void; } -const NodePanel: FC<IProps> = ({ node, layout, can_edit, can_like, onEdit, onLike }) => { +const NodePanel: FC<IProps> = memo(({ node, layout, can_edit, can_like, onEdit, onLike }) => { const [stack, setStack] = useState(false); const ref = useRef(null); @@ -64,6 +64,6 @@ const NodePanel: FC<IProps> = ({ node, layout, can_edit, can_like, onEdit, onLik )} </div> ); -}; +}); export { NodePanel }; diff --git a/src/components/node/NodeTags/index.tsx b/src/components/node/NodeTags/index.tsx index 3e153572..6c541051 100644 --- a/src/components/node/NodeTags/index.tsx +++ b/src/components/node/NodeTags/index.tsx @@ -1,4 +1,4 @@ -import React, { FC } from 'react'; +import React, { FC, memo } from 'react'; import { Tags } from '../Tags'; import { ITag } from '~/redux/types'; @@ -8,8 +8,8 @@ interface IProps { onChange?: (tags: string[]) => void; } -const NodeTags: FC<IProps> = ({ is_editable, tags, onChange }) => ( +const NodeTags: FC<IProps> = memo(({ is_editable, tags, onChange }) => ( <Tags tags={tags} is_editable={is_editable} onTagsChange={onChange} /> -); +)); export { NodeTags }; diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index 43da34de..7bae3e15 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, createElement, useEffect, useCallback, useState, useMemo } from 'react'; +import React, { FC, createElement, useEffect, useCallback, useState, useMemo, memo } from 'react'; import { RouteComponentProps } from 'react-router'; import { connect } from 'react-redux'; import { canEditNode, canLikeNode } from '~/utils/node'; @@ -35,97 +35,99 @@ type IProps = ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & RouteComponentProps<{ id: string }> & {}; -const NodeLayoutUnconnected: FC<IProps> = ({ - match: { - params: { id }, - }, - node: { is_loading, is_loading_comments, comments = [], current: node, current_cover_image }, - user, - user: { is_user }, - nodeLoadNode, - nodeUpdateTags, - nodeEdit, - nodeLike, - nodeSetCoverImage, -}) => { - const [layout, setLayout] = useState({}); - - const updateLayout = useCallback(() => setLayout({}), []); - - useEffect(() => { - if (is_loading) return; - nodeLoadNode(parseInt(id, 10), null); - }, [nodeLoadNode, id]); - - const onTagsChange = useCallback( - (tags: string[]) => { - nodeUpdateTags(node.id, tags); +const NodeLayoutUnconnected: FC<IProps> = memo( + ({ + match: { + params: { id }, }, - [node, nodeUpdateTags] - ); + node: { is_loading, is_loading_comments, comments = [], current: node, current_cover_image }, + user, + user: { is_user }, + nodeLoadNode, + nodeUpdateTags, + nodeEdit, + nodeLike, + nodeSetCoverImage, + }) => { + const [layout, setLayout] = useState({}); - const can_edit = useMemo(() => canEditNode(node, user), [node, user]); - const can_like = useMemo(() => canLikeNode(node, user), [node, user]); + const updateLayout = useCallback(() => setLayout({}), []); - const block = node && node.type && NODE_COMPONENTS[node.type]; - const inline_block = node && node.type && NODE_INLINES[node.type]; + useEffect(() => { + if (is_loading) return; + nodeLoadNode(parseInt(id, 10), null); + }, [nodeLoadNode, id]); - const onEdit = useCallback(() => nodeEdit(node.id), [nodeEdit, node]); - const onLike = useCallback(() => nodeLike(node.id), [nodeLike, node]); + const onTagsChange = useCallback( + (tags: string[]) => { + nodeUpdateTags(node.id, tags); + }, + [node, nodeUpdateTags] + ); - useEffect(() => { - if (!node.cover) return; - nodeSetCoverImage(node.cover); - return () => nodeSetCoverImage(null); - }, [nodeSetCoverImage, node.cover]); + const can_edit = useMemo(() => canEditNode(node, user), [node, user]); + const can_like = useMemo(() => canLikeNode(node, user), [node, user]); - return ( - <Card className={styles.node} seamless> - {block && createElement(block, { node, is_loading, updateLayout, layout })} + const block = node && node.type && NODE_COMPONENTS[node.type]; + const inline_block = node && node.type && NODE_INLINES[node.type]; - <NodePanel - node={node} - layout={layout} - can_edit={can_edit} - can_like={can_like} - onEdit={onEdit} - onLike={onLike} - /> + const onEdit = useCallback(() => nodeEdit(node.id), [nodeEdit, node]); + const onLike = useCallback(() => nodeLike(node.id), [nodeLike, node]); - <Group> - <Padder> - <Group horizontal className={styles.content}> - <Group className={styles.comments}> - {inline_block && ( - <div className={styles.inline_block}> - {createElement(inline_block, { node, is_loading, updateLayout, layout })} - </div> - )} + useEffect(() => { + if (!node.cover) return; + nodeSetCoverImage(node.cover); + return () => nodeSetCoverImage(null); + }, [nodeSetCoverImage, node.cover]); - {is_loading_comments || !comments.length ? ( - <NodeNoComments is_loading={is_loading_comments} /> - ) : ( - <NodeComments comments={comments} /> - )} + return ( + <Card className={styles.node} seamless> + {block && createElement(block, { node, is_loading, updateLayout, layout })} - {is_user && <CommentForm id={0} />} - </Group> + <NodePanel + node={node} + layout={layout} + can_edit={can_edit} + can_like={can_like} + onEdit={onEdit} + onLike={onLike} + /> - <div className={styles.panel}> - <Group style={{ flex: 1, minWidth: 0 }}> - <NodeTags is_editable={is_user} tags={node.tags} onChange={onTagsChange} /> + <Group> + <Padder> + <Group horizontal className={styles.content}> + <Group className={styles.comments}> + {inline_block && ( + <div className={styles.inline_block}> + {createElement(inline_block, { node, is_loading, updateLayout, layout })} + </div> + )} - <NodeRelated title="First album" /> + {is_loading_comments || !comments.length ? ( + <NodeNoComments is_loading={is_loading_comments} /> + ) : ( + <NodeComments comments={comments} /> + )} - <NodeRelated title="Second album" /> + {is_user && <CommentForm id={0} />} </Group> - </div> - </Group> - </Padder> - </Group> - </Card> - ); -}; + + <div className={styles.panel}> + <Group style={{ flex: 1, minWidth: 0 }}> + <NodeTags is_editable={is_user} tags={node.tags} onChange={onTagsChange} /> + + <NodeRelated title="First album" /> + + <NodeRelated title="Second album" /> + </Group> + </div> + </Group> + </Padder> + </Group> + </Card> + ); + } +); const NodeLayout = connect( mapStateToProps, From f169de370a52b998abd00442720192087a5e97e6 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 10:42:25 +0700 Subject: [PATCH 66/99] optimized scrolls --- .../containers/BlurWrapper/styles.scss | 6 +- .../containers/CommentWrapper/styles.scss | 1 + src/components/containers/PageCover/index.tsx | 7 +- .../containers/PageCover/styles.scss | 1 + .../EditorUploadCoverButton/styles.scss | 1 + src/components/flow/Cell/styles.scss | 1 + .../flow/HeroPlaceholder/style.scss | 4 +- src/components/main/Header/index.tsx | 6 +- src/components/media/AudioPlayer/index.tsx | 127 ++++++++++-------- src/components/node/Comment/index.tsx | 47 +++---- src/components/node/CommentContent/index.tsx | 6 +- .../node/NodeAudioImageBlock/styles.scss | 1 + 12 files changed, 110 insertions(+), 98 deletions(-) diff --git a/src/components/containers/BlurWrapper/styles.scss b/src/components/containers/BlurWrapper/styles.scss index 253b89c5..b081deff 100644 --- a/src/components/containers/BlurWrapper/styles.scss +++ b/src/components/containers/BlurWrapper/styles.scss @@ -1,7 +1,7 @@ .blur { filter: blur(0); transition: filter 0.25s; - max-height: 100vh; - width: 100vw; - overflow: visible auto; + // max-height: 100vh; + // width: 100vw; + // overflow: visible auto; } diff --git a/src/components/containers/CommentWrapper/styles.scss b/src/components/containers/CommentWrapper/styles.scss index 42897f16..4a8c3e24 100644 --- a/src/components/containers/CommentWrapper/styles.scss +++ b/src/components/containers/CommentWrapper/styles.scss @@ -55,6 +55,7 @@ border-radius: $panel_radius 0 0 $panel_radius; background-size: cover; flex: 0 0 $comment_height; + will-change: transform; @include tablet { height: 32px; diff --git a/src/components/containers/PageCover/index.tsx b/src/components/containers/PageCover/index.tsx index c461a2a8..cf4d05dc 100644 --- a/src/components/containers/PageCover/index.tsx +++ b/src/components/containers/PageCover/index.tsx @@ -1,4 +1,4 @@ -import React, { FC } from 'react'; +import React, { FC, memo } from 'react'; import * as styles from './styles.scss'; import { createPortal } from 'react-dom'; import { selectNode } from '~/redux/node/selectors'; @@ -10,7 +10,7 @@ const mapStateToProps = state => pick(['current_cover_image'], selectNode(state) type IProps = ReturnType<typeof mapStateToProps> & {}; -const PageCoverUnconnected: FC<IProps> = ({ current_cover_image }) => +const PageCoverUnconnected: FC<IProps> = memo(({ current_cover_image }) => current_cover_image ? createPortal( <div @@ -19,7 +19,8 @@ const PageCoverUnconnected: FC<IProps> = ({ current_cover_image }) => />, document.body ) - : null; + : null +); const PageCover = connect(mapStateToProps)(PageCoverUnconnected); export { PageCover }; diff --git a/src/components/containers/PageCover/styles.scss b/src/components/containers/PageCover/styles.scss index 2816ba7b..3081fccd 100644 --- a/src/components/containers/PageCover/styles.scss +++ b/src/components/containers/PageCover/styles.scss @@ -17,6 +17,7 @@ width: 100%; height: 100%; animation: fadeIn 2s; + will-change: transform, opacity; &::after { content: ' '; diff --git a/src/components/editors/EditorUploadCoverButton/styles.scss b/src/components/editors/EditorUploadCoverButton/styles.scss index ccb396ec..18237537 100644 --- a/src/components/editors/EditorUploadCoverButton/styles.scss +++ b/src/components/editors/EditorUploadCoverButton/styles.scss @@ -50,6 +50,7 @@ border-radius: ($upload_button_height / 2) !important; background: 50% 50% no-repeat; background-size: cover; + will-change: transform; display: flex; align-items: center; flex-direction: row; diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index f9b20df7..6ea16ac5 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -110,6 +110,7 @@ border-radius: $cell_radius + 2px; opacity: 0; transition: opacity 0.5s; + will-change: transform; & > img { opacity: 0; diff --git a/src/components/flow/HeroPlaceholder/style.scss b/src/components/flow/HeroPlaceholder/style.scss index ae7a9405..9d180bb9 100644 --- a/src/components/flow/HeroPlaceholder/style.scss +++ b/src/components/flow/HeroPlaceholder/style.scss @@ -1,9 +1,11 @@ .container { height: 280px; width: 100%; - background: transparentize(white, 0.9) url("http://37.192.131.144/hero/photos/photo-20140527-1639766.jpg") no-repeat 50% 30%; + background: transparentize(white, 0.9) + url('http://37.192.131.144/hero/photos/photo-20140527-1639766.jpg') no-repeat 50% 30%; background-size: cover; opacity: 0.7; + will-change: transform; //box-shadow: white 0 0 0 1px; //border-radius: $panel_radius $panel_radius 0 0; } diff --git a/src/components/main/Header/index.tsx b/src/components/main/Header/index.tsx index 7f1476c7..89b3aef7 100644 --- a/src/components/main/Header/index.tsx +++ b/src/components/main/Header/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useCallback } from 'react'; +import React, { FC, useCallback, memo } from 'react'; import { connect } from 'react-redux'; import { push as historyPush } from 'connected-react-router'; import { Link } from 'react-router-dom'; @@ -25,7 +25,7 @@ const mapDispatchToProps = { type IProps = ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & {}; -const HeaderUnconnected: FC<IProps> = ({ user: { username, is_user, photo }, showDialog }) => { +const HeaderUnconnected: FC<IProps> = memo(({ user: { username, is_user, photo }, showDialog }) => { const onLogin = useCallback(() => showDialog(DIALOGS.LOGIN), [showDialog]); return ( @@ -54,7 +54,7 @@ const HeaderUnconnected: FC<IProps> = ({ user: { username, is_user, photo }, sho )} </div> ); -}; +}); const Header = connect( mapStateToProps, diff --git a/src/components/media/AudioPlayer/index.tsx b/src/components/media/AudioPlayer/index.tsx index 5dcbf462..c5079e63 100644 --- a/src/components/media/AudioPlayer/index.tsx +++ b/src/components/media/AudioPlayer/index.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useState, useEffect } from 'react'; +import React, { useCallback, useState, useEffect, memo } from 'react'; import { connect } from 'react-redux'; import { selectPlayer } from '~/redux/player/selectors'; import * as PLAYER_ACTIONS from '~/redux/player/actions'; @@ -25,76 +25,85 @@ type Props = ReturnType<typeof mapStateToProps> & file: IFile; }; -const AudioPlayerUnconnected = ({ - file, - player: { file: current, status }, +const AudioPlayerUnconnected = memo( + ({ + file, + player: { file: current, status }, + playerSetFileAndPlay, + playerPlay, + playerPause, + playerSeek, + }: Props) => { + const [playing, setPlaying] = useState(false); + const [progress, setProgress] = useState<IPlayerProgress>({ + progress: 0, + current: 0, + total: 0, + }); - playerSetFileAndPlay, - playerPlay, - playerPause, - playerSeek, -}: Props) => { - const [playing, setPlaying] = useState(false); - const [progress, setProgress] = useState<IPlayerProgress>({ progress: 0, current: 0, total: 0 }); + const onPlay = useCallback(() => { + if (current && current.id === file.id) { + if (status === PLAYER_STATES.PLAYING) return playerPause(); + return playerPlay(); + } - const onPlay = useCallback(() => { - if (current && current.id === file.id) { - if (status === PLAYER_STATES.PLAYING) return playerPause(); - return playerPlay(); - } + playerSetFileAndPlay(file); + }, [file, current, status, playerPlay, playerPause, playerSetFileAndPlay]); - playerSetFileAndPlay(file); - }, [file, current, status, playerPlay, playerPause, playerSetFileAndPlay]); + const onProgress = useCallback( + ({ detail }: { detail: IPlayerProgress }) => { + if (!detail || !detail.total) return; + setProgress(detail); + }, + [setProgress] + ); - const onProgress = useCallback( - ({ detail }: { detail: IPlayerProgress }) => { - if (!detail || !detail.total) return; - setProgress(detail); - }, - [setProgress] - ); + const onSeek = useCallback( + event => { + event.stopPropagation(); + const { clientX, target } = event; + const { left, width } = target.getBoundingClientRect(); + playerSeek((clientX - left) / width); + }, + [playerSeek] + ); - const onSeek = useCallback( - event => { - event.stopPropagation(); - const { clientX, target } = event; - const { left, width } = target.getBoundingClientRect(); - playerSeek((clientX - left) / width); - }, - [playerSeek] - ); + useEffect(() => { + const active = current && current.id === file.id; + setPlaying(current && current.id === file.id); - useEffect(() => { - const active = current && current.id === file.id; - setPlaying(current && current.id === file.id); + if (active) Player.on('playprogress', onProgress); - if (active) Player.on('playprogress', onProgress); + return () => { + if (active) Player.off('playprogress', onProgress); + }; + }, [file, current, setPlaying, onProgress]); - return () => { - if (active) Player.off('playprogress', onProgress); - }; - }, [file, current, setPlaying, onProgress]); + const title = + file.metadata && + (file.metadata.title || + [file.metadata.id3artist, file.metadata.id3title].filter(el => !!el).join(' - ')); - const title = - file.metadata && - (file.metadata.title || - [file.metadata.id3artist, file.metadata.id3title].filter(el => !!el).join(' - ')); + return ( + <div onClick={onPlay} className={classNames(styles.wrap, { playing })}> + <div className={styles.playpause}> + {playing && status === PLAYER_STATES.PLAYING ? ( + <Icon icon="pause" /> + ) : ( + <Icon icon="play" /> + )} + </div> + <div className={styles.content}> + <div className={styles.title}>{title || 'Unknown'}</div> - return ( - <div onClick={onPlay} className={classNames(styles.wrap, { playing })}> - <div className={styles.playpause}> - {playing && status === PLAYER_STATES.PLAYING ? <Icon icon="pause" /> : <Icon icon="play" />} - </div> - <div className={styles.content}> - <div className={styles.title}>{title || 'Unknown'}</div> - - <div className={styles.progress} onClick={onSeek}> - <div className={styles.bar} style={{ width: `${progress.progress}%` }} /> + <div className={styles.progress} onClick={onSeek}> + <div className={styles.bar} style={{ width: `${progress.progress}%` }} /> + </div> </div> </div> - </div> - ); -}; + ); + } +); export const AudioPlayer = connect( mapStateToProps, diff --git a/src/components/node/Comment/index.tsx b/src/components/node/Comment/index.tsx index e3b1f3b0..52298ba0 100644 --- a/src/components/node/Comment/index.tsx +++ b/src/components/node/Comment/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, HTMLAttributes } from 'react'; +import React, { FC, HTMLAttributes, memo } from 'react'; import { CommentWrapper } from '~/components/containers/CommentWrapper'; import { ICommentGroup } from '~/redux/types'; import { getURL } from '~/utils/dom'; @@ -12,30 +12,25 @@ type IProps = HTMLAttributes<HTMLDivElement> & { is_same?: boolean; }; -const Comment: FC<IProps> = ({ - comment_group, - is_empty, - is_same, - is_loading, - className, - ...props -}) => { - return ( - <CommentWrapper - className={className} - is_empty={is_empty} - is_loading={is_loading} - user={comment_group.user} - is_same={is_same} - {...props} - > - <div className={styles.wrap}> - {comment_group.comments.map(comment => ( - <CommentContent comment={comment} key={comment.id} /> - ))} - </div> - </CommentWrapper> - ); -}; +const Comment: FC<IProps> = memo( + ({ comment_group, is_empty, is_same, is_loading, className, ...props }) => { + return ( + <CommentWrapper + className={className} + is_empty={is_empty} + is_loading={is_loading} + user={comment_group.user} + is_same={is_same} + {...props} + > + <div className={styles.wrap}> + {comment_group.comments.map(comment => ( + <CommentContent comment={comment} key={comment.id} /> + ))} + </div> + </CommentWrapper> + ); + } +); export { Comment }; diff --git a/src/components/node/CommentContent/index.tsx b/src/components/node/CommentContent/index.tsx index ed4503cc..cbba18a2 100644 --- a/src/components/node/CommentContent/index.tsx +++ b/src/components/node/CommentContent/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useMemo } from 'react'; +import React, { FC, useMemo, memo } from 'react'; import { IComment, IFile } from '~/redux/types'; import path from 'ramda/es/path'; import { formatCommentText, getURL, getPrettyDate } from '~/utils/dom'; @@ -15,7 +15,7 @@ interface IProps { comment: IComment; } -const CommentContent: FC<IProps> = ({ comment }) => { +const CommentContent: FC<IProps> = memo(({ comment }) => { const groupped = useMemo<Record<keyof typeof UPLOAD_TYPES, IFile[]>>( () => reduce( @@ -68,7 +68,7 @@ const CommentContent: FC<IProps> = ({ comment }) => { )} </> ); -}; +}); export { CommentContent }; diff --git a/src/components/node/NodeAudioImageBlock/styles.scss b/src/components/node/NodeAudioImageBlock/styles.scss index 8d235c9e..34c81e8a 100644 --- a/src/components/node/NodeAudioImageBlock/styles.scss +++ b/src/components/node/NodeAudioImageBlock/styles.scss @@ -29,4 +29,5 @@ background: no-repeat 50% 30%; background-size: cover; z-index: 1; + will-change: transform; } From 34e449dd15558c9289a308d2234d1b03af4ddcfc Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 11:19:24 +0700 Subject: [PATCH 67/99] like animation --- .../node/NodeImageSlideBlock/styles.scss | 1 + src/components/node/NodePanelInner/index.tsx | 12 ++++--- .../node/NodePanelInner/styles.scss | 36 +++++++++++++++++++ src/sprites/Sprites.tsx | 5 +++ 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/components/node/NodeImageSlideBlock/styles.scss b/src/components/node/NodeImageSlideBlock/styles.scss index 4824443b..69a5f869 100644 --- a/src/components/node/NodeImageSlideBlock/styles.scss +++ b/src/components/node/NodeImageSlideBlock/styles.scss @@ -16,6 +16,7 @@ position: relative; overflow: hidden; user-select: none; + will-change: transform, height; .image { max-height: 960px; diff --git a/src/components/node/NodePanelInner/index.tsx b/src/components/node/NodePanelInner/index.tsx index 3364f0f8..92719751 100644 --- a/src/components/node/NodePanelInner/index.tsx +++ b/src/components/node/NodePanelInner/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; +import React, { FC } from 'react'; import * as styles from './styles.scss'; import { Group } from '~/components/containers/Group'; import { Filler } from '~/components/containers/Filler'; @@ -17,7 +17,7 @@ interface IProps { } const NodePanelInner: FC<IProps> = ({ - node: { title, user }, + node: { title, user, is_liked }, stack, can_edit, can_like, @@ -41,8 +41,12 @@ const NodePanelInner: FC<IProps> = ({ </div> )} {can_like && ( - <div> - <Icon icon="heart" size={24} onClick={onLike} /> + <div className={classNames(styles.like, { is_liked })}> + {is_liked ? ( + <Icon icon="heart_full" size={24} onClick={onLike} /> + ) : ( + <Icon icon="heart" size={24} onClick={onLike} /> + )} </div> )} </div> diff --git a/src/components/node/NodePanelInner/styles.scss b/src/components/node/NodePanelInner/styles.scss index 133cb699..f79e771a 100644 --- a/src/components/node/NodePanelInner/styles.scss +++ b/src/components/node/NodePanelInner/styles.scss @@ -124,3 +124,39 @@ .sep { } + +@keyframes pulse { + 0% { + transform: scale(1); + } + + 45% { + transform: scale(1); + } + + 60% { + transform: scale(1.25); + } + + 75% { + transform: scale(1); + } + + 90% { + transform: scale(1.25); + } + + 100% { + transform: scale(1); + } +} + +.like { + transition: fill, stroke 0.25s; + will-change: transform; + + &:hover { + fill: $red; + animation: pulse 0.75s infinite; + } +} diff --git a/src/sprites/Sprites.tsx b/src/sprites/Sprites.tsx index c4631a4f..391f9a54 100644 --- a/src/sprites/Sprites.tsx +++ b/src/sprites/Sprites.tsx @@ -49,6 +49,11 @@ const Sprites: FC<{}> = () => ( <path d="M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z" /> </g> + <g id="heart_full" stroke="none"> + <path fill="none" d="M0 0h24v24H0V0z" /> + <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" /> + </g> + <g id="edit" stroke="none"> <path fill="none" d="M0 0h24v24H0V0z" /> <path d="M14.06 9.02l.92.92L5.92 19H5v-.92l9.06-9.06M17.66 3c-.25 0-.51.1-.7.29l-1.83 1.83 3.75 3.75 1.83-1.83c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.2-.2-.45-.29-.71-.29zm-3.6 3.19L3 17.25V21h3.75L17.81 9.94l-3.75-3.75z" /> From fea0a37457e8938c14a561fd04d5ab8e356d1a3b Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 11:35:04 +0700 Subject: [PATCH 68/99] node liking --- .../node/NodePanelInner/styles.scss | 10 ++++- src/constants/api.ts | 1 + src/redux/node/api.ts | 11 +++++ src/redux/node/sagas.ts | 45 ++++++++++++++++++- 4 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/components/node/NodePanelInner/styles.scss b/src/components/node/NodePanelInner/styles.scss index f79e771a..58358e10 100644 --- a/src/components/node/NodePanelInner/styles.scss +++ b/src/components/node/NodePanelInner/styles.scss @@ -135,7 +135,7 @@ } 60% { - transform: scale(1.25); + transform: scale(1.4); } 75% { @@ -143,7 +143,7 @@ } 90% { - transform: scale(1.25); + transform: scale(1.4); } 100% { @@ -155,6 +155,12 @@ transition: fill, stroke 0.25s; will-change: transform; + &:global(.is_liked) { + svg { + fill: $red; + } + } + &:hover { fill: $red; animation: pulse 0.75s infinite; diff --git a/src/constants/api.ts b/src/constants/api.ts index 21637064..9fcc0800 100644 --- a/src/constants/api.ts +++ b/src/constants/api.ts @@ -14,5 +14,6 @@ export const API = { COMMENT: (id: INode['id']) => `/node/${id}/comment`, UPDATE_TAGS: (id: INode['id']) => `/node/${id}/tags`, + POST_LIKE: (id: INode['id']) => `/node/${id}/like`, }, }; diff --git a/src/redux/node/api.ts b/src/redux/node/api.ts index e8f6da65..1ca5da81 100644 --- a/src/redux/node/api.ts +++ b/src/redux/node/api.ts @@ -75,3 +75,14 @@ export const updateNodeTags = ({ .post(API.NODE.UPDATE_TAGS(id), { tags }, configWithToken(access)) .then(resultMiddleware) .catch(errorMiddleware); + +export const postNodeLike = ({ + id, + access, +}: ReturnType<typeof nodeUpdateTags> & { access: string }): Promise< + IResultWithStatus<{ is_liked: INode['is_liked'] }> +> => + api + .post(API.NODE.POST_LIKE(id), {}, configWithToken(access)) + .then(resultMiddleware) + .catch(errorMiddleware); diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index 2749d7fc..854ad486 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -18,8 +18,16 @@ import { nodeCreate, nodeSetEditor, nodeEdit, + nodeLike, } from './actions'; -import { postNode, getNode, postNodeComment, getNodeComments, updateNodeTags } from './api'; +import { + postNode, + getNode, + postNodeComment, + getNodeComments, + updateNodeTags, + postNodeLike, +} from './api'; import { reqWrapper } from '../auth/sagas'; import { flowSetNodes } from '../flow/actions'; import { ERRORS } from '~/constants/errors'; @@ -29,6 +37,23 @@ import { URLS } from '~/constants/urls'; import { selectNode } from './selectors'; import { IResultWithStatus, INode } from '../types'; import { NODE_EDITOR_DIALOGS, DIALOGS } from '../modal/constants'; +import { INodeState } from './reducer'; +import { IFlowState } from '../flow/reducer'; + +function* updateNodeEverythere(node) { + const { + current: { id }, + }: INodeState = yield select(selectNode); + const flow_nodes: IFlowState['nodes'] = yield select(selectFlowNodes); + + if (id === node.id) { + yield put(nodeSetCurrent(node)); + } + + yield put( + flowSetNodes(flow_nodes.map(flow_node => (flow_node.id === node.id ? node : flow_node))) + ); +} function* onNodeSave({ node }: ReturnType<typeof nodeSave>) { yield put(nodeSetSaveErrors({})); @@ -153,6 +178,23 @@ function* onEditSaga({ id }: ReturnType<typeof nodeEdit>) { yield put(nodeSetEditor(node)); yield put(modalShowDialog(NODE_EDITOR_DIALOGS[node.type])); + + return true; +} + +function* onLikeSaga({ id }: ReturnType<typeof nodeLike>) { + const { + current, + current: { is_liked }, + } = yield select(selectNode); + + yield call(updateNodeEverythere, { ...current, is_liked: !is_liked }); + + const { data, error } = yield call(reqWrapper, postNodeLike, { id }); + + if (!error || data.is_liked === !is_liked) return; // ok and matches + + yield call(updateNodeEverythere, { ...current, is_liked }); } export default function* nodeSaga() { @@ -162,4 +204,5 @@ export default function* nodeSaga() { yield takeLatest(NODE_ACTIONS.UPDATE_TAGS, onUpdateTags); yield takeLatest(NODE_ACTIONS.CREATE, onCreateSaga); yield takeLatest(NODE_ACTIONS.EDIT, onEditSaga); + yield takeLatest(NODE_ACTIONS.LIKE, onLikeSaga); } From a1dbb6bdfa31c061f4456a89c81beaaba33debde Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 11:38:03 +0700 Subject: [PATCH 69/99] the flow is squared now --- src/components/flow/FlowGrid/styles.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/flow/FlowGrid/styles.scss b/src/components/flow/FlowGrid/styles.scss index bda06973..be508db9 100644 --- a/src/components/flow/FlowGrid/styles.scss +++ b/src/components/flow/FlowGrid/styles.scss @@ -16,18 +16,24 @@ $cols: $content_width / $cell; @media (max-width: $cell * 5) { grid-template-columns: repeat(4, 1fr); + grid-auto-rows: 25vw; } @media (max-width: $cell * 4) { grid-template-columns: repeat(3, 1fr); + grid-auto-rows: 33vw; } @media (max-width: $cell * 3) { grid-template-columns: repeat(2, 1fr); + grid-auto-rows: 50vw; } @media (max-width: $cell * 2) { grid-template-columns: repeat(1, 1fr); + grid-auto-rows: 75vw; + grid-column-gap: $gap; + grid-row-gap: $gap; } } From c49dbb344ddb291be247cf303ea9cb877dbb32c0 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 11:46:08 +0700 Subject: [PATCH 70/99] added is_heroic --- src/components/containers/BlurWrapper/styles.scss | 1 + src/redux/node/constants.ts | 14 ++++++++++---- src/redux/types.ts | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/containers/BlurWrapper/styles.scss b/src/components/containers/BlurWrapper/styles.scss index b081deff..113865fb 100644 --- a/src/components/containers/BlurWrapper/styles.scss +++ b/src/components/containers/BlurWrapper/styles.scss @@ -1,6 +1,7 @@ .blur { filter: blur(0); transition: filter 0.25s; + will-change: filter; // max-height: 100vh; // width: 100vw; // overflow: visible auto; diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 74026ed5..d964e2fc 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -12,6 +12,7 @@ import { AudioEditor } from '~/components/editors/AudioEditor'; import { EditorImageUploadButton } from '~/components/editors/EditorImageUploadButton'; import { EditorAudioUploadButton } from '~/components/editors/EditorAudioUploadButton'; import { EditorUploadCoverButton } from '~/components/editors/EditorUploadCoverButton'; +import { Filler } from '~/components/containers/Filler'; const prefix = 'NODE.'; export const NODE_ACTIONS = { @@ -100,10 +101,15 @@ export const NODE_EDITORS = { }; export const NODE_PANEL_COMPONENTS = { - [NODE_TYPES.TEXT]: [EditorUploadCoverButton], - [NODE_TYPES.VIDEO]: [EditorUploadCoverButton], - [NODE_TYPES.IMAGE]: [EditorImageUploadButton, EditorUploadCoverButton], - [NODE_TYPES.AUDIO]: [EditorAudioUploadButton, EditorImageUploadButton, EditorUploadCoverButton], + [NODE_TYPES.TEXT]: [Filler, EditorUploadCoverButton], + [NODE_TYPES.VIDEO]: [Filler, EditorUploadCoverButton], + [NODE_TYPES.IMAGE]: [EditorImageUploadButton, Filler, EditorUploadCoverButton], + [NODE_TYPES.AUDIO]: [ + EditorAudioUploadButton, + EditorImageUploadButton, + Filler, + EditorUploadCoverButton, + ], }; export const NODE_EDITOR_DATA: Record< diff --git a/src/redux/types.ts b/src/redux/types.ts index cd9e592a..b7b98a2c 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -120,6 +120,7 @@ export interface INode { thumbnail?: string; description?: string; is_liked?: boolean; + is_heroic?: boolean; options: { flow: { From 6b5638b44ecaccd782d7986599b6999f13dee552 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 12:02:35 +0700 Subject: [PATCH 71/99] added nodes heroize button --- src/components/node/NodePanel/index.tsx | 90 ++++++++++--------- src/components/node/NodePanelInner/index.tsx | 17 +++- .../node/NodePanelInner/styles.scss | 15 ++++ src/constants/api.ts | 1 + src/containers/node/NodeLayout/index.tsx | 13 ++- src/redux/node/actions.ts | 5 ++ src/redux/node/api.ts | 15 +++- src/redux/node/constants.ts | 1 + src/redux/node/sagas.ts | 17 ++++ src/sprites/Sprites.tsx | 10 +++ src/utils/node.ts | 3 + 11 files changed, 140 insertions(+), 47 deletions(-) diff --git a/src/components/node/NodePanel/index.tsx b/src/components/node/NodePanel/index.tsx index ff862110..ba745934 100644 --- a/src/components/node/NodePanel/index.tsx +++ b/src/components/node/NodePanel/index.tsx @@ -3,67 +3,77 @@ import * as styles from './styles.scss'; import { INode } from '~/redux/types'; import { createPortal } from 'react-dom'; import { NodePanelInner } from '~/components/node/NodePanelInner'; +import pick from 'ramda/es/pick'; interface IProps { - node: INode; + node: Partial<INode>; layout: {}; can_edit: boolean; can_like: boolean; + can_star: boolean; + onEdit: () => void; onLike: () => void; + onStar: () => void; } -const NodePanel: FC<IProps> = memo(({ node, layout, can_edit, can_like, onEdit, onLike }) => { - const [stack, setStack] = useState(false); +const NodePanel: FC<IProps> = memo( + ({ node, layout, can_edit, can_like, can_star, onEdit, onLike, onStar }) => { + const [stack, setStack] = useState(false); - const ref = useRef(null); - const getPlace = useCallback(() => { - if (!ref.current) return; + const ref = useRef(null); + const getPlace = useCallback(() => { + if (!ref.current) return; - const { offsetTop } = ref.current; - const { height } = ref.current.getBoundingClientRect(); - const { scrollY, innerHeight } = window; + const { offsetTop } = ref.current; + const { height } = ref.current.getBoundingClientRect(); + const { scrollY, innerHeight } = window; - setStack(offsetTop > scrollY + innerHeight - height); - }, [ref]); + setStack(offsetTop > scrollY + innerHeight - height); + }, [ref]); - useEffect(() => { - getPlace(); - window.addEventListener('scroll', getPlace); - window.addEventListener('resize', getPlace); + useEffect(() => { + getPlace(); + window.addEventListener('scroll', getPlace); + window.addEventListener('resize', getPlace); - return () => { - window.removeEventListener('scroll', getPlace); - window.removeEventListener('resize', getPlace); - }; - }, [layout]); + return () => { + window.removeEventListener('scroll', getPlace); + window.removeEventListener('resize', getPlace); + }; + }, [layout]); - return ( - <div className={styles.place} ref={ref}> - {stack ? ( - createPortal( + return ( + <div className={styles.place} ref={ref}> + {stack ? ( + createPortal( + <NodePanelInner + node={node} + stack + onEdit={onEdit} + onLike={onLike} + onStar={onStar} + can_edit={can_edit} + can_like={can_like} + can_star={can_star} + />, + document.body + ) + ) : ( <NodePanelInner node={node} - stack onEdit={onEdit} onLike={onLike} + onStar={onStar} can_edit={can_edit} can_like={can_like} - />, - document.body - ) - ) : ( - <NodePanelInner - node={node} - onEdit={onEdit} - onLike={onLike} - can_edit={can_edit} - can_like={can_like} - /> - )} - </div> - ); -}); + can_star={can_star} + /> + )} + </div> + ); + } +); export { NodePanel }; diff --git a/src/components/node/NodePanelInner/index.tsx b/src/components/node/NodePanelInner/index.tsx index 92719751..caaf6275 100644 --- a/src/components/node/NodePanelInner/index.tsx +++ b/src/components/node/NodePanelInner/index.tsx @@ -7,20 +7,24 @@ import { INode } from '~/redux/types'; import classNames from 'classnames'; interface IProps { - node: INode; + node: Partial<INode>; stack?: boolean; can_edit: boolean; can_like: boolean; + can_star: boolean; onEdit: () => void; onLike: () => void; + onStar: () => void; } const NodePanelInner: FC<IProps> = ({ - node: { title, user, is_liked }, + node: { title, user, is_liked, is_heroic }, stack, + can_star, can_edit, can_like, + onStar, onEdit, onLike, }) => { @@ -35,6 +39,15 @@ const NodePanelInner: FC<IProps> = ({ </Group> <div className={styles.buttons}> + {can_star && ( + <div className={classNames(styles.star, { is_heroic })}> + {is_heroic ? ( + <Icon icon="star_full" size={24} onClick={onStar} /> + ) : ( + <Icon icon="star" size={24} onClick={onStar} /> + )} + </div> + )} {can_edit && ( <div> <Icon icon="edit" size={24} onClick={onEdit} /> diff --git a/src/components/node/NodePanelInner/styles.scss b/src/components/node/NodePanelInner/styles.scss index 58358e10..3e1790b3 100644 --- a/src/components/node/NodePanelInner/styles.scss +++ b/src/components/node/NodePanelInner/styles.scss @@ -166,3 +166,18 @@ animation: pulse 0.75s infinite; } } + +.star { + transition: fill, stroke 0.25s; + will-change: transform; + + &:global(.is_heroic) { + svg { + fill: $orange; + } + } + + &:hover { + fill: $orange; + } +} diff --git a/src/constants/api.ts b/src/constants/api.ts index 9fcc0800..a83ce381 100644 --- a/src/constants/api.ts +++ b/src/constants/api.ts @@ -15,5 +15,6 @@ export const API = { COMMENT: (id: INode['id']) => `/node/${id}/comment`, UPDATE_TAGS: (id: INode['id']) => `/node/${id}/tags`, POST_LIKE: (id: INode['id']) => `/node/${id}/like`, + POST_STAR: (id: INode['id']) => `/node/${id}/heroic`, }, }; diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index 7bae3e15..f45a6dc9 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -1,7 +1,7 @@ import React, { FC, createElement, useEffect, useCallback, useState, useMemo, memo } from 'react'; import { RouteComponentProps } from 'react-router'; import { connect } from 'react-redux'; -import { canEditNode, canLikeNode } from '~/utils/node'; +import { canEditNode, canLikeNode, canStarNode } from '~/utils/node'; import { selectNode } from '~/redux/node/selectors'; import { Card } from '~/components/containers/Card'; @@ -17,6 +17,7 @@ import { NODE_COMPONENTS, NODE_INLINES } from '~/redux/node/constants'; import * as NODE_ACTIONS from '~/redux/node/actions'; import { CommentForm } from '~/components/node/CommentForm'; import { selectUser } from '~/redux/auth/selectors'; +import pick from 'ramda/es/pick'; const mapStateToProps = state => ({ node: selectNode(state), @@ -29,6 +30,7 @@ const mapDispatchToProps = { nodeSetCoverImage: NODE_ACTIONS.nodeSetCoverImage, nodeEdit: NODE_ACTIONS.nodeEdit, nodeLike: NODE_ACTIONS.nodeLike, + nodeStar: NODE_ACTIONS.nodeStar, }; type IProps = ReturnType<typeof mapStateToProps> & @@ -40,13 +42,14 @@ const NodeLayoutUnconnected: FC<IProps> = memo( match: { params: { id }, }, - node: { is_loading, is_loading_comments, comments = [], current: node, current_cover_image }, + node: { is_loading, is_loading_comments, comments = [], current: node }, user, user: { is_user }, nodeLoadNode, nodeUpdateTags, nodeEdit, nodeLike, + nodeStar, nodeSetCoverImage, }) => { const [layout, setLayout] = useState({}); @@ -67,12 +70,14 @@ const NodeLayoutUnconnected: FC<IProps> = memo( const can_edit = useMemo(() => canEditNode(node, user), [node, user]); const can_like = useMemo(() => canLikeNode(node, user), [node, user]); + const can_star = useMemo(() => canStarNode(node, user), [node, user]); const block = node && node.type && NODE_COMPONENTS[node.type]; const inline_block = node && node.type && NODE_INLINES[node.type]; const onEdit = useCallback(() => nodeEdit(node.id), [nodeEdit, node]); const onLike = useCallback(() => nodeLike(node.id), [nodeLike, node]); + const onStar = useCallback(() => nodeStar(node.id), [nodeStar, node]); useEffect(() => { if (!node.cover) return; @@ -85,12 +90,14 @@ const NodeLayoutUnconnected: FC<IProps> = memo( {block && createElement(block, { node, is_loading, updateLayout, layout })} <NodePanel - node={node} + node={pick(['title', 'user', 'is_liked', 'is_heroic'], node)} layout={layout} can_edit={can_edit} can_like={can_like} + can_star={can_star} onEdit={onEdit} onLike={onLike} + onStar={onStar} /> <Group> diff --git a/src/redux/node/actions.ts b/src/redux/node/actions.ts index 56dd72a3..f15cfa68 100644 --- a/src/redux/node/actions.ts +++ b/src/redux/node/actions.ts @@ -80,6 +80,11 @@ export const nodeLike = (id: INode['id']) => ({ id, }); +export const nodeStar = (id: INode['id']) => ({ + type: NODE_ACTIONS.STAR, + id, +}); + export const nodeSetEditor = (editor: INode) => ({ type: NODE_ACTIONS.SET_EDITOR, editor, diff --git a/src/redux/node/api.ts b/src/redux/node/api.ts index 1ca5da81..29e586b2 100644 --- a/src/redux/node/api.ts +++ b/src/redux/node/api.ts @@ -1,7 +1,7 @@ import { api, configWithToken, resultMiddleware, errorMiddleware } from '~/utils/api'; import { INode, IResultWithStatus, IComment } from '../types'; import { API } from '~/constants/api'; -import { nodeUpdateTags } from './actions'; +import { nodeUpdateTags, nodeLike, nodeStar } from './actions'; export const postNode = ({ access, @@ -79,10 +79,21 @@ export const updateNodeTags = ({ export const postNodeLike = ({ id, access, -}: ReturnType<typeof nodeUpdateTags> & { access: string }): Promise< +}: ReturnType<typeof nodeLike> & { access: string }): Promise< IResultWithStatus<{ is_liked: INode['is_liked'] }> > => api .post(API.NODE.POST_LIKE(id), {}, configWithToken(access)) .then(resultMiddleware) .catch(errorMiddleware); + +export const postNodeStar = ({ + id, + access, +}: ReturnType<typeof nodeStar> & { access: string }): Promise< + IResultWithStatus<{ is_liked: INode['is_liked'] }> +> => + api + .post(API.NODE.POST_STAR(id), {}, configWithToken(access)) + .then(resultMiddleware) + .catch(errorMiddleware); diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index d964e2fc..457150a4 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -21,6 +21,7 @@ export const NODE_ACTIONS = { EDIT: `${prefix}EDIT`, LIKE: `${prefix}LIKE`, + STAR: `${prefix}STAR`, CREATE: `${prefix}CREATE`, SET_SAVE_ERRORS: `${prefix}SET_SAVE_ERRORS`, diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index 854ad486..70340422 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -27,6 +27,7 @@ import { getNodeComments, updateNodeTags, postNodeLike, + postNodeStar, } from './api'; import { reqWrapper } from '../auth/sagas'; import { flowSetNodes } from '../flow/actions'; @@ -197,6 +198,21 @@ function* onLikeSaga({ id }: ReturnType<typeof nodeLike>) { yield call(updateNodeEverythere, { ...current, is_liked }); } +function* onStarSaga({ id }: ReturnType<typeof nodeLike>) { + const { + current, + current: { is_heroic }, + } = yield select(selectNode); + + yield call(updateNodeEverythere, { ...current, is_heroic: !is_heroic }); + + const { data, error } = yield call(reqWrapper, postNodeStar, { id }); + + if (!error || data.is_heroic === !is_heroic) return; // ok and matches + + yield call(updateNodeEverythere, { ...current, is_heroic }); +} + export default function* nodeSaga() { yield takeLatest(NODE_ACTIONS.SAVE, onNodeSave); yield takeLatest(NODE_ACTIONS.LOAD_NODE, onNodeLoad); @@ -205,4 +221,5 @@ export default function* nodeSaga() { yield takeLatest(NODE_ACTIONS.CREATE, onCreateSaga); yield takeLatest(NODE_ACTIONS.EDIT, onEditSaga); yield takeLatest(NODE_ACTIONS.LIKE, onLikeSaga); + yield takeLatest(NODE_ACTIONS.STAR, onStarSaga); } diff --git a/src/sprites/Sprites.tsx b/src/sprites/Sprites.tsx index 391f9a54..8a407350 100644 --- a/src/sprites/Sprites.tsx +++ b/src/sprites/Sprites.tsx @@ -44,6 +44,16 @@ const Sprites: FC<{}> = () => ( <path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z" /> </g> + <g id="star" stroke="none"> + <path fill="none" d="M0 0h24v24H0V0z" /> + <path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z" /> + </g> + + <g id="star_full" stroke="none"> + <path fill="none" d="M0 0h24v24H0V0z" /> + <path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z" /> + </g> + <g id="heart" stroke="none"> <path fill="none" d="M0 0h24v24H0V0z" /> <path d="M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z" /> diff --git a/src/utils/node.ts b/src/utils/node.ts index 2b81e9e8..f73a9559 100644 --- a/src/utils/node.ts +++ b/src/utils/node.ts @@ -9,3 +9,6 @@ export const canEditNode = (node: Partial<INode>, user: Partial<IUser>): boolean export const canLikeNode = (node: Partial<INode>, user: Partial<IUser>): boolean => path(['role'], user) && path(['role'], user) !== USER_ROLES.GUEST; + +export const canStarNode = (node: Partial<INode>, user: Partial<IUser>): boolean => + path(['role'], user) && path(['role'], user) === USER_ROLES.ADMIN; From 313c41b56c351cef02b70436b464679e29f4f7ec Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 12:08:50 +0700 Subject: [PATCH 72/99] limited heroic nodes to images --- src/utils/node.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/utils/node.ts b/src/utils/node.ts index f73a9559..53868c87 100644 --- a/src/utils/node.ts +++ b/src/utils/node.ts @@ -2,6 +2,7 @@ import { USER_ROLES } from '~/redux/auth/constants'; import { INode } from '~/redux/types'; import { IUser } from '~/redux/auth/types'; import path from 'ramda/es/path'; +import { NODE_TYPES } from '~/redux/node/constants'; export const canEditNode = (node: Partial<INode>, user: Partial<IUser>): boolean => path(['role'], user) === USER_ROLES.ADMIN || @@ -11,4 +12,6 @@ export const canLikeNode = (node: Partial<INode>, user: Partial<IUser>): boolean path(['role'], user) && path(['role'], user) !== USER_ROLES.GUEST; export const canStarNode = (node: Partial<INode>, user: Partial<IUser>): boolean => - path(['role'], user) && path(['role'], user) === USER_ROLES.ADMIN; + node.type === NODE_TYPES.IMAGE && + path(['role'], user) && + path(['role'], user) === USER_ROLES.ADMIN; From 2f73e9ad298243bfa8db7c32633a95185c294878 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 12:31:05 +0700 Subject: [PATCH 73/99] flow for node --- src/redux/types.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/redux/types.ts b/src/redux/types.ts index b7b98a2c..d2e57edb 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -122,11 +122,9 @@ export interface INode { is_liked?: boolean; is_heroic?: boolean; - options: { - flow: { - display: 'single' | 'vertical' | 'horizontal' | 'quadro'; - show_description: boolean; - }; + flow: { + display: 'single' | 'vertical' | 'horizontal' | 'quadro'; + show_description: boolean; }; tags: ITag[]; From a6385cf4cf80cffa5ec61dbadf1db7a6ba3a5ee2 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 12:33:57 +0700 Subject: [PATCH 74/99] flow grid appearance --- src/components/flow/FlowGrid/styles.scss | 4 ++++ src/redux/node/constants.ts | 8 +++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/flow/FlowGrid/styles.scss b/src/components/flow/FlowGrid/styles.scss index be508db9..b816a3de 100644 --- a/src/components/flow/FlowGrid/styles.scss +++ b/src/components/flow/FlowGrid/styles.scss @@ -16,21 +16,25 @@ $cols: $content_width / $cell; @media (max-width: $cell * 5) { grid-template-columns: repeat(4, 1fr); + grid-template-rows: 25vw $cell; grid-auto-rows: 25vw; } @media (max-width: $cell * 4) { grid-template-columns: repeat(3, 1fr); + grid-template-rows: 40vh 33vw; grid-auto-rows: 33vw; } @media (max-width: $cell * 3) { grid-template-columns: repeat(2, 1fr); + grid-template-rows: 40vh 50vw; grid-auto-rows: 50vw; } @media (max-width: $cell * 2) { grid-template-columns: repeat(1, 1fr); + grid-template-rows: 40vh 75vw; grid-auto-rows: 75vw; grid-column-gap: $gap; grid-row-gap: $gap; diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 457150a4..e18df061 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -54,11 +54,9 @@ export const EMPTY_NODE: INode = { blocks: [], tags: [], - options: { - flow: { - display: 'single', - show_description: false, - }, + flow: { + display: 'single', + show_description: false, }, }; From 744f79053b0ffd772551ad452c809d791d937379 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 14:38:55 +0700 Subject: [PATCH 75/99] set flow cell view actions --- src/components/flow/Cell/index.tsx | 58 +++++++++++++++++++++--- src/components/flow/Cell/styles.scss | 52 +++++++++++++++++++-- src/components/flow/FlowGrid/index.tsx | 26 +++++------ src/containers/flow/FlowLayout/index.tsx | 22 +++++++-- src/redux/flow/actions.ts | 7 +++ src/redux/flow/constants.ts | 1 + src/sprites/Sprites.tsx | 28 +++++++++--- 7 files changed, 160 insertions(+), 34 deletions(-) diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index 28bc34b9..a3954be3 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -5,14 +5,24 @@ import classNames from 'classnames'; import * as styles from './styles.scss'; import path from 'ramda/es/path'; +import { Icon } from '~/components/input/Icon'; +import { flowSetCellView } from '~/redux/flow/actions'; interface IProps { node: INode; - onSelect: (id: INode['id'], type: INode['type']) => void; is_text?: boolean; + can_edit?: boolean; + + onSelect: (id: INode['id'], type: INode['type']) => void; + onChangeCellView: typeof flowSetCellView; } -const Cell: FC<IProps> = ({ node: { id, title, thumbnail, type, blocks }, onSelect }) => { +const Cell: FC<IProps> = ({ + node: { id, title, thumbnail, type, blocks, flow }, + can_edit, + onSelect, + onChangeCellView, +}) => { const [is_loaded, setIsLoaded] = useState(false); const onImageLoad = useCallback(() => { @@ -23,14 +33,50 @@ const Cell: FC<IProps> = ({ node: { id, title, thumbnail, type, blocks }, onSele const text = path([0, 'text'], blocks); + const toggleViewDescription = useCallback(() => { + const show_description = flow && !flow.show_description; + const display = (flow && flow.display) || 'single'; + onChangeCellView(id, { show_description, display }); + }, [id, flow, onChangeCellView]); + + const setViewSingle = useCallback(() => { + const show_description = flow && !!flow.show_description; + onChangeCellView(id, { show_description, display: 'single' }); + }, [id, flow, onChangeCellView]); + + const setViewHorizontal = useCallback(() => { + const show_description = flow && !!flow.show_description; + onChangeCellView(id, { show_description, display: 'horizontal' }); + }, [id, flow, onChangeCellView]); + + const setViewVertical = useCallback(() => { + const show_description = flow && !!flow.show_description; + onChangeCellView(id, { show_description, display: 'vertical' }); + }, [id, flow, onChangeCellView]); + + const setViewQuadro = useCallback(() => { + const show_description = flow && !!flow.show_description; + onChangeCellView(id, { show_description, display: 'quadro' }); + }, [id, flow, onChangeCellView]); + return ( <div - className={classNames(styles.cell, 'vert-1', 'hor-1', { is_text: false })} - onClick={onClick} + className={classNames(styles.cell, (flow && flow.display) || 'single', { is_text: false })} > - <div className={styles.menu}>MENU</div> + {can_edit && ( + <div className={styles.menu}> + <div className={styles.menu_content}> + <Icon icon="cell-single" onClick={toggleViewDescription} /> + <div className={styles.menu_sep} /> + <Icon icon="cell-single" onClick={setViewSingle} /> + <Icon icon="cell-double-h" onClick={setViewHorizontal} /> + <Icon icon="cell-double-v" onClick={setViewVertical} /> + <Icon icon="cell-quadro" onClick={setViewQuadro} /> + </div> + </div> + )} - <div className={styles.face}> + <div className={styles.face} onClick={onClick}> {title && <div className={styles.title}>{title}</div>} {text && <div className={styles.text}>{text}</div>} </div> diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 6ea16ac5..4361e35a 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -137,15 +137,57 @@ .menu { position: absolute; top: 0; - left: 0; - width: 100%; - height: 60px; - background: $content_bg; + right: 0; + height: 100%; + width: 80px; z-index: 4; border-radius: $radius; opacity: 0; pointer-events: none; touch-action: none; transition: opacity 0.5s; - display: none; + box-sizing: border-box; + // display: none; + padding: $gap; + display: flex; + align-items: stretch; + justify-content: center; +} + +.menu_content { + flex: 1; + // height: 100%; + background: $red_gradient; + padding: 60px $gap $gap $gap; + border-radius: $radius; + display: flex; + align-items: center; + justify-content: center; + display: flex; + flex-direction: column; + + & > * { + margin-top: $gap; + opacity: 0.5; + transition: opacity 0.25s; + + &:hover { + opacity: 1; + } + } + + svg { + fill: #222222; + width: 30px; + height: 30px; + } +} + +.menu_sep { + width: 20px; + height: 2px; + flex: 0 0 4px; + background-color: #222222; + opacity: 0.2; + border-radius: 2px; } diff --git a/src/components/flow/FlowGrid/index.tsx b/src/components/flow/FlowGrid/index.tsx index b8d8849e..23bbe28b 100644 --- a/src/components/flow/FlowGrid/index.tsx +++ b/src/components/flow/FlowGrid/index.tsx @@ -4,31 +4,31 @@ import { Cell } from '~/components/flow/Cell'; import * as styles from './styles.scss'; import { IFlowState } from '~/redux/flow/reducer'; import { INode } from '~/redux/types'; +import { canEditNode } from '~/utils/node'; +import { IUser } from '~/redux/auth/types'; +import { flowSetCellView } from '~/redux/flow/actions'; type IProps = Partial<IFlowState> & { + user: Partial<IUser>; onSelect: (id: INode['id'], type: INode['type']) => void; + onChangeCellView: typeof flowSetCellView; }; -export const FlowGrid: FC<IProps> = ({ nodes, onSelect }) => ( +export const FlowGrid: FC<IProps> = ({ user, nodes, onSelect, onChangeCellView }) => ( <div> <div className={styles.grid_test}> <div className={styles.hero}>HERO</div> <div className={styles.stamp}>STAMP</div> {nodes.map(node => ( - <Cell key={node.id} node={node} onSelect={onSelect} /> + <Cell + key={node.id} + node={node} + onSelect={onSelect} + can_edit={canEditNode(node, user)} + onChangeCellView={onChangeCellView} + /> ))} </div> </div> ); - -// { -// range(1, 20).map(el => ( -// <Cell -// width={Math.floor(Math.random() * 2 + 1)} -// height={Math.floor(Math.random() * 2 + 1)} -// title={`Cell ${el}`} -// key={el} -// /> -// )); -// } diff --git a/src/containers/flow/FlowLayout/index.tsx b/src/containers/flow/FlowLayout/index.tsx index 317b6289..a87ccb44 100644 --- a/src/containers/flow/FlowLayout/index.tsx +++ b/src/containers/flow/FlowLayout/index.tsx @@ -3,15 +3,29 @@ import { connect } from 'react-redux'; import { FlowGrid } from '~/components/flow/FlowGrid'; import { selectFlow } from '~/redux/flow/selectors'; import * as NODE_ACTIONS from '~/redux/node/actions'; +import * as FLOW_ACTIONS from '~/redux/flow/actions'; +import pick from 'ramda/es/pick'; +import { selectUser } from '~/redux/auth/selectors'; -const mapStateToProps = selectFlow; +const mapStateToProps = state => ({ + flow: pick(['nodes'], selectFlow(state)), + user: pick(['role', 'id'], selectUser(state)), +}); -const mapDispatchToProps = { nodeLoadNode: NODE_ACTIONS.nodeLoadNode }; +const mapDispatchToProps = { + nodeLoadNode: NODE_ACTIONS.nodeLoadNode, + flowSetCellView: FLOW_ACTIONS.flowSetCellView, +}; type IProps = ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & {}; -const FlowLayoutUnconnected: FC<IProps> = ({ nodes, nodeLoadNode }) => ( - <FlowGrid nodes={nodes} onSelect={nodeLoadNode} /> +const FlowLayoutUnconnected: FC<IProps> = ({ + flow: { nodes }, + user, + nodeLoadNode, + flowSetCellView, +}) => ( + <FlowGrid nodes={nodes} onSelect={nodeLoadNode} user={user} onChangeCellView={flowSetCellView} /> ); const FlowLayout = connect( diff --git a/src/redux/flow/actions.ts b/src/redux/flow/actions.ts index 88998656..d4b4b1e1 100644 --- a/src/redux/flow/actions.ts +++ b/src/redux/flow/actions.ts @@ -1,7 +1,14 @@ import { FLOW_ACTIONS } from './constants'; import { IFlowState } from './reducer'; +import { INode } from '../types'; export const flowSetNodes = (nodes: IFlowState['nodes']) => ({ nodes, type: FLOW_ACTIONS.SET_NODES, }); + +export const flowSetCellView = (id: INode['id'], flow: INode['flow']) => ({ + type: FLOW_ACTIONS.SET_CELL_VIEW, + id, + flow, +}); diff --git a/src/redux/flow/constants.ts b/src/redux/flow/constants.ts index 5b38ea68..a7389f18 100644 --- a/src/redux/flow/constants.ts +++ b/src/redux/flow/constants.ts @@ -3,4 +3,5 @@ const prefix = 'FLOW.'; export const FLOW_ACTIONS = { GET_FLOW: `${prefix}GET_FLOW`, SET_NODES: `${prefix}SET_NODES`, + SET_CELL_VIEW: `${prefix}SET_CELL_VIEW`, }; diff --git a/src/sprites/Sprites.tsx b/src/sprites/Sprites.tsx index 8a407350..7ea32118 100644 --- a/src/sprites/Sprites.tsx +++ b/src/sprites/Sprites.tsx @@ -2,23 +2,39 @@ import React, { FC } from 'react'; const Sprites: FC<{}> = () => ( <svg width={0} height={0} viewBox="0 0 24 24"> + <defs> + <pattern + id="pattern_stripes" + patternUnits="userSpaceOnUse" + width="4" + height="4" + patternTransform="rotate(45)" + > + <line x1="0" y="0" x2="0" y2="4" stroke="#222222" strokeWidth="3" /> + </pattern> + </defs> + <g id="cell-single" stroke="none" transform="translate(2 2)"> - <path d="M0,0 L9,0 L9,9 L0,9 L0,0 Z" /> + <path d="M0,0 L9,0 L9,9 L0,9 L0,0 Z" fill="url(#pattern_stripes)" /> <path d="M11,0 L20,0 L20,9 L11,9 L11,0 Z M12,1 L12,8 L19,8 L19,1 L12,1 Z" /> <path d="M11,11 L20,11 L20,20 L11,20 L11,11 Z M12,12 L12,19 L19,19 L19,12 L12,12 Z" /> <path d="M0,11 L9,11 L9,20 L0,20 L0,11 Z M1,12 L1,19 L8,19 L8,12 L1,12 Z" /> </g> - <g id="cell-double-h" stroke="none"> - <path d="M0,0 L20,0 L20,9 L0,9 L0,0 Z M1,1 L1,8 L19,8 L19,1 L1,1 Z" /> + <g id="cell-double-h" stroke="none" transform="translate(2 2)"> + <path d="M0,0 L19,0 L19,9 L0,9 L0,0 Z" fill="url(#pattern_stripes)" /> <path d="M11,11 L20,11 L20,20 L11,20 L11,11 Z M12,12 L12,19 L19,19 L19,12 L12,12 Z" /> <path d="M0,11 L9,11 L9,20 L0,20 L0,11 Z M1,12 L1,19 L8,19 L8,12 L1,12 Z" /> </g> - <g id="cell-double-v" stroke="none"> - <path d="M0,0 L20,0 L20,9 L0,9 L0,0 Z M1,1 L1,8 L19,8 L19,1 L1,1 Z" /> + <g id="cell-double-v" stroke="none" transform="translate(2 2)"> + <path d="M0,0 L9,0 L9,19 L0,19 L0,0 Z" fill="url(#pattern_stripes)" /> + <path d="M11,0 L20,0 L20,9 L11,9 L11,0 Z M12,1 L12,8 L19,8 L19,1 L12,1 Z" /> <path d="M11,11 L20,11 L20,20 L11,20 L11,11 Z M12,12 L12,19 L19,19 L19,12 L12,12 Z" /> - <path d="M0,11 L9,11 L9,20 L0,20 L0,11 Z M1,12 L1,19 L8,19 L8,12 L1,12 Z" /> + </g> + + <g id="cell-quadro" stroke="none" transform="translate(2 2)"> + <path d="M0,0 L19,0 L19,19 L0,19 L0,0 Z" fill="url(#pattern_stripes)" /> </g> <g id="play"> From ed3f6369fb0a24f093986999ca2012e5dd56dfe7 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 14:51:34 +0700 Subject: [PATCH 76/99] flow grid now has 5 columns --- src/components/flow/Cell/styles.scss | 10 ++++++++++ src/components/flow/FlowGrid/styles.scss | 8 +++++++- src/redux/flow/sagas.ts | 13 ++++++++++--- src/redux/node/sagas.ts | 10 +++++----- src/styles/variables.scss | 4 ++-- 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 4361e35a..0071fcbc 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -91,6 +91,16 @@ grid-column-end: span 2; } + :global(.horizontal), + :global(.quadro) { + grid-column-end: span 2; + } + + :global(.vertical), + :global(.quadro) { + grid-row-end: span 2; + } + .is_text { background: none; padding: 10px; diff --git a/src/components/flow/FlowGrid/styles.scss b/src/components/flow/FlowGrid/styles.scss index b816a3de..8f761995 100644 --- a/src/components/flow/FlowGrid/styles.scss +++ b/src/components/flow/FlowGrid/styles.scss @@ -14,9 +14,15 @@ $cols: $content_width / $cell; grid-column-gap: $grid_line; grid-row-gap: $grid_line; + @media (max-width: $cell * 6) { + grid-template-columns: repeat(5, 1fr); + grid-template-rows: 40vh 20vw; + grid-auto-rows: 20vw; + } + @media (max-width: $cell * 5) { grid-template-columns: repeat(4, 1fr); - grid-template-rows: 25vw $cell; + grid-template-rows: 40vh 25vw; grid-auto-rows: 25vw; } diff --git a/src/redux/flow/sagas.ts b/src/redux/flow/sagas.ts index a52cb975..377b7fa5 100644 --- a/src/redux/flow/sagas.ts +++ b/src/redux/flow/sagas.ts @@ -1,10 +1,11 @@ -import { takeLatest, call, put } from 'redux-saga/effects'; +import { takeLatest, call, put, select } from 'redux-saga/effects'; import { REHYDRATE } from 'redux-persist'; import { FLOW_ACTIONS } from './constants'; import { getNodes } from '../node/api'; -import { flowSetNodes } from './actions'; -import { objFromArray } from '~/utils/fn'; +import { flowSetNodes, flowSetCellView } from './actions'; import { IResultWithStatus, INode } from '../types'; +import { updateNodeEverywhere } from '../node/sagas'; +import { selectFlowNodes } from './selectors'; function* onGetFlow() { const { @@ -20,6 +21,12 @@ function* onGetFlow() { yield put(flowSetNodes(nodes)); } +function* onSetCellView({ id, flow }: ReturnType<typeof flowSetCellView>) { + const nodes = yield select(selectFlowNodes); + yield put(flowSetNodes(nodes.map(node => (node.id === id ? { ...node, flow } : node)))); +} + export default function* nodeSaga() { yield takeLatest([FLOW_ACTIONS.GET_FLOW, REHYDRATE], onGetFlow); + yield takeLatest(FLOW_ACTIONS.SET_CELL_VIEW, onSetCellView); } diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index 70340422..4e0c577e 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -41,7 +41,7 @@ import { NODE_EDITOR_DIALOGS, DIALOGS } from '../modal/constants'; import { INodeState } from './reducer'; import { IFlowState } from '../flow/reducer'; -function* updateNodeEverythere(node) { +export function* updateNodeEverywhere(node) { const { current: { id }, }: INodeState = yield select(selectNode); @@ -189,13 +189,13 @@ function* onLikeSaga({ id }: ReturnType<typeof nodeLike>) { current: { is_liked }, } = yield select(selectNode); - yield call(updateNodeEverythere, { ...current, is_liked: !is_liked }); + yield call(updateNodeEverywhere, { ...current, is_liked: !is_liked }); const { data, error } = yield call(reqWrapper, postNodeLike, { id }); if (!error || data.is_liked === !is_liked) return; // ok and matches - yield call(updateNodeEverythere, { ...current, is_liked }); + yield call(updateNodeEverywhere, { ...current, is_liked }); } function* onStarSaga({ id }: ReturnType<typeof nodeLike>) { @@ -204,13 +204,13 @@ function* onStarSaga({ id }: ReturnType<typeof nodeLike>) { current: { is_heroic }, } = yield select(selectNode); - yield call(updateNodeEverythere, { ...current, is_heroic: !is_heroic }); + yield call(updateNodeEverywhere, { ...current, is_heroic: !is_heroic }); const { data, error } = yield call(reqWrapper, postNodeStar, { id }); if (!error || data.is_heroic === !is_heroic) return; // ok and matches - yield call(updateNodeEverythere, { ...current, is_heroic }); + yield call(updateNodeEverywhere, { ...current, is_heroic }); } export default function* nodeSaga() { diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 6af3bd4e..6cbf9b63 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -1,8 +1,8 @@ @import 'colors'; -$cell: 320px; +$cell: 280px; $grid_line: 4px; -$content_width: $cell * 4 + $grid_line * 3; +$content_width: $cell * 5 + $grid_line * 4; $gap: 10px; $spc: $gap * 2; $comment_height: 72px; From 9fc1d3b91853b15caab15a5d7ff6932d0d77ed40 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 15:03:17 +0700 Subject: [PATCH 77/99] dots menu on flow nodes --- src/components/flow/Cell/index.tsx | 4 +++ src/components/flow/Cell/styles.scss | 51 ++++++++++++++++++++-------- src/sprites/Sprites.tsx | 5 +++ 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index a3954be3..6f4c2adf 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -65,6 +65,10 @@ const Cell: FC<IProps> = ({ > {can_edit && ( <div className={styles.menu}> + <div className={styles.menu_button}> + <Icon icon="dots-vertical" /> + </div> + <div className={styles.menu_content}> <Icon icon="cell-single" onClick={toggleViewDescription} /> <div className={styles.menu_sep} /> diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 0071fcbc..c0f29a43 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -6,7 +6,6 @@ background: $cell_bg; border-radius: $cell_radius; position: relative; - overflow: hidden; cursor: pointer; color: white; @@ -22,14 +21,6 @@ } } - &:hover { - .menu { - opacity: 1; - pointer-events: all; - touch-action: auto; - } - } - @include outer_shadow(); } @@ -132,6 +123,7 @@ .face { @include outer_shadow(); + overflow: hidden; box-sizing: border-box; position: absolute; top: 0; @@ -148,27 +140,56 @@ position: absolute; top: 0; right: 0; - height: 100%; - width: 80px; + // height: 100%; + // width: 80px; z-index: 4; border-radius: $radius; - opacity: 0; + // opacity: 0; pointer-events: none; touch-action: none; transition: opacity 0.5s; box-sizing: border-box; // display: none; - padding: $gap; + // padding: $gap; display: flex; align-items: stretch; justify-content: center; + + &:hover { + opacity: 1; + pointer-events: all; + touch-action: auto; + + .menu_content { + opacity: 1; + } + } +} + +.menu_button { + pointer-events: all; + touch-action: auto; + position: absolute; + z-index: 4; + width: 32px + $gap * 2; + height: 32px + $gap * 2; + display: flex; + align-items: center; + justify-content: center; + opacity: 0.2; + + svg { + fill: white; + width: 30px; + height: 30px; + } } .menu_content { flex: 1; - // height: 100%; + opacity: 0; background: $red_gradient; - padding: 60px $gap $gap $gap; + padding: (32px + $gap * 2) $gap $gap $gap; border-radius: $radius; display: flex; align-items: center; diff --git a/src/sprites/Sprites.tsx b/src/sprites/Sprites.tsx index 7ea32118..5384d0d6 100644 --- a/src/sprites/Sprites.tsx +++ b/src/sprites/Sprites.tsx @@ -144,6 +144,11 @@ const Sprites: FC<{}> = () => ( <path fill="none" d="M0 0h24v24H0V0z" /> <path d="M12 3v9.28c-.47-.17-.97-.28-1.5-.28C8.01 12 6 14.01 6 16.5S8.01 21 10.5 21c2.31 0 4.2-1.75 4.45-4H15V6h4V3h-7z" /> </g> + + <g id="dots-vertical" stroke="none"> + <path fill="none" d="M0 0h24v24H0V0z" /> + <path d="M16 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" /> + </g> </svg> ); From 7254a448c165b199308c55212388ea6b940b6d2e Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 15:11:20 +0700 Subject: [PATCH 78/99] fixed toggling text view --- src/components/flow/Cell/index.tsx | 11 +++++------ src/components/flow/Cell/styles.scss | 10 +++------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index 6f4c2adf..0e80c541 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -4,7 +4,6 @@ import { getURL } from '~/utils/dom'; import classNames from 'classnames'; import * as styles from './styles.scss'; -import path from 'ramda/es/path'; import { Icon } from '~/components/input/Icon'; import { flowSetCellView } from '~/redux/flow/actions'; @@ -18,7 +17,7 @@ interface IProps { } const Cell: FC<IProps> = ({ - node: { id, title, thumbnail, type, blocks, flow }, + node: { id, title, thumbnail, type, flow, description }, can_edit, onSelect, onChangeCellView, @@ -29,12 +28,12 @@ const Cell: FC<IProps> = ({ setIsLoaded(true); }, [setIsLoaded]); - const onClick = useCallback(() => onSelect(id, type), [onSelect, id]); + const onClick = useCallback(() => onSelect(id, type), [onSelect, id, type]); - const text = path([0, 'text'], blocks); + const text = (((flow && !!flow.show_description) || type === 'text') && description) || null; const toggleViewDescription = useCallback(() => { - const show_description = flow && !flow.show_description; + const show_description = !(flow && flow.show_description); const display = (flow && flow.display) || 'single'; onChangeCellView(id, { show_description, display }); }, [id, flow, onChangeCellView]); @@ -70,7 +69,7 @@ const Cell: FC<IProps> = ({ </div> <div className={styles.menu_content}> - <Icon icon="cell-single" onClick={toggleViewDescription} /> + <Icon icon="text" onClick={toggleViewDescription} /> <div className={styles.menu_sep} /> <Icon icon="cell-single" onClick={setViewSingle} /> <Icon icon="cell-double-h" onClick={setViewHorizontal} /> diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index c0f29a43..dc9563f2 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -138,22 +138,18 @@ .menu { position: absolute; - top: 0; - right: 0; - // height: 100%; - // width: 80px; + top: -$gap; + right: -$gap; z-index: 4; border-radius: $radius; - // opacity: 0; pointer-events: none; touch-action: none; transition: opacity 0.5s; box-sizing: border-box; - // display: none; - // padding: $gap; display: flex; align-items: stretch; justify-content: center; + padding: $gap; &:hover { opacity: 1; From 1d40eca79e1c3f7c8104fcf37d783fccf6e02975 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 15:36:25 +0700 Subject: [PATCH 79/99] storing flow cell view --- .vscode/settings.json | 1 + src/components/flow/Cell/index.tsx | 8 ++++---- src/constants/api.ts | 1 + src/redux/flow/api.ts | 13 +++++++++++++ src/redux/flow/sagas.ts | 8 ++++++-- tsconfig.json | 2 +- 6 files changed, 26 insertions(+), 7 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d7177d71..3d65345e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -17,4 +17,5 @@ "editor.formatOnSave": true, "editor.formatOnSaveTimeout": 750, }, + "typescript.tsdk": "node_modules/typescript/lib", } diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index 0e80c541..df7e67be 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -39,22 +39,22 @@ const Cell: FC<IProps> = ({ }, [id, flow, onChangeCellView]); const setViewSingle = useCallback(() => { - const show_description = flow && !!flow.show_description; + const show_description = (flow && !!flow.show_description) || false; onChangeCellView(id, { show_description, display: 'single' }); }, [id, flow, onChangeCellView]); const setViewHorizontal = useCallback(() => { - const show_description = flow && !!flow.show_description; + const show_description = (flow && !!flow.show_description) || false; onChangeCellView(id, { show_description, display: 'horizontal' }); }, [id, flow, onChangeCellView]); const setViewVertical = useCallback(() => { - const show_description = flow && !!flow.show_description; + const show_description = (flow && !!flow.show_description) || false; onChangeCellView(id, { show_description, display: 'vertical' }); }, [id, flow, onChangeCellView]); const setViewQuadro = useCallback(() => { - const show_description = flow && !!flow.show_description; + const show_description = (flow && !!flow.show_description) || false; onChangeCellView(id, { show_description, display: 'quadro' }); }, [id, flow, onChangeCellView]); diff --git a/src/constants/api.ts b/src/constants/api.ts index a83ce381..32a7b62a 100644 --- a/src/constants/api.ts +++ b/src/constants/api.ts @@ -16,5 +16,6 @@ export const API = { UPDATE_TAGS: (id: INode['id']) => `/node/${id}/tags`, POST_LIKE: (id: INode['id']) => `/node/${id}/like`, POST_STAR: (id: INode['id']) => `/node/${id}/heroic`, + SET_CELL_VIEW: (id: INode['id']) => `/node/${id}/cell-view`, }, }; diff --git a/src/redux/flow/api.ts b/src/redux/flow/api.ts index b15e5d7c..17145b59 100644 --- a/src/redux/flow/api.ts +++ b/src/redux/flow/api.ts @@ -1,6 +1,7 @@ import { api, configWithToken, resultMiddleware, errorMiddleware } from '~/utils/api'; import { INode, IResultWithStatus } from '../types'; import { API } from '~/constants/api'; +import { flowSetCellView } from '~/redux/flow/actions'; export const postNode = ({ access, @@ -23,3 +24,15 @@ export const getNodes = ({ .get(API.NODE.GET, { params: { skip } }) .then(resultMiddleware) .catch(errorMiddleware); + +export const postCellView = ({ + id, + flow, + access, +}: ReturnType<typeof flowSetCellView> & { access: string }): Promise< + IResultWithStatus<{ is_liked: INode['is_liked'] }> +> => + api + .post(API.NODE.SET_CELL_VIEW(id), { flow }, configWithToken(access)) + .then(resultMiddleware) + .catch(errorMiddleware); diff --git a/src/redux/flow/sagas.ts b/src/redux/flow/sagas.ts index 377b7fa5..9c8aa710 100644 --- a/src/redux/flow/sagas.ts +++ b/src/redux/flow/sagas.ts @@ -4,13 +4,13 @@ import { FLOW_ACTIONS } from './constants'; import { getNodes } from '../node/api'; import { flowSetNodes, flowSetCellView } from './actions'; import { IResultWithStatus, INode } from '../types'; -import { updateNodeEverywhere } from '../node/sagas'; import { selectFlowNodes } from './selectors'; +import { reqWrapper } from '../auth/sagas'; +import { postCellView } from './api'; function* onGetFlow() { const { data: { nodes = null }, - error, }: IResultWithStatus<{ nodes: INode[] }> = yield call(getNodes, {}); if (!nodes || !nodes.length) { @@ -24,6 +24,10 @@ function* onGetFlow() { function* onSetCellView({ id, flow }: ReturnType<typeof flowSetCellView>) { const nodes = yield select(selectFlowNodes); yield put(flowSetNodes(nodes.map(node => (node.id === id ? { ...node, flow } : node)))); + + const { data, error } = yield call(reqWrapper, postCellView, { id, flow }); + + console.log({ data, error }); } export default function* nodeSaga() { diff --git a/tsconfig.json b/tsconfig.json index 3b6d8e22..85e2c5c5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,6 +18,6 @@ "~/*": ["src/*"] } }, - "include": ["./src/index.tsx", "./custom.d.ts"], + "include": ["./src/**/*.ts", "./src/**/*.tsx", "./custom.d.ts"], "exclude": ["./__tests__/**/*"] } From 3d2e2a6f996be7d8134e04125a21e91ec6320e83 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 15:53:04 +0700 Subject: [PATCH 80/99] updated flow appearance --- src/components/flow/Cell/styles.scss | 16 ++++++++++++++++ src/components/flow/FlowGrid/styles.scss | 4 ++++ src/constants/errors.ts | 2 ++ 3 files changed, 22 insertions(+) diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index dc9563f2..91b818b5 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -92,6 +92,17 @@ grid-row-end: span 2; } + @media (max-width: $cell * 2) { + :global(.vertical), + :global(.quadro) { + grid-row-end: span 1; + } + + :global(.horizontal), + :global(.quadro) { + grid-column-end: span 1; + } + } .is_text { background: none; padding: 10px; @@ -160,6 +171,11 @@ opacity: 1; } } + + @media (max-width: $cell * 2) { + right: 0; + top: 0; + } } .menu_button { diff --git a/src/components/flow/FlowGrid/styles.scss b/src/components/flow/FlowGrid/styles.scss index 8f761995..5532c25b 100644 --- a/src/components/flow/FlowGrid/styles.scss +++ b/src/components/flow/FlowGrid/styles.scss @@ -14,6 +14,10 @@ $cols: $content_width / $cell; grid-column-gap: $grid_line; grid-row-gap: $grid_line; + @include tablet { + padding: 0 $gap; + } + @media (max-width: $cell * 6) { grid-template-columns: repeat(5, 1fr); grid-template-rows: 40vh 20vw; diff --git a/src/constants/errors.ts b/src/constants/errors.ts index efcb7ca1..7be28705 100644 --- a/src/constants/errors.ts +++ b/src/constants/errors.ts @@ -9,6 +9,7 @@ export const ERRORS = { URL_INVALID: 'Url_Invalid', FILES_AUDIO_REQUIRED: 'Files_Audio_Required', NOT_ENOUGH_RIGHTS: 'Not_Enough_Rights', + INCORRECT_DATA: 'Incorrect_Data', }; export const ERROR_LITERAL = { @@ -22,4 +23,5 @@ export const ERROR_LITERAL = { [ERRORS.URL_INVALID]: 'Неизвестный адрес', [ERRORS.FILES_AUDIO_REQUIRED]: 'Нужна хотя бы одна песня', [ERRORS.NOT_ENOUGH_RIGHTS]: 'У вас недостаточно прав', + [ERRORS.INCORRECT_DATA]: 'Недопустимые данные', }; From 428930497ea733f04ea955ffebbc3e8fec3d184f Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 16:43:18 +0700 Subject: [PATCH 81/99] better flow appearance --- src/components/flow/Cell/index.tsx | 13 ++- src/components/flow/Cell/styles.scss | 121 +++++++++++++++++---------- 2 files changed, 88 insertions(+), 46 deletions(-) diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index df7e67be..a63fd78a 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -60,7 +60,9 @@ const Cell: FC<IProps> = ({ return ( <div - className={classNames(styles.cell, (flow && flow.display) || 'single', { is_text: false })} + className={classNames(styles.cell, styles[(flow && flow.display) || 'single'], { + [styles.is_text]: false, + })} > {can_edit && ( <div className={styles.menu}> @@ -79,9 +81,11 @@ const Cell: FC<IProps> = ({ </div> )} - <div className={styles.face} onClick={onClick}> - {title && <div className={styles.title}>{title}</div>} - {text && <div className={styles.text}>{text}</div>} + <div className={classNames(styles.face, { [styles.has_text]: text })}> + <div className={styles.face_content}> + {title && <div className={styles.title}>{title}</div>} + {text && <div className={styles.text}>{text}</div>} + </div> </div> {thumbnail && ( @@ -91,6 +95,7 @@ const Cell: FC<IProps> = ({ backgroundImage: `url("${getURL({ url: thumbnail })}")`, opacity: is_loaded ? 1 : 0, }} + onClick={onClick} > <img src={getURL({ url: thumbnail })} onLoad={onImageLoad} alt="" /> </div> diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 91b818b5..a98ca9f3 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -9,13 +9,13 @@ cursor: pointer; color: white; - &:global(.is_hero) { + .is_hero { .title { font: $font_hero_title; } } - &:global(.is_text) { + .is_text { .title { display: none; } @@ -26,7 +26,7 @@ .text { font: $font_18_regular; - line-height: 23px; + line-height: 22px; margin-top: $gap; letter-spacing: 0.5px; @@ -65,49 +65,30 @@ margin-bottom: $gap / 2; } -:global { - .vert-1 { +.horizontal, +.quadro { + grid-column-end: span 2; +} + +.vertical, +.quadro { + grid-row-end: span 2; +} + +@media (max-width: $cell * 2) { + .horizontal, + .quadro, + .vertical, + .quadro { grid-row-end: span 1; - } - - .vert-2 { - grid-row-end: span 2; - } - - .hor-1 { grid-column-end: span 1; } +} - .hor-2 { - grid-column-end: span 2; - } - - :global(.horizontal), - :global(.quadro) { - grid-column-end: span 2; - } - - :global(.vertical), - :global(.quadro) { - grid-row-end: span 2; - } - - @media (max-width: $cell * 2) { - :global(.vertical), - :global(.quadro) { - grid-row-end: span 1; - } - - :global(.horizontal), - :global(.quadro) { - grid-column-end: span 1; - } - } - .is_text { - background: none; - padding: 10px; - box-shadow: inset #444 0 0 0 1px; - } +.is_text { + background: none; + padding: 10px; + box-shadow: inset #444 0 0 0 1px; } .thumbnail { @@ -134,6 +115,7 @@ .face { @include outer_shadow(); + display: flex; overflow: hidden; box-sizing: border-box; position: absolute; @@ -145,6 +127,61 @@ z-index: 2; border-radius: $cell_radius; padding: $gap; + pointer-events: none; + touch-action: none; + + .vertical > &, + .horizontal > &, + .quadro > & { + box-sizing: border-box; + background: none; + box-shadow: none; + padding: $gap / 2; + + &::after { + display: none; + } + + .face_content { + padding: $gap; + background: rgba(25, 25, 25, 0.8); + border-radius: $radius; + overflow: hidden; + } + + .text::after { + display: none; + } + } + + .vertical > & { + top: auto; + bottom: 0; + max-height: 50%; + max-width: 100%; + height: auto; + width: auto; + } + + .horizontal > & { + top: auto; + max-height: 50%; + max-width: 100%; + height: auto; + width: auto; + bottom: 0; + } + + .quadro > & { + top: auto; + left: auto; + max-height: 70%; + max-width: 50%; + height: auto; + width: auto; + bottom: 0; + right: 0; + } } .menu { From b4147231e7f3c6be04562e11772223900b4cf2a1 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 16:54:28 +0700 Subject: [PATCH 82/99] flow appearance --- src/components/flow/Cell/styles.scss | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index a98ca9f3..5408340e 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -165,8 +165,9 @@ .horizontal > & { top: auto; - max-height: 50%; - max-width: 100%; + left: 0; + max-height: 100%; + max-width: 50%; height: auto; width: auto; bottom: 0; @@ -174,13 +175,12 @@ .quadro > & { top: auto; - left: auto; max-height: 70%; max-width: 50%; height: auto; width: auto; bottom: 0; - right: 0; + left: 0; } } From 4b05aef7e72514b1105efd08be2c1b287dbe7c07 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 17:04:39 +0700 Subject: [PATCH 83/99] better flow gaps --- src/styles/variables.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 6cbf9b63..68c73473 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -1,15 +1,15 @@ @import 'colors'; $cell: 280px; -$grid_line: 4px; -$content_width: $cell * 5 + $grid_line * 4; $gap: 10px; +$grid_line: 8px; +$content_width: $cell * 5 + $grid_line * 4; $spc: $gap * 2; $comment_height: 72px; $bar_height: 64px; $radius: 8px; -$cell_radius: $radius; +$cell_radius: 3px; $panel_radius: $radius; $input_radius: $radius; From 4facd1f1485887a035291962456d46cda30e19a0 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 17:08:52 +0700 Subject: [PATCH 84/99] flow fixes for mobile --- src/components/flow/Cell/styles.scss | 96 +++++++++++++++------------- 1 file changed, 51 insertions(+), 45 deletions(-) diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 5408340e..bda847f0 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -43,6 +43,10 @@ z-index: 1; border-radius: 0 0 $radius $radius; } + + @media (max-width: $cell * 2 + $grid_line) { + display: none; + } } .title, @@ -130,57 +134,59 @@ pointer-events: none; touch-action: none; - .vertical > &, - .horizontal > &, - .quadro > & { - box-sizing: border-box; - background: none; - box-shadow: none; - padding: $gap / 2; + @media (min-width: $cell * 2 + $grid_line) { + .vertical > &, + .horizontal > &, + .quadro > & { + box-sizing: border-box; + background: none; + box-shadow: none; + padding: $gap / 2; - &::after { - display: none; + &::after { + display: none; + } + + .face_content { + padding: $gap; + background: rgba(25, 25, 25, 0.8); + border-radius: $radius; + overflow: hidden; + } + + .text::after { + display: none; + } } - .face_content { - padding: $gap; - background: rgba(25, 25, 25, 0.8); - border-radius: $radius; - overflow: hidden; + .vertical > & { + top: auto; + bottom: 0; + max-height: 50%; + max-width: 100%; + height: auto; + width: auto; } - .text::after { - display: none; + .horizontal > & { + top: auto; + left: 0; + max-height: 100%; + max-width: 50%; + height: auto; + width: auto; + bottom: 0; } - } - .vertical > & { - top: auto; - bottom: 0; - max-height: 50%; - max-width: 100%; - height: auto; - width: auto; - } - - .horizontal > & { - top: auto; - left: 0; - max-height: 100%; - max-width: 50%; - height: auto; - width: auto; - bottom: 0; - } - - .quadro > & { - top: auto; - max-height: 70%; - max-width: 50%; - height: auto; - width: auto; - bottom: 0; - left: 0; + .quadro > & { + top: auto; + max-height: 70%; + max-width: 50%; + height: auto; + width: auto; + bottom: 0; + left: 0; + } } } @@ -209,7 +215,7 @@ } } - @media (max-width: $cell * 2) { + @media (max-width: $cell * 2 + $grid_line) { right: 0; top: 0; } From 6836e00de14747f38a1509af5d972a5a804d3aa2 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Wed, 23 Oct 2019 18:00:05 +0700 Subject: [PATCH 85/99] s,oother menu appearance --- src/components/flow/Cell/index.tsx | 2 +- src/components/flow/Cell/styles.scss | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index a63fd78a..9441171b 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -1,4 +1,4 @@ -import React, { FC, useState, useCallback } from 'react'; +import React, { FC, useState, useCallback, useEffect } from 'react'; import { INode } from '~/redux/types'; import { getURL } from '~/utils/dom'; import classNames from 'classnames'; diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index bda847f0..479774a4 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -251,6 +251,8 @@ justify-content: center; display: flex; flex-direction: column; + transition: opacity 0.5s; + will-change: opacity; & > * { margin-top: $gap; From 99426172b235e99b09c6dc1cf0edb201ed7c2532 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 12:43:54 +0700 Subject: [PATCH 86/99] fixed pushing tags --- src/components/node/NodeRelated/index.tsx | 20 +++++++++++++------- src/components/node/NodeRelated/styles.scss | 9 +++++++-- src/components/node/Tags/index.tsx | 12 +++++++++--- src/constants/api.ts | 1 + src/containers/node/NodeLayout/index.tsx | 8 ++++---- src/redux/flow/api.ts | 2 +- src/redux/node/actions.ts | 5 +++++ src/redux/node/api.ts | 15 ++++++++++++++- src/redux/node/constants.ts | 1 + src/redux/node/handlers.ts | 5 +++++ src/redux/node/reducer.ts | 5 +++++ src/redux/node/sagas.ts | 18 ++++++++++++++---- 12 files changed, 79 insertions(+), 22 deletions(-) diff --git a/src/components/node/NodeRelated/index.tsx b/src/components/node/NodeRelated/index.tsx index eb2af602..118ee233 100644 --- a/src/components/node/NodeRelated/index.tsx +++ b/src/components/node/NodeRelated/index.tsx @@ -2,12 +2,14 @@ import React, { FC, HTMLAttributes } from 'react'; import { range } from 'ramda'; import * as styles from './styles.scss'; import { Group } from '~/components/containers/Group'; +import { INode } from '~/redux/types'; +import { getURL } from '~/utils/dom'; -type IProps = HTMLAttributes<HTMLDivElement> & {} +type IProps = HTMLAttributes<HTMLDivElement> & { + items: Partial<INode>[]; +}; -const NodeRelated: FC<IProps> = ({ - title, -}) => ( +const NodeRelated: FC<IProps> = ({ title, items }) => ( <Group className={styles.wrap}> <div className={styles.title}> <div className={styles.line} /> @@ -15,9 +17,13 @@ const NodeRelated: FC<IProps> = ({ <div className={styles.line} /> </div> <div className={styles.grid}> - { - range(1, 7).map(el => (<div className={styles.item} key={el} />)) - } + {items.map(item => ( + <div + className={styles.item} + key={item.id} + style={{ backgroundImage: `url("${getURL({ url: item.thumbnail })}")` }} + /> + ))} </div> </Group> ); diff --git a/src/components/node/NodeRelated/styles.scss b/src/components/node/NodeRelated/styles.scss index dae07ec1..4b7729c5 100644 --- a/src/components/node/NodeRelated/styles.scss +++ b/src/components/node/NodeRelated/styles.scss @@ -7,15 +7,20 @@ .grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(64px, 1fr)); + grid-template-columns: repeat(3, 1fr); grid-template-rows: auto; grid-auto-rows: auto; grid-column-gap: $gap; grid-row-gap: $gap; + + @include tablet { + grid-template-columns: repeat(6, 1fr); + } } .item { - background: darken($content_bg, 2%); + background: darken($content_bg, 2%) 50% 50% no-repeat; + background-size: cover; padding-bottom: 100%; border-radius: $cell_radius; } diff --git a/src/components/node/Tags/index.tsx b/src/components/node/Tags/index.tsx index 89359e35..c3505ccb 100644 --- a/src/components/node/Tags/index.tsx +++ b/src/components/node/Tags/index.tsx @@ -12,6 +12,7 @@ import { TagField } from '~/components/containers/TagField'; import { ITag } from '~/redux/types'; import { Tag } from '~/components/node/Tag'; import uniq from 'ramda/es/uniq'; +import assocPath from 'ramda/es/assocPath'; type IProps = HTMLAttributes<HTMLDivElement> & { tags: Partial<ITag>[]; @@ -65,9 +66,14 @@ export const Tags: FC<IProps> = ({ tags, is_editable, onTagsChange, ...props }) ); const onSubmit = useCallback(() => { - if (!data.length) return; - onTagsChange(uniq([...tags, ...data]).map(tag => tag.title)); - }, [tags, data, onTagsChange]); + const title = input && input.trim(); + const items = title ? [...data, { title }] : data; + + if (!items.length) return; + setData(items); + setInput(''); + onTagsChange(uniq([...tags, ...items]).map(tag => tag.title)); + }, [tags, data, onTagsChange, input, setInput]); useEffect(() => { setData(data.filter(({ title }) => !tags.some(tag => tag.title.trim() === title.trim()))); diff --git a/src/constants/api.ts b/src/constants/api.ts index 32a7b62a..1a6ee4e0 100644 --- a/src/constants/api.ts +++ b/src/constants/api.ts @@ -13,6 +13,7 @@ export const API = { GET_NODE: (id: number | string) => `/node/${id}`, COMMENT: (id: INode['id']) => `/node/${id}/comment`, + RELATED: (id: INode['id']) => `/node/${id}/related`, UPDATE_TAGS: (id: INode['id']) => `/node/${id}/tags`, POST_LIKE: (id: INode['id']) => `/node/${id}/like`, POST_STAR: (id: INode['id']) => `/node/${id}/heroic`, diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index f45a6dc9..a404e747 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -42,7 +42,7 @@ const NodeLayoutUnconnected: FC<IProps> = memo( match: { params: { id }, }, - node: { is_loading, is_loading_comments, comments = [], current: node }, + node: { is_loading, is_loading_comments, comments = [], current: node, related }, user, user: { is_user }, nodeLoadNode, @@ -123,9 +123,9 @@ const NodeLayoutUnconnected: FC<IProps> = memo( <Group style={{ flex: 1, minWidth: 0 }}> <NodeTags is_editable={is_user} tags={node.tags} onChange={onTagsChange} /> - <NodeRelated title="First album" /> - - <NodeRelated title="Second album" /> + {related && related.similar && ( + <NodeRelated title="ПОХОЖИЕ" items={related.similar} /> + )} </Group> </div> </Group> diff --git a/src/redux/flow/api.ts b/src/redux/flow/api.ts index 17145b59..acdcff66 100644 --- a/src/redux/flow/api.ts +++ b/src/redux/flow/api.ts @@ -35,4 +35,4 @@ export const postCellView = ({ api .post(API.NODE.SET_CELL_VIEW(id), { flow }, configWithToken(access)) .then(resultMiddleware) - .catch(errorMiddleware); + .catch(errorMiddleware); \ No newline at end of file diff --git a/src/redux/node/actions.ts b/src/redux/node/actions.ts index f15cfa68..b97f5c5d 100644 --- a/src/redux/node/actions.ts +++ b/src/redux/node/actions.ts @@ -48,6 +48,11 @@ export const nodeSetComments = (comments: IComment[]) => ({ type: NODE_ACTIONS.SET_COMMENTS, }); +export const nodeSetRelated = (related: INodeState['related']) => ({ + related, + type: NODE_ACTIONS.SET_RELATED, +}); + export const nodeSetCommentData = (id: number, comment: IComment) => ({ id, comment, diff --git a/src/redux/node/api.ts b/src/redux/node/api.ts index 29e586b2..5a98044d 100644 --- a/src/redux/node/api.ts +++ b/src/redux/node/api.ts @@ -2,6 +2,7 @@ import { api, configWithToken, resultMiddleware, errorMiddleware } from '~/utils import { INode, IResultWithStatus, IComment } from '../types'; import { API } from '~/constants/api'; import { nodeUpdateTags, nodeLike, nodeStar } from './actions'; +import { INodeState } from './reducer'; export const postNode = ({ access, @@ -58,12 +59,24 @@ export const getNodeComments = ({ }: { id: number; access: string; -}): Promise<IResultWithStatus<{ comment: Comment }>> => +}): Promise<IResultWithStatus<{ comments: Comment[] }>> => api .get(API.NODE.COMMENT(id), configWithToken(access)) .then(resultMiddleware) .catch(errorMiddleware); +export const getNodeRelated = ({ + id, + access, +}: { + id: number; + access: string; +}): Promise<IResultWithStatus<{ related: INodeState['related'] }>> => + api + .get(API.NODE.RELATED(id), configWithToken(access)) + .then(resultMiddleware) + .catch(errorMiddleware); + export const updateNodeTags = ({ id, tags, diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index e18df061..c246ccd6 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -34,6 +34,7 @@ export const NODE_ACTIONS = { POST_COMMENT: `${prefix}POST_COMMENT`, SET_COMMENTS: `${prefix}SET_COMMENTS`, + SET_RELATED: `${prefix}SET_RELATED`, UPDATE_TAGS: `${prefix}UPDATE_TAGS`, SET_TAGS: `${prefix}SET_TAGS`, diff --git a/src/redux/node/handlers.ts b/src/redux/node/handlers.ts index ef7d677c..b09ab335 100644 --- a/src/redux/node/handlers.ts +++ b/src/redux/node/handlers.ts @@ -11,6 +11,7 @@ import { nodeSetTags, nodeSetEditor, nodeSetCoverImage, + nodeSetRelated, } from './actions'; import { INodeState } from './reducer'; @@ -36,6 +37,9 @@ const setSendingComment = ( const setComments = (state: INodeState, { comments }: ReturnType<typeof nodeSetComments>) => assocPath(['comments'], comments, state); +const setRelated = (state: INodeState, { related }: ReturnType<typeof nodeSetRelated>) => + assocPath(['related'], related, state); + const setCommentData = ( state: INodeState, { id, comment }: ReturnType<typeof nodeSetCommentData> @@ -59,6 +63,7 @@ export const NODE_HANDLERS = { [NODE_ACTIONS.SET_CURRENT]: setCurrent, [NODE_ACTIONS.SET_SENDING_COMMENT]: setSendingComment, [NODE_ACTIONS.SET_COMMENTS]: setComments, + [NODE_ACTIONS.SET_RELATED]: setRelated, [NODE_ACTIONS.SET_COMMENT_DATA]: setCommentData, [NODE_ACTIONS.SET_TAGS]: setTags, [NODE_ACTIONS.SET_EDITOR]: setEditor, diff --git a/src/redux/node/reducer.ts b/src/redux/node/reducer.ts index fa15f16e..41e0161d 100644 --- a/src/redux/node/reducer.ts +++ b/src/redux/node/reducer.ts @@ -7,6 +7,10 @@ export type INodeState = Readonly<{ editor: INode; current: INode; comments: IComment[]; + related: { + albums: Record<string, Partial<INode[]>>; + similar: Partial<INode[]>; + }; comment_data: Record<number, IComment>; current_cover_image: IFile; @@ -28,6 +32,7 @@ const INITIAL_STATE: INodeState = { current: { ...EMPTY_NODE }, comment_data: { 0: { ...EMPTY_COMMENT } }, comments: [], + related: null, current_cover_image: null, is_loading: false, diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index 4e0c577e..dcec5c9e 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -1,4 +1,4 @@ -import { takeLatest, call, put, select, delay } from 'redux-saga/effects'; +import { takeLatest, call, put, select, delay, all } from 'redux-saga/effects'; import { push } from 'connected-react-router'; import { NODE_ACTIONS, EMPTY_NODE, EMPTY_COMMENT, NODE_EDITOR_DATA } from './constants'; @@ -19,6 +19,7 @@ import { nodeSetEditor, nodeEdit, nodeLike, + nodeSetRelated, } from './actions'; import { postNode, @@ -28,6 +29,7 @@ import { updateNodeTags, postNodeLike, postNodeStar, + getNodeRelated, } from './api'; import { reqWrapper } from '../auth/sagas'; import { flowSetNodes } from '../flow/actions'; @@ -112,11 +114,19 @@ function* onNodeLoad({ id, node_type }: ReturnType<typeof nodeLoadNode>) { // todo: load comments const { - data: { comments }, - } = yield call(reqWrapper, getNodeComments, { id }); + comments: { + data: { comments }, + }, + related: { + data: { related }, + }, + } = yield all({ + comments: call(reqWrapper, getNodeComments, { id }), + related: call(reqWrapper, getNodeRelated, { id }), + }); yield put(nodeSetComments(comments || [])); - + yield put(nodeSetRelated(related || [])); yield put(nodeSetLoadingComments(false)); return; From e6c5deefd51e2798ea4ab5ac31900faa6963d7d5 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 13:19:40 +0700 Subject: [PATCH 87/99] displaying related albums --- src/containers/node/NodeLayout/index.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index a404e747..0d35d636 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -123,6 +123,12 @@ const NodeLayoutUnconnected: FC<IProps> = memo( <Group style={{ flex: 1, minWidth: 0 }}> <NodeTags is_editable={is_user} tags={node.tags} onChange={onTagsChange} /> + {related && + related.albums && + Object.keys(related.albums).map(album => ( + <NodeRelated title={album} items={related.albums[album]} /> + ))} + {related && related.similar && ( <NodeRelated title="ПОХОЖИЕ" items={related.similar} /> )} From 0d042d4a095bc92a85ee40ad758ca11355758d97 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 13:20:53 +0700 Subject: [PATCH 88/99] resetting related on node load --- src/redux/node/sagas.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index dcec5c9e..b3396de8 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -94,6 +94,7 @@ function* onNodeLoad({ id, node_type }: ReturnType<typeof nodeLoadNode>) { yield put(nodeSetLoadingComments(true)); yield put(nodeSetSaveErrors({})); yield put(nodeSetCommentData(0, { ...EMPTY_COMMENT })); + yield put(nodeSetRelated(null)); if (node_type) yield put(nodeSetCurrent({ ...EMPTY_NODE, type: node_type })); From a9da7e8ceff3e8447a832aeea384bff66633af36 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 14:23:38 +0700 Subject: [PATCH 89/99] hiding empty samples --- src/components/containers/BlurWrapper/styles.scss | 6 +++--- src/components/containers/PageCover/styles.scss | 2 +- src/containers/node/NodeLayout/index.tsx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/containers/BlurWrapper/styles.scss b/src/components/containers/BlurWrapper/styles.scss index 113865fb..70b8770f 100644 --- a/src/components/containers/BlurWrapper/styles.scss +++ b/src/components/containers/BlurWrapper/styles.scss @@ -2,7 +2,7 @@ filter: blur(0); transition: filter 0.25s; will-change: filter; - // max-height: 100vh; - // width: 100vw; - // overflow: visible auto; + max-height: 100vh; + width: 100vw; + overflow: visible auto; } diff --git a/src/components/containers/PageCover/styles.scss b/src/components/containers/PageCover/styles.scss index 3081fccd..106c598b 100644 --- a/src/components/containers/PageCover/styles.scss +++ b/src/components/containers/PageCover/styles.scss @@ -8,7 +8,7 @@ } .wrap { - position: absolute; + position: fixed; top: 0; left: 0; z-index: -1; diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index 0d35d636..8bc5526c 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -129,7 +129,7 @@ const NodeLayoutUnconnected: FC<IProps> = memo( <NodeRelated title={album} items={related.albums[album]} /> ))} - {related && related.similar && ( + {related && related.similar && related.similar.length > 0 && ( <NodeRelated title="ПОХОЖИЕ" items={related.similar} /> )} </Group> From 5cd5941be0f71ea238bafb293240117812d654e6 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 15:44:40 +0700 Subject: [PATCH 90/99] hero slider --- src/components/flow/FlowGrid/index.tsx | 7 +- src/components/flow/FlowGrid/styles.scss | 4 +- src/components/flow/FlowHero/index.tsx | 109 +++++++++++++++++++++++ src/components/flow/FlowHero/styles.scss | 106 ++++++++++++++++++++++ src/containers/flow/FlowLayout/index.tsx | 12 ++- src/redux/flow/actions.ts | 5 ++ src/redux/flow/constants.ts | 1 + src/redux/flow/handlers.ts | 6 +- src/redux/flow/reducer.ts | 2 + src/redux/flow/sagas.ts | 12 ++- src/sprites/Sprites.tsx | 10 +++ src/styles/variables.scss | 6 +- 12 files changed, 266 insertions(+), 14 deletions(-) create mode 100644 src/components/flow/FlowHero/index.tsx create mode 100644 src/components/flow/FlowHero/styles.scss diff --git a/src/components/flow/FlowGrid/index.tsx b/src/components/flow/FlowGrid/index.tsx index 23bbe28b..cb2aecdd 100644 --- a/src/components/flow/FlowGrid/index.tsx +++ b/src/components/flow/FlowGrid/index.tsx @@ -7,6 +7,7 @@ import { INode } from '~/redux/types'; import { canEditNode } from '~/utils/node'; import { IUser } from '~/redux/auth/types'; import { flowSetCellView } from '~/redux/flow/actions'; +import { FlowHero } from '../FlowHero'; type IProps = Partial<IFlowState> & { user: Partial<IUser>; @@ -14,10 +15,12 @@ type IProps = Partial<IFlowState> & { onChangeCellView: typeof flowSetCellView; }; -export const FlowGrid: FC<IProps> = ({ user, nodes, onSelect, onChangeCellView }) => ( +export const FlowGrid: FC<IProps> = ({ user, nodes, heroes, onSelect, onChangeCellView }) => ( <div> <div className={styles.grid_test}> - <div className={styles.hero}>HERO</div> + <div className={styles.hero}> + <FlowHero heroes={heroes} /> + </div> <div className={styles.stamp}>STAMP</div> {nodes.map(node => ( diff --git a/src/components/flow/FlowGrid/styles.scss b/src/components/flow/FlowGrid/styles.scss index 5532c25b..39f7062a 100644 --- a/src/components/flow/FlowGrid/styles.scss +++ b/src/components/flow/FlowGrid/styles.scss @@ -8,7 +8,7 @@ $cols: $content_width / $cell; .grid_test { display: grid; grid-template-columns: repeat(auto-fit, minmax($cell, 1fr)); - grid-template-rows: 40vh $cell; + grid-template-rows: 50vh $cell; grid-auto-rows: $cell; grid-auto-flow: row dense; grid-column-gap: $grid_line; @@ -20,7 +20,7 @@ $cols: $content_width / $cell; @media (max-width: $cell * 6) { grid-template-columns: repeat(5, 1fr); - grid-template-rows: 40vh 20vw; + grid-template-rows: 50vh 20vw; grid-auto-rows: 20vw; } diff --git a/src/components/flow/FlowHero/index.tsx b/src/components/flow/FlowHero/index.tsx new file mode 100644 index 00000000..bdfc99a8 --- /dev/null +++ b/src/components/flow/FlowHero/index.tsx @@ -0,0 +1,109 @@ +import React, { FC, useState, useCallback, useEffect, useRef } from 'react'; +import { IFlowState } from '~/redux/flow/reducer'; +import classNames from 'classnames'; + +import * as styles from './styles.scss'; +import { getURL } from '~/utils/dom'; +import { withRouter, RouteComponentProps } from 'react-router'; +import { URLS } from '~/constants/urls'; +import { Icon } from '~/components/input/Icon'; +import { Filler } from '~/components/containers/Filler'; + +type IProps = RouteComponentProps & { + heroes: IFlowState['heroes']; +}; + +const FlowHeroUnconnected: FC<IProps> = ({ heroes, history }) => { + const [limit, setLimit] = useState(Math.max(heroes.length, 10)); + const [current, setCurrent] = useState(0); + const [loaded, setLoaded] = useState([]); + const timer = useRef(null); + + const onLoad = useCallback(id => () => setLoaded([...loaded, id]), [setLoaded, loaded]); + + const onNext = useCallback(() => { + clearTimeout(timer.current); + + if (loaded.length <= 1) return; + + const index = loaded.findIndex(el => el === current); + + setCurrent(index > loaded.length - 2 ? loaded[0] : loaded[index + 1]); + }, [loaded, current, setCurrent, timer]); + + const onPrevious = useCallback(() => { + clearTimeout(timer.current); + + if (loaded.length <= 1) return; + + const index = loaded.findIndex(el => el === current); + + setCurrent(index > 0 ? loaded[index - 1] : loaded[loaded.length - 1]); + }, [loaded, current, setCurrent, timer]); + + useEffect(() => { + timer.current = setTimeout(onNext, 3000); + + return () => clearTimeout(timer.current); + }, [current]); + + useEffect(() => { + if (current === 0 && loaded.length > 0) setCurrent(loaded[0]); + }, [loaded]); + + useEffect(() => { + setLimit(Math.max(heroes.length, limit)); + }, [heroes, limit]); + + const stopSliding = useCallback(() => { + clearTimeout(timer.current); + timer.current = setTimeout(onNext, 3000); + }, [timer]); + + const onClick = useCallback(() => { + if (!current) return; + + history.push(URLS.NODE_URL(current)); + }, [current]); + + return ( + <div className={styles.wrap} onMouseOver={stopSliding} onFocus={stopSliding}> + <div className={styles.info}> + <div className={styles.title_wrap}> + <div className={styles.title}>TITLE!</div> + </div> + + <div className={styles.buttons}> + <div className={styles.button} onClick={onPrevious}> + <Icon icon="left" /> + </div> + <div className={styles.button} onClick={onNext}> + <Icon icon="right" /> + </div> + </div> + </div> + + {heroes.slice(0, limit).map(hero => ( + <div + className={classNames(styles.hero, { + [styles.is_visible]: loaded.includes(hero.id), + [styles.is_active]: current === hero.id, + })} + style={{ backgroundImage: `url("${getURL({ url: hero.thumbnail })}")` }} + key={hero.id} + onClick={onClick} + > + <img + src={getURL({ url: hero.thumbnail })} + alt={hero.thumbnail} + onLoad={onLoad(hero.id)} + /> + </div> + ))} + </div> + ); +}; + +const FlowHero = withRouter(FlowHeroUnconnected); + +export { FlowHero }; diff --git a/src/components/flow/FlowHero/styles.scss b/src/components/flow/FlowHero/styles.scss new file mode 100644 index 00000000..cc900bda --- /dev/null +++ b/src/components/flow/FlowHero/styles.scss @@ -0,0 +1,106 @@ +.wrap { + width: 100%; + height: 100%; + position: relative; + background: $content_bg; + border-radius: $cell_radius; +} + +.hero { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: none; + transition: opacity 1s; + background: 50% 50% no-repeat; + background-size: cover; + border-radius: $cell_radius; + z-index: 2; + opacity: 0; + cursor: pointer; + + &::after { + content: ' '; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url('~/sprites/dots.svg') rgba(0, 0, 0, 0.3); + } + + img { + width: 0; + height: 0; + opacity: 0; + pointer-events: none; + touch-action: none; + } + + &.is_visible { + display: block; + } + + &.is_active { + opacity: 1; + z-index: 3; + } +} + +.info { + display: flex; + position: absolute; + bottom: 0; + right: 0; + width: 100%; + padding: $gap; + box-sizing: border-box; + z-index: 5; + flex-direction: row; +} + +.title_wrap { + flex: 1; + white-space: nowrap; + display: flex; + margin-right: $gap; + overflow: hidden; +} + +.title { + flex: 0; + height: 48px; + background: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; + justify-content: center; + padding: 0 $gap; + border-radius: $radius; + font: $font_hero_title; +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; + height: 48px; + background: rgba(0, 0, 0, 0.7); + flex-direction: row; + width: 96px; + border-radius: $radius; + + .button { + cursor: pointer; + flex: 0 0 48px; + display: flex; + align-items: center; + justify-content: center; + + svg { + width: 40px; + height: 40px; + } + } +} diff --git a/src/containers/flow/FlowLayout/index.tsx b/src/containers/flow/FlowLayout/index.tsx index a87ccb44..3a655b16 100644 --- a/src/containers/flow/FlowLayout/index.tsx +++ b/src/containers/flow/FlowLayout/index.tsx @@ -8,7 +8,7 @@ import pick from 'ramda/es/pick'; import { selectUser } from '~/redux/auth/selectors'; const mapStateToProps = state => ({ - flow: pick(['nodes'], selectFlow(state)), + flow: pick(['nodes', 'heroes'], selectFlow(state)), user: pick(['role', 'id'], selectUser(state)), }); @@ -20,12 +20,18 @@ const mapDispatchToProps = { type IProps = ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & {}; const FlowLayoutUnconnected: FC<IProps> = ({ - flow: { nodes }, + flow: { nodes, heroes }, user, nodeLoadNode, flowSetCellView, }) => ( - <FlowGrid nodes={nodes} onSelect={nodeLoadNode} user={user} onChangeCellView={flowSetCellView} /> + <FlowGrid + nodes={nodes} + heroes={heroes} + onSelect={nodeLoadNode} + user={user} + onChangeCellView={flowSetCellView} + /> ); const FlowLayout = connect( diff --git a/src/redux/flow/actions.ts b/src/redux/flow/actions.ts index d4b4b1e1..11b3b26b 100644 --- a/src/redux/flow/actions.ts +++ b/src/redux/flow/actions.ts @@ -7,6 +7,11 @@ export const flowSetNodes = (nodes: IFlowState['nodes']) => ({ type: FLOW_ACTIONS.SET_NODES, }); +export const flowSetHeroes = (heroes: IFlowState['heroes']) => ({ + heroes, + type: FLOW_ACTIONS.SET_HEROES, +}); + export const flowSetCellView = (id: INode['id'], flow: INode['flow']) => ({ type: FLOW_ACTIONS.SET_CELL_VIEW, id, diff --git a/src/redux/flow/constants.ts b/src/redux/flow/constants.ts index a7389f18..b74224b2 100644 --- a/src/redux/flow/constants.ts +++ b/src/redux/flow/constants.ts @@ -3,5 +3,6 @@ const prefix = 'FLOW.'; export const FLOW_ACTIONS = { GET_FLOW: `${prefix}GET_FLOW`, SET_NODES: `${prefix}SET_NODES`, + SET_HEROES: `${prefix}SET_HEROES`, SET_CELL_VIEW: `${prefix}SET_CELL_VIEW`, }; diff --git a/src/redux/flow/handlers.ts b/src/redux/flow/handlers.ts index 80f3b1ca..d44ec537 100644 --- a/src/redux/flow/handlers.ts +++ b/src/redux/flow/handlers.ts @@ -1,11 +1,15 @@ import assocPath from 'ramda/es/assocPath'; import { FLOW_ACTIONS } from './constants'; -import { flowSetNodes } from './actions'; +import { flowSetNodes, flowSetHeroes } from './actions'; import { IFlowState } from './reducer'; const setNodes = (state: IFlowState, { nodes }: ReturnType<typeof flowSetNodes>) => assocPath(['nodes'], nodes, state); +const setHeroes = (state: IFlowState, { heroes }: ReturnType<typeof flowSetHeroes>) => + assocPath(['heroes'], heroes, state); + export const FLOW_HANDLERS = { [FLOW_ACTIONS.SET_NODES]: setNodes, + [FLOW_ACTIONS.SET_HEROES]: setHeroes, }; diff --git a/src/redux/flow/reducer.ts b/src/redux/flow/reducer.ts index f828c6c1..6786076d 100644 --- a/src/redux/flow/reducer.ts +++ b/src/redux/flow/reducer.ts @@ -5,11 +5,13 @@ import { FLOW_HANDLERS } from './handlers'; export type IFlowState = Readonly<{ is_loading: boolean; nodes: INode[]; + heroes: Partial<INode>[]; error: IError; }>; const INITIAL_STATE: IFlowState = { nodes: [], + heroes: [], is_loading: false, error: null, }; diff --git a/src/redux/flow/sagas.ts b/src/redux/flow/sagas.ts index 9c8aa710..56776a8f 100644 --- a/src/redux/flow/sagas.ts +++ b/src/redux/flow/sagas.ts @@ -2,23 +2,29 @@ import { takeLatest, call, put, select } from 'redux-saga/effects'; import { REHYDRATE } from 'redux-persist'; import { FLOW_ACTIONS } from './constants'; import { getNodes } from '../node/api'; -import { flowSetNodes, flowSetCellView } from './actions'; +import { flowSetNodes, flowSetCellView, flowSetHeroes } from './actions'; import { IResultWithStatus, INode } from '../types'; import { selectFlowNodes } from './selectors'; import { reqWrapper } from '../auth/sagas'; import { postCellView } from './api'; +import { IFlowState } from './reducer'; function* onGetFlow() { const { - data: { nodes = null }, - }: IResultWithStatus<{ nodes: INode[] }> = yield call(getNodes, {}); + data: { nodes = null, heroes = null }, + }: IResultWithStatus<{ nodes: IFlowState['nodes']; heroes: IFlowState['heroes'] }> = yield call( + getNodes, + {} + ); if (!nodes || !nodes.length) { yield put(flowSetNodes([])); + yield put(flowSetHeroes([])); return; } yield put(flowSetNodes(nodes)); + yield put(flowSetHeroes(heroes)); } function* onSetCellView({ id, flow }: ReturnType<typeof flowSetCellView>) { diff --git a/src/sprites/Sprites.tsx b/src/sprites/Sprites.tsx index 5384d0d6..39856ab4 100644 --- a/src/sprites/Sprites.tsx +++ b/src/sprites/Sprites.tsx @@ -149,6 +149,16 @@ const Sprites: FC<{}> = () => ( <path fill="none" d="M0 0h24v24H0V0z" /> <path d="M16 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" /> </g> + + <g id="left" stroke="none"> + <path fill="none" d="M0 0h24v24H0V0z" /> + <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z" /> + </g> + + <g id="right" stroke="none"> + <path fill="none" d="M0 0h24v24H0V0z" /> + <path d="M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z" /> + </g> </svg> ); diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 68c73473..a7a75fb5 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -2,14 +2,14 @@ $cell: 280px; $gap: 10px; -$grid_line: 8px; +$grid_line: 5px; $content_width: $cell * 5 + $grid_line * 4; $spc: $gap * 2; $comment_height: 72px; $bar_height: 64px; $radius: 8px; -$cell_radius: 3px; +$cell_radius: $radius; $panel_radius: $radius; $input_radius: $radius; @@ -55,7 +55,7 @@ $font_8_regular: $regular 8px $font; $font_8_semibold: $semibold 8px $font; $font_cell_title: $bold 30px $font; -$font_hero_title: $font_48_semibold; +$font_hero_title: $bold 40px $font; $shadow_depth_1: transparentize(black, 0.8) 0 1px, inset transparentize(white, 0.98) 0 1px; $shadow_depth_2: transparentize(black, 0.8) 0 2px, inset transparentize(white, 0.98) 0 1px; From 2386b3f8d8855d42b772188de5e14b4003253369 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 16:02:18 +0700 Subject: [PATCH 91/99] dynamically loading images for hero --- .../containers/PageCover/styles.scss | 2 +- src/components/flow/FlowHero/index.tsx | 18 +++++++++++++----- src/components/flow/FlowHero/styles.scss | 2 +- src/sprites/stripes.svg | 8 ++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 src/sprites/stripes.svg diff --git a/src/components/containers/PageCover/styles.scss b/src/components/containers/PageCover/styles.scss index 106c598b..4c2b9724 100644 --- a/src/components/containers/PageCover/styles.scss +++ b/src/components/containers/PageCover/styles.scss @@ -26,7 +26,7 @@ left: 0; width: 100%; height: 100%; - background: url(~/sprites/dots.svg) rgba(0, 0, 0, 0.5); + background: url(~/sprites/stripes.svg) rgba(0, 0, 0, 0.3); } @include tablet { diff --git a/src/components/flow/FlowHero/index.tsx b/src/components/flow/FlowHero/index.tsx index bdfc99a8..d01896a4 100644 --- a/src/components/flow/FlowHero/index.tsx +++ b/src/components/flow/FlowHero/index.tsx @@ -7,14 +7,13 @@ import { getURL } from '~/utils/dom'; import { withRouter, RouteComponentProps } from 'react-router'; import { URLS } from '~/constants/urls'; import { Icon } from '~/components/input/Icon'; -import { Filler } from '~/components/containers/Filler'; type IProps = RouteComponentProps & { heroes: IFlowState['heroes']; }; const FlowHeroUnconnected: FC<IProps> = ({ heroes, history }) => { - const [limit, setLimit] = useState(Math.max(heroes.length, 10)); + const [limit, setLimit] = useState(Math.min(heroes.length, 6)); const [current, setCurrent] = useState(0); const [loaded, setLoaded] = useState([]); const timer = useRef(null); @@ -31,6 +30,11 @@ const FlowHeroUnconnected: FC<IProps> = ({ heroes, history }) => { setCurrent(index > loaded.length - 2 ? loaded[0] : loaded[index + 1]); }, [loaded, current, setCurrent, timer]); + const onNextPress = useCallback(() => { + setLimit(Math.min(heroes.length, limit + 1)); + onNext(); + }, [onNext, heroes, limit, setLimit]); + const onPrevious = useCallback(() => { clearTimeout(timer.current); @@ -52,13 +56,13 @@ const FlowHeroUnconnected: FC<IProps> = ({ heroes, history }) => { }, [loaded]); useEffect(() => { - setLimit(Math.max(heroes.length, limit)); + setLimit(limit > 0 ? Math.min(heroes.length, limit) : heroes.length); }, [heroes, limit]); const stopSliding = useCallback(() => { clearTimeout(timer.current); timer.current = setTimeout(onNext, 3000); - }, [timer]); + }, [timer, onNext]); const onClick = useCallback(() => { if (!current) return; @@ -66,6 +70,10 @@ const FlowHeroUnconnected: FC<IProps> = ({ heroes, history }) => { history.push(URLS.NODE_URL(current)); }, [current]); + useEffect(() => { + console.log({ limit }); + }, [limit]); + return ( <div className={styles.wrap} onMouseOver={stopSliding} onFocus={stopSliding}> <div className={styles.info}> @@ -77,7 +85,7 @@ const FlowHeroUnconnected: FC<IProps> = ({ heroes, history }) => { <div className={styles.button} onClick={onPrevious}> <Icon icon="left" /> </div> - <div className={styles.button} onClick={onNext}> + <div className={styles.button} onClick={onNextPress}> <Icon icon="right" /> </div> </div> diff --git a/src/components/flow/FlowHero/styles.scss b/src/components/flow/FlowHero/styles.scss index cc900bda..ef265d54 100644 --- a/src/components/flow/FlowHero/styles.scss +++ b/src/components/flow/FlowHero/styles.scss @@ -28,7 +28,7 @@ left: 0; width: 100%; height: 100%; - background: url('~/sprites/dots.svg') rgba(0, 0, 0, 0.3); + background: url('~/sprites/stripes.svg') rgba(0, 0, 0, 0.3); } img { diff --git a/src/sprites/stripes.svg b/src/sprites/stripes.svg new file mode 100644 index 00000000..6977e1ab --- /dev/null +++ b/src/sprites/stripes.svg @@ -0,0 +1,8 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"> + <defs> + <pattern id="pattern_KGiq8" patternUnits="userSpaceOnUse" width="3.5" height="3.5" patternTransform="rotate(45)"> + <line x1="0" y="0" x2="0" y2="3.5" stroke="#000000" stroke-width="1" /> + </pattern> + </defs> + <rect width="100%" height="100%" fill="url(#pattern_KGiq8)" opacity="1" /> +</svg> \ No newline at end of file From 81cd45f1683f290fcbe55e78e07821fe8f6546e4 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 16:04:31 +0700 Subject: [PATCH 92/99] fixed key warning --- src/containers/node/NodeLayout/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/containers/node/NodeLayout/index.tsx b/src/containers/node/NodeLayout/index.tsx index 8bc5526c..1f0ba928 100644 --- a/src/containers/node/NodeLayout/index.tsx +++ b/src/containers/node/NodeLayout/index.tsx @@ -126,7 +126,7 @@ const NodeLayoutUnconnected: FC<IProps> = memo( {related && related.albums && Object.keys(related.albums).map(album => ( - <NodeRelated title={album} items={related.albums[album]} /> + <NodeRelated title={album} items={related.albums[album]} key={album} /> ))} {related && related.similar && related.similar.length > 0 && ( From fa0d3c99325131170d4e41e7302afda209cb15c4 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 16:08:49 +0700 Subject: [PATCH 93/99] fixed flow timers --- src/components/containers/Filler/index.tsx | 13 ++----------- src/components/flow/FlowHero/index.tsx | 4 ++-- src/components/flow/FlowHero/styles.scss | 2 +- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/components/containers/Filler/index.tsx b/src/components/containers/Filler/index.tsx index 2f40c037..3af36783 100644 --- a/src/components/containers/Filler/index.tsx +++ b/src/components/containers/Filler/index.tsx @@ -4,15 +4,6 @@ import * as styles from './styles.scss'; type IProps = React.HTMLAttributes<HTMLDivElement>; -export const Filler: FC<IProps> = ({ - className = '', - ...props -}) => ( - <div - className={classNames( - styles.filler, - className, - )} - {...props} - /> +export const Filler: FC<IProps> = ({ className = '', ...props }) => ( + <div className={classNames(styles.filler, className)} {...props} /> ); diff --git a/src/components/flow/FlowHero/index.tsx b/src/components/flow/FlowHero/index.tsx index d01896a4..552cd999 100644 --- a/src/components/flow/FlowHero/index.tsx +++ b/src/components/flow/FlowHero/index.tsx @@ -46,7 +46,7 @@ const FlowHeroUnconnected: FC<IProps> = ({ heroes, history }) => { }, [loaded, current, setCurrent, timer]); useEffect(() => { - timer.current = setTimeout(onNext, 3000); + timer.current = setTimeout(onNext, 5000); return () => clearTimeout(timer.current); }, [current]); @@ -61,7 +61,7 @@ const FlowHeroUnconnected: FC<IProps> = ({ heroes, history }) => { const stopSliding = useCallback(() => { clearTimeout(timer.current); - timer.current = setTimeout(onNext, 3000); + timer.current = setTimeout(onNext, 5000); }, [timer, onNext]); const onClick = useCallback(() => { diff --git a/src/components/flow/FlowHero/styles.scss b/src/components/flow/FlowHero/styles.scss index ef265d54..2643864e 100644 --- a/src/components/flow/FlowHero/styles.scss +++ b/src/components/flow/FlowHero/styles.scss @@ -13,7 +13,7 @@ width: 100%; height: 100%; display: none; - transition: opacity 1s; + transition: opacity 2s; background: 50% 50% no-repeat; background-size: cover; border-radius: $cell_radius; From 72337142da1c29f5960c7f1d637bd0cfc6fa35f9 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 17:24:35 +0700 Subject: [PATCH 94/99] animated flow --- src/components/flow/FlowHero/styles.scss | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/flow/FlowHero/styles.scss b/src/components/flow/FlowHero/styles.scss index 2643864e..31e05817 100644 --- a/src/components/flow/FlowHero/styles.scss +++ b/src/components/flow/FlowHero/styles.scss @@ -1,9 +1,19 @@ +@keyframes rise { + 0% { + transform: translate(0, 0); + } + 100% { + transform: translate(0, -10%); + } +} + .wrap { width: 100%; height: 100%; position: relative; background: $content_bg; border-radius: $cell_radius; + overflow: hidden; } .hero { @@ -11,7 +21,7 @@ top: 0; left: 0; width: 100%; - height: 100%; + height: 150%; display: none; transition: opacity 2s; background: 50% 50% no-repeat; @@ -20,6 +30,7 @@ z-index: 2; opacity: 0; cursor: pointer; + transform: translate(0, -10%); &::after { content: ' '; @@ -46,6 +57,8 @@ &.is_active { opacity: 1; z-index: 3; + will-change: transform; + animation: rise 5s forwards; } } From fb21057f8fab9ecf7d89f0b9f1ddf37bd2d419f3 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 17:35:59 +0700 Subject: [PATCH 95/99] fixed hero animations --- src/components/flow/FlowHero/styles.scss | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/components/flow/FlowHero/styles.scss b/src/components/flow/FlowHero/styles.scss index 31e05817..bad60ff3 100644 --- a/src/components/flow/FlowHero/styles.scss +++ b/src/components/flow/FlowHero/styles.scss @@ -1,11 +1,11 @@ -@keyframes rise { - 0% { - transform: translate(0, 0); - } - 100% { - transform: translate(0, -10%); - } -} +// @keyframes rise { +// 0% { +// transform: translate(0, 0); +// } +// 100% { +// transform: translate(0, -10%); +// } +// } .wrap { width: 100%; @@ -23,14 +23,14 @@ width: 100%; height: 150%; display: none; - transition: opacity 2s; + transition: opacity 2s, transform linear 5s 2s; background: 50% 50% no-repeat; background-size: cover; border-radius: $cell_radius; z-index: 2; opacity: 0; cursor: pointer; - transform: translate(0, -10%); + transform: translate(0, 0); &::after { content: ' '; @@ -58,7 +58,9 @@ opacity: 1; z-index: 3; will-change: transform; - animation: rise 5s forwards; + // animation: rise 5s forwards; + transform: translate(0, -10%); + transition: opacity 2s, transform linear 5s; } } From 312b1d1d174d063a1d99b254400fcca7a1fc6eb0 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 17:37:23 +0700 Subject: [PATCH 96/99] fixed stripes at hero --- src/components/flow/FlowHero/styles.scss | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/components/flow/FlowHero/styles.scss b/src/components/flow/FlowHero/styles.scss index bad60ff3..7d5b0e62 100644 --- a/src/components/flow/FlowHero/styles.scss +++ b/src/components/flow/FlowHero/styles.scss @@ -14,6 +14,17 @@ background: $content_bg; border-radius: $cell_radius; overflow: hidden; + + &::after { + content: ' '; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url('~/sprites/stripes.svg') rgba(0, 0, 0, 0.3); + z-index: 4; + } } .hero { @@ -32,16 +43,6 @@ cursor: pointer; transform: translate(0, 0); - &::after { - content: ' '; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: url('~/sprites/stripes.svg') rgba(0, 0, 0, 0.3); - } - img { width: 0; height: 0; From db992a375ba6d7fd1f3e292c80750259f4f3c1f3 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Thu, 24 Oct 2019 17:59:37 +0700 Subject: [PATCH 97/99] fixed flow appearance --- .../containers/BlurWrapper/styles.scss | 6 ++--- src/components/flow/Cell/styles.scss | 26 +++++++++---------- src/components/flow/FlowHero/styles.scss | 2 ++ src/components/node/NodeRelated/styles.scss | 2 +- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/components/containers/BlurWrapper/styles.scss b/src/components/containers/BlurWrapper/styles.scss index 70b8770f..113865fb 100644 --- a/src/components/containers/BlurWrapper/styles.scss +++ b/src/components/containers/BlurWrapper/styles.scss @@ -2,7 +2,7 @@ filter: blur(0); transition: filter 0.25s; will-change: filter; - max-height: 100vh; - width: 100vw; - overflow: visible auto; + // max-height: 100vh; + // width: 100vw; + // overflow: visible auto; } diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 479774a4..0777feae 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -135,13 +135,13 @@ touch-action: none; @media (min-width: $cell * 2 + $grid_line) { - .vertical > &, - .horizontal > &, - .quadro > & { + .vertical > &.has_text, + .horizontal > &.has_text, + .quadro > &.has_text { box-sizing: border-box; background: none; box-shadow: none; - padding: $gap / 2; + padding: $grid_line; &::after { display: none; @@ -159,30 +159,30 @@ } } - .vertical > & { + .vertical > &.has_text { top: auto; bottom: 0; - max-height: 50%; + height: 50%; max-width: 100%; - height: auto; + // height: auto; width: auto; } - .horizontal > & { + .horizontal > &.has_text { top: auto; left: 0; - max-height: 100%; + height: 100%; max-width: 50%; - height: auto; + // height: auto; width: auto; bottom: 0; } - .quadro > & { + .quadro > &.has_text { top: auto; - max-height: 70%; + height: 50%; max-width: 50%; - height: auto; + // height: auto; width: auto; bottom: 0; left: 0; diff --git a/src/components/flow/FlowHero/styles.scss b/src/components/flow/FlowHero/styles.scss index 7d5b0e62..13856c91 100644 --- a/src/components/flow/FlowHero/styles.scss +++ b/src/components/flow/FlowHero/styles.scss @@ -24,6 +24,8 @@ height: 100%; background: url('~/sprites/stripes.svg') rgba(0, 0, 0, 0.3); z-index: 4; + pointer-events: none; + touch-action: none; } } diff --git a/src/components/node/NodeRelated/styles.scss b/src/components/node/NodeRelated/styles.scss index 4b7729c5..59da263f 100644 --- a/src/components/node/NodeRelated/styles.scss +++ b/src/components/node/NodeRelated/styles.scss @@ -19,7 +19,7 @@ } .item { - background: darken($content_bg, 2%) 50% 50% no-repeat; + background: lighten($content_bg, 2%) 50% 50% no-repeat; background-size: cover; padding-bottom: 100%; border-radius: $cell_radius; From 774e254afce5d8b0a42cd30a9f735c7f03cfef7a Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Fri, 25 Oct 2019 10:37:29 +0700 Subject: [PATCH 98/99] fixed flow appearance --- src/components/flow/Cell/styles.scss | 3 +++ src/components/node/NodeRelated/index.tsx | 13 +++++++++---- src/components/node/NodeRelated/styles.scss | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/components/flow/Cell/styles.scss b/src/components/flow/Cell/styles.scss index 0777feae..feec9ca8 100644 --- a/src/components/flow/Cell/styles.scss +++ b/src/components/flow/Cell/styles.scss @@ -166,6 +166,7 @@ max-width: 100%; // height: auto; width: auto; + padding: ($grid_line / 2) $grid_line $grid_line $grid_line; } .horizontal > &.has_text { @@ -176,9 +177,11 @@ // height: auto; width: auto; bottom: 0; + padding: $grid_line ($grid_line / 2) $grid_line $grid_line; } .quadro > &.has_text { + padding: ($grid_line / 2) ($grid_line / 2) $grid_line $grid_line; top: auto; height: 50%; max-width: 50%; diff --git a/src/components/node/NodeRelated/index.tsx b/src/components/node/NodeRelated/index.tsx index 118ee233..a24beee5 100644 --- a/src/components/node/NodeRelated/index.tsx +++ b/src/components/node/NodeRelated/index.tsx @@ -1,15 +1,17 @@ -import React, { FC, HTMLAttributes } from 'react'; -import { range } from 'ramda'; +import React, { FC } from 'react'; import * as styles from './styles.scss'; import { Group } from '~/components/containers/Group'; import { INode } from '~/redux/types'; import { getURL } from '~/utils/dom'; +import { withRouter, RouteComponentProps } from 'react-router'; +import { URLS } from '~/constants/urls'; -type IProps = HTMLAttributes<HTMLDivElement> & { +type IProps = RouteComponentProps & { + title: string; items: Partial<INode>[]; }; -const NodeRelated: FC<IProps> = ({ title, items }) => ( +const NodeRelatedUnconnected: FC<IProps> = ({ title, items, history }) => ( <Group className={styles.wrap}> <div className={styles.title}> <div className={styles.line} /> @@ -22,10 +24,13 @@ const NodeRelated: FC<IProps> = ({ title, items }) => ( className={styles.item} key={item.id} style={{ backgroundImage: `url("${getURL({ url: item.thumbnail })}")` }} + onClick={() => history.push(URLS.NODE_URL(item.id))} /> ))} </div> </Group> ); +const NodeRelated = withRouter(NodeRelatedUnconnected); + export { NodeRelated }; diff --git a/src/components/node/NodeRelated/styles.scss b/src/components/node/NodeRelated/styles.scss index 59da263f..959fbce5 100644 --- a/src/components/node/NodeRelated/styles.scss +++ b/src/components/node/NodeRelated/styles.scss @@ -23,6 +23,7 @@ background-size: cover; padding-bottom: 100%; border-radius: $cell_radius; + cursor: pointer; } .title { From 920a8adaa2e6faed117de93f1c80ed6644a4b8f8 Mon Sep 17 00:00:00 2001 From: Fedor Katurov <gotham48@gmail.com> Date: Fri, 25 Oct 2019 10:54:46 +0700 Subject: [PATCH 99/99] fixed node related --- src/components/node/NodeRelated/index.tsx | 45 ++++++++----------- src/components/node/NodeRelated/styles.scss | 9 ---- src/components/node/NodeRelatedItem/index.tsx | 35 +++++++++++++++ .../node/NodeRelatedItem/styles.scss | 30 +++++++++++++ 4 files changed, 84 insertions(+), 35 deletions(-) create mode 100644 src/components/node/NodeRelatedItem/index.tsx create mode 100644 src/components/node/NodeRelatedItem/styles.scss diff --git a/src/components/node/NodeRelated/index.tsx b/src/components/node/NodeRelated/index.tsx index a24beee5..07c70da7 100644 --- a/src/components/node/NodeRelated/index.tsx +++ b/src/components/node/NodeRelated/index.tsx @@ -2,35 +2,28 @@ import React, { FC } from 'react'; import * as styles from './styles.scss'; import { Group } from '~/components/containers/Group'; import { INode } from '~/redux/types'; -import { getURL } from '~/utils/dom'; -import { withRouter, RouteComponentProps } from 'react-router'; -import { URLS } from '~/constants/urls'; +import { NodeRelatedItem } from '~/components/node/NodeRelatedItem'; -type IProps = RouteComponentProps & { +interface IProps { title: string; items: Partial<INode>[]; +} + +const NodeRelated: FC<IProps> = ({ title, items }) => { + return ( + <Group className={styles.wrap}> + <div className={styles.title}> + <div className={styles.line} /> + <div className={styles.text}>{title}</div> + <div className={styles.line} /> + </div> + <div className={styles.grid}> + {items.map(item => ( + <NodeRelatedItem item={item} key={item.id} /> + ))} + </div> + </Group> + ); }; -const NodeRelatedUnconnected: FC<IProps> = ({ title, items, history }) => ( - <Group className={styles.wrap}> - <div className={styles.title}> - <div className={styles.line} /> - <div className={styles.text}>{title}</div> - <div className={styles.line} /> - </div> - <div className={styles.grid}> - {items.map(item => ( - <div - className={styles.item} - key={item.id} - style={{ backgroundImage: `url("${getURL({ url: item.thumbnail })}")` }} - onClick={() => history.push(URLS.NODE_URL(item.id))} - /> - ))} - </div> - </Group> -); - -const NodeRelated = withRouter(NodeRelatedUnconnected); - export { NodeRelated }; diff --git a/src/components/node/NodeRelated/styles.scss b/src/components/node/NodeRelated/styles.scss index 959fbce5..b0b43968 100644 --- a/src/components/node/NodeRelated/styles.scss +++ b/src/components/node/NodeRelated/styles.scss @@ -17,15 +17,6 @@ grid-template-columns: repeat(6, 1fr); } } - -.item { - background: lighten($content_bg, 2%) 50% 50% no-repeat; - background-size: cover; - padding-bottom: 100%; - border-radius: $cell_radius; - cursor: pointer; -} - .title { font: $font_14_semibold; text-transform: uppercase; diff --git a/src/components/node/NodeRelatedItem/index.tsx b/src/components/node/NodeRelatedItem/index.tsx new file mode 100644 index 00000000..09eec397 --- /dev/null +++ b/src/components/node/NodeRelatedItem/index.tsx @@ -0,0 +1,35 @@ +import React, { FC, memo, useCallback, useState } from 'react'; +import * as styles from './styles.scss'; +import classNames from 'classnames'; +import { INode } from '~/redux/types'; +import { URLS } from '~/constants/urls'; +import { RouteComponentProps, withRouter } from 'react-router'; +import { getURL } from '~/utils/dom'; + +type IProps = RouteComponentProps & { + item: Partial<INode>; +}; + +const NodeRelatedItemUnconnected: FC<IProps> = memo(({ item, history }) => { + const [is_loaded, setIsLoaded] = useState(false); + const onClick = useCallback(() => history.push(URLS.NODE_URL(item.id)), [item, history]); + + return ( + <div + className={classNames(styles.item, { [styles.is_loaded]: is_loaded })} + key={item.id} + onClick={onClick} + > + <div + className={styles.thumb} + style={{ backgroundImage: `url("${getURL({ url: item.thumbnail })}")` }} + /> + + <img src={getURL({ url: item.thumbnail })} alt="loader" onLoad={() => setIsLoaded(true)} /> + </div> + ); +}); + +const NodeRelatedItem = withRouter(NodeRelatedItemUnconnected); + +export { NodeRelatedItem }; diff --git a/src/components/node/NodeRelatedItem/styles.scss b/src/components/node/NodeRelatedItem/styles.scss new file mode 100644 index 00000000..d35af1e5 --- /dev/null +++ b/src/components/node/NodeRelatedItem/styles.scss @@ -0,0 +1,30 @@ +.item { + background: lighten($content_bg, 2%) 50% 50% no-repeat; + padding-bottom: 100%; + border-radius: $cell_radius; + cursor: pointer; + position: relative; + + img { + position: absolute; + width: 0; + height: 0; + opacity: 0; + } +} + +.thumb { + position: absolute; + width: 100%; + height: 100%; + border-radius: $cell_radius; + background: lighten($content_bg, 2%) 50% 50% no-repeat; + background-size: cover; + opacity: 0; + transition: opacity 0.5s; + will-change: opacity; + + .is_loaded & { + opacity: 1; + } +}