Support switch theme on backend config page

This commit is contained in:
Haishan 2021-06-13 15:20:12 +08:00
parent aad1d2681e
commit c78dbcf8f8
20 changed files with 352 additions and 315 deletions

View file

@ -23,12 +23,11 @@
"private": true, "private": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "7.14.0", "@babel/runtime": "7.14.5",
"@fontsource/open-sans": "4.4.2", "@fontsource/open-sans": "4.4.5",
"@fontsource/roboto-mono": "4.4.2", "@fontsource/roboto-mono": "4.4.2",
"@hsjs/react-cache": "0.0.0-alpha.aa94237", "@hsjs/react-cache": "0.0.0-alpha.aa94237",
"@reach/tooltip": "0.15.0", "@reach/tooltip": "0.15.0",
"@sentry/browser": "6.5.1",
"chart.js": "2.9.4", "chart.js": "2.9.4",
"clsx": "^1.1.0", "clsx": "^1.1.0",
"core-js": "3.14.0", "core-js": "3.14.0",
@ -38,7 +37,7 @@
"i18next": "20.3.1", "i18next": "20.3.1",
"i18next-browser-languagedetector": "6.1.1", "i18next-browser-languagedetector": "6.1.1",
"i18next-http-backend": "1.2.6", "i18next-http-backend": "1.2.6",
"immer": "9.0.2", "immer": "9.0.3",
"invariant": "^2.2.4", "invariant": "^2.2.4",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"memoize-one": "5.2.1", "memoize-one": "5.2.1",
@ -50,7 +49,7 @@
"react-i18next": "11.10.0", "react-i18next": "11.10.0",
"react-icons": "^4.2.0", "react-icons": "^4.2.0",
"react-modal": "3.14.2", "react-modal": "3.14.2",
"react-query": "3.16.1", "react-query": "3.17.0",
"react-router": "6.0.0-beta.0", "react-router": "6.0.0-beta.0",
"react-router-dom": "6.0.0-beta.0", "react-router-dom": "6.0.0-beta.0",
"react-switch": "^6.0.0", "react-switch": "^6.0.0",
@ -61,7 +60,7 @@
"recoil": "0.3.1", "recoil": "0.3.1",
"regenerator-runtime": "^0.13.7", "regenerator-runtime": "^0.13.7",
"reselect": "^4.0.0", "reselect": "^4.0.0",
"tslib": "2.2.0", "tslib": "2.3.0",
"workbox-core": "6.1.5", "workbox-core": "6.1.5",
"workbox-expiration": "6.1.5", "workbox-expiration": "6.1.5",
"workbox-precaching": "6.1.5", "workbox-precaching": "6.1.5",
@ -72,16 +71,16 @@
"@types/invariant": "^2.2.33", "@types/invariant": "^2.2.33",
"@types/jest": "26.0.23", "@types/jest": "26.0.23",
"@types/lodash-es": "^4.17.4", "@types/lodash-es": "^4.17.4",
"@types/react": "17.0.9", "@types/react": "17.0.11",
"@types/react-dom": "17.0.6", "@types/react-dom": "17.0.7",
"@types/react-modal": "^3.12.0", "@types/react-modal": "^3.12.0",
"@types/react-tabs": "^2.3.2", "@types/react-tabs": "^2.3.2",
"@types/react-window": "1.8.3", "@types/react-window": "1.8.3",
"@typescript-eslint/eslint-plugin": "4.26.0", "@typescript-eslint/eslint-plugin": "4.26.1",
"@typescript-eslint/parser": "4.26.0", "@typescript-eslint/parser": "4.26.1",
"@vitejs/plugin-react-refresh": "1.3.3", "@vitejs/plugin-react-refresh": "1.3.3",
"autoprefixer": "10.2.6", "autoprefixer": "10.2.6",
"cssnano": "5.0.5", "cssnano": "5.0.6",
"eslint": "7.28.0", "eslint": "7.28.0",
"eslint-config-airbnb-base": "^14.2.1", "eslint-config-airbnb-base": "^14.2.1",
"eslint-config-prettier": "8.3.0", "eslint-config-prettier": "8.3.0",
@ -93,7 +92,7 @@
"eslint-plugin-react": "7.24.0", "eslint-plugin-react": "7.24.0",
"eslint-plugin-react-hooks": "^4.1.2", "eslint-plugin-react-hooks": "^4.1.2",
"eslint-plugin-simple-import-sort": "^7.0.0", "eslint-plugin-simple-import-sort": "^7.0.0",
"postcss": "8.3.0", "postcss": "8.3.2",
"postcss-custom-media": "^8.0.0", "postcss-custom-media": "^8.0.0",
"postcss-import": "14.0.2", "postcss-import": "14.0.2",
"postcss-simple-vars": "^6.0.3", "postcss-simple-vars": "^6.0.3",
@ -101,7 +100,7 @@
"resize-observer-polyfill": "^1.5.1", "resize-observer-polyfill": "^1.5.1",
"sass": "1.34.1", "sass": "1.34.1",
"typescript": "4.3.2", "typescript": "4.3.2",
"vite": "2.3.6", "vite": "2.3.7",
"vite-plugin-pwa": "0.7.3" "vite-plugin-pwa": "0.8.1"
} }
} }

View file

@ -10,11 +10,12 @@
align-items: center; align-items: center;
.icon { .icon {
color: #2d2d30; --stroke: #f3f3f3;
opacity: 0.4; color: #20497e;
opacity: 0.7;
transition: opacity 400ms; transition: opacity 400ms;
&:hover { &:hover {
opacity: 0.7; opacity: 1;
} }
} }
} }

View file

@ -1,9 +1,10 @@
import * as React from 'react'; import * as React from 'react';
import { fetchConfigs } from 'src/api/configs'; import { fetchConfigs } from 'src/api/configs';
import { BackendList } from 'src/components/BackendList'; import { BackendList } from 'src/components/BackendList';
import { addClashAPIConfig, getClashAPIConfig } from 'src/store/app';
import { State } from 'src/store/types';
import { ClashAPIConfig } from 'src/types'; import { ClashAPIConfig } from 'src/types';
import { addClashAPIConfig, getClashAPIConfig } from '../store/app';
import s0 from './APIConfig.module.scss'; import s0 from './APIConfig.module.scss';
import Button from './Button'; import Button from './Button';
import Field from './Field'; import Field from './Field';
@ -13,7 +14,7 @@ import SvgYacd from './SvgYacd';
const { useState, useRef, useCallback } = React; const { useState, useRef, useCallback } = React;
const Ok = 0; const Ok = 0;
const mapState = (s) => ({ const mapState = (s: State) => ({
apiConfig: getClashAPIConfig(s), apiConfig: getClashAPIConfig(s),
}); });
@ -73,23 +74,22 @@ function APIConfig({ dispatch }) {
<div className={s0.root} ref={contentEl} onKeyDown={handleContentOnKeyDown}> <div className={s0.root} ref={contentEl} onKeyDown={handleContentOnKeyDown}>
<div className={s0.header}> <div className={s0.header}>
<div className={s0.icon}> <div className={s0.icon}>
<SvgYacd width={160} height={160} /> <SvgYacd width={160} height={160} stroke="var(--stroke)" />
</div> </div>
</div> </div>
<div className={s0.body}> <div className={s0.body}>
<div className={s0.hostnamePort}> <div className={s0.hostnamePort}>
<Field <Field
id="baseURL" id="baseURL"
// @ts-expect-error ts-migrate(2322) FIXME: Type '{ id: string; name: string; label: string; t... Remove this comment to see the full error message
name="baseURL" name="baseURL"
label="API Base URL" label="API Base URL"
type="text" type="text"
placeholder="http://127.0.0.1:9090"
value={baseURL} value={baseURL}
onChange={handleInputOnChange} onChange={handleInputOnChange}
/> />
<Field <Field
id="secret" id="secret"
// @ts-expect-error ts-migrate(2322) FIXME: Type '{ id: string; name: string; label: string; v... Remove this comment to see the full error message
name="secret" name="secret"
label="Secret(optional)" label="Secret(optional)"
value={secret} value={secret}

View file

@ -22,5 +22,12 @@
} }
.overlay.overlay { .overlay.overlay {
background: #222; background-color: var(--color-background);
}
.fixed {
position: fixed;
padding: 16px;
bottom: 0;
right: 0;
} }

View file

@ -1,9 +1,11 @@
import React from 'react'; import * as React from 'react';
import { ThemeSwitcher } from 'src/components/shared/ThemeSwitcher';
import { DOES_NOT_SUPPORT_FETCH, errors } from 'src/misc/errors';
import { getClashAPIConfig } from 'src/store/app';
import { fetchConfigs } from 'src/store/configs';
import { closeModal } from 'src/store/modals';
import { State } from 'src/store/types';
import { DOES_NOT_SUPPORT_FETCH, errors } from '../misc/errors';
import { getClashAPIConfig } from '../store/app';
import { fetchConfigs } from '../store/configs';
import { closeModal } from '../store/modals';
import APIConfig from './APIConfig'; import APIConfig from './APIConfig';
import s0 from './APIDiscovery.module.scss'; import s0 from './APIDiscovery.module.scss';
import Modal from './Modal'; import Modal from './Modal';
@ -32,7 +34,6 @@ function APIDiscovery({ dispatch, apiConfig, modals }) {
isOpen={modals.apiConfig} isOpen={modals.apiConfig}
className={s0.content} className={s0.content}
overlayClassName={s0.overlay} overlayClassName={s0.overlay}
// @ts-expect-error ts-migrate(2322) FIXME: Type '{ children: Element; isOpen: any; className:... Remove this comment to see the full error message
shouldCloseOnOverlayClick={false} shouldCloseOnOverlayClick={false}
shouldCloseOnEsc={false} shouldCloseOnEsc={false}
onRequestClose={closeApiConfigModal} onRequestClose={closeApiConfigModal}
@ -40,11 +41,15 @@ function APIDiscovery({ dispatch, apiConfig, modals }) {
<div className={s0.container}> <div className={s0.container}>
<APIConfig /> <APIConfig />
</div> </div>
<div className={s0.fixed}>
<ThemeSwitcher />
</div>
</Modal> </Modal>
); );
} }
const mapState = (s) => ({ const mapState = (s: State) => ({
modals: s.modals, modals: s.modals,
apiConfig: getClashAPIConfig(s), apiConfig: getClashAPIConfig(s),
}); });

View file

@ -19,6 +19,7 @@
grid-template-rows: 30px; grid-template-rows: 30px;
grid-template-areas: 'close url .'; grid-template-areas: 'close url .';
column-gap: 10px; column-gap: 10px;
border: 1px solid var(--bg-near-transparent);
} }
.li:hover { .li:hover {
@ -29,6 +30,7 @@
opacity: 0; opacity: 0;
grid-area: close; grid-area: close;
place-self: center; place-self: center;
cursor: pointer;
} }
.li:hover .close, .li:hover .close,
@ -83,6 +85,7 @@
} }
.btn:hover:enabled { .btn:hover:enabled {
background-color: var(--color-focus-blue); background-color: var(--color-focus-blue);
color: white;
} }
.btn:active:enabled { .btn:active:enabled {
transform: scale(0.97); transform: scale(0.97);

View file

@ -9,13 +9,12 @@
border-radius: 0; border-radius: 0;
border-bottom: 1px solid var(--color-input-border); border-bottom: 1px solid var(--color-input-border);
box-sizing: border-box; box-sizing: border-box;
color: #c1c1c1; color: inherit;
display: inline-block; display: inline-block;
font-size: inherit; font-size: inherit;
height: 40px; height: 40px;
outline: none; outline: none;
padding: 0 4px; padding: 0 4px;
transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
width: 100%; width: 100%;
&:focus { &:focus {
border-color: var(--color-focus-blue); border-color: var(--color-focus-blue);

View file

@ -1,27 +1,25 @@
import cx from 'clsx'; import * as React from 'react';
import React from 'react';
import s from './Field.module.scss'; import s from './Field.module.scss';
const { useCallback } = React; const { useCallback } = React;
type Props = { type Props = {
name: string;
value?: string | number; value?: string | number;
type?: 'text' | 'number'; type?: 'text' | 'number';
onChange?: (...args: any[]) => any; onChange?: (...args: any[]) => any;
id?: string; id?: string;
label?: string; label?: string;
placeholder?: string;
}; };
export default function Field({ id, label, value, onChange, ...props }: Props) { export default function Field({ id, label, value, onChange, ...props }: Props) {
const valueOnChange = useCallback((e) => onChange(e), [onChange]); const valueOnChange = useCallback((e) => onChange(e), [onChange]);
const labelClassName = cx({
[s.floatAbove]: typeof value === 'string' && value !== '',
});
return ( return (
<div className={s.root}> <div className={s.root}>
<input id={id} value={value} onChange={valueOnChange} {...props} /> <input id={id} value={value} onChange={valueOnChange} {...props} />
<label htmlFor={id} className={labelClassName}> <label htmlFor={id} className={s.floatAbove}>
{label} {label}
</label> </label>
</div> </div>

View file

@ -11,11 +11,11 @@
.content { .content {
outline: none; outline: none;
position: relative; position: relative;
color: #ddd; color: var(--color-text);
background: #444;
top: 50%; top: 50%;
left: 50%; left: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
background: #444;
padding: 20px; padding: 20px;
border-radius: 10px; border-radius: 10px;
} }

View file

@ -1,10 +1,10 @@
import cx from 'clsx'; import cx from 'clsx';
import React from 'react'; import * as React from 'react';
import Modal from 'react-modal'; import Modal, { Props as ReactModalProps } from 'react-modal';
import s0 from './Modal.module.scss'; import s0 from './Modal.module.scss';
type Props = { type Props = ReactModalProps & {
isOpen: boolean; isOpen: boolean;
onRequestClose: (...args: any[]) => any; onRequestClose: (...args: any[]) => any;
children: React.ReactNode; children: React.ReactNode;

View file

@ -68,12 +68,12 @@ body {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
body, @mixin dark {
body.dark {
--color-background: #202020; --color-background: #202020;
--color-background2: rgba(32, 32, 32, 0.3); --color-background2: rgba(32, 32, 32, 0.3);
--color-bg-card: #2d2d2d; --color-bg-card: #2d2d2d;
@ -100,8 +100,7 @@ body.dark {
--select-border-color: #040404; --select-border-color: #040404;
--select-bg-hover: url(data:image/svg+xml,%0A%20%20%20%20%3Csvg%20width%3D%228%22%20height%3D%2224%22%20viewBox%3D%220%200%208%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%207L7%2011H1L4%207Z%22%20fill%3D%22%23ffffff%22%20%2F%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%2017L1%2013L7%2013L4%2017Z%22%20fill%3D%22%23ffffff%22%20%2F%3E%0A%20%20%20%20%3C%2Fsvg%3E%0A%20%20); --select-bg-hover: url(data:image/svg+xml,%0A%20%20%20%20%3Csvg%20width%3D%228%22%20height%3D%2224%22%20viewBox%3D%220%200%208%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%207L7%2011H1L4%207Z%22%20fill%3D%22%23ffffff%22%20%2F%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%2017L1%2013L7%2013L4%2017Z%22%20fill%3D%22%23ffffff%22%20%2F%3E%0A%20%20%20%20%3C%2Fsvg%3E%0A%20%20);
} }
@mixin light {
body.light {
--color-background: #eee; --color-background: #eee;
--color-background2: rgba(240, 240, 240, 0.3); --color-background2: rgba(240, 240, 240, 0.3);
--color-bg-card: #fafafa; --color-bg-card: #fafafa;
@ -129,6 +128,19 @@ body.light {
--select-bg-hover: url(data:image/svg+xml,%0A%20%20%20%20%3Csvg%20width%3D%228%22%20height%3D%2224%22%20viewBox%3D%220%200%208%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%207L7%2011H1L4%207Z%22%20fill%3D%22%23222222%22%20%2F%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%2017L1%2013L7%2013L4%2017Z%22%20fill%3D%22%23222222%22%20%2F%3E%0A%20%20%20%20%3C%2Fsvg%3E%0A%20%20); --select-bg-hover: url(data:image/svg+xml,%0A%20%20%20%20%3Csvg%20width%3D%228%22%20height%3D%2224%22%20viewBox%3D%220%200%208%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%207L7%2011H1L4%207Z%22%20fill%3D%22%23222222%22%20%2F%3E%0A%20%20%20%20%20%20%3Cpath%20d%3D%22M4%2017L1%2013L7%2013L4%2017Z%22%20fill%3D%22%23222222%22%20%2F%3E%0A%20%20%20%20%3C%2Fsvg%3E%0A%20%20);
} }
// we don't have a "system" or "auto" mode now
// it's just not make sense to have these yet
// @media (prefers-color-scheme: dark) {}
// @media (prefers-color-scheme: light) {}
:root[data-theme='dark'] {
@include dark;
}
:root[data-theme='light'] {
@include light;
}
.flexCenter { .flexCenter {
display: flex; display: flex;
align-items: center; align-items: center;

View file

@ -103,10 +103,3 @@
.iconWrapper:focus { .iconWrapper:focus {
border-color: var(--color-focus-blue); border-color: var(--color-focus-blue);
} }
.themeSwitchContainer {
appearance: none;
user-select: none;
background: none;
cursor: pointer;
}

View file

@ -12,13 +12,9 @@ import {
FcSettings, FcSettings,
} from 'react-icons/fc'; } from 'react-icons/fc';
import { Link, useLocation } from 'react-router-dom'; import { Link, useLocation } from 'react-router-dom';
import { ThemeSwitcher } from 'src/components/shared/ThemeSwitcher';
import { framerMotionResouce } from '../misc/motion';
import { getTheme, switchTheme } from '../store/app';
import s from './SideBar.module.scss'; import s from './SideBar.module.scss';
import { connect } from './StateProvider';
const { useCallback } = React;
const icons = { const icons = {
activity: FcAreaChart, activity: FcAreaChart,
@ -85,12 +81,9 @@ const pages = [
}, },
]; ];
function SideBar({ dispatch, theme }) { export default function SideBar() {
const { t } = useTranslation(); const { t } = useTranslation();
const location = useLocation(); const location = useLocation();
const switchThemeHooked = useCallback(() => {
dispatch(switchTheme());
}, [dispatch]);
return ( return (
<div className={s.root}> <div className={s.root}>
<div className={s.logoPlaceholder} /> <div className={s.logoPlaceholder} />
@ -106,19 +99,7 @@ function SideBar({ dispatch, theme }) {
))} ))}
</div> </div>
<div className={s.footer}> <div className={s.footer}>
<Tooltip <ThemeSwitcher />
label={t('theme')}
aria-label={
'switch to ' + (theme === 'light' ? 'dark' : 'light') + ' theme'
}
>
<button
className={cx(s.iconWrapper, s.themeSwitchContainer)}
onClick={switchThemeHooked}
>
{theme === 'light' ? <MoonA /> : <Sun />}
</button>
</Tooltip>
<Tooltip label={t('about')}> <Tooltip label={t('about')}>
<Link to="/about" className={s.iconWrapper}> <Link to="/about" className={s.iconWrapper}>
<Info size={20} /> <Info size={20} />
@ -128,66 +109,3 @@ function SideBar({ dispatch, theme }) {
</div> </div>
); );
} }
function MoonA() {
const module = framerMotionResouce.read();
const motion = module.motion;
return (
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<motion.path
d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"
initial={{ rotate: -30 }}
animate={{ rotate: 0 }}
transition={{ duration: 0.7 }}
/>
</svg>
);
}
function Sun() {
const module = framerMotionResouce.read();
const motion = module.motion;
return (
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<circle cx="12" cy="12" r="5"></circle>
<motion.g
initial={{ scale: 0.8 }}
animate={{ scale: 1 }}
transition={{ duration: 0.7 }}
>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</motion.g>
</svg>
);
}
const mapState = (s) => ({ theme: getTheme(s) });
export default connect(mapState)(SideBar);

View file

@ -1,5 +1,5 @@
import cx from 'clsx'; import cx from 'clsx';
import React from 'react'; import * as React from 'react';
import s from './SvgYacd.module.scss'; import s from './SvgYacd.module.scss';
@ -9,6 +9,9 @@ type Props = {
animate?: boolean; animate?: boolean;
c0?: string; c0?: string;
c1?: string; c1?: string;
stroke?: string;
eye?: string;
mouth?: string;
}; };
function SvgYacd({ function SvgYacd({
@ -16,7 +19,9 @@ function SvgYacd({
height = 320, height = 320,
animate = false, animate = false,
c0 = 'currentColor', c0 = 'currentColor',
c1 = '#eee', stroke = '#eee',
eye = '#eee',
mouth = '#eee',
}: Props) { }: Props) {
const faceClasName = cx({ [s.path]: animate }); const faceClasName = cx({ [s.path]: animate });
return ( return (
@ -30,16 +35,16 @@ function SvgYacd({
{/* face */} {/* face */}
<path <path
d="M71.689 53.055c9.23-1.487 25.684 27.263 41.411 56.663 18.572-8.017 71.708-7.717 93.775 0 4.714-15.612 31.96-57.405 41.626-56.663 3.992.088 13.07 31.705 23.309 94.96 2.743 16.949 7.537 47.492 14.38 91.63-42.339 17.834-84.37 26.751-126.095 26.751-41.724 0-83.756-8.917-126.095-26.751C52.973 116.244 65.536 54.047 71.689 53.055z" d="M71.689 53.055c9.23-1.487 25.684 27.263 41.411 56.663 18.572-8.017 71.708-7.717 93.775 0 4.714-15.612 31.96-57.405 41.626-56.663 3.992.088 13.07 31.705 23.309 94.96 2.743 16.949 7.537 47.492 14.38 91.63-42.339 17.834-84.37 26.751-126.095 26.751-41.724 0-83.756-8.917-126.095-26.751C52.973 116.244 65.536 54.047 71.689 53.055z"
stroke={c1} stroke={stroke}
strokeWidth="4" strokeWidth="4"
strokeLinecap="round" strokeLinecap="round"
fill={c0} fill={c0}
className={faceClasName} className={faceClasName}
/> />
<circle fill={c1} cx="216.5" cy="181.5" r="14.5" /> <circle fill={eye} cx="216.5" cy="181.5" r="14.5" />
<circle fill={c1} cx="104.5" cy="181.5" r="14.5" /> <circle fill={eye} cx="104.5" cy="181.5" r="14.5" />
{/* mouth */} {/* mouth */}
<g stroke={c1} strokeLinecap="round" strokeWidth="4"> <g stroke={mouth} strokeLinecap="round" strokeWidth="4">
<path d="M175.568 218.694c-2.494 1.582-5.534 2.207-8.563 1.508-3.029-.7-5.487-2.594-7.035-5.11M143.981 218.694c2.494 1.582 5.534 2.207 8.563 1.508 3.03-.7 5.488-2.594 7.036-5.11" /> <path d="M175.568 218.694c-2.494 1.582-5.534 2.207-8.563 1.508-3.029-.7-5.487-2.594-7.035-5.11M143.981 218.694c2.494 1.582 5.534 2.207 8.563 1.508 3.03-.7 5.488-2.594 7.036-5.11" />
</g> </g>
</g> </g>

View file

@ -0,0 +1,28 @@
.iconWrapper {
--sz: 40px;
width: var(--sz);
height: var(--sz);
display: flex;
justify-content: center;
align-items: center;
outline: none;
padding: 5px;
color: var(--color-text);
border-radius: 100%;
border: 1px solid transparent;
}
.iconWrapper:hover {
opacity: 0.6;
}
.iconWrapper:focus {
border-color: var(--color-focus-blue);
}
.themeSwitchContainer {
appearance: none;
user-select: none;
background: none;
cursor: pointer;
}

View file

@ -0,0 +1,97 @@
import Tooltip from '@reach/tooltip';
import cx from 'clsx';
import * as React from 'react';
import { useTranslation } from 'react-i18next';
import { connect } from 'src/components/StateProvider';
import { framerMotionResouce } from 'src/misc/motion';
import { getTheme, switchTheme } from 'src/store/app';
import { State } from 'src/store/types';
import s from './ThemeSwitcher.module.css';
export function ThemeSwitcherImpl({ theme, dispatch }) {
const { t } = useTranslation();
const switchThemeHooked = React.useCallback(() => {
dispatch(switchTheme());
}, [dispatch]);
return (
<Tooltip
label={t('theme')}
aria-label={
'switch to ' + (theme === 'light' ? 'dark' : 'light') + ' theme'
}
>
<button
className={cx(s.iconWrapper, s.themeSwitchContainer)}
onClick={switchThemeHooked}
>
{theme === 'light' ? <MoonA /> : <Sun />}
</button>
</Tooltip>
);
}
function MoonA() {
const module = framerMotionResouce.read();
const motion = module.motion;
return (
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<motion.path
d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"
initial={{ rotate: -30 }}
animate={{ rotate: 0 }}
transition={{ duration: 0.7 }}
/>
</svg>
);
}
function Sun() {
const module = framerMotionResouce.read();
const motion = module.motion;
return (
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<circle cx="12" cy="12" r="5"></circle>
<motion.g
initial={{ scale: 0.8 }}
animate={{ scale: 1 }}
transition={{ duration: 0.7 }}
>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</motion.g>
</svg>
);
}
const mapState = (s: State) => ({ theme: getTheme(s) });
export const ThemeSwitcher = connect(mapState)(ThemeSwitcherImpl);

View file

@ -95,14 +95,15 @@ export function updateClashAPIConfig({ baseURL, secret }) {
}; };
} }
const bodyElement = document.body; const rootEl = document.querySelector('html');
const themeColorMeta = document.querySelector('meta[name="theme-color"]');
function setTheme(theme = 'dark') { function setTheme(theme = 'dark') {
if (theme === 'dark') { if (theme === 'dark') {
bodyElement.classList.remove('light'); rootEl.setAttribute('data-theme', 'dark');
bodyElement.classList.add('dark'); themeColorMeta.setAttribute('content', '#202020');
} else { } else {
bodyElement.classList.remove('dark'); rootEl.setAttribute('data-theme', 'light');
bodyElement.classList.add('light'); themeColorMeta.setAttribute('content', '#eeeeee');
} }
} }

View file

@ -1,13 +1,15 @@
export function openModal(modalName) { import { DispatchFn } from './types';
return (dispatch) => {
export function openModal(modalName: string) {
return (dispatch: DispatchFn) => {
dispatch(`openModal:${modalName}`, (s) => { dispatch(`openModal:${modalName}`, (s) => {
s.modals[modalName] = true; s.modals[modalName] = true;
}); });
}; };
} }
export function closeModal(modalName) { export function closeModal(modalName: string) {
return (dispatch) => { return (dispatch: DispatchFn) => {
dispatch(`closeModal:${modalName}`, (s) => { dispatch(`closeModal:${modalName}`, (s) => {
s.modals[modalName] = false; s.modals[modalName] = false;
}); });

View file

@ -88,6 +88,12 @@ export type StateConfigs = {
haveFetchedConfig: boolean; haveFetchedConfig: boolean;
}; };
///// store.modals
export type StateModals = {
apiConfig: boolean;
};
////// //////
export type State = { export type State = {
@ -95,6 +101,7 @@ export type State = {
configs: StateConfigs; configs: StateConfigs;
proxies: StateProxies; proxies: StateProxies;
logs: StateLogs; logs: StateLogs;
modals: StateModals;
}; };
export type GetStateFn = () => State; export type GetStateFn = () => State;

284
yarn.lock
View file

@ -1008,10 +1008,10 @@
core-js-pure "^3.0.0" core-js-pure "^3.0.0"
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@babel/runtime@7.14.0", "@babel/runtime@^7.14.0": "@babel/runtime@7.14.5":
version "7.14.0" version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.5.tgz#665450911c6031af38f81db530f387ec04cd9a98"
integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== integrity sha512-121rumjddw9c3NCQ55KGkyE1h/nzWhU/owjhw0l4mQrkzz4x9SGS1X8gFLraHwX7td3Yo4QTL+qj0NcIzN87BA==
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
@ -1029,6 +1029,13 @@
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@babel/runtime@^7.14.0":
version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6"
integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2": "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2":
version "7.13.8" version "7.13.8"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.8.tgz#cc886a85c072df1de23670dc1aa59fc116c4017c" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.8.tgz#cc886a85c072df1de23670dc1aa59fc116c4017c"
@ -1200,10 +1207,10 @@
minimatch "^3.0.4" minimatch "^3.0.4"
strip-json-comments "^3.1.1" strip-json-comments "^3.1.1"
"@fontsource/open-sans@4.4.2": "@fontsource/open-sans@4.4.5":
version "4.4.2" version "4.4.5"
resolved "https://registry.yarnpkg.com/@fontsource/open-sans/-/open-sans-4.4.2.tgz#766334df3846b5ad653871e3cc85b2a28b8094a5" resolved "https://registry.yarnpkg.com/@fontsource/open-sans/-/open-sans-4.4.5.tgz#07b31617e62ed753c94cabcf552ebaed4de497ce"
integrity sha512-ZARG7zZKMgnRTIcTRDtjsJQvX4vbDEnAH8D8fPES8Mw8xJrpHGe2laYhrgKvwWFLuiTZHmiPRXju0yrLFJeL1g== integrity sha512-PDWEvO1/p8OAHHiielvEmwGXHNbZhrZn96ojV7+/mKgFu+cCUcGVJl9sFs97rCWLe3hKQsYLEsJs4EiLjwa+UQ==
"@fontsource/roboto-mono@4.4.2": "@fontsource/roboto-mono@4.4.2":
version "4.4.2" version "4.4.2"
@ -1384,58 +1391,6 @@
estree-walker "^1.0.1" estree-walker "^1.0.1"
picomatch "^2.2.2" picomatch "^2.2.2"
"@sentry/browser@6.5.1":
version "6.5.1"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.5.1.tgz#9a6ed5607b3b0f4e83f38720e3e202906f8c5bdb"
integrity sha512-iVLCdEFwsoWAzE/hNknexPQjjDpMQV7mmaq9Z1P63bD6MfhwVTx4hG4pHn8HEvC38VvCVf1wv0v/LxtoODAYXg==
dependencies:
"@sentry/core" "6.5.1"
"@sentry/types" "6.5.1"
"@sentry/utils" "6.5.1"
tslib "^1.9.3"
"@sentry/core@6.5.1":
version "6.5.1"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.5.1.tgz#c8b6c3ed86ed07b193c95d599c1b9a4a161e500e"
integrity sha512-Mh3sl/iUOT1myHmM6RlDy2ARzkUClx/g4DAt1rJ/IpQBOlDYQraplXSIW80i/hzRgQDfwhwgf4wUa5DicKBjKw==
dependencies:
"@sentry/hub" "6.5.1"
"@sentry/minimal" "6.5.1"
"@sentry/types" "6.5.1"
"@sentry/utils" "6.5.1"
tslib "^1.9.3"
"@sentry/hub@6.5.1":
version "6.5.1"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.5.1.tgz#135ef09d07d32e87a53f664c0ae8fcc4f5963519"
integrity sha512-lBRMBVMYP8B4PfRiM70murbtJAXiIAao/asDEMIRNGMP6pI2ArqXfJCBYDkStukhikYD0Kqb4trXq+JYF07Hbg==
dependencies:
"@sentry/types" "6.5.1"
"@sentry/utils" "6.5.1"
tslib "^1.9.3"
"@sentry/minimal@6.5.1":
version "6.5.1"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.5.1.tgz#b8c1b382c2ea788eec3d32d203e5081b00eb6838"
integrity sha512-q9Do/oreu1RP695CXCLowVDuQyk7ilE6FGdz2QLpTXAfx8247qOwk6+zy9Kea/Djk93+BoSDVQUSneNiVwl0nQ==
dependencies:
"@sentry/hub" "6.5.1"
"@sentry/types" "6.5.1"
tslib "^1.9.3"
"@sentry/types@6.5.1":
version "6.5.1"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.5.1.tgz#0a34ecfd1ae9275a416a105640eb4bed45a46a1d"
integrity sha512-b/7a6CMoytaeFPx4IBjfxPw3nPvsQh7ui1C8Vw0LxNNDgBwVhPLzUOWeLWbo5YZCVbGEMIWwtCUQYWxneceZSA==
"@sentry/utils@6.5.1":
version "6.5.1"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.5.1.tgz#046baf7d1a6564d6d555437ad3674dba9bc0806a"
integrity sha512-Wv86JYGQH+ZJ5XGFQX7h6ijl32667ikenoL9EyXMn8UoOYX/MLwZoQZin1P60wmKkYR9ifTNVmpaI9OoTaH+UQ==
dependencies:
"@sentry/types" "6.5.1"
tslib "^1.9.3"
"@surma/rollup-plugin-off-main-thread@^1.4.1": "@surma/rollup-plugin-off-main-thread@^1.4.1":
version "1.4.2" version "1.4.2"
resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58"
@ -1528,10 +1483,10 @@
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
"@types/react-dom@17.0.6": "@types/react-dom@17.0.7":
version "17.0.6" version "17.0.7"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.6.tgz#c158325cf91b196270bc0f4af73463f149e7eafe" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.7.tgz#b8ee15ead9e5d6c2c858b44949fdf2ebe5212232"
integrity sha512-MGTI+TudxAnGTj8aco8mogaPSJGK2Whje7OZh1CxNLRyhJpTZg/pGQpIbCT0eCVFQyH7UFpdvCqQEThHIp/gsA== integrity sha512-Wd5xvZRlccOrCTej8jZkoFZuZRKHzanDDv1xglI33oBNFMWrqOSzrvWFw7ngSiZjrpJAzPKFtX7JvuXpkNmQHA==
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
@ -1564,10 +1519,10 @@
"@types/prop-types" "*" "@types/prop-types" "*"
csstype "^3.0.2" csstype "^3.0.2"
"@types/react@17.0.9": "@types/react@17.0.11":
version "17.0.9" version "17.0.11"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.9.tgz#1147fb520024a62c9b3841f5cb4db89b73ddb87f" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.11.tgz#67fcd0ddbf5a0b083a0f94e926c7d63f3b836451"
integrity sha512-2Cw7FvevpJxQrCb+k5t6GH1KIvmadj5uBbjPaLlJB/nZWUj56e1ZqcD6zsoMFB47MsJUTFl9RJ132A7hb3QFJA== integrity sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA==
dependencies: dependencies:
"@types/prop-types" "*" "@types/prop-types" "*"
"@types/scheduler" "*" "@types/scheduler" "*"
@ -1597,13 +1552,13 @@
dependencies: dependencies:
"@types/yargs-parser" "*" "@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@4.26.0": "@typescript-eslint/eslint-plugin@4.26.1":
version "4.26.0" version "4.26.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.0.tgz#12bbd6ebd5e7fabd32e48e1e60efa1f3554a3242" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.1.tgz#b9c7313321cb837e2bf8bebe7acc2220659e67d3"
integrity sha512-yA7IWp+5Qqf+TLbd8b35ySFOFzUfL7i+4If50EqvjT6w35X8Lv0eBHb6rATeWmucks37w+zV+tWnOXI9JlG6Eg== integrity sha512-aoIusj/8CR+xDWmZxARivZjbMBQTT9dImUtdZ8tVCVRXgBUuuZyM5Of5A9D9arQPxbi/0rlJLcuArclz/rCMJw==
dependencies: dependencies:
"@typescript-eslint/experimental-utils" "4.26.0" "@typescript-eslint/experimental-utils" "4.26.1"
"@typescript-eslint/scope-manager" "4.26.0" "@typescript-eslint/scope-manager" "4.26.1"
debug "^4.3.1" debug "^4.3.1"
functional-red-black-tree "^1.0.1" functional-red-black-tree "^1.0.1"
lodash "^4.17.21" lodash "^4.17.21"
@ -1611,15 +1566,15 @@
semver "^7.3.5" semver "^7.3.5"
tsutils "^3.21.0" tsutils "^3.21.0"
"@typescript-eslint/experimental-utils@4.26.0": "@typescript-eslint/experimental-utils@4.26.1":
version "4.26.0" version "4.26.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.0.tgz#ba7848b3f088659cdf71bce22454795fc55be99a" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.1.tgz#a35980a2390da9232aa206b27f620eab66e94142"
integrity sha512-TH2FO2rdDm7AWfAVRB5RSlbUhWxGVuxPNzGT7W65zVfl8H/WeXTk1e69IrcEVsBslrQSTDKQSaJD89hwKrhdkw== integrity sha512-sQHBugRhrXzRCs9PaGg6rowie4i8s/iD/DpTB+EXte8OMDfdCG5TvO73XlO9Wc/zi0uyN4qOmX9hIjQEyhnbmQ==
dependencies: dependencies:
"@types/json-schema" "^7.0.7" "@types/json-schema" "^7.0.7"
"@typescript-eslint/scope-manager" "4.26.0" "@typescript-eslint/scope-manager" "4.26.1"
"@typescript-eslint/types" "4.26.0" "@typescript-eslint/types" "4.26.1"
"@typescript-eslint/typescript-estree" "4.26.0" "@typescript-eslint/typescript-estree" "4.26.1"
eslint-scope "^5.1.1" eslint-scope "^5.1.1"
eslint-utils "^3.0.0" eslint-utils "^3.0.0"
@ -1635,14 +1590,14 @@
eslint-scope "^5.0.0" eslint-scope "^5.0.0"
eslint-utils "^2.0.0" eslint-utils "^2.0.0"
"@typescript-eslint/parser@4.26.0": "@typescript-eslint/parser@4.26.1":
version "4.26.0" version "4.26.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.26.0.tgz#31b6b732c9454f757b020dab9b6754112aa5eeaf" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.26.1.tgz#cecfdd5eb7a5c13aabce1c1cfd7fbafb5a0f1e8e"
integrity sha512-b4jekVJG9FfmjUfmM4VoOItQhPlnt6MPOBUL0AQbiTmm+SSpSdhHYlwayOm4IW9KLI/4/cRKtQCmDl1oE2OlPg== integrity sha512-q7F3zSo/nU6YJpPJvQveVlIIzx9/wu75lr6oDbDzoeIRWxpoc/HQ43G4rmMoCc5my/3uSj2VEpg/D83LYZF5HQ==
dependencies: dependencies:
"@typescript-eslint/scope-manager" "4.26.0" "@typescript-eslint/scope-manager" "4.26.1"
"@typescript-eslint/types" "4.26.0" "@typescript-eslint/types" "4.26.1"
"@typescript-eslint/typescript-estree" "4.26.0" "@typescript-eslint/typescript-estree" "4.26.1"
debug "^4.3.1" debug "^4.3.1"
"@typescript-eslint/scope-manager@4.1.0": "@typescript-eslint/scope-manager@4.1.0":
@ -1653,23 +1608,23 @@
"@typescript-eslint/types" "4.1.0" "@typescript-eslint/types" "4.1.0"
"@typescript-eslint/visitor-keys" "4.1.0" "@typescript-eslint/visitor-keys" "4.1.0"
"@typescript-eslint/scope-manager@4.26.0": "@typescript-eslint/scope-manager@4.26.1":
version "4.26.0" version "4.26.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.26.0.tgz#60d1a71df162404e954b9d1c6343ff3bee496194" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.26.1.tgz#075a74a15ff33ee3a7ed33e5fce16ee86689f662"
integrity sha512-G6xB6mMo4xVxwMt5lEsNTz3x4qGDt0NSGmTBNBPJxNsrTXJSm21c6raeYroS2OwQsOyIXqKZv266L/Gln1BWqg== integrity sha512-TW1X2p62FQ8Rlne+WEShyd7ac2LA6o27S9i131W4NwDSfyeVlQWhw8ylldNNS8JG6oJB9Ha9Xyc+IUcqipvheQ==
dependencies: dependencies:
"@typescript-eslint/types" "4.26.0" "@typescript-eslint/types" "4.26.1"
"@typescript-eslint/visitor-keys" "4.26.0" "@typescript-eslint/visitor-keys" "4.26.1"
"@typescript-eslint/types@4.1.0": "@typescript-eslint/types@4.1.0":
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.1.0.tgz#edbd3fec346f34e13ce7aa176b03b497a32c496a" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.1.0.tgz#edbd3fec346f34e13ce7aa176b03b497a32c496a"
integrity sha512-rkBqWsO7m01XckP9R2YHVN8mySOKKY2cophGM8K5uDK89ArCgahItQYdbg/3n8xMxzu2elss+an1TphlUpDuJw== integrity sha512-rkBqWsO7m01XckP9R2YHVN8mySOKKY2cophGM8K5uDK89ArCgahItQYdbg/3n8xMxzu2elss+an1TphlUpDuJw==
"@typescript-eslint/types@4.26.0": "@typescript-eslint/types@4.26.1":
version "4.26.0" version "4.26.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.26.0.tgz#7c6732c0414f0a69595f4f846ebe12616243d546" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.26.1.tgz#9e7c523f73c34b04a765e4167ca5650436ef1d38"
integrity sha512-rADNgXl1kS/EKnDr3G+m7fB9yeJNnR9kF7xMiXL6mSIWpr3Wg5MhxyfEXy/IlYthsqwBqHOr22boFbf/u6O88A== integrity sha512-STyMPxR3cS+LaNvS8yK15rb8Y0iL0tFXq0uyl6gY45glyI7w0CsyqyEXl/Fa0JlQy+pVANeK3sbwPneCbWE7yg==
"@typescript-eslint/typescript-estree@4.1.0": "@typescript-eslint/typescript-estree@4.1.0":
version "4.1.0" version "4.1.0"
@ -1685,13 +1640,13 @@
semver "^7.3.2" semver "^7.3.2"
tsutils "^3.17.1" tsutils "^3.17.1"
"@typescript-eslint/typescript-estree@4.26.0": "@typescript-eslint/typescript-estree@4.26.1":
version "4.26.0" version "4.26.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.0.tgz#aea17a40e62dc31c63d5b1bbe9a75783f2ce7109" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.1.tgz#b2ce2e789233d62283fae2c16baabd4f1dbc9633"
integrity sha512-GHUgahPcm9GfBuy3TzdsizCcPjKOAauG9xkz9TR8kOdssz2Iz9jRCSQm6+aVFa23d5NcSpo1GdHGSQKe0tlcbg== integrity sha512-l3ZXob+h0NQzz80lBGaykdScYaiEbFqznEs99uwzm8fPHhDjwaBFfQkjUC/slw6Sm7npFL8qrGEAMxcfBsBJUg==
dependencies: dependencies:
"@typescript-eslint/types" "4.26.0" "@typescript-eslint/types" "4.26.1"
"@typescript-eslint/visitor-keys" "4.26.0" "@typescript-eslint/visitor-keys" "4.26.1"
debug "^4.3.1" debug "^4.3.1"
globby "^11.0.3" globby "^11.0.3"
is-glob "^4.0.1" is-glob "^4.0.1"
@ -1706,12 +1661,12 @@
"@typescript-eslint/types" "4.1.0" "@typescript-eslint/types" "4.1.0"
eslint-visitor-keys "^2.0.0" eslint-visitor-keys "^2.0.0"
"@typescript-eslint/visitor-keys@4.26.0": "@typescript-eslint/visitor-keys@4.26.1":
version "4.26.0" version "4.26.1"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.0.tgz#26d2583169222815be4dcd1da4fe5459bc3bcc23" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.1.tgz#0d55ea735cb0d8903b198017d6d4f518fdaac546"
integrity sha512-cw4j8lH38V1ycGBbF+aFiLUls9Z0Bw8QschP3mkth50BbWzgFS33ISIgBzUMuQ2IdahoEv/rXstr8Zhlz4B1Zg== integrity sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw==
dependencies: dependencies:
"@typescript-eslint/types" "4.26.0" "@typescript-eslint/types" "4.26.1"
eslint-visitor-keys "^2.0.0" eslint-visitor-keys "^2.0.0"
"@vitejs/plugin-react-refresh@1.3.3": "@vitejs/plugin-react-refresh@1.3.3":
@ -2279,10 +2234,10 @@ cssesc@^3.0.0:
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
cssnano-preset-default@^5.1.2: cssnano-preset-default@^5.1.3:
version "5.1.2" version "5.1.3"
resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.2.tgz#5d4877a91769823c5da6bcebd54996ecdf8aca12" resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz#caa54183a8c8df03124a9e23f374ab89df5a9a99"
integrity sha512-spilp8LRw0sacuxiN9A/dyyPr6G/WISKMBKcBD4NMoPV0ENx4DeuWvIIrSx9PII2nJIDCO3kywkqTPreECBVOg== integrity sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ==
dependencies: dependencies:
css-declaration-sorter "^6.0.3" css-declaration-sorter "^6.0.3"
cssnano-utils "^2.0.1" cssnano-utils "^2.0.1"
@ -2306,9 +2261,9 @@ cssnano-preset-default@^5.1.2:
postcss-normalize-string "^5.0.1" postcss-normalize-string "^5.0.1"
postcss-normalize-timing-functions "^5.0.1" postcss-normalize-timing-functions "^5.0.1"
postcss-normalize-unicode "^5.0.1" postcss-normalize-unicode "^5.0.1"
postcss-normalize-url "^5.0.1" postcss-normalize-url "^5.0.2"
postcss-normalize-whitespace "^5.0.1" postcss-normalize-whitespace "^5.0.1"
postcss-ordered-values "^5.0.1" postcss-ordered-values "^5.0.2"
postcss-reduce-initial "^5.0.1" postcss-reduce-initial "^5.0.1"
postcss-reduce-transforms "^5.0.1" postcss-reduce-transforms "^5.0.1"
postcss-svgo "^5.0.2" postcss-svgo "^5.0.2"
@ -2319,13 +2274,13 @@ cssnano-utils@^2.0.1:
resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2"
integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==
cssnano@5.0.5: cssnano@5.0.6:
version "5.0.5" version "5.0.6"
resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.5.tgz#6b8787123bf4cd5a220a2fa6cb5bc036b0854b48" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.6.tgz#2a91ad34c6521ae31eab3da9c90108ea3093535d"
integrity sha512-L2VtPXnq6rmcMC9vkBOP131sZu3ccRQI27ejKZdmQiPDpUlFkUbpXHgKN+cibeO1U4PItxVZp1zTIn5dHsXoyg== integrity sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==
dependencies: dependencies:
cosmiconfig "^7.0.0" cosmiconfig "^7.0.0"
cssnano-preset-default "^5.1.2" cssnano-preset-default "^5.1.3"
is-resolvable "^1.1.0" is-resolvable "^1.1.0"
csso@^4.2.0: csso@^4.2.0:
@ -3207,10 +3162,10 @@ ignore@^5.1.4:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
immer@9.0.2: immer@9.0.3:
version "9.0.2" version "9.0.3"
resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.2.tgz#83e4593df9914acaecfd9fac6a8601ef44d883fc" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.3.tgz#146e2ba8b84d4b1b15378143c2345559915097f4"
integrity sha512-mkcmzLtIfSp40vAqteRr1MbWNSoI7JE+/PB36FNPoSfJ9RQRmNKuTYCjKkyXyuq3Dgn07HuJBrwJd4ZSk2yUbw== integrity sha512-mONgeNSMuyjIe0lkQPa9YhdmTv8P19IeHV0biYhcXhbd5dhdB9HSK93zBpyKjp6wersSUgT5QyU0skmejUVP2A==
import-fresh@^3.0.0, import-fresh@^3.2.1: import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.2.1" version "3.2.1"
@ -3801,10 +3756,10 @@ normalize-range@^0.1.2:
resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
normalize-url@^4.5.0: normalize-url@^6.0.1:
version "4.5.1" version "6.0.1"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.0.1.tgz#a4f27f58cf8c7b287b440b8a8201f42d0b00d256"
integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== integrity sha512-VU4pzAuh7Kip71XEmO9aNREYAdMHFGTVj/i+CaTImS8x0i1d3jUZkXhqluy/PRgjPLMgsLQulYY3PJ/aSbSjpQ==
nth-check@^2.0.0: nth-check@^2.0.0:
version "2.0.0" version "2.0.0"
@ -4194,13 +4149,13 @@ postcss-normalize-unicode@^5.0.1:
browserslist "^4.16.0" browserslist "^4.16.0"
postcss-value-parser "^4.1.0" postcss-value-parser "^4.1.0"
postcss-normalize-url@^5.0.1: postcss-normalize-url@^5.0.2:
version "5.0.1" version "5.0.2"
resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.1.tgz#ffa9fe545935d8b57becbbb7934dd5e245513183" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz#ddcdfb7cede1270740cf3e4dfc6008bd96abc763"
integrity sha512-hkbG0j58Z1M830/CJ73VsP7gvlG1yF+4y7Fd1w4tD2c7CaA2Psll+pQ6eQhth9y9EaqZSLzamff/D0MZBMbYSg== integrity sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==
dependencies: dependencies:
is-absolute-url "^3.0.3" is-absolute-url "^3.0.3"
normalize-url "^4.5.0" normalize-url "^6.0.1"
postcss-value-parser "^4.1.0" postcss-value-parser "^4.1.0"
postcss-normalize-whitespace@^5.0.1: postcss-normalize-whitespace@^5.0.1:
@ -4210,10 +4165,10 @@ postcss-normalize-whitespace@^5.0.1:
dependencies: dependencies:
postcss-value-parser "^4.1.0" postcss-value-parser "^4.1.0"
postcss-ordered-values@^5.0.1: postcss-ordered-values@^5.0.2:
version "5.0.1" version "5.0.2"
resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.1.tgz#79ef6e2bd267ccad3fc0c4f4a586dfd01c131f64" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044"
integrity sha512-6mkCF5BQ25HvEcDfrMHCLLFHlraBSlOXFnQMHYhSpDO/5jSR1k8LdEXOkv+7+uzW6o6tBYea1Km0wQSRkPJkwA== integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==
dependencies: dependencies:
cssnano-utils "^2.0.1" cssnano-utils "^2.0.1"
postcss-value-parser "^4.1.0" postcss-value-parser "^4.1.0"
@ -4279,10 +4234,10 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
postcss@8.3.0, postcss@^8.2.10: postcss@8.3.2, postcss@^8.3.0:
version "8.3.0" version "8.3.2"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.0.tgz#b1a713f6172ca427e3f05ef1303de8b65683325f" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.2.tgz#ed3ec489f5428af5740cd6effcc216b4d455ee64"
integrity sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ== integrity sha512-y1FK/AWdZlBF5lusS5j5l4/vF67+vQZt1SXPVJ32y1kRGDQyrs1zk32hG1cInRTu14P0V+orPz+ifwW/7rR4bg==
dependencies: dependencies:
colorette "^1.2.2" colorette "^1.2.2"
nanoid "^3.1.23" nanoid "^3.1.23"
@ -4398,10 +4353,10 @@ react-modal@3.14.2:
react-lifecycles-compat "^3.0.0" react-lifecycles-compat "^3.0.0"
warning "^4.0.3" warning "^4.0.3"
react-query@3.16.1: react-query@3.17.0:
version "3.16.1" version "3.17.0"
resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.16.1.tgz#0bb9c5c45a74e14b5e204218fa602fe1a1065976" resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.17.0.tgz#461c0a030044760cd874c7ea8aa9d55c2dceb15d"
integrity sha512-dof8XXSZ7HprfzvpbJE+YZrhUXcQYxy1j+NU8ZPYpKKDF79wlZAke+GyYhQ0b6SuOFp8ZpVXSpdD4AL3lxmeXQ== integrity sha512-/qUNb6ESCz75Z/bR5p/ztp5ipRj8IQSiIpHK3AkCLTT4IqZsceAoD+9B+wbitA0LkxsR3snGrpgKUc9MMYQ/Ow==
dependencies: dependencies:
"@babel/runtime" "^7.5.5" "@babel/runtime" "^7.5.5"
broadcast-channel "^3.4.1" broadcast-channel "^3.4.1"
@ -4662,13 +4617,20 @@ rollup-plugin-terser@^7.0.0:
serialize-javascript "^4.0.0" serialize-javascript "^4.0.0"
terser "^5.0.0" terser "^5.0.0"
rollup@^2.38.5, rollup@^2.43.1, rollup@^2.45.2: rollup@^2.38.5, rollup@^2.43.1:
version "2.50.4" version "2.50.4"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.50.4.tgz#5a53e4294296dfee2a83b0ec0d0536984b98de71" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.50.4.tgz#5a53e4294296dfee2a83b0ec0d0536984b98de71"
integrity sha512-mBQa9O6bdqur7a6R+TXcbdYgfO2arXlDG+rSrWfwAvsiumpJjD4OS23R9QuhItuz8ysWb8mZ91CFFDQUhJY+8Q== integrity sha512-mBQa9O6bdqur7a6R+TXcbdYgfO2arXlDG+rSrWfwAvsiumpJjD4OS23R9QuhItuz8ysWb8mZ91CFFDQUhJY+8Q==
optionalDependencies: optionalDependencies:
fsevents "~2.3.1" fsevents "~2.3.1"
rollup@^2.51.2:
version "2.51.2"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.51.2.tgz#6de71e28c833089a0bd745a09671a3e2b92af6b7"
integrity sha512-ReV2eGEadA7hmXSzjxdDKs10neqH2QURf2RxJ6ayAlq93ugy6qIvXMmbc5cWMGCDh1h5T4thuWO1e2VNbMq8FA==
optionalDependencies:
fsevents "~2.3.1"
run-parallel@^1.1.9: run-parallel@^1.1.9:
version "1.1.10" version "1.1.10"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef"
@ -5063,12 +5025,12 @@ tsconfig-paths@^3.9.0:
minimist "^1.2.0" minimist "^1.2.0"
strip-bom "^3.0.0" strip-bom "^3.0.0"
tslib@2.2.0: tslib@2.3.0:
version "2.2.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
tslib@^1.8.1, tslib@^1.9.3: tslib@^1.8.1:
version "1.14.1" version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
@ -5212,25 +5174,25 @@ vendors@^1.0.3:
resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
vite-plugin-pwa@0.7.3: vite-plugin-pwa@0.8.1:
version "0.7.3" version "0.8.1"
resolved "https://registry.yarnpkg.com/vite-plugin-pwa/-/vite-plugin-pwa-0.7.3.tgz#ce3fdd64ac68033ea840bfea41add1af4d13f93a" resolved "https://registry.yarnpkg.com/vite-plugin-pwa/-/vite-plugin-pwa-0.8.1.tgz#8b6fc6c26fcc6fab9d39a087256ba6280173b6eb"
integrity sha512-RgGJW02OxRxziNKYTUtWXr9hF+Px6jcdyMN7IkuOOV9WcFaJQCKb3Pxqizb8GMjIBLtjEebwa0XbKXWDFhZWjw== integrity sha512-Hrfz+NpZ6yroVm5yiCWQ1N9HX9o6H/CCyg7ZHiaP3ZZC29a0Z9lqnnicEAhZMLkVPJqHM60wowL0EJkyOVyxBg==
dependencies: dependencies:
debug "^4.3.2" debug "^4.3.2"
fast-glob "^3.2.5" fast-glob "^3.2.5"
pretty-bytes "^5.6.0" pretty-bytes "^5.6.0"
rollup "^2.45.2" rollup "^2.51.2"
workbox-build "^6.1.5" workbox-build "^6.1.5"
workbox-window "^6.1.5" workbox-window "^6.1.5"
vite@2.3.6: vite@2.3.7:
version "2.3.6" version "2.3.7"
resolved "https://registry.yarnpkg.com/vite/-/vite-2.3.6.tgz#1f7cfde88a51a802d69000c7bac85d481c2e871c" resolved "https://registry.yarnpkg.com/vite/-/vite-2.3.7.tgz#3023892419367465e1af1739578f8663d04243b2"
integrity sha512-fsEpNKDHgh3Sn66JH06ZnUBnIgUVUtw6ucDhlOj1CEqxIkymU25yv1/kWDPlIjyYHnalr0cN6V+zzUJ+fmWHYw== integrity sha512-Y0xRz11MPYu/EAvzN94+FsOZHbSvO6FUvHv127CyG7mV6oDoay2bw+g5y9wW3Blf8OY3chaz3nc/DcRe1IQ3Nw==
dependencies: dependencies:
esbuild "^0.12.5" esbuild "^0.12.5"
postcss "^8.2.10" postcss "^8.3.0"
resolve "^1.19.0" resolve "^1.19.0"
rollup "^2.38.5" rollup "^2.38.5"
optionalDependencies: optionalDependencies: