{shieldedAddresses.map(addr => (
-
+
))}
-
-
-
-
-
+
this.generateNewAddress('shielded')}>
-
-
+
+
- this.generateNewAddress('transparent')}>
-
-
+
+
+
@@ -146,6 +178,10 @@ export class ReceiveView extends PureComponent {
{transparentAddresses.map(addr => (
))}
+ this.generateNewAddress('transparent')}>
+
+
+
))
}
@@ -155,3 +191,5 @@ export class ReceiveView extends PureComponent {
);
}
}
+
+export const ReceiveView = withTheme(Component);
diff --git a/app/views/send.js b/app/views/send.js
index 52a0e70..e7c424a 100644
--- a/app/views/send.js
+++ b/app/views/send.js
@@ -1,11 +1,12 @@
// @flow
import React, { Fragment, PureComponent } from 'react';
-import styled, { keyframes } from 'styled-components';
+import styled, { withTheme, keyframes } from 'styled-components';
import { BigNumber } from 'bignumber.js';
import { Transition, animated } from 'react-spring';
import { FEES } from '../constants/fees';
+import { DARK } from '../constants/themes';
import { InputLabelComponent } from '../components/input-label';
import { InputComponent } from '../components/input';
@@ -20,18 +21,18 @@ import { ConfirmDialogComponent } from '../components/confirm-dialog';
import { formatNumber } from '../utils/format-number';
import { ascii2hex } from '../utils/ascii-to-hexadecimal';
+import SentIcon from '../assets/images/transaction_sent_icon_dark.svg';
+import MenuIconDark from '../assets/images/menu_icon_dark.svg';
+import MenuIconLight from '../assets/images/menu_icon_light.svg';
+import ValidIcon from '../assets/images/green_check_dark.png';
+import InvalidIcon from '../assets/images/error_icon_dark.png';
+import LoadingIcon from '../assets/images/sync_icon_dark.png';
+import ArrowUpIconDark from '../assets/images/arrow_up_dark.png';
+import ArrowUpIconLight from '../assets/images/arrow_up_light.png';
+
import type { SendTransactionInput } from '../containers/send';
import type { State as SendState } from '../redux/modules/send';
-import SentIcon from '../assets/images/transaction_sent_icon.svg';
-import MenuIcon from '../assets/images/menu_icon.svg';
-import ValidIcon from '../assets/images/green_check.png';
-import InvalidIcon from '../assets/images/error_icon.png';
-import LoadingIcon from '../assets/images/sync_icon.png';
-import ArrowUpIcon from '../assets/images/arrow_up.png';
-
-import theme from '../theme';
-
const rotate = keyframes`
from {
transform: rotate(0deg);
@@ -51,13 +52,19 @@ const Loader = styled.img`
`;
const FormWrapper = styled.div`
- margin-top: ${props => props.theme.layoutContentPaddingTop};
width: 71%;
`;
const SendWrapper = styled(ColumnComponent)`
width: 25%;
- margin-top: 60px;
+ margin-top: 42px;
+`;
+
+const Label = styled(InputLabelComponent)`
+ text-transform: uppercase;
+ color: ${props => props.theme.colors.transactionsDate};
+ font-size: ${props => `${props.theme.fontSize.regular * 0.9}em`};
+ font-weight: ${props => String(props.theme.fontWeight.bold)};
`;
type AmountProps =
@@ -96,7 +103,6 @@ const ShowFeeButton = styled.button`
outline: none;
display: flex;
align-items: center;
- margin: 30px 0;
opacity: 0.7;
&:hover {
@@ -113,16 +119,19 @@ const SeeMoreIcon = styled.img`
`;
const FeeWrapper = styled.div`
- background-color: #000;
- border-radius: 4px;
- padding: 13px 19px;
+ background-color: ${props => props.theme.colors.sendAdditionalOptionsBg};
+ border: 1px solid ${props => props.theme.colors.sendAdditionalOptionsBorder};
+ border-radius: 3px;
+ padding: 0 20px 15px;
margin-bottom: 20px;
`;
const InfoCard = styled.div`
width: 100%;
- background-color: ${props => props.theme.colors.cardBackgroundColor};
+ background-color: ${props => props.theme.colors.sendCardBg};
+ border: 1px solid ${props => props.theme.colors.sendCardBorder}
border-radius: ${props => props.theme.boxBorderRadius};
+ margin-bottom: 10px;
`;
const InfoContent = styled.div`
@@ -141,7 +150,11 @@ const InfoCardUSD = styled(TextComponent)`
const FormButton = styled(Button)`
width: 100%;
- margin: 10px 0;
+ margin: 5px 0;
+
+ &:first-child {
+ margin-top: 0;
+ }
`;
const ModalContent = styled(ColumnComponent)`
@@ -170,6 +183,10 @@ const ItemLabel = styled(TextComponent)`
margin-bottom: 3.5px;
`;
+const ValidateItemLabel = styled(ItemLabel)`
+ margin-bottom: -1px;
+`;
+
const SendZECValue = styled(TextComponent)`
color: ${props => props.theme.colors.transactionSent};
font-size: ${props => `${props.theme.fontSize.large}em`};
@@ -225,8 +242,12 @@ const MaxAvailableAmount = styled.button`
background: none;
color: white;
cursor: pointer;
- border-left: ${props => `1px solid ${props.theme.colors.background(props)}`};
+ border-left: 1px solid ${props => props.theme.colors.inputBorder};
opacity: 0.8;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
&:hover {
opacity: 1;
@@ -238,6 +259,32 @@ const MaxAvailableAmountImg = styled.img`
height: 20px;
`;
+const ValidateWrapper = styled(RowComponent)`
+ margin-top: 3px;
+`;
+
+
+const ActionsWrapper = styled(RowComponent)`
+ padding: 30px 0;
+ align-items: center;
+ flex-direction: row;
+ justify-content: space-between;
+`;
+
+const HexadecimalWrapper = styled.div`
+ display: flex;
+ opacity: 0.7;
+ cursor: pointer;
+
+ &:hover {
+ opacity: 1;
+ }
+`;
+
+const HexadecimalText = styled(TextComponent)`
+ white-space: nowrap;
+`;
+
type Props = {
...SendState,
balance: number,
@@ -250,6 +297,7 @@ type Props = {
loadAddresses: () => void,
loadZECPrice: () => void,
getAddressBalance: ({ address: string }) => void,
+ theme: AppTheme,
};
type State = {
@@ -274,7 +322,7 @@ const initialState = {
isHexMemo: false,
};
-export class SendView extends PureComponent {
+class Component extends PureComponent {
state = initialState;
componentDidMount() {
@@ -383,18 +431,24 @@ export class SendView extends PureComponent {
};
renderValidationStatus = () => {
- const { isToAddressValid } = this.props;
+ const { isToAddressValid, theme } = this.props;
return isToAddressValid ? (
-
+
-
-
+
+
) : (
-
+
-
-
+
+
);
};
@@ -481,10 +535,10 @@ export class SendView extends PureComponent {
render() {
const {
- addresses, balance, zecPrice, isSending, error, operationId,
+ addresses, balance, zecPrice, isSending, error, operationId, theme,
} = this.props;
const {
- showFee, from, amount, to, memo, fee, feeType,
+ showFee, from, amount, to, memo, fee, feeType, isHexMemo,
} = this.state;
const isEmpty = amount === '';
@@ -505,10 +559,18 @@ export class SendView extends PureComponent {
append: 'USD $',
});
+ const seeMoreIcon = theme.mode === DARK
+ ? MenuIconDark
+ : MenuIconLight;
+
+ const arrowUpIcon = theme.mode === DARK
+ ? ArrowUpIconDark
+ : ArrowUpIconLight;
+
return (
-
+
{
options={addresses.map(addr => ({ value: addr, label: addr }))}
capitalize={false}
/>
-
+
(
@@ -524,7 +586,7 @@ export class SendView extends PureComponent {
onClick={() => this.handleChange('amount')(balance)}
disabled={!from}
>
-
+
)}
isEmpty={isEmpty}
@@ -537,7 +599,7 @@ export class SendView extends PureComponent {
disabled={!from}
/>
-
+
{
renderRight={to ? this.renderValidationStatus : () => null}
name='to'
/>
-
+
{
placeholder='Enter a text here'
name='memo'
/>
-
- this.setState({ isHexMemo: event.target.checked })} />
-
-
- this.setState(state => ({
- showFee: !state.showFee,
- }))
- }
- >
-
-
-
+
+ this.setState(state => ({
+ showFee: !state.showFee,
+ }))
+ }
+ >
+
+
+
+
+ this.setState({ isHexMemo: event.target.checked })}
+ checked={isHexMemo}
+ />
+ this.setState(prevState => ({ isHexMemo: !prevState.isHexMemo }))}
+ value='Hexadecimal Memo'
+ />
+
+
{
-
-
+
+
-
+
({
label: cur.toLowerCase(),
@@ -649,7 +720,6 @@ export class SendView extends PureComponent {
onClick={() => this.showModal(toggle)}
id='send-submit-button'
label='Send'
- variant='secondary'
focused
isFluid
disabled={!from || !amount || !to || !fee}
@@ -666,9 +736,11 @@ export class SendView extends PureComponent {
)}
-
+
);
}
}
+
+export const SendView = withTheme(Component);
diff --git a/app/views/settings.js b/app/views/settings.js
index 2cf19d0..5b23462 100644
--- a/app/views/settings.js
+++ b/app/views/settings.js
@@ -20,18 +20,30 @@ import { Clipboard } from '../components/clipboard';
import { SelectComponent } from '../components/select';
import rpc from '../../services/api';
-import { DARK, LIGHT } from '../constants/themes';
+import { DARK, LIGHT, THEME_MODE } from '../constants/themes';
import electronStore from '../../config/electron-store';
+import { openExternal } from '../utils/open-external';
+
import type { MapDispatchToProps, MapStateToProps } from '../containers/settings';
const HOME_DIR = electron.remote.app.getPath('home');
+const EXPORT_VIEW_KEYS_TITLE = 'Export View Keys';
+const EXPORT_VIEW_KEYS_CONTENT = 'Viewing keys for shielded addresses allow for the disclosure of all transaction information to a preffered party. Anyone who holds these keys can see all shielded transaction details, but cannot spend coins as it is not a private key.';
+const EXPORT_VIEW_KEYS_LEARN_MORE = 'https://z.cash/blog/viewing-keys-selective-disclosure';
+const IMPORT_PRIV_KEYS_TITLE = 'Import Private Keys';
+const IMPORT_PRIV_KEYS_CONTENT = 'Importing private keys will add the spendable coins to this wallet.';
+const EXPORT_PRIV_KEYS_TITLE = 'Export Private Keys';
+const EXPORT_PRIV_KEYS_CONTENT = 'Beware: exporting your private keys will allow anyone controlling them to spend your coins. Only perform this action on a trusted machine.';
+const BACKUP_WALLET_TITLE = 'Backup Wallet';
+const BACKUP_WALLET_CONTENT = 'It is recommended that you backup your wallet often.';
+
const Wrapper = styled.div`
margin-top: ${props => props.theme.layoutContentPaddingTop};
`;
const ModalContent = styled.div`
- padding: 20px;
+ padding: 20px 30px;
width: 100%;
max-height: 600px;
overflow-y: auto;
@@ -53,9 +65,37 @@ const ClipboardButton = styled(Clipboard)`
`;
const SettingsWrapper = styled.div`
- margin-bottom: 45px;
+ margin-bottom: 20px;
min-width: 200px;
- width: 37%;
+ width: 70%;
+ max-width: 600px;
+ min-width: 350px;
+ background: ${props => props.theme.colors.settingsCardBg};
+ padding: 20px 20px 10px 20px;
+ border: 1px solid ${props => props.theme.colors.inputBorder};
+ border-radius: ${props => props.theme.boxBorderRadius};
+`;
+
+const SettingsInnerWrapper = styled.div`
+ margin-bottom: 50px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+`;
+
+const LearnMore = styled.div`
+ cursor: pointer;
+ text-transform: uppercase;
+ font-size: 10px;
+ font-family: ${props => props.theme.fontFamily};;
+ letter-spacing: 1px;
+ color: ${props => props.theme.colors.settingsLearnMore};
+
+ &:hover {
+ color: ${props => props.theme.colors.settingsLearnMoreHovered};;
+ }
+}
`;
const SettingsTitle = styled(TextComponent)`
@@ -67,12 +107,25 @@ const SettingsTitle = styled(TextComponent)`
`;
const SettingsContent = styled(TextComponent)`
- margin-bottom: 20px;
- margin-top: 10px;
+ margin-bottom: 30px;
+ margin-top: 15px;
+ font-weight: 300;
+ letter-spacing: 0.5px;
+ line-height: 1.4;
`;
const ThemeSelectWrapper = styled.div`
margin-bottom: 20px;
+ width: 70%;
+ max-width: 600px;
+ min-width: 350px;
+`;
+
+const SettingsActionWrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
`;
type Key = {
@@ -221,37 +274,38 @@ export class SettingsView extends PureComponent {
error,
} = this.state;
+ const themeOptions = [
+ { label: 'Dark', value: DARK },
+ { label: 'Light', value: LIGHT },
+ ];
+
return (
electronStore.set('THEME_MODE', newMode)}
- options={[
- {
- label: 'Dark',
- value: DARK,
- },
- {
- label: 'Light',
- value: LIGHT,
- },
- ]}
- value={electronStore.get('THEME_MODE')}
+ onChange={newMode => electronStore.set(THEME_MODE, newMode)}
+ value={electronStore.get(THEME_MODE)}
+ options={themeOptions}
/>
(
-
-
-
+
+
+
+
+ openExternal(EXPORT_VIEW_KEYS_LEARN_MORE)}>
+ Learn More
+
+
)}
onConfirm={this.exportViewKeys}
showButtons={!successExportViewKeys}
- width={750}
+ width={450}
>
{() => (
@@ -277,78 +331,79 @@ export class SettingsView extends PureComponent {
)}
- (
-
-
-
-
-
- )}
- onConfirm={this.exportPrivateKeys}
- showButtons={!successExportPrivateKeys}
- width={750}
- >
- {() => (
-
- {successExportPrivateKeys ? (
- privateKeys.map(({ zAddress, key }) => (
- <>
-
-
- {
- event.currentTarget.select();
- }}
- />
-
-
- >
- ))
- ) : (
-
- )}
-
- )}
-
-
- (
-
-
-
-
-
- )}
- onConfirm={this.importPrivateKeys}
- showButtons={!successImportPrivateKeys}
- width={900}
- isLoading={isLoading}
- >
- {() => (
-
-
- this.setState({ importedPrivateKeys: value })}
- inputType='textarea'
- rows={10}
- />
- {successImportPrivateKeys && (
-
- )}
- {error && }
-
- )}
-
+
+ (
+
+
+
+
+
+ )}
+ onConfirm={this.exportPrivateKeys}
+ showButtons={!successExportPrivateKeys}
+ width={450}
+ >
+ {() => (
+
+ {successExportPrivateKeys ? (
+ privateKeys.map(({ zAddress, key }) => (
+ <>
+
+
+ {
+ event.currentTarget.select();
+ }}
+ />
+
+
+ >
+ ))
+ ) : (
+
+ )}
+
+ )}
+
+ (
+
+
+
+
+
+ )}
+ onConfirm={this.importPrivateKeys}
+ showButtons={!successImportPrivateKeys}
+ width={450}
+ isLoading={isLoading}
+ >
+ {() => (
+
+
+ this.setState({ importedPrivateKeys: value })}
+ inputType='textarea'
+ rows={10}
+ />
+ {successImportPrivateKeys && (
+
+ )}
+ {error && }
+
+ )}
+
+
-
-
-
+
+
+
);
diff --git a/app/views/transactions.js b/app/views/transactions.js
index 7d78881..0c61066 100644
--- a/app/views/transactions.js
+++ b/app/views/transactions.js
@@ -31,17 +31,30 @@ const RoundedTransactionWrapper = styled.div`
${props => (props.roundPosition === 'top'
? `
- border-top-left-radius: ${props.theme.boxBorderRadius};
- border-top-right-radius: ${props.theme.boxBorderRadius};`
- : `border-bottom-left-radius: ${props.theme.boxBorderRadius};
- border-bottom-right-radius: ${props.theme.boxBorderRadius};`)}
+ border-top-left-radius: ${props.theme.boxBorderRadius};
+ border-top-right-radius: ${props.theme.boxBorderRadius};
+ `
+ : `
+ border-bottom-left-radius: ${props.theme.boxBorderRadius};
+ border-bottom-right-radius: ${props.theme.boxBorderRadius};
+ `
+ )}
+`;
+
+const ListWrapper = styled.div`
+ margin-top: 10px;
`;
export class TransactionsView extends PureComponent {
componentDidMount() {
const { getTransactions, resetTransactionsList } = this.props;
+
resetTransactionsList();
- getTransactions({ count: PAGE_SIZE, offset: 0, shieldedTransactionsCount: 0 });
+ getTransactions({
+ count: PAGE_SIZE,
+ offset: 0,
+ shieldedTransactionsCount: 0,
+ });
}
isRowLoaded = ({ index }: { index: number }) => {
@@ -122,9 +135,14 @@ export class TransactionsView extends PureComponent {
return transactionItem;
};
- renderRow = ({ index, key, style }: { index: number, key: string, style: Object }) => (
+ renderRow = (
+ { index, key, style }: { index: number, key: string, style: Object },
+ ) => (
- {this.isRowLoaded({ index }) ? this.renderTransactions({ index }) : 'Loading...'}
+ {this.isRowLoaded({ index })
+ ? this.renderTransactions({ index })
+ : 'Loading...'
+ }
);
@@ -179,16 +197,18 @@ export class TransactionsView extends PureComponent {
{({ onRowsRendered, registerChild }) => (
{({ width, height }) => (
-
+
+
+
)}
)}
diff --git a/flow-custom-typedefs/theme.js b/flow-custom-typedefs/theme.js
index 9d4d673..0ef622a 100644
--- a/flow-custom-typedefs/theme.js
+++ b/flow-custom-typedefs/theme.js
@@ -1,31 +1,126 @@
+// @flow
+
import { ThemeSet } from 'styled-theming';
type Colors = {
primary: ThemeSet,
secondary: ThemeSet,
sidebarBg: ThemeSet,
- sidebarItem: ThemeSet,
- sidebarItemActive: ThemeSet,
- sidebarHoveredItem: ThemeSet,
- sidebarHoveredItemLabel: ThemeSet,
+
+ // Card
cardBackgroundColor: ThemeSet,
+ sendCardBg: ThemeSet,
+ sendCardBorder: ThemeSet,
+
text: ThemeSet,
activeItem: ThemeSet,
inactiveItem: ThemeSet,
- sidebarLogoGradientBegin: ThemeSet,
- sidebarLogoGradientEnd: ThemeSet,
background: ThemeSet,
+
+ selectButtonShadow: ThemeSet,
+
+ modalItemLabel: ThemeSet,
+ blackTwo: ThemeSet,
+ buttonBorderColor: ThemeSet,
+
+ // Dropdown
+ dropdownBg: ThemeSet,
+ dropdownHoveredBg: ThemeSet,
+ dropdownBorder: ThemeSet,
+ dropdownIconBorder: ThemeSet,
+ dropdownOpenedIconBorder: ThemeSet,
+
+ // Divider
+ divider: ThemeSet,
+
+ // Header
+ headerTitle: ThemeSet,
+
+ // Status Pill
+ statusPillBg: ThemeSet,
+ statusPillLabel: ThemeSet,
+ statusPillBorder: ThemeSet,
+
+ // Wallet Summary
+ walletSummaryBg: ThemeSet,
+ walletSummaryBorder: ThemeSet,
+
+ // Wallet Address
+ walletAddressBg: ThemeSet,
+ walletAddressBorder: ThemeSet,
+ walletAddressInput: ThemeSet,
+ walletAddressInputHovered: ThemeSet,
+ walletAddressTooltip: ThemeSet,
+ walletAddressTooltipBg: ThemeSet,
+
+ // Console
+ consoleBg: ThemeSet,
+ consoleBorder: ThemeSet,
+
+ // Buttons
+ buttonPrimaryBg: ThemeSet,
+ buttonPrimaryText: ThemeSet,
+ buttonPrimaryDisabledBg: ThemeSet,
+ buttonSecondaryBg: ThemeSet,
+ buttonSecondaryText: ThemeSet,
+ buttonSecondaryDisabledBg: ThemeSet,
+ buttonSecondaryBorder: ThemeSet,
+ buttonSecondaryHoveredBg: ThemeSet,
+
+ // QR Code
+ qrCodeWrapperBg: ThemeSet,
+ qrCodeWrapperBorder: ThemeSet,
+
+ // Transactions
transactionSent: ThemeSet,
transactionReceived: ThemeSet,
transactionsDate: ThemeSet,
transactionsItemHovered: ThemeSet,
- inputBackground: ThemeSet,
- selectButtonShadow: ThemeSet,
- transactionsDetailsLabel: ThemeSet,
- statusPillLabel: ThemeSet,
- modalItemLabel: ThemeSet,
- blackTwo: ThemeSet,
- buttonBorderColor: ThemeSet,
+
+ // Transaction Item
+ transactionItemBg: ThemeSet,
+ transactionItemHoverBg: ThemeSet,
+ transactionItemAddress: ThemeSet,
+ transactionItemAddressHover: ThemeSet,
+
+ // Transaction Details
+ transactionDetailsShadow: ThemeSet,
+ transactionDetailsBg: ThemeSet,
+ transactionDetailsRowHover: ThemeSet,
+ transactionDetailsDivider: ThemeSet,
+ transactionDetailsLabel: ThemeSet,
+
+ // Input
+ inputBg: ThemeSet,
+ inputBorder: ThemeSet,
+ inputBorderActive: ThemeSet,
+
+ // Sidebar
+ sidebarBg: ThemeSet,
+ sidebarItem: ThemeSet,
+ sidebarItemActive: ThemeSet,
+ sidebarActiveItemBorder: ThemeSet,
+ sidebarBorderRight: ThemeSet,
+ sidebarItemHovered: ThemeSet,
+ sidebarHoveredItemLabel: ThemeSet,
+ sidebarLogoGradientBegin: ThemeSet,
+ sidebarLogoGradientEnd: ThemeSet,
+ sidebarItemHoveredBg: ThemeSet,
+
+ // Settings
+ settingsCardBg: ThemeSet,
+ settingsLearnMore: ThemeSet,
+ settingsLearnMoreHovered: ThemeSet,
+
+ // Loading
+ loadingScreenBg: ThemeSet,
+ loadingScreenText: ThemeSet,
+
+ // Misc
+ sendAdditionalOptionsBg: ThemeSet,
+ sendAdditionalOptionsBorder: ThemeSet,
+ sendAdditionalInputBg: ThemeSet,
+ sendAdditionalInputText: ThemeSet,
};
type FontSize = {
@@ -42,17 +137,26 @@ type FontWeight = {
};
type AppTheme = {
+ // General
mode: string,
+
+ // Typography
fontFamily: string,
fontWeight: FontWeight,
fontSize: FontSize,
+
+ // Colors
colors: Colors,
+
+ // Spacing
sidebarWidth: string,
headerHeight: string,
layoutPaddingLeft: string,
layoutPaddingRight: string,
layoutContentPaddingTop: string,
boxBorderRadius: string,
+
+ // Misc
transitionEase: string,
};
diff --git a/package.json b/package.json
index e84b109..68e2fa0 100644
--- a/package.json
+++ b/package.json
@@ -97,6 +97,7 @@
"autoprefixer": "^9.3.1",
"bignumber.js": "^8.0.1",
"connected-react-router": "^5.0.1",
+ "copy-to-clipboard": "^3.0.8",
"date-fns": "^1.30.1",
"dotenv": "^6.2.0",
"electron-compile": "^6.4.4",
diff --git a/yarn.lock b/yarn.lock
index afaffc2..45e09e9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4045,6 +4045,13 @@ copy-text-to-clipboard@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-1.0.4.tgz#2286ff6c53495962c5318d34746d256939069c49"
+copy-to-clipboard@^3.0.8:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz#f4e82f4a8830dce4666b7eb8ded0c9bcc313aba9"
+ integrity sha512-c3GdeY8qxCHGezVb1EFQfHYK/8NZRemgcTIzPq7PuxjHAf/raKibn2QdhHPb/y6q74PMgH6yizaDZlRmw6QyKw==
+ dependencies:
+ toggle-selection "^1.0.3"
+
core-js@^1.0.0:
version "1.2.7"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
@@ -14115,6 +14122,11 @@ to-vfile@^5.0.1, to-vfile@^5.0.2:
is-buffer "^2.0.0"
vfile "^3.0.0"
+toggle-selection@^1.0.3:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
+ integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI=
+
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"