This commit is contained in:
Sean Yesmunt 2020-08-11 16:32:03 -04:00
parent 692862c769
commit a31f14b016
19 changed files with 256 additions and 169 deletions

View file

@ -171,7 +171,6 @@
"react-router-dom": "^5.1.0",
"react-simplemde-editor": "^4.0.0",
"react-spring": "^8.0.20",
"react-sticky-box": "^0.8.0",
"reakit": "^1.0.0-beta.13",
"redux": "^3.6.0",
"redux-persist": "^5.10.0",

View file

@ -2,7 +2,7 @@
import * as ICONS from 'constants/icons';
import { SETTINGS } from 'lbry-redux';
import * as PAGES from 'constants/pages';
import React, { Fragment } from 'react';
import React from 'react';
import { withRouter } from 'react-router';
import classnames from 'classnames';
import Button from 'component/button';
@ -206,14 +206,17 @@ const Header = (props: Props) => {
) : (
<>
<div className="header__navigation">
<span style={{ position: 'relative' }}>
<Button
className="header__navigation-item menu__title header__navigation-item--icon"
icon={ICONS.MENU}
onClick={() => setSidebarOpen(!sidebarOpen)}
/>
{isAbsoluteSideNavHidden && <NotificationBubble />}
</span>
{!authHeader && (
<span style={{ position: 'relative' }}>
<Button
className="header__navigation-item menu__title header__navigation-item--icon"
icon={ICONS.MENU}
onClick={() => setSidebarOpen(!sidebarOpen)}
>
{isAbsoluteSideNavHidden && <NotificationBubble />}
</Button>
</span>
)}
<Button
className="header__navigation-item header__navigation-item--lbry header__navigation-item--button-mobile"
// @if TARGET='app'
@ -317,18 +320,7 @@ const Header = (props: Props) => {
</div>
<span className="menu__link-help">{email}</span>
</MenuItem>
) : (
<React.Fragment>
<MenuItem className="menu__link" onSelect={() => history.push(`/$/${PAGES.AUTH}`)}>
<Icon aria-hidden icon={ICONS.SIGN_UP} />
{__('Register')}
</MenuItem>
<MenuItem className="menu__link" onSelect={() => history.push(`/$/${PAGES.AUTH_SIGNIN}`)}>
<Icon aria-hidden icon={ICONS.SIGN_IN} />
{__('Sign In')}
</MenuItem>
</React.Fragment>
)}
) : null}
</MenuList>
</Menu>
<Menu>
@ -364,22 +356,20 @@ const Header = (props: Props) => {
)}
</div>
{!authHeader ? (
{!authHeader && !backout ? (
<div className={classnames('header__menu', { 'header__menu--with-balance': !IS_WEB || authenticated })}>
{(!IS_WEB || authenticated) && (
<Fragment>
<Button
aria-label={__('Your wallet')}
navigate={`/$/${PAGES.WALLET}`}
className="header__navigation-item menu__title header__navigation-item--balance"
label={getWalletTitle()}
// @if TARGET='app'
onDoubleClick={e => {
e.stopPropagation();
}}
// @endif
/>
</Fragment>
<Button
aria-label={__('Your wallet')}
navigate={`/$/${PAGES.WALLET}`}
className="header__navigation-item menu__title header__navigation-item--balance"
label={getWalletTitle()}
// @if TARGET='app'
onDoubleClick={e => {
e.stopPropagation();
}}
// @endif
/>
)}
{IS_WEB && !authenticated && (

View file

@ -1,9 +1,11 @@
import { connect } from 'react-redux';
import { selectUnreadNotificationCount } from 'redux/selectors/notifications';
import NotificationHeaderButton from './view';
import { selectUser } from 'redux/selectors/user';
import NotificationBubble from './view';
const select = state => ({
unreadCount: selectUnreadNotificationCount(state),
user: selectUser(state),
});
export default connect(select)(NotificationHeaderButton);
export default connect(select)(NotificationBubble);

View file

@ -1,19 +1,27 @@
// @flow
import React from 'react';
import classnames from 'classnames';
type Props = {
unreadCount: number,
inline: boolean,
user: ?User,
};
export default function NotificationHeaderButton(props: Props) {
const { unreadCount } = props;
const { unreadCount, inline = false, user } = props;
const notificationsEnabled = user && user.experimental_ui;
if (unreadCount === 0) {
if (unreadCount === 0 || !notificationsEnabled) {
return null;
}
return (
<span className="notification__bubble">
<span
className={classnames('notification__bubble', {
'notification__bubble--inline': inline,
})}
>
<span className="notification__count">{unreadCount}</span>
</span>
);

View file

@ -4,6 +4,7 @@ import * as ICONS from 'constants/icons';
import React from 'react';
import Icon from 'component/common/icon';
import Notification from 'component/notification';
import NotificationBubble from 'component/notificationBubble';
import Button from 'component/button';
import { useHistory } from 'react-router';
// import { Menu, MenuList, MenuButton, MenuPopover, MenuItems, MenuItem } from '@reach/menu-button';
@ -48,7 +49,7 @@ export default function NotificationHeaderButton(props: Props) {
className="header__navigation-item menu__title header__navigation-item--icon"
>
<Icon size={18} icon={ICONS.NOTIFICATION} aria-hidden />
{unreadCount > 0 && <span className="notification__bubble">{unreadCount}</span>}
<NotificationBubble />
</Button>
);

View file

@ -229,15 +229,17 @@ function AppRouter(props: Props) {
<Route path={`/$/${PAGES.INVITE}/:referrer`} exact component={InvitedPage} />
<Route path={`/$/${PAGES.CHECKOUT}`} exact component={CheckoutPage} />
<PrivateRoute {...props} path={`/$/${PAGES.TAGS_FOLLOWING}`} component={TagsFollowingPage} />
<PrivateRoute {...props} exact path={`/$/${PAGES.TAGS_FOLLOWING}`} component={TagsFollowingPage} />
<PrivateRoute
{...props}
exact
path={`/$/${PAGES.CHANNELS_FOLLOWING}`}
component={isAuthenticated || !IS_WEB ? ChannelsFollowingPage : DiscoverPage}
/>
<PrivateRoute {...props} path={`/$/${PAGES.SETTINGS_NOTIFICATIONS}`} component={SettingsNotificationsPage} />
<PrivateRoute
{...props}
exact
path={`/$/${PAGES.CHANNELS_FOLLOWING_DISCOVER}`}
component={ChannelsFollowingDiscoverPage}
/>

View file

@ -1,7 +1,7 @@
import { connect } from 'react-redux';
import { selectSubscriptions } from 'redux/selectors/subscriptions';
import { selectPurchaseUriSuccess, doClearPurchasedUriSuccess, SETTINGS } from 'lbry-redux';
import { selectUserVerifiedEmail } from 'redux/selectors/user';
import { selectUserVerifiedEmail, selectUser } from 'redux/selectors/user';
import { makeSelectClientSetting } from 'redux/selectors/settings';
import { doSignOut } from 'redux/actions/app';
import { selectUnreadNotificationCount } from 'redux/selectors/notifications';
@ -14,6 +14,7 @@ const select = state => ({
email: selectUserVerifiedEmail(state),
purchaseSuccess: selectPurchaseUriSuccess(state),
unreadCount: selectUnreadNotificationCount(state),
user: selectUser(state),
});
export default connect(select, {

View file

@ -4,7 +4,6 @@ import * as PAGES from 'constants/pages';
import * as ICONS from 'constants/icons';
import React from 'react';
import Button from 'component/button';
import StickyBox from 'react-sticky-box/dist/esnext';
import classnames from 'classnames';
import NotificationBubble from 'component/notificationBubble';
@ -62,6 +61,7 @@ const ABSOLUTE_LINKS: Array<{
label: __('New Channel'),
navigate: `/$/${PAGES.CHANNEL_NEW}`,
icon: ICONS.CHANNEL,
hideForUnauth: true,
},
{
label: __('Uploads'),
@ -78,14 +78,21 @@ const ABSOLUTE_LINKS: Array<{
},
{
label: __('Creator Analytics'),
navigate: `/$/${PAGES.CREATOR_ANALYTICS}`,
navigate: `/$/${PAGES.CREATOR_DASHBOARD}`,
icon: ICONS.ANALYTICS,
hideForUnauth: true,
},
{
label: __('Wallet'),
navigate: `/$/${PAGES.WALLET}`,
icon: ICONS.WALLET,
hideForUnauth: true,
},
{
label: __('Notifications'),
navigate: `/$/${PAGES.NOTIFICATIONS}`,
icon: ICONS.NOTIFICATION,
extra: <NotificationBubble />,
extra: <NotificationBubble inline />,
hideForUnauth: true,
},
{
@ -96,7 +103,7 @@ const ABSOLUTE_LINKS: Array<{
},
{
label: __('Invites'),
navigate: `/$/${PAGES.INVITES}`,
navigate: `/$/${PAGES.INVITE}`,
icon: ICONS.INVITE,
hideForUnauth: true,
},
@ -114,6 +121,35 @@ const ABSOLUTE_LINKS: Array<{
},
];
const UNAUTH_LINKS: Array<{
label: string,
navigate: string,
icon: string,
extra?: Node,
hideForUnauth?: boolean,
}> = [
{
label: __('Sign In'),
navigate: `/$/${PAGES.AUTH_SIGNIN}`,
icon: ICONS.SIGN_IN,
},
{
label: __('Register'),
navigate: `/$/${PAGES.AUTH}`,
icon: ICONS.SIGN_UP,
},
{
label: __('Settings'),
navigate: `/$/${PAGES.SETTINGS}`,
icon: ICONS.SETTINGS,
},
{
label: __('Help'),
navigate: `/$/${PAGES.HELP}`,
icon: ICONS.HELP,
},
];
type Props = {
subscriptions: Array<Subscription>,
email: ?string,
@ -126,6 +162,7 @@ type Props = {
unreadCount: number,
purchaseSuccess: boolean,
doClearPurchasedUriSuccess: () => void,
user: ?User,
};
function SideNavigation(props: Props) {
@ -140,11 +177,23 @@ function SideNavigation(props: Props) {
isMediumScreen,
isOnFilePage,
unreadCount,
user,
} = props;
const notificationsEnabled = user && user.experimental_ui;
const isAuthenticated = Boolean(email);
const [pulseLibrary, setPulseLibrary] = React.useState(false);
const isPersonalized = !IS_WEB || isAuthenticated;
const isAbsolute = isOnFilePage || isMediumScreen;
const microNavigation = !sidebarOpen || isMediumScreen;
const subLinks = email
? ABSOLUTE_LINKS.filter(link => {
if (!notificationsEnabled && link.icon === ICONS.NOTIFICATION) {
return false;
}
return true;
})
: UNAUTH_LINKS;
React.useEffect(() => {
if (purchaseSuccess) {
@ -176,20 +225,16 @@ function SideNavigation(props: Props) {
return () => window.removeEventListener('keydown', handleKeydown);
}, [sidebarOpen, setSidebarOpen, isAbsolute]);
const Wrapper = ({ children }: any) =>
!isOnFilePage && !isMediumScreen ? (
<StickyBox offsetTop={100} offsetBottom={20}>
{children}
</StickyBox>
) : (
children
);
return (
<Wrapper>
<div
className={classnames('navigation__wrapper', {
'navigation__wrapper--micro': microNavigation && !isOnFilePage,
'navigation__wrapper--absolute': isAbsolute,
})}
>
{!isOnFilePage && (
<nav className={classnames('navigation', { 'navigation--micro': !sidebarOpen || isMediumScreen })}>
<ul className={classnames('navigation-links--relative', { 'navigation-links--micro': !sidebarOpen })}>
<nav className={classnames('navigation', { 'navigation--micro': microNavigation })}>
<ul className={classnames('navigation-links', { 'navigation-links--micro': !sidebarOpen })}>
{TOP_LEVEL_LINKS.map(linkProps =>
!email && linkProps.hideForUnauth && IS_WEB ? null : (
<li key={linkProps.navigate}>
@ -198,7 +243,7 @@ function SideNavigation(props: Props) {
icon={pulseLibrary && linkProps.icon === ICONS.LIBRARY ? ICONS.PURCHASED : linkProps.icon}
className={classnames('navigation-link', {
'navigation-link--pulse': linkProps.icon === ICONS.LIBRARY && pulseLibrary,
'navigation-link--extra': linkProps.icon === ICONS.NOTIFICATION && unreadCount > 0,
'navigation-link--highlighted': linkProps.icon === ICONS.NOTIFICATION && unreadCount > 0,
})}
activeClass="navigation-link--active"
/>
@ -209,7 +254,7 @@ function SideNavigation(props: Props) {
</ul>
{sidebarOpen && isPersonalized && subscriptions && subscriptions.length > 0 && (
<ul className="navigation__secondary navigation-links--relative navigation-links--small">
<ul className="navigation__secondary navigation-links navigation-links--small">
{subscriptions.map(({ uri, channelName }, index) => (
<li key={uri} className="navigation-link__wrapper">
<Button
@ -229,28 +274,32 @@ function SideNavigation(props: Props) {
<>
<nav className={classnames('navigation--filepage')}>
<ul className="navigation-links--absolute">
{TOP_LEVEL_LINKS.map(linkProps => (
<li key={linkProps.navigate}>
<Button
{...linkProps}
icon={pulseLibrary && linkProps.icon === ICONS.LIBRARY ? ICONS.PURCHASED : linkProps.icon}
className={classnames('navigation-link', {
'navigation-link--pulse': linkProps.icon === ICONS.LIBRARY && pulseLibrary,
'navigation-link--extra': linkProps.icon === ICONS.NOTIFICATION && unreadCount > 0,
})}
activeClass="navigation-link--active"
/>
{linkProps.extra}
</li>
))}
{TOP_LEVEL_LINKS.map(linkProps =>
!email && linkProps.hideForUnauth && IS_WEB ? null : (
<li key={linkProps.navigate}>
<Button
{...linkProps}
icon={pulseLibrary && linkProps.icon === ICONS.LIBRARY ? ICONS.PURCHASED : linkProps.icon}
className={classnames('navigation-link', {
'navigation-link--pulse': linkProps.icon === ICONS.LIBRARY && pulseLibrary,
'navigation-link--highlighted': linkProps.icon === ICONS.NOTIFICATION && unreadCount > 0,
})}
activeClass="navigation-link--active"
/>
{linkProps.extra}
</li>
)
)}
</ul>
<ul className="navigation-links--absolute">
{ABSOLUTE_LINKS.map(linkProps => (
<li key={linkProps.navigate}>
<Button {...linkProps} className="navigation-link" activeClass="navigation-link--active" />
{linkProps.extra}
</li>
))}
{subLinks.map(linkProps =>
!email && linkProps.hideForUnauth && IS_WEB ? null : (
<li key={linkProps.navigate} className="mobile-only">
<Button {...linkProps} className="navigation-link" activeClass="navigation-link--active" />
{linkProps.extra}
</li>
)
)}
</ul>
{isPersonalized && subscriptions && subscriptions.length > 0 && (
<ul className="navigation__secondary navigation-links--small">
@ -270,7 +319,7 @@ function SideNavigation(props: Props) {
<div className="navigation__overlay" onClick={() => setSidebarOpen(false)} />
</>
)}
</Wrapper>
</div>
);
}

View file

@ -1,10 +1,13 @@
// @flow
import * as ICONS from 'constants/icons';
import { NOTIFICATION_COMMENT } from 'constants/notifications';
import React from 'react';
import Page from 'component/page';
import Card from 'component/common/card';
import Spinner from 'component/spinner';
import Notification from 'component/notification';
import Yrbl from 'component/yrbl';
import Button from 'component/button';
type Props = {
notifications: ?Array<Notification>,
@ -91,7 +94,19 @@ export default function NotificationsPage(props: Props) {
}
/>
) : (
<div>{__('No notifications')}</div>
<div className="main--empty">
<Yrbl
title={__('No Notifications')}
subtitle={
<div>
<p>{__("You don't have any notifications yet, but they will be here when you do!")}</p>
<div className="section__actions">
<Button button="primary" icon={ICONS.HOME} label={__('Go Home')} navigate="/" />
</div>
</div>
}
/>
</div>
)}
</Page>
);

View file

@ -350,7 +350,7 @@
}
@media (max-width: $breakpoint-medium) and (min-width: $breakpoint-small) {
$width: calc((100vw - var(--side-nav-width) - (var(--spacing-m) * 3)) / 3);
$width: calc((100vw - var(--side-nav-width--micro) - (var(--spacing-l) * 3)) / 3);
width: $width;
@include handleClaimTileGifThumbnail($width);
@ -365,7 +365,7 @@
}
@media (max-width: $breakpoint-small) {
$width: calc((100vw / 2) - var(--spacing-s) * 2 - var(--spacing-m) / 2);
$width: calc((100vw / 2) - var(--spacing-xs) - var(--spacing-m) / 2);
width: $width;
@include handleClaimTileGifThumbnail($width);
margin-bottom: var(--spacing-l);

View file

@ -1,11 +1,7 @@
.content__viewer {
@extend .card;
position: absolute;
top: var(--spacing-l);
@media (max-width: $breakpoint-small) {
top: var(--spacing-s);
}
top: var(--spacing-s);
}
.content__viewer--inline {

View file

@ -110,7 +110,7 @@
.header__navigation-item--icon {
@media (max-width: $breakpoint-small) {
margin-left: 0;
margin: 0;
}
}

View file

@ -20,6 +20,10 @@
padding-left: 0;
padding-right: 0;
> :first-child {
flex-shrink: 0;
}
@media (max-width: $breakpoint-small) {
padding: var(--spacing-xs);
padding-top: var(--spacing-m);
@ -43,10 +47,12 @@
margin-right: auto;
margin-left: auto;
@media (max-width: $breakpoint-medium) and (min-width: $breakpoint-small) {
margin: 0 var(--spacing-l);
}
@media (max-width: $breakpoint-medium) {
width: 100%;
margin-right: var(--spacing-s);
margin-left: var(--spacing-s);
}
}
@ -67,6 +73,11 @@
.file-page__recommended {
width: 25rem;
height: 0%;
@media (max-width: $breakpoint-medium) {
width: auto;
margin-top: var(--spacing-l);
}
}
@media (max-width: $breakpoint-medium) {

View file

@ -1,25 +1,41 @@
.navigation {
.navigation__wrapper {
width: var(--side-nav-width);
height: calc(100vh - var(--header-height));
}
.navigation__wrapper--micro {
width: var(--side-nav-width--micro);
@media (max-width: $breakpoint-small) {
display: none;
width: 0;
}
}
.navigation--filepage {
z-index: 4;
.navigation__wrapper--absolute {
&:not(.navigation__wrapper--micro) {
width: 0;
}
}
.navigation {
position: fixed;
top: var(--header-height);
left: 0;
top: var(--header-height);
width: var(--side-nav-width);
height: calc(100vh - var(--header-height));
overflow-y: auto;
border-right: 1px solid var(--color-border);
padding-top: var(--spacing-l);
padding-bottom: var(--spacing-l);
}
.navigation--filepage {
@extend .navigation;
z-index: 4;
width: var(--side-nav-width--large);
overflow-y: scroll;
margin-top: 0;
padding: var(--spacing-l);
padding-top: var(--spacing-s);
padding-left: 0;
border-top: 1px solid var(--color-border);
padding-top: 0;
background-color: var(--color-card-background);
border-top: 1px solid var(--color-border);
box-shadow: var(--card-box-shadow);
.navigation-link {
@ -28,7 +44,12 @@
}
.navigation--micro {
@extend .navigation;
width: var(--side-nav-width--micro);
@media (max-width: $breakpoint-small) {
display: none;
}
}
.navigation__secondary {
@ -38,18 +59,18 @@
.navigation-link {
display: block;
position: relative;
transition: color 0.2s;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
color: var(--color-navigation-link);
margin-bottom: var(--spacing-s);
padding-left: var(--spacing-s);
font-size: var(--font-body);
font-weight: var(--font-weight-bold);
.icon {
height: 1.5rem;
width: 1.5rem;
stroke: var(--color-gray-5);
stroke: var(--color-navigation-icon);
}
.button__content {
@ -58,17 +79,9 @@
flex-direction: column;
}
.button__label {
font-size: var(--font-small);
}
&:hover {
@extend .navigation-link--extra;
color: var(--color-gray-5);
.icon {
stroke: var(--color-gray-5);
}
&:hover:not(.navigation-link--active),
&:focus {
@extend .navigation-link--highlighted;
}
@media (min-width: $breakpoint-medium) {
@ -86,8 +99,6 @@
.button__label {
margin-top: 0;
font-size: var(--font-body);
font-weight: var(--font-weight-bold);
}
&:focus {
@ -97,14 +108,11 @@
}
.navigation-link--active {
background-color: var(--color-primary-alt);
border-radius: var(--border-radius);
border-top-left-radius: 0;
border-bottom-left-radius: 0;
color: var(--color-primary);
background-color: var(--color-navigation-active);
color: var(--color-navigation-active-text);
.icon {
stroke: var(--color-primary);
stroke: var(--color-navigation-active-text);
}
}
@ -116,11 +124,13 @@
}
}
.navigation-link--extra {
border-radius: var(--border-radius);
border-top-left-radius: 0;
border-bottom-left-radius: 0;
background-color: var(--color-gray-1);
.navigation-link--highlighted {
background-color: var(--color-navigation-hover);
color: var(--color-navigation-hover-text);
.icon {
stroke: var(--color-navigation-hover-text);
}
}
.navigation-links {
@ -130,15 +140,6 @@
list-style: none;
}
.navigation-links--relative {
@extend .navigation-links;
margin-right: var(--spacing-m);
.navigation-link {
padding-left: var(--spacing-s);
}
}
.navigation-links--micro {
.icon {
height: 1.5rem;
@ -158,7 +159,6 @@
}
.navigation-link {
margin-bottom: var(--spacing-xs);
padding-left: 0;
}

View file

@ -68,3 +68,9 @@
align-items: center;
justify-content: center;
}
.notification__bubble--inline {
@extend .notification__bubble;
top: 0.75rem;
right: 1rem;
}

View file

@ -313,6 +313,14 @@ textarea {
}
}
.mobile-only {
display: none;
@media (max-width: $breakpoint-small) {
display: block;
}
}
.mobile-hidden {
@media (max-width: $breakpoint-small) {
display: none !important;

View file

@ -12,8 +12,14 @@
--color-link: var(--color-primary);
--color-link-hover: #60e1ba;
--color-link-active: #60e1ba;
--color-link-icon: #6a7580;
--color-navigation-link: #b3bcc6;
--color-navigation-icon: #76808a;
--color-navigation-link: #b9c3ce;
--color-navigation-active: #333a41;
--color-navigation-active-text: #bac5d0;
--color-navigation-hover: #272c32;
--color-navigation-hover-text: #bac5d0;
--color-button-primary-bg: var(--color-primary-alt);
--color-button-primary-bg-hover: #44796c;
--color-button-primary-text: var(--color-primary);
@ -24,18 +30,18 @@
--color-button-alt-bg: #4d5660;
--color-button-alt-bg-hover: #3e464d;
--color-button-alt-text: #e2e9f0;
--color-header-button: var(--color-link-icon);
--color-header-button: #434b54;
--color-button-border: var(--color-gray-5);
// Color
--color-focus: #2d69a5;
--color-background-overlay: #212529d7;
--color-background: #212529;
--color-background: #1c1f22;
--color-background-overlay: #21252980;
--color-border: #4f5b64;
--color-card-background: #2c3237;
--color-border: #343c43;
--color-card-background: #23292e;
--color-card-background-highlighted: #384046;
--color-header-background: #434b53;
--color-header-background: #2c3137;
--color-tab-text: var(--color-white);
--color-tabs-background: #434b53;
--color-tab-divider: var(--color-white);
@ -64,8 +70,8 @@
--color-input: #f4f4f5;
--color-input-label: #d4d4d4;
--color-input-placeholder: #f4f4f5;
--color-input-bg: #5d6772;
--color-input-bg-copyable: #434b53;
--color-input-bg: #4f5861;
--color-input-bg-copyable: #4f5861;
--color-input-border: var(--color-border);
--color-input-border-active: var(--color-secondary);
--color-input-toggle: var(--color-primary);
@ -74,8 +80,8 @@
// Menu
--color-menu-background: var(--color-header-background);
--color-menu-background--selected: #89939e;
--color-menu-background--active: #89939e;
--color-menu-background--selected: #5d646c;
--color-menu-background--active: #3a3f44;
--color-menu-icon: #a7a7a7;
--color-menu-icon-active: #d6d6d6;
@ -83,8 +89,8 @@
--color-table-highlight: #3a444e;
// Search
--color-search-suggestion: #212529;
--color-search-suggestion-background: #cce6fb;
--color-search-suggestion: var(--color-text);
--color-search-suggestion-background: #313d46;
--color-placeholder-background: #4e5862;
--color-spinner-light: #5a6570;
--color-spinner-dark: #212529;

View file

@ -1,8 +1,13 @@
:root {
// Button
--color-link-icon: var(--color-gray-4);
--color-navigation-icon: var(--color-gray-5);
--color-link-active: var(--color-primary);
--color-navigation-link: var(--color-gray-5);
--color-navigation-active: var(--color-primary-alt);
--color-navigation-active-text: var(--color-primary);
--color-navigation-hover: var(--color-gray-1);
--color-navigation-hover-text: #3f3f3f;
--color-header-button: var(--color-button-alt-bg);
--color-button-border: var(--color-gray-3);

View file

@ -881,7 +881,7 @@
core-js-pure "^3.0.0"
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.1.2", "@babel/runtime@^7.1.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4":
"@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4":
version "7.10.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839"
integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==
@ -9049,14 +9049,6 @@ react-spring@^8.0.20, react-spring@^8.0.27:
"@babel/runtime" "^7.3.1"
prop-types "^15.5.8"
react-sticky-box@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/react-sticky-box/-/react-sticky-box-0.8.0.tgz#1c191936af8f5420087b703ec6da4ef46060076c"
dependencies:
"@babel/runtime" "^7.1.5"
prop-types "^15.6.2"
resize-observer-polyfill "^1.5.1"
react@^16.8.2:
version "16.13.0"
resolved "https://registry.yarnpkg.com/react/-/react-16.13.0.tgz#d046eabcdf64e457bbeed1e792e235e1b9934cf7"
@ -9514,10 +9506,6 @@ reselect@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147"
resize-observer-polyfill@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
resolve-cwd@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"