Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions netlify.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
IPFS_GATEWAY_ADDRESS='https://ipfs.kleros.io'
AVAILABLE_LANGUAGE_GROUP_PAIRS='["en|fr","en|es","en|pt","de|en","en|ru","en|tr","en|zh"]'
USER_SETTINGS_API_BASE_URLS='{"1":"https://iioeu1ljqf.execute-api.us-east-2.amazonaws.com/mainnet","77":"https://xa1qxy0wp6.execute-api.us-east-2.amazonaws.com/sokol"}'
LINGUO_CONTRACT_ADDRESSES='{"1":{"de|en":["0x54f1f7b58c1Dc646a6c639C5d909B62652129b33","0x950f5AB863075C685227EfEDb41Ef167Be0099ad"],"en|es":["0x460f688f655610de5e3d92beb7892fa200b9060d","0xD8F8019c025C2Ba6745543D9a3C338DE1b98C103"],"en|fr":["0xFEe86325d5C96AE9E20EaBe7B157813c67bBccFA","0xf1A9589880DbF393F32A5b2d5a0054Fa10385074"],"en|ja":["0x5Cd1ff55282db11e526Fe13fA0F7C014f74acF11","0xc3162705Af0e10108FF837E450A14669b2711129"],"en|ko":["0xf8D4c1436ACA89A5DEEf36F06f662bAdfEb5AE63","0xFE721DD8Ac8e47A4228A6147A25C65136f213EaA"],"en|pt":["0x48032Ad54DB49d8E0d4f135A687b98E5731961f9","0x1c839fd542563182BFD0C337c8AaD1Be412F0fd2"],"en|ru":["0x0Bc3B51673dCdF3b45c628066761dA7331E8fBA2","0x464c84c41f3C25Ba5a75B006D8B20600A8777306"],"en|tr":["0xa3E4348BDDc32AfcedC5e088e0E21FD6154A0180","0x44863f5b7AAb7ceE181C0d84E244540125eF7AF7"],"en|zh":["0xaB0D90943A58b1A64c0171Ee8e743d9998Be6AC3","0xD67C12734dC12240a6324Db63ccd426964B71Fe7"]},"42":{"de|en":["0x8A4290298D65717a3BaEd546e4Ef9Eb2fe0b187D","0x5Af02E0E04c2042345E15Ed6dc7CC0c220f2C2Fa"],"en|es":["0x082aA0BeBE8C32042F77d123B6a657Fe907D8C33","0x6eb2D062E808a67828d27aD3926912C9309E5417"],"en|fr":["0x963Df99387a2b350264B5847ff9AbFF674e7BdFA","0x152c7F0948Fd0B2741a934aA7bfceB41cd4b5bFD"],"en|ja":["0x8B819D13d90Fcf9F0a235fe85d860E3C9763D470","0x033B08AAC5A3a2E7C306dd5Ee360904eC8d45DF6"],"en|ko":["0xe026cA59Bc31960D3060390D8667ceBc5D42B46d","0x499aD7D07f6EF0bD17656559312D0DdCBA0e79Ce"],"en|pt":["0xaD9Dec9c66cEbAa7e8624a528f65A3FA1Df8027d","0xb9534aB9b71e26949F9bdF9C05897Ee4619d144F"],"en|ru":["0xF4E6294201Ef99f1E83586Ef5AC8bCBaA4DB45CF","0x243a0431DE8d0B6D9837B53d3A10088b53B52918"],"en|tr":["0x10Dde936662A674F35ab36641017342B75Bb1D58","0xB93b8c9FD90724C036Ac56c5D3306333A67cFbFB"],"en|zh":["0xffb2BB47F4CD36426134706A849590471622519C","0xBc19B6fBAEEC0a2b50f3AD6F53b670ac03Bd1C6F"]},"77":{"de|en":["0x598fdd74b56F949cF84904D03B8774cb4F0e679C"],"en|es":["0x598fdd74b56F949cF84904D03B8774cb4F0e679C"],"en|fr":["0x598fdd74b56F949cF84904D03B8774cb4F0e679C"],"en|ja":["0x598fdd74b56F949cF84904D03B8774cb4F0e679C"],"en|ko":["0x598fdd74b56F949cF84904D03B8774cb4F0e679C"],"en|pt":["0x598fdd74b56F949cF84904D03B8774cb4F0e679C"],"en|ru":["0x598fdd74b56F949cF84904D03B8774cb4F0e679C"],"en|tr":["0x598fdd74b56F949cF84904D03B8774cb4F0e679C"],"en|zh":["0x598fdd74b56F949cF84904D03B8774cb4F0e679C"]}}'
LINGUO_CONTRACT_ADDRESSES='{"1":{"de|en":["0x54f1f7b58c1Dc646a6c639C5d909B62652129b33","0x950f5AB863075C685227EfEDb41Ef167Be0099ad"],"en|es":["0x460f688f655610de5e3d92beb7892fa200b9060d","0xD8F8019c025C2Ba6745543D9a3C338DE1b98C103"],"en|fr":["0xFEe86325d5C96AE9E20EaBe7B157813c67bBccFA","0xf1A9589880DbF393F32A5b2d5a0054Fa10385074"],"en|ja":["0x5Cd1ff55282db11e526Fe13fA0F7C014f74acF11","0xc3162705Af0e10108FF837E450A14669b2711129"],"en|ko":["0xf8D4c1436ACA89A5DEEf36F06f662bAdfEb5AE63","0xFE721DD8Ac8e47A4228A6147A25C65136f213EaA"],"en|pt":["0x48032Ad54DB49d8E0d4f135A687b98E5731961f9","0x1c839fd542563182BFD0C337c8AaD1Be412F0fd2"],"en|ru":["0x0Bc3B51673dCdF3b45c628066761dA7331E8fBA2","0x464c84c41f3C25Ba5a75B006D8B20600A8777306"],"en|tr":["0xa3E4348BDDc32AfcedC5e088e0E21FD6154A0180","0x44863f5b7AAb7ceE181C0d84E244540125eF7AF7"],"en|zh":["0xaB0D90943A58b1A64c0171Ee8e743d9998Be6AC3","0xD67C12734dC12240a6324Db63ccd426964B71Fe7"]},"42":{"de|en":["0x8A4290298D65717a3BaEd546e4Ef9Eb2fe0b187D","0x5Af02E0E04c2042345E15Ed6dc7CC0c220f2C2Fa"],"en|es":["0x082aA0BeBE8C32042F77d123B6a657Fe907D8C33","0x6eb2D062E808a67828d27aD3926912C9309E5417"],"en|fr":["0x963Df99387a2b350264B5847ff9AbFF674e7BdFA","0x152c7F0948Fd0B2741a934aA7bfceB41cd4b5bFD"],"en|ja":["0x8B819D13d90Fcf9F0a235fe85d860E3C9763D470","0x033B08AAC5A3a2E7C306dd5Ee360904eC8d45DF6"],"en|ko":["0xe026cA59Bc31960D3060390D8667ceBc5D42B46d","0x499aD7D07f6EF0bD17656559312D0DdCBA0e79Ce"],"en|pt":["0xaD9Dec9c66cEbAa7e8624a528f65A3FA1Df8027d","0xb9534aB9b71e26949F9bdF9C05897Ee4619d144F"],"en|ru":["0xF4E6294201Ef99f1E83586Ef5AC8bCBaA4DB45CF","0x243a0431DE8d0B6D9837B53d3A10088b53B52918"],"en|tr":["0x10Dde936662A674F35ab36641017342B75Bb1D58","0xB93b8c9FD90724C036Ac56c5D3306333A67cFbFB"],"en|zh":["0xffb2BB47F4CD36426134706A849590471622519C","0xBc19B6fBAEEC0a2b50f3AD6F53b670ac03Bd1C6F"]},"77":{"de|en":["0x8539cb2fB9186f3DcF8F9A0AeD3De395Fd6d9870"],"en|es":["0x5a9F70ED50e16010f0B9d5bb5a3EFdb42fEcaD23"],"en|fr":["0x9CA979a165EF741BF120A3FEbb4F5C083De40708"],"en|ja":["0x753d611eAdF324B1f23A3A417BceB08eeda80ec6"],"en|ko":["0xC578de969Dd2A2a08d6Bd5A4F7AaA9b1a2e6A395"],"en|pt":["0x457b2BAb823c772fA4457517C97E6BF13065c21D"],"en|ru":["0x6cD5BAb73135966008d969bE23Ff940e6fa3Bb87"],"en|tr":["0xa9426b235E12897A99B015CbcF4D064e86fde418"],"en|zh":["0x09CE835FaB6051a18b2FC11743c01DAAD3122f1F"]},"100":{"de|en":["0xc3162705Af0e10108FF837E450A14669b2711129"],"en|es":["0xA2BfFF0553DE7405781FE0C39C04A383F04b9C80"],"en|fr":["0x464c84c41f3C25Ba5a75B006D8B20600A8777306"],"en|ja":["0x852550982e0984F9CCeF18a7276D35AFDc30242c"],"en|ko":["0xD67C12734dC12240a6324Db63ccd426964B71Fe7"],"en|pt":["0xFE721DD8Ac8e47A4228A6147A25C65136f213EaA"],"en|ru":["0x44863f5b7AAb7ceE181C0d84E244540125eF7AF7"],"en|tr":["0x1D48a279966f37385b4AB963530C6dC813b3A8Df"],"en|zh":["0x0B928165A67df8254412483ae8C3b8cc7F2b4D36"]}}'

[context.production.environment]
DEFAULT_CHAIN_ID='1'
DEFAULT_CHAIN_ID='100'

[[redirects]]
from = "/*"
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@
"@ethersproject/providers": "^5.0.14",
"@ethersproject/solidity": "^5.0.5",
"@hot-loader/react-dom": "^17.0.1",
"@kleros/archon": "^1.2.0",
"@kleros/archon": "^2.2.0",
"@kleros/erc-792": "^7.0.0",
"@kleros/linguo-contracts": "~0.4.0",
"@kleros/linguo-contracts": "~0.5.0",
"@kleros/react-components": "^6.0.0",
"@loadable/component": "^5.12.0",
"@reduxjs/toolkit": "^1.6.1",
Expand Down
116 changes: 77 additions & 39 deletions src/app/MainRouter.jsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
import React from 'react';
import t from 'prop-types';
import { useSelector } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import { Redirect, Route, Switch } from 'react-router-dom';
import loadable from '@loadable/component';
import { Layout } from 'antd';
import { ConnectedRouter } from 'connected-react-router';
import { Spin } from '~/adapters/antd';
import { selectPreference } from '~/features/ui/uiSlice';
import { Alert, Spin } from '~/adapters/antd';
import DismissableAlert from '~/features/ui/DismissableAlert';
import { selectPreference } from '~/features/ui/uiSlice';
import { getNetworkName, useSwitchToChainFromUrl } from '~/features/web3';
import { getCounterPartyChainId, isSupportedSideChain } from '~/features/web3/supportedChains';
import Web3ErrorAlert from '~/features/web3/Web3ErrorAlert';
import { selectChainId, switchChain } from '~/features/web3/web3Slice';
import { WarningIcon } from '~/shared/icons';
import Button from '~/shared/Button';
import Footer from '~/shared/Footer';
import { DrawerMenu } from '~/shared/Menu';
import Navbar from '~/shared/Navbar';
import { history } from '~/store';
import Content from './Content';
import * as r from './routes';
import { useSwitchToChainFromUrl } from '~/features/web3';

const fallback = <Spin $centered tip="Loading page content..." />;

Expand Down Expand Up @@ -47,41 +51,7 @@ export default function MainRouter() {
position: relative;
`}
></div>
<div
css={`
position: relative;

:empty {
display: none;
}

@media (max-width: 991.98px) {
margin-bottom: 0.5rem;
}

@media (max-width: 767.98px) {
margin-bottom: 1rem;
}

@media (max-width: 575.98px) {
margin-bottom: 4.5rem;
}
`}
>
<DismissableAlert
banner
type="warning"
id="global.betaWarning"
message="This is a beta version, use at your own risk. Linguo is currently very sensitive to gas prices. An optimized version will be available soon."
css={`
position: absolute;
z-index: 1;
top: 0;
left: 0;
right: 0;
`}
/>
</div>
<GlobalWarnings />
<Web3ErrorAlert />
<Content>
<Switch>
Expand Down Expand Up @@ -130,3 +100,71 @@ _RouterInitializer.propTypes = {
};

const RouterInitializer = React.memo(_RouterInitializer);

function GlobalWarnings() {
const dispatch = useDispatch();
const chainId = useSelector(selectChainId);
const counterPartyChainId = getCounterPartyChainId(chainId);

return (
<div
css={`
position: relative;

:empty {
display: none;
}

@media (max-width: 991.98px) {
margin-bottom: 0.5rem;
}

@media (max-width: 767.98px) {
margin-bottom: 1rem;
}

@media (max-width: 575.98px) {
margin-bottom: 2.5rem;
}
`}
>
{isSupportedSideChain(chainId) && (
<DismissableAlert
banner
type="warning"
id="global.betaWarning"
message="Linguo is still in beta. Use it at your own risk."
css={`
position: absolute;
z-index: 1;
top: 0;
left: 0;
right: 0;
`}
/>
)}
{!isSupportedSideChain(chainId) && (
<Alert
banner
type="warning"
icon={<WarningIcon />}
message={
<>
Linguo is moving to a side-chain for more affordable gas prices:{' '}
<Button variant="link" onClick={() => dispatch(switchChain({ chainId: counterPartyChainId }))}>
Switch to {getNetworkName(counterPartyChainId)}.
</Button>
</>
}
css={`
position: absolute;
z-index: 1;
top: 0;
left: 0;
right: 0;
`}
/>
)}
</div>
);
}
2 changes: 1 addition & 1 deletion src/features/linguo/api/createApiFacade.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import IArbitrator from '@kleros/erc-792/build/contracts/IArbitrator.json';
import Linguo from '@kleros/linguo-contracts/artifacts/Linguo.json';
import Linguo from '@kleros/linguo-contracts/artifacts/contracts/0.7.x/Linguo.sol/Linguo.json';
import { subtract } from '~/adapters/big-number';
import { combination } from '~/adapters/js-combinatorics';
import { withProvider } from '~/app/archon';
Expand Down
4 changes: 4 additions & 0 deletions src/features/linguo/api/createContractApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,7 @@ const chainIdToCurrentEvidenceDisplayInterfaceURI = {
1: '/ipfs/QmXGDMfcxjfQi5SFwpBSb73pPjoZq2N8c6eWCgxx8pVqj7/index.html',
42: '/ipfs/QmYbtF7K6qCfSYfu2k6nYnVRY8HY97rEAF6mgBWtDgfovw/index.html',
77: '/ipfs/Qmb5n6PgbshktJqGpwMAxP1moXEPaqq7ZvRufeXXhSPXxW/linguo-evidence-display/index.html',
100: '/ipfs/Qmb5n6PgbshktJqGpwMAxP1moXEPaqq7ZvRufeXXhSPXxW/linguo-evidence-display/index.html',
};

/**
Expand All @@ -856,12 +857,14 @@ const chainIdToValidEvidenceDisplayInterfaceURIs = {
1: [chainIdToCurrentEvidenceDisplayInterfaceURI[1]],
42: [chainIdToCurrentEvidenceDisplayInterfaceURI[42]],
77: [chainIdToCurrentEvidenceDisplayInterfaceURI[77]],
100: [chainIdToCurrentEvidenceDisplayInterfaceURI[100]],
};

const chainIdToCurrentDynamicScriptURI = {
1: '/ipfs/QmchWC6L3dT23wwQiJJLWCeS1EDnDYrLcYat93C4Lm4P4E/linguo-dynamic-script.js',
42: '/ipfs/QmZFcqdsR76jyHyLsBefc4SBuegj2boBDr2skxGauM5DNf/linguo-dynamic-script.js',
77: '/ipfs/QmPAHCRtSU844fdjNoEws8AgTpzzwsYwMF2wydtpvXAcoZ/linguo-script.js',
100: '/ipfs/QmPAHCRtSU844fdjNoEws8AgTpzzwsYwMF2wydtpvXAcoZ/linguo-script.js',
};

/**
Expand All @@ -871,6 +874,7 @@ const chainIdToValidDynamicScriptURIs = {
1: [chainIdToCurrentDynamicScriptURI[1]],
42: [chainIdToCurrentDynamicScriptURI[42]],
77: [chainIdToCurrentDynamicScriptURI[77]],
100: [chainIdToCurrentDynamicScriptURI[100]],
};

const getFileTypeFromPath = path => (path ?? '').split('.').slice(-1)?.[0];
Expand Down
4 changes: 2 additions & 2 deletions src/features/requester/requesterSlice.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,15 @@ export default createPersistedReducer(requesterSlice.reducer);
export const selectStatusFilter = state => state.requester.tasks?.filters?.status ?? statusFilters.all;

const selectLoadingState = (state, { account = null, chainId }) =>
state.requester.tasks.byAccount[account]?.byChainId[chainId]?.loadingState ?? 'idle';
state.requester.tasks.byAccount[account]?.byChainId?.[chainId]?.loadingState ?? 'idle';

export const selectIsIdle = createSelector([selectLoadingState], loadingState => loadingState === 'idle');
export const selectIsLoading = createSelector([selectLoadingState], loadingState => loadingState === 'loading');
export const selectHasSucceeded = createSelector([selectLoadingState], loadingState => loadingState === 'succeeded');
export const selectHasFailed = createSelector([selectLoadingState], loadingState => loadingState === 'failed');

export const selectAllTasks = (state, { account, chainId }) => {
const taskIds = state.requester.tasks.byAccount[account]?.byChainId[chainId]?.ids ?? [];
const taskIds = state.requester.tasks.byAccount[account]?.byChainId?.[chainId]?.ids ?? [];
return selectAllFilterByIds(taskIds)(state);
};

Expand Down
8 changes: 6 additions & 2 deletions src/features/tasks/TaskStatusFilter.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,27 @@ import styled from 'styled-components';
import { Badge, Select } from 'antd';
import theme from '~/features/ui/theme';

export default function TaskStatusFilter({ fullWidth, onChange, defaultValue }) {
export default function TaskStatusFilter({ fullWidth, onChange, value, defaultValue }) {
const controlledProps = value !== undefined ? { value } : {};

return (
<StyledSelect
filterOption={false}
size="large"
listHeight={368}
dropdownRender={menu => <StyledItemWrapper>{menu}</StyledItemWrapper>}
$fullWidth={fullWidth}
onChange={onChange}
defaultValue={defaultValue}
onChange={onChange}
options={filterOptions}
{...controlledProps}
/>
);
}

TaskStatusFilter.propTypes = {
onChange: t.func,
value: t.string,
defaultValue: t.string,
fullWidth: t.bool,
};
Expand Down
2 changes: 1 addition & 1 deletion src/features/transactions/transactionsSlice.js
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ function* createTxNotification(
template: {
id: 'link',
params: {
text: 'View on Etherscan',
text: 'View on Block Explorer',
url,
},
},
Expand Down
4 changes: 2 additions & 2 deletions src/features/translator/tasksSlice.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export const selectStatusFilter = state => state.filters?.status ?? statusFilter
export const selectAllTasksFilter = state => state.filters?.allTasks ?? false;

export const selectLoadingState = (state, { account = null, chainId }) =>
state.byAccount[account]?.byChainId[chainId]?.loadingState ?? 'idle';
state.byAccount[account]?.byChainId?.[chainId]?.loadingState ?? 'idle';
export const selectIsIdle = (state, { account, chainId }) => selectLoadingState(state, { account, chainId }) === 'idle';
export const selectIsLoading = (state, { account, chainId }) =>
selectLoadingState(state, { account, chainId }) === 'loading';
Expand All @@ -89,7 +89,7 @@ export const selectHasFetched = (state, { account, chainId }) =>
export const selectHasFailed = (state, { account, chainId }) =>
selectLoadingState(state, { account, chainId }) === 'failed';

export const selectTaskIds = (state, { account, chainId }) => state.byAccount[account]?.byChainId[chainId]?.ids ?? [];
export const selectTaskIds = (state, { account, chainId }) => state.byAccount[account]?.byChainId?.[chainId]?.ids ?? [];

export const selectors = {
selectStatusFilter,
Expand Down
4 changes: 2 additions & 2 deletions src/features/ui/uiSlice.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ const { set } = preferences.actions;

export { dismiss as dismissAlert, notify, close as closeNotification, set as setPreference };

export const selectAlertIsVisible = id => state => alerts.selectors.selectIsVisible(id)(state.ui.alerts);
export const selectPreference = key => state => preferences.selectors.selectByKey(key)(state.ui.preferences);
export const selectAlertIsVisible = id => state => alerts.selectors.selectIsVisible(id)(state.ui.alerts ?? {});
export const selectPreference = key => state => preferences.selectors.selectByKey(key)(state.ui.preferences ?? {});

export const sagas = {
...popupNotifications.sagas,
Expand Down
6 changes: 4 additions & 2 deletions src/features/web3/WalletConnectionModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,17 @@ export default WalletConnectionModal;

const StyledWalletButton = styled(Button)`
border-radius: 0.75rem;
height: 100%;

> span {
display: flex;
flex-flow: column nowrap;
align-items: center;
padding: 1rem;

.logo {
width: 60%;
height: auto;
width: 64px;
height: 64px;
}

.description {
Expand Down
27 changes: 19 additions & 8 deletions src/features/web3/supportedChains.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { getBaseUrl } from './blockExplorer';
const env = process.env.NODE_ENV ?? 'development';

const defaultChainIdsPerEnv = {
production: Number(process.env.DEFAULT_CHAIN_ID) ?? 1,
production: Number(process.env.DEFAULT_CHAIN_ID) ?? 100,
development: Number(process.env.DEFAULT_CHAIN_ID) ?? 77,
};

Expand All @@ -14,13 +14,13 @@ export const jsonRpcUrls = JSON.parse(process.env.JSON_RPC_URLS);

const supportedSideChains = {
// xDai
// 100: {
// chainId: 100,
// chainName: 'xDAI Chain',
// nativeCurrency: { name: 'xDAI', symbol: 'xDAI', decimals: 18 },
// rpcUrls: [jsonRpcUrls[100]],
// blockExplorerUrls: [getBaseUrl(100)],
// },
100: {
chainId: 100,
chainName: 'xDAI Chain',
nativeCurrency: { name: 'xDAI', symbol: 'xDAI', decimals: 18 },
rpcUrls: [jsonRpcUrls[100]],
blockExplorerUrls: [getBaseUrl(100)],
},
// Sokol
77: {
chainId: 77,
Expand All @@ -31,6 +31,17 @@ const supportedSideChains = {
},
};

const counterPartyChainIdMap = {
1: 100,
42: 77,
77: 42,
100: 1,
};

export function getCounterPartyChainId(chainId) {
return counterPartyChainIdMap[chainId];
}

export const supportedChainIds = [1, 42, ...map(prop('chainId'), Object.values(supportedSideChains))];

export function getSideChainParams(sideChainId) {
Expand Down
8 changes: 4 additions & 4 deletions src/pages/Faq.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -174,15 +174,15 @@ const StyledQA = styled.div`
const StyledQuestionAnchor = styled.a`
z-index: 2;
position: absolute;
left: 0.5rem;
top: 0.625rem;
left: 8px;
top: 12px;
text-align: center;
color: ${p => p.theme.color.text.inverted};
color: ${p => p.theme.color.text.light};
transition: all 0.25s cubic-bezier(0.77, 0, 0.175, 1);

:hover,
:focus {
color: ${p => p.theme.color.text.inverted};
color: ${p => p.theme.color.text.light};
filter: drop-shadow(0 0 2px ${p => p.theme.color.glow.default});
}
`;
Expand Down
Loading